RcppArmadillo/0000755000176200001440000000000014173550004013002 5ustar liggesusersRcppArmadillo/NAMESPACE0000644000176200001440000000121213142603136014215 0ustar liggesusersuseDynLib("RcppArmadillo", .registration=TRUE) importFrom("Rcpp", "evalCpp", "sourceCpp") importFrom("stats", "coef", "fitted", "model.frame", "model.matrix", "model.response", "printCoefmat", "pt") importFrom("utils", "packageDescription", "package.skeleton") importFrom("methods", "new") export("fastLmPure", "fastLm", "RcppArmadillo.package.skeleton", "armadillo_version", "armadillo_set_seed", "armadillo_set_seed_random") S3method("fastLm", "default") S3method("fastLm", "formula") S3method("predict", "fastLm") S3method("print", "fastLm") S3method("summary", "fastLm") S3method("print", "summary.fastLm") RcppArmadillo/.aspell/0000755000176200001440000000000013143045426014343 5ustar liggesusersRcppArmadillo/.aspell/RcppArmadillo.rds0000644000176200001440000000014713143045426017610 0ustar liggesusersb```b`fad`b2H3@y)Ey0܂Ē_Jjr~nA~qfIf~^1T=?<(,޲yRcppArmadillo/.aspell/defaults.R0000644000176200001440000000024213143045426016273 0ustar liggesusersRd_files <- vignettes <- R_files <- description <- list(encoding = "UTF-8", language = "en", dictionaries = c("en_stats", "RcppArmadillo")) RcppArmadillo/ChangeLog0000644000176200001440000033235114173263631014572 0ustar liggesusers2022-01-23 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.8.1.0 * inst/NEWS.Rd: Idem * configure.ac: Idem * configure: Idem * inst/include/armadillo_bits/: Armadillo 10.8.1 2022-01-02 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.8.0 * inst/NEWS.Rd: Idem * configure.ac: Idem * configure: Idem * inst/include/armadillo_bits/: Armadillo 10.8 2021-12-27 Dirk Eddelbuettel * DESCRIPTION (Version): RcppArmadillo 0.10.7.99.1 * inst/include/armadillo: Armadillo 10.8-rc2 * inst/include/armadillo_bits/: Idem 2021-12-21 Dirk Eddelbuettel * DESCRIPTION (Version): RcppArmadillo 0.10.7.99.0 * inst/include/armadillo: Armadillo 10.8-rc1 * inst/include/armadillo_bits/: Idem 2021-12-16 Dirk Eddelbuettel * inst/include/armadillo_bits/: Armadillo 10.7.5 2021-11-23 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.7.4.0 * inst/NEWS.Rd: Idem * inst/include/armadillo_bits/: Armadillo 10.7.4 2021-11-18 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.7.3.1 * inst/include/RcppArmadilloConfig.h: Simplify to using just one new #define for the two changes to Fields import/export * inst/include/RcppArmadilloAs.h (get): Updated * inst/include/RcppArmadilloWrap.h (wrap): Idem * inst/tinytest/cpp/fields_new.cpp: Idem 2021-11-16 Dirk Eddelbuettel * inst/tinytest/cpp/fields.cpp: Added tests for R -> C++ * inst/tinytest/cpp/fields_new.cpp: Idem * inst/tinytest/test_fields.R: Idem * inst/tinytest/test_fields_new.R: Idem 2021-11-15 Dirk Eddelbuettel * inst/tinytest/cpp/fields.cpp: Additional test using 3d field working in 'new' but not in 'old' setup * inst/tinytest/cpp/fields_new.cpp: Idem * inst/tinytest/test_fields.R: Idem * inst/tinytest/test_fields_new.R: Idem * inst/tinytest/cpp/fields.cpp: Initial tests for R -> C++ * inst/tinytest/test_fields.R: Idem 2021-11-13 Dirk Eddelbuettel * inst/tinytest/cpp/fields_new.cpp: Test for 'new' (i.e. corrected) fields behaviour currently requiring #define (for C++ to R) * inst/tinytest/test_fields_new.R: Idem 2021-11-12 Dirk Eddelbuettel * inst/tinytest/test_fields.R: Added 1-d field tests (for C++ to R) * inst/tinytest/cpp/fields.cpp: Idem 2021-11-09 Dirk Eddelbuettel * inst/tinytest/test_fields.R: Added field tests (for C++ to R) * inst/tinytest/cpp/fields.cpp: Idem 2021-11-09 Jonathan Berrisch * inst/include/RcppArmadilloAs.h: Update arma::field conversion * inst/include/RcppArmadilloWrap.h: Idem * inst/include/RcppArmadilloConfig.h: Define guards for changes * inst/tinytest/test_rcpparmadillo.R: New tests 2021-11-08 Dirk Eddelbuettel * local/armafield.cpp: Add an arma::field test file 2021-11-04 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.7.3.0 * inst/NEWS.Rd: Idem * inst/include/armadillo_bits/: Armadillo 10.7.3 2021-11-03 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.7.2.0 * inst/NEWS.Rd: Idem 2021-11-02 Dirk Eddelbuettel * inst/include/armadillo_bits/: Armadillo 10.7.2 2021-10-08 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.7.1 * inst/NEWS.Rd: Idem * configure.ac: Idem * configure: Idem * inst/include/armadillo_bits/: Armadillo 10.7.1 2021-09-29 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.7.0.0 * inst/NEWS.Rd: Idem * configure.ac: Idem * configure: Idem * inst/include/armadillo_bits/arma_version.hpp: Armadillo 10.7.0 2021-09-29 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.6.99.3 * inst/NEWS.Rd: Idem * configure.ac: Idem * configure: Idem * inst/include/armadillo_bits/: Armadillo 10.7-RC2 2021-09-27 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.6.99.2 * DESCRIPTION (Author): Add Conrad * README.md (Rcpp): Idem * inst/include/RcppArmadilloAs.h: Update copyright header, remove two editor settings lines as we long switched to editorconfig * inst/include/RcppArmadilloConfigGenerated.h.in: Idem * inst/include/RcppArmadilloConfig.h: Idem * inst/include/RcppArmadilloForward.h: Idem * inst/include/RcppArmadillo.h: Idem * inst/include/RcppArmadilloSugar.h: Idem * inst/include/RcppArmadilloWrap.h: Idem 2021-09-27 Condrad Sanderson * inst/include/RcppArmadilloForward.h: Adjust for Armadillo 10.7 and subview_cols * inst/include/RcppArmadilloWrap.h: Idem 2021-09-26 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.6.99.1 * inst/NEWS.Rd: Idem * configure.ac: Idem * configure: Idem * inst/include/armadillo_bits/: Armadillo 10.7-RC1 * README.md: Added total downloads badge 2021-08-05 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.6.2.0 * inst/NEWS.Rd: Idem * configure.ac: Idem * configure: Idem * inst/include/armadillo_bits/: Armadillo 10.6.2 2021-07-19 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.6.1.0 * inst/NEWS.Rd: Idem * configure.ac: Idem * configure: Idem * inst/include/armadillo_bits/: Armadillo 10.6.1 2021-07-16 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.6.0.0 * inst/NEWS.Rd: Idem * configure.ac: Idem * configure: Idem * man/RcppArmadillo-package.Rd: Use https URL * inst/include/armadillo_bits/: Armadillo 10.6.0 2021-07-07 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.5.99.0 * inst/NEWS.Rd: Idem * configure.ac: Idem * configure: Idem * inst/include/armadillo_bits/: Armadillo 10.6-rc1 2021-07-01 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.5.3.0 * inst/NEWS.Rd: Idem * configure.ac: Idem * configure: Idem * inst/include/armadillo_bits/: Armadillo 10.5.3 2021-06-12 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.5.2.0 * inst/NEWS.Rd: Idem * configure.ac: Idem * configure: Idem * inst/include/armadillo_bits/: Armadillo 10.5.2 2021-06-05 Dirk Eddelbuettel * README.md: Add coverage badge 2021-06-04 Dirk Eddelbuettel * inst/tinytest/test_misc.R: Add tests for several miscellaneous functions in src/RcppArmadillo.cpp, R/flags.R * inst/tinytest/test_fastLm.R: Additional fastLm() tests * R/SciPy2R.R: Set nocov tags for deprecated code * R/RcppArmadillo.package.skeleton.R: Set nocov * .codecov.yml (comment): Set to false 2021-05-29 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.5.1.0 * inst/NEWS.Rd: Idem * configure.ac: Idem * configure: Idem * inst/include/armadillo_bits/: Armadillo 10.5.1 2021-05-21 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.5.0.0 * inst/NEWS.Rd: Idem * configure.ac: Idem * configure: Idem * inst/include/armadillo_bits/: Armadillo 10.5.0 2021-05-15 Dirk Eddelbuettel * DESCRIPTION: Release 0.10.499.1.0 [github-only] * inst/NEWS.Rd: Idem * configure.ac: Idem * configure: Idem * inst/include/armadillo_bits/: Armadillo 10.5 RC1 * .codecov.yml (ignore): Exclude Armadillo itself 2021-04-23 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.4.1.0 * inst/NEWS.Rd: Idem * configure.ac: Idem * configure: Idem * inst/include/armadillo_bits/: Armadillo 10.4.1 2021-04-13 Dirk Eddelbuettel * DESCRIPTION (URL): Added to DESCRIPTION file 2021-04-12 Dirk Eddelbuettel * inst/include/armadillo_bits/arma_rng.hpp: Apply two upstream corrections for RNG draws discovered during reverse depends checks 2021-04-11 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.4.0.0 * inst/NEWS.Rd: Idem * configure.ac: Idem * configure: Idem * inst/include/armadillo{,_bits}/: Armadillo 10.4.0 2021-03-10 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.3.0.0 * configure.ac: Idem * configure: Idem * inst/include/armadillo{,_bits}/: Armadillo 10.3 2021-03-09 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.2.2.0 * configure.ac: Idem * configure: Idem 2021-03-08 Dirk Eddelbuettel * inst/tinytest/test_cube.R: On Windows, lower tolerance for two tests to accomodate tests on gcc10-UCRT 2021-02-26 Dirk Eddelbuettel * inst/include/armadillo_bits/: Armadillo 10.2.2 2021-02-09 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.2.1.0 * configure.ac: Idem * configure: Idem 2021-02-03 Dirk Eddelbuettel * inst/include/armadillo_bits/: Armadillo 10.2.1 2021-01-26 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.2.0.0 * configure.ac: Idem * configure: Idem 2021-01-25 Dirk Eddelbuettel * inst/include/armadillo{,_bits/}: Armadillo 10.2.0 2021-01-08 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.1.2.2 * configure.ac: Idem * configure: Idem 2021-01-05 Dirk Eddelbuettel * inst/tinytest/test_sparseConversion.R: Set doDiag=FALSE to ensure dgCMatrix return (accomodates Matrix >= 1.3.0, also conditioned on) 2021-01-05 Condrad Sanderson * inst/include/armadillo_bits/arma_cmath.hpp: fix handling of NaN by arma::sign() 2021-01-01 Dirk Eddelbuettel * .github/workflows/ci.yaml: Add CI runner using r-ci * README.md: Add new badge * inst/tinytest/test_sparseConversion.R: Condition updated test on Matrix package version 1.3.0 or greater * R/RcppArmadillo.package.skeleton.R: Wrap any() around grepl() 2020-12-31 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.1.2.1 * configure.ac: Idem * configure: Idem * inst/tinytest/test_sparseConversion.R: Update one call to rsparsematrix to suppress another warning from Matrix 1.3.0 * DESCRIPTION (Suggests): Change to versioned 'Suggests: Matrix (>= 1.3.0)', (Description): Minor rewording 2020-12-30 Binxiang Ni * inst/tinytest/test_sparseConversion.R: Coerce dtCMatrix to dgCMatrix in one unit test (required by Matrix 1.3.0) 2020-11-15 Dirk Eddelbuettel * DESCRIPTION (Version, Date): RcppArmadillo 0.10.1.2.0 * configure.ac: Idem * configure: Idem * inst/tinytest/test_sparseConversion.R: Skipping parts on Windows 2020-11-14 Dirk Eddelbuettel * inst/include/armadillo_bits/: Armadillo 10.1.2 2020-10-26 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * src/RcppArmadillo.cpp: Rewrite version number accessors to be more rebust of upstream and compiler settings * .editorconfig: Added for standardized editor behaviour * .Rbuildignore: Exclude .editorconfig 2020-10-24 Condrad Sanderson * inst/include/RcppArmadilloForward.h: Switch to quoted #include 2020-10-21 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * src/RcppArmadillo.cpp: Remove three redundant const int * configure.ac: No longer use m4 to get version number * configure: Regenerated 2020-10-09 Dirk Eddelbuettel * DESCRIPTION: Release 0.10.1.0.0 * inst/NEWS.Rd: Release 0.10.1.0.0 * configure: Regenerated for 0.10.1.0.0 * inst/include/armadillo: Armadillo 10.1.0 * inst/include/armadillo_bits: Armadillo 10.1.0 2020-10-08 Dirk Eddelbuettel * inst/include/armadillo/: Armadillo 10.1-rc2 * inst/include/armadillo_bits/: Idem * .travis.yml: Switch to focal and BSPM use 2020-10-01 Dirk Eddelbuettel * inst/include/armadillo/: Armadillo 10.1-rc1 * inst/include/armadillo_bits/: Idem * inst/include/RcppArmadillo/Mat_meat.h: Two added lines to set n_alloc(0) as emailed by Conrad 2020-09-02 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.900.3.0 * inst/NEWS.Rd: Release 0.9.900.3.0 * configure: Regenerated for 0.9.900.3.0 * inst/include/armadillo_bits/*: Armadillo 9.900.3 2020-07-17 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.900.2.0 * inst/NEWS.Rd: Release 0.9.900.2.0 2020-07-15 Dirk Eddelbuettel * inst/include/armadillo_bits/*: Armadillo 9.900.2 * configure.ac: One small improvement for AC_INIT 2020-06-08 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.900.1.0 * inst/NEWS.Rd: Release 0.9.900.1.0 * inst/include/armadillo_bits: Armadillo 9.900.1 * R/RcppArmadillo.package.skeleton.R: Accomodate a R 4.0.0 change about NAMESPACE exports from package.skeleton() 2020-06-05 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.899.1.0 [github-only] * inst/NEWS.Rd: Release 0.9.899.1.0 * inst/include/armadillo/: Armadillo 9.900-rc1 * inst/include/armadillo_bits/: Idem 2020-05-17 Dirk Eddelbuettel * README.md: Add 'indirect use' and 'csda' badges 2020-05-16 Dirk Eddelbuettel * .travis.yml (dist): Updated to bionic and R 4.0.0 via matrix 2020-05-15 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.880.1.0 * inst/NEWS.Rd: Release 0.9.880.1.0 * inst/include/armadillo: Armadillo 9.880.1 * inst/include/armadillo_bits: Armadillo 9.880.1 2020-05-06 Dirk Eddelbuettel * configure.ac: Rebasing and rewording 2020-05-05 Kevin Ushey * configure.ac: Improve temporary directory determination and use 2020-05-05 Dirk Eddelbuettel * configure.ac: Tweaks to wording, whitespace and cleanup 2020-05-04 Kevin Ushey * configure.ac: Add explicit check for functioning OpenMP 2020-04-24 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.870.2.0 * inst/NEWS.Rd: Release 0.9.870.2.0 * inst/include/armadillo_bits: Armadillo 9.870.2 2020-04-23 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.869.2.0 [github-only] * inst/NEWS.Rd: Release 0.9.869.2.0 * inst/include/armadillo_bits/: Armadillo 9.870-rc2 2020-04-22 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.869.1.0 [github-only] * inst/NEWS.Rd: Release 0.9.869.1.0 * inst/include/armadillo: Armadillo 9.870-rc1 * inst/include/armadillo_bits/*: Idem 2020-04-13 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.860.2.0 * inst/NEWS.Rd: Release 0.9.860.2.0 * inst/include/armadillo_bits: Armadillo 9.860.2 2020-04-10 Dirk Eddelbuettel * inst/tinytest/test_scipy2r.R: Skip test on 32-bit Windows * inst/tinytest/test_complex.R: Ditto 2020-03-30 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.860.1.0 * inst/NEWS.Rd: Release 0.9.860.1.0 * inst/include/armadillo: Armadillo 9.860.1 * inst/include/armadillo_bits/*: Idem 2020-03-28 Dirk Eddelbuettel * README.md: Updated 2020-03-26 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.859.1.0 [github-only] * inst/NEWS.Rd: Release 0.9.859.1.0 * inst/include/armadillo: Armadillo 9.860-rc1 * inst/include/armadillo_bits/*: Idem * .travis.yml: No longer need r-cran-pinp 2020-02-17 Dirk Eddelbuettel * configure.ac: Provide a negative message for the macOS test * configure: Idem 2020-02-14 Dirk Eddelbuettel * README.md: Add a Debian badge 2020-02-10 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * vignettes/RcppArmadillo-intro.Rnw: Wraps pre-made vignette * vignettes/RcppArmadillo-sparseMatrix.Rmd: Idem * vignettes/rmd/Makefile: Added * DESCRIPTION (Suggests): Remove Suggests for rmarkdown, knitr, pinp; (VignetteBuilder): Removed 2020-02-09 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.850.1.0 * inst/NEWS.Rd: Release 0.9.850.1.0 * inst/include/armadillo: Armadillo 9.850.1 * inst/include/armadillo_bits/*: Idem 2020-02-05 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.849.1.0 [github-only] * inst/NEWS.Rd: Release 0.9.849.1.0 * inst/include/armadillo: Armadillo 9.850.rc1 * inst/include/armadillo_bits/*: Idem 2020-01-26 Dirk Eddelbuettel * inst/tinytest/test_scipy2r.R: Condition on reticulate (>= 1.14) which no longer needs extra helper to convert from scipy * R/SciPy2R.R (.SciPy2R): Added .Deprecated() call 2020-01-24 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.9.800.4.0 * inst/NEWS.Rd: Release 0.9.800.4.0 * inst/tinytest/test_scipy2r.R: Skip this test for now 2020-01-23 Dirk Eddelbuettel * inst/include/armadillo_bits/: Armadillo 9.800.4 2019-12-04 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.9.800.3.0 * inst/NEWS.Rd: Release 0.9.800.3.0 * inst/include/armadillo_bits/*: Armadillo 9.800.3 2019-11-14 Dirk Eddelbuettel * inst/include/RcppArmadilloExtensions/sample.h: Const correctness 2019-10-13 Dirk Eddelbuettel * README.md: Added CRAN + BioConductor badges for reverse depends * R/RcppArmadillo.package.skeleton.R: remove force argument if unused 2019-10-09 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.9.800.1.0 * inst/NEWS.Rd: Release 0.9.800.1.0 * inst/include/armadillo_bits/*: Armadillo 9.800.1 2019-10-04 Dirk Eddelbuettel * DESCRIPTION (Version): Upstream change of heart, 0.9.799.1.0 it is * inst/NEWS.Rd: Ditto 2019-10-02 Dirk Eddelbuettel * DESCRIPTION (Version, Date): 0.10.99.1.0 [github-only] * inst/include/armadillo*: Armadillo 10.100-rc1 2019-09-30 Min Kim * configure.ac: Portability fixes 2019-09-29 Dirk Eddelbuettel * README.md: Add Stackoverflow badge, add use count 2019-09-14 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * DESCRIPTION: Replaced Suggests: of RUnit with tinytest * inst/tinytest/*: Added * tests/tinytest.R: Added converted RUnit tests * tests/doRUnit.R: Removed * inst/unitTests/*: Removed, converted into tinytest files * R/unit.test.R: Removed helper script * .travis.yml: Replace RUnit with tinytest * inst/include/RcppArmadilloSugar.h: Switch one int to size_t and add one cast in order to quieten two compiler warnings 2019-09-01 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.9.700.2.0 * inst/NEWS.Rd: Release 0.9.700.2.0 * inst/include/armadillo_bits/*: Armadillo 9.700.2 2019-08-28 Dirk Eddelbuettel * configure.ac: Expand list of known gcc and clang versions 2019-08-27 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.699.1.0 [github-only] * inst/NEWS.Rd: Release 0.9.699.1.0 * inst/include/armadillo: Armadillo 9.700-RC1 * inst/include/armadillo_bits/*: Idem 2019-07-14 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.600.4.0 * inst/NEWS.Rd: Release 0.9.600.4.0 * inst/include/armadillo_bits/*: Armadillo 9.600.4 2019-07-13 irk Eddelbuettel * DESCRIPTION: Release 0.9.599.4.0 [github-only] * inst/NEWS.Rd: Release 0.9.599.4.0 * inst/include/armadillo: Armadillo 9.600-RC4 * inst/include/armadillo_bits/*: Idem 2019-07-10 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.599.3.0 [github-only] * inst/NEWS.Rd: Release 0.9.599.3.0 * inst/include/armadillo: Armadillo 9.600-RC3 * inst/include/armadillo_bits/*: Idem 2019-07-03 Dirk Eddelbuettel * inst/examples/fastLm.r (fastLmPureDotCall): Update example 2019-07-02 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.599.2.0 [github-only] * inst/NEWS.Rd: Release 0.9.599.2.0 * inst/include/armadillo: Armadillo 9.600-RC2 * inst/include/armadillo_bits/*: Idem 2019-06-11 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.500.2.0 * inst/NEWS.Rd: Release 0.9.500.2.0 * inst/include/armadillo: Armadillo 9.500.2 * inst/include/armadillo_bits/*: Idem 2019-06-06 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.499.1.0 [github-only] * inst/NEWS.Rd: Release 0.9.499.1.0 * inst/include/armadillo: Armadillo 9.500-RC1 * inst/include/armadillo_bits/*: Idem 2019-05-09 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.400.3.0 * inst/NEWS.Rd: Release 0.9.400.3.0 2019-05-03 Dirk Eddelbuettel * inst/include/armadillo_bits/*: Armadillo 9.400.3 2019-04-28 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.400.2.0 * inst/NEWS.Rd: Release 0.9.400.2.0 2019-04-27 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.399.2.0 [github-only] * inst/NEWS.Rd: Release 0.9.399.2.0 * inst/include/armadillo_bits/*: Armadillo 9.400.2 2019-04-21 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.399.1.0 [github-only] * inst/NEWS.Rd: Release 0.9.399.1.0 * inst/include/armadillo_bits/*: Armadillo 9.400-RC1 2019-03-21 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.9.300.2.0 * inst/NEWS.Rd: Release 0.9.300.2.0 * inst/include/armadillo_bits/*: Armadillo 9.300.2 2019-03-16 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.299.0.0 [github-only] * inst/NEWS.Rd: Release 0.9.199.0.0 * inst/include/armadillo_bits/*: Armadillo 9.300-RC1 2019-03-08 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.9.200.7.1 * inst/NEWS.Rd: Release 0.9.200.7.1 2019-03-07 Dirk Eddelbuettel * DESCRIPTION (Version, Date): New minor version * inst/unitTests/runit.sample.R (csample): Set the sample() behaviour to R 3.5.0 as R 3.6.0 has a breaking change (for the better) * inst/include/armadillo_bits/op_wishrnd_meat.hpp (apply_noalias_mode2): Backport a fix from Armadillo upstream 2019-01-17 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.9.200.7.0 * inst/NEWS.Rd: Release 0.9.200.7.0 * inst/include/armadillo_bits/def_hdf5.hpp: CRLF -> CR * inst/include/armadillo_bits/fn_spsolve.hpp: Idem 2019-01-15 Dirk Eddelbuettel * inst/include/armadillo_bits/*: Armadillo 9.200.7 2018-11-27 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.9.200.5.0 * inst/NEWS.Rd: Release 0.9.200.5.0 * inst/include/armadillo_bits/*: Armadillo 9.200.5 2018-11-09 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.9.200.4.0 * inst/NEWS.Rd: Release 0.9.200.4.0 * vignettes/Rcpp-unitTests.Rnw: Removed as less useful now 2018-11-08 Dirk Eddelbuettel * inst/include/armadillo_bits/*: Armadillo 9.200.4 2018-10-27 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.199.2.0 [github-only] * inst/NEWS.Rd: Release 0.9.199.2.0 * inst/include/armadillo_bits/*: Armadillo 9.200.RC3 2018-10-13 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.199.1.1 [github-only] * inst/NEWS.Rd: Release 0.9.199.1.1 * inst/include/armadillo_bits/*: Armadillo 9.200.RC2 (gitlab) 2018-10-04 Dirk Eddelbuettel * inst/unitTests/runit.sparseConversion.R (test.stop): Comment-out a test which consistently fails on fedora-clang at CRAN, and only there 2018-10-03 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.199.1.0 [github-only] * inst/NEWS.Rd: Release 0.9.199.1.0 * inst/include/armadillo_bits/*: Armadillo 9.200.RC2 2018-09-20 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.199.0.0 [github-only] * inst/NEWS.Rd: Release 0.9.199.0.0 * inst/include/armadillo_bits/*: Armadillo 9.200.RC1 2018-09-02 Dirk Eddelbuettel * .travis.yml: Switch Travis CI to R 3.5 repo 2018-08-16 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.100.5.0 * inst/NEWS.Rd: Release 0.9.100.5.0 * inst/include/armadillo_bits/*: Armadillo 9.100.5 2018-08-13 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.099.1 [github-only] * inst/NEWS.Rd: Release 0.9.099.1 * inst/include/armadillo_bits/*: Armadillo 9.100.RC2 2018-08-12 Dirk Eddelbuettel * DESCRIPTION: Release 0.9.099.0 [github-only] * inst/NEWS.Rd: Release 0.9.099.0 * inst/include/armadillo_bits/*: Armadillo 9.100.RC1 2018-08-06 Dirk Eddelbuettel * inst/skeleton/Makevars: Align PKG_CXXFLAGS and PKG_LIBS to both use SHLIB_OPENMP_CXXFLAGS and not once SHLIB_OPENMP_CFLAGS [CRAN request] * inst/skeleton/Makevars.win: Idem 2018-06-28 Dirk Eddelbuettel * DESCRIPTION: Release 0.8.600.0.0 * inst/NEWS.Rd: Release 0.8.600.0.0 * inst/include/armadillo_bits/*: Armadillo 8.600.0 * vignettes/RcppArmadillo-sparseMatrix.Rmd: Do not use biobliography embedded in yaml header as pandoc2 no longer supports it 2018-06-19 Dirk Eddelbuettel * DESCRIPTION: Release 0.8.599.1 [github-only] * inst/NEWS.Rd: Release 0.8.599.1 * inst/include/armadillo_bits/*: Armadillo 8.600.rc2 2018-06-16 Dirk Eddelbuettel * DESCRIPTION: Release 0.8.599.0 [github-only] * inst/NEWS.Rd: Release 0.8.599.0 * inst/include/armadillo_bits/*: Armadillo 8.600.rc1 2018-05-31 Santiago Olivella * R/RcppArmadillo.package.skeleton.R: Correct behavior when example_code=FALSE and pkgKitten is available 2018-05-31 Keith O'Hara * inst/unitTests/cpp/Rlapack.cpp: Update Rlapack tests for band matrix solvers * inst/unitTests/runit.Rlapack.R: Idem 2018-05-17 Dirk Eddelbuettel * DESCRIPTION (Suggests): Add 'slam' used in two unit test functions (and already conditional) * .travis.yml (install): Add r-cran-slam to packages to install; switch reticulate to r-cran-reticulate as both are in the c4d2u PPA 2018-05-15 Dirk Eddelbuettel * DESCRIPTION: Release 0.8.500.1.0 * inst/NEWS.Rd: Release 0.8.500.1.0 * inst/include/armadillo_bits/*: Armadillo 8.500.1 2018-04-21 Dirk Eddelbuettel * DESCRIPTION: Release 0.8.500.0 * inst/NEWS.Rd: Release 0.8.500.0 2018-04-20 Dirk Eddelbuettel * inst/include/armadillo: Upgraded to Armadillo 8.500 * inst/include/armadillo_bits/*: Idem 2018-04-19 Keith O'Hara * configure.ac: Compile-time checks for macOS compilers * configure: Idem 2018-04-17 Dirk Eddelbuettel * DESCRIPTION: Release 0.8.499.1.0 [GitHub only] * inst/NEWS.Rd: Release 0.8.499.1.0 * inst/include/armadillo: Upgraded to Armadillo 8.500.rc2 * inst/include/armadillo_bits/*: Idem 2018-04-14 Dirk Eddelbuettel * configure.ac: Comparison across ranges does not work reliably so explicitly enumerate alternative accepted g++ versions * configure: Regenerated 2018-03-29 Dirk Eddelbuettel * DESCRIPTION (Version, Date): New minor version 0.8.499.0.2 * DESCRIPTION (Depends): Require R (>= 3.3.0) 2018-03-29 Keith O'Hara * configure.ac: Updated check for limited LAPACK * configure: Idem 2018-03-27 Dirk Eddelbuettel * DESCRIPTION: New minor version 0.8.499.0.1 2018-03-27 Keith O'Hara * inst/include/armadillo_bits/auxlib_meat.hpp: Remove several no longer needed define tests for the limited LAPACK shipped with R * inst/unitTests/cpp/Rlapack.cpp: Unit tests for these features * inst/unitTests/runit.Rlapack.R: Idem 2018-03-26 Dirk Eddelbuettel * DESCRIPTION: Release 0.8.499.0.0 [GitHub only] * inst/NEWS.Rd: Release 0.8.499.0.0 * inst/include/armadillo: Upgraded to Armadillo 8.500.rc1 * inst/include/armadillo_bits/*: Idem 2018-02-19 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.8.400.0.0 * inst/NEWS.Rd: Release 0.8.400.0.0 * inst/include/armadillo: Upgraded to Armadillo 8.400.0 * inst/include/armadillo_bits/*: Idem * configure.ac: Update * configure: Idem 2018-02-13 Dirk Eddelbuettel * inst/include/RcppArmadilloConfigGenerated.h.in: Protect two #define statements by #ifndef clauses 2018-02-12 Dirk Eddelbuettel * DESCRIPTION: Release 0.8.399.1.0 [GitHub only] * inst/NEWS.Rd: Release 0.8.399.1.0 * inst/include/armadillo_bits/*: Upgraded to Armadillo 8.400.rc2 2018-02-10 Dirk Eddelbuettel * inst/include/RcppArmadilloConfig.h: Test if ARMA_COUT_STREAM is defined, not ARMA_COUT_OSTREAM; and ditto for ARMA_CERR_STREAM 2018-02-09 Dirk Eddelbuettel * DESCRIPTION: Release 0.8.399.0.0 [GitHub only] * inst/NEWS.Rd: Release 0.8.399.0.0 * inst/include/armadillo: Upgraded to Armadillo 8.400.rc1 * inst/include/armadillo_bits/*: Idem 2017-12-04 Dirk Eddelbuettel * DESCRIPTION: Release 0.8.300.1.0 * inst/NEWS.Rd: Release 0.8.300.1.0 * inst/include/armadillo: Upgraded to Armadillo 8.300.1 * inst/include/armadillo_bits/*: Idem 2017-12-01 Serguei Sokol * inst/include/RcppArmadilloAs.h: Support conversion from simple_triplet_matrix * inst/unitTests/runit.sparseConversion.R: Test conversion 2017-11-22 Dirk Eddelbuettel * DESCRIPTION: Release 0.8.300.0.0 [GitHub only] * inst/NEWS.Rd: Release 0.8.300.0.0 [GitHub only] * inst/include/armadillo: Upgraded to Armadillo 8.300.0 * inst/include/armadillo_bits/*: Idem 2017-11-08 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.8.200.2.0 [GitHub only] * inst/include/armadillo_bits/*: Upgraded to Armadillo 8.200.2 2017-10-29 Dirk Eddelbuettel * DESCRIPTION: Release 0.8.200.1.1 [GitHub only] * inst/NEWS.Rd: Release 0.8.200.1.1 [GitHub only] * inst/include/RcppArmadilloConfigGenerated.h.in: Minor edit to comment 2017-10-28 Dirk Eddelbuettel * configure.ac: Repair for OpenMP use as Armadillo needs g++ 5.4 or later * configure: Idem 2017-10-22 Dirk Eddelbuettel * configure.ac: Add default branch to g++ test with thanks to James * configure: Idem 2017-10-21 Dirk Eddelbuettel * DESCRIPTION: Release 0.8.200.1.0 [GitHub only] * inst/NEWS.Rd: Release 0.8.200.1.0 [GitHub only] * inst/include/armadillo: Upgraded to Armadillo 8.200.1 * inst/include/armadillo_bits/*: Idem * inst/include/RcppArmadilloConfig.h: Set ARMA_DONT_PRINT_OPENMP_WARNING to suppress warnings from Armadillo when client packages fail to set -fopenmp * inst/include/RcppArmadilloConfigGenerated.h.in: Small cleanups * configure.ac: Idem * configure: Idem 2017-10-14 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * inst/skeleton/Makevars (CXX_STD): Update C++11 settings * inst/skeleton/Makevars.win (CXX_STD): Idem 2017-10-12 Dirk Eddelbuettel * R/RcppArmadillo.package.skeleton.R: Also set .registration=TRUE in NAMESPACE file 2017-10-10 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.8.100.1.0 * inst/NEWS.Rd: Idem * configure: Idem 2017-10-09 Dirk Eddelbuettel * inst/include/RcppArmadilloWrap.h (Rcpp): Call sync() on SpMat 2017-10-05 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.8.100.1.0 (incomplete) * .travis.yml (install): Also install r-cran-pinp 2017-10-04 Dirk Eddelbuettel * vignettes/RcppArmadillo-sparseMatrix.Rmd: Some edits, added references 2017-10-02 Dirk Eddelbuettel * inst/include/armadillo: Upgraded to Armadillo 8.100.1 * inst/include/armadillo_bits/*: Idem * inst/include/RcppArmadilloConfig.h: Update to ARMA_COUT_STREAM and ARMA_CERR_STREAM * vignettes/RcppArmadillo-sparseMatrix.Rmd: Converted to markdown using pinp package, added missing vignette entries 2017-09-20 Serguei Sokol * inst/include/RcppArmadilloAs.h: Use native constructors for dgt, dtt, dst type conversion 2017-08-31 Binxiang Ni * inst/include/RcppArmadilloAs.h: Call .sync() before assessing internals of the SpMat classes [early patch to the 8.100.* code] 2017-08-29 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.7.960.1.2 2017-08-27 Dirk Eddelbuettel * configure.ac: Detect macOS to turn off OpenMP in src/Makevars * configure: Idem * src/Makevars: New configure var for OpenMP linker/compiler flags * inline.R: Similarly turn OpenMP off on macOS * src/Makevars: Compile under C++11 * src/Makevars.win: Idem 2017-08-26 James Joseph Balamuta * DESCRIPTION: Also Suggests: highlight * vignettes/RcppArmadillo-sparseMatrix.Rnw: Set VignetteDepends 2017-08-21 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * inst/include/RcppArmadilloConfigGenerated.h.in: Renamed from inst/include/RcppArmadilloLapack.h.in to reflect use beyond LAPACK * inst/include/RcppArmadilloConfig.h: Updated * configure.ac: Idem * configure: Idem * cleanup.sh: Idem 2017-08-20 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.7.960.1.1 * man/RcppArmadillo-package.Rd: Minor edits * man/fastLm.Rd: Idem * README.md: Idem * src/Makevars.win: Small cosmetic edits as in Makevars 2017-08-19 Dirk Eddelbuettel * configure.ac: Added simple OpenMP detection * configure: Idem * inst/include/RcppArmadilloLapack.h.in: Apply variable here * src/Makevars: Small edits * src/fastLm.cpp: Renamed fastLm to fastLm_impl to not clash with R method of same name now that .registration is true * inst/unitTests/runit.fastLm.R: Updated test call * src/RcppExports.cpp: Regenerated * R/RcppExports.R: Idem * man/fastLm.Rd: New alias 2017-08-18 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * inst/include/RcppArmadilloAs.h (Rcpp): Improved S4 inheritance check 2017-08-11 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.7.960.1.0 * inst/NEWS.Rd: Idem * DESCRIPTION (Author): New co-author Binxinag Ni 2017-08-10 Dirk Eddelbuettel * inst/include/armadillo_bits/*: Updated to upstream release 7.960.1 * .aspell/: Added for new R-devel spell checker interface * DESCRIPTION (Version, Date): Rolled to pre-release 0.7.959.0.3 2017-08-09 Dirk Eddelbuettel * inst/unitTests/runit.scipy2r.R: Condition test on having SciPy * DESCRIPTION (Version, Date): Rolled to pre-release 0.7.959.0.2 2017-08-08 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Rolled to pre-release 0.7.959.0.1 in preparation of 0.7.960.0.0 release "real soon now" * tests/doRUnit.R: Small edits and improvements * inst/unitTests/runit.sparseConversion.R: Run Kronecker products once in setup under suppressMessages to suppress dispatch messages 2017-08-07 Dirk Eddelbuettel * inst/unitTests/runit.scipy2r.R: Whitespace edits * R/SciPy2R.R: Idem; also renamed from py2R, removed one require() * .travis.yml (install): Also install reticulate and (r-cran-)jsonlite 2017-08-07 Binxiang Ni * R/py2r.R: Python to R conversion * inst/unitTests/runit.scipy2r.R: Unit tests 2017-08-06 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Rolled to fictional pre-release number 0.7.959.0.0 is preparation of 0.7.960.0.0 release * inst/NEWS.Rd: Expanded description of GSoC 2017 work by Binxiang 2017-08-03 Binxiang Ni * inst/include/RcppArmadilloWrap.h: Comment-out unreachable code 2017-08-02 Qiang Kou (KK) * inst/include/armadillo_bits/SpMat_meat.hpp: Correct use of 'p' in dgCMatrix (by pulling in upstream patch from Armadillo) * inst/unitTests/cpp/sparse.cpp: New speye() unit tests * inst/unitTests/runit.sparse.R: Ditto 2017-08-01 Dirk Eddelbuettel * inst/include/armadillo*: Upgraded to Armadillo 7.960.0 2017-08-01 Serguei Sokol * inst/include/RcppArmadilloWrap.h: Allow collapsed returns of row or column vector if appropriate #define is set * inst/unitTests/runit.RcppArmadillo.R: Corresponding unit test * inst/unitTests/cpp/any_as_vec.cpp: Ditto * inst/unitTests/cpp/armadillo.cpp: Ditto * inst/unitTests/cpp/colrow_as_vec.cpp: Ditto * R/unit.test.R: Generalization for test helper 2017-07-31 Dirk Eddelbuettel * vignettes/RcppArmadillo-sparseMatrix.Rnw: Use highlight engine 2017-07-31 Binxiang Ni * vignettes/RcppArmadillo-sparseMatrix.Rnw: New vignette 2017-07-11 Binxiang Ni * inst/include/RcppArmadilloAs.h: Add a stop message for matrices that cannot be converted * inst/unitTests/runit.sparseConversion.R: Add unit tests for matrices that cannot be converted 2017-07-10 Binxiang Ni * inst/include/RcppArmadilloAs.h: Rewrite conversion for ddiMatrix to support an extreme case * inst/unitTests/runit.sparse.R: Move unit tests for the conversion for sparse matrices to runit.sparseConversion.R * inst/unitTests/runit.sparseConversion.R: Add more unit tests for the conversion for ddiMatrix 2017-07-08 Binxiang Ni * inst/include/RcppArmadilloAs.h: Add conversion for indMatrix * inst/unitTests/runit.sparse.R: Add unit tests for the conversion for indMatrix * inst/unitTests/runit.sparseConversion.R: Add more unit tests for the conversion for indMatrix 2017-07-08 Dirk Eddelbuettel * inst/unitTests/runit.sparseConversion.R: Use text= in read.table 2017-07-04 Binxiang Ni * inst/include/RcppArmadilloAs.h: Rewrite conversion for dgT, dtT & dsTMatrix to support two extreme cases * inst/unitTests/runit.sparseConversion.R: Add new unit tests for conversion of sparse matrices 2017-06-23 Dirk Eddelbuettel * inst/AUTHORS: Added * inst/COPYRIGHTS: Idem 2017-06-21 Binxiang Ni * inst/include/RcppArmadilloAs.h: Add conversion for pMatrix & ddiMatrix * inst/unitTests/runit.sparse.R: Add unit tests for the conversion for pMatrix & ddiMatrix 2017-06-19 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Roll minor version * .travis.yml (group): Added as required by Travis CI 2017-06-19 Binxiang Ni * inst/include/RcppArmadilloAs.h: Add conversion for dgR, dtR & dsRMatrix * inst/unitTests/runit.sparse.R: Add unit tests for the conversion for dgR, dtR & dsRMatrix 2017-06-18 Binxiang Ni * inst/include/RcppArmadilloAs.h: Add conversion for dgT, dtT & dsTMatrix * inst/unitTests/runit.sparse.R: Add unit tests for the conversion for dgT, dtT & dsTMatrix 2017-06-17 Binxiang Ni * inst/include/RcppArmadilloAs.h: Add conversion for dtC & dsCMatrix * inst/unitTests/runit.sparse.R: Add unit tests for the conversion for dtC & dsCMatrix 2017-06-04 Dirk Eddelbuettel * configure.ac: Whitespace changes * configure: Regenerated 2017-06-02 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.7.900.2.0 * inst/NEWS.Rd: Idem * README.md: Use alternate for img.shields.io GPL-2+ badge * src/Makevars (CXX_STD): Do not enable C++11 by default to not require too modern a compiler 2017-06-01 Dirk Eddelbuettel * inst/include/armadillo*: Upgraded to Armadillo 7.900.2 2017-05-24 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.7.900.1.2 (GH-only) * src/RcppExports.cpp: Regenerated under Rcpp 0.12.11 with included package registration * R/RcppExports.R: Regenerated under Rcpp 0.12.11 with unquoted registered function calls * src/init.c: Removed * README.md: Switch to https for a few badge URLs * R/inline.R (inlineCxxPlugin): Use '::' to import from Rcpp 2017-05-23 Dirk Eddelbuettel * R/inline.R (inlineCxxPlugin): Also enable OpenMP as a compile-time option 2017-05-22 Dirk Eddelbuettel * R/inline.R (inlineCxxPlugin): Support OpenMP * src/Makevars: Ditto * src/Makevars.win: Ditto * inst/skeleton/Makevars: Ditto * inst/skeleton/Makevars.win: Ditto 2017-05-21 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.7.900.1.1 (GH-only) * inst/unitTests/cpp/rmultinom.cpp: More careful use of Armadillo vectors and Rcpp vectors 2017-05-15 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.7.900.1.0 (GH-only) * inst/include/armadillo*: Upgraded to Armadillo 7.900.1 2017-05-10 James Joseph Balamuta * man/armadillo_set_seed.Rd: Clarified RNG usage in C++98 and C++11 modes. * man/armadillo_set_seed_random.Rd: idem * R/RcppExports.R: idem * src/RcppArmadillo.cpp: idem 2017-05-08 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.7.900.0.0 (GH-only) * inst/include/armadillo*: Upgraded to Armadillo 7.900.0 2017-05-06 James Joseph Balamuta * configure.ac: Added gcc7 to viable gcc compiler list * configure: Idem 2017-05-03 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Test release 0.7.899.0.0 * inst/include/armadillo*: Upgraded to Armadillo 7.899.0 * src/Makevars (PKG_LIBS): Enable OpenMP and C++11 2017-04-16 Dirk Eddelbuettel * inst/include/RcppArmadillo/Alt_R_RNG.h (set_seed): Add a simple null-op to suppress a -Wunused warning 2017-04-12 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.7.800.2.0 * inst/include/armadillo*: Upgraded to Armadillo 7.800.2 2017-02-20 Dirk Eddelbuettel * NAMESPACE (useDynLib): Add .registration=TRUE; some other edits * src/init.c: Added 'R_registerRoutines()' & 'R_useDynamicSymbols()' 2017-02-19 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.7.800.0.0 (GH-only) * DESCRIPTION (Description): Mention that Armadillo is now licensed as Apache License 2 (as a change from Mozilla MPL 2.0) * inst/include/armadillo*: Upgraded to Armadillo 7.800.0 2017-02-18 Dirk Eddelbuettel * src/fastLm.cpp: Whitespace tweaks, using Named(), update copyright * .travis.yml (before_install): Use https 2017-02-06 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.7.700.0.0 (CRAN) * inst/include/*: Upgraded to release 7.700.0 of Armadillo * debian/*: Debian release of 0.7.700.0.0 2017-01-05 Dirk Eddelbuettel * DESCRIPTION (Version, Date): 0.7.600.2.0 (GH-only) 2017-01-04 Dirk Eddelbuettel * inst/include/armadillo_bits/: Armadillo release 7.600.2 2016-12-16 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.7.600.1.0 * inst/NEWS.Rd: Release 0.7.600.1.0 * debian/*: Debian release of 0.7.600.1.0 * inst/include/*: Upgraded to release 7.600.1 of Armadillo 2016-12-12 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.7.599.0 (GH-only) * inst/NEWS.Rd: Release 0.7.599.0 (GH-only) * inst/include/*: Upgraded to release 7.600.0-test of Armadillo 2016-11-11 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.7.500.1.0 (GH-only) * inst/NEWS.Rd: Release 0.7.500.1.0 (GH-only) * inst/include/*: Upgraded to release 7.500.1 of Armadillo 2016-10-25 Dirk Eddelbuettel * inst/include/RcppArmadilloExtensions/sample.h (Rcpp): Update to newer Armadillo interface: descending sort order is now signaled by using the more explicit string "descend" as opposed to (uword) 1 2016-10-20 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.7.500.0.0 * DESCRIPTION (Description): Noted minimum of g+++ 4.6 or later 2016-10-20 Dirk Eddelbuettel * inst/include/*: Upgraded to release 7.500.0 of Armadillo * debian/*: Debian release of 0.7.500.0.0 * .gitattributes: Added 2016-08-24 Dirk Eddelbuettel * DESCRIPTION (Version, Date): Release 0.7.400.2.0 (CRAN) * inst/include/*: Finalised as 7.400.2 of Armadillo * debian/*: Debian release of 0.7.400.2.0 * .travis.yml: Switch to using run.sh for Travis CI 2016-08-23 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.7.400.1.1 (GH-only) * inst/NEWS.Rd: Release 0.7.400.1.1 (GH-only) * inst/include/*: Upgraded to release 7.400.2.test of Armadillo 2016-08-15 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.7.400.1.0 (GH-only) * inst/NEWS.Rd: Release 0.7.400.1.0 (GH-only) * inst/include/*: Upgraded to release 7.400.1 of Armadillo 2016-08-12 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.7.400.0.0 (GH-only) * inst/NEWS.Rd: Release 0.7.400.0.0 (GH-only) * inst/include/*: Upgraded to release 7.400.0-test of Armadillo 2016-07-30 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.7.300.1.0 (GH-only) * inst/NEWS.Rd: Release 0.7.300.1.0 (GH-only) * inst/include/*: Upgraded to release 7.300.1 of Armadillo 2016-07-22 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.7.200.2.0 (CRAN) * DESCRIPTION (Date): Updated 2016-06-22 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.7.200.2.0 (GH-only) * inst/NEWS.Rd: Release 0.7.200.2.0 (GH-only) * inst/include/*: Upgraded to release 7.200.2 of Armadillo 2016-06-19 James Joseph Balamuta * inst/include/RcppArmadilloExtensions/sample.h: Rewrote sampling functions to use only armadillo outside of the supplied data vector. * inst/include/RcppArmadilloExtensions/fixprob.h: Updated fix probability check code to use armadillo object for probability. 2016-06-09 Dirk Eddelbuettel * configure.ac: Correct assignment for fully-featured versus incomplete LAPACK set in inst/include/RcppArmadilloLapack.h * configure: Ditto 2016-06-06 Dirk Eddelbuettel * DESCRIPTION (Version): Release 0.7.200.1.0 (GH-only) * inst/NEWS.Rd: Release 0.7.200.1.0 (GH-only) * inst/include/*: Upgraded to release 7.200.1 of Armadillo 2016-06-02 Dirk Eddelbuettel * DESCRIPTION: Release 0.7.100.3.1 * configure.ac: Move R-based CXX init before first autoconf commands * configure: Ditto 2016-05-30 Dirk Eddelbuettel * configure.ac: Refined test for minimal g++ version to first set CXX based on the existing R configuratin * configure: Ditto 2016-05-25 Dirk Eddelbuettel * DESCRIPTION: Release 0.7.100.3.0 * inst/NEWS.Rd: Release 0.7.100.3.0 * debian/*: Changes for Debian release of 0.7.100.3.0 * inst/include/*: Upgraded to release 7.100.3 of Armadillo 2016-05-16 Dirk Eddelbuettel * DESCRIPTION: Release 0.7.100.0.0 [GitHub only] * inst/NEWS.Rd: Release 0.7.100.0.0 [GitHub only] * inst/include/*: Upgraded to release 7.100.0 of Armadillo 2016-05-12 Dirk Eddelbuettel * configure.ac: Rewriting configure as autoconf script for better compiler tests * configure (checkoldcompiler): Add test to guard against old g++ compilers (such as g++-4.4 used on some RHEL and CentOS releases) which are no longer sufficient to build RcppArmadillo. 2016-05-05 Dirk Eddelbuettel * DESCRIPTION: Release 0.6.700.6.0 * inst/NEWS.Rd: Release 0.6.700.6.0 * debian/*: Changes for Debian release of 0.6.700.6.0 2016-05-04 George G. Vega Yon * inst/include/RcppArmadilloConfig.h: Added support for int64_t when required * inst/include/RcppArmadilloAs.h: Fixing bug in SpMat exporter * inst/unitTests/cpp/sparse.cpp: Added two new tests * inst/unitTests/runit.sparse.R: Added two new tests 2016-05-03 Dirk Eddelbuettel * inst/include/*: Upgraded to release 6.700.6 of Armadillo 2016-04-05 Dirk Eddelbuettel * DESCRIPTION: Release 0.6.700.3.0 * inst/NEWS.Rd: Release 0.6.700.3.0 * inst/include/*: Upgraded to release 6.700.3 of Armadillo * debian/*: Changes for Debian release of 0.6.600.4.0 2016-03-15 Dirk Eddelbuettel * DESCRIPTION: Release 0.6.600.4.0 * inst/NEWS.Rd: Release 0.6.600.4.0 * inst/include/*: Upgraded to release 6.600.4 of Armadillo * debian/*: Changes for Debian release of 0.6.600.4.0 2016-03-12 Dirk Eddelbuettel * DESCRIPTION: Release 0.6.600.3.1 [GitHub only] * inst/NEWS.Rd: Release 0.6.600.3.1 [GitHub only] * inst/include/*: Upgraded to release 6.600.4-test of Armadillo * configure: Take R 3.3.0 with a complete fallback for LAPACK into consideration when checking for LAPACK features 2016-03-11 Dirk Eddelbuettel * DESCRIPTION: Release 0.6.600.2.1 [GitHub only] * inst/NEWS.Rd: Release 0.6.600.2.1 [GitHub only] * inst/include/*: Upgraded to release 6.600.3-test of Armadillo 2016-01-26 Dirk Eddelbuettel * DESCRIPTION: Release 0.6.500.4.0 * inst/NEWS.Rd: Release 0.6.500.4.0 * inst/include/*: Upgraded to release 6.500.4 of Armadillo * debian/*: Changes for Debian release of 0.6.500.4.0 * inst/include/RcppArmadilloConfig.h (ARMA_32BIT_WORD): Define to ensure 32-bit words are used even with C++11 or C++14 * inst/include/RcppArmadillo.h: Added some comments 2016-01-24 Dirk Eddelbuettel * DESCRIPTION: Release 0.6.500.2.1 [GitHub only] * inst/NEWS.Rd: Release 0.6.500.2.1 [GitHub only] * inst/include/*: Upgraded to release 6.500.3-test of Armadillo 2016-01-10 Dirk Eddelbuettel * configure: Use /usr/bin/env bash as shebang 2015-12-15 Dirk Eddelbuettel * DESCRIPTION: Release 0.6.400.2.0 * inst/NEWS.Rd: Release 0.6.400.2.0 * inst/include/*: Upgraded to release 6.400.2 of Armadillo * debian/*: Changes for Debian release of 0.6.400.2.0 2015-12-12 Dirk Eddelbuettel * DESCRIPTION: Release 0.6.300.2.2 * inst/NEWS.Rd: Release 0.6.300.2.2 * configure (hasRlapack): Reworded test messages 2015-12-09 Dirk Eddelbuettel * configure: Further refinements in test for partial LAPACK 2015-12-08 Dirk Eddelbuettel * DESCRIPTION: Release 0.6.300.2.1 [GitHub only] * inst/NEWS.Rd: Release 0.6.300.2.1 [GitHub only] * inst/include/*: Upgraded to release 6.300.3-test of Armadillo * inst/include/RcppArmadilloConfig.h: Updated #define for limited LAPACK * inst/include/RcppArmadilloLapack.h.in: Updated conditional #define * configure: Updated test for Rlapack and corresponding #define 2015-12-03 Dirk Eddelbuettel * DESCRIPTION: Release 0.6.300.2.0 * inst/NEWS.Rd: Release 0.6.300.2.0 * inst/include/*: Upgraded to release 6.300.2 of Armadillo * debian/*: Changes for Debian release of 0.6.300.2.0 2015-12-01 Dirk Eddelbuettel * DESCRIPTION: Release 0.6.299.0.0 [GitHub only] * inst/NEWS.Rd: Release 0.6.299.0.0 [GitHub only] * inst/include/*: Upgraded to release 6.300.0-test of Armadillo 2015-11-30 Nathan Russell * inst/include/RcppArmadilloAs.h: Support as<> converters to the Armadillo cube type * inst/unitTests/cpp/cube.cpp: Unit tests for Cube converter * inst/unitTests/runit.cube.R: Idem 2015-10-30 Dirk Eddelbuettel * DESCRIPTION: Release 0.6.199.2.0 [GitHub only] * inst/NEWS.Rd: Release 0.6.199.2.0 [GitHub only] * inst/include/*: Upgraded to release 6.200.2-test of Armadillo 2015-10-26 Dirk Eddelbuettel * DESCRIPTION: Release 0.6.199.0.0 [GitHub only] * inst/NEWS.Rd: Release 0.6.199.0.0 [GitHub only] * inst/include/*: Upgraded to release 6.200.0-test of Armadillo 2015-10-03 Dirk Eddelbuettel * DESCRIPTION: Release 0.6.100.0.0 * inst/NEWS.Rd: Release 0.6.100.0.0 * inst/include/*: Upgraded to release 6.100.0 of Armadillo * debian/*: Changes for Debian release of 0.6.100.0.0 2015-09-25 Dirk Eddelbuettel * DESCRIPTION: Release 0.6.000.1.0 [GitHub only] * inst/NEWS.Rd: Release 0.6.000.1.0 [GitHub only] * inst/include/*: Upgraded to release 6.000.1-test of Armadillo 2015-09-19 Dirk Eddelbuettel * DESCRIPTION: Release 0.5.600.2.0 * inst/NEWS.Rd: Release 0.5.600.2.0 * inst/include/*: Upgraded to release 5.600.2 of Armadillo * debian/*: Changes for Debian release of 0.5.600.2.0 2015-09-03 Dirk Eddelbuettel * DESCRIPTION: Release 0.5.500.2.0 * inst/NEWS.Rd: Release 0.5.500.2.0 * inst/include/*: Upgraded to release 5.500.2 of Armadillo * debian/*: Changes for Debian release of 0.5.500.2.0 2015-09-02 Dirk Eddelbuettel * DESCRIPTION: (Test) Release 0.5.499.0 * inst/include/*: Upgraded to (test) release 5.500.1 of Armadillo 2015-08-17 Dirk Eddelbuettel * DESCRIPTION: Release 0.5.400.2.0 * inst/NEWS.Rd: Release 0.5.400.2.0 * inst/include/*: Upgraded to release 5.400.2 of Armadillo * debian/*: Changes for Debian release of 0.5.400.2.0 * NAMESPACE: Also import package.skeleton from utils 2015-08-13 Dirk Eddelbuettel * DESCRIPTION: (Test) Release 0.5.399.0 * inst/include/*: Upgraded to (test) release 5.400.1 of Armadillo 2015-08-05 Dirk Eddelbuettel * inst/examples/varSimulation.r: Minor touch-up 2015-08-04 Dirk Eddelbuettel * R/RcppArmadillo.package.skeleton.R: Correct kitten() use based on patch by Grant Brown for RcppEigen (cf GitHub issue #21 @ RcppEigen) 2015-08-03 Dirk Eddelbuettel * DESCRIPTION: Release 0.5.300.4.0 * inst/NEWS.Rd: Release 0.5.300.4.0 * inst/include/*: Upgraded to release 5.300.4 of Armadillo * debian/*: Changes for Debian release of 0.5.300.4.0 * NAMESPACE: Additional importFrom() statements for R CMD check * DESCRIPTION: Also import utils and stats for R CMD check 2015-07-31 Dirk Eddelbuettel * DESCRIPTION: (Test) Release 0.5.300.3.0 * inst/include/*: Upgraded to (test) release 5.300.3 of Armadillo 2015-07-28 Dirk Eddelbuettel * DESCRIPTION: (Test) Release 0.5.300.1.0 * inst/include/*: Upgraded to (test) release 5.300.1 of Armadillo 2015-07-11 Dirk Eddelbuettel * vignettes/RcppArmadillo-intro.Rnw: No longer use H as a float placement as it upsets Texlive 2015 (per request of Kurt Hornik / CRAN) 2015-06-06 Dirk Eddelbuettel * R/RcppArmadillo.package.skeleton.R: Correct use of requireNamespace() 2015-06-04 Dirk Eddelbuettel * DESCRIPTION: Release 0.5.200.1.0 * inst/NEWS.Rd: Release 0.5.200.1.0 * inst/include/*: Upgraded to release 5.200.1 of Armadillo 2015-05-19 Dirk Eddelbuettel * inst/examples/fastLm.r: Added another example starting directly from a SEXP interface to illustrate potential cost of interfaces 2015-05-12 Dirk Eddelbuettel * DESCRIPTION: Release 0.5.100.2.0 [GitHub only] * inst/NEWS.Rd: Release 0.5.100.2.0 [GitHub only] * inst/include/*: Upgraded to release 5.100.2 of Armadillo 2015-05-09 Dirk Eddelbuettel * DESCRIPTION: Release 0.5.100.1.1 [GitHub only] * inst/NEWS.Rd: Release 0.5.100.1.1 [GitHub only] * inst/include/*: Upgraded to [test] release 5.100.2 of Armadillo 2015-05-01 Dirk Eddelbuettel * DESCRIPTION: Release 0.5.100.1.0 * inst/NEWS.Rd: Release 0.5.100.1.0 * inst/include/*: Upgraded to release 5.100.1 of Armadillo 2015-04-30 Dirk Eddelbuettel * DESCRIPTION: Release 0.5.099.1.0 [GitHub only] with altered release number to permit upgrade once 5.100.1 is released * inst/NEWS.Rd: Release 0.5.099.1.0 [GitHub only] * inst/include/*: Upgraded to release 5.100.1 of Armadillo 2015-04-12 Dirk Eddelbuettel * DESCRIPTION: Release 0.5.000.0 * inst/NEWS.Rd: Release 0.5.000.0 * inst/include/*: Upgraded to release 5.000 of Armadillo 2015-04-04 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.999.1.0 [GitHub only] * inst/NEWS.Rd: Release 0.4.999.1.0 [GitHub only] * inst/include/*: Upgraded to release 4.999.1 of Armadillo 2015-02-26 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.600.2.0 [GitHub only] * inst/NEWS.Rd: Release 0.4.600.2.0 [GitHub only] * inst/include/*: Upgraded to release 4.650.2 of Armadillo 2015-02-25 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.650.1.1 * inst/NEWS.Rd: Release 0.4.650.1.1 * inst/include/armadillo: Fix for C++11 RNG include 2015-02-24 Dirk Eddelbuettel * inst/include/*: Upgraded to release 4.650.1 of Armadillo * .travis.yml: Switch to ppa:edd/misc for binaries 2015-01-23 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.600.4.0 * inst/NEWS.Rd: Release 0.4.600.4.0 * inst/include/*: Upgraded to release 4.600.4 of Armadillo * inst/examples/fastLm.r: Load Rcpp library 2015-01-21 Dirk Eddelbuettel * R/unit.test.R (unit_test_setup): Use requireNamespace() * R/RcppArmadillo.package.skeleton.R: Ditto 2015-01-20 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.600.3.0 [GitHub only] * inst/NEWS.Rd: Release 0.4.600.3.0 [GitHub only] * inst/include/*: Upgraded to release 4.600.3 of Armadillo 2014-12-27 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.600.0 * inst/NEWS.Rd: Release 0.4.600.0 * inst/include/*: Upgraded to release 4.600 of Armadillo 2014-12-25 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.599.2.0 [GitHub only] * inst/NEWS.Rd: Release 0.4.599.2.0 [GitHub only] * inst/include/*: Upgraded to release 4.599.alpha.2 of Armadillo 2014-12-23 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.599.1.0 [GitHub only] * inst/NEWS.Rd: Release 0.4.599.1.0 [GitHub only] * inst/include/*: Upgraded to release 4.599.alpha.1 of Armadillo 2014-12-02 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.550.2.0 [GitHub only] * inst/NEWS.Rd: Release 0.4.549.2.0 [GitHub only] * inst/include/*: Upgraded to release 4.550.2 of Armadillo 2014-11-26 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.550.1.0 * inst/NEWS: Release 0.4.550.1.0 * debian/*: Similarly updated for new release to Debian * inst/include/*: Upgraded to release 4.550.1 of Armadillo * inst/unitTests/runit.rmultinom.R: Run only if 'long double' exists 2014-11-25 Dirk Eddelbuettel * inst/unitTests/runit.rmultinom.R: Run only on i686 or x86_64 2014-11-22 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.550.0 * inst/NEWS: Release 0.4.550.0 * debian/*: Similarly updated for new release to Debian * inst/include/*: Upgraded to release 4.550 of Armadillo * .travis.yml: Undo temporary stop-gap measure of setting CRAN 2014-11-19 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.549.2.0 [GitHub only] * inst/NEWS.Rd: Release 0.4.549.2.0 [GitHub only] * inst/include/*: Upgraded to "alpha" version 4.549.2 of Armadillo * .travis.yml: Temporary stop-gap measure of setting CRAN to something other than the RStudio CDN which currently has DNS issue 2014-11-19 Romain Francois * inst/include/RcppArmadilloAs.h: Support Fields type * inst/include/RcppArmadilloForward.h: Ditto 2014-10-30 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.500.0 * inst/NEWS: Release 0.4.500.0 * debian/*: Similarly updated for new release to Debian * inst/include/*: Upgraded to release 4.500 of Armadillo 2014-10-26 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.449.1.0 [GitHub only] * inst/NEWS.Rd: Release 0.4.449.1.0 [GitHub only] * inst/include/*: Upgraded to "alpha" version 4.449.1 of Armadillo 2014-09-26 Christian Gunning * inst/include/RcppArmadilloExtensions/sample.h: Extended with Walker's method * inst/include/RcppArmadilloExtensions/rmultinom.h: Added * inst/include/RcppArmadilloExtensions/fixprob.h: Split off from sample.h * inst/unitTests/runit.sample.R: Updated for new functionality * inst/unitTests/runit.rmultinom.R: New unit test * inst/unitTests/cpp/rmultinom.cpp: New unit test file in C++ 2014-09-20 Dirk Eddelbuettel * inst/include/RcppArmadilloConfig.h: Add a new #define variable which selects the RNG from R as a fallback (unless C++11 is used) * inst/include/armadillo: Include new R RNG if #define set * inst/include/armadillo_bits/arma_rng_r.hpp: Added new RNG implementation based on runif() from R * inst/include/armadillo_bits/arma_rng.hpp: Deploy new R RNG * inst/unitTests/runit.rng.R: New unit tests for RNG fallback code * inst/unitTests/cpp/rng.cpp: C++ side of new unit tests 2014-09-19 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.450.0 * inst/NEWS.Rd: Release 0.4.450.0 [GitHub only] * inst/include/*: Upgraded to version 4.450 of Armadillo 2014-09-16 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.419.3.0 [GitHub only] * inst/NEWS.Rd: Release 0.4.419.3.0 [GitHub only] * inst/include/*: Upgraded to version 4.419.3 of Armadillo 2014-09-01 Dirk Eddelbuettel * R/RcppArmadillo.package.skeleton.R: Copy new manual page when copying the example code documented in it * R/RcppArmadillo.package.skeleton.R: Use pkgKitten::kitten() when available * .travis.yml: Also install pkgKitten as Suggests: now required 2014-08-30 Dirk Eddelbuettel * inst/skeleton/rcpparma_hello_world.Rd: New manual page for skeleton functions 2014-08-28 Dirk Eddelbuettel * R/RcppArmadillo.package.skeleton.R: In DESCRIPTION and NAMESPACE, only Imports: Rcpp and not RcppArmadillo (to appease R CMD check) 2014-08-27 Dirk Eddelbuettel * man/RcppArmadillo-package.Rd: Updated manual page 2014-08-19 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.400.0 * inst/NEWS: Release 0.4.400.0 * debian/*: Similarly updated for new release to Debian * inst/include/*: Upgraded to release 4.400 of Armadillo 2014-08-18 Dirk Eddelbuettel * inst/include/*: Upgraded to pre-release 4.399.3 of Armadillo 2014-08-17 Dirk Eddelbuettel * inst/unitTests/runit.sparse.R: New unit tests for sparse matrices * inst/unitTests/cpp/sparse.cpp: New unit tests for sparse matrices 2014-08-15 Dirk Eddelbuettel * inst/include/*: Upgraded to pre-release 4.399.2 of Armadillo * inst/include/RcppArmadilloAs.h: Further correction to sparse matrix converter with special thanks to Ryan Curtin for some excellent help 2014-08-10 Dirk Eddelbuettel * inst/include/RcppArmadilloAs.h: Correct sparse matrix converter 2014-07-04 Dirk Eddelbuettel * vignettes/RcppArmadillo-unitTests.Rnw: Commented-out copy of unit test result file to /tmp per request of Kurt 2014-07-03 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.320.0 * inst/NEWS: Release 0.4.320.0 * debian/*: Similarly updated for new release to Debian * inst/include/*: Upgraded to version 4.320 of Armadillo 2014-06-03 Dirk Eddelbuettel * inst/unitTests/cpp/complex.cpp: Rename a variable as the term CS clashes with a macro on the Solaris OS 2014-06-02 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.300.8.0 * inst/NEWS: Release 0.4.300.8.0 * debian/*: Similarly updated for new release to Debian * inst/include/*: Upgraded to version 4.300.8 of Armadillo 2014-06-01 Dirk Eddelbuettel * configure: Change back to #!/bin/bash * configure: Added tips do in case no suitable shell is available * tests/doRUnit.R: Simplified, following use in RProtoBuf * inst/unitTests/runTests.R: Refreshed, following use in RProtoBuf 2014-05-31 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.300.7.0 [pending/unreleased] * inst/NEWS: Release 0.4.300.7.00 [pending/unreleased] * debian/*: Similarly updated for new release to Debian * inst/include/*: Upgraded to version 4.300.7 of Armadillo * src/Makevars.win: Detail possible use of ARMA_DONT_USE_CXX11 define * src/Makevars: Edited as well 2014-05-29 Dirk Eddelbuettel * inst/include/RcppArmadilloConfig.h: Robustify behaviour on Windows under MinGW when C++11 is used 2014-05-28 Dirk Eddelbuettel * src/Makevars: Updated (commented-out) C++11 settings variable * src/Makevars.win: Idem 2014-05-19 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.300.5.0 [GitHub only] * inst/NEWS: Release 0.4.300.5.0 [GitHub only] * inst/include/*: Upgraded to version 4.300.5 of Armadillo 2014-05-13 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.300.2.0 [GitHub only] * inst/NEWS: Release 0.4.300.2.0 [GitHub only] * inst/include/*: Upgraded to version 4.300.2 of Armadillo 2014-05-05 Dirk Eddelbuettel * configure: Rewritten for non-bash versions of /bin/sh 2014-05-04 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.300.0 * inst/NEWS: Release 0.4.300.0 * debian/*: Similarly updated for new release to Debian * configure: If R version 3.0.3 or newer, use comples GESDD 2014-05-02 Dirk Eddelbuettel * inst/include/*: Upgraded to version 4.300 of Armadillo 2014-04-20 Kevin Ushey * inst/include/RcppArmadilloAs.h: Force vector coercion if the type does not fit within an R vector through as * inst/unitTests/cpp/armadillo.cpp: Add unit tests * inst/unitTests/runit.RcppArmadillo.R: Add unit tests 2014-04-20 Dirk Eddelbuettel * inst/include/RcppArmadilloConfig.h: Comment-out setting of C++11 define which (Rcpp)Armadillo gets correctly by itself 2014-04-07 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.200.0 * inst/NEWS: Release 0.4.200.0 * inst/include/*: Upgraded to version 4.200 of Armadillo * debian/*: Similarly updated for new release to Debian 2014-03-07 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.100.2 * inst/NEWS: Release 0.4.100.2 * inst/include/*: Upgraded to version 4.100.2 of Armadillo * debian/*: Similarly updated for new release to Debian 2014-03-04 Dirk Eddelbuettel * inst/include/*: Upgraded to (unreleased) version 4.100.1 of Armadillo 2014-03-01 Dirk Eddelbuettel * inst/skeleton/rcpparma_hello_world.cpp: Correct use of depends for Attributes (for illustration only as skeleton uses package build) * src/Makevars: Simple setup for C++11 use (for R-devel aka R 3.1.0) by defining USE_CXX1X (commented out by default) * inst/include/RcppArmadilloConfig.h: If USE_CXX1X is defined, also define ARMA_USE_CXX11 to permit use C++11 by Armadillo 2014-02-28 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.100.0 * inst/NEWS: Release 0.4.100.0 * inst/include/*: Upgraded to new release 4.100.0 of Armadillo * debian/*: Similarly updated for new release to Debian 2014-02-26 Dirk Eddelbuettel * inst/include/*: Updated current Armadillo 4.100 snapshot 2014-02-25 Dirk Eddelbuettel * inst/include/*: Add current Armadillo 4.100 snapshot 2014-02-20 Dirk Eddelbuettel * debian/control: Remove Depends: on littler 2014-02-19 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.000.4 * inst/NEWS: Release 0.4.000.4 * inst/include/*: Upgraded to new release 4.000.4 of Armadillo * debian/*: Similarly updated for new release to Debian 2014-02-08 Dirk Eddelbuettel * src/RcppArmadillo.cpp: Clarify in help page that Armadillo seed setter will not work under RStudio 2014-02-04 Dirk Eddelbuettel * man/*: Add help pages for \code{armadillo_version}, \code{armadillo_set_seed} and \code{armadillo_set_seed_random} * NAMESPACE: Export three helper functions 2014-02-02 Dirk Eddelbuettel * DESCRIPTION: Versioned Imports: on Rcpp (>= 0.11.0) * src/Makevars (PKG_LIBS): Simplified with Rcpp (>= 0.11.0) * src/Makevars.win (PKG_LIBS): Ditto * inst/skeleton/Makevars (PKG_LIBS): Ditto * R/RcppArmadillo.package.skeleton.R: Updated: - no longer set namespace argument (as NAMESPACEs req'ed) - corresponding code updates - reflect Rcpp 0.11.0 * inst/skeleton/rcpparma_hello_world.cpp: Rewritten to use Rcpp Attributes and expanded to included more examples * src/RcppArmadillo.cpp: Add accessor functions to set Armadillo's RNG from a given and a random value as suggested by Gábor Csárdi 2014-01-21 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.000.2 * inst/NEWS: Release 0.4.000.2 * inst/include/*: Upgraded to new release 4.000.2 of Armadillo * debian/*: Similarly updated for new release to Debian 2014-01-07 Dirk Eddelbuettel * inst/include/armadillo_bits/compiler_setup.hpp: Applied one-line patch by Jan Marvin Garbuszu to permit build under recent icc; patch also passed on upstream to Conrad 2014-01-05 Dirk Eddelbuettel * DESCRIPTION: Release 0.4.000 * inst/NEWS: Release 0.4.000 * inst/include/*: Upgraded to new release 4.000 of Armadillo * debian/*: Similarly updated for new release to Debian 2013-12-09 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.930.1 * inst/NEWS: Release 0.3.930.1 * inst/include/*: Upgraded to new release 3.930.1 of Armadillo which falls back to standard complex SVD if no zgesdd * debian/*: Similarly updated for new release to Debian * configure: Test value of LAPACK_LIBS and if the Lapack version supplied by R used then define ARMA_DONT_USE_CX_GESDD * inst/include/RcppArmadilloLapack.h.in: Added header file to be processed by configure 2013-12-06 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.930.0 * inst/NEWS: Release 0.3.930.0 * inst/include/*: Upgraded to new release 3.930 of Armadillo * debian/*: Similarly updated for new release to Debian * inst/include/*: Upgraded to Armadillo 3.930 ("Dragon's Back") * inst/include/armadillo_bits/compiler_setup.hpp: Exclude POSIX memalign also if on Sun OS as per Brian Ripley's suggestion 2013-12-05 Dirk Eddelbuettel * inst/unitTests/runit.complex.R: Added unit tests for complex matrices and vector contributed by Baptiste Auguie * inst/unitTests/cpp/complex.cpp: C++ side of new tests 2013-12-04 Dirk Eddelbuettel * inst/include/*: Upgraded to 2nd beta release of Armadillo 3.930 2013-12-02 Dirk Eddelbuettel * inst/include/*: Upgraded to 1st beta release of Armadillo 3.930 2013-11-19 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.920.3 * inst/NEWS: Release 0.3.920.3 * inst/include/*: Upgraded to new release 3.920.3 of Armadillo * debian/*: Similarly updated for new release to Debian 2013-09-29 Dirk Eddelbuettel * inst/examples/fastLm.r: Added a 'const ref' example * inst/examples/varSimulation.r: Use 'const ref', skip one superfluous transpose 2013-09-28 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.920.1 * inst/NEWS: Release 0.3.920.1 * inst/include/*: Upgraded to new release 3.920.1 of Armadillo * debian/*: Similarly updated for new release to Debian * DESCRIPTION: Depends on Rcpp (>= 0.10.5) which shipped to CRAN 2013-09-27 Romain Francois * include/RcppArmadilloAs.h : handle cx_mat, using that Rcomplex is layout compatible with std::complex * unitTests/cpp/armadillo.cpp : more testing * unitTests/runit.RcppArmadillo.R : more testing 2013-09-23 Dirk Eddelbuettel * inst/include/*: Upgraded to Armadillo pre-release of 3.920.0 * DESCRIPTION: Mark as test release version 0.3.910.0.2 2013-09-15 Dirk Eddelbuettel * inst/include/RcppArmadilloAs.h: Also define ConstInputParameter * inst/include/RcppArmadilloForward.h: Ditto for declaration * inst/unitTests/runit.RcppArmadillo.R: New unit tests for these * inst/unitTests/cpp/armadillo.cpp: C++ code for new unit tests 2013-09-15 Romain Francois * include/RcppArmadilloForward.h : declaration of specializations of ConstReferenceInputParameter and ReferenceInputParameter * include/RcppArmadilloAs.h : definitions of the above 2013-09-13 Romain Francois * DESCRIPTION : require Rcpp 0.10.4.4 * include/RcppArmadilloForward.h : declaration of specializations of InputParameter for references and const reference to arma::Mat * include/RcppArmadilloAs.h : definitions of the above 2013-08-24 Romain Francois * include/RcppArmadilloExtensions/sample.h: added include guard, made functions SampleReplace, etc ... templates to avoid the multiple definitions problem 2013-08-21 Romain Francois * include/RcppArmadilloWrap.h: Less data copies for wrap< SpMat > * include/RcppArmadilloAs.h: Less data copies for as< SpMat > 2013-08-20 Romain Francois * include/RcppArmadilloWrap.h: Handle wrap * include/RcppArmadilloWrap.h: cleaner implementation for wrap< SpMat > * include/RcppArmadilloAs.h: cleaner implementation for as< SpMat > 2013-08-17 Dirk Eddelbuettel * vignettes/RcppArmadillo-intro.Rnw: Converted from LaTeX minted (which farms out to Python's pygmentize) to LaTeX listings (which is plainer, but works on CRAN) * DESCRIPTION: Remove 'BuildVignettes: FALSE' 2013-08-12 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.910.0 * inst/NEWS: Release 0.3.910.0 * inst/include/*: Upgraded to new release 3.910.0 of Armadillo * debian/*: Similarly updated for new release to Debian * vignettes/*: Moved files from inst/doc per new CRAN standards * DESCRIPTION: Set 'BuildVignettes: FALSE' as LaTeX minted mode creates issues for the CRAN builders * inst/doc/*: Include pre-built vignettes 2013-08-03 Dirk Eddelbuettel * inst/include/RcppArmadilloExtensions/spmat.h: Added basic as<> and wrap support for sparse matrices (of class dgCMatrix from the Matrix package); currently only type double is supported * inst/unitTests/runit.RcppArmadillo.R: Improved test setup a little * inst/unitTests/runit.sample.R: Ditto 2013-08-02 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.900.7 * inst/NEWS: Release 0.3.900.7 * inst/include/*: Upgraded to new release 3.900.7 of Armadillo * debian/*: Similarly updated for new release to Debian 2013-08-02 Romain Francois * include/RcppArmadillo/Row_meat.h: set vec_state correctly * include/RcppArmadillo/Col_meat.h: set vec_state correctly * include/RcppArmadillo/Mat_meat.h: set vec_state correctly 2013-07-12 Dirk Eddelbuettel * inst/unitTests/runTests.R: No longer need to test minimal versions of package 'inline' as unit tests now use Rcpp attributes * inst/unitTests/runit.RcppArmadillo.R: Don't load package 'library' * inst/examples/fastLm.r: Also rewritten to use Rcpp attributes * inst/examples/varSimulation.r: Idem * DESCRIPTION: Removed Suggests: on inline 2013-06-04 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.900.0 * inst/NEWS: Release 0.3.900.0 * inst/include/*: Upgraded to new release 3.900.0 of Armadillo * debian/*: Similarly updated for new release to Debian 2013-05-16 Dirk Eddelbuettel * inst/examples/kalman/benchmark.R: Switch from inline to sourceCpp * inst/examples/kalman/Kalman.cpp: Added Rcpp attributes function * inst/examples/kalman/KalmanCpp.R: Retired, no longer used 2013-05-13 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.820 * inst/NEWS: Release 0.3.820 * inst/include/*: Upgraded to new release 3.820 of Armadillo * debian/*: Similarly updated for new release to Debian 2013-04-30 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.810.2 * inst/NEWS: Release 0.3.810.2 * inst/include/*: Upgraded to new release 3.810.2 of Armadillo * debian/*: Similarly updated for new release to Debian 2013-04-19 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.810.0 * inst/NEWS: Release 0.3.810.0 * inst/include/*: Upgraded to new release 3.810.0 of Armadillo * debian/*: Similarly updated for new release to Debian 2013-04-05 Dirk Eddelbuettel * debian/: Package will be added to Debian as well 2013-03-29 Dirk Eddelbuettel * inst/include/RcppArmadilloExtensions/sample.h: Applied another patch by Christian Gunning * inst/unitTests/runit.sample.R (test.sample): Idem 2013-03-12 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.800.1 * inst/include/*: Upgraded to new release 3.800.1 of Armadillo * inst/unitTests/cpp/armadillo.cpp: Factored out of runit.RcppArmadillo.R to accelerate unit test run * inst/unitTests/runit.RcppArmadillo.R: Deploy refactored cpp code 2013-03-11 Dirk Eddelbuettel * inst/unitTests/cpp/sample.cpp: Regrouping C++ tests for sample() * inst/unitTests/runit.sample.R: Rewritten for sole external cpp file 2013-03-10 Dirk Eddelbuettel * inst/include/add-ons/sample.h: Added sample() function contributed by Christian Gunning * inst/unitTests/runit.sample.R: Added unit test for sample() contributed by Christian Gunning 2013-03-01 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.800.0 * DESCRIPTION: Updated Description to reflect change of Armadillo license to MPL 2.0 (which is fully compatible with GPL so no change or net effect to RcppArmadillo) * inst/include/*: Upgraded to new release 3.800.0 of Armadillo * inst/doc/RcppArmadillo-intro.Rnw: Updated vignette to preprint of the Computational Statistics & Data Analysis paper in press * inst/doc/*: Added or updated relevant support files * inst/CITATION: Added with reference to CSDA paper 2013-02-20 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.6.3 * inst/include/*: Upgraded to new release 3.6.3 of Armadillo 2013-01-29 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.6.2 * inst/include/*: Upgraded to new release 3.6.2 of Armadillo 2013-01-19 Dirk Eddelbuettel * inst/examples/kalman/: New example used in the vignette 2012-12-17 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.6.1 * inst/include/*: Upgraded to new release 3.6.1 of Armadillo 2012-12-10 Romain Francois * include/RcppArmadillo.h: compiler error if Rcpp.h is included before RcppArmadillo.h 2012-12-07 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.6.0 * inst/include/*: Upgraded to new release 3.6.0 of Armadillo 2012-11-15 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.4.4 * inst/include/*: Upgraded to new release 3.4.4 of Armadillo 2012-10-04 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.4.3 * inst/include/*: Upgraded to new release 3.4.3 of Armadillo 2012-09-25 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.4.2 * inst/include/*: Upgraded to new release 3.4.2 of Armadillo 2012-09-18 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.4.1 * inst/include/*: Upgraded to new release 3.4.1 of Armadillo 2012-09-06 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.4.0 * inst/include/*: Upgraded to new release 3.4.0 of Armadillo 2012-08-31 Dirk Eddelbuettel * inst/NEWS.Rd: Converted to Rd format 2012-08-30 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.3.91 * inst/include/*: Upgraded to release 3.3.91 (v3.4 beta 1) of Armadillo 2012-07-21 Dirk Eddelbuettel * inst/unitTests/runit.fastLm.R: expanded unit tests for fastLm 2012-07-18 Dirk Eddelbuettel * R/fastLm.R (summary.fastLm): Also display residual standard error 2012-07-14 Dirk Eddelbuettel * R/fastLm.R (fastLm.formula): Note whether intercept in formula or not; also store the result of summary() on residuals * R/fastLm.R (fastLm.default): Autmagically detect intercept use * R/fastLm.R (print.summary.fastLm): Display summary of residuals * R/fastLm.R (summary.fastLm): Distinguish between the intercept and no-intercept cases when computing R^2 2012-07-11 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.2.4 * inst/include/*: Upgraded to new release 3.2.4 of Armadillo 2012-07-01 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.2.3 * inst/include/*: Upgraded to new release 3.2.3 of Armadillo * inst/include/armadillo_bits/: Reverted files {Mat,Col,Row}_bones.hpp to the previous versions due to compilation issues under g++ 4.7 * inst/doc/RcppArmadillo-intro.Rnw: New introductory vignette based on just-submitted paper by Eddelbuettel and Sanderson * DESCRIPTION: Set Maintainer: to edd@debian.org as CRAN prefers to provide upload email from the same address the Maintainer field 2012-05-26 Dirk Eddelbuettel * inst/examples/fastLm.r: Also examine the 'two versus one' casts impact when converting SEXP to Armadillo types 2012-05-21 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.2.0 * inst/include/*: Upgraded to new release 3.2.0 of Armadillo 2012-05-15 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.1.94 * inst/include/*: Upgraded to new (beta) release 3.1.94 of Armadillo 2012-05-10 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.1.92 * inst/include/*: Upgraded to new (beta) release 3.1.92 of Armadillo 2012-05-03 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.0.3 * inst/include/*: Upgraded to new release 3.0.3 of Armadillo 2012-04-29 Dirk Eddelbuettel * inst/examples/fastLm.r: New example fastLm 2012-04-19 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.0.2 * inst/include/*: Upgraded to new release 3.0.2 of Armadillo 2012-04-17 Dirk Eddelbuettel * inst/include/RcppArmadilloConfig.h: Undefine NDEBUG to not suppress Armadillo debug messages 2012-04-12 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.0.1 * inst/include/*: Upgraded to new release 3.0.1 of Armadillo 2012-04-11 Dirk Eddelbuettel * inst/include/RcppArmadilloConfig.h: Protect define of ARMA_DEFAULT_OSTREAM by a #ifndef test 2012-04-10 Dirk Eddelbuettel * DESCRIPTION: Release 0.3.0 * inst/include/*: Upgraded to new release 3.0.0 of Armadillo 2012-04-04 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.40 * inst/include/*: Upgraded to new test release 2.99.4 of Armadillo 2012-04-02 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.39 * inst/include/*: Upgraded to new test release 2.99.3 of Armadillo 2012-03-28 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.38 * inst/include/*: Upgraded to new test release 2.99.2 of Armadillo 2012-03-24 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.37 2012-03-24 Romain Francois * inst/include/RcppArmadilloWrap.h: adapt to Armadillo 2.99.1 2012-03-19 Dirk Eddelbuettel * inst/include/*: Upgraded to new test release 2.99.1 of Armadillo 2012-03-05 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.36 * inst/include/*: Upgraded to new release 2.4.4 of Armadillo 2012-02-17 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.35 (depending on Rcpp 0.9.10) * inst/include/*: Upgraded to new release 2.4.3 of Armadillo 2012-02-01 Romain Francois * inst/include/armadillo_bits/Cube_meat.hpp : changes related to std::cout -> Rcpp::Rcout * inst/include/armadillo_bits/Mat_meat.hpp : idem * inst/include/armadillo_bits/config.hpp : idem * inst/include/armadillo_bits/debug.hpp : idem * inst/include/armadillo_bits/field_meat.hpp : idem * inst/include/armadillo_bits/forward_bones.hpp : idem * DESCRIPTION: depends on Rcpp 0.9.10 2011-12-31 Dirk Eddelbuettel * inst/include/RcppArmadillo/Mat_meat.h: Add missing semicolon in code ifdef'ed for C++0x mode, with thanks to Teo Guo Ci 2011-12-29 Dirk Eddelbuettel * src/RcppArmadillo.cpp: Force instantiation of arma version vars which helps with older OS X compiler, as suggested by Gershon Bialer 2011-12-23 Dirk Eddelbuettel * inst/unitTests/runTests.R: unit tests output 'fallback' directory changed to '..' and files are now in top-level of $pkg.Rcheck/ 2011-12-13 Dirk Eddelbuettel * man/RcppArmadillo-package.Rd: Updated to current version number, added Conrad's Technical Report as a reference 2011-12-12 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.34 * inst/include/*: Upgraded to new release 2.4.2 of Armadillo 2011-12-07 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.33 * inst/include/*: Upgraded to new release 2.4.1 of Armadillo 2011-12-04 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.32 * inst/include/*: Upgraded to new release 2.4.0 of Armadillo 2011-11-28 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.31 * inst/include/*: Upgraded to new test release 2.3.92 of Armadillo 2011-11-19 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.30 2011-11-17 Romain Francois * inst/include/RcppArmadilloSugar.h: reworked forwarding sugar expressions to arma expressions. No need for the "forward" function anymore. For now, we kept forward as a templated identity function for backwards compatibility but it is not needed anymore * inst/include/RcppArmadillo/Mat_meat.h: reworked handling of complex values * inst/unitTests/runit.RcppArmadillo.R: removed uses of forward as we don't need it anymore. 2011-11-16 Romain Francois * inst/include/RcppArmadilloForward.h: support for the new arma classes Gen and GenCube that arma uses internally * inst/include/RcppArmadilloWrap.h: idem * inst/include/RcppArmadillo/Mat_meat.h: adapted to the changed arma_type_check 2011-11-14 Dirk Eddelbuettel * inst/include/*: Upgraded to new test release 2.3.91 of Armadillo 2011-09-01 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.29 * inst/include/*: Updated to bug-fix release 2.2.3 of Armadillo 2011-08-02 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.28 * inst/include/*: Updated to release 2.2.1 of Armadillo 2011-07-22 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.27 * inst/include/*: Updated to release 2.1.91 of Armadillo 2011-07-17 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.26 * inst/include/*: Updated to release 2.0.2 of Armadillo 2011-06-30 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.25 * inst/include/*: Updated to release 2.0.1 of Armadillo 2011-06-29 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.24 * inst/include/*: Updated to release 2.0.0 of Armadillo 2011-06-23 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.23 * inst/include/*: Updated to release 1.99.5 of Armadillo 2011-06-14 Douglas Bates * R/fastLm.R, inst/unitTests/runit.fastLm.R, man/fastLm.Rd, src/fastLm.cpp: Change order of arguments in fastLm.cpp and fastLm.R and documentation. 2011-06-14 Dirk Eddelbuettel * ChangeLog, inst/NEWS: ChangeLog and NEWS entry for Doug's S3 fixes 2011-06-13 Douglas Bates * NAMESPACE: Properly export S3methods as such * man/fastLm.Rd: Similar updates to help page 2011-06-06 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.22 * inst/include/*: Updated to release 1.99.4 of Armadillo 2011-05-30 Dirk Eddelbuettel * inst/include/RcppArmadilloConfig.h: Enable sprintf on FreeBSD by undefining ARMA_HAVE_STD_SNPRINTF thanks to patch by Rainer Hurling 2011-05-27 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.21 * inst/include/*: Updated to release 1.99.3 of Armadillo 2011-05-25 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.20 * inst/include/*: Updated to release 1.99.2 of Armadillo 2011-05-16 Dirk Eddelbuettel * inst/include/*: Updated to test release 1.99.1 of Armadillo 2011-04-25 Dirk Eddelbuettel * src/RcppArmadillo.cpp: Rewritten armadillo_version as to no longer require an instance of arma::arma_version, with Thanks! to Conrad 2011-04-22 Dirk Eddelbuettel * inst/examples/varSimulation.r: New example simulating of first-order vector autoregression data set via R, compiled R and RcppArmadillo 2011-04-18 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.19 * inst/include/*: Updated to Armadillo 1.2.0 "Unscrupulous Carbon Emitter" 2011-04-08 Dirk Eddelbuettel * R/fastLm.R: In print.summary.fastLm(), use 'P.values' not 'P.value' 2011-04-03 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.18 * inst/include/*: Updated to Armadillo 1.1.92 "Jurassic Barbecue" * inst/doc/Makefile: Do not 'clean' in 'all' target 2011-03-22 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.17 * inst/include/*: Updated to Armadillo 1.1.90 "Inside Job" 2011-03-10 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.16 * inst/include/*: Updated to Armadillo 1.1.8 "Kangaroo Steak" 2011-03-04 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.15 * inst/include/*: Updated to Armadillo 1.1.6 “Baby Carpet Shark” 2011-03-02 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.14 * inst/include/RcppArmadillo/Row_meat.h: Support RTTI via vec_state * inst/include/RcppArmadillo/Col_meat.h: Support RTTI via vec_state * inst/unitTests/runit.RcppArmadillo.R: Added unit test for above 2011-02-28 Dirk Eddelbuettel * inst/doc/Makefile: Call R and Rscript relative to R_HOME/bin 2011-02-20 Dirk Eddelbuettel * src/fastLm.cpp (fastLm): Further simplified and shortened by using Rcpp::as() on the input data 2011-02-18 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.13 * inst/include/*: Updated to Armadillo 1.1.4 "Manta Lodge" 2011-02-15 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.12 * inst/include/*: Updated to Armadillo 1.1.2 "Flood Kayak" 2011-01-06 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.11 * inst/include/*: Updated to Armadillo 1.1.0 "Climate Vandal" 2010-12-12 Romain Francois * R/SHLIB.R: new unexported R function SHLIB, small wrapper around R CMD SHLIB 2010-11-25 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.10 * inst/include/*: Updated to Armadillo 1.0.0 "Antipodean Antileech” 2010-11-19 Dirk Eddelbuettel * R/fastLm.R: Also provide two R-squared measures in summary method 2010-11-19 Romain Francois * DESCRIPTION: remove dependency on GNU make * R/RcppArmadillo.package.skeleton.R: updated skeleton generator so that the dependency on GNU make is removed 2010-11-11 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.9 * inst/include/*: Updated to Armadillo 0.9.92 "Wall Street Gangster" 2010-10-16 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.8 * inst/include/*: Updated to Armadillo 0.9.90 "Water Dragon" * NEWS: moved to inst/NEWS so that it gets installed with the package * inst/ChangeLog: moved to top-level enabling 'C-x 4 a' lookups 2010-09-25 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.7 2010-09-25 Romain Francois * inst/include/RcppArmadilloWrap.h: Updated for Armadillo 0.9.80 2010-09-21 Dirk Eddelbuettel * inst/include/*: Update to Armadillo 0.9.80 "Chihuahua Muncher" 2010-09-12 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.6 2010-09-10 Romain Francois * inst/include/* : Update to Armadillo 0.9.70 "Subtropical Winter Safari" 2010-08-18 Romain Francois * inst/include/armadillo_bits/Mat_meat.hpp : not so intrusive patch that allows RcppArmadillo to add its own Mat constructors * inst/include/armadillo_bits/Mat_proto.hpp : same * inst/include/RcppArmadillo/Mat_proto.h : Mat constructor that takes a sugar expression * inst/include/RcppArmadillo/Mat_meat.h : implementation 2010-08-17 Romain Francois * inst/include/RcppArmadilloWrap.h : extracted from RcppArmadillo.h * inst/include/RcppArmadilloSugar.h : preliminary code to more interoperability between Rcpp sugar and armadillo. Defines the Rcpp::forward that allows forwarding the result of a sugar expression so that it is used in a Mat constructor. (needs more testing) * inst/unitTests/runit.RcppArmadillo.R : initial test for sugar/armadillo 2010-08-04 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.5 * Upgraded to Armadillo 0.9.60 "Killer Bush Turkey" with changes: - More flexible reshape(), allowing significantly different matrix sizes - Added matrix initialisation via the << operator - Fixes for compilation issues under Mac OS X with GCC 4.2/4.0 hybrid 2010-08-03 Romain Francois * Upgraded to Armadillo 0.9.58 beta for testing purposes * inst/include/armadillo: Reworked so that armadillo_bits/ directory can be included as is without minor tweaks to armadillo_bits/config.hpp 2010-07-28 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.4 * inst/include/armadillo_bits: Added small patch to not use asinh, acosh and atanh on win32 as the (older) MinGW compiler cannot cope. This problem will go away once R 2.12 is released as it requires gcc / g++ 4.5. 2010-07-25 Dirk Eddelbuettel * inst/include/* : upgrade to armadillo 0.9.52 "Monkey Wrench" * src/fastLm.cpp: Switch from inv() (which now throws a warning on (near) singular matrices and returns an empty matrix) to the Moore-Penrose pseudo-inverse pinv() which allows us to continue the example from the manual page. Of course, for standard use inv() is doing the right thing by issueing the warning. 2010-06-14 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.3 2010-06-14 Romain Francois * inst/include/RcppArmadilloConfig.h: Addition cconfig helping suncc 2010-06-09 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.2 2010-06-02 Romain Francois * inst/include/* : upgrade to armadillo 0.9.10 * inst/include/* : support for new mtOp and mtGlue, introduced in armadillo 0.9.10 2010-05-27 Romain Francois * R/flags.R: added RcppArmadillo:::CxxFlags() 2010-05-19 Romain Francois * DESCRIPTION: Release 0.2.1 * src/fastLm.cpp: Rename stderr to std_err 2010-05-18 Dirk Eddelbuettel * DESCRIPTION: Release 0.2.0 2010-05-18 Douglas Bates * man/fastLm/Rd: Added rank-deficient example to illustrate possible problems with fastLmPure() and fastLm() * src/fastLm/cpp: Compute sig2 via std::inner_product 2010-05-17 Dirk Eddelbuettel * inst/include/*: updated to Armadillo 0.9.8 2010-05-17 Romain Francois * inst/include/RcppArmadillo.h: workaround for win64 2010-05-13 Dirk Eddelbuettel * R/fastLm.R: fastLm() is now generic and has a formula interface as well as methods for print, summary, predict to behave like a standard model fitting function * R/fastLm.Rd: Added documentation for new methods * src/fastLm.cpp: Small additions to returned parameters to support new functionality 2010-05-04 Romain Francois * R/RcppArmadillo.package.skeleton.R: new package skeleton function similar to Rcpp::Rcpp.package.skeleton but targetting use of RcppArmadillo * README: removed and promoted to additional documentation in ?RcppArmadillo 2010-05-03 Dirk Eddelbuettel * inst/include/* : updated to armadillo 0.9.6 2010-04-03 Dirk Eddelbuettel * DESCRIPTION: Remove OS_type restriction now that RcppArmadillo includes Armadillo headers, add Doug to Authors and Maintainers 2010-04-03 Douglas Bates * inst/include/armadillo: Added the armadillo headers and the armadillo_bits directory. This is from the armadillo sources with only the armadillo_bits/config.hpp file modified. * configure: and many other configuration files. Removed the foo.in files, modified cleanup not to remove the target files. 2010-03-20 Dirk Eddelbuettel * src/fastLm.cpp: Small fix for Armadillo 0.8.2 2010-03-17 Romain Francois * src/fastLm.cpp: added some arma:: prefix * src/RcppArmadillo.cpp: update examples to use make_list and showcase various ways to use them : Named(.)=., _[.] = , Named( ., . ) 2010-03-11 Dirk Eddelbuettel * DESCRIPTION: Release 0.1.0 and initial CRAN upload 2010-03-03 Dirk Eddelbuettel * src/fastLm.cpp: Moved into its own file, some more polish 2010-03-03 Romain Francois * inst/include/RcppArmadillo.h: avoid an extra memory copy when possible (i.e. in wrap( eGlue) and wrap( eOp ) when the elem_type is int or double). * inst/include/RcppArmadilloDefines.in.h added the SCALAR macro to take care of the 0.9.0 api change * src/RcppArmadillo.cpp : fix a runtime error uisng the SCALAR macro 2010-03-02 Dirk Eddelbuettel * src/RcppArmadillo.cpp: Added bare-bones 'fastLm' function * R/fastLm.R: Added fastLm R wrapper for C++ fastLm * man/fastLm.Rd: Added manual page * inst/unitTests/runit.RcppArmadillo.R: Added unit test * NAMESPACE: Made fastLm visible 2010-03-02 Romain Francois * inst/include/RcppArmadillo.h: support for Armadillo 0.9.* 2010-03-01 Dirk Eddelbuettel * configure.in: Add configure support to test for version 0.9.0 2010-02-23 Romain Francois * inst/include/RcppArmadillo.h: support for wrap( arma::Glue ) and wrap( arma::Op ) enabling wrap()'ing arbitrary expressions involving arma::Mat objects, for example wrap( m1 + m2 ), or wrap( -m1 ) * inst/unitTests/runit.RcppArmadillo.R: new unit test for wrap( Glue ) and wrap( Op ) 2010-02-20 Dirk Eddelbuettel * configure.in: Add configure support to test for presence of 'armadillo' header and working 'libarmadillo' library; and a test for version 0.7.0 or higher (for Cube() type) * src/Makevars.in: Setup to be filled-in from configure * src/RcppArmadilloDefines.h.in: Idem * cleanup: Added to remove configure-generated files * R/flags.R: Small cleanups * src/RcppArmadillo.h: Use the #define ARMA_HAS_CUBE from the autogenerated header, reindent using Emacs' defaults 2010-02-19 Dirk Eddelbuettel * DESCRIPTION: Restrict to 'OS_type: unix' for now, set Date: as an SVN property 2010-02-19 Romain Francois * added support for field where T is wrappable 2010-02-17 Romain Francois * added support for as> as> and as> with T in : int, double, float, unsigned int * added untested support for wrap( Cube ) 2010-02-16 Dirk Eddelbuettel * Initial package structure based on first proof-of-concept 2010-02-16 Romain Francois * initial version, covering wrap(Mat), wrap(Col), wrap(Row) RcppArmadillo/README.md0000644000176200001440000001124114152026144014260 0ustar liggesusers ## RcppArmadillo: R and Armadillo via Rcpp [![CI](https://github.com/RcppCore/RcppArmadillo/workflows/ci/badge.svg)](https://github.com/RcppCore/RcppArmadillo/actions?query=workflow%3Aci) [![License](https://eddelbuettel.github.io/badges/GPL2+.svg)](https://www.gnu.org/licenses/gpl-2.0.html) [![CRAN](https://www.r-pkg.org/badges/version/RcppArmadillo)](https://cran.r-project.org/package=RcppArmadillo) [![Dependencies](https://tinyverse.netlify.com/badge/RcppArmadillo)](https://cran.r-project.org/package=RcppArmadillo) [![Coverage Status](https://codecov.io/gh/RcppCore/RcppArmadillo/graph/badge.svg)](https://codecov.io/github/RcppCore/RcppArmadillo?branch=master) [![Debian package](https://img.shields.io/debian/v/r-cran-rcpparmadillo/sid?color=brightgreen)](https://packages.debian.org/sid/r-cran-rcpparmadillo) [![Last Commit](https://img.shields.io/github/last-commit/RcppCore/RcppArmadillo)](https://github.com/RcppCore/RcppArmadillo) [![Downloads (monthly)](https://cranlogs.r-pkg.org/badges/RcppArmadillo?color=brightgreen)](https://www.r-pkg.org/pkg/RcppArmadillo) [![Downloads (total)](https://cranlogs.r-pkg.org/badges/grand-total/RcppArmadillo?color=brightgreen)](https://www.r-pkg.org/pkg/RcppArmadillo) [![CRAN use](https://jangorecki.gitlab.io/rdeps/RcppArmadillo/CRAN_usage.svg?sanitize=true)](https://cran.r-project.org/package=RcppArmadillo) [![CRAN indirect](https://jangorecki.gitlab.io/rdeps/RcppArmadillo/indirect_usage.svg?sanitize=true)](https://cran.r-project.org/package=RcppArmadillo) [![BioConductor use](https://jangorecki.gitlab.io/rdeps/RcppArmadillo/BioC_usage.svg?sanitize=true)](https://cran.r-project.org/package=RcppArmadillo) [![StackOverflow](https://img.shields.io/badge/stackoverflow-rcpp-orange.svg)](https://stackoverflow.com/questions/tagged/rcpp) [![CSDA](https://img.shields.io/badge/CSDA-10.1016%2Fj.csda.2013.02.005-brightgreen)](https://doi.org/10.1016/j.csda.2013.02.005) ### Synopsis RcppArmadillo provides an interface from R to and from [Armadillo](http://arma.sourceforge.net) by utilising the [Rcpp R/C++ interface library](http://dirk.eddelbuettel.com/code/rcpp.html). ### What is Armadillo? [Armadillo](http://arma.sourceforge.net) is a high-quality linear algebra library for the C++ language, aiming towards a good balance between speed and ease of use. It provides high-level syntax and [functionality](http://arma.sourceforge.net/docs.html) deliberately similar to Matlab (TM). See [its website](http://arma.sourceforge.net) more information about Armadillo. ### So give me an example! Glad you asked. Here is a light-weight and fast implementation of linear regression: ```c++ #include // [[Rcpp::depends(RcppArmadillo)]] // [[Rcpp::export]] Rcpp::List fastLm(const arma::mat& X, const arma::colvec& y) { int n = X.n_rows, k = X.n_cols; arma::colvec coef = arma::solve(X, y); // fit model y ~ X arma::colvec res = y - X*coef; // residuals // std.errors of coefficients double s2 = std::inner_product(res.begin(), res.end(), res.begin(), 0.0)/(n - k); arma::colvec std_err = arma::sqrt(s2 * arma::diagvec(arma::pinv(arma::trans(X)*X))); return Rcpp::List::create(Rcpp::Named("coefficients") = coef, Rcpp::Named("stderr") = std_err, Rcpp::Named("df.residual") = n - k); } ``` You can [`Rcpp::sourceCpp()`](https://cran.r-project.org/package=Rcpp/vignettes/Rcpp-attributes.pdf) the file above to compile the function. A slightly more involved version is also included in the package [as the `fastLm()`](https://github.com/RcppCore/RcppArmadillo/blob/master/R/fastLm.R) function. ### Status The package is under active development with releases to [CRAN](https://cran.r-project.org) about once every other month, and widely-used by other CRAN packages as can be seen from the [CRAN package page](https://cran.r-project.org/package=RcppArmadillo). As of late September 2021, there are 912 CRAN packages using RcppArmadillo. ### Documentation The package contains a pdf vignette which is a pre-print of the [paper by Eddelbuettel and Sanderson](http://dx.doi.org/10.1016/j.csda.2013.02.005) in CSDA (2014), as well as an introductory vignette for the sparse matrix conversions. ### Installation RcppArmadillo is a [CRAN package](https://cran.r-project.org/package=RcppArmadillo), and lives otherwise in its own habitat on [GitHub](https://github.com/RcppCore/RcppArmadillo) within the [RcppCore](https://github.com/RcppCore) GitHub organization. Run ```r install.packages("RcppArmadillo") ``` to install from your nearest CRAN mirror. ### Authors Dirk Eddelbuettel, Romain Francois, Doug Bates, Binxiang Ni, and Conrad Sanderson ### License GPL (>= 2) RcppArmadillo/man/0000755000176200001440000000000014074272012013555 5ustar liggesusersRcppArmadillo/man/armadillo_set_seed_random.Rd0000644000176200001440000000214113104576357021235 0ustar liggesusers\name{armadillo_set_seed_random} \alias{armadillo_set_seed_random} \title{Set the Armadillo Random Number Generator to a random value} \usage{ armadillo_set_seed_random() } \value{ The function is invoked for its side effect and has no return value. } \description{ Set the Armadillo Random Number Generator to a random value } \details{ Depending on whether RcppArmadillo was compiled for the C++98 standard (currently the default) or for C++11 (optional), two different RNGs may be used. This function resets either. For C++98, the R programming language's RNG is used. For C++11, the RNG included in the \code{} library is used only when \code{#define ARMA_USE_CXX11_RNG} is placed before \code{#include }. Otherwise, the R programming language's RNG will be used. } \note{ This has been found to not work as espected in \pkg{RStudio} as its code also uses the system RNG library. You may have to either not run within \pkg{RStudio} or change your code to use a different RNG such as the one from R. } \seealso{ The R documentation on its RNGs all of which are accessible via \pkg{Rcpp}. } RcppArmadillo/man/RcppArmadillo.package.skeleton.Rd0000644000176200001440000000470212273472621022024 0ustar liggesusers\name{RcppArmadillo.package.skeleton} \alias{RcppArmadillo.package.skeleton} \title{ Create a skeleton for a new package that intends to use RcppArmadillo } \description{ \code{RcppArmadillo.package.skeleton} automates the creation of a new source package that intends to use features of RcppArmadilo. It is based on the \link[utils]{package.skeleton} function which it executes first. } \usage{ RcppArmadillo.package.skeleton(name = "anRpackage", list = character(), environment = .GlobalEnv, path = ".", force = FALSE, code_files = character(), example_code = TRUE) } \arguments{ \item{name}{See \link[utils]{package.skeleton}} \item{list}{See \link[utils]{package.skeleton}} \item{environment}{See \link[utils]{package.skeleton}} \item{path}{See \link[utils]{package.skeleton}} \item{force}{See \link[utils]{package.skeleton}} \item{code_files}{See \link[utils]{package.skeleton}} \item{example_code}{If TRUE, example c++ code using RcppArmadillo is added to the package} } \details{ In addition to \link[utils]{package.skeleton} : The \samp{DESCRIPTION} file gains a Depends line requesting that the package depends on Rcpp and RcppArmadillo and a LinkingTo line so that the package finds Rcpp and RcppArmadillo header files. The \samp{NAMESPACE}, if any, gains a \code{useDynLib} directive. The \samp{src} directory is created if it does not exists and a \samp{Makevars} file is added setting the environment variable \samp{PKG_LIBS} to accomodate the necessary flags to link with the Rcpp library. If the \code{example_code} argument is set to \code{TRUE}, example files \samp{rcpparma_hello_world.h} and \samp{rcpparma_hello_world.cpp} are also created in the \samp{src}. An R file \samp{rcpparma_hello_world.R} is expanded in the \samp{R} directory, the \code{rcpparma_hello_world} function defined in this files makes use of the C++ function \samp{rcpparma_hello_world} defined in the C++ file. These files are given as an example and should eventually by removed from the generated package. } \value{ Nothing, used for its side effects } \seealso{ \link[utils]{package.skeleton} } \references{ Read the \emph{Writing R Extensions} manual for more details. Once you have created a \emph{source} package you need to install it: see the \emph{R Installation and Administration} manual, \code{\link{INSTALL}} and \code{\link{install.packages}}. } \examples{ \dontrun{ RcppArmadillo.package.skeleton( "foobar" ) } } \keyword{ programming } RcppArmadillo/man/fastLm.Rd0000644000176200001440000000744313146360022015300 0ustar liggesusers\name{fastLm} \alias{fastLm} \alias{fastLmPure} \alias{fastLm.default} \alias{fastLm.formula} \concept{regression} \title{Bare-bones linear model fitting function} \description{ \code{fastLm} estimates the linear model using the \code{solve} function of \code{Armadillo} linear algebra library. } \usage{ fastLmPure(X, y) fastLm(X, \dots) \method{fastLm}{default}(X, y, \dots) \method{fastLm}{formula}(formula, data = list(), \dots) } \arguments{ \item{y}{a vector containing the explained variable.} \item{X}{a model matrix.} \item{formula}{a symbolic description of the model to be fit.} \item{data}{an optional data frame containing the variables in the model.} \item{\ldots}{not used} } \details{ Linear models should be estimated using the \code{\link{lm}} function. In some cases, \code{\link{lm.fit}} may be appropriate. The \code{fastLmPure} function provides a reference use case of the \code{Armadillo} library via the wrapper functions in the \pkg{RcppArmadillo} package. The \code{fastLm} function provides a more standard implementation of a linear model fit, offering both a default and a formula interface as well as \code{print}, \code{summary} and \code{predict} methods. Lastly, one must be be careful in timing comparisons of \code{\link{lm}} and friends versus this approach based on \code{Armadillo}. The reason that \code{Armadillo} can do something like \code{\link{lm.fit}} faster than the functions in the stats package is because \code{Armadillo} uses the Lapack version of the QR decomposition while the stats package uses a \emph{modified} Linpack version. Hence \code{Armadillo} uses level-3 BLAS code whereas the stats package uses level-1 BLAS. However, \code{Armadillo} will either fail or, worse, produce completely incorrect answers on rank-deficient model matrices whereas the functions from the stats package will handle them properly due to the modified Linpack code. An example of the type of situation requiring extra care in checking for rank deficiency is a two-way layout with missing cells (see the examples section). These cases require a special pivoting scheme of \dQuote{pivot only on (apparent) rank deficiency} which is not part of conventional linear algebra software. } \value{ \code{fastLmPure} returns a list with three components: \item{coefficients}{a vector of coefficients} \item{stderr}{a vector of the (estimated) standard errors of the coefficient estimates} \item{df.residual}{a scalar denoting the degrees of freedom in the model} \code{fastLm} returns a richer object which also includes the residuals, fitted values and call argument similar to the \code{\link{lm}} or \code{\link[MASS]{rlm}} functions.. } \seealso{\code{\link{lm}}, \code{\link{lm.fit}}} \references{Armadillo project: \url{http://arma.sourceforge.net/}} \author{ Armadillo is written by Conrad Sanderson. RcppArmadillo is written by Romain Francois, Dirk Eddelbuettel, Douglas Bates and Binxiang Ni. } \examples{ data(trees, package="datasets") ## bare-bones direct interface flm <- fastLmPure( cbind(1, log(trees$Girth)), log(trees$Volume) ) print(flm) ## standard R interface for formula or data returning object of class fastLm flmmod <- fastLm( log(Volume) ~ log(Girth), data=trees) summary(flmmod) ## case where fastLm breaks down dd <- data.frame(f1 = gl(4, 6, labels = LETTERS[1:4]), f2 = gl(3, 2, labels = letters[1:3]))[-(7:8), ] xtabs(~ f2 + f1, dd) # one missing cell mm <- model.matrix(~ f1 * f2, dd) kappa(mm) # large, indicating rank deficiency set.seed(1) dd$y <- mm \%*\% seq_len(ncol(mm)) + rnorm(nrow(mm), sd = 0.1) summary(lm(y ~ f1 * f2, dd)) # detects rank deficiency summary(fastLm(y ~ f1 * f2, dd)) # some huge coefficients } \keyword{regression} RcppArmadillo/man/armadillo_set_seed.Rd0000644000176200001440000000226013104576357017677 0ustar liggesusers\name{armadillo_set_seed} \alias{armadillo_set_seed} \title{Set the Armadillo Random Number Generator to the given value} \usage{ armadillo_set_seed(val) } \arguments{ \item{val}{The seed used to initialize Armadillo's random number generator.} } \value{ The function is invoked for its side effect and has no return value. } \description{ Set the Armadillo Random Number Generator to the given value } \details{ Depending on whether RcppArmadillo was compiled for the C++98 standard (currently the default) or for C++11 (optional), two different RNGs may be used. This function resets either. For C++98, the R programming language's RNG is used. For C++11, the RNG included in the \code{} library is used only when \code{#define ARMA_USE_CXX11_RNG} is placed before \code{#include }. Otherwise, the R programming language's RNG will be used. } \note{ This has been found to not work as espected in \pkg{RStudio} as its code also uses the system RNG library. You may have to either not run within \pkg{RStudio} or change your code to use a different RNG such as the one from R. } \seealso{ The R documentation on its RNGs all of which are accessible via \pkg{Rcpp}. } RcppArmadillo/man/armadillo_version.Rd0000644000176200001440000000130112275520636017561 0ustar liggesusers\name{armadillo_version} \alias{armadillo_version} \title{Report the version of Armadillo} \usage{ armadillo_version(single) } \arguments{ \item{single}{A logical vector indicating whether a single return values is requested, or a named vector with three elements \code{major}, \code{minor} and \code{patch}.} } \value{ Depending on the value of \code{single}, either a single number describing the Armadillo version or a named vector with three elements \code{major}, \code{minor} and \code{patch}. } \description{ Report the version of Armadillo } \details{ The version is defined by Armadillo in the header \code{arma_version.hpp}. } \seealso{ Armadillo header file \code{arma_version.hpp}. } RcppArmadillo/man/RcppArmadillo-package.Rd0000644000176200001440000000573414074272012020177 0ustar liggesusers\name{RcppArmadillo-package} \alias{RcppArmadillo-package} \alias{RcppArmadillo} \alias{RcppArmadilloExample} \docType{package} \title{ R and Armadillo Integration } \description{ The package brings the power of Armadillo to R. } \section{Armadillo}{ \code{Armadillo} is a C++ linear algebra library, aiming towards a good balance between speed and ease of use. It provides efficient classes for vectors, matrices and cubes, as well as many functions which operate on the classes (eg. contiguous and non-contiguous submatrix views). Various matrix decompositions are provided, and an automatic expression evaluator (via template meta-programming) combines several operations to increase efficiency. The syntax (API) is deliberately similar to Matlab. It is useful for algorithm development directly in C++, or quick conversion of research code into production environments. Armadillo has been primarily developed at NICTA (Australia) by Conrad Sanderson, with contributions from around the world. } \section{RcppArmadillo}{ \code{RcppArmadillo} acts as a bridge between \code{Rcpp} and \code{Armadillo}, allowing the programmer to write code using Armadillo classes that integrate seemlessly with \code{R} via \code{Rcpp}. } \section{Using RcppArmadillo}{ The simplest way to get started is to create a skeleton of a package using \code{RcppArmadillo}. This can be done conveniently by the \code{\link{RcppArmadillo.package.skeleton}} function. The important steps are \itemize{ \item Include the \code{RcppArmadillo.h} header file, which also includes \code{armadillo.h}. \item Import Rcpp, and LinkingTo Rcpp and RcppArmadillo by adding these lines to the DESCRIPTION file: \preformatted{ Imports: Rcpp (>= 0.11.0) LinkingTo: Rcpp, RcppArmadillo } \item Link against the BLAS and LAPACK libraries, by adding this line in the \code{Makevars} and \code{Makevars.win} files: \preformatted{PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) } } } \section{Support}{ Please use the Rcpp-devel mailing list on r-forge for questions about RcppArmadillo (subscribe first). \url{https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel} } \author{ For RcppArmadillo: Dirk Eddelbuettel, Romain Francois, Doug Bates and Binxiang Ni Maintainer: Dirk Eddelbuettel For Armadillo: Conrad Sanderson } \references{ Armadillo project: \url{http://arma.sourceforge.net/} Conrad Sanderson and Ryan Curtin. \href{http://arma.sourceforge.net/armadillo_joss_2016.pdf}{Armadillo: a template-based C++ library for linear algebra}. Journal of Open Source Software, Vol. 1, pp. 26, 2016. Dirk Eddelbuettel and Conrad Sanderson, "RcppArmadillo: Accelerating R with high-performance C++ linear algebra", Computational Statistics and Data Analysis, 2014, 71, March, pages 1054-1063, \doi{10.1016/j.csda.2013.02.005}. ) } \keyword{ package } \keyword{ programming } \keyword{ interface } RcppArmadillo/DESCRIPTION0000644000176200001440000000324414173550004014513 0ustar liggesusersPackage: RcppArmadillo Type: Package Title: 'Rcpp' Integration for the 'Armadillo' Templated Linear Algebra Library Version: 0.10.8.1.0 Date: 2022-01-23 Author: Dirk Eddelbuettel, Romain Francois, Doug Bates, Binxiang Ni, and Conrad Sanderson Maintainer: Dirk Eddelbuettel Description: 'Armadillo' is a templated C++ linear algebra library (by Conrad Sanderson) that aims towards a good balance between speed and ease of use. Integer, floating point and complex numbers are supported, as well as a subset of trigonometric and statistics functions. Various matrix decompositions are provided through optional integration with LAPACK and ATLAS libraries. The 'RcppArmadillo' package includes the header files from the templated 'Armadillo' library. Thus users do not need to install 'Armadillo' itself in order to use 'RcppArmadillo'. From release 7.800.0 on, 'Armadillo' is licensed under Apache License 2; previous releases were under licensed as MPL 2.0 from version 3.800.0 onwards and LGPL-3 prior to that; 'RcppArmadillo' (the 'Rcpp' bindings/bridge to Armadillo) is licensed under the GNU GPL version 2 or later, as is the rest of 'Rcpp'. Armadillo requires a C++11 compiler. License: GPL (>= 2) LazyLoad: yes Depends: R (>= 3.3.0) LinkingTo: Rcpp Imports: Rcpp (>= 0.11.0), stats, utils, methods Suggests: tinytest, Matrix (>= 1.3.0), pkgKitten, reticulate, slam URL: https://github.com/RcppCore/RcppArmadillo, https://dirk.eddelbuettel.com/code/rcpp.armadillo.html BugReports: https://github.com/RcppCore/RcppArmadillo/issues NeedsCompilation: yes Packaged: 2022-01-23 22:49:29 UTC; edd Repository: CRAN Date/Publication: 2022-01-24 16:12:52 UTC RcppArmadillo/build/0000755000176200001440000000000014173355570014114 5ustar liggesusersRcppArmadillo/build/vignette.rds0000644000176200001440000000042714173355570016456 0ustar liggesusersP=O0u>ڒJEH: BB;±-(%U w$$BF>p|Z? (BsrYn:e >b3bp\%4-/0ֲbdȄx7'AT Ӓ ?vOM+p&b\D/Ŏi&~(1e~}hp`{G= +ӬRcppArmadillo/build/partial.rdb0000644000176200001440000001265614173355565016257 0ustar liggesusers] wȒNLC0H$@ad0L- ,K{bϞlTrڲҒp9mUuUuUu%T)( O(Jൽ '|U8hƼSaDj&SނhE&ğTym:j0T/"}1>a28[IϒE߮?i, +*i7uz>_υLwaQ3 +k4/ǩGŁnY",z\6 S{U:swvfrZX*zWaGp\CF0OR**' K{zx?ʶͷ &ѻn=AB ١)j ޏx TzTAGuBB#Q!eiOw2=h 3HeY2,mSvQ/"} Ebp7}&%U Of~UF\)%B[؟V)d(Ȩoj5ɲMzmV *$c8 +~`DŽ?D<ccQ+ӄo1AT^ѻă&gJIVA 4ӹyѰ3Ws8xրO}I -FD:Up:U[ h!rÌ(muyN*VV@ T)5a'qq$R]b7iX:P''ԨuthiۺSwDefRZa"n1Œ "heac\ǑueB=pmoj5C3 R4vqRchSЩ֬2u3M..#;KSkԚeh[n0^|q/:,Ͷ4\d¶٤|%7Lp: M!qWy>¶KFaEy̽Fp5a8J;Y׺_#q$ݵ<\_]3e`'g3i!ɭ4!bvv9-۪.l3n!3 aA1N4ϳ5 Ѷds_n k>¬mñ-+P ux3f{S-P557?hy>]z+.Y-J'da1h6K=mkpǨ6Ws:2v(1vlԥ=B3lnS~eZ }+L4C/vdg j o`_D$J@xT |юeq^@i >q^9V) H_!*F \DM wcHZ!7 AIzo"#=[ʷʡX}AC_prꭟ[`| "^B:|- hp)π}[Gv.dMףtX(Oɼ`鋆d;=0~y_R(`$b qċH9.1jKHg}{'Z|FtbbWxS݅N֛@ˈ H/dO1S1|qM?mL!qqKE4 l'n zKH}Y@<21LZ讀 psYOt!Hr<َG-Hm_joe.t=L o曬f@ q8%DZ1%T;bbx8@fEeK3:Ecp eX1 7ց#bH/\0?zH&KSS1Y)o $)[cupH>}=-A>b j<'xVnm1 P"Y"] _ G1԰\O]O_ͯx~u~Àb5\?D|t[?fwM ޙ6[gqe+o$y #^@:˼)6(y_ S1u5wSHOu8q TWB)n!!j{T<ϓ?{$@ɳԓV|M^f暒=RO_z' 1mBVMf\  SÄB4xl[ęAV~c,0Y(,\j7JuY5T/ד F1{y+y\[pe0[BCsl8oҩn%V9d- =B|tbW4{HR,;uHs$^CgTr-[~Xm i o!F:b=B^r﷨ =4EPlDIQ"3⯣!}-1x|TQZnPF@V"d42ǜ4f ͭs+XdgSJ߰B՝GK덦?팚k@OK\%]f܅oYԯ Wܷ&w(>`~O!dj퉩ə[DRG1GN_8os0izCGw=>~ٶU hѫSc&KSCa='c=}wim: M 10A_Vm3 +@gs?ׄWƾ ]vGb6fPOȠ_hiEβQືb V};5<(HƦ[Mdَ6]bS#JV;Iӫ6 A%p >*ϢXABV&qe[{L5,ǻŃ@6&9c ,NegŎ&pJy0ydi}ޚ>VW֖i^ޞ +7]nQ+!`Xvw]Ku0^Q{U:swvy>>Ų*IE j%TMntxJNSp}0)?hl_uN棿 Gpǀ4 PxDN}PaѤPanǭ}:=tS|xCf$_,T5R(TiCCя~tYXn:.^qK^ǞN"=_cf1`)(>XBTr(\q˦UuC,[Wyh艼'j/ŶgY"E}#Ȑ]1Ѧcq '= "1.0.0") { ## Set a seed to make the test deterministic set.seed(42) ## R makes us to this Sys.setenv("R_TESTS"="") ## there are several more granular ways to test files in a tinytest directory, ## see its package vignette; tests can also run once the package is installed ## using the same command `test_package(pkgName)`, or by director or file tinytest::test_package("RcppArmadillo", ncpu=getOption("Ncpus", 1)) } RcppArmadillo/configure.ac0000644000176200001440000001562214173264020015276 0ustar liggesusers ## RcppArmadillo configure.ac ## ## 'Rcpp' Integration for the 'Armadillo' Templated Linear Algebra Library ## ## Copyright (C) 2016 - 2022 Dirk Eddelbuettel ## ## Licensed under GPL-2 or later ## require at least autoconf 2.69 AC_PREREQ([2.69]) ## Process this file with autoconf to produce a configure script. AC_INIT([RcppArmadillo],[0.10.8.1.0],[edd@debian.org]) ## Set R_HOME, respecting an environment variable if one is set : ${R_HOME=$(R RHOME)} if test -z "${R_HOME}"; then AC_MSG_ERROR([Could not determine R_HOME.]) fi ## Use R to set CXX and CXXFLAGS CXX=$(${R_HOME}/bin/R CMD config CXX) CXXFLAGS=$("${R_HOME}/bin/R" CMD config CXXFLAGS) ## We are using C++ AC_LANG(C++) AC_REQUIRE_CPP AC_PROG_CXX ## Is R already configured to compile things using OpenMP without ## any extra hand-holding? openmp_already_works="no" ## default to not even thinking about OpenMP as Armadillo wants a pragma ## variant available if and only if C++11 is used with g++ 5.4 or newer can_use_openmp="no" ## Ensure TMPDIR is set. AC_MSG_CHECKING([whether we have a suitable tempdir]) TMPDIR=$("${R_HOME}/bin/R" --vanilla --slave -e "cat(dirname(tempdir()))") AC_MSG_RESULT([${TMPDIR}]) ## Check if R is configured to compile programs using OpenMP out-of-the-box. AC_MSG_CHECKING([whether R CMD SHLIB can already compile programs using OpenMP]) ## Create private directory in TMPDIR. BUILDDIR="${TMPDIR}/rcpparmadillo-$$-$RANDOM" mkdir -p "${BUILDDIR}" owd=$(pwd) cd "${BUILDDIR}" cat < test-omp.cpp #include int main() { return omp_get_num_threads(); } EOF ## Execute R CMD SHLIB. "${R_HOME}/bin/R" CMD SHLIB test-omp.cpp >/dev/null 2>&1 if test x"$?" = x"0"; then AC_MSG_RESULT([yes]) openmp_already_works="yes" else AC_MSG_RESULT([no]) fi ## Go back home. cd "${owd}" rm -rf "${BUILDDIR}" ## If the above checks failed, then perform other heuristics ## based on the compiler version, etc. if test x"${openmp_already_works}" = x"no"; then ## Check the C++ compiler using the CXX value set ## If it is g++, we have GXX set so let's examine it if test "${GXX}" = yes; then AC_MSG_CHECKING([whether g++ version is sufficient]) gxx_version=$(${CXX} -v 2>&1 | awk '/^.*g.. version/ {print $3}') case ${gxx_version} in 1.*|2.*|3.*|4.0.*|4.1.*|4.2.*|4.3.*|4.4.*|4.5.*|4.6.*|4.7.0|4.7.1) AC_MSG_RESULT([no]) AC_MSG_WARN([Only g++ version 4.7.2 or greater can be used with RcppArmadillo.]) AC_MSG_ERROR([Please use a different compiler.]) ;; 4.7.*|4.8.*|4.9.*|5.0*|5.1*|5.2*|5.3*) AC_MSG_RESULT([yes, but without OpenMP as version ${gxx_version} (Armadillo constraint)]) ## we know this one is bad can_use_openmp="no" ;; 5.4*|5.5*|5.6*|5.7*|5.8*|5.9*|6.*|7.*|8.*|9.*|10.*|11.*|12.*) AC_MSG_RESULT([yes, with OpenMP as version ${gxx_version}]) ## we know this one is good, yay can_use_openmp="yes" ;; *) AC_MSG_RESULT([almost]) AC_MSG_WARN([Compiler self-identifies as being compliant with GNUC extensions but is not g++.]) ## we know nothing, so no can_use_openmp="no" ;; esac fi ## Check for Apple LLVM AC_MSG_CHECKING([for macOS]) RSysinfoName=$("${R_HOME}/bin/Rscript" --vanilla -e 'cat(Sys.info()[["sysname"]])') if test x"${RSysinfoName}" = x"Darwin"; then AC_MSG_RESULT([found]) AC_MSG_CHECKING([for macOS Apple compiler]) apple_compiler=$($CXX --version 2>&1 | grep -i -c -e 'apple llvm') if test x"${apple_compiler}" = x"1"; then AC_MSG_RESULT([found]) AC_MSG_WARN([OpenMP unavailable and turned off.]) can_use_openmp="no" else AC_MSG_RESULT([not found]) AC_MSG_CHECKING([for clang compiler]) clang_compiler=$($CXX --version 2>&1 | grep -i -c -e 'clang ') if test x"${clang_compiler}" = x"1"; then AC_MSG_RESULT([found]) AC_MSG_CHECKING([for OpenMP compatible version of clang]) clang_version=$(${CXX} -v 2>&1 | awk '/^.*clang version/ {print $3}') case ${clang_version} in 4.*|5.*|6.*|7.*|8.*|9.*|10.*|11.*) AC_MSG_RESULT([found and suitable]) can_use_openmp="yes" ;; *) AC_MSG_RESULT([not found]) AC_MSG_WARN([OpenMP unavailable and turned off.]) can_use_openmp="no" ;; esac else AC_MSG_RESULT([not found]) AC_MSG_WARN([unsupported macOS build detected; if anything breaks, you keep the pieces.]) fi fi else AC_MSG_RESULT([no]) fi fi # if test x"${openmp_already_works}" = x"no" ## Check for suitable LAPACK_LIBS AC_MSG_CHECKING([LAPACK_LIBS]) ## external LAPACK has the required function lapack=$(${R_HOME}/bin/R CMD config LAPACK_LIBS) hasRlapack=$(echo ${lapack} | grep lRlapack) ## in what follows below we substitute both side of the define/undef ## while this may seem a little unusual we do it to fully reproduce the ## previous bash-based implementation if test x"${hasRlapack}" = x""; then ## We are using a full Lapack and can use zgbsv -- so #undef remains AC_MSG_RESULT([system LAPACK found]) arma_lapack="#undef ARMA_CRIPPLED_LAPACK" else ## We are using R's subset of Lapack and CANNOT use zgbsv etc, so we mark it AC_MSG_RESULT([R-supplied partial LAPACK found]) AC_MSG_WARN([Some complex-valued LAPACK functions may not be available]) arma_lapack="#define ARMA_CRIPPLED_LAPACK 1" fi ## Default the OpenMP flag to the empty string. ## If and only if OpenMP is found, expand to $(SHLIB_OPENMP_CXXFLAGS) openmp_flag="" ## Set the fallback, by default it is nope arma_have_openmp="#define ARMA_DONT_USE_OPENMP 1" if test x"${openmp_already_works}" = x"yes"; then arma_have_openmp="#define ARMA_USE_OPENMP 1" fi if test x"${can_use_openmp}" = x"yes"; then AC_MSG_CHECKING([for OpenMP]) ## if R has -fopenmp we should be good allldflags=$(${R_HOME}/bin/R CMD config --ldflags) hasOpenMP=$(echo ${allldflags} | grep -- -fopenmp) if test x"${hasOpenMP}" = x""; then AC_MSG_RESULT([missing]) arma_have_openmp="#define ARMA_DONT_USE_OPENMP 1" else AC_MSG_RESULT([found and suitable]) arma_have_openmp="#define ARMA_USE_OPENMP 1" openmp_flag='$(SHLIB_OPENMP_CXXFLAGS)' fi fi ## now use all these AC_SUBST([ARMA_LAPACK],["${arma_lapack}"]) AC_SUBST([ARMA_HAVE_OPENMP], ["${arma_have_openmp}"]) AC_SUBST([OPENMP_FLAG], ["${openmp_flag}"]) AC_CONFIG_FILES([inst/include/RcppArmadilloConfigGenerated.h src/Makevars]) AC_OUTPUT RcppArmadillo/src/0000755000176200001440000000000014173355571013605 5ustar liggesusersRcppArmadillo/src/fastLm.cpp0000644000176200001440000000322113174342061015523 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- // // fastLm.cpp: Rcpp/Armadillo glue example of a simple lm() alternative // // Copyright (C) 2010 - 2017 Dirk Eddelbuettel, Romain Francois and Douglas Bates // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #include using namespace Rcpp; // [[Rcpp::export]] List fastLm_impl(const arma::mat& X, const arma::colvec& y) { int n = X.n_rows, k = X.n_cols; arma::colvec coef = arma::solve(X, y); // fit model y ~ X arma::colvec res = y - X*coef; // residuals // std.errors of coefficients double s2 = std::inner_product(res.begin(), res.end(), res.begin(), 0.0)/(n - k); arma::colvec std_err = arma::sqrt(s2 * arma::diagvec(arma::pinv(arma::trans(X)*X))); return List::create(Named("coefficients") = coef, Named("stderr") = std_err, Named("df.residual") = n - k); } RcppArmadillo/src/Makevars.win0000644000176200001440000000171113151042705016060 0ustar liggesusers## -*- mode: makefile; -*- PKG_CXXFLAGS = -I../inst/include -I. $(SHLIB_OPENMP_CXXFLAGS) PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) ## With R 3.1.0 or later, you can uncomment the following line to tell R to ## enable compilation with C++11 (where available) ## ## Also, OpenMP support in Armadillo prefers C++11 support. However, for wider ## availability of the package we do not yet enforce this here. It is however ## recommended for client packages to set it. ## ## And with R 3.4.0, and RcppArmadillo 0.7.960.*, we turn C++11 on as OpenMP ## support within Armadillo prefers / requires it CXX_STD = CXX11 ## Armadillo itself use the following define which we also set ## automatically if we see USE_CXX1X defined; outside of a package it ## may be needed explicitly ## In general, this can be enabled here via ## PKG_CXXFLAGS = -DARMA_USE_CXX11 ## or via ## #define ARMA_USE_CXX11 ## before RcppArmadillo.h is included RcppArmadillo/src/RcppArmadillo.cpp0000644000176200001440000001077513745432405017050 0ustar liggesusers // RcppArmadillo.cpp: Rcpp/Armadillo glue // // Copyright (C) 2010 - 2020 Dirk Eddelbuettel, Romain Francois and Douglas Bates // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #include //' Report the version of Armadillo //' //' @details The version is defined by Armadillo in the header \code{arma_version.hpp}. //' @param single A logical vector indicating whether a single return values is requested, //' or a named vector with three elements \code{major}, \code{minor} and \code{patch}. //' @return Depending on the value of \code{single}, either a single number describing //' the Armadillo version or a named vector with three elements \code{major}, \code{minor} //' and \code{patch}. //' @seealso Armadillo header file \code{arma_version.hpp}. // [[Rcpp::export]] Rcpp::IntegerVector armadillo_version(bool single) { // These are declared as constexpr in Armadillo which actually does not define them // They are also defined as macros in arma_version.hpp so we just use that const unsigned int major = ARMA_VERSION_MAJOR; const unsigned int minor = ARMA_VERSION_MINOR; const unsigned int patch = ARMA_VERSION_PATCH; if (single) { return Rcpp::wrap(10000 * major + 100 * minor + patch) ; } else { return Rcpp::IntegerVector::create(Rcpp::Named("major") = major, Rcpp::Named("minor") = minor, Rcpp::Named("patch") = patch); } } // Per request of Gábor Csárdi in https://github.com/RcppCore/RcppArmadillo/issues/11 // //' Set the Armadillo Random Number Generator to a random value //' //' @details //' Depending on whether RcppArmadillo was compiled for the C++98 standard //' (currently the default) or for C++11 (optional), two different RNGs may be used. //' This function resets either. For C++98, the R programming language's RNG is used. //' For C++11, the RNG included in the \code{} library is used only when //' \code{#define ARMA_USE_CXX11_RNG} is placed before \code{#include }. //' Otherwise, the R programming language's RNG will be used. //' @return The function is invoked for its side effect and has no return value. //' @note This has been found to not work as espected in \pkg{RStudio} //' as its code also uses the system RNG library. You may have to either //' not run within \pkg{RStudio} or change your code to use a different RNG such //' as the one from R. //' @seealso The R documentation on its RNGs all of which are accessible via \pkg{Rcpp}. // [[Rcpp::export]] void armadillo_set_seed_random() { arma::arma_rng::set_seed_random(); // set the seed to a random value } //' Set the Armadillo Random Number Generator to the given value //' //' @param val The seed used to initialize Armadillo's random number generator. //' @details //' Depending on whether RcppArmadillo was compiled for the C++98 standard //' (currently the default) or for C++11 (optional), two different RNGs may be used. //' This function resets either. For C++98, the R programming language's RNG is used. //' For C++11, the RNG included in the \code{} library is used only when //' \code{#define ARMA_USE_CXX11_RNG} is placed before \code{#include }. //' Otherwise, the R programming language's RNG will be used. //' @return The function is invoked for its side effect and has no return value. //' @note This has been found to not work as espected in \pkg{RStudio} //' as its code also uses the system RNG library. You may have to either //' not run within \pkg{RStudio} or change your code to use a different RNG such //' as the one from R. //' @seealso The R documentation on its RNGs all of which are accessible via \pkg{Rcpp}. // [[Rcpp::export]] void armadillo_set_seed(unsigned int val) { //Rcpp::Rcout << "Setting value " << val << std::endl; arma::arma_rng::set_seed(val); // set the seed to given value } RcppArmadillo/src/Makevars.in0000644000176200001440000000165513245555544015716 0ustar liggesusers## -*- mode: makefile; -*- PKG_CXXFLAGS = -I../inst/include @OPENMP_FLAG@ PKG_LIBS= @OPENMP_FLAG@ $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) ## With R 3.1.0 or later, you can uncomment the following line to tell R to ## enable compilation with C++11 (where available) ## ## Also, OpenMP support in Armadillo prefers C++11 support. However, for wider ## availability of the package we do not yet enforce this here. It is however ## recommended for client packages to set it. ## ## And with R 3.4.0, and RcppArmadillo 0.7.960.*, we turn C++11 on as OpenMP ## support within Armadillo prefers / requires it CXX_STD = CXX11 ## Armadillo itself use the following define which we also set ## automatically if we see USE_CXX1X defined; outside of a package it ## may be needed explicitly ## In general, this can be enabled here via ## PKG_CXXFLAGS = -DARMA_USE_CXX11 ## or via ## #define ARMA_USE_CXX11 ## before RcppArmadillo.h is included RcppArmadillo/src/RcppExports.cpp0000644000176200001440000000450614142617157016604 0ustar liggesusers// Generated by using Rcpp::compileAttributes() -> do not edit by hand // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #include "../inst/include/RcppArmadillo.h" #include using namespace Rcpp; #ifdef RCPP_USE_GLOBAL_ROSTREAM Rcpp::Rostream& Rcpp::Rcout = Rcpp::Rcpp_cout_get(); Rcpp::Rostream& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get(); #endif // armadillo_version Rcpp::IntegerVector armadillo_version(bool single); RcppExport SEXP _RcppArmadillo_armadillo_version(SEXP singleSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< bool >::type single(singleSEXP); rcpp_result_gen = Rcpp::wrap(armadillo_version(single)); return rcpp_result_gen; END_RCPP } // armadillo_set_seed_random void armadillo_set_seed_random(); RcppExport SEXP _RcppArmadillo_armadillo_set_seed_random() { BEGIN_RCPP Rcpp::RNGScope rcpp_rngScope_gen; armadillo_set_seed_random(); return R_NilValue; END_RCPP } // armadillo_set_seed void armadillo_set_seed(unsigned int val); RcppExport SEXP _RcppArmadillo_armadillo_set_seed(SEXP valSEXP) { BEGIN_RCPP Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< unsigned int >::type val(valSEXP); armadillo_set_seed(val); return R_NilValue; END_RCPP } // fastLm_impl List fastLm_impl(const arma::mat& X, const arma::colvec& y); RcppExport SEXP _RcppArmadillo_fastLm_impl(SEXP XSEXP, SEXP ySEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< const arma::mat& >::type X(XSEXP); Rcpp::traits::input_parameter< const arma::colvec& >::type y(ySEXP); rcpp_result_gen = Rcpp::wrap(fastLm_impl(X, y)); return rcpp_result_gen; END_RCPP } static const R_CallMethodDef CallEntries[] = { {"_RcppArmadillo_armadillo_version", (DL_FUNC) &_RcppArmadillo_armadillo_version, 1}, {"_RcppArmadillo_armadillo_set_seed_random", (DL_FUNC) &_RcppArmadillo_armadillo_set_seed_random, 0}, {"_RcppArmadillo_armadillo_set_seed", (DL_FUNC) &_RcppArmadillo_armadillo_set_seed, 1}, {"_RcppArmadillo_fastLm_impl", (DL_FUNC) &_RcppArmadillo_fastLm_impl, 2}, {NULL, NULL, 0} }; RcppExport void R_init_RcppArmadillo(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } RcppArmadillo/vignettes/0000755000176200001440000000000014173355571015026 5ustar liggesusersRcppArmadillo/vignettes/RcppArmadillo-sparseMatrix.Rnw0000644000176200001440000000051013620530500022702 0ustar liggesusers\documentclass{article} \usepackage{pdfpages} %\VignetteIndexEntry{RcppArmadillo-sparseMatrix} %\VignetteKeywords{R, C++, Armadillo, linear algebra, sparse matrix} %\VignettePackage{RcppArmadillo} %\VignetteEncoding{UTF-8} \begin{document} \includepdf[pages=-, fitpaper=true]{pdf/RcppArmadillo-sparseMatrix.pdf} \end{document} RcppArmadillo/vignettes/pdf/0000755000176200001440000000000013620530500015556 5ustar liggesusersRcppArmadillo/vignettes/pdf/RcppArmadillo-intro.pdf0000644000176200001440000106456513620530500022154 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 4277 /Filter /FlateDecode /N 76 /First 625 >> stream x[[s8~?o;SS! ;[vı=I&[S[EۜȒGbg~ /Lkᜲ)4}oP14s13LلYSa1sʲ2a)KaR)&%Xf2)CR]7O2d?[W9G̳QϦ"c?U %¶(~"_KՏy3:>ۼbW{>.|} ?l|pxyao؋٢X󛂥t$R rZSGkŦ-`E -֕mPBc& ~A92~1`~ɯ8U69~ͧ| g|~C|4.PC٘L c9+U=iU*|u]d0"hq ^\ͳ3-G/=(BOA<[!SB|i2OV,vtu|oz ǣ|KzOYIMje?xƏ<nMbvZ`Øl2Kk?v,Ѽi|xic`O514^{m44zg?~kwn~o{\U#ώ~}^%C)A)ar_$8MҪ"^K4~C$m!oƥ058M왐wzNhf CJ2Z=S9&B75F ^D}"L~K7m+ ܋`%VQa%ZyYqh}Y}2-kmrc1F=hʹUu>DkVm:z45 E^*N'k_F_E r`5r4ickxAWUxk n`tyɈhۼhC5v Sۼ]cKڜI5Z)dɫ굽sBY(nm4ξi4_C9PSy$#'StUQN&q:q%?]zf7k e .rKI!=:_G<  aKg]DM(Lb~\ ǿ"& y67'OG' *OFJТ0|_ i#LD'/,NjŔ6qDg`FIJaA[%#eL=hiZyq7PЦ`P?}Y{u y kT <?LG6APґlT-7 ֮ A@&krZVsx\ _GΧPILZ]of j.[M~fpOo/,}$\T@:YhPU4F(/=^̧M6Z(.M鸤Svݙ~a0 A)Lل~^'u6.Q韈t7f=cD %uם43\;2ڽzqa]V֐@t؂{>{GyS"WZ6Mumh@U)R榄zSM3WWhupߋŷ1TMT.DҁI8udi A Ȥ*äl2ErL=2@-l̲Cyy ԇ*1)5E%\4n8 iDP*>Qi81>eu?"L;Zz,@Dq"DFIh]3OڬD,.Qھbuu9os{T;tp@?Da! U&ņD gUDlOqY'X;s)~'%:1CoG|Ь9;'iTֶ>}.ӾP\iXCv5 `m_Reyi" n1Ogh^g@}#cV xP򌰱9?wU_lZ9wCBj{w4gG$GӺ#}G< Ng4 6}Dz3S㩉(91puc;@UK\wp.%P*> @lu7ë?*&/O l]ד\[*SR˿&ףdA÷sNV":u UjD7p-7@T#u}XI T-X4!TI']K#U>Ό4#d'XuA>d$m aPlE7Tg=%#i, 9LMHG $<(ee%'EeHP;PZU3(!NPAPJEEJD$RTDQa¢ҏe6tM<ۉze6(͵Q$(ʹڢx/DimR"eF+4%#Ej3<š>/.2l#?j J`D`?ҸP9Nf@#ɸG쿂FX>/ʰ*5Zyky?endstream endobj 78 0 obj << /Subtype /XML /Type /Metadata /Length 1549 >> stream GPL Ghostscript 9.27 2020-02-10T22:06:13-06:00 2020-02-10T22:06:13-06:00 LaTeX with hyperref endstream endobj 79 0 obj << /Type /ObjStm /Length 4564 /Filter /FlateDecode /N 76 /First 675 >> stream xś]s8ϯlm IyjV9N2&ʙǩ\hd&֎,y$9~AIX8Ehea SZc`Jg\2Td\&7dh*\TH2\al`*yPT$\8_UJSyCA>7U4DN>KCze(8k 9`e EU8yr-P oR9Tb&y匵Ƴc3{@^FHt&`ә(h-MpL`'g YnnI!&D{189&M4*9ѐ6ѓA’3$D&bh,Nzciw]H*SRN:9ܛHwsӹSQyԉ -G"7!K"c0ޣD7?7[X'&LBf2fyX&WuܚЖ6_bNv#u/*<]-򜍱e|e}1>Z}p&CQU6'fug?|;։tSytp5;b%VLO5,Ď;2Cv )]^̮=WB:Sj4Om/ߛ'W׋zf[vg6ڽUNOl0u}aNWW|Z4O~ .@@rU߭zwzR8[l惞{4ɼO󿞾H;'0_,7z=tjj9[ϯ5NŴڛMMCmΦK] wr!N9wD8?aR"e&N\Xwmil6U673 KN]Q:$|E*|V2]>/?]_|/|Z2_$PR=_;b~#}tt1GoJ"SN} ζ|v|/ n7! xm9s$;mY|ʈ>yT,I&uT}ձ Y~. ]SԡK5%~c`W޻F@q4/4yL:{M8Nx g+}y =7|a? CG{|޽dWroE{ \ 森=x15!LKID#H~,-=N#ⱼExʹ4;*q!Q㉈ !9 qf6d2t8pY& !fG0^y\"մ nc=!| L͚x;#}Xavc2{cADfiew,ߢ;u$Y1X&ahգ^bI]aܤVvyL6^3JfU]HF ldPIa۷aǥʈ0抳XqF(ʝOdZJy 1}{⤔LpRoȏZOdN3i{ Y%#y\!u!QLuL hu1<<(7΅H.b~İm9=?oh|?ahW_={I~L3DMZNӦio7E;y翶qysKMuk.JnVsoSzUGݍd\  Aи^ ;n=i7}9mm>۬mޙlI@9FYm e=N|8+*CEeD]3^v8(!cW@X> Xtj0AjPv =.+iX>ޔ080Ŭcu,Xš2#Q AJʹUX** ?D^Y[|GR ̆;UHg{\x]V x2q)Ex%~BTC>cB= Mdi]#twci~\A!5{"r un_P]͗-$^Jq~d5mZ.XmEQRQ-m+Zb;rt}zus}pOV)8"+~^rF+\eEN"}o-эC*YeK02^K]gB|iܳi5c7+juwi%cUZiG:Be'i^i*%yrTbdd΢z_UZD K[-)EfŮP[jjR-Bm "7+"S%Ԗ hF"`©C "p9|ͨT[$tvQlYz"Rj8Q(@ܩ-8[RufGj v"ؑG$b-ehIl!EfN}=zGj#EHu`o-!jKJ-BcEHuՖ !":<@c N#@] 4$ȓkXHu]gR]7T5\ V[T!_j*S- Ė.-B jKx-B j"GaZmqL!Eť٬bO֕0sU4!P[TW-B+Ֆ4AV[,j R"RmATW-BB$UwAD_KXW[T R.Hu թT RIu.H%]J TwA*TR RIu.H%]J YJ +) RIu.H%]J TwA*TR RIu.H%]J \$TRDlSܕ]J TwA*TR RIu.H%]J TwA*TRu;M-- TwA*TR RIu.H%]J_}[TwA*TR RIu.H%]J TwA*TR RIu.H%]J_`ՒoWآ R)3uEu7YTwA*TR RIu.H%]J TwA*T*(qR[EH~mUH%]J TwA*TR RIu.He]ʪ UwA*TV RYu.He]ʪ UwA*TTV RYur~N]}GHe]ʶʪ n!UwA*TV RYuNb.He]ʪ UwA*TV Ravt%Eu.He]ʪ UwA*TV RYu.He]ʪ UwA*TV RYu.He]ʪ UwA*TVm!UwA*TV RYu.He]ʪ UwA*TV RYu.He]ʪ UwA*TV RYu.He]ʪ UwA*TVvTV R5!.He]ʪ UwA*W}Cl̇kSG~qxέl{;>cɳ7-IՑ{xODd<2+HOLzKV7-(Ĵ>ٵW09je'+rpw^G giYrUq,pc"%}ww:vV.o'v2ā}s&‘L4\l[BK|ǚɍMgpBX_Uv$;O=]߭n rMbP/#Y\:m_<*GY!} o$2f>5,ܠHĪRb1C.ĆXeȓ0_d$H\.jv}v '8lv\WR]JJdĹ>+CRn}D-%]t?\iC'N,{}|7{}@kҗ͝v]EyUM>CH0yzn'gz S_]nt^%gz:U׼4G[+#i8kEBq׶a`> }kA`x]:E1]nI`6ذyATendstream endobj 156 0 obj << /Filter /FlateDecode /Length 6465 >> stream x\r$qe:Urb_ \D-cL K z{ᑕid=fȊso+5'}yu}8Q듿huUwq0 :xŸQipگ~uv f UZ?Rheӧ 2V=&/6n}Ŝ+7Z'Y;ק1T]RKH*j ?!'!lf]?=^ogRBPZgy]Lqq| \}ȏK9Js/L{hnXT`0Ћx>"LcȞ vy]4^ah];.S\oƞ"VwTƙB~7L~Z_sɇ8n*I@c:oʃ8sk97Z?YߠTL-Mrs!'+ۚ!-&EYAIRޕYtk g/3IKG WIikc[!Gp1(+K LF)noPcbUE.)%`C=LECѠ A޷/gLH:\ƾSMesԦ@r4 m@^ xZt X0'i62@AV`)ZPMvp?k{v+ThJF2*3&`!v O˞*1H2PIFc}\Qᆱ>wsOC-wY]էt[va}}T7B8xX1F ̞,sB89v~6)CtOsʲũ (xI0uZ39_#K _1av^{A"g@uM+D82nPm # ɣJF NYS:jw)>V@|ˁdBЂ◨V lR>@YasГoŨU橽x.Ha\![p6x<]iKטҗ,OOUɩD3H({§R2*[҇ZkV'$:alۆ.fdٽmfj3N !HV'.FTܝq%I2B/T9DR[ BH<@<+(  ʀsf|rOf)~d L֞z[)ԎľL4)S YBww=[=lL"зO2{N)I #P `d\&Wb u:*K\ һjlF~ Zpd?kjP8d ߏ YaWm#y#`P %4vK B O'S{**xuv7xWG*"%F_PTDLpBJv? MC_MM?"m gMK1miGnڧcܩR"h*;aa{UV(TG14<whh,D #. F$6r;, gكZ⨥Bӯ 1k P[fڽ+f=_@ؚlv^~c`wwBx66J=rdf4fU:\G uH>,a2pG ᐰ*iuR<_Q«{vњ\P԰ID8R{@OcRBcCl~uR$Lt^PaS!Q2JifFsFIx"@sƬ^P.N o7H>u.Q}eMhe %!n=閄UsR-hx~&mPl@2]KһjP`!ߒɱa+T͵SY( ~k hu;sh@Bq B{~ "q"Iq|QI?}|$t8볰#@32G D7Fani<TQFS:?aExLz,pſ;Ъ0B;0Y<R{DrvT_qoGJ0ߓN^8|糞l{XԥZhğ.=>8'•^z.Z |NX/R2 ;VZI3jF XϽ*`zJ` h[·[BWRW&M@o7Q>3z3Pz3&Dsj:~:;ߌĵCx]]iP,ZgʤШ:mbJ ʔQ21QEsQ1rm~^8[4ҽ_c hc\&c2(yfvra[/6hBe2v1#6D1y0vh{B I첶5]zH8+a H;WSs>GpUS&d7Qu3vµ_^VX(,SWtzMO%EYԥ! 7. `;AeZquPsGFN XߖayTP ;& Ch'{h@VV>7$}r%XDhpM3e~JKp`5zFz(TX#K=J(6ty31#ѩs+fwDGAnٯ;P2 38qwX^H\N&l9( |cb&Ϲ>[yq.pБ{$yp@8N|tn]Ȑ̓\ ͟kͨ촌y4Je VX%iu,oIs #i 4*}oФ>T $?wK~D(sL'J]Iw{/qvҊ\wP.Y卄f;l,c>,[L.qvc!"aсf79;_["PlYxK1,leWd(N" B~)*9#ыF&vӬP[aT;rI;Ҕr+< hVmClr^>@ 6-Gt, vGԊb|U_ ]_qZFO5+I!( ܉pj52*%g;V!I]# \QǏ?"Q)manH0_ z%7)!VfCTǐߗQҚŕMeb8 D#ia}i 梼gB({Z E5Rd FxϴkkłȭڽL PXV2jPgSH|irP 񁙖̇ %x8: )cBJ=[g;;"5ǜtSl9q4_eo_J\tT|{RS(ULSt[Xb;-8RC7y;X. .*=%"˜%\.ʥͮ.dOINs)t=8цR_yl+zI\Asx^UM.Gk0K$¢Evl^oYl!I aDl +cXЄFX򡛀yK(*nHzja|X~XD JY+YpR>ĺ W~^N4⎺ܔ""1V7-4MC%z]]^T4!-D2ڝO~дF*YySiS3wKwPsB J1YG,⤊j>_n\0XޱaQ$ڍrR瑳Cx"'FZ7x{2t[^ׯ ^ ! ܸ̎soh7['7٣Tu=j:NF؉i5ڛrB+bu<6ff6 Ps{JFH&k"f9?*#e˔ʹll%чڽ=J';<8+so~q$W[<0r: r|?š/WKhArFոC~@JzsxkRdQ2Fd[˷#oe}4@;H jSβeifFi=*?Mg^W,a;hU39)\^"{JI#Ƹ)yRSy|sJ$yU0x@ۍXwXVvh:@,h"z(Ԣ.0ңD|ve吞%t\uUv 3)F11/$-3MI(//| c3t2'B"$(mRDxfeJir{Py~!{Rokp<w A2{|ߴ>6"_U%;Afxd \4W֦z7U W9KU}Y*\.8#:): XP3 b.V+PJe>Mt$9m\I:YTZnwӆ{<̷VG1KR1AP =Ԅ0R K  e܁  v8ŘiӉ7L1yÁ'z'0]r5U%o=m*Ƀ=Gk:V SٞL?nar`&x8Ϸ^ t.ߧ\^|֨|]0ayDz:!g?E3Jd WLUI0h^$?v;2Lm ZGQ@Fϔ;?Ҳ 0fW7ļ(96XF"t >*=.@ XB\rԉ:68R^W.2+צ(팅z̻Qs6wKLzk,l' ]}y ̪WnϹ*eʦb”cyuWX=d:MصpV-r]ZFpP[ĢÝWzB1q1qa;}qJ;1˃%3v3f=Bpk<'6^lG7JYE\%ߏhj N\ofZ0 5eendstream endobj 157 0 obj << /Filter /FlateDecode /Length 7231 >> stream x]koǕCXl X8 Ȯز0(Ŕ&%K_VUWw ȸY}u>fӉzOG?='_)P$N)w<&L^g=yNŤqwyz&&#saw)r?^tO>Q zSO>|(e˛[^"8érS Z~NshuBh>ެ!NTP~?0d)YHOThH- P(6&X|BBW1*.象}@y{1vmk$0{x;E zǟ~mqxFЀ%lڽ QtNxO#&&P ''Hf^D:xE/--2~.©xr&'O/8yF |H{fxMjCBFEkoh'~贔v<"!*:&w8TΌZlq/ݏ9J212aU%3ۥH/~H'Xޤ_ 3yAiQnV&!4 yyaҒ^B[ЗfϚ{JE2hG{C@0x]wH~DB감]-[$Û OWm;C# ^f6٨&@XaMtZ%R;P$ۓvok'PkgŅHk˟#:Nk^S+tmI HQ:AMv S@[&6|)WQ̆ e;NHW,-1E#vlAd-Fa`h"e8uKrި9X##5lf|=“d80&Յ _#|29J_˴e$7M;\lwv{0-c:t3=͂A?3ToaidZ^a V4ЧvP䉅F$k'(Q_SB1¯? ~}C)!Re[{r ?|r=?p0})Tr;KwUYݶX94lnc9Qj,$g9 F,(iWɒy zoa ,3Z堓1,uv@,t|L_D8Aӥz23Pzal*e g@ o Yhs|-\qB'.lZguHG|%3UqBS2 cY{Uxk~}(")\n'ϊ'X!jJ>ia>"IҢ` #]zY:^XyƦ R%h!m0Vo1wGR=" . ?~lCݦ4Y)rd~9YXGSϩ!4s!q*$Eu6FBɒ0-yb>>)2zՐH#{}zbe t V|$&gї,1žz7b) f߈W6>]Sz|x$deذw(Д#fP¢fJ0L_rcR-R"^qvi)äMͰsqu =d{? @0tftE ܲ|}y믾aNl+csoTU3},I )䦥~-FFsSGޟSV#t%}ߢ{`7ѵg 'qq|j&9-yBy,QԱ.cX$ Ch_߹+(dV3ƹ&Tʔcٱ 睯f/^lS 犧3Ī6gm0ػ2;] !sY=ۡ~4{L oB0Si}vr~-biyZZ&<\TH8-Cy]Jd`kb8د2]R`>q",hVڮ+ .6/ڮH3rVڈ҃BH僱b1oNN\;>ِBiԧyE!l%) =oNKο*RDjLZU*Y/Ւgʃ{쭇0CfYϚ`=BZ>5;z7]?qL"9k%g2k=ZaPZ?sa?n(K3 e(;2)"/6Edy0\H7|@ 4F튉U-Ikzb l؜|o-ω ]d7رc-\d;t߃C7^2l2 t{0Լ0E5uGVٲ|17"Hlj <̾^ASaw""u೅jM{LFT3)Cy.Op-; 댸$Ȧ{PϽ. y]V-l%ACVU_=NfM)w(ִp-@zdO>~fr܈%d5VNqDUN&YG"  ^Rа[:2ƔY9R6'S=; Zv)Ik'#7u/}ˇ9oRDwv/mnr3֤ix[Y8+d&y]5u?4BoOzy;zqFpqыS.Nʷ#MfKlIxxO8bVI}.J&K3Կf9 WY8sjnew&U[x2Ji^+2chQB-x=~UtQ1p&|{8q)r^"M#4z%I`SË/0*xiM?$+zclY쩔rAX/|ןa=#b O>™lgdxr'7d$}?񷟈 iI#6n>5y'ɝ38iW^6'{ qwdw0gEyQ *x1u(y,d/6`lBa% kCUK;;OSlT y.vr'c}'1x;4y3Kl˺-ڤ4҈=DfaFKѹt MTM&C3Sryt`瀷T_C2{ow$Me.103[jw =!䋜,[ǵ`dr׬BOXH;2%yӇ^v65әW:5C.B|XW?6m#}:+D|afO9qެc刣KU(/aA$]πPHAoڽ/ EMC5 O_N+@ET~w^([}3-*x t%W3ɲGEj!!*L8~ ySEA ;1B <~՝G-%4`ۗT!Iwˎs9 pq:E7'q+EZntFM0@3s"r;Cei}0[HLK#|=Gݏ-CԕL6sd|t:TN)39esrGK?'4ͻ$M 0{$e2;I, dE]>UՐA 1#-~-թMXtFzF¸f}60z}ph޶yR/ S$҄K_C=G<4=+Ha~T@ 739ɕSdJM; 07!(p]Ѩ'cc.W4"0yl8y my-u.ŝo˿VZV#}R2}A.mmjWv)Jϫ}K:]RI\F%S-ٲPn=W xߨ/m,f2w/2]$=:cx[n[Ry{ߕNXIC vqDɣQrݢ=iktQZXCZx۴un%GE:Śۧͱ֗5QkSbxJDE!"6M1\ڄr-]*nk=z =8,HC㌔'ku[;!e?4`/xOY{36eQ"s F-oY/ܤV 7$\W6x=>A< J dT+.tx幡#i?m>aiSp1nJ#KqMJLg#"KEk JMq(~d5B?>ID=I>b&_ncCdޙx78!*_R  ]Vw2pGx6&^7(ϽH07\AES, 9Mϟ UJ@ݪ ?=6h6F=~ K C M9>a_lvlsC{U^q)C_͓pmX`@WX&:Rڮ. d}v޾ĆJ*!PPyx:8b&@ni/>B:#tf|^)7!_5 % rID4ׇ`br8B3q- > stream x][\qG[z6\ ,Ydюdi%Tx*ǻ@=4/Ū~P{}O'zuq':zQzC c.>y/zY ,'tyFd/:kvU{M{|@/,~wxyi<#B{wWc\v\JڻO^%%k2{-ૐ=]b1A/ ,@fYzxI31Y {0CK*jZaeb22hS~%Ebo!}PKA.oQI)}wv,K%!-u?ei-بE⁝_|ƖIk뀎0t%FXכF藍bV/y,h`4|TAʨWZsXZ;<\Y->2Ƽ5;&SWB`5P@"KW*Z Sv?{Yv}}e&B=d{;du%Tּu+xއ6rmg+Oe6.Fi<,E8-NNE URX>֧{5ڟEc}q cӌ+FCT_.oMƄaXj *"_-:ށ`$7=lO; RxPISH=3t{FZ *}}I{ V|Ih!ziN+CN4JHxdMU-(~OXzQO9 h`#̧ܯA}r,0X"r-q9˒U{,oLG^ `VUL&k"11 ݗr&ZI9t,L {,/vi 38}0cbm}: U]9e55x4$vͯ"hZ,zTq*8Lpfvx Y4'RbIP\W4.O<0*=/Kb{ZUUiL B ~Ppfż^4bp~ʟٯRU0C,d%#5tZh(IYj$~]BY_KE.TS5`U܀\#Edh Ɓ1R^  E8y /ȑxF}s{q gV.l' >y`E ] Mtȿ=}7D}SGѡwO ]71v ;…f? l\CnQCӅ(3zoPE'ɆwTIX,mf! 8^Ql՝$>&`00,t!44@KН&#([Tv.ɦd)E <;^n>h03w2U3*ؒ0 1^/i,,m~Yٱ4UM !Q=OLؙ2e{Pj5(\/\J6.M^b.'%ޢ( s8I| hXc$`h-_RİNJ3_ʇ2|A̺SeB =_T2$9&#D%f<.ԍxFnH2Ji}Jб}įt+TD20(Fi8d: GlZַ0dA܏csRU0Ǐ cA7m/iu 3( h5Cbc 5Yfb&`xfUR{Yݗ!|^uf}0[54kEES:'۽1<0?&h!]v5u)c"鞺 ^obM1=-q泈pnZmihVu܆3FrvZh ȯ=e1~>\gHFɺW2{M<~ 7aȻ.^eF̹o lW 5أ^YceZ<)~ &ݏ,2GɴHff!C :K{t !E[lP&$ ,g8 (Q!2_ك{ +'mɹFdPߪcv.:h~%owMKNteWPH(< ,yxl J&rP*6al*s||@3O,(ȸ/J5QtrPfkR29}B33jKsy)R i 6z9X`QMJ'v̈܏ d+1wlxI]ęS|NxD<[ݝ![5@u1ϵ_Pj* [st@% Fmla]Wԣ1tjT Pc͒ yeGl YX"ڧ /l{{Yw{T N-o/G߲wbY؛?5Q0:MkJJM5-6t fgJwM !-˭*ƥX&rԋ69% Hq_iN6VSCX`9CSVƍ()IL/~^ ,U817܏a =4f`tJ(.qG9`?gO QkDNcP}tg&)^nM)Y9,,1Q4"9j=@7%>Nu X%S0x46z I 9]()tX!HHPCyMYuÌ$DZY?2*ݤ^&(ؗ c_㈀ A,f I.[X,В2yӚIJm˚F`gjU|vúɆyy%΂/oi<-|{Ζ= Ȟ_TqslMGf8<Ҋ8.x' SRT ;';cjI qzٜ-b0 W]:ԟTYL !\$)f*c׬}y /Hg-2ޖ21{AoRgùiJ#Y}̩î +c vIXr_M rjE @B78!/B@Lĉ1Gbǭ{MC{)ט'#ɍØ6Gf wylFEIAkJ<]:$Q AOlꭎC)&\r{<{Q`:n 3_U[N)W yCṾzt3ƴ𕩍s,Ǿ18a8BLpvvR$Ƴ;/`'`^ xJ/3my}*%I"st.7",^jbӘa.zU^oYy3 Rè|Ċ@5YΎd /i,>q8RbWpQ&^Ylgel~aӳ:β=hd«@ K>~E" &8/D] } zx%ݹLMöcff2x8_a0Pg_¹S2eRǦv/H zVٔguɕ1:QY@&v OSYɖay5YKi)b:bT0h_0 4&̅u)qz-' υ\I:k=3UIoMӟrmFh;FU ߔ|~ĨvZ<@K˅Bɀzc<:=7'0y]q.@\ǀй*R6gX%Yct͔ Rᖦ'"~fch q_3+2=hF?[0 Ӊ`L*HS6N LQ,X kQ?P2X`j Rq">+ganuxCQ'#]͠FQ6F{L06Oe,bC`'i99AY6HFhXfe2+-|7?L7F *ĸJ,p(x0Ual%ڼyC*uFӢޮ -)VyɮLRxucwؙzh骰ӉI, uBvp)^v99&;DF^L7ᕱ78Iw& C 5]`C벎5w9T(N+6s3g Xsu 6{+‘m0t̊,b.nL6WN-gֳ4zZ 5 JW!YSUFF+޲=ƄŢl?cNZ3ZRΪAk,ɴ~LLk181<^tr'XO: k(ol [59VQ›rL [/>D9) 6Z;?] [ Ƭq޸ez`Rs[a #v9A;3 5~*IӪyױH2b Fݴ_DhLr_]s6}; k%VX|8퍺2؇vzn,^;͟.ՠ,\Fa!_@fܺk=IZ S]p% _𴍸u;XZXr?{6&vφqűr.$@gby)͹_rsq;C.&xesV 캽WKb`A"$bVgÊ\B[w>Q=TdtamjT$4s^Yr-=HE`kqT]w/uҢ 5%_-7JwDBȦw\Wұ3:;];9 1cRr'>INm7Ir)C l]jqG`I'j,eBs6, aƾRWx,ɉ;#g]og,o3!|(Gnc-Mj-DƓcӛ+dMN(3GuǞεc)BB]ӷ̠f4KgS5, /W91%|^'8I7G9Z/-B,ue몧($!Ƕ#Ӕ(L3/ߖ/vEU W)sujօ&?M]endstream endobj 159 0 obj << /Filter /FlateDecode /Length 6134 >> stream x\[7v~ CaOx'uG] rV"Gji3,;Wvwjߋw/T]ߝ] ivHϔ1q杉3coft1ՙR;gm0ۜlRy>{ -ޞ)hpe,:cnLEf.٫/П.z~'?TJm-a^%;^g0w,mϟS %SJ4P|3jT!y̿k[{z= 19Rx/F{$'[gFt g8>` +BtzD>y0w9HD3 `V^]Vbd_^SG{E(6J'FjL~SZ)/]>u.qOi(lخ:W\iե4y(;mqLp2.b2,u[ )^1? {m0UTyq{k`OI4Ѯ%E7#l@(LEHH@/GR鰭5ʡ"J)70ShAدJ,.r9F]uV,Wx>A  [X,|kYI`fkK\nC ('_KtB[z00vDOdM l3ŇZ|@ԧ2jwс} ]~ 0AP }@( ˳B%X(hX}%Unq=lK)!3qQvwQOYu"W>I ڳBJ[a{`{z L=Z& \&|} VU[j;^0IF1TqN&5.&:ڪx1^UR Pٯk&tx\[ n6OTBLBS@፡ !εPD :ԣ,M$\QE^Z00ɲNBI]@WOvkS&,`~7{S!*C@ۘ0hDd6,ݎwWzW`VǝЈ#~]b%)2HH&X`0J1=V7y'aCَQ#r>&>YUq#gQSa.0$n&( 0,0ӌzѰg o=dk5@ ٹFW2&YD1HBebdd`LvwЙ>{f%Zp=+c~y Yk uǼ'"$!"e]O7(Nb` j"yVD.Kw,Dq ORm#%E"P9s $_8*yOVr:ʺ*d 'P{ j]įB=xAޮVޱ"Cp3pAaT^e`y5X7.RɻJtfv*"5FCv=VJ,TQ-tcE^0pJ8ӈ-w9W}9N$YGh n&Vbb uYUZkL+#I<_?T@ F9It*u 2xI-c~0^֞Kʿ btDOŸ)c Ly,j=k0&Đ}Fs;v1 zcd{RBTdMH-A]V [iMFS̘b] ,{s>2rZHB~/ pP_էˆ1܉m&!2g\-^;=Ӄ$QHP&YżvoV7rJ[Igpq y1G7 F$?JPt^7r.`_KҶ@ˆS{kpӐ4jot+ʺ/aY0!FVZ"u5᭦}MqF!LZG-]D,hDpyP ߀T^}k%-uґq-"lD0x0\co[ۿ*hJY##|./Gak)ռ] ;@頛C"Ӷ:6c}@ӕ W[ur<(Fy=yAbk*h얏E]R\ Q75LfkL a 7A\@@r)E 9AwuykHMuVгZ'՞'Gռ!ϲ`dz{nrFG"! J5^&kk{28fj 6D1A'sr%L4zjS1Mq7Y(@iKI cJxXݞYGu]N]aޡ\LK1e5!n'{/Tk"J?cg; 3t܇6I%52L+^Is6^tZ5.*8,r\A8[Hx<=hpVcIdӚEC ~cki);>ir-MzӔC: gS9u<ߊj\Ƕի$ ѯ!*-, Zg>:T LXnju!D'539!ZI~+:c:nh8DhIů<Ln׆M2=v}ق\T%()n/2Cr.  y2}TCHH[ZBòy6kU$ Lor<& ]'Q~F/4`$^;Z  xyz,z`lG 1de0K\JlsIMњzDddhKxc#^sߔ #7@zD>!Aq8`&Qh<7qT hcEM@$3t4r<1^NGj<̴Kl!mualSV ?͍9"UD=N71JշuB">K(2ݕwik[ :8Jk{e!QԋXG4.K?YϪ"> /Q > 'ɪ(|p'{~=$8#Pe/EIm<9>C̼|ʟF kVFtKn+7Fg(UfaXRr U}ӎ-^@$`y<"Tt~,Jb-ԁ(ϗe!:˙}#Hj%] 5mf|Oh:}@6ơ#96K[[9`;}j:,6hK \j>6%˼0Hd0 ӔL!f >A)#Q/4H}_BsE|/BDRCʆONe>r$GG8m uS > :с kmY7TrYIq|y0?J 1FIwjl9jl9j(TV(OWrYu%7 ,kg&ű\< Oӕd a咽Gjѡ`Eg&<Ow]%Sו>!,]xQy8;7Oxq[ѱ}?i-]hPn[(.noXw t@\v§'UrkW2YpGТF8H@s|t]U}MƄ7M6Y>7|_%24{6x_zj3t%כɫۄ.'쫬̑E%`OW?䏸r& O!=Q Ę^ЃRAz,_|9j{4?@\rq޷O}]|7"7riҩ+ HQ ͘*ε\}?fn+kK(7zqsS]j;pU^ec@8x[Wa>늯q=r҃k2WQS.lJ fMb NA~z/>63~lx#dT`#~q%lO nr/n.Ud=mC(:f dW~^S5Rl?_4 endstream endobj 160 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7506 >> stream xZtSW}BXbʋm O$B{3poݖlIG{/l S 0H@h}zfdI}}>g+T@ _nD&BO}%Hz7o۫>BsclPS?ޟ )CBcwE:0ic&O81;|{JH? H&)swdY~O5=(b|H:DsXaQHp* o9Ǜ_J#VxyS1x^a E,\"]sYh1+cVyYn 6M4yiCxop9jL}ǍۚRaj8zZGK9Q#Hj5H6Qctм ;º#h_4t8 +"eNāB=;AUf0BAu0#%PU5 8!> B@Y{8jUЫ!!G`="+| KE|;yV/ي)+i,!jRB {e%28$A+蟯p`:'npPb ؜P[ -d%#CdVܴzh$wيy`nqi˷Bɣiť p?6~X-J:i _C.",BXX(YoxY(A5h C% 6.2?Q/vȟEoxc#1ð3Yhp`}pHkj`-x/lJ]\c#5v3ڜ|4lONoY쉦Ih= &re OVqxL,f޼DhH`"~Wi@Q L)h+%(.YF$r[}7'x5`7`;hDc}k%TzVi<ܔ+9rWNVkj)~KYt׺ `PG,w()%,?ճSpn$Ԡ#pdC` /~&lV9`84A 4 ϑ7P\[p`M4 XwkT躵Gt6RgYGʟO=03CG"t3Z!4ĄH#BQw}:u#a,3FԸ[?@[ hAk78ZQU({H?-.1p4YhnJY$8]_%AVgu`ˋ/يo,Ac)f݉*6M6ا0avT4Kx"_h@$cB*†z7N|c.Ip#u aaK hAv~-Ԋ7p#h6oO& RݣxFn S)H<'+l CG md`>s S_Gs"Uf20#vt,dFT|~AOEؼՌT"!kbզg-HeFk{y!ƾf/r yyȔe'hҋ22 +Ө'(؏zQc4i|1 w4B;\~ $\n_C/dGWa xoD?R},a?%`pD[jVc{9('/LkD۴͸tlg{0g w׆e8LC+mڻt039/ ԕj %MG 9rkć8YP"hMʼ4#_ITX%AFXN]zbdrHRʍz(ejK#A.G?uא`rz'Lc(E3n;m< Hdʣjte>C<`pNHBׁ O~~2(H+˒|@$֯FvʡJ_{ M#4‘n9j%|FJ"|/mnfRuSw^uEi{/[UijEayƎ MՀΑla L)J_4+(ԃ7tMrH:QZMh 3$^io&u.ш_{Rn5L: XHdb8ʞ؝&dQbHL_q͙C='Hh7Ēs0falu:!̦dE%SjD32:+]ʔc;%U9CN?BBsP?V?V9T9p.ې1bt=QF5y>%);Y k O `} +S5)Jy> a xl .B3\Z1F@ܣsa7z"7r kt\lԻzy}!gCG%V%e$B8YU[_niܸp!g7hDF2AMC\%>#oKߌZEU!M![yiUhUlڣyכ]Oۊp4 Ϫj %InaU>`ÈPU@|$5)2ēb!t{C+*yrҍ*Ir,Ъd2HbbJ+rʒ\{V E>t{vJcwPXmZ#kc7m6֭U^A: sLK컋?V 6,2Jb1R`B gfܺ#R'=GF2#[+^*(k5!ꙁY>)y>yn2a]<4k+ᕮ_d#{|!2c.`nݮˆD$~1R%q&@srthy~KS8uA'M8cʐϻ*)8t9?MەVSO*`sl֞P\P5SA=: Vxܸ{C" ϖޞ#&>Œ.ce y&@L[ Ea\Ij]HHLTئ!Վ=##"#뫫=!ϬD-f}r Ž3N$RҥѴF4 - Hpb$ <E?a97s“ ŻMݑp<J4\Vˋ—HjW=}}_!NcMWDSI򟕔Bck1lFacuƽ hCSޗC# qZ>]ᐩ)wl! DxQv,ckW`@hoC#&L *=͖}&̲[2إT\);wa'^#/6O`:b muS'FrEPbey?߼oǗ.z}~ĒW_E_ !:䩃*2n _H%SDU2 ûNCfvi<,kNA%aI#TZt!39wviSE@YfYvlˇOMðTa콃ry7t/ӿyX>>9ը#pe*Iuŋ6G_ G;'|&" xfDqd-k*_S㗪Di`x[f_)뱿#/xZTs3vuW1 bL{e)'Ǽ;g}tQ? Ţf`,\* ڶCJUE( UdF)@wPte(;.Eag:w# RoXCG=G+Qb h;z|mnq~Di Y([R"]5j xT $Cjc 8G J[N|`؞S-)##|¶U;h42Cuu?/mKQOK*w!/mQVw4Ǟ8Vڬ+&-]V@BF@+%II &-+#6,3#h!CxC[q'C_4EUwxOp ח{x$WXOۿua!'\ >17ή36ʙ F6 Nĕ7' >K6tV eQF.kKd߄"OO,nH'AX> c4|8DfU,JA9HG#GMeෳwe2짭W^4׶~>H;\dO>5qc4.\ARKk98%/շw~in+cF Xe8wi9p6 ͏VM/{h+DW'۾6vfw(w0Q" JZrk?ӟM^5ōpt (ԓrVfp8cZ(e[eK=EM4(s) \ۙv™KRpqbhPV{M?^+!?1k9QhrsLbY#P,&q/( >L/&x'&7*!Y.TJJ3r>?NRh"IL7Z]rƤd5otN ]-MZ hy{< (zHVMF!W"FSx `os|$Z@gfd? ?ᎡHwMwUCa'ǡXӵDqtѐ QT QQFH'DCT^Dމ Zb? AFiH89\=#/MJʄJApo߹]ɑ:C)8ƿ&t'[ޛâ- o+ ߰U^Ϳ|NRU CV:Krr 3 oBQNfחDhi_ P34dab0ɟOykyRǥd%CƗɉէ\j4._K r6ݓXxv:٬"j;7Q~ָzgs-NY&LYH^^9dvGAͩXeikStI 1,Ǎ]R1A^-^|3>lrmf~O'ط|)=RD@H k_ "QH{]9C }^>t}RdI,endstream endobj 161 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1028 >> stream xRLwwc2qdfl(N!sLDpm)jZq)!6)B$Ff?ǎ?V|_OEٹ# _ VGtFy5`:X`(?Q'g&tY"-%%ޣW*Vj }Qil5eg93-KB_Ę4i-sUjIu)X:GWk)HfVmRɀ PmOKDه BP?$ q" >QpiЇN?%wƒRml=Tk55ލx&oEFmbhYZo/}1woǔJ %4zLx@ n @,Cҹ|Z:+Mxzt sZޙD={`O0{3ԗ]=܀ŭsnĵisP3Bg QWst_c}Q sߒТp7h1i5VRaq-8A5c ǘcLg3@_.\ pQxN)`,s_S0j~lUuV|q)xy4\/ry22L?];QAf endstream endobj 162 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5683 >> stream xX TS׺>1Cզ5=:ԱC[m8X "S!2@I@J8::Z{mo].V{oյ 3.7)`^. ۦ {zz;/-s'zW_z9F1)>!Ioޔ14nXɓ'7fi)q1 c2)1eLYз23=:;;{TLJ(IFFdoLX*K#fKR3#Ť#:9 IJZV8=bd8=RKfL5O ']YE񑛖$,ݼ,q1cǽ6aa#)jHER%`j5ZNVRé(j:5ZM͠^P3Yhj65CRyxj>z@-QP}zGuzPOQcTW{ez|-w vZ0Upn+{^Cz]xJW?K=Dd_gR>~~e@Mm @k<nQdjigdýKakIEJrTz~!(ţ\"NȃM]=NSQLJ=Փ5\a]3Lv5h>M֠OwOƒߩA <>G[Q;Qfg{%%1XrG%1$tS^tVjBFOX43ѷׯ͐ ۬X ZUV`JO YnT3I$/+n,dM {%Xm)?zş5E@gC,F>fc1kܼ7A3YW u B/ eƄ8}ԠZf+3- }bWqW6ïbPITr42Ftr% [P7WZl!m\y<*TR5fZ[Bj>JXP (( r#vN$_AݝЏpFN9c9YE6&/gYfe* '[KBnZW rYkֱX^ (֡/Ze >7ـv(A*ȵ,6 ZPJМF\n" 64z4?88Mr'`/;YO<"Ie.)2PʇUtʖwpiEpA#iJ4-=;fٱ&ԣD'] M;󓋙p$;B"އHeup/Ne' vA`*ۮIҦhF<:l@R wp zP"tEx`Tp&.;t(ʕG2`_a@r&i sߐ3e."T.Ǻ* PAnjG)/`O5]^ejLV2U2cΥ~Xuv0S%;j_Y]ޒ`CB t=3Uv1Q誷~telrʼD3aHPmhVsFoouA${dfmV g\hgɒ%u"xȒGL˃]gR $[tzB@-*6 ./=ZqU ,) v y <]]BVDTի*Ufi$F+2@p'5WW?}Bm¼7#^8c[ Js3EԬIvۃch%Qf8E.Khѥ$&1qͰɖ^9*geK94 ɍ&8;nww; OGd7f9{ tf&Q*V=) $Ў&gzG=?5+=eiW5S߸O޵DTF& Z t+n-gE{OnPr9>Vc<3Ҙ=PD>iimlݷ' -iE<4_ᣳm ;J\>7POI~E`^c0szfX ID.$ @:s8-C8iẜí{ouUVW݁چ'xcxk3 KPNh  C@nӆEprAX\C~r IV3IqOz?d9o{y,( eWZh6VWoIDH/UJ3 WtuO_T1uCww&{S -/ݶm{vϑGsFn}qJtzά0+潕 tt˝P _ե!ytʎߗaixJWe>l X,KAfoB1tJzHQfo_rΒEqrՂ2 u*lUZP{B]axēy$au<4Arv-8W&ETHL(}i4mBLo ǽu x /!>{o卹@˸G6鎒[Loyw|d{GiI[vnmKUr,2jC_u]{U }:Fya:1es9y "}bYIƊb`V?3׷JԄ>/HYN&LnsB4EXnϸ{3IC)p:N"ꟺ,~M?̜"ǮZ1˰Rb C-9;Wm`+$Q4i!\nh( 4҉1$QLt4@A!Un'SdKO22'l?ʆugOgfMxW7P?5č{ߓxwQ oDxƔfJlzg%ԫ-(r:Ic%9 {4^V&\:P+|ps~82 |=6%WQY V{A%O]MMe ӛXG[?jRxp'ѬHVTzK-;4>h][Ɣdf֧w|cАŨtk"y~{\&-UoO/9&KU\2ߘugg?1 vW cq +Fe[i6J:+ sVi@0C8 fD"٬baNǏf{<[d Exv?(O-pYZXs ASɨϷcVu Fq W{aiaKΪ Z2l:+$'ࡤk# 4~)D_v{%0($"$<-zrרmWԫwl%ٺ)9N֐eTMM:ö;2tc?/t'=VK%}pd2 [Lf.UIsb( ~":֐g+ڄd;Hc(fjPW'WN/=jjVchRZ0X: nC\B[}%B^h GF tv篮hpmҷ^]7Mwx I;D dBԒի3cvτWk_48Mx#3m5^?mJ餕J<4,LhPs锼"p9dheEGy(7ex=:9X>aüu31Ev**+ w0P9^_%^q>hU8LrU".?uu.oI QY#|leYZFEW}JrPW@/HyK,lF^133d7a,YPfn"/iÿ|WTge.=%Zc0j @V' x8q3CċJó:HKĻ1;єj&|1!RNC|!Zw>P$2wٖ,d"ZW9KJtS/iC858ciwpRni) nWz2=NoՋyS=endstream endobj 163 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4095 >> stream xWXT׶>T&#blP%1`DADzWY3jHrĆ^cI|gKԘƬۃ1y_7̙[Ƙ `d2d G{2ii{טb;-q) 9Xmn0 a2YX̾%a Av}'͘;sGzڭvڭ N8/0::yDM X0..(:ndKXh*7 $,$<&?ned(0- wt^:`]!3fΚ=f YÌc2zflbƉq`63K3820Wf6ƬdV1֌yQ1Ǝ̌c̘DlҀ-;50{k"Β ~aA%,ybŷJK*naC:a2Ic "ڋk\ 흭JM]i鉚Ūzhp\sbjgC>PN9V(>#40)C+<,y"PAIªך}`F}xFIH*rEfhy.jLwAe4V.I՟?ol0e:^y,J3Wy'XI[%Qրb+Z0T# [2yOTD '*]X`+7CUQz-ʮTI-띡*Tv_|SZ@Iěx#W9F|~WR* bGp> +_|3t5ta%QfU %$h$m~E(p ֶ3];X{pnRz(曵vm' h[igB|gSi>Uͤ$bYN18GaZCd%pz?z-DlT+zM7`!:(p: ؉0^kBo]c7Ph+2e;>R9K>ue~B?m.h`gl\*ܨANB9ֳye3nvzh*+0]Qy]e n@t' a)@QPL')(+isQzML/6(>s-ʾlݐUCN5k"Q\_B4 6廄;{8CcIkF,1#n'(HCy_r+ W;~uK8+i}z+ e/)h9ݏUY,8*l-\ⱎjV7aĉ.:pvvzK5E\s]ZeD;tiOxe|-܂t/3+!V:-$ UnivUD6RHf Reu4N*d%֚;3t:*q >aWY\gQY%`{ +('nR[!YrJ/DkCtQjC̛,ݺ&]ƐcEE]mu ZA)r0| }>: AԾAyրm d|_?|Gp>"8h݀Pm*w4j'x?(/$HV)*هK?'Yۛ7T8Pc6苁{*ťJƏCدAl<*vHߦdpf,-CR4WP]yEuVByXq 3Y_S62"믙^1 h=6gHgJ;oOߢImVmBZf۲A'?S&d'0Q6KQV)}&ǟP847[@.g!ƖBx_&}fSOBּUTDܴL鳣?&čؐ `+R)2@ E[/lB|Ny32O_2Z{B*QF\'i ~c?v7Wvwo|Nz/S2 6FqGᦓu=TୀX:aC wn~Z|:ʚtt¡r쓦vkc!{K{]K-&,%'8 ?\^؛&en[= CUADxKLIrL3rI|rMW.]H+2pΜ9f#PT~i6'(ǥ(l`>S͂kpd6d@Nkk(ܽ!FK< =Pa(k3EL=XV]3Q '{W,mS@A/#v$foi N8łѳ|⍣iW>iY S ШkԚbw^T0(-*ȻfRpM$W8(vdilGiIѽz1͓.m[z%o6hrrce܂h)f_zst=aݶ`7ߎ2o2[Q.d|GUP}u 8u/q}DPYwWoͫk pt(yTԹkRWٗvΟ[δwC߮CvS9rƚ xH몛ZRxdj|lŦ) 8[n4dIuz p2{Շ7w4ƢL=t#oVH邏ViR S$!CA$5}tpڸށ3F.;&{͸ Lioq(EG3q4WqX%&}FddO?ȫ"@+/Q1g|C/NCSdb&M쑌"m#hѼ&O[1EX) ¦,^H-N6Ne!;?o:WHE!XPv "-7o4USgG%z8W|VB $5m pQ>U9%*博而pႪZZk/{_MFsH| >ns~uB~+@;RPz^L!% 8zNy &b{JjtQqH*MFG{l@ ^>\Y^|0\PE\S"v[6ѫDkڊ^ޞ;.NX\962!W:G\TM^o7 :ʾAG9'Ik p[Eax T2b`k*XX-Iendstream endobj 164 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2629 >> stream xVkTSW1WB8ԺhJZ:ԩ@EIBB $w@%:mLZg:'v֚誳Ngqg‚`,kަ/Ƭ D ,a͝zz%ؽ?$ †ZC{ofĹMbITq@n^.rc6_*H"㸲ldEn Ȩ d2S>*WqK3^)D?ȗy/Exn6?r6U&q$WƗFƉy|0B$Hrܭ<~ +ml' Kvcc+=X,"PWLA :=9c'W.{2x``9\m~ق *27` Lh|>ʘDqlT66Km[U(KɋG/TSj}_FѶJ-`*,%It"yꪦfg#U?և`hoϺWjR7"hO ˔يt60ŕ`X,>Ywx34JTI=Gf9gau筌缃v'm;8&eo}!-E%i;]O/6#v)kr}Rs (ю){gNwъ'fFOhF/)fpP-fm8lhCvxŠ J:; NB0'5C Sһx:15!#_tʗ\ P*;ڜeLVh|g/USWugPٽ\=L N\(Y,7vBI1(ýjOL\?.z}t]Z~ClparKW1E K(5fwPZϋGsV=2HѦzگ'\bRJj}p*2q l<JX𔒁Ϛ(g h?u:J?[ro6e9X,Q؜?>.:5vٯB44ULAoj6IvKsvR]=YuŌŁH_$djή#sBt9=ofsӖ ^}Yf'^| a ^qIj  NlzrW,9#M8;ăZG<'J&58nTZc=҅K ri;Vait P93$Lge& CzvrqkOWޑnjB`&aͦ+kbߧ?8  #) ҉ZaS;W;>GQMC}7%qMfIONWg>O%w[vRiZQjӑy 5ҫA0ۨ**/(TЯ/  4T@KWfA:Yyc@L*W+k7G9)Xn@/{fn@ VGA}Gw ȊoV38L(X:m3j%TQg:V]k|a_]MVY~M7|z}ɀY,-P7(]E<>>&b/cx˹UKORѴ!7z?zV4C靦v48tj`1#URhֈ!·a3Os?Z@WCK$y1XZDV1rNцYMpd5"~RY|TrטvNp9C@F4ɝ<\,VշzPĠj8g 8 Bή[ %:B{~b{1r{%~ol}٤|7`OEpoE.Yo>eXSW|NO~DR֋Y,YϜ1ΰ>Av6:/c2"`9jޠqN#Cs}M.tLs]  ևU`ؿɗiendstream endobj 165 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 702 >> stream xLCMR6/v7B@N  #kb\mqCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMR6.CMR6Computer Modern1234OQmIK%gd͋ǧj~$`dًËËً‡ #`$Of}I|:}O˪16-X~_ȱЋ=:D\BEKmlGvR%I[Bp$^sjpmza(S(S ڥˋ- 2U9`up拔s8Tl+'yp|{X8 Nry]d;j7nd鎷鈟 #n78&vCoa  7 ޜ c-_endstream endobj 166 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6541 >> stream xYTT־E͍`XbO4bT)* 0 ]ClQXF}橉b̠ٗI{y/[_E[眻˷;kF"td/w%.@'<#@K63)um`}8{SoF*'  yS?m=qֳC7X/q rw Y m=bWXXдq"##Ǻ 9ruwJPw7yaK]ݭf5~b$=$a9l}<7d^06-޼$c ޫ|V?aNєӦ1}cƎs0ef93Y cV21jf3:Ɩͬg0cf,c3;f"Y|,b&1f)ca2o3<ӏd̻cb3f?ӓ1gz1ْ'4)LWF-Jb%wrEtW!]ӻV&&gQYΆû?cYyϏ{昛_5wstЗہoWYNYr}kdڿggߵ~w-z bs,xM( 'qzV̉hP&őWw-"\nR pPyluC=dC.-,Fv) TVk!Pah38?5aCbbG<"_u# 3A쭗[WTpȰn>셭)rR:)`|vQ N)`Ͽ:xTbD)Szl2HpÆde$x_B8Z“~{s bQ(GIՙwW@ySئeO\>L" ;XϘf7w\'6TT7C!r(ax9F׀kmxsnA8;ƽ{[ sլZ)8I31Iڱc_ )ju|n+HfIN'g`B\ȉMP%d,=gp#؈hٷ#jdMJ!p%]FݺG ^(AUl/b2LTuma_zgۊĵY2ҘR]Mljjס3];7F3ec!_4PF>B M8ehp.5=G_\^]s֟kpu0rlM&'s>n 2}nhZLkA"2(rͶi)^=(^Oa=@Fi~`2*b&u1Cy#>!Yce8 *\,#S) RѯADMfMed.(lD滌dʫ+} VE22u8TC;d9ˑ*o;iiv(1u_Myh˰t/; }7 ߑXx ?%u\(Q/4ÔcR)HSBlR'%)A *H͌ sٰ%@J?hM9`q\?/ib!9JNzXє :]^NSֈ}?o 'gMk-vM 4lMq%€Qn*ЁߕB0딁\`ii|o ""a}U@MFNcVO|]m&Q^Q!XgF!l)d ][վK^ \>:@WON)`8QK<4OiX% e[D8/~ky~vpXdv6LiBħ|KF5 T2T0&1 ưJ7!32 1LU^ ]Qh˿-;iY6KF!d;⇏_ i2O>(笹u@BA6z3.L7yS&qW&B}d_Q;+2PvL$2Wh*hp֋޷ `#cU9$2:KS 2jC Er#DAl3@Z䍣S-YBV]^:1o9U%ڍt_zs~*/ 2U2dXڴBU6M5}!ZieX|ufz[JM9Qi+{r?ynET %+xM/H.>3!3733C j}0ekaC]_]/+RZjQuÝ86UǮP)||I?_JA^;[n:7}~Q[ECۏj4V8`-L :}+W&zNVGŐKYQkIyn|V( T;D94w2'xC.#Q%S 3lmv4XaeLC|BxGBB쬢U`l_ҟx@M6*+EM1NNc3,/jjo,@rJ\3r~(CC% n:XGN"k2YBSq[/ygSb>%:F]ӫ3J[Z+S͵ӯܿ$ l! >1އRߥ&V BzEdimG6IiK gT+3⮔mdKMRm2UԶTuJšYRhL35.~WGPUϖN.$6UyP##z27S0q7e& H*vIa" 7!1DJzF`ԌANT )3dbW]9 r]^oTx;Fjm %jd66G_ t{V+FW$B*].vH-5nNZ.7F7~_.b雒#˂@L&[^CQ/|vNFl+2ޭQRW]RT*HɣJqM7?Y"I/UJCtY 5x^;6[-Ԩ-{}? 7Y+͈?6ҷDnv :%hgAOsvW5W6h mXurs-N1M%** 25&<2i zY̍OP䞣&)ip?BsNu [Ii8sfj$^}#UF`f sՙBtRZ seQue{]gM\c-S}n'y[2 x e {xd}2TJ+g*Ρ mHt!6I֣ݹP/ihMR}ӆv3/^-V^o8IWA,]_ZXB)49fCRV>XU)IPTW6n8rs~Zh]8ǧDX#~ɏ*[tE*}~pp-@ߔhZ,53G 9pybb#vӋzО'T*C25ra>q uBZ!č6j+)p8!JE}D,3n`Cֻ9Fefq=WhSs8HV_2Bb6=v Ƌ^I=%}oo H=}dW\K5|X .{0fkY|!EJWnB78pm*EyĽ֚ưl!3+3G̪+FlӗVVM}f$/:|>zR]7Tr_c7oKx.^ʨ(=WUDΝ}$,U4/wI1EEH qU z5½*a n#k"{?ZLug\*ȯɨU!cTkha Gj2TGi3:5:3R!"2&9 %az(w~cZ**(,,-\LR!tAF+DgzR9I i2_ m?:!XNd)F\$f~bmsN|c}GcoZ2%I"8 V|!yA3֭>쥌讗쾏Ub^e9VHpiAǍڦ}%(w=m8F08yIxD!p;^h1W,ږŪ|o4b %!|J$ll::U.T|dwa?]` /v28z~Ar9}+ftዋ Ol?kT?agJaEcю#A!_>_sr^یڐ!((^BDSݥL^JMX*ɌkLhOJr{C+OMKmqTu(Oԩ@ \<$DN[[uB~юwXUn^¢a,: qƖhD Sx('>t_1JZɾǘH~O5: -*/'U7$pU1եy;>s:8ȩ@$~=n;RwkgatC<- {zʵC ^eBr v2@&Uhpn >'#ٲӄdT(9?7=(b<ݗ9 %ѡd"̰JV: m,j~ ݩ'CR'.ܷ4vGwMP:FzU(^Oo8'D)Vk&ȸG|@Ih=4sg.sW89,l*-I(N: ˸6Lhs֗'/nLv4>P[;8x$늈 a_\CXIht@@|P}8ҏ`Z PBa*uپCmZcfhִ)?@|SPewxP*l|$8a s8䕔+ק&Ԑ% K}ƒ+Kl㥢R 0ٕv%Lg 7eepN ڊWK~:'ŻDo͇L&@N"K 8]zvbuI4n:1D%4jy6eKÃ7Ou:r&V" c좃uPӴ)Ňl?ZЌr!x-HE;UVX UU''&+ʰ0Hic!, 4m8BS)q%2<>A*5]@ey%[N74D*MM9m<`?M|Dxg{rRw7HpM"a'J%x}͎GZ-K\tNRlE9ҼkWΤ㥢Gz^$Ǧ+i!3=cĂ|]'(m%b$OطG-=7y龼ڡP]JlS#CvO]eڻOi4j{>;kN'yg> stream xX T׶cϯrϭy CUmE"2! dF ADAqZUjx]$v[9s9{o;P(@@{z};Oͯ c q DZ0cW?ug(r"'WͣC0 y4:Ap8uΝ6kֻQbYX_*WA0"uP"z̙qqq33ƅ)B]׉bRT*QsFoOiTtB,seK6zHcdrXe| qwuaG59o>'-yigͤש5Ի8ʛZK>>S)j><&}j3ZJ-fS)7Mj5ZIަjj8*LXj%^PP)Wj5rPCPjzZ@R@9Pr@,6c3Qth(^tb. 0pσ4I3!C m6cX+ryMr2+#^8B7'֗md12xdȻ7jDsPs#2>0kfLoٌX"Q"N=5bPxA2h$k8];Qcfؙ.i;#( c Lqp(&ya~|]́*gȩ $T9$>ӏo?y2֛pQjD5W , +f03}? Ǐa8Lڃ.]vҪ92#L}%IXڅ~՞x1 |8_ÖDi0) 4'ޚl{'9ۉ&%bj^,FRNP4a ~}<oN*(qVQ`-[E7v"tb/ΚN)&|(%dApNԘYz]MS}¡3dAOUa-C&ܹ._e6u#%fW5+Ӳr@ ^,:IS3&&D5+PˮQ.Ax7Q2JSgQ- ?g7񁆠%VLiw~DDԣ2Ĵ! 4Xf sFre)J;5ʲw[Ocvx}q!bĸOx{\g V,Aj"uϟȕ R|a/h7g``zGx!jj`y =mznD*sHf `Df/ ud4hpUH\tH*ژ~Ul9k샱%F/}qcSܩڛ|&*ю䍲rU9IL]/?zrWA]^V35-I\Z/l"M֐2v?,t-Wiv݇؏:Μ9q6 ~>/e?q?t0ha3A5A̳jiR=)ߴU+q: x ^]4i uWQQ S5̀ ܜљy@GYtxY]m7zjcVoAh+C߬y)͒̊<1)t)3չ|Yʭ}L/_.n0BEa:d f8m8p }|;H;IP=2ІкȖ,/.23%("ߞ"CN\BE9T>iK! ݱ~_1(<*J/7z3k=܉㶲7hZ נc٫Sִd\`ۺ S֍ăSsIl[ K~y!}j;RxQ iVǎ#᭼=bIQZ\cW@-r'3TX?ft CLQDŽĄEXºwT^RDyN ;^]4.E!|lNfMᯑ_J[ȷaݓ:}+po8Ƽx@y mO Q&H&^`wH;^U||Vu>堻A'x7>}6UqUg_FGQۍݟrC(КӅM~{aU8RR+fosɣ;R;=hC}_'o55B( MKڍJE-?Bΰuf$p"³"(1ֳh/;Eo>rcuN^4k%t$AJq0 ;bzU2+U☴BDGSY3=ZdK[=@IU qXGCP U/޹tlTx84oeTZʳwes5A̝syhd]uF'mNyzYsq1V#Z]X4RY :I"1 1=ziTv4! 0{nKӠ5TعۻZ̕D&͍]#1%IVh?3̛f3RlT2;S8мƮy՚gm2J¸HZR C z#E=h,ja}y~W\u!A1nدw|Srx:N0 fѫ+ U+NF4Jul3r1 MZ[c `&_@iDh^iƽ Aݮ/6-Hf$m'NL꟞ $( }x-Ay 6h_@$nC<OcwDmb?i"8oKo~s>y(IJk6'Hc":r; Ť6:(O{*:Xx#kQ!SQ#~/ۢ/Pwu@)Qа¯O4Ϙ3[x߲aI:mS( e!fy7V.*~p*1%PUŵ: +Uhj(Y VH)Mkz- %aXam} _& +h`B;u0, %sPG4Q92.B4Am2QPY\nsy^{>.ˬ!&!.Yܙ=vךKMm~gnqvoCd *˂R3rP,XXBd!uGKv[_> stream x][7v7"Ao"E"El `桥JӲZ{xAK|8K/Mx~lx~g&y͇_>{gyn8W~f?ap0~\ݽ{3.ay>}l]v9fna2n=NN:RF>CXh4&go0˼;}'c-ƫ&f1L0f-y;;ݗ%Ѫ&ֻѴ<;qz6 4J{ƞ'ZV@zQqt%uU܎&>9jhH#1, ^޾z(&$8ԫ[G*M9yڴ]fׁ c#iqi"qhVX؛r/)!4 W{/9-Sdv1ڷX>Cװ3On0fCaE4‡0Ak =kM*2sS^?&C"4-3aDCᚻ([|M+h:3#KWs?@#/ >LV~L@$+RѸ_R&bn2mY|AVfB d;ɜBHG;4L#qC=?D2-T yT!:.)Z /QO_ӲX ,y "V8^ZS+g'kLjQda8摼{O1j:{ N62x[QbޜOeH񐖀Zۃ}R ]L }9?ů 4V0)Ǻ{3~[qh-YÆO}3Ez(zQw6%^7E9APW|6<:"0)1˦aYA8EZ2kzVHR!H[!=h2ũӈ˚GyF1/˽hy+o5T74_ifC/ ~;/ g(-Wa3H|$.DSێwXAkokYO?[RQ=yÏ7Aɿڶ9#X[%7fEd?_J'~:DB򨀓Ӫ-xfYujc+pYGUR2.ZXFrG% ΃7HA8ް (܁4 1f XülWX_I= Hd5$&[ pTKMiZNDw v*-&!iMԕ!NCmd c04.:J=C'Q!ԋo>p]\`N T$;쒏aat^A7αW)ôO6WZze;iVeUVߵ/|Ej[4O0sNHᘉnP=-NP YVe%g`{ŋ@G6fo'\{XOK( 8!&LD9:>[G 4 5>}9}'}q`NdquI(1MYv8H2D+Kcz~ k&(Ց-kR@b Hh4H/`6@[>'}lyA*D3Uޅ3`TDV:v~xfV!L@}k/%ЌF  z W-1{h3<&xѦڅ&xYvm4-V.T$EGE ]:OknSb,I>7ZX|XޣLߡ-Qlh]OCh>Gn=BVlN À OPuarWx*]H "̆n<1{=h'xC]8),C󑾇uɾՀx YW8½hBa6u/QԺ%:*ӣrT8@jJ,w1~wD^p!aO[bv wۼawn:ͲΟ-G'ݝԭ`렄j 2_ #+EhWBx E*GGb@Gդ8856,`ޗ 79Qo6C=tGO-eJ΅8 nOiòtaڙdɸ~}!j٨ҏ~s3q[Xdy% 臰baQځrc ;Wh?T!m4%T!E fiKpP0{"k1R T(Q'h + iēqba \)Ȳͧ=Y"NH54>- t=k ]&U[AMc P0XdDӎŝI09e/(Y0AJ 3/bqa4L6 VYuk&8b铱sןuK 6Q[6ɻJj\[`@:6:96-A*bl4BoYovj'eKhB E ,}0-g r;ȜЙl |3 K\9jL"鯸Kp3KB"H%JH @!Z}jT p3h65-~l0ΤBDLXVD- 獥RL i<_Xݝ 0.uL5S-BhCŇ,/` ̤ Ȭ#֏8`_Ȣךh1FVD[ h'h^&}]Hpg˶Dnc)eQ˝CHDcI;1 ,L{*PVhh=܊e#mfH|v"QCԻ' āGCIor'f7rܺF^xfc, \dJn00U\GpVy"nc>_76z"YkMXkHOg\`}4>#: |E1nu+Wma"s̢U(uԱ֐29R27/J_~D xgT^za$XcuRs兆bQ3E J>8 #9AR(LLmKfJr}SJ'XyP1^XhRdvp^D%ƙq߰FnpDCILp*};~_}S}ZP)e gk/ 6O?._{,FDEV`PC#n9fS}?kw:oyo ވuI.7E▢K$τòeW4'+6\biW'~2P>y3w&f@}Pk Qf$XVր/˭rkv M4;y?g F*m%/I1ke Lmb,>Fe[0PN,g\gUCTuk#8 [<^mZ̓N I ;13#kuoН;.ǀ+h] w NObVgOHktF˼;'٤!37,@>oi+mY 4fv;xax&#^}{JGIN CG!]䪭1E Ӻ$i:ҒVXe ,'J@O .KPN -XKC%[1xQɌu2+l7ɜ kS:bVU^BGH:sc]${W;q?HvsXájOt$bB ~'噶Lo׭L=8cBYrsm h=/;NZ#[GӔy Qcr^Pe \sMJ1'DP׫CjUղɭ0|7D#J:X7v/I-7I~$6 ]T갂ܳ2^fA>FoWUlyYKv5pբ-}V1ۧ}ZTt6e"EikeFO煔ec]+4mL.5sQkVŻZu20Nδ\'\]C&"NKn睴|wkd[1rԵ.^sD911Y\!F%#)y\ٖ¹:!fשUl&B,: ,Pbafxds ̆<,K˿-5M!#GR!8xʦjsΟV%u8 8%h't4us+mgr/)ÊWDZ-3 sT{ʠXw?]s]< F(-SG+,T؜w>DV=V/ue2*T04 /9D')>j˖_'am=zڸ֫߯pJ~F; 7y#@[1<5-IU #SrA7?l3½M6 `+ #))IX\q(uyMI"u;Jw"ht[*}!>`;4:NG[0+֕')NQb2].cWU+8N2KDD>|Oj~Ӯ&>4 +LAŁ}WۺYChV1̘0z $w-WRXDXI,âKe 0c`.x9 a@$aƴ-G}StMغOWU"[L?3<+OYXRRM4c`,icߊ((W| cP+dZ2)%X!gI ò<: 2*bU*w!y4}c>A 7 3X0AFd8m|9'b)6e-]aB[ ŏijfT-:- k-7G9p]?Ue\fd1 5\%HFf,gΖ eh%]$4&5/°!?bNٌ:[#zKIث_b8azt\J}ni+ܨf-Wp)FRU@Vh bqۯ )N ɞ 1YmrgQ1 U٩؍UđI*:I|ưh璈e?&)an*cׅkP?4<],iP9ْj\ދ{B;*"Qw`;TASJ00WpN~ uVAUxI l'Íd3O )Yؖw;B.B~X +>lE5O[6+b.qO^ȣUôDϊ>eu/_E0NG6? 'd-J53&s BK}` l6?2ݟ+[ap27?3CdgNR+endstream endobj 169 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 231 >> stream xcd`ab`ddd-*(1t~H3a!ҏɬ N~/f.aa9Y ' LaEřy z: >`lxY.|{|0K3%ǔP{߷f*={Y+~W^W;Gq3~˙,d%׺?F>'XLNle2< @AXendstream endobj 170 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 397 >> stream xcd`ab`ddd-(1~H3a!Ə9 N~/f.aa9wER3 t|@%eg&d000031030`Xb|W O7։.^{qEEr@+PÌ?.}=gJ0;ߏ+/`ڹ%Uyr݇^˱vFYy}myPy˺9**3so*O,/klin㨜Y=wѝ;sVuwgpϪ?y[Jw[Uy|~7sh8Qp۴%_1gISgpE鳌lv*bV3[_NlQiyxrCendstream endobj 171 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2608 >> stream xUytSU)PH\ lcYS e&-ifyi$MrYڤIt_,P,#:"uPs6qfk+tTHaAZW(2%< Y"]~#ilꪂy109 L|j闦Le}~A޹ ܲҭ/̛7JmȫjdO\#Jr)TZR,ڽ2J7o+,ZK][TF)e,U(yLI^ TRT)r\+)RBRjY;$3Tԙ|R-)[rHZԪHRfU*TkT\pW(-U$X歇9jJ\J΅IUSe-ȕ )SjrW5)(wFV-H2V~%jZJZPgZ$9 dFlDCfWe0lUVk FiQI-,–al9VmöcobWu5l:CD }BGւ,C'_̾O&Vaa!HvF^IJWpt|ܽlJFDM ~y3 zAG

; z"alŲ /=+Ii|u-hpZiZ.,[ &ȅ@Iu'J$Jh$FKU-V)'cq1 C&E@is=} a{PsU_[^>&3ӥ34s3|MPCCm*Qo;1ԻBSLz'c6ZF1[q=A^d<}'fIV&8wd ms,wZ+5@rTv! Z1[lj[JIm>_BtNՁOLY ¸2vqʐ^%{f\A7|`= SJ/'$it%o67v΁ ݧ֬QDP KlPlJ:0g~!vy=F؛#<M.49Mv$E=b97qjnv=矇+ FJnۘ|%8gfcac _|L;r3OZq[]8 s_рu"{-0?ռ 4M89l2"[5Cj1 {ހ$mAv' ζxg)AUoYSj Hom6G"m *GkF+9-` 6Y/E\@?,ap\͑\sF4hV-BVp 5'QAr]zk]I >Nga8ְ9jmBg24]L΀CL| N CZ-m֙TC^5dW3zHof@4^o#hvosmp{2]ڐ2fOM7~93Vr|mM1ֶaNy jnV;9C4/xBnPh9fLHv^E5G||mt5cZ"7N{}yh)T0@5BT?' K/25A\1šύ?&DR1-S R4i|Pg, sdh H;!.Bvf!(h ^ 4]_K[>Ϯi-߃s_e>9g$Zb9 i?6j{iCYYxpQy!p|whO{o*\RaX 7ڷvFF@hpHo+NEWlIJW4_WW;c؏}pv!o$ l?NwVAO!s6{[aW½?r|1gv*w_v4%e]p* ((vBÀ}ʹ4kę`Y7v= j .jj2mv@0L8: Äs z--n9vw7tSDUB?t7^[[Q7=0SΓS25KsN=KoB7X'&K qb%65{L'3ۍ$dOm = Mf"pjf;iE݉m<)GXOD}}]Rx7'uG&OưMZ endstream endobj 172 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 996 >> stream xmLEgWZZ`LB@R,hUKDB*ٻ]v*Zj q4}/msTSKhԴ[eLto3 4yª[ RnǏ9}Sa"Jc%`MyYkd=DM1sNk-q#np7UHrA BO[Ho,"ACHaBP "O4=᪆ծXD {NEr_R^Ia KwxڽH yPFJX5䃚¾88KeE2V5^45kԂؐ7n$o8M㱨B kqAVe0*+<.ƧW׼, Ko[wXS_!"4rNZ*+y­eRAX*`50&8 rWXw=uDJ!f%,0 tneF%3'6{̾6Ǎ+,!Z`qqGW)eȀk⨉cn';r8 jJ=uvv/ٺk/w'65n5z?FMD3=gvBw.͓/7,>ưןيZU/?%?',&7]Gtcef9P^40 aɶM-sFFt]ڲL-1䈾[RXUU}pHd kƈ-FcFic(v6{*,:m"n zL#Kc'ϓE۩oFF?DŽ6GMq}zthbڷc&WtƋ;ӿrG.>8B6. TڒOEh}2]G 3endstream endobj 173 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 261 >> stream xcd`ab`ddd+*t~H3a![{GVY~'Y3u0w+^3&FFAԢ<c=CQ LV ̌,j}=<{D{3Jj7.4OcҤ8D)+=}I;3=*\[Tzus6NeXKuYn9.33> stream xX TS־rs! jZJEq((*Ί""afA L fDbjpxU=_վ +9>G<O7g8iM,oҽI8.|s̓95pRG;$^Ґ`mj496wEnKAҐ7(H n$!AxE2~YbccgfJKņDn냢1A{VJ"dnkAnGgZ$Ѳ do4 K#,x헮Z% X'>wڠ}C6g/`ils]1XDL$o)1Hl"6wb+El#3,b%G5/p"v8b<&,1N bI8<.΄Oy/l޳ێM}f;5'{*):/~Ğ;x;<;42iEPӣ3SHS52f}^)tQ:E 9J #zu. $CʔTDP󜬬EMͱ(5(\\*dEj*=p( LѴ|Bm ?/F3~ t * dr)gi3suH gY.XA Q9[߫ / ՞{7,h<` j9N4V`]Bs#71‡@xrFUA!PDơ0ݖ {Qƶ*B#I(g7;1@!0F >BZ+=ZV#e 9 0fJfn}_(x֋IG7I:{dž{R@eVq$D(&}G GҦru{ |Q3s ӺT`Nsyi:!5]_AGof$ S(h} ,Ġp!8`Gdps{ZO`f&r%օ?s7E1\h#(+L܎C)ծ['5Ktt;0 $ˌwUtU3!E״k&a~H劔EI`e RJ_)ݟp8p)c[zlMG7DLy26L۱Qzup0Nw jQQ{~g\0M^es;eiL=;JR@yuUb`0. eA3K2JP)jr7˗]?e6pU"K9>2`8 US_\R|8̛xw^r_F')[.pouz?f0\.&MwZe\߫ZG/HKM5 kzKE:T{5+޲RA+QWaw\X h]jr?~G> 4}7CFo٘&A!Jk\B\W%-z{0m5_BYGȳ使&&hoHMSUlZ'WaΫ΍_ƙ/?3F)ƀ8}'wlZkfvUu ;=Mi 6T&*jJk7lSdŢeq)hX$HU(Zb-/:k?I*d:JB9(%kR4*-Ay9CkS+ZZu#h.S,VF-A9:;䏧ml֋0f{~g8sl@()<MERQA⪰ q018o&%g$eX,qQw*oᚆB[[QkQꦲ˖WTrڪedhFZjAx~af` ..Ӡ dI H6<O$s?EmfrLd$j>*ɫԖK''gf@}ny9(5J[ 9C~R݇ւ3Pe"VoZrz ;#FJɫ>,&q|0h 8 388FĿ4&endstream endobj 175 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1468 >> stream x% PSW#< XSk՗(aPR*uCx!,AD#V@p$",E* \F,VZR-.V^^:.IV+U SE^ i !!`I*]$}RLOE֠Qs\F.F1OoPtbP%PKH1pI`} OQϔӾ(gj8 5QR#ϨQ産`b+ll" Ymm;!Sl+ޖuV -h, dw_[ϛnA7܁_:sжqes-JP'~FVlx?0LV q7RU*>퇙wْ `._ B…3Rr80ևᮕ~XV?HJi{;vB:0D)q+ǟ\i~G[ąv̚iԐX!jn <|\('D=FxN2H }-4JP{^ap A>FPWĭmTJ~_3aQc/pp 'Cݗyjv`ámUɖ>n~5~\o2%BA:_ZF+g>HRa*LL5ww+ &Jܚב7zΩAT(:*U2(#֏V-ΨC>=x_J- gʎX*;OB9SbɁ]F-Òs mI6Csny/hm+j-i JPeEĬY aNՆ'-5pMXX#ah7 )ĭe?;T6vAe>o>q9朚-YeWl.mzB,C5فXU={me8WSO/k:r*B*Ao!d`{9[>*Y ^ӤE|yAXyah!ۻr *KuwZTSĨI;!+1w -3Ū1+#L'_@䇝l1[&׈6Wn0 ok"~6s .1)BaM}.8"Q8tv9%ײG^~')Dm2 2K7l:\5>^O_"RkȿzIPяHL%qak!8~`UDnP ]PCaVhj6X^ͅb],::eR:T[*uuendstream endobj 176 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6286 >> stream xY XS׶>18{αzl38(N<&@B)$yyETpjAm-z{}ߦ}; mHcwk_a1p8Z][h1L`ȍCclya6'n!*KK G֏Màp aAޞ^I\OtYϝt oWI."/wM)pvMK$.cD2?x sY$"I;܃݃B&m&muws9=? b{${{PAkl{ ,$l =bs|J͏Xp%|tSVL+MFH(YK 8/pkmOږ?T&aV|qדy !s1(ؗWUW跊4'A'KEzue-nq 7$$~ǝyeꫠo} rihy 7`i(O*rرŇ-a㼡 o44 5Z@WpÃ]7>sy66l} b[ ̭9ZlpFiA]iU/4$]䡍|iH 5G*n4z(Zg:N~5yW-eDE+ A\4mB4ZA^ׯ &*Y2P'_ /b@:@I4އ_B/D~XI@AWp$ 6Fݚd^mvƅm7٬sz#q ڣhHg elPl Y { mZ$c|ݴ{)0||? Oes?4ؙ\һ}|Ͽ{u(=Į[h8t];+ dUu o{ULlz7܁8(v[@IT(vldaKԱ_z-Et391f| ,ᘿj tapR*6:[kyȾ켯:ab} kl`wKp+-?E$Kxꪽ*ab5G>s2 MLgz]ek c]˂Rf繤nMTymw%yUZP?'VÁ3=^pЂޠH{3b͝N}C JUY| (e3=tÌRj&4#Rܠg迴[ܯD ɿ}o{ ^ jX|29V㆖V&_ ?>^ 8!װ;3McC9tW%)y6|-.e <5ǛWb g/:hȁy-:3Ms6+ `3t[HC`4ߟ~'ǜ ^8}Ul H4V54֯zw߄Sb?,/5-4 &sf)PfSLi՛2Tu:7 SX33$#S#)JvͰ,`VIuUΈTuNJZȣsÌXf3g0FDJAh,@L+R6eJ*t9|ngTu==iȡ qd˙XYz@-pDjD<ɻ"&PM)`?Z_s?)όv=ӹ98'z%@I8%@9#jr+ޙ\{\Q?{/f"גݸpgD#а3 Zl C;\zöϻtthFw0g]:9oYo{`?*] J UYo"vމdD[ӽC߀C0|3T\Ӛb )Κj/h8E1؉b9c z+Ju.zrep?z"h>XO$VTQyngKl{g+k1ư̳SiBoe݀optZTz^ (뢍9 ddTj5zm2-SR\,~ K+5EtܹÎ;*~9N9T{\rzf(KzXt^!Ц*YkmG֩8E!هQ+:B-P0ig%ǥGl ^~9c2q&risJBvd85 q>A[f%@E (PǾoz)}-v:^9 Qx>_W}\Y dq#G{HĪb | }| zkq`}8,nR̨ȺI@onw[<0:RT"DAAh-/{:P>&{׸ r 7nHXƱe[R0gՊEUQCձ3H I޹kF9PyxbQb~ƫW"GgT1|upVwu;?3=$Ŧ 2`g#8I>}%cVoָ&*7% )?/b~X|0.ku$>Ln6řns?ۯ+{H>~C2kU z[hY _}Z[*lgno7^hD7o#oTzy-1b4y?s7p^ aɡ1}G$ivŠEG=/ρ:Z49 zzgOp8Y T4٢?qЖA>(?޿{VtSO}'^wAW՗jPD|aX5mrQX&e^v?B)!db~,\@P\u6M%.堮FRh4 S13qCO՛ ydU K+?%Ɋ*m9Ք0|&uVbbD35ɒ^Y"dp Zt45޿~ih]kc4ZEZ| Spd9/wtp+H8 TfVcK Pr)ś U&c_)q#U(w/pkpGcT eg+ՠǥqlx~{rݎmW%bJ VgT@ 260X$^r<K̃i7qDxh}ʴ򌄬4BRu [?M)1LjQS޽(fhy$P* 98z89՛kd"Ë @\bdt4/y%dv| ,9ѝE9| l(LILgrq_wr-uݓ*fULZmr&0T:S yk4H0z 8gY% Kb*4Eէ|NAkrFѐS8@B=0h: 2&BsIbmMQawFw01J{+鏟+zy W n;ԓ%_ Kdd \2kve`G~BfE-ޡَӏu߻z]Xfw˝Ͽue\_iaoBv&7aG7Gxʝ_U5 ;[UJ7&âg\ÇDV̟UjJ $@6HhD~ƦM"ɢ"ѡC"\w zU~mxg+amxeFaƕV a.װFg-U&Α)AA[":H$WUZBz :M^&2#&E p#Uqt>ñqVmf%="87@o_,Q)9ר6n߻{L3R*q^Ԋ3^ji`ݏvŽ60UFHB>YPwEӑFp- BiUIX ߻tM$0@ (u-m'{x9M\|Mg5f7dphY,|fѹ@s'fǰ 4npA ae_WXZu4@viO`T KJT'8*l׹ā0*@_m8c\R:;=+ h&"CUlB+D&3cY؀6ShE*KIQSMN*Lw ?&U 75H#MH\/o-簾*\3O3o2o0ap%T,g( ZdFg֦Y$ M3,uz!cendstream endobj 177 0 obj << /Filter /FlateDecode /Length 5070 >> stream x\moGrNG,^{w#NbY|MR#.KY]reY驮FZ/X<}.9ˉ_gb `H9 M^>OPqϬqTfbqrj~[-tnOƄ Ӹ0¹5^ Pm+`\ WgZ1\=lۆs>(w"̟CƷbm%%U6Vxߙw<>-ZsˮVeb= ۶U1^Ie+8/XVNxStol 1%ּ88p$)AB d֩'/|Yf邈TX:hnmUxJ:Y>yWÉ#QQgH z?Pd-~4<4TGZ?hb.U/QzȑQSTl=, 'D_{dGemxȱ|Z} 1JuN]cu.2%59H3JUJE7 _ܫ;{:^틓Ob{##3W5gMl̈%E9\) hZ;͜LM2f.&}<)`9#\QRR#WsGˤ5ԂH *>ŷÈɊ+ ؋u:[3 d` *1֪A5MwZ׫u01e+f_da Ekɕ(r%Y4d8xneף WQx~fiJ F,lŔ%.8/!;lGNZ60(fSڴX!@=ksT,8u7m?XBk Ff,*yrhLϗzrG./r>VДlj?,]Plqeּt?Ɓy80'' Ӆ_ OUUȢ( vg&- k۴Ddơ!id]1ZNQ?F`?QAVO)XT٢h>aKdHoYna#MV/R! ~5aFERHd>;tv|dr߮Nr4G+ja'N覣\hNCu%-69uYT)HVPcaxJ O֞vq}B:NWh9jRD>jAO{#*RlEF$Yp#+&Mnym\TV;XN;ݳ3+@c\VrX8F,wprL{8NyH5=BttmEzaW-APϹ[NedW}t=DIwq4)GZDڀh؃<)%I8 ,ۡO6D߶m{#='Oel]W6_:1m!-"JG[D֨mL | ,6vR3h .2x;C4 i.2lʫkTh0$ڢ=VLB nx] ,Fn"kvfѿ%]%,.jsFe;p%Kͱ dRدEp졻 %/*PuƑ<Ycj2ku&*3pvuR _OTf D p9=`e`FU_(_b%gb;3J+Okڷtt6m>Ol= 7 Dgy2Փv-IHw3Af(O'*o5x_;:4B=0̋ƛ%x;Y%Lڞ0imwhvyn"_en8/;?{*ԇp VR fcf -l>m+t0 cQUϷYZFOEFϣ\UQ \.03 q(5ߩ.DZ*- nQ /Qܬ=" µG(0X-mNYQ p_*YyځwIoO|$bTj,5Q_ږgGyVǂ1,H0G?4)vur6[\yI4F3HGx(rdQ|7\'y<>@"s6<`rdד;SʡJBLcNT>J gL`Ht^Hb#G*/ds'? a̩c8E9_B՞QgQ56&qRRw:=lg'vTl#j> rt=5*X!5+&'4s+m8@e Is$<%At |'@)7-h2ڣ֜0&"_2V^aʼntpkz$X E{%2L[/13 =n~*ZPJz%r; kׅ{0HRw'V})tC1f4PU̠QfrUrQ(a(_dV@g,pW2e@([*^TlZEf$ћL 6.4uʅ^WɟnE%w?<^~`qK6:MsfQ>G#pیr7T~=JqeBYGe>Yh4o&#fWYz<~XlVz|g\(o([ҫըTfE,K(wM7bOgL8:ciWn(^NB(7"(Rr+}3EBC9}&2䋴x_endstream endobj 178 0 obj << /Filter /FlateDecode /Length 3215 >> stream x[Is[#pJ=h%VU*8Ѽ8qŐØ%=y 9!*1u^r&6",o ΂Ӗ,RYFyRi,R)_/. ~Â/Tלi,sж-7/D2wY])t.oib) gV´ryY &ܮ8!es?<k"fuO,V5_i'^*H l&hieW]W20'nޭgyݬaJ\牛p%|oB4w.6DjK'\JX"9 yyi,nW'Agvu]s!}yO.BWj#'/%-ՙ,oj}y+JtQw߯~Te׀"~[&B幬a$)mY+yzWI !6F$ZrȒil(2mQnBYUuV!bcuˌ}-ӪV܂ S @iLSFqVwmYԁQP(<μcP|h)3lsxm^ 6˖ڴԺ-P@q\Fdg\ FμB_C=Y@cAD{:Li@'ʂpLɜW&8m]K]=td悋hL}*ɊǶm3-98X+K1l `&p;.:ȢR@0L*0F`x޵m-R`^X8@\:n@F?"6( K"av/4Fۼ)n=ﶚD_YĊ"afMd.t>ܳJ&$))iAv*}@m?Z81::#72Ǐrm01 DF/^f: юqKG[,M5@ڶԡS+"'INҺC_b;j.㰁co߆黀He!"!P [y8Zp fOF`RqdKZOZÄ m<}& #}V`Ǽ,Q\KH$'rxVNdtpzB,6].0qR<1K..Cண~!V+sEQCP:!'_TK`O 'W #xD.Vέg\6!}&Oe`ɲ3 Z5|tjt:3~PR:9k?! *,]N^4"R{{Rx0Š"2ϫ%NB>8(dU$|RI^$i%) +>VpN'h5S&Go~pxp|:bzɬ (,j>-x$/Z DFcUv,xt)Y'ZKu. -6F#=YCa|k|{"'a!\y'ԀH̼%5'rOf&hm"ƃC7n:[rdLIN]g5~NnI0p#~*M-Zl/!sQCpT@~qt{"Qym7JrRxbEWIR\rUkdI vZySk"o%;ҋ!ًu y9ڊu*4+=.)o |7@C-h{㘜bIvPQ0 G!_P4x]O|g!vln; ? [L,=ɲZ]5ƨ)]׆ho>!<6pN-WRعίo ׺z,/\՗2̊zQ.j׾@&}8Vg,P=j,F@ٖ{[aU35cFhGwIj`!#3 뙶~ϥ|3X܏Vs'@a{{"nNzO"4| w2 =}Gؽُ\sW2gr(̿ OWlN&3@ ?=|'qL\~yȆJ{yk~@endstream endobj 179 0 obj << /Filter /FlateDecode /Length 7223 >> stream x]]s%q}gG˲y S8q*_ުu&hK° ffH8F0%(#61d8d>э;".HhGv24ÙT=˶xMƆB#aَ:XLOs>& {fIN0nd Sa'OOY 6ZAA~Pq0Fo;RXr &)$0}{"K_ahXKcF'P)aFM]܀L Kq@xC 1@x80 &Ӷa2 N ؉O+Zc[Kx])yD vZݓ]W$\0"_\(w gĹIkt݃ u<"f4C̈́ pt U9D`{∃Bc@/7@E{2Ms,G;n  4Q9!'Oc W^&D& _o(hՅjo Ʃ.{h0a] 0]#RX[3C_'öc儬L=b͉";Z.ˆ4"F:q.[&A$v¨N!HD&]!Sj'_Xd,Ÿp5.0 iRǸI2G4;JYW!n,nbƸ) (tDfd[Xb0I !)f0nZJSȅ^*#PgaC|Op BAѰ5'9D>3Ǖ;q|4;p@Qe19 $s>:"Xc;ߙ8\n ]La(F`wVv8"nb!RזG}àuIЖ*Ѥ;pSaYvn:B YJr4i!58-7$7h3؍MC5 yIӌ BwF[=sF`y81[|7q2wO.PE<q<>SxB;XG$  f Ljj5Ӱ 3+XCU2IIi &B`s'`,c,`DZ({)iR *U) kmRkJHYvbQ8\fI&fWINY9s$%Mb"x&VJqL'0qODmk^aeN>TFƙէTȪjM:Mw\oBKެfvwޕ/ua9n(Id\0I,' 4IfsFz-ķf,fMT H }Z @UOfT~?Z*`[0sb\Èa\ Tf˲VR2$sUY ɳ:7hP6oh@C|#읔HX<-,ladYX}OReaaZCAKOLjK s1qB#le`k 2YH~N\I23zǓɩe,I\ "`y'F?tgw:_ZeZg&K |ώSy543;gmdߗϗzk°k|0*br0h*pݤc7Ɂߧ=,tX)_˺8`آ&[ :K,bfLdYČ?xӂvwjUL투awk;Z#vB:XW/ W~3:ѷ,wX 4цՆRJ9(堔RJ9(堔RJ9*娔RJ9*娔RJ9)夔RNJ9)夔RNJ9)夔RJ9+嬔RJ9+嬔RJ(墔R.J(墔R.J(PvhjiCRJ*eRJ*eRJ)eRvJ)eRvJ)eE)R,JY(eQʢE)RJ+eŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS :ŠS bPŠ(E1(AQ bPŠ(E1(AQ bPŠ(E1(AQ bPŠ(E1(AQ bPŠ(E1(AQ bPŠ(E1(AQ bPŠ(E1(AQ bPŠ(E1(AQ bPŠ(E1(AQ bPŠ(E1(AQ bPŠ(E1(AQ bPŠ(E1(AQ bPŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW zŠW z`~K\~߼ekL KĚ֠/bַEnL9<]!B7?>]];vECMV"Hf?\W?<~bwX]BoX*-k^{,!xwꊗX[g!ݜ۫kF0v^2TWLM T/@slXN@9n24]>ŌsHrwcޗ%ruWaU#D'WGʥv?u/i~$A`qEs,$tޙ itKxzה8@/f+xڋr[5Rl#2zI|uxw:)W{p2%Yor9by&G[؃VH=iu=Y@ 0~./m{9  X <al<}uayκE CxOأ/?v8XO@f)KՄR#\H!W": Vh`wM~9aL]OAN߶&l /{@fm_hJ@/fȹU[|po͇y}x&ǭn+g+un{ln{[0nKJ c5m*2xŴgp+,Q7CeMOASX6W_ʹڼߚZfk؈{IzV?t K,3(QSNBh'/oEj8>Y9dׅ7JL_o͇y5_Xy-;AB@մw-7ۄ[/' 빚;&ЗO `97'>/¢$Kcٖ 㒏l͉gjϸflP,tt8B`ƮpK6c;wکn% ?i۫PWBhTZKo]|Չ*RI Y|hj;8D-oIo2~@i~FZnuwsg=n7/X_Ms6=4UVb iT)C_fNgNwso~vވ}`ڈ=lV #źKeBFW+gFܧi@ac@j RSjiNzknӖfscimm-I'c,{ɧfciǿ"]}"4ss٭i=4[s)0*L~kҬ}_u=s o_5/>]ү?6Ew}v7/~TSW^j|EIYfa_B}a+ɲzن]!|-摽 3r񤖻ZWp͞vw]՝S,sg7*±^YݝyQ]>V:*b3"kcgS]U$ozZ[ںY[ka2fmAwS{f\G3⫼sbZ/QՆW9~j%5A~zXx6j_Taf[Wj\\ͫI,c{~|R.sg fl&zUM+5>*2(X3&?[<^O/Lm^k+\jtZR\%vaqתQKr4<[}Ǫ]3/kSE D3J%nl?7aB|FyZ=l…G8u^S]=b~<~K[qB玾}"{ƒas[d\trgZ &Hvkl+΀ ? {SXR{GqќU"o{\#'/%"N vB_mǪyZ_rxkLJ㯨C^5/S)}m]k~w *|_nUz]Jkeuh-V `Q]}d'PH#\jgf1x_*g%Z)ˈk^Ivep 80NUO7hm{8fi?w> stream x$V+[4ҞSUdENHCazYſ(WoOWW:ˉ_W`R8FIR jۓ?nOtFt}u #M>CS/yLpE}*UTfbocл 7:#Jk=51R9Sgi@YgJ#|o-92 wr":kZOuy 4Vft6NOz`8B"1# bmbP\4@8<@ _Ƿ9|j7o]lsy9Zi7VV?M tNL%|P\]?n kh_S#Қs԰\g\*\6v a 0[l`O&DؕU6SkpRasWy"uΆ[U1@sR;&̆{0Kk+ۆ6΢$ ;'q%`BwinͶ1L;pzS=̷a̻ :3E\c!EWnDvA"0FXc~ӠM* kq8guNZ8MZK6FTZr4 0iT_ c{72r(0I!3ub=;+e6 $kK *뮠*KH(0O giyl7;JMPZI\L-5,{%~߷ȩtNT֘N ]D(aR@;D4lQ7jJ-gi !Ll-z]-5tˏdpCQ}\[A(."v]LV;ZC:N6# mdɠ#7F 72Cv dB57>RO 3X؉pX]` _OAmxdRH:~ 8HQdnz`Ȼj-,-T3(= KnW1؞N Q)9#4¢C:lRSVm]@"͈~$g)l7 sYs[wNþPVOu(RDFPwaE$/㝚$ <)Pe~_'m 971z(9fztF0T$:9DvZRs=mC 5$Br8-ovqs4#5^c@_Έ5!3(~"ENygM"5wƒ{|0Xn -Zk@)4 basub8P\>Z^'a%t &/qFH߉z1̻di`&y=4>As\q^Xd@TYDP`Gq3p=onAϡ3g-F@s4e x`5P47R@;|,s.||gMU%1!4wP=UGtӚ=1Ƽs/L-]* &uCp@b+_]6!4CJ򨘏bZOzk 9U1hțxR'p^Iў7"dwB4BC|!Oe Uh,y,uN]tmdsAЍ7 qK:J%_9%#]MapE 7I;Kj~M5EV=X@GZ-R\ Rb/ >̄/E.*BYq}v5g{s}L!3C!g糓?yx{+V J+pQ"4+<]{3 !u>NIZih:=Gg\'IBRX2~Ƒ3>Gcc`\'K"lt;vq.0o@=]Z~- hG<0x],Ah_iq9MS{U@b/:6m4!#"ىu(pcj]mnj6j6`Z0\4! !?ZyhjbwERmm^f! ȐE ،aO?Ϭ};Pi'G= :tar=5_V'(_Ũ-x&7gj6o+'mjEm^ls['g^,w`rCHh|SEaJi"Ê̸(h*@ d)p[;7i )oMZdbj^"".9E}[%J*XE'TZ"Zm"φ >TQzZP16t"`bPNBYjAg\mAz!MH[齩GlMz[4'gq6TčI<2LbZD hAIejU-)nʯ(rI (&qU2PdptD'13 UU8`3=SDyIBh_ҀR5o,ҏZ4H4(T,T},}W*"-i:#qQGZuܭ?TEC]D]^"# \ڼ͋W_mT-44t?#jeCI9*Ǵ{W|p#K|_e~>A u|7<9iTM[M;^ m5t ]x ur],0xt!pH z&&GEa~[$o__O|oLEGrHC9ROuYZGB / q fq ]T|ːF &#UUeCU &Q11ǒŀ^#.1Hk9Z]~7VY*M퍵^W{uW1"ޚs <==Re^q,bmGEa7Xh^d=G0䚱/ƅqC7!+"'È= "Y63k 94m*FrMNHTo ҉K .j 򳉛BS:K%qnR 瑗e,1MК.46,SR^GbPt+d}A+<<S4tn%t-g1lRaRzR^_j^*N*3#owUjajt64ˉ槚SfgS{9sKorp/v>J2iԞ54ǚ鉘 )(ۦ]MP B={!Rֵ5PW5Rbd)4+_Ŵc@Z){X.N_&_;[H\ESiSzIdIe5%t]cfDAvwZ؊>k".HP C4CVY29\viAh(kRy<{v_>n=:gspGEu /:gjwKB$:6U=| 3iħvB:8hK勴nsXY- ޔ`DžlLɱ@.*>&YT/HGWM-jӁHP4Yɽc3R)$wY0GSHT< cƫx!<4KWϩߦ{=VAFK 0tN&nkb|K?3Ѧ}]?:Q`(ԀҋoW%Df=n-~'IPY.TX; 8/jj:vm,)BKP8LX~KP7Zg @؅{ϡ97?3z ɯK}Zp9W6ZCkҞDs8%tIػd=6D_i{=솻0XTqO%Էao܄WwHnBdV榗:tn{{9jieXǺlz ,TgmYU,"Pd0Z. V͚EfWIgT lqC/Z2UIMO\x1{#_+|/?c{WHwˌk6WbSI~f?~Cdw-JhoͧeaV6"r?hilendstream endobj 181 0 obj << /Filter /FlateDecode /Length 6770 >> stream x]Isu##ps.5am3^D'n  bf_de̮jb8#[15 Y-^=Ogq3u3i!?,g6:/spK43>Ekap3gVMV?maxMysQGR.d^onV y mf'>WR^>9Ǹ9SCLy:'^t;.x2z:7OTCo} S5<9V[kd6oјB34|\Zv'6oᓙl0!A9Z/7)SPzOfQ!y;*0l=2F x%VŵVȦ.&#C,ج߉OL~p.r Dȡ;>t|@1rg&V hDВ1%>{^٣BqFTrD>﯊@ljkcנQOT Rd\#t uIWߌ FP>ni X hUf(̄]pzU fU /AmgmZݝ46dS^tSsjw!?dFkv1H`J¦y-n3+BxbtOREVgUR-&;:{mcB4.J0O1%:Mݒ8 ]L} =Rh|^,;-_Jل1l҂Wd;`԰au&5JqD/F =9Eɿ}oe3pj.;:!B(:Dz8 вc m4FRb'UH!sVvWs%kϕ܊IO秐WL\DoxV02)h]co;ϝG%[wJr{-"i v&m:DDpFbCZ*1qfDJ7 e}  o x-N^=pU3x/8#t W6Ψ0^~sս%܀`1Al$AcľY&_:_ޭxZ)]QHb^l0I=L;rNþƚ2)VƇӬ\#gunŶu@-XX0>¿hwKrZ#3ή]Y)lg/g2@E?qkŒ[]t .e|GѮwx/?S.m09=u-o-J y$ynid_I+da&IP3g-ࠬJ eBKʝE V†]OYT5!| nPs$7Toy%l-e<(Ѭ*I ɏ&*O܊$1zǑ=3k1@qftejjKL UV9gKT|zk]ϓ*~]9-@jWje[OecKk@5MNmfNTT]dm^l>}N'm'n&BKXkC8IAaŜ.i3,H|b&Hɮ'd7oc};-)wDI 97>ϐsܷ**g,6Z;B-5euo_H `( B,5ivVo.j;xkԞK=`D 5շ|x\masY}^()Q`c ls3u'- dJ@gte&@x='-R0Rx춭l+9<ʬYp /?{P) kM 5˿cZ.k`RLn9"Pݰ `qLmX9˲ߘn7͎<ݫ֖+toswpNHLu ")PI\OP{˻)EV%e!.3 Ӫ[06 p&Y6ǂ{8Mɛ儭|sǓ)hp?A N |/%I4="Ys^i#ą9}(ށ"@HPj"o8%bN*+LP"%$,^칝zEXGEţHQ YV]!%PnjZ &nNjnF{.}/L~.o"=025_IH&p׿j:rжtݽ0ưO # d&nÆ0!jdB :k ߡr43FQbRKh [A4r@fn9e̪2m4H\`ps[膠%:wa vq*^"Ӽ|O3Dr{81FhvDXZc$7LͺNbe\ 3EF/0 fx)n ]+dU:] n$!-}ulCN]Xv!XmR*Uc-})1ug;>dq|NDdQ-<ۧ#!ew·>{Ǒiũc;b~x.G"=T,C;'&vD> ػPd+/ fWZ0`#dLQ@r$2r!>BG~gN/@qxEV,G柊U9ǰ*DP2~Inq)  CC9;Ut'J 22<ktg HJfn}XbЇ|r\' G:A /l_:Rglj5vGZqn.j=OUdRfKzڹ]euMrZ)='$f2\Z|^({O̳VXcs"%?pb %(l$7M>oƮz,!bIzAxnUqhx=Y$mGݍٛUc4KH :ڢb/OY~/|:Gwvr5bCr+#OXH("SR _̮%|' X.w9ׅv_o{/wG!D%?nd|g@Rs7\ Jd&[l" 1%r@Bq2׋.>LqZ5,8쳺8ikq#:I:iP4:ˮ~_(4_/u5 ȥiЬDvbW36#.%̔wq/l!=D,͛n{_z|(GMX_p')6&쓿+ჰd6Au C eӹb#p,ASAlC(%a_Ճq9^; j2CՇ2,0|j"Ů:q>Cg k":tT.O޵JwYn+p;eU$A ̧ZGXJ~ֽ*T+9,V,}+) v |0~i_ljVx8^_ԑ~l.Y w;&/d{?oY>GY^)k3^V:šqmC;k!Qv}nƟ.r&MQZ]+%g~@&iL.!a'tnNv3>;dzt-ߓ" '.:yx] ^ov%Y J(5[~ɲ=2$UϲuK*N^ v~q9\Nl܁-[?l[]Zq݈ xB -HN$b a5L }-<% t< ÜI H-=Hfy `XQR2GUP"/|ZO]Z-8~n9qbl=OQ.5{_uJI2 ķ?5y;<ైi-@EtUǹx|X]CTebkߍ#BHc6&!A`d\ i_5'z\g\ɶ :@  @*G [#/iZ`Šy}W aP,X\VUiQal햟[vG|lm]w+5_ZaC\Ǽi]>p@>{ɬ6wUPݨ!ޫW[@_ip;oOH//kD؁  ƫ]rv:©r"VԶw=X%P|Bnd暧|)ՎER:/ >y\H_U29=n9JI~D7O%kRLnZ}C`yWAV=?>Ǒ4Ϟ]&80b*1ƹ!O./ܕ⯼_T?>/ bq^VU^]PU 趭upczK%jjB vE9ne> {Сuu\SHQԮf،:p;cM937µ*d˟vȔʷ5X/XK R]31'KcVQD_FƵXo9taĚ "[.W_dgRw> stream xV Pgq`DWY:k6 ^xĨxOM`8`.ek}̉B ʡ5VqM&ACy=[m ٸXڭ}'\QDŕ7?aD?L pvNF/WyIxPjE=:. ^] PF^?eEZEPʇ@S4j ZFQ˩YT Q'5N,B%#$ +)mwwz\6FfݡЯ1v7//s_qq$<q+/`wy"hIxV3jNc$Vu +X/,!~`XմtM4r 4е3"YdǮ$])/J^XzAu릢 ʹY)L22>UMS GjL0CpȀ.{=rCdʠ(S&d20KȺ\y3d+gC90ʉU%/k%b)d}Iדx$Lwl}3<g c#C4m^{ˠ V-^_[{ wXx*鼄aWRQ"ڶF ̼@E稭mtq̱7~\8M6́̂5v"/u&&fpJoJؑ ˏbS譂cDBYgv.()<ߤQp`*=wp/_W$Fq)!vAԈi#NARIX&O"cH0e[qaDṖHQ08m4]ЛRAXa/.91M4 \_+z5GII6v2 \ !`©83;/HsS&֦``yîtX*4N,ueY9otYQ 0F`U/].o⬍m=pBKwٔ oA :/`:k7nm2f=NFo&ݻdss\œZ0'yBﱰ"2qO 'E rHc$>uh:F7٧ǎWsyݠf;յQKQNܞSH9 Q+'\3}RT%Oȧj?#ZXO2ߖ3@\**Q064$ŀw[6(Ӌ\j~km;"ǨC&+ͨ.6ͺ#*GtxM-_pmSdn.#=M ISy(xYz{-DN}?U 6 ِfї jjJ+,0C{MgJm|Oh lGJ6x֩}9G {3W1YU2p@dOX2{ (牵b%6?Rq IFIo䈽g_oGVNp7u 2jٿ[$v@x:>8 `T۹X3Bw5J_r_ANkӨSTGV/'\훧ӴІm.CT;Yef0[vWV`NKr֥AZj Tq(d:H3[JpiIVHװIEl0.2f-AQW'nendstream endobj 183 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 654 >> stream x]HSq׻fk1lע0İ(Qfبnmmc sfUJ3 ̐[=kׇl8;4aXtT"b4QC*zf dUSreQo6jۊ-0խaQo|]u:XZZA73QG[70f_/&<32ʯ4|VL,?ZPHٌc 4S'Y OfJQ\Ú;xjfpI@ЀU@yDB\qED2!eJC?iu>57CBRHۤI8($`8rzC玼( e=h tW k6ǖ#cd4%$F-+ɸKdKu6H Psr"O\ Ru^$պv-A8:-:n^OZ$3?ߒS0&Ba 1dJe2ԙ|cdT.endstream endobj 184 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1835 >> stream xUkPEHl0vr&v;v7)8-R$H0Bt%@ /)Ǝ ~ClIvdqz&nv&?+: ĝggݙ{ssǒ0ljܼǏٝx߈7%7sO[{ւ4HKl"72`u:qڒ+1rqH^ Ͼ}/<n} A=?O  _(  K"B.Z-k̖ʫ̳|X!6 *a%^ f:R!By=aR\W Eٻ0u(VbEX1bbװl#K2Xdl ?#'fqy lL)}qn ?́EҪmJ Hgj;Cg'i)T63P%c{gXf3JRU=|l[PiM@N4h=sK91PPDެ bmtg@tR3hV\AVyR˼(NО536 fԧ`M6z1Q2A t*WĿXρW/ID iw3`ϜZns(6z6oi4)((O'/CK` U:N+",ZEy ~:=:~{>ZEf2ٹŹdGo"5%a[D/h¯=8TCou+H$LU+TBmru9هFN|$:I%`}z%~tt:]E$4"Et$j`+ڂ eq򠿒ź!.LqvTxCI;_et23Z1r^ZPS'{& 7/s# 􌕒+w7§ .#kGoE'fY49v6()?#ۮmGm&TÚib^}D, -,e>+ٝ0>\C#.jn !.ecI)ZgZhQ/W۠P2 ƶ.8{J&],5E%rTӫ) _ (T񠈴l@M"L_CT I:wb 8 {מ;  C$lI <tSnK`< 3p(9'uU"qU<:=03&TJOUG$rt}EsF=.%~lP\_l6М6=njm79^ҸRbkdFX+- {%endstream endobj 185 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1847 >> stream xTkPT>ǽ#-ZsL x1Z  QDqUEXj!qw_ rQ/ %6ii%qڴ [{GϮIL?:̙s|<Д| EӴ2rcĶŢ-Ο"zˀl߬fDWJ*y|6w630y&%ic[LCjYYfIppt}!%٨٘lNӧ'CSAoJ33V&g2S&`Nlg3iMF&.9]q~F3LF>}ٯMk3) )j6S~TH%Q[j-EESXj#Gi9:JK6zb)d!r9+ϒ?TD)ϕE=Nbl--Vrōp'sK m,afip@ZU>N&Te[*KZe+p@|BN'L_%;hTKLjj so\B']$% -nPmo ;vne~ڐ'~ ~q^؄^2>9eua)Yd?~0ӯу'I4G?o2%ނT5D/Q.U Y:S?pX\Kj֒gdƒ;~ĺ:!<ƈ-?;:(ɼI{v):i Bq90h\MJ+`  N\&Ln*QNe V" [)A-%m W,p sP0)͇ۛ:$\7J__3dgr^ #dn$sJv qwdX 'H(y{s.SOKTlR!?;|ykE6&(1 L.՟u|!^0@ޜ:A׭=?|.>:W&*8lSy%~|Z]S ˰@acBmB+)g|?۟ov0fP/Yԁ7q* ߺmJK-dHc'-G(cN&:$\Ht':V 7˅kIY-]W;\'++;U)FِGܩ=˧?懔Acc Q;9?]~Xzy-퇼L'.@QJySK}zFRu󪆭m6"/lʵ%DEdg 0on~ `|}js<;61I% G~8qQ,dS'?vĿin{8}nqC]ik:1ޟy"1; =o}@H^4Bdăx>h\ہTM(?n/FCaS^L *Ɍ}Z7ăRB .sYJ$/=QiCiA6Y|qQYkW{o 9LҎ_'(>+.sS.'} wzZ{xOH:W^ HaH ,qtc܋dr?MҩDm`W^"-H;tu@CҫE)|:B5|Nl{H~.AGv_ܥ:i˷Gk:_ ~اuyp(,l]Zv/]y'Yt:][joo[[/>Z#ƟF݅%sqzz!UMuTTnRM/W)߭E$"endstream endobj 186 0 obj << /Filter /FlateDecode /Length 6432 >> stream x=k]q, ~]H{SAPPQ^VJkTkQw!gxȣZ;@ax?<_|g7僟g; P,SɫKy&{Μ{ٓwpK #M/7{!0C}^F &۽pV^F8{ =m|64R ϭK|wx EC>3MZ9;^hQtѻGMG{?;!tLǶQvo"s1h=W'GJN| GQ O ya1 K[J[plvu \4Q ߴ_ԯ+P8|fߟɿ=PQAzP,-\?2탯{9/kOIUO]FQxbB}V#xw 4BRG;^Kfn~Sc(q0 297ˁgY2&9iL9,kNEg$AAI_䥝4*_I Xn#iؤRM{%f~awO҂BD놇/{o C}M9)LvHOZ=܂[+<ȫ#:1>>Z2 8zJKXEh mlY]e[XѾL 6"YP~&@|j?KqE|O `ѧ-FsV:|:Xᢇ3q1 !/ӹYdȊ3wPG0`w/aϧ0_V¿qnxn+}zޮbDFt¸BQs]qXQaPąfBfPiJ M}^Ёh ڈp.:J/bN0>_3N{ yCZbwH{|!nBmjFxLx'=pTjzbeV$"̳|f+c2+(d@O+"&L#.)!y"vu{9?P5!iƖ1# gZZgݍQ dff6ȋXglI}~8|GO 05[HsXW㛦%->5!q*HYHjY0_h  T)fU0{VTPcVoRk7Nzѷ\՛-8+S!5$~ 1P65<Ʀ0'B8 x/[c&Fm'1 ׄv??dfTwߖVy]f<.3,P0X:`Y9Z3u5T|` &^߬"J /5%IwZew  v 0󊜂rn5n\DNrE Q+˸f Z ޱkxԁfae_ A#uBЏq4~- ʠp'غhVrIM[O)Lءy͠7YiIBbν$-ȝֶ%͑BnQv1 tkd>{@PʨMS ʇ%j=(jCFDB`vĠDUOn6PG㸈~.La5Xx<~TArǥ\y7Ц'9d}-XxH06y4 YhJS"84lӞ/'u$A #vfN,iypᓈ.g\lĈE_'"r_X*J4Ë+1˭vN03vgjP4KHhؙ]eL![$y*UҸ CD47uhp:.]X gV^M߃F 06ypL3&jCZ,oz:IOh@7cZaMv3~7>qB!cWK^7Cԇ^h3G 8&*Gg>3?҇jW(M+^O5L$(S39]xw|xo6e_M7K!ѻ)#ME"S_6$jp7D{>&lu{UwqB9o6l< 8nzKf 6hR P`DzT: et?S{t-5v\3t:$F"5(9b#na+ 8<@ZoS?At>cKE,nS(iޅ)i1uu^.GӻJCF`@_>[:<3CA)57Ms)cG%y݁8MƖ91h{v~ErB8m藜U.>a}jy. q`/,s4pes?'uJrM#S:uy~;b_U@ry+Y %gB79 <41G! ޶(;pTQK;wg&Pj;˹[s_FhpRvo -YcqYe aj3j1pJ % EOyoCKJEfuOcE^qf'If0rAkI\v0s S3W;THcCEjnYKbc+X)f<ōp 4ToT9-Ʌə [TcF|)DK-\N-a .knO|-ro:MJ(=EY{TBGAnbBɊ3(iuNW]7*,֥<-VۋebIܾ6U $y6#;D4(TЖfVW` FCy?gJr[Jq9*JB Tx;!喩c'r߹{U}6G=ȗ/,O6~KjһUW9b<Mqa[]WQ1g?%#*̺\ OȌ'x7"6l$j[vCY~RJ(;fmZcѤ&Fn 1~ZަHU9\vIUkdO<=Q1Ȁu5Q.)kΘ$Bbeb[eQH֢>$th% jYp1EDۻ%2h';%ŌXH%@DO׈%pM:>3ٽ!ʗ`ԗ;Ru%)1LiID4rl["]:)ii?>pnVd8RŚ^v=h"QZtU8ū\fТ[RV<5ܜaIrK浧,^і,h^W ̓z_B49Q5]r@0xv:lDq@>: TūeM}_G:PG/O<_]7u 7y*ay^d5f4}0H!);(6jI.&٫$wp-d .GvFLu]?$a-1".coHjKf4*%ytON:aH3;צ39XK<չwUl7n\#rsfZxt3Kt;szI 6$O\/(>1RnWOyi-Td'Sm\,T$Hu6ÆLYݕ mO5Of'kAd1,TRq/O/n>18.L>@@mOq[J8;~R"l Gߥxgf[V鍪ˁ Zg?ʝtV3Y|;ᤘU~ չ}^;*iSX"휘_]f`4Nțqܞ-TlBB?;}y$3 a+P ] 0ưyf %ݽ1 nu _eJ?)7MD)phB[{ﮣ_G:PGxĿ62uwftmZn+ՐO&Oog\=$A2\ϛkK(gXE7Mn2eȂY3<%gTev\^K cbbrҘ)E4J@dFbxKA B'*0"m"WU =y8) VW^a^_E{1`tHlW1&ޫB+#zih4UQPo k8Gɡ$X's+{cd^&lLpO@>D[ %/|g eW&i,%ݦNR6?g5ڳd:kL4ۥc7欺ݣLiqIE6KGV`ިgy_b]3\cXx瞹CȲZ OÈ:]BO|תBIYJ= l D&B >X,mXJ7\yߵ]O-G0KxcpPFU?]jz ۫V_}>ƫj}Xo芘՚nu$fM#d i?l𿴉߶a$Nx|mga dw?UjkdvᙠO*)nWfkEFDyaEiv{rBˮ63'2 ]?:nV~HnsrjXo4#9$N' FZp bpn =DU[q„v]xM$<>m (h-3yJmmg]'1#Il*P3Yd1w*ocĹpBg~ar~[Gcß5[uat=ǘRZD#2~ڿ>wCY(l~xNʦʊ0R"`k8 Q[&h64{䟤͊h+4b# &\ *[\p{l6%_0$2Tߗ\^UR_#@Z}atPE8`.ψtAh%͑V'=iNNjC-IyVdͷ%o/wHh`=$+WbJYIJPs?9]۱]MCXY506SgK# 8!?]fN0A: c+D;j6hfMڛ̻iw/+ʼD^=֕ua4g9ft~&O*R~|em.bN7h* >ѧ=Qww`}wN_uőMl~NLE/$-< WeYdk:lywON<1\OiU!(q 4/~})}uD繊[emC8of\)9υ%1Z*Bq>> stream xX XS׶>1xPB VCS,Z:k$$@B)̄!J}ڪ[Auɶvɽ&dוּֿ~#b۶͚z3㦌^ 9uq˗՟|B‡`8xp<2t$%)YJܫ!,2{!˄ XQȆXir0Vߤlǥ$H!,JJΘ+̌K"Mْ NY-IC6 BBcX%Ml'HDAD,WdJfqrNJޒ-5mpY^^1$&~I0E,"1b:, xxG,f;Jc2o$1r7EPkO<OƘ\`qWǿ8^2yK'^\p4YmZUHL%>qe pPGdubد8, dt*jxg4jQT P0v /;y\s]RElNֶb@Ɠw V5;g`4 ,wOBXka=bkk9uPD|űs'Auϙ`9 \}M@h}@CsN~K_ܤB%>VT 7(`+6h ^t{#lt}krhvQ9rcDP@`q]i/7f,= PVht9z J֙.S~ ZphbTɀ%rVhr2%jgRK'pl/`b Ç:A:ǽS% gAg3NG9}^ &䰏4N= Z>D9W@.ɫ?*&FE `To@6&>hb*O-jPN6rST:n]vf| @_ jIFWHbj :5 :rAڮw/G=hPD+Wf|恝R/+U*@.~"zwklyi=}yhQth2ғڳ1LSZؐ i(QM6'HSZ=7) ASv;nM4VQQZǠH(Ҩ􅅻q3uk|9 }\p(Ȃ3@ p6[e'pɺ!(atE@WC槝3'8yܹќĎM O4!:a:KZPH]jzS7 ۿְܽ&[S",*Z۔ 9'1tg NY(4| 9TЖb3jÒ#?UsYtzc/lO'vCbzP5E T,TjfjtwB-Ξl㠎I8>/ăz; GF>h{+n%l>_>>{F_U{wjIa)WdTY^`4Nq@x-zTeHE6@umu=[%½l=<P/a4I T Zu-.8CIx6oȊkk6pPU_d$p. \1puNx\78i _ RW^C=dd/<(xyb\]" So:zn  0z}lm6K5X@5Q})$W-^%}KԫԾe?uę|nwn5ӤbI=ןii/]k=O'+ 'nI5An)l5`ac mQ}˼ zXѸd2呂c^lQwth1뼇=WW i>Y4Gy1JAa?Pr׸[-y8e`;G1vO 1MBREzF_3zSbMxkU $sX H҅ ^@UT Z,cMתڮVPKᶼt8U!SnjH@ʡt-%S=goIf{޿w1^W&|yj!߅曆/A%(3بNoVΪSYHK']nF { G(ym$ce=h=0`z*q" |!佌4'" A_kCzd,Z$)|na#ph VdF!^Bg뀐RYsG:O "|j˹O9g p? g޼'p"QҘfonP4飗駩K!hBURn!uX[#jY,Wnv:ah#28EzAoo2oaCidF+r2Y&='g Ȃd l2 {?&SCt:5( Ϊϯk-W~8IVŸ&]ϿC/BEv?Zs}eՠjeEbI)A1krk++m N;Y{Swn2SzǙ'jͩl/ n~g=)Gϟ}2]Xq*H#5Z"9x{w9##@?yswEе.L\+TxeL99+՛NPkA_%|,7Q&Mk鶺f|0\SLo{CQ/IC xd"inLoAwƇ[h8͛|4l :e}DtHHt*BfPG@[-wZ:*̰v8 NDʇ xeZAUPc? x_LFRj# &x2Tr37I[Q$i߁|x2)mKNI&zz:2cU܊rfDґQQ~rq?A?y,endstream endobj 188 0 obj << /Filter /FlateDecode /Length 5245 >> stream x\[odq~' xK?HRhyd2KάIz/1SU}>sCC٧_U7+1ʕoN񅌫˻1Foڏ.q4a ]ʕqX]DUۗG+3 듴7|(`Y?*mW/oN~r:A //D*9CDE@>SgR1g_y084(^?  op׆k ;5KX``{C='O^Xk'"VGwI?@b `‚N6t+sNw 'ro? bQej%F}dv2왏z|䴷z^< Ir,Q>×mi <(uTbrVurz4{6}?LgޑoGcMФ "Uj[RHe/P >҇]Si spc\aר -i_ eT!lf MDJ:]5m&Y됂 <%6YPh@6F9Ý_1G <,$Fr\0m' 9^xu^$dBNolLF/w_&J_ mx߆W]lG0}ACEhFͅ Qm2\}M5^|rs4m^![pեl xTlK1Yp݆}$4D E+o{P}h=m2RIv 2Gu*&.]$3xY,oP?[@\$ 7~vV^e6@\G[0=\=_]͖d RbْqNIKZ~@P=u邇 emmhqRǓIrˇ2*MwS?!_-C&1zY^G j~U嗁9DSq ?sx 0p6@@| :$%p=!v{Ġ6D37G7mH?υ Q#c Pl?/-uƔ&Ķm={F$ݣ{&_k}zN3P2fed l0 oi(*=}1;Π vx> h(ǖgQNRip!6Eh8K9Uo-)yZEӂiH4QyRY2*W"НԹG( 2ڑ 2dW^ۦnѲqD Auۻ wmx $5#؍ T) eqh6y4 3#R ͵'`.E堭{p[&Uď}/)ʵ}_h蟀c 䛤:U%S*[S_#0öĠZOM?f`)8P|6"L{R0ϹC:hVf~:Ǔy;nëQœhXT $܀e6ӢjWjEfξi{up_{Cu ';zz(kL'AMeՑoJ4xnDJ %(An.^QMu~:}C5IR?ds|y411x?qQc91ޛ:s} \փ=PbPt  Fk _/<]޴l/c4ص(5Dͦ!5DFl&kVUf"9GfEbӧB$㩫o&KCdWk%Nz6(dXj)]29)+ PT`UBlhw.[8iK6ySo;Uĕz8.Ū3ȭ{:^0(Ou4 ʃӦ &`(s+mif2 XH@E[xLNFU rS?=SWgاQIGKt.lDCd@ë l$I5\95spr(f`8 Ha`&:iea=PJ+ d 2bxH'z@`dI_.xgyYD_uP1T:!˷m CtUű !)BDfۤa]!M70ع&NpGZÂ,s %l˵ ֛>x dbn"iih[֫kw۶Wi(ۙa!;:YfAilIr"$&BB71zYי:2`*81>K0vl7Ը1i^ͬN;5tf4HQBGig0w +~ ʃ+Z5)Xxς^ ;%l 趎辎u]OuTt˩SotN)MdJrҸJB]ywJ'/ l RI6\h Knd(]i4 6\62rHOBs#lre:p,J)Ftc@r 8m89>1`ct7NxrM<BrzL>eAMj}lT8˰Is]MM7Co)/:E^سgEM׫$zۚuΆJa㎱#9{i>MJ:[?`̢5U %UD@xA@!g/-ݧX -Q}ea||C!I>}: S>%xY)Isu2~+nmYHBV. aȻ*k_%{ .,i:40ܖY[(3N# uݞHRxEw>Rd~I$4/?7Q`VGT7)Qg$ 9y8.]eXw- 7P.̛cDjO"~h.ӹ /\\5GPy<_a%R:-֫>Ơ?i#'>eR5y,dn<ʗy2z!X6rne-Y7mm;{xlc}.`_^& ;F+fBq{zen#=?`G_Mͬ6G 3x u9~u\:!w,&@bt[G_cH+POcR؎ cU]䀑ȩ޾&ܦkz҄QZI}=#^\ӎںYKC#wi+ouE&"ih_t j~ 5aH?.V 蝛ͷ-6K=oy[Zo-FaBqOHVK [BD ^\Z" :P4_ԺY[T΀'rԛ&.x sAO,i*gJQ @HE2= J /Oryuyl:4{~W՚jL }@XW\hQn"_K雝߷h]ƝAnp_Uog6ԂP RɕE(2#>fS\ˀgԔ1#'}zIYH-#zj(C\9 R<1Dq»G5šqC[Z5$']ܡ\]$bرW#j᫴`yf}Am:T]g—Tr_P`M3ȣUSpf <Y6<-Qx[qR9h-AGʢɆ}躟+c+nE,WUKE&O$Ӈ Kyvt=S@_ˠ//`]y ,ueju0 /BJh-ˮ(]MgaPx{IsT/ѯ5FMrcβ׼<]I"fk w_wyyKbZkC%!#>[00muzC@R:=B#\}. :.f~UEUmt 탓}N)2f Q4g? s٨kKC jMeys=~s|أFM#NW]pzITNWcZ!|5]&Dh̲0ِ`DkOOz`8ʽĤC -$DJ> stream x[m_!0r"/E kkt|[gp_ʛ 13 R?-9K盛_-rBo)rX.O/IJ1gǤ2ӛūJZTja*jZsfB@3>(+gsk}uz ýqZ[QZ{\E+!T+ BV8BYUs7ᄔEW$ra{V{o͎w'=ǹqNkMk%ZLsF7h^KLmZ`4hayZڤezOf z߳siZ(gҁqMu{z}ׅ^gY\Rg„,ͱirZoiqFY+%!jAYj FIHl\Sf-P4/E{x LR@-ZM\^\|j'DA*t4!0N\y581nf }XO#8 'ezJѶOO)M UK X#UeW:Z0IY Pm4W<,,'X §ԲT/`tżurywX(L뢿B;M;%U`THc׫W^aD:/W4sfAOVspڋZ0Y$H xn 3Zj#:(BG` U-S+j%V d%;ε߯jybHMrVCBJvTcv5zvep̸  JGK֛v,n^x;h턭cE!Ђ"T€ þoYApOv/M656^d+ј8fʉd?v(:g:ЉKJRbfxFoH,~ 2:w Il1bɛ$ⰰ`y q% wEt;lI,=lDfN_L&4ch4p%&3~Ua1Hy$7`%QC ūG ׏ бl /Suf!#6"57Ļ}h#zq{ *'Md5X2P9iA'%4LĹ=Wv8٨I$ޖQe. cV#3%MT5 V2ѩo{Pz1 S,9(|tro :O_LLߛQ!lQSu!bnQ^ a: u) R#X>_A-˞#E }ߡHVQ7 )JKQ5䞴)oIxc-sq'7<܍[ >y[3X>cNłᜩ#lo aMP[_*lfɪnrfn'qyD[oI_\D ֑7`<kwT}*斏ÃmWCd 0>"K34>'[UhGT4=b{|1C3  9Ec=яTcdo'%0ggiS-b;cc0)"d{2c+o2 c&>_"# iMܣ7 Ԕ[d-*c%:!2E48lg;0C`:z ?X7ϋLi}:ZBFWà ([ό4Y:C>"/be8ւgGa˜#Nթ3`dJ`GAZAeYc?s6S@X Ci[#Q{9N3VkJ=Ԏ̆."GŝXU!֊7tr` f%e-y갤6eo7q0DϻE&_D眬ȀQe* i/<Ӊ80TBzZ@;cezSlq:" g Ňpt`҉鸙+bz%RaWSsi ?Qئ{u9㬱=g'߆ E WPzhM*jKDW46|Ys%E%J>ypd/mZ3HIjh,| dendstream endobj 190 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1430 >> stream xSyPWˆ͎ŨH"(#F+AP `ACDH@hM`0Q43fNkF5slu;JUNą3Էİxv!+Kڼf3͇mm2D27xgmCM.N)0QU^+˯["c;0ΛuW\O 9ƍ۠]U"@I=ПL'ӃB~*%ke];aVQxo7u }4+8ìv{9Cn. "gZKs` ۺ>+!dL~Z~*;VRsMv$&>*=7pmYq Sշj(,1")>xp[RBh'RpyS/hvry,&\`&uS%-W8T-+jfK:m?cYR/>}GtFFD1Yrd7:H,6+@r^hXzΟ.Behްah;_4'F[N`V7[>({+8@CE-+4)q :OLppPWu](A>' a-6<4JT2ޒGl=`3/LK,gaV[l2lP[ˌ{ssҌOz<@q]IB-\| ] 8/h#y##U]vy:f𓞃vv}vc>endstream endobj 191 0 obj << /BBox [ 3111.59 5462.34 3133.84 5484.59 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 v:7ʁ*@KC}Wp+Hr4g I--x=^ `" .w$qeVj %s<וLb o g!"p_G+3&\L7Fx!9=A)s7~,[vFiendstream endobj 192 0 obj << /BBox [ 3110.01 5464.9 3132.26 5487.15 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݐ 0 N27ʁ*MU 8=;> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐM @ 9EN7'Y@ (X^im^2t[ΔP E_G"'wC&NV q\B9֤OաB2mVzL M9 дhXXːs/NplQ@pW.{xxiendstream endobj 194 0 obj << /BBox [ 3088.73 5500.55 3110.98 5522.8 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 Eqd$nTP $ʁ %j*YbBBJQ3-t#ހITɢ;4Bvy \XRzs )M1vrZ<><@KtԔUk(Oܕs~+8^Pjendstream endobj 195 0 obj << /BBox [ 3044.18 5576.35 3066.43 5598.6 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏ 0 Eqt$nTP $ʁI)iY6hw@ƜQ2GSA&PCd5 RvҌץ%ȉItd##'3vEoLWSJ oG$p4E r.?·ۿ =Jhendstream endobj 196 0 obj << /BBox [ 2952.26 5734.66 2974.51 5756.91 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐ 0 Eq{$nTP $ʁIUY?t !3F3*(w<oE0w ēuUI,ae(+WΑ7"iZu+UjC̔l5cIX:Z?z8C$ >qW {x+lhendstream endobj 197 0 obj << /BBox [ 2820.76 5963.55 2843.01 5985.8 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xPA 1 yAln@z *]+0!3d5rbp ThFEB!M GJAq@Lp(9UB]LL[$3+6~pET*CבBQ㠃fyUl{&*g| `[x(lendstream endobj 198 0 obj << /BBox [ 2693.3 6188.3 2715.55 6210.55 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xPA@ ^ oփh&փnl@fce s"ɴ'C @ |KhN2Ա`hg*/ P2?:8<Ѫmnj{h.[.)G/`ܗxA{k endstream endobj 199 0 obj << /BBox [ 2605.78 6345.02 2628.03 6367.27 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xOA@ ^ K LY>&&X~_ֺmM| Cfӱ2cj5L EBKOxb `8 S,6Fx].)b̔bSQ3 nVRRxx3)d\Jc…QW)'0.?w?=7i2endstream endobj 200 0 obj << /BBox [ 2562.87 6423.89 2585.12 6446.14 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xOKPs N}8;mbu}MjM< CffӉ OxrrC PFUvJG"e=s¡(;& XU9OU8% f8]B> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 E۱t$n Y;޴bCKP*7my3LLR}$Jx[WJBĥ;-|`RYuQcƨ*4 &KyA01wCN߿8R]= h Mjendstream endobj 202 0 obj << /BBox [ 2568.64 6416.32 2590.89 6438.57 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 Eqw$nTP $ 1$zW=+x+H0NQ;e .{@ @9F%CSɤ M% %JERPt7/EEǏ;63f5Qs1"y4M9+l 6zkendstream endobj 203 0 obj << /BBox [ 2598.52 6361.7 2620.77 6383.95 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 Imw$nTP $HL!'gǛ c;HR`d(j2X-)>:MdlB.x]+F\`J!u6\(B vj0cpYKfR^p+)pL _sf+8ޓjendstream endobj 204 0 obj << /BBox [ 2637.24 6288.76 2659.49 6311 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 vx$nTP $"18,U5p+pHR edNp18 oS44vR> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 EId$nTP $ʁq(iY7wL%`9SBWH'< : -&8 $ gUF< q$_*'Ѹ[Ge]aRh> >> /Subtype /Form /Type /XObject /Length 172 >> stream xP 0 { O`Ot$nTP $ʁqTڂYxӱ1$gj MK"%Ox$bLdq@IFgmH  .tFMde}k2Be5PK'դ X?"&\3cΠT9wq.?mv Oliendstream endobj 207 0 obj << /BBox [ 2757.23 6045.95 2779.48 6068.2 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 Id$nTP $ 18,U'QpMD!grTBv=^IT)6z*$ g<7S-4O)@Q wJ8T{5Ă蔽1SԊe=!P&܌O-<k\endstream endobj 208 0 obj << /BBox [ 2788.33 5975.26 2810.58 5997.51 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 q{$nTP $ʁi cӱ2ͨHpZGA @Zx%d$arg҄8Q4WA,(%irn B)c5c{Qڣ3Dwӻ8A`/lrendstream endobj 209 0 obj << /BBox [ 2813.14 5913.27 2835.39 5935.52 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 171 >> stream xO @ W`GADB}&Akk3cϦecp L EBhsNxb dqA27lizR":.$UiDΓXat.,3GA$\ |/Ն7 *X #tp>q#} ijendstream endobj 210 0 obj << /BBox [ 2832.06 5859.46 2854.31 5881.71 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐK 1 9EN;Dž^ߎұ'pє/X ;@BfQͨHpq# X5qAL0Y /}&QNXوuf╣‡F$9,1+Z&'JZͳM*ڔ{@4s0n;8` Olbendstream endobj 211 0 obj << /BBox [ 2845.93 5812.41 2868.18 5834.66 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 qw$nTP $ 18,U8 SNEBG;/E0f.1KfR⩘{(uL!-< 17f$8,< ;ǁ4=^<)NY<g|㦼ӏ?>Gkendstream endobj 212 0 obj << /BBox [ 2855.9 5770.41 2878.15 5792.66 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xPK@s NCa& hM :mM< xylZVw`LYQcJ(287"HK`8 qJ'FJ\D:r 3B^u`ӄITŠ`o>*X R4v|>{xk*endstream endobj 213 0 obj << /BBox [ 2863.01 5731.44 2885.26 5753.69 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xOA1 ^Ph_`nbU۬/d&3V7Jc(dt=^!LjԹv1RLe8`ŅWnϮ:P\bAǯ1┰8Ƴŏ;N Z zj@endstream endobj 214 0 obj << /BBox [ 2868.43 5693.69 2890.68 5715.94 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐ 0 ud$nTP $ʁI 8$g=x׊ /x eCkRɭ&QE&RȎC"S0D6Jm%SJXra1b9SHF1o*O3&\)3KcNYJK7ʹXAl endstream endobj 215 0 obj << /BBox [ 2873.04 5655.43 2895.29 5677.68 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 8qx$n *M6 cĠL.(2188c@b\šXL3fUF|LkSUjTxd+eqqF)zL<*)6{\ QIʆ/`wqn'8l\endstream endobj 216 0 obj << /BBox [ 2877.69 5615.38 2899.94 5637.63 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xO 0 { O`bI Q HVm ξM?2SUhFEB?w"H {-!ЃXqcʒ)iDffJq"W:62^5YèFAO+&`Rŏ͆ y<˿"n/`m2Mi`endstream endobj 217 0 obj << /BBox [ 2882.91 5572.52 2905.16 5594.77 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xPA@ ^,Kw&ެhMf@ 3p|S WhFE)i x LCəN# vř{,bV]Ⱥ]cCp'I pq(:U +ix٢.QuǪ}gd1O+q~8^kjendstream endobj 218 0 obj << /BBox [ 2889.04 5526.13 2911.29 5548.38 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݐK @ 9EN wօ(Z hS O\A9 G)*>x&QE&ORc S%ҀJ&X9ȓ#yD-\=T%20UQ$csLЦxg'=z8QX] O-< k0endstream endobj 219 0 obj << /BBox [ 2896.25 5475.84 2918.5 5498.09 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 EIc{$nTP $ʁI)m#}?޴ABf)HpiyX%rk8 F$JqP\<E9J@RSUp+Y)WU\͘xS|*ܓ?:8C$hO`ܕsv+8^lendstream endobj 220 0 obj << /BBox [ 2904.7 5421.57 2926.95 5443.82 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xOK @ 9AL2|N .<@т`]x} > >> /Subtype /Form /Type /XObject /Length 174 >> stream xݐ 0 H(H7-$ 8oxӱ1 MS".SVXY䒣 8 h Nq3JGNJړj}qhtA}M/u1;!%lPȶzgCݡN+=A)iO`ܕ8@`j`endstream endobj 222 0 obj << /BBox [ 2924.7 5301.58 2946.95 5323.83 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xO[ 1 )r~xEo L:3 ]h`endstream endobj 223 0 obj << /BBox [ 2935.95 5236.31 2958.2 5258.56 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xPK@s Na& hMԅw:mM< lZ1 wPBBJʙq#ހIT\JvAspJ5'3:RMeq4ͅ> Ql(UbP4aԎRHDV#&<(1oq3J! w%.?n%Zjrendstream endobj 224 0 obj << /BBox [ 2947.81 5167.98 2970.06 5190.23 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 171 >> stream xO 0 { O`M Q PA%$(oR*HLöξٻq|L&(AzluGG8"N#xdČBYH`k1xȊ(8*4? v*F,_`!Wuj bv~!>?f،hDendstream endobj 225 0 obj << /BBox [ 2960.04 5096.88 2982.29 5119.13 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xO 0 { O`l'H(H7Qi(ps|M'QpxM(G!%rTL[x;0*2E:hTíp"&Z6#I@k/7ҰHLW OTFh8'J3Y~#p@)8@p_#}G87 hendstream endobj 226 0 obj << /BBox [ 2972.57 5023.33 2994.82 5045.58 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݏ 0 Eqx$nTP $ʁq"1zַq8h$T+dF*:p1 lEH sH^3\I$RuM>0B`LOInQ29y '}; ځmw&q#};iendstream endobj 227 0 obj << /BBox [ 2985.15 4947.53 3007.4 4969.78 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐK @ 9ENL P (X^>贈'p1c׈ v/xrrC PFUvJVg|"eb}%g4RFITuR9SI#'R,*GRV{L(:dqc):G WTBo< Op#|lendstream endobj 228 0 obj << /BBox [ 2997.73 4869.73 3019.98 4891.98 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xP 0 { O`$ Q PA%$(oҖBL!8޵h"endstream endobj 230 0 obj << /BBox [ 3022.64 4708.51 3044.89 4730.76 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xP 0 { O`H(HQI(H;ݝozV !1u*9aNg<qHpABT&tҵСgr:!7dH]Tt(xɪłQmw/xdb0\,pѼjendstream endobj 231 0 obj << /BBox [ 3034.92 4625.19 3057.17 4647.43 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xP @ W`| A$$g Q{4g|lzq:RQp LL.JΑN#[! ^W'd S @ :'+oEHAce̋nQ;;8Q  q~/8^ݡj4endstream endobj 232 0 obj << /BBox [ 3047.04 4540.07 3069.29 4562.32 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏ 0 N27ʁ*@JC}߳ߪgcop Δ MS"!Oȥ8eG:&spG sa/R9Džp%f#ijW<9JܬxGԉzduJ1z1㦼ӏ_` iendstream endobj 233 0 obj << /BBox [ 3059.06 4457.01 3081.31 4479.26 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 E;vd$nTP $ʁI)i9ߎ7`;B4%r 3EGLRsġȔDx]e\)`f|(V؋Q+o(4LSfq1he]xT!j<A)i'ʹX@`/jBendstream endobj 234 0 obj << /BBox [ 3070.98 4454.76 3093.23 4477.01 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏ 0 E;qbg$n *iYNTgѝ CBY8$! jq!*miSIXшuD\*{ OUFb"exZ1*\RvEhW B<]}?0ihendstream endobj 235 0 obj << /BBox [ 3082.85 4508.82 3105.1 4531.07 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 E;q{$nTP $ʁIUY?8 F3;%t#ހIB@&R "RΨ8y׏J $]aP&܉uGk 2*Jf$g5Qs1"YL r.?Vox kendstream endobj 236 0 obj << /BBox [ 3094.61 4599.1 3116.86 4621.35 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݐ 0 i&@F90@@XBL!>śN\pxC(;-%TLOx0*2yr'0A0u]iH30S3MP=mjTYTVb]Mx$dX:j=Oܕsn 8^i4endstream endobj 237 0 obj << /BBox [ 3106.43 4709.48 3128.68 4731.73 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏM1`:'0qDDž׷̟'pAGy۵ E9Hht@,Թ "LH]}[IdYH e]QT!Fn ;FTDIqLY1bog)Gc70J~oGi6endstream endobj 238 0 obj << /BBox [ 3118.24 4827.79 3140.49 4850.04 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xOI0 ~c7 Q> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏ 0 8v&@F90@@XnՆ 1$z]8 E3%Zg|#ib8 ,f"7 MGgHT\uoF4^"fTcIXܿבWk %r70~,rahendstream endobj 240 0 obj << /BBox [ 3141.98 5056.63 3164.23 5078.88 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 Id$n *M{6D P61R(*Wp#ށIT)f?CTLlrJJEѹǑ9@* fZMQǔ sBc .B0tۿ=·jendstream endobj 241 0 obj << /BBox [ 3153.89 5158.26 3176.14 5180.51 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 q&@F90@@X)%%HL!>śNLpxP64ETLw<o$dQ98) z \kSFpgNsu("(UˌV!)jǚ(  +cWp=L~jendstream endobj 242 0 obj << /BBox [ 3165.91 5249.1 3188.16 5271.35 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐA 1 E9ENM`Aq팶T.>?i6xwP6ѻ(*g2G"RȆN,RrԘWiF'Dž3yp$HJ$# ]@j(! uxb3Ԋ:c gpE0]9 ;iendstream endobj 243 0 obj << /BBox [ 3177.93 5329.15 3200.18 5351.4 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 8vTBr`}B"18,qxL3%EG#i8 r '3DQ8 U6\٨EaZW0cR|23.ҪǛM*ڔ{ %r'0ʻ8A`/ѷk&endstream endobj 244 0 obj << /BBox [ 3190.05 5399.53 3212.3 5421.78 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 E;qd$nTP $P 1$_ώWp+6W2x& 4ߙ oD͘Tt倮͓T c`!) gMzÉRFpEM1USNpH%d| `[x/ jendstream endobj 245 0 obj << /BBox [ 3202.23 5461.73 3224.48 5483.98 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐ 0 'q27ʁ*EbIY~/tl !1CӜQ$J6 x@,̹#ͅrT+gR9 U +i dV3gLVIN^pqH:%^f|xRl JY;>qW {xQjendstream endobj 246 0 obj << /BBox [ 3214.5 5517.53 3236.75 5539.78 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 'TB 8>-%%HL!>Ǫccp T Ms" b dǘmv2%;*%Am(e8@^ 58T{5 ~Ŧ̓NQ+{p  `[x}jendstream endobj 247 0 obj << /BBox [ 3226.78 5568.58 3249.03 5590.83 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 170 >> stream xݏA! E=EOPiP8;Dž$&8.@'p?8 SRT#DA\p"Hm.2)aqT2C/^(jH [S6PBjhZm MX[^} )o`> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݐK 1 9ENG_'9.<ql \4 <6; L4%(2k|##\bt T |kQYԅ=q\8P̅#cQxOd2 *-ނ̀i: M1b3(% E]y{iendstream endobj 249 0 obj << /BBox [ 3251.48 5662.34 3273.73 5684.58 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏ 0 EIt$nTP $ʁq 1Y8 Kb)d(:Ҵt=^ `di(9R¬xn QEHY]yH0"DhAInvxWԎ+GT7N??-<jiendstream endobj 250 0 obj << /BBox [ 3263.91 5707.14 3286.16 5729.39 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xO 0 { O`b; Q PA%$(ǥJ(;w#;HL]ĨH(O'< >-dFPɉb2.$#J踣WIjAˉ2Jq=g}P-0ԉ̆O`o^iendstream endobj 251 0 obj << /BBox [ 3276.34 5751.54 3298.59 5773.79 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xPA@ ^ &ެhMﶶuM| C`rdp D39,u8oE0Pt.كЃg&d׺*Y8%w#0DcdRX11Nr2$heebYr3(e5v|>{x`k*endstream endobj 252 0 obj << /BBox [ 3288.88 5795.73 3311.13 5817.98 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xݏ 0 EId$nTP $M+ǛV`;(PCΔP YG"SLwbGAFꈛ*:E!0Wո"<|sGJ"k :x(ڠ3$ w~.?oÑhendstream endobj 253 0 obj << /BBox [ 3301.41 5839.82 3323.66 5862.07 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐM @ 9ENI;V \ #%M'&?P54-2p#ށIB@&wCcL5m$bA YE"e[%<MH`hS6eK .T4I\ 7Kjendstream endobj 254 0 obj << /BBox [ 3313.99 5883.71 3336.24 5905.96 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xP 0 { O`I Q HVm(pY~ϟM'&?P14u!pd-g<$d,gN8*`b䊷uT L16bq$OUWja4cb/36HI?3f<2-ZDz} .5Ij/ "k@endstream endobj 255 0 obj << /BBox [ 3326.62 5927.13 3348.87 5949.38 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xPK 1 9Al>M@t@Pp\x}c E㽗4$8S14͙Bnkx;b d7ǡU cLxkSRA R(fĂ'C]*ֵ_JYq7{xhjendstream endobj 256 0 obj << /BBox [ 3339.26 5969.84 3361.51 5992.09 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 E;x$nTP $Җ 1$zWDW> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏA 1 E9ENmN9q^ұ'pє7DAw>rX5|Q倘:C/A׶΅3BWY Ǣ DR6+/+AmHBc o^:Q_)F:!K' ʻ?l5dDiendstream endobj 258 0 obj << /BBox [ 3364.73 6051.73 3386.98 6073.98 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xPK 1 9Al6iO s\xAumG;U.$Y >xpv) 2Lz;/3`oFTLI1ʌ"Vع`c*ce6<Er)> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ 0 E;vd$nTP $MY;޴b؅iJ1V x& ,J#;>zPLх,u]qIIu4E4HYT#FIg΁, i1X D|ஜˏۿ]|j,endstream endobj 260 0 obj << /BBox [ 3390.41 6126.97 3412.66 6149.22 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xOI0 ~: QoB(pKW &A`'O:8RR/`ܕwe h&endstream endobj 261 0 obj << /BBox [ 3403.3 6161.55 3425.55 6183.8 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݐK @ 9EN' wօ(Z T:'p1cճ1w$g Ms@ԑOG<&#9N#5 sya g CQpG Qrm~5Aqp%ǛgEV)@)ka|㶼?>vtdjendstream endobj 262 0 obj << /BBox [ 3416.23 6193.93 3438.48 6216.18 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 'TB 8>)-HL!>Ǫccp T Ms"[o5x@3qD)D=f`|o:'|㦾ӏt=^iendstream endobj 263 0 obj << /BBox [ 3429.23 6224.05 3451.48 6246.3 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐK0 D>O`O~'@bGYp *!DYp qIFxM8<S64M"Lw<oEБE.wtԔ 'Nxms$=IHS᢫_/ɤCPyJIqO963;jZ~;|3(%  r.?Vmxj|endstream endobj 264 0 obj << /BBox [ 3442.27 6251.83 3464.52 6274.07 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݏ 0 'N27ʁ*@JC}{ccnp T Ms"ĵ8fF\ŅJ)VΤZ9 WJZf#f2_(j/>'Lw#&?b'C[)ڊ-97~߭lAQjendstream endobj 265 0 obj << /BBox [ 3455.36 6277.25 3477.61 6299.5 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xO 1 W`#qR?`%$eO$*Gc͌g6 c;HHL4gr GA @\ԢdLRx]mUs;DVfV3Ÿbx1>q qZp/"L9]3(eM]}?1jendstream endobj 266 0 obj << /BBox [ 3468.51 6300.42 3490.76 6322.67 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݐ 0 E8vt$nTP $ʁ6 pHxױ2/xB *L c -wc@ D+&(k̼nܻ#+>E*b1J0Ҍ% D:|x6l3u-=\A(q70~,Np jendstream endobj 267 0 obj << /BBox [ 3481.71 6321.29 3503.96 6343.54 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏK0 D>O`OH( PA%$( dfM?2S54-ERl=7H"Ȝz8VbV d܃)Kp*:sTIBnjPqQZGNfO#N%:8Af'0\~nuniendstream endobj 268 0 obj << /BBox [ 3495 6339.96 3517.25 6362.21 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xP 0 { O`lu Q PA%$('-%pbBBJQ3:o$dQJ8,;eE'K&Lg\PE*Mt1xiVƜXPJM7֊:jgK'ʻ8@`/Liendstream endobj 269 0 obj << /BBox [ 3508.3 6356.43 3530.55 6378.68 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 Eqd$nTP $ʁI(iY;t Θ(d: xG,4r3y^W(d|lr&3E!JWjxx+ZErq2&68|3xJ8w\~ k endstream endobj 270 0 obj << /BBox [ 3521.65 6370.8 3543.9 6393.05 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐA 1 E9EN'ܩ 0耠f#xmy!4g7dL5cRQ$U<xD,sܞ ѴeY1BbZXU}(ԩEGp1)ZōedyR)ZG9|(5v|& v?^'kendstream endobj 271 0 obj << /BBox [ 3535.11 6383.07 3557.36 6405.32 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xOK P 9A|ON .<@т`]x}_}V.0!3tl !1i)Q$8%ks<oE0e=5SLFIj4&Θ,(UÊ6WFd_]Hf+'7a^'6lZ?3byrQJJyGn iendstream endobj 272 0 obj << /BBox [ 3548.56 6393.25 3570.81 6415.5 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐ 0 E8vd$n J}};t1UER(ci{38F pARriPRI,:PaJ]%4{"08/=fTS,iʖ\@;?+ Mkendstream endobj 273 0 obj << /BBox [ 3562.11 6401.44 3584.36 6423.69 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݏM 1 9EN&@t@Pp\x}; <4|&oճ1w$g MK@ԑ# XYp}#9hvBN\r!.)r(-|(Yn>Xb2̓q'%f'|¬O3JEu_il )iPendstream endobj 274 0 obj << /BBox [ 3575.72 6407.57 3597.97 6429.82 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xOI0 ~N^črTBr$E53,2%A 1.J{{t$68:Q">).2Y,(qJQ"q-井CYPZ r^Io\5De!P ʆO`sѿkjendstream endobj 275 0 obj << /BBox [ 3589.38 6411.72 3611.63 6433.97 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xPK @ 9Ao~'YhAP.c-"dx佗l:qwPB-gJʅ<o$IjMqB҂U);^L"Xq MZd`⺡Ph ,D) ,>%2_[plQ>ApW{xFj> >> /Subtype /Form /Type /XObject /Length 170 >> stream xݏ10 Ew'0& (Hץ2 %߻qx$&SܶTQ$g|@"DZ ,*Jfx̉:ά${of#dRȃY/.7Tm3aY/=\!SxssOp dendstream endobj 277 0 obj << /BBox [ 3616.89 6413.97 3639.14 6436.22 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݏK0 D>O`IH( PA%$'H7؞M+AP̝rq#ހIT)$)w∏, Ơ qJhQr3p ЉbW͈oVӀP&sijăP+!:89 w\~o{xiendstream endobj 278 0 obj << /BBox [ 3630.7 6412.07 3652.95 6434.32 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xOK B1 9Al> w>@sC \4eLf51$gPFTmXY99N# ' IN9>Ս肏0R5Sas,hbÏ+EhGvdsjq3h88g|6Ga0iendstream endobj 279 0 obj << /BBox [ 3644.62 6408.14 3666.87 6430.39 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݏA 1 E9EN6M`AqLPH 7ATpzPVTEt3n}$!F)odyojM%3wz LNŻpaLr>h\W6QZ/L};);WI7J~Gn9iendstream endobj 280 0 obj << /BBox [ 3658.58 6402.15 3680.83 6424.4 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xOK @ 9AL21@pg]xAN[> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݏ 0 N27ʁ*$MAbI~^;(P,%ʙApWG~hendstream endobj 282 0 obj << /BBox [ 3686.71 6384.15 3708.96 6406.4 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐM 1 9EN$& w  : (8.xMBϪK=Q14͙E'< 2Yԫ]˚$2Lj^"F6!ᶾˏt=vSjendstream endobj 283 0 obj << /BBox [ 3700.83 6372.03 3723.08 6394.28 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐM 1 9ENI@t@PP^ߎҙ<|!4^(PI,g TB~=^IT);>+EnH:,+TS.yeać E /&~gVL\pv6EhS6F\ cW-k@endstream endobj 284 0 obj << /BBox [ 3715.05 6357.91 3737.3 6380.16 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xPA@ ^Ba&ެhMֺmM| ,b092y8oc@\^Cl M,SP:(G(ꈍgX- iHbP4-4FLxT%*c h h{Jdjendstream endobj 285 0 obj << /BBox [ 3729.37 6341.7 3751.62 6363.95 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏM 0s9$9κE u-i<$|{6;Hpbh3% ܖw<oE0%w I F,x$+G2BA+[`_ )(9vSr^ַMz8RVO`sѾgiBendstream endobj 286 0 obj << /BBox [ 3743.69 6323.43 3765.94 6345.68 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 vd$nTP $ʁI"18,U5p+pHEQ%grdL</(2c XqqMdMD)\Ser2WE*”/f~-Å~ 8EO6DhC BY,:!⦾ӏt=rjendstream endobj 287 0 obj << /BBox [ 3758.12 6303.13 3780.37 6325.38 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݐM @ 9EN7'Y@ (X^im 7t[ΔP Eop#ށITɓ;qġK+LjqBOUlՐ2yX4FLRJf8&|x,Zǜq1 .`-JX@`ojendstream endobj 288 0 obj << /BBox [ 3772.59 6280.73 3794.84 6302.98 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xPK 1 9AlN@p ʴ \ᅼO91Oe St'CISX%ZP| *'J`'Pc`*hH4<FFʲRQmJ+KM=\KR6LpH _+uqq'8bkendstream endobj 289 0 obj << /BBox [ 3787.17 6256.33 3809.42 6278.58 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݏ 0 Nd$nTP $ʁI)bqY~&Ā lJĨ98 x LCΆ}41PT/J I-hf%E)-OCH .Ղ|¤BppWGf jendstream endobj 290 0 obj << /BBox [ 3801.8 6229.83 3824.05 6252.08 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐM 1 9ENI@t@Pp\x}3J<|4^p(PMʨʕ> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 y9 qJH QOBI[$&XcӉp(=zgF U9SsOx0*2$OqyQ5PV2)r qk(*2YX94z-d5.=&6E8| .?Nm jendstream endobj 292 0 obj << /BBox [ 3615.1 6014.65 3637.35 6036.9 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xPI0 ~: Q> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݏ 0 8?=7ʁ*% EbI>ۛ#;x'L1U3G#Np ld Xlx]W4a$Xޢ/ޒ*gJAVglB[\4Q)Q72B3 r.?6\hendstream endobj 294 0 obj << /BBox [ 2847.56 5266.54 2869.81 5288.79 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐM @ 9EN'4ɜ@pg]xAA]x}[kdBϪeepIT5GH*dX=zB؈;ʄgh2l1rAa*)J0㥘3Bq ģbbX~;|2E6v|fx'h|l plxendstream endobj 295 0 obj << /BBox [ 2362.82 4799.04 2385.07 4821.29 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 ;Ng$nTP $ʁq 1|߳U/Qp'1e x& b3'F"e{s((:\H]R\ 4$]ƬHcL%5%^< j566GP2M~`[xHj8endstream endobj 296 0 obj << /BBox [ 2050.76 4501.81 2073.01 4524.06 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 171 >> stream xOK 1 9ALN@p ot \4یA9 1*gJqLLѤL\RrhJR,kO5;Q: qn+m+9.`3 .?ʏۿ,=#Ah> >> /Subtype /Form /Type /XObject /Length 71 >> stream x241TH/*2203Գ4Q013W02233E y\zFF z&@L(+ 'qendstream endobj 298 0 obj << /BBox [ 1814.96 4307.65 1837.21 4329.9 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 71 >> stream x241TH/*2203Գ4Q013W02233E y\zFF z&@L(+ 'qendstream endobj 299 0 obj << /BBox [ 1823.97 4337.32 1846.22 4359.57 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 71 >> stream x241TH/*2203Գ4Q013W02233E y\zFF z&@L(+ 'qendstream endobj 300 0 obj << /BBox [ 1880.18 4411.64 1902.43 4433.89 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 71 >> stream x241TH/*2203Գ4Q013W02233E y\zFF z&@L(+ 'qendstream endobj 301 0 obj << /BBox [ 1961.87 4507.85 1984.11 4530.1 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 71 >> stream x241TH/*2203Գ4Q013W02233E y\zFF z&@L(+ 'qendstream endobj 302 0 obj << /BBox [ 2052.45 4608.97 2074.7 4631.22 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xOA1 ^B_`nb۪ݬ/PfY n8 Ed:x& ԤVXI)jue#d)IÅb9Rۛ<@ ~ I/_, ޸1}_"> >> /Subtype /Form /Type /XObject /Length 172 >> stream xOA0 yAh4m_čqLBqd@ِxecenp T5BEB%;p"H38 N*yyT҂$:H& {7$h J &v1l@-{BGTq;0n~~[xhendstream endobj 304 0 obj << /BBox [ 2217.46 4783.29 2239.71 4805.54 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ 0 37ʁ*U 8$ѳxײ1/xȔ M)H@,,qS8 ™R6*ɼPD4JQFx]q9k&JyCzʘsKV!5c֣cv,S.tp% x(cWp#|CkNendstream endobj 305 0 obj << /BBox [ 2280.21 4845.43 2302.46 4867.68 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐ 0 'N27ʁ* 8$ѳxױ1/xg*9SBPȭ@,,qSpBh9:ER.$O:RINuhJhzk) D7,KG=:'|㡞ۏt] jBendstream endobj 306 0 obj << /BBox [ 2327.07 4888.66 2349.32 4910.9 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xOK B1)cc;sυ} ( oO- I,6Wԝ lpH" ׻D)#8?L$#)JOI:W)I o>xaTtGe NV z=aGPr\zN?\ <7iendstream endobj 307 0 obj << /BBox [ 2358.83 4914.18 2381.08 4936.43 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݏ 0 qd$nTP $ 1|߳ߪpeʆRmyoD,J#;Fߡe()P̂> >> /Subtype /Form /Type /XObject /Length 175 >> stream xP 0 { O`ۍ Q PA%$듶-pHg_iFp)+L)>NxH-BG,ĆҐ ^W-\G,T uQqW.F)*2FEŁKƄEmQs?:8P _qW {x9Nkendstream endobj 309 0 obj << /BBox [ 2385.38 4921.95 2407.63 4944.2 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xOK @ 9A̯9κE ukQ.& \A9eG(*g ^{"G)3riгq"B^+i~@]PP fŲD,(EPoxwPh$7~Y~[xhendstream endobj 310 0 obj << /BBox [ 2385.89 4910.39 2408.14 4932.64 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐK0 D>O`쉛'@bGYp *!DYp}BOgyƟMcn=NhR;{YZKO|*Ĥrl5L*uReFyU8ޜD1sKph^*\CA1f,W8$تLJbbhLArIƻ.?Nl Xjendstream endobj 311 0 obj << /BBox [ 2381.64 4892.49 2403.89 4914.74 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xPK1s N2-ĝLtM^_4cGO4>Y\ARarEfTQ$9mt=^ `"-SWP=e*ώQ1 \)(,d؅jmxWLh8(,wܨ)+VcO9ES6=8Bwq~'&kendstream endobj 312 0 obj << /BBox [ 2375.25 4870.91 2397.5 4893.16 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xP 0 { O`bǍ Q PA%$R==V=+x+HHLYQ;LIv=^ ` 5.B͈ ](D> >> /Subtype /Form /Type /XObject /Length 173 >> stream xO 0 { O`č Q PA%$('- s|M/*8>+j̙ C`kNx0IȤ&'FјR@] ^IdE-ν`#;0Rf#;6 o,:UAWw@'ʻo5Gjendstream endobj 314 0 obj << /BBox [ 2363.49 4824.05 2385.74 4846.3 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xP 0 { O`bI Q PA%$(Ui(ppg}M8<2SUhFEB'< q@bN:j1^W $s&qQp>ڰH&+M<GAղXR,-[=-bO`y]~ kBendstream endobj 315 0 obj << /BBox [ 2360.57 4801.19 2382.82 4823.44 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݏM @ 9EN3M'YhAP.SulOb2|$oInpej&˙U%O</$ȔBJ vPsbʢde'2vr+B)K*N AfZ+>LwF"Nz@=(K7~~[xyhendstream endobj 316 0 obj << /BBox [ 2360.57 4779.45 2382.82 4801.7 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xOA1 ^Rh_`6&]&!3D;\! E9c\3o$dRڝ ohzaJ&M.ь,]*p#!3- NF{%Y/8lz8BM u[gl Miendstream endobj 317 0 obj << /BBox [ 2363.54 4758.89 2385.79 4781.14 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xPA1 ^воěltMԃ߷v&C)C`Ջ wB`ʊS"8 0IȤ.%:F:RCug',L0SJJH73~YLZ1`LI7!jC |o1C4q|়ӏ=ijendstream endobj 318 0 obj << /BBox [ 2369.37 4739.3 2391.62 4761.55 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xOI0 ~g{7ʁTP $ʁJS$^!ƞ{v+'LEQ}ΔPG,4"OLRPSH İyQXao(-M_`/ #6^i JV=\S`#}'89i> >> /Subtype /Form /Type /XObject /Length 174 >> stream xP 0 { O`Og$nTP $ 1z8^l !2eCSwJ(2E[{@ @)D Gђ2ṝD* R&(熑5 3f{" BlM OEe-?8B )uq~'k>endstream endobj 320 0 obj << /BBox [ 2388.14 4701.19 2410.39 4723.44 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݐI0 E>O`<5 QJH Q\PBExӋ rʎn)QDU x&QE&R2SQk%%,U7fXyuv2kΩ4sbQ8vHdj`q1g0J$we]~ @izendstream endobj 321 0 obj << /BBox [ 2400.11 4681.6 2422.36 4703.85 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐM 1 9EN w  : (8.<|!4qx$9Sgh3;7H"Ȃq@, %EN(JPtX؉-R $X줋)!0hܱxVZ'aI0:G8RV/'0n˹X@a/c%iendstream endobj 322 0 obj << /BBox [ 2413.15 4660.94 2435.4 4683.19 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xOA0 yiҐv/@8@b>ݠSxe;t' .-Ī'>D,I)8!yR2 *gtSC;Dk1ry䨌ρ+7 x8ۿL9$~ˏ/iG/nhhendstream endobj 323 0 obj << /BBox [ 2426.86 4638.79 2449.11 4661.04 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xP 0 { O`bM Q PA%$(oBI ozVwLQ}JQ]G#AG9N#J$ԠF&xmNz)//8!+ԓ8Tx)*:8hN͌EMQ;o pO]>+a#kendstream endobj 324 0 obj << /BBox [ 2440.77 4614.8 2463.02 4637.05 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 Eqx$n *MY?t \Qc)Q$8w8E0fwC*dj#V+9ʩ5<ՁdjiW3OD*eY,& sCK .D/`sn 8j0endstream endobj 325 0 obj << /BBox [ 2454.74 4588.56 2476.99 4610.81 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xP 0 { O`ı Q PA%$BI<ū.HW$w2 v=^)ĈLbƊd%U\*y( YX :ya&׆*0 Ķ04t4asȥyƄG;D#ԓ/z8B"O pS.`[xkendstream endobj 326 0 obj << /BBox [ 2468.39 4560.02 2490.64 4582.27 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xPI0 ~I_črTBr$]"q4#x]ؿ 〈QTEq EБF5:á3jLe1c% [ ˊҦbf%\E.%ES.{tpOG|!ۏ?> Zkendstream endobj 327 0 obj << /BBox [ 2481.74 4528.97 2503.99 4551.22 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏ 0 ;vd$nTP $ʁIi賟ަpIL!pd?7`\jtN8,+ND򄅴R a_ũ\}^x_sB#үLy9 }mΠ5w]~Xh{x)gendstream endobj 328 0 obj << /BBox [ 2494.73 4495.37 2516.98 4517.62 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xO AS V`aFML4Qib> 0wrUCKPFU6x&QE&́#ՠp4 GC> >> /Subtype /Form /Type /XObject /Length 173 >> stream xO 0 { O`b;q Q PA%$('iHLqtgv{OgL٣ה(d~G,|Fg8 h8/,I1RA Zp*^8!ZB"f@ӆI?fW Y0jh'4E;MG|GnOpɲiendstream endobj 330 0 obj << /BBox [ 2519.44 4459.16 2541.69 4481.41 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xPA@ ^, K&ެhMﶶuM| Ca` ?)PV4(™u8oDI=pALń$ ^Q,*&F6L L+ !XOdrV<s'Or{GlbX<.WtpHML w%.?n cj*endstream endobj 331 0 obj << /BBox [ 2531.31 4481.71 2553.56 4503.96 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xOK @ 9A|f2su;v \$6;HHL4gr 97"Ȝkp@*YʆƩ`Nh1z4i}S\"OM`/䎋޲Rҏ'Bc,.3pui iNendstream endobj 332 0 obj << /BBox [ 2542.97 4518.9 2565.22 4541.15 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݏM 1 9EN44'9.<j'pє^~|3('!73 Ne[<" R /3h4h10W"ca'4VSID'I# ] ~ʔh+4G[u>b=!ɀ7\wq7;tiendstream endobj 333 0 obj << /BBox [ 2554.43 4563.75 2576.68 4586 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐ 0 8d$nTP $"18,UǙqbP1R0PI 1P6hA6@QJ.T JU0:L,$2s p/ӅSIhj/mVѦl{pD%)>qO-<tkendstream endobj 334 0 obj << /BBox [ 2565.78 4610.91 2588.03 4633.16 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xOK @ 9AddzuuMk'p1^xM=V\ 9Lq# `"uсT!Qx]-Q*g*amI<6%}(+bpx\XU銉19|h 9hƎ/`Żl'_idendstream endobj 335 0 obj << /BBox [ 2577.14 4656.59 2599.39 4678.84 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xP 0 { O`b' Q PA%$('m}w7wL9`)ˤ xG,q$Z&1µɘ%<L0h}!dOVLoƚ҈(r1㉱ 6ԩ-z8 +op=kendstream endobj 336 0 obj << /BBox [ 2588.49 4698.38 2610.74 4720.63 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 171 >> stream xOKPs NN`κ61ĺҚi \fӉ rJ\)ZLLs3}6bzvm{Fą6'慅02&L {h/,$ 0m"hendstream endobj 337 0 obj << /BBox [ 2599.9 4734.85 2622.15 4757.1 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xP 0 { O`l' Q PA%$('UipAلrR"GUd x&QER4 %豣xmNq،;T^+B87ʤqXcVT) ~{cbbs R0q|஼ˏ?>Wjendstream endobj 338 0 obj << /BBox [ 2611.41 4765.44 2633.66 4787.69 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 Nt$nTP $ʁjp{> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݏA 1 E9EN& w  : (8.vE^! eCӔ(bɭLܑ id3uqw5X&4BaJ0C1;6s7AW gG8RROܖs~g=biendstream endobj 340 0 obj << /BBox [ 2634.63 4809.63 2656.88 4831.88 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xPA 1 yAl&m_ xs=EmWU0d&j8 ) >%(2YX{#AG!r3M T1$)QJb3eXtʮPkwX1wkvxѦh6esc#xJ87~`X v'?kendstream endobj 341 0 obj << /BBox [ 2646.39 4824.36 2668.64 4846.61 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 Eqw$nTP $ 1$zW=+x+H0NQ;e .{@ @9FSȨ㹩hP, iXɺ3%Yx( JtQơ<㥨G F͌'EMQ;o pH3>qS `[xkxendstream endobj 342 0 obj << /BBox [ 2658.26 4835.2 2680.51 4857.45 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 'q27ʁ*p`}RJKC}OWp+HHL4gr -{@ @\o oHJUhQ"l2rh#Ҽp_;bSbiff:fI?5e3ccNT̹JY;>qS `[x&Xkendstream endobj 343 0 obj << /BBox [ 2670.18 4842.77 2692.43 4865.02 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏA 1 E9ENmL@pA:3'pє7`c ?w 9@Ԛ8P w o놣W6 RiS!jt2y0 ZCʲდډ+É.$w]@{ziendstream endobj 344 0 obj << /BBox [ 2682.2 4847.89 2704.45 4870.14 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏ 0 Eq{$nTP $P"1zNgep 5QFx@,4ssHxA)1ZϋNR $M\HQ*EFۏ&T~{EDu '{]z,&M9j^endstream endobj 345 0 obj << /BBox [ 2694.27 4850.96 2716.52 4873.21 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏM1 '0qDuO4y> >> /Subtype /Form /Type /XObject /Length 174 >> stream xPA@ ^ }74Dֶx265+c;H2JQs9Lڝ7H"HɰkA<e*u'P.2@'7=AJ^MJ`Ș:%H ~Riy`q3dl]N(jendstream endobj 347 0 obj << /BBox [ 2718.51 4852.54 2740.76 4874.79 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݐ 0 E8vmw$n };t1*sjɴxD3&Rr{2zȞ"aBx[+%LR=SS§u*O-&ì4AX%UeZ1ϸ| 1v|㮜tۿ]9k endstream endobj 348 0 obj << /BBox [ 2730.69 4851.42 2752.94 4873.67 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xPK 1 9AlҴɜ@p*+xㅼjdep iPN"a GR-d'BQ= %K_gTqE1er^(4{בt ͨVIFqHv3޼*m8 "ylM?~ukVendstream endobj 349 0 obj << /BBox [ 2742.91 4849.07 2765.16 4871.32 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xO 0 { O`llj Q PA%$(o J);ߝ|NLpxP139rd?7`Ud2:Qh9}뚉+T|ƅjG#NVg}cb$ #Sɫ7 퀦h =!T"w]~{Tiendstream endobj 350 0 obj << /BBox [ 2755.14 4845.48 2777.39 4867.73 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xO 0 { O`bDZ Q PA%$('-m s|wM?QԘ39L>7"HK`8 BBդZQeHl]!8S7<J`oLR:ie1q>a^O:8C+#} iendstream endobj 351 0 obj << /BBox [ 2767.41 4840.57 2789.66 4862.82 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xOA@ ^ Ka&ެhMﶺ͚@̦gep Ɣ5D"!:Xs -S" #7X$[3N銇H!$' P[lV in,*Z2 pH);>qW#} bjendstream endobj 352 0 obj << /BBox [ 2779.74 4834.18 2801.99 4856.43 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xO[ @ )r1;N gE -[ dv'9bl>g$vN }$PX`I$8KY#[ |K9 O"q}%F&١@:p2X.X׃WQW5n?w?~#}3Rhendstream endobj 353 0 obj << /BBox [ 2792.07 4826.1 2814.31 4848.35 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݐ 0 > >> /Subtype /Form /Type /XObject /Length 175 >> stream xPI0 ~g Q> >> /Subtype /Form /Type /XObject /Length 173 >> stream xPI0 ~}7ʁTP $ʁ7iR$^!53^vxOPBG(*7&QE&$#=IdI(xTPM ԄSʻlpX6 H'ҹd8)̋QK\( xop#Ujendstream endobj 356 0 obj << /BBox [ 2829.25 4790.91 2851.5 4813.16 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xPA1 ^@B_`nb[MW_ U/&8YZ GU.{"98FG Vb'$XaGI*!aL)>Tud(4a2/c i1c^)[/pTr:8@` OEjZendstream endobj 357 0 obj << /BBox [ 2841.73 4775.16 2863.98 4797.4 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐM @ 9EN'4ɜ@pg]xANqW {xlendstream endobj 358 0 obj << /BBox [ 2854.26 4757.3 2876.51 4779.55 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐ 0 8vd$nTP $-AbI,/41E1Pt~'< qHAɈ3[&*.c@{5[")n+5:\)a1Up!B52cԽcJ1u̹?p,Ǝ/`sf+8ޜJlendstream endobj 359 0 obj << /BBox [ 2866.79 4737.25 2889.04 4759.5 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 ENcg$nTP $ 1$zߎW=GWrĨd(2XEr[HxA< c褎)Œ&ib.Ole8\({p#&%e$h&̓NQ p%T`ܔs~+lBendstream endobj 360 0 obj << /BBox [ 2879.43 4715.05 2901.68 4737.3 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 EI{$nTP $ 1$zW'WL0E3*(4-{@ @pKP fLJ(ṩD&.f)ze}Ux&éh04㥘+\Sǁ43&scvGGdQ7~[ v'gkendstream endobj 361 0 obj << /BBox [ 2892.06 4690.66 2914.31 4712.91 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xPIA ^ o0IL4q<}[3[/*PlZ. I`d(u8oE0Q1ْЃxd bkFɫɊ9QJL32NҬ:X(Ǣ{bd4LpVjlqSǴuGgY /hwkendstream endobj 362 0 obj << /BBox [ 2904.75 4664.11 2927 4686.36 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xPA@ ^Rv&ެhMֺmM|e3 VL](ZH"r&Nx0*2Y#;=hf'w4 i*j$#42qC)θ+eaա qZ*& 5S> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 'N27ʁ*p`}ZJJC}O~ώWp+Hpbh3% ܖv=^ ` K<)8…,9EsD&g"JL)ʼn3/܏UJThMBQ&Iuզ̓NQ+ JY>q3ӏt?^Skendstream endobj 364 0 obj << /BBox [ 2930.32 4604.57 2952.57 4626.82 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݏ 0 Eqf$nTP $ʁq 1zgeop T5ve Lk b pAJ'QfV*L*PD dqXbԆ׈`YYLԫ_)8B.gG~wiendstream endobj 365 0 obj << /BBox [ 2943.16 4571.63 2965.41 4593.88 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xPK 1 9AlӤiN s\xAq-#xix!Ӭ(;܀C䂒J!C{BȌb}-dF`PP0YrbT+vDQ&bbPt/:~y̌61wKxB# QI9> `[xXkXendstream endobj 366 0 obj << /BBox [ 2956.05 4536.65 2978.3 4558.89 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 Eqd$nTP $ 1$W=+x+H01%r Lv=^ ` u.;l:㹩tBP 1O(I;/z(m:(P<C:ofzrc&|c#DJ rN?VЯx;il> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐK @ 9ENy&'YhAP.~թ#x <6wp,`96JaL2,%fN8,3`” m&RX8Ǚ kqHmwKEpBA/uZQ{pOd|஼ˏt?>0kpendstream endobj 368 0 obj << /BBox [ 2982.03 4460.38 3004.28 4482.63 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xO[ @ )r#9- o,n[Yfd6$wB0Z`liL2"> +,cru(ew37es\]%-{WX%nLduvX)QqqPW|'>vb jT)ˏ_`/fj"endstream endobj 369 0 obj << /BBox [ 2995.07 4456.55 3017.32 4478.8 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐM 1 9EN4'9.<;? \{4//b BRʅܖ$d!ص8fJ01 N`EHcA*꣭3O-ƊYQrաdp(3L&h=EWHKX@#jpendstream endobj 370 0 obj << /BBox [ 3008.17 4480.43 3030.42 4502.68 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xOA@ ^Rv&ެhMﶮmM| Cffӊ  eC )QDU6G"E)=C`afYq7NX*8wEFW MԬ >p0ߋejKJY+Q?:8C\">ApW#} hTendstream endobj 371 0 obj << /BBox [ 3021.32 4522.12 3043.56 4544.37 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xPK @ 9A| P (X^2cObB{I6=;HHLi)Q$tt# `  4(ZTLju2:ϤŹ Yt W KǠW")[%"3Ԏ:c5b3(M ;{aiendstream endobj 372 0 obj << /BBox [ 3034.51 4573.47 3056.76 4595.72 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xOI0 ~qbg{7ʁTP $ʁׁpgƞM;xJΔ{.uL{d&8 ,TPCVx]7LQXB2\rzΰ7~08(e]\_ EIYٿqk_z8"%|Ýˏ`hendstream endobj 373 0 obj << /BBox [ 3047.81 4628.36 3070.06 4650.61 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏ 0 E;vg$nTP $ʁIiS;oZ1w;% 3E[GL#=([hQ3u51AFӨbSEw(!$«:13L!^hձxƿtphOܕuQehendstream endobj 374 0 obj << /BBox [ 3061.11 4682.37 3083.36 4704.62 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xOK @ 9A̯ wօ(Z :mOb2佗]'.8 Iut˙U?^`UdR'#65x625 @mJjAF~F9 > >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐ 0 'vg$nTP $"18,U4p+D@EQŝ2ȅLv=^)ĈLC og#qԬBT3AagJr>r3UQ,-*R. ' q%E6EhS6=z8O-<4kendstream endobj 376 0 obj << /BBox [ 3087.91 4777.15 3110.16 4799.4 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xPK @ 9AL&a2suZ:.y/M'&8<P54-SJZOx0IJd.3(JEa'+p*l$ᰲA`a`3pՄtg+z8 ˏtۿ}jendstream endobj 377 0 obj << /BBox [ 3101.36 4815.56 3123.61 4837.81 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݏI A E9EN+CM'.> >> /Subtype /Form /Type /XObject /Length 174 >> stream xPK 1 9Al6mO s\xADž׷uXH yf3gpqƔ=zM"L>7p"G.otl 5B5vSJ(#eL݆)4xm%Gg Xp%mc|b3k5]ˏ ۿ=1jendstream endobj 379 0 obj << /BBox [ 3128.52 4873.87 3150.77 4896.12 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 171 >> stream xݏA! E=EOP)('0qDDž׷0.(yOXT%RF]$=7pޣ#l5U5BQ+ ![7z\s\WGU,nHCO`ٹX{ fendstream endobj 380 0 obj << /BBox [ 3142.18 4895.05 3164.43 4917.3 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xݏA1E`)s\xNbۉ3uL<ӱ2C TU)ci x@#p@X#x)*V)VN$^9 Iþ''ɫ~oČmbmŌ`5,7/ =Aj]}_?^*hBendstream endobj 381 0 obj << /BBox [ 3155.89 4911.93 3178.14 4934.18 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xO 0 { O`l' Q PA%$(֯[Cbq> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 qd$nTP $ʁ1"1,U8 2SUX JY8p"Hq 1%C1&> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݏ 0 I<7ʁ*MEbI9~$D&74͙hNxb d˝Bġܐ)["INM8t3vEN˷lKw}/!V}e?+ +#zahfendstream endobj 384 0 obj << /BBox [ 3197.42 4944.71 3219.67 4966.96 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 ;vd$nTP $ʁI)bIY~/4b؅iΔ0.6 x& ,I;BZ%FʆUř j`%F8pgnA(:$Qㄷ` sr]yPL!>K-A)K'X@`/Djendstream endobj 385 0 obj << /BBox [ 3211.38 4951.72 3233.63 4973.97 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݏ 0 'q27ʁ*p`}R mC}߳ߪccp L"Pp"Ȝk6 +)ZIB9yp*,Vv+P* er^8LZ1*Z':y!xͣ]&>G6=A)kb0n;߭4#ibendstream endobj 386 0 obj << /BBox [ 3225.4 4957.4 3247.65 4979.65 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xPK @ 9A|: P ( oc'p1^x$q$Dbh3% -v=^ ` K<)D"TJ ?:I+L'J8:aR;1*3^Qn]1cW)*cGP97;8A` Ovknendstream endobj 387 0 obj << /BBox [ 3239.46 4962 3261.71 4984.25 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݏM @ 9EN${u;L \L/l:Ã. go9#+~F>IE2K2uɐ•U !1 ~nČc3 -BSm=ɐ-J'  yMjDendstream endobj 388 0 obj << /BBox [ 3253.63 4965.43 3275.88 4987.68 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݐK 1 9EN4M@t@Pp\x}; Ecӱ2Oxc*s&GPtGC @\CQRPۨ&LrU4uS-BY T1Xxj1V&-q0K:l .)Gc08@`okbendstream endobj 389 0 obj << /BBox [ 3267.85 4967.73 3290.1 4989.98 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xP 0 { O`H(HRR)cG'Hd)?Nm{/lendstream endobj 390 0 obj << /BBox [ 3282.13 4968.8 3304.37 4991.05 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xP 0 { O`bM Q PA%$(UipHg}M8>)j,2N'< p!JQ Nldf:HU<8 En1i*^<:J%cSȞL><<{)։gTbO`8A`/fkendstream endobj 391 0 obj << /BBox [ 3296.5 4968.45 3318.75 4990.7 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 N27ʁ*bIY~9޴l iJQ$dr[GA @18=DrDVdZ55>r1O#GrYUTuSa)㭘+F WyO:Π%9w\~ ykendstream endobj 392 0 obj << /BBox [ 3310.92 4966.55 3333.17 4988.8 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 EImg$nTP $ʁIUY?A2)HȤ x@,q-(N#B^ٌT\V>"CQskV^f̊ZRzXxV)֎ɣw\~ Akendstream endobj 393 0 obj << /BBox [ 3325.39 4962.92 3347.64 4985.17 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 8vg$nTP $ 18,U8 1SQTq1B;/c@y9QKV m3.F).܏ eJTh,sYΘSq8kœNQ+{ b~[ v'*kdendstream endobj 394 0 obj << /BBox [ 3339.97 4957.5 3362.22 4979.75 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݏM 1 9EN&M`Aq0'pі/k> >> /Subtype /Form /Type /XObject /Length 172 >> stream xOK@s Nç9;u61ĺ֚xvl řiRH6 xB,,8cǾƩx]V$P ' 1E]LQՅŒG~c`޴D^gPj9 |wXPgendstream endobj 396 0 obj << /BBox [ 3362.32 4945.43 3384.57 4967.68 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 8vd$nTP $ʁIU6+;`LEQ%gr12mx# LjԹF"$TSX9Uv!MLW9aǤh&-qP'I3Oevޣ3e1v|㮾ˏt?>Xkendstream endobj 397 0 obj << /BBox [ 3462.58 5118.72 3484.83 5140.97 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xO 0 { O`bǍ Q PA%$(QI pgߦgep (j̙ EB?7"H}ZH85)uر^ET*sp\(t-zD3탐 W焪X6JVpuPVAoW)ĆO`(ohendstream endobj 398 0 obj << /BBox [ 3628.5 5417.84 3650.75 5440.09 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 E8vd$nTP $ʁqR}?1E)aN'< qH4Ә^ERfifwP%+Mf8T^f;"Tc5#j^ 1y.{xCjendstream endobj 399 0 obj << /BBox [ 3837.7 5799.67 3859.95 5821.92 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xOI0 ~, Q> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݏ 0 Eqd$nTP $ʁI+R9NLpx]Zșr!Ox0*2Yz'v0NFՄX8qʙTL*sں:RՄgI*!RbƩo+6w(OskLiXendstream endobj 401 0 obj << /BBox [ 4221.63 6506.55 4243.88 6528.8 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xP 0 { O`bDZ Q PA%$('UiozVw`LƜQ$tdZGA @\iZb's6y1)/݌r.8>U<EtthcÊ2BqԚ k~;|c3D r.?Vox kDendstream endobj 402 0 obj << /BBox [ 4298.91 6647 4321.16 6669.25 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 71 >> stream x241TH/*2203Գ4Q013W02233E y\zFF z&@L(+ 'qendstream endobj 403 0 obj << /BBox [ 4310.37 6650.94 4332.62 6673.19 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 71 >> stream x241TH/*2203Գ4Q013W02233E y\zFF z&@L(+ 'qendstream endobj 404 0 obj << /BBox [ 4274.82 6570.02 4297.07 6592.27 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 71 >> stream x241TH/*2203Գ4Q013W02233E y\zFF z&@L(+ 'qendstream endobj 405 0 obj << /BBox [ 4227.25 6462.87 4249.5 6485.12 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏ 0 E|M Q $ʁI "1$z?x+IHnlZ 2G;y "`9;ÑL3' w>GD*BF,pWMag7O&KIi g<: :|сESyUG~7ijendstream endobj 406 0 obj << /BBox [ 4176 6345.22 4198.25 6367.47 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xP 0 { O`bMčr` *!D9~]JJC=M8<"SQT3%qx##MlwrS"}^Zr2@!8(B\F1/m*^2^:a5om2<+jX{> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 ęTBr`}RJJC}WpHLԝLіw<E0%.w h&43RGcqbNd(L)6/EIď̘yRcvG'Prr?Vmx{jbendstream endobj 408 0 obj << /BBox [ 4083.53 6118.99 4105.78 6141.24 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 ;q~<7ʁ*Ebq9{7;BV*emx#ހIB@&-pqHf;^יDR(F18RN{0#m‘j^~{xG˄DpQL&+Os<1K'\~ 5Vjendstream endobj 409 0 obj << /BBox [ 4047.77 6021.35 4070.02 6043.6 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xP 0 { O`lu Q PA%$('--pgٴbBBJQ3p#ހITɢq 'sR:)J`4Dy]x+'Yxj1)>TX4ƥ:C%aD|஼ˏۿ=7iendstream endobj 410 0 obj << /BBox [ 4020.1 5936.59 4042.35 5958.84 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 N27ʁ** AbIY~9l iJQ$drt# ` \,PEצ ŌgvZXD+EN+)8d̊ZrǏ&XxVSu?8RRO`ܕs~+8^hjendstream endobj 411 0 obj << /BBox [ 4000.1 5864.02 4022.35 5886.27 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 Eqd$n *MY;tbBBΔP w8$dIqX1I oJfR$>QEHCSU֐8%VaℋG*a1񨘇;_rpI]=  ( ixendstream endobj 412 0 obj << /BBox [ 3986.6 5801.77 4008.85 5824.02 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݏ 0 EIx$nTP $ʁ -i+V`;('!CdN)p#ހIT)jp!x4Mx]+F`pWJ*L+v̫P0پqh(l. 8Pʫ wP!:8C(I +# jendstream endobj 413 0 obj << /BBox [ 3978.26 5747.29 4000.51 5769.54 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 E8v{$nTP $ 1$z_ߎW=+x+Đ\QŌ2.{@ ir6ݰ˝F<7JRJ'Δdb'p% 7I> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݏ 0 8'@F90@@X)m"1$??]Ñ{L1UXg|#ErwL$17 %?)i(vX ̈́'QQ+,aHW y.=˿Cp@2 PGfOpDk*endstream endobj 415 0 obj << /BBox [ 3970.79 5650.72 3993.04 5672.97 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xP 0 { O`b'q Q PA%$(-pH>7'wL5afTP$T4 x@,RaKP9#,u(UFJ SȎdƽ;̕RT&;&GcR$d&^:>xr)M"YT.Ɲˏt?^l"endstream endobj 416 0 obj << /BBox [ 3969.05 5603.56 3991.3 5625.81 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 8q~<7ʁ*u )AbIY~/t,]bRA PFROx8bёd;A# %k[Q)}Ŝʽ)J$/mRaeƢxW?.fƋgEMQ;j`aBO`ٹXA`lRendstream endobj 417 0 obj << /BBox [ 3967.21 5554.51 3989.46 5576.76 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏ 0 E8vd$nTP $ʁIZR[qxLYQ%%2eG#qyE3`1TXP yR)iՉDC~M &M!jЈz8PȆO`ܕm4D>jendstream endobj 418 0 obj << /BBox [ 3964.61 5502.09 3986.86 5524.33 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xOK@s NPf& `&օח6c \ VL{]Z*2r%x;0*2YRuFi$ ֝B1X1pC9zuQl(xEme`؝n"~?x{xzgendstream endobj 419 0 obj << /BBox [ 3960.66 5445.36 3982.91 5467.61 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݏ 0 E8qlg$nTP $ 1zcapJr'C! 1ׂmT4Rv̒М3ilLVÔ\sc>j'dEo'YN^#$lMӏ˻]-<Dhendstream endobj 420 0 obj << /BBox [ 3955.19 5383.93 3977.44 5406.18 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐM 1 9EN w 0耠(xm󅼗4=; L٣ה(|X.> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 E8vd$nTP $ʁIi};t1eE(.i}{t8Pt X"B1aa%0Rf)i[aBlV["d? )pcɱ Q ֩_p$+cop=pjendstream endobj 422 0 obj << /BBox [ 3939.8 5246.49 3962.05 5268.74 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xP 0 { O`'v Q H4-;lo#OxT3dFC%x;(šTs$'2V2c!+;@>B:ԳaSƨh .ȷZ2&<*)6{\ %_qOp=Hk`endstream endobj 423 0 obj << /BBox [ 3930.13 5170.95 3952.38 5193.2 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xPA 1 yAl6i_ xs=A*]+0!3d5pbp TX J+b 8k 3GK_1Ε:LR'Ǽ+R#{v e̊V1q0]ƛϊ6EhS6=pH%*>qO-<Mjendstream endobj 424 0 obj << /BBox [ 3919.49 5091.46 3941.74 5113.71 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐK 1 9ENh;uDDž׷PG.$WPB0YTPrx^IT)ipq j>.yPvlXJ46MaN+:z G!WFV?=&~*)z4ewcG0W~`la kendstream endobj 425 0 obj << /BBox [ 3908.09 5008.45 3930.34 5030.7 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 169 >> stream xݏM@ 0t~N`κ61ĺ6Sg \̐]/&8 QZșrh[.x0*2YGFE;B]{E5ؼp!RSj$T^|c ~)fʋn)7p@9DIۏ}#Reendstream endobj 426 0 obj << /BBox [ 3896.22 4922.41 3918.47 4944.66 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐ 0 37ʁ*bIY~/޴l !2eCSwJ(2Ep# ` K\"=g'.ҬJu]q94ԌHrYDY:8R, `4jěG'Q3_ J>qW.{x|jendstream endobj 427 0 obj << /BBox [ 3884.1 4833.72 3906.34 4855.97 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐ 0 Evx$nTP $ʁIK Y?޴p 䆦9SBv x LBGz(H,hٌ5{Q7#7$r$^;LCiƤ+2VmuƛbMt,)gtp1$|B]9+h%kendstream endobj 428 0 obj << /BBox [ 3871.87 4742.73 3894.12 4764.98 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 171 >> stream xOA1 ^}7׃&&/խ&C)3 zVW!1E0P(p1b 5h!m&d:yYTq\3). WT\]fju[-pO$7N?.wHhendstream endobj 429 0 obj << /BBox [ 3859.75 4649.74 3882 4671.99 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xPK@s N0ĝumb5.f^zIX)Q#M o$dJE/x!K`Re2󲒩<ŹY+J[9¡9cRJvodEċO:DC ,|`[x8kendstream endobj 430 0 obj << /BBox [ 3847.78 4554.96 3870.03 4577.21 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xO 0 { O`q Q PA%$(' 𰭳ξM8<)S`F wT97pޣ#I\zr$DUru8bd‘|QErjj8T> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏK0 D>O`OH( PA%$'-$Hg3q$$4gr %k{@ @\n o#hVNEr)f yŽ&vbk<C &7$P],xd&|wJY;>qSG~w'iendstream endobj 432 0 obj << /BBox [ 3824.51 4453.53 3846.76 4475.78 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐM! =EOP'0qDDžח` \G7yʂ)Q\&'< БD_ 8#a1!3L1 'vpdJq(u "3hXfҌ@D o^5C/F8C#>㮜ˏ ۿ]}jendstream endobj 433 0 obj << /BBox [ 3813.2 4510.46 3835.45 4532.71 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݐM 1 9EN@pQ:V.=^Ҭ67i)Q$TJx@,,9$Fu(LWΕ$;.|pTUR.aWN? ,Ѧhmʖ@h`9X` Ojendstream endobj 434 0 obj << /BBox [ 3802.16 4608 3824.41 4630.25 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xPK 1 9Al>s : (8. Eۼi6;HL4gJ( Ek|# ` Kw  4"bk#.83:f% `!+BūhQE:/Nop>qcWp=|Jjendstream endobj 435 0 obj << /BBox [ 3791.31 4728.46 3813.56 4750.71 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݐ 0 q27ʁ*MTV 8$x׳1/xȔ MS"G)Z{ Xs=DFPJhbV݅+Ym 4^ZTCS:4m:,<:çbz WPJ rn?v'8 jendstream endobj 436 0 obj << /BBox [ 3780.62 4858.32 3802.87 4880.57 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 E;qg$nTP $ʁIUڀY;t؄Fw2]GLޙ b@J iG%+%F;U.B9WE1riL%5猪h)GS2ұvGg$w\~ )l0endstream endobj 437 0 obj << /BBox [ 3770.04 4987.98 3792.28 5010.23 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݏ 0 E;q{$n p`}R 1$zp&ݩ`Jdx&I H ȥTi$V阕ıN9Uv!Ƈpjl/3FE(qE1?ҳ;NɳI'n9߯5jendstream endobj 438 0 obj << /BBox [ 3759.5 5111.1 3781.75 5133.35 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xP 0 { O`b; Q PA%$(R<.;ǫ#x+HL]ĨH( b Z8RIFxn#qeY KKQasƬx3l?x᧢NQ;A="7~N?VЯx;:1jendstream endobj 439 0 obj << /BBox [ 3749.06 5224.09 3771.31 5246.34 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݐK @ 9ENLuuuM#x > >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏ 0 8I27ʁ*Eb9~ߦaep(L c \ܟ71b M<)8H@fh"NV(;ed> >> /Subtype /Form /Type /XObject /Length 172 >> stream xOI0 ~,}7ʁTP $q )Ah&3cϪgcp 34-2-{@ @FЬ3FDwneעc#d,xpiiV(JPk ~8S;bPowT4q0n~[xpiFendstream endobj 442 0 obj << /BBox [ 3717.81 5494.62 3740.06 5516.87 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݏ 0 ;vd$nTP $/$&X~l1 wiJ6 x& ̥ K!W#uUA){F%m55~PO4(*XImi>r/ϊy gM]ˏӛ~=U.hTendstream endobj 443 0 obj << /BBox [ 3707.38 5565.1 3729.63 5587.35 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xP 0 { O`Ot$nTP $ʁI)i9xӲ1L"dsNxb dpAp=Qy:ǪJf#d:Lq]RAJbPV'\S%bP _tp+cop==jendstream endobj 444 0 obj << /BBox [ 3696.99 5628.68 3719.24 5650.93 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݏK@ t`N`κ61ĺ>L< | j1OHi9ą-$)!sƮ%VY 73 GuVjB,G/p$'M\0rU@fÈC|<[h JY x|K'8Xhendstream endobj 445 0 obj << /BBox [ 3686.56 5687.19 3708.81 5709.44 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐK 1 9ENMԅT^'pє/Xl83opIT3f GTr=Xe=GPkXyxR@*dd"Ovvc(;ށq 6?>Glendstream endobj 446 0 obj << /BBox [ 3676.13 5742.28 3698.38 5764.53 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xOK @ 9A|ɜ@pg]xт`]x}<^6-cHrbhAER!x;$bLdkɱ@=%&7JDzqTB$͂OUQWdrXcTL RÏj|4O!NpP/`wk jhendstream endobj 447 0 obj << /BBox [ 3665.74 5795.37 3687.99 5817.62 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xOI0 ~ Q> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 8d$nTP $ʁIR6'wJ$9cOx1Prу8:Ō5:^W2AjNp_Τp%++se?ت̓ *g-z8Pc'08@`/Mkendstream endobj 449 0 obj << /BBox [ 3644.97 5899.15 3667.22 5921.4 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xO 0 { O`q Q PA%$('iHLöκv'86>%g2]x3>IC&Rzdqoj2,L.} !֊3iHAq7'?/8\\|zh`;+xJ$n?wL#|iDendstream endobj 450 0 obj << /BBox [ 3634.64 5950.87 3656.89 5973.11 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xOI0 ~خ_črTBrMK7$^!ƞ{v5gOAxPL̄;BWHQ n?L#sj> >> /Subtype /Form /Type /XObject /Length 175 >> stream xP 0 { O`q Q PA%$(')-ptN9ʊS"tGA&ȆH;O1u]IE([4ͼ/ e aաJW3fLOSŁ2ͫm:ږ)yspW_p=|jendstream endobj 452 0 obj << /BBox [ 3614.08 6054.34 3636.33 6076.59 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 171 >> stream xݏ10 Ew'08 (H7%J Y߻ALpz]7uP{rg|"%5> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 E5N27ʁ*p`}\J"1$z_W`(P1&gJʅܦ~^ITɒĝC㼦Eehf .Td`'irĶP# wGU"ApcWNjendstream endobj 454 0 obj << /BBox [ 3593.67 6156.64 3615.92 6178.89 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݏ 0 8?v<7ʁ*MT 8g=g: 0Yr&E/x8bQT.U8@H( 760)q=QcP'mEO22Ԍ+ВAuZ+Y n?u DZfendstream endobj 455 0 obj << /BBox [ 3583.54 6206.56 3605.79 6228.81 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐA1E` '0qDDž׷qZM< J)q|$SVN EB&ӚXi`8;H M89^?*":,\Txf#υCșRl"7ʋGh!l Iccb{1E4N]ˏ?>ekendstream endobj 456 0 obj << /BBox [ 3573.47 6255.15 3595.72 6277.4 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݏM 1 9EN4M@t@Pp\x};̏<|ὼdӱ2Oxc*s&GPt3Xs bDI[qXP#'\9+:rͱFQ"fS¨_L'MģaYaQK8jB4v|㮾=jendstream endobj 457 0 obj << /BBox [ 3563.39 6302.11 3585.64 6324.36 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐK 1 9EN;Dž^ߎұ'pє/'jp(Tr\(rOGD> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݏ 0 8I27ʁTBr`}REbI9~~~bp3%1rGC iz8 fFbb۪BXYEW2mx^]xOBVƓ(+BQpBY9L<* c^3; . 9 w\{x%jvendstream endobj 459 0 obj << /BBox [ 3543.45 6390.18 3565.69 6412.43 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݏ 0 8k&@F90@@Os=+x3LEQ(0Tȵn8gLxAL51 q^qʅ"'\є,U`Ff.1iPL)NٰM?/|VxO 6w ԉs W~~kLhendstream endobj 460 0 obj << /BBox [ 3533.52 6431 3555.77 6453.25 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐM @ 9EN'?wu*V.f/$ɦccp BEBd;7"2Cq +^וL\ѹR,ΑIlRmUrѥ#*R1Mf UYy|xh)ZGKBg| {xkendstream endobj 461 0 obj << /BBox [ 3523.65 6469.46 3545.9 6491.71 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏ 0 E8vd$nTP $ʁqAi9cep2SUT) c x# Ljo $D0k *^יD9s%8W*dְz@e%m0 ZHpi`Lvh#6bDg* ;?w{xjendstream endobj 462 0 obj << /BBox [ 3513.83 6505.63 3536.08 6527.88 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 ۉd$nTP $ 1,U'Qp]D!gJʅ<.v=^IT)&b(dT(+V.F+kb UXIqyR!/qDfMG<\vޣ#%7~[ v'k>endstream endobj 463 0 obj << /BBox [ 3504.06 6522.76 3526.31 6545.01 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xPI0 ~ Q> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 TB 8>i)!BL!>?~?V=x+HplhuP$dr{@ @o#e'a(F%|n=$HcaU28q4rQ 6ri*=Ù7=^> >> /Subtype /Form /Type /XObject /Length 174 >> stream xPK 1 9ALڤ`Aqmu. y% 8eE)QD8SІ x&q4J#'bld bU5L+\QG3I礼;|x+ 6cXxQS6k)  +Op=77kendstream endobj 466 0 obj << /BBox [ 3474.96 6443.18 3497.2 6465.43 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݏ 0 E8vx$nTP $ʁI 18zgeopUr1' 1&.5id3vJ$)&F!/<36QaySnShG/:Q_)8Pw`ܔw_kljRendstream endobj 467 0 obj << /BBox [ 3465.34 6394.23 3487.59 6416.48 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 E8vd$nTP $ʁIiY;t1eE(.i}{t8E.6.ZF)z MhV/Q@oZq3F Oy*S/߿ BI#>qW.{xj:endstream endobj 468 0 obj << /BBox [ 3455.77 6341.23 3478.02 6363.48 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xOK 1 9Al4iO s\xAu͌<6>{bP*(21TRGA $FZQS덑DLEc:uE0%b܈QE@q^>O&qcƝˏO`o2iendstream endobj 469 0 obj << /BBox [ 3446.26 6286.71 3468.51 6308.96 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐM 1 9ENI@t@Pp\x}gv<|!5q $9S14͙ER!G&8f8K ʆIZ'2cP4>LÝT^wE(L]gE :Z@)s79X@` OQ%jendstream endobj 470 0 obj << /BBox [ 3436.8 6232.23 3459.05 6254.48 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xPI0 ~l/@F9@>ni I<M?S54-2Jw8E0e;Cr")i[2E5*qyęjm1kaSϚs5D|hXXːs_JEg|.{x%j6endstream endobj 471 0 obj << /BBox [ 3427.39 6178.58 3449.64 6200.83 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xO 0 { O`؉ Q PA%$듔-pM8<Ez2EG#qyE| 3 FN ]d"D+Nx}PՄ_mhsbT4FeCrV'FX盇Y_ z8PȆ/`ܕm1hendstream endobj 472 0 obj << /BBox [ 3418.03 6126 3440.28 6148.25 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 I<7ʁ*p`}RJJC}W=x+HLnh3% Nіv=^ ` K\"FPc'0&bsS1!vTGR؉P#C3il*3^Z*A>ȥ1)jǒ5r0n9XA` OGjendstream endobj 473 0 obj << /BBox [ 3408.72 6074.24 3430.96 6096.49 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 E;qd$nTP $ʁ pHgx׋ /xcJcq".x0sȤAppǎὩY)J]((Cv8$%IX´>Hir1!6E{ WI7X@3iendstream endobj 474 0 obj << /BBox [ 3399.46 6022.83 3421.71 6045.08 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐK @ 9EN wօ(Z XZ _\A9 G)*>x&QE&ORc,d#Qx^f b@A+}UHRY8<f?¢Nj6EhS6=z8Q( O-<.Fjendstream endobj 475 0 obj << /BBox [ 3390.25 5971.22 3412.5 5993.47 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 'q27ʁ*(MC}O{Wp+HHL4gr x=^ ` sEcBTjBDʕ S4CU-*8P͡+㣸lĶxsbrr#(eMU㦞ӏt?^Gkpendstream endobj 476 0 obj << /BBox [ 3381.1 5918.85 3403.35 5941.1 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 I<7ʁ**M@bIY{/l !2iΔP$8Et# ` K\"N#f ع8yGE; qىsa< O$:,06ʋGh#gl Rg5Qs1FN]9+yk^endstream endobj 477 0 obj << /BBox [ 3371.99 5865.04 3394.24 5887.29 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 ENg$nTP $ʁjpHgxsd_ Ɣ#Fu"!N<˝4jRʌ'#67gN[#M]S(J,{ӑT׌EQ+L3D!:jj rn?v'8 jendstream endobj 478 0 obj << /BBox [ 3362.94 5809.44 3385.19 5831.69 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 172 >> stream xݏA1E`)s\xNbvFg'pQ|:VWJc(d8F 5z0 bJ0(L"\F(^-v/td|i3(g35+^< &syVBYn` OqhXendstream endobj 479 0 obj << /BBox [ 3353.99 5751.54 3376.24 5773.79 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 8t$nTP $ʁIK[6-'wIr&CC8oc@ɹDC"0[$3'@A ;SW‹w*> >> /Subtype /Form /Type /XObject /Length 175 >> stream xO 0 { O`b; Q PA%$(oB(ps|wMˑ$SiQ$dXp# `\^C('L8jb)* 6,Mď@ųX&$bUŪZ,p_NxA)O`ܕHn30#hendstream endobj 481 0 obj << /BBox [ 3336.14 5628.12 3358.39 5650.36 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 170 >> stream xOK P 9A}zu~O" f2]-.ؾ Qrt˙rEї]`Ud$'ص`f8`V:7w24s%P&LqM%2B,~G0o$z7#3ay:𝡁+e R?zi"endstream endobj 482 0 obj << /BBox [ 3327.34 5562.39 3349.59 5584.64 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ_ 0 s 6v'|s>xA6+x m|_lZ6wLiΔP$4GA @)8=JCcR:)fr f$#f2_++R*,`Ť3^"~HQ1,3.߿ JY>qW.{x/jzendstream endobj 483 0 obj << /BBox [ 3318.59 5493.9 3340.84 5516.15 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐK P EYEV{@p\@т`}[mWqBglp,nRAU>x&QE&/̔) ĉXNjT*->/;jendstream endobj 484 0 obj << /BBox [ 3309.9 5422.75 3332.15 5445 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݐ 0 5q&@F90JH QO J)pH{v;@9 Gʨʅx=^ITɳ;sq3 (/LL;*qTV!֙U,*Im0Ǥh :IѦhm$7_ v'jendstream endobj 485 0 obj << /BBox [ 3301.25 5349 3323.5 5371.25 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݐM 1 9ENL@p*G.y/iVzN7rų9)~#Ju>iI"O#A/Lf`ڸ:XP)BY8=$!.z)OqŚ{ ?^Cj0endstream endobj 486 0 obj << /BBox [ 3292.66 5272.84 3314.91 5295.09 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 ENx$nTP $ʁ P 1$z_WGW> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐK @ 9ENGO .<@т`]x}gE<^\pP3%T厢:/$IJLq4GbǠ?2M̕bHfd0=%Stz/.eVF٢$়ӏ?>3jendstream endobj 488 0 obj << /BBox [ 3275.68 5113.55 3297.93 5135.8 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xOK@s N3.<@ML4.~i{ޮؾ $L1g2 4-E0P2nAk!)V,4}(dFLH X)/q~aʶ! ?inOp[_| =̄IT6|#|'8Bhendstream endobj 489 0 obj << /BBox [ 3267.29 5030.64 3289.54 5052.89 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xP 0 { O`b;q Q PA%$('-m ppg}Mˑ$S1;e Y\p# `9=XC˜BdUSGy]aRj3T +<&> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ 0 Eqd$nTP $ʁIRY?tbQ %[G"98@ĔDTӬX9đJL#; iY94g"5b\yc=|3!w\~,jendstream endobj 491 0 obj << /BBox [ 3250.67 4858.63 3272.92 4880.88 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݏ 0 qx$nTP $ʁI)} 1$ao(܁FrAI!spRGAȌb-($LQ:YDŽ ce%Kr\gnCaaL# b@9GS$| w\~llo hendstream endobj 492 0 obj << /BBox [ 3242.48 4769.68 3264.73 4791.93 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 171 >> stream xݏA@E 0@O`κ61D]x}.>|6;$6NQs9GLRcT*=  NJAe⎉rdP%ȼD +O&BBlԿXE "8@pW?Z0g(endstream endobj 493 0 obj << /BBox [ 3234.3 4678.69 3256.55 4700.94 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐ 0 E8vg$nTP $ 1$z_ߎW=+x+`LYQŝ2.{@ ir`xAY39Q;J@bg qT+Ls*JO2nz<9b brN?VЯx;k endstream endobj 494 0 obj << /BBox [ 3226.22 4585.8 3248.47 4608.05 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐM 1 9EN w  : (8.O-_{yj`cp T Ms"[# XYz8"Jcq*⡚TQ!3;ΜH*LfY:)mK0es$ˌƳ=wsN97`X v'ujendstream endobj 495 0 obj << /BBox [ 3218.24 4490.92 3240.49 4513.17 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐK0 D>O0ğs$v@P $ʂ(J X$ѳfƎWpi3+*xzyȪٻΗe%A+;{aƇj0/ѥE@wcx([ELJ_iY0qEI M= m ipendstream endobj 496 0 obj << /BBox [ 3210.31 4454.55 3232.56 4476.8 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xPK @ 9A|@pg]xAԎ<{/tl əZCR(HjɭGA"D9TXHͼ!/x]ur ;iQ)ɴ>&ĩY4M@DeGÌ%¨[pwqn8^{ iendstream endobj 497 0 obj << /BBox [ 3202.43 4491.89 3224.68 4514.14 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐM @ 9EN7'YhAP.~Z ^2t[ΔP Eox#ހITɓ;qqSv؈J&X9ӌTbb$SԕBRZ4~KK%x1xˌ-= -J'X@` :ihendstream endobj 498 0 obj << /BBox [ 3194.61 4578.59 3216.86 4600.84 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐM1 s\xNb;?NO4+FL{'bhNCBݟ7`ɲ 1s¾(*ZBu)FQ3jendstream endobj 499 0 obj << /BBox [ 3186.88 4694.9 3209.13 4717.15 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xݏ 0 N27ʁ*&BbqY~~^;(P,%ʙ<:o$qHĆ!hr7sGj3'b<)qlʑTCe[vcu씴pQWԉ;g0J .??=؀iendstream endobj 500 0 obj << /BBox [ 2101.45 6455.55 2121.86 6475.96 ] /Filter /FlateDecode /FormType 1 /Group 127 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R141 128 0 R >> >> /Subtype /Form /Type /XObject /Length 160 >> stream xݏ 0 EqvΔTH%RJVb._e --rGnx0*2YH~T8Q tS$3q6r> stream xU PWfu[dG +O*FhGN+(ߙ ⣂0(-(e]ujbYj6Ϯmxdk@UW]us=^Q:1,˪WE,u|/NT-Û9OeVzPj/LsC;`YcSrfJ|lYgR9,X{=)&%>`q1I3Im2Eǘ3u~qfs-,2e:zǵ0>`.Ezb.䧊ӸLȩ)+ZmīPgqz͙Gȶ~U.~)Ԣmqv5Ev_a W԰Q6*0U-ٸ)Be">ꫬ?yjV.063e# i)v$/a"0nyVګZ|ƑaG,_6݂jWrtYBs]ў$?X^  +" !,ĕR<МK GC9͐&r*U^LE)`#$q4w m`-%jR2x`sZcvA,X`h s/8q]1mXO\鄇ùs'>150tgw9yh0&QG?'._x/MB}sOT@k +Rh`jKo%RRϴS_r±,ȱ-3Wki<J`1G5[Zds @6NSjKS˩gDdjjj^tv|e/V툃MЪy{6zo"gsp΍+u VE׋/5\= t5EکV⒱cBNT%>Z{MZV㫙K/~w|AIlU\>-~xSF {U(+;d^YJGt=(@Xs;p4 QhÁq/S$`fqo _XQcbͱ\ΈXM{evg)t ?;WprQSQ"oqE9NQjt9_0̿endstream endobj 502 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2746 >> stream xV TȌbK:.*"j+b]@** X\,bX!@ I.Ed((*^T\Uy=osz̜|a6x.^x# |{כO F/uџ%X¬] o+T6|"<4R"+l>f3fT, qW CbV"V|0XX0kVLL4N&Z<&&Dl%w۸6R)M;"FD+rwv< pkWDj?{9w#Ob2)J#K [b.Fۄ!$4aM%XŒH$O#|Yz_ͤ#"(udȯGzVmv57[!c-G(;/x{2xU + ٨+Li&ѶiZ,&ɍ BH A u x\B^-EJ%4,wFgylr`Ì^ oGoC - F=O%b[l<yxe: ?pD X|LاVvl;Ɲ=ZD 4X|qyM(tPH-7+ zxմxM"N`Fzh(T;{^xy+OeHhIvWDQ;KKWVx+?xM 'L9)\:<шy!6٧ R-2P4THjDP8FmF>.B䳬y"* )æ3QZ + y KvRڗ[Q|+=c&5h4*URDµwlҍaѢjIVU|uCXSs߇=S";iq"< &5=+'-n[ZdRQѠ ȴ9N){rI%r!k$"/=hzɴOAe!xt5%+IlvGUs.[O:KVU!>+NnGtn:Ϳ24P÷EeH%l <>n> (e$;+ OiEM@BIa9^㔼"%83Et1\P{.@;I}V\mf3'835Ow^HOdzLq xDub>܇/E_uYRGr|.R_s|iP?Xq-!%2G2s7(Džo8g@=s kO=a 8}7rPWQ{(FkN^ L( Ow5~Wx+z/B/#~6rMȝH)Fn8"N_XMKԷC6';D(y$Ja,JW%'v0DC7h5AɦMl[+N9yPͯp۟vB$[KWEI% yxxXUVV  >Z=Fқa{]oPg ~6k>"z[.+ؾ?FO_z|GY@VpoنclVJxGYhwY)IC/+'K>OX;#5y,7 j/P++Ma NK%7}(^o=RP Shjpkv`^9P\pTA!Y JBe8[N 咁;&L"8v!ک9559~0ZFa6 4kw%\!SGWO|4r Cm<7N,;VD~ƕ#guxDxV*AqP`M,GwpBxhS7tk܄/[.Mh͒Вʚ!Lyf"M,$>p\DUi!iܫ]f,;=Gt,٠j꨼8\.?Q73h/=J8NLDy:d@tC0Ѥi dd&h{T >:H#`CrbV$W#$w{d-Bѷ4 dW|^tBA *pWlDdAPXPu>=,Q"᯸ YxX$3!O yR-K{AhcBel.Q]FDxKQpiYT+m.a]QxVzo&z`F9Yԧ[XYIv?endstream endobj 503 0 obj << /Filter /FlateDecode /Length 2410 >> stream xYMs#7Wj#U98T*Te[j˖%;>$ -laz(g' Sy\\}۝-\kWy[CB.)׭y sJn_/WbPBDt4֨2huZ Zi ^x$6FlهH[ڼЪAYxȚmEPOXj9Q8/%Y?%sO,;!t쯟Qclld&p$cᛖ#QX?`La$1uj>Tw>NEe }\:ف@$HHoR`Q.y328Ya]XI3d[I9DkeOD,y(W`05-LD>&llNK:\].' b|YhMvVH&")m0*e VƜܽS8㾔hHJ2faaxVucTDUBB1SС?~ɶB;F MHK=82K*>-řf1w*i9 QC A(cmȊr& /R<ߋ?~Ϧ2 s<&RpKtKZZY&(yL8au{;t8ׁjtdfpN^m]0 }V |pXfP +r4}yiӏ`Cݓ4*3FV1$a<|}4΋(&aA_*9 _p 9|'3Hn iptj4X^Ⱦ)2@iTĔЯ>hqA`>ujfA?H=iw demf+4jFTS@vDTaet8f)@ )5Ĵ~sY/kkT#ƀBΦ©|2Zv<#Mt- Y P˴GQA@!׬뜪^^nHw4|"K i珌 O!s5km&AP;*_d 7%|`F:֨/p_>LdTg89w)4 TZ:UgU`ꄕXAq>&9dq!~9qmHTGi3GOa4ba=' i9̜A330J]q2Yr4/W53|ލiwD1߱nmlh/3^Vv`uи'1Q'VUZ*'> Rs\XYB_5n 3:qyx'> >@OGcqQ~ٹ.f<)F} 0U7܇y<%8ֶ)l{]>B.mJy(.Q5NPio[W4R(l EiT^I_+In5c(o`}y9=sV➢~ljeɌ -fGN6綸!uoTN_?si a<6rT ðe3GC|Kf4sх<qnasD)%k[dZU5(=OC@5XJR7뙨Ϩ==h^q!F T! t AkvZ/~|]DcXfrUZ:̷^HkiqCPl61I"]_d5X$uv ܕqKL]~b~})_1+&r֟S?T&r"^jjĤfPS24cG*rSE^01*}4CsULüwlȖ<0=[W׏utΡqwc&12sJ˷"3(_^H)^*c^5ixu"^*x`23/+\6(_)KK\ooMGendstream endobj 504 0 obj << /Type /XRef /Length 514 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 505 /ID [<41b221eca90e0ad1e2707b284decacbf>] >> stream xU=KA=5 ABb走S+mm,DEm촳@S{{MH0MhT@ =)ơoRf:xtqh+%au@L8%l^. \kC%ԇ7a9<;r ģ7ι'3\p-RXWn(^=ecf`#/ײ!LGbO1c_et* 7yC,x"+XRo=T%/4cC"!A?>&2f2f`'Zg=^Lg|>Gx܈FxV7P?|LW|+zp=qjS˘=ٽ.N _Dx  !8SVĞ$? 2]7z=̨Xѹ}@{ ļk'ҷ'EXŻ À6ւgdǩNx呰 ! endstream endobj startxref 288352 %%EOF RcppArmadillo/vignettes/pdf/RcppArmadillo-sparseMatrix.pdf0000644000176200001440000020377313620530500023476 0ustar liggesusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 3115 /Filter /FlateDecode /N 65 /First 528 >> stream x[ms6~ߚL  eƎč8Z%62RTޯgRlvs$`wX0I#2 SLFifb3%kb2` P*Y YiɂsńfB܌aa" M)Q\ ٫WV%{O4"OA'|;k;GyzɾeՈ ,k<~(+<$,~ yoN؛Q1&2XΦW;ϪqJZ4]&/~a#܏t?4{+ dΊ򼨨%jI'I:IINt":4o:%cd씌؉؉I6]םnu?~Ө5o-gfZNcl5 jyi,ȫ4B K;Zѐß%6pbZay2Ow՛NI~P zY R. ի(.F@FVN*V(AY;utRP/ πR/,Ocm:Ra^Y^) XL=D`1(ʹϣU(ZJ:͍1^Lji3ϤSzHVG:EQe5!}F-lP"r X"8mj4R#R B!W_ڢ_ 9T2~Av;77<9Bx^߷quV x'|~Ms>xūQV)iYxG2` 'ZP9>AF=dTR8'Irn!2d [gUzs:Gf Z'o?^|Ofr|W$yB JM3'FMIm0@,)ފ􆴤o4ܲF xh*j .Es밖;=baց)&0d!,׸磃fmxLV&f>6:/9{j0"J4*h—%&]s^q+b6{EgP1q%kр\ՀCu4_h+St{! ͼM Da;?ܽȋZ@*W0Z)N Uje^K[wvm+ s/bCw`]H>.}f~U&r*~Im݃53 \t5c>N'i>HI(͎FlN*Y.q,sx#e0\29z޼YZWUΎf kyv^CuX^徙`3۷ZxC%dM4X! ﺞ%^,o7ue{mYa4(\_a^vIx\l3兑')< xBP;c:Nw=:$fwBVBYxTAFsuYaͺhE'w1ȅcQkQX? u{my]\,,.ه/PLJ+bmw `0Qf=Tv:RZiYl/irkYNb|a.I-=]p515aO b}t{\jmuA_vOI8nE(OJګr|}$|Qѿ|> stream GPL Ghostscript 9.27 2020-02-10T22:06:11-06:00 2020-02-10T22:06:11-06:00 LaTeX with hyperref endstream endobj 68 0 obj << /Type /ObjStm /Length 2498 /Filter /FlateDecode /N 65 /First 544 >> stream xZmo_}Ix_ri mC$f"I_>CJDYB+;<+dA2e iXP0kq2g# yY")Qɱ0T,jɳh e*ErL;1>F:Nx)IfQ,)f4$ڱdq,3Ac&zJYq?2kՏIkcl$:..$4x셉qIVK&:9ͦGONG帘1bz<mg2zXGU1kʊruHn#N/k3ˁUtT.?Z;͟BfmXqeW0Yu=yw,t7)hd|ŴO=D ũHI9cBLą(LT0 ٻHv+Iyf$'W+z] &xzeNU[#m^1ӊŻd-"Ά7=}ϏIM^=y{ѡ 7tC7O`ڮ%Df݉̚epUQE)i'`X+{V K<=enuhw,Ȩw HWjW-Dۀܢ+S#z{3iAL & G lÊ*_8Ӳ݌jM+kD9 <@H;0FTVrjcn KtJ`EyrHLw3&ܕҷʻăz LG)֛&=HZsUk[>(!1M {d䴟@T}+Q/>\d @i`nBÄpApPc(`hen',1LcQSGM3"Ĩʦ:Ugeu&濉Y6h'bf,1g23ntFdʹvQ(j+V7V#F0BFF5"y@HF[ҥM}dnX;.2^(S|7b\j~\L~8k`˗Pg@1|+ *s13-iRPKT@tSԩ0oumi`` nNq-DJ:üRUɚ-Cjm8q_q9C֐`1ߟ}vԪ? @F rKPJA8٢M|i]) u8u ($nI6Dv̮Gc>y^RE繥HgGP3iPh3+>v$g;k=ŗbFKnEŬ:rry1;8|,)i@5%q* ^s?> stream x\_o6C?;vz&>$}Plm-yeyol*u'..X`cI gC8(e/.Nξlt:h$VCaR~h4 /b_#ΨcƎ.ޟl@0G壋%~\} l3R9,RZJEYϔb2YwfsnFjہτyogu S2`Mly 0 X&oꘕxrZ6à utAa 2I~ƘhofvWOd8dTkFZ b-WAo!5M] kjtjY΋Mm^|adu fx."-w5e5 mڢjW6;T+PP!vx RlTmSu`)A UoEYhFט4/"2~azmm`9Ɂ"90sD$B!c6Avs?wkB  SmkfÑS'73,\r*2 _GC@gü(ĭ0/̯|+c^ yHe\ +c^y(WfU +c^ yę:m|u1Ǽ0TBy66Q #{}򌉚A5\t i23ȃcO:{ yD8$.Mf|u1oƼpr\p:eP맬fu(l ~ˠ@ f { oa?+z.ayQnA*6kJ]%yPh7J=S%%p\nKF]=]/۰bo4 ,IX[T3|Ϳd 'Ӻʢ.AX$,Y9בdխo,#\WEX2rBw"}go|QT*b;Dr U]-zA; `Dus!G }S~1\UfȸTq`9Cޭ|Qdq)g[m"#y5^i4㱕6L<ɷ :m?-ѝGG!OZ:1ށX^u/whJ 2TǫP6W2~o627+k4:(rݩ" M1mƸ%}*Rxn;勐t:14ɝmɼ2j+lR&L@e㾤P8O›LA,G#,.0Z˺i}ş~&nb2z7_%*nj3{4_m!1kdnCff! gڏ]޼/ٜw73:33(J(S̢W8C)^6IZQ çk5$wZ{8o=G,C0OP>côp4܃vNɞpUT!S͘" x2H'vgiRE7&OOdI)m)R[pq'T@R`<]7 < )]uS$ORi€ ${7 vEֆ&59@t@0z}(ck倕Bd4I>6 K 0U(~sH[}t؅ u|C|&uS9nOp40+11> k){>2lBhgxd-쉔a 4b Gc/g更eL^"be9bm-\+{ԋC 0<\wTw2mz GnӃ|'V7[Y-I$zח?x nss ѦpX$l2;# )H+ICF'$/W~OxI0<"|hbR}>gaLCL+?`0ڼ02Zs6Z(bEj1RW)?U' u=GI |]HRj; v9~ˡqƤ*~SeN5U'$awEn j]i ^HzZ/umlGc]+gPw葁B_p9j 3`#uOq>lɭd$D9* y{44sc~\*G 0EH__wC@ZAai,RbA;bƺ_z-2Kj&N̞􈻼ny3+E5[]3?o< q7_AV)3zI8L*_N:GX2ҥkh[1 9]i$3&=P=upTu7E^9W]@A/E8@l 2?fӱ,xuLqͲ*-3d87h9_hjȬHp<~/7l0A%|Eʛ LpkwL824%n6a1s<*ɩ6n{ͽ݄ۯɌeDT?mXbendstream endobj 135 0 obj << /Filter /FlateDecode /Length 1902 >> stream xZnF}WyZz)Aހ*Z@Uf\$Srg^(@yfrff{0jpx"yr0ʼIQZ V6/^Q͠D6T*X!`Lnr+ʆ2u>}[B{j,@.}?=E0p{'哴xhrUv˒5T9K&lE*4$2#|2:%a9uz Si9hhE6% A˛yg|W?pN7WY>N6\*sIrye/u~3]/ʮzGW.I T[*h C8xV<{F4rѡPJφ[evU8#Ok!Zh0%ϪK.;-m%^`oTW&?->EO!bzaɓpO⺠#z#$dTKHp•ǟ}k!F<h"R D0E-\%?'sHW*Hqs+ pBo߃ E) Ä XquOUc:!90I̕I𰦀$t<:n|no˛Œ^ _Cب@>5"{.u~*&&zM1֟u(@H,t30\hᅿ9>B ˳M>EJ#p9PZpkW9t DDK-.sBt-Iww}p#/xcr{Gn:+ !\|Upvy]@D4^՜O75kUS#|,C4Vxc+vG8 +xotFfL͑*Zm7L.4eSNJ?BB"A> bNl "$f[-p{KPZtwic&!txxoQrZLu!0Q孪4εo@GOͰFoL^Z:• j$; ж:yxlRwtE l*Fw2{׸tn7ΩBtZv3,k9+zZ-E1|ÍJx[M0ժqƷPå-^@:EBvښ `GٝZtfq,:[[HLBꓡ@bd^ |Lr3ŋcyvE֧oryh-^ 3Yx{m{DxOD11jЈ+f]]hX=f,V-Nqz=y<3"xL4O(d/f5]t(C>Ȟᙞ0-ϹIr59]^.vUIU 4|1uNwCA}@SC<.duvY=> stream xZn7}W I$6Z'-кb #M ڢ%3%gFÑGp"ѹ^⻄`;uN.8Mntu4)f7}xŠ`muɿHI6ьc-xҟu|\O8p`ߓXqkX(K3@=Ơz,74qM1! mVvzJ{Ll-Ct;I6dcńR4βdTY˥aň`V`&lF cX뒨DO*j OV%0zRTؠHgϞ9ak ZxCQ+h F K H9*QD`Mtʒ_yxj*ot@JbsSY + d=`B#1q &)4+..jr%T-ep^ ryz.U‡ -I28UCĵ Aw3J! Kʻ Hs?` !9, ^HfH!!*JbC$x-yWf75"lCL a!Š-rʳ K Th{QxQ$QG$"cp蹥橂uD7;xLDxbMIL\z?7NWZ?lh rY"ʀ5 _5P q~kGR9CBC3D(>)=g;}|5H&4t&NX}%FܜKb2+T4\Q_ZvW& oiDmEeyh8zPsD5\{ԎjrCYBGl#a̽ \6Z*xߔ2 [Cn,yεqap+a&uBn W@`6\S h"`0*Wd*b\aԴ%:^Xa4VB5ob,^\99v2 iZ|Z M>  %{ӛ ?OJ(> 1Zvᄭ*v^0kp3ip*Ҩ:t-"܏Ө Gжq!0PDK;iP6w~Te(imEX 2,i4[4BHLa`Ҋh\q% #|__NG#c$:9xכDZG&xo7, !URҭaP$QQ<jԅAu}ѽ endstream endobj 137 0 obj << /Filter /FlateDecode /Length 2001 >> stream xZ[oE~Xiē_EPI4F 926ė 'u"PΜwyL3bpj3 ՀY3]d `F/P L3h1@壗ns, XY7j4f=)7Wm9DOd[6.ܝw+ hۧy| 3DI *Z IWE9Xf0dC1ºч14Q;JGTcYb4&0ɚmwXNX:=6{ V]AfEe-E؃< JbX& XLg)"&:+l9jyc1({+#dp >;DgH!$`_ 'Ud:9o6<=Cp4?ggzUn?x/}X6 ݧ^d `wK"Cx}ZaCZ+~.9Hć="D+pMyM38N!)I#=)"=DqiهRK83Y ."Ts%Yذw26)2|O{FED]Att;kGxt 5}ps܌dEF1GI[C`YuncvPR+8I"afM. fQ{e.]8M`׋j "ۛڱ4F)KedtLƩmff+iZi68PK4oZ_Ơ'5+9|HnOӂ WXR%谯Uam9#TYXlL郎jxIw-( ?KJ^P1A^Q W;m2 oMhWtmjihTՋ7l6!90OHօ㢅$<>]5Z>sR}'rQE9a4oNwM;UzU(59*"т>oyTROrB&R$vyۍR,M(݈n6qV>Ch*z؁Q†K+W*Ҁ[`(/;>L-I㑖W[i_EjOp?*5ҩ*S8KT]Xa֫e7y"~2udvBIiv;wf>٦~D2#w"8Sp8h]&wPpޕX￴vf}jf J@e{kὫ2gƅ}4:(L[ߵp8W4QWRdA`θfwGڕ"al/~]֛WSTD9X-58dIvZC)TeQNa' 7Z, ߸e8vE](4_6\q}]lgXm`xr-oUjW> stream xY{oGOq_}?8ZRlF"p.Pڏ~q{TF73#iD_=7^q$koP6ʿyVX:oFIf3#θEO4LklAalS P7+`"İH21$UDX(?I`"ی45uk`*`X%F?8,B$x a `PH י>m%sr^ fl.nnJn`RV`arVp$&DrHfϽ bYIf/2k 0K emf2dW";n(tVPT vYe||K!lԦ 6ߥ CC g>]³*\mSa#]5 ^vA,DWE%uJ~pTR/Xͨ zN5E 8G,RHFʛ$N8;(`A:)ŊNpD!QoY-# K ڌaθϦ]tFP?p-YMlQ`^JR@laqY<X0?0P W`3N 9h]}Br]4pa^^$Q#*{(>*4 u}|.\h"M>(Kҙz-yK"}}֙g>*l&dޢ-w^+˫w_=.[^{rxՅJg\cBGUj. DŽ,2DY%U}+)tZ*ށPiiN/q]dT`Myׯ{˯ zuXW= BA k|1(};P%V|rU^r=MLaKR?{6枒\UCTJD&V@O\5QF~ŊMSSYp;smwLϓlq6{~%KMօ泇\́A/ Mfd:9i9 An9nJf< M8MFrثH2)9zQ(v3# zWD;Nt9XLӢ j>J!|(73krG*1s:vN4$.a%3TƭW "i$%l˳닕\U9(A3~8ww0!UPCRܞZ«tڊIe&I*ayG^)ZJra;ö`)0ka[u2\9jHHW Fңqo9(6_ tԦ!4XHVƎH*zXksxmg`"h|ٕ6WoI+mu4fɴI݀G1]ZYrwb8Go. h/(M5n~i :*t}&w3w8Rw hZPn@ S_EViߤKw@^>R*i3HA/CKQU+uZW6&endstream endobj 139 0 obj << /Filter /FlateDecode /Length 2172 >> stream xZnS&x.8iZ  UiH )qF$L 4!/zWw&M}O*-cbI8T% ":#݂'>*#V`|颁@eËpã#Fnʣ1!0x=7Q+q:%G0Tl9DXP< 2Ů*htCei2M߬٦IV`}p5{iK){]wlDSKB? W #hDQYn%fLue<mcqbl9ÖG0q_cqͤύ?`,(LGQ E7RO(,A'a^N6Lw2á>ʺ.WlV+gI,gPSY`+c7flN\S("Xd !X`)o`hQ"L[Oc<+v/J+8 ?_Drݮ"%bи07, s; QU_fPٺBUc e1f1*-T2z@_X>}n˧nW;yb9r}&vcimZHtӡ2Yrsyq6B`ΰa5nZ YsJI,m_`Z}b%J6B@BYk͇;(թ sS5WWuuiʋׯbN (×v-851"7M_ɐ m.ڝkfd/ϊ|H z=8Ph\VY1@.X|-}x>D|DQQs /_Rӕm͠-5Ի֖f .[$;SIfT|V~~٨5Vb7FM&V\kWHNuV]w44h +> stream xZnG)V6i+n8V[ "@8j]ucgKeχo2Fy«z^Joz,;mVM/ϰ«QmvWniY!U2;gf*+\ܧeCggވj<Α'fZj? ʘ!2/&PXwU1ϗ|V=,//b> 4٬'&\LjI~ǫf[\N"|xX*pTp-2GYBJq+=<˨AWQenLOl B)+bM %XgFBe**{ʋ))͘܏ jrc&aeSk4Rj@UxA"2f7?©/a2P2ͤd)j͊<#[Uy§w^QD)}X(WXȰw a*6$0,BVj,~*>4^Ǭ"WPcȎÇ+:IFzQ~^:)9\3qJbvج_ [TuqJ&IH %KuD5AsIoWQ43{|+FS4tίE,mc@X Zjm*@еR>cSq#RG. xW*E a\kO!?Xgurmm"~CAݧ{AmuDDvdkm (p#\{'_sjT6j I}#(|ʴ"Fo?@$2|R,KA7UnS-"f"v2'~2'qy8_V@>yr٠Y +: ZU- 4²:] mmx5toƕ57mx RWbJEV)1XL]5fڦZqd~q0 ]yVc;온LR&ЮowRq`٥*Gj8 UOlk:8T=U:\,^ &#H:gC]p8&x]S<'2Ko8]L6ųq*+RPw;>evto#frY߂.#]x7s{"p=0-eIٹob4jymӄ6fgǔqZ_IFfUIu׽31RCv(RS;+r{ܑ[Vdʼ24 q<5R ]+1u)ܭٶ^a$$Bud-gOr<\Ln?|w>m?1|~b A$ eQ{ޏh&yF[.my'\ Ady Ikq C·2)0b( ZLx1 5_nۜkx[]pyDxc* u:K@GˎG>_Iپ:8*.3k뛳2 :)o4fQɳ|1ۏ$&U6ې[ l/^Cuғ|byK_򴺌|KZ.](mCUe ,ϥ +kQc Jߋ`-`5^34p[dEm%;x{Yqendstream endobj 141 0 obj << /Filter /FlateDecode /Length 2128 >> stream xZnG}W 4_x*  PFc-C*VHwznJR'hjԥ}F (k~NWeҊ83-%d AΔ&Uel1nOxcv-1Z|&33l%K,|cٷ#0lлRjynd͏<5df rvPc Z3F|0_C4Y_.e1d8rRnucn2[[\cH~#FĊIƝ \#^#Hr8 B,hm&!DJ,J7)!@ڧNВ((8/xi&PQ>݀WG\pIH,L wp;!\;8A(v,,a>p](&R5v` ~$H&“^fߏ7E8 > b5&r׳6}:!!n9]OJ@ǮWgeF`s˴WPSoEUe33wJW>1,m ꀉH~l) 1(.zJem S`QЫT"LJ\tA>M` MOx#$ a$8 B %!Uo$||qzK@CPdCh) ]Wϫ)7 Rc N|ˍu7f'V. Kox:]OmHY?l%LZx˴E5qDZQ'nոZM@M^Bh[Be2Yr&:|Z'3m{:Y?ތ>NUˇX< _̜FR0e߷@ ׵ 6ZIz?k8:tcd5IKg tп 4Qo6*VQeTbh6GEɆ,xR{|[UW tvw> stream xYYoF~ׯ tއ[ >FH@Wt$3KJ\ʎLQs~sλQ0ƍsɓE%7w ~Mq + VxM-W1MhQ}Lӫt3#|dN[Z0#/yo8 Gע{-3%9n"M6B{8jŝ-VNDHœ'ޣ *D^ZpʜHҚh&%&1LQd2$$ja4wT{\~ur<5έ)+", ,| `6L+ 1t O3%+J!''ON7ng0N(_e7`ӒjF/_@O5 ʛ yHB Uug`bx .+d7:Ax0^0A@pTvȳ\1.q,,5+0O*D ς< g i}nPȵ O(cԺMhpm$}BcdpO wRAf  })brYr~Onsjʱ"E,-sI"X>sD*:K rZPbk1K9$=3(kKST+ ئ iW $8"!q9bu+/:UG8B:m^v>!1 M2UQ`t1{?k‡5%~.ݎԹo_=.ΚQA{vxա}sw["Y.O1_;&f v̢jmԲou::ށPy#N/p)8Z,Wu¯B;W! ;8?` x\B#6p09U‚[S/H.^urOfzr1 ߧ1dr>!W RU?I`-4߹&UJA mR]vwhÛ 2j*R!|՝cCyXY-`J{lwlFXf+ׁ b^79endstream endobj 143 0 obj << /Filter /FlateDecode /Length 2463 >> stream xZnSenS q +8JeI&>oT%EX|`Z/NGT[ ņp*k^lŲGB[DCOc}s3 wŚ֔~ nW4{V?ӻ5'\JqZH)46w=4_xaC,,S,*f7&T$"?̙_k@5`1%`M"eV"q*2ٶЄ!yBE(;Ӵ~̘g%b琬agm#"5 `x.&ۈ*Vw#PCR6* u#RMU[WHZ)!gZAk٭z'n3zB]@Hup@Z )RYweU*'7F뺊8QKZLxȪ cl!{Hxж -V^;Kkc}]TZbш;x^ C.}ҢЁh׼a|מt:z__1mJoǫl=9%?Y6m}-i6ajczeh1w\aɨs\L^+s}AX+QX+ʏs1ztp02.u9( o. ?9+tw׋_3#cAtZ_ pV(ݖP81n11ڮ'm5Ѩ>4bk Jz #ypqSgP2乏 Ep d87$ZZ $j89 &faoj=;HէzP t0k[/ph}rlX{% غDH0UpbzLGCU) [z q?pͤ6Ŋ3f56&,%ga] 4S`W'ZQ yrηThB3㟓 2o`2n6 L5+|g!:Br3L͉>]-' wůP+6EUB|6jSI,3Px Q_S!__nt*oЫj O3BbVBJ~p>W3 bq" RH3{ @c,<~PuڐXG5r ~at>;+WǥaI$cɮRM 1fH>[#Ef'[Wkش)weຈi*Tƿkĕ2dè#fI|'4X\y ba>f嗃%bM:j[-/cڰC*/6hD%JsC)$SY\1n 1fuR-C<%-a~^YhOЬD̳V֣xѽAF<3!"^a rn K:cY][d+YˮUMyBW$HA<}SsN\.w~aD;$_OWp*vy Z 'p \)#u !p QˋlzN٘']3"pG]v{N&2iBDb1aɔ˰"P!0IP1 3k&%UKB) |Coғ_T{sC8suG/}/TT &Q9P)r{1Z=Έ̰d4k + #ᢀ\N?.ʍBF}pwvU1BMtˊH VPi={?S΢`FS A~xj=oXrd +uo7KH]@xR2j j0[")!^d`o2PV8gne AeVk5"yvS^ L|g<qTNwx=uz0|x=^_N^Z[M\8˶Ii˃H:T#pS EYQfts+56U3lkňX-'4 x_~TOtI 7`RdI)$7 ߸[d&b:ڠLy>p\!ݤM]>G 4J|s٬\3z_v" 1ad1r*꾑c;endstream endobj 144 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 3764 >> stream xWy\GE@L**r"`f3(x[xDQ(ȡ(D9<# `0fW5[mG뽯jD%)Sb5!Ѫ8an2?Da`uo{o؎9ӎeYR3 #3#_X U[`oXQG3[LHrݹL (T,W$SS*3PpDLVp/ sA\RE's1X.@Pi\:K6pjURT4, iRJIHpFCƜR%E8N攪8=W\jb*XjbӔZx 1`&Fk%Y8ulpkhJiZOSjR3_b*5MQ>yå)]O>;utjjr~ZGJFl0G"8!3)D_(TNNhGgd)W,X2~DILQsT0eOͣFPT5Z@R )'*PT8E9S8ʇSDʅCM&ST DYR(+j R ʆLR攚G'JLȦ"(VddnaiTfloiI&&&7#*qXG 'c2LM}|Ggڴ_}W3gkv<_҂T;C_UV AV[VWC^%Vm:K̿%ׯK7] 137 s:*QqwUFٛbAXR,kkxE:˄1ՈR8 vlZf ͼÌ@l#!˥r$3!3gud2 'Q(O\v6.>߄;d` C ;56KUy]CI|鹼_o/3XB{bCi\ᐒO(g = 0/|r1x)FzSL*]hw(wIr|4!W\M(o;|ђ4e(0خ#ý}yO4{zx&:;ܗcg"t$[$qsweJImv@ ,ðh?| F-/Mx5难Mb(W]*eXJgEť-Bhفo*l=:QP_U.X I`I}+z"MntE7 m͗|=171K#p},'o 4 A50ؘCD&n$Ɩxڢke9K&gK:7PUҘx=1џ;`%/Iטbo]/g$ia FBВWF{EW@p Q#Bڷ'vyOS?ヰ1S6i24M{Ch7`?fGFڶ%'$tut{WAѺmkd2P&FE L>Bk rͰl^GU/&IJ|pUyiHשV\bSb%HwQGн)&DdDZ̈RDa81'EN%ԅL=:d;W(3j(xpPHlǿA$`3ɼxaKCɇPKOt;kpAZA,%iP to[_/,?4wRv[r;`qh~cc7V ſ?Ǯ ˈgՉ:nV]?{45JuyH| W$)(e(vyCFf>R`Mdg9ˢcdGa mR@.8@NSX>X[R}dn< ;mDs`[JPsFmd<K{|<ӟN?vA bϣmeϮ9˜ȥA~ w6Kt.|";>NhvRfGNۂ=l7U,AZ(}1^1 nɀ0" x_N|B @2'@ᲡA%$w2wubV׏017.;HYyeP0/\AJЏORFLx}69FV p)P@[DU dOfoso͎@Eb~w~$| l1/.+"RB_+hÑKG¶7,>#bAdZepr> stream xuWXڞq:w`*$ "H,4EaWDD %RD +ұ`AQE,kPn4Qs7Cς73ϳޡ)~MCx)}0u Rhצ #h~8}f+3[0.$BtIBi"S17 7RT#BÂ#*Õa^!K>f 7 xa/pBl>>-EQQ,]aaJM^#}]"(8|괃g<0o̵H8iS3M-PXʁG9R)'jLP)WʍZ@S "ʌZLYQK(kj)5fP3eԷ5ҧ$RRC)2"(Cj52FP_PTjB t)=j4C6gґ9;*.XD`hƒAbZJ\r %p?po_2T:H37ݤ[GkC y?B?PYOIAF*CiƋ@?17U6;2nŷS| d=]5b}41xXWiqXm'vJk \쑼%lu:qw,-Q ? `{_`p\W3(QxHW .'.rm Z#0x^'JO e+b%C֓:^M[h?_нg~awf)v.LܒxoRaOHX#.i)^xCs_U~[,EuIf+,:Ⱦ nӟDC; {s vAuPZ)uZuP{so\(⌭2ScAt4gC DUFZ1h|O+H=Ia(m'Y.^ۆ CQ\S"'UǡX_uTK(ccՒ`rtuאN z+Gy:(BSBe1Ol .Vw`@W|39 cjڢcGG.bNuB9NsaﱋrC:+jgԬ2Ax{rȆ)x?vR ;Z>8 L/e'4<=ݘ_}E&U:r392|ُ!/Yo~#CNܖcV:P \R*(`6;%9S|ؖ?{b-],,tp@ x?y'a.a`}9Q~]Qx(~$Fjd|:l* ~#X_q> H;16ꑘO I=akT=$[YȁQbmP;]S=KڅI&RbO/CNZ:tkj̻VM~qWxGG{H;׎ xԂNKb;Ύq8Y `+<)!+xaA۰3u970L>XқQ9F6UqV(CzDS1ṡ/,^kV(=Pa# bK~dl6H،#q[x E{?޲*l}b-Q(bcʪ I-xY|˜SK$|UşcB s,z ix)fLD܉ܒ&S&ظO_L/Ο.@$ E_)K<,l^øJvYrL/P3i>Ŏ= ^>lCl^#1ŤNR-H5SylI %2ʘHcS/4TKWj;5JS#n[o>z{h1 F꧰HXwupGx{0;!NLCA46< ]aص9Ȧ~GS\؂6 h'J]"|=Dӿt \ 睫Z>WT 5ݍv]2ۭLPKIsVhSӰR}J`^jB;;dz- ߨ`E%mM//5h] FYEIn5Rx&ME(+)sF J!_9r>p?(-\(~br'|x;ts|:N5 |z#on+َ;-w6ǹX}![+4 oOZ(-w qy< 2{$U뮠ȗZ2z/b+YGB,}bvb&BɵMiʏ(E໢$iy((]u9~кܕ:r"zJpay ϒ0𠝑^3&xf7>hca%%G JJ6 "ۅx̒J5.DUZ:7weW%Wr1Ɍs' ٪VW:g!eGAѝ Oʊ d[20Ka+FO&?y) gSlWf*d۲ce[&TGg]. z lƫLz#ͨd# 믂5Ì@A*1E }z.¬m2^0Ƶhяݵ?yfA++Vt kkSt܀#?u/ԞjfWwxV 7%BIE'/=WN+qş0{2`ǀ0F{r|3ȼS4} 0Wzjb.іAtLJmIƃ{lY,3{r1/xf\K%JZ4EH𺞮솓Afǘb ވ7vc)1 $xSqx%^>/J8%FTshEТ=%ĆbaqقٝZx^b*9&Zp™൲PF=ɍ``H8`,7!-Uee&̐e/B\)ؐ/b+2V,Y$gU4L*L8ޢڴXZZai^/"wصt-܄g/mx֟i4(OUu(@-)>P3ns='x={%tn崥V!Nn?ٞ#1  W)@0#3^G.]lbQ*y1ihRw"AGCcw,~Quد1i[׮²۫譖Ul^R>5sJ<ݱ/.q' h_fM޽ijc s'vp.5 v|KsI3] * I9Mv]/ţ8a >S~ kkX/oϼb.kVxO |o0 #`?%i]x&WY1X(YWμ'mǎZ>oc~/OVPjK[ V^@?cә'sJ[Ѩs›IM!xBSC.k=wNKk*[QL_ϿEP2dQ ]2iy*{K#< Ll6-x#`dY:94F9yPAŗp_Y). ~o78hW`\ay@ ;̜lNe,\sы5<-tv,v?TDtBn8(++,,+W#[' 4v 6 }vN?d۴dG&Gh}  V/> d״jVvAˑT__~DڮC2[Tc/s0SXa6 fU*`汕j6AAl "8AFv A #MODd'Mx(I4RrdqA0Apq`[}M_:!Gp[gdxci bP6 ӥCX9:(ju`;b> stream xuW X׶23"B%("ȫ>yCA,("ByCŊZlւRk ZТVAG}h0Dhъ=krwӞ;/Y3{(CJ blCvfXljЄĺ,S8U_/JzzL԰V&X +?g}%EyglJLʲ ]={?--ܐ' S-ENBJZ,!5kKKeΛ،0R,3+'cyfVNnyW$l IL yUrxJlVG'g.^9vsͳT0eEP3Lʚ fQp*VSPIyQs(ʛGPrʗr(ʉ )*z P+Mw)2r) j"5BIMʈ2Q&TeJCy)Cj1U +\247@) ;`hkhh(_i¤1߰l!| 3xL>#S`=F?]:6z얱!EOMDŽ12 5I59k2da4taz8cGrX|*q]8M4LRLi\>"4|V_d7#9ڙ$7v{ ,t)40x!.P[2]#e7*Fw(aҬG =j 1cJ]?v߸= ղb-'ܫ G~XH#s:w2 C)[r3Rw&/g\ :x&xI(Lu%euv݂h óco쭚a[as4v}#2^z&'O[nNsOǝ :x)aqݾ]%' k\YqKƄB8^+krR[8"S&ь^B>7&Km5;2"NaeJs]Bɶ#]:𸶕09ikE%%|L=&^tQm}8۶ pD3޾k-ZY\jI}϶XTV'ѱ>. 1+&2? ,0έaInxdȩH ^BFЅVWF-yWr .W0Ono'IY {ț/׼Z{Ѩ P'nvFlGNJmœ{`v|$3Hw5>b" Jm$yۊȗ{ʖ$ElAGQSYl JY)eÇQ H8|yTu嬾o!9KʴF"0q3 MФ`ԊDh'8WoLf* ,a"D ѺunrAKGd]+S; =$D<-x}/q-Ze}*5\K_F6#Jե*5L D3vxI# >6&}X莣GPM/O;r(ԘL7'k$6xOdžZtIЅ z#~U-:.o,#Ex.P%!T4bS4"L Q@CD I\j]x Cө+\rƭ\d ɽ'?[ޏUD%L"9iմv<YV8JVnkn_86=[rc69z. {4 fq_$kPZWv97}m/~T|L^RXovmv J(U ~R!!9ȧo+G/|U􈅩 nu1~!By͒%k٭n!?ƏD7ͥRB̭-7CmՇl:wINYJ@ʲ;gR0E Ĺ׎Zܯ.&y!cBСj!s`5/%p:,!5?g6lDQ|N\JvjnKjH%W(+k}B4_mp=@amN'8U%W[_m+yS;5eo B1 >؃PIě)iq9b_4/Ռc p>Z?5R_>dv*`d$i%g=|p 7/Db,i3DzjވHhKxLxL$IbuAn ^/ePl{*;xLbUiCu͢ї5_ :Qd]?޼v| {[~*"l؜(Iʭ*_䃢 dŗ1e AB&G`^,;Uv$ll &j2!ΞW/__UB8TȕL nS @F& W]v8#a{^/VEYKߞlFlPk͂~;|q/\>h!-u%"qPS{"笽c)7e&v$ !fb& &5W#?i8Ȗaۨ4inx S|HOz&xh)kj'uDI=8aWoN`K8#pjWLgX^OjĽc  vVՓi) :aR$uI,rAq>@>:܎#gCu^CW:+XEaC\u>nP)dUrV OKQ=~cendstream endobj 147 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1852 >> stream xekTTνFɀ Q1RLۨZ[PA*3aD UPA@"Z!`bMS6Zه> +kCvwgòӊhsqɠ?-x4~$8-RvdGE$t&@|p,+o)1]d|mt6ڨM1&l7%uT9^=MlG'hwxi ڱ$Y7뼴+LƝq:19.{WaTFS9)9eM:}\2Y1`f#„2?&g*"ƅQ1&ƕaN";`_;,p8p ' _E-/!A! hWw;_gz deɬᯨ,m[.| (ԒEjpQF5"xHaEߍwALp`Ej`tE π=< 3aᬷdT'-j[$X5+PB LrW='&5:,<,B"͔ARVj$ޢg25-g7ic݇i%^xV] %NފΟ:}Jnks*bp4)e)%)Gn7YMT ZypJJpN/'qX&uHkz4ɕC()$TZK[_Kf ww1}M j;)_/7 rk59Ǘ}~*|oװ߂3-Vv$\PpAnՉ(p$Y\af hӴѼ)nܕs5./\ؙ׾)9j~UvWJh]HxD "- SU.Ip)GنXP]67UUtt3$I:(vv;м$EyQ12 >-;H@L%/.k)RO6LΪ@ 3ɢpңST$ %s}oW_ꗔ?!Jra w RmB`iF5 } ы(7=&Z]3a I|:Q9Rg (3w(}3V|s[ja{hD&>(p$x-YL< ޔaEdɬG~A0z2ڣ6 G?jO6RyC&g!i83!C2$ ȥrCs*G|?f=~\s偆A G^]mE~HR2t00HvUOXvC W[J=Tcb7J+ [뼗sg+U s:^|RPKhThI{O 5'#RӼ.tDNjԁPC3IURArȯLJ!Z{,Ai3 pu4b_8 {;\ּ0epAyJ> stream xXXWמeavT,0 1{AT"(DHYzYґދT FX,jըI̗D_g<]}rg{{sFBPdC`@3=N[gGϙ7M\tSߙkƞ\)j"ZLEmަ6S(Gj2B9Q[m3vP3jj>Rv<ʞOP )jeBL)rR52) JJYR7(apjIFQ)k}ʐDI.J7H5,4Rڍ+[*Ǹ0jňo׌\1(QG~2fLØg&&_zecϏ<";>n84sfUfOͧ0ȳXTYQb R aTT6s8P\2+ *Eȑ_-V+`QU-jio[ Tb \nJ:+ F!fĦ=1$ί05M@f0X!ͮ[K*o֜zb)hvzT&SN͆}o 8#nMyB4kmvPKh^#=Y/!65``?>S6`r?ܺu糛y@ZWKiY qm(>1, vGi~yϒ!+*31JAV#SST+iS1#xOw'r5O:+=?%ϛg_4xO}OtۉVĀlM_cfף]kzX%y bo$\`-x>zPӧX0&ޜ.*`M 1ZE;Kt%BQ&GcMOOwV wLG:BXJkcq8sܹxJۏ|u ;W]XiNiv 3:^~pWA(QtTS?c3pNHFG#Z_Za1ܧAh֠-U 0SR ֌-F#㋶\_Vk˾=KGP2XϮ=*<15Ue7Ѿ$40+cE%7p`#)|8nFg _b1L j &sվ9dP>bZ[~?(WEeFǃFt޵EW/ YoQOBWWhs[  h%LE#ysAHx6y v=]R1G5H`]Q{:3FZJ ~MKއp&vF]"WM쐬c*P?Rd0*:ǹN*@Eee\^j=:Mi nXF&-!'+?ٝolJ :TN3)va1@;VN~ uOh1x>}`t/m8Z=. H4$ъq5sx7 h /:G1=Y8BL].ik-0c-Wad? :2:r$5[hN@iY $/VΰN1 )(X 9Ϟ8vd_S`^-.A{pH+c#vDU8H>#(*u.ory$0~^2_ua֊aȗV-7Z7[T*b8e3(=7N٢CJ`H } ֟l A*Yល);6?#'97(o!" K諰CpIb%J K4%,Nrf1F~A³=mhwz߾uf'6_jSIi|Ytu%zx1} -x/30Õtko#R fLk~^*ډKQ{ۦ /g`f9z`N:C?5۫jvuMW#4X |ՌC9WѲ5~gNF{U?s½>+C-W p{JA6X[Ϸ< uD~86ϭfbI(%e %+a؉%5egdJ?҅'w?ع֨9).X{6bkK9GWWng.쭜+'O^t|6(9WSX8YQZח#:Ht /?SXoG/YL׀MSETG)Jk3Q(?k V2owT;-{!5Rߧ`ĠfȰԄP7Kd+} FGI1 vlͯhM^{/M 9%~8!3=x"묾bgb ZXXS0p^sF'<W~`%nE s^:/ -TV *%?woZBb[jlv ;hĖ6* owӲهnSgTdgTY\Wh䖴7I|?CsP^0#r DV^G$I(uÏdB(i ) F0C0ɳcUI>f !>~F[9;o?<Ysp<-n}]b.=yBr?sc1G+|/W2(rC"U6L3l : H{e/yBO×/0&k^ܻ{}W`<>/[@c|yumycQJqb_zLe 1QA|:χ}'BF ēu-˿RAΡF汌òKϪѓ2oNލŽ0\  fatg a5l}UZKҲ;zs.1^C ygcj B64{7lY?{ߊ3ABNN^.b"!1s 'OPj {=R1 v}~ے@:dĆyb,JGOAr 9rPZشpXN^hQ2+exkr;BGPY|N QH&"4іx$v `hg`;n*]p>.0=}ŵ+ %'5W! ,DIF[W6PNx7>@>M|tLQ_$;I {4NMڇ3lomeWOu+Ål޲%w|ijwmtG?jóm6/t]B ۲gukWo Z2pF" M.w~,i\*&+SN`:{4P`37[(T3K'/"ӏ 坧FM$2xLPddQ,&0H6ajS\r[c<,=(X$"6VДqz>Pupt&GLUqE>+rRО[0cHfױ]'M8ƒ`RSo^s h2q i)DtLk}u mn+R!Sg[xƐgPGG?w8/Ÿv-EzϠK`Y%P\U ip~S0d> stream xV{PSgr{6Sc뽱TmR[j۵Y܊""H B EyᕀE2Jmh߻>ݭ3;;v3{#;M2w果9~9^q8^ݳG\*~fdiHzy0jf7w9֗ fu!. />xԵ?>Eq8erIQAT֭c r傭I9ybYEq `wҞ$AXOK9DžPHc`ҞLy0l˥2I2:X%/,Kұ { ێvb,b1/_aa| 6$$rp(bjWE".|vcy/vYl~l' /;a)zC7yr('n*@ (/5Hqw/a66D%WP^Y )f1Kq8fiಋЇSQzgm.*3RujukE3)yrT[*ʫ"qUhzrM^ߔ^`4S; `|j[7qWW.֊rePEd:{HQ4_QɗX&YPI;@ZUFYDo9$}sE8M?Hw*LS3ݞyL, YjXU^]:[jtRiLfvS[KAjJ9Tj* ǁ5H@dq=!f {'++[Edz:(?Foo R}BbYeeN5j alTRQɲkna=. A+6wT zζ{lBLEr_jtfG_x`::ꈢ>#=;9`})[aZ{!s.et^1:lm{&I0c,no*7U: [Oڻ)ւ&>BzRW [4]rTz^L*!"NnRc06Iά2Witx;Jt(:$G]= aᐾyESs .F"|<uV7I\$f$n"_oT)*u?solcxL<Cgơe`xO*e׊>S?zβ`GlL+ug*(l }H7}?qX,To77 ѭv Ԏ`99zd{#7oc|ߜb3ߐ(򋧗MOp_"^zT]Bky[<덦xASއk{'א̫sq Ÿ#]8ojKH{\U{̨Yb▋=d­vQ=;"Ndsˇ#tpOh܈ɚ}y%l7R::5+3~ѓ+3 E\^ш6w]֨m0Q\ڤH&Q Ȧ7zei2ϊG׳ʕU܅!1hTFR_%qԇm`z(Ӈۉ\.QY6ݽFcʘtN%]hڡm ctn('SX^TJ!Jd5*SOu* 31Y[V\#}`Yoʯ+E-F%ɩ_:K4KANl ^[+7P6@n2Η-> ACh!6PK?ؽ`ahSe:H&\SCәUt\Sx'BZ0 4D_hs[ O?10P2/RhpӀd$C(iz#7 , K;%0 c!ytPĞ)U3~vLֱx1aj,m@%~T6l#@y6sIgy=k 8j Z):\VWxYr6J)T*US7S/&`VlfR4fR5\Ru(G<5:7>oփ+qy&6N&d/RfiK f=#V%ɢ >h6[6yqfӏ\füX2`?ғTʹ8ϣffV*Vo oLѪM&˽5fW3:\6;׶6ɂOLǒ1⸅;D>VKjkd_,~G" 7Tendstream endobj 150 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2874 >> stream x}V TSW~y Bk!PLk{֢ԥZ\–B$,A}De AEe֙bmNn}3sfn@3gs+ ׭Ө5o,\v-,7>dĴ4vSz*vOip3@=VFkHR)җ_K# !5x.9^)kBօHktxR)QK#c2UT+CuM6lݸ907 N hSRu2!j]zt\Jxmɋ!{ bxxDl&[mb9E!Ļ b%XC#CxOӈeD. 1( . 6fw7{w9T? D/z =SwN=  ;1G0pԗMt_dVRM=gcrZjzb18y+y-'' ׮_CSTV?3,<nsceNX8gb" vO`aɲ&Gp7 }0GFnېh6 $`&{ θuy˗;Q[s6z6F#%fUچ]@< Bb4@&k#F "EcWHEKxo=KosP_؆qL,넋s5[O-|*!%ʯ$Z\aFԬ|l/XFZ\H $ aQa6CSJCꀅ_j# gCk+cK<5ZԲ@U)әt@5ؘ!O]]j3Ҳ(`"c45T@Uӟ{DJv)kA "d&X]=z@5XԌ[L=}G@,M֝yi@ :T$`XD Nzo-ǎ{ J'^qcq+]Z􁗱#3qWAXM?A.ARgvǺ:P9w8FwO":auԦ;p:||?[ܩ)N2U ژRXC?t"HA؟~ CZ)R( [%\@#%ڒ@rxϯ=_g8(4]#~%i,Y-o՜Ae2i(^z3ReG6S͕&Y v)AeSƓE Řk2ETiR[b[:?= g2' af y0m "t넚Ol\m8*ThА 2N P@:t5c~}nRQ ?t3&+!ͿKu, l *I1$9i+rR%Up%&P--iG*}zO׾\B@~GX_їWBRܡEytANXuɦp:Cΰ\5H u Íߛ"ЛQ詯S9m_suu4/՗:l!?:3Yeɖ1/hcɄ񺂸17R1T $ YT1Amyymh{Փ>|$Yhf2F87XA KRit͍aScACm*!:) KY͓dsg_c![}yL鴜$'d:qt[-5C{ 7ijPNK-XuPLu\b+_xBΝs 0ۖWGv2&U` ÈvVG;pzMy8 sYST"(<{Fђѻ})nun̉`Ui9f|jaLH)Q VnуxǙ.џnɬ h%ii<3[0q˪mnllb˪LĆ|37Wu0h ";"hx73{dC82L>_^ruXkU9 D}#!/~2^W풹"uhzg#&5'%&]w+5A M}b<_?K uXER9 #E3D[*esXqu{r=˚r.ovԕglF @UG?`]4r[[GųϨ8@jH̯12_#Әe)B ۥ\Lo/SAi=ʁjqeC2+> stream xTkTSW!εb(`InG" # H1 $^8ECD@^6AZ:Seikfu lgvNUۿsӃH$r:Ӻyf~3Cie_Ů?Ÿu1E˳q W$'oǴK:%}IAs]eX Y;?,,R!lLl 18ْÙ`6X!c3 F]fjv jYuF6.wѐ3dp& b3VfMz`0`v%XeY\Ys 鬵W(x!|EFfN[xAe{jXp1Ò)e1!# Ym ݦ#Ewcjo؉|º U5UI+ 0}xء*t5^{}U ~HAв#!h֌00v\:漁 9yEm'BJ6,2&rGky|>AjrQ{ ̣7 RV#&81sf|{5U} 5N*(^J`)nESK&fYnQ,_=2mzVԎȾS-`Icy]!{Vz&R]IbMVg3 ʑa3kF/2CsA>5ՋENɗ B+Ko E]j%H0Ga V|`9u ݟ_O4&|׌I? /AT-sy3:}|2p ޸)%&: C3> stream xUViTSg!rUJ[T6ZjDP@eCª,Q} A"ԖE!uduix߹޼sdyCX/}DvbE^!e =S s5O7oHC}kl-4?G"6wK$␏w\{[y ,xl͚5F#S`/|xC&1Yi#w?dz8pPpHvpe;=m}vG 1E|K {O, 6{-"‰0%[ 3b)0',v{b%aEX3q"t cKjՙmʖKHRW-G©&gdb=_T 7)tRdɒIS)s@%@R.F<%yCp}rl$rPy?=͠SidAX1yrNiGo#)QIR& 6>rِuhB(j] XQ0-5{6*a }V!͇/{|JSll]Wafe{JZ= 4!,쉭ɢ|3pôf0`E:1`> JFox~Bݹ_T<4 "}:1D a<10${DB?uT_{N!}Fnn121xWڏmv6*h"iSC!f({KtDp3v +S\0+<^ɩ_#ain:6(g@a8:H.`}^VnXw$#8?"R١@TLrhHj HΈB^)}ϭ(qvbEtPd),(=]Yͪ 4@!]6֫'lZD9If6ǔ6tȔX;~QTw'O i6gԶm` ?cӇDl{d! au+.gzشrlwѓnbl980Ph*X&d`$Xj ֥Q6-5c' =xFzeUِ%J,"w$EDB4CUqM yO9(p"e}aM7]ŧ$APA1&OJ䷛5blvQ~2776[%IZX#Eᱛ8'GE|ɜj̟D$=QƬ4H?#8&OȌ'Z([ڪBai^ũ/sN0ۑ"EL|Y^vsh2$0 $ڌ\2.M ڀ-yvX.~$%iҍ )E Uu=X:nF'O* 9Q-,c3kK%ߩ[!ًW*Uרdn[0ܚ[{TWo#.BMDW^_7 o nzD;j8 o"Slo;FXMdT~L31/fRɻ? + sr˥&$cDx={WH͝|ڴ_ZAZC]hiԸd!_-2+pdH0ӻ/x^o{*2s2jݾy.^A:7ƥ&H1E(}Q1nj.Tn<(~ /ᱲU&=E-^uX]cyrSz: ,e ,˽%&+_5wx8rV@mhf&q$g !7%aX6>[Asv<Ѳw!^Ճ+"GU|=,#ڈwHrO@0xF#whx- bWU-wN:> stream xU PSg1ps,TB$xoFQinVT%(SnbO]'͛t`H]Ne]J?ev8% Ԓ`r]*{SA RZ Ŀx=GODӝkq?m8I1L]OUO2A_8 }hPҎRr +W/!Ɋa_FZ*X"<7G Ê{ϠȚ ~qW2  ;{7 l>K"Ghe5)RwCP &_䈧^č8fVUM"" j,zyƓ)9痒,9qD!EA}`M*5|F1M`=O#>iE3_ʈZ)ǟK'RA3Пr"1+2*S'U'ouedm9Tʫ*KXhch"&O&k[)m܉4t a;[=?ՙʌ%}D LL`杆&`.kαZ=Of5讖_>4ߪ6ko6 @Y^`*QD) %dQٸ{5wisnn~Ϊh[r`'pyٮgقZI )E"?emI+犾U\;󾺅~AԈ}My^Jmͼ5}"lel?]ٽ|{ "w%gE'NM;1]xP96R.T^1$k5j:`HVyC+;D|+G9klلG<=8=_aH7i28r@e%+J#V> stream xeILQ@m,bA9h4FzЂDQpv-Ӆi(M- KDխl0P^p ׍k.X.*Ϛ2a&őkɹbUMt6w+h51փ- ! Z~ߏ;=-/`Bb\xj!^y3F9\B ( DI5$m&Sz4 mARZ9|Hm(߲O*xendstream endobj 155 0 obj << /Filter /FlateDecode /Length 1524 >> stream xWKoFW%RЃ$@ MdFbdt){;rLqP0 l=:H^,+#No..( K/y9uVHj,o|ެޕQƵ#M7^0ISo!?ܒgٕ_IMͬ]v cA 2!=çutsu:}iȫeg’ˬƓD0ޖ}R 3j!b̶ۋ]Y NM|ZJ+hr"gI#7}(ђS0Z_KHK NJ&k,WT6~v8\0Ҭ+\Xs^hY/Nd ֳ6(9ghvfMTJj**2QG @-,{etfĨ{zpwώ圃p¡e-{+:r( 8♂ڛfv80dq%#x 5ތ*vOs>f+އ:B=7s6%y+8""HRq,aT,Hgb6kVMlz%4fLz/\\Wf e0Ǡ0,ѣUntaTF;@KM> w mZVU/g]zCy0K} N0K.@ç 0̩2Z@eAB $M>PNn *p?PC{+e>LPEwDcH9{qA7Y7)4 !P#[!o|!4DXaBapOO}cRe{)55݁’)0’\N<"Ye_32h٤vۄ9B0hǝN $G `HTLzVj2],_ھ?m0ga\lƛnZ`!O?)+{\7+9 Bipȯ % 8 @{4r#:l1Df`j`em<t_Ěay =|k |/ر{ޡ'ZCC2 qc|H0@P}ad $q)iㅗoS̀ .$@c"h ]ЄE 81*.YI#h/.38L䕌} #"͵=FGЏyOxM竫K'O JZ(؝QI>sR@{T ))NMu$Q97yl.G<黖N0O${q!( pavqr <.Pv|e5u݄z kgJ!So43\• Mlyfpm ,T*Ð} BTr7ғ6O~].6hH0C>Q1uMg[c8 Mt &ai&p"e z3,endstream endobj 156 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1770 >> stream xuyPW{ә({V-cB`xmb@ Zp 1pr7 rZ1h\-.;Z%Ѭ[dVbMxUW|'"bB$T*ڍ~Ѫ'5_&}$C>[f"\$Ezi =@{ H79#TUU'S$)Bi]Z">3IWDj `b6SRǧ'+Ɋ>Eѻۣ߉ |%]OLJ |c7KQD B[p" dML$ 7z&(KtS.>!y]R,%ǡ;r K61s0ʼn.a.ᵐ.Wǘ”*=}r~۶s˶w6&=U65un]sKS@?~֕d思S@r>=0W7/ZJ_/G}:/jL싗a>}g@g77EDʧ^7oo Fԉ4uvÑq,YyR͟==_+i+ =7j/@ip[oG3CZ{ yVPu $dwf1ZIA 6`7x˯endstream endobj 157 0 obj << /Type /XRef /Length 130 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 158 /ID [<8d163ec4f8c3170c35e25daad9ef5cac><5e67377a097d2fa2ed4de70e2ff0d769>] >> stream xcb&F~0 $8Jg =#o]Fcd @1› `r# m f\/A$??.LS@$?09lN+y VD23M  endstream endobj startxref 67175 %%EOF RcppArmadillo/vignettes/RcppArmadillo-intro.Rnw0000644000176200001440000000050113620530500021353 0ustar liggesusers\documentclass{article} \usepackage{pdfpages} %\VignetteIndexEntry{RcppArmadillo-introduction} %\VignetteKeywords{R, C++, Armadillo, linear algebra, kalman filter} %\VignettePackage{RcppArmadillo} %\VignetteEncoding{UTF-8} \begin{document} \includepdf[pages=-, fitpaper=true]{pdf/RcppArmadillo-intro.pdf} \end{document} RcppArmadillo/R/0000755000176200001440000000000014107544751013214 5ustar liggesusersRcppArmadillo/R/inline.R0000644000176200001440000000253213151042705014605 0ustar liggesusers## Copyright (C) 2010 - 2017 Dirk Eddelbuettel, Romain Francois and Douglas Bates ## ## This file is part of RcppArmadillo. ## ## RcppArmadillo is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 2 of the License, or ## (at your option) any later version. ## ## RcppArmadillo is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with RcppArmadillo. If not, see . inlineCxxPlugin <- function(...) { ismacos <- Sys.info()[["sysname"]] == "Darwin" openmpflag <- if (ismacos) "" else "$(SHLIB_OPENMP_CFLAGS)" plugin <- Rcpp::Rcpp.plugin.maker( include.before = "#include ", libs = paste(openmpflag, "$(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)"), package = "RcppArmadillo" ) settings <- plugin() settings$env$PKG_CPPFLAGS <- paste("-I../inst/include", openmpflag) if (!ismacos) settings$env$USE_CXX11 <- "yes" settings } RcppArmadillo/R/RcppArmadillo.package.skeleton.R0000644000176200001440000001175514056467700021317 0ustar liggesusers## RcppArmadillo.package.skeleton.R: makes a skeleton for a package that wants to use RcppArmadillo ## ## Copyright (C) 2010 - 2021 Dirk Eddelbuettel, Romain Francois and Douglas Bates ## ## This file is part of RcppArmadillo. ## ## RcppArmadillo is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 2 of the License, or ## (at your option) any later version. ## ## RcppArmadillo is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with RcppArmadillo. If not, see . RcppArmadillo.package.skeleton <- function(name="anRpackage", list=character(), environment=.GlobalEnv, path=".", force=FALSE, code_files=character(), example_code=TRUE) { env <- parent.frame(1) # #nocov start if (! length(list)) { fake <- TRUE assign("Rcpp.fake.fun", function(){}, envir = env) } else { fake <- FALSE } haveKitten <- requireNamespace("pkgKitten", quietly=TRUE) skelFunUsed <- ifelse(haveKitten, pkgKitten::kitten, package.skeleton) skelFunName <- ifelse(haveKitten, "kitten", "package.skeleton") message("\nCalling ", skelFunName, " to create basic package.") ## first let the traditional version (or the kitten alternate) do its business call <- match.call() call[[1]] <- skelFunUsed if ("example_code" %in% names(call)){ call[["example_code"]] <- NULL # remove the example_code argument } if (! haveKitten) { # in the package.skeleton() case if (fake) { call[["list"]] <- "Rcpp.fake.fun" } } else { if (force) { call[["force"]] <- NULL } } tryCatch(eval(call, envir=env), error = function(e) { cat(paste(e, "\n")) # print error stop(paste("error while calling `", skelFunName, "`", sep="")) }) message("\nAdding RcppArmadillo settings") ## now pick things up root <- file.path(path, name) ## Add Rcpp to the DESCRIPTION DESCRIPTION <- file.path(root, "DESCRIPTION") if (file.exists(DESCRIPTION)) { x <- cbind(read.dcf(DESCRIPTION), "Imports" = sprintf("Rcpp (>= %s)", packageDescription("Rcpp")[["Version"]]), "LinkingTo" = "Rcpp, RcppArmadillo") write.dcf(x, file=DESCRIPTION) message(" >> added Imports: Rcpp") message(" >> added LinkingTo: Rcpp, RcppArmadillo") } ## add a useDynLib to NAMESPACE, NAMESPACE <- file.path( root, "NAMESPACE") lines <- readLines( NAMESPACE ) ## remove *.fake.fun and set exportPattern (will also be in Rcpp 1.0.5) lines <- lines[!grepl("^export.*fake\\.fun", lines)] if (!any(grepl("^exportPattern", lines))) { lines <- c(lines, "exportPattern(\"^[[:alpha:]]+\")") } if (!any(grepl("useDynLib", lines))) { lines <- c(sprintf("useDynLib(%s, .registration=TRUE)", name), "importFrom(Rcpp, evalCpp)", ## ensures Rcpp instantiation lines) writeLines(lines, con = NAMESPACE) message( " >> added useDynLib and importFrom directives to NAMESPACE") } ## lay things out in the src directory src <- file.path(root, "src") if (!file.exists(src)) { dir.create(src) } man <- file.path(root, "man") if (!file.exists(man)) { dir.create(man) } skeleton <- system.file("skeleton", package="RcppArmadillo") Makevars <- file.path(src, "Makevars") if (!file.exists(Makevars)) { file.copy(file.path(skeleton, "Makevars"), Makevars) message(" >> added Makevars file with Rcpp settings") } Makevars.win <- file.path(src, "Makevars.win") if (! file.exists(Makevars.win)) { file.copy(file.path(skeleton, "Makevars.win"), Makevars.win) message(" >> added Makevars.win file with RcppArmadillo settings") } if (example_code) { file.copy(file.path(skeleton, "rcpparma_hello_world.cpp"), src) message(" >> added example src file using armadillo classes") file.copy(file.path(skeleton, "rcpparma_hello_world.Rd"), man) message(" >> added example Rd file for using armadillo classes") Rcpp::compileAttributes(root) message(" >> invoked Rcpp::compileAttributes to create wrappers") } if (fake) { rm("Rcpp.fake.fun", envir=env) unlink(file.path(root, "R" , "Rcpp.fake.fun.R")) unlink(file.path(root, "man", "Rcpp.fake.fun.Rd")) } invisible(NULL) # #nocov end } RcppArmadillo/R/RcppExports.R0000644000176200001440000000601613773356716015645 0ustar liggesusers# Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #' Report the version of Armadillo #' #' @details The version is defined by Armadillo in the header \code{arma_version.hpp}. #' @param single A logical vector indicating whether a single return values is requested, #' or a named vector with three elements \code{major}, \code{minor} and \code{patch}. #' @return Depending on the value of \code{single}, either a single number describing #' the Armadillo version or a named vector with three elements \code{major}, \code{minor} #' and \code{patch}. #' @seealso Armadillo header file \code{arma_version.hpp}. armadillo_version <- function(single) { .Call(`_RcppArmadillo_armadillo_version`, single) } #' Set the Armadillo Random Number Generator to a random value #' #' @details #' Depending on whether RcppArmadillo was compiled for the C++98 standard #' (currently the default) or for C++11 (optional), two different RNGs may be used. #' This function resets either. For C++98, the R programming language's RNG is used. #' For C++11, the RNG included in the \code{} library is used only when #' \code{#define ARMA_USE_CXX11_RNG} is placed before \code{#include }. #' Otherwise, the R programming language's RNG will be used. #' @return The function is invoked for its side effect and has no return value. #' @note This has been found to not work as espected in \pkg{RStudio} #' as its code also uses the system RNG library. You may have to either #' not run within \pkg{RStudio} or change your code to use a different RNG such #' as the one from R. #' @seealso The R documentation on its RNGs all of which are accessible via \pkg{Rcpp}. armadillo_set_seed_random <- function() { invisible(.Call(`_RcppArmadillo_armadillo_set_seed_random`)) } #' Set the Armadillo Random Number Generator to the given value #' #' @param val The seed used to initialize Armadillo's random number generator. #' @details #' Depending on whether RcppArmadillo was compiled for the C++98 standard #' (currently the default) or for C++11 (optional), two different RNGs may be used. #' This function resets either. For C++98, the R programming language's RNG is used. #' For C++11, the RNG included in the \code{} library is used only when #' \code{#define ARMA_USE_CXX11_RNG} is placed before \code{#include }. #' Otherwise, the R programming language's RNG will be used. #' @return The function is invoked for its side effect and has no return value. #' @note This has been found to not work as espected in \pkg{RStudio} #' as its code also uses the system RNG library. You may have to either #' not run within \pkg{RStudio} or change your code to use a different RNG such #' as the one from R. #' @seealso The R documentation on its RNGs all of which are accessible via \pkg{Rcpp}. armadillo_set_seed <- function(val) { invisible(.Call(`_RcppArmadillo_armadillo_set_seed`, val)) } fastLm_impl <- function(X, y) { .Call(`_RcppArmadillo_fastLm_impl`, X, y) } RcppArmadillo/R/SciPy2R.R0000644000176200001440000000441014056451471014570 0ustar liggesusers## .SciPy2R.R: Conversion of SciPy sparse matrix to R ## ## Copyright (C) 2017 - 2020 Binxiang Ni and Dirk Eddelbuettel ## ## This file is part of RcppArmadillo. ## ## RcppArmadillo is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 2 of the License, or ## (at your option) any later version. ## ## RcppArmadillo is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with RcppArmadillo. If not, see . .SciPy2R <- function(spmat) { # #nocov start .Deprecated("This function is no longer needed as 'reticulate' now converts from 'scipy'.", package="reticulate") if (!requireNamespace("reticulate", quietly=TRUE)) { stop("You must install the 'reticulate' package (and have SciPy).", call.=FALSE) } type <- spmat$getformat() shape <- unlist(spmat$shape) data <- as.vector(reticulate::py_get_attr(spmat, "data")) # Since CSC Matrix from SciPy has been automatically converted to dgCMatrix, # the conversion for csc matrix is no longer needed. # if (type == "csc") { # indices <- as.vector(reticulate::py_get_attr(spmat, "indices")) # indptr <- as.vector(reticulate::py_get_attr(spmat, "indptr")) # res <- new("dgCMatrix", i = indices, p = indptr, x = data, Dim = shape) # } if (type == "coo") { row <- as.vector(reticulate::py_get_attr(spmat, "row")) col <- as.vector(reticulate::py_get_attr(spmat, "col")) res <- new("dgTMatrix", i = row, j = col, x = data, Dim = shape) } else if (type == "csr") { indices <- as.vector(reticulate::py_get_attr(spmat, "indices")) indptr <- as.vector(reticulate::py_get_attr(spmat, "indptr")) res <- new("dgRMatrix", j = indices, p = indptr, x = data, Dim = shape) } else { stop("Only CSC, COO and CSR matrices from SciPy are supported.", call.=FALSE) } return(res) } # #nocov end RcppArmadillo/R/fastLm.R0000644000176200001440000000776114057157110014571 0ustar liggesusers## fastLm.R: Rcpp/Armadillo implementation of lm() ## ## Copyright (C) 2010 - 2021 Dirk Eddelbuettel, Romain Francois and Douglas Bates ## ## This file is part of RcppArmadillo. ## ## RcppArmadillo is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 2 of the License, or ## (at your option) any later version. ## ## RcppArmadillo is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with RcppArmadillo. If not, see . fastLmPure <- function(X, y) { stopifnot(is.matrix(X), is.numeric(y), nrow(y)==nrow(X)) .Call(`_RcppArmadillo_fastLm_impl`, X, y) } fastLm <- function(X, ...) UseMethod("fastLm") fastLm.default <- function(X, y, ...) { X <- as.matrix(X) y <- as.numeric(y) res <- fastLmPure(X, y) res$coefficients <- as.vector(res$coefficient) names(res$coefficients) <- colnames(X) res$fitted.values <- as.vector(X %*% res$coefficients) res$residuals <- y - res$fitted.values res$call <- match.call() res$intercept <- any(apply(X, 2, function(x) all(x == x[1]))) class(res) <- "fastLm" res } print.fastLm <- function(x, ...) { cat("\nCall:\n") print(x$call) cat("\nCoefficients:\n") print(x$coefficients, digits=5) } summary.fastLm <- function(object, ...) { se <- object$stderr tval <- coef(object)/se TAB <- cbind(Estimate = coef(object), StdErr = se, t.value = tval, p.value = 2*pt(-abs(tval), df=object$df)) # why do I need this here? rownames(TAB) <- names(object$coefficients) colnames(TAB) <- c("Estimate", "StdErr", "t.value", "p.value") ## cf src/library/stats/R/lm.R and case with no weights and an intercept f <- object$fitted.values r <- object$residuals #mss <- sum((f - mean(f))^2) mss <- if (object$intercept) sum((f - mean(f))^2) else sum(f^2) rss <- sum(r^2) r.squared <- mss/(mss + rss) df.int <- if (object$intercept) 1L else 0L n <- length(f) rdf <- object$df adj.r.squared <- 1 - (1 - r.squared) * ((n - df.int)/rdf) res <- list(call=object$call, coefficients=TAB, r.squared=r.squared, adj.r.squared=adj.r.squared, sigma=sqrt(sum((object$residuals)^2)/rdf), df=object$df, residSum=summary(object$residuals, digits=5)[-4]) class(res) <- "summary.fastLm" res } print.summary.fastLm <- function(x, ...) { cat("\nCall:\n") print(x$call) cat("\nResiduals:\n") print(x$residSum) cat("\n") printCoefmat(x$coefficients, P.values=TRUE, has.Pvalue=TRUE) digits <- max(3, getOption("digits") - 3) cat("\nResidual standard error: ", formatC(x$sigma, digits=digits), " on ", formatC(x$df), " degrees of freedom\n", sep="") cat("Multiple R-squared: ", formatC(x$r.squared, digits=digits), ",\tAdjusted R-squared: ",formatC(x$adj.r.squared, digits=digits), "\n", sep="") invisible(x) } fastLm.formula <- function(formula, data=list(), ...) { mf <- model.frame(formula=formula, data=data) x <- model.matrix(attr(mf, "terms"), data=mf) y <- model.response(mf) res <- fastLm.default(x, y, ...) res$call <- match.call() res$formula <- formula res$intercept <- attr(attr(mf, "terms"), "intercept") res } predict.fastLm <- function(object, newdata=NULL, ...) { if (is.null(newdata)) { y <- fitted(object) } else { if (!is.null(object$formula)) { x <- model.matrix(object$formula, newdata) } else { x <- newdata # #nocov } y <- as.vector(x %*% coef(object)) } y } RcppArmadillo/R/flags.R0000644000176200001440000000167712253723621014441 0ustar liggesusers## Copyright (C) 2010 Dirk Eddelbuettel, Romain Francois and Douglas Bates ## ## This file is part of RcppArmadillo. ## ## RcppArmadillo is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 2 of the License, or ## (at your option) any later version. ## ## RcppArmadillo is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with RcppArmadillo. If not, see . RcppArmadilloCxxFlags <- function(){ paste( '-I"', system.file( "include", package = "RcppArmadillo" ), '"', sep = "" ) } CxxFlags <- function(){ cat( RcppArmadilloCxxFlags() ) } RcppArmadillo/MD50000644000176200001440000015177714173550004013334 0ustar liggesusers1e6f9b6150c76d9d8220a67dd7bc3c80 *ChangeLog d294787c06e1abe93bc3a885818de115 *DESCRIPTION 4333fca027d34ea48fdb884592b76b10 *NAMESPACE 536db52b819cae7ec1dce9868f4bddef *R/RcppArmadillo.package.skeleton.R 5d4b755559f20100a59c55c75cf73b06 *R/RcppExports.R 36125adfa038ee14587f8d55c6ca4425 *R/SciPy2R.R 8016a762faeef9b4454d7d0316f2c9c3 *R/fastLm.R c425fa93fb2732616eb94c17a8141afa *R/flags.R adf645daa452b2c43ebfa9d449c69449 *R/inline.R 20b4371ac81659c486b0b48d11435666 *README.md b181e0b64a91743186f6db25a3d776c1 *build/partial.rdb b419e494e4d1863c083530c7b6d13d34 *build/vignette.rds 3b61e4b295b01dd4bc1d12f94777844c *cleanup 4c37fc511bf29b598ecb51dfffd10bb6 *configure c9df57bb391a835715b7f238282958b5 *configure.ac a176169a58643ff39de12fff6e63b11f *inst/AUTHORS b6608a0367c7f14e162caddc1e7a581b *inst/CITATION ab2552793bb68fff3fc1447dad76543b *inst/COPYRIGHTS 1fbfc2787295f8f0da0396ca15f08ca0 *inst/NEWS.Rd 662c1aa30653a4d2667c81c1acd84c87 *inst/announce/ANNOUNCE-0.2.0.txt 36775614f3fdb06c07121a96332741e6 *inst/doc/RcppArmadillo-intro.Rnw d2b6e038f471b709ead6f0b06964d98b *inst/doc/RcppArmadillo-intro.pdf b7df93033cf8677a5bbd8870522ca9eb *inst/doc/RcppArmadillo-sparseMatrix.Rnw 61bb3367b20a600bfdc82f34c911cc49 *inst/doc/RcppArmadillo-sparseMatrix.pdf 8c836d5a9edcff81a85060a33142f0f5 *inst/examples/fastLm.r 93037baec9a906713b4ca11046a1b0fc *inst/examples/kalman/FirstKalmanR.R 4a7b51922e6d94f6dc6075eb5c0bf09f *inst/examples/kalman/Kalman.cpp 700568fe04f7c2001be4ad3ca5b6f244 *inst/examples/kalman/KalmanR.R df9eaa9c640cda72c24570759edf4cd1 *inst/examples/kalman/KalmanRimp.R 2879448e68c1679f0833da45cd454e5e *inst/examples/kalman/benchmark.R d329b78c9f94c4d99155333f18b3f311 *inst/examples/kalman/firstExample.R c3c2e3d3d7867f6ed7574a273723dcf5 *inst/examples/kalman/kalmanExample.m 04f360597c45a3eb82ada7f23be16812 *inst/examples/kalman/kalmanM.m c17927f9637d4000daf2aa4331c7db9d *inst/examples/kalman/kalmanfilter.m 2771369ff122fc008211c246481d09a5 *inst/examples/kalman/pos.txt 34be46a9afd0879fe2b6d3e07fcf8596 *inst/examples/varSimulation.r 446b5281f5e18f4946d7f915cde24337 *inst/include/README a94283f08c430987d60e838870e6ec6b *inst/include/RcppArmadillo.h 646fb8066afe7b3a0382f3e19188f94e *inst/include/RcppArmadillo/Alt_R_RNG.h daa8921d68416c321159f700a0477222 *inst/include/RcppArmadillo/Col_meat.h 29697cb890d6a5fb2b205772dfc27ca2 *inst/include/RcppArmadillo/Col_proto.h 8f93c982390d94e806882aa09368c289 *inst/include/RcppArmadillo/Mat_meat.h 084c9564f00621b4d4ee65e6ad5dc3b5 *inst/include/RcppArmadillo/Mat_proto.h e577ccb03d814de3925c79c083f080c6 *inst/include/RcppArmadillo/Row_meat.h bbda5c00444bb23d5e5ab3e7fe7f0f1c *inst/include/RcppArmadillo/Row_proto.h d5089eb12fc82112e3a4382747608b99 *inst/include/RcppArmadilloAs.h 2d125ed6bb94adbd7a92423ee2fe6da3 *inst/include/RcppArmadilloConfig.h 555f8de602da17d48c7f5fc054338850 *inst/include/RcppArmadilloConfigGenerated.h.in 52e090e9c3e5589c47a30ffb57c93956 *inst/include/RcppArmadilloExtensions/fixprob.h 34d716ed36ef2493765eb52e66985850 *inst/include/RcppArmadilloExtensions/rmultinom.h c1cbcb28269483b87b7330c576cc0f59 *inst/include/RcppArmadilloExtensions/sample.h 8842581c0a8b788dca6f256340ebd044 *inst/include/RcppArmadilloForward.h 8e81fd2cce3921b56a099ee512897e13 *inst/include/RcppArmadilloSugar.h 7d167026bc62fa42aa0a4b1489fb0f02 *inst/include/RcppArmadilloWrap.h bf4f409727c69f10daced68b963e572d *inst/include/armadillo 3748d298b0a616bf9ef3442cf1f2f2f8 *inst/include/armadillo_bits/BaseCube_bones.hpp 4793d4e0d1451151298f94ebc2ebf56f *inst/include/armadillo_bits/BaseCube_meat.hpp ec6affcd38761fb20386eb607c9cbfe1 *inst/include/armadillo_bits/Base_bones.hpp a4dff7b3d78dd03705c133475d48d41b *inst/include/armadillo_bits/Base_meat.hpp 4e5e0e02886bd25e4ed7f83ce2111835 *inst/include/armadillo_bits/Col_bones.hpp 85ad7928ed0e7e290629b5062506b9fd *inst/include/armadillo_bits/Col_meat.hpp 90d3d8a0e7533816d69f5767a4ad0181 *inst/include/armadillo_bits/CubeToMatOp_bones.hpp 5ed940e9707a5e658bff74394cc7f23c *inst/include/armadillo_bits/CubeToMatOp_meat.hpp 604c55afefc29f77eefd5d9448b7c6d5 *inst/include/armadillo_bits/Cube_bones.hpp 7887987b50ad65ec34b4818edc51c795 *inst/include/armadillo_bits/Cube_meat.hpp 7b4b07ea950e827a6c74d5dd51b6d1ae *inst/include/armadillo_bits/GenCube_bones.hpp 66ae583f55a617e461fe1218966c6d9d *inst/include/armadillo_bits/GenCube_meat.hpp c8279afb008d49811bf4a4d8bf038e7a *inst/include/armadillo_bits/GenSpecialiser.hpp f5e2750c565928e15f1935ee7e58a48d *inst/include/armadillo_bits/Gen_bones.hpp dc8d6eaa36cf3921914bb78635d0309b *inst/include/armadillo_bits/Gen_meat.hpp 53459308a3c415abb982dd434b6e98c9 *inst/include/armadillo_bits/GlueCube_bones.hpp 961befdc9dea89ade55c9ef4fe2ce71a *inst/include/armadillo_bits/GlueCube_meat.hpp dde97d31fad1263a96ed31035f25d6f7 *inst/include/armadillo_bits/Glue_bones.hpp 4441f3d893e695cdb8cd8a356b755615 *inst/include/armadillo_bits/Glue_meat.hpp 9740246d26e49d048456321f0ec210fc *inst/include/armadillo_bits/MapMat_bones.hpp 7d0a2fb492616e7017224c3711141b2c *inst/include/armadillo_bits/MapMat_meat.hpp 1c084efd4f37b99fac8c7966a6b9d84b *inst/include/armadillo_bits/Mat_bones.hpp 69c4c6c62cde4c3a7312e06e9202b378 *inst/include/armadillo_bits/Mat_meat.hpp 4a6284506024ed96b2d4e1a713c1be90 *inst/include/armadillo_bits/OpCube_bones.hpp 2a75e6fa41a0da090c86493acba722ca *inst/include/armadillo_bits/OpCube_meat.hpp 6336e975de6f002500424d270a1b5406 *inst/include/armadillo_bits/Op_bones.hpp 0f6044c68a04cc2ffb183eb532114f03 *inst/include/armadillo_bits/Op_meat.hpp 44309da37c4897308e4ad6231f130b5f *inst/include/armadillo_bits/Proxy.hpp d6a7ac09e43364b0e63c4aec3782a4a7 *inst/include/armadillo_bits/ProxyCube.hpp 5865588c2a1f2213d061a34d6f1058dc *inst/include/armadillo_bits/Row_bones.hpp cebe1082a6a775f523b57cddbebec5a5 *inst/include/armadillo_bits/Row_meat.hpp e92862a77b15f652825bddf76478918f *inst/include/armadillo_bits/SizeCube_bones.hpp b64eabaf37b691ebcb63d91e65dcde0a *inst/include/armadillo_bits/SizeCube_meat.hpp f9b29cc8b9a8ca5b32d5b9466972a4ab *inst/include/armadillo_bits/SizeMat_bones.hpp 4e237d3a5ae5e7d65c3a063f8e0c9ecc *inst/include/armadillo_bits/SizeMat_meat.hpp 101a3d5dfe5449d1ee88b3fbcb4c8ef1 *inst/include/armadillo_bits/SpBase_bones.hpp 80f82a33f5b742dbac51e215af1527d6 *inst/include/armadillo_bits/SpBase_meat.hpp a3c97d632877a0bb574dc4768d4feffb *inst/include/armadillo_bits/SpCol_bones.hpp 5d44822d341052b70d300f63b2a47933 *inst/include/armadillo_bits/SpCol_meat.hpp 06c186cc01fc7c01b1ad4dfab090f6f3 *inst/include/armadillo_bits/SpGlue_bones.hpp 7dcae47864934620311961c571c88975 *inst/include/armadillo_bits/SpGlue_meat.hpp 2c00f66456dd94007594c7d30d4371a8 *inst/include/armadillo_bits/SpMat_bones.hpp 33d10f8253a5e5de63ed3e977e8ec473 *inst/include/armadillo_bits/SpMat_iterators_meat.hpp a95a272565b8e567dbea07e3781be69c *inst/include/armadillo_bits/SpMat_meat.hpp 71077b9cd4b6254eb44a647a6da2a72c *inst/include/armadillo_bits/SpOp_bones.hpp 521dabfa35bd29bb5ee0621ac2c0b6d5 *inst/include/armadillo_bits/SpOp_meat.hpp 75764db9329e0707e81571ef91010e83 *inst/include/armadillo_bits/SpProxy.hpp 8d35fb7786cceb441ee7783369b97f90 *inst/include/armadillo_bits/SpRow_bones.hpp bc1511472fc7d947e445f8ddf16077b5 *inst/include/armadillo_bits/SpRow_meat.hpp 6ff2b79984a557009b9c4a569947cfe5 *inst/include/armadillo_bits/SpSubview_bones.hpp 8fb286c8fe462c8daefcb612c8e63576 *inst/include/armadillo_bits/SpSubview_col_list_bones.hpp 0f7d5e75e6c814a5362df4be92b940f7 *inst/include/armadillo_bits/SpSubview_col_list_meat.hpp 538a2ee0ac16374c31b60cb474998d81 *inst/include/armadillo_bits/SpSubview_iterators_meat.hpp cb4d2ae1e665800427983e6cb407a01e *inst/include/armadillo_bits/SpSubview_meat.hpp e89bf7ba944d5828fdf84626a76fb97e *inst/include/armadillo_bits/SpToDOp_bones.hpp 7028bfa16421d9e9c37ef67de0444d86 *inst/include/armadillo_bits/SpToDOp_meat.hpp 127de51bb2fdb41a0e0774eab74632e8 *inst/include/armadillo_bits/SpValProxy_bones.hpp 5de4c9a50bdb5551930cab5c371e7ec8 *inst/include/armadillo_bits/SpValProxy_meat.hpp e19516b1bf66e4c80053997ac9f7bf9c *inst/include/armadillo_bits/access.hpp 6d405de4f92fca8ef7992124ffd43967 *inst/include/armadillo_bits/arma_cmath.hpp 34dd1dc3a62d206c4fd49d2536406ce7 *inst/include/armadillo_bits/arma_config.hpp 0ac88ae01aec15bdf617e4c1a205b7ce *inst/include/armadillo_bits/arma_forward.hpp 2a1b2cad815d10260d332af54bb3590a *inst/include/armadillo_bits/arma_ostream_bones.hpp 71cebcf324277410bf04c3fbc0d8b390 *inst/include/armadillo_bits/arma_ostream_meat.hpp 9575132e3e6342597ba453869be23c49 *inst/include/armadillo_bits/arma_rel_comparators.hpp 272486cf9c137f32732f5141a264b839 *inst/include/armadillo_bits/arma_rng.hpp 585699c365e7ecd58c7a5b9c55e65b6e *inst/include/armadillo_bits/arma_rng_cxx11.hpp 1a4d27948133f7c882325663a01a8396 *inst/include/armadillo_bits/arma_rng_cxx98.hpp 9ef823e0b4c08e8dde05449da70e4426 *inst/include/armadillo_bits/arma_static_check.hpp e19f1dc5cfe180d18e9f301095b3bb8f *inst/include/armadillo_bits/arma_str.hpp 78c2b3a62ecf598f5ee9550c347ab526 *inst/include/armadillo_bits/arma_version.hpp 8a62b527c4ddff04a255b542967995b2 *inst/include/armadillo_bits/arrayops_bones.hpp 93977bf79e0bde690892963bdfd1d64f *inst/include/armadillo_bits/arrayops_meat.hpp 79e5e0cef9537f9df9e34a84079fb3d9 *inst/include/armadillo_bits/auxlib_bones.hpp 99ae2853b31ff93c40d442ece873a75e *inst/include/armadillo_bits/auxlib_meat.hpp 84f4a9722dd5e16a2e2f8afe2c43bd6b *inst/include/armadillo_bits/band_helper.hpp aa1a18761f6f7f04c87238c5baf7dd54 *inst/include/armadillo_bits/compiler_check.hpp caf5501456d7ea2bd57d7404f372c888 *inst/include/armadillo_bits/compiler_setup.hpp 470b6fe89e48afa4d213d1ab64cf2be1 *inst/include/armadillo_bits/compiler_setup_post.hpp bea9092fd834c6ae383f54e695aa0aac *inst/include/armadillo_bits/cond_rel_bones.hpp cf9429f8cd17b1cd2af072a407d0508b *inst/include/armadillo_bits/cond_rel_meat.hpp 1afc61336b03bc8c15ca054508487434 *inst/include/armadillo_bits/config.hpp 07e956d50a91d2ecb7dac79d216f2fae *inst/include/armadillo_bits/constants.hpp d6a415ed6a1cb3aa1fe85d94cca91324 *inst/include/armadillo_bits/constants_old.hpp 548a1115cd08b03c59af46def0477d2b *inst/include/armadillo_bits/csv_name.hpp fe7a08562f7ce387fed133cd732579d2 *inst/include/armadillo_bits/debug.hpp 843d3acaf917f02a5f898b334b3772cd *inst/include/armadillo_bits/def_arpack.hpp 5de3c2c8d1ab013107d6e168bdce1539 *inst/include/armadillo_bits/def_atlas.hpp 0350ba192f6957727027b12e5a69eecf *inst/include/armadillo_bits/def_blas.hpp 1a2875d5aad0410abfb5d257f4e2d447 *inst/include/armadillo_bits/def_hdf5.hpp 0fb5ae8db7a01c5b8ecf11c80acc5c92 *inst/include/armadillo_bits/def_lapack.hpp 4009aebd19fc6169932e7259bee8755d *inst/include/armadillo_bits/def_superlu.hpp 4290a37501876b74256db17937f308f5 *inst/include/armadillo_bits/diagmat_proxy.hpp 6e0adcc8ef43767911e2a62523845bfc *inst/include/armadillo_bits/diagview_bones.hpp 8a8dcbc53f0a85b84a130dc945c9813f *inst/include/armadillo_bits/diagview_meat.hpp 6e7a25f2a61e0be0c4066f4242bd6c68 *inst/include/armadillo_bits/diskio_bones.hpp a27df012dc53a59dafea081624f9abe9 *inst/include/armadillo_bits/diskio_meat.hpp 5ec42888cc718767fb4b1b81e3f2a434 *inst/include/armadillo_bits/distr_param.hpp 299836559392d035d081c8b3db6d2b32 *inst/include/armadillo_bits/eGlueCube_bones.hpp 74102056c174d1f3c9d9070f08cfbc8d *inst/include/armadillo_bits/eGlueCube_meat.hpp 1f03a7a6b8056c7893d21c054890579a *inst/include/armadillo_bits/eGlue_bones.hpp e0fae1e611d6a22212a214e5034d05c5 *inst/include/armadillo_bits/eGlue_meat.hpp 0ccddf70ad8c00c3009eb8de5dc70659 *inst/include/armadillo_bits/eOpCube_bones.hpp bb648d65dd8375d32f669f58c8f84094 *inst/include/armadillo_bits/eOpCube_meat.hpp 02b41b6eabd6a35a146240deea26bc7d *inst/include/armadillo_bits/eOp_bones.hpp 7511f5aea0b53a168697789b6c60c97a *inst/include/armadillo_bits/eOp_meat.hpp f07bd113fd72d3c3789243bb5d2cc6db *inst/include/armadillo_bits/eglue_core_bones.hpp 40b5a0d3ea5e4cfda6dea31af49511e5 *inst/include/armadillo_bits/eglue_core_meat.hpp fa69e60ae5b76ce8cb703dd4ffe132b7 *inst/include/armadillo_bits/eop_aux.hpp 7947ae9882d84cfb21c93bb7cec4c5a0 *inst/include/armadillo_bits/eop_core_bones.hpp c27d4619106069347051682b5ba95250 *inst/include/armadillo_bits/eop_core_meat.hpp fe641d1b5731ce1643965f9a4b30d287 *inst/include/armadillo_bits/fft_engine.hpp 8daedf082f273e9ea99894fab81b11f8 *inst/include/armadillo_bits/field_bones.hpp 3bdd3bb267e531d41f4e9cee58c61bab *inst/include/armadillo_bits/field_meat.hpp d3aff7282f6c019b9441aee451faa9d7 *inst/include/armadillo_bits/fill.hpp 4a599be485d98e9055f369e529ba21e3 *inst/include/armadillo_bits/fn_accu.hpp de3def0a51209e9bb2de53fce7908c4b *inst/include/armadillo_bits/fn_all.hpp 01bb7fdd40d249f51729869275b12661 *inst/include/armadillo_bits/fn_any.hpp 5df8e1e8f26d88bf0689037d9aaa1d7b *inst/include/armadillo_bits/fn_approx_equal.hpp 2f909e8d168275c8bd59a57fa44cbb58 *inst/include/armadillo_bits/fn_as_scalar.hpp c8b921eeb4310fb29d31a12b4f06e004 *inst/include/armadillo_bits/fn_chi2rnd.hpp 9d2c6690a39525ff30bbb0d318dc452d *inst/include/armadillo_bits/fn_chol.hpp 6af4ed230718df890fda060d7026b48f *inst/include/armadillo_bits/fn_clamp.hpp f849e7372887b410860b97e005325fc5 *inst/include/armadillo_bits/fn_cond.hpp 4183eb382a4e7fe5b2dc55e5211df8c9 *inst/include/armadillo_bits/fn_conv.hpp 9604dc18027e5149e5f4b983ccffab89 *inst/include/armadillo_bits/fn_conv_to.hpp 396e66f948ec60daf1cf5030f6dc6bb9 *inst/include/armadillo_bits/fn_cor.hpp 7623f81ff034b1340fe42db1f0d962f1 *inst/include/armadillo_bits/fn_cov.hpp eb20bd889c9b42f070334bd2957add90 *inst/include/armadillo_bits/fn_cross.hpp 108bb053871b6a0387cb6f00db658119 *inst/include/armadillo_bits/fn_cumprod.hpp 2f6e0325e0f59a36e9d18faf601d3fe6 *inst/include/armadillo_bits/fn_cumsum.hpp 9fe411bdabda86f2d9e28855ea7ce29e *inst/include/armadillo_bits/fn_det.hpp 95309b1dc5300527eef4c0333242c343 *inst/include/armadillo_bits/fn_diagmat.hpp 87e695834690312da4c1aa0b69b94b34 *inst/include/armadillo_bits/fn_diagvec.hpp f12d6e38cab26931f033789a0d62e99b *inst/include/armadillo_bits/fn_diff.hpp ca18fc0fa706ab6027151e81c6803246 *inst/include/armadillo_bits/fn_dot.hpp 0211fe273ed93c2590b93339fbb02213 *inst/include/armadillo_bits/fn_eig_gen.hpp 7c9543f859d4fb17941a4508ca97eb99 *inst/include/armadillo_bits/fn_eig_pair.hpp 28afa010fcdf9bc68031215c0f6e4a6f *inst/include/armadillo_bits/fn_eig_sym.hpp 37f04be16bea6d3a7844ae7d14a909ef *inst/include/armadillo_bits/fn_eigs_gen.hpp 52155fea26a11a26f7a1f84cdb72ff6f *inst/include/armadillo_bits/fn_eigs_sym.hpp 2970c2dc52e063b30af2902724b8513a *inst/include/armadillo_bits/fn_elem.hpp afab7290dc91cbe4b7e161b0763be6b9 *inst/include/armadillo_bits/fn_eps.hpp 21f0b385e342abbbabfdd735602b3a6d *inst/include/armadillo_bits/fn_expmat.hpp 53f92091145883608c8fbbc3fdc5f3fe *inst/include/armadillo_bits/fn_eye.hpp 7de08b94434a2a336619a772292ac918 *inst/include/armadillo_bits/fn_fft.hpp bf91abf50f467413af242e7666569f14 *inst/include/armadillo_bits/fn_fft2.hpp 921fed8557c49b4f0e8353c6ad69041e *inst/include/armadillo_bits/fn_find.hpp 69e0ca2493b85e9827c7234dad9f51d7 *inst/include/armadillo_bits/fn_find_unique.hpp bed75cb600f8d3663eba18e68e9f432d *inst/include/armadillo_bits/fn_flip.hpp 83399279c53e124a74a9b655b06d93b5 *inst/include/armadillo_bits/fn_hess.hpp 12bbb939a99761ee14060119e061c506 *inst/include/armadillo_bits/fn_hist.hpp c133c2a2dabd5e2d76960efb680a1239 *inst/include/armadillo_bits/fn_histc.hpp 0b0327a2d33f6a99ce24ae5f02062433 *inst/include/armadillo_bits/fn_index_max.hpp ff9958234659e1a664c0d9f7ffceff0b *inst/include/armadillo_bits/fn_index_min.hpp 26ccd442d5a421edd3db0dd3b0826e7b *inst/include/armadillo_bits/fn_inplace_strans.hpp 4fc2e5565fac20517ed147f971159c97 *inst/include/armadillo_bits/fn_inplace_trans.hpp 137efa12dd401c0ca2508a96a846179e *inst/include/armadillo_bits/fn_interp1.hpp f341727fa36b8a987a686a83a1e4c0a3 *inst/include/armadillo_bits/fn_interp2.hpp 8f8e5e231abb56ddce8e091386ae17b6 *inst/include/armadillo_bits/fn_intersect.hpp c336750e0ee20c92e1d7b857e0e5dc8e *inst/include/armadillo_bits/fn_inv.hpp f4b163661808aba001fc65b7c185f91f *inst/include/armadillo_bits/fn_join.hpp 2f31d3865b466f54868fda44babe89b3 *inst/include/armadillo_bits/fn_kmeans.hpp 9794722904d8d17748cf073ffdf5471b *inst/include/armadillo_bits/fn_kron.hpp 099d19911709bfacf08dfca936840cf1 *inst/include/armadillo_bits/fn_log_det.hpp 8b2737ee9b099908822b203bfd6d554f *inst/include/armadillo_bits/fn_log_normpdf.hpp de8475ecc5b1fade1ab1fb7d45286ea5 *inst/include/armadillo_bits/fn_logmat.hpp c3dd2cb3200b2bd51b71b69ace523c84 *inst/include/armadillo_bits/fn_lu.hpp 434570d15c4337c0cf48838458b39274 *inst/include/armadillo_bits/fn_max.hpp 1280f2ada4a2ace4bde9a74329c936a3 *inst/include/armadillo_bits/fn_mean.hpp 950aafe77309a2d8b1cf7503c004a858 *inst/include/armadillo_bits/fn_median.hpp fcb57fe33ef1f47082a82ced74b5c552 *inst/include/armadillo_bits/fn_min.hpp 3f49fbaa2ca902f35650942db1f7ea72 *inst/include/armadillo_bits/fn_misc.hpp f61006e8fc918d9d7b6d7949563d4735 *inst/include/armadillo_bits/fn_mvnrnd.hpp 971c86972cb0a7e7ab8d83f8d056dd3b *inst/include/armadillo_bits/fn_n_unique.hpp 3bf844d80dd8240a84f6510eec0a3260 *inst/include/armadillo_bits/fn_nonzeros.hpp ea7fe904de342ce9089694365f93b66d *inst/include/armadillo_bits/fn_norm.hpp ce2679b93bdd4e3a88178de3fcb3b13f *inst/include/armadillo_bits/fn_normalise.hpp 5da1d124af011e55487d70e6e547166c *inst/include/armadillo_bits/fn_normcdf.hpp c40c5ad45091f6971fd04a7deced8383 *inst/include/armadillo_bits/fn_normpdf.hpp c5f18fce5a5c3eeb3a69d50fef291ae2 *inst/include/armadillo_bits/fn_numel.hpp b8886bffc736fa92e2f8b727cdf28f83 *inst/include/armadillo_bits/fn_ones.hpp 752a4188729decae80e9f1df56a76ece *inst/include/armadillo_bits/fn_orth_null.hpp 264158e0d46cc45541b556efdc0900e5 *inst/include/armadillo_bits/fn_pinv.hpp 3ff795f5e0f8c58fa75db9deb36b648b *inst/include/armadillo_bits/fn_polyfit.hpp 6c0703440bc5251a3327e86e72865d80 *inst/include/armadillo_bits/fn_polyval.hpp b8aed429e579a132cb2ac3fdf5294326 *inst/include/armadillo_bits/fn_powmat.hpp c7734ee14e54a3539145f412b43416dd *inst/include/armadillo_bits/fn_princomp.hpp 94e82b18214807c054761b480c8e30d6 *inst/include/armadillo_bits/fn_prod.hpp ecedf1a575b7a9b2bd1462e1e7a0c9f5 *inst/include/armadillo_bits/fn_qr.hpp 0bc1a4fa5d918c06ac4d7fee10568bd0 *inst/include/armadillo_bits/fn_quantile.hpp 5b8bcb9e440dd1d36baf67884a526f71 *inst/include/armadillo_bits/fn_qz.hpp 6edfc7c592d70ef3994ed3ccc647e9e1 *inst/include/armadillo_bits/fn_randg.hpp ce77f6a0688d2e1b65d350f8717f95eb *inst/include/armadillo_bits/fn_randi.hpp 8eab829237547d018334ad4448a4f6ec *inst/include/armadillo_bits/fn_randn.hpp 5d6f2af2fa26ac7c7d39c7515bcaca0a *inst/include/armadillo_bits/fn_randperm.hpp 5cfe245782bdd822a04b734e1a85c43b *inst/include/armadillo_bits/fn_randu.hpp c5a2e3600a7c09ea5b317da544f392bc *inst/include/armadillo_bits/fn_range.hpp 3c0f591005c98d6469f76ee0a54cc26c *inst/include/armadillo_bits/fn_rank.hpp d13df9d571b614033912dda856f41d5a *inst/include/armadillo_bits/fn_regspace.hpp a19d7b313195b9b73479c1394703d48f *inst/include/armadillo_bits/fn_repelem.hpp 5acae297549c7263cec11fa3546c3cbd *inst/include/armadillo_bits/fn_repmat.hpp 2c763936cbf33ccc5d9365525a4ef702 *inst/include/armadillo_bits/fn_reshape.hpp 93c10598adad519746ab42cc4a5e2d6c *inst/include/armadillo_bits/fn_resize.hpp 07cfea937cb14632d75c35471860e67a *inst/include/armadillo_bits/fn_reverse.hpp 371d088083ce954758b97d45f45fcb28 *inst/include/armadillo_bits/fn_roots.hpp 70eaf37cd0c2ef4e7957cff9ea1da628 *inst/include/armadillo_bits/fn_schur.hpp 58fe6327884b16026e554134b44fc17f *inst/include/armadillo_bits/fn_shift.hpp 07db6a360049e24f5fd8f7c52663a8eb *inst/include/armadillo_bits/fn_shuffle.hpp c909eeb13249e65935c944030b2070d9 *inst/include/armadillo_bits/fn_size.hpp 82f3f94933451867322a86890216c008 *inst/include/armadillo_bits/fn_solve.hpp 79d343dc48ad6f41eafe6f13b32d8039 *inst/include/armadillo_bits/fn_sort.hpp e21d013adc2f9a5ffb9c1d379994185c *inst/include/armadillo_bits/fn_sort_index.hpp 686097fb52a9d3650853c61a37f86aa5 *inst/include/armadillo_bits/fn_speye.hpp 567e68b5eea6eeb0b15233b4dcad438f *inst/include/armadillo_bits/fn_spones.hpp 26568cd14d90e0d0e7c6620915b766c8 *inst/include/armadillo_bits/fn_sprandn.hpp d018b4d31969d94f8885719240e2ed00 *inst/include/armadillo_bits/fn_sprandu.hpp d9b69825585114863136321401e3dcdd *inst/include/armadillo_bits/fn_spsolve.hpp 293d1e33fac678e3619b64329f10d7fc *inst/include/armadillo_bits/fn_sqrtmat.hpp 8a7536cfdf1d3a4deb936a2bebc22c9b *inst/include/armadillo_bits/fn_stddev.hpp 792060b3be64d433e315330f5217980a *inst/include/armadillo_bits/fn_strans.hpp 92d58633385c74a943e5b6fe11ab65b3 *inst/include/armadillo_bits/fn_sum.hpp ae75403b544081cf25e948d5c41f8683 *inst/include/armadillo_bits/fn_svd.hpp 8635f4524d17f95f5e7d2d1f4940c8cc *inst/include/armadillo_bits/fn_svds.hpp 7b5f591368e84d790ce9495b7e2c7c1f *inst/include/armadillo_bits/fn_sylvester.hpp 36e190ec37538c494d91197d44d5736c *inst/include/armadillo_bits/fn_symmat.hpp fdeef768de92e6bc0f3307d80e0bfb76 *inst/include/armadillo_bits/fn_toeplitz.hpp 343fd6adaa417ae753ee796426e37f81 *inst/include/armadillo_bits/fn_trace.hpp f238ff162808bcba022b1111b2c20068 *inst/include/armadillo_bits/fn_trans.hpp acbc4d11c5c5b2cb74cdaef9910e6765 *inst/include/armadillo_bits/fn_trapz.hpp 60c0f37b57dd04389e30812f5d4368ac *inst/include/armadillo_bits/fn_trig.hpp 27e2f45fd2e51a5a6e7ce2afb249c66b *inst/include/armadillo_bits/fn_trimat.hpp 268109c5170d35dd313566d8c995b43a *inst/include/armadillo_bits/fn_trimat_ind.hpp d5a3f66951e2db1d7e0c2a135e6dc533 *inst/include/armadillo_bits/fn_trunc_exp.hpp 99bcb13e515cd2d837e7e25ce0221e23 *inst/include/armadillo_bits/fn_trunc_log.hpp e1e2604f5a4679e96372bbcb11807675 *inst/include/armadillo_bits/fn_unique.hpp 46ac66404e5fdc4e7dbab0643a745e74 *inst/include/armadillo_bits/fn_var.hpp 2570f8d1ebb5fa21e1c1e1fc295a2c1f *inst/include/armadillo_bits/fn_vectorise.hpp 6d51c036c21f2ccb0826744c6f3d6848 *inst/include/armadillo_bits/fn_wishrnd.hpp 5d1372259f75b960421af68971eabb86 *inst/include/armadillo_bits/fn_zeros.hpp fd1da746bc8f3ec6a9521f9dcc29b50f *inst/include/armadillo_bits/glue_affmul_bones.hpp c28bb522614cb68e0a031010f8c97a5a *inst/include/armadillo_bits/glue_affmul_meat.hpp 758918bf6fdc8f15930c5d8e596e2746 *inst/include/armadillo_bits/glue_atan2_bones.hpp 5bde8cdc9664f442b0099ee67f2aa036 *inst/include/armadillo_bits/glue_atan2_meat.hpp 228620666311453c5bdb0246799bdc7b *inst/include/armadillo_bits/glue_conv_bones.hpp 95b312aaa7068fb31422c61b7a276595 *inst/include/armadillo_bits/glue_conv_meat.hpp da67cec5d69a053037fbd3fac09f4177 *inst/include/armadillo_bits/glue_cor_bones.hpp e3e0236652fc5ab70525bf03afeea3fd *inst/include/armadillo_bits/glue_cor_meat.hpp f7e1fd84a54d44f6856c8b6ef0bb33a0 *inst/include/armadillo_bits/glue_cov_bones.hpp a708de417219d008a0f6a68a32fea1cf *inst/include/armadillo_bits/glue_cov_meat.hpp 11e82cb2ab71ae533761c5131bfe57cc *inst/include/armadillo_bits/glue_cross_bones.hpp 6b83ce831376677fbfa6808d25e7887a *inst/include/armadillo_bits/glue_cross_meat.hpp 74534f195669f96862bd60fe742662e1 *inst/include/armadillo_bits/glue_hist_bones.hpp 599859deddc8ecea202adf3de0decdd4 *inst/include/armadillo_bits/glue_hist_meat.hpp ebbe2483a02cc15baf42c1ef99654345 *inst/include/armadillo_bits/glue_histc_bones.hpp d7686927197505fcf342ec3c6d7643a0 *inst/include/armadillo_bits/glue_histc_meat.hpp df220080feacdd7ecdebd7803d6de29f *inst/include/armadillo_bits/glue_hypot_bones.hpp 6db7ecf2fa4cf1569438cdcb5592fb62 *inst/include/armadillo_bits/glue_hypot_meat.hpp 6b2547c27c50ee53993a8877935dafdb *inst/include/armadillo_bits/glue_intersect_bones.hpp 279a41bbe0a7158454d5b5c8eb11a80c *inst/include/armadillo_bits/glue_intersect_meat.hpp 30893821b24130bd727bcb50d51c84b4 *inst/include/armadillo_bits/glue_join_bones.hpp 0e60bcc17ceaded32e7adf3cf18af80e *inst/include/armadillo_bits/glue_join_meat.hpp d255be47039eab5a4b9e02b0a6f9cf1b *inst/include/armadillo_bits/glue_kron_bones.hpp 36e5fa177fb12b4a5eb988b5615cee8c *inst/include/armadillo_bits/glue_kron_meat.hpp 5168fff71c97c248d913eb242b772aed *inst/include/armadillo_bits/glue_max_bones.hpp 57332a1abc3bc1dce76c1d4c244febd6 *inst/include/armadillo_bits/glue_max_meat.hpp 36c40009d2307ba4f6e7afb635fd7672 *inst/include/armadillo_bits/glue_min_bones.hpp b8b79476fbcdb5ca2903ee600ff4818f *inst/include/armadillo_bits/glue_min_meat.hpp 60906aedfd5c3a5f46591b1c07097f46 *inst/include/armadillo_bits/glue_mixed_bones.hpp 2e7f1a3c8e699355e0abfc69a3bc411e *inst/include/armadillo_bits/glue_mixed_meat.hpp 6546a287526bf276bef436f98705ea3e *inst/include/armadillo_bits/glue_mvnrnd_bones.hpp d5b08155ff68f4f4a6bb62f7e965b2f1 *inst/include/armadillo_bits/glue_mvnrnd_meat.hpp 98b5012e5be636fc348f7ecc3fab6ff7 *inst/include/armadillo_bits/glue_polyfit_bones.hpp 27bf91db17694d2cfd65c0c2ad5b5cb7 *inst/include/armadillo_bits/glue_polyfit_meat.hpp 27726a22fe9608be69201e88c66613e7 *inst/include/armadillo_bits/glue_polyval_bones.hpp b1137bc553b35eb60fa511a6a1dc423f *inst/include/armadillo_bits/glue_polyval_meat.hpp f46fa8415771de7af93791de2ebfd809 *inst/include/armadillo_bits/glue_quantile_bones.hpp 3a68c96b2b0f482a87f12ac4c4fac972 *inst/include/armadillo_bits/glue_quantile_meat.hpp 260954229c78079ec76e088aca91a391 *inst/include/armadillo_bits/glue_relational_bones.hpp 7f9a1104c0b1d879a22df7725dc02306 *inst/include/armadillo_bits/glue_relational_meat.hpp d3a38bf09e6a8a556cdea0d2ea0e27d5 *inst/include/armadillo_bits/glue_solve_bones.hpp 94592581e5330969682d37be5164893e *inst/include/armadillo_bits/glue_solve_meat.hpp 4e639dd9acc118d8cad340e29a531854 *inst/include/armadillo_bits/glue_times_bones.hpp e66fcd108d8604b980e3001ff0ffe85b *inst/include/armadillo_bits/glue_times_meat.hpp 7b4e0a89301fd57f3f8138f9d56b3862 *inst/include/armadillo_bits/glue_toeplitz_bones.hpp d949e60b469a3caa77bd4d47a84e5428 *inst/include/armadillo_bits/glue_toeplitz_meat.hpp e09461d473859cedd1a44d359a206280 *inst/include/armadillo_bits/glue_trapz_bones.hpp 3214a47b4580e6446c0cbf1a9ba72db4 *inst/include/armadillo_bits/glue_trapz_meat.hpp 63c7772e5ca5a5fe4cbbf7b786ff26eb *inst/include/armadillo_bits/gmm_diag_bones.hpp f9b1b53054596845d36bd44d51602629 *inst/include/armadillo_bits/gmm_diag_meat.hpp 8c13a2d8d0cd5eb2311dc858f3728227 *inst/include/armadillo_bits/gmm_full_bones.hpp aaba434b014b8dc3448d1449c1b84135 *inst/include/armadillo_bits/gmm_full_meat.hpp d21822ba19e98547cebad93ccef77974 *inst/include/armadillo_bits/gmm_misc_bones.hpp 63999728f0a9e7a1d65bc302f87fb1a4 *inst/include/armadillo_bits/gmm_misc_meat.hpp 5b6300038a3e26440853d933d153c1ba *inst/include/armadillo_bits/hdf5_misc.hpp 52605337608f7309722ef43d220e9a98 *inst/include/armadillo_bits/hdf5_name.hpp 852f4d8780e5b7624259bcb5eaddda99 *inst/include/armadillo_bits/include_atlas.hpp 93e1b86bcaaa9084be2fd38526d8ec02 *inst/include/armadillo_bits/include_hdf5.hpp 77fe72aad97d3d75717606e37cb5ccb6 *inst/include/armadillo_bits/include_superlu.hpp 0b6e5ecafc969ce7a4ee7a0941ff9ea7 *inst/include/armadillo_bits/injector_bones.hpp a808eab0ed1f98c1e3ac9ee0e463ef0c *inst/include/armadillo_bits/injector_meat.hpp c94c15246d0d0068159f2edc888106a9 *inst/include/armadillo_bits/memory.hpp 87901cafa7674dba60243c4898057376 *inst/include/armadillo_bits/mp_misc.hpp 74c90494099328f512a534cf52b7f3fb *inst/include/armadillo_bits/mtGlueCube_bones.hpp 98d09eb0818cb354fda204fd7a0141d4 *inst/include/armadillo_bits/mtGlueCube_meat.hpp 05164b1e286e3826b83d3330c00319a0 *inst/include/armadillo_bits/mtGlue_bones.hpp c387b3bab9bdc49ee4324a8c43124a71 *inst/include/armadillo_bits/mtGlue_meat.hpp 31d2b2a441c1d0bbe418961be4eef123 *inst/include/armadillo_bits/mtOpCube_bones.hpp d9afff53e6ee5bfdd773e13813c419c1 *inst/include/armadillo_bits/mtOpCube_meat.hpp 23c3291e7732ef00c01aa5ffd8565ffc *inst/include/armadillo_bits/mtOp_bones.hpp 200fdd0c69f94378f1059210c3826cd9 *inst/include/armadillo_bits/mtOp_meat.hpp 478f360a19bc4fa3986d9bb2d5867418 *inst/include/armadillo_bits/mtSpGlue_bones.hpp 9849fc2e9351ebdc5b3affbfa1261727 *inst/include/armadillo_bits/mtSpGlue_meat.hpp 9e035bd345a7a4904d2634da557f1327 *inst/include/armadillo_bits/mtSpOp_bones.hpp 65c70bee2b399960c045077a1ee1eb0c *inst/include/armadillo_bits/mtSpOp_meat.hpp bd290eda87be478c3347226287f25f3d *inst/include/armadillo_bits/mul_gemm.hpp ce056bca45e7e336edcb5238610adf70 *inst/include/armadillo_bits/mul_gemm_mixed.hpp 4e50cc32685a37e8f51108118accd4fc *inst/include/armadillo_bits/mul_gemv.hpp a22d6761f5b765a6eb9e5bf9e507f9b8 *inst/include/armadillo_bits/mul_herk.hpp 34cebdd97f46015ea88d03ce1082dc38 *inst/include/armadillo_bits/mul_syrk.hpp cd751c8539247bfcbf7c69277af7d7d8 *inst/include/armadillo_bits/newarp_DenseGenMatProd_bones.hpp 82406852dba0e0d9989b15da023b7b99 *inst/include/armadillo_bits/newarp_DenseGenMatProd_meat.hpp 8fbd622a93e16834af098ec8b0a3c9ea *inst/include/armadillo_bits/newarp_DoubleShiftQR_bones.hpp 3ab87ddafe3b84fdef781fb0e7507583 *inst/include/armadillo_bits/newarp_DoubleShiftQR_meat.hpp 4dced0e5a3b97ea3b3d113f17e876f15 *inst/include/armadillo_bits/newarp_EigsSelect.hpp 45c469b4f8cdaf6aa158701d14f2bbd2 *inst/include/armadillo_bits/newarp_GenEigsSolver_bones.hpp d72bdf3ed23bf9a5e15f58a53a813be2 *inst/include/armadillo_bits/newarp_GenEigsSolver_meat.hpp 668c2fe7e60ef13ce108f1775567fb1c *inst/include/armadillo_bits/newarp_SortEigenvalue.hpp 1fec6c26bc8e9a395485e2901f24caf1 *inst/include/armadillo_bits/newarp_SparseGenMatProd_bones.hpp 90ecf513a27065c47e0f95ed3d7d85f3 *inst/include/armadillo_bits/newarp_SparseGenMatProd_meat.hpp f7cf58f1e5eeac485d0a896573598f10 *inst/include/armadillo_bits/newarp_SparseGenRealShiftSolve_bones.hpp c455cf21f4459d3dfd0c6302060755bb *inst/include/armadillo_bits/newarp_SparseGenRealShiftSolve_meat.hpp 82aa7e1349ffd441ab07904b369a12dd *inst/include/armadillo_bits/newarp_SymEigsShiftSolver_bones.hpp 5602b63ab8cbe9e4adade94611acaeed *inst/include/armadillo_bits/newarp_SymEigsShiftSolver_meat.hpp 2a42191a9cab3eb05a64316c4820b9f7 *inst/include/armadillo_bits/newarp_SymEigsSolver_bones.hpp bfa98cd78312c180c18465be874158f7 *inst/include/armadillo_bits/newarp_SymEigsSolver_meat.hpp d90c1104ae351152be1f21797883189f *inst/include/armadillo_bits/newarp_TridiagEigen_bones.hpp 1daf0368d2f49b4fde2416ac037520b5 *inst/include/armadillo_bits/newarp_TridiagEigen_meat.hpp 840e84c6e089a4ec8d2bfa94bf580c67 *inst/include/armadillo_bits/newarp_UpperHessenbergEigen_bones.hpp f4c3af4608117ec7ea7aac62466cf9b1 *inst/include/armadillo_bits/newarp_UpperHessenbergEigen_meat.hpp a571a4772c12783d99dde1fa1d49a70d *inst/include/armadillo_bits/newarp_UpperHessenbergQR_bones.hpp e7c56e47cd27e4eebcbef773b26cdb1d *inst/include/armadillo_bits/newarp_UpperHessenbergQR_meat.hpp 63d382b7fbbc6ea9bd377ce5d3fb8da2 *inst/include/armadillo_bits/newarp_cx_attrib.hpp 878824ad6f5cb938529e214a6e97ec39 *inst/include/armadillo_bits/op_all_bones.hpp 2007a1dc9c4b7ddbb681c4a4f3ec4edd *inst/include/armadillo_bits/op_all_meat.hpp bf57f59085a47bd547ef0b9dfac8b2ee *inst/include/armadillo_bits/op_any_bones.hpp 2af77b1b54f098975b57683d5461bc8f *inst/include/armadillo_bits/op_any_meat.hpp 8b100ef30e966ea7122c1df5d840d81a *inst/include/armadillo_bits/op_chi2rnd_bones.hpp 4f38f37e5c62b4a04c2306228754dbcd *inst/include/armadillo_bits/op_chi2rnd_meat.hpp 2293aec27f979a60988543a719b97762 *inst/include/armadillo_bits/op_chol_bones.hpp f43d2cf8d9e6aa6958150e12c9a40309 *inst/include/armadillo_bits/op_chol_meat.hpp 3951138bd972663f19d01de5be7b7505 *inst/include/armadillo_bits/op_clamp_bones.hpp be6b63647d3889173c3d3ddd70867ff1 *inst/include/armadillo_bits/op_clamp_meat.hpp c165cec5b7eae7c6d89816f5bc60975c *inst/include/armadillo_bits/op_cond_bones.hpp 9fadad780a7276f4aeb8b2436e3e38e8 *inst/include/armadillo_bits/op_cond_meat.hpp 73ab881f6d3081fa97cfeb5a6b6f76a7 *inst/include/armadillo_bits/op_cor_bones.hpp ac1da0fbb1968117c7810cdb5b05dab1 *inst/include/armadillo_bits/op_cor_meat.hpp 6c1a11f77b9d90f5c204d5f205bd9904 *inst/include/armadillo_bits/op_cov_bones.hpp d4439bc730d6cedcb4d2ac22c01d80f5 *inst/include/armadillo_bits/op_cov_meat.hpp 593784958a877a6120a8cd5070942848 *inst/include/armadillo_bits/op_cumprod_bones.hpp e9d4afa0f6caea24d73ce5678728f044 *inst/include/armadillo_bits/op_cumprod_meat.hpp d1ef53e747cc1add9af12177b00e9c77 *inst/include/armadillo_bits/op_cumsum_bones.hpp cf939ba80c59cf7494c0c0f5a96c261c *inst/include/armadillo_bits/op_cumsum_meat.hpp 4fe3a4a985c9ac57cef094876476b77d *inst/include/armadillo_bits/op_cx_scalar_bones.hpp dc1a870ab156d2cc2269ec2ec5e2283f *inst/include/armadillo_bits/op_cx_scalar_meat.hpp fd4f245b71016e24725b955340017654 *inst/include/armadillo_bits/op_det_bones.hpp 2cbb1a64a377e2d8114fd9cb19c5e91c *inst/include/armadillo_bits/op_det_meat.hpp f7b1651833dd950538da05e4bf3a5abd *inst/include/armadillo_bits/op_diagmat_bones.hpp c4105e53dd26d8f80370061edc0b55b3 *inst/include/armadillo_bits/op_diagmat_meat.hpp 37088a9028e4421dbb1b44895f2d24e2 *inst/include/armadillo_bits/op_diagvec_bones.hpp 90f8e79e48170b8d8e178e46e079840c *inst/include/armadillo_bits/op_diagvec_meat.hpp 068065fe327abd3e6ee80f93c4a56885 *inst/include/armadillo_bits/op_diff_bones.hpp 0ec736bb76cf3398a4b4c8bba3c46f1b *inst/include/armadillo_bits/op_diff_meat.hpp 2f69db7275a641ba045e6e32b95e6e8b *inst/include/armadillo_bits/op_dot_bones.hpp af5eb3745079a3ba793f4945cfb83c49 *inst/include/armadillo_bits/op_dot_meat.hpp 128afd228ff8edaf56a9721986f6d61a *inst/include/armadillo_bits/op_dotext_bones.hpp 173c955fbed1cdcb975eae64a0ab9e09 *inst/include/armadillo_bits/op_dotext_meat.hpp 11a14e241191788dc3282bf2fdce2dc2 *inst/include/armadillo_bits/op_expmat_bones.hpp 0b6555562346b350ab810f6cae35c145 *inst/include/armadillo_bits/op_expmat_meat.hpp 532f14156fb423b3c017578069d37904 *inst/include/armadillo_bits/op_fft_bones.hpp 8159b0bfc0bd806e5c06bb4ceff5c80a *inst/include/armadillo_bits/op_fft_meat.hpp 641a08ed1993fda26917cc29c293d290 *inst/include/armadillo_bits/op_find_bones.hpp 75fb41b59f665711a65248e8401011bb *inst/include/armadillo_bits/op_find_meat.hpp 73123b1a2ef10996531317c40fe52873 *inst/include/armadillo_bits/op_find_unique_bones.hpp 6d1d0c700e9e9ef6baaa4f3e193bfcba *inst/include/armadillo_bits/op_find_unique_meat.hpp f106fbbfaf53b7a51e0319f83fef7ec1 *inst/include/armadillo_bits/op_flip_bones.hpp 067d48a9439b971242f6d67b3a9d36ad *inst/include/armadillo_bits/op_flip_meat.hpp 6274576457b60ec6f4f0089389a02416 *inst/include/armadillo_bits/op_hist_bones.hpp 46fa041c3c3c865171298ab226ce5e38 *inst/include/armadillo_bits/op_hist_meat.hpp aebe1f8676311912fb6a2b9942663748 *inst/include/armadillo_bits/op_htrans_bones.hpp 5b91c0186bce0c7367987f076bbea172 *inst/include/armadillo_bits/op_htrans_meat.hpp 26cc158dbddaad13a3e204d46604c536 *inst/include/armadillo_bits/op_index_max_bones.hpp 58c3255506bf5b7255a3897840e64c8a *inst/include/armadillo_bits/op_index_max_meat.hpp 9b695ba25a988e77289b78e433171db8 *inst/include/armadillo_bits/op_index_min_bones.hpp de6ad9cd26a06b64816b883cd1e185ee *inst/include/armadillo_bits/op_index_min_meat.hpp 02250956ab72c8a2e15a23677f9862b1 *inst/include/armadillo_bits/op_inv_bones.hpp 8d94088737412e21a25c11a563292c73 *inst/include/armadillo_bits/op_inv_meat.hpp f9a9097c9e2e3eaa16a5dba455c74907 *inst/include/armadillo_bits/op_log_det_bones.hpp 1c080d5d8764e2fd13ea53ff3463caab *inst/include/armadillo_bits/op_log_det_meat.hpp 634c9420dca34b8124588ea46ae6168b *inst/include/armadillo_bits/op_logmat_bones.hpp 0a787745e5ad2ca379022d54ced6981c *inst/include/armadillo_bits/op_logmat_meat.hpp 4d8e64ba874ef9148eec90721f9de463 *inst/include/armadillo_bits/op_max_bones.hpp 194f8969c693a46d1435f9046bb1edeb *inst/include/armadillo_bits/op_max_meat.hpp 346e9d7f98f5c2b5ec3bd13c5c4d9f28 *inst/include/armadillo_bits/op_mean_bones.hpp dfecd0beef73daca20f8d0e50a0264eb *inst/include/armadillo_bits/op_mean_meat.hpp 495fd27578b0e0fc76343e2dea82d269 *inst/include/armadillo_bits/op_median_bones.hpp c7ed3d44a0de1740e6eb750011d71950 *inst/include/armadillo_bits/op_median_meat.hpp 0fb3a2b7c92fba76eb943ccc4415cf82 *inst/include/armadillo_bits/op_min_bones.hpp a9aa996cc09233aaecae8feea8788de5 *inst/include/armadillo_bits/op_min_meat.hpp 5018e026474936109248fcb8701e1f3a *inst/include/armadillo_bits/op_misc_bones.hpp ae6bdac7f18f787c41cd2d76508b0b09 *inst/include/armadillo_bits/op_misc_meat.hpp e709b8d5b19de8fb335a279755aef68c *inst/include/armadillo_bits/op_nonzeros_bones.hpp 836561a443bd9aa3eb4b22afee651d47 *inst/include/armadillo_bits/op_nonzeros_meat.hpp 98227cd1984edbc6df7e5a0e2c6a18a0 *inst/include/armadillo_bits/op_norm_bones.hpp 06ee6dc52c4d558c92267745f9738cc9 *inst/include/armadillo_bits/op_norm_meat.hpp a7b9eef98d496e376e1797b763003da4 *inst/include/armadillo_bits/op_normalise_bones.hpp 61d5be315452787817f1ffa045403f2b *inst/include/armadillo_bits/op_normalise_meat.hpp f659f66fd6e3ba041513addff90f4ed0 *inst/include/armadillo_bits/op_orth_null_bones.hpp d3f9fcf67ec6914a34c568055c4f154a *inst/include/armadillo_bits/op_orth_null_meat.hpp 3f717b2862373d5034b45bf31d0a2baa *inst/include/armadillo_bits/op_pinv_bones.hpp f147dc76b68490900b6c545e5894bef7 *inst/include/armadillo_bits/op_pinv_meat.hpp 54179ce66bcabd6c475e0ffa60ff64bd *inst/include/armadillo_bits/op_powmat_bones.hpp 326a6f0e238c883e6e1b047b43f6dfc3 *inst/include/armadillo_bits/op_powmat_meat.hpp 37a19a4ebca23f78eb5b05af343b70db *inst/include/armadillo_bits/op_princomp_bones.hpp b3a0e0a6f0dede99c13764ddea5ec379 *inst/include/armadillo_bits/op_princomp_meat.hpp fa2703874282b8e76fb9151008d305a7 *inst/include/armadillo_bits/op_prod_bones.hpp 0d31ee3bdb5fff79eb3cacbd07f118a2 *inst/include/armadillo_bits/op_prod_meat.hpp 0e0a90d175fec5267aa1b3804edec8cb *inst/include/armadillo_bits/op_range_bones.hpp dae55d21403bb82594f7d8b754a1041e *inst/include/armadillo_bits/op_range_meat.hpp 316e47d6ed030837f73760a1e553cca2 *inst/include/armadillo_bits/op_rank_bones.hpp 324330467a827be161b783fb2b6644a4 *inst/include/armadillo_bits/op_rank_meat.hpp be0d35279c7b509fb6faf8948b6890fd *inst/include/armadillo_bits/op_relational_bones.hpp 85c54646d9a0a9af4123636a8b772bd8 *inst/include/armadillo_bits/op_relational_meat.hpp e34a4ada93c46b81d272a22968ff62a1 *inst/include/armadillo_bits/op_repelem_bones.hpp 257c04c2262ab7a08c330f4e2c48e0df *inst/include/armadillo_bits/op_repelem_meat.hpp f18952a11ecb82a769a84f63cc60784c *inst/include/armadillo_bits/op_repmat_bones.hpp 1048dc8f3ca8968165f948181f74d40f *inst/include/armadillo_bits/op_repmat_meat.hpp e1c925b519fa6813d0bae233cf73e21a *inst/include/armadillo_bits/op_reshape_bones.hpp 46c7640d944805f9b62f069e8adf8b93 *inst/include/armadillo_bits/op_reshape_meat.hpp 3a5a5c963cf09a7c03cde77877c754e6 *inst/include/armadillo_bits/op_resize_bones.hpp 11e27ac01b5ebd67ccaf936fb673bb77 *inst/include/armadillo_bits/op_resize_meat.hpp 1e28425726f9a0eaf089ea5f467b125d *inst/include/armadillo_bits/op_reverse_bones.hpp 78c9d0bd25a8794ca04bf6bc83f44349 *inst/include/armadillo_bits/op_reverse_meat.hpp 89e9167dda299db89afcce9bd597657d *inst/include/armadillo_bits/op_roots_bones.hpp 8bdaf8aaffa585d86fe4ebda7a6ca353 *inst/include/armadillo_bits/op_roots_meat.hpp 3100ff84f3b593e7b600b285796e7ce6 *inst/include/armadillo_bits/op_shift_bones.hpp 935f9caff1ccb24951b02bfda3157dcd *inst/include/armadillo_bits/op_shift_meat.hpp faf7b83469bb76494fb32cc999bb781c *inst/include/armadillo_bits/op_shuffle_bones.hpp 60d7507348850aea4f4d4a8e1578528e *inst/include/armadillo_bits/op_shuffle_meat.hpp 5b1fe2e4866948ad531223f3b821e507 *inst/include/armadillo_bits/op_sort_bones.hpp a0afa1b6468bd5fd029bc1e2544c2826 *inst/include/armadillo_bits/op_sort_index_bones.hpp 740068865f15fcd9efe665c22892a245 *inst/include/armadillo_bits/op_sort_index_meat.hpp e2a4d1b1bf663e37bc1f2d8e4c632265 *inst/include/armadillo_bits/op_sort_meat.hpp 48b04efb3a4f2a056e8a5bcf0e20711e *inst/include/armadillo_bits/op_sp_minus_bones.hpp 9d36698618d91744ade3e333169c2655 *inst/include/armadillo_bits/op_sp_minus_meat.hpp e6b5e6554498102e6c223caa2424719a *inst/include/armadillo_bits/op_sp_plus_bones.hpp b11a86ab4a2810917019aaf1b9ec1df6 *inst/include/armadillo_bits/op_sp_plus_meat.hpp e30f4889d35ce090618bc3a41946854d *inst/include/armadillo_bits/op_sqrtmat_bones.hpp 2340ac6431af5645e7e0fbb69a5924fa *inst/include/armadillo_bits/op_sqrtmat_meat.hpp 079b3a4a130a6372f5a6190ac8f2462f *inst/include/armadillo_bits/op_stddev_bones.hpp 0dd18c04644f3f7297620fdad29ee73c *inst/include/armadillo_bits/op_stddev_meat.hpp 84433d77257164655ce75af496a762d3 *inst/include/armadillo_bits/op_strans_bones.hpp ace8d4497849f5fdb4891abbde790bf5 *inst/include/armadillo_bits/op_strans_meat.hpp 83737b8809ba785c491a1ce1041238ba *inst/include/armadillo_bits/op_sum_bones.hpp ab531fd964e328e35aaec972e6316d7b *inst/include/armadillo_bits/op_sum_meat.hpp 2f5aa45c6c3c2ce7aedd6aede196a84c *inst/include/armadillo_bits/op_symmat_bones.hpp 2830cc1039eeefc2951be06064304b93 *inst/include/armadillo_bits/op_symmat_meat.hpp de0f46b1491f411a2cff7181ccb6e2de *inst/include/armadillo_bits/op_toeplitz_bones.hpp b8141d3937deedaf09e66bbed86a62ac *inst/include/armadillo_bits/op_toeplitz_meat.hpp 3870cbd1f8102e3cca81fa9936d6a6e9 *inst/include/armadillo_bits/op_trimat_bones.hpp 91ebf0e40ab6cf5ac9868a192f417bc9 *inst/include/armadillo_bits/op_trimat_meat.hpp 7dded59b9bc90d8e24d6c50387e03b91 *inst/include/armadillo_bits/op_unique_bones.hpp 9852df253fd7f858dd8797de380fd96f *inst/include/armadillo_bits/op_unique_meat.hpp 7a9afd5d0c167ac767627aaf9bcef260 *inst/include/armadillo_bits/op_var_bones.hpp 44e1155a98f716cb0bfabbe327713e16 *inst/include/armadillo_bits/op_var_meat.hpp e384d38ac6f3f02c37cba04b3b99057d *inst/include/armadillo_bits/op_vectorise_bones.hpp 96274a53d6a49e95b98fdafaf21ef66a *inst/include/armadillo_bits/op_vectorise_meat.hpp 7621ce30c8d483bc95b2bb8d2f615c12 *inst/include/armadillo_bits/op_wishrnd_bones.hpp bda2ccf69fa6f8da7ddcf0bfea9d9cc8 *inst/include/armadillo_bits/op_wishrnd_meat.hpp ca87528a7a2071694107e8bfc7a672a0 *inst/include/armadillo_bits/operator_cube_div.hpp c01398e1226f5430928e263b4f433169 *inst/include/armadillo_bits/operator_cube_minus.hpp 1bd29d9a79d95db60ca77238d84c7c5c *inst/include/armadillo_bits/operator_cube_plus.hpp 35ad3e6c0b00466bebf656defdecdf2b *inst/include/armadillo_bits/operator_cube_relational.hpp adf60d4096b8e462ae83125e581486ed *inst/include/armadillo_bits/operator_cube_schur.hpp a0d373d4c28457f7ef3f23af07c40732 *inst/include/armadillo_bits/operator_cube_times.hpp 14dfae46e8b142990dab88b2dd044499 *inst/include/armadillo_bits/operator_div.hpp e172b121c57fa1a0016407372dafd822 *inst/include/armadillo_bits/operator_minus.hpp b5c36f2f59dbdb5ae212248fc7f3ecba *inst/include/armadillo_bits/operator_ostream.hpp 68da218b5bf47d3cfeee068b1b14404a *inst/include/armadillo_bits/operator_plus.hpp 9c5c8bf80be19b667af89c5149d9f1dd *inst/include/armadillo_bits/operator_relational.hpp d2f367e7a35b571571f32bd3220f3575 *inst/include/armadillo_bits/operator_schur.hpp 1303fb7d62c530a94700ba8d74562256 *inst/include/armadillo_bits/operator_times.hpp 846317e23c0a8aa887addb913f2443b2 *inst/include/armadillo_bits/podarray_bones.hpp b444d9449fb086fdca7a04c4416301b3 *inst/include/armadillo_bits/podarray_meat.hpp 7df853d7a969779a11e5b0e452e44ddc *inst/include/armadillo_bits/promote_type.hpp 9cb0ffdcaee085f34814f7af47e981de *inst/include/armadillo_bits/restrictors.hpp a1310f6698222ad8d1d0995875624246 *inst/include/armadillo_bits/running_stat_bones.hpp 8b0f0d54dbbf371a48073c1ddf148226 *inst/include/armadillo_bits/running_stat_meat.hpp 4d81f2e367f6a9b709e1fce0fd99e7fc *inst/include/armadillo_bits/running_stat_vec_bones.hpp b30ec4be517bf22140f6d3ea6fb2a2b6 *inst/include/armadillo_bits/running_stat_vec_meat.hpp 4b210c1f3162252dcc2a50b8eaf0bbb2 *inst/include/armadillo_bits/sp_auxlib_bones.hpp 142dc4302da54e893070c960e524da5e *inst/include/armadillo_bits/sp_auxlib_meat.hpp ace7e1397bed321432381a8d4c5af0cc *inst/include/armadillo_bits/span.hpp f7b440d4c7fb888dc96da03fe3cfa149 *inst/include/armadillo_bits/spdiagview_bones.hpp 5c57b61e07d4c7a6e5a6fc2c4e8b5fab *inst/include/armadillo_bits/spdiagview_meat.hpp 28cd23770e40db2395cd456cfc8c569b *inst/include/armadillo_bits/spglue_join_bones.hpp 2403c7b497c4d62f89461adea1fb6019 *inst/include/armadillo_bits/spglue_join_meat.hpp 1038d73c9bb67a823694fd9bca78402d *inst/include/armadillo_bits/spglue_kron_bones.hpp 23590b6028fb396e225359efdd7d1e22 *inst/include/armadillo_bits/spglue_kron_meat.hpp 52b2e195044b6bf8233b0eb1ba43dd09 *inst/include/armadillo_bits/spglue_max_bones.hpp 847d7d9c025e579620cbfb125ebeed5a *inst/include/armadillo_bits/spglue_max_meat.hpp 2a1fc43b7896c2155fb47a4c6e25a6eb *inst/include/armadillo_bits/spglue_merge_bones.hpp a16e4587e8c113da95a3f85e436b267c *inst/include/armadillo_bits/spglue_merge_meat.hpp 9f0861db826cfb927c0c6a0b3693ac99 *inst/include/armadillo_bits/spglue_min_bones.hpp 2f948e2ce68411bc4d89a9ec361c2660 *inst/include/armadillo_bits/spglue_min_meat.hpp 2b1ea403bb7a1bbf904d938f2516dbfb *inst/include/armadillo_bits/spglue_minus_bones.hpp c0bd48c8d8bc210cb5d9d0c47d694b68 *inst/include/armadillo_bits/spglue_minus_meat.hpp ae49b34f113ca431268dfa1961d2011e *inst/include/armadillo_bits/spglue_plus_bones.hpp d2cc5b9d38fc3267e3c2e39f3553aee4 *inst/include/armadillo_bits/spglue_plus_meat.hpp 227d4667c8ea8c9a85ce3f21f280e3b2 *inst/include/armadillo_bits/spglue_relational_bones.hpp 9326c2392c6ca8c979dc6512a0348aa1 *inst/include/armadillo_bits/spglue_relational_meat.hpp 8c0844806915f644a5ab0c1a5a692ff0 *inst/include/armadillo_bits/spglue_schur_bones.hpp 5978ae95f542b9c4e6fbf96fe62c0f31 *inst/include/armadillo_bits/spglue_schur_meat.hpp 20b68995a4ea5fa3b47777d605140601 *inst/include/armadillo_bits/spglue_times_bones.hpp bc2eecc81dfd43446e45efc16157edfd *inst/include/armadillo_bits/spglue_times_meat.hpp 746befe67029847ea18be9199f5318f0 *inst/include/armadillo_bits/spop_diagmat_bones.hpp f5bcb06099a0ad94bd3e6ad20f34664d *inst/include/armadillo_bits/spop_diagmat_meat.hpp 01a30e3ccdf868055a596b32b588713a *inst/include/armadillo_bits/spop_htrans_bones.hpp 8273630a86194b1b39059ea742a9c2ad *inst/include/armadillo_bits/spop_htrans_meat.hpp e864d7edd673d9d7c0b6c1b70e8dbef1 *inst/include/armadillo_bits/spop_max_bones.hpp 7ee98bdaac5be0860b53d491726641b8 *inst/include/armadillo_bits/spop_max_meat.hpp c0a89a68d8afdd3a3fb527b568ac0df6 *inst/include/armadillo_bits/spop_mean_bones.hpp 4d67c25156e294d66e24a509adfee57e *inst/include/armadillo_bits/spop_mean_meat.hpp 126cfc4651f35a17e07c3e4d0bec8972 *inst/include/armadillo_bits/spop_min_bones.hpp cf8ecf77a18f356602a7631209ca47ab *inst/include/armadillo_bits/spop_min_meat.hpp 7b0a9cad49de49d4d5c1540c10c8efc7 *inst/include/armadillo_bits/spop_misc_bones.hpp bf8cc1c40c101a4208df4a613caa00cd *inst/include/armadillo_bits/spop_misc_meat.hpp 3956e5faecc9e76cb0c3a1d1a869508e *inst/include/armadillo_bits/spop_norm_bones.hpp 82cbfe5c67b84447fe8aaa58a09b31d0 *inst/include/armadillo_bits/spop_norm_meat.hpp 46aa3eccbdaf4b65521e11a36e97bbe8 *inst/include/armadillo_bits/spop_normalise_bones.hpp 3227d57d1e9b1ea2bfb917adb3d4045a *inst/include/armadillo_bits/spop_normalise_meat.hpp b3e712f18f75ab5b7391420f5402b207 *inst/include/armadillo_bits/spop_repmat_bones.hpp a92ddf5bf4196ceae7d7c0fa21b10ec5 *inst/include/armadillo_bits/spop_repmat_meat.hpp 69d65bce76fd5d9988a65d85974f366d *inst/include/armadillo_bits/spop_reverse_bones.hpp 8e655808a5282f5281408c41a2971b77 *inst/include/armadillo_bits/spop_reverse_meat.hpp 350caa150e0bbb06a4eda332bb43ddfe *inst/include/armadillo_bits/spop_strans_bones.hpp 9a2aaef9fda3dfb20a369aed2236e890 *inst/include/armadillo_bits/spop_strans_meat.hpp 59e76d089f9cc04c148cac1404b94802 *inst/include/armadillo_bits/spop_sum_bones.hpp 2738ffe78a33117a230b3c0e22577d66 *inst/include/armadillo_bits/spop_sum_meat.hpp 08156fed940f83fe2ca1a807914410ad *inst/include/armadillo_bits/spop_symmat_bones.hpp 8857bdd93fdd1e8f5b0ea41e3e86d48b *inst/include/armadillo_bits/spop_symmat_meat.hpp 79cc799e4e36cecf379c6d7a6199b40b *inst/include/armadillo_bits/spop_trimat_bones.hpp c7a11a66a0efb0461974026a4af55cd2 *inst/include/armadillo_bits/spop_trimat_meat.hpp 96129c269751dbabd201be49e8bcdf74 *inst/include/armadillo_bits/spop_var_bones.hpp 97cbbecd546abba24cdd6feaefc4a307 *inst/include/armadillo_bits/spop_var_meat.hpp 6fea69e5e64257283777adf03b963526 *inst/include/armadillo_bits/spop_vectorise_bones.hpp 5b0e2175710dd17abeb77c82928ca11a *inst/include/armadillo_bits/spop_vectorise_meat.hpp 8601ae05b4080f6ec4cdcab63dfbb1e7 *inst/include/armadillo_bits/strip.hpp 4bb6c9ca4e6162d654b8e708ebaae40d *inst/include/armadillo_bits/subview_bones.hpp 5d3ccae599415d4d6b2b77e784361274 *inst/include/armadillo_bits/subview_cube_bones.hpp c16667d63264fbb62662542ab8e4fa8b *inst/include/armadillo_bits/subview_cube_each_bones.hpp 204a0523a6d1b8e36b5295bf17a65f5f *inst/include/armadillo_bits/subview_cube_each_meat.hpp 4d5340771143e3a0f95e2a8b939caffb *inst/include/armadillo_bits/subview_cube_meat.hpp 50e3f3727481a19ca47d1db0fed6d2f1 *inst/include/armadillo_bits/subview_cube_slices_bones.hpp 8367df1535a0235e34ac0a4004578dbc *inst/include/armadillo_bits/subview_cube_slices_meat.hpp 54fa4e9dfd34cdefea457784bcd0a553 *inst/include/armadillo_bits/subview_each_bones.hpp 8f6966991881eb763f2aa8f022a5d534 *inst/include/armadillo_bits/subview_each_meat.hpp b2789a8dae17b27e10bd5d53ba3e6d98 *inst/include/armadillo_bits/subview_elem1_bones.hpp 7f6a27d71b128c5839d4343da871b8c2 *inst/include/armadillo_bits/subview_elem1_meat.hpp c86b2f8ce96421803b01b13bb21f0497 *inst/include/armadillo_bits/subview_elem2_bones.hpp 89cffb1ae733d8af1c6bbdd33973358b *inst/include/armadillo_bits/subview_elem2_meat.hpp 2df3cb26fe425eabc2ff703ae71b7707 *inst/include/armadillo_bits/subview_field_bones.hpp 81dc31e9cd55316f01ba755ee72b1784 *inst/include/armadillo_bits/subview_field_meat.hpp 15b22882d2e4013bb03530f2a4b15275 *inst/include/armadillo_bits/subview_meat.hpp c5105bd26c78ffe7abb1c70d82f23549 *inst/include/armadillo_bits/sympd_helper.hpp 087492b35ba48bd677353b1a79029639 *inst/include/armadillo_bits/traits.hpp 6597ba99e6343b96a18f9859181201a7 *inst/include/armadillo_bits/translate_arpack.hpp cae38711515fa519051764e43de6e335 *inst/include/armadillo_bits/translate_atlas.hpp d6a9656825d2b3b6237396d97bda7275 *inst/include/armadillo_bits/translate_blas.hpp 5f32c3dc047d92a3466140c771686f2b *inst/include/armadillo_bits/translate_lapack.hpp ae281b303843db1bad365ace9a95a9a0 *inst/include/armadillo_bits/translate_superlu.hpp dda0ceb86977e1902865254a0e709be5 *inst/include/armadillo_bits/trimat_helper.hpp ddb2d1b5a359dd5f0677393eca4a2131 *inst/include/armadillo_bits/typedef_elem.hpp 8eaaf415ee254a51cd23d97d65ab0d8e *inst/include/armadillo_bits/typedef_elem_check.hpp eef45088caef7a830105fdf12ecd2510 *inst/include/armadillo_bits/typedef_mat.hpp 59204c3c874b7d3590199f5e6cfbc9b7 *inst/include/armadillo_bits/typedef_mat_fixed.hpp c055c3fb106f9d6b01ae98b7a5454ca8 *inst/include/armadillo_bits/unwrap.hpp 37166828d575f3f40a95c75c82b09aee *inst/include/armadillo_bits/unwrap_cube.hpp 3a4479e162a09fca8bcce7a742c5354c *inst/include/armadillo_bits/unwrap_spmat.hpp cb3edf0a9c3c1d6549cf4ecb0be6a4f5 *inst/include/armadillo_bits/upgrade_val.hpp 6194c2dcfa94ad921bc5d2bf9d2bc831 *inst/include/armadillo_bits/wall_clock_bones.hpp e30e441e66858543b1e1ac1f112314f2 *inst/include/armadillo_bits/wall_clock_meat.hpp 6832cf55ed501cd77551b7ac351fc388 *inst/include/armadillo_bits/xtrans_mat_bones.hpp 6db7b7d47b6d728c68a4610a37379581 *inst/include/armadillo_bits/xtrans_mat_meat.hpp 3c94c3aadbc81a91ac8a5edb33faac4b *inst/include/armadillo_bits/xvec_htrans_bones.hpp 6446480170687d3d3e4c3446c2aa5efa *inst/include/armadillo_bits/xvec_htrans_meat.hpp 61059660eb073d93e00e8ee054237071 *inst/skeleton/Makevars 61059660eb073d93e00e8ee054237071 *inst/skeleton/Makevars.win 072214dfd360b239e67aa8a29c564ea1 *inst/skeleton/rcpparma_hello_world.Rd 6f35999ed6c5117a6c547833c636afd1 *inst/skeleton/rcpparma_hello_world.cpp 0ebc72e83cb36b1706239d400f4a292d *inst/tinytest/cpp/Rlapack.cpp d2e0be58ea75b3d0aa7089ef131848c3 *inst/tinytest/cpp/any_as_vec.cpp b548d52ca6ca763a7e2f8398990a4280 *inst/tinytest/cpp/armadillo.cpp ab3e35e3243da9f9f193bf3a4f5d83fb *inst/tinytest/cpp/colrow_as_vec.cpp 3da810d96e56cdaca0590f2ce46e4dea *inst/tinytest/cpp/complex.cpp 311bacd34f8b9f071223ce850b0237be *inst/tinytest/cpp/cube.cpp 357cf57e807887e238a5d614dfa2ad92 *inst/tinytest/cpp/fields.cpp a4f17b00ae044a2a654adc4a62c508ee *inst/tinytest/cpp/fields_new.cpp c8672878a3ff0be51186f7d79ff28aa6 *inst/tinytest/cpp/rmultinom.cpp bffc543aba8aa98bb5a13d968ab16506 *inst/tinytest/cpp/rng.cpp a1ddd74a7c925a4d576d6e8227dfb546 *inst/tinytest/cpp/sample.cpp c04abcba0775a4e2cc925ceeca7c31e8 *inst/tinytest/cpp/sparse.cpp badaf97cb463f8e2f4234b09e25b72da *inst/tinytest/test_Rlapack.R eaf021e02df90cd9e2015e31f63f0ec5 *inst/tinytest/test_complex.R 95e0187aedf6b54553356b456c989e3b *inst/tinytest/test_cube.R eeb5f550d2f4a32d1b2ad49d6e09bbf2 *inst/tinytest/test_fastLm.R e00b30412f7021ddfb753460296e6a36 *inst/tinytest/test_fields.R 2debd6c0cf861627798a306817aaa6ef *inst/tinytest/test_fields_new.R 303da3632f8b203a142d901008c56a2b *inst/tinytest/test_misc.R 5ad9f4d0bb8b8eb161432bc515ba55c8 *inst/tinytest/test_rcpparmadillo.R 19842b532c4ba3ace953cd423c005214 *inst/tinytest/test_rmultinom.R a694bed443cb17316779d9da146b15bf *inst/tinytest/test_rng.R 501cf848d1977214130193e353f68176 *inst/tinytest/test_sample.R b82afb1ff654be5a45580c26ad181681 *inst/tinytest/test_scipy2r.R 0c234a7aee4fa54aa9ab554345f863f6 *inst/tinytest/test_sparse.R 659cb327271d2e82783d1917d4328302 *inst/tinytest/test_sparseConversion.R 7cce1c1a40ac67c7278649cb963a35c6 *man/RcppArmadillo-package.Rd faaf2efa3ba978f398ea355a6510e5c9 *man/RcppArmadillo.package.skeleton.Rd 1d7cd3261ff81c4b924b9133c3cf371a *man/armadillo_set_seed.Rd c4a623bb5a3fb6b51fae3b0fde22ed31 *man/armadillo_set_seed_random.Rd 53d212616758a15391c8ed8c0a3c8b04 *man/armadillo_version.Rd 012281c1186d4c73762164260fd1f777 *man/fastLm.Rd d6b90e372611f13de54bbd6bfe86170f *src/Makevars.in ea944266aeb2f597a1bc929440af8102 *src/Makevars.win 18e1da25cef9c1610302d8de4386e5d7 *src/RcppArmadillo.cpp aa735cba1e2059d9bb8b435bb74ddd93 *src/RcppExports.cpp 9c5e39e6a24e270d1d2ee5abd6190092 *src/fastLm.cpp a3500558f680dadef83f12e44644436b *tests/tinytest.R 36775614f3fdb06c07121a96332741e6 *vignettes/RcppArmadillo-intro.Rnw b7df93033cf8677a5bbd8870522ca9eb *vignettes/RcppArmadillo-sparseMatrix.Rnw 044ccafdf8dd529225c75f5ce4078517 *vignettes/pdf/RcppArmadillo-intro.pdf 02a6d6e2a2e34988f6755f0e059e4f71 *vignettes/pdf/RcppArmadillo-sparseMatrix.pdf RcppArmadillo/inst/0000755000176200001440000000000014173355570013772 5ustar liggesusersRcppArmadillo/inst/examples/0000755000176200001440000000000013507103315015574 5ustar liggesusersRcppArmadillo/inst/examples/varSimulation.r0000644000176200001440000000511012560372470020621 0ustar liggesusers#!/usr/bin/r ## ## varSimulation.r: Simulation of first-order vector autoregression data ## ## Copyright (C) 2011 - 2015 Lance Bachmeier and Dirk Eddelbuettel ## ## This file is part of RcppArmadillo. ## ## RcppArmadillo is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 2 of the License, or ## (at your option) any later version. ## ## RcppArmadillo is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with RcppArmadillo. If not, see . ## load Rcpp to be able to use cppFunction() below suppressMessages(library(Rcpp)) ## parameter and error terms used throughout a <- matrix(c(0.5,0.1,0.1,0.5),nrow=2) e <- matrix(rnorm(10000),ncol=2) ## Let's start with the R version rSim <- function(coeff, errors) { simdata <- matrix(0, nrow(errors), ncol(errors)) for (row in 2:nrow(errors)) { simdata[row,] = coeff %*% simdata[(row-1),] + errors[row,] } return(simdata) } rData <- rSim(a, e) # generated by R ## Now let's load the R compiler (requires R 2.13 or later) suppressMessages(require(compiler)) compRsim <- cmpfun(rSim) compRData <- compRsim(a,e) # generated by R 'compiled' stopifnot(all.equal(rData, compRData)) # checking results ## C++ variant: code passed as a text variable ... code <- ' arma::mat rcppSim(const arma::mat& coeff, const arma::mat& errors) { int m = errors.n_rows; int n = errors.n_cols; arma::mat simdata(m,n); simdata.row(0) = arma::zeros(1,n); for (int row=1; row. library(Rcpp) library(RcppArmadillo) library(rbenchmark) ## start from SEXP, most conversions, longest code src <- ' Rcpp::List fLmSEXP(SEXP Xs, SEXP ys) { Rcpp::NumericMatrix Xr(Xs); Rcpp::NumericVector yr(ys); int n = Xr.nrow(), k = Xr.ncol(); arma::mat X(Xr.begin(), n, k, false); arma::colvec y(yr.begin(), yr.size(), false); int df = n - k; // fit model y ~ X, extract residuals arma::colvec coef = arma::solve(X, y); arma::colvec res = y - X*coef; double s2 = std::inner_product(res.begin(), res.end(), res.begin(), 0.0)/df; // std.errors of coefficients arma::colvec sderr = arma::sqrt(s2 * arma::diagvec(arma::pinv(arma::trans(X)*X))); return Rcpp::List::create(Rcpp::Named("coefficients")=coef, Rcpp::Named("stderr") =sderr, Rcpp::Named("df") =df); } ' cppFunction(code=src, depends="RcppArmadillo") ## start from Rcpp types are early RcppArmadillo examples did src <- ' Rcpp::List fLmTwoCasts(Rcpp::NumericMatrix Xr, Rcpp::NumericVector yr) { int n = Xr.nrow(), k = Xr.ncol(); arma::mat X(Xr.begin(), n, k, false); arma::colvec y(yr.begin(), yr.size(), false); int df = n - k; // fit model y ~ X, extract residuals arma::colvec coef = arma::solve(X, y); arma::colvec res = y - X*coef; double s2 = std::inner_product(res.begin(), res.end(), res.begin(), 0.0)/df; // std.errors of coefficients arma::colvec sderr = arma::sqrt(s2 * arma::diagvec(arma::pinv(arma::trans(X)*X))); return Rcpp::List::create(Rcpp::Named("coefficients")=coef, Rcpp::Named("stderr") =sderr, Rcpp::Named("df") =df); } ' cppFunction(code=src, depends="RcppArmadillo") ## start from Armadillo types src <- ' Rcpp::List fLmOneCast(arma::mat X, arma::colvec y) { int df = X.n_rows - X.n_cols; // fit model y ~ X, extract residuals arma::colvec coef = arma::solve(X, y); arma::colvec res = y - X*coef; double s2 = std::inner_product(res.begin(), res.end(), res.begin(), 0.0)/df; // std.errors of coefficients arma::colvec sderr = arma::sqrt(s2 * arma::diagvec(arma::pinv(arma::trans(X)*X))); return Rcpp::List::create(Rcpp::Named("coefficients")=coef, Rcpp::Named("stderr") =sderr, Rcpp::Named("df") =df); } ' cppFunction(code=src, depends="RcppArmadillo") ## start from Armadillo types passed as constant references src <- ' Rcpp::List fLmConstRef(const arma::mat & X, const arma::colvec & y) { int df = X.n_rows - X.n_cols; // fit model y ~ X, extract residuals arma::colvec coef = arma::solve(X, y); arma::colvec res = y - X*coef; double s2 = std::inner_product(res.begin(), res.end(), res.begin(), 0.0)/df; // std.errors of coefficients arma::colvec sderr = arma::sqrt(s2 * arma::diagvec(arma::pinv(arma::trans(X)*X))); return Rcpp::List::create(Rcpp::Named("coefficients")=coef, Rcpp::Named("stderr") =sderr, Rcpp::Named("df") =df); } ' cppFunction(code=src, depends="RcppArmadillo") fastLmPureDotCall <- function(X, y) { .Call("_RcppArmadillo_fastLm_impl", X, y, PACKAGE = "RcppArmadillo") } y <- log(trees$Volume) X <- cbind(1, log(trees$Girth)) frm <- formula(log(Volume) ~ log(Girth)) res <- benchmark(fLmOneCast(X, y), # inline'd above fLmTwoCasts(X, y), # inline'd above fLmConstRef(X, y), # inline'd above fLmSEXP(X, y), # inline'd above fastLmPure(X, y), # similar, but with 2 error checks fastLmPureDotCall(X, y), # now without the 2 error checks fastLm(frm, data=trees), # using model matrix lm.fit(X, y), # R's fast function, no stderr lm(frm, data=trees), # R's standard function columns = c("test", "replications", "relative", "elapsed", "user.self", "sys.self"), order="relative", replications=5000) print(res[,1:4]) ## second run without formulae approach but larger N res <- benchmark(fLmOneCast(X, y), # inline'd above fLmTwoCasts(X, y), # inline'd above fLmSEXP(X, y), # inline'd above fLmConstRef(X, y), # inline'd above fastLmPure(X, y), # similar, but with 2 error checks fastLmPureDotCall(X, y), # now without the 2 error checks lm.fit(X, y), # R's fast function, no stderr columns = c("test", "replications", "relative", "elapsed", "user.self", "sys.self"), order="relative", replications=50000) print(res[,1:4]) RcppArmadillo/inst/examples/kalman/0000755000176200001440000000000012253723621017044 5ustar liggesusersRcppArmadillo/inst/examples/kalman/FirstKalmanR.R0000644000176200001440000000221412253723621021523 0ustar liggesusersFirstKalmanR <- function(pos) { kalmanfilter <- function(z) { dt <- 1 A <- matrix(c( 1, 0, dt, 0, 0, 0, 0, 1, 0, dt, 0, 0, # x, y 0, 0, 1, 0, dt, 0, 0, 0, 0, 1, 0, dt, # Vx, Vy 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1), # Ax, Ay 6, 6, byrow=TRUE) H <- matrix( c(1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0), 2, 6, byrow=TRUE) Q <- diag(6) R <- 1000 * diag(2) xprd <- A %*% xest # predicted state and covriance pprd <- A %*% pest %*% t(A) + Q S <- H %*% t(pprd) %*% t(H) + R # estimation B <- H %*% t(pprd) kalmangain <- t(solve(S, B)) ## estimated state and covariance, assign to vars in parent env xest <<- xprd + kalmangain %*% (z - H %*% xprd) pest <<- pprd - kalmangain %*% H %*% pprd ## compute the estimated measurements y <- H %*% xest } xest <- matrix(0, 6, 1) pest <- matrix(0, 6, 6) N <- nrow(pos) y <- matrix(NA, N, 2) for (i in 1:N) { y[i,] <- kalmanfilter(t(pos[i,,drop=FALSE])) } invisible(y) } RcppArmadillo/inst/examples/kalman/kalmanM.m0000644000176200001440000000177012253723621020607 0ustar liggesusersfunction Y = kalmanM(pos) dt=1; %% Initialize state transition matrix A=[ 1 0 dt 0 0 0;... % [x ] 0 1 0 dt 0 0;... % [y ] 0 0 1 0 dt 0;... % [Vx] 0 0 0 1 0 dt;... % [Vy] 0 0 0 0 1 0 ;... % [Ax] 0 0 0 0 0 1 ]; % [Ay] H = [ 1 0 0 0 0 0; 0 1 0 0 0 0 ]; % Initialize measurement matrix Q = eye(6); R = 1000 * eye(2); x_est = zeros(6, 1); % x_est=[x,y,Vx,Vy,Ax,Ay]' p_est = zeros(6, 6); numPts = size(pos,1); Y = zeros(numPts, 2); for idx = 1:numPts z = pos(idx, :)'; %% Predicted state and covariance x_prd = A * x_est; p_prd = A * p_est * A' + Q; %% Estimation S = H * p_prd' * H' + R; B = H * p_prd'; klm_gain = (S \ B)'; %% Estimated state and covariance x_est = x_prd + klm_gain * (z - H * x_prd); p_est = p_prd - klm_gain * H * p_prd; %% Compute the estimated measurements Y(idx, :) = H * x_est; end % of the function end % of the function RcppArmadillo/inst/examples/kalman/kalmanExample.m0000644000176200001440000000012312253723621021775 0ustar liggesusersfunction x = kalmanExample load pos.txt; # renamed here x = kalmanM(pos); endRcppArmadillo/inst/examples/kalman/KalmanRimp.R0000644000176200001440000000244412253723621021226 0ustar liggesusers## Improved version supplied by one referee, not shown in paper KalmanRimp <- function(pos) { kalmanfilter <- function(z) { ## predicted state and covriance xprd <- xest %*% A pprd <- crossprod(pest %*% A, A) + Q ## estimation B <- crossprod(H, pprd) S <- B %*% H + R ## kalmangain <- (S \ B)' kalmangain <- solve(S, B) ## estimated state and covariance, assign to vars in parent env xest <<- xprd + (z - xprd %*% H) %*% kalmangain pest <<- pprd - pprd %*% H %*% kalmangain ## compute the estimated measurements y <- xest %*% H } dt <- 1 A <- matrix( c( 1, 0, dt, 0, 0, 0, # x 0, 1, 0, dt, 0, 0, # y 0, 0, 1, 0, dt, 0, # Vx 0, 0, 0, 1, 0, dt, # Vy 0, 0, 0, 0, 1, 0, # Ax 0, 0, 0, 0, 0, 1), # Ay 6, 6, byrow=FALSE) H <- matrix( c(1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0), 6, 2, byrow=FALSE) Q <- diag(6) R <- 1000 * diag(2) N <- nrow(pos) y <- matrix(NA, N, 2) xest <- matrix(0, 1, 6) pest <- matrix(0, 6, 6) for (i in 1:N) { y[i,] <- kalmanfilter(pos[i,,drop=FALSE]) } invisible(y) } RcppArmadillo/inst/examples/kalman/benchmark.R0000644000176200001440000000225712541062071021122 0ustar liggesusers suppressMessages(library(utils)) suppressMessages(library(RcppArmadillo)) suppressMessages(library(rbenchmark)) suppressMessages(library(compiler)) source("FirstKalmanR.R") source("KalmanR.R") source("KalmanRimp.R") Rcpp::sourceCpp("Kalman.cpp") FirstKalmanRC <- cmpfun(FirstKalmanR) KalmanRC <- cmpfun(KalmanR) KalmanRimpC <- cmpfun(KalmanRimp) ## Read data, ensure identical results pos <- as.matrix(read.table("pos.txt", header=FALSE, col.names=c("x","y"))) stopifnot(all.equal(KalmanR(pos), KalmanRC(pos)), all.equal(KalmanRC(pos), KalmanCpp(pos)), all.equal(KalmanCpp(pos), FirstKalmanRC(pos)), all.equal(KalmanCpp(pos), FirstKalmanR(pos)), all.equal(KalmanCpp(pos), KalmanRimp(pos)), all.equal(KalmanCpp(pos), KalmanRimpC(pos))) res <- benchmark(KalmanR(pos), KalmanRC(pos), KalmanRimp(pos), KalmanRimpC(pos), FirstKalmanR(pos), FirstKalmanRC(pos), KalmanCpp(pos), columns = c("test", "replications", "elapsed", "relative"), order="relative", replications=500) print(res[,1:4]) RcppArmadillo/inst/examples/kalman/kalmanfilter.m0000644000176200001440000000173012253723621021674 0ustar liggesusers% Copyright 2010 The MathWorks, Inc. function y = kalmanfilter(z) dt=1; % Initialize state transition matrix A=[ 1 0 dt 0 0 0; 0 1 0 dt 0 0;... % [x ], [y ] 0 0 1 0 dt 0; 0 0 0 1 0 dt;... % [Vx], [Vy] 0 0 0 0 1 0 ; 0 0 0 0 0 1 ]; % [Ax], [Ay] H = [ 1 0 0 0 0 0; 0 1 0 0 0 0 ]; % Init. measuremnt mat Q = eye(6); R = 1000 * eye(2); persistent x_est p_est % Init. state cond. if isempty(x_est) x_est = zeros(6, 1); % x_est=[x,y,Vx,Vy,Ax,Ay]' p_est = zeros(6, 6); end x_prd = A * x_est; % Predicted state and covariance p_prd = A * p_est * A' + Q; S = H * p_prd' * H' + R; % Estimation B = H * p_prd'; klm_gain = (S \ B)'; % Estimated state and covariance x_est = x_prd + klm_gain * (z - H * x_prd); p_est = p_prd - klm_gain * H * p_prd; y = H * x_est; % Compute the estimated measurements end % of the function RcppArmadillo/inst/examples/kalman/KalmanR.R0000644000176200001440000000232212253723621020513 0ustar liggesusersKalmanR <- function(pos) { kalmanfilter <- function(z) { ## predicted state and covariance xprd <- A %*% xest pprd <- A %*% pest %*% t(A) + Q ## estimation S <- H %*% t(pprd) %*% t(H) + R B <- H %*% t(pprd) kalmangain <- t(solve(S, B)) ## estimated state and covariance ## assigned to vars in parent env xest <<- xprd + kalmangain %*% (z - H %*% xprd) pest <<- pprd - kalmangain %*% H %*% pprd ## compute the estimated measurements y <- H %*% xest } dt <- 1 A <- matrix( c( 1, 0, dt, 0, 0, 0, # x 0, 1, 0, dt, 0, 0, # y 0, 0, 1, 0, dt, 0, # Vx 0, 0, 0, 1, 0, dt, # Vy 0, 0, 0, 0, 1, 0, # Ax 0, 0, 0, 0, 0, 1), # Ay 6, 6, byrow=TRUE) H <- matrix( c(1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0), 2, 6, byrow=TRUE) Q <- diag(6) R <- 1000 * diag(2) N <- nrow(pos) Y <- matrix(NA, N, 2) xest <- matrix(0, 6, 1) pest <- matrix(0, 6, 6) for (i in 1:N) { Y[i,] <- kalmanfilter(t(pos[i,,drop=FALSE])) } invisible(Y) } RcppArmadillo/inst/examples/kalman/pos.txt0000644000176200001440000002327212253723621020414 0ustar liggesusers -4.76074274e-01 8.27344982e-01 -4.66073333e-01 8.25346801e-01 -4.56071632e-01 8.21349631e-01 -4.46068539e-01 8.15353570e-01 -4.36063422e-01 8.07358714e-01 -4.26055649e-01 7.97365162e-01 -4.16044587e-01 7.85373011e-01 -4.06029604e-01 7.71382359e-01 -3.96010067e-01 7.55393303e-01 -3.85985344e-01 7.37405941e-01 -3.75954804e-01 7.17420370e-01 -3.65917812e-01 6.95436687e-01 -3.55873738e-01 6.71454991e-01 -3.45821948e-01 6.45475379e-01 -3.35761811e-01 6.17497948e-01 -3.25692694e-01 5.87522796e-01 -3.15613964e-01 5.55550021e-01 -3.05524990e-01 5.21579720e-01 -2.95425138e-01 4.85611990e-01 -2.85313778e-01 4.47646929e-01 -2.75190275e-01 4.07684635e-01 -2.65053998e-01 3.65725205e-01 -2.54904315e-01 3.21768737e-01 -2.44740592e-01 2.75815328e-01 -2.34562199e-01 2.27865076e-01 -2.24368501e-01 1.77918079e-01 -2.14158868e-01 1.25974433e-01 -2.03932667e-01 7.20342366e-02 -1.93689265e-01 1.60975872e-02 -1.83428030e-01 -4.18354177e-02 -1.73148329e-01 -1.01764681e-01 -1.62849531e-01 -1.63690104e-01 -1.52531002e-01 -2.27611590e-01 -1.42192111e-01 -2.93529041e-01 -1.31832225e-01 -3.61442361e-01 -1.21450712e-01 -4.31351450e-01 -1.11046940e-01 -5.03256212e-01 -1.00620275e-01 -5.77156550e-01 -9.01700865e-02 -6.53052365e-01 -7.96957410e-02 -7.30943560e-01 -6.91966066e-02 -8.10830038e-01 -5.86720509e-02 -8.92711700e-01 -4.81214414e-02 -9.68723398e-01 -3.75441458e-02 -8.82849846e-01 -2.69395318e-02 -7.98971187e-01 -1.63069671e-02 -7.17087322e-01 -5.64581912e-03 -6.37198155e-01 5.04454433e-03 -5.59303588e-01 1.57647557e-02 -4.83403523e-01 2.65154472e-02 -4.09497862e-01 3.72972513e-02 -3.37586509e-01 4.81108004e-02 -2.67669365e-01 5.89567268e-02 -1.99746334e-01 6.98356629e-02 -1.33817317e-01 8.07482410e-02 -6.98822165e-02 9.16950935e-02 -7.94093586e-03 1.02676853e-01 5.20066229e-02 1.13694151e-01 1.09960557e-01 1.24747621e-01 1.65920965e-01 1.35837894e-01 2.19887943e-01 1.46965604e-01 2.71861590e-01 1.58131383e-01 3.21842002e-01 1.69335862e-01 3.69829278e-01 1.80579674e-01 4.15823514e-01 1.91863452e-01 4.59824809e-01 2.03187829e-01 5.01833260e-01 2.14553435e-01 5.41848965e-01 2.25960904e-01 5.79872020e-01 2.37410868e-01 6.15902524e-01 2.48903960e-01 6.49940575e-01 2.60440811e-01 6.81986269e-01 2.72022055e-01 7.12039704e-01 2.83648323e-01 7.40100978e-01 2.95320248e-01 7.66170188e-01 3.07038462e-01 7.90247432e-01 3.18803597e-01 8.12332807e-01 3.30616287e-01 8.32426411e-01 3.42477163e-01 8.50528342e-01 3.54386857e-01 8.66638696e-01 3.66346003e-01 8.80757573e-01 3.78355232e-01 8.92885068e-01 3.90415176e-01 9.03021280e-01 4.02526469e-01 9.11166306e-01 4.14689742e-01 9.17320243e-01 4.26905628e-01 9.21483190e-01 4.39174759e-01 9.23655244e-01 4.51497768e-01 9.23836502e-01 4.63875286e-01 9.22027062e-01 4.76307947e-01 9.18227021e-01 4.88796383e-01 9.12436477e-01 5.01341225e-01 9.04655528e-01 5.13943106e-01 8.94884271e-01 5.26602660e-01 8.83122803e-01 5.39320517e-01 8.69371222e-01 5.52097311e-01 8.53629626e-01 5.64933673e-01 8.35898112e-01 5.77830237e-01 8.16176778e-01 5.90787634e-01 7.94465721e-01 6.03806497e-01 7.70765039e-01 6.16887458e-01 7.45074829e-01 6.16887458e-01 7.45074829e-01 2.43647025e-01 3.48142367e-01 -1.29593408e-01 -4.87900946e-02 -5.02833841e-01 -4.45722556e-01 -8.76074274e-01 -8.42655018e-01 -8.76074274e-01 -8.42655018e-01 -8.66073333e-01 -8.14653199e-01 -8.56071632e-01 -7.88650369e-01 -8.46068539e-01 -7.64646430e-01 -8.36063422e-01 -7.42641286e-01 -8.26055649e-01 -7.22634838e-01 -8.16044587e-01 -7.04626989e-01 -8.06029604e-01 -6.88617641e-01 -7.96010067e-01 -6.74606697e-01 -7.85985344e-01 -6.62594059e-01 -7.75954804e-01 -6.52579630e-01 -7.65917812e-01 -6.44563313e-01 -7.55873738e-01 -6.38545009e-01 -7.45821948e-01 -6.34524621e-01 -7.35761811e-01 -6.32502052e-01 -7.25692694e-01 -6.32477204e-01 -7.15613964e-01 -6.34449979e-01 -7.05524990e-01 -6.38420280e-01 -6.95425138e-01 -6.44388010e-01 -6.85313778e-01 -6.52353071e-01 -6.75190275e-01 -6.62315365e-01 -6.65053998e-01 -6.74274795e-01 -6.54904315e-01 -6.88231263e-01 -6.44740592e-01 -7.04184672e-01 -6.34562199e-01 -7.22134924e-01 -6.24368501e-01 -7.42081921e-01 -6.14158868e-01 -7.64025567e-01 -6.03932667e-01 -7.87965763e-01 -5.93689265e-01 -8.13902413e-01 -5.83428030e-01 -8.41835418e-01 -5.73148329e-01 -8.71764681e-01 -5.62849531e-01 -9.03690104e-01 -5.52531002e-01 -9.37611590e-01 -5.42192111e-01 -9.71782807e-01 -5.31832225e-01 -9.33867676e-01 -5.21450712e-01 -8.97948315e-01 -5.11046940e-01 -8.64024627e-01 -5.00620275e-01 -8.32096515e-01 -4.90170086e-01 -8.02163879e-01 -4.79695741e-01 -7.74226624e-01 -4.69196607e-01 -7.48284652e-01 -4.58672051e-01 -7.24337865e-01 -4.48121441e-01 -7.02386165e-01 -4.37544146e-01 -6.82429455e-01 -4.26939532e-01 -6.64467637e-01 -4.16306967e-01 -6.48500614e-01 -4.05645819e-01 -6.34528289e-01 -3.94955456e-01 -6.22550563e-01 -3.84235244e-01 -6.12567339e-01 -3.73484553e-01 -6.04578520e-01 -3.62702749e-01 -5.98584009e-01 -3.51889200e-01 -5.94583707e-01 -3.41043273e-01 -5.92577517e-01 -3.30164337e-01 -5.92565341e-01 -3.19251759e-01 -5.94547083e-01 -3.08304907e-01 -5.98522644e-01 -2.97323147e-01 -6.04491926e-01 -2.86305849e-01 -6.12454834e-01 -2.75252379e-01 -6.22411268e-01 -2.64162106e-01 -6.34361131e-01 -2.53034396e-01 -6.48304326e-01 -2.41868617e-01 -6.64240755e-01 -2.30664138e-01 -6.82170321e-01 -2.19420326e-01 -7.02092926e-01 -2.08136548e-01 -7.24008473e-01 -1.96812171e-01 -7.47916863e-01 -1.85446565e-01 -7.73818000e-01 -1.74039096e-01 -8.01711787e-01 -1.62589132e-01 -8.31598124e-01 -1.51096040e-01 -8.63476915e-01 -1.39559189e-01 -8.97348063e-01 -1.27977945e-01 -9.33211470e-01 -1.16351677e-01 -9.71067037e-01 -1.04679752e-01 -9.34397179e-01 -9.29615383e-02 -8.92555770e-01 -8.11964026e-02 -8.52706229e-01 -6.93837130e-02 -8.14848460e-01 -5.75228372e-02 -7.78982364e-01 -4.56131427e-02 -7.45107844e-01 -3.36539972e-02 -7.13224802e-01 -2.16447683e-02 -6.83333142e-01 -9.58482365e-03 -6.55432765e-01 2.52646905e-03 -6.29523574e-01 1.46897422e-02 -6.05605471e-01 2.69056281e-02 -5.83678358e-01 3.91747593e-02 -5.63742139e-01 5.14977679e-02 -5.45796716e-01 6.38752864e-02 -5.29841991e-01 7.63079472e-02 -5.15877866e-01 8.87963825e-02 -5.03904245e-01 1.01341225e-01 -4.93921029e-01 1.13943106e-01 -4.85928121e-01 1.26602660e-01 -4.79925423e-01 1.39320517e-01 -4.75912839e-01 1.52097311e-01 -4.73890270e-01 1.64933673e-01 -4.73857618e-01 1.77830237e-01 -4.75814787e-01 1.90787634e-01 -4.79761679e-01 2.03806497e-01 -4.85698196e-01 2.16887458e-01 -4.93624240e-01 2.16887458e-01 -4.93624240e-01 4.01147025e-01 -1.33381935e-01 5.85406592e-01 2.26860371e-01 7.69666159e-01 5.87102676e-01 9.53925726e-01 9.47344982e-01 9.53925726e-01 9.47344982e-01 9.43926667e-01 9.15346801e-01 9.33928368e-01 8.81349631e-01 9.23931461e-01 8.45353570e-01 9.13936578e-01 8.07358714e-01 9.03944351e-01 7.67365162e-01 8.93955413e-01 7.25373011e-01 8.83970396e-01 6.81382359e-01 8.73989933e-01 6.35393303e-01 8.64014656e-01 5.87405941e-01 8.54045196e-01 5.37420370e-01 8.44082188e-01 4.85436687e-01 8.34126262e-01 4.31454991e-01 8.24178052e-01 3.75475379e-01 8.14238189e-01 3.17497948e-01 8.04307306e-01 2.57522796e-01 7.94386036e-01 1.95550021e-01 7.84475010e-01 1.31579720e-01 7.74574862e-01 6.56119899e-02 7.64686222e-01 -2.35307073e-03 7.54809725e-01 -7.23153647e-02 7.44946002e-01 -1.44274795e-01 7.35095685e-01 -2.18231263e-01 7.25259408e-01 -2.94184672e-01 7.15437801e-01 -3.72134924e-01 7.05631499e-01 -4.52081921e-01 6.95841132e-01 -5.34025567e-01 6.86067333e-01 -6.17965763e-01 6.76310735e-01 -7.03902413e-01 6.66571970e-01 -7.91835418e-01 6.56851671e-01 -8.81764681e-01 6.47150469e-01 -9.71621744e-01 6.37468998e-01 -8.77698446e-01 6.27807889e-01 -7.85771114e-01 6.18167775e-01 -6.95839649e-01 6.08549288e-01 -6.07903955e-01 5.98953060e-01 -5.21963934e-01 5.89379725e-01 -4.38019487e-01 5.79829914e-01 -3.56070518e-01 5.70304259e-01 -2.76116929e-01 5.60803393e-01 -1.98158623e-01 5.51327949e-01 -1.22195502e-01 5.41878559e-01 -4.82274683e-02 5.32455854e-01 2.37455755e-02 5.23060468e-01 9.37237269e-02 5.13693033e-01 1.61707083e-01 5.04354181e-01 2.27695743e-01 4.95044544e-01 2.91689802e-01 4.85764756e-01 3.53689360e-01 4.76515447e-01 4.13694512e-01 4.67297251e-01 4.71705358e-01 4.58110800e-01 5.27721993e-01 4.48956727e-01 5.81744517e-01 4.39835663e-01 6.33773026e-01 4.30748241e-01 6.83807619e-01 4.21695093e-01 7.31848392e-01 4.12676853e-01 7.77895442e-01 4.03694151e-01 8.21948869e-01 3.94747621e-01 8.64008769e-01 3.85837894e-01 9.04075239e-01 3.76965604e-01 9.42148378e-01 3.68131383e-01 9.78228282e-01 3.59335862e-01 1.01231505e+00 3.50579674e-01 1.01027937e+00 3.41863452e-01 9.80180397e-01 3.33187829e-01 9.48088578e-01 3.24553435e-01 9.14004012e-01 3.15960904e-01 8.77926796e-01 3.07410868e-01 8.39857030e-01 2.98903960e-01 7.99794810e-01 2.90440811e-01 7.57740233e-01 2.82022055e-01 7.13693397e-01 2.73648323e-01 6.67654401e-01 2.65320248e-01 6.19623340e-01 2.57038462e-01 5.69600313e-01 2.48803597e-01 5.17585418e-01 2.40616287e-01 4.63578752e-01 2.32477163e-01 4.07580412e-01 2.24386857e-01 3.49590496e-01 2.16346003e-01 2.89609102e-01 2.08355232e-01 2.27636326e-01 2.00415176e-01 1.63672267e-01 1.92526469e-01 9.77170229e-02 1.84689742e-01 2.97706900e-02 1.76905628e-01 -4.01666337e-02 1.69174759e-01 -1.12094851e-01 1.61497768e-01 -1.86013863e-01 1.53875286e-01 -2.61923574e-01 1.46307947e-01 -3.39823885e-01 1.38796383e-01 -4.19714700e-01 1.31341225e-01 -5.01595920e-01 1.23943106e-01 -5.85467448e-01 1.16602660e-01 -6.71329186e-01 1.09320517e-01 -7.59181037e-01 1.02097311e-01 -8.49022904e-01 9.49336734e-02 -9.40854688e-01 8.78302370e-02 -9.10635555e-01 8.07876341e-02 -8.14822416e-01 7.38064970e-02 -7.20998902e-01 6.68874582e-02 -6.29164916e-01 RcppArmadillo/inst/examples/kalman/Kalman.cpp0000644000176200001440000000255212253723621020757 0ustar liggesusers // [[Rcpp::depends(RcppArmadillo)]] #include using namespace arma; class Kalman { private: mat A, H, Q, R, xest, pest; double dt; public: // constructor, sets up data structures Kalman() : dt(1.0) { A.eye(6,6); A(0,2) = A(1,3) = A(2,4) = A(3,5) = dt; H.zeros(2,6); H(0,0) = H(1,1) = 1.0; Q.eye(6,6); R = 1000 * eye(2,2); xest.zeros(6,1); pest.zeros(6,6); } // sole member function: estimate model mat estimate(const mat & Z) { unsigned int n = Z.n_rows, k = Z.n_cols; mat Y = zeros(n, k); mat xprd, pprd, S, B, kalmangain; colvec z, y; for (unsigned int i = 0; i> stream xZ[S8~_TFT&@ IiIɐ-7lItE,a)fi&E S&co7[h.ًy1t{\ԥBȞ'$eٜ|R7۳<>`/fjq6/o*򗚄"9GJOKPa/rWXd}wɤ//|4I)lߡiULqaq^7gw1 vT,f3 EU/T?Sw12|v0&?%]!_hhz}|аxٺ9^nl~ݳh;ӳy9dnLb/]xƀ`B2~DDM#ɷxr5dgPRϡXېoMsX#|l͔kvzμ>67#؞䢻 $wKgI-s۷lz k%s6$TjgT PmwK>#ک~wHTp  \4eA0Z;4WxO4ЂFpt@gA ޫ}:* %A=UL""РKd#a: ]we `@s`3:rseCu19`"˛dBXDDPA&\IulNQPZzs%2(q.>a) ImkWQt%Lva)K Ck5=ԒNb2]]?2~Q&`x6mdӂx1(6<7:'9fלzN֕$5:k"l}ONZ潂obzvWs뚿15EtSEY3^ӎcDD,`#A\˻ySĞ i,V=(qwz;{EmM=GWmuTܢL:uyʓ[gF.KBat=]Ε.{ Mb]3m~LezeTF($ma̺q65^CfY5`zQr[,(ңdIo}x m^pG$쇂q컏os<\fu,]O}w ]+I2Y!=s,FrE;*oKP~SXB|.\-{J) kWų6Pj)hH"iW:*hᬏl=y;ڠ <nf(Gؼ"ٶaPCoh&j7Z, dBCvX",imиlhokDAǨ/&b#ΟR*"߸8J-xk'`ɔ2)Em2q,,_b":lU6wjsk.%K-ztPک^sQt]u4/݊N$[_>V,˫gs!# ԣQ:،tt9CuΈ8lCKK|. JPZIOmJ2M8'f>aB(M5뗶=6{ۙX7j˫y]a +5Iڕ4܀ӔM'-TR[ˈ2y2>\nl2ݺHIk~ V}끀Ztpڟz\?yۢr_nǓfKe  l^܇ܫn#IzuujXVSYz[N@Qt_eq(#^Ѯ mȗ :MC}+7,Ҍ$`2##spGLx<.6Pw< V;g{wP Q";`޳yu7 嚡AՅ /kKPڏ 7(Ѣ0m Z[vJF.qd`dt[|kڥ`-k>G Gq~WKW!quů)vR7V]vqD?Fi uoq}roQyv1]P); #ަߕ .sXfg_45m&ﻄșg?%,eEf1NLt8Ԋ(/,}$Rft=?QuyBNUM1NrN㒾RHjjwq5q~$ckogG벉뀚m:%ކBLAd}Vn^k\:>{1:5zGCs{ ^F_?|&%}-wh EhOڔik 7}2L7H./. PId /]t61 [V8ד>Μ?fPV\2~D}n`e=1w' Gendstream endobj 57 0 obj << /Subtype /XML /Type /Metadata /Length 1167 >> stream 2022-01-23T16:49:28-06:00 2022-01-23T16:49:28-06:00 TeX Untitled endstream endobj 58 0 obj << /Type /ObjStm /Length 3508 /Filter /FlateDecode /N 54 /First 453 >> stream xŚ[sFFWnܪR|D؛Th PBR_ %YVvKE .lΙ9=K\(eE2qeL]..hR,u!Y$Q;-w;^{K'y(\8)<{].N2u: Q]tZ3{/xbb_u[,\e q1jv.R8E-baTa+K;ti+gGW{:ͭmϮ~\-NlJ#_Vw9|~r[s)<__|ӝdommq||u~[C[TVR1w}VX}4|^(jg?#7*|ݿ磓jR}X6[sܦZcnd6#+_q5̟ͫ֟<~? ~/h^M[-/;grrsb|_i5_敿'W5y5"Ul}Օi*ױ9J omE5/doz6L0+ba ^VbDq$Dm mkȚ1Vb[mI^}~ڃtO>./ *|҂|~xqYW׶ GgUS_~g|U0P0qC0 ̴נY鷴z-_WkQ][cX?ٖ:V,Mb'@7pYvY;:kc{{?\9M&92M}7]SeiusܝPklY4͙)k݋hqn)k&}miE5SsoyUI_j9Sֿgm:Җ?!j;pa{:+&I/>?.<ڀm kX(J/r/X]<~1d3Yoɢ?Zg>Ol^~w! 3}|o?|acCkrQJõ.ޛ g۔ʣ;ɾNIս;c7{3ޟPFZ%]]j_QbeBZ|BBʿѫ!s!R' B +BƂϏ#;vb|?m_xi_@߿osMP lű0,G{.wapxo'[/qE^^嫟z^Mw_N //kUR{4M.pk_VOp"cRM(zPSMZ69rthvxbf<7Ywb<S\؁hI}ɐM(mn9/Wv|4]ГO泫+5-"}c?ũxixU +$9V5V;VU3u5SOs,m" X^%=^a{ʽZ80M=%e,XHBu,KCXb %򄌱X_+Pl2bzcF2ƂUؠ'E-`](g,X)?z!g,֍ 9crƂ՟XF 9c1Xc1ʡ`,F9(P0h(P0 bCW)rjQ%c1ʡd,F9%Cd,F9(`d,X,$:IKvX0c& cfX0o&(KX$(K`,FY8(e (K`,FYc1Ž(K`,Q<=Pa,FY^Mh,X@YH0(0eL{ ;,Xʢ(2,(v.[?e\ (K; uʢ\Ҏ-@Y8Ҏ.@Y8QXDbewAY]PzewAY]Pzew Bл,.( Bл,.( Bл,.( Bл,.( Bл,.( Bл,.(K -zewAY]PzewAY]PzewAY]PzFj Bл,e7Iһ.(+ ʚt"1.(+ Jһ.(+ MewAY]PVzewAY]PVzewAY]PVz(2Jһ.(+ Jһ.(+ Jһ.(+ Jһ.(+ Jһ.(+ Jһ.(+ Jһ.(+ Jһ.(+ Jһ.(+ Jһ.(+ Jһ.(+ Jһ.(+ Jһ&(+ Jһ.(+ Jһ.(+ Jһ.(+ Jһ.(+ Jһ.(+ Jһ.(Gz# ʑHrwA9һ]P.(Gz# ʑHrwA9һ]P.(Gz# ʑ[X]Ps,z# ʑMHrwA9һ]P.(Gz# ʑHrEZ,.(nm(GzcVi# ʱ[4ʑHrwA9һ]P.(Gz# ʑHrwA9һ]Pi7ahGu\:K'iC86{Ӄ+8WЪ1żޝfLW*.j ;f<)(#My/H3Zsf~5B&\g,/-z3/ՑOjG.Gӛ7a8XZ57nƶGЛ\tG0ktۂ5A8|x u!kẁ(5alF YN[wnbj M=nlYgГ>ޗVF#x$T| ?{$oyX@05ܬykOvMVҋz/fnk`GgC8fK=/[Wк?|Q՚j[0VKuCzϋo_endstream endobj 113 0 obj << /Filter /FlateDecode /Length 6133 >> stream x\Ys$q~GGLi] >l!,@bGuWf>PSǗY?VfcWk?9껼x82YfSPV6l|tuuhWΔOub&]3غ{w7[S&E]]_Wֿ=> ojwX+!g _kZEk19viKT@|;tB;JD=Ο Rb>ruխ$e+'%r w4)5L8+ɭϚd[W߁MM &%Ȗ(ĵ=>Ĺ>N|Xk3H,mE!*cW0[く0`ָ#|SCLfir%*;f[?"kwT\[8v98W)[x* ) =Xer*2~%R0VIcɥ-"fVw ėF*qS"-gax0 ,Ʋ)ŭN?֠V`\ٗ&l'55cjb񰂬y LQBk/~9Ś&?1o@u}CWВO=bw!m .M5~&WvvcK8ӯ G A% J@u~9uez?!&D ՀކZk] ]Q30ƶ-=V8< T0OSyvwbpqUqpF&a hťD1Alrp{t ѳ0X׏{4x@%I[VT%zLUtR4Eu߱ӿu|e,d&/J=TZ֟A_޽B\kf©t^GpaB85qM%UMTۏǂGKž 2$ұV]v %b[-S—*  wDdmMba0 "*EF) Fgl"&6=zO@Ŗ~OG y"@:\}mB17 (o\EHKLB'ta2jpٰ= JNgFgPgRS@O x> (fSlAR,xޯq&0$q@x0e$E8 1,@t<9MZ?1`m/<hۇlJ3SJNAO)u1N RR$R,Dcq", RR6NVV5o FlŲ4n;Mn_NN,`d"YS?b Rn@&yqI`~]>80 JT߹pS)=OKH~I?C퐦4xKN| NX)Q'I@=" 2 d`l?- %  &&CpeEŜ78i2u]GJ;u.,b';VPL> 0.)Brax>ƊLMjؙ-=pB Ce[*Eԍ 1K%Ж2;V%nGv=CRZZ*E e"sKU6h*(yBUb ̨F-@GX+I&gӱա0.V@(Aӊ|p *-V=]Ep5re?ќATH3ui (Heώ 2МU<<jJ'"bփx1a*g;DYEpmtflMș<1ZG(&隈A5w #E˒|*Wod:] asG1RRu :@nlZc=KJ;dX&m}$FʙȆ@*~o-ZmȟA*$yX8ۆNɀt;LСR {X խ7Y)j߰Bg=k/4a 55]k:c>x[+ @ 4 R[!k#GM;̻ )Sͅc"ZؠEa) Yk݊fD6jD}_WqudHvw@s{߈$Zv48ˋ}@*{A y "單fj䇹 ]-kιTfQbq@A1Mj@|W =mEHkZ$!1 @uR)5G@"u.T: @ZG4}bIooʉ+'CL Rɠ`FTڤgPP1/<60@> S!I !0#΁+]_U_^F6Ju#뵺2 /K< -T6mR&bM 2wyrRCae?z.' Rro )U:|`զ%ćTù\]3!IfR2iܦ2yu"? 28cIuU.Do9ۥ@V2-Cs mt~7l9\ROHoB W/YkY?/#-)0x|[%fja3.'Gp-9%a߅tV:׻)5XXW2 NղN麋F)_,'*g}D_"bTXuojEx}NivK>1Nmp -=[P< jtM s6e7A]- .+t%r/mc/s!S^.x}֦GGK=F UȰ)FѺ#mO8)_xۡm\6NkNz! /e^E\0~8,lT5  K%~xCf_۳Zl˂w{"M-O ItG$%粐H-!mb__o;:>%ASL/הv> C DW B"{;S,ù?Ӑ)GgIGV|NCr|.Y8rLW5ogcw6-d>fȜ^MТv|D?uK ge~'GF X׍F 6|[WEEǞPhGDJfjֆ@\?_  75iwq8)Ԙ$@(th^F XF<*B}ҬJD;y%_ϣjx ~TK1 nrŘLo V+T+n 6-^!}o'g=~tV.HTfbbb)A*<99v/1ȭ2._ v]~YI% Ѐב!m=7ڱAKY5_*9C+5:m%ɷԭJϣH-~&„ q.'.h_zX;2\+m"e:E: V-61{a̵$4I@a|o$B_^fd$o=om-}(:a{؞ñN5͹NLS_9"g"Q 4I1}h"qkŠRe3a=j0̃֩]Y`|ɜZQnqiZ5U?xsKeғv)> !Y{oE*#c7T:)N FUd=zZMﳉgb hI͏4c7}'Ā,rM<6+:^?]ī\|m y1[ιe^ɪq"3p]OIN|nCp?!JU;3GIb$O-> stream xV TWDGSڅc& nĨWMmYi6g Ⱦ* *-$zNb&ɫə's̜>է~m%HdAWL HCqR AW8jxqgbK ^n8~AI%UΠDu&.&VTo9&N6m JM\B\U&( wMbdRԼXV=?--m"!yj&fdߴ8mjeR]*:N*5EQ=J RkK!Q1&MKQVP+ǩU*QT5zZD-PREjL-B)/ʛC(dD-ː!7=Q2~{y|1tP<:ϋۥ7 V{W[Pi,сDy."1iY!ϚLpp {Mi.MbiPF0NXvSp AX; ؝dʼvV R+Va ݯjPA9;')VFfwJs_H= b}Sb NeYa(}3U ](ld.LJ/ce }K5y<Izphߗ8RNp6kU=7ZlSpWm3AgFCTFhI_ݘr*%n ._syF}yg4hLI$$E} ' (r; ,"Wv]t2ʙP L5r"%^,E#H5Qo>dqԔ/dƆw&\?noyr r, oM#ns*KudZ);bUϢkJ 9@ͨٵVkUCڹz2دp4Fh? *4V;B1g[%X O8'1$EV8%f4i}]R):`)Kp53s?uȋ64F3)k9:%~[6qC&XzoŸvQhkYW0;(ݿcJNj8+@k7hq)3*ju=4"k1\Z|dzm ;lPux,cSd'wQ$M=8 }TySTk$ H0_?e4_RAY\a/,:6xLo\_;4WYY.v \ a a=qG[OgF9W6I*LS͡I?u\:n8ܝᄿgE7Rc#TI"T9t~67s^r fHj  Xp90 3Y ,wnaD6q2|3ٍ$(/ǘof-*Q<9 –b'f'|%d8OcxH&~wp O(1U 5;Ahk;kk[bW x<\-rM^4 oIQY|N_72#haq/}K~[q߬"#DtDaðd}m٣P̧޹ҐӺu?~E5Q_lFWU[j.uؗf * Xd\Vf `U4㎍12j_`o+!r!â/iԕԕW3_pa7ۀf@65JЧ@zug.0s O}A< x=XĶioJ̞Af;o}i syq99+:?2hemВݐxP ARN`>i+l= *V9' 6=^?)"am 3%nX#Tڊv5kI37,#rX/"ɴ㨾bpݗHLJIU'ԧ7DNBZ,O? xq=˽}pŅQ=88`u[ŊQ+ak _I4߆-!0˪`l/-2'<ˀ:Pta@]S b=bOlP''a۠iTiZMtG攓n;&`byMF4?S>mZ[5nYendstream endobj 115 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 7508 >> stream xtSWǟ{4V^<{ ;cMr-i$"˖ M1L -$@PBۄ@B 9כ$dϗ۳{ޙoT.@ [vxӿ&.;BwEޖd{wV-Bual}QCoڇ aI󂂣B{wa?ai'?~Ngvw@>䃿Cv(3|Ã?7.""bk@ؠPFc33t ps5, _HQԲ9sY0lQbK#\E-r_sjo|qTѽƌ2~I :|8q5ZE VSC5ԻZ=ʁFSj$EmRlzg;u#H"ܲo4nv ?wyu[f#D'k#-gS Y1 yjvo6j{zOWk:ՑCPCVH~VDuFivӍ˰!UJ d ,7TdͷjmPKR?A=cq9$dQM5TwY^, ֯pܿ|v#j'hFƸ_ .A+W4$/glXm"^G{6Hr~6E?1B.,R=kaٖiX(y>+t1os]+E742oI{%-~孔}ąEÿ=~ %+-9*% 7]<k^!3h]!|Yְ׸; p_4 uC~9Yp.>zB#_ZRkaY6/mKޯ!O$h*Vi# br!+^DO`VMQԊ6:t&\ȒAB2yW#NS$B lhk5ؼ?CE5JY"ݧ3ԭ*ʆ `Cg4#!eEatõGzv½L,+5;&0 w6b+vF@VxgI[gAw[Bt.I߿:g ,\%"xG"t6b>gY[ʟҞj83Gqg!2ۯeȟŃh ;3wCD^D[ hAk7N;QU( g:{D?*1PHnJYR1PK(It5?3__|}}͢.4m;}ES{*L>AQ5JX&ҀJ)T K uu.\^B"jOl1C36m?&=;C+j$CyC_z44H>]n}GqSPf=Eh$1G 9ZfSoE?'~<Vv'1|gN>u$(P')QlKGCJ^Z]Vi4)-;zPUNLc;%uٮ٤R9-.8ݿj}%cS'(`NT%$sĤ4gĒY{.v)JBj_$ 5ԇ> ılt{09]$As=rFKN0Cu#KXoi@GI]\[vx%'bW&IhD{nW䊭̀Pt '*e#TG1үq-{?MhRsw*tM0k1<.,-2uPȷ?\Q䣘CJ'UIq+J5vuh0',"Ԋ)Rezi3I7/p@yVFzArax؛t [͝ʡ;&(&JHz&G9qI8PS{Fo d6WelftXVEvXBLgENnu90RV7 8!?gs*J_T3F:\ 0ئV֤Ty Iʴ4ٻ8wEu"\](% P9(!+!]^bdI-HI%ȕO`Fh8;n"8͵j I9ϹW/_ϓv~5Γ*GpIi6}HyUjlcA,)1K उըGrPƏ9Q]ZJv{@GTmRAvZ y^@Vj;R;߰! 6-o|E?fiM~dfmM2ӯ @kB6"?}գ Omol}]J{1tK6ݽڵ_IN:kB2ߴrx7y\ 被jJuUԒyu>1QEۤXX0{{Fpf>xz#\C{Z>;=o#'$K!?ƢhNv_tvs@轪pH|ڢ+G#\ vaF36RÎmj]FA>(ݹ{*c㾢,B x,ʕcS+f!)8rt7TK1 _esڎ=YvtƨZhVVZ8@M)"֟aٲ"`T 6Q4 J^˘ =jX[XtV [t"ՈXD*Lpq"HU"7@WJ8!Unڵ^UN;=}׃xW5B)9VxR65ddždOtg ~' "ox!iTd*W}=^J=!?mbxSQ#Ǩ*&AJVb!ҧ*IV5Ag PB4]`+ Z RRczi|SNդ?i2Ho8iY4N*M!x&4JWY{>}a į[χC=ssAA*\]0i?"exG^_ mW1xQ8<C=ˡR-4KF|ѫ]h󐪭3V>g_ٙx(@K/h6s$wٜeɚ$@C\ߙ6NbN-|/[/@]/>y Dy,bo>Rxe‹#ktM^L0 [ƟבH[ƠUi{Z^ QĢ"Q_~7 ~QOZ2>I0h#Dd[Z{^ ֈhV?P(N"$;f/0`Xx/6TNx%=Ae SkjM$pڤA{3Xv4r4#~Z3ƫ<$T(fyge9jT&su4YjM^jqt="_KL&>'^4&11=4eYj8pEBftAAQ!O~cWv %xE>i4PCmmζ#Q$.UգQPJd,O3D!n0/ڧ/aY`(eDcyDe@(-S̗D!͂$J=]*K75;@]dtZ$yF0bHE*Mj&+grm֔3PAWh,L+xK =[IID1,f4[ p#n@k9By/B &K S$*:ȁ JAS?VmUnت]?3'BTE!Zж=ouLciM* "DضU&ﰅMյt7#MeVUyd\)wb^#/4O`:b!1m+tSz_l"3PBey?߼oU͸s܃%[XKAā11u_EZXT:_2ā#ld>^$Pev":\4nwNA9{bIZuZJbO5&k!Zwŝ$O/msd3 Hq0yI9DxҜv\-G׃Pk 4ytVEW{G%Ji */Ο䛮tLVjzYJ USHmz(wAWYzڶ*6oaLfO7kW#qu2n-{㫬6D}';Os dU6<frRɖŎ^dAABd<kB[ pnŲI?#KV1E$&p~&}@y/<]?z"Ʉpz+2bo_;s^!ф[7hKUEU$+A*>=t?VH:+3|avW<-As45W0<uu#ɬĘB+NCw&ެU|F#r wB:!A&Yu"T S@*E]&˂NӢx@g%HRz4?]95Y~sHw%nAӾ`d 9!l:=ZGyՈ"с_͡N^RG-e9'kL"$Ha: 4t.W mQ^̈!MyUkW6)DK4Cee7'e۔K#QWgKeM=)_3'gt#]an&LZFqi~)󖯐$$*);6f?D0Ǔۑ- i;JGGL߯N㷱vW^8oU>>p+\dL<5~sFiP!k8 ?ůշwnl"cre̚ȖXi7gS杻{-7>W5$[!8~ȶ55ٵ%ư"iL@n_#>cD9pnN0}r¾ |TSl)o>x|對yIQ^[fot`hM#O#ۅ,$&/n#Vym}34VsY?-Dp k%/Ck4w7ziajnUg^'\`2ӵYߖF1dfe ZVS>MF&'ݼ,JSx`O|[&OO}9E]m =ʐŧ:#zq?j3- lrf4f6bꯂ+YdE?HPs*:Za$2%Aic 1C֣2z(%4;=ꯂ뤵Q\xn30cp7B t {>lH > stream xRLuwbpLn٢c"?6B)8plK)וvS>dlh RQ2tBb#a j Ē|_| 0e9yҵ#{^po+ocvNwE $@װCPI4FX55 EKm))ʨQLTM!ecٲd2d$'[,$:5w%$2SUUeL671rYKF2Vg0TF&-Sr2q4 d^, b11FaaB,_]d ЉY!HɰWu}ܪ.@m8G~@MLKi-o2VPJxKnIb@u(, "5*]kV" EGwQ`@+p5yVD>C#EǯAzbh2jn){ ʥs`?`∲pvrM]ZWiMCP,wOߚē!2ڀPd{{4ם6I9\SCQQO|A$ztK ,H367D56vZ|蛦 v?x};7{@=>3#-'JM|q)!/6"F"ˈ}J~xne*M逳KpS^-˞T(E!ùxA]S&y'^/ء9EWg:%Cj9M^[rLKWXGp@iasמnz.!1nh5jZAI ʐcN? ǘcLo 3GNfr/W|7)8Y'_8m?rYId%|sN(Fa=endstream endobj 117 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 654 >> stream x]HSq׻fk1lע0İ(QfبnmWﮮmc sfUJ3>0ÇA=S]qp aچS{D]kZ&Ȫ:(t*rYTڷ,te1buk;gx*_W@(/VP' g 7 o+ w:}N&=9n=sWr>REΫuBIcˋ 2X| )mde)d㜜o Vwg&p2\n(IEK$ Aӯ*Fxϋw …PBfYGҥu<$ouendstream endobj 118 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5684 >> stream xX TS׺>1CզڞCXmuV[ S!dNΟ B@`PP)Vmkunv|u+ 콿7݋xy.mJh/DГdl۩xzx+O8QD> ē Ga7x9yLYܨ1 c̜9}BɓgFIgoKˈZ,N%E$lʢƼ¤Is&Jf-79j8G-oZ(ȍZ.$y咭 &ɘ+9?{aNniܲWe [WW&F'J^mMui&OܴcRpj%5FRQj4ZGQ1\jG=CFͧPdj5ZLMPRKe4j9zzD j(՗GM&Rj^ ^s{kw^Ē3ق[}V9C]o@?w =CFΎ H젹N 6>J?zN(y!Q 'Jq_ [2Ev6C ͭͨp˼TS栐VN8&;0^=E=+]P#"Osy+8 6lp{aqufve'7e RT,qZ!z }^^h9|Ɠw{\"^YL/z0W( 猅F,e LުZWS+};ڿvչ=59ɲm`Up,:SqXH(r5 L"rqpګ5`-;@Gv)pV~$lkVW r[F/xY7cy'q/_u> =ɲ$<=NhzB(Ñ,ތ 5R6hPJxъ1С0QQC~,Oax4a-$"_ *7~كO:Z*/bS׮K䨥` MU Bm7:Fk/o9D8gLPh x86tL X'BOCcn!}7?#Ϗ2悉 WSv =\I?,Ԧ bUVu9[ vE*MU%Lՙ6JT\TJfKZzwjNa*6Pl9V:,`3)@K`w[&{{@הv+W,J1,Llh % (f5gdfM^D{fa|TP5ˁv,M>!, (K~*[x6ݭJ%JΡgN d ǚ2%}fb—2OGK+WhʈT›-7!)KG ex466~wPnJ7Hg.g|FأP!犹J,3cLDHM $$(^N}V~=AOF;<7B${xٷ|td;JϽ4SPqͤpw4 *^V9tFl7Ab#ż=3y"efuJ>W&$cE99iwH܊栾~/SI݀N&B4KX"n{g& ~)pTHj5y(t*w^|zbaCۧ&4?[s~"WKbh(OO\laӋ9X(BkI:ZΖĜןA?tPPt6i-mm;ogϾI>yș͚0+/5@h{w~ 6?k <-vƔiJ|zwh@;ZV9tj1 2@ uwhRb~a4WE(8iFRW5`ձTThiR%]8Dy,^~&Gu}:0nEkgl?V}`;jȫ-nuiGlV͉!LtA@o]~>d"Ԏ>"ap x0= TX-U,'pfσx#F U$)P'BM֝=Q Ψ00-o `uGIkr/=XGW @p߻s"d~|[qsi=xcv,} 2%9UYw wĊc;9@.+j dn[SA~iJL=$|O$n\ŽT;Bq5 '[?J̾yE|ݬa5@'O{fŒ-?TJL81gaRi kxIř<[2;\V[i33$!x@/k٧ʵ8O^ho||v-N}`3=Bݍbm$yF-eJ eu;jw08ӄع+@jR[nW d'ɹOz٫N#q cgzԷJ6"8/yKAiuZF ԜӰڥ>YL$ zhA@/[5; dJGzaT9% A:fH! h~zڬV2량 `&oǏ^Λ[߶&t 7%6>2XV<IzJZn Hϥ$:,%Dll2l*21 Wta6Eefg~o 鮭^= DjA!)E峜ENsoE-0CEiɶⴺho$|E#׮6W߿>D#ެsIx4obۍ@ItFjdfi|:c ]yͅڏIqc~I85lOG}pƍ9+63{'x߼ַu:uxx[U>gV75<46FhPsi2p9deeUǾֻPne{e'Sױvږ%'٩ԧi-[QGɷPWŠU2iqGo0qlr!p]iiU@={}hcXd6RRMWqx<+agY+|R7m~htU!|:'{3¦r5`Jl]:x\u;^i!.zk4_Бynk->~3zO7`0rendstream endobj 119 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1829 >> stream xUmTSpTƞjv]]kgSݠ"bc`@[B%oH y u Z :מC[s9ٍw~/Xb8}ĉ{v  rQl]K[rb~Z)̈́) :Xp\fBZ!Q w>%ܻsO ٳgg5bTT+)%{Jb%#Dؽ[dj3d>P#UJbZ\&<,U sD5b*ҌgFRlYXQaXjLPjD%e 4c {;byX>VebYav[ba9Dl ?#/gϒ6&kp%$/6h6Bk DtQ:717 `WSe%Eꁚ(|qnms I6c *@Xni&).e)tH@U@anӌP= fb c1nXEa# /5(mEtw v ,P^CO#|J<1,GVR~A4"FHplσt} wB ?8TX&Sh\D@!3i 'A |WWr qR9V{ G ͋!ȿ\?]TCīx7 NUMVih'w~p^/n,ŷ:$j̔MBtw##\HErzA:]n&QqfAaE12>c}> Oyr 񶻁LsJwdAc:vzȿ?f%5iy":5kcerLiI5Tr"#Ky$֑aM%endstream endobj 120 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4098 >> stream xW Xז4JEV*nIL\Q0" YdGt.(вRƈ& $/o5&|1͛ e7]ssAL&cvpevL=H#ˇ=L0CYs`f8ڲ GPeȃBBc#l&{O5{v6, YA?k3yDD3gFGG hMt@p߰(_5A6 1pYf:7,a KC:9GDFE{]!`cfϙ; 3Yˬc&0[f#3lf01[erƑqb왏933qaV3k%dfTƊa&1&LBRvuЪAf]&o6ul>gq4·U`sh, .1lְO4== (9Ț{ɥĪ !|0{I^ \ZѠ?cF4gƋv.z,bSbkjGӟA 4CʒR Ɣ(,z,iޗ~FKTЇ*m"]NjSCsE{\w'eQvZ]ibiHIӶlp+"Ò%ɦjV֕ >t'IRe6frU8jKy~"&Nq8'9EẼ68wN(>uN}e ss0D[N_Du.i:==TŐLW[}+t2xOW4Z4šȖO: EBxr.#s>-.#*J$[DkdMi3m+QA^_T|> K2y. ABԿ=Fퟒ K쎍;XWFZD_Wgg-zv֋wAp=~xLVD>d6Y NyKԊISMv U9'*vc?djdz!Ra![M-Д%266C;4u0n..cwoU ^WmtuumiӅծFp=~4Ke)adU,%B Zw,}o)X6}")( ikQzֲmL/V~(>vz_4oqR* \#Qb|=Y@KBK M )wsGƔ/׍Z2"nISRa?p!IG pC١tC{y(gڶDw}rƔ&Kd(WX9M wHSyǧe?ku䏼2 @=Wi0QV%K钙*(#:p" օA0DjMNMKG҉L/]Y:,.5++B>yyT{"iŒ+}Y"Ap!r Kn.QIiq$(%Qs'xG]aKtl9^:/ ; !{3Tu%dey#_?|Gp)$8hYpW(i]np;FQR/StFl isv-=}"ϪEb!U5$;L5 Q_\vۋTv촙an좳/ JK|DupUTxk6@*2KZ!ae}WAFb72"뫙1|h=6@gJ oЋTd6=:69S鏡Ω`v h2Q6+QV&}*Q8(+Y.g!d`c@[p0>-# k$*\H鳫?6ąXI{c`;XS)2gB%|-I66&3K9paVTNB-iOG-螠Riw.qKG}.L9S^ds\Ta{Lu'x jشGrO GxKCd t::p9JTQĽ!}e'+S;@.h?iS=.cܨ /@UP%J~X}I2x'ۢdA_!WVѸ5k;v2'SxWLEM%LH:뵉bh~ \jOy5p˂) *k.'L.y_jR>6n9D0w2z1G@^m!j@g1V焓&FғUMMՀ@T3ܣhKq Sn2Ǒ0K2|Lцh܋>\FY;RAn'eƃ 鷱!X)`EEH|7kR0 9Wʗy U_Gic]+uMWEmVnV"ks7U]/z@F}cpUc@"cv\Enٴq'K#muQ) 9|c<*r`·D]2/{FCu~PxkҚwkx8h!_పmq V^tgbPQڒ}BhJNS A\@yHccEUC統d4?d_`AN/oQ(QhcMeo$lOB鉶n8b3X2R7VUpX:O@{[vg"XFzr1ơ8DXj}5e͢GVW7G3y_t9d8sl$W@V|}8I%KrqGi^gT1ylpS*,rIendstream endobj 121 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2625 >> stream xVkTgQ)Y7KBVj[KjR%!H $r!B.@P_/дŶնuwnNDOp{c2?}.fX,M;_]576 >0+ 4w-s`>aɶ'. B:{6/B!彈cX\&$_*8(J]vMLcVܘ͗ ҹx ?+c^"w|Y~d2G+هVDD/y|^b,r79ʙ&q$WƗFƋy|0B$Hrܭ<~ +{SmNlK`a1^X<l m°W@X?+uf3ONdΩqyeίX`^p:tN+|,@6*@^oyNpkU(ۗ^Jc [28mZЩTXJj%DUMn͆qk_NPI݈-2@.Sf+Wcld?M (R%30r4:aA:6rڑB˗1Zt;w OSnGZoO]&LD; 8Uzr0-g6Kk"Pl hF?>d] =`;kh1p -@Q( # {S3"h|[z7׃R'&dk>X+REԸ='_uZ-2'\G.U3=G_a#%,AD|6h:AQ\]hWu|>#9WIjx_CY񝻌VN];KdbxvBɺeJ =y2qmPЧOצU7 go'/7w\T+b\c/h8J~H=k*⣙ԕ(˪I8.1PDţrr6BѶvW PXr3٪ٜ'U;/ ρۭjuU,aı"H&]G6X)t9=wfcwI[.Z-O| ~ upl !sBЉy5YO<D:=)~r@Pxx1O= xziF+a kBpiAZn0}Շ}=PΙFP0LDɷa?&μcw $jB`&aͦ1CqS4r)tVNh'Fh^me1k2Lz*lS,?뵩.v|@/G޴sJ 6R *- 2 BNzt utҌ=#ZȜBs/c4=vE28:|[S 8)Pjg)gxW_|DjF7%]$ӊJk*IKj=KG>vQޢn{.EpWj<=0ȄW+h04E'p?ZDWCK$y XZ@V2{9gVhÏh&9 CNAe?,b~Trאvp9CPF4ʝ<\,Vյx[0İjc}l׳~`5ȡᮺFyX̖A#)bȞt=TBm=?=O~yX6 7S!Ӣ)p 9@xfu>(ǧ I',UtsB-S67"4hM3 OY/ffg4wџ#: K%ɰ\_p *\\kB*BC1ߞ\endstream endobj 122 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 702 >> stream xLCMR6/v7B@NȘ@  #kb\mqCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMR6.CMR6Computer Modern1234OQmIK%gd͋ǧj~$`dًËËً‡ #`$Of}I|:}O˪16-X~_ȱЋ=:D\BEKmlGvR%I[Bp$^sjpmza(S(S ڥˋ- 2U9`up拔s8Tl+'yp|{X8 Nry]d;j7nd鎷鈟 #n78&vCoa  7 ޜ ,endstream endobj 123 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6542 >> stream xYTT־5(lQ="QwT^33{>+55O%jg1QS,C4{/k밀Ysw}FtH$sjgDM, ڟw$=xf[ 7 :OmU}Щ/#HF{yxZjm5qڴXM0a?`.VK]B=\B_[BF >~|DD8qXExzZr q wsjh8㯹~anVK\݂;6`nA, [8r˒K]Wx\{Z_z;n ')N6}Qֽf(Ƭ`3+*]f53YÌb2֌=3YǬgl1f.3q`>f1y|f3c&1 Ebf2,e1?Mƌe0L??3o3 ƒȼ b8 '1M ӝQKn]~$}X/zʦal${~|#Ȟzmm7?z3,Zy}m7ۯ{?L x?з9|-,|,n[XqwVssAO[|](f; eqF̎(P&ƒ{ ᛧ6jA 4B=R=:kʠ ]׊X-;IF*Ku xwpNҍ6EK ![ȑb}ȗ=`%5&$񡣜(w22"7{q{N XLߧԂˢ 8 Dž/>]y@fzl2H.~Xa{W%*~-ޚuQRy3=%({rd)=렀rV,X>DB&93G3!7 x ţpdNbN_Z[ȿxQ5Zp kޣ<a'|ڰyoY+}.Uk\:E9gֱ=1 i&f5I;uL '.YKص{`IL2vd2:L솖h1<#}n Yu>rvdv\I.J[Ӌ$( XD&]ƶ?nOw~Ot]n K).Eof#V)4ܩ= ŠRQ _h:G>' =+C;q)%x@N"tJl|JVvpփ9[NOjl 2mlZBkN&<1i$|pw}|h<@ʶ eۼ2(z歶k(^)^O~G97Hſw;/I2#\VLgcY߰O|'w9;Ec-WZC(]RLPgjIqL>.EQj*T%*ubԠ\\'O+_ZJnʴ 뱰s rcqBZIrҗLDru[ZU5FYW<)}uNfm*\}onZ@IRfWd1rSox(X 炁] UVp/f!oX Ԥ c.ݖLk4) a{'Rn"a#N%S& DJ_opj]A R\&@qL=a˘qJ.kRÒ7:xa_'}ײ}^y `0*uP-ׅ lRRjDSU 1ҕwM cgr[䘋WI=E ׍ k`۲-=9mad@9INFsa~hl.CvAR!9>g~(jC)&Pwjsn U ʣjeUۊtBKqn']}ٕJ;<ݢW77KW]!js7ok-b``s=-h:\ : ~Kh#~zY1M)aaoeDZIʸh9h?!|@bZ((}MyIc|,^Q4cϼ8P&Brx̑-ԆpWATͯ7IpxAGf$Ma/+39qcder~s>Vd&3&"Az^k)6{:(;M!D%FCTYS[RZϥ~V>6zҨikϤy\$>'CNSTbe]C389FlqC70NRߎI7ڥ8 P7xWjpO\31F^g(?ISB WRPL[h\s4G!ĵxplƳQ|-kg9isxyQm ٥iQxغ،}БO=@&iT.:d76%SY u* bd?*lcm}_?7ʾ;-b-p0MG*ܳ|YK`^}'S뀻Sv>cb%aRFa\K[G"J)Mn6[e}@F r3l3 xƢ:  i.hйJBſI(|Z/â4.P{?1^~b8_\.|r>Ω$StBz&9ոMHJ,xpbq:z}.$dE* 9^ͷKPv )z [gökšl޳}J/z0~L?rw}Cp_pWmPY(ʍmD%ma8!3<\mdY@pXg< ưT-[TAA"hO(*q, ]UI`aE 죋i1֍frb*!<#;GTLSQb7R<݋ݫ6e,qNh8H2pb K{2kƳ(Ҳ0(( <qёJХŠa' .J ~&9$5+| `R"Nt`gpR"? 9y’A#XKp SKa_+cw,t#W=G~~kI㏴R-SD2quyU" 桳sׯSo>seqAh< *2 bdP ai#mllV@'Y,UVBEŭc=Q:(~/թR(=L}}rdrMSSQДغ)m]hrٽY 9)O&ؗ#u-Kqy!~0c#KN߹ODW\QR\%y,V\̟'͋=!J|o  0@ScזL.Nx]d@:P όԮ+𸜄<%qezs1';߫98NL2\QPUis LOI12\S/+HX:b ~866V5Ύ 88j1~rYs$`~QS%[Ɩ,-JO'Us~U%u;?u:4aA|I{v4ap͎ [C.Ny tYOsGjR~F WIU+si+8% _Mp uyڨ s/l}AUD 22&L JG<^=7'u~rXwdpvqC&ێu3Tg\I5#P%g Ej/fq~J'R>CyEG}`97kilNdFk7<Q[;8x$uچ@a9\}hqHۂ[`|7psx2b;pJ _B խ{kTh,k PPZ"L~eT׿R*_iWZ7m@7;<, _!%I.¿z {.yMřZ]V聫1ƍX; >"v8=3QI=ZARp-:%(SiSъX6@MzA(PS9Edop Z7=٦kl4]}yZG8o{ m p#I wtN3%.f:!(A VT@utgh-Ā2z^%aY7޽~aN1endstream endobj 124 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1848 >> stream xTkPT>ǽ#-XsLx5Z  QDaEXj!a}a\T/})(1XۤIiN&$jl'=&i2͏|3g9>CS MʰMۗiqGdX5%tOQjP@%oL30k &Ld4m|'̔aHN1k5VyU8(h4}!1ٔ`Nѧ%XSAoJ1Wfgg$e2&`Nlg34&Yx M۟؝L>߼>p,`q8jwlel۾rǯr"2I->r@d_HhyNItڱ<#Ffc%|EiCY4#Cډ5ȀNi'3P_G6AU@.n>QqkxZCCwHޏp0 T`?oCnVnZpMz5H" 2Wqh<'Xxչ ^L|~m‘?5\$|/!Oݑ1oހS@ߛ=9oݐF}G6 ~"LjNCCb#D"OakE0X` C6ȶKߕ*ARĪE/ip#.Ll_wRjyvoJ bf C>kʺvf͐_$~*0u⋡R ":SZ߰gO'1d`9r˃t׃#::ŽH&0(*]8= r*Jܸ胇̿l^d2Ŀ^K?rcم-|x;C+"fuG_u>ΡlGD#й_Zk;W}Z_ 3̂+e+Ww \WrN5'wu57w#bIԝV Փx/yDgJ˪%*5E[#Rendstream endobj 125 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4820 >> stream xX T׶cϯVr[V-0 08N͡SoQ;Ujj zrޡ^R uzuʃZDmR2jMVRQcq#fQgs d>%_'eDIjh1_f$7^kg˲ @j/ hvpW.Gh?wNJSwY%aG\΂}y[Yx\vx.䉳L#t@GB8 ̙G㱏gq1p Ǻ{|ի7o^]p[XfYQҘeMm'žFGw8t޸k֭r yb1A 9N$Vb1rzZ/`3sx@y\^vKlW?؍^n+\].ӝ+=8k,:f{O8M@Cz%btՍuqǖ%!Uq(pNJ!*%z[F(5 ͫljUdddq~HAn$JUs0BȘ>wV>3A9(v|2) )Ҹ8 ,^usƪ|>7G4]|b w'#oscSyx*iΚ ؇P9sD8"%^ZN")>QS`7+(qh(с(ϤGNC3`v}C#/EǹI n^ .gu$>{B dz k~ -ȘH3^I'YWD]Ua IQw7.5nT}f!I2k\#OWϔsa;PyE(ab9YwRjm3q3Bz_[0~xʇx86{C6"i)^o_DZ]L%2&SU![jN:'oגܔkJ*i թZZ}a[`>@\ 13]]H$E2iY\TWH|9PfKtZ][经_pl^[}}x ^>;wԷm;||a^Ѽ(d* eg ]$ |l_[SA2 +F!:HآAr"**\i D [ٹ()#4Nf鲋n.P]3&0wSRsJ$IJLTgq(*hG׿?5WUW~qp33MpL3\bO9>f]v]O;CP2DƒA_9y(KPX';(IN s*}~e%ǵ:ݾwA_7<"B/7z=#k=܁Emi3}hZrSh2,ݸD\l4oc˲U x޲ hsjINU嶖pÍH߷'mmᅯI 3RgN}.\~d-*uZc0c";NQGEDhv0,Jr):/}7 b.h><6G`g<͚c_g:'{廆a'-g`_xpy mOMHnMv嵾z_zD;`m]V](1؅2v~ u&@kN5φ)Ɖ>E(sSٮ&+royI~K8գm]#4[nA_bH{XZ.!]hFxdF%"&[C&O#Ga<?uTWxj?-![l|Dl~ưU5s~H=, k).A ]چZ(t)j q y̋RǀVTѩ(,.qFp<_/kPS[+Rć<7?aD6jPufiZfFf Jad Ak<,"D8Fyv=ItczΌ=\ ~Uky(-@̥nݺiuWvu&X_蠈n_,{(R#M *nuFa@NMHWW0lt_"*!Lh&d@ZfK!s`gy/ b;lJL!MJC8_\$ 쾛{]Ay ْVw:[Q ij}GQ[x/Z%&y|$ixZF!6(\Lك☸ʄ0|jG`4Jj.*Ԩsm+I:{leQUjaF# t1ӑ'*+Ҕ_[v}\u/}l KjPyZ)g0\DS4"ZdzdI@p"(WhˢEEP'3VY}Ygh=Lx8q~\rEJk,Bn^+Kh[ 20FIL(?endstream endobj 126 0 obj << /Filter /FlateDecode /Length 7166 >> stream x][\q7o[f#t雃@q` 1Xyr$r⒢_[UYJ >}W/_׏>_=Z_?ᑢ?>{Wy_~(+c.׏{q_&cݷ0LѮ-\hw0ݏT0+^`=Vq}~wؗn /*p M1`4Ty%Y;xD/4עkhb޽Iu0UPň^j/fx{]iUjܔ4mq8D{MZiǻKEشEY|W;qLhVjwky/?)Ǘztba3{R5B:޾oOs#Rpbw_q2/ 䆑#4k&HoqWm|: wi0-΁1o ۾*=ql=RP} :f1Jv b_7DIїZ_xY7ą&M$)a]<+Ll{/kile,ِ(7)ޗn9N$l}S݋9 m9ذvd {q`~>~yoՊ'klLZYP8]7cɈ;ud/rli+cԻB/փt^ r`J")"~V#4Ws))j ci$mޑm+t:t/kpǐqHlU7[՘"*Oty8^`.!o`B\I9 p(h#h8 7P̄[ O~2M&&m6V;ʲfU'"vqHx=Dt7)8=jX#Yk/Sx-<l.hU:"B[%I숬m|pq(zLBŶ>9-FźG\-iy- ²vOO;ϟjE6fE·`Ć ժ@gл?Ԣ,/HI2%@6Vl#ߤô#7 :ŹJȋ-}mARvچ<':ozmPmtX^DpʬV&ϒ9),wb'@"3F=!׹X`̃kiÚ7H;ͲؼįĸjFmghUSV$j]O Jp16.:M#}{s.i R Ǵ Cfl )Ȑ]CAɶٛ'D_hNi%kTS۪pe+P[Yl|t׹I+#~oy& @mR݆Dvֲf.D;J[hKH\>{,/ؙ#Y[-C8ovo#"%aqՒs8q ir!TٸZ*]m= tB@脀y6#{QP4Z: ڡ4~=֙/h8-8znǿ]piX1^wEµ l.R8?-Iщm ;wb*o6lLL80%8Ե2|ydvu#{>%:;M2y*i${@l Oʸ" >٣ B&Q|>cgJ=%ߌo^9Z&ZlpΟ}`2e(u DdgK&+1g7Lh71{(2{܏ʼqo%΋1f OSN*SC|$X9 9 uocfX÷: 톓 gCSKa͋w\;pNש?0hžg` v_F! _V} s#[9+ENcJ^(*dҏHYC I$pKHjD&5Ĺ.C! ؁0ͫ3p/MATAσ_ _<[}6H;9 5<0esMyQVKm ӎc1rcRD2:!2IQOY@wq8# ozqYI͗BhS`~VYmgLnƂƂU 1l߈ aM9ſж)S @9Wz/=p,zH;R:,F\C#YVF>B^18X?Yg ."1:D ZvXݕSOQ1!!/^M|ǞM?/B2J҅g)j|1xݍ'6Az9e$Dхl} eF2b#$!Eh#~ hIw#ŤpKlufWU}(]iˁӆ.{r2HMtE?^^`Z$x6T{( `aO}ӂ~%4)`$MZOŝDGi4;hJ=H)t& 2pk& l _d=ĉ(%u>k"4=G1(AU) Ƣ+2N0_%=SrpsbJ2oL7'M&Au j\Lx'{R O۵ץ9e\2yZ23F* ˂E9Bz$(r8HZdȑ[oZWfa+`#g%r %ok[W_Q#{%%w:f .j`/^ҏz"oZ!&EBqgȋ)k"m8s>*U{1UiSţJ3mVḫCŬ6d=μ]\*b+] *dߗTr*H 0wL~J} mp׶P>c`)tr\㨞N֤zu7ݳf튖)`NXUO8VO)r] )ˠHe5=oF0CIx4LF (T պ9"]^QB*ϛrM\^3P;Kg"J@(P!-mClRTU-{lLAǾrzLt:v]~g,CxRhx"\w9Px|XO&o:lq<0!ꛢ$ud- Iq<ȅ\|3HZ'! qmU.sR?Dt$f쌨9)9/r#33,##NP eܿk'\ltӡm&}JQrp t.$_R領]"'u'22~Cb?܌6>zDX,[`g֝?]畦D5웕K1WS z R\HI"KfFk5y.bCoyDBӽA3ҀB7R˝;s^D&CV WJ]Ǿ.{r0V Pқf4c,]q`U`eZ'c$&}&F_ݫ; NXFSPAhfPC?a=m$ Ij8"xMR35Aw 峯Ab*ˣ%X=DYsJTegKM̓In> 9xŒYә 9y! ?~cU4}.}DBbTwe$ӹO:Sgp6 n$JFCZ5D}A86(ODl BIAc+CY3ʤJTaXc.RPlKƔYe2r&1 G*'6*Mn즦x9dzq_o|ڇ(Uwv@ًxB8fa?.2Oa{ %juWhT1PpBUޗgTNʿ1IQHxW@~)}6ҢW{\$)~-&l.?uN-{+"iv* Ř#דDf7uhU4dX]S|7nN)/cwict4KVC,` MS! ɒIdu~NΒ;0"T]oIN6pңg|# 'w>Xzi;9w |yGv`x{m6)0t]Zip2,׍yoYGJQendstream endobj 127 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 234 >> stream xcd`ab`ddd-*(1H3a!ҏɬ N~'f0v0w&A5s&FFAѰԢ<c=a Lڶ < r ̌,j~ t>7?.}={Y+~W^T]`F{L f1w'XLNle2< Xendstream endobj 128 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 397 >> stream xcd`ab`ddd-(1~H3a!Ə9 N~'f(u0wD;wF ̌aEřy z: > KR2sK2V0,cd`add1rD/^8yſ``9 {aW3%G{0HtNK˪<wXP;c9sg4Mi(_8mZ’]O3m)38VYr6\\rA sq1+Epʙ-j/'?XF`Ѵ< endstream endobj 129 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2608 >> stream xUktSU*PH|4WAD"P 8RVyX(IKlܤyܴy$MryIaʣfAQ:Z.X.f΍?f}}&Ox<"ym*U 6-*U E&}>5}:kHפ~fE6o*fOM>3Ҍ쯏=;̻0 _V Uy~-0dZIu2J]+Sjɭ2/# vK¢EezR(b]B^InWʔJ!?JR*UJ*\MR*!RjVNQܚSdFʤVEʕ 4R)Z\XEiJ\%9uo=Q_Rr.LRU.SbZ\IZAR9VH.wZ#+C_HjdT!ܛaZV+Ϊ\KUu&9%JӚDfVH4dFpynMOH f._cz`ކabl96+V`el'&{{ۀ-^fr=Mƪ'Mrd-2dmr(kkgb agxxBP 7|&<HdV2"nI˛f :+0[x }v޾I˟c(Mx9gHJcΨhARO a1|ט1MD.Jc?PBX%yG@#1Zlr$Lx8ꏨ dlY6Wӗ5<[uաmL>C읡 ̃!{,xK a]X߭nsr0:<@8?t֝G_,gf`FGBBҺI,w"m[Ž ݀`>\ _̺ j"x}^]{Elt%PtfI.v@C#pWw?c5cx„A:\dGR4s!v~&f׳~Eh\)hZznv|:1v`>ϟ)Vr\NqI7僧kXx|ns|-ؽn]deux-!sM@dw>;Mx[l c,cw9mf͐s xޠ7g= 7GFA-# -iJP{e[b֔t@n/[M棑?D ho2 #Z DN` ؂ !klHCF#;O\BS= w8Έfϊs@ 4ZЃZvfBjY5lZЙL:MaC83_>cĐVKu5Րa A=zUBw[a[fsyL6gS3_5ev lLm?t>w۬NMKԁ|/Z&dNRfWQ1zq}]{]l-ȍ|^n9Z? yPMsЪrWCOt pSiؚ+ T{\E&")ۘΆv)2T(C3R{N;9o2 g iLv;4qBygWςôfі_݃2\3XRvE޼Eh+ZQWe,=q핛k| ߊ/9~fF!~ 蓆#<62|p8Ez"hY\C9sT-Xe(~l8GQA3WVXfV_%<3 RYPqU`lVla¡@> stream xmLEgWZZ`LBXЪR Tw7w7U(/Xi͡ Vy%hԴ[!&˘h1f?=qi.UrIέnǏ;9}Sa"Jc%`MyY룁zCSc.[Fi.nͫ,,--+"XC$:DЏ+izU ] HX ؋D@@ayD5R!Uy{򠌔VUc  /j5 b+}qqD ʊd!C1j$US 5hk*w/רy-U!CoIpۚcQj>ap +YK%U,VyPA^ H]Oe?yY:JKn"14BEh 0+UV , 4$Uj `Lr.]/&}ñaM:pDJ!f%,0utneV#♉6л̾6ǵK,!Z`qqG)eȠKW"Q}=SGN>{L b:՚GNl4;1F9[=eii9VpSX?W?yf,l5M*ՙ+ߎ/D:_=3m/7?Йs$8ZvnGDvIP֖tD> stream xcd`ab`ddd+*t~H3a![{GVY~'Y34yyX~z/#XXjQqf~{(&+k~^fFF_5|33^s¥EE٩k,X7gPo)' QRUq ==}r=}=&5UTy&OX9K|ulSz,Vfk]V[?RrK/j/'x>/[endstream endobj 132 0 obj << /Filter /FlateDecode /Length 6816 >> stream x]]};j :@,k`q53Q<;H_U$yKaZl~:uH^|4hʟ|]>.D<*>9!N^//ՑaL8z`qΏO9cRcPq}'{'7PC ;6W8xoRMñv1;Fo9zM6Q0Ϧu.R㠧hi ժ`vsz4U'u*[5QQ<`Z;<Bqgfaһn;-J/zOf\tl۽[ec~c28N$B륆DQ'f"π5L5(j5L<<"睒ݨU_&XщR4=?#`/3&mTXvRGOݜ, ɥ2TC^&e&%[~=Yz&lRTTN.~:v.hk]SX_k:R7;q|2} oF;)`}?2Ӹ Ke)Y6?OFC5}lǧ'<8z%LD8ggIӌ@ fQp&e+z;,prF0`["Kr7[&)S+8eNv`bH0_T"HHWkK%< s>Vy8JskTƻ!d drbT hY5$=]-En(*╱ΕzR'DA>FW^Cߗ %]V pDGp($Kw'g2N<$1\Ek z\eyLujɫqDm+Rl,h=,ͼ a_:hWAh_h67h;3a,6?@=yjGh5X?%c>ilvqs6fgZc'QF(M$JLfq%_LP@]ϱZ \ C&ո'A/V= \G:⏦{!T9 Yt${C`Hbh`G,mp䤨BivqOzRr<^לs1%ģ똖;G/t$2{$vz)c2 L*:je#S\Z+Ko2^n,0c2)rq3%4 (n3vV~c !+ߟY,Y"Η,S2CƐIJ*Z>E5{Wy*0a-Q& 77F $%F^Y˹Ċ: Ӥg<-U*IPB\X2v-;99=-g&D*]Ny\ala"WI^&#$ ,8V976jM&>gB粒;SF Xt|Gp 2gƅ>{Zh}) A(^@xQ jUxWs&8J)5q]DOb&ޞIڑ34+*\F$ شkΚym2Բ?[ HɳG!Z7i*T]́3OE"y'e1C?^7/9͗fQ>6W4 .}~%xטɗҜXCNu Qs$#C jLd &QatPsc_V~29ЃUުɁI]YnӅ E3\uRpp3"IdOU|09I.{V5wz?nvW'+ a[lVc;MnPZurd, ؞; $xsq&A+] N]"`N6Bn=oޏ`vh7=M|4R?G7)ekG/HG{_‘%]L)lqAg*Qμ_U1B%0',e;/! Ѫ5s6=L+`T);DO-D\ׯ:˂ͳGg2sw+u1X/R1g箬 w&ivz>^t4U/xH#bsf$vm*Mi;=fZ&xȖCm"(kRFSZ[ջĹ_r'-<qxtA.o5QN>-nҼՉe@ 2Qns )8n+vmzuV&8.ܦ|+VqES JGUϣӜ[+_gP=YlN{Թ1EK5Wy3+?t]b^k`Z%disY%\64χfUYrؙՁV D ٫,bȟN 3?F=o<gy&ۘKg".yKK7eaSPmΊ=Y'[^k+W6> YdӜtYt=#?igt o,zUHjǒfMYjvnZRH0dI^ z`7&# 5~Usl|nFJ)枏4`$NQ|Vd$s^ >-G_Z׏[ѝv*zL%Vr*_{0}YBt]KX(ʍ])Q "ZW5ϫ W2|ɧhƌ\>:7}¹B+le);N8@NIVF2c,G3)}άuiPc*xK@wp 05ԇ<HD\|le}߁GO)yW1_ޙ贇.Dߥx+8ߋ!eD\w6Z$G{vg_xےIWaak4,/ใ',*+b_PեFʤ"ǔU ΈX?\ݍ}e3VA0 ~jXrf?@>Znх{_d YJF;g%=܀%UdU.x| \%oh/fF n/a1d T04l~T w79uP=mPd7 Yw J_\F ĒB]J2O*m RG4BB 8Ċ oAg3$R8VΘzI7T池H?PRz$wXJ3_/:} gĆVd#&ղVp( j-~883ْD)áFZӍ7 sbr^+v%n7jp=' 0*1y2Z^Uo-lܦc!K_<R2^qK99ԓnx1GDP$8>idk6OPmcj 7w 12/Lmwb'WPZ [x^2㤾U|dF|,okJ3~nߵ1G+T!ӯyOԄ -G;<,^/?%][ZtX[%U9!^`ap. I.泴[WK]vIq=oB4j})m<q npkt%ޯpjG}E? F,Bf 9<9J]]0zk|-wtHX@ =,ɲ-z\?.@ "_." E'2Ѣ*F0 _I$xT%3$,&87%8W7k+4gn W47wު \0>_8%mZL/1۠ 1'-`NgA{0&jO\uF-{}a41=AtT's[҅czm;nj1oj5> E ˃]c_pO ϗa\?]>ۓHuhy+K@ViގZ)R*P,\A7V/]q~qs'Ej!Iv:Ѿ4\#V9&{ H} &?Q:scb:s‚O牭Hwf dfQյ+ vAv}1kiw>@n~UR{%7 y).@V/'/YQ@!$cCdݓP]Wendstream endobj 133 0 obj << /Filter /FlateDecode /Length 6189 >> stream x]oFп/}'7$-(vh`` EZewm]r69$=}4?z#88`􏟿zR5nR~vig{ܽ<ϓJCibIǧM/ҜIkc)R 4g# wN;\qv7A+ {4w_ #ra'RNKl j]z~txY{Rͳ) +äMq7ĬT<1.i 0_F KM]8M 2 K$f rD˛,+3Ԏߝ!_;%klQ4|,,vq:x[g61wjRɄdmc,C̎I}D eȳ20N[*9\]&t<9qF^fVi:]KFHEr(Yye9J ;Iaȉˇx3hׄH_UR"hMALݦ L'LUrQ T .SxNGO*=ҝ-Ț0.SXu-?JX‹ ٘yQ\ HYBxlXu*a%?A$3<~Ǜ7Yb J v/iTrskmZiԝܳ0 Yo8- Cc*ES܅eE:˜S'-bK2B ckcU c7dSTswyF5&!~-0Ժ&0JO@~tE(\}sQ*E ֆ}=`K, pKŸpժqSVZr:5 \NJěW܃]j$TQPAȾѺNkt'Z^1/-` q9?tgW?R~L8ov,uDi&!7vH^L6&0 ѿKM@A&}nC$`R 4S }6"߬vCFOb< >Mq>'wxAvjcERF3G Q?DJ#}yT~P8vIGfFk4: л's[Ea`\`*,,I4,8E dfod1*R{jnS*EOIt*Ra (O InMm l _/uČދ;&WS֑"B|/}pGzA5&-裨SeJd??C)^B6PmFq]6aI=[Ӂā{a 6O0^yRYfzo j#kdڒ=6N9{ur[q6 )/?+R{L ; l2*uN @2ќO1I-_%gvު iG`\RR0<6m]XTbNT`( yQ F:>&H=/eu%` e!ft y_/(F%jUqU~5yɔ5ψaJتSI?5\rN "rNd*/4 o~Kle@FH؛HE|<]/#@]<}Y-OI-\+R?C+# xLɳ98 0`:bF-QGhA]>`KISD~sF51g/486,9/{ p WoSέT6G_bqtdH lw 2rgړiTNC(/`PEBz@}±<چNO'ZT'nJ#N(O7_ޥsDhm<;LvM~vTՆ{G``6ze ͖7R39&\tPtN_=Mx~4t2cڑ5 1iC IаU1A|" ʮB3'$+jSj@(aBm:!mtD)~X=2,jWkUߖCyPV rUH&3~쪰2^dU8Ei,i$e:pwXqm*sVtpޮ |IJe}*Y9NG0aFF& 0! z;AtuZNZbbCa \Z+G;vg:`X &?^ =G"1Y#ihlRW=S@]}<-jͬ{eU~ַ(ˍ!L(it5ކTR UW[yB뚹s[i.S*\lU㞧6?.e&`ě$c'8j"udqhhukAaY:8\]`{b$i悶,n[3r:XGWp.OS-0Lmzj ˬ4N*sM9=7k"y6rVW̞ߜY^VY͵ K݋Kaxih%9@1;|1*6ϳՁR?dj\HgPKh,l. nn䒄V9n3pm@w,̳kêsM]ιU6,7=JbMbRiF^BCvU;}!żAryC*!4ު~ݷ) Fl=[Μ.v;pE%>/>S >ES۵r=sa D> stream xW TS־rs! jZJբ8HB$1!9d ̈8[j U=W}뭕s9{އGX<O3k,q] kԾK/uwxpdglǾrb{;$iҠ@eY |2{.K 0o?(@'.$AX E2~3#KDD."Q{]VHd.k.fC<$do4 K¶,x엮X)['{}6?>ufn/\xG%ugbCL&6R•Jxۈetb91XA$>%^\b5M!l1XL ' wAcĻCb(13aCWVYG['Y?QB3}j%u{Ȥ!C=bKي<f0}qaQo8nFRR.6E%ܱ29d o]yvK$kWлδnu-2o>EA11TFwk i_E Gx2^ġը]'.|M5jj¹ZTV`#3.Gly$cMM|YSd}҃GsA0\Y﫼x~OF }AuyE*L6P[ף  7*YO\Dc!DC~߸wusYt=|}e܉6fd쀅?X 82ϣx{\9}i$1_;n[W1t҉c$`H ߩNs^xpPD SiS" j?vqYFD"tan%przܩ˽/pmNJiF~`?Ɔ_%o?k0AaV<%<RXC/0QGGU)$eUjVaAS [ T!wYFPb;%0X5|4% yaTU<T aXMd ǡߏRGltTG9QӲlEUw%lFA`B8"Cdviwۏe gI ~i}3wl(/eTd#Jr$m,(S1<; ֆz)spKrt)zek I2l۱ Qn`ڷzMr6+.7d`{m:ψK8c'^;W'5l$6G[jx&gs`H$ -1f8s͚cJp&9V`+VcTeZ.ycTʹ:D*Ez]UE  n[bB@+ ȩ.Fs8Vo i[r4c%${oFiQis%F-T? )hLWSET}Y4f*RV^SZ_ЦfPZ*QDυe,^N FՆ:6QI\}$P8_(=?j 9쀨w_Wrb:$q%*>ɬ&=QDZFȁ5L>!{<)UeQ k8RH?Ng}_Pd'}Q78 Cd<[3@= Q\LЉ-҂G! -5J$,jscQQ֘ xB]DW^z%pEb!l UwI>hp:Dg>653&ܲ1Eܑy#J}.rq]=V~}l &>ϒ#Njwe6MTcCKh^%_] ;:6|c*Ǿ(%^ _ܱi]Y":[yT֎t74ճڢbuC*.jiژM*w"j2wưBL$S"ţDZDIԼWk`$|}[-uLB_,D-'SQJ͊G($DAY('$=銂f ++@]>}$sGq|lOAqP3u۷~6 'VG'Gx T3 2p! ξaMqM_< #JS\QZXT-%@\q*+CTjgZM\ZQpJ3+5E!4x0.1-!E;g Wy0҂Z T7&׿ϡ!tua%ҞdpZJU xBxsst'&0,jE"q0,B"%2x<'HZQd"rz{ VA;`{qk6C{ESq/+ce␀iKn:+o# V^G+A4ux:hI4d j:y3 8,&5xmpn׆HCC5755 p?aA71.a5 k&(lm&^׼{3 D8^Ca2L4~s '{ᡋ^ӟJ4ҡGjET&C+v9%̉cUh+P(㷪[JztzFuU/3k#H|/]J; Uxl6:('@>'u-jCШܰvuQq\Wfp(Ã)m_rJ!DePx@5=S佔K)n IEm/k4f>3¼|.c)bT#TDeEՕ<O;v}.jbǯSN®tI7lbޟdb07)֛Z d*N-LÏ IQNA<&Q=D8wcIiF* %&h_GpI#F lг rP)@wc'\m?պڃ|ֲ:|":rѩi3YyxW',33>9Rsu Th(O I'52Cmb%vCvvao"endstream endobj 135 0 obj << /Filter /FlateDecode /Length 5599 >> stream x\[o\~#i͸OxL `,bqse ] h!5G h{V!ꉘLe2]_lqG'bb0_;7c&%vUt:q`x[\ډZ*,:XJNeuNS'۸W*Ae֔l{k{9OvNS&-tThy'զeոmVaY鶽$OleU'Ny'o~tQ^0`> M*Y.F{ܻ-_#YAYA)k/tb%0IK000j .1-Ӧʓ n >zN[4oK١9%GB h\NᠢHxIC]I ;CFPMMޭ8=8rP[d>';-AM۫s2M&9v2irN4!6\ },2}pmHK,7(eK(vO3O~O ZhXl|ᒿ(b"'s<YǪ۔tϱ4=nU ;gX|KMR򀳠?G>5M D;BTqn,@oVђc~op<'겡wrVy(*3~ }LG49Yvp IxU8'' dIXsn$ٺj]"e s:q΀ptmX62JF6u5]v*_;.20%tB Զ'1u}xa\ u\Hi9&^Ϣ9 sLAy&qEEdp:W\< e H*ˎɬ%q6{{pU =w w5 VhJ luwq,4V?w2=85O{ne%#>c8HT1@JïkN N&F*+9a`/,plXQ])um- QaP|"{tAS;\e@@at6 _"K*2>`^\Iт  =p`aUJ [9~"TޔڳRPW&'L"p;OCG)Z\T{Sc)>c)ޕ"L ^(P>|Uhc)^EPL`8@_-m#xImdX7EOǢ헥VI[ BDYR+"Vc=/ūR-nrxH-L):4!5m24.Ҿxؾ[Z֐}_:YZM J2aͩxF?C(jheo#l3k;ʢ%()-7 +.h5TJe!q67"cmؐgSE8瀎Y_H8u /^`Rץn(Qw]8VsP~TI1'-춘RH #)UMnv \ vVˆm\ ]ߊ7/:+kfw = [QHV*Q)exi s0^ēT\-I*d=QrьxSBi3ӹU}_Kc^NLjuo4[)Ņ$/ghx窩x]x^1CUݖPڦZR+\s[ͬ4wWMx4r/tTPm6/7:O$8 aI G5ɖQ⽟I6y;_$/ql/FR+x^ohcmί ]6NxwV,! Di4r{ػM^-:BSMӛZX^RD>c!"f+ s,ewTRJ?W^?8ګ;K+uzGZ]Q8&y;1HJeT~|qIS0L+giHO Ti"cIŴ˭Ĝ#g893պTtJe Uc),zq~p^gL1WPPLmK>~#ܑɣuFeۂ/E* (ZFEc֋Sڛ~u RMn޹ aWvY#;ҟui[yO[ƪz಍ ڙ4'Ҩ )f&҄ VnR}T[+Qxot@pΡUخKK6]Zu!M'—"GE8D,kT#^ZkJ46EQL!Mi[:mgq+W}4!-b(*te@') R"=j H&b; 8FIRoS9^xˆxMS#NkPچ8IMQ%B?tS?~y9b hARxiN.9mPL#R02VmbbR`cܤ14I_Xx8l^jR*)]T/fLFKƓݱ9Z)M]dL!Eh_eAՠpN͂4nAI)O+<*z".s}Wߝ>/=Y&"/ga5"`P]z B<g+d{[l L @$%6QXiss%O"aCpQŖ'5 TIO uz\NHi"Ÿd>9`B1};C卋4yK$Б>xq!F^̐vGn?g~%`7(_Wn~YڑccUDy<7ؾȔZ Y&7Z@ˡq ϛE«:Á]69@Ӝ֙1Eűi2dqy" (}v_.;R.*Xs||cOv{N~'j*ϧUJ cBR)pWEh@|? O ڵsB= &?ՠ=gq:@z5q𕺃{c =OryKO/[N3Ff]:TUuڒ I{-rǮkA'?H74D҉@!l<;ߧiv.GӢTʞgoy{WvF{YiJ/tAvIS^cۈzl\1 (`٩.ih{v$r6/BD-#CAl . |ak, 7T.N߼'; YFntИHgŻɅղOy6g|k!}+QΏ~R^%o_^O-tU57c"X/u̔ObjzׁYui%u>0>ohtjzz|gKLPG׊LOtN/6%%]}32ɮ=D!lcgص-g^F7<]h_6ܜ6Ֆ^z8 Xм cAObք V>VڗNbI0Ql^,rٔ]vIRƸe~֧ frsSmsW<Χ/iVhGRP秒7ס,>~{: 2Oy1:mX|p8ϳ8ɗd6|LE!7hd9! G=Whomɞ[3 &/g_Lyg5tKx((B -%5߾ Kendstream endobj 136 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1467 >> stream x% PSW#< (RSk՗(qRwRd+$B F9@0DDYT42bֺjQjm󘫝>t̝sܹӔ EӴ]pHĔƛEm1"H:h7:{+! hڡڙѴ.OڜjO@ o@,U!*ө &AWk9fT啖6I0I;s"Mk(" \F.F1WhPtbP%XKJ5p)} HQd_)_R0ʅNɨOgHsQ0JR ڍnf* Ymm!SSl{+ޒV  -h We_ΙnC 7xݲBU̱(!`/NUaXyZA"~܀.د%L|;1% `. B3RWrX0և᎕~XV?(JiG;wC:0D)~ǟ^} 'N7+1s5R]_ܘ\ִt̋ /lޑiӷ#u<'$܁NֿF&%(ƽh/_|*ͅ%G9mTJ_x8'">̢pBz,iښ'[{sy]r)˔l2 ̖b(g?EG+=~_f%E*SarɴȾ[i @whq[^W k9rj$~P|Dė #V-Nk@>'Zx)YGF TTtJԘ,%Kˍ{r m}tH@~snmvTv 뵖k`%"cb֬N0&҉|Kd7Tŧj3V{!&!Eʭqk:yǣoHc2r[s5v՞쇖 [AWm-k,j;]&Nd&!cD{7t{v({c%8WN/k>a^d!d`Љ矾iP׭UApW4#?<W"ļ_4`ǿA^nSCvKٜo(03*1GRNJ]e‚?sKLjETT H&/ Yh/a+$su~ |{UN6tE_"9Eh<~׽ugرA C82]PNwiu,Q8,%u& 2Yߙ2ڸ= Fi|ZDGy'AE?v"-3 eІŅ #pX[b3W1C5NEwtE5&}u_ѪePBDܪ6Uko =O?_nol.AO~]Ҳ;aSCR+2L4Vɺաבu72E5ۅendstream endobj 137 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 6279 >> stream xX TSWiUq*h׶jXǪ 88! pyJGDgZl}o ,:s/xp8*mc1a<7'ڮJ! ,-jbv8<<#N`|@-0m9/1aً'xNppy{V(|”e"p'H$Y!^˧Θ yO>a P4akDŽ{J <'8= Z%&xmh8T1}[&O[|n0e3gdty|pчL\:i>^>e*A|H8Nb"XJl!&[mvb*I8 bI&V.b-XO%6;b>'>%M baI &CJb1C FQM&V5%>A >F,‚$~7^psXLH0TϟǿH-N X1@;?8re[lrepaa[_#FN1iQ0*u3NoqsPk{[;.YG/x1톒!{3 p \x5WX*"pR&~2Ջ7}΃HLU eIdh8YpVJEEY.8`xYyNzѿn[goSTxYAF ]̫gmȟ481(ďWUWM뷊4'AgKEzUe- ؊nq7I$$/9샊ˠoz h k6{ Mc?F4qUxnYts^q>Пfx7s -ŋpl޳kߺ}aG[[xMVZCUcs؜LWZ6 SQJR^δ~к4m#=3EO> |P'2}NB֣=4ZA^7/ AlBR 4Ce ,NSym9V̦ @5bi(Xg Jυ(=dm。ܗ/8h+d5"ЛmJ 451N_~uڭ]YϙzXihAȢD@ I›]&%Awp ăXkRa+>30zzQc f{8zXOi`h"?W݉}GN3){X^]u9. |MoUo>&;@w8nnlnvapo'zȯWd0XGdfנ\iD_LgU\.JUm؇lwakM _ҫl)73la G۪&êaTmtf]2 K`N{_%e?i gʃSg滦mMTE]'UZP?'ZÁ=^ޣ<3y_A0K{3b N}CJ~IMYtccF)3BCrF}_-W B"B莄!)|kc=Ʌˣ}Z>Bμ%I Ѐ"@=O:NA5N&MؐfN '"DUC~Ab{3_ A9i6/0p {Uem{3ؼir/:K"UJ/(jdx/pH&P0Dx<2P^Bߦ{` YүTU.ɂB4qcrQlv HoL>A9)a#h`e`IxYAm)*d M,ZDV{Tj-9̧,6h n}ַ: i'747󚴽c_ b~ɃZ~_ &]G G y1M`G`0 9p"\uf9~ye}Adn yh"AvSGz(^Pp5|-3\;)11ǪFZs]qʞf[^D?`,|ƬEQ=uJ38zSf*P祃 kdyTZd!6UviV1>  ۸j٠!k3"M )pRyf"~cGY) $n1b+eCpV8aBgow|mY7CqZ+GEEԧko==SURXR'TR? A6иyhSPQ/fĴa-6/9+L,*` P{d^ +2p ށ4;}:>FDcBe6p4}ߒkn>ݸyzv3*8vnӑ͡@ D?6ȼ}.{ VyZP=W:Te|sI"#"NE9 ֔fHh4d$V~Gmʌ!Nِ-A TW\ѽ+!803p@ 8yIjZ@W}Ȗ/9 k"Dl <;٘(\r5GgEusUZ"Y.ƈ\ R@NjfV^ {ɫ"*ؒ|u*-H⧸R\C?>Гd{j<\V. AU+P+׹&5wG8;A igδؾgVV ,r[s`TۣMuGϤgVGRjKm2YxҦ)lx`n<ZCcZ!t(U.uzJJ|FL.FYp;=D_;i| \w2O\,+~ @ihL`U\vT$B9ۦkޫ G`}c?32 /gk΀Է˿Fcɑge,:86"bji>zX8IlK N_i2fdTT}`d kB[-N;꣠Gr[gDWJH (UUV16Bu`evO‡d3amaMloqJX`{gV4{tM[dpMR |t,2{M*N*Hxj[Dےܚt感. .`['d{eFjǩ'oB~ \z8³cѐ ;&c 0-4-x tlب' b:p.Nu]~]}=)\sPKCnM͞ E dl<"h9,#2x49@8].S pybx<S%=¦tJKẍ́^iCLR? 9 njĕ^#UɿSY+k3^`MoD% aK:@:U"M`*XLYeEeE٩f;8@Bx&1&m v E)gؓᤛ?ݽ{sn&9\BYhP ڷ\@1mcT)ƒ+vnF!<#k%+LLdD {{+*Ecՠ#ݔW8|^.Pȣ5nBDYX (IvtYdnz感kw##7>qqqXIߙB\ݫfC N@Ҧƻ7/4 4 XS|MEaV?^K lwt}X[j*RU['Tɱ(qc}; @c2Y* 5x1J*nE7K5ǥqx~}|A+RNy@VUZ&PT*)TD"{~Å=Z8"W\G<4tu%ZMEfbvB:S_iyPu= Oړ讔c ](̻fhyPP*0%mY8֛6W"ӛ $A|RT(u4y9dv%=T`q1fz(/A EYLMc[^;_qZn; ZŬJRs{S! =<^[z.{L`}n>u0i|\b SBQuIh E.(rW9ϐ60LJCɠx/ڭZq˪p'ٵz績æ:mpYd'@^* x550)P 9poոI5AɸMW`h+ؚkR6pzD -^{c%)cf ,0<⇮_/bk[ϟ8AǞ]a%_ 6o]C_iaoBv髟&7aC7FDz]\G] 5 'GUF-7:'\ÇB#͝@$?%5%RBIX:'HqM wDܟxb[y]sE۹cL FRGm|N'߽qxێBFW%PIGט.ZR,vgtujp7\xpno;P$/js 4D RƓU`9];~yWJ;P$;qU +:1@X_*.o?߀+]Ȫ˥fXwn.CUȖE[cXn.- eqьe]6z !y=^뜆Ύ/װ:%S[C s2>1ȭC #\_{^;mmϜm_O+J/.(&ugAOW:^W~~ǸR^چWfg\ouVkԘj!JZ\+Sƀ) hELXI<#v!?Č$.uRMTfl:: :| a? ΐB%!SRN{pOwto];fn˵?DJ=BXwM-;ƺJǑ6@ݬӆ[6@)g~0 |D_t$Sh3|}o&u$Jvmfh++BV>_ˇ<-ɥs_v;Ԑlê 2Dai|@ fErRo9 ?cendstream endobj 138 0 obj << /Filter /FlateDecode /Length 6304 >> stream x]YqH7`ե;sCA", a49=8͝!;^yFde >XGd_b]Ŋo= wqsly3ywO/3,:/^~,}).R(?{߻Ou ^I+^K^b]L\J=t brobWwcov ݛ46&>P&Oo*v ϗW_{A2xvǻ>JCU_]2߽A5VzÆJ\6-лcyY9]k$ $-V孨szuI&^asa_0][2Ne!EZSɸz/\/?S_j^^#>R*!ZTj(ee;k<}!6x$R}ۗBoC aT ,B ,s2᷏ & Mͯ_b"BåXV>woӡ>8xwW/e w VU=I a@pv8Յr/oV}7f^uHz# i#͉8*;MsZ)Aש8i,d$s8"g>ݣ ka~Wj^UzRbQnw^w'WÄ)x ŃMl} ͼYTP !Rd91TYΣzKLuҤ-f?I9ܦgzEz [:*ɴ-ZƩ2Z" d ߵ-"d&uJ U<Aȋu}py(ZPOd+R VC#\4 U&LղI>`(5L1!^qhiu%Hӽ H@oO Sev Z0ޒRKYeOfȃb EbTV& WJI8ArY+2r$w*,PVfىl% kaeT` c+};wQ`AFcV_SmL8:Lw >CUdS)9F%3@! [` ґݥZgbQoX;|aZhZ DҚ29y@qӗݑKIR5\@Mj37H'\jrfl v`BFY+t_ħ'пi@L 0ȃBCr&-hg-QV ߩ.ph~;0]F(DvvQg!Oqd\ /ңa> |HĬ%U:-1kFm`^n_ '|fI?dVFXnl =qԌ5zRTz@:tYhDEd{;_@Fy PXVPJ%,ݯuga[J1f U l%upckB&jѪygmw۹Sz3@G'O#K`XH @m5>O@\1!([,zo{m{uFߊ/,|(HqubIH>pF!qpJtz)}#F%ߧJ5Rc!36ѫ9ɋh+1 Y6@j`O(鈲 cV uR=fټC/ ־s循NkPq"A"#F U1Shu 2Iꢔ4K?'t'HHuo;OB 1E*LK膍}I!d0+vi>Th #d'/i9n `+7jnI~/~%IT> NSkzSj E6sv} NXqDO' V?BR?"hSC IXE`YaC+9Rc^Soc@eղjQ0O`{kk⊉8r-Krh1H!EW_ *9)bڠvV-KBYrDӹF26 Gf43>tTgb&aУquG6b Bv` &/qtN UY7aQ2@ Fl*sZN0dAtLQɿN͵ПM9U zaGi$}t_%~yr]^geid1Ks 28oQb#(l6M0ǏRSnb.7Sc]lG}$.}!ƭ4ܺ؀ƌH1A_YwvW9q:q( KBK[pV?EM6̏YstZԔ0\a4hqkrH$%imx"889YT%=/ v'М/}':Xx:|pƋM"ȻhYbFGC&'y1`)t"E~,-$40C*_W=)\/Sc΀wU Eܮ)3`3M d`5fqQWgn*jI I"zA@eW03Rp1 AhB%e;c0@z/S{QgQI( ̪*e~3R{a(EũCTq 0w h[,GS-36ARmZNhd镶d.ԝ#$h1A!111vO} |r*r5A'hTJQgPCQ8Xt9%o B2rMBJ "Q9pa% u}KraJJ,\& 6Nz xvSSP y@>!r-}Ĺ[a}ܗ+*R1twQylwylwUf7N'[ƖGǙs D*NRVaMΣ^E,UZorYOÌNfxDZ% d.1׽GlƅX3_U̲XcS:N<|:C.4tqy:9Bڰa#arW/NeQePm\rZ>&| ;7EX#`uۛ4^3 k>J/LTפ;Z.f%K'~rJ'j#o9$&%YfVD)u.;ƊLd_K2SޘDW<$[8ffx[obFU]"urH ?R8 ܒvlDܘTZ`<f1 ucTK3HMOkyLۣN%}Q AZx|~5Db'f[0XeHl &$Rjz=0 1\"瓎YFZV%-g }OP~endstream endobj 139 0 obj << /Filter /FlateDecode /Length 4936 >> stream x\oGr@xӎ_b /1ryʲ|}ӏCmrU_UWUw_ FK8\NVo^{opKRمѶZ^wgt9\06q]ת[B2_]0^.Ǩtߗ暥e`Vl3(;>Mo8L:97:=L;>N:82lX2YSZ:vbGX :a6Rp`ulfL< d,,-˭CU7}(ؚkIBt6p%Lny w>t[ϣ4t2Hz {ˡm944& T/Za[%ɞQ2H ;«fЄW=H>k.f{,%x:<҆o4* 댒чғe0㺓Z7"wK%TkC+ZEyU:H,w$Nά'HD+SEe V]܌s7VN4s F3ў9XP+?Ȕ$?Dm#<^IӨ+x,R,+,JxɣY*P%5B=,A>v5 ZW̒%K3]i)f 쮨 nCR10LN# jAOj91q iF;uqww؛GHVPsWŚF\逵߭/ 7eJ֍jC0eYR5{ ]ǩhΫǵ1NC&IB0OF>ߤFXws}7<慎* Hp&b4 ]mxYLf'&d[ OF98wMWdދȗуMMƢ#UzGFv/~<=X@ֲ6"60?1s+)".E("&~Uk?uDP{5 1+'J1m7:qpH!.ZՋ$! +zD__mf!]hM !( 19andL0+xT-VZ疫?.k 4H|./~C+%Sew"q oBQ? 峭!!qڎ`[Gj;!2X)Yo AsdghZzEK⍭kx xRou!ѰSTÕ̧TY7gO"OA@%GuiDoĄ*1Т)QjfbmۆYdPaʽ6.v qܣE~5~4H5y4OG{$:ds ӄ\Q%wmxW6tm9dd_:~"]犰ք}7eq?"FI[Y˧}oU PLq6qzn Tc 6T+95D&2cP Շ@p@:r)z:4*O%X/YRѺ^eVr۴밺uL&:pi .gdl*%W'9!xXArQRjEI*̡a7!`>himi+eۚx7m.$+B~*35 _ 儠 +ͣz|3H9Xfb<к.FDAΆ˅멜x !hcsSafBr 1G"\e85RuWR}]*SN^>!F5tl|,?+]Пqߎ&>mӇリmmE##:jds>єҀmɏ\w J#k"B^"]ZfBk *۩pPA8rcf@@@v#z:y|ޗ)O[&ۘǥY帲:ip8)*Lm2|AY Hp+>LY<`bRt+IaX(:#7{B}oާSsDe+PʐNQhL"9E&`5?OzHV6HbwSB>yb._T.1 Cǔ̀p/j;;,<3ABۋmm;dozrvVEci)esჀ 6/=` >UͿ꾙 /hnQ*zOV9N5Ġw#_u0$R=.z] Gr^.7}4JHؚ։Pw`]#G<v_ߐrQ]߈ž-w6 Mi y\ ȳB̍ 7G9v)NIq9vd8.ށ +%v?_?xUHYU" mi]J4]Uykx9 obI \ O{H*N**?=ʖ I|1Ţ;3Ʋq8&sC[@t/ ˞r?S})%=L(\o=VMԿ(]tr .z3zyV▻Ѹ0TH7)bzTG\ZJz[ZJjn~bUrger;9d8fʻe*WQ2kBćAyI7/hU.\F'kC'aSZ/ . soNEO3 0Q.w'C ;OŒmBpyzjCp?=pҳ9wUSgu|R :Ύg-"0[g >\t7Pw㐚n)}Ӄzz}xF-2*R:v!i^3ss]ٟ/eC擗JiG"-T*+ -%\.r ()U T.FA^St+>/^Iw{\Z e. JYx&{J9Mё ǻ2;Pu!O æ^r|Fq&caq0Pl)|fgT;[8qSؕh` C{bWbxVMD/.(ǎBR>^QcG%vXGn|\8ݻiw 0Y>{R=6ƁXK'J7mv5Xe\Б kC~H; $|(D ['c.=*@ \LzYiegſ{wZZz3a?{dgۭp$wZ?eC\>aFBO74킂&Nw!KR(toάbje7ci8 xf lф'pN$m{X窒~};E7zkrЌܴ*?dB$cTwB !`M9@4*'Yo | E *( p{ ?&!2ժwz'bu ,qndI-(aj nAr$۵) XyE 9r3NragSgjR7 nrb iS54ej 澢W-*x/늾-,滉AO Kr TO VL̫JWzSp)ŬZh=ݳq1>d:7=7޾(V*GBKf?+,_W+V>-,擊f^h/8-" 5%YdTw¼8u|1ȓy>.Q(,L/n6zF=nlC3kle<'öcl))@; ;Qل04A?3nendstream endobj 140 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4095 >> stream xX XS׶>1xPО ՞b^ǧYu* 2 I H  ;#S CJ{_U֩g_'}N$~{>ZZG x<ʍ6l>{ln22{ ^$ƭX&gUX~)t V|/C])NKR!Ľ2{!sfZ\ Il&'cMZ6q\JTd4}̙999H$i!9)䐭 5b4dS0!䩫OX)gI$! AE%Ҭuٱ2yķlOM)ܵwFDts^^2 B[K"Fl'v;.bxXED{b-1"뉹b#1D, b)1$& ?$"^7rwzĊ_om-xI<"F#PJ}ԨɣnNx)@xigc}8g?6a1Ovr&Bi,:1\qnt N~ˮ!`[Au߃v V`0F'YNTڀjwD9XO"~>OKrPBI욪vKU{`` .61 zPKjうl(4V5۠nw~{]l%=V X,姍U!`\ u I Z-@ Ohv6IVhu*idkƝס8̈ڠTjsS㯓܁NsQ<:i'PϏ]{7y|P:_(?t{=lt=krhvQ;r>`9ڡ< t^o>4Yz@~3rvh:mtxO?RrPm-51PdnASyI9+c8pP'ZyYo,l~F4}W 4Wߋ<ؤ!7 Bŵ&pվdpbvßT>-&FE`T@&>hb*nH-jPN6rST;o^vf|B_ jIFWHbj Ca dl@[P xmW;#^("+q >sx*Ke < rԻl&yi=}hqth2ғڳ1LSZؐ iXm N,0 e{moXSCv^[AOhP R-9 A?"PQ f.NcrpQ>g66l,tNu52Q芀8BO:N(p1s7y A0h$ C~wꄽ(/kA! zG{C޷samDXU.\6 <))sNA؅}%ѳ Qh,-z1/u-=f+ƥGd.-CC ^v >}֟4 Fko{u`f@t>\r+Px,fRa^svkkrƓѶ 8{!>:'{뻾@#X$a$$y͸ .H~.}W}A9χB']\Re>{U֪:[Ml{M`؋l zJcK {Jy*^ÜIiF +*A5ҹ+@\pIxClĊ}5l{ \Խ{`"٧E8ʄUq.pcԂHU'<\74i _ \g+ۮ!yMD ~2L<}^O.XFP7NfqbJp6V6ʚ[,mM#Ы_ݱ5ajߴ:>7DȚiR$Þhm`k4i/]k=O'+ 'nIAn)l5`c mQ}˽ zXѸdo2呂^lQwth37`OsVh35Ӡhm b**q`y>pNva4G^W&|yjߍ/A%(3بNoVΪSYHK'A]nF { G)y$cm=h]0`z*G( G7fEF_ñi V߱=%SV$-LfH x9{޽LwJےSR ¦c]ߗ\ 7!e4?X?d`P ^գsghcwrcy\ ksUj D/_Vu@HM̚>%o yOp76F4 {*1&IcnSBmX㧏]'.Lף UIP{XpbeT̢Pf}:!>Cy|>M/+"`idF+r2Y&='g @ƢpdjXEYuJ' ~~*ۄ .ЋP{] ~a-~GjP y"EA18okh5RChp fǮsW:zpqȉjsjG~9;[^`MOʱnbL5~3PSe)vF]䀻n s">gW`\E#犻˕(uaZA*+.gЎ98\9ޜcMZ_ *Y}5e4iZ[NV7*U$t͌ M?~endstream endobj 141 0 obj << /Filter /FlateDecode /Length 5029 >> stream x\mo$7r.8iV_܇upg Xi׻9俧H6=ݣ.0ai]$O=UׅB߽߫3GoLj6:^/3r>{{&7g=$~_|u S80} ڙ۳4\H%P :y.z5?^ NZpB //t^ z]2ݛOMm4NkcӁ\]Au+?ku_ium>iz}l'+-Qz#|&H Y뀋/yUgB2>=&HK{3 [z-t*M<_F,spVggVYL\O͆`^`eo}Fw)g/hY*[ī~U^ khx{dnhpG9::<?V5ZR#3OWiss[&[5fvmGly}$5_O5H&$/ci>zks9K1PhǰV㪵Bn\ p~U~t>1:!4/o;?O]uiY&0ʓ vԚRYnrW_>C <(J }՞DGDwJֲA9NqNxc0۪KF{xc3Ju;t2umꀫI09˞o+eֵy,G)GWzzYj3 hƔAޛڤ]DB1tmWSa2顎 =`_J)8k\ey˪mnRCkcv`NI" % 9sy84O$!RMm&4$D\r?&&%~,'ǎH \>CdlMPݶu#{ŭ<%;>=?OK? ՕS4R[p4TZ.< w7fkKd$~$iEI73xI, /#0d0ꍙH^+Z 8+U{j ct49H /W-&CNz{!nInn_?Š] |[b)~SiJSMD xR&ّH,GGHS E6Ywm%*5d'{"ȅXn!lQFu_@/OUMߜhm8ۋ3lUqܖ@)I -:BVȏM"xzse}M}K7u}[u8I73,Ǔ2RD=,tZf^&1+#_uuýs}۔K_`\G~up(M\> )TQcEC3uɘfH^77ݷ5z8J&(5A5xIQW:&ü ՜fO PP5$0G#à_`e?=3z?݃r k6{[dtlX~|@QY@f`l @@D `m3hm-"0i%{1SpSb0R |)86``v,H1_ 7i4#N"da+} Z VN$.1ئ]1 iaL0ޘ1QC1:-_j{ɴl!UiSFzS,na@ AI4trAu&hop-"! l :`_/By **} aB5 ! .Sd킒[Ҧጡ'tgѠooqXm[t\[%]=TjMJ-.PZ 5i`ͺ8NqtZX r.`e^!H  {uԘr5m<+P5gTچRd),ꎭ;[4JyB>lhѰKI]{x, rW%BkB..$"nW *Z.S!NC DiLT|S$%X\5rO`{%+mI8x%xgDcwob8R3SCQB0f9dEK˂v6pP ~}N%ވ+)zZC뛡ZwC~z7Cѧ=@{/*x*2RFʹUAFD-~^H~ 1o;(TJ2JkWrFLc;OMZpj 2pĘueX{Μrh1qohؤmle_ nu:!Uu90.d(1IE]hgRdxFn:q 7CTַnJܨǺN|h[0Pқ<Z6V@" Mmɻ(7~`,O ؏xn':@]xaԞ # g]+,c1cx˳ Dn`SČChʰi%xHȅ!!'̃i7rX!)hx`٦%=E@3b|`f.ʨ`܁/WPG&|\u=O2lyK2 v8c P!tm94f鴣 rx"&76_dLq<IErK ,F?| hAF.)Βt*R%D C0xerЇ$̨7|L]ȱgaR:P{,cZFPG 4$sqͩeV=x^Nl0j)s2l+0z(ŌHGx&ZInJMKytHXkW"2xa5.4H*MISQOFN?(#w:NjJfִYF•^n4mѐp<T"dZq} [4Ox@Ux%惔t[1ƍ:6{n% ̹38x?3qF%CnhOt=_"J#4N-yUV4)G4!HIN[ayIF_0~;Q(^diV%EG {M6Pˠ 1c.d^毝(av,&UotY"]kIGs_Qs4X!+|G! ALc W~BG$"6{=&qQb@C.QE`˜В9e>&a!x9)CGhgt)RK)k(Vq%C@ Ujo xe;}E,a獟׉d8iT5q!8>3TTb˞p,~~LîBLo#:G~H)(l TTY@=m7lSaVllfbفהt֖͌W+7mj Xu/uzj_!KDnP{S#𻜟G]6XꍪeJ#r^4 tU4yj;-z;,=e>, S;%[PSH5big5WԾ83x^%| C`'vqE4UY0{-fendstream endobj 142 0 obj << /Filter /FlateDecode /Length 3023 >> stream x[Y~  es+@0d=Fûg=3Ԭ{~JNk\M9Ӌ^L~sr5}v7VyG瓺J+Y_i&fU>Z3;/qv=_ DltF'Q5Ӛ 5{3}G^Jk]\&(L9f 2ZZLJ"kӒ~N)k}=7-HW9f5)$~%X%]8 F.(g10ڍt_Sǀe"b{M+.xyv/|X_ci6lcyʳ[:#8N e"bӤ&]0o-sj-)TTEj/-eut 46j\i4S.8u_40͚ٵ~v.VU:Id%ӺFY B+PJC'1H9q(<0Z#C(>&U 2曻fAec< dИ֯;&z֞ /l= a`Pz+eazU4mTDK jIϏ&/'t2SG=spTJbǫ7Ni?]ES[TMpz lr>PXwY<%W=GR󫁥ZiN ^abX^%4`gITk/̵%445pA`ET;P2,'<{[O\2%0n0kh5 ^P%'x=3I$fCNt"+o\5+]1 R?A2 %ϘzݟOة,!wA.+^:H;40؏Li\2;H23L.{xor3VAl.PBRP\gW-0E9ξg0nv eeQ ڐwd̙C;dnIl u-&G+JYdr,V5',~WJ+JT$( +/o/  uǔLkG!S#ؕ\=\ 2d5%MjN 7yv;&?Y[ۍhFb:jq4,xT0o>x E .I}ߗz?Ŭ'=Ez`tN2Q6 +#VG(]$c}IO8.ʊa8֔dФn#uCd39 ̉i}*yPǫXgM̰lJF+b ŽYA=s/,>3蘙9j3CN]RT1{U @hLU*|d)izQTr)&* ձr6q`׾$QҰZ QxxP:)TelQw|Sbgo7M`4uaМN.˻yݑ%;[zsbVҭ!e @{:p$KFdOWicG iu!W\ {+V`2 /6Rˠ~/<=(S1oDQ!cek)7[x@-u= gVbFi$kQc,>"[8N=%K$Q~dtf5Bh6I$@ް{۱>kᵗֳCU{t}>HЗTdo( ?z1x' z;Spz[^^Đ|Źe^y]^k&R!{4lV &4uuc3CWyZ}S\߲LeCʯ%jֵϰUrK'~>y޳}=X#VhM|ْKEX&Pfd fJp /ᐴ瘋5FRy9{e+s}rrendstream endobj 143 0 obj << /Filter /FlateDecode /Length 3114 >> stream xɎN#x RTb "عh4%ɐL<m=UWU54ق} c/տL9S7nzp[xٞgms7@C.ea&=^fΈfN4kTs\ml;DRtt!;K@[/ۭwŕh{a4Go% ck "Nw~lE +eNb_.f<~"5-x9Ӽ%8]{%\ /NE!XV'$NFI4Q^$p\:n/uAIԨ,SUZì4!ynjʵ8@:dY-ڥv:lh܊BՕfځ G?N`c.5R~ z `(qp4dIk+i @Pb\#dp# |;G*saTYVV-ˀm?Cd` AeqsbMph5}Q"@eq4zSE qn RD' M_WGTGOQ#Oh-j  5[~O`=a ض!hd[5%n-ksR;RGׄ@xyADb(]'In>1*ߢ^\=;<EJ:u!\Nu?@'% Q:X먓/|$ hA=(xKF (q7ׅiR:SUE hl0׸U{ye:  Ah~H}B6mAj0ׅ LOⲰ-ErԞ0L`E{e ~021u b s@b)s'vq('0A8!n.0%, لv-_1t#ߚ֮3!AF"8`C`+qC@"TnuP-pW'|my_ur:pCX4*K:(En[NTɪYrz:M+[NU3/nZ{0χXA!KoeuO14_H. IpAkZ%:˯.NBޭ.pNĕ'!˖"EyfEgA?oyJ[6f*$owo LU$)h6>A OI[tc3/YO`'&(B]t lͮ,tU jd&gN&س a's ݠKBR\-#dI&ң@Iw&Q#56jP<# lqF~F3|*d*xfevGu'>-d ֢H* S V5HE۲0B;1ӑ71s:rA+ZFn8x cxS z0V3SYx kgVJ=٣Nx^ʂv3uUv[c~G7?RdwR.ruEkYf2器eU2͉WD*nHjt87!e: [C؂n +?j7-&nh[VF5<\\wSVj&G '@;}ݒx!}WP54Mn˶GbĖR$n  rؠY~ -I}1):&^gƴU90<$.;ӱ{M Bо"\BFλ -ْb׵j)%("y W0B"s{}8$.%[#bvF_o-0yOrG,N-Q_σ%e,!D&f`WKj-~EZ*%9훁m7@Dg4<|<*X&-JHEמM*?BduwUVckDyX%}ة 2NoҢS~s7ς'DsGi݃22lb} m+<_Is.dٿE {lc*1*fFMˍWZult̚1^vHm%J_O#AT말c~/mSo[B& V6*,WBf;F:4FOltIԾ4o5%0Hz=Ռr9/{ {Vy#Zx&˰:Qȯ{#➙ jCf Ȭ?W]uU_++ܒ!8WV@C^EŠM^ƼzUE퍭 nۨD_j ;FrertU] von=[C[Y8L᧽0y/ mxֳI9:owDŽRؙ( m}ӲLPonrxޔ"98\7gݯUj2z|iTn82o;Yxnҕ:sUmnwK91ʆmzitYNKn | xOԓnaȵgT{~*X0=٭ 6)+6akiû*UZ~YaFaoec*^h9 o2e=}}Ƴվ{wD*bb驌PY!n6XT*p۱׬/Sp/AD`MOk7q$~f?uendstream endobj 144 0 obj << /Filter /FlateDecode /Length 5882 >> stream x\Y7~o ͂iz 0`yIC/U-K~#d0YRz ?(f$ nN{Ww'8Dj6:^/Cp~8<} ~"a0waqsbc:yw"iIOaY-<,Ax}y+2^~tS؛NiM&t?J`miQ]-Oս dSuRI{a BJcu:t68!+6w]^)nvw"($oŖ| K\Hc$_swNuz0CD=`o/5{[ }Aa'8C-nPۼf V0,X^+kXFiCS?>窉r NAs-c/Ir"4! 4d>( I}^.O}).&[F #.$/j AЬæ +$)S@BNaZ Bߏf0Dم8la}N-_sj9F(p7z!1f AK$ B$`_+qփ$HJu``\@CS@z0K\΂Gb",;{p=V|AEX8@*iQ!9^s.mv@9%Hۨq/`T(l#}ƉazA^k@t:x>E'M(둹8N(wRitCKʐVcEA+~JÌރݮ_ vTՠ(R~hGցh1 .7@vm G_y/=/mE6}%F\E[/KCit/ץu[L!*#Q>4./W.~_ȇ'=!2)y ޾QRA3Ct| o_]! yV ghp1qA`A])K-7Ey&\@*gr]HtU(yM!_rW/B13^7E0guy!/~8ZVAAQrjI&3`ɉ)go ;dr$u<2a^>}AP"E3@/>וUi.$Y*מ]/kB ySU켴^r$e9_Wh?3B' 4GVS`B,{j n)Zu5Ł% )ÃعV`۫@*ʼnrJ)0zWa`xo׬Z5:uVfU{xgL*+kUJ/RoEM=EJFh6TWe[\eߖ"jw/e`]2aȇlgfZ 5q`5kHEa3~uI P 7)&ޯP|W|og&U뵌da@c6#u'5|rR4\Bn]rQՌ7fNE&Kxa nMS.SZҤ *;+t9 ё_*Dbց{MkxA6HG@"}to< ܐ©!$]rK1 ~BI#l Ej<ꂖ, o;Bԛ4ZA¯B\,Au^j_ cYi#C'>+]!4$R<5h~l H#_Z BOt|՛2˺up[`Nf 0[J,DՁZM㯛zEwǨWˁVc:{­E~K+VJPRG)v35J[FI7XGr8uQ2GeP(ZEG`RRWA槒]j6'g\<l<OS ZU3le\7{HH1q`8~HenMPMϖGF')cpl]L+¢HAfB\4"@UtEO@2X眡eqlYg4i>_u]#xQ(`-y8p/kTJHhy-3w|$>/mZL@-`$K0b,' ^͑7ѮkR4kl,bCAiF8Y;:r4ZiP;&6041TÊ6cWq#R`[:OKSioKr3Y;g F;!gpHs[4^üȑy1(#uf^n rbID`|,GIcicGZ 7&-QX1BӦz@VO%$`"a~;j0U nǂ ^ݪFHv_=pޮU/ r9Ȍ>)j *2;fl|  r\V]jZ m Z>+I@ti<j*[.x}мwV@hLqY_E 6g-Ҁzz;g]{Ì{Svg/\N/,Ԡ;>^B+2_;v^ t""y28{{jâ!u=Y*PahHZ;_1SsgvUb)9+3 a' /ܭmGʎFiC?]N|?9bvp?Y_i/)\Y +Cl]4yF=)_q-tr5ċu,b]mRw,_']Cu>ӔL.w**e`b.h"Y L`('kcW~SJE[Y4j 鞦OuURK|%1)^4wšҲg /J@R@tGNb`as7RJ;rm?S: P jj(3w5҇g_G^ߵ Jxwk7($L}/7\}t/~w~Ct_&Ybz[:oo y]:G r38 ޸';_A܏\+ԟ(iz<ң)?6eޕ/GK/Go6dx"? I}oi $a-^H`[έ-grܺ.ds[˲A: ?5ɱ(|ۦ"_]ez~(kbY'XU>W؛ /;^h>|#=9cwo= ]XR q;(_q/7P99j /FF<ر'Fq{fSiM@{0Y ΫDwGs%g.E4:AM ]Aòb={,>L4zUZB~>w"kgflN~diķ,˦VUMeL*́&Ia]CJ낵i8B}W2Np+f&~ 'XCO磬C <>fmOꖔXq|Һ {hpC#a'm| v[;|2ӡ8Ӂ㱓Ncy~yez*È F{W ˗xt)ݼd+K뿝/(endstream endobj 145 0 obj << /Filter /FlateDecode /Length 10251 >> stream x}[{~ĉy@awыF-á]KTĐ( k ?ş?]>xಿrT륝BקszwGJ__&G?yPs K L>rS}wܨ6%YÇw\k#kh.!o<|)%S-^YQč* n737*BRƜr84BRi$MToͩKD#/"f?&c4bb6^OdW?F!_2񔏍(aϲk/Q.`) ɰY2өRkʬm2s٦ vj!ۍ#7mN BTwitqX)5V0f-___EVYOSlуƗX)֜L#ǪG FAF nD)z¿F#fHblN1_cuGhyJK Y%϶e(Eg(T-o`m[,$hONx*,CP'Eшe #0a)4K,nƱ"|0a>J)ԨD^(N35*.)`9n؊[JXy9v\gaUp]Y) 3 b6DNo6ynӒ%"K цw1,a}=^O?9T7ڰ dݘsH`2t4%'XYZNpFT'"X\Abei.sdE-ƆʹQA$a4b2F4"[dфF&oD UiR=G[5bUduc4bo _":j +nsJ5֕`Tx弯(Ŷ݅$/YL[8VT7!MLP5 nb4|3*kNy x %Ո8cՕ*ˌ'Ğ33(LΉqǑfVᜤ9/jCIF%Q]kjLJ m`Z$whƗI!TJ9.>Q4) m9d;p&9HKl{:RX);Iqz[=! ,"5yƒIa/\z 1eA#2JG  O>:룞QsJֵT|=KTE*XMH3ڐ'1r}+vESm»цC^ޡC%5VaM@K6WL ئYRPF]ϰP$ ު+"R7%JoHC0)mo xuf 2F&UNĬg[Ф(&_fF2J8A]vB*=vdVZ?kΉoɧjVh3\dq@N$`huAnBp'11cY~v 6+%ϥ<{ x2XSZ_fJw_l] G!E F -Ir*K,l]P"ŃpڬO ^hiKcX\Np[keC>~anYd'6453ܾXg}hJ7Ui!$I؇UFr{b p"I1aZ$MPӥ ~J; 5!6L P g}©o=em?7 PQ~bSce,Q7OT}`~J3/HAa;U"@&**QjJ ja#Yca%{ }Jc0ߞ8@ U9%g8)Nr l=qYe 6XG斔f4OrM&(ksD.QG >h԰M`LxB(X(kl< gMoL1Hn_+ }H'P4g)]\pc1`b53-)wJXLf{Dp"rg&b='r^tf+yftf'@+ `Ի6DZjP:+bVkLԲr Y |6 ̦6)Ja n A<d3{s3UČ\e^t2(2u`Juϥ~jV)kr{7)$͌9N̸ @J*6XǙ2m0܃@R)6e$}3ܧzllۓ>rJ nANu9DF3`) 'T:o3 ߞ ('M :ɉ7xrF wcp&I]ܞ<Hs.^ui /l ')HpBg$r±DC2g`PQj-ܓZ!.:.I\T잹w'6pC[:>lљ]o̯8^ 8\ri1yRApB+&*N4,!!FwQ7%Eس88NUZ+: oE=B%-5Zx0(Pߍ05A!p@4AAp~ޚ:az:QgEZ \"yPڧ ЧCAp8[,v$PWf A("3=mF+3YI7s$9vюYCq9'`Pr?H  -v' ~#w@ypjgJ'}|8 pmfN*%)Ef d  fTK*(:pyI%cR'Kr;O i9?: .H%wD1e9l3#[;{p x3$:$:Ʌvgp3(8l~-{?hOrڙy0@8v\?97K/rUEQ)9OUF-UJ05U3rVgjz@p9@-.ҿapiB@J\cZ4y lX?l"5FQ޶}f>iF%伜=nCq@k,W סǡzf"KSRYe㲬P9.UdK%BU)& 鲪2q=[3}^U&Η~kb&CUy82@qPQT3T]!֯,Ǫ2p.-*pv807M00;Tm[EnZRKsQn3VS3KK rUxIơUQi8A7MP:RyĶȑY&-nlȫ\^NPG,F%` Io13!k|=`3ܚsSE4//u(͋!LT P?ȅ>m-@HjN<3"%@tHYs|F%oy9^' Z- +j3Nf6Y[?:Crγ.Iu[8Js6$J Gz=T*p3L 4 cuƀN+2I HèFseLN*F)*RB,G|{E1@M/~ΜQ1nǔ7L(r|騮)3 @L:ӕQ}~䝒M,WR a7T<@\&9H]# 'UcWan P 3y7tI/S/U!rsPttW5Pr8,-'k] TU+'fTh̒\_;sjTVlRrrK+NsKR9Tr躥:9.D:6U+Q">2nA,'U)Q*`hZCR.g9-b7Rr9u" *LM˽5ɽ.fab9^.@Ttb\fƭSOE $DX.*kStL72EH ^7;I˥~\.*9X׺=h}K8/Wc2eO5U+P.IwVW;9Rskx3t\SJㅙ*r kV .+W=ŸpIihqtwfHr\&P).\qw{+.k,KfzLp;˕aC#3&WeFeڡ^g.PMZfaLĦY4Yi{hP;trR1QAv<3p]`Ԍo( a)rGM~LQDdI1PhrD١46x!;"wD]f١Z E BtA;:$7h7g?~z}C | Ep1>Ak*[ww=Kc]?5~Ո*{PǛ~4/ȥvh]}t~no-MzdPjg܀H#>9H>ס}}D9 1>xO˲\#RؿZ/nR }-)ҿZ{? (ߏp˭V&l+Ih?1+{ӋWXoz7&fYBoekSS!:~6ú&[ E?WT_y*8QM?H)[Rj&e\[[Û;~$,qp\S&Ů8 -lD!^9w.'љu,`eCɒhq1*+8X=ʡK N懘;*p oF;3 ?1#\ÏZ~ߎx|1j Y8~<~ 힟A dמd oǣax|`?aIMfv\< KZKRk3Xxυ+ CJlr_<'NP~[$b?.g>d~?dW:ya9=>G0 i ߍ}#'̯xy8Xɨb ލWB9 <>2]IA~ mq+m-mf߾x=%8Gbvۘ;?A^ϓ˲Vs7 n}9q<~B&#do] ?@p۱4|V,KY9Eڕt;H?զmT~6VW*wp[E+DOnOƒpPv֒ǠS=b<0Kj]+'S\+?=תQb[$B}u^Ie MgHia1a|w7W<\o@,~a^G. Eru| >S*򐬖ycF WDZ[d0>܋M]|oߎ?ᄚ~Bks)EI }Sbh50_#0b_|N,FN,U"/?`ZJrAW\7ݐXbg~<}n *n>7JJ7CAH$2d' \~Nq@!o:dP@P =7W]o};`† 8|r) ~ a`O ͔si0پPgG?91y!|Uxݣ>Xk*eL;kThi&t?C@ "-+п0k.aKW"o\q,J :O "!w;X=ٶJT ki¼S@Ӡ#l)]G}>9:p϶z?aD물Y2 yvxqTat5+l p\ua݌w픵K=p"e[+U0g_&K X'xѵlI,_ёKg<U)~ҺUMWeՎݳ m2zĔƝMl:Y%: ֢֕afto̔^C`űwJqXV1سBJI66"=Ҧ1ק==mO7n{?DI^;A? o=wbA(=!/}{ps8Sp++^I"c٭UuQeFox\C`enu}q43~%mɳ_Hg% Ʋo0C*kq"n 9~{G &ɲ?=X9f*~ց*aCTˢ ulb-mR}lIp LFZ8SjÓ9wix54O/-X}Dd ȣ;Zo 28L2U֯x?+S/ͽWOAvᖧ\MWc"d/Q;ŝ0=BY޲Tw<ȨO*xtSLwN8,3{4₯ځPQ;h\fxf-y±@w D nj],1@BVTg74s0COɛ4x(dYvU1)Xޅ^~sΓٛ5Qrkd.|Ɔd̷1* iz\ocP6w};+ amLz9i풤Ծ/ ?lc@H^=oM~Ϻe {)S}* ;񥒱N|ݺF>&O2-) [endstream endobj 146 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1443 >> stream xSiPGa)Y<`wH)* "산,* T &BGJ1xD$*/P%JKLlZAG~ IEQ#T*]ڪ_H V#'Z^ Z^*8 lCcI#3NѐfhT5?3K^SN:CW~QrZUedfiTZ]d&uCri6W !$ ѥlүR[PrEK2PMp`8`;C ڋ,&FC8$AF"ZyƉ)/2A@6=FoXR>n.{pa >뿮9thU͡`0KKYW: zu 4g?"!AdNa̓G0\11*%s-8\bjPJ! ftPB9yg^nqkz#z lڀk$r|,S;Opm|_1VB yNw@<ĉ,]Y#-6hWT{>A6n]Ed<-߳sMQ,HDͬ%6Oaro0_ ss$<ȗ$5' Y*^P!T𖊗fu4AyQ-NJK Yxb,[?c5wnE8OZxib:S]YOEP&5:H@ ΁%TW+TWALEAو{mlmFPendstream endobj 147 0 obj << /BBox [ 3111.61 5463.05 3133.87 5485.31 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ 1 {O L'q2G'8 $ PD>lfw(1Ɛ\D'Ox8bN3Se` dk)#VJtbW=+e*WhTR]6EhS6#A(Zw.?N1ln|endstream endobj 148 0 obj << /BBox [ 3110.03 5465.61 3132.29 5487.87 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ=0 '0iHl e$*M=}vgxe&$YDcA1vg8=9vNH`*1pCWĘHCUj+ #[ӧCU/YNj91ŤkbbhS߿8KPLv\,"aEmuendstream endobj 149 0 obj << /BBox [ 3105.02 5473.94 3127.27 5496.2 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐ10 E'0 (H듴0$ʷw;ϤHc `<nEȀ0PFJ`*!b )uUũK{%WâFU(z]3&GPC0W6EX~ѻecؕsnǫ8{mendstream endobj 150 0 obj << /BBox [ 3088.74 5501.28 3111 5523.54 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐM1  L9.> >> /Subtype /Form /Type /XObject /Length 176 >> stream xP 0 { O`8 Q HI(iˇxXΎW(HhN yx& sq6ftĹdT\xY0YIh)hN*6:&dhxv4FI u1jh;4'8RRώOܔ:8DC` /Amendstream endobj 152 0 obj << /BBox [ 2952.21 5735.5 2974.47 5757.76 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ 0 ؎t$~ $*MˇxDYgfLHP $vg<Hp =t>)*ÅSZ"LpSUk<ĜѦq (er?ovn0endstream endobj 153 0 obj << /BBox [ 2820.65 5964.49 2842.91 5986.75 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐA! E'm)N`q&:& /dčpA7nfNFfAlOp#d2 TaSe+ =\J*BMѸjfM#&:0eFu a!Ĉ݌EWǚbh߄| cv\~b*n^Ioendstream endobj 154 0 obj << /BBox [ 2693.13 6189.35 2715.39 6211.61 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐ=0 w'0HlTP $IQ"%M'"8<=RBBU,G!S48[q8bVNTٝ'8{N͗ JX;cz1;R`# uT,].p@%>ApW({x1nvendstream endobj 155 0 obj << /BBox [ 2605.56 6346.14 2627.83 6368.4 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xP 0 { O`l' Q HI(iˇxDɝz7PDB4tߏ+0*;2E.ևs*jS%#9eR(&B*l< -E@㈷13#FX CL?߿8 7,_"vMmendstream endobj 156 0 obj << /BBox [ 2562.63 6425.05 2584.9 6447.31 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xP 0 { O`b' Q H6-9w:̌  rœD)(Vg<H0 ,t?4`pD#f₷`Ņ̡R*H>gQu2a,_2FM=|oq D*Ѫ ?on[endstream endobj 157 0 obj << /BBox [ 2553.78 6442.81 2576.04 6465.07 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ 1 {O L8q<GNB`}Pay81DZD1R,s+b `>rp46Fbpe,3Fc%gExw#  գ9zF*UA4-zus)zE8 դƍS ?>CoKendstream endobj 158 0 obj << /BBox [ 2568.41 6417.48 2590.67 6439.74 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐA! E'ZN`q&:& .Ht5Lwwu$!E1`FNK`瑘GQ^G0ceBThQҋV4:cEa 3~-*Cҵeo36]@ `Sa xmendstream endobj 159 0 obj << /BBox [ 2598.3 6362.83 2620.56 6385.09 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xP 0 { O`l' Q PA%$듖 agݝt"d hr@UR'< Dscx$ L*k;)ĊG Vq4a}UH$`ӊI0O,SθX$͆ +cq1Eg5//պmjmendstream endobj 160 0 obj << /BBox [ 2637.04 6289.86 2659.3 6312.11 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 183 >> stream xݐA! E'mN`q&:& /Ì8n< >t ݝ7*)cRAQGOp#d2 F9LH`&YA=uE"\ eoK{(s }ZW*+#檘 $3P텅'Ŝ5,zwvlt .?ms w/lTendstream endobj 161 0 obj << /BBox [ 2679.15 6208.08 2701.41 6230.34 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݏA1E 0m)'0qDDž׷8cx pM$r&ΨJ87`U6d qd8J18)^M9ʬ3-ڙW=Gb!,%H~ w_koܙ>ApW?^^iendstream endobj 162 0 obj << /BBox [ 2720.2 6125.23 2742.45 6147.49 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ=0 w'0IHlTP $`MTZY}vE'A]h$5T%>Nx0*;29r5ThI,%6  5UjёmBJfsL¢5V4㇠Neű&|c3ur.?Vox\mendstream endobj 163 0 obj << /BBox [ 2757.09 6046.93 2779.35 6069.19 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xPK1s N@?'0qDumgq\xe3NOZ0⌑}P49X x&QeC&o}-WT=2]':j5*N(̑aFu /3fEOB7`Vhui? l]ˏ# ۿ<%RlVendstream endobj 164 0 obj << /BBox [ 2788.2 5976.21 2810.46 5998.47 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ10 Ew'0 (HP5E !JM8>f$];F x@,% ACj80L)&~8. U=^\E FF9S*6q0 bI=~1"YTW|㮬ˏAۿXnsendstream endobj 165 0 obj << /BBox [ 2813.02 5914.19 2835.28 5936.45 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xPI0 ~4 Q> >> /Subtype /Form /Type /XObject /Length 177 >> stream xP 1 3'0Ht< x $`}P(".;ǫa|[L3ޏk d2 LF5RkGbaedTI:LvxTu~W MЙ1 e7Ew'V ac_ w`n@endstream endobj 167 0 obj << /BBox [ 2845.83 5813.28 2868.09 5835.54 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xPI0 ~ Q> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݏK0 D9O`b3 QA%$( OZl8|y37Pt%@X3]ÙtwEՃ> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ;0 '0#s$6*e$e y|ߎ7=1fd\s:n!"1Gj1kXLz(T^P1{QaS:PhႜV3U( (k~k:l/ ],<ˏ!ۿ! lendstream endobj 170 0 obj << /BBox [ 2868.34 5694.51 2890.6 5716.77 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xP 1 ='0N8Ht$$/? PD{zǻ9M`,zO>&[&='dY#q*JFbP!($ Y0ۢҾUX0f)1@b1ΰ 晧?p@RNrn?t '8Bmendstream endobj 171 0 obj << /BBox [ 2872.95 5656.23 2895.21 5678.49 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐA1E`s\xh.3ࢡU?&T5k&(Bنx?EadvsedTzTD&hD5C-B%}c3⇠NnaymNɣ'0n9XB%` /W,mendstream endobj 172 0 obj << /BBox [ 2877.6 5616.16 2899.86 5638.42 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ10 Ew'0 (HI()e QzfWS)s&(BYv=^ @AC jx+)Ia8( ,RLJ#M#ڕ[V)9g?['] -@#_)c ?-<c8maendstream endobj 173 0 obj << /BBox [ 2882.82 5573.28 2905.09 5595.54 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xP;0 s NR'@b JH )J[9zۛ`|{`UFe(E3rG2" "s%Z%VX=2Jr+cKرcVf< #- [> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ10 Ew'0 (HI)4`|{Չw;E9kKnJJoD hƇqfs #܋G2Biq™8l1sE$"(IuyQB:S V{LCM񮨹'9z8B"Oܔsnǫo$endstream endobj 175 0 obj << /BBox [ 2896.17 5476.55 2918.43 5498.81 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ10 Ew'0 (HPV !JM/"8>=ňpۧLʆLw`2Nc^1`n]Ys:lnsendstream endobj 176 0 obj << /BBox [ 2904.63 5422.26 2926.89 5444.52 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ 1 L _yMDQ0 NB (X Gh"gǫaLAJ渼Y"Zl5)&M[af8V C.W1E! 1̡#,z1;I Bsztu)ZE1SLscؔsaǫع{-nendstream endobj 177 0 obj << /BBox [ 2914.14 5364.08 2936.4 5386.34 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xO 0 g O`llj Q HqJ[ʇxDgߪcf"+Jf0Yp ,BjT}5A<2RvK( EVqlTQQ> .ѱ, &^1LLj>9/8iqК羏?SXUg`;߭-.l iendstream endobj 178 0 obj << /BBox [ 2924.63 5302.21 2946.9 5324.47 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐA1E='@'0qDueF;-U05HŬ" Lofp ,BjTu ymSrG e:F\];Zu%,Pj ¬㝡b!"EmVѦl"h6~N?Vѭx Onfendstream endobj 179 0 obj << /BBox [ 2935.89 5236.91 2958.15 5259.17 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xP;0 s N]'@b JH QOBI[`zǛax{A% "(-'8-6FޔHC0L٢IH esxZh$3@W mQʡ)⭨AO8Ą)2&\uʨ[ >чsfn \gzC؇Fm6endstream endobj 180 0 obj << /BBox [ 2947.76 5168.55 2970.02 5190.81 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xP 1 ='0q> x xKH  ("笻٫q|J*(#k oNQPW$NfSZ]'sYJD)(@Y:Fr2*Z'Pd8f,-Ecs&ЬMy|l Hp$endstream endobj 181 0 obj << /BBox [ 2959.99 5097.42 2982.25 5119.68 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ 1 {O q<GNB`}qay "8( @!8qW`ؐ){jce+8\P eHR=gbmȴjJPI|QQb\գ9z&R* N1}z̺9)zE{&|qD*?N1;>Snendstream endobj 182 0 obj << /BBox [ 2972.53 5023.83 2994.79 5046.09 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐM 1 9EN' w 0耠.Su\/ !pq3K$(BRGSaE>3cD)ό ^JbjDUÌ4v.d^fTG9~Is7cѶhmFg+ n>Q ?{x2o;endstream endobj 183 0 obj << /BBox [ 2985.11 4948 3007.37 4970.26 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐ;0 @w'0v||$6*e$V !r<;u" ,*#%8^`8!&6āSqDE}JRfRcL^+GrqYKV{L/G\ jdnc)6dGW}o]Znyendstream endobj 184 0 obj << /BBox [ 2997.7 4870.16 3019.96 4892.42 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xP9@   A$$M! @3>6`;h)FэI2f!&s|7slKĵ.k&SYRRN'B` T8qZg<27%``dGZ8C V _ ^{xNlendstream endobj 185 0 obj << /BBox [ 3010.25 4790.43 3032.51 4812.69 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ 1 L 2GNB (X0E|{W#3Ą Z! "N6~=\!kJDU0UAbL.JƬQ̜Q;$Y,:3jGXɘX4G4 mhC~ q8g`9XĸE6lendstream endobj 186 0 obj << /BBox [ 3022.62 4708.86 3044.88 4731.12 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐM1='@RN`q&:& /.QރkWxH"RI2 YR(5z$l{7i28Ԋ#je}Ọ,a5`6Fi`y2B!bMށc ?p lendstream endobj 187 0 obj << /BBox [ 3034.91 4625.5 3057.17 4647.75 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xP;0 } ؉'@b JH QO6UY8C<}l:OZAM0 I|& Թq6ǡ$jb65Eo:*YZ/Шт0JjP0 jG&b4n"f\uX^ 17> >> /Subtype /Form /Type /XObject /Length 180 >> stream xP;0 } 8'@b JH Qߤ4mY8C<Z/xeEGgK.x09ِI-pF&dH޷HAQ8eK 1 Lg(e}F6Oah$ hu¨DX?Xc|n?u'8(m endstream endobj 189 0 obj << /BBox [ 3059.06 4457.25 3081.32 4479.51 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xPKB1zw>KL4Q^_n<f6-3C )CJjbĘ GB QIcT kdҸFnP n Y*6\(V#zeab̡G%Nb ;whzC؇m~endstream endobj 190 0 obj << /BBox [ 3070.98 4454.99 3093.24 4477.25 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐ=0 '0HlTP $I(i䳞s;OJhB@%j~߉YPTP=GJEUE٠"/*#+r^)ʡQ; #%XbKĵM> >> /Subtype /Form /Type /XObject /Length 175 >> stream xOA@ ^v&ެhMԃߗ6iW/>efM/"8>M:̅P x&QL穩\>I#S( ^?'0넝Dn+ߵ DV8;2B#XSyu5!_ wY wiIendstream endobj 192 0 obj << /BBox [ 3094.62 4599.4 3116.89 4621.66 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ10 Ew'0vb (HIJ `oxՋwB䬔"L!PHp`ؑI; 5 )Q)*3VmQJ (49ustrak=h3΄_ pH]M9l ylendstream endobj 193 0 obj << /BBox [ 3106.45 4709.83 3128.71 4732.09 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xP;0 } 99eTB ~Җp(~t"AP$:Q3>Nx0sTʑ+a|2Tm'{"+E]qo KLaRK)cRTc B7e 9|o> >> /Subtype /Form /Type /XObject /Length 177 >> stream xPI0 ~ PA%$ǥ-!rL132gGEHZޏx+$b<.}HHB*xYt035o\]a| ^ h G@XY@Øg5D?JY8>qc a[xblendstream endobj 195 0 obj << /BBox [ 3130.09 4945.84 3152.35 4968.1 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xP 0 g O`ĉ Q PA%$(Qi9 ]@HH,=p>n'BQ*R HaGb µ$C 9Un GSHB_hYsXQX>e,*-։;9Oǰwqaǧ8{nRendstream endobj 196 0 obj << /BBox [ 3142.02 5057.15 3164.28 5079.41 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ=0 '0HlTP $`$p(,zfA9 9JK dr N9ևQmb%pBJc.lEaEh[> >> /Subtype /Form /Type /XObject /Length 181 >> stream xP 0 g O`l' Q PA%$('ii 9w9t ݝg=(k$ `<nEȀ0P/FJqb#f c$9R9VPH[q_ڭ5ba X&&cU1<?yL޲1ʹXB%޽l-endstream endobj 198 0 obj << /BBox [ 3165.96 5249.71 3188.22 5271.97 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ 1 {O SnNendstream endobj 199 0 obj << /BBox [ 3177.98 5329.79 3200.24 5352.06 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ10 E'0v (HI )e QzfAX Kt4c:Y n%r@<ՇRj+ѹ G8/+AR.:R qCIxB EYO=Ļ"A=^&Ѧl MaS*b nHendstream endobj 200 0 obj << /BBox [ 3190.11 5400.21 3212.37 5422.47 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ=0 w'0IHlTP $`P0DdxՉwI3*ixQeGܦ [x%> >> /Subtype /Form /Type /XObject /Length 182 >> stream xPI0 ~ Q> >> /Subtype /Form /Type /XObject /Length 177 >> stream xPI0 ~'N^črTBr$8d{fl:fwJ0N$E6 xG, c.8K8#!W҈h)jʼn&ȸ}%_dYV'J/u8 qUcn5Bge'0ʹXB%`/*kendstream endobj 203 0 obj << /BBox [ 3226.86 5569.34 3249.12 5591.6 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xPA1 ^-ҾěltMԃ߷nzH{ ̑RD՘I2GoUK8o3;CG\51#^% (,L+SF9X&#JCSje|ҟqw.+p$ _qW ?p=emendstream endobj 204 0 obj << /BBox [ 3239.19 5617.23 3261.45 5639.49 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ=0 '0 (@P $q[R0Dg=?lz"AX RȐ=\ G "&%MEa#vQ nMF"Ć5'PE)JPy1WԌ,/M:DUc/[%fb ;{C؇7 mYendstream endobj 205 0 obj << /BBox [ 3251.57 5663.14 3273.83 5685.39 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐK0 D9O`b3 QJH Q\l8(y&J9H tp#ݜgQ ن~L% kpd Ѹ1Y3vV᢫-ƊJK@Na_G:;M@=ퟮNmendstream endobj 206 0 obj << /BBox [ 3264 5707.96 3286.26 5730.22 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ=0 w'0cHlTP $`4-p(:W#&cQ4M{2x&QeCh\b='$*a̐BEA#IƠ^)TL$a?I?)䅻?[!O΅3WC>yb͸N?FЭp;jendstream endobj 207 0 obj << /BBox [ 3276.44 5752.38 3298.7 5774.64 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xP;0 } $v''@b JH QOR9~8<)TS&IL'< yfg(ˡ~̩+q$(m&&N\+jd\ڊL14rǤ3((~44-&X s}q/X6|]ywzoGn8endstream endobj 208 0 obj << /BBox [ 3288.99 5796.59 3311.25 5818.85 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ;1 D{'0lHt,XJH '|6 9ol/z g0-`ȔUIx/; D:^2VF0Nnx Q*qzLahƕ'MPD5"t&4x< %3zTѺ~`F<o c Oװ55mendstream endobj 209 0 obj << /BBox [ 3301.52 5840.71 3323.78 5862.97 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ 1 EL 8q2GNB (Xa(W3#1&TDPa@"d@FU(Q3Q3cQ,++4Lef$u͂9M l-~v ;5f4n}3v/"h6~?1v /HFmendstream endobj 210 0 obj << /BBox [ 3314.11 5884.62 3336.37 5906.88 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ 1 E{O c;q2GNB (Xa(yߎWC@5U9%AyG;2spcHZ3J$7,LUxCGP ʤ5;]aJb(Ҡs3f> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐM! 'P mO`q&:& n< k !tw#ed! 8nc Yq}O^Ce(\0\)A,jѪU%M zm[|"24mz&!e ޝ]Db/`W". X6nendstream endobj 212 0 obj << /BBox [ 3339.39 5970.79 3361.65 5993.05 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐ10 E'0v (HI )a QzfADA!Fjy;6`@1a24=6(\223JbRX 5.<* G&axWìIMO:EU)k?p Y aS*b o%endstream endobj 213 0 obj << /BBox [ 3352.13 6012.45 3374.39 6034.71 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ 1 L 8`'!Q>(0E> >> /Subtype /Form /Type /XObject /Length 179 >> stream xPA1 ^PҾěltMԃ߷]Z/>!0D;\A5zJ#t\[{8džL8ZjD\4R x;1e-ؔ8Teca$!n"r),x13ޝ(Ow;^26\6;F8B)Բ7%N?^1;4nendstream endobj 215 0 obj << /BBox [ 3377.67 6091.3 3399.93 6113.56 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xPI0 ~4_črTB 8& 8DΌf˦pU3J]H1 Ile|7`ؐ){㎫`N]$(*^׌QtTJPg2ox(WiL,ͰaKR|z,:)b%|1Jda _ +Oq=Lnendstream endobj 216 0 obj << /BBox [ 3390.56 6127.99 3412.82 6150.25 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ=0 w'0v (HI(%`gՋw3Y;@!d 0Il=ևqjkFؕ uBıp;RE,%C8UY (05=%| 1:57|জӏ=rm4endstream endobj 217 0 obj << /BBox [ 3403.46 6162.59 3425.72 6184.85 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ=0 w'0HlTP $T `yn`f^0qEHuO8_p"NQPWB=΄T3"y I b7P5R)w UR=Ypb6_`+XעƃۏO '8(lGendstream endobj 218 0 obj << /BBox [ 3416.4 6194.98 3438.66 6217.24 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ10 Ew'0 (HI e QzfWF8G EHݷX$8r]2I0*aBXx%UtW:mz( Eyqp6Ja50*A)g0n9XDE` Omendstream endobj 219 0 obj << /BBox [ 3429.4 6225.12 3451.66 6247.38 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xP;0 } ؎'@b A%$들j=?D< dT#*ixʎL[ #1[ #"c3d)"GO-e@&^mV1O5Xoq owqa8>C@lendstream endobj 220 0 obj << /BBox [ 3442.45 6252.91 3464.71 6275.16 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xPK! sBi)ĝLtM^7)Of!pw Y DHy071ypoyQ!1zk)hA3J0F+M!wDsX;*ZǔE 9v 6Ec)?FwvшjoO`gcWqp{ondendstream endobj 221 0 obj << /BBox [ 3455.54 6278.34 3477.8 6300.6 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xPI0 ~'v^čr*!D9}T8Df˦cf)QRbNQQ$-8w"0Z(Z?R0ǡF /oJњ53e){baL+%Jh|19ZEi|> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐA! E'm)N`q&:& pA5nfkLh=16> >> /Subtype /Form /Type /XObject /Length 178 >> stream xP 0 g O`ح Q PA%$(%-w9 #܃hb Ĉ ~Ş p #QRud X&q k&a 9Ԉ Iã rBKGG>@ NpAcbB- * ">D!jG:|b Ps30\~,b"a^2mendstream endobj 224 0 obj << /BBox [ 3495.2 6341.08 3517.46 6363.34 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xP;0 } Ŀ=e*! \*%b @wjLC1UGH LdzM$O0V Exi'A+83TImPq`'aSƤ'V ?M@ίrk@).-xj9endstream endobj 225 0 obj << /BBox [ 3508.51 6357.56 3530.77 6379.82 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xP 0 g O`b' Q PA%$('-9w/tD]o()$`FNsOpH^cTcP> >> /Subtype /Form /Type /XObject /Length 174 >> stream xOA@ ^tx|@ML4luz EAcʆIM(@!ZsGLqjaىX=GVu'(:Ꞵ9 N\˸R78W)جߠR6n8Ԋw{xhendstream endobj 227 0 obj << /BBox [ 3535.33 6384.21 3557.59 6406.47 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ 1 L Llq2G'8 $IP PDγ>l"NTE J ȑG9 <9ԏy`*ÐCaR.@4J:ƪ#XJPh+Bӭx )"ңhS>w#|1Lbv]~b)n^ 'nendstream endobj 228 0 obj << /BBox [ 3548.79 6394.4 3571.05 6416.66 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 183 >> stream xݐ 1 L Lq<G'8 $`}r0E|7 A *! CJpg2xRŢK ]ЊY2\W,hڳmȂ^VHr3c*5Uف=#e}ǘbQLG ˏU4?^!rnendstream endobj 229 0 obj << /BBox [ 3562.34 6402.59 3584.6 6424.85 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐA! E'm)N`q&:& /.0BT DP"rQ0 d f( h 羒2NRf_Cտ 0I1pFh6bKc aSa:mendstream endobj 230 0 obj << /BBox [ 3575.96 6408.72 3598.22 6430.98 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐK1='@ L9.> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݏ;1 D{'0||$:`%$c&̌ƛqzbF9bVEHR'< H(HK0> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ;0 @'0qs$6TB2p} e Q,gf4*Ȇ$ =@"@r'#`P8$!VecECM9QS) QL,<-H>NmcZ1$g/N; r?ovo.mrendstream endobj 233 0 obj << /BBox [ 3617.15 6415.13 3639.41 6437.39 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xPI0 ~8n^črTBr$t\x(xٴ̌0E6bEB-p# @C785#SLQu( j%ኍb! CV uU oD0qƏlU`00+!:8R+c_p=0mendstream endobj 234 0 obj << /BBox [ 3630.97 6413.22 3653.23 6435.48 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ=0 '0Kܜ2p *!D> R%޳U05hRœ +Jb{B!BsVNi].b JFS(HVX6Aq(sDFE* ZGdtxaշaǠةg{`ؔs~k؅mx{lendstream endobj 235 0 obj << /BBox [ 3644.89 6409.29 3667.15 6431.55 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xP 0 { O`l'q Q HDm 9~D'<2LQ4ԢIGrD&9z%)Zꊷ>'tU\F+> qH]֣)rҮE0ח'b]ywz cm(endstream endobj 236 0 obj << /BBox [ 3658.86 6403.3 3681.12 6425.56 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ=0 '0 (HI[{rib==EA 0#kVq#ad&do2FhR#b$p]O3TL\5e,#Ja'8 GQXܔy?ro6/B]ˏ+4!Plendstream endobj 237 0 obj << /BBox [ 3672.88 6395.33 3695.14 6417.58 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐ 1 L IODQ0 @(X PDgX k&X d* 1ô-!a4>FthE1`P s\"w8TË-g@wP71sSSԳcŢ Oϰ pZmeendstream endobj 238 0 obj << /BBox [ 3687 6385.29 3709.26 6407.55 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐM 1 9ENi@t@PP^Vp\Y"n`19FKiFUSGDs> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ=0 w'0iHlTP $q@iozw0g!1l͍EUV|LʎLsn9w8ÈSxt i:;IF%S!lɫD|w"Ϥ'ᢨ#Ԋ:bug0"]ˏ={miendstream endobj 240 0 obj << /BBox [ 3715.36 6359.04 3737.62 6381.3 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ=0 w'0HlTP $IZRYϟ_Er GU( x&QeC&o0l 02ò/ᵭRTkTt$V='BpZ@ٿb Owdb_tQ_ Rc]>[lendstream endobj 241 0 obj << /BBox [ 3729.68 6342.82 3751.94 6365.08 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ 1 L ' q $$8 '8{j`fԥ`ʐJb{B!Bs*N<4VeL\=bpYV C+'ENZZCUXĜd0+)zrS~uS>ew!bV/cW > >> /Subtype /Form /Type /XObject /Length 183 >> stream xݐ10 E'0c (H듴0DɷviGH ))N0@"@NևQ1}e60ap]U a YݕD"^9baS11W 5zL&)f2.Cqx]9hC؇hKnendstream endobj 243 0 obj << /BBox [ 3758.45 6304.23 3780.71 6326.49 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xPK1s NP9;Dž0:&KgRࢡE@- r,6dG$6dCĕ0GfRsI/]'Bq${Z>"eVȆΡ%cVgǀ3I"\m7|oq( {l.mendstream endobj 244 0 obj << /BBox [ 3772.92 6281.82 3795.18 6304.08 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xP;0 s N;'@b JH ǩP%zx33pQUd1FAɬݩGB!¤TR}(uT cHh={up]O a1ȑ9;5<Šg%zCSFU,SA,OƌbnKC8A s~ǫ8}x oendstream endobj 245 0 obj << /BBox [ 3787.51 6257.41 3809.77 6279.67 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xP 0 { O`8 Q PA%$('iմ<ٻqxDM)2&T*ĊGStP u8TLAG2 %F,b%pbNHyeS:4<ϘKGJ*\b&͌EK0Zk dECy|5oendstream endobj 246 0 obj << /BBox [ 3802.15 6230.9 3824.41 6253.16 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ=0 w'0Hl eEi䳞_D'< VYSEUdeg<D q8 ~-G+FTFg 6P+u1q06JT3.Ajćǎ)Z\ P V _ sn8`mendstream endobj 247 0 obj << /BBox [ 3809.87 6215.85 3832.13 6238.11 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݐA1E i)'0qF'1qm3xM6N0DUIg<D :cj`2Cayah"w}dG,:i*->bc[iަ'z5, Ff ?ކl^ w]\7Vjendstream endobj 248 0 obj << /BBox [ 3615.36 6015.62 3637.62 6037.88 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xP91 Nbg_DRP}di'!*gUPDf|7"0PФ|5Hg%*F$gjr< .̺8?ҡG?b9-iI0<|"h w.?n }mlBendstream endobj 249 0 obj << /BBox [ 3278.13 5684.47 3300.39 5706.73 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 183 >> stream xݐ=0 '0cHlTP $IJ䳞_;/jbAA%MwbG9B!*ʡ>"8#X3׎wU0n߿y4Yv\~,"n^n$endstream endobj 250 0 obj << /BBox [ 2847.46 5267.16 2869.72 5289.42 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐM! 'B[N`q&:& /̿W{t/tdQ1 $ @$Ac A}jw5##[PCpT%D4LyƶQd/l|*0ꖌ6#WX:кc4֬ve~ N>0m(endstream endobj 251 0 obj << /BBox [ 2362.49 4799.44 2384.75 4821.7 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xP 1 ='0Ht 8 $`} 0EqD\@CR楐F}$d9r-- St<͙H)`řblPK:DW!߿B-xU= 5mendstream endobj 252 0 obj << /BBox [ 2050.28 4502.07 2072.54 4524.33 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xPK B1 9ALO|.<y 쳸. 3a23jp(+^րSpLp=^ILg_q`Kx<(iYGm԰H.Ts%/XSG$:1E9,&ԅ6Dcr"f^7ZxwlpGY6|় 3mBendstream endobj 253 0 obj << /BBox [ 1879.47 4351.27 1901.73 4373.53 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << >> /Subtype /Form /Type /XObject /Length 8 >> stream xendstream endobj 254 0 obj << /BBox [ 1814.37 4307.81 1836.63 4330.08 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << >> /Subtype /Form /Type /XObject /Length 8 >> stream xendstream endobj 255 0 obj << /BBox [ 1823.39 4337.5 1845.65 4359.76 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << >> /Subtype /Form /Type /XObject /Length 8 >> stream xendstream endobj 256 0 obj << /BBox [ 1879.62 4411.85 1901.88 4434.11 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << >> /Subtype /Form /Type /XObject /Length 8 >> stream xendstream endobj 257 0 obj << /BBox [ 1961.35 4508.11 1983.6 4530.37 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << >> /Subtype /Form /Type /XObject /Length 8 >> stream xendstream endobj 258 0 obj << /BBox [ 2051.97 4609.28 2074.24 4631.54 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xPI0 ~9y7ʁTp8i !xvDq ^φ5~a{8S)(Prdx=b guOJġBOd}$ l5Dh1ad6xۂ-`עӏ+tnbendstream endobj 259 0 obj << /BBox [ 2139.74 4703.64 2162 4725.9 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xP;0 } I''@b JH Dž0X{:W+Yd)' B[{LNi,mp${H"3> >> /Subtype /Form /Type /XObject /Length 178 >> stream xP;0 s (@P $`$-)e G6\19$vp?EȀ0X?FUP=ldj*"TyƇP- ƅA5`O3ZYmaOmk]-<æ .l BkTendstream endobj 261 0 obj << /BBox [ 2279.84 4845.85 2302.1 4868.11 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐ 1 L Kb{$:P>0E<{N6-3C !ZLh DPZgVx@"@<փRb|va #et۪R-sHj=WtP }C@iX*G@TT]% FL#LySQWx]Yna>mendstream endobj 262 0 obj << /BBox [ 2326.72 4889.1 2348.98 4911.35 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ;0 '0}$6*e4 e Y?63 Q @2sdA)s0@"@<ՏR&5j`X$'B3AbTbeE+I]VIʡcV39Cs0g$X*)Z2esޣѢ30wqnǧ8}x:mendstream endobj 263 0 obj << /BBox [ 2358.5 4914.63 2380.76 4936.89 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xPK! sBi)ĝDDž׷7>!=E(%0DHySPpGV_>ԋ74ZD2,U1cԘ%UXR>Ch]@KlhT`  WCaU?߿8֭6ٹXİE޽snendstream endobj 264 0 obj << /BBox [ 2377.03 4924.75 2399.29 4947.02 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xPA1 ^ڥěltMԃ߷u^|03!x++FHP 6x †Lc'jdT44Qv> >> /Subtype /Form /Type /XObject /Length 181 >> stream xP91 $:`%$=YQ$gf2p#zQ%ǺiHy8$|7`UN䉋EzH%W 3 u'SD"$V+HR܂:K}p5ͬ_?džf~RU$s -([* _ c ?p=]lendstream endobj 266 0 obj << /BBox [ 2385.57 4910.84 2407.83 4933.1 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ;0 w'0pr$6*0p}6`D'A]  }Q4LʆL82|. ʆuƈ evBdԳYsx{Ddqbҥ`bvCN-z8/ܕwqn8On"endstream endobj 267 0 obj << /BBox [ 2381.32 4892.93 2403.58 4915.19 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xPA@+x.,[&ެhM/mj,3fX6-AH 3zf6 ) '8-e$欐Q4C8GAς!~25pI]pXyUH<uXosAkƌnjyE1o8|KTЊ3.?NnO/} oendstream endobj 268 0 obj << /BBox [ 2374.93 4871.34 2397.19 4893.6 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ 1 L Ll'q<G'8 $`}a(,@D0ձh@Y %3r"]pq+x -@}6U9b` aʕX%"*,"kcV3(xqU)ZE9|1̢pN?N1;uOoendstream endobj 269 0 obj << /BBox [ 2368.37 4848 2390.63 4870.26 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐ10 Ew'0 (@P $`$e Q):IqW` "lȤY8q5 `L e /J$X*KV)IJ+%[8d49&ZE;)"bԵ 19/pH^8O)co-ҹmendstream endobj 270 0 obj << /BBox [ 2363.16 4824.46 2385.42 4846.72 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ10 E'08 (H듨M[%9rOb@+3p"j)PL0RaHᾩ(XFSQs}njb} ,'|a`Xl([ko3:Táۏ!t> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ 1 L ILDQ0 NB`} Gh"r~j`fnD#xCȶ{8B!Bo}T g P5F"1kƨic1XDﻊDRXEu )ztuhmbtGԲ1l;8İC=-mendstream endobj 272 0 obj << /BBox [ 2360.24 4779.84 2382.5 4802.1 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ=0 '0 (HI e ,?ak e"({B!dSud2Y #f2HU1Br* /7=)p_-cxb#Np =Z6xMygz]؆'ӏm2endstream endobj 273 0 obj << /BBox [ 2363.21 4759.27 2385.47 4781.53 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐ10 Ew'0 (HҖ0DwozfwJ-C=7"0PPb ,`Nce$bu;^׉D17u̮-Y(SJiEumQ -Tqd&.]mVцl_ pαO`C=`/Umendstream endobj 274 0 obj << /BBox [ 2369.04 4739.67 2391.3 4761.93 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ10 E'0v (Hqa Q-:f!RDSŢ#};.c$BQ2>2mpLhpn aI3zh!$vmYQڎ¬LjS`cM[icr"|ǐВVG`9C=6<mendstream endobj 275 0 obj << /BBox [ 2377.39 4720.58 2399.65 4742.84 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xPI0 ~ Q<A%$(OR\xșg<5w)fT%MKx;0*;29gQȤzmM$=j(ĊSц3EY*QUGqr[9,RAMWFp}0ʕt|ஞ%tۿ\>lkendstream endobj 276 0 obj << /BBox [ 2387.82 4701.54 2410.08 4723.8 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐ=0 w'0 (HI[T !r>gӊO7rh,DT%mǘq#ހITِs> <2Y, QC买 hHUIRu<+>6JX 8PLeY19|m>X6|஼ˏCۿ=Ӯn#endstream endobj 277 0 obj << /BBox [ 2399.8 4681.94 2422.06 4704.2 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xO;0 } N''@b JH QSy{ӋR(cLYDT%MbN'< D q12N#hd!S(tdwQNb͎hÃ+[J_'yvK 5Y/rX߻pg+O8 -iSendstream endobj 278 0 obj << /BBox [ 2412.84 4661.27 2435.1 4683.53 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐA 1 E9EN46 w 0耠Hg( ̌ BYQSbC=w"0Z(Z2SP2 R3vL%R BAspmQ MHFQq HŇ *ڐ-#\ RV _sa{8ލ>miendstream endobj 279 0 obj << /BBox [ 2426.56 4639.11 2448.82 4661.37 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xPA! 󊾠B)-ěltM\~߲/>LnLww$XbA#喠071yp}OބT32r מI-#Ċ T(Gs0J`4LX+ }Zh['FwvsԢtvv.?0luw/mYendstream endobj 280 0 obj << /BBox [ 2440.48 4615.11 2462.74 4637.37 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xP;0 s Ď? (H듨$0D{zǛ`z{`ҁ)f=Cz<kC؇lHendstream endobj 281 0 obj << /BBox [ 2454.45 4588.86 2476.71 4611.12 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xPA1)-ěltM\~tz {G93r|#g&¨d&JBaFu$$. Wl J^X0> oRhXq WF;.`j OaW>#n'endstream endobj 282 0 obj << /BBox [ 2468.11 4560.3 2490.37 4582.56 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ 1 L 8vn$:NpH@0E<7-3C E bĨlVq#!Hb04zG!%G\ .*jՍgyCLr `uBm+ zCbv'/p Kv~.?nvomlendstream endobj 283 0 obj << /BBox [ 2481.47 4529.24 2503.73 4551.5 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ 1 L ' q $$8 'j`f2%(@%t=\!9kHaCQKef|:R-;Fm`U4C Ǵ81/YnhDeXiezApՋ#0l9°-6<lendstream endobj 284 0 obj << /BBox [ 2494.46 4495.62 2516.72 4517.88 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐA1E P L9.> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ10 E'0 (H҆0DɷƇ;ȐT7A ps,Bj<2aG$5H33EGd!QC5għ!쩙օ)jGMY1%cs~ǫ8{Jn;endstream endobj 286 0 obj << /BBox [ 2519.18 4459.4 2541.44 4481.66 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐM1=''0qF'1D]x}.(GVHRҊ 3 ܏kH bXSX zG0󒿡2\E-ZtEQxweEm0db02Т[78X1N9q XĪ3l[*va^Gmendstream endobj 287 0 obj << /BBox [ 2531.06 4481.96 2553.32 4504.22 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ10 E'0 (H든0DwNGI:Pu܁JǶ p ,Bj4V`)ȅh"X 79Z'FH7W\pGXWk`8C8b aW_?lendstream endobj 288 0 obj << /BBox [ 2542.73 4519.16 2564.99 4541.42 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xP;0 } N7'@b JH QSZ9yǛq|DELʅ8Z7̆ x@, % %Ջ N('uQ#+RkGEU:$a eUFh6bsgph ;?{mUendstream endobj 289 0 obj << /BBox [ 2554.19 4564.04 2576.45 4586.3 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ=0 '0 (HPҖ0Dγ>l:fNTr1 AlsOp#d2 F9ԏ%ʈar]P ScZu@V2ЧUT"4=x;Zư ;UIWGU?%zwvlt .?m w/Hlendstream endobj 290 0 obj << /BBox [ 2565.55 4611.22 2587.81 4633.48 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xP91 N'/@c)x VB (>BșX D]K\E3H^cT_b_SP-\A3VXa"ÁP)/x4G&)`.]‚͐"$P@]6ES)[;9hQx8ӏS ?>mrqnendstream endobj 291 0 obj << /BBox [ 2576.91 4656.92 2599.17 4679.18 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ10 Ew'0 (HiI9ɮ'pDcH*#3qg|#q9Dq CII7,)KbܢgՃ%9C@%P;V&fªKP+BGډe`#~ 0Cnendstream endobj 292 0 obj << /BBox [ 2588.27 4698.73 2610.53 4720.99 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐ10 Ew'0v (HI[A !JxӉOCHP0,bt'+8o$!!ģa y1E%#"J^ɕbST!dV eiU-%dL9Ͱg/z8C _ coq=Эnendstream endobj 293 0 obj << /BBox [ 2599.68 4735.22 2621.94 4757.48 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 183 >> stream xݐ10 Ew'0 (HRҖ0DɷviEAi(eTP<$ x&QeGl\CX(DL"^ Ll6j#)ˬWeb]Z"Bp11Q:(o +c Op=Elyendstream endobj 294 0 obj << /BBox [ 2611.2 4765.82 2633.46 4788.08 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐ=0 w'0HlTP $PZY}vA3 MI+'< StԕP38T'D%⵩d!gTCDL˪{K/3=”3~IICc5L8ֹ߄pOkQ|*{nzendstream endobj 295 0 obj << /BBox [ 2622.75 4790.63 2645.01 4812.89 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 183 >> stream xݐ;1 D'0s$:`%$4"J?Oig)"Vd.8nEH0)?2 1u])hN-bh .hXʑ" 0aB Z [`{`qL gpNQ^ac ?p^^m+endstream endobj 296 0 obj << /BBox [ 2634.43 4810.03 2656.69 4832.29 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 183 >> stream xݐ10 E'0v (HI )a Qzf!$LcBz79Fr LN9M'bP0"#ۊa,TK%BI+.z( %4iн!,z1'6 3fmzSTG1cij#0l9XEU6< knendstream endobj 297 0 obj << /BBox [ 2646.19 4824.77 2668.45 4847.03 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xPA! 󊾠RZx7׃&&/x eijtwW* X #d@(FY(RL5"aɓ" ¬KV+_a CCKhxr40$njMBylp6~bX*vn/nendstream endobj 298 0 obj << /BBox [ 2658.07 4835.61 2680.33 4857.87 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ10 E'0 (HPҖ0Dɷv;֘H Y{<n#1G1>Go ơ22\hJ$L*HYȳKVK(4=x'ZP3,`ei1h34<ޝ]bOG+coqp{nendstream endobj 299 0 obj << /BBox [ 2670 4843.19 2692.26 4865.45 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ 1 L 8q2GNB (Xay0>-H6-+$+Sa@"d@FU(Q3 XI1 \i2Rv#&u]؉>xEeᨄQI{ъa&hBmѭO}NN!bV aO @>nHendstream endobj 300 0 obj << /BBox [ 2682.02 4848.31 2704.28 4870.57 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐA1E='@ m'0qDDž׷8n<~{'c$`P<0#'-'8zfR J9ԏR$5R1c~dRX ɪ6L,CcȆ̽BQR'4x ( NV߄=Fwv&îˏS ?> 3oendstream endobj 301 0 obj << /BBox [ 2694.1 4851.38 2716.36 4873.64 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ10 Ew'0 (H듴0Dso:wF UIq<o$X.Y8"kHJ:d Rfr-lr¤mH1V+S0h1@0aѿG /p@M |.?mr  kendstream endobj 302 0 obj << /BBox [ 2706.17 4852.81 2728.43 4875.07 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ=0 w'0v~jHlTP $`8вp(yzWbCйwVx& rI0.Rx^V SU]k$U+r0,=ELJ62Ùi#^6߿,jQ|".b[xnendstream endobj 303 0 obj << /BBox [ 2718.35 4852.96 2740.61 4875.22 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ 1 L L83G'8 $`} ay@D0ձa sfD{8<,>z5MY # DF*PeA5`35=G)wkaNČ^f]eV1Y6~aXvnmendstream endobj 304 0 obj << /BBox [ 2730.53 4851.84 2752.79 4874.1 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐ10 E'0 (H듔0Dɷv;1OBR@E-MwdG9B!`C})8T`ˆ9µ$B51i\7%L|Ԣ&fXbk`a1,#?<&ov\~n^cmendstream endobj 305 0 obj << /BBox [ 2742.76 4849.49 2765.02 4871.75 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐA! E'PZN`qNb ačpA+`|c Z30#'5Ng8y$f1ϱ^ԋWi1XиrF %OE!9u) u ~I|B;ky`yo5NAЬrr?0lr wom*endstream endobj 306 0 obj << /BBox [ 2754.99 4845.9 2777.26 4868.16 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ=0 '0HlTP $qZR"9~ozfN4F9D@%jcbG9B! ԅrQdX ;6DT$&ɨ)_t2s(#B#^z̎a>SԊu7;;٫=* ncendstream endobj 307 0 obj << /BBox [ 2767.27 4840.99 2789.53 4863.25 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ10 Ew'0 (HI )a QzWPNhɘrBU(ܷLʎLmz8w o$0:-><')T@!M:ɢHGr=9q4=^zJ)NY RM9l Yo2endstream endobj 308 0 obj << /BBox [ 2779.61 4834.59 2801.87 4856.85 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐA! E'('0qDu-32pAn".(fTbBVC&oij1v[ШRTPi5?z e,}@Q4 1gX1#Saѵ/FwvKx9ˏE ۿ]nendstream endobj 309 0 obj << /BBox [ 2791.94 4826.51 2814.19 4848.77 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xPI0 ~ QqgunK8^lgendstream endobj 310 0 obj << /BBox [ 2804.27 4816.73 2826.53 4838.99 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ10 E'0 (HJ[%~cf^$SB1H-Jcy Y Qè!7Ca(r 1 M% NLcцq`Zd h$P> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐA! E=EOPP8;Dž$&8.pA7nFw( }XQ4{9o$l䍓/-2D2#㵫 j<+): EEN)u Έ}zxjE#6JKXu1jGgpSw\~,b""mendstream endobj 312 0 obj << /BBox [ 2829.14 4791.3 2851.4 4813.56 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ=0 w'0 (H(- `{vkE> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ10 E'0''@b JH QOBR%4Ga )* wDG9ϢA#|<2CsM t]U0U[i8Ip_ uaV3O3b18jM0;ؓ/zwvs@=ЮˏEtۿ] Xnendstream endobj 314 0 obj << /BBox [ 2854.16 4757.68 2876.42 4779.94 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xPK@s N0'0qg]xFhb]x}gjm cއiE!xN$ɲ:@Aw8o$!!S2nRm3W%N.x]M,WW+vXqvE`LQWKW F4d ynHU'~wp1| {xl7endstream endobj 315 0 obj << /BBox [ 2866.7 4737.62 2888.96 4759.88 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xP;0 s $9'@b JH QOҒR`zǛ9G܍hJ $$ӛh<ёnƲ 6F[P-j2"]WYB5%s~}QC63&ExNJ9UƌmolJG=]ˏSt?> Joendstream endobj 316 0 obj << /BBox [ 2879.34 4715.41 2901.6 4737.67 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ;0 w'0s$6*e-)a [??63;i&0(G "$u xG,u9Luѩ81I, I^gJj6Ӌ> >> /Subtype /Form /Type /XObject /Length 182 >> stream xP 0 { O`l' Q PA%$('|Gž;{׊/xf1*icy<D ap)Q cQ a$fXWAa2ITRUaœ13ɍJE!8GqKZ1Ctp@9APGnlgendstream endobj 318 0 obj << /BBox [ 2904.68 4664.44 2926.94 4686.7 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ10 Ew'0 (@P $IҖ0DɷvC8<Y*Xx;0vdRCe\):VdC hJ%Tt4S SA"MO->Vą$ S'@Gr?ot PDmendstream endobj 319 0 obj << /BBox [ 2917.47 4635.73 2939.72 4657.99 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ10 E'0 (HI0$ʷv;d JD`F<79ԇ+0ԄJBPL U%Y0rՊ>UP1\'T ]?MV|?ޝ`/G+cwpp{ l9endstream endobj 320 0 obj << /BBox [ 2930.26 4604.87 2952.52 4627.13 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ10 Ew'0: (HI-a QzWќRBBv=^IT9"EV; ocPT2ĉMES6ÜEM~.0eÏR*'8BbMYC9l kendstream endobj 321 0 obj << /BBox [ 2943.1 4571.92 2965.36 4594.18 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐA 1 E9EN4LN s\xADž׷UZ(L!\pqPrA!XLA ص<ۈRX2c }eI)4yfDs"90DRM[@;6E%Pg:c|b3dc47|B]>anendstream endobj 322 0 obj << /BBox [ 2956 4536.92 2978.26 4559.17 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xP91 Ht,@H,'% +gf!.RVT%bp:$l䍳q`K8Un8D1%jJ\3 b#q+>n"94D̂(儫K|*h;u/NpGY6|!{x•mXendstream endobj 323 0 obj << /BBox [ 2968.95 4499.81 2991.21 4522.08 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ=0 '0 (HI )e ?akφ Fw4:ŤYQJT ca()TYejI )mJ%t8/zL %4[xZѦh6e#|1c:uG`ؔwq~ǧ؅mxwBnendstream endobj 324 0 obj << /BBox [ 2981.99 4460.62 3004.25 4482.88 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ=0 w'0 (H듂{siEAE`d&> x&QeGy|87~HR=\"X7 SXH$ivD!YIJ)+~gt(fd)5y1cb]=hmoendstream endobj 325 0 obj << /BBox [ 2995.04 4456.78 3017.3 4479.05 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xPK B1 9ALKsυxAVŅp&3i6;8H0H #57z#ހIcEl6ʑp]G"K#)u`ԑ)zfYg,RD68thq#~b&"C#'f8쵄?ApW_p=mendstream endobj 326 0 obj << /BBox [ 3008.14 4480.68 3030.4 4502.94 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐA@E 0t'0qg]xFh.ZǺ.&3U'"8 9H ͂)fz 0*;2skùa CJҬ 2) 5,i+EFdp<s$2yB)Zpgyķ=!Q$o )c_-<|lxendstream endobj 327 0 obj << /BBox [ 3021.3 4522.39 3043.55 4544.65 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ;0 w'0#ur$6*e$E)e Y?6=3;h&E"K8ǎX$82C ppqP(x]gń+lBUt(˜:]9,> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ 1 E{O q2P0 NB (X p4 @%bBHE-eb6j{Bl$UXƆ$ET<+j¤u M*~u৭ΑY'URIΛsˌ->`|a$oX5C-l-lendstream endobj 329 0 obj << /BBox [ 3047.8 4628.68 3070.06 4650.94 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ10 E'0 (H듴MU%yrOH $a2`F:+8zfR ,P#2*K}SA3VjVGw27=Ot+1og]־뼋k]]fp(c6prG=kendstream endobj 330 0 obj << /BBox [ 3061.11 4682.71 3083.37 4704.97 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ=0 w'0v (H60D>lzwPB.b.L0 Y x& qk` Nce(:S* LNеڜM0#UEiEhݣ:L)dKyVL uO8ES`/Ӌn\endstream endobj 331 0 obj << /BBox [ 3074.47 4732.91 3096.73 4755.17 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ10 E'0N (H듴J[%'ǻ{= JQhB.x3<Eɤ>"iql!$p:2a"#cUG0MojOamsÆ?ZhDлc̬v~lN>lendstream endobj 332 0 obj << /BBox [ 3087.92 4777.54 3110.18 4799.8 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xPA@ ^l&ެhMMص" F9`43j"@!<\`ؐ)8 Џ<wJ NV2E咳}ę8U܁ ǢN{q2TGnendstream endobj 333 0 obj << /BBox [ 3101.38 4815.96 3123.64 4838.22 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 175 >> stream xݐ=0 w'0IHlTP $`M8C|{/7;% I"UI>Nx0*;29r5J: ^6%鰠S6( "˻ _sC.RS^}h4E3%]9 akiendstream endobj 334 0 obj << /BBox [ 3114.94 4848.05 3137.2 4870.31 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐA! E=EOP[(S8;Dž$& /8.("8 ^D)Ԩ8sv 0slȤI8p1̅1P$⹫ 9 ɧbkz^Hs@.uZќ?MQSTG&|c#x޲|N?V1x;lJnendstream endobj 335 0 obj << /BBox [ 3128.55 4874.3 3150.81 4896.56 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐ10 Ew'0 ؀TP $`$e lv"nD3ň(*i#9kȞ׈5"G2ˢS"V4JҰVk\(j0# e*!-L!D3<&|  ?[lendstream endobj 336 0 obj << /BBox [ 3142.22 4895.49 3164.48 4917.75 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐM1`Пs\xNbZ7EC?W63;xV!Ԕ4Z|7p".#.kDg C5@Ae)d,HRe 'Ra;EuXyQ+Z [#gČUxXߛ#'1G|㮜ˏ= zUmAendstream endobj 337 0 obj << /BBox [ 3155.93 4912.38 3178.19 4934.64 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ10 Ew'0 (H7)0DsA9ʊ>&!l=7p"Б7}} C0JxRk[H*G)B&\\/&tX$Fr'?Ir3U1'Xx+gPJj r.?6mo-kendstream endobj 338 0 obj << /BBox [ 3169.7 4925.79 3191.95 4948.05 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐK1@='@ L9.> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐ10 E'0 (HI(ma Q:"AArɨșu`AdS{XCPL^=ap( Tv8cʞ0}pGEQiqy̨KQ)#c1M1)117xM=]؆'Xvoendstream endobj 340 0 obj << /BBox [ 3197.48 4945.17 3219.74 4967.43 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐ @ EoTčp@O pyZ70)Aы')x?$'8qtգ!̉FM(ʉV0&/u0]1fqv .׊qbz0^'0% ]v?m5endstream endobj 341 0 obj << /BBox [ 3211.45 4952.19 3233.71 4974.45 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ=0 '0 (HҖ0Dg=lz"AB*H;9N'8-D$h1Y,~,j X=ܣp]g2JgCegcTqv-3`NWBhe0GUfdAzKWEU)C8,V `Oq nendstream endobj 342 0 obj << /BBox [ 3225.48 4957.87 3247.74 4980.13 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 173 >> stream xݏA 1 E9EN4m`AqmGkg\8=^$&IX:RsYa.8K8O5HKDxdJ3 W82Ŵh$%~7=v{d翱Z&hm?^~3xJ޲we.?~i@endstream endobj 343 0 obj << /BBox [ 3239.54 4962.47 3261.8 4984.73 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ=0 '0 (H҆0Dg=?l:".pȘ",QYh ps+9Nɫ8Hxh@!CQ(P1NKEJUd8,<+>iA"xTQ:euޣwgЂf#ؕwqnǧ8{1o`endstream endobj 344 0 obj << /BBox [ 3253.72 4965.9 3275.98 4988.16 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐM1='@-s\xh..QރG(9 $׌ l{B!d]2ydT=̐"\"PѼʚć*PGE%$ F:4at@ ,Z c4p K z?ѭv /:,nendstream endobj 345 0 obj << /BBox [ 3267.95 4968.21 3290.21 4990.47 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xPI0 ~_črTB 8}.\xkf> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐA1E='PN`q&:&KGgM?UOD05FHrvʯ[ KHQ!bh>4X ꐐ;?#\a'&(ƒ+`V!1w͡KD3J栄ba᝟Gߟ1QSxӏ=.l6mmendstream endobj 347 0 obj << /BBox [ 3296.61 4968.93 3318.87 4991.19 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐK 1 @9ENi;DžԅXEi_H^,0BE0EE=n LʎL9R{8gױ9*e}:*g<#Ќ7RoyfTg R(LU0E> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐ9@ E{'0^ @ $B(d#ϷM'"?f" 6%9*ip#ށITّq.M82J gU&bh'r|ҧ0ڪ¤0Eu HJj1j0CNpl^_ wqng8mPendstream endobj 349 0 obj << /BBox [ 3325.51 4963.39 3347.77 4985.65 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xPI0 ~-y7ʁTP $i )8XX3e p IQ #H OY={Rt(£Jp^v jfdF Mg܏ !tZ0D1aӌIXA18"b WEۢ1ږ>cf/@_ o9endstream endobj 350 0 obj << /BBox [ 3340.1 4957.97 3362.36 4980.23 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ 1 L > >> /Subtype /Form /Type /XObject /Length 179 >> stream xP91 8Ht,XJH ًk<3s; 4b,$ '/L{Vd%FYh*$JN`)T+B+m qnV> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ 0 Img$~ $*MˇxDYgfbTr3([3Y QNaԑ9Cu$^! Vb TYQba OUW .<-˜C2tYZLX 6GS-îEۿ]!nsendstream endobj 353 0 obj << /BBox [ 3462.77 5119.27 3485.03 5141.53 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xP91 Ht,@H@q@]@9̌'^ ̌nSRl$"$YVqW"A1P`]4<sxY62+ذQaڄJV3n#7$SL8b7E=dwNQM ?{lmJendstream endobj 354 0 obj << /BBox [ 3628.77 5418.53 3651.03 5440.79 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ10 Ew'0 (HPҖ0Dɳ8<!q&U3ŀ|'< yfHԙԇ48(Y`!e,,rlƾ UX\ 4," .!b1ah憖#(5'xܕsn8^nAendstream endobj 355 0 obj << /BBox [ 3838.06 5800.54 3860.32 5822.8 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xPK1s NBO`q&:& l w8crfJ!Pb8o$!!zBū$EJ& 3l i \`CĠ')b4/ &´C gъ w.?l nmendstream endobj 356 0 obj << /BBox [ 4072.9 6230.95 4095.16 6253.21 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐ10 E'0 (H0DɳvGD*X:%JVYRIɅX3xF$뺢 :gF)Ζƒ; DJXxQIMW=\mhS "ZT<*nXendstream endobj 357 0 obj << /BBox [ 4222.17 6507.75 4244.43 6530.01 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xPI0 ~ Q> /Subtype /Form /Type /XObject /Length 8 >> stream xendstream endobj 359 0 obj << /BBox [ 4310.96 6652.21 4333.22 6674.47 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << >> /Subtype /Form /Type /XObject /Length 8 >> stream xendstream endobj 360 0 obj << /BBox [ 4275.39 6571.25 4297.65 6593.51 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << >> /Subtype /Form /Type /XObject /Length 8 >> stream xendstream endobj 361 0 obj << /BBox [ 4227.8 6464.05 4250.06 6486.31 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐA! E'm)N`qNb 0pA/a|SQ"Alkp#d2 TbLc-Ѥ԰uD(TdU+\uW}*j 9txseh fϺ[X'^[î% ۿ\zlZendstream endobj 362 0 obj << /BBox [ 4176.52 6346.34 4198.78 6368.6 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ 1 L L8v2G'8 $`}a,@D0 bd AYɖx;.#1{b>KܦPb񈆒e1 seEM U"3wY1YxR |$![chSe;)X6x8My|ۺ'oaendstream endobj 363 0 obj << /BBox [ 4127.4 6229.27 4149.66 6251.53 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xP91 GHt,XJH '% kf|l"N "sF6`F` '8y$foQg+az ׾P#(\pH' (T'igy,t$BH*h;4F۱|_1Lbv%.?1lwo+mendstream endobj 364 0 obj << /BBox [ 4084.01 6120.01 4106.27 6142.27 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xP;0 } ؎4'@b A%$E !r>WwF,D٫*i<֘;qW`Ud'sd' Ih\yИBtL+q&צ_0&w*q#4Fp2'ԅ\2>ApSa[xgkendstream endobj 365 0 obj << /BBox [ 4048.23 6022.32 4070.49 6044.58 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xP;0 s 8'@b JH )0qc05(iAČ;'+ә{Lji%rmt=DPJX(cv(YQ[Fvai > >> /Subtype /Form /Type /XObject /Length 183 >> stream xݐ=0 '0HlTP $`$p(:f!u4;K dr N%Q5ކ!U1cJp^( &n옽2 Z0E[4~'|ǠՋ#0l9XEU6<İo1endstream endobj 367 0 obj << /BBox [ 4000.54 5864.92 4022.8 5887.18 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xP 0 g O`l7 Q PA%$G0y8t 3C$"LRֈ5Y p ,BѨb!=L"\Nf(NJ#Ln5w+ZBse)(akqPT.yN=|8v~.?mvoQmendstream endobj 368 0 obj << /BBox [ 3987.03 5802.64 4009.29 5824.9 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐA1E v'0qDuTN\xPVx+hv#uCۉ{L8)1N\ oS%T<$m k<@dV ڔF`uDx+d1H)-Fx\0X0\->@pS Oϰ-<5mendstream endobj 369 0 obj << /BBox [ 3978.69 5748.13 4000.95 5770.39 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ 1 EL 8g{$:P> a(yߎWcGj88dØ9-{L RJ`*F8ĒYUʆb> w w%4{" Ȅ3WCbQ_)$ 6,b\"va^Woendstream endobj 370 0 obj << /BBox [ 3973.88 5698.7 3996.14 5720.96 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xPI0 ~ Q> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ 1 E{O Lq2GNB`}Pa(yW3xjL¨YTP$t=^!@BMaAƦkdxYVH\|bxQ=-f~y^Q#QH)-<&zSvJjƍU ?^2oendstream endobj 372 0 obj << /BBox [ 3969.48 5604.33 3991.74 5626.59 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xP 0 { O`$ Q Hq)iˇxD9wW`Ě+9QL2x& qMXy aB-D/s#0iDJN”elKF #ފLgO1AR4FK1NDO9XC5` /q:mendstream endobj 373 0 obj << /BBox [ 3967.63 5555.26 3989.9 5577.52 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xP 1 W0ĹTďA+X $A$a/>@({f|l:Iwr9*Pldka}72kW} B |dA+ h(AgzrHn'E֕z;Y^A!iUbl`" _tjƋw^~ 7Ժlendstream endobj 374 0 obj << /BBox [ 3965.03 5502.82 3987.29 5525.07 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ=0 '0cHlTP $IZR{v;SD # JToOp#dR J9ԇR"0ǒs뺒ge\@v ~`h#4E%|wgѼfcؕsnK8{lendstream endobj 375 0 obj << /BBox [ 3961.08 5446.06 3983.34 5468.32 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 171 >> stream xݏ10 E'0 (@P $qTۻazWE)Ð")(zW83&h 0O5#z` &ZY19f(eό7^ҫaUć- uX:B{1G+psOiXendstream endobj 376 0 obj << /BBox [ 3955.61 5384.6 3977.87 5406.86 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ 1 {O v2GNB`}.(a, "8 j̉ C`=NG$vdJ%Տgjq(Jd3eń+&*k,p,Tt1h: v4,-WEW8A8>@p3C =nendstream endobj 377 0 obj << /BBox [ 3948.66 5318.23 3970.91 5340.49 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ10 Ew'0 (@P $`$--e b?R)gLX89ޏ+0Z(Rh&@kŏ(`e%N2PYB>>hT#גi=rOgT]'rbz?6Эo; TIkSendstream endobj 378 0 obj << /BBox [ 3940.21 5247.1 3962.47 5269.36 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐA1E='@P'0qF'1D]x}[ihe523Lp 1+0#JbGG59Szq2S^,l@p2)d(PjacPPDh,< f$:\ KEcC8C r?1v /~mrendstream endobj 379 0 obj << /BBox [ 3930.54 5171.52 3952.8 5193.78 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐA! E'm)N`q&:& 8.0 B`c "(|G6`G"d@FY(Pަ!d$p+P8b̘bAe Šw@REuKyTxquh6c c aS".b nWendstream endobj 380 0 obj << /BBox [ 3919.89 5091.99 3942.15 5114.25 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ=0 '0~v'@b JH QOP9`#8H UI$%n$2SPpE1Lf8}a(6X(gUE'rh(jF> >> /Subtype /Form /Type /XObject /Length 178 >> stream xP 0 g O`l Q PA%$(Mi 9zۛaxJB$A%Rk ps,BC& 'S$#yBsmكbE +&^qo JÐ7+UpDb8XtIMƌ'2ʘ\ y Țv.?m w/8l^endstream endobj 382 0 obj << /BBox [ 3896.61 4922.86 3918.87 4945.12 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ=0 w'0 (HR2q8M8>=Qb.B9aY~ X$> >> /Subtype /Form /Type /XObject /Length 183 >> stream xݐ=0 w'0v$ (H듶8C|{w`'9(@!j$ LgdņGٱD&bU}SL^b#%Y-̔|(lauXxs)j8n"&ec{4E WPr%~,"Npn+endstream endobj 384 0 obj << /BBox [ 3872.25 4743.1 3894.51 4765.36 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ 1 L Ls<GNB (XP0E|{ώW# 9 pleaADZSF(ZRdK_qd ‡5u gL%,> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ 1 L L$v2G'8 $q@ PDf "B JV;7g9՗X? T>Ci(j2dEVlV:¢=jE$DXJkEe){ѝ](<)gnendstream endobj 386 0 obj << /BBox [ 3848.15 4555.24 3870.41 4577.5 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐA! E'N`q&:& 3ačpA+`z I*3r$Z psxYżZ0XEc`p2F(*+jcQD]EL(sh-Cc WAbhc/߿LʹXİE޽nnjendstream endobj 387 0 obj << /BBox [ 3836.38 4459.65 3858.64 4481.91 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xP91 N;/@c)x@ O ͌U?c蘒ʊ"$mj# X$JJj oNRjUdqS)b[x\oendstream endobj 388 0 obj << /BBox [ 3824.87 4453.76 3847.13 4476.02 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xP 1 ='0vHt<%$I0Eb{1NW8C,AH1 Y}_v0IlȤƮa ^ɼfd%pD&4ȽñUSDAf7nHN%ǟ2wÞ5{77ઞÏ% ˿\pmendstream endobj 389 0 obj << /BBox [ 3813.55 4510.72 3835.81 4532.98 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐA! E'JO`q&:& /.@D0I&!D ȉt<W[ky% ss$4†I O9`R;Z١%TO915xq-h#4G%|btG'EM6~aXvnmendstream endobj 390 0 obj << /BBox [ 3802.51 4608.31 3824.77 4630.57 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ10 E'0 (H듨40DɳwG$4cGB!B5>4V EbuUS蘵0G̱Ph_p %fe6!G aWퟮ7lendstream endobj 391 0 obj << /BBox [ 3791.65 4728.82 3813.91 4751.08 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xP 0 { O`l' Q PA%$7x0+|p`.%*i'~e|7`U6dkc (YNbb",Ȥb'0dV2_1i!yGXHٱ9.vxhg p@ w.?NoGoendstream endobj 392 0 obj << /BBox [ 3780.96 4858.74 3803.22 4881 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xPA@ ^@ ěmbMma3;d6;4L1yd UI؂ x&QeCd~[6qJ#GGEX+(<FWPtJ(̔Gk<¬X~;|/jOܕwqnw8^Gnendstream endobj 393 0 obj << /BBox [ 3770.37 4988.46 3792.62 5010.73 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ=0 w'0ί QPA%$()M) `H/z~s; *ŌޓOӝx#ހyςLQN,PLP e.9R4Ce%u(-[fJy%(pƑRVmlf߰l5@g";;+42kendstream endobj 394 0 obj << /BBox [ 3759.83 5111.64 3782.09 5133.9 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xP 1 ='0v~N&@('!J PD{zǫIDpBc4R@Ep`X)(Pʑ`$2eydr@Ñr1J6L%v> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ10 Ew'0 (@P $`-e Q:7 )T%Mm~=^ITّ):8<A_=L(T`/s!2b؈CdCmHFB ӈUjA%Y̘xh)~|}''n9XC5` /lendstream endobj 396 0 obj << /BBox [ 3738.95 5326.1 3761.21 5348.36 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ10 Ew'0 (HI()e Q򾾿zWeC QUI| 0*;2Eٸƒ %*F,;VؘgJI\:2i^$4z*$ ? ucZѦhyw?8B<;>@pS*b[xrneendstream endobj 397 0 obj << /BBox [ 3728.51 5415.98 3750.76 5438.24 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐA! E=EOPi)S8;Dž$& /pnFf w&cP"X:RsI\p0u bx/fV Vx / x4R.aWAyllS`RPGh:'S _c ?p=l#endstream endobj 398 0 obj << /BBox [ 3718.12 5495.34 3740.38 5517.6 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ 1 L _ 8 8IH qOE9;4 #܃:gdh%$9'8-Pr 4b)g!d#UBeCGLyb3U* hi0[1eav(yPS,ܣ?pY8<îˏU4?^! n\endstream endobj 399 0 obj << /BBox [ 3707.68 5565.86 3729.94 5588.12 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xP 0 g O`l HIZBˇxD9wW;fn!&դ DP| G85vF#B#a eqARM+N(::7Dtőd!ox0 Z1A2, 1>ߟ)h6a=6Undendstream endobj 400 0 obj << /BBox [ 3697.29 5629.47 3719.55 5651.73 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐM1`s\xNbN ࢡ=({48,N1I2̆X$<֋GW={(9^יD9ZPT٩T,eX)坍3 DIq1P&UW4X18:|}3(57|?{h 2mendstream endobj 401 0 obj << /BBox [ 3686.85 5688 3709.11 5710.26 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐA1E '0qDDž׷ՙN E!fdv CE;7`X)){rj8UH$Dc@.bxCYI ,8ox,DXq]1sXLɢw%.?o Lniendstream endobj 402 0 obj << /BBox [ 3676.42 5743.12 3698.68 5765.38 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xPA1[оěltMԃ߷]Z/>3e5`c5E!&I9Zpq7(|0U#JQddDEY2VlecQdB #+v g̊wG2襛UѶhes莎1e )qqaǧع{o~endstream endobj 403 0 obj << /BBox [ 3666.02 5796.23 3688.28 5818.49 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xP;0 s (H0Xef_̐gCQA18#96N)S$O01Gᾙ`悔 6^#[ݨHclPm9cR0xNźF,%*=| נԳ;0ƺ8DC1|;Pnendstream endobj 404 0 obj << /BBox [ 3655.64 5848.33 3677.9 5870.59 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐI0 E9O`xJNĎTB4tl8yiG6U4͒RdKOp[H)EHxz8 ZP *zŌ nfYUb+oŜtc䪘 '-p8<nxh{C؇\o4endstream endobj 405 0 obj << /BBox [ 3645.24 5900.06 3667.5 5922.32 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ10 Ew'0 (HIe Q_zWi1 0*;2E.փsbx+I0DH,X`$h-*Bnr(~qD)/⓮S`# 8Yˋ޺&Z:l/ p@9xMYC9l lBendstream endobj 406 0 obj << /BBox [ 3634.91 5951.81 3657.17 5974.06 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xP;0 s q''@b JH 'iR%}o:fN 11x^-M70Qd𱫠ɪ`Fh6_KAN ar r.?mr wo|lendstream endobj 407 0 obj << /BBox [ 3624.62 6003.59 3646.88 6025.85 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 183 >> stream xݐ10 E'0 (HI )a Q#p PH0;0#g[{L0Tqb(T11ۊ9 z,2錖=D"q as9񮐣*|1ǦKO:Eu)+C8N !¦ӏU?^.lniendstream endobj 408 0 obj << /BBox [ 3614.34 6055.33 3636.6 6077.59 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ 1 L LHt$$q0E1_1钘X 3{>cGtۿC؇7;mendstream endobj 409 0 obj << /BBox [ 3604.1 6106.81 3626.36 6129.07 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐM @ 9ENO'Y@ (X^L딺. }> >> /Subtype /Form /Type /XObject /Length 180 >> stream xP 0 { O`$ Q PHIZhˇxDY绳W7Z"Y(;@! U~=^IB`Cd\R+7©i(yhX$7P8`̬:bf`HAf ZHb=!ތ9EGъ7ܡ[v&Zmendstream endobj 411 0 obj << /BBox [ 3583.78 6207.62 3606.04 6229.88 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ 1 L L8`G8:.(䳞sJ@Q33r&i|#ܜGbS(^c}O^ SH(dTP"\?*0+\YPFTn> >> /Subtype /Form /Type /XObject /Length 183 >> stream xݐ10 Ew'0 (HI(-e Q:fWPs%gLbDQ<ĎX$8Jl64#9yQqX{DsgkG.Tx(-&gR8X&Ō[ǔbR̹JY8>qS*b[xAobendstream endobj 413 0 obj << /BBox [ 3563.63 6303.21 3585.89 6325.47 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ 1 L 8`'!O0E'ώW3)+f( "(mG5F#a HRepDpY:t^h5YD˓>Ԁ9YTE3`-r3.Z|tK!zEqX6,bX"va^inendstream endobj 414 0 obj << /BBox [ 3553.65 6348.29 3575.91 6370.55 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐA! E=EOPPJO`q&:& /ddčpAn=NC Sؐ8y]G#EuC88O5CHdQdvJ )E/cq$,]2/=cU"qľpu)Z:;#!PjO+cWq=ocendstream endobj 415 0 obj << /BBox [ 3543.68 6391.32 3565.93 6413.58 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݏK0 D9O`OH( H')mU6Ehf> >> /Subtype /Form /Type /XObject /Length 177 >> stream xݐA! E=EOP-ĝDu(3 c7$BUbFfd># "s0 `lr*$xY$cB^11JPZ|/qb/^9> tA|}'rb?F0p; kendstream endobj 417 0 obj << /BBox [ 3523.87 6470.64 3546.13 6492.9 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xP91 ع+X $,B("gF=a ,9 a=$e{ 4Jdy Eͣ0u%aE Pp6> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐ;0 '0~ur$6*0p}@Y8CϏU05qDuDP;v`@"@r'ba`lp^dDԤjB-jlz(J(qЈSE %t[uhS4{{!xvxMy|]؆'>nendstream endobj 419 0 obj << /BBox [ 3504.27 6523.97 3526.53 6546.23 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ=0 w'0IHl*e$p(^v"n`cj&yx+0*;29w85#a/B(Ƅɬr rþϽJ7'}+0dx5R:ZM1NB'0̳7e a!a Ogkendstream endobj 420 0 obj << /BBox [ 3494.49 6514.29 3516.75 6536.55 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xP91 L6/@ `%$,3xfFD̋L!NZP4I~ 0*gd'sp#M#K 7<:hDNJ{TfI`k`0YI@,&oƔzPbGjK;8fmZendstream endobj 421 0 obj << /BBox [ 3484.82 6485.64 3507.08 6507.9 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xPK B1 9ALڴIO S@Tԅ׷}ׂ "L&L&NDDu%e(dL2qі'6yd2mT bxR:?BlJCPpX> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐA! E=EOP[(N`q&:& /HǍpADpzZ U|@ȵ;|#ހIcC&5ZƁ-> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ=0 w'0ql (@P $i60Dg=l:f MF&I)&38H=RȹrdO"3*QSI$THqb檘hmk\@(0wqnw8mendstream endobj 424 0 obj << /BBox [ 3455.95 6342.35 3478.21 6364.61 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ=0 '0Hl eB"s{Ib?#a1Hbp#ad&Bu*:n<Џ9  u'&FʵT-PVS$Q*:~oS,^^!®!tۿ!M2lendstream endobj 425 0 obj << /BBox [ 3446.44 6287.81 3468.7 6310.07 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xP 0 { O`DZ Q PA%$('mC ag]Nt{p $(!3qUo87p䙝#1ejEW0Y$ Z,r,x]' LqEk/leR`R LO%&AœbI-o5"X6|]ˏt?<^kendstream endobj 426 0 obj << /BBox [ 3436.98 6233.3 3459.24 6255.56 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 177 >> stream xPI0 ~ Q<A%$')-ǚ/qx ԴUR!|?Ec bZ$JX)^LQ͔Xq"Jž D'L8;h$yVAۡڎ@)g'0nJ<_#v mendstream endobj 427 0 obj << /BBox [ 3427.56 6179.62 3449.82 6201.88 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐA! E'@)'0qDDž׷ōpAnLww gA3AYr psC^c>ij> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ=0 '0k2p *! \9x503Lp jP 8Jd_{B!Bs\:)#g&&c"e^юQecv":kU=^Q$1S,u7c8Ť;<&ӏU ?^.lmendstream endobj 429 0 obj << /BBox [ 3408.88 6075.24 3431.13 6097.5 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐK0 D9O0 QJH  O("Q53vD:8#gJlI;@{8#0>#[P1)AT1đ#UV˛jKE"br` ibІh6B#{+F'c /s[}kAendstream endobj 430 0 obj << /BBox [ 3399.62 6023.8 3421.88 6046.06 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ10 Ew'0 (HI))e Q:WJ5PFU$>߷LʎL\l|8GPyQ1 RHTWDʺT*L/r]#.L<:Mk ?u7~,[v'kmendstream endobj 431 0 obj << /BBox [ 3390.4 5972.17 3412.66 5994.43 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xP 0 { O`b; Q PA%$(-9w:ťZELՄP$x# CZ},`ǡYGQRBq;5g܃3,%4BqH޸eI18|Z5|^{xlendstream endobj 432 0 obj << /BBox [ 3381.25 5919.77 3403.51 5942.03 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ 1 EL 8`P>pw0E<'NjaKʹ2:;ʒ_ZvpN,BK;)CLp,(AaF삹N܇ / 13LQfa'(B)cİu1nCئMzB'lrendstream endobj 433 0 obj << /BBox [ 3372.14 5865.94 3394.4 5888.2 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ=0 w'0cHlTP $IZZ"9޳Mw^\h)R(Bզx#ހɉ"SPΡ~#8Ԍ@K*qkӱ)TL$V<y(P&`yDu=)Yj\ =y͊Op+Op=clIendstream endobj 434 0 obj << /BBox [ 3363.08 5810.31 3385.34 5832.57 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xݏ 1 {O Kn$:NpH@8R1E|f\p3,L&JSnq#ހIT9!SH> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ;0 '0~qz$6TB2p}-a Q;??6=3 jY5Jb_ GB!p2 P #)íd ]ХjCU U SCXTcr >26%&Y=)\bV^aW mendstream endobj 436 0 obj << /BBox [ 3345.17 5692 3367.43 5714.26 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ=0 '0v (H듔60Dg=l:fN$Ddك{2 F9ԏQ$K0D#A3 9HdR=JQlU# O-&;9!)4͂eŌU0 ;;$ aW!blendstream endobj 437 0 obj << /BBox [ 3336.27 5628.91 3358.53 5651.16 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ=0 '0IHlTP $IZR"9ϟo:fNU#A03KsG9B!Bo}*q u HTjչR6ԼTAW1TΨl!(aUY׊6Es);;-F+oOǰ+cWqp{>ynendstream endobj 438 0 obj << /BBox [ 3327.46 5563.15 3349.72 5585.41 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xPI0 ~ Q> >> /Subtype /Form /Type /XObject /Length 181 >> stream xPK1RN`q&:&h#lf!F.h I]1 $+ßq#!QJ|tCs(%:LX*V4뱢;q[VbDG+ 2ԩYzƤKƈ{8˜h9D,v]~)a Pnsendstream endobj 440 0 obj << /BBox [ 3310.02 5423.44 3332.28 5445.7 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ=0 '0Kܜ2p *! \H[%U052! DE3AI};.EȁМՇS$6VcPp^:A +KHU&=$^T(aү5aHk *ڐ/p zvxM9]؆'am/endstream endobj 441 0 obj << /BBox [ 3301.36 5349.65 3323.62 5371.92 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 174 >> stream xOI0 ~ Q> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐ=0 w'0 ؀TP $qm`?/^bƤU(d&Z_wx@9(J, 9xЏFM /йRg(l+Yi(/aQ4h4SbpQS|@č-=l Wmendstream endobj 443 0 obj << /BBox [ 3284.22 5194.9 3306.48 5217.16 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐK1@ P&`h.SE>ʪpH*ix&QL٭>2GoCU$è  L#UbBQKF`U0G@p3ӏEt]lendstream endobj 444 0 obj << /BBox [ 3275.78 5114.09 3298.04 5136.35 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ=0 w'0HlTP $PB䳞sDAgT% p<o$l䍳E8ȊRץ:MBWCHY>}iȱ. WC ĺv!6Bgpe'ʹXB%`^k~endstream endobj 445 0 obj << /BBox [ 3267.39 5031.15 3289.65 5053.41 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 181 >> stream xP 0 g O`b; Q PA%$BˇxD9wW=x JBH T;2`Adzщzr e`RJfTjpp~> >> /Subtype /Form /Type /XObject /Length 183 >> stream xݐ=0 '0HlTP $q[RY}v0<N!jH I|g/07GI0 iB8Ȅ9d(Nh-Mg$:6sVm!$nz,zJ)cMG.` OagcWqp{nendstream endobj 447 0 obj << /BBox [ 3250.76 4859.05 3273.02 4881.31 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ10 E'0 (H)e Qzf!J"4SFJ l=`@"d@>4VAaEp^VJŠ.3\XgJ*f]( ]T] /6M"6O "zlp rN?Яu "mendstream endobj 448 0 obj << /BBox [ 3242.56 4770.06 3264.82 4792.32 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ 0 Id$~TP $ʃq@iˇxD9gfp(ISLft# @BI` q#QL\𺎨{9F.5> >> /Subtype /Form /Type /XObject /Length 181 >> stream xݐ10 Ew'0 (@P $`$-e QFҌ1y!V!I<{SaG\b{87C"J%, FkΚ.޴ɬ5`L zh1$J6Bf*-1M19!''p^pSa[xlm endstream endobj 450 0 obj << /BBox [ 3226.3 4586.1 3248.56 4608.36 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ 1 {O c'v2GNB (X)CQ>;t!_1R)!lendstream endobj 451 0 obj << /BBox [ 3218.31 4491.17 3240.57 4513.43 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 178 >> stream xݐ=0 '0K2p@ \ViY8CM0<#pBe0ˌ ҭ GB!BsVH`ETPPSaf\9YSPR Rh\-> S²W&`Yb1s혇X*!p I=;î;!zlfendstream endobj 452 0 obj << /BBox [ 3210.38 4454.78 3232.64 4477.04 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 180 >> stream xݐ10 Ew'0 (HI(ma Q:W*L!c &mv=^ITّ):M0 P#QQ> >> /Subtype /Form /Type /XObject /Length 182 >> stream xݐA! E'm)PN`q&:& /LǍpA5nf P͂ -w ps,B 5QHZ((u+6 0 fwKƼR+ˌ* fEkC -;;SNt r.?1lvw/Blendstream endobj 454 0 obj << /BBox [ 3194.67 4578.88 3216.93 4601.14 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 179 >> stream xݐ10 Ew'0 (H듔V !rxӊC1ɜQp#ހITِ)X/Ɖq+ #3uIĎABՙTN 0 $UbtL./q0Z<8yl]9[hXllendstream endobj 455 0 obj << /BBox [ 3186.94 4695.25 3209.2 4717.51 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 182 >> stream xP;0 } q;'@b JH '4E !r?={Չwg*c.B(do$6d%xF'XKP(8Q*#vt3A+I\:_4^sFHC.Fyx:1hGGPrbM}|l 8nendstream endobj 456 0 obj << /BBox [ 2101 6456.72 2121.42 6477.14 ] /Filter /FlateDecode /FormType 1 /Group 94 0 R /Matrix [ 1 0 0 1 0 0 ] /Resources << /ExtGState << /R111 95 0 R >> >> /Subtype /Form /Type /XObject /Length 176 >> stream xP91 Ht,XJH |= xӉ F"2y x&Qeg_Ɓ-8%#F cB G@ZZJ9/ d*2&`S[?J.EL:(9ˆOܕsn{8^l`endstream endobj 457 0 obj << /Filter /FlateDecode /Length 6487 >> stream x][sq~GG͋X+s aV_?nťM6>=>klJ2<-_rMuQiW ޫ9Shv:kMy_\:k\RT)jXalu]n/.msΑVS Bt+xV[ CҌ֥醸t:R[k4]!n߱CBcXIDyxs:$3G3[t[7Yщ81J*gG&rS/gr}3#skUU&S3jAS'̡}1oUN!YA/g|̉h3}5YG-E&ňHR쵅&:PäuQ6 DP(Z9=g-eo+>x>mpMׂTG}c2c;Y_Fp Wy3 Jrcȍу:j[QÌI*\/JJOPR=L /Q]Ȏn [̯) ƖE5ү84J*.lQ 0V{HS7`SmkiË%8Xޜ&EU."C'E`/!YYiՔ,udވh$Yx;?.kW'$r}MiŒc v)S٩^YiOe&1赠^ h"p]ki8Q| {P'>̀Fga '(;TH#ԑ)ʡ[&=j*ᒻ"2u݂#sz(r9ˮj EZdBKCX"cdճ;̆E6b!}pAh9Q޳fGEtF(z Ŧ 'Mozo&zp`q[_]4Y Ω%K0V ;kν3sDpl\z (=ͳO $'v|ӣ(OƃT$D!C8$t@P&=H@b-nGNy&@\7ב}edYGP{ +!$LnɀfL{2K$3h^՘헐ksuP֫,#Lq͗WVqr xż!A<%|Kn o;.‚|9%Qġɚ$9J7RT7Zw%Gr] Z*[(*U1~`r ^ sq{,T.Lr4C@q.VҬX**̱ }=q)]Sу$ 6Ә&",!i_DJRWmeC@ӕK63^6kK׵6R]=hH#ir:7_\B=J[̼cɣG؋u Ztn:ZtzK{_G%[ -3| k4>x> H&+Pt+{NGd^u@5PQU;bncK38_e\\sLy >jsDdA'uEAfH+7@?}f)szA]`u. 5m}jVh#ʼnB 39:F5xi][(J7ۿ>, TJv2.Y`R6L[%?2L.[RaMD%tDU^BXBvKe鐕b [)(hV( 1JEl8@i5%p(Ba=AO׽5ek(Í;TZÎmY3̰@F[E/ rr2TRtϨ)KBaqsTXcȰ]đ{2_Q:TiMQգLl 4GeJX"w%7+xQD3 SEb"!KHxg~Oዐdίf+{,៾C7:W:]z4xv 7A i vC0HBU4C|SX+d#,T\n]mT$)Hpj)6 dJm1YrIj"ZyGy|yQ2ټ hQD1aۋ?.rL{uU⍍BkU7KQDaB<hEJ[Ge7m e 4[}k8K׌]Leb=eHP##y}}1dﭔ?׎)Ty!T;x m гj]&pkGvB849e)٪YpFau,8tx_ډ^U!RǸ_ޔcP{ 'D0R 2 }Ap8h#F׺(M9ɻ=-(]!:-;9uЄ.7}=?UCXВE%{ \8=XcTn,fעKԞ.s/d/5T-Iq_^YJ د˲-+(N=È%vV]K١٪fLLG$JǷRgTF=?vU5]AenP(^dpzG$"BVV6:(z8ȱ 5SA`t(n_ewy$XCC*mNj 7ju7L51|d_./Յw#&۬aP{jmD|=P Ix*1Ξ<۷]h\jFs& Bd],3 bqN2(O 30";p쒵LEQxE,xXZq W@hB2BÇB[iM'IQQmy9\$4iY]9ZȬ<I`e΅UzMj9` xnɼU`ۂ% ~exr=HɗĿUƒj~ Ikgz($@@(3r<]jI !4锱]؞ T{sF[7c=Ň߮ 2^_61"H*z@/)y 8%e9bCYF\n" б=ڝMe'pP ϶]pa2 N~ìoݗQRjÿd"}bd%@ \[F^E-!kV/1qڽZt@VhtXˈB3@qdTP)A"Cm DFPvYb{1- kyov2WROȠlL=: <({4o>n,[c^1hqq .cg"-xYRaU[6U?K#vhd;KKpџ9&[2^pپK |VH v7] Ú̼T+bZf{!)&Ue]7mжفʣDmE'5h%Y]iigSo{^*ٻnH+8=EY^!"ɳVO1M 63WuU0}#682F`nsH&GA)"P#+銢փ+PܯbkI?ZuޖZˀx]#O8C2k̮0QizX#Or ,(a6-.8Sߥ'!%m |2hOVh.mnhR]7*$XKe, ҧH(j>)J[,yJ,o / `n;3.vuݗf>,׹8~ˤd lBP/܃ۢH 6|2Et&V??~Z*nG|ˠ5>,˜kx4fr:yHddžWO0'_ 2b#n_};f"˖t'Bf Zgk?<}wZE~Xjv8yх_OS〮R7/$%ۇZYUG)NqV]{Re3RȞ"\ܐ׵V-m)|~ϰl,v^`'7%zKebs#+Dfիڸr]֐[CO)ЄBpwtǧ]1jOVL؃jm0c"Lq] X=C`x-A >&eYEKˊ fFt-qDUpZ5I%WūB ȫ+x,QSP`iI )c3 Ent- H@p5!)rJqKk1KfY0Uxx$:=tm '26,oJZ{d.h^,ղ ɉG#(OQtG83Ֆzd&ӀUTtMɦ:qxƤQWS~UO;[@ ;0˂} HW*{P.!S?lQ؂N r[@u tn +˼-@-|Sv4z} nܘ\a Iw,Ai=g! !fJ7py4E"S=*"ڇq[E!혰ls`{qU+e䏣" Piƕ-v; >O1'a{V%5CVѶ;g`ݹ˭+>ރ%t}bvV8ς(><'e#z6`!,hɉ஬QʌCߔէ{alEްE/6qI.;AE堵#br 8- H셼3. Rv.dThH~W4b?3>xymzp.DcHOr+ 5w W62Z"rE5JlMj7pO_>Fصn6""#7Sn>?Jo]b~uF7i%(xd5M1A j{۵ר#\~m+$+<~ lsIE.+z/%esNߖeIpYW،n~W S'h8]g anG =&Xج,+c\a"ՠ[;269'p{ 2.)V?X*;E5M0q[(r*_ԅT7͇Zc'%Kr?YS-(-!Qߠxr; 9/1mLg#&4Ӄ@Q`wjߕ1WbG?^+3{Z64SW=Uy==iʫ|Ŕ1QzU(P[j \ s79uܔey)]nelYHR!,tK9_^Y 8?Eendstream endobj 458 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1868 >> stream xU Pgfe[dG +&J#h 0C``d嚙ǡ^Hq 砠xqXZIIJl]ݭJ]U}{,taXU.Z_b]I oZ:XlR. Vvg0 eiM) qf_:Ef^;wԄhQj0&'Ikƛ)̱X, iMqAYشԌJѬ 3$FpySͱPSLlaFSJ9}U؈I άc3Mt&Y3+7^pLp|ڟ빮znbDr-D-tC%ܳ^TOBI`gm2-9B8(vgG!_EsIȊ%i C<1Zrxd"4$αRh:@|\zU8<iܿ7&d8,@r 7]8Vwq ?] %"ؼ*jǩQ#w^l]̻'ˁ18dٷ'w_6&tIdS;-_}3"YQ[p^&N2!jMG/$]Z9ol<,nL<X|m%C*Kץkk(Z@=Ŵ#>pi-ecLdQTY[_HGT_e}Q{w6s+2S`r@2aO]Dn *ŧ pe-Kv!]%.<DyHCqJx+a@a!Gᇄl+A҃,r!e CbZ]())ę`#$q$w* * `+%jRAhhkN Dq aΌZbu L8A! /ɂ 3s-L'S_,BO.b/۬v?pd46}JtC6}싋;gmU"ml*,-[f<3o\ol7spm%z T߼VtCltUENouQlDžw‰*8Yg{#BO3, UW0H3m92,e خ,>yݠhysMlSQ؋^Y-|"<ψ'dvG U5W|MK7|fC MO%4A ka`|Oꍼ={],'YL{?彲r]k&€X't9YTBypCN>- %n\+iX\]t$gs }H{:OlC TB~U%**ӀxW}gY9R|jpG\{~!-:A4گ~ύ/GùW4͛6i6@R<> stream x T'2XSW'ժu(`qÚA"&,"DAQQV"=R}bޡ&=ιg{{wx㙻{9^`'oh>iZKY{>Vb |!<,B"U)m>a3fLٸAX}Hm%X)̉"3lmA6^HbddP.wɈlW=ZFK2Xr"_IyM(tPH4+z xՌxFx'?0e}+=ih(d;{^zЄgt$`F'"ݥťGɪ|=bw%c' mV8 eᝢꬓy`DFPC6>\L] TB2@Z(Cx5jSP`I<&_d.P\@:պFY lЯ eX3Tz־W݊Z6O@|$$$%KK\yDž,Q%hMhݟ.}$QjoZķmz

"T|<097"mySJ "cBǤC'\( 0Ee`FK`^v*mZ9u:SM)JSu\Ŵ7UAU%{DAg5z[=kNWJy|@hc P{&@9.(,*?뗦U7eV./ !FSPr|p{܇ *Kzo_uhv:c9x<\هt厔Ha?! WXJG Չp:}IeaJ_zƍ{ȴ|7rK\a(ɥNsh,9ąU{A5>l'r=wꡜSXzr- mqq(ڈZh&?@Y/7Z wXFGH(efA1P}HxG~k{"KW{ztwC|d0YYdkF(wYMC/+g>OX7+5y,7̳i/P++Ka)I%7 }\ހ/=VP ]hZpva~P\EA!9 JJU8_N x;&T*8qc8wSsnk t 4`Bh-hIJph=]?YRwjW4Y ڃL٭k5Pc:m-RYM.G^vpFxȻyZ~k݆/; LdݲʚȣLyբf*KڢA0BDM&jUC>(xP]9ffZDAqEqBW<QhLFǾ3b  9BJ.s Ŝ!5~5^ p.i&M/AT[pth.MqZx9>PY'/n~c~RvQf_;i$7,ɏI?x)>/^8aϫ8P/ypXA|5m;m ?޲[<1ܣOѳLnQ$Vcv/La8M1m#㐜ʰf%/|: q_݆mg)LBvBk/j=s Z2e6cUº䣰ޑMGŌ2s(Oɳx iendstream endobj 460 0 obj << /Filter /FlateDecode /Length 2374 >> stream xYKo#7Wz~, vd[%ؒbd6>_b[L0id_}U,ֈN6WpYm%/sc*4U>)iBthvވN k֢3RyG|h5eFêhӞu.$8ᔖk}ķ*o1vBX‡v.JI ۾j!B]6t#PL:yc]{BFoq mR~uFTz?t=J׋.Fݤ)}&؈=_3~VN>Ld"ɚSc U\>Q"}BFkK>]RVRP&Vihj6Rt6pxpfnxMk@k+"btsI &q,|"0NqC%G]B1udqxlH#H-̌4+謲Ek޹A\t֎i4)pgBFFYJ1VZ Tpo B'zg×;qg!;g`>N`gQ}ki ·@'ي` O;Ni+{o.Y#`Pŗ'5K?2xv$U1V A."q6Wpc j1XI)5ϓ>e ȯkkAlKatovm%$ u(?Mcͺ!Z 0 j\(vhh|Sԅ^"'ZJK"-rRyJ@`rdfm9PPA QyяKܮ,P_>Ny˺`LK-XJic@bֈǾPbt986pRJK/=|3Z> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 462 /ID [<22916fba9ac4611c219e75bafb61b38d><9636b4feb6239620062009b5217bda38>] >> stream x픿NQ *1^Z D} Z : P\= wl-[|93;|˲g\ ꯵{VͷyJ . >|/J'8#8N=?@pu7k GP?ۂs S BQ}?i޷ϯ.*nIfYRxJ-#=G,SG.ob+‡1=b# 7umdmĬ3'vZ48 |JSIR>TsM#cAƂ's䬩td ~Xy,gaM,5z<Ʈrp\5DUORUg5\c".h2Rejn=kS1y9# IsɠɿT{iDTud둅=:V&/wseb1S׾|s|sBG^δO<\rk2> stream x[r6}߯[r9 q!$˒lK,ٖFJf4Gٯ 9o3Yk@lntSyL23|#f" YR,d*T̰0,ba>jGJdfsH !K ꂩ(Bie a1S"Xp#$ BMY?Y!! S.":!TH(4ILL LD48hC?c@{%^ER+FHsYs04'űxhgXaσ҉4{VU (Ņ\(m֤uШ zAk4!W G4͗SՁd!_qO|‚`8edrgy]skm|O$Mo#H ~~* #n'tܤY].E?ki5t9 u2.*&ܞ7t gOEMUDS񺺨zB.y<3`qg1UCUA-,ݝd_|:yl2|n:2&kϓ#&-QVIl"J}. Y .o&дW˝,F~dASǷh wwUbigw72CG۠INo׆ 'aAR՘1G:! P RJOaT O]ݳ1ӕpyueE1wxx+x|% o- yۜ$W*+,{la<-Rw"I!Y5,WE_"u#?TQ <㡻˱2\>2ݐֹFĝ{'>gdp KzBkX˭]]Y({x;btP9=mi+zlRG[[Н =Vd{d1HҦ_Y˲:ϊcx{7[f[Pf46~IӎECK^MZX胏^8k6.n%r`"k u{ꕑ4J}fqU ɌXZՆF#BP<QFRvcmoE pMЋ_)8,(6`^&:7!*ZB}BŐy t}[? Qٳ X XwlKn5+>nl۽U j8{CFh|~\v-WBN1[^hYPGq[OEv.a3#TZVM WE"PٸTJt9#g(kgNwksU[R_N%[N7PruA3'Ѹ < XY!ŗ =rXiM6TlG **篎vnHFp׾6q}s,lư]vU>%} c\^`YK6:ܻb>k|Wigs [=]n1?|{r_zoPI=[ ~n@;m`?Q@oNL8. YW_Vo84MuŎ];&n6nv:psk`nTLRtU+cͧ`_]+ʔ6K^^旯zeدRj - */.%C>/óO;XlI{vp:qwOg庈V2kSrڣ>=_' +` cGH7|Io%Y6ZPQ/Hdtv+mONGI|:9:QH:NH:q?:RH:q }]$xhD~:ykwCNvoV1Sft'4mv뤮۔W9-~2)k҆-_W6k냧j|eF޴o?զ:v7pNїнցYjZaś2BaLMntZN\y[S=4xT3_f(+Ufm~*uHẰThjpjx&}dXX)=ӈ{U m~!^%ŧwf6Lv^?>endstream endobj 66 0 obj << /Subtype /XML /Type /Metadata /Length 1167 >> stream 2022-01-23T16:49:28-06:00 2022-01-23T16:49:28-06:00 TeX Untitled endstream endobj 67 0 obj << /Filter /FlateDecode /Length 3485 >> stream x\oF7p/+Gzw@ޡ41IhHJQu︿fvtd[h) ?"33ۙYF_:yN.'2tI+paN_Oxh7iWWgM^8>9piJ'{jNޑ7;k-51K6p)n/S;I5ڭ4YAE|[Ep)Yk2tǟmt_fSTd(X#t&ICrd5RBy6lDB;61r]B(T pJRFqh5  |oN~\mz05JP(G/: Utc$Df͒>,)xE< ;l Z=> SR2vD| vÇN1yӾ%C)ŇI1yӾ%Ì;|4z3ޜՀ3(ݧVBHjiAҤjP4A#e4ݧ ;6>jçI՘Hdxʟ(wŏ >se(F$)g<_d$R؋m+ိfXBn*zfm*<G\XXW(U:.ot('aA)\E[%,uy^C|Zeb,֐m~Vqhն)rm8a(kY/޽zf.lP:-G/",M_UV}:v MD^Sn.% ZBXj)%)}]UVfL{e^=л[tnIej@^@1rT+>TizLMSjܰ=!hnm ʁ yUqŅLP ')կZ3G-Qcv֫۞!E.ۃhth 5Zhqӑz@4 JCn2e 8=#l+@'#Ϻk7OL!bG3<b <&^"/{kqH˫).G 儤c#LhiFMf\Rqi/旱A`-z_5OpGSwxvٔUNE4⇩vC zIB)o(XJV{nP=TLJmO6{I$f`P݃hfŐ0fi)~83 J8sMg1Tp(0j<"Pr8vׂj- JYC񴟶N7of<+̇SKdA^=oMEXѼbP1:s8~NB X%uIR_7cđNIj$%׺n\jOCǒ2T}*öy׾ 2KCO滪O0Śg[U,TEN:P-c3`뇖W;ŐF DNimow^ uScrefbw_wE >oU {&KK2͔k(!iJ0rZʪt3mvXB=.@*~ppGQ=a茁)еrݳ?Aӻr/RvP /0vGѻ ƭIcG.r0O Lq&~y|8d>Ts%\>TyEu> x;n T0J.1'Bs^ =6w>tesÏ](Iȣ:9b;CcR0yj7=0Q8S')}@:|Nh:MC@sX`܆ĐtC^ӣKb@y0gC(H;z%%/t8a,mUmuc4LG y$#I܇FzDjJUv裏b :RAԞ,&7Ǟ*lg@4f&d0lIVx&9o89ÚϗuaL>v%&3=Giéd :[ͮn栊zPTwUm*NkN 59 s8h|=mr~e>u݁-$~--H Sʒkh N)wGxX[ۅ*-iƒc`.|HGw\Jn?a{MyRO!> stream xU PSg!ps,Tc$xoFA>Ru[+ (< /yF%A$B0(QAeE@-*>nV-3ݲSGnϥSvdw FI$׆Ʀg̛| L~nd)nLy7Y58fxJߘr1uJ*lJH}?cg~Vr:G8o9swTq`՚ MvJ*6=A 0Y5=#]]HTm ]!T BBg*o@Q|yά]koHMM{~EPPj#FST$VRjDM;ܩBd6I']F?dLsOzrK՘fB_Kt3@:n#I/+{zfQmti*:˦h.U~9 F\mGu/OPx ]O҂~~Rs,"dQ0`> bMO܃'? b)<ۇ_ޗ68݊K$}5MnYRMQ;{֞p|5j9gP@}-+*Pև۵5)|&0@HkN.=R 1LTBIBLhmO7JAbcaO1wVpsWtgg}48Q*R`)m2TRdšmmIP~B#ՅFPLIIm`*mw̟߳4AŭW|*kE$OoUsD'[ް"⅑]$/a)K>;y~Kr'bgt1r l>2*,6X_Z(ZKzIt!Z&u2meǭww8ͨ< P,xK(&Z#9"i .,Op%6RC6:`O^fAABZ>zo.䖘,8E> dSiI:Dav'8ُ/T{7;'MTLPSvP˘ V]t:0*`ހ7lͻ8mIeAGu%0dJ>y=)z;V`񆨕5E--<DZ€Etd −SE$ݧftq[ܳn2( Φ@>0A%fZ~|ojdHahG'mU41K;=DT@O$Ռow E_BU&FiIqV a:mDua=@q&kwow~Y7ǫsѯo| *(>B6*P$ $h`1t\79j,&CZ]Hĺ`(zR~yH- yI婽CwMzuMKj7ENEo|PeY@I %%QD\vz0g׀|@:'82KHT #,8Fqj}ꕉzlUFTN{1g7iYkW"\쒥wuW菫N8LD8I tjYeya<|XsyKl}!o*0LuuP&6Y+N# $sȺ[j+t{:Uטۙ9 w, n= "'///,\4)̆yW MڙmoDI(GL4 ܔCv}swNbwmS,XޑI))d]n> stream xWiXA@L (^YDQ 03pC-\(DP",%n&nIjr[=ce܏Di(uR07&?ecu_[_؎1ǎ3qf23Bf'> ԧ8~]"ע_dž, u7nAMvss3+BWqdJNIVN\Bi\2I[7P΍prJE')c8eBQ8pqT.ŨUJR8qs5\IQ(&Ez"EXϥ(R sJ *b9Sbbd>Nr)jLVQAjVLrb6!J+(2#_ƪco>i* Uk; .VII vQ)J=4R\">*56Iџ+'^G$e_}jIqNs$Οb?34&ࢺ1` Xôe>#9ZR.`T~{{Co/vv uʯPC:~捎'3w)6&@ɺ-K ;c19n'Q}G hgwĿo?z+#%A76V5S+ zRWЁ 0B)g+چPpTc5D/:}V0uKCL LA/]$G/&~;htol0p0pL:2+/ 1ǫeHrpI5;\t2jB] h@9װ=-0wH'bOdgdYI!C+JSW^Hn/5"kOYΈ \UZ[Fbn/w*HTLJoghkɎFfK6IemB}Ef:v1$WLH;$]貼ܑ'|+!'1N+"&vzy*gzjď'"pDxaK<ahKM+2^KeIh:'@Uܐp+)џ˫{`%JbxqXv 0KQ!^hIzKߠ轢ǯӿh$rKy+F!BՌjn?M!ڡ3>#=C!qJ4|KhϷ`ߍdEFڶ%,"$t29t[[Ɲe;QB=i L;Akmr'u7Oꦄ0)d_I:#ksS%lTg]nHKoB;-Ɉ(-HhQF=_<ynx__ cղWIVqF/jxUJv.~:hя0$ oae>M:^TsSܽRI5[A=&н* )@_OY~$i쀗7l1x) oV C޺p2%RuyIzncJ+~rդ*|1Ӯo1`/j%.=.A򔄠 LnoGk˿F*2!⛡յ[OCծ %%Vpx_;_8}v[uHO)F-go6@0W:]I$Uq_%Ek1( 3֝BO?>pTI- d ung˜$i.؂举kSТ30 … ,n+! xVՌ~!~O;1Ӧb-hSNlϷޮ'a#)6sߌm~'wa!f ]%d˅Q("76)#^Nrqҧ3ȬuĹ6[0u~fա1Ruȟ֒݅W!Z23:U DFZqv.hcSƓI\&ߗD`X@C\3̠zM]׷ u21 UV6 ۆ\#z*˯o.< H A o e0V ?7Ȣ$T=9vqO9yQޙ[]~ῼ'X!/O\CPIƑfΚ8/m2URm$gё1ꔎǑ|#)~@c$ 0ă9%[%> stream x]MnP :n`5`MɢAy ,(΢̸0DGmէuUnnQ>T걼[vNN}ثag/5^(ݿ3]S9TɗeUJŸ<^MK-KM'9KgZHNs`gڒ%#4x¶YelGg ,ml,:md 6hBO{!D,c`GXC@SHcHC@SHcHC@SHcHC@SHcHC@SHcHCOS_c_ÜL2*jR U*'VNT9r\`"#+3#+3cI:'hjj)&霤E$r5:{ n8X]N^^vùd kz IhU p! `. `0 BA\0 hBuMK3PNqC2:8vMfyV~U U_iendstream endobj 71 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 4635 >> stream xuWTTW}=`/H,4AaD %RU0"T,kP>5Q&|4ɟZ˹{+P`"PO&! 4~9)Êgң(݅ F~!F:Buh$+wb5@ pZ!24_i4m\3#0#OQbCWP@:@#H0eg2WAAF}ŒB}|B735Z XPxoKQԜ CmXqIh2|٦^߬="0(Egٴ3f?9s癧NLQcXʎGS)jH(gj BR )7jZLRK(Kj)e ʚI͢l9T05S%PʀF H*HiSsI)-` R`-sHkH Z%bXfSǎcX&m1mT3O R#^!%~뫛v!uC^)nHI$uwRS( |?98!>*:yG pa&v>1qZDbItA@XB*D[hxJ{HB9@Ʃ/̵J_+YFځY?:tJE5Q+'k38ohylVDtM€L SxhA€3^{bm(q\o|] rʤɿg֚M n O&5{pxĔ x2z<oaLz氾;jfqN?`#QQ]!h8=  &WVnQFfT0Yb:,'uؠ 7DvԑޖϊFu+.Hzj }TljnΨv.$-L=xG\ӂv@L!gc}r3Xw䰐\P=^@!hoA/NڵS?^y` x9{"yf]tcl# :wf~,OKȯC84ORFL< K/8%̖-_"V8'EfE[dw'(kbC@λ]ŤP=CJav NH/sі Q4΅2#z`bDF9kgH]& xp!%}2ê6\Z\b`I <ݱ|[m)/TadgG5uG RM"1<}8GK;ʺ} 2LP&5^ajޗYkLA1bmGSoP#y/M0F$W2fb2&U0ɑY4o|yH"|v >vS1t* r}HҠ<NfZ쉍t(P >e.Y9,.*ė9+5 @՜D:upǭ"^]ױչOw6/mEذWbw?xTrW+~ kII“= +DΚC fM,b/x(:VL|3g<lA=tk#jλRC~rSxEG[pYӭ+G`t%AD %Y9]'!%ri0ǟa4׬QˡRacrar[%W&~&D%? c-z-C+6("?xx[Z4]K=܊u;_Ǟi3+0g[ Kb3s =[t 0̙ҳDB>DDhͽ5"ء֢{/1;i0:9W4@]`lKL΃'l/^!1%NRK8l N !:ڈHCm̩:%tPo ĤU!v0?xSPs1RX ǰ_sqpC;0;)JLCtl8e6'+WsN\M}<:5N m"\D6~Ct+5`-=;]ӽ|}P[X kϞF.V:O 00g9Vݻojanmc.9XQuToJɉqmӼ7'5/s<'*mDQI[SYKcm Vs#YVY[TK 8sطiߦd/#,c6a@< ε޻-ryܫJ#ݦuo-Q&GD6^/5*ziz>'d<4 2% Ec(!:25|/4[UFe!>1;1uʍG$Y7zG֡|T]q {ٍ4(0=Bd÷gC#rW9@<-3[5`Ea}ć>{0S+1t}Å¡fH%GgA5NS3D"o&I /`s 2.pcn18.ЮݪRW9e9Y{aSʋ e[2ҧ3!+L_A 9KܦITȶeCCCA ,XwYa&e2^dd`{YmmFcI22[3L R*ofwF`gz=glbHQ0U~Lݮ}ϧ7>bE B=X.Q}DJE U?5 ί-8eOJ\6-[C+)VV6K>|?D~Kn5 dg 'Bo<譥`G{Voo=&- sRzq%(+DEn޻ݧ$tA 93Q![1kx&1 ?`\?hX`ߪӇH" 4%BcF0͝S+* JpTra%{v.!Jkp[@hYHY }W/fp .l#oT R 9E_цG+B5h_5zP&X7=X calHa#l4 +z~r<^W37O}ɃՂnU%ؚd`QقZxZ`*9&V 4dD$+eǑ-@#@[!!3/ /L>!).WخS-_3dE&]l u/{n ] =}e;z慗fLڟ.arJ#<' (^n,"/O, Gۓv$Ƣa {v0LђKעnXJ.b;9wCSk[M[8i~6%p2FÕ]˰F"*Oq6V&ʤp{waAw]S4.6 KؾNtBW@&rJ/ dWE{PhiuUBc+i *PvtǭF7sWYu$wYAɐ9 F/pPȤf, 1Ɓ2+I+-90tkB,c OۋkUg]* nr1;ak?v  P f q'c8מ> stream xuW X׶23 B%PEE7ȣA @Pj+ZmТVAG}!`ңU{pzs?ɚ{25D";)D&d(fD$ 6WVď7'p~H2`eѧxѰPb7:?3({]JjcTiӧ;:o<5Ec.%΁\'gf)3r]#)oHQo_V@`ܼ (Ò'].rhtfr8ݣx~8&Q=L-PT$5ZFEQє򣜩ʟARL*rQA+LPnT(NOyP =*C-̩QIYRP)+*RReMP6XʖOɨuj$C`LTLDtDjԤ{8XE|E!S'F$S%E/$ݴ>C&dKg##G>2y#6e6,,lCyϣƌUk!8dq⹥߲زNY] VY*\'Δq^)4RJFwAPsx# 'HUYwy=ݽ6*N 40Ҏ_oz!Q!1J8;-#=بAnFw[nCWm`okUWoC晵LˣqR31_"7:\E5ۏ+RQRIŒC){Nn>Cv>?-eJ(-/7/GybI@]spٓpNi0u-@<]^=RO] jB6WjDub pwQcw4 -L OGx$u/}"NlY1CΓx=Xp-00kE'dz\*WNj+6=cƜVĂ3,K0ۋbx46[<\:趴,fVi;3?^'~f iPdPd8LOӺ![> L^dpZwkD#Љ}D(gi Jc-))BU F&mv2P㹚c~~cuJmBkVxҶh9J_s4!?~/Cy uMXKfr;xVQ_H<`\<9 G]R섬N)#T] {z}:m:>Z@swe<3ȸߋM&umCNE*}JJnƐZ[C_%AcG'=%( U!G+0y2,BO58ۑ ɓWɰD P+i@lƇ6 jœ"/)UEs95b;2cy J XIڦ+Q|?GZ~}},Deq(s[qv5"64T*_9Q}7ɿ|0 h&cA"%3IM0"Ts Xlgq* B8 -/ T^/n!h);07gt [, kIjpUnhage}jJC% 6$9cH!)g<$d6 #is7-,IEc?B%>?9_;tW P?E*? ^q\mAMJƏDlLݝn|]2guBb]u;`Ӣ BGHwjZ1j 캧 N#'; `&T0mheJ0F3/~*;' ؉viǓm;DZ}$MQ!YSgsY1b} +{̰6h\#IŤ᠈.<{¹C&“eEb)C4ył+fˍݿF[]b~qIAM0n+fǑ17\C'.guu~F^P2ZWum_8žG;v-KFn8w},0nQn#^2ۍ%/h[7dh-;<hצ}?V'c:0t:ޔo{]奡hʱ 9BVo?s k֜ ejagFL)#G+ףx#>ɑl櫷V%CJ8zii^i:g+]Njtb^J~Z/^Htw̾KBVӰEEIyq(PjC7)H4,2&)I Q?Qu{.x8ƭ:>+/qF-R,QAfyq"TV, `*v~VZ?H0;6ʠшKG`6ꆕ@MR YM?@\'yM 1B$v4D}:~$13ʣu˗$v 7<_l}"gxΐ҈o ґƫ Cx=?$J2_;̟,Fz8P #ۭw$`~ޮM ~QW&/_OB(n*+=t[T.v1 TN@|I ~#*bТM+wLO`Nb{ b{[>#Xb.b$;ٿ *} "2Er--hZ-:?ub8BPxظ\gmXK4t% y_dk 44}qi:f!ҋì~8.>f)EbVAyyK󿾷WCP?@z13o~Se˘\ uCε_#W9~?w_f#?֌؞[ޑW(R.˱|ˊ,Ps2m)ˢ]c9"*L jO$ 6W#?mӏb~ޞx2-]v~Oê!V})'HHyq+tҔ%aӽV'N_ZY\7v3c7)O@. /QNHv̔--JAjg~zWjv"Hͼzb`0rx_ Z/<&Skȹs#]=o޺5 h{#BtL`^AANm{ n]D;g( )BF6!lHoެ`Jo8q3 ߱~%Z:0jNŰi*QP]}$$F},,D<0c?p*lB(W:le7"-{a,_0gܼ|EH߭endstream endobj 73 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1853 >> stream xekTTνF͠A1(>i_E䡎@fpyzTy8Z!`jMS6VZه> +kCvwg òҸK~v٨w>x <~(̸.`RcY7h9XcKIظEhc1&m))u1>9Πצ- ڭ!&QʴW`4jGCӠ.5 ~V^QIU1 sf ¬eBL`Hf,gV0e3fƍQ1)FlgγSL\.W9_{W ڕl.-na,Ce?]Yx+j)o.=%$R2a[i@N.4ULs#{Q+xZ7{$ \&sM#d[o~o߂̛̖ˈq׭Xy<@m8 ) b%=[c%$bVCp#ȚY|tq_,|L"mF*`-W=u稩tY,>FKƄKy$]$9kx\=Tl` ˬtVt#ղM˭]1Ф ٿմ->Vo}7!ZP]$޴p'^ !Ⰴ㑇#e-Xv鱾'OuFsXr&<vt1;b?._/668 4G}~*zoײX[&H8p!!&w;QZ}ɲj OAhԀހ>cҙZT.L\g4C!C_uw5֨RZ;^ )#1H\hxŎ%,(`"]7%-;H]˟OF)Ԥ'C{&qXoWč[dwò2(hr%#+ƄȧÛϐht"nDYCѿ蛱+XK{"@ᏆjŖ%QԒvu)PD֬j~T AG=:;to dQ ar/1"90Vv{Xz,t@RL.o{xyM!aÇi;Ipy>Ym_,%%: CyDrz,So5&lѝKl|ޖؼYRb0VQ2;w~ }FKY{Q i 2o67bQsCQ~2T~ AAT:աڷ5m Goh*9bdWe~{aKV{9#9p.I.#?WlS0W[Sf E>!ל1guPõYӗ~dGb+ ֭FxeF5] 1˨{(G3endstream endobj 74 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 5686 >> stream xXXT׶>b8R4Kl@!A (Їޛ#vX5h$&cƛܷNỳ{s=f{kGD[/Z&\\,L i8J8kD+l2#CKӧ0N҉{%6xy/Yh}{Bs;~A!~>n/4A. 4wv44wea{ۜxk[8<(je. 7[lBB#"D??`,t]x|+Y9c՚yfPۨUvM}j&@͢vP)GʉI9S(+j7CmR֔ Rv2j3ZAS[qZj<@M,>ʈb)j %RƔ eJ)3j:Q<5KK@Sq {MEVq"A(-{5 1/ڌz''M2IV'=gQ}?iO4`*55h!&MRM)ӭŦ_01;ZU%!jm`XPJQI\EvExPmtLG(%y5&r E"cQGmȋVuoxE zTɿ+Q+.)6? ;CQeiU&C1+ҿ:vOd$ǪQAΊQ)`)]JV|wkmyq؅KA8qHפ@;,UFM`-ޘ'Q,Jס Ԡ.ӬOoб2_xzeP]Ze[V#*h0aWlML\g%Cb!(; 瘼' UHW{5Īj 5R{{uխSQsok?s8k6o@|Ӡ(p2i6 n <Cv.&dZ{_(sh2j_UjhP/ϱ>_8OA~|FMt}qdPWu@$vP:1 [kƕK謘VtjxI9jJMLI2PF̷y.`) @>a*0o(S< 6xrN&#D?,o3u:G{K7_Z G_ QpY ˖\laAyȈ,ƏDy $QǺŲ};JIp{tFFœOtoD$<` ]֠%TÞU,<~rGmu0jX}Z`- lp5tEUCb9l 4 ;HvTKT78f$GZ#8ii_`JؠoG+YSM]MXGi;bdrḀ o 1ouU;}4 e##7q>$RߊڃpfP@_E@sQܬ)&=./64;$ #yaE$83yUd5C"tDI= 3}4ڎrIp>Ӥ> W* 3:KnR_rÓ6d5*?B-&*m9LݔfdY(IASS(4 `ҧ(4 vt–̏29g,T2=+UA#va?7`(M}S,K<ʁ0Y`7HU>t="WfsbӣRQ[]2q#b&}P؎jxR o.FK{#oNT]u2mI` c/<3C )ٲ*y(윲^]@-أ2:5mdƪ$P۶~|]f[}%zoZsRől=众K@0/XP I y~a[wlYtp}`>77?U3ղаX%?'? =Tk{zB2zFwpAtJ͌8ARշ0\Lُ60=P2YI4!Ц*#5dW?ޮ)a8@ʨg :^U(^{kj﮼F\nmm.DXOZth?A&? bB^ݍ_@8I^:]Rxi#t'䦒bB*#+Z{.%mcV91~6S:l;ԣQ)wg_]dHpM%:J*|>D_ӊ(ɻ oU34[|a9(jr zueVa(TēQ\P }.]txaw֮v8`kyd0z'n%:ػZqlދxxu3_?Xɱ+m{ժk7ruV-~gE/ܒf)C(0!۵(cÛ 9V*+ AVAqnkFs[ ,VY+ %wbEi.OZ7gJB^тӓt6{ШtqQ<_WL^yNvI+$(1 &tebb"C#URǶ%h //Vr fkL$ak$Ee)9Qx?)}`}yQ~*c Rl 3;ws ט[]=DӘ?>EobdآtVbQ^NZٞ&&X&9/r E(VU;A㎕)5?9y5Y9*G S|endstream endobj 75 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 681 >> stream xe[LRa⁙pjeTi=KC˙]VG9 +K 2DE&i-tJ3kҪ֋=vz.[~۷}t70 D 0YГ8է":Q.ўe7VPVABKZ 6zj&*\ЌԚ|NE(Gv&NR"rJ0F-'%BFKR*JBD@ >aX#Ba)Z̳^*e?f񢿔ZxC^2g#cb]}} +gPeLqD}H$7lϪXA6+ٗ2%Bx xk6f؄'C;bu+c@[D ~쌵ɹzY]qU ]FבIR{>AIo]G> stream xV{PSgr{yh+l{cjngq+Z o!$B ;@^Ύ Dy׶AZ&<^bYiceZOh4u`2ȩL g5na N:uzDUG}W{5~F/OG2_lr; 7N tɵZc4%zgg{f"k)fEѺ\I(XC~ qݥF(:EY6XJȀ@K~§)A6CoÓ`,14JrQ) 2 YAKڸ7HR!*jYȬ&ϫ 23=x&mZ\Q!ёz|O- 5wUcXRRjM%Y"K4(r da(?9D Y> bdT*C*X^ MESCCdW27 tMGI?}\CjR M6G3A([:^m$NZRl9֜O:uIYUya8a$8fzVCM4<["R'k^++{zCt <>hr,rZS]v'3 1Y.u|'ɋ<*pe<"..55tfr rP: NOsXNqᡃ:ÃdpX⼋Gy͠R|<mG}Vg4RYY 8vAᢴF T@ą^J #O ygZT˞p^OZ:lm1<.cQY;iD xa6wPa:: KǶ0iyA9vx F~ZsWd9>{oL1]'n7T$Kg:fvx8{zQQ(JCj*@MVO{sgr^(05|{phjye ?va H0҅pwP_DwDzJ v*nK&|j۽=)r+~ܻn <1*Y7Fr{sswϟ8r"s>&4b^k%{>wjSMFjW -$9z^_Z,T9h \9+[bJa u5GI}e fB8}^;1o~^2ԃt7*';^i@S)yQf@8|c]W` fJ*HlCNamA5Ɔ|f0+S*l!mCMT%YudAAIvDhG]2I@Fl>k3wlKQzO}U\+pi6;I飭`Ioҁ.&Q]dA6Cf3mf+=Ҧ =3L2"wls,j6~vϯhitzTh[kuI2iAomV^G/hk} 'JE5 l⧾yj.KR|sWEg0+vՒdP~e{e!#>? gG0RxDnp %D'腼AqWyaqIaE8<2!73x=21PvTx($ (Z3gG#2Y6ڍ͢ Ph7JCo >®rsL3ד2ͻ>k>askypIn%lkT(VWIH >YIeҙrZ'S9Ρ 4A.jhSW#c3175G^sbmf-f=~!Sendstream endobj 77 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2870 >> stream xV TSW~y BAJ U=UkQ\Rw-.a 5 ,AwBY&,AvpAquXb[%Sj}3sfngΙ$ܗW@Lr#]VI?/xZ|63wR.zS- s'LSg w`[mFǥJ_7oAp0^$KHWˢڔTY"] J'SJձ1ۥ[6-߸Iq C~SĐ *&,)9%5M+fDėC w&b3Jl';DBG,'V+ZbEL!K !B`m[<%RhifL/)Cή_ $9 KAb%--\wwRI*.S4HFJ5'(;T{_/zZVqPj.mGJ;qvزތ8*h4P&.{ց%F}K]G +4zymA"*7Rîm&4M'{;KW?gL 7Ƕvv(cOʤH. K,3$3k Yf>ruKUDP" ! Oǣ$bh8ᘫI.%VL브|ew>R=eG8@SOhek͕ol~1 EYZXP?1yHY?M߆a5w`C[@2a{CYfr؟rZ4\&lv%H|Ca;X&Lƻht1 $Vj@]EEmh{>f|$Yhf B85Z@)Mhtˋav ӸAc#mJ!:l)IX+͓dK9gfѸ`#}}e Zg6?s Riy󚡌hڽ_{l4N]r0V[\ G.^j˕/.]|ǎ'9X'mK/J˧vJ~D;& U/ES|΀3nfBl1O~t_)p>ʹI rħbtmu_j:g]r#X.Zo D//[0&FeҀ(+S+EԷ+vU[p ^qw{ug}2| ZAAza9jC>_GZj"D -՝ ڌ"ދ9~L_^Y$ ŗܹajZ͌\__E\~<v_v<.yhSgQPWے MMMI Γ yX&?5osO=z"]:bɍW%PM^^Dݲ8U}|}!>\ጦ;gxGfohB GUؼy7{:9ɕ p&;*Ša_e1zksb3~5p ,RнFnkJ~d{٘> stream xZn6SڈAj,i3l{yS%u2' ,~MB0M{G:X&V0n8Iy^!'v;g \c,:8 =15yPjY&$pX|Yf4er8HRI%0aIĒ%iyS2Z(W A YE3k| ,MAƙ!GxКđ )VZe 5KZ|4n1/VF7)%.t\zTBV07]XL , 1h^1gH[AJ,Åd T;\r̍-+m1bc \6t}3I]y$[_RިDqd-+DP0i?PQ̡-J.xRSpHMT~ (--_tH-%Jx4Rϳd;%#dz7Dm4PLN;Z=khml7)瘑X껉otqXӻe2_Xo=Wj񊵆ƈ(ů(.z6ж&iY&V i#!HP̶)gEiBE'pLΞN<7@w [<IK?" ċSei.]u@D=uYuYYGRVBc#o^?_sHnX4DCFUE3`-ٲ{eqhX1^#|`̋s2y'\9D@3r(XH)t LowO®7Tr$hnb}BMrm;2`90g 4"_l!veOoϛX' +!QM[Os%hmrq3T[cmt+R,L}g CrԧJvr#1gm#pƙ|2U@O@%R#5ܓkhZ 0U;/s69r Wm"hQ.4.Č{m!ebj͞9]riscEׇ!V" zQjn\ЫK#oh!Hctv[v/vfXB"ܮ}깿h'(j6 wP~* !`"&v A  vˮ?u+!;6@s"?@VѸHA*Ԣ Y28Z)+1".%]&ӫڮX`cDgC>%AyJ >Ɲ eL_R"H$Wʟ0vRJMyh淍GLSo{endstream endobj 79 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2090 >> stream xTkTSW!ε"hb$wG" #n I̽p"l <|"-Z;>kuFk,.fξ(s2ݍd9[rxqݼ0AF\!4'Gbg [:i=%<ýqJ$G/_Ǵ:e}̙d.Y";?44R!l8'YF6ydbqͱcW&Yz}3rb3u|g@6da lɨEdؕc3'.?3@l,(rzV41Ðw'&Ț-&5 a"K2ƆG>G1[' eЧi2%%$Z"7C;&0DQϠSɬ 2æ4<dNjaLK\%1q\ϥv_JL8^h?|u#M5h+Cvr@+ R q0+Y8宂ťYZH~;|[Iu> uɇ]Q v_tj[g}~QGOέ36 ft˳'uĹ>Z k|da(n3v$#yd. \g3:z:֡> #ˠ1SUw:J]ekBxBr&.%{ GO7V2:_nJ5*hp]n(AE(ёvo'֙λg8[uw^S7>р1awEiESzXC& CGӽFzL>ki PZrZ#hU9`/l:\ymR9RhP3ƃÃevJendstream endobj 80 0 obj << /Filter /FlateDecode /Length 1913 >> stream xZYo7~ׯX䉛X4m nZu V@2G*tEGhoKTdWr=H+~s}3CR6#fĽszUdZoiMn,3JE{өXs+386Vgi]} ?A uJhu,zNw%#-Vxggykj^of22mNf:Ηb.FVfZ,CArUnί{?t(RJ.:&j ey'BSPe)hThUg=*xrd aAa]F`JG/Yq/;?>T6b/L2l)j cH ^q "B0ɫG}4:WŃ;Pt?a K9YQY@C( b(BbYΚGKvYB -UR$2 SjAc1PFnO-{KIOR۔Ǥ2J-d] RVl8 u@W Xa¨ ʳ@_v<<`X`,"Zf4ʨ,5֑VX($Ž0!IF`!;sX:U=9]=):6 IL~-\ 򓦼;,0YL;CHÅki.+}Tdw4cw5Y=\aRO BLJ"QZ|Y}m )i =I}iDvt L͛ *`ݒLai:lULG kQvtTtMZu0α3vXLTǀnjЄ}BD•./hx/N1k;ykN2gsg $ ND՗)N/dc]'N7yyܶ@qDy(:?az p[mi$)kb؁۵WNL1eX@vd.)ĻK+ L1XC<ڿwovj&1+ai|ęZDbSp:nl N)k6ClMa}TB-MY&ފRcc&-calR0vw~$<*obĹ8Pw=d|\ m׾j-*SEׄ[ҕ}a%F 5mcϵTKmU کjH^;UYv#%cCōtm\O}eiqlBu-oR $+6t+k@fL`*sdQF,Y~h-aU7]aFѪTJǎyx̞Il>UMLa37'ε@4MU1˫4nfN8M=o/Fb:nH)bg`^Eя9w57@ciPIFv3QrhAfH$词3{zɔ}Fendstream endobj 81 0 obj << /Filter /FlateDecode /Length 1987 >> stream xZ[oE~Xi\/"P T%t3u츀f;yL3ѬszɪCIUfh}ч;XhN-?fw=n 'XYǝZ-*n.WI'Pz;p{Tݲ =rjQ'W7N q-i=j"RrAc"/Fż^ fЬ9ܭ>Ȕ*4 J4F{5NiL)8^o,3J%h %J@|3&D2=Ɠ~2$K)cyS6Z(b!}>fIx@A , `IA53k ,;>@%8А\b \WwU?|_4XS%2EA$ dY*`p1Z.X?{8q/>ajlZ-φkcndk !sy}WX*VJtU\җ3a”C9YA ,/Pb*a̴*M1occ&va$u$dϒ[|dXXJV1 *>^x6DEϸal114B=".{i&К XawBhEh-q4hhZ?C$\d(ExW(.=\(UPceieBZʞ^BԡKYX FWyR]%~hIزj!8Bje4Vϋu9rߑ7tͪQ^\Wpy ^,YͶipksZ7H;9\R%$'> stream xZ{o6ߟB_t<.Ҵex[;\[ TU>yw$Kr71E&xw{2"F!b'=jbU] —Qk8vqȨH5©pK;iɣG7F1>1ʘℶ/w[/G5JP)&U"U:Jhbs}sCMNP"\T UPYadyh$ <ΑfJTP9 XxJoW :@If)X)vGq<;燇,]^\Jd-i'&c_N˂%2?X yo_~w w ;F]ɛը-Pf?>Iu:mw~N)*9(8_==} Ft@ QQS`ЈakjUnnRg7F qBxm̆p*bd̒WJwaTVLO<De8F{/ ~7CT)*Z5^#[!>FGCTIghhPڝ ^Pt8:S!K{,(ybBX\\Ar^Mܾc)S1y`= B[(\^p3XN[T^ HSg7/<*4@֩R쓊XGXT$ʚj2M>m#3T჊LT@yiꩣ`uۡ;bZP`5h+8=;=oXtQBË^G~d^t²\񨞡0uk&*q`?PM]_z1æNoo6(n5r;jTѳd&9`3mje&wr@4fS,NC[_ ͝Z +-ҥJPx ɪ,wEl{ #1O]cu9#zdFmP5382L }@vC^L|\ 5(8mߎjh?$Z{ Ly :ﵼoaBC_U]4tlbh$pmշQM U ;ҡʬ$eл67Sl1;94ɂf/i QD&L#B/i2_&a# uQ WA-5dz=dp,tK2 If ҿpa\fN2M\ݯd6],rڳ"6[D:ff]-˵PqL~l؅[Ji֙u (坹 gs_Wn J]u|^*yd^?/OV3qG9fnY"FR\+ Wq k}q:% #t= ّ_I2tۧqXƕ qV: 2+NVoc> stream x[nS%x.:m  Uih7 IiFk9Z iBHqdٻl{ߓJ`-3M Tdp%˨Xyl#jf}CmG0]Hr % 5Y`kGO;\x<$/L?M}Ӣw|}ze8 P`Kˆo{jh& L`ce6\wpgP7  JbʆLL@i| {v@"3@AW wNr7sjƽq:VsyAD dq1 Z#ؓb[T7BrH&a?pY7YfKB„F* 3Pks yy8+?F`c/@mEPlc@s pXҧLcqMR@Kȣ&>&_.`0+4D@yiJ%u bv6ng~%PUvc(U񥉱iJLVבU $DSzךUexV Y+cڄέ\ewΗOy-| Bņǧ9JpJT1T8IAE Ph)9TB#UHh,C:3 z HU- k2~XE蕾#4go֫|E[0{̘LAc5 p%V &XXX{n6w}֠^m 4Y۰mjzNj68x#Z?pF)eQL붼ICd9C `K=F%i|SFRRڟuډ?)U9@Ƙ%3kP)Dɥ:'Z[Q!d4ڢ}ׇhu]%'-A4&j C;n΂Q J`Hq_aqͤόߢD2+w0skcXPZl@m=çx!TzoqOQt!4hZ@G2`P3CAaƠoozupmZ.svR ׭h_@#gu1R}hjnfYB\1XVNp_EݮW۲x_ P6_i "~{qS|ec S ˓UzH=bҝow{a6V|LE)n% Q{΋ EoCA,IRk4%2z>ŽvER`7p?tt-OX1" ֻ[Xˎ^*bDw"8uAw߽aT+\Ȟ#1ɠs}&ui.ׯS74ϯ Rc8ٝ٭)xI6)ACݼ, 8NfU] /X%W8!كw4ԝ9&'ms\ڤhzj Nwq or,rhcrwoÑX:1ro?)| GH*iK[;4nGښc$^#^J@-;f- y;]_~g& YM*d% \i U Q(2lj%k k_0k6RnIIc ݺ[_Lgm> stream xZioGίXӐGzHmVjJuP[ "@8j3gbKH׼y0~ӛ+\oz,ˤ5Iq^&O4VzX!6ȋz35^PTYk55d ud8yn|Oi[r.lulnrSOdy{fiy;YOMZdhTk͓eornU&B8* أL[ ps%rq5mr.wc`v}Cǃ@S3B)+b $X@e`}=]:«x=fLV9O\,91۠6Pq9OZ#tVT[ACAB8O= ̂eL R<\sO2J3a"dVp}W%! p T4YA%y|{  <ô`g,DCU+*$l^#q嗊FWɓnʶ/_x,[zJyجCP)A1#{E_4N\*`uDPs9+<(O `d| cvRX1țpD9MDt{-thq=@91yDUD^D #RP'*"HSbR8(s9HL~P}fq7F'$SS=S멃kb Ή ves}o]k9~ҕoM~[ 5_n e@</2oBY'ܓ88,.;U %}j_Zzf\nr\oА׬We 1 ̬r"]-&媏}W8J,]a4MtQm kujZMBN*ԶAZHŪP<^>:. KSʬ,6ߤgfBLJGWXY-' V57HU؟B$> stream x[nG}W 4LV/uU-`@KzŋT gl7{d7-*YA䘬˩:ۂVP9N_f=x;PZ -#N E/&QWUb1揿0x=.+G%%NV$ #wP!˱⛝ !,Cx@)'n/ao,8_?&o@KA ~`6cD`\RY/QQ$W|}zT-P0CAɸʧ`A1'1,be-̑c.4@PbUxLД!ִˇTj)HT|WHX6((U\u%Z@/wܙ1M(K4]_bWe`H`s>Ӑ93*JؾԳg<| _Ћya$ltPNQB_a?Ng$7N߷.#seiCM').pߌ@UcqAQ;eC }FYޣ9\Y>"gUi$wzT;ȋJsI=(U[=Z*g'5@/r7H&Gjq =CR٢ 腴4 t-(CNc[4hbjgd)3ǎW/">Ş&F8O)Gt|iXE87wcOıĞiXUtecI8 'hH}9vUec8eFCGIfc]Vq |mmiiT.Q;$OEzr9Й2u=:wGԷ"]"9Nfiݰ~ر~7GF5y9yƒ1gQe%0j5SȩǜRr?LU),haͷݖYl;m!ދQC/X)3Nn/HUӌKe q\T}:f0{f0M t` i|pj;@|G~]珹caJIKx[2!F? إ.7tRrGÑe^&oNWדaXbMܯg noO9>lىUng?)X2HW8~_xylN 6*ͦ ;m*Wc(nlgendstream endobj 86 0 obj << /Filter /FlateDecode /Length 1695 >> stream xZYo7~ׯXhirxM\-кb l te%%ýTlEVzE~s3y1#IDn[o[<1*ipo4D׭|'+ j4i jΠ%kh:LGwBKu7[5 u8Qp%fô?M՛L]qkJ%moqMN۞D*T] ,s%2\!-NA={( QEկ֚HIБbBQ%"6T8Bɨ!(.adhs]'^E7y|*GIJk3*p%:26<0&wnRzKɂI 7!ڡ~ J =`µ\07)1RXWh]2|(^KAAMUm5:'Ý;C֣bo+qY|TJ7Ϗ(+I)5, vmȢc#ok(:\#3E Ѿ{S:5|ɼN)Ko}U(4v@Zֻ[w$tz>4%&@͚,aS"Dc6ūr*WQa)+`X4XR (CBo.fn,%k"6Q/ d=" Ou|= ^qVkF|.M^n^^bQY+Ɋ߳ë@?C6d<M^o˚EAE P@ 'xJTxk(VRm7]2.5#nXqi"Pf#'u 3ְ\w7ki9 ";(%4mcZdɪf,- (ZI{."Vnϼpn?co1(gym!r̼8 /4EW K&^Z<*3/dTFq̌(-|.(R/ltnr5y*қbLLpGŶ@-i_ XEVr8.ZOp D*":dzCva,>RT2tK K>Y%'ݫ%c>[slD W ze?endstream endobj 87 0 obj << /Filter /FlateDecode /Length 2474 >> stream x[[o~ׯ 4Z_ܦ@, k8JeIMmF{{ΐfTq̡؀d:ۜ\0 ?wriusOE.ьYh&5բë,Vebc[e/nއρB+Q9FŨ,֔NZU|@Rz^ <i>xЬ_wkЎ;zDqW FVp* \ޏH:δ`'igX=BC,@rLXnEzfLLoH`:oh4;'Ahᅷ߯τ"u M8 Jސe*]J*}P[u<"C2VV)jL*q.Y!!Oi6jnHVé)mFVcvj%<FV)S{ۏnccagqPGˋf5zB,uIG@=_ ד8Vwdr{\Sƺ,|p&KrQL*yjc̖!>uHr:`"tw?L_3#C(ˋk=NP`*"'~#[)VFZn^@7$h.U#е{aFu<O3YppCG53y( 6&v}1BC͕ ͱ!_ D (!TK>`7]Zs;b2ˮvJDDZ09UUw;Q}G{T+QM6A[^N*BL;C{Ɂ2 g*61n(+!"С+/jj@HX h&s]t1?$Dt|4ÿ\+MBu޻~>[כxXgthl2PSkğ_nw7=j&9p5 l%(x~"78TߐWؽВR@ ~&0$Ek IX`Pʈapf@64 vh,{lKW n,/iuXm޿Z =I #t3nͤ͹&8ys+'o!@.TgU_7BjoCsw:Lq㥪2*$vnpfOn}$7^npρqx<' +%CD&Mn1|l媭d"l Ouj: lBD1 H]x5sp,> t98+W g䢺#,Gtî"ݸN& FѵSR娏q^0?!Q@w强?E4p8rE:~S2bnԞZR(bWAE~9<nkq!/0er. T[d8O>Z9f<=99|L?.V'( Jo{%I+>&4ڵM\jY#cHPn"gL!P M`p  kg|%cjwjg Zy-xVjAEW`\rϮ"+bo0Рd:-l*xKEi"MٴFcH_q/ȟ (q2)gbblY&u})w 1_'endstream endobj 88 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2961 >> stream xUViTSg!rUJ[T6Ϫ[ "*(D!U Q(  -@."T-l+.zw7;yfgE,닝`[7Bwm!n~ =S s5O7mH3)٠[0Sq*R"?ElkIDW\;y >,]z(=Sl4$␉ppzE s4F[ޟ;>ETc$EO9t(hN/T:rh m y {󘼃9H uDp#3h,7~oMb Veh] zYP-n{7Ja"ݑK# MxJ]db]OnniэJz} 4!,쉭ɤt+pݬj!0`k82`>- *˻I/xqRşU<2Fc-PߘOqGxYW xj AoZ?}l}=&o#U;+ܻv_~C#WWYALЄDV+غg;P\ԏn絔^VUwA Kc<Uu]m49>.njw}> ]OdJlb_Fa%z 8mB{/FwN"? [x\vD;c72MyI㕜z3iBy:dQ v <vVJ sRܗӢCO* ; ;!:M..#ĀZ(4u/r6[(3Εfu3=-vSk9=>U)S%'* jL4P y2ˁ-./(/唞n<*봼6(iY-RP4'5̞hg&3FD3y AA뱲% >-ɼ,(~qOQ eu5}<Ad,&*1|(x]6;NBV- Po+i^Tq|AsciGhx8d-nj]hcRm켃M8HKR I.u5xB7p67VsñŨ|[1a>c1̤Vw5~gdHM Hƈkwp W?C ؝sɣ»Vz>.C3N;y/s,XLLw#F&p`eC`BKӀ '5 z\ז`u1AsUְw&]v,񪕨&({up+"c,yϫ)H'bRX×n Z;9+kڅT F܉xq/#v\U,߯sw[L1{MjAbig5T NK_߾:AyG/LiUGNk]@Yo5_*l^uo6ublDio{+*1G%Mȿv368Y[ ns,TAtbp*}tdwB> stream xXKoFW%R0Ѓ&@MdFbdHt){;)EI`8vof>cg u緣f݈eYg~@R(J3+$ufbQQ&$wUV#?SnQR{O9y)ޥcLQ"e[-Oj8㆜'-!q&1ð m@f OnEZ5gy͚ 5:ɚsdsSnVE#z]dޢCLr(6aW.;.U9lyu_;:Ia>P^!c\T˨K1ߦ/ÉgPqpX9fK m7gtrIE^X10M^XesS[l%"(<(?W\pN tnF\2}q'<^&Wzr^rNPr&ɧaN{ԎLjUuE ^X%Q5'uKZr]/M} ,.`c=:a!ӧI#T,JWPP>ο'.T h-S$WkOd3!ew L@T%$͂f"w2j,uxiP^PŇ"i܇ % 9N` ȜHD `F?׀_=WyUگ~\5cHF(r ^`ޯՁI[IkHP1@;8~c#; tȝB;s.:#J׌o|()xu_~R:K5##J&Lsd7d n,]`OB:a 8IM~ D5w[䨸k"GC"!v* 7fxV㬄$0ޮaxmڦ ΡT[wRڇecސ 缀Y.(#}zURg2^sؔmUȀagBJp To q&ޥla*ʀF"fQBXH4GloT9Ǫ<}̜+t,ph|7PjL0Pyq]x' ; x`"83 ¦Ȥ$!ɄL:-0i~-]Z|1Q;BL8 &,`6=F&$`yW_NucȃM=@w5LNt%3&mPhGA/NY ۶0}=*?LǠ*aQqӯ6 {9Z^Xd '2<-i #Zԡ,^Q-t<'>nĆ)x)X <jL0 }z? endstream endobj 90 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1769 >> stream xuyPW{XR=1!$^Pc!x5p 0܇C 9880a5VzhђeqGK7$u R15m"FkS?z| HKfh7Es"~ .;n![| ]H,wA`;!'j3 S97oEx\B6_HT+|a3EFWҒ$Ebm{;$]KHL6$("!ˆmD8A!#h%ׄ'Mx9Rb'P)-& =q;< M`sALo!LrvKx- 0b9_ &E UNŭ[ӷvc@ܟ9s9OOU# m;#Mh7۾ydL-40 CQ؅59(Q/K+wA*YN0p#wvd J @Gim^\|A<> NvyvOmZT46V0r<yw ˵Y:j0t6zPv6)U؍˷~m %m` ޖPQI,BubAlXA3/5@JKQN%Sx8<QM}qq?@7zC=l(Borw%ۣ0̭`\ϋ^@Nء؆n!LT䉊6 ,Dugdx\SPm?Lt5v_0 jQYmYplӶ[vFr_>丙,M7 @%?t:*eV_ $C`[QD^#U7|ܪ3tfj6[(80n@ 9Q;>E$*F䬔tP!6"3j)(EQ)Eg`wXz /x xK`au6U0pxtl2o7_ħ. ~ߐzt%C=M LA4';7syi{× LOn>}:vݠMb;!Dp20`mmfGB*6IfdkRvգ4^wFUو>R fjh0y-`l*8S8<`?~B١J Z[s)-60P5leT8$=R߱eu771G?{{ںMzN@׫c趜1Ou9Y`gU?*^9Harݾwk>xw W^ї2>ݛc \Nꋗc/py> /W [ 1 2 1 ] /Info 3 0 R /Root 2 0 R /Size 92 /ID [<34cacb89d1418a11e983af65b0bbdb92>] >> stream xcb&F~ c%"sWdb`} Dg@cL@BĽ $& f/ rl- @9b-^ mX3 endstream endobj startxref 64826 %%EOF RcppArmadillo/inst/COPYRIGHTS0000644000176200001440000000114713122212566015401 0ustar liggesusers Overall license: ================ The (vast) majority of the files in this package are released under the Apache License, Version 2.0, January 2004 (http://www.apache.org/licenses/) The aggregation, integration and packaging work is released under the GNU GPL (>= 2). Details: ======== Files: * Copyright: 2010 - 2017 Dirk Eddelbuettel, Romain Francois and Doug Bates License: GPL (>= 2) Files: inst/include/armadillo: inst/include/armadillo_bits/*: Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) Copyright 2008-2016 National ICT Australia (NICTA) License: Apache-2.0 RcppArmadillo/inst/include/0000755000176200001440000000000014173355571015416 5ustar liggesusersRcppArmadillo/inst/include/RcppArmadilloExtensions/0000755000176200001440000000000013563233500022214 5ustar liggesusersRcppArmadillo/inst/include/RcppArmadilloExtensions/sample.h0000644000176200001440000002241013563233500023645 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- /* :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: */ // // sample.h: Rcpp/Armadillo equivalent to R's sample(). // This is intended for use in C++ functions, and should *not* be called from R. // It should yield identical results to R in most cases, // and stop with errors when results are expected to differ. // // Copyright (C) 2012 - 2014 Christian Gunning // Copyright (C) 2013 Romain Francois // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #ifndef RCPPARMADILLO__EXTENSIONS__SAMPLE_H #define RCPPARMADILLO__EXTENSIONS__SAMPLE_H #include namespace Rcpp{ namespace RcppArmadillo{ template T sample_main(const T &x, const int size, const bool replace, const arma::vec &prob_); void SampleNoReplace(arma::uvec &index, int nOrig, int size); void SampleReplace(arma::uvec &index, int nOrig, int size); void ProbSampleNoReplace(arma::uvec &index, int nOrig, int size, arma::vec &prob); void ProbSampleReplace(arma::uvec &index, int nOrig, int size, arma::vec &prob); void WalkerProbSampleReplace(arma::uvec &index, int nOrig, int size, arma::vec &prob); // Setup default function calls for pre-exisiting dependencies that use NumericVector // No probabilities passed in template T sample(const T &x, const int size, const bool replace){ // Creates a zero-size vector in arma (cannot directly call arma::vec(0)) const arma::vec prob = arma::zeros(0); return sample_main(x, size, replace, prob); } // Convert from NumericVector to arma vector template T sample(const T &x, const int size, const bool replace, NumericVector prob_){ const arma::vec prob(prob_.begin(), prob_.size(), false); return sample_main(x, size, replace, prob); } // Enables supplying an arma probability template T sample(const T &x, const int size, const bool replace, const arma::vec &prob_){ return sample_main(x, size, replace, prob_); } // ------ Main sampling logic // Supply any class template T sample_main(const T &x, const int size, const bool replace, const arma::vec &prob) { // Templated sample -- should work on any Rcpp Vector int ii, jj; int nOrig = x.size(); int probsize = prob.n_elem; // Create return object T ret(size); if ( size > nOrig && !replace) throw std::range_error( "Tried to sample more elements than in x without replacement" ) ; if ( !replace && (probsize==0) && nOrig > 1e+07 && size <= nOrig/2) { throw std::range_error( "R uses .Internal(sample2(n, size) for this case, which is not implemented." ) ; } // Store the sample ids here, modify in-place arma::uvec index(size); if (probsize == 0) { // No probabilities given if (replace) { SampleReplace(index, nOrig, size); } else { SampleNoReplace(index, nOrig, size); } } else { if (probsize != nOrig) throw std::range_error( "Number of probabilities must equal input vector length" ) ; // copy prob // fprob will be modified in-place // (and possibly clobbered by workers) arma::vec fprob = prob; FixProb(fprob, size, replace); // Reuse the values if (replace) { // check for walker alias conditions int walker_test = sum( (fprob * nOrig) > 0.1); if (walker_test > 200) { WalkerProbSampleReplace(index, nOrig, size, fprob); } else { ProbSampleReplace(index, nOrig, size, fprob); } } else { ProbSampleNoReplace(index, nOrig, size, fprob); } } // copy the results into the return vector for (ii=0; ii0.1 void WalkerProbSampleReplace(arma::uvec &index, int nOrig, int size, arma::vec &prob){ double rU; int ii, jj, kk; // indices, ii for loops // index tables, fill with zeros arma::vec HL_dat(nOrig); arma::vec alias_tab(nOrig); arma::vec::iterator H, L, H0, L0; //HL0 = HL_dat.begin(); H0 = H = HL_dat.begin(); L0 = L = HL_dat.end(); //prob *= nOrig; // scale probability table // fill HL_dat from beginning (small prob) and end (large prob) with indices for (ii = 0; ii < nOrig; ii++) { prob[ii] *= nOrig; if( prob[ii] < 1.0) { *(H++) = ii; } else { *(--L) = ii; } } // some of both large and small if ( (H > H0) && (L < L0) ) { for (kk = 0; kk < nOrig; kk++) { ii = HL_dat[kk]; jj = *L; alias_tab[ii] = jj; prob[jj] += (prob[ii] - 1); if (prob[jj] < 1.) L++; if(L == L0) break; // now all prob >= 1 } } for (ii = 0; ii < nOrig; ii++) prob[ii] += ii; /* generate sample */ for (ii = 0; ii < size; ii++) { rU = unif_rand() * nOrig; kk = (int) rU; index[ii] = (rU < prob[kk]) ? kk : alias_tab[kk]; } } // Unequal probability sampling without replacement void ProbSampleNoReplace(arma::uvec &index, int nOrig, int size, arma::vec &prob){ int ii, jj, kk; int nOrig_1 = nOrig - 1; double rT, mass, totalmass = 1.0; arma::uvec perm = arma::sort_index(prob, "descend"); //descending sort of index prob = arma::sort(prob, "descend"); // descending sort of prob // compute the sample for (ii = 0; ii < size; ii++, nOrig_1--) { rT = totalmass * unif_rand(); mass = 0; for (jj = 0; jj < nOrig_1; jj++) { mass += prob[jj]; if (rT <= mass) break; } index[ii] = perm[jj]; totalmass -= prob[jj]; for ( kk = jj; kk < nOrig_1; kk++) { prob[kk] = prob[kk+1]; perm[kk] = perm[kk+1]; } } } } } #endif RcppArmadillo/inst/include/RcppArmadilloExtensions/fixprob.h0000644000176200001440000000420213115077005024033 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- /* :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: */ // // fixprob.h: helper function for Rcpp/Armadillo random number draws, including sample(). // Copyright (C) 2012 - 2014 Christian Gunning // Copyright (C) 2013 Romain Francois // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #ifndef RCPPARMADILLO__EXTENSIONS__FIXPROB_H #define RCPPARMADILLO__EXTENSIONS__FIXPROB_H #include namespace Rcpp{ namespace RcppArmadillo{ void FixProb(arma::vec &prob, const int size, const bool replace) { // prob is modified in-place. double sum = 0.0; int ii, nPos = 0; int nn = prob.size(); for (ii = 0; ii < nn; ii++) { // pop stack double prob_value = prob(ii); if (!arma::is_finite(prob_value)) //does this work?? throw std::range_error( "NAs not allowed in probability" ) ; if (prob_value < 0.0) throw std::range_error( "Negative probabilities not allowed" ) ; if (prob_value > 0.0) { nPos++; sum += prob_value; } } if (nPos == 0 || (!replace && size > nPos)) { throw std::range_error("Not enough positive probabilities"); } prob = prob / sum; //sugar } } } #endif RcppArmadillo/inst/include/RcppArmadilloExtensions/rmultinom.h0000644000176200001440000000547413115077005024424 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- /* :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: */ // // rmultinom.h: Rcpp/Armadillo equivalent to R's stats::rmultinom(). // This is intended for use in C++ functions, and should *not* be called from R. // It should yield identical results to R. // // Copyright (C) 2014 Christian Gunning // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #ifndef RCPPARMADILLO__EXTENSIONS__MULTINOM_H #define RCPPARMADILLO__EXTENSIONS__MULTINOM_H #include namespace Rcpp{ namespace RcppArmadillo{ IntegerVector rmultinom(int size, NumericVector prob) { // meaning of n, size, prob as in ?rmultinom // opposite of sample() - n=number of draws double pp; int ii; int probsize = prob.size(); // Return object IntegerVector draws(probsize); if (size < 0 || size == NA_INTEGER) throw std::range_error( "Invalid size"); long double p_tot = 0.; p_tot = std::accumulate(prob.begin(), prob.end(), p_tot); if (fabs((double)(p_tot - 1.)) > 1e-7) { throw std::range_error("Probabilities don't sum to 1, please use FixProb"); } // do as rbinom if (size == 0 ) { return draws; } //rmultinom(size, REAL(prob), k, &INTEGER(ans)[ik]); // for each slot for (ii = 0; ii < probsize-1; ii++) { /* (p_tot, n) are for "remaining binomial" */ if (prob[ii]) { pp = prob[ii] / p_tot; // >= 1; > 1 happens because of rounding draws[ii] = ((pp < 1.) ? (int) Rf_rbinom((double) size, pp) : size); size -= draws[ii]; } // else { ret[ii] = 0; } // all done if (size <= 0) return draws; // i.e. p_tot = sum(prob[(k+1):K]) p_tot -= prob[ii]; } // the rest go here draws[probsize-1] = size; return draws; } } } #endif RcppArmadillo/inst/include/README0000644000176200001440000000035012253723621016264 0ustar liggesusersto upgrade to a new release of armadillo: - copy the armadillo file here - replace the armadillo_bits directory by the one from the armadillo source - ignore (or remove) armadillo_bits/config.hpp.cmake as we do not configuration RcppArmadillo/inst/include/RcppArmadilloWrap.h0000644000176200001440000002765014145557222021160 0ustar liggesusers// // RcppArmadilloWrap.h: Rcpp/Armadillo glue // // Copyright (C) 2010 - 2021 Dirk Eddelbuettel, Romain Francois and Douglas Bates // Copyright (C) 2017 - 2021 Binxiang Ni and Serguei Sokol // Copyright (C) 2021 Conrad Sanderson // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #ifndef RcppArmadillo__RcppArmadilloWrap__h #define RcppArmadillo__RcppArmadilloWrap__h namespace Rcpp{ namespace RcppArmadillo{ template SEXP arma_wrap( const T& object, const ::Rcpp::Dimension& dim){ ::Rcpp::RObject x = ::Rcpp::wrap( object.memptr() , object.memptr() + object.n_elem ) ; x.attr( "dim" ) = dim ; return x; } // DE 03-Aug-2013 // here is an alternate form which would not set dimension which we could do // for row and column vectors -- but the current form of return row and col // as matrix types with one col (or row, respectively) is now entrenched template SEXP arma_wrap(const T& object) { return ::Rcpp::wrap(object.memptr() , object.memptr() + object.n_elem); } template SEXP arma_subview_wrap( const arma::subview& data, int nrows, int ncols ){ const int RTYPE = Rcpp::traits::r_sexptype_traits::rtype ; Rcpp::Matrix mat( nrows, ncols ) ; for( int j=0, k=0; j SEXP arma_subview_wrap( const arma::subview_cols& data, int nrows, int ncols ){ const int RTYPE = Rcpp::traits::r_sexptype_traits::rtype ; Rcpp::Matrix mat( nrows, ncols ) ; const int nelem = nrows*ncols; const T* svcmem = data.colptr(0); for( int i=0; i SEXP wrap ( const arma::Mat& data ){ return RcppArmadillo::arma_wrap( data, Dimension( data.n_rows, data.n_cols ) ) ; } template SEXP wrap( const arma::Col& data ){ #if defined(RCPP_ARMADILLO_RETURN_COLVEC_AS_VECTOR) || defined(RCPP_ARMADILLO_RETURN_ANYVEC_AS_VECTOR) return RcppArmadillo::arma_wrap( data ) ; #else return RcppArmadillo::arma_wrap( data, Dimension( data.n_elem, 1) ) ; #endif } template SEXP wrap( const arma::Row& data ){ #if defined(RCPP_ARMADILLO_RETURN_ROWVEC_AS_VECTOR) || defined(RCPP_ARMADILLO_RETURN_ANYVEC_AS_VECTOR) return RcppArmadillo::arma_wrap( data ) ; #else return RcppArmadillo::arma_wrap(data, Dimension( 1, data.n_elem ) ) ; #endif } template SEXP wrap( const arma::Cube& data ){ return RcppArmadillo::arma_wrap(data, Dimension( data.n_rows, data.n_cols, data.n_slices ) ) ; } template SEXP wrap( const arma::subview& data ){ return RcppArmadillo::arma_subview_wrap( data, data.n_rows, data.n_cols ) ; } template SEXP wrap( const arma::subview_cols& data ){ return RcppArmadillo::arma_subview_wrap( data, data.n_rows, data.n_cols ) ; } template SEXP wrap ( const arma::SpMat& sm ){ const int RTYPE = Rcpp::traits::r_sexptype_traits::rtype; sm.sync(); // important: update internal state of SpMat object IntegerVector dim = IntegerVector::create(sm.n_rows, sm.n_cols); // copy the data into R objects Vector x(sm.values, sm.values + sm.n_nonzero ) ; IntegerVector i(sm.row_indices, sm.row_indices + sm.n_nonzero); IntegerVector p(sm.col_ptrs, sm.col_ptrs + sm.n_cols+1 ) ; std::string klass = "dgCMatrix"; // Since logical sparse matrix is not supported for now, the conditional statement is not currently used. // switch( RTYPE ){ // case REALSXP: klass = "dgCMatrix" ; break ; // // case INTSXP : klass = "igCMatrix" ; break ; class not exported // case LGLSXP : klass = "lgCMatrix" ; break ; // default: // throw std::invalid_argument( "RTYPE not matched in conversion to sparse matrix" ) ; // } S4 s(klass); s.slot("i") = i; s.slot("p") = p; s.slot("x") = x; s.slot("Dim") = dim; return s; } namespace RcppArmadillo { /* Importer class for field */ template class FieldImporter { public: typedef T r_import_type ; FieldImporter( const arma::field& data_ ) : data(data_){} inline int size() const { return data.n_elem ; } inline T get(int i) const { return data[i] ; } inline SEXP wrap( int i) const { return ::Rcpp::wrap( data[i] ) ; } private: const arma::field& data ; } ; } // namespace RcppArmadillo template SEXP wrap( const arma::field& data){ RObject x = wrap( RcppArmadillo::FieldImporter( data ) ) ; //data.print("data"); //Rcpp::Rcout << "rows " << data.n_rows << " cols " << data.n_cols // << " slices " << data.n_slices << " elem " << data.n_elem << std::endl; # if defined(RCPP_ARMADILLO_FIX_Field) x.attr("dim") = Dimension(data.n_rows , data.n_cols , data.n_slices); #else x.attr("dim") = Dimension(data.n_rows, data.n_cols); #endif return x ; } /* TODO: maybe we could use the advanced constructor to avoid creating the temporary Mat */ template SEXP wrap(const arma::Glue& X ){ return wrap( arma::Mat(X) ) ; } template SEXP wrap(const arma::Op& X ){ return wrap( arma::Mat(X) ) ; } template SEXP wrap(const arma::OpCube& X ){ return wrap( arma::Cube(X) ) ; } template SEXP wrap(const arma::GlueCube& X ){ return wrap( arma::Cube(X) ) ; } template SEXP wrap(const arma::GenCube& X){ return wrap( arma::Cube( X ) ) ; } namespace RcppArmadillo{ /* we can intercept and directly build the resulting matrix using memory allocated by R */ template SEXP wrap_eglue( const arma::eGlue& X, ::Rcpp::traits::false_type ){ int n_rows = X.P1.get_n_rows() ; int n_cols = X.P1.get_n_cols() ; typedef typename ::Rcpp::Vector< ::Rcpp::traits::r_sexptype_traits< typename T1::elem_type>::rtype > VECTOR ; VECTOR res(::Rcpp::Dimension( n_rows , n_cols )) ; ::arma::Mat result( res.begin(), n_rows, n_cols, false ) ; result = X ; return res ; } template SEXP wrap_eglue( const arma::eGlue& X, ::Rcpp::traits::true_type ){ return ::Rcpp::wrap( arma::Mat(X) ) ; } template SEXP wrap_eop( const arma::eOp& X, ::Rcpp::traits::false_type ){ int n_rows = X.get_n_rows(); int n_cols = X.get_n_cols(); typedef typename ::Rcpp::Vector< ::Rcpp::traits::r_sexptype_traits< typename T1::elem_type>::rtype > VECTOR ; VECTOR res(::Rcpp::Dimension( n_rows , n_cols )) ; ::arma::Mat result( res.begin(), n_rows, n_cols, false ) ; result = X ; return res ; } template SEXP wrap_eop( const arma::eOp& X, ::Rcpp::traits::true_type ){ return ::Rcpp::wrap( arma::Mat(X) ) ; } // template // SEXP wrap_mtop( const arma::mtOp& X, ::Rcpp::traits::false_type ){ // // int n_rows = X.P.n_rows ; // // int n_cols = X.P.n_cols ; // // typedef typename ::Rcpp::Vector< ::Rcpp::traits::r_sexptype_traits< typename T1::elem_type>::rtype > VECTOR ; // // VECTOR res(::Rcpp::Dimension( n_rows , n_cols )) ; // // ::arma::Mat result( res.begin(), n_rows, n_cols, false ) ; // // result = X ; // // return res ; // return ::Rcpp::wrap( arma::Mat(X) ) ; // } // // template // SEXP wrap_mtop( const arma::mtOp& X, ::Rcpp::traits::true_type ){ // return ::Rcpp::wrap( arma::Mat(X) ) ; // } // // template // SEXP wrap_mtglue( const arma::mtGlue& X, ::Rcpp::traits::false_type ){ // // int n_rows = X.P1.n_rows ; // // int n_cols = X.P1.n_cols ; // // typedef typename ::Rcpp::Vector< ::Rcpp::traits::r_sexptype_traits< typename T1::elem_type>::rtype > VECTOR ; // // VECTOR res(::Rcpp::Dimension( n_rows , n_cols )) ; // // ::arma::Mat result( res.begin(), n_rows, n_cols, false ) ; // // result = X ; // // return res ; // return ::Rcpp::wrap( arma::Mat(X) ) ; // } // // template // SEXP wrap_mtglue( const arma::mtGlue& X , ::Rcpp::traits::true_type ){ // return ::Rcpp::wrap( arma::Mat(X) ) ; // } } // namespace RcppArmadillo template SEXP wrap(const arma::eGlue& X ){ return RcppArmadillo::wrap_eglue( X, typename traits::r_sexptype_needscast::type() ) ; } template SEXP wrap(const arma::eOp& X ){ return RcppArmadillo::wrap_eop( X, typename traits::r_sexptype_needscast::type() ) ; } template SEXP wrap(const arma::eOpCube& X ){ return wrap( arma::Cube(X) ) ; } template SEXP wrap(const arma::eGlueCube& X ){ return wrap( arma::Cube(X) ) ; } template SEXP wrap( const arma::mtOp& X ){ // return RcppArmadillo::wrap_mtop( X, typename traits::r_sexptype_needscast::type() ) ; return wrap( arma::Mat( X ) ) ; } template SEXP wrap( const arma::mtGlue& X ){ // return RcppArmadillo::wrap_mtglue( X, typename traits::r_sexptype_needscast::type() ) ; return wrap( arma::Mat( X ) ) ; } template SEXP wrap( const arma::Gen& X){ return wrap( eT(X) ) ; } } #endif RcppArmadillo/inst/include/RcppArmadilloConfig.h0000644000176200001440000001225514145557163021453 0ustar liggesusers // RcppArmadilloConfig.h: Rcpp/Armadillo glue // // Copyright (C) 2010 - 2021 Dirk Eddelbuettel, Romain Francois and Douglas Bates // Copyright (C) 2016 - 2021 George G. Vega Yon // Copyright (C) 2017 - 2021 Serguei Sokol // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #ifndef RcppArmadillo__RcppArmadilloConfig__h #define RcppArmadillo__RcppArmadilloConfig__h #if !defined(ARMA_USE_LAPACK) #define ARMA_USE_LAPACK #endif #if !defined(ARMA_USE_BLAS) #define ARMA_USE_BLAS #endif #define ARMA_HAVE_STD_ISFINITE #define ARMA_HAVE_STD_ISINF #define ARMA_HAVE_STD_ISNAN #define ARMA_HAVE_STD_SNPRINTF /* TODO: we might need to undef this on other platforms as well */ #if defined(__GNUC__) && defined(_WIN64) || defined(__FreeBSD__) #undef ARMA_HAVE_STD_SNPRINTF #endif /* suncc does not have std::isfinite (which is not standard) so we tell armadillo not to use it, and comment out a few others while we are at it */ #if defined(__SUNPRO_CC) #undef ARMA_HAVE_STD_ISFINITE #undef ARMA_HAVE_STD_SNPRINTF #undef ARMA_HAVE_LOG1P #undef ARMA_HAVE_STD_ISINF #undef ARMA_HAVE_STD_ISNAN #endif // Let's be careful for now and undef this as not all compilers support this //#if defined(ARMA_USE_CXX11) //#undef ARMA_USE_CXX11 //#endif // If C++11 has been selected at the R package level, use it for Armadillo too // This is actually not needed, if the proper switch is set via -std=... then // Armadillo will know (cf compilation with -DARMA_EXTRA_DEBUG set) // #if defined(USE_CXX1X) // #define ARMA_USE_CXX11 // #endif // We can use R as the RNG provider, see RcppArmadilloForward.h which // enables inclusion of the appropriate headers. Alternatively, the // C++11 RNG can be used by commenting out the current default and // selecting the C++11 RNG instead. Lastly, one could (but should not) // fall back to the C++98 RNG (often from the C library) by defining neither. // Rcpp has its own stream object which cooperates more nicely with R's i/o // And as of Armadillo 2.4.3, we can use this stream object as well // // As of Armadillo 8.100.1, this has been renamed to ARMA_COUT_STREAM and // ARMA_CERR_STREAM was added // #if !defined(ARMA_COUT_STREAM) #define ARMA_COUT_STREAM Rcpp::Rcout #endif #if !defined(ARMA_CERR_STREAM) #define ARMA_CERR_STREAM Rcpp::Rcerr #endif // R now defines NDEBUG which suppresses a number of useful Armadillo tests // Users can still defined it later, and/or define ARMA_NO_DEBUG #if defined(NDEBUG) #undef NDEBUG #endif // On Windows do not read autoconf-updated header #if defined(WIN32) || defined(_WIN32) // R can be built with its own Rlapack library, or use an external // one. Only the latter has zgesdd, a complex-valued SVD using divide-and-conquer // on Windows we do not assume ZGESDD #define ARMA_CRIPPLED_LAPACK 1 // on Windows we can now assume OpenMP with Rtools / gcc 4.9.3 // note that performance is said to still be poor // cf https://cran.r-project.org/doc/manuals/r-devel/R-admin.html#The-MinGW_002dw64-toolchain #define ARMA_USE_OPENMP #else // on the other OSs we test via LAPACK_LIBS (in configure) which // updates this include file #include #endif // Many client packages do not set the OpenMP compiler flag in their src/Makevars // (ie add $(SHLIB_OPENMP_CXXFLAGS) to the PKG_CXXFLAGS line as we do) so to tone // down the line noise we ask Armadillo not to print the warning #if defined(ARMA_USE_OPENMP) //#if !defined(_OPENMP) // #pragma message("NOTE: To enable OpenMP-based speedups, add -fopenmp to the compiler flags. See Writing R Extension (Sec 1.2.1) and R Inst. + Admin. (Sec 6.3.3) for details.") //#endif #define ARMA_DONT_PRINT_OPENMP_WARNING 1 #endif // Under C++11 and C++14, Armadillo now defaults to using int64_t for // integers. This prevents us from passing integer vectors to R as // only used int32_t -- so we select the shorter representation here. // Unless int64_t is explicitly required during compilation. #if !defined(ARMA_64BIT_WORD) #define ARMA_32BIT_WORD 1 #endif // To return arma::vec or arma::rowvec as R vector (i.e. dimensionless), // one of the following macro can be defined before including // RcppArmadillo.h. "ANYVEC" applys for both col- and row-vec. //#define RCPP_ARMADILLO_RETURN_COLVEC_AS_VECTOR //#define RCPP_ARMADILLO_RETURN_ROWVEC_AS_VECTOR //#define RCPP_ARMADILLO_RETURN_ANYVEC_AS_VECTOR // To preserve all dims of arma::field when passing objects to or from R // the following macro can be defined before including RcppArmadillo.h. // see https://github.com/RcppCore/RcppArmadillo/pull/352 // #define RCPP_ARMADILLO_FIX_Field #endif RcppArmadillo/inst/include/RcppArmadillo/0000755000176200001440000000000014173550004020133 5ustar liggesusersRcppArmadillo/inst/include/RcppArmadillo/Alt_R_RNG.h0000644000176200001440000001236213074772245022033 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- // // Copyright (C) 2013-2014 Conrad Sanderson // Copyright (C) 2013-2014 NICTA (www.nicta.com.au) // // 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 http://mozilla.org/MPL/2.0/. // // This file is based on Conrad's default generators and as such licensed under both // the MPL 2.0 for his as well as the GNU GPL 2.0 or later for my modification to it. // Copyright (C) 2014 Dirk Eddelbuettel // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . // NB This files use R's uniform generator and can be compiled only when the R // headers are available as is the case for RcppArmadillo. // // Also note that you MUST set / reset the R RNG state. When using RcppArmadillo // via Rcpp Atttributes or the inline package, the RNGScope object is added which // ensure this automatically. Should you build by hand, and omit both RNGScope as // as manual calls to GetRNGState() and PutRNGState() you may get unstable results. // // See http://cran.r-project.org/doc/manuals/r-devel/R-exts.html#Random-numbers class arma_rng_alt { public: typedef unsigned int seed_type; inline static void set_seed(const seed_type val); arma_inline static int randi_val(); arma_inline static double randu_val(); inline static double randn_val(); template inline static void randn_dual_val(eT& out1, eT& out2); template inline static void randi_fill(eT* mem, const uword N, const int a, const int b); inline static int randi_max_val(); }; inline void arma_rng_alt::set_seed(const arma_rng_alt::seed_type val) { // null-op, cannot set seed in R from C level code // see http://cran.r-project.org/doc/manuals/r-devel/R-exts.html#Random-numbers // // std::srand(val); (void) val; // to suppress a -Wunused warning // static int havewarned = 0; if (havewarned++ == 0) { ::Rf_warning("When called from R, the RNG seed has to be set at the R level via set.seed()"); } } arma_inline int arma_rng_alt::randi_val() { return ::Rf_runif(0, RAND_MAX); //std::rand(); } arma_inline double arma_rng_alt::randu_val() { return double(::Rf_runif(0, 1)); //return double( double(std::rand()) * ( double(1) / double(RAND_MAX) ) ); } inline double arma_rng_alt::randn_val() { // polar form of the Box-Muller transformation: // http://en.wikipedia.org/wiki/Box-Muller_transformation // http://en.wikipedia.org/wiki/Marsaglia_polar_method double tmp1; double tmp2; double w; do { tmp1 = double(2) * double(::Rf_runif(0, 1)) - double(1); tmp2 = double(2) * double(::Rf_runif(0, 1)) - double(1); //tmp1 = double(2) * double(std::rand()) * (double(1) / double(RAND_MAX)) - double(1); //tmp2 = double(2) * double(std::rand()) * (double(1) / double(RAND_MAX)) - double(1); w = tmp1*tmp1 + tmp2*tmp2; } while ( w >= double(1) ); return double( tmp1 * std::sqrt( (double(-2) * std::log(w)) / w) ); } template inline void arma_rng_alt::randn_dual_val(eT& out1, eT& out2) { // make sure we are internally using at least floats typedef typename promote_type::result eTp; eTp tmp1; eTp tmp2; eTp w; do { tmp1 = eTp(2) * eTp(::Rf_runif(0, RAND_MAX)) * (eTp(1) / eTp(RAND_MAX)) - eTp(1); tmp2 = eTp(2) * eTp(::Rf_runif(0, RAND_MAX)) * (eTp(1) / eTp(RAND_MAX)) - eTp(1); //tmp1 = eTp(2) * eTp(std::rand()) * (eTp(1) / eTp(RAND_MAX)) - eTp(1); //tmp2 = eTp(2) * eTp(std::rand()) * (eTp(1) / eTp(RAND_MAX)) - eTp(1); w = tmp1*tmp1 + tmp2*tmp2; } while ( w >= eTp(1) ); const eTp k = std::sqrt( (eTp(-2) * std::log(w)) / w); out1 = eT(tmp1*k); out2 = eT(tmp2*k); } template inline void arma_rng_alt::randi_fill(eT* mem, const uword N, const int a, const int b) { if( (a == 0) && (b == RAND_MAX) ) { for(uword i=0; i. #ifndef RCPPARMADILLO_COL_MEAT_H #define RCPPARMADILLO_COL_MEAT_H template template inline Col::Col( const Rcpp::VectorBase& X ) : Mat( X ) { arma_extra_debug_sigprint(this); access::rw(Mat::vec_state) = 1; } template template inline Col::Col( const Rcpp::MatrixBase& X ) : Mat( X ) { arma_extra_debug_sigprint(this); arma_debug_check( (Mat::n_cols > 1), "Col(): incompatible dimensions" ); access::rw(Mat::vec_state) = 1; } #endif RcppArmadillo/inst/include/RcppArmadillo/Mat_proto.h0000644000176200001440000000237012253723621022256 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- /* :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: */ // // Mat_proto.h: Rcpp/Armadillo glue // // Copyright (C) 2010 - 2013 Dirk Eddelbuettel, Romain Francois and Douglas Bates // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #ifndef RCPPARMADILLO_MAT_PROTO_H #define RCPPARMADILLO_MAT_PROTO_H template inline Mat( const Rcpp::VectorBase& X ) ; template inline Mat( const Rcpp::MatrixBase& X ) ; #endif RcppArmadillo/inst/include/RcppArmadillo/Row_meat.h0000644000176200001440000000320612253723621022066 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- /* :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: */ // // Row_meat.h: Rcpp/Armadillo glue // // Copyright (C) 2011 - 2013 Dirk Eddelbuettel, Romain Francois and Douglas Bates // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #ifndef RCPPARMADILLO_ROW_MEAT_H #define RCPPARMADILLO_ROW_MEAT_H template template inline Row::Row( const Rcpp::VectorBase& X ) : Mat( X ) { arma_extra_debug_sigprint(this); std::swap( access::rw(Mat::n_rows), access::rw(Mat::n_cols) ); access::rw(Mat::vec_state) = 2; } template template inline Row::Row( const Rcpp::MatrixBase& X ) : Mat( X ) { arma_extra_debug_sigprint(this); arma_debug_check( (Mat::n_rows > 1), "Row(): incompatible dimensions" ); access::rw(Mat::vec_state) = 2; } #endif RcppArmadillo/inst/include/RcppArmadillo/Col_proto.h0000644000176200001440000000237012253723621022252 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- /* :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: */ // // Col_proto.h: Rcpp/Armadillo glue // // Copyright (C) 2010 - 2013 Dirk Eddelbuettel, Romain Francois and Douglas Bates // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #ifndef RCPPARMADILLO_COL_PROTO_H #define RCPPARMADILLO_COL_PROTO_H template inline Col( const Rcpp::VectorBase& X ) ; template inline Col( const Rcpp::MatrixBase& X ) ; #endif RcppArmadillo/inst/include/RcppArmadillo/Mat_meat.h0000644000176200001440000001077413737626167022067 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- /* :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: */ // // Mat_meat.h: Rcpp/Armadillo glue // // Copyright (C) 2010 - 2013 Dirk Eddelbuettel, Romain Francois and Douglas Bates // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #ifndef RCPPARMADILLO_MAT_MEAT_H #define RCPPARMADILLO_MAT_MEAT_H namespace RcppArmadillo{ template inline void check(){ #if !defined(ARMA_USE_CXX11) arma_type_check_cxx1998< is_same_type< eT, rcpp_type >::value == false >::apply(); #else static_assert( is_same_type< eT, rcpp_type >::value , "error: incorrect or unsupported type" ); #endif } template <> inline void check< std::complex, Rcomplex >(){} template inline void fill_ptr__impl( eT* ptr, const Rcpp::VectorBase& X, u32 n_elem, ::Rcpp::traits::true_type ){ for( u32 i=0; i::type, eT>( X[i] ) ; } } template inline void fill_ptr__impl( eT* ptr, const Rcpp::VectorBase& X, u32 n_elem, ::Rcpp::traits::false_type ){ for( u32 i=0; i inline void fill_ptr( eT* ptr, const Rcpp::VectorBase& X, u32 n_elem ){ return fill_ptr__impl( ptr, X, n_elem, typename ::Rcpp::traits::r_sexptype_needscast() ) ; } template inline void fill_ptr_matrix__impl( eT* ptr, const Rcpp::MatrixBase& X, u32 nr, u32 nc, ::Rcpp::traits::true_type ){ u32 k, i_col, i_row ; for( i_col=0, k=0 ; i_col < nc; ++i_col){ for( i_row = 0; i_row < nr ; ++i_row, ++k ){ ptr[k] = Rcpp::internal::caster< typename Rcpp::traits::storage_type::type, eT>( X(i_row,i_col)) ; } } } template inline void fill_ptr_matrix__impl( eT* ptr, const Rcpp::MatrixBase& X, u32 nr, u32 nc, ::Rcpp::traits::false_type ){ u32 k, i_col, i_row ; for( i_col=0, k=0 ; i_col < nc; ++i_col){ for( i_row = 0; i_row < nr ; ++i_row, ++k ){ ptr[k] = X(i_row,i_col) ; } } } template inline void fill_ptr_matrix( eT* ptr, const Rcpp::MatrixBase& X, u32 nr, u32 nc){ return fill_ptr_matrix__impl( ptr, X, nr, nc, typename ::Rcpp::traits::r_sexptype_needscast() ) ; } } template template inline Mat::Mat( const Rcpp::VectorBase& X ) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem(0) { arma_extra_debug_sigprint_this(this); RcppArmadillo::check::type >() ; set_size(X.size(), 1); RcppArmadillo::fill_ptr( memptr(), X, n_elem ) ; } template template inline Mat::Mat( const Rcpp::MatrixBase& X ) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem(0) { arma_extra_debug_sigprint_this(this); RcppArmadillo::check::type >() ; u32 nr = X.nrow(), nc = X.ncol() ; set_size( nr, nc ) ; RcppArmadillo::fill_ptr_matrix( memptr(), X, nr, nc ); } #endif RcppArmadillo/inst/include/RcppArmadillo/Row_proto.h0000644000176200001440000000237012253723621022304 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- /* :tabSize=4:indentSize=4:noTabs=false:folding=explicit:collapseFolds=1: */ // // Row_proto.h: Rcpp/Armadillo glue // // Copyright (C) 2010 - 2013 Dirk Eddelbuettel, Romain Francois and Douglas Bates // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #ifndef RCPPARMADILLO_ROW_PROTO_H #define RCPPARMADILLO_ROW_PROTO_H template inline Row( const Rcpp::VectorBase& X ) ; template inline Row( const Rcpp::MatrixBase& X ) ; #endif RcppArmadillo/inst/include/RcppArmadilloAs.h0000644000176200001440000006160214145557231020605 0ustar liggesusers // RcppArmadilloAs.h: Rcpp/Armadillo glue, support for as // // Copyright (C) 2013 - 2021 Dirk Eddelbuettel and Romain Francois // Copyright (C) 2017 - 2021 Serguei Sokol // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #ifndef RcppArmadillo__RcppArmadilloAs__h #define RcppArmadillo__RcppArmadilloAs__h namespace Rcpp{ namespace traits { template class Exporter< arma::field > { public: Exporter(SEXP x) : data(x){} inline arma::field get() { size_t n = data.size(); arma::field out(n); # if defined(RCPP_ARMADILLO_FIX_Field) if (!Rf_isNull(data.attr("dim"))) { arma::ivec dims = data.attr("dim"); if (dims.n_elem == 1) { out.set_size(n); } else if (dims.n_elem == 2) { out.set_size(dims(0), dims(1)); } else if (dims.n_elem == 3) { out.set_size(dims(0), dims(1), dims(2)); } } # endif for (size_t i = 0; i < n; i++) { out(i) = as(data[i]); } return out ; } private: List data ; }; template class Exporter< arma::Col > : public IndexingExporter< arma::Col, T > { public: Exporter(SEXP x) : IndexingExporter< arma::Col, T >(x){} }; template class Exporter< arma::Row > : public IndexingExporter< arma::Row, T > { public: Exporter(SEXP x) : IndexingExporter< arma::Row, T >(x){} }; template class Exporter< arma::Mat > : public MatrixExporter< arma::Mat, T > { public: Exporter(SEXP x) : MatrixExporter< arma::Mat, T >(x){} }; template class Exporter< const arma::Mat& > { public: typedef typename Rcpp::Matrix< Rcpp::traits::r_sexptype_traits::rtype > MATRIX ; Exporter(SEXP x) : mat(x) {} inline arma::Mat* get(){ return new arma::Mat( mat.begin(), mat.nrow(), mat.ncol(), false ) ; } private: MATRIX mat ; }; // 14 June 2017 // Add support for sparse matrices other than dgCMatrix template class Exporter< arma::SpMat > { public: Exporter( SEXP x ) { is_stm=Rf_inherits(x, "simple_triplet_matrix"); if (is_stm) { li = x; } else { mat = x; } } arma::SpMat get(){ const int RTYPE = Rcpp::traits::r_sexptype_traits::rtype; if (is_stm) { arma::urowvec ti = as(li["i"]); arma::urowvec tj = as(li["j"]); arma::Col tx = li["v"]; arma::SpMat res = arma::sp_mat(true, arma::join_cols(ti, tj)-1, tx, li["nrow"], li["ncol"], true, false); return res; } IntegerVector dims = mat.slot("Dim"); int nrow = dims[0]; int ncol = dims[1]; // Creating an empty SpMat arma::SpMat res(static_cast(nrow), static_cast(ncol)); // Get the type of sparse matrix std::string type = Rcpp::as(mat.slot("class")); if (type == "dgCMatrix" || mat.is("dgCMatrix")) { IntegerVector i = mat.slot("i"); IntegerVector p = mat.slot("p"); Vector x = mat.slot("x"); // Making space for the elements res.mem_resize(static_cast(x.size())); // In order to access the internal arrays of the SpMat class res.sync(); // Copying elements std::copy(i.begin(), i.end(), arma::access::rwp(res.row_indices)); std::copy(p.begin(), p.end(), arma::access::rwp(res.col_ptrs)); std::copy(x.begin(), x.end(), arma::access::rwp(res.values)); } else if (type == "dtCMatrix" || mat.is("dtCMatrix")) { IntegerVector i = mat.slot("i"); IntegerVector p = mat.slot("p"); Vector x = mat.slot("x"); std::string diag = Rcpp::as(mat.slot("diag")); // Making space for the elements res.mem_resize(static_cast(x.size())); // In order to access the internal arrays of the SpMat class res.sync(); // Copying elements std::copy(i.begin(), i.end(), arma::access::rwp(res.row_indices)); std::copy(p.begin(), p.end(), arma::access::rwp(res.col_ptrs)); std::copy(x.begin(), x.end(), arma::access::rwp(res.values)); if (diag == "U") { res.diag().ones(); } } else if (type == "dsCMatrix" || mat.is("dsCMatrix")) { IntegerVector i = mat.slot("i"); IntegerVector p = mat.slot("p"); Vector x = mat.slot("x"); std::string uplo = Rcpp::as(mat.slot("uplo")); // Making space for the elements res.mem_resize(static_cast(x.size())); // In order to access the internal arrays of the SpMat class res.sync(); // Copying elements std::copy(i.begin(), i.end(), arma::access::rwp(res.row_indices)); std::copy(p.begin(), p.end(), arma::access::rwp(res.col_ptrs)); std::copy(x.begin(), x.end(), arma::access::rwp(res.values)); if (uplo == "U") { res = symmatu(res); } else { res = symmatl(res); } } else if (type == "dgTMatrix" || mat.is("dgTMatrix")) { arma::urowvec ti = mat.slot("i"); arma::urowvec tj = mat.slot("j"); arma::Col tx = mat.slot("x"); res = arma::sp_mat(true, arma::join_cols(ti, tj), tx, nrow, ncol, true, false); } else if (type == "dtTMatrix" || mat.is("dtTMatrix")) { arma::urowvec ti = mat.slot("i"); arma::urowvec tj = mat.slot("j"); arma::Col tx = mat.slot("x"); res = arma::sp_mat(true, arma::join_cols(ti, tj), tx, nrow, ncol, true, false); if (Rcpp::as(mat.slot("diag")) == "U") { res.diag().ones(); } } else if (type == "dsTMatrix" || mat.is("dsTMatrix")) { arma::urowvec ti = mat.slot("i"); arma::urowvec tj = mat.slot("j"); arma::Col tx = mat.slot("x"); res = arma::sp_mat(true, arma::join_cols(ti, tj), tx, nrow, ncol, true, false); res = Rcpp::as(mat.slot("uplo")) == "U" ? symmatu(res) : symmatl(res); } else if (type == "dgRMatrix" || mat.is("dgRMatrix")) { IntegerVector rj = mat.slot("j"); IntegerVector rp = mat.slot("p"); Vector rx = mat.slot("x"); int nnz = rx.size(); IntegerVector i = IntegerVector(nnz); IntegerVector p = IntegerVector(ncol + 1); Vector x = Vector(nnz); // Count the nnz in each column for(int n = 0; n < nnz; n++){ p[rj[n] + 1]++; } // Cumsum p for(int col = 0, cumsum = 0; col < ncol + 1; col++){ cumsum += p[col]; p[col] = cumsum; } // https://github.com/scipy/scipy/blob/master/scipy/sparse/sparsetools/csr.h#L436 // Calculate i&x for(int row = 0; row < nrow; row++){ for(int tmp = rp[row]; tmp < rp[row + 1]; tmp++){ int col = rj[tmp]; int dest = p[col]; i[dest] = row; x[dest] = rx[tmp]; p[col]++; } } // Fix the p for(int col = 0, last = 0; col <= ncol; col++){ int tmp = p[col]; p[col] = last; last = tmp; } // Making space for the elements res.mem_resize(static_cast(x.size())); // In order to access the internal arrays of the SpMat class res.sync(); // Copying elements std::copy(i.begin(), i.end(), arma::access::rwp(res.row_indices)); std::copy(p.begin(), p.end(), arma::access::rwp(res.col_ptrs)); std::copy(x.begin(), x.end(), arma::access::rwp(res.values)); } else if (type == "dtRMatrix" || mat.is("dtRMatrix")) { IntegerVector rj = mat.slot("j"); IntegerVector rp = mat.slot("p"); Vector rx = mat.slot("x"); std::string diag = Rcpp::as(mat.slot("diag")); int nnz = rx.size(); IntegerVector i = IntegerVector(nnz); IntegerVector p = IntegerVector(ncol + 1); Vector x = Vector(nnz); // Count the nnz in each column for(int n = 0; n < nnz; n++){ p[rj[n] + 1]++; } // Cumsum p for(int col = 0, cumsum = 0; col < ncol + 1; col++){ cumsum += p[col]; p[col] = cumsum; } // https://github.com/scipy/scipy/blob/master/scipy/sparse/sparsetools/csr.h#L436 // Calculate i&x for(int row = 0; row < nrow; row++){ for(int tmp = rp[row]; tmp < rp[row + 1]; tmp++){ int col = rj[tmp]; int dest = p[col]; i[dest] = row; x[dest] = rx[tmp]; p[col]++; } } // Fix the p for(int col = 0, last = 0; col <= ncol; col++){ int tmp = p[col]; p[col] = last; last = tmp; } // Making space for the elements res.mem_resize(static_cast(x.size())); // In order to access the internal arrays of the SpMat class res.sync(); // Copying elements std::copy(i.begin(), i.end(), arma::access::rwp(res.row_indices)); std::copy(p.begin(), p.end(), arma::access::rwp(res.col_ptrs)); std::copy(x.begin(), x.end(), arma::access::rwp(res.values)); if (diag == "U"){ res.diag().ones(); } } else if (type == "dsRMatrix" || mat.is("dsRMatrix")) { IntegerVector rj = mat.slot("j"); IntegerVector rp = mat.slot("p"); Vector rx = mat.slot("x"); std::string uplo = Rcpp::as(mat.slot("uplo")); int nnz = rx.size(); IntegerVector i = IntegerVector(nnz); IntegerVector p = IntegerVector(ncol + 1); Vector x = Vector(nnz); // Count the nnz in each column for(int n = 0; n < nnz; n++){ p[rj[n] + 1]++; } // Cumsum p for(int col = 0, cumsum = 0; col < ncol + 1; col++){ cumsum += p[col]; p[col] = cumsum; } // https://github.com/scipy/scipy/blob/master/scipy/sparse/sparsetools/csr.h#L436 // Calculate i&x for(int row = 0; row < nrow; row++){ for(int tmp = rp[row]; tmp < rp[row + 1]; tmp++){ int col = rj[tmp]; int dest = p[col]; i[dest] = row; x[dest] = rx[tmp]; p[col]++; } } // Fix the p for(int col = 0, last = 0; col <= ncol; col++){ int tmp = p[col]; p[col] = last; last = tmp; } // Making space for the elements res.mem_resize(static_cast(x.size())); // In order to access the internal arrays of the SpMat class res.sync(); // Copying elements std::copy(i.begin(), i.end(), arma::access::rwp(res.row_indices)); std::copy(p.begin(), p.end(), arma::access::rwp(res.col_ptrs)); std::copy(x.begin(), x.end(), arma::access::rwp(res.values)); if (uplo == "U") { res = symmatu(res); } else { res = symmatl(res); } } else if (type == "indMatrix" || mat.is("indMatrix")) { std::vector i; IntegerVector p(ncol + 1); IntegerVector x(nrow, 1); IntegerVector perm = mat.slot("perm"); typedef std::pair Key; typedef std::set Set; Set permiSet; // Sort i; int nnz = perm.size(); for(int tmp = 0; tmp < nnz; tmp++){ Key permi(perm[tmp], tmp); permiSet.insert(permi); } for(Set::iterator tmp = permiSet.begin(); tmp != permiSet.end(); tmp++){ i.push_back(tmp -> second); } // Count the number of nnz in each column for(int idx = 0; idx < nnz; idx++){ int col = perm[idx]; p[col]++; } // Cumsum p for(int col = 0, cumsum = 0; col < ncol + 1; col++){ cumsum += p[col]; p[col] = cumsum; } // Making space for the elements res.mem_resize(static_cast(x.size())); // In order to access the internal arrays of the SpMat class res.sync(); // Copying elements std::copy(i.begin(), i.end(), arma::access::rwp(res.row_indices)); std::copy(p.begin(), p.end(), arma::access::rwp(res.col_ptrs)); std::copy(x.begin(), x.end(), arma::access::rwp(res.values)); } else if (type == "pMatrix" || mat.is("pMatrix")) { std::vector i; IntegerVector p(ncol + 1); IntegerVector x(ncol, 1); IntegerVector perm = mat.slot("perm"); // Sort the row number by the column number typedef std::map Map; Map colrow; for(int tmp = 0; tmp < perm.size(); tmp++){ colrow[perm[tmp]] = tmp; } // Calculate i for(Map::iterator tmp = colrow.begin(); tmp != colrow.end(); tmp++){ i.push_back(tmp -> second); } // Calculate p for(int tmp = 0; tmp < p.size(); tmp++){ p[tmp] = tmp; } // Making space for the elements res.mem_resize(static_cast(x.size())); // In order to access the internal arrays of the SpMat class res.sync(); // Copying elements std::copy(i.begin(), i.end(), arma::access::rwp(res.row_indices)); std::copy(p.begin(), p.end(), arma::access::rwp(res.col_ptrs)); std::copy(x.begin(), x.end(), arma::access::rwp(res.values)); } else if (type == "ddiMatrix" || mat.is("ddiMatrix")) { std::vector i; std::vector p; std::vector x; std::string diag = Rcpp::as(mat.slot("diag")); if (diag == "U") { for(int idx = 0; idx < ncol; idx++){ i.push_back(idx); p.push_back(idx); x.push_back(1); } p.push_back(ncol); } else { Vector tmpx = mat.slot("x"); int tmpp = 0; for(int idx = 0; idx < ncol; idx++){ p.push_back(tmpp); if (tmpx[idx] != 0) { i.push_back(idx); x.push_back(tmpx[idx]); tmpp++; } } p.push_back(tmpp); } // Making space for the elements res.mem_resize(static_cast(x.size())); // In order to access the internal arrays of the SpMat class res.sync(); // Copying elements std::copy(i.begin(), i.end(), arma::access::rwp(res.row_indices)); std::copy(p.begin(), p.end(), arma::access::rwp(res.col_ptrs)); std::copy(x.begin(), x.end(), arma::access::rwp(res.values)); } else { Rcpp::stop(type + " is not supported."); } // In order to access the internal arrays of the SpMat class res.sync(); // Setting the sentinel arma::access::rw(res.col_ptrs[static_cast(ncol + 1)]) = std::numeric_limits::max(); return res; } private: S4 mat ; List li; bool is_stm; } ; // 30 November 2015 // default Exporter-Cube specialization: // handles cube, icube, and cx_cube // fails on fcube, ucube, and cx_fcube template class Exporter< arma::Cube > { public: typedef arma::Cube cube_t; enum { RTYPE = Rcpp::traits::r_sexptype_traits::rtype }; typedef typename Rcpp::traits::storage_type::type value_t; Exporter(SEXP x) : vec(x) {} cube_t get() { Rcpp::Vector dims = vec.attr("dim"); if (dims.size() != 3) { std::string msg = "Error converting object to arma::Cube:\n" "Input array must have exactly 3 dimensions.\n"; Rcpp::stop(msg); } cube_t result( reinterpret_cast(vec.begin()), dims[0], dims[1], dims[2], false); return result; } private: Rcpp::Vector vec; }; // specializations for 3 cube typedefs that fail above // first use viable conversion SEXP -> Cube // then use conv_to::from(other_t other) template <> class Exporter { public: typedef arma::fcube cube_t; Exporter(SEXP x) : tmp(Exporter(x).get()) {} cube_t get() { cube_t result = arma::conv_to::from(tmp); return result; } private: typedef arma::cube other_t; other_t tmp; }; template <> class Exporter { public: typedef arma::ucube cube_t; Exporter(SEXP x) : tmp(Exporter(x).get()) {} cube_t get() { cube_t result = arma::conv_to::from(tmp); return result; } private: typedef arma::icube other_t; other_t tmp; }; template <> class Exporter { public: typedef arma::cx_fcube cube_t; Exporter(SEXP x) : tmp(Exporter(x).get()) {} cube_t get() { cube_t result = arma::conv_to::from(tmp); return result; } private: typedef arma::cx_cube other_t; other_t tmp; }; } // end traits /* Begin Armadillo vector as support classes */ template ::type> class ArmaMat_InputParameter; template class ArmaMat_InputParameter { public: ArmaMat_InputParameter(SEXP x_) : m(x_), mat(reinterpret_cast(m.begin()), m.nrow(), m.ncol(), false) {} inline operator REF(){ return mat ; } private: Rcpp::Matrix< Rcpp::traits::r_sexptype_traits::rtype > m ; MAT mat ; } ; template class ArmaMat_InputParameter { public: ArmaMat_InputParameter( SEXP x_ ): m(x_), mat( as(m) ) {} inline operator REF(){ return mat ; } private: Rcpp::Matrix< Rcpp::traits::r_sexptype_traits::rtype > m ; MAT mat ; } ; /* End Armadillo vector as support classes */ /* Begin Armadillo vector as support classes */ template ::type> class ArmaVec_InputParameter; template class ArmaVec_InputParameter { public: ArmaVec_InputParameter( SEXP x_ ) : v(x_), vec( reinterpret_cast( v.begin() ), v.size(), false ){} inline operator REF(){ return vec ; } private: Rcpp::Vector< Rcpp::traits::r_sexptype_traits::rtype > v ; VEC vec ; } ; template class ArmaVec_InputParameter { public: ArmaVec_InputParameter( SEXP x_ ): v(x_), vec( as(v) ) {} inline operator REF(){ return vec ; } private: Rcpp::Vector< Rcpp::traits::r_sexptype_traits::rtype > v ; VEC vec ; } ; /* End Armadillo vector as support classes */ #define MAKE_INPUT_PARAMETER(INPUT_TYPE,TYPE,REF) \ template \ class INPUT_TYPE : public ArmaVec_InputParameter{ \ public: \ INPUT_TYPE( SEXP x) : ArmaVec_InputParameter(x){} \ } ; MAKE_INPUT_PARAMETER(ConstReferenceInputParameter, arma::Col, const arma::Col& ) MAKE_INPUT_PARAMETER(ReferenceInputParameter , arma::Col, arma::Col& ) MAKE_INPUT_PARAMETER(ConstInputParameter , arma::Col, const arma::Col ) MAKE_INPUT_PARAMETER(ConstReferenceInputParameter, arma::Row, const arma::Row& ) MAKE_INPUT_PARAMETER(ReferenceInputParameter , arma::Row, arma::Row& ) MAKE_INPUT_PARAMETER(ConstInputParameter , arma::Row, const arma::Row ) #undef MAKE_INPUT_PARAMETER #define MAKE_INPUT_PARAMETER(INPUT_TYPE,TYPE,REF) \ template \ class INPUT_TYPE : public ArmaMat_InputParameter{ \ public: \ INPUT_TYPE( SEXP x) : ArmaMat_InputParameter(x){} \ } ; MAKE_INPUT_PARAMETER(ConstReferenceInputParameter, arma::Mat, const arma::Mat& ) MAKE_INPUT_PARAMETER(ReferenceInputParameter , arma::Mat, arma::Mat& ) MAKE_INPUT_PARAMETER(ConstInputParameter , arma::Mat, const arma::Mat ) #undef MAKE_INPUT_PARAMETER } #endif RcppArmadillo/inst/include/armadillo_bits/0000755000176200001440000000000014173165614020400 5ustar liggesusersRcppArmadillo/inst/include/armadillo_bits/fn_wishrnd.hpp0000644000176200001440000001077114124060717023252 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_wishrnd //! @{ template arma_warn_unused inline typename enable_if2 < is_real::value, const Op >::result wishrnd(const Base& S, typename T1::elem_type df) { arma_extra_debug_sigprint(); return Op(S.get_ref(), df, uword(1), uword(0)); } template arma_warn_unused inline typename enable_if2 < is_real::value, const Op >::result wishrnd(const Base& S, typename T1::elem_type df, const Base& D) { arma_extra_debug_sigprint(); arma_ignore(S); return Op(D.get_ref(), df, uword(2), uword(0)); } template inline typename enable_if2 < is_real::value, bool >::result wishrnd(Mat& W, const Base& S, typename T1::elem_type df) { arma_extra_debug_sigprint(); const bool status = op_wishrnd::apply_direct(W, S.get_ref(), df, uword(1)); if(status == false) { W.soft_reset(); arma_debug_warn_level(3, "wishrnd(): given matrix is not symmetric positive definite"); } return status; } template inline typename enable_if2 < is_real::value, bool >::result wishrnd(Mat& W, const Base& S, typename T1::elem_type df, const Base& D) { arma_extra_debug_sigprint(); arma_ignore(S); const bool status = op_wishrnd::apply_direct(W, D.get_ref(), df, uword(2)); if(status == false) { W.soft_reset(); arma_debug_warn_level(3, "wishrnd(): problem with given 'D' matrix"); } return status; } // template arma_warn_unused inline typename enable_if2 < is_real::value, const Op >::result iwishrnd(const Base& T, typename T1::elem_type df) { arma_extra_debug_sigprint(); return Op(T.get_ref(), df, uword(1), uword(0)); } template arma_warn_unused inline typename enable_if2 < is_real::value, const Op >::result iwishrnd(const Base& T, typename T1::elem_type df, const Base& Dinv) { arma_extra_debug_sigprint(); arma_ignore(T); return Op(Dinv.get_ref(), df, uword(2), uword(0)); } template inline typename enable_if2 < is_real::value, bool >::result iwishrnd(Mat& W, const Base& T, typename T1::elem_type df) { arma_extra_debug_sigprint(); const bool status = op_iwishrnd::apply_direct(W, T.get_ref(), df, uword(1)); if(status == false) { W.soft_reset(); arma_debug_warn_level(3, "iwishrnd(): given matrix is not symmetric positive definite and/or df is too low"); } return status; } template inline typename enable_if2 < is_real::value, bool >::result iwishrnd(Mat& W, const Base& T, typename T1::elem_type df, const Base& Dinv) { arma_extra_debug_sigprint(); arma_ignore(T); const bool status = op_iwishrnd::apply_direct(W, Dinv.get_ref(), df, uword(2)); if(status == false) { W.soft_reset(); arma_debug_warn_level(3, "wishrnd(): problem with given 'Dinv' matrix and/or df is too low"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_hist.hpp0000644000176200001440000000376514124060717022550 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_hist //! @{ template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && is_cx::no, const mtOp >::result hist(const T1& A, const uword n_bins = 10) { arma_extra_debug_sigprint(); return mtOp(A, n_bins, 0); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && is_arma_type::value && is_cx::no && is_same_type::value, const mtGlue >::result hist(const T1& X, const T2& Y) { arma_extra_debug_sigprint(); return mtGlue(X, Y); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && is_arma_type::value && is_cx::no && is_same_type::value, const mtGlue >::result hist(const T1& X, const T2& Y, const uword dim) { arma_extra_debug_sigprint(); return mtGlue(X, Y, dim); } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_cov_meat.hpp0000644000176200001440000000406114124060717023715 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_cov //! @{ template inline void glue_cov::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword norm_type = X.aux_uword; const unwrap UA(X.A); const unwrap UB(X.B); const Mat& A = UA.M; const Mat& B = UB.M; const Mat& AA = (A.n_rows == 1) ? Mat(const_cast(A.memptr()), A.n_cols, A.n_rows, false, false) : Mat(const_cast(A.memptr()), A.n_rows, A.n_cols, false, false); const Mat& BB = (B.n_rows == 1) ? Mat(const_cast(B.memptr()), B.n_cols, B.n_rows, false, false) : Mat(const_cast(B.memptr()), B.n_rows, B.n_cols, false, false); arma_debug_assert_mul_size(AA, BB, true, false, "cov()"); if( (A.n_elem == 0) || (B.n_elem == 0) ) { out.reset(); return; } const uword N = AA.n_rows; const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N); const Mat tmp1 = AA.each_row() - mean(AA,0); const Mat tmp2 = BB.each_row() - mean(BB,0); out = tmp1.t() * tmp2; out /= norm_val; } //! @} RcppArmadillo/inst/include/armadillo_bits/subview_cube_each_meat.hpp0000644000176200001440000005435414124060717025566 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup subview_cube_each //! @{ // // // subview_cube_each_common template inline subview_cube_each_common::subview_cube_each_common(const Cube& in_p) : P(in_p) { arma_extra_debug_sigprint(); } template inline void subview_cube_each_common::check_size(const Mat& A) const { if(arma_config::debug) { if( (A.n_rows != P.n_rows) || (A.n_cols != P.n_cols) ) { arma_stop_logic_error( incompat_size_string(A) ); } } } template arma_cold inline const std::string subview_cube_each_common::incompat_size_string(const Mat& A) const { std::ostringstream tmp; tmp << "each_slice(): incompatible size; expected " << P.n_rows << 'x' << P.n_cols << ", got " << A.n_rows << 'x' << A.n_cols; return tmp.str(); } // // // subview_cube_each1 template inline subview_cube_each1::~subview_cube_each1() { arma_extra_debug_sigprint(); } template inline subview_cube_each1::subview_cube_each1(const Cube& in_p) : subview_cube_each_common::subview_cube_each_common(in_p) { arma_extra_debug_sigprint(); } template template inline void subview_cube_each1::operator= (const Base& in) { arma_extra_debug_sigprint(); Cube& p = access::rw(subview_cube_each_common::P); const unwrap tmp( in.get_ref() ); const Mat& A = tmp.M; subview_cube_each_common::check_size(A); const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; const eT* A_mem = A.memptr(); for(uword i=0; i < p_n_slices; ++i) { arrayops::copy( p.slice_memptr(i), A_mem, p_n_elem_slice ); } } template template inline void subview_cube_each1::operator+= (const Base& in) { arma_extra_debug_sigprint(); Cube& p = access::rw(subview_cube_each_common::P); const unwrap tmp( in.get_ref() ); const Mat& A = tmp.M; subview_cube_each_common::check_size(A); const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; const eT* A_mem = A.memptr(); for(uword i=0; i < p_n_slices; ++i) { arrayops::inplace_plus( p.slice_memptr(i), A_mem, p_n_elem_slice ); } } template template inline void subview_cube_each1::operator-= (const Base& in) { arma_extra_debug_sigprint(); Cube& p = access::rw(subview_cube_each_common::P); const unwrap tmp( in.get_ref() ); const Mat& A = tmp.M; subview_cube_each_common::check_size(A); const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; const eT* A_mem = A.memptr(); for(uword i=0; i < p_n_slices; ++i) { arrayops::inplace_minus( p.slice_memptr(i), A_mem, p_n_elem_slice ); } } template template inline void subview_cube_each1::operator%= (const Base& in) { arma_extra_debug_sigprint(); Cube& p = access::rw(subview_cube_each_common::P); const unwrap tmp( in.get_ref() ); const Mat& A = tmp.M; subview_cube_each_common::check_size(A); const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; const eT* A_mem = A.memptr(); for(uword i=0; i < p_n_slices; ++i) { arrayops::inplace_mul( p.slice_memptr(i), A_mem, p_n_elem_slice ); } } template template inline void subview_cube_each1::operator/= (const Base& in) { arma_extra_debug_sigprint(); Cube& p = access::rw(subview_cube_each_common::P); const unwrap tmp( in.get_ref() ); const Mat& A = tmp.M; subview_cube_each_common::check_size(A); const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; const eT* A_mem = A.memptr(); for(uword i=0; i < p_n_slices; ++i) { arrayops::inplace_div( p.slice_memptr(i), A_mem, p_n_elem_slice ); } } template template inline void subview_cube_each1::operator*= (const Base& in) { arma_extra_debug_sigprint(); Cube& C = access::rw(subview_cube_each_common::P); C = C.each_slice() * in.get_ref(); } // // // subview_cube_each2 template inline subview_cube_each2::~subview_cube_each2() { arma_extra_debug_sigprint(); } template inline subview_cube_each2::subview_cube_each2(const Cube& in_p, const Base& in_indices) : subview_cube_each_common::subview_cube_each_common(in_p) , base_indices(in_indices) { arma_extra_debug_sigprint(); } template inline void subview_cube_each2::check_indices(const Mat& indices) const { arma_debug_check( ((indices.is_vec() == false) && (indices.is_empty() == false)), "each_slice(): list of indices must be a vector" ); } template template inline void subview_cube_each2::operator= (const Base& in) { arma_extra_debug_sigprint(); Cube& p = access::rw(subview_cube_each_common::P); const unwrap tmp( in.get_ref() ); const Mat& A = tmp.M; subview_cube_each_common::check_size(A); const unwrap U( base_indices.get_ref() ); check_indices(U.M); const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword slice = indices_mem[i]; arma_debug_check_bounds( (slice >= p_n_slices), "each_slice(): index out of bounds" ); arrayops::copy(p.slice_memptr(slice), A_mem, p_n_elem_slice); } } template template inline void subview_cube_each2::operator+= (const Base& in) { arma_extra_debug_sigprint(); Cube& p = access::rw(subview_cube_each_common::P); const unwrap tmp( in.get_ref() ); const Mat& A = tmp.M; subview_cube_each_common::check_size(A); const unwrap U( base_indices.get_ref() ); check_indices(U.M); const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword slice = indices_mem[i]; arma_debug_check_bounds( (slice >= p_n_slices), "each_slice(): index out of bounds" ); arrayops::inplace_plus(p.slice_memptr(slice), A_mem, p_n_elem_slice); } } template template inline void subview_cube_each2::operator-= (const Base& in) { arma_extra_debug_sigprint(); Cube& p = access::rw(subview_cube_each_common::P); const unwrap tmp( in.get_ref() ); const Mat& A = tmp.M; subview_cube_each_common::check_size(A); const unwrap U( base_indices.get_ref() ); check_indices(U.M); const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword slice = indices_mem[i]; arma_debug_check_bounds( (slice >= p_n_slices), "each_slice(): index out of bounds" ); arrayops::inplace_minus(p.slice_memptr(slice), A_mem, p_n_elem_slice); } } template template inline void subview_cube_each2::operator%= (const Base& in) { arma_extra_debug_sigprint(); Cube& p = access::rw(subview_cube_each_common::P); const unwrap tmp( in.get_ref() ); const Mat& A = tmp.M; subview_cube_each_common::check_size(A); const unwrap U( base_indices.get_ref() ); check_indices(U.M); const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword slice = indices_mem[i]; arma_debug_check_bounds( (slice >= p_n_slices), "each_slice(): index out of bounds" ); arrayops::inplace_mul(p.slice_memptr(slice), A_mem, p_n_elem_slice); } } template template inline void subview_cube_each2::operator/= (const Base& in) { arma_extra_debug_sigprint(); Cube& p = access::rw(subview_cube_each_common::P); const unwrap tmp( in.get_ref() ); const Mat& A = tmp.M; subview_cube_each_common::check_size(A); const unwrap U( base_indices.get_ref() ); check_indices(U.M); const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword slice = indices_mem[i]; arma_debug_check_bounds( (slice >= p_n_slices), "each_slice(): index out of bounds" ); arrayops::inplace_div(p.slice_memptr(slice), A_mem, p_n_elem_slice); } } // // // subview_cube_each1_aux template inline Cube subview_cube_each1_aux::operator_plus ( const subview_cube_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); const Cube& p = X.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; const uword p_n_slices = p.n_slices; Cube out(p_n_rows, p_n_cols, p_n_slices, arma_nozeros_indicator()); const unwrap tmp(Y.get_ref()); const Mat& A = tmp.M; X.check_size(A); for(uword i=0; i < p_n_slices; ++i) { Mat out_slice( out.slice_memptr(i), p_n_rows, p_n_cols, false, true); const Mat p_slice(const_cast(p.slice_memptr(i)), p_n_rows, p_n_cols, false, true); out_slice = p_slice + A; } return out; } template inline Cube subview_cube_each1_aux::operator_minus ( const subview_cube_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); const Cube& p = X.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; const uword p_n_slices = p.n_slices; Cube out(p_n_rows, p_n_cols, p_n_slices, arma_nozeros_indicator()); const unwrap tmp(Y.get_ref()); const Mat& A = tmp.M; X.check_size(A); for(uword i=0; i < p_n_slices; ++i) { Mat out_slice( out.slice_memptr(i), p_n_rows, p_n_cols, false, true); const Mat p_slice(const_cast(p.slice_memptr(i)), p_n_rows, p_n_cols, false, true); out_slice = p_slice - A; } return out; } template inline Cube subview_cube_each1_aux::operator_minus ( const Base& X, const subview_cube_each1& Y ) { arma_extra_debug_sigprint(); const Cube& p = Y.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; const uword p_n_slices = p.n_slices; Cube out(p_n_rows, p_n_cols, p_n_slices, arma_nozeros_indicator()); const unwrap tmp(X.get_ref()); const Mat& A = tmp.M; Y.check_size(A); for(uword i=0; i < p_n_slices; ++i) { Mat out_slice( out.slice_memptr(i), p_n_rows, p_n_cols, false, true); const Mat p_slice(const_cast(p.slice_memptr(i)), p_n_rows, p_n_cols, false, true); out_slice = A - p_slice; } return out; } template inline Cube subview_cube_each1_aux::operator_schur ( const subview_cube_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); const Cube& p = X.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; const uword p_n_slices = p.n_slices; Cube out(p_n_rows, p_n_cols, p_n_slices, arma_nozeros_indicator()); const unwrap tmp(Y.get_ref()); const Mat& A = tmp.M; X.check_size(A); for(uword i=0; i < p_n_slices; ++i) { Mat out_slice( out.slice_memptr(i), p_n_rows, p_n_cols, false, true); const Mat p_slice(const_cast(p.slice_memptr(i)), p_n_rows, p_n_cols, false, true); out_slice = p_slice % A; } return out; } template inline Cube subview_cube_each1_aux::operator_div ( const subview_cube_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); const Cube& p = X.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; const uword p_n_slices = p.n_slices; Cube out(p_n_rows, p_n_cols, p_n_slices, arma_nozeros_indicator()); const unwrap tmp(Y.get_ref()); const Mat& A = tmp.M; X.check_size(A); for(uword i=0; i < p_n_slices; ++i) { Mat out_slice( out.slice_memptr(i), p_n_rows, p_n_cols, false, true); const Mat p_slice(const_cast(p.slice_memptr(i)), p_n_rows, p_n_cols, false, true); out_slice = p_slice / A; } return out; } template inline Cube subview_cube_each1_aux::operator_div ( const Base& X, const subview_cube_each1& Y ) { arma_extra_debug_sigprint(); const Cube& p = Y.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; const uword p_n_slices = p.n_slices; Cube out(p_n_rows, p_n_cols, p_n_slices, arma_nozeros_indicator()); const unwrap tmp(X.get_ref()); const Mat& A = tmp.M; Y.check_size(A); for(uword i=0; i < p_n_slices; ++i) { Mat out_slice( out.slice_memptr(i), p_n_rows, p_n_cols, false, true); const Mat p_slice(const_cast(p.slice_memptr(i)), p_n_rows, p_n_cols, false, true); out_slice = A / p_slice; } return out; } template inline Cube subview_cube_each1_aux::operator_times ( const subview_cube_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); const Cube& C = X.P; const unwrap tmp(Y.get_ref()); const Mat& M = tmp.M; Cube out(C.n_rows, M.n_cols, C.n_slices, arma_nozeros_indicator()); for(uword i=0; i < C.n_slices; ++i) { Mat out_slice( out.slice_memptr(i), C.n_rows, M.n_cols, false, true); const Mat C_slice(const_cast(C.slice_memptr(i)), C.n_rows, C.n_cols, false, true); out_slice = C_slice * M; } return out; } template inline Cube subview_cube_each1_aux::operator_times ( const Base& X, const subview_cube_each1& Y ) { arma_extra_debug_sigprint(); const unwrap tmp(X.get_ref()); const Mat& M = tmp.M; const Cube& C = Y.P; Cube out(M.n_rows, C.n_cols, C.n_slices, arma_nozeros_indicator()); for(uword i=0; i < C.n_slices; ++i) { Mat out_slice( out.slice_memptr(i), M.n_rows, C.n_cols, false, true); const Mat C_slice(const_cast(C.slice_memptr(i)), C.n_rows, C.n_cols, false, true); out_slice = M * C_slice; } return out; } // // // subview_cube_each2_aux template inline Cube subview_cube_each2_aux::operator_plus ( const subview_cube_each2& X, const Base& Y ) { arma_extra_debug_sigprint(); const Cube& p = X.P; const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; Cube out = p; const unwrap tmp(Y.get_ref()); const Mat& A = tmp.M; const unwrap U(X.base_indices.get_ref()); X.check_size(A); X.check_indices(U.M); const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword slice = indices_mem[i]; arma_debug_check_bounds( (slice >= p_n_slices), "each_slice(): index out of bounds" ); arrayops::inplace_plus(out.slice_memptr(slice), A_mem, p_n_elem_slice); } return out; } template inline Cube subview_cube_each2_aux::operator_minus ( const subview_cube_each2& X, const Base& Y ) { arma_extra_debug_sigprint(); const Cube& p = X.P; const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; Cube out = p; const unwrap tmp(Y.get_ref()); const Mat& A = tmp.M; const unwrap U(X.base_indices.get_ref()); X.check_size(A); X.check_indices(U.M); const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword slice = indices_mem[i]; arma_debug_check_bounds( (slice >= p_n_slices), "each_slice(): index out of bounds" ); arrayops::inplace_minus(out.slice_memptr(slice), A_mem, p_n_elem_slice); } return out; } template inline Cube subview_cube_each2_aux::operator_minus ( const Base& X, const subview_cube_each2& Y ) { arma_extra_debug_sigprint(); const Cube& p = Y.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; const uword p_n_slices = p.n_slices; Cube out = p; const unwrap tmp(X.get_ref()); const Mat& A = tmp.M; const unwrap U(Y.base_indices.get_ref()); Y.check_size(A); Y.check_indices(U.M); const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; for(uword i=0; i < N; ++i) { const uword slice = indices_mem[i]; arma_debug_check_bounds( (slice >= p_n_slices), "each_slice(): index out of bounds" ); Mat out_slice( out.slice_memptr(slice), p_n_rows, p_n_cols, false, true); const Mat p_slice(const_cast(p.slice_memptr(slice)), p_n_rows, p_n_cols, false, true); out_slice = A - p_slice; } return out; } template inline Cube subview_cube_each2_aux::operator_schur ( const subview_cube_each2& X, const Base& Y ) { arma_extra_debug_sigprint(); const Cube& p = X.P; const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; Cube out = p; const unwrap tmp(Y.get_ref()); const Mat& A = tmp.M; const unwrap U(X.base_indices.get_ref()); X.check_size(A); X.check_indices(U.M); const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword slice = indices_mem[i]; arma_debug_check_bounds( (slice >= p_n_slices), "each_slice(): index out of bounds" ); arrayops::inplace_mul(out.slice_memptr(slice), A_mem, p_n_elem_slice); } return out; } template inline Cube subview_cube_each2_aux::operator_div ( const subview_cube_each2& X, const Base& Y ) { arma_extra_debug_sigprint(); const Cube& p = X.P; const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; Cube out = p; const unwrap tmp(Y.get_ref()); const Mat& A = tmp.M; const unwrap U(X.base_indices.get_ref()); X.check_size(A); X.check_indices(U.M); const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword slice = indices_mem[i]; arma_debug_check_bounds( (slice >= p_n_slices), "each_slice(): index out of bounds" ); arrayops::inplace_div(out.slice_memptr(slice), A_mem, p_n_elem_slice); } return out; } template inline Cube subview_cube_each2_aux::operator_div ( const Base& X, const subview_cube_each2& Y ) { arma_extra_debug_sigprint(); const Cube& p = Y.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; const uword p_n_slices = p.n_slices; Cube out = p; const unwrap tmp(X.get_ref()); const Mat& A = tmp.M; const unwrap U(Y.base_indices.get_ref()); Y.check_size(A); Y.check_indices(U.M); const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; for(uword i=0; i < N; ++i) { const uword slice = indices_mem[i]; arma_debug_check_bounds( (slice >= p_n_slices), "each_slice(): index out of bounds" ); Mat out_slice( out.slice_memptr(slice), p_n_rows, p_n_cols, false, true); const Mat p_slice(const_cast(p.slice_memptr(slice)), p_n_rows, p_n_cols, false, true); out_slice = A / p_slice; } return out; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_cond_bones.hpp0000644000176200001440000000214614124060717023715 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_cond //! @{ class op_cond : public traits_op_default { public: template static inline typename T1::pod_type cond(const Base& X); template static inline typename T1::pod_type rcond(const Base& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/gmm_misc_meat.hpp0000644000176200001440000000612214124060717023705 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup gmm_misc //! @{ namespace gmm_priv { template inline running_mean_scalar::running_mean_scalar() : counter(uword(0)) , r_mean ( eT(0)) { arma_extra_debug_sigprint_this(this); } template inline running_mean_scalar::running_mean_scalar(const running_mean_scalar& in) : counter(in.counter) , r_mean (in.r_mean ) { arma_extra_debug_sigprint_this(this); } template inline const running_mean_scalar& running_mean_scalar::operator=(const running_mean_scalar& in) { arma_extra_debug_sigprint(); counter = in.counter; r_mean = in.r_mean; return *this; } template arma_hot inline void running_mean_scalar::operator() (const eT X) { arma_extra_debug_sigprint(); counter++; if(counter > 1) { const eT old_r_mean = r_mean; r_mean = old_r_mean + (X - old_r_mean)/counter; } else { r_mean = X; } } template inline void running_mean_scalar::reset() { arma_extra_debug_sigprint(); counter = 0; r_mean = eT(0); } template inline uword running_mean_scalar::count() const { return counter; } template inline eT running_mean_scalar::mean() const { return r_mean; } // // // template arma_inline eT distance::eval(const uword N, const eT* A, const eT* B, const eT*) { eT acc1 = eT(0); eT acc2 = eT(0); uword i,j; for(i=0, j=1; j arma_inline eT distance::eval(const uword N, const eT* A, const eT* B, const eT* C) { eT acc1 = eT(0); eT acc2 = eT(0); uword i,j; for(i=0, j=1; j inline void op_expmat::apply(Mat& out, const Op& expr) { arma_extra_debug_sigprint(); const bool status = op_expmat::apply_direct(out, expr.m); if(status == false) { out.soft_reset(); arma_stop_runtime_error("expmat(): given matrix appears ill-conditioned"); } } template inline bool op_expmat::apply_direct(Mat& out, const Base& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; if(is_op_diagmat::value) { out = expr.get_ref(); // force the evaluation of diagmat() arma_debug_check( (out.is_square() == false), "expmat(): given matrix must be square sized" ); const uword N = (std::min)(out.n_rows, out.n_cols); for(uword i=0; i A = expr.get_ref(); arma_debug_check( (A.is_square() == false), "expmat(): given matrix must be square sized" ); if(A.is_diagmat()) { arma_extra_debug_print("op_expmat: detected diagonal matrix"); const uword N = (std::min)(A.n_rows, A.n_cols); out.zeros(N,N); for(uword i=0; i eigval; Mat eigvec; const bool eig_status = eig_sym_helper(eigval, eigvec, A, 'd', "expmat()"); if(eig_status) { eigval = exp(eigval); out = eigvec * diagmat(eigval) * eigvec.t(); return true; } arma_extra_debug_print("op_expmat: sympd optimisation failed"); // fallthrough if eigen decomposition failed } const T norm_val = arma::norm(A, "inf"); const double log2_val = (norm_val > T(0)) ? double(eop_aux::log2(norm_val)) : double(0); int exponent = int(0); std::frexp(log2_val, &exponent); const uword s = uword( (std::max)(int(0), exponent + int(1)) ); A /= eT(eop_aux::pow(double(2), double(s))); T c = T(0.5); Mat E(A.n_rows, A.n_rows, fill::eye); E += c * A; Mat D(A.n_rows, A.n_rows, fill::eye); D -= c * A; Mat X = A; bool positive = true; const uword N = 6; for(uword i = 2; i <= N; ++i) { c = c * T(N - i + 1) / T(i * (2*N - i + 1)); X = A * X; E += c * X; if(positive) { D += c * X; } else { D -= c * X; } positive = (positive) ? false : true; } if( (D.is_finite() == false) || (E.is_finite() == false) ) { return false; } const bool status = solve(out, D, E, solve_opts::no_approx); if(status == false) { return false; } for(uword i=0; i < s; ++i) { out = out * out; } } return true; } template inline void op_expmat_sym::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); const bool status = op_expmat_sym::apply_direct(out, in.m); if(status == false) { out.soft_reset(); arma_stop_runtime_error("expmat_sym(): transformation failed"); } } template inline bool op_expmat_sym::apply_direct(Mat& out, const Base& expr) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; typedef typename T1::elem_type eT; const unwrap U(expr.get_ref()); const Mat& X = U.M; arma_debug_check( (X.is_square() == false), "expmat_sym(): given matrix must be square sized" ); Col< T> eigval; Mat eigvec; const bool status = eig_sym_helper(eigval, eigvec, X, 'd', "expmat_sym()"); if(status == false) { return false; } eigval = exp(eigval); out = eigvec * diagmat(eigval) * eigvec.t(); return true; } #else { arma_ignore(out); arma_ignore(expr); arma_stop_logic_error("expmat_sym(): use of LAPACK must be enabled"); return false; } #endif } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_min_meat.hpp0000644000176200001440000001033014124060717023705 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_min //! @{ template inline void glue_min::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy PA(X.A); const Proxy PB(X.B); if( (PA.is_alias(out) && PA.has_subview) || (PB.is_alias(out) && PB.has_subview) ) { Mat tmp; glue_min::apply(tmp, PA, PB); out.steal_mem(tmp); } else { glue_min::apply(out, PA, PB); } } template inline void glue_min::apply(Mat& out, const Proxy& PA, const Proxy& PB) { arma_extra_debug_sigprint(); const uword n_rows = PA.get_n_rows(); const uword n_cols = PA.get_n_cols(); arma_debug_assert_same_size(n_rows, n_cols, PB.get_n_rows(), PB.get_n_cols(), "element-wise min()"); const arma_lt_comparator comparator; out.set_size(n_rows, n_cols); eT* out_mem = out.memptr(); if( (Proxy::use_at == false) && (Proxy::use_at == false) ) { typename Proxy::ea_type A = PA.get_ea(); typename Proxy::ea_type B = PB.get_ea(); const uword N = PA.get_n_elem(); for(uword i=0; i inline void glue_min::apply(Cube& out, const GlueCube& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const ProxyCube PA(X.A); const ProxyCube PB(X.B); if( (PA.is_alias(out) && PA.has_subview) || (PB.is_alias(out) && PB.has_subview) ) { Cube tmp; glue_min::apply(tmp, PA, PB); out.steal_mem(tmp); } else { glue_min::apply(out, PA, PB); } } template inline void glue_min::apply(Cube& out, const ProxyCube& PA, const ProxyCube& PB) { arma_extra_debug_sigprint(); const uword n_rows = PA.get_n_rows(); const uword n_cols = PA.get_n_cols(); const uword n_slices = PA.get_n_slices(); arma_debug_assert_same_size(n_rows, n_cols, n_slices, PB.get_n_rows(), PB.get_n_cols(), PB.get_n_slices(), "element-wise min()"); const arma_lt_comparator comparator; out.set_size(n_rows, n_cols, n_slices); eT* out_mem = out.memptr(); if( (ProxyCube::use_at == false) && (ProxyCube::use_at == false) ) { typename ProxyCube::ea_type A = PA.get_ea(); typename ProxyCube::ea_type B = PB.get_ea(); const uword N = PA.get_n_elem(); for(uword i=0; i inline typename enable_if2< (is_real::value), void >::result normpdf_helper(Mat& out, const Base& X_expr, const Base& M_expr, const Base& S_expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(Proxy::use_at || Proxy::use_at || Proxy::use_at) { const quasi_unwrap UX(X_expr.get_ref()); const quasi_unwrap UM(M_expr.get_ref()); const quasi_unwrap US(S_expr.get_ref()); normpdf_helper(out, UX.M, UM.M, US.M); return; } const Proxy PX(X_expr.get_ref()); const Proxy PM(M_expr.get_ref()); const Proxy PS(S_expr.get_ref()); arma_debug_check( ( (PX.get_n_rows() != PM.get_n_rows()) || (PX.get_n_cols() != PM.get_n_cols()) || (PM.get_n_rows() != PS.get_n_rows()) || (PM.get_n_cols() != PS.get_n_cols()) ), "normpdf(): size mismatch" ); out.set_size(PX.get_n_rows(), PX.get_n_cols()); eT* out_mem = out.memptr(); const uword N = PX.get_n_elem(); typename Proxy::ea_type X_ea = PX.get_ea(); typename Proxy::ea_type M_ea = PM.get_ea(); typename Proxy::ea_type S_ea = PS.get_ea(); const bool use_mp = arma_config::openmp && mp_gate::eval(N); if(use_mp) { #if defined(ARMA_USE_OPENMP) { const int n_threads = mp_thread_limit::get(); #pragma omp parallel for schedule(static) num_threads(n_threads) for(uword i=0; i::sqrt2pi); } } #endif } else { for(uword i=0; i::sqrt2pi); } } } template inline arma_warn_unused typename enable_if2< (is_real::value), eT >::result normpdf(const eT x) { const eT out = std::exp(eT(-0.5) * (x*x)) / Datum::sqrt2pi; return out; } template inline arma_warn_unused typename enable_if2< (is_real::value), eT >::result normpdf(const eT x, const eT mu, const eT sigma) { const eT tmp = (x - mu) / sigma; const eT out = std::exp(eT(-0.5) * (tmp*tmp)) / (sigma * Datum::sqrt2pi); return out; } template inline arma_warn_unused typename enable_if2< (is_real::value), Mat >::result normpdf(const eT x, const Base& M_expr, const Base& S_expr) { arma_extra_debug_sigprint(); const quasi_unwrap UM(M_expr.get_ref()); const Mat& M = UM.M; Mat out; normpdf_helper(out, x*ones< Mat >(arma::size(M)), M, S_expr.get_ref()); return out; } template inline arma_warn_unused typename enable_if2< (is_real::value), Mat >::result normpdf(const Base& X_expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap UX(X_expr.get_ref()); const Mat& X = UX.M; Mat out; normpdf_helper(out, X, zeros< Mat >(arma::size(X)), ones< Mat >(arma::size(X))); return out; } template inline arma_warn_unused typename enable_if2< (is_real::value), Mat >::result normpdf(const Base& X_expr, const typename T1::elem_type mu, const typename T1::elem_type sigma) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap UX(X_expr.get_ref()); const Mat& X = UX.M; Mat out; normpdf_helper(out, X, mu*ones< Mat >(arma::size(X)), sigma*ones< Mat >(arma::size(X))); return out; } template inline arma_warn_unused typename enable_if2< (is_real::value), Mat >::result normpdf(const Base& X_expr, const Base& M_expr, const Base& S_expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; Mat out; normpdf_helper(out, X_expr.get_ref(), M_expr.get_ref(), S_expr.get_ref()); return out; } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_norm_bones.hpp0000644000176200001440000000265014124060717024310 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_norm //! @{ class spop_norm : public traits_op_default { public: template inline static typename get_pod_type::result mat_norm_1(const SpMat& X); template inline static typename get_pod_type::result mat_norm_2(const SpMat& X, const typename arma_real_only::result* junk = nullptr); template inline static typename get_pod_type::result mat_norm_2(const SpMat& X, const typename arma_cx_only::result* junk = nullptr); template inline static typename get_pod_type::result mat_norm_inf(const SpMat& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/eGlueCube_bones.hpp0000644000176200001440000000411714124060717024134 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup eGlueCube //! @{ template class eGlueCube : public BaseCube< typename T1::elem_type, eGlueCube > { public: typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool use_at = (ProxyCube::use_at || ProxyCube::use_at ); static constexpr bool use_mp = (ProxyCube::use_mp || ProxyCube::use_mp ); static constexpr bool has_subview = (ProxyCube::has_subview || ProxyCube::has_subview); arma_aligned const ProxyCube P1; arma_aligned const ProxyCube P2; arma_inline ~eGlueCube(); arma_inline eGlueCube(const T1& in_A, const T2& in_B); arma_inline uword get_n_rows() const; arma_inline uword get_n_cols() const; arma_inline uword get_n_elem_slice() const; arma_inline uword get_n_slices() const; arma_inline uword get_n_elem() const; arma_inline elem_type operator[] (const uword i) const; arma_inline elem_type at (const uword row, const uword col, const uword slice) const; arma_inline elem_type at_alt (const uword i) const; }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_interp1.hpp0000644000176200001440000002132714124060717023155 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_interp1 //! @{ template inline void interp1_helper_nearest(const Mat& XG, const Mat& YG, const Mat& XI, Mat& YI, const eT extrap_val) { arma_extra_debug_sigprint(); const eT XG_min = XG.min(); const eT XG_max = XG.max(); YI.copy_size(XI); const eT* XG_mem = XG.memptr(); const eT* YG_mem = YG.memptr(); const eT* XI_mem = XI.memptr(); eT* YI_mem = YI.memptr(); const uword NG = XG.n_elem; const uword NI = XI.n_elem; uword best_j = 0; for(uword i=0; i::inf; const eT XI_val = XI_mem[i]; if((XI_val < XG_min) || (XI_val > XG_max)) { YI_mem[i] = extrap_val; } else { // XG and XI are guaranteed to be sorted in ascending manner, // so start searching XG from last known optimum position for(uword j=best_j; j= eT(0)) ? tmp : -tmp; if(err >= best_err) { // error is going up, so we have found the optimum position break; } else { best_err = err; best_j = j; // remember the optimum position } } YI_mem[i] = YG_mem[best_j]; } } } template inline void interp1_helper_linear(const Mat& XG, const Mat& YG, const Mat& XI, Mat& YI, const eT extrap_val) { arma_extra_debug_sigprint(); const eT XG_min = XG.min(); const eT XG_max = XG.max(); YI.copy_size(XI); const eT* XG_mem = XG.memptr(); const eT* YG_mem = YG.memptr(); const eT* XI_mem = XI.memptr(); eT* YI_mem = YI.memptr(); const uword NG = XG.n_elem; const uword NI = XI.n_elem; uword a_best_j = 0; uword b_best_j = 0; for(uword i=0; i XG_max)) { YI_mem[i] = extrap_val; } else { // XG and XI are guaranteed to be sorted in ascending manner, // so start searching XG from last known optimum position eT a_best_err = Datum::inf; eT b_best_err = Datum::inf; for(uword j=a_best_j; j= eT(0)) ? tmp : -tmp; if(err >= a_best_err) { break; } else { a_best_err = err; a_best_j = j; } } if( (XG_mem[a_best_j] - XI_val) <= eT(0) ) { // a_best_j is to the left of the interpolated position b_best_j = ( (a_best_j+1) < NG) ? (a_best_j+1) : a_best_j; } else { // a_best_j is to the right of the interpolated position b_best_j = (a_best_j >= 1) ? (a_best_j-1) : a_best_j; } b_best_err = std::abs( XG_mem[b_best_j] - XI_val ); if(a_best_j > b_best_j) { std::swap(a_best_j, b_best_j ); std::swap(a_best_err, b_best_err); } const eT weight = (a_best_err > eT(0)) ? (a_best_err / (a_best_err + b_best_err)) : eT(0); YI_mem[i] = (eT(1) - weight)*YG_mem[a_best_j] + (weight)*YG_mem[b_best_j]; } } } template inline void interp1_helper(const Mat& X, const Mat& Y, const Mat& XI, Mat& YI, const uword sig, const eT extrap_val) { arma_extra_debug_sigprint(); arma_debug_check( ((X.is_vec() == false) || (Y.is_vec() == false) || (XI.is_vec() == false)), "interp1(): currently only vectors are supported" ); arma_debug_check( (X.n_elem != Y.n_elem), "interp1(): X and Y must have the same number of elements" ); arma_debug_check( (X.n_elem < 2), "interp1(): X must have at least two unique elements" ); // sig = 10: nearest neighbour // sig = 11: nearest neighbour, assume monotonic increase in X and XI // // sig = 20: linear // sig = 21: linear, assume monotonic increase in X and XI if(sig == 11) { interp1_helper_nearest(X, Y, XI, YI, extrap_val); return; } if(sig == 21) { interp1_helper_linear (X, Y, XI, YI, extrap_val); return; } uvec X_indices; try { X_indices = find_unique(X,false); } catch(...) { } // NOTE: find_unique(X,false) provides indices of elements sorted in ascending order // NOTE: find_unique(X,false) will reset X_indices if X has NaN const uword N_subset = X_indices.n_elem; arma_debug_check( (N_subset < 2), "interp1(): X must have at least two unique elements" ); Mat X_sanitised(N_subset, 1, arma_nozeros_indicator()); Mat Y_sanitised(N_subset, 1, arma_nozeros_indicator()); eT* X_sanitised_mem = X_sanitised.memptr(); eT* Y_sanitised_mem = Y_sanitised.memptr(); const eT* X_mem = X.memptr(); const eT* Y_mem = Y.memptr(); const uword* X_indices_mem = X_indices.memptr(); for(uword i=0; i XI_tmp; uvec XI_indices; const bool XI_is_sorted = XI.is_sorted(); if(XI_is_sorted == false) { XI_indices = sort_index(XI); const uword N = XI.n_elem; XI_tmp.copy_size(XI); const uword* XI_indices_mem = XI_indices.memptr(); const eT* XI_mem = XI.memptr(); eT* XI_tmp_mem = XI_tmp.memptr(); for(uword i=0; i& XI_sorted = (XI_is_sorted) ? XI : XI_tmp; if(sig == 10) { interp1_helper_nearest(X_sanitised, Y_sanitised, XI_sorted, YI, extrap_val); } else if(sig == 20) { interp1_helper_linear (X_sanitised, Y_sanitised, XI_sorted, YI, extrap_val); } if( (XI_is_sorted == false) && (YI.n_elem > 0) ) { Mat YI_unsorted; YI_unsorted.copy_size(YI); const eT* YI_mem = YI.memptr(); eT* YI_unsorted_mem = YI_unsorted.memptr(); const uword N = XI_sorted.n_elem; const uword* XI_indices_mem = XI_indices.memptr(); for(uword i=0; i inline typename enable_if2 < is_real::value, void >::result interp1 ( const Base& X, const Base& Y, const Base& XI, Mat& YI, const char* method = "linear", const typename T1::elem_type extrap_val = Datum::nan ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; uword sig = 0; if(method != nullptr) if(method[0] != char(0)) if(method[1] != char(0)) { const char c1 = method[0]; const char c2 = method[1]; if(c1 == 'n') { sig = 10; } // nearest neighbour else if(c1 == 'l') { sig = 20; } // linear else { if( (c1 == '*') && (c2 == 'n') ) { sig = 11; } // nearest neighour, assume monotonic increase in X and XI if( (c1 == '*') && (c2 == 'l') ) { sig = 21; } // linear, assume monotonic increase in X and XI } } arma_debug_check( (sig == 0), "interp1(): unsupported interpolation type" ); const quasi_unwrap X_tmp( X.get_ref()); const quasi_unwrap Y_tmp( Y.get_ref()); const quasi_unwrap XI_tmp(XI.get_ref()); if( X_tmp.is_alias(YI) || Y_tmp.is_alias(YI) || XI_tmp.is_alias(YI) ) { Mat tmp; interp1_helper(X_tmp.M, Y_tmp.M, XI_tmp.M, tmp, sig, extrap_val); YI.steal_mem(tmp); } else { interp1_helper(X_tmp.M, Y_tmp.M, XI_tmp.M, YI, sig, extrap_val); } } //! @} RcppArmadillo/inst/include/armadillo_bits/op_trimat_bones.hpp0000644000176200001440000000417514124060717024276 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_trimat //! @{ // NOTE: don't split op_trimat into seperate op_trimatu and op_trimatl classes, // NOTE: as several instances elsewhere rely on trimatu() and trimatl() producing the same type class op_trimat : public traits_op_default { public: template inline static void fill_zeros(Mat& A, const bool upper); // template inline static void apply(Mat& out, const Op& in); template inline static void apply_unwrap(Mat& out, const Mat& A, const bool upper); template inline static void apply_proxy(Mat& out, const Proxy& P, const bool upper); }; class op_trimatu_ext : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); template inline static void fill_zeros(Mat& A, const uword row_offset, const uword col_offset); }; class op_trimatl_ext : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); template inline static void fill_zeros(Mat& A, const uword row_offset, const uword col_offset); }; //! @} RcppArmadillo/inst/include/armadillo_bits/Row_meat.hpp0000644000176200001440000011307514124060717022667 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup Row //! @{ //! construct an empty row vector template inline Row::Row() : Mat(arma_vec_indicator(), 2) { arma_extra_debug_sigprint(); } template inline Row::Row(const Row& X) : Mat(arma_vec_indicator(), 1, X.n_elem, 2) { arma_extra_debug_sigprint(); arrayops::copy((*this).memptr(), X.memptr(), X.n_elem); } //! construct a row vector with the specified number of n_elem template inline Row::Row(const uword in_n_elem) : Mat(arma_vec_indicator(), 1, in_n_elem, 2) { arma_extra_debug_sigprint(); #if (!defined(ARMA_DONT_ZERO_INIT)) { arma_extra_debug_print("Row::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } #endif } template inline Row::Row(const uword in_n_rows, const uword in_n_cols) : Mat(arma_vec_indicator(), 0, 0, 2) { arma_extra_debug_sigprint(); Mat::init_warm(in_n_rows, in_n_cols); #if (!defined(ARMA_DONT_ZERO_INIT)) { arma_extra_debug_print("Row::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } #endif } template inline Row::Row(const SizeMat& s) : Mat(arma_vec_indicator(), 0, 0, 2) { arma_extra_debug_sigprint(); Mat::init_warm(s.n_rows, s.n_cols); #if (!defined(ARMA_DONT_ZERO_INIT)) { arma_extra_debug_print("Row::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } #endif } //! internal use only template template inline Row::Row(const uword in_n_elem, const arma_initmode_indicator&) : Mat(arma_vec_indicator(), 1, in_n_elem, 2) { arma_extra_debug_sigprint(); if(do_zeros) { arma_extra_debug_print("Row::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } } //! internal use only template template inline Row::Row(const uword in_n_rows, const uword in_n_cols, const arma_initmode_indicator&) : Mat(arma_vec_indicator(), 0, 0, 2) { arma_extra_debug_sigprint(); Mat::init_warm(in_n_rows, in_n_cols); if(do_zeros) { arma_extra_debug_print("Row::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } } //! internal use only template template inline Row::Row(const SizeMat& s, const arma_initmode_indicator&) : Mat(arma_vec_indicator(), 0, 0, 2) { arma_extra_debug_sigprint(); Mat::init_warm(s.n_rows, s.n_cols); if(do_zeros) { arma_extra_debug_print("Row::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } } template template inline Row::Row(const uword in_n_elem, const fill::fill_class& f) : Mat(arma_vec_indicator(), 1, in_n_elem, 2) { arma_extra_debug_sigprint(); (*this).fill(f); } template template inline Row::Row(const uword in_n_rows, const uword in_n_cols, const fill::fill_class& f) : Mat(arma_vec_indicator(), 0, 0, 2) { arma_extra_debug_sigprint(); Mat::init_warm(in_n_rows, in_n_cols); (*this).fill(f); } template template inline Row::Row(const SizeMat& s, const fill::fill_class& f) : Mat(arma_vec_indicator(), 0, 0, 2) { arma_extra_debug_sigprint(); Mat::init_warm(s.n_rows, s.n_cols); (*this).fill(f); } template inline Row::Row(const uword in_n_elem, const fill::scalar_holder f) : Mat(arma_vec_indicator(), 1, in_n_elem, 2) { arma_extra_debug_sigprint(); (*this).fill(f.scalar); } template inline Row::Row(const uword in_n_rows, const uword in_n_cols, const fill::scalar_holder f) : Mat(arma_vec_indicator(), 0, 0, 2) { arma_extra_debug_sigprint(); Mat::init_warm(in_n_rows, in_n_cols); (*this).fill(f.scalar); } template inline Row::Row(const SizeMat& s, const fill::scalar_holder f) : Mat(arma_vec_indicator(), 0, 0, 2) { arma_extra_debug_sigprint(); Mat::init_warm(s.n_rows, s.n_cols); (*this).fill(f.scalar); } template inline Row::Row(const char* text) : Mat(arma_vec_indicator(), 2) { arma_extra_debug_sigprint(); (*this).operator=(text); } template inline Row& Row::operator=(const char* text) { arma_extra_debug_sigprint(); Mat tmp(text); arma_debug_check( ((tmp.n_elem > 0) && (tmp.is_vec() == false)), "Mat::init(): requested size is not compatible with row vector layout" ); access::rw(tmp.n_rows) = 1; access::rw(tmp.n_cols) = tmp.n_elem; (*this).steal_mem(tmp); return *this; } template inline Row::Row(const std::string& text) : Mat(arma_vec_indicator(), 2) { arma_extra_debug_sigprint(); (*this).operator=(text); } template inline Row& Row::operator=(const std::string& text) { arma_extra_debug_sigprint(); Mat tmp(text); arma_debug_check( ((tmp.n_elem > 0) && (tmp.is_vec() == false)), "Mat::init(): requested size is not compatible with row vector layout" ); access::rw(tmp.n_rows) = 1; access::rw(tmp.n_cols) = tmp.n_elem; (*this).steal_mem(tmp); return *this; } //! create a row vector from std::vector template inline Row::Row(const std::vector& x) : Mat(arma_vec_indicator(), 1, uword(x.size()), 2) { arma_extra_debug_sigprint_this(this); if(x.size() > 0) { arrayops::copy( Mat::memptr(), &(x[0]), uword(x.size()) ); } } //! create a row vector from std::vector template inline Row& Row::operator=(const std::vector& x) { arma_extra_debug_sigprint(); Mat::init_warm(1, uword(x.size())); if(x.size() > 0) { arrayops::copy( Mat::memptr(), &(x[0]), uword(x.size()) ); } return *this; } template inline Row::Row(const std::initializer_list& list) : Mat(arma_vec_indicator(), 2) { arma_extra_debug_sigprint(); (*this).operator=(list); } template inline Row& Row::operator=(const std::initializer_list& list) { arma_extra_debug_sigprint(); Mat tmp(list); arma_debug_check( ((tmp.n_elem > 0) && (tmp.is_vec() == false)), "Mat::init(): requested size is not compatible with row vector layout" ); access::rw(tmp.n_rows) = 1; access::rw(tmp.n_cols) = tmp.n_elem; (*this).steal_mem(tmp); return *this; } template inline Row::Row(Row&& X) : Mat(arma_vec_indicator(), 2) { arma_extra_debug_sigprint(arma_str::format("this = %x X = %x") % this % &X); access::rw(Mat::n_rows) = 1; access::rw(Mat::n_cols) = X.n_cols; access::rw(Mat::n_elem) = X.n_elem; access::rw(Mat::n_alloc) = X.n_alloc; if( (X.n_alloc > arma_config::mat_prealloc) || (X.mem_state == 1) || (X.mem_state == 2) ) { access::rw(Mat::mem_state) = X.mem_state; access::rw(Mat::mem) = X.mem; access::rw(X.n_rows) = 1; access::rw(X.n_cols) = 0; access::rw(X.n_elem) = 0; access::rw(X.n_alloc) = 0; access::rw(X.mem_state) = 0; access::rw(X.mem) = nullptr; } else // condition: (X.n_alloc <= arma_config::mat_prealloc) || (X.mem_state == 0) || (X.mem_state == 3) { (*this).init_cold(); arrayops::copy( (*this).memptr(), X.mem, X.n_elem ); if( (X.mem_state == 0) && (X.n_alloc <= arma_config::mat_prealloc) ) { access::rw(X.n_rows) = 1; access::rw(X.n_cols) = 0; access::rw(X.n_elem) = 0; access::rw(X.mem) = nullptr; } } } template inline Row& Row::operator=(Row&& X) { arma_extra_debug_sigprint(arma_str::format("this = %x X = %x") % this % &X); (*this).steal_mem(X); if( (X.mem_state == 0) && (X.n_alloc <= arma_config::mat_prealloc) && (this != &X) ) { access::rw(X.n_rows) = 1; access::rw(X.n_cols) = 0; access::rw(X.n_elem) = 0; access::rw(X.mem) = nullptr; } return *this; } template inline Row& Row::operator=(const eT val) { arma_extra_debug_sigprint(); Mat::operator=(val); return *this; } template inline Row& Row::operator=(const Row& X) { arma_extra_debug_sigprint(); Mat::operator=(X); return *this; } template template inline Row::Row(const Base& X) : Mat(arma_vec_indicator(), 2) { arma_extra_debug_sigprint(); Mat::operator=(X.get_ref()); } template template inline Row& Row::operator=(const Base& X) { arma_extra_debug_sigprint(); Mat::operator=(X.get_ref()); return *this; } template template inline Row::Row(const SpBase& X) : Mat(arma_vec_indicator(), 2) { arma_extra_debug_sigprint(); Mat::operator=(X.get_ref()); } template template inline Row& Row::operator=(const SpBase& X) { arma_extra_debug_sigprint(); Mat::operator=(X.get_ref()); return *this; } //! construct a row vector from a given auxiliary array template inline Row::Row(eT* aux_mem, const uword aux_length, const bool copy_aux_mem, const bool strict) : Mat(aux_mem, 1, aux_length, copy_aux_mem, strict) { arma_extra_debug_sigprint(); access::rw(Mat::vec_state) = 2; } //! construct a row vector from a given auxiliary array template inline Row::Row(const eT* aux_mem, const uword aux_length) : Mat(aux_mem, 1, aux_length) { arma_extra_debug_sigprint(); access::rw(Mat::vec_state) = 2; } template template inline Row::Row ( const Base::pod_type, T1>& A, const Base::pod_type, T2>& B ) { arma_extra_debug_sigprint(); access::rw(Mat::vec_state) = 2; Mat::init(A,B); } template template inline Row::Row(const BaseCube& X) { arma_extra_debug_sigprint(); access::rw(Mat::vec_state) = 2; Mat::operator=(X); } template template inline Row& Row::operator=(const BaseCube& X) { arma_extra_debug_sigprint(); Mat::operator=(X); return *this; } template inline Row::Row(const subview_cube& X) { arma_extra_debug_sigprint(); access::rw(Mat::vec_state) = 2; Mat::operator=(X); } template inline Row& Row::operator=(const subview_cube& X) { arma_extra_debug_sigprint(); Mat::operator=(X); return *this; } template inline arma_cold mat_injector< Row > Row::operator<<(const eT val) { return mat_injector< Row >(*this, val); } template arma_inline arma_warn_unused const Op,op_htrans> Row::t() const { return Op,op_htrans>(*this); } template arma_inline arma_warn_unused const Op,op_htrans> Row::ht() const { return Op,op_htrans>(*this); } template arma_inline arma_warn_unused const Op,op_strans> Row::st() const { return Op,op_strans>(*this); } template arma_inline arma_warn_unused const Op,op_strans> Row::as_col() const { return Op,op_strans>(*this); } template arma_inline subview_row Row::col(const uword in_col1) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (in_col1 >= Mat::n_cols), "Row::col(): indices out of bounds or incorrectly used" ); return subview_row(*this, 0, in_col1, 1); } template arma_inline const subview_row Row::col(const uword in_col1) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (in_col1 >= Mat::n_cols), "Row::col(): indices out of bounds or incorrectly used" ); return subview_row(*this, 0, in_col1, 1); } template arma_inline subview_row Row::cols(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds( ( (in_col1 > in_col2) || (in_col2 >= Mat::n_cols) ), "Row::cols(): indices out of bounds or incorrectly used" ); const uword subview_n_cols = in_col2 - in_col1 + 1; return subview_row(*this, 0, in_col1, subview_n_cols); } template arma_inline const subview_row Row::cols(const uword in_col1, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( ( (in_col1 > in_col2) || (in_col2 >= Mat::n_cols) ), "Row::cols(): indices out of bounds or incorrectly used" ); const uword subview_n_cols = in_col2 - in_col1 + 1; return subview_row(*this, 0, in_col1, subview_n_cols); } template arma_inline subview_row Row::subvec(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds( ( (in_col1 > in_col2) || (in_col2 >= Mat::n_cols) ), "Row::subvec(): indices out of bounds or incorrectly used" ); const uword subview_n_cols = in_col2 - in_col1 + 1; return subview_row(*this, 0, in_col1, subview_n_cols); } template arma_inline const subview_row Row::subvec(const uword in_col1, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( ( (in_col1 > in_col2) || (in_col2 >= Mat::n_cols) ), "Row::subvec(): indices out of bounds or incorrectly used" ); const uword subview_n_cols = in_col2 - in_col1 + 1; return subview_row(*this, 0, in_col1, subview_n_cols); } template arma_inline subview_row Row::cols(const span& col_span) { arma_extra_debug_sigprint(); return subvec(col_span); } template arma_inline const subview_row Row::cols(const span& col_span) const { arma_extra_debug_sigprint(); return subvec(col_span); } template arma_inline subview_row Row::subvec(const span& col_span) { arma_extra_debug_sigprint(); const bool col_all = col_span.whole; const uword local_n_cols = Mat::n_cols; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword subvec_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds( ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ), "Row::subvec(): indices out of bounds or incorrectly used" ); return subview_row(*this, 0, in_col1, subvec_n_cols); } template arma_inline const subview_row Row::subvec(const span& col_span) const { arma_extra_debug_sigprint(); const bool col_all = col_span.whole; const uword local_n_cols = Mat::n_cols; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword subvec_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds( ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ), "Row::subvec(): indices out of bounds or incorrectly used" ); return subview_row(*this, 0, in_col1, subvec_n_cols); } template arma_inline subview_row Row::operator()(const span& col_span) { arma_extra_debug_sigprint(); return subvec(col_span); } template arma_inline const subview_row Row::operator()(const span& col_span) const { arma_extra_debug_sigprint(); return subvec(col_span); } template arma_inline subview_row Row::subvec(const uword start_col, const SizeMat& s) { arma_extra_debug_sigprint(); arma_debug_check( (s.n_rows != 1), "Row::subvec(): given size does not specify a row vector" ); arma_debug_check_bounds( ( (start_col >= Mat::n_cols) || ((start_col + s.n_cols) > Mat::n_cols) ), "Row::subvec(): size out of bounds" ); return subview_row(*this, 0, start_col, s.n_cols); } template arma_inline const subview_row Row::subvec(const uword start_col, const SizeMat& s) const { arma_extra_debug_sigprint(); arma_debug_check( (s.n_rows != 1), "Row::subvec(): given size does not specify a row vector" ); arma_debug_check_bounds( ( (start_col >= Mat::n_cols) || ((start_col + s.n_cols) > Mat::n_cols) ), "Row::subvec(): size out of bounds" ); return subview_row(*this, 0, start_col, s.n_cols); } template arma_inline subview_row Row::head(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > Mat::n_cols), "Row::head(): size out of bounds" ); return subview_row(*this, 0, 0, N); } template arma_inline const subview_row Row::head(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > Mat::n_cols), "Row::head(): size out of bounds" ); return subview_row(*this, 0, 0, N); } template arma_inline subview_row Row::tail(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > Mat::n_cols), "Row::tail(): size out of bounds" ); const uword start_col = Mat::n_cols - N; return subview_row(*this, 0, start_col, N); } template arma_inline const subview_row Row::tail(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > Mat::n_cols), "Row::tail(): size out of bounds" ); const uword start_col = Mat::n_cols - N; return subview_row(*this, 0, start_col, N); } template arma_inline subview_row Row::head_cols(const uword N) { arma_extra_debug_sigprint(); return (*this).head(N); } template arma_inline const subview_row Row::head_cols(const uword N) const { arma_extra_debug_sigprint(); return (*this).head(N); } template arma_inline subview_row Row::tail_cols(const uword N) { arma_extra_debug_sigprint(); return (*this).tail(N); } template arma_inline const subview_row Row::tail_cols(const uword N) const { arma_extra_debug_sigprint(); return (*this).tail(N); } //! remove specified columns template inline void Row::shed_col(const uword col_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( col_num >= Mat::n_cols, "Row::shed_col(): index out of bounds" ); shed_cols(col_num, col_num); } //! remove specified columns template inline void Row::shed_cols(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_col1 > in_col2) || (in_col2 >= Mat::n_cols), "Row::shed_cols(): indices out of bounds or incorrectly used" ); const uword n_keep_front = in_col1; const uword n_keep_back = Mat::n_cols - (in_col2 + 1); Row X(n_keep_front + n_keep_back, arma_nozeros_indicator()); eT* X_mem = X.memptr(); const eT* t_mem = (*this).memptr(); if(n_keep_front > 0) { arrayops::copy( X_mem, t_mem, n_keep_front ); } if(n_keep_back > 0) { arrayops::copy( &(X_mem[n_keep_front]), &(t_mem[in_col2+1]), n_keep_back); } Mat::steal_mem(X); } //! remove specified columns template template inline void Row::shed_cols(const Base& indices) { arma_extra_debug_sigprint(); Mat::shed_cols(indices); } //! insert N cols at the specified col position, //! optionally setting the elements of the inserted cols to zero template inline void Row::insert_cols(const uword col_num, const uword N, const bool set_to_zero) { arma_extra_debug_sigprint(); const uword t_n_cols = Mat::n_cols; const uword A_n_cols = col_num; const uword B_n_cols = t_n_cols - col_num; // insertion at col_num == n_cols is in effect an append operation arma_debug_check_bounds( (col_num > t_n_cols), "Row::insert_cols(): index out of bounds" ); if(N > 0) { Row out(t_n_cols + N, arma_nozeros_indicator()); eT* out_mem = out.memptr(); const eT* t_mem = (*this).memptr(); if(A_n_cols > 0) { arrayops::copy( out_mem, t_mem, A_n_cols ); } if(B_n_cols > 0) { arrayops::copy( &(out_mem[col_num + N]), &(t_mem[col_num]), B_n_cols ); } if(set_to_zero) { arrayops::inplace_set( &(out_mem[col_num]), eT(0), N ); } Mat::steal_mem(out); } } //! insert the given object at the specified col position; //! the given object must have one row template template inline void Row::insert_cols(const uword col_num, const Base& X) { arma_extra_debug_sigprint(); Mat::insert_cols(col_num, X); } template arma_inline arma_warn_unused eT& Row::at(const uword i) { return access::rw(Mat::mem[i]); } template arma_inline arma_warn_unused const eT& Row::at(const uword i) const { return Mat::mem[i]; } template arma_inline arma_warn_unused eT& Row::at(const uword, const uword in_col) { return access::rw( Mat::mem[in_col] ); } template arma_inline arma_warn_unused const eT& Row::at(const uword, const uword in_col) const { return Mat::mem[in_col]; } template inline typename Row::row_iterator Row::begin_row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (row_num >= Mat::n_rows), "Row::begin_row(): index out of bounds" ); return Mat::memptr(); } template inline typename Row::const_row_iterator Row::begin_row(const uword row_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (row_num >= Mat::n_rows), "Row::begin_row(): index out of bounds" ); return Mat::memptr(); } template inline typename Row::row_iterator Row::end_row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (row_num >= Mat::n_rows), "Row::end_row(): index out of bounds" ); return Mat::memptr() + Mat::n_cols; } template inline typename Row::const_row_iterator Row::end_row(const uword row_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (row_num >= Mat::n_rows), "Row::end_row(): index out of bounds" ); return Mat::memptr() + Mat::n_cols; } template template arma_inline Row::fixed::fixed() : Row( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); #if (!defined(ARMA_DONT_ZERO_INIT)) { arma_extra_debug_print("Row::fixed::constructor: zeroing memory"); eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat::mem_local[0]); arrayops::inplace_set_fixed( mem_use, eT(0) ); } #endif } template template arma_inline Row::fixed::fixed(const fixed& X) : Row( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); eT* dest = (use_extra) ? mem_local_extra : Mat::mem_local; const eT* src = (use_extra) ? X.mem_local_extra : X.mem_local; arrayops::copy( dest, src, fixed_n_elem ); } template template arma_inline Row::fixed::fixed(const subview_cube& X) : Row( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); Row::operator=(X); } template template inline Row::fixed::fixed(const fill::scalar_holder f) : Row( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); (*this).fill(f.scalar); } template template template inline Row::fixed::fixed(const fill::fill_class&) : Row( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); if(is_same_type::yes) { (*this).zeros(); } if(is_same_type::yes) { (*this).ones(); } if(is_same_type::yes) { (*this).eye(); } if(is_same_type::yes) { (*this).randu(); } if(is_same_type::yes) { (*this).randn(); } } template template template arma_inline Row::fixed::fixed(const Base& A) : Row( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); Row::operator=(A.get_ref()); } template template template arma_inline Row::fixed::fixed(const Base& A, const Base& B) : Row( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); Row::init(A,B); } template template inline Row::fixed::fixed(const eT* aux_mem) : Row( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); eT* dest = (use_extra) ? mem_local_extra : Mat::mem_local; arrayops::copy( dest, aux_mem, fixed_n_elem ); } template template inline Row::fixed::fixed(const char* text) : Row( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); Row::operator=(text); } template template inline Row::fixed::fixed(const std::string& text) : Row( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); Row::operator=(text); } template template template Row& Row::fixed::operator=(const Base& A) { arma_extra_debug_sigprint(); Row::operator=(A.get_ref()); return *this; } template template Row& Row::fixed::operator=(const eT val) { arma_extra_debug_sigprint(); Row::operator=(val); return *this; } template template Row& Row::fixed::operator=(const char* text) { arma_extra_debug_sigprint(); Row::operator=(text); return *this; } template template Row& Row::fixed::operator=(const std::string& text) { arma_extra_debug_sigprint(); Row::operator=(text); return *this; } template template Row& Row::fixed::operator=(const subview_cube& X) { arma_extra_debug_sigprint(); Row::operator=(X); return *this; } template template inline Row::fixed::fixed(const std::initializer_list& list) : Row( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); (*this).operator=(list); } template template inline Row& Row::fixed::operator=(const std::initializer_list& list) { arma_extra_debug_sigprint(); const uword N = uword(list.size()); arma_debug_check( (N > fixed_n_elem), "Row::fixed: initialiser list is too long" ); eT* this_mem = (*this).memptr(); arrayops::copy( this_mem, list.begin(), N ); for(uword iq=N; iq < fixed_n_elem; ++iq) { this_mem[iq] = eT(0); } return *this; } template template arma_inline Row& Row::fixed::operator=(const fixed& X) { arma_extra_debug_sigprint(); if(this != &X) { eT* dest = (use_extra) ? mem_local_extra : Mat::mem_local; const eT* src = (use_extra) ? X.mem_local_extra : X.mem_local; arrayops::copy( dest, src, fixed_n_elem ); } return *this; } #if defined(ARMA_GOOD_COMPILER) template template template inline Row& Row::fixed::operator=(const eOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const bool bad_alias = (eOp::proxy_type::has_subview && X.P.is_alias(*this)); if(bad_alias == false) { arma_debug_assert_same_size(uword(1), fixed_n_elem, X.get_n_rows(), X.get_n_cols(), "Row::fixed::operator="); eop_type::apply(*this, X); } else { arma_extra_debug_print("bad_alias = true"); Row tmp(X); (*this) = tmp; } return *this; } template template template inline Row& Row::fixed::operator=(const eGlue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); const bool bad_alias = ( (eGlue::proxy1_type::has_subview && X.P1.is_alias(*this)) || (eGlue::proxy2_type::has_subview && X.P2.is_alias(*this)) ); if(bad_alias == false) { arma_debug_assert_same_size(uword(1), fixed_n_elem, X.get_n_rows(), X.get_n_cols(), "Row::fixed::operator="); eglue_type::apply(*this, X); } else { arma_extra_debug_print("bad_alias = true"); Row tmp(X); (*this) = tmp; } return *this; } #endif template template arma_inline arma_warn_unused const Op< typename Row::template fixed::Row_fixed_type, op_htrans > Row::fixed::t() const { return Op< typename Row::template fixed::Row_fixed_type, op_htrans >(*this); } template template arma_inline arma_warn_unused const Op< typename Row::template fixed::Row_fixed_type, op_htrans > Row::fixed::ht() const { return Op< typename Row::template fixed::Row_fixed_type, op_htrans >(*this); } template template arma_inline arma_warn_unused const Op< typename Row::template fixed::Row_fixed_type, op_strans > Row::fixed::st() const { return Op< typename Row::template fixed::Row_fixed_type, op_strans >(*this); } template template arma_inline arma_warn_unused const eT& Row::fixed::at_alt(const uword ii) const { #if defined(ARMA_HAVE_ALIGNED_ATTRIBUTE) return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; #else const eT* mem_aligned = (use_extra) ? mem_local_extra : Mat::mem_local; memory::mark_as_aligned(mem_aligned); return mem_aligned[ii]; #endif } template template arma_inline arma_warn_unused eT& Row::fixed::operator[] (const uword ii) { return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; } template template arma_inline arma_warn_unused const eT& Row::fixed::operator[] (const uword ii) const { return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; } template template arma_inline arma_warn_unused eT& Row::fixed::at(const uword ii) { return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; } template template arma_inline arma_warn_unused const eT& Row::fixed::at(const uword ii) const { return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; } template template arma_inline arma_warn_unused eT& Row::fixed::operator() (const uword ii) { arma_debug_check_bounds( (ii >= fixed_n_elem), "Row::operator(): index out of bounds" ); return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; } template template arma_inline arma_warn_unused const eT& Row::fixed::operator() (const uword ii) const { arma_debug_check_bounds( (ii >= fixed_n_elem), "Row::operator(): index out of bounds" ); return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; } template template arma_inline arma_warn_unused eT& Row::fixed::at(const uword, const uword in_col) { return (use_extra) ? mem_local_extra[in_col] : Mat::mem_local[in_col]; } template template arma_inline arma_warn_unused const eT& Row::fixed::at(const uword, const uword in_col) const { return (use_extra) ? mem_local_extra[in_col] : Mat::mem_local[in_col]; } template template arma_inline arma_warn_unused eT& Row::fixed::operator() (const uword in_row, const uword in_col) { arma_debug_check_bounds( ((in_row > 0) || (in_col >= fixed_n_elem)), "Row::operator(): index out of bounds" ); return (use_extra) ? mem_local_extra[in_col] : Mat::mem_local[in_col]; } template template arma_inline arma_warn_unused const eT& Row::fixed::operator() (const uword in_row, const uword in_col) const { arma_debug_check_bounds( ((in_row > 0) || (in_col >= fixed_n_elem)), "Row::operator(): index out of bounds" ); return (use_extra) ? mem_local_extra[in_col] : Mat::mem_local[in_col]; } template template arma_inline arma_warn_unused eT* Row::fixed::memptr() { return (use_extra) ? mem_local_extra : Mat::mem_local; } template template arma_inline arma_warn_unused const eT* Row::fixed::memptr() const { return (use_extra) ? mem_local_extra : Mat::mem_local; } template template arma_hot inline const Row& Row::fixed::fill(const eT val) { arma_extra_debug_sigprint(); eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat::mem_local[0]); arrayops::inplace_set_fixed( mem_use, val ); return *this; } template template arma_hot inline const Row& Row::fixed::zeros() { arma_extra_debug_sigprint(); eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat::mem_local[0]); arrayops::inplace_set_fixed( mem_use, eT(0) ); return *this; } template template arma_hot inline const Row& Row::fixed::ones() { arma_extra_debug_sigprint(); eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat::mem_local[0]); arrayops::inplace_set_fixed( mem_use, eT(1) ); return *this; } template inline Row::Row(const arma_fixed_indicator&, const uword in_n_elem, const eT* in_mem) : Mat(arma_fixed_indicator(), 1, in_n_elem, 2, in_mem) { arma_extra_debug_sigprint_this(this); } #ifdef ARMA_EXTRA_ROW_MEAT #include ARMA_INCFILE_WRAP(ARMA_EXTRA_ROW_MEAT) #endif //! @} RcppArmadillo/inst/include/armadillo_bits/spglue_kron_bones.hpp0000644000176200001440000000254714124060717024631 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_kron //! @{ class spglue_kron { public: template struct traits { static constexpr bool is_row = (T1::is_row && T2::is_row); static constexpr bool is_col = (T1::is_col && T2::is_col); static constexpr bool is_xvec = false; }; template inline static void apply(SpMat& out, const SpGlue& X); template inline static void apply_noalias(SpMat& out, const SpMat& A, const SpMat& B); }; //! @} RcppArmadillo/inst/include/armadillo_bits/eGlueCube_meat.hpp0000644000176200001440000001015314124060717023751 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup eGlueCube //! @{ template arma_inline eGlueCube::~eGlueCube() { arma_extra_debug_sigprint(); } template arma_inline eGlueCube::eGlueCube(const T1& in_A, const T2& in_B) : P1(in_A) , P2(in_B) { arma_extra_debug_sigprint(); arma_debug_assert_same_size ( P1.get_n_rows(), P1.get_n_cols(), P1.get_n_slices(), P2.get_n_rows(), P2.get_n_cols(), P2.get_n_slices(), eglue_type::text() ); } template arma_inline uword eGlueCube::get_n_rows() const { return P1.get_n_rows(); } template arma_inline uword eGlueCube::get_n_cols() const { return P1.get_n_cols(); } template arma_inline uword eGlueCube::get_n_slices() const { return P1.get_n_slices(); } template arma_inline uword eGlueCube::get_n_elem_slice() const { return P1.get_n_elem_slice(); } template arma_inline uword eGlueCube::get_n_elem() const { return P1.get_n_elem(); } template arma_inline typename T1::elem_type eGlueCube::operator[] (const uword i) const { // the optimiser will keep only one return statement typedef typename T1::elem_type eT; if(is_same_type::yes) { return P1[i] + P2[i]; } else if(is_same_type::yes) { return P1[i] - P2[i]; } else if(is_same_type::yes) { return P1[i] / P2[i]; } else if(is_same_type::yes) { return P1[i] * P2[i]; } else return eT(0); } template arma_inline typename T1::elem_type eGlueCube::at(const uword row, const uword col, const uword slice) const { // the optimiser will keep only one return statement typedef typename T1::elem_type eT; if(is_same_type::yes) { return P1.at(row,col,slice) + P2.at(row,col,slice); } else if(is_same_type::yes) { return P1.at(row,col,slice) - P2.at(row,col,slice); } else if(is_same_type::yes) { return P1.at(row,col,slice) / P2.at(row,col,slice); } else if(is_same_type::yes) { return P1.at(row,col,slice) * P2.at(row,col,slice); } else return eT(0); } template arma_inline typename T1::elem_type eGlueCube::at_alt(const uword i) const { // the optimiser will keep only one return statement typedef typename T1::elem_type eT; if(is_same_type::yes) { return P1.at_alt(i) + P2.at_alt(i); } else if(is_same_type::yes) { return P1.at_alt(i) - P2.at_alt(i); } else if(is_same_type::yes) { return P1.at_alt(i) / P2.at_alt(i); } else if(is_same_type::yes) { return P1.at_alt(i) * P2.at_alt(i); } else return eT(0); } //! @} RcppArmadillo/inst/include/armadillo_bits/running_stat_meat.hpp0000644000176200001440000002065414124060717024633 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup running_stat //! @{ template inline arma_counter::~arma_counter() { arma_extra_debug_sigprint_this(this); } template inline arma_counter::arma_counter() : d_count( eT(0)) , i_count(uword(0)) { arma_extra_debug_sigprint_this(this); } template inline const arma_counter& arma_counter::operator++() { if(i_count < ARMA_MAX_UWORD) { i_count++; } else { d_count += eT(ARMA_MAX_UWORD); i_count = 1; } return *this; } template inline void arma_counter::operator++(int) { operator++(); } template inline void arma_counter::reset() { d_count = eT(0); i_count = uword(0); } template inline eT arma_counter::value() const { return d_count + eT(i_count); } template inline eT arma_counter::value_plus_1() const { if(i_count < ARMA_MAX_UWORD) { return d_count + eT(i_count + 1); } else { return d_count + eT(ARMA_MAX_UWORD) + eT(1); } } template inline eT arma_counter::value_minus_1() const { if(i_count > 0) { return d_count + eT(i_count - 1); } else { return d_count - eT(1); } } // template inline running_stat::~running_stat() { arma_extra_debug_sigprint_this(this); } template inline running_stat::running_stat() : r_mean ( eT(0)) , r_var (typename running_stat::T(0)) , min_val ( eT(0)) , max_val ( eT(0)) , min_val_norm(typename running_stat::T(0)) , max_val_norm(typename running_stat::T(0)) { arma_extra_debug_sigprint_this(this); } //! update statistics to reflect new sample template inline void running_stat::operator() (const typename running_stat::T sample) { arma_extra_debug_sigprint(); if( arma_isfinite(sample) == false ) { arma_debug_warn_level(3, "running_stat: sample ignored as it is non-finite" ); return; } running_stat_aux::update_stats(*this, sample); } //! update statistics to reflect new sample (version for complex numbers) template inline void running_stat::operator() (const std::complex< typename running_stat::T >& sample) { arma_extra_debug_sigprint(); if( arma_isfinite(sample) == false ) { arma_debug_warn_level(3, "running_stat: sample ignored as it is non-finite" ); return; } running_stat_aux::update_stats(*this, sample); } //! set all statistics to zero template inline void running_stat::reset() { arma_extra_debug_sigprint(); // typedef typename running_stat::T T; counter.reset(); r_mean = eT(0); r_var = T(0); min_val = eT(0); max_val = eT(0); min_val_norm = T(0); max_val_norm = T(0); } //! mean or average value template inline eT running_stat::mean() const { arma_extra_debug_sigprint(); return r_mean; } //! variance template inline typename running_stat::T running_stat::var(const uword norm_type) const { arma_extra_debug_sigprint(); const T N = counter.value(); if(N > T(1)) { if(norm_type == 0) { return r_var; } else { const T N_minus_1 = counter.value_minus_1(); return (N_minus_1/N) * r_var; } } else { return T(0); } } //! standard deviation template inline typename running_stat::T running_stat::stddev(const uword norm_type) const { arma_extra_debug_sigprint(); return std::sqrt( (*this).var(norm_type) ); } //! minimum value template inline eT running_stat::min() const { arma_extra_debug_sigprint(); return min_val; } //! maximum value template inline eT running_stat::max() const { arma_extra_debug_sigprint(); return max_val; } template inline eT running_stat::range() const { arma_extra_debug_sigprint(); return (max_val - min_val); } //! number of samples so far template inline typename get_pod_type::result running_stat::count() const { arma_extra_debug_sigprint(); return counter.value(); } //! update statistics to reflect new sample (version for non-complex numbers, non-complex sample) template inline void running_stat_aux::update_stats(running_stat& x, const eT sample, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename running_stat::T T; const T N = x.counter.value(); if(N > T(0)) { if(sample < x.min_val) { x.min_val = sample; } if(sample > x.max_val) { x.max_val = sample; } const T N_plus_1 = x.counter.value_plus_1(); const T N_minus_1 = x.counter.value_minus_1(); // note: variance has to be updated before the mean const eT tmp = sample - x.r_mean; x.r_var = N_minus_1/N * x.r_var + (tmp*tmp)/N_plus_1; x.r_mean = x.r_mean + (sample - x.r_mean)/N_plus_1; //x.r_mean = (N/N_plus_1)*x.r_mean + sample/N_plus_1; //x.r_mean = (x.r_mean + sample/N) * N/N_plus_1; } else { x.r_mean = sample; x.min_val = sample; x.max_val = sample; // r_var is initialised to zero // in the constructor and reset() } x.counter++; } //! update statistics to reflect new sample (version for non-complex numbers, complex sample) template inline void running_stat_aux::update_stats(running_stat& x, const std::complex& sample, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); running_stat_aux::update_stats(x, std::real(sample)); } //! update statistics to reflect new sample (version for complex numbers, non-complex sample) template inline void running_stat_aux::update_stats(running_stat& x, const typename eT::value_type sample, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename eT::value_type T; running_stat_aux::update_stats(x, std::complex(sample)); } //! alter statistics to reflect new sample (version for complex numbers, complex sample) template inline void running_stat_aux::update_stats(running_stat& x, const eT& sample, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename eT::value_type T; const T sample_norm = std::norm(sample); const T N = x.counter.value(); if(N > T(0)) { if(sample_norm < x.min_val_norm) { x.min_val_norm = sample_norm; x.min_val = sample; } if(sample_norm > x.max_val_norm) { x.max_val_norm = sample_norm; x.max_val = sample; } const T N_plus_1 = x.counter.value_plus_1(); const T N_minus_1 = x.counter.value_minus_1(); x.r_var = N_minus_1/N * x.r_var + std::norm(sample - x.r_mean)/N_plus_1; x.r_mean = x.r_mean + (sample - x.r_mean)/N_plus_1; //x.r_mean = (N/N_plus_1)*x.r_mean + sample/N_plus_1; //x.r_mean = (x.r_mean + sample/N) * N/N_plus_1; } else { x.r_mean = sample; x.min_val = sample; x.max_val = sample; x.min_val_norm = sample_norm; x.max_val_norm = sample_norm; // r_var is initialised to zero // in the constructor and reset() } x.counter++; } //! @} RcppArmadillo/inst/include/armadillo_bits/diagview_bones.hpp0000644000176200001440000000713614124060717024077 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup diagview //! @{ //! Class for storing data required to extract and set the diagonals of a matrix template class diagview : public Base< eT, diagview > { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; arma_aligned const Mat& m; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; const uword row_offset; const uword col_offset; const uword n_rows; // equal to n_elem const uword n_elem; static constexpr uword n_cols = 1; protected: arma_inline diagview(const Mat& in_m, const uword in_row_offset, const uword in_col_offset, const uword len); public: inline ~diagview(); inline diagview() = delete; inline diagview(const diagview& in); inline diagview( diagview&& in); inline void operator=(const diagview& x); inline void operator+=(const eT val); inline void operator-=(const eT val); inline void operator*=(const eT val); inline void operator/=(const eT val); template inline void operator= (const Base& x); template inline void operator+=(const Base& x); template inline void operator-=(const Base& x); template inline void operator%=(const Base& x); template inline void operator/=(const Base& x); arma_inline eT at_alt (const uword ii) const; arma_inline eT& operator[](const uword ii); arma_inline eT operator[](const uword ii) const; arma_inline eT& at(const uword ii); arma_inline eT at(const uword ii) const; arma_inline eT& operator()(const uword ii); arma_inline eT operator()(const uword ii) const; arma_inline eT& at(const uword in_n_row, const uword); arma_inline eT at(const uword in_n_row, const uword) const; arma_inline eT& operator()(const uword in_n_row, const uword in_n_col); arma_inline eT operator()(const uword in_n_row, const uword in_n_col) const; inline void replace(const eT old_val, const eT new_val); inline void clean(const pod_type threshold); inline void clamp(const eT min_val, const eT max_val); inline void fill(const eT val); inline void zeros(); inline void ones(); inline void randu(); inline void randn(); inline static void extract(Mat& out, const diagview& in); inline static void plus_inplace(Mat& out, const diagview& in); inline static void minus_inplace(Mat& out, const diagview& in); inline static void schur_inplace(Mat& out, const diagview& in); inline static void div_inplace(Mat& out, const diagview& in); friend class Mat; friend class subview; }; //! @} RcppArmadillo/inst/include/armadillo_bits/running_stat_bones.hpp0000644000176200001440000000600014124060717025000 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup running_stat //! @{ template class arma_counter { public: inline ~arma_counter(); inline arma_counter(); inline const arma_counter& operator++(); inline void operator++(int); inline void reset(); inline eT value() const; inline eT value_plus_1() const; inline eT value_minus_1() const; private: arma_aligned eT d_count; arma_aligned uword i_count; }; //! Class for keeping statistics of a continuously sampled process / signal. //! Useful if the storage of individual samples is not necessary or desired. //! Also useful if the number of samples is not known beforehand or exceeds //! available memory. template class running_stat { public: typedef typename get_pod_type::result T; inline ~running_stat(); inline running_stat(); inline void operator() (const T sample); inline void operator() (const std::complex& sample); inline void reset(); inline eT mean() const; inline T var (const uword norm_type = 0) const; inline T stddev(const uword norm_type = 0) const; inline eT min() const; inline eT max() const; inline eT range() const; inline T count() const; // // private: arma_aligned arma_counter counter; arma_aligned eT r_mean; arma_aligned T r_var; arma_aligned eT min_val; arma_aligned eT max_val; arma_aligned T min_val_norm; arma_aligned T max_val_norm; friend class running_stat_aux; }; class running_stat_aux { public: template inline static void update_stats(running_stat& x, const eT sample, const typename arma_not_cx::result* junk = nullptr); template inline static void update_stats(running_stat& x, const std::complex& sample, const typename arma_not_cx::result* junk = nullptr); template inline static void update_stats(running_stat& x, const typename eT::value_type sample, const typename arma_cx_only::result* junk = nullptr); template inline static void update_stats(running_stat& x, const eT& sample, const typename arma_cx_only::result* junk = nullptr); }; //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_UpperHessenbergEigen_bones.hpp0000644000176200001440000000404014124060717027714 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { //! Calculate the eigenvalues and eigenvectors of an upper Hessenberg matrix. //! This class is a wrapper of the Lapack functions `_lahqr` and `_trevc`. template class UpperHessenbergEigen { private: blas_int n; Mat mat_Z; // In the first stage, H = ZTZ', Z is an orthogonal matrix // In the second stage, Z will be overwritten by the eigenvectors of H Mat mat_T; // H = ZTZ', T is a Schur form matrix Col< std::complex > evals; // eigenvalues of H bool computed; public: //! Default constructor. Computation can //! be performed later by calling the compute() method. inline UpperHessenbergEigen(); //! Constructor to create an object that calculates the eigenvalues //! and eigenvectors of an upper Hessenberg matrix `mat_obj`. inline UpperHessenbergEigen(const Mat& mat_obj); //! Compute the eigenvalue decomposition of an upper Hessenberg matrix. inline void compute(const Mat& mat_obj); //! Retrieve the eigenvalues. inline Col< std::complex > eigenvalues(); //! Retrieve the eigenvectors. inline Mat< std::complex > eigenvectors(); }; } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/fn_find_unique.hpp0000644000176200001440000000313014124060717024071 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_find_unique //! @{ template arma_warn_unused inline typename enable_if2 < is_arma_type::value, const mtOp >::result find_unique ( const T1& X, const bool ascending_indices = true ) { arma_extra_debug_sigprint(); return mtOp(X, ((ascending_indices) ? uword(1) : uword(0)), uword(0)); } template arma_warn_unused inline uvec find_unique ( const BaseCube& X, const bool ascending_indices = true ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_cube tmp(X.get_ref()); const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); return find_unique(R,ascending_indices); } //! @} RcppArmadillo/inst/include/armadillo_bits/upgrade_val.hpp0000644000176200001440000001203114124060717023371 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup upgrade_val //! @{ //! upgrade_val is used to ensure an operation such as multiplication is possible between two types. //! values are upgraded only where necessary. template struct upgrade_val { typedef typename promote_type::result T1_result; typedef typename promote_type::result T2_result; arma_inline static typename promote_type::result apply(const T1 x) { typedef typename promote_type::result out_type; return out_type(x); } arma_inline static typename promote_type::result apply(const T2 x) { typedef typename promote_type::result out_type; return out_type(x); } }; // template<> template struct upgrade_val { typedef T T1_result; typedef T T2_result; arma_inline static const T& apply(const T& x) { return x; } }; //! upgrade a type to allow multiplication with a complex type //! eg. the int in "int * complex" is upgraded to a double // template<> template struct upgrade_val< std::complex, T2 > { typedef std::complex T1_result; typedef T T2_result; arma_inline static const std::complex& apply(const std::complex& x) { return x; } arma_inline static T apply(const T2 x) { return T(x); } }; // template<> template struct upgrade_val< T1, std::complex > { typedef T T1_result; typedef std::complex T2_result; arma_inline static T apply(const T1 x) { return T(x); } arma_inline static const std::complex& apply(const std::complex& x) { return x; } }; //! ensure we don't lose precision when multiplying a complex number with a higher precision real number template<> struct upgrade_val< std::complex, double > { typedef std::complex T1_result; typedef double T2_result; arma_inline static const std::complex apply(const std::complex& x) { return std::complex(x); } arma_inline static double apply(const double x) { return x; } }; template<> struct upgrade_val< double, std::complex > { typedef double T1_result; typedef std::complex T2_result; arma_inline static double apply(const double x) { return x; } arma_inline static const std::complex apply(const std::complex& x) { return std::complex(x); } }; //! ensure we don't lose precision when multiplying complex numbers with different underlying types template<> struct upgrade_val< std::complex, std::complex > { typedef std::complex T1_result; typedef std::complex T2_result; arma_inline static const std::complex apply(const std::complex& x) { return std::complex(x); } arma_inline static const std::complex& apply(const std::complex& x) { return x; } }; template<> struct upgrade_val< std::complex, std::complex > { typedef std::complex T1_result; typedef std::complex T2_result; arma_inline static const std::complex& apply(const std::complex& x) { return x; } arma_inline static const std::complex apply(const std::complex& x) { return std::complex(x); } }; //! work around limitations in the complex class (at least as present in gcc 4.1 & 4.3) template<> struct upgrade_val< std::complex, float > { typedef std::complex T1_result; typedef double T2_result; arma_inline static const std::complex& apply(const std::complex& x) { return x; } arma_inline static double apply(const float x) { return double(x); } }; template<> struct upgrade_val< float, std::complex > { typedef double T1_result; typedef std::complex T2_result; arma_inline static double apply(const float x) { return double(x); } arma_inline static const std::complex& apply(const std::complex& x) { return x; } }; //! @} RcppArmadillo/inst/include/armadillo_bits/arma_rng_cxx11.hpp0000644000176200001440000001140714124060717023720 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup arma_rng_cxx11 //! @{ class arma_rng_cxx11 { public: typedef std::mt19937_64::result_type seed_type; inline void set_seed(const seed_type val); arma_inline int randi_val(); arma_inline double randu_val(); arma_inline double randn_val(); template arma_inline void randn_dual_val(eT& out1, eT& out2); template inline void randi_fill(eT* mem, const uword N, const int a, const int b); inline static int randi_max_val(); template inline void randg_fill_simple(eT* mem, const uword N, const double a, const double b); template inline void randg_fill(eT* mem, const uword N, const double a, const double b); private: arma_aligned std::mt19937_64 engine; // typedef for std::mersenne_twister_engine with preset parameters arma_aligned std::uniform_int_distribution i_distr; // by default uses a=0, b=std::numeric_limits::max() arma_aligned std::uniform_real_distribution u_distr; // by default uses [0,1) interval arma_aligned std::normal_distribution n_distr; // by default uses mean=0.0 and stddev=1.0 }; inline void arma_rng_cxx11::set_seed(const arma_rng_cxx11::seed_type val) { engine.seed(val); i_distr.reset(); u_distr.reset(); n_distr.reset(); } arma_inline int arma_rng_cxx11::randi_val() { return i_distr(engine); } arma_inline double arma_rng_cxx11::randu_val() { return u_distr(engine); } arma_inline double arma_rng_cxx11::randn_val() { return n_distr(engine); } template arma_inline void arma_rng_cxx11::randn_dual_val(eT& out1, eT& out2) { out1 = eT( n_distr(engine) ); out2 = eT( n_distr(engine) ); } template inline void arma_rng_cxx11::randi_fill(eT* mem, const uword N, const int a, const int b) { std::uniform_int_distribution local_i_distr(a, b); for(uword i=0; i::max(); } template inline void arma_rng_cxx11::randg_fill_simple(eT* mem, const uword N, const double a, const double b) { std::gamma_distribution g_distr(a,b); for(uword i=0; i inline void arma_rng_cxx11::randg_fill(eT* mem, const uword N, const double a, const double b) { #if defined(ARMA_USE_OPENMP) { if((N < 512) || omp_in_parallel()) { (*this).randg_fill_simple(mem, N, a, b); return; } typedef std::mt19937_64 motor_type; typedef std::mt19937_64::result_type ovum_type; typedef std::gamma_distribution distr_type; const uword n_threads = uword( mp_thread_limit::get() ); std::vector g_motor(n_threads); std::vector g_distr(n_threads); const distr_type g_distr_base(a,b); for(uword t=0; t < n_threads; ++t) { motor_type& g_motor_t = g_motor[t]; distr_type& g_distr_t = g_distr[t]; g_motor_t.seed( ovum_type(t) + ovum_type((*this).randi_val()) ); g_distr_t.param( g_distr_base.param() ); } const uword chunk_size = N / n_threads; #pragma omp parallel for schedule(static) num_threads(int(n_threads)) for(uword t=0; t < n_threads; ++t) { const uword start = (t+0) * chunk_size; const uword endp1 = (t+1) * chunk_size; motor_type& g_motor_t = g_motor[t]; distr_type& g_distr_t = g_distr[t]; for(uword i=start; i < endp1; ++i) { mem[i] = eT( g_distr_t(g_motor_t)); } } motor_type& g_motor_0 = g_motor[0]; distr_type& g_distr_0 = g_distr[0]; for(uword i=(n_threads*chunk_size); i < N; ++i) { mem[i] = eT( g_distr_0(g_motor_0)); } } #else { (*this).randg_fill_simple(mem, N, a, b); } #endif } //! @} RcppArmadillo/inst/include/armadillo_bits/op_cumsum_meat.hpp0000644000176200001440000000723214124060717024124 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_cumsum //! @{ template inline void op_cumsum::apply_noalias(Mat& out, const Mat& X, const uword dim) { arma_extra_debug_sigprint(); uword n_rows = X.n_rows; uword n_cols = X.n_cols; out.set_size(n_rows,n_cols); if(out.n_elem == 0) { return; } if(dim == 0) { if(n_cols == 1) { const eT* X_mem = X.memptr(); eT* out_mem = out.memptr(); eT acc = eT(0); for(uword row=0; row < n_rows; ++row) { acc += X_mem[row]; out_mem[row] = acc; } } else { for(uword col=0; col < n_cols; ++col) { const eT* X_colmem = X.colptr(col); eT* out_colmem = out.colptr(col); eT acc = eT(0); for(uword row=0; row < n_rows; ++row) { acc += X_colmem[row]; out_colmem[row] = acc; } } } } else if(dim == 1) { if(n_rows == 1) { const eT* X_mem = X.memptr(); eT* out_mem = out.memptr(); eT acc = eT(0); for(uword col=0; col < n_cols; ++col) { acc += X_mem[col]; out_mem[col] = acc; } } else { if(n_cols > 0) { arrayops::copy( out.colptr(0), X.colptr(0), n_rows ); for(uword col=1; col < n_cols; ++col) { const eT* out_colmem_prev = out.colptr(col-1); eT* out_colmem = out.colptr(col ); const eT* X_colmem = X.colptr(col ); for(uword row=0; row < n_rows; ++row) { out_colmem[row] = out_colmem_prev[row] + X_colmem[row]; } } } } } } template inline void op_cumsum::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "cumsum(): parameter 'dim' must be 0 or 1" ); const quasi_unwrap U(in.m); if(U.is_alias(out)) { Mat tmp; op_cumsum::apply_noalias(tmp, U.M, dim); out.steal_mem(tmp); } else { op_cumsum::apply_noalias(out, U.M, dim); } } template inline void op_cumsum_vec::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap U(in.m); const uword dim = (T1::is_xvec) ? uword(U.M.is_rowvec() ? 1 : 0) : uword((T1::is_row) ? 1 : 0); if(U.is_alias(out)) { Mat tmp; op_cumsum::apply_noalias(tmp, U.M, dim); out.steal_mem(tmp); } else { op_cumsum::apply_noalias(out, U.M, dim); } } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_spones.hpp0000644000176200001440000000255514124060717023104 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_spones //! @{ //! Generate a sparse matrix with the non-zero values in the same locations as in the given sparse matrix X, //! with the non-zero values set to one template arma_warn_unused inline SpMat spones(const SpBase& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat U(X.get_ref()); SpMat out(arma_layout_indicator(), U.M); arrayops::inplace_set( access::rwp(out.values), eT(1), out.n_nonzero ); return out; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_relational_bones.hpp0000644000176200001440000000747114124060717025132 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_relational //! @{ class op_rel_lt_pre : public traits_op_passthru { public: template inline static void apply(Mat& out, const mtOp& X); template inline static void apply(Cube& out, const mtOpCube& X); }; class op_rel_lt_post : public traits_op_passthru { public: template inline static void apply(Mat& out, const mtOp& X); template inline static void apply(Cube& out, const mtOpCube& X); }; class op_rel_gt_pre : public traits_op_passthru { public: template inline static void apply(Mat& out, const mtOp& X); template inline static void apply(Cube& out, const mtOpCube& X); }; class op_rel_gt_post : public traits_op_passthru { public: template inline static void apply(Mat& out, const mtOp& X); template inline static void apply(Cube& out, const mtOpCube& X); }; class op_rel_lteq_pre : public traits_op_passthru { public: template inline static void apply(Mat& out, const mtOp& X); template inline static void apply(Cube& out, const mtOpCube& X); }; class op_rel_lteq_post : public traits_op_passthru { public: template inline static void apply(Mat& out, const mtOp& X); template inline static void apply(Cube& out, const mtOpCube& X); }; class op_rel_gteq_pre : public traits_op_passthru { public: template inline static void apply(Mat& out, const mtOp& X); template inline static void apply(Cube& out, const mtOpCube& X); }; class op_rel_gteq_post : public traits_op_passthru { public: template inline static void apply(Mat& out, const mtOp& X); template inline static void apply(Cube& out, const mtOpCube& X); }; class op_rel_eq : public traits_op_passthru { public: template inline static void apply(Mat& out, const mtOp& X); template inline static void apply(Cube& out, const mtOpCube& X); }; class op_rel_noteq : public traits_op_passthru { public: template inline static void apply(Mat& out, const mtOp& X); template inline static void apply(Cube& out, const mtOpCube& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_SymEigsShiftSolver_meat.hpp0000644000176200001440000000305014124060717027234 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { template inline void SymEigsShiftSolver::sort_ritzpair() { arma_extra_debug_sigprint(); // First transform back the Ritz values, and then sort for(uword i = 0; i < this->nev; i++) { this->ritz_val(i) = eT(1.0) / this->ritz_val(i) + sigma; } SymEigsSolver::sort_ritzpair(); } template inline SymEigsShiftSolver::SymEigsShiftSolver(const OpType& op_, uword nev_, uword ncv_, const eT sigma_) : SymEigsSolver::SymEigsSolver(op_, nev_, ncv_) , sigma(sigma_) { arma_extra_debug_sigprint(); } } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/translate_superlu.hpp0000644000176200001440000002030714124060717024661 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #if defined(ARMA_USE_SUPERLU) //! \namespace superlu namespace for SuperLU functions namespace superlu { template inline void gssv(superlu_options_t* options, SuperMatrix* A, int* perm_c, int* perm_r, SuperMatrix* L, SuperMatrix* U, SuperMatrix* B, SuperLUStat_t* stat, int* info) { arma_type_check(( is_supported_blas_type::value == false )); if(is_float::value) { arma_wrapper(sgssv)(options, A, perm_c, perm_r, L, U, B, stat, info); } else if(is_double::value) { arma_wrapper(dgssv)(options, A, perm_c, perm_r, L, U, B, stat, info); } else if(is_cx_float::value) { arma_wrapper(cgssv)(options, A, perm_c, perm_r, L, U, B, stat, info); } else if(is_cx_double::value) { arma_wrapper(zgssv)(options, A, perm_c, perm_r, L, U, B, stat, info); } } template inline void gssvx( superlu_options_t* opts, SuperMatrix* A, int* perm_c, int* perm_r, int* etree, char* equed, typename get_pod_type::result* R, typename get_pod_type::result* C, SuperMatrix* L, SuperMatrix* U, void* work, int lwork, SuperMatrix* B, SuperMatrix* X, typename get_pod_type::result* rpg, typename get_pod_type::result* rcond, typename get_pod_type::result* ferr, typename get_pod_type::result* berr, GlobalLU_t* glu, mem_usage_t* mu, SuperLUStat_t* stat, int* info ) { arma_type_check(( is_supported_blas_type::value == false )); if(is_float::value) { typedef float T; arma_wrapper(sgssvx)(opts, A, perm_c, perm_r, etree, equed, (T*)R, (T*)C, L, U, work, lwork, B, X, (T*)rpg, (T*)rcond, (T*)ferr, (T*)berr, glu, mu, stat, info); } else if(is_double::value) { typedef double T; arma_wrapper(dgssvx)(opts, A, perm_c, perm_r, etree, equed, (T*)R, (T*)C, L, U, work, lwork, B, X, (T*)rpg, (T*)rcond, (T*)ferr, (T*)berr, glu, mu, stat, info); } else if(is_cx_float::value) { typedef float T; arma_wrapper(cgssvx)(opts, A, perm_c, perm_r, etree, equed, (T*)R, (T*)C, L, U, work, lwork, B, X, (T*)rpg, (T*)rcond, (T*)ferr, (T*)berr, glu, mu, stat, info); } else if(is_cx_double::value) { typedef double T; arma_wrapper(zgssvx)(opts, A, perm_c, perm_r, etree, equed, (T*)R, (T*)C, L, U, work, lwork, B, X, (T*)rpg, (T*)rcond, (T*)ferr, (T*)berr, glu, mu, stat, info); } } template 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, GlobalLU_t* Glu, SuperLUStat_t* stat, int* info ) { arma_type_check(( is_supported_blas_type::value == false )); if(is_float::value) { arma_wrapper(sgstrf)(options, A, relax, panel_size, etree, work, lwork, perm_c, perm_r, L, U, Glu, stat, info); } else if(is_double::value) { arma_wrapper(dgstrf)(options, A, relax, panel_size, etree, work, lwork, perm_c, perm_r, L, U, Glu, stat, info); } else if(is_cx_float::value) { arma_wrapper(cgstrf)(options, A, relax, panel_size, etree, work, lwork, perm_c, perm_r, L, U, Glu, stat, info); } else if(is_cx_double::value) { arma_wrapper(zgstrf)(options, A, relax, panel_size, etree, work, lwork, perm_c, perm_r, L, U, Glu, stat, info); } } template inline void gstrs(trans_t trans, SuperMatrix* L, SuperMatrix* U, int* perm_c, int* perm_r, SuperMatrix* B, SuperLUStat_t* stat, int* info ) { arma_type_check(( is_supported_blas_type::value == false )); if(is_float::value) { arma_wrapper(sgstrs)(trans, L, U, perm_c, perm_r, B, stat, info); } else if(is_double::value) { arma_wrapper(dgstrs)(trans, L, U, perm_c, perm_r, B, stat, info); } else if(is_cx_float::value) { arma_wrapper(cgstrs)(trans, L, U, perm_c, perm_r, B, stat, info); } else if(is_cx_double::value) { arma_wrapper(zgstrs)(trans, L, U, perm_c, perm_r, B, stat, info); } } template inline typename get_pod_type::result langs(char* norm, superlu::SuperMatrix* A) { arma_type_check(( is_supported_blas_type::value == false )); typedef typename get_pod_type::result T; if(is_float::value) { return arma_wrapper(slangs)(norm, A); } else if(is_double::value) { return arma_wrapper(dlangs)(norm, A); } else if(is_cx_float::value) { return arma_wrapper(clangs)(norm, A); } else if(is_cx_double::value) { return arma_wrapper(zlangs)(norm, A); } return T(0); // to avoid false warnigns from the compiler } template inline void gscon(char* norm, superlu::SuperMatrix* L, superlu::SuperMatrix* U, typename get_pod_type::result anorm, typename get_pod_type::result* rcond, superlu::SuperLUStat_t* stat, int* info) { arma_type_check(( is_supported_blas_type::value == false )); if(is_float::value) { typedef float T; arma_wrapper(sgscon)(norm, L, U, (T)anorm, (T*)rcond, stat, info); } else if(is_double::value) { typedef double T; arma_wrapper(dgscon)(norm, L, U, (T)anorm, (T*)rcond, stat, info); } else if(is_cx_float::value) { typedef float T; arma_wrapper(cgscon)(norm, L, U, (T)anorm, (T*)rcond, stat, info); } else if(is_cx_double::value) { typedef double T; arma_wrapper(zgscon)(norm, L, U, (T)anorm, (T*)rcond, stat, info); } } inline void init_stat(SuperLUStat_t* stat) { arma_wrapper(StatInit)(stat); } inline void free_stat(SuperLUStat_t* stat) { arma_wrapper(StatFree)(stat); } inline void set_default_opts(superlu_options_t* opts) { arma_wrapper(set_default_options)(opts); } inline void get_permutation_c(int ispec, SuperMatrix* A, int* perm_c) { arma_wrapper(get_perm_c)(ispec, A, perm_c); } inline void sp_preorder_mat(superlu_options_t* opts, SuperMatrix* A, int* perm_c, int* etree, SuperMatrix* AC) { arma_wrapper(sp_preorder)(opts, A, perm_c, etree, AC); } inline int sp_ispec_environ(int ispec) { return arma_wrapper(sp_ienv)(ispec); } inline void destroy_supernode_mat(SuperMatrix* a) { arma_wrapper(Destroy_SuperNode_Matrix)(a); } inline void destroy_compcol_mat(SuperMatrix* a) { arma_wrapper(Destroy_CompCol_Matrix)(a); } inline void destroy_compcolperm_mat(SuperMatrix* a) { arma_wrapper(Destroy_CompCol_Permuted)(a); } inline void destroy_dense_mat(SuperMatrix* a) { arma_wrapper(Destroy_SuperMatrix_Store)(a); } inline void* malloc(size_t N) { return arma_wrapper(superlu_malloc)(N); } inline void free(void* mem) { arma_wrapper(superlu_free)(mem); } } // namespace superlu #endif RcppArmadillo/inst/include/armadillo_bits/fn_flip.hpp0000644000176200001440000000330614124060717022522 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_flip //! @{ template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const Op >::result flipud(const T1& X) { arma_extra_debug_sigprint(); return Op(X); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const Op >::result fliplr(const T1& X) { arma_extra_debug_sigprint(); return Op(X); } template arma_warn_unused arma_inline const SpOp flipud(const SpBase& X) { arma_extra_debug_sigprint(); return SpOp(X.get_ref()); } template arma_warn_unused arma_inline const SpOp fliplr(const SpBase& X) { arma_extra_debug_sigprint(); return SpOp(X.get_ref()); } //! @} RcppArmadillo/inst/include/armadillo_bits/eop_core_bones.hpp0000644000176200001440000001624514124060717024074 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup eop_core //! @{ template class eop_core { public: // matrices template arma_hot inline static void apply(outT& out, const eOp& x); template arma_hot inline static void apply_inplace_plus (Mat& out, const eOp& x); template arma_hot inline static void apply_inplace_minus(Mat& out, const eOp& x); template arma_hot inline static void apply_inplace_schur(Mat& out, const eOp& x); template arma_hot inline static void apply_inplace_div (Mat& out, const eOp& x); // cubes template arma_hot inline static void apply(Cube& out, const eOpCube& x); template arma_hot inline static void apply_inplace_plus (Cube& out, const eOpCube& x); template arma_hot inline static void apply_inplace_minus(Cube& out, const eOpCube& x); template arma_hot inline static void apply_inplace_schur(Cube& out, const eOpCube& x); template arma_hot inline static void apply_inplace_div (Cube& out, const eOpCube& x); // common template arma_inline static eT process(const eT val, const eT k); }; struct eop_use_mp_true { static constexpr bool use_mp = true; }; struct eop_use_mp_false { static constexpr bool use_mp = false; }; class eop_neg : public eop_core , public eop_use_mp_false {}; class eop_scalar_plus : public eop_core , public eop_use_mp_false {}; class eop_scalar_minus_pre : public eop_core , public eop_use_mp_false {}; class eop_scalar_minus_post : public eop_core , public eop_use_mp_false {}; class eop_scalar_times : public eop_core , public eop_use_mp_false {}; class eop_scalar_div_pre : public eop_core , public eop_use_mp_false {}; class eop_scalar_div_post : public eop_core , public eop_use_mp_false {}; class eop_square : public eop_core , public eop_use_mp_false {}; class eop_sqrt : public eop_core , public eop_use_mp_true {}; class eop_pow : public eop_core , public eop_use_mp_false {}; // for pow(), use_mp is selectively enabled in eop_core_meat.hpp class eop_log : public eop_core , public eop_use_mp_true {}; class eop_log2 : public eop_core , public eop_use_mp_true {}; class eop_log10 : public eop_core , public eop_use_mp_true {}; class eop_trunc_log : public eop_core , public eop_use_mp_true {}; class eop_log1p : public eop_core , public eop_use_mp_true {}; class eop_exp : public eop_core , public eop_use_mp_true {}; class eop_exp2 : public eop_core , public eop_use_mp_true {}; class eop_exp10 : public eop_core , public eop_use_mp_true {}; class eop_trunc_exp : public eop_core , public eop_use_mp_true {}; class eop_expm1 : public eop_core , public eop_use_mp_true {}; class eop_cos : public eop_core , public eop_use_mp_true {}; class eop_sin : public eop_core , public eop_use_mp_true {}; class eop_tan : public eop_core , public eop_use_mp_true {}; class eop_acos : public eop_core , public eop_use_mp_true {}; class eop_asin : public eop_core , public eop_use_mp_true {}; class eop_atan : public eop_core , public eop_use_mp_true {}; class eop_cosh : public eop_core , public eop_use_mp_true {}; class eop_sinh : public eop_core , public eop_use_mp_true {}; class eop_tanh : public eop_core , public eop_use_mp_true {}; class eop_acosh : public eop_core , public eop_use_mp_true {}; class eop_asinh : public eop_core , public eop_use_mp_true {}; class eop_atanh : public eop_core , public eop_use_mp_true {}; class eop_sinc : public eop_core , public eop_use_mp_true {}; class eop_eps : public eop_core , public eop_use_mp_true {}; class eop_abs : public eop_core , public eop_use_mp_false {}; class eop_arg : public eop_core , public eop_use_mp_false {}; class eop_conj : public eop_core , public eop_use_mp_false {}; class eop_floor : public eop_core , public eop_use_mp_false {}; class eop_ceil : public eop_core , public eop_use_mp_false {}; class eop_round : public eop_core , public eop_use_mp_false {}; class eop_trunc : public eop_core , public eop_use_mp_false {}; class eop_sign : public eop_core , public eop_use_mp_false {}; class eop_erf : public eop_core , public eop_use_mp_true {}; class eop_erfc : public eop_core , public eop_use_mp_true {}; class eop_lgamma : public eop_core , public eop_use_mp_true {}; class eop_tgamma : public eop_core , public eop_use_mp_true {}; // the classes below are currently not used; reserved for potential future use class eop_log_approx {}; class eop_exp_approx {}; class eop_approx_log {}; class eop_approx_exp {}; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_conv_to.hpp0000644000176200001440000004326114124060717023243 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_conv_to //! @{ //! conversion from Armadillo Base and BaseCube objects to scalars //! NOTE: use as_scalar() instead; this functionality is kept only for compatibility with old user code template class conv_to { public: template inline static out_eT from(const Base& in, const typename arma_not_cx::result* junk = nullptr); template inline static out_eT from(const Base& in, const typename arma_cx_only::result* junk = nullptr); template inline static out_eT from(const BaseCube& in, const typename arma_not_cx::result* junk = nullptr); template inline static out_eT from(const BaseCube& in, const typename arma_cx_only::result* junk = nullptr); }; template template arma_warn_unused inline out_eT conv_to::from(const Base& in, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); arma_type_check(( is_supported_elem_type::value == false )); const Proxy P(in.get_ref()); arma_debug_check( (P.get_n_elem() != 1), "conv_to(): given object doesn't have exactly one element" ); return out_eT(Proxy::use_at ? P.at(0,0) : P[0]); } template template arma_warn_unused inline out_eT conv_to::from(const Base& in, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); arma_type_check(( is_supported_elem_type::value == false )); const Proxy P(in.get_ref()); arma_debug_check( (P.get_n_elem() != 1), "conv_to(): given object doesn't have exactly one element" ); out_eT out; arrayops::convert_cx_scalar(out, (Proxy::use_at ? P.at(0,0) : P[0])); return out; } template template arma_warn_unused inline out_eT conv_to::from(const BaseCube& in, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); arma_type_check(( is_supported_elem_type::value == false )); const ProxyCube P(in.get_ref()); arma_debug_check( (P.get_n_elem() != 1), "conv_to(): given object doesn't have exactly one element" ); return out_eT(ProxyCube::use_at ? P.at(0,0,0) : P[0]); } template template arma_warn_unused inline out_eT conv_to::from(const BaseCube& in, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); arma_type_check(( is_supported_elem_type::value == false )); const ProxyCube P(in.get_ref()); arma_debug_check( (P.get_n_elem() != 1), "conv_to(): given object doesn't have exactly one element" ); out_eT out; arrayops::convert_cx_scalar(out, (ProxyCube::use_at ? P.at(0,0,0) : P[0])); return out; } //! conversion to Armadillo matrices from Armadillo Base objects, as well as from std::vector template class conv_to< Mat > { public: template inline static Mat from(const Base& in, const typename arma_not_cx::result* junk = nullptr); template inline static Mat from(const Base& in, const typename arma_cx_only::result* junk = nullptr); template inline static Mat from(const SpBase& in); template inline static Mat from(const std::vector& in, const typename arma_not_cx::result* junk = nullptr); template inline static Mat from(const std::vector& in, const typename arma_cx_only::result* junk = nullptr); }; template template arma_warn_unused inline Mat conv_to< Mat >::from(const Base& in, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const quasi_unwrap tmp(in.get_ref()); const Mat& X = tmp.M; Mat out(X.n_rows, X.n_cols, arma_nozeros_indicator()); arrayops::convert( out.memptr(), X.memptr(), X.n_elem ); return out; } template template arma_warn_unused inline Mat conv_to< Mat >::from(const Base& in, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const quasi_unwrap tmp(in.get_ref()); const Mat& X = tmp.M; Mat out(X.n_rows, X.n_cols, arma_nozeros_indicator()); arrayops::convert_cx( out.memptr(), X.memptr(), X.n_elem ); return out; } template template arma_warn_unused inline Mat conv_to< Mat >::from(const SpBase& in) { arma_extra_debug_sigprint(); return Mat(in.get_ref()); } template template arma_warn_unused inline Mat conv_to< Mat >::from(const std::vector& in, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword N = uword( in.size() ); Mat out(N, 1, arma_nozeros_indicator()); if(N > 0) { arrayops::convert( out.memptr(), &(in[0]), N ); } return out; } template template arma_warn_unused inline Mat conv_to< Mat >::from(const std::vector& in, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword N = uword( in.size() ); Mat out(N, 1, arma_nozeros_indicator()); if(N > 0) { arrayops::convert_cx( out.memptr(), &(in[0]), N ); } return out; } //! conversion to Armadillo row vectors from Armadillo Base objects, as well as from std::vector template class conv_to< Row > { public: template inline static Row from(const Base& in, const typename arma_not_cx::result* junk = nullptr); template inline static Row from(const Base& in, const typename arma_cx_only::result* junk = nullptr); template inline static Row from(const std::vector& in, const typename arma_not_cx::result* junk = nullptr); template inline static Row from(const std::vector& in, const typename arma_cx_only::result* junk = nullptr); }; template template arma_warn_unused inline Row conv_to< Row >::from(const Base& in, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const quasi_unwrap tmp(in.get_ref()); const Mat& X = tmp.M; arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" ); Row out(X.n_elem, arma_nozeros_indicator()); arrayops::convert( out.memptr(), X.memptr(), X.n_elem ); return out; } template template arma_warn_unused inline Row conv_to< Row >::from(const Base& in, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const quasi_unwrap tmp(in.get_ref()); const Mat& X = tmp.M; arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" ); Row out(X.n_rows, X.n_cols, arma_nozeros_indicator()); arrayops::convert_cx( out.memptr(), X.memptr(), X.n_elem ); return out; } template template arma_warn_unused inline Row conv_to< Row >::from(const std::vector& in, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword N = uword( in.size() ); Row out(N, arma_nozeros_indicator()); if(N > 0) { arrayops::convert( out.memptr(), &(in[0]), N ); } return out; } template template arma_warn_unused inline Row conv_to< Row >::from(const std::vector& in, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword N = uword( in.size() ); Row out(N, arma_nozeros_indicator()); if(N > 0) { arrayops::convert_cx( out.memptr(), &(in[0]), N ); } return out; } //! conversion to Armadillo column vectors from Armadillo Base objects, as well as from std::vector template class conv_to< Col > { public: template inline static Col from(const Base& in, const typename arma_not_cx::result* junk = nullptr); template inline static Col from(const Base& in, const typename arma_cx_only::result* junk = nullptr); template inline static Col from(const std::vector& in, const typename arma_not_cx::result* junk = nullptr); template inline static Col from(const std::vector& in, const typename arma_cx_only::result* junk = nullptr); }; template template arma_warn_unused inline Col conv_to< Col >::from(const Base& in, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const quasi_unwrap tmp(in.get_ref()); const Mat& X = tmp.M; arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" ); Col out(X.n_elem, arma_nozeros_indicator()); arrayops::convert( out.memptr(), X.memptr(), X.n_elem ); return out; } template template arma_warn_unused inline Col conv_to< Col >::from(const Base& in, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const quasi_unwrap tmp(in.get_ref()); const Mat& X = tmp.M; arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" ); Col out(X.n_rows, X.n_cols, arma_nozeros_indicator()); arrayops::convert_cx( out.memptr(), X.memptr(), X.n_elem ); return out; } template template arma_warn_unused inline Col conv_to< Col >::from(const std::vector& in, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword N = uword( in.size() ); Col out(N, arma_nozeros_indicator()); if(N > 0) { arrayops::convert( out.memptr(), &(in[0]), N ); } return out; } template template arma_warn_unused inline Col conv_to< Col >::from(const std::vector& in, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword N = uword( in.size() ); Col out(N, arma_nozeros_indicator()); if(N > 0) { arrayops::convert_cx( out.memptr(), &(in[0]), N ); } return out; } //! convert between SpMat types template class conv_to< SpMat > { public: template inline static SpMat from(const SpBase& in, const typename arma_not_cx::result* junk = nullptr); template inline static SpMat from(const SpBase& in, const typename arma_cx_only::result* junk = nullptr); template inline static SpMat from(const Base& in); }; template template arma_warn_unused inline SpMat conv_to< SpMat >::from(const SpBase& in, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const unwrap_spmat tmp(in.get_ref()); const SpMat& X = tmp.M; SpMat out(arma_layout_indicator(), X); arrayops::convert( access::rwp(out.values), X.values, X.n_nonzero ); out.remove_zeros(); return out; } template template arma_warn_unused inline SpMat conv_to< SpMat >::from(const SpBase& in, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const unwrap_spmat tmp(in.get_ref()); const SpMat& X = tmp.M; SpMat out(arma_layout_indicator(), X); arrayops::convert_cx( access::rwp(out.values), X.values, X.n_nonzero ); out.remove_zeros(); return out; } template template arma_warn_unused inline SpMat conv_to< SpMat >::from(const Base& in) { arma_extra_debug_sigprint(); return SpMat(in.get_ref()); } //! conversion to Armadillo cubes from Armadillo BaseCube objects template class conv_to< Cube > { public: template inline static Cube from(const BaseCube& in, const typename arma_not_cx::result* junk = nullptr); template inline static Cube from(const BaseCube& in, const typename arma_cx_only::result* junk = nullptr); }; template template arma_warn_unused inline Cube conv_to< Cube >::from(const BaseCube& in, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const unwrap_cube tmp( in.get_ref() ); const Cube& X = tmp.M; Cube out(X.n_rows, X.n_cols, X.n_slices, arma_nozeros_indicator()); arrayops::convert( out.memptr(), X.memptr(), X.n_elem ); return out; } template template arma_warn_unused inline Cube conv_to< Cube >::from(const BaseCube& in, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const unwrap_cube tmp( in.get_ref() ); const Cube& X = tmp.M; Cube out(X.n_rows, X.n_cols, X.n_slices, arma_nozeros_indicator()); arrayops::convert_cx( out.memptr(), X.memptr(), X.n_elem ); return out; } //! conversion to std::vector from Armadillo Base objects template class conv_to< std::vector > { public: template inline static std::vector from(const Base& in, const typename arma_not_cx::result* junk = nullptr); template inline static std::vector from(const Base& in, const typename arma_cx_only::result* junk = nullptr); }; template template arma_warn_unused inline std::vector conv_to< std::vector >::from(const Base& in, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const quasi_unwrap tmp(in.get_ref()); const Mat& X = tmp.M; arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" ); const uword N = X.n_elem; std::vector out(N); if(N > 0) { arrayops::convert( &(out[0]), X.memptr(), N ); } return out; } template template arma_warn_unused inline std::vector conv_to< std::vector >::from(const Base& in, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const quasi_unwrap tmp(in.get_ref()); const Mat& X = tmp.M; arma_debug_check( ( (X.is_vec() == false) && (X.is_empty() == false) ), "conv_to(): given object can't be interpreted as a vector" ); const uword N = X.n_elem; std::vector out(N); if(N > 0) { arrayops::convert_cx( &(out[0]), X.memptr(), N ); } return out; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_max_meat.hpp0000644000176200001440000006517214124060717023407 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_max //! @{ template inline void op_max::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "max(): parameter 'dim' must be 0 or 1" ); const quasi_unwrap U(in.m); const Mat& X = U.M; if(U.is_alias(out) == false) { op_max::apply_noalias(out, X, dim); } else { Mat tmp; op_max::apply_noalias(tmp, X, dim); out.steal_mem(tmp); } } template inline void op_max::apply_noalias(Mat& out, const Mat& X, const uword dim, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(dim == 0) { arma_extra_debug_print("op_max::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols); if(X_n_rows == 0) { return; } eT* out_mem = out.memptr(); for(uword col=0; col 0) ? 1 : 0); if(X_n_cols == 0) { return; } eT* out_mem = out.memptr(); arrayops::copy(out_mem, X.colptr(0), X_n_rows); for(uword col=1; col out_mem[row]) { out_mem[row] = col_val; } } } } } template inline void op_max::apply_noalias(Mat& out, const Mat& X, const uword dim, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(dim == 0) { arma_extra_debug_print("op_max::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols); if(X_n_rows == 0) { return; } eT* out_mem = out.memptr(); for(uword col=0; col 0) ? 1 : 0); if(X_n_cols == 0) { return; } eT* out_mem = out.memptr(); for(uword row=0; row inline void op_max::apply(Cube& out, const OpCube& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 2), "max(): parameter 'dim' must be 0 or 1 or 2" ); const unwrap_cube U(in.m); if(U.is_alias(out) == false) { op_max::apply_noalias(out, U.M, dim); } else { Cube tmp; op_max::apply_noalias(tmp, U.M, dim); out.steal_mem(tmp); } } template inline void op_max::apply_noalias(Cube& out, const Cube& X, const uword dim, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword X_n_slices = X.n_slices; if(dim == 0) { arma_extra_debug_print("op_max::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols, X_n_slices); if(X_n_rows == 0) { return; } for(uword slice=0; slice < X_n_slices; ++slice) { eT* out_mem = out.slice_memptr(slice); for(uword col=0; col < X_n_cols; ++col) { out_mem[col] = op_max::direct_max( X.slice_colptr(slice,col), X_n_rows ); } } } else if(dim == 1) { arma_extra_debug_print("op_max::apply(): dim = 1"); out.set_size(X_n_rows, (X_n_cols > 0) ? 1 : 0, X_n_slices); if(X_n_cols == 0) { return; } for(uword slice=0; slice < X_n_slices; ++slice) { eT* out_mem = out.slice_memptr(slice); arrayops::copy(out_mem, X.slice_colptr(slice,0), X_n_rows); for(uword col=1; col < X_n_cols; ++col) { const eT* col_mem = X.slice_colptr(slice,col); for(uword row=0; row < X_n_rows; ++row) { const eT col_val = col_mem[row]; if(col_val > out_mem[row]) { out_mem[row] = col_val; } } } } } else if(dim == 2) { arma_extra_debug_print("op_max::apply(): dim = 2"); out.set_size(X_n_rows, X_n_cols, (X_n_slices > 0) ? 1 : 0); if(X_n_slices == 0) { return; } const uword N = X.n_elem_slice; eT* out_mem = out.slice_memptr(0); arrayops::copy(out_mem, X.slice_memptr(0), N); for(uword slice=1; slice < X_n_slices; ++slice) { const eT* X_mem = X.slice_memptr(slice); for(uword i=0; i < N; ++i) { const eT val = X_mem[i]; if(val > out_mem[i]) { out_mem[i] = val; } } } } } template inline void op_max::apply_noalias(Cube& out, const Cube& X, const uword dim, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword X_n_slices = X.n_slices; if(dim == 0) { arma_extra_debug_print("op_max::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols, X_n_slices); if(X_n_rows == 0) { return; } for(uword slice=0; slice < X_n_slices; ++slice) { eT* out_mem = out.slice_memptr(slice); for(uword col=0; col < X_n_cols; ++col) { out_mem[col] = op_max::direct_max( X.slice_colptr(slice,col), X_n_rows ); } } } else if(dim == 1) { arma_extra_debug_print("op_max::apply(): dim = 1"); out.set_size(X_n_rows, (X_n_cols > 0) ? 1 : 0, X_n_slices); if(X_n_cols == 0) { return; } for(uword slice=0; slice < X_n_slices; ++slice) { eT* out_mem = out.slice_memptr(slice); const Mat tmp('j', X.slice_memptr(slice), X_n_rows, X_n_cols); for(uword row=0; row < X_n_rows; ++row) { out_mem[row] = op_max::direct_max(tmp, row); } } } else if(dim == 2) { arma_extra_debug_print("op_max::apply(): dim = 2"); out.set_size(X_n_rows, X_n_cols, (X_n_slices > 0) ? 1 : 0); if(X_n_slices == 0) { return; } const uword N = X.n_elem_slice; eT* out_mem = out.slice_memptr(0); arrayops::copy(out_mem, X.slice_memptr(0), N); for(uword slice=1; slice < X_n_slices; ++slice) { const eT* X_mem = X.slice_memptr(slice); for(uword i=0; i < N; ++i) { const eT& val = X_mem[i]; if(std::abs(val) > std::abs(out_mem[i])) { out_mem[i] = val; } } } } } template inline eT op_max::direct_max(const eT* const X, const uword n_elem) { arma_extra_debug_sigprint(); eT max_val = priv::most_neg(); uword i,j; for(i=0, j=1; j max_val) { max_val = X_i; } if(X_j > max_val) { max_val = X_j; } } if(i < n_elem) { const eT X_i = X[i]; if(X_i > max_val) { max_val = X_i; } } return max_val; } template inline eT op_max::direct_max(const eT* const X, const uword n_elem, uword& index_of_max_val) { arma_extra_debug_sigprint(); eT max_val = priv::most_neg(); uword best_index = 0; uword i,j; for(i=0, j=1; j max_val) { max_val = X_i; best_index = i; } if(X_j > max_val) { max_val = X_j; best_index = j; } } if(i < n_elem) { const eT X_i = X[i]; if(X_i > max_val) { max_val = X_i; best_index = i; } } index_of_max_val = best_index; return max_val; } template inline eT op_max::direct_max(const Mat& X, const uword row) { arma_extra_debug_sigprint(); const uword X_n_cols = X.n_cols; eT max_val = priv::most_neg(); uword i,j; for(i=0, j=1; j < X_n_cols; i+=2, j+=2) { const eT tmp_i = X.at(row,i); const eT tmp_j = X.at(row,j); if(tmp_i > max_val) { max_val = tmp_i; } if(tmp_j > max_val) { max_val = tmp_j; } } if(i < X_n_cols) { const eT tmp_i = X.at(row,i); if(tmp_i > max_val) { max_val = tmp_i; } } return max_val; } template inline eT op_max::max(const subview& X) { arma_extra_debug_sigprint(); if(X.n_elem == 0) { arma_debug_check(true, "max(): object has no elements"); return Datum::nan; } const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; eT max_val = priv::most_neg(); if(X_n_rows == 1) { const Mat& A = X.m; const uword start_row = X.aux_row1; const uword start_col = X.aux_col1; const uword end_col_p1 = start_col + X_n_cols; uword i,j; for(i=start_col, j=start_col+1; j < end_col_p1; i+=2, j+=2) { const eT tmp_i = A.at(start_row, i); const eT tmp_j = A.at(start_row, j); if(tmp_i > max_val) { max_val = tmp_i; } if(tmp_j > max_val) { max_val = tmp_j; } } if(i < end_col_p1) { const eT tmp_i = A.at(start_row, i); if(tmp_i > max_val) { max_val = tmp_i; } } } else { for(uword col=0; col < X_n_cols; ++col) { max_val = (std::max)(max_val, op_max::direct_max(X.colptr(col), X_n_rows)); } } return max_val; } template inline typename arma_not_cx::result op_max::max(const Base& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy P(X.get_ref()); const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "max(): object has no elements"); return Datum::nan; } eT max_val = priv::most_neg(); if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; ea_type A = P.get_ea(); uword i,j; for(i=0, j=1; j max_val) { max_val = tmp_i; } if(tmp_j > max_val) { max_val = tmp_j; } } if(i < n_elem) { const eT tmp_i = A[i]; if(tmp_i > max_val) { max_val = tmp_i; } } } else { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); if(n_rows == 1) { uword i,j; for(i=0, j=1; j < n_cols; i+=2, j+=2) { const eT tmp_i = P.at(0,i); const eT tmp_j = P.at(0,j); if(tmp_i > max_val) { max_val = tmp_i; } if(tmp_j > max_val) { max_val = tmp_j; } } if(i < n_cols) { const eT tmp_i = P.at(0,i); if(tmp_i > max_val) { max_val = tmp_i; } } } else { for(uword col=0; col < n_cols; ++col) { uword i,j; for(i=0, j=1; j < n_rows; i+=2, j+=2) { const eT tmp_i = P.at(i,col); const eT tmp_j = P.at(j,col); if(tmp_i > max_val) { max_val = tmp_i; } if(tmp_j > max_val) { max_val = tmp_j; } } if(i < n_rows) { const eT tmp_i = P.at(i,col); if(tmp_i > max_val) { max_val = tmp_i; } } } } } return max_val; } template inline typename arma_not_cx::result op_max::max(const BaseCube& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const ProxyCube P(X.get_ref()); const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "max(): object has no elements"); return Datum::nan; } eT max_val = priv::most_neg(); if(ProxyCube::use_at == false) { typedef typename ProxyCube::ea_type ea_type; ea_type A = P.get_ea(); uword i,j; for(i=0, j=1; j max_val) { max_val = tmp_i; } if(tmp_j > max_val) { max_val = tmp_j; } } if(i < n_elem) { const eT tmp_i = A[i]; if(tmp_i > max_val) { max_val = tmp_i; } } } else { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_slices = P.get_n_slices(); for(uword slice=0; slice < n_slices; ++slice) for(uword col=0; col < n_cols; ++col ) for(uword row=0; row < n_rows; ++row ) { const eT tmp = P.at(row,col,slice); if(tmp > max_val) { max_val = tmp; } } } return max_val; } template inline typename arma_not_cx::result op_max::max_with_index(const Proxy& P, uword& index_of_max_val) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "max(): object has no elements"); return Datum::nan; } eT best_val = priv::most_neg(); uword best_index = 0; if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; ea_type A = P.get_ea(); for(uword i=0; i best_val) { best_val = tmp; best_index = i; } } } else { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); if(n_rows == 1) { for(uword i=0; i < n_cols; ++i) { const eT tmp = P.at(0,i); if(tmp > best_val) { best_val = tmp; best_index = i; } } } else if(n_cols == 1) { for(uword i=0; i < n_rows; ++i) { const eT tmp = P.at(i,0); if(tmp > best_val) { best_val = tmp; best_index = i; } } } else { uword count = 0; for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { const eT tmp = P.at(row,col); if(tmp > best_val) { best_val = tmp; best_index = count; } ++count; } } } index_of_max_val = best_index; return best_val; } template inline typename arma_not_cx::result op_max::max_with_index(const ProxyCube& P, uword& index_of_max_val) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "max(): object has no elements"); return Datum::nan; } eT best_val = priv::most_neg(); uword best_index = 0; if(ProxyCube::use_at == false) { typedef typename ProxyCube::ea_type ea_type; ea_type A = P.get_ea(); for(uword i=0; i < n_elem; ++i) { const eT tmp = A[i]; if(tmp > best_val) { best_val = tmp; best_index = i; } } } else { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_slices = P.get_n_slices(); uword count = 0; for(uword slice=0; slice < n_slices; ++slice) for(uword col=0; col < n_cols; ++col ) for(uword row=0; row < n_rows; ++row ) { const eT tmp = P.at(row,col,slice); if(tmp > best_val) { best_val = tmp; best_index = count; } ++count; } } index_of_max_val = best_index; return best_val; } template inline std::complex op_max::direct_max(const std::complex* const X, const uword n_elem) { arma_extra_debug_sigprint(); uword index = 0; T max_val = priv::most_neg(); for(uword i=0; i max_val) { max_val = tmp_val; index = i; } } return X[index]; } template inline std::complex op_max::direct_max(const std::complex* const X, const uword n_elem, uword& index_of_max_val) { arma_extra_debug_sigprint(); uword index = 0; T max_val = priv::most_neg(); for(uword i=0; i max_val) { max_val = tmp_val; index = i; } } index_of_max_val = index; return X[index]; } template inline std::complex op_max::direct_max(const Mat< std::complex >& X, const uword row) { arma_extra_debug_sigprint(); const uword X_n_cols = X.n_cols; uword index = 0; T max_val = priv::most_neg(); for(uword col=0; col max_val) { max_val = tmp_val; index = col; } } return X.at(row,index); } template inline std::complex op_max::max(const subview< std::complex >& X) { arma_extra_debug_sigprint(); typedef typename std::complex eT; if(X.n_elem == 0) { arma_debug_check(true, "max(): object has no elements"); return Datum::nan; } const Mat& A = X.m; const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword start_row = X.aux_row1; const uword start_col = X.aux_col1; const uword end_row_p1 = start_row + X_n_rows; const uword end_col_p1 = start_col + X_n_cols; T max_val = priv::most_neg(); uword best_row = 0; uword best_col = 0; if(X_n_rows == 1) { best_col = 0; for(uword col=start_col; col < end_col_p1; ++col) { const T tmp_val = std::abs( A.at(start_row, col) ); if(tmp_val > max_val) { max_val = tmp_val; best_col = col; } } best_row = start_row; } else { for(uword col=start_col; col < end_col_p1; ++col) for(uword row=start_row; row < end_row_p1; ++row) { const T tmp_val = std::abs( A.at(row, col) ); if(tmp_val > max_val) { max_val = tmp_val; best_row = row; best_col = col; } } } return A.at(best_row, best_col); } template inline typename arma_cx_only::result op_max::max(const Base& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; const Proxy P(X.get_ref()); const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "max(): object has no elements"); return Datum::nan; } T max_val = priv::most_neg(); if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; ea_type A = P.get_ea(); uword index = 0; for(uword i=0; i max_val) { max_val = tmp; index = i; } } return( A[index] ); } else { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); uword best_row = 0; uword best_col = 0; if(n_rows == 1) { for(uword col=0; col < n_cols; ++col) { const T tmp = std::abs(P.at(0,col)); if(tmp > max_val) { max_val = tmp; best_col = col; } } } else { for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { const T tmp = std::abs(P.at(row,col)); if(tmp > max_val) { max_val = tmp; best_row = row; best_col = col; } } } return P.at(best_row, best_col); } } template inline typename arma_cx_only::result op_max::max(const BaseCube& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; const ProxyCube P(X.get_ref()); const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "max(): object has no elements"); return Datum::nan; } T max_val = priv::most_neg(); if(ProxyCube::use_at == false) { typedef typename ProxyCube::ea_type ea_type; ea_type A = P.get_ea(); uword index = 0; for(uword i=0; i max_val) { max_val = tmp; index = i; } } return( A[index] ); } else { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_slices = P.get_n_slices(); eT max_val_orig = eT(0); for(uword slice=0; slice < n_slices; ++slice) for(uword col=0; col < n_cols; ++col ) for(uword row=0; row < n_rows; ++row ) { const eT tmp_orig = P.at(row,col,slice); const T tmp = std::abs(tmp_orig); if(tmp > max_val) { max_val = tmp; max_val_orig = tmp_orig; } } return max_val_orig; } } template inline typename arma_cx_only::result op_max::max_with_index(const Proxy& P, uword& index_of_max_val) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "max(): object has no elements"); return Datum::nan; } T best_val = priv::most_neg(); if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; ea_type A = P.get_ea(); uword best_index = 0; for(uword i=0; i best_val) { best_val = tmp; best_index = i; } } index_of_max_val = best_index; return( A[best_index] ); } else { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); uword best_row = 0; uword best_col = 0; uword best_index = 0; if(n_rows == 1) { for(uword col=0; col < n_cols; ++col) { const T tmp = std::abs(P.at(0,col)); if(tmp > best_val) { best_val = tmp; best_col = col; } } best_index = best_col; } else if(n_cols == 1) { for(uword row=0; row < n_rows; ++row) { const T tmp = std::abs(P.at(row,0)); if(tmp > best_val) { best_val = tmp; best_row = row; } } best_index = best_row; } else { uword count = 0; for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { const T tmp = std::abs(P.at(row,col)); if(tmp > best_val) { best_val = tmp; best_row = row; best_col = col; best_index = count; } ++count; } } index_of_max_val = best_index; return P.at(best_row, best_col); } } template inline typename arma_cx_only::result op_max::max_with_index(const ProxyCube& P, uword& index_of_max_val) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "max(): object has no elements"); return Datum::nan; } T best_val = priv::most_neg(); if(ProxyCube::use_at == false) { typedef typename ProxyCube::ea_type ea_type; ea_type A = P.get_ea(); uword best_index = 0; for(uword i=0; i < n_elem; ++i) { const T tmp = std::abs(A[i]); if(tmp > best_val) { best_val = tmp; best_index = i; } } index_of_max_val = best_index; return( A[best_index] ); } else { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_slices = P.get_n_slices(); eT best_val_orig = eT(0); uword best_index = 0; uword count = 0; for(uword slice=0; slice < n_slices; ++slice) for(uword col=0; col < n_cols; ++col ) for(uword row=0; row < n_rows; ++row ) { const eT tmp_orig = P.at(row,col,slice); const T tmp = std::abs(tmp_orig); if(tmp > best_val) { best_val = tmp; best_val_orig = tmp_orig; best_index = count; } ++count; } index_of_max_val = best_index; return best_val_orig; } } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_sort.hpp0000644000176200001440000000610214124060717022554 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_sort //! @{ template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && resolves_to_vector::yes, const Op >::result sort ( const T1& X ) { arma_extra_debug_sigprint(); return Op(X, 0, 0); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && resolves_to_vector::no, const Op >::result sort ( const T1& X ) { arma_extra_debug_sigprint(); return Op(X, 0, 0); } template arma_warn_unused inline typename enable_if2 < is_arma_type::value && resolves_to_vector::yes && is_same_type::value, const Op >::result sort ( const T1& X, const T2* sort_direction ) { arma_extra_debug_sigprint(); const char sig = (sort_direction != nullptr) ? sort_direction[0] : char(0); arma_debug_check( (sig != 'a') && (sig != 'd'), "sort(): unknown sort direction" ); const uword sort_type = (sig == 'a') ? 0 : 1; return Op(X, sort_type, 0); } template arma_warn_unused inline typename enable_if2 < is_arma_type::value && resolves_to_vector::no && is_same_type::value, const Op >::result sort ( const T1& X, const T2* sort_direction ) { arma_extra_debug_sigprint(); const char sig = (sort_direction != nullptr) ? sort_direction[0] : char(0); arma_debug_check( (sig != 'a') && (sig != 'd'), "sort(): unknown sort direction" ); const uword sort_type = (sig == 'a') ? 0 : 1; return Op(X, sort_type, 0); } template arma_warn_unused inline typename enable_if2 < ( (is_arma_type::value) && (is_same_type::value) ), const Op >::result sort ( const T1& X, const T2* sort_direction, const uword dim ) { arma_extra_debug_sigprint(); const char sig = (sort_direction != nullptr) ? sort_direction[0] : char(0); arma_debug_check( (sig != 'a') && (sig != 'd'), "sort(): unknown sort direction" ); const uword sort_type = (sig == 'a') ? 0 : 1; return Op(X, sort_type, dim); } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_kron_meat.hpp0000644000176200001440000000673314124060717024107 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_kron //! @{ //! \brief //! both input matrices have the same element type template inline void glue_kron::direct_kron(Mat& out, const Mat& A, const Mat& B) { arma_extra_debug_sigprint(); const uword A_rows = A.n_rows; const uword A_cols = A.n_cols; const uword B_rows = B.n_rows; const uword B_cols = B.n_cols; out.set_size(A_rows*B_rows, A_cols*B_cols); if(out.is_empty()) { return; } for(uword j = 0; j < A_cols; j++) { for(uword i = 0; i < A_rows; i++) { out.submat(i*B_rows, j*B_cols, (i+1)*B_rows-1, (j+1)*B_cols-1) = A.at(i,j) * B; } } } //! \brief //! different types of input matrices //! A -> complex, B -> basic element type template inline void glue_kron::direct_kron(Mat< std::complex >& out, const Mat< std::complex >& A, const Mat& B) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const uword A_rows = A.n_rows; const uword A_cols = A.n_cols; const uword B_rows = B.n_rows; const uword B_cols = B.n_cols; out.set_size(A_rows*B_rows, A_cols*B_cols); if(out.is_empty()) { return; } Mat tmp_B = conv_to< Mat >::from(B); for(uword j = 0; j < A_cols; j++) { for(uword i = 0; i < A_rows; i++) { out.submat(i*B_rows, j*B_cols, (i+1)*B_rows-1, (j+1)*B_cols-1) = A.at(i,j) * tmp_B; } } } //! \brief //! different types of input matrices //! A -> basic element type, B -> complex template inline void glue_kron::direct_kron(Mat< std::complex >& out, const Mat& A, const Mat< std::complex >& B) { arma_extra_debug_sigprint(); const uword A_rows = A.n_rows; const uword A_cols = A.n_cols; const uword B_rows = B.n_rows; const uword B_cols = B.n_cols; out.set_size(A_rows*B_rows, A_cols*B_cols); if(out.is_empty()) { return; } for(uword j = 0; j < A_cols; j++) { for(uword i = 0; i < A_rows; i++) { out.submat(i*B_rows, j*B_cols, (i+1)*B_rows-1, (j+1)*B_cols-1) = A.at(i,j) * B; } } } //! \brief //! apply Kronecker product for two objects with same element type template inline void glue_kron::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap A_tmp(X.A); const unwrap B_tmp(X.B); const Mat& A = A_tmp.M; const Mat& B = B_tmp.M; if( (&out != &A) && (&out != &B) ) { glue_kron::direct_kron(out, A, B); } else { Mat tmp; glue_kron::direct_kron(tmp, A, B); out.steal_mem(tmp); } } //! @} RcppArmadillo/inst/include/armadillo_bits/ProxyCube.hpp0000644000176200001440000005636714124060717023044 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup ProxyCube //! @{ template struct ProxyCube { inline ProxyCube(const T1&) { arma_type_check(( is_arma_cube_type::value == false )); } }; // ea_type is the "element accessor" type, // which can provide access to elements via operator[] template struct ProxyCube< Cube > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef Cube stored_type; typedef const eT* ea_type; typedef const Cube& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; arma_aligned const Cube& Q; inline explicit ProxyCube(const Cube& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem_slice() const { return Q.n_elem_slice; } arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Cube& X) const { return (void_ptr(&Q) == void_ptr(&X)); } template arma_inline bool has_overlap(const subview_cube& X) const { return is_alias(X.m); } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct ProxyCube< GenCube > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef GenCube stored_type; typedef const GenCube& ea_type; typedef const GenCube& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; arma_aligned const GenCube& Q; inline explicit ProxyCube(const GenCube& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem_slice() const { return Q.n_rows*Q.n_cols; } arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_rows*Q.n_cols*Q.n_slices; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } arma_inline elem_type at_alt (const uword i) const { return Q[i]; } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Cube&) const { return false; } template constexpr bool has_overlap(const subview_cube&) const { return false; } arma_inline bool is_aligned() const { return GenCube::is_simple; } }; template struct ProxyCube< GenCube > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef Cube stored_type; typedef const eT* ea_type; typedef const Cube& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; arma_aligned const Cube Q; inline explicit ProxyCube(const GenCube& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem_slice() const { return Q.n_elem_slice; } arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Cube&) const { return false; } template constexpr bool has_overlap(const subview_cube&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct ProxyCube< GenCube > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef Cube stored_type; typedef const eT* ea_type; typedef const Cube& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; arma_aligned const Cube Q; inline explicit ProxyCube(const GenCube& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem_slice() const { return Q.n_elem_slice; } arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Cube&) const { return false; } template constexpr bool has_overlap(const subview_cube&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct ProxyCube< OpCube > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Cube stored_type; typedef const elem_type* ea_type; typedef const Cube& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; arma_aligned const Cube Q; inline explicit ProxyCube(const OpCube& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem_slice() const { return Q.n_elem_slice; } arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Cube&) const { return false; } template constexpr bool has_overlap(const subview_cube&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct ProxyCube< GlueCube > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Cube stored_type; typedef const elem_type* ea_type; typedef const Cube& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; arma_aligned const Cube Q; inline explicit ProxyCube(const GlueCube& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem_slice() const { return Q.n_elem_slice; } arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Cube&) const { return false; } template constexpr bool has_overlap(const subview_cube&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct ProxyCube< subview_cube > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef subview_cube stored_type; typedef const subview_cube& ea_type; typedef const subview_cube& aligned_ea_type; static constexpr bool use_at = true; static constexpr bool use_mp = false; static constexpr bool has_subview = true; arma_aligned const subview_cube& Q; inline explicit ProxyCube(const subview_cube& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem_slice() const { return Q.n_elem_slice; } arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Cube& X) const { return (void_ptr(&(Q.m)) == void_ptr(&X)); } template arma_inline bool has_overlap(const subview_cube& X) const { return Q.check_overlap(X); } constexpr bool is_aligned() const { return false; } }; template struct ProxyCube< subview_cube_slices > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef Cube stored_type; typedef const eT* ea_type; typedef const Cube& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; arma_aligned const Cube Q; inline explicit ProxyCube(const subview_cube_slices& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem_slice() const { return Q.n_elem_slice; } arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Cube&) const { return false; } template constexpr bool has_overlap(const subview_cube&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct ProxyCube< eOpCube > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef eOpCube stored_type; typedef const eOpCube& ea_type; typedef const eOpCube& aligned_ea_type; static constexpr bool use_at = eOpCube::use_at; static constexpr bool use_mp = eOpCube::use_mp; static constexpr bool has_subview = eOpCube::has_subview; arma_aligned const eOpCube& Q; inline explicit ProxyCube(const eOpCube& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.get_n_rows(); } arma_inline uword get_n_cols() const { return Q.get_n_cols(); } arma_inline uword get_n_elem_slice() const { return Q.get_n_elem_slice(); } arma_inline uword get_n_slices() const { return Q.get_n_slices(); } arma_inline uword get_n_elem() const { return Q.get_n_elem(); } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Cube& X) const { return Q.P.is_alias(X); } template arma_inline bool has_overlap(const subview_cube& X) const { return Q.P.has_overlap(X); } arma_inline bool is_aligned() const { return Q.P.is_aligned(); } }; template struct ProxyCube< eGlueCube > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef eGlueCube stored_type; typedef const eGlueCube& ea_type; typedef const eGlueCube& aligned_ea_type; static constexpr bool use_at = eGlueCube::use_at; static constexpr bool use_mp = eGlueCube::use_mp; static constexpr bool has_subview = eGlueCube::has_subview; arma_aligned const eGlueCube& Q; inline explicit ProxyCube(const eGlueCube& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.get_n_rows(); } arma_inline uword get_n_cols() const { return Q.get_n_cols(); } arma_inline uword get_n_elem_slice() const { return Q.get_n_elem_slice(); } arma_inline uword get_n_slices() const { return Q.get_n_slices(); } arma_inline uword get_n_elem() const { return Q.get_n_elem(); } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Cube& X) const { return (Q.P1.is_alias(X) || Q.P2.is_alias(X)); } template arma_inline bool has_overlap(const subview_cube& X) const { return (Q.P1.has_overlap(X) || Q.P2.has_overlap(X)); } arma_inline bool is_aligned() const { return Q.P1.is_aligned() && Q.P2.is_aligned(); } }; template struct ProxyCube< mtOpCube > { typedef out_eT elem_type; typedef typename get_pod_type::result pod_type; typedef Cube stored_type; typedef const elem_type* ea_type; typedef const Cube& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; arma_aligned const Cube Q; inline explicit ProxyCube(const mtOpCube& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem_slice() const { return Q.n_elem_slice; } arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Cube&) const { return false; } template constexpr bool has_overlap(const subview_cube&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct ProxyCube< mtGlueCube > { typedef out_eT elem_type; typedef typename get_pod_type::result pod_type; typedef Cube stored_type; typedef const elem_type* ea_type; typedef const Cube& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; arma_aligned const Cube Q; inline explicit ProxyCube(const mtGlueCube& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem_slice() const { return Q.n_elem_slice; } arma_inline uword get_n_slices() const { return Q.n_slices; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Cube&) const { return false; } template constexpr bool has_overlap(const subview_cube&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; //! @} RcppArmadillo/inst/include/armadillo_bits/arma_ostream_meat.hpp0000644000176200001440000007062314124060717024573 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup arma_ostream //! @{ inline arma_ostream_state::arma_ostream_state(const std::ostream& o) : orig_flags (o.flags()) , orig_precision(o.precision()) , orig_width (o.width()) , orig_fill (o.fill()) { } inline void arma_ostream_state::restore(std::ostream& o) const { o.flags (orig_flags); o.precision(orig_precision); o.width (orig_width); o.fill (orig_fill); } // // template inline std::streamsize arma_ostream::modify_stream(std::ostream& o, const eT* data, const uword n_elem) { o.unsetf(ios::showbase); o.unsetf(ios::uppercase); o.unsetf(ios::showpos); o.fill(' '); std::streamsize cell_width; bool use_layout_B = false; bool use_layout_C = false; bool use_layout_D = false; for(uword i=0; i 4) && (is_same_type::yes || is_same_type::yes) >::geq(val, eT(+10000000000)) ) || ( cond_rel< (sizeof(eT) > 4) && is_same_type::yes >::leq(val, eT(-10000000000)) ) ) { use_layout_D = true; break; } if( ( val >= eT(+100) ) || //( (is_signed::value) && (val <= eT(-100)) ) || //( (is_non_integral::value) && (val > eT(0)) && (val <= eT(+1e-4)) ) || //( (is_non_integral::value) && (is_signed::value) && (val < eT(0)) && (val >= eT(-1e-4)) ) ( cond_rel< is_signed::value >::leq(val, eT(-100)) ) || ( cond_rel< is_non_integral::value >::gt(val, eT(0)) && cond_rel< is_non_integral::value >::leq(val, eT(+1e-4)) ) || ( cond_rel< is_non_integral::value && is_signed::value >::lt(val, eT(0)) && cond_rel< is_non_integral::value && is_signed::value >::geq(val, eT(-1e-4)) ) ) { use_layout_C = true; break; } if( // (val >= eT(+10)) || ( (is_signed::value) && (val <= eT(-10)) ) (val >= eT(+10)) || ( cond_rel< is_signed::value >::leq(val, eT(-10)) ) ) { use_layout_B = true; } } if(use_layout_D) { o.setf(ios::scientific); o.setf(ios::right); o.unsetf(ios::fixed); o.precision(4); cell_width = 21; } else if(use_layout_C) { o.setf(ios::scientific); o.setf(ios::right); o.unsetf(ios::fixed); o.precision(4); cell_width = 13; } else if(use_layout_B) { o.unsetf(ios::scientific); o.setf(ios::right); o.setf(ios::fixed); o.precision(4); cell_width = 10; } else { o.unsetf(ios::scientific); o.setf(ios::right); o.setf(ios::fixed); o.precision(4); cell_width = 9; } return cell_width; } //! "better than nothing" settings for complex numbers template inline std::streamsize arma_ostream::modify_stream(std::ostream& o, const std::complex* data, const uword n_elem) { arma_ignore(data); arma_ignore(n_elem); o.unsetf(ios::showbase); o.unsetf(ios::uppercase); o.fill(' '); o.setf(ios::scientific); o.setf(ios::showpos); o.setf(ios::right); o.unsetf(ios::fixed); std::streamsize cell_width; o.precision(3); cell_width = 2 + 2*(1 + 3 + o.precision() + 5) + 1; return cell_width; } template inline std::streamsize arma_ostream::modify_stream(std::ostream& o, typename SpMat::const_iterator begin, const uword n_elem, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); o.unsetf(ios::showbase); o.unsetf(ios::uppercase); o.unsetf(ios::showpos); o.fill(' '); std::streamsize cell_width; bool use_layout_B = false; bool use_layout_C = false; for(typename SpMat::const_iterator it = begin; it.pos() < n_elem; ++it) { const eT val = (*it); if(arma_isfinite(val) == false) { continue; } if( val >= eT(+100) || ( (is_signed::value) && (val <= eT(-100)) ) || ( (is_non_integral::value) && (val > eT(0)) && (val <= eT(+1e-4)) ) || ( (is_non_integral::value) && (is_signed::value) && (val < eT(0)) && (val >= eT(-1e-4)) ) ) { use_layout_C = true; break; } if( (val >= eT(+10)) || ( (is_signed::value) && (val <= eT(-10)) ) ) { use_layout_B = true; } } if(use_layout_C) { o.setf(ios::scientific); o.setf(ios::right); o.unsetf(ios::fixed); o.precision(4); cell_width = 13; } else if(use_layout_B) { o.unsetf(ios::scientific); o.setf(ios::right); o.setf(ios::fixed); o.precision(4); cell_width = 10; } else { o.unsetf(ios::scientific); o.setf(ios::right); o.setf(ios::fixed); o.precision(4); cell_width = 9; } return cell_width; } //! "better than nothing" settings for complex numbers template inline std::streamsize arma_ostream::modify_stream(std::ostream& o, typename SpMat::const_iterator begin, const uword n_elem, const typename arma_cx_only::result* junk) { arma_ignore(begin); arma_ignore(n_elem); arma_ignore(junk); o.unsetf(ios::showbase); o.unsetf(ios::uppercase); o.fill(' '); o.setf(ios::scientific); o.setf(ios::showpos); o.setf(ios::right); o.unsetf(ios::fixed); std::streamsize cell_width; o.precision(3); cell_width = 2 + 2*(1 + 3 + o.precision() + 5) + 1; return cell_width; } template inline void arma_ostream::print_elem_zero(std::ostream& o, const bool modify) { typedef typename promote_type::result promoted_eT; if(modify) { const ios::fmtflags save_flags = o.flags(); const std::streamsize save_precision = o.precision(); o.unsetf(ios::scientific); o.setf(ios::fixed); o.precision(0); o << promoted_eT(0); o.flags(save_flags); o.precision(save_precision); } else { o << promoted_eT(0); } } template inline void arma_ostream::print_elem(std::ostream& o, const eT& x, const bool modify) { if(x == eT(0)) { arma_ostream::print_elem_zero(o, modify); } else { arma_ostream::raw_print_elem(o, x); } } template inline void arma_ostream::raw_print_elem(std::ostream& o, const eT& x) { if(is_signed::value) { typedef typename promote_type::result promoted_eT; if(arma_isfinite(x)) { o << promoted_eT(x); } else { o << ( arma_isinf(x) ? ((x <= eT(0)) ? "-inf" : "inf") : "nan" ); } } else { typedef typename promote_type::result promoted_eT; o << promoted_eT(x); } } template inline void arma_ostream::print_elem(std::ostream& o, const std::complex& x, const bool modify) { if( (x.real() == T(0)) && (x.imag() == T(0)) && (modify) ) { o << "(0,0)"; } else { arma_ostream::raw_print_elem(o, x); } } template inline void arma_ostream::raw_print_elem(std::ostream& o, const std::complex& x) { std::ostringstream ss; ss.flags(o.flags()); //ss.imbue(o.getloc()); ss.precision(o.precision()); ss << '('; const T a = x.real(); if(arma_isfinite(a)) { ss << a; } else { ss << ( arma_isinf(a) ? ((a <= T(0)) ? "-inf" : "+inf") : "nan" ); } ss << ','; const T b = x.imag(); if(arma_isfinite(b)) { ss << b; } else { ss << ( arma_isinf(b) ? ((b <= T(0)) ? "-inf" : "+inf") : "nan" ); } ss << ')'; o << ss.str(); } //! Print a matrix to the specified stream template arma_cold inline void arma_ostream::print(std::ostream& o, const Mat& m, const bool modify) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(o); const std::streamsize cell_width = modify ? arma_ostream::modify_stream(o, m.memptr(), m.n_elem) : o.width(); const uword m_n_rows = m.n_rows; const uword m_n_cols = m.n_cols; if(m.is_empty() == false) { if(m_n_cols > 0) { if(cell_width > 0) { for(uword row=0; row < m_n_rows; ++row) { for(uword col=0; col < m_n_cols; ++col) { // the cell width appears to be reset after each element is printed, // hence we need to restore it o.width(cell_width); arma_ostream::print_elem(o, m.at(row,col), modify); } o << '\n'; } } else { for(uword row=0; row < m_n_rows; ++row) { for(uword col=0; col < m_n_cols-1; ++col) { arma_ostream::print_elem(o, m.at(row,col), modify); o << ' '; } arma_ostream::print_elem(o, m.at(row, m_n_cols-1), modify); o << '\n'; } } } } else { if(modify) { o.unsetf(ios::showbase); o.unsetf(ios::uppercase); o.unsetf(ios::showpos); o.setf(ios::fixed); } o << "[matrix size: " << m_n_rows << 'x' << m_n_cols << "]\n"; } o.flush(); stream_state.restore(o); } //! Print a cube to the specified stream template arma_cold inline void arma_ostream::print(std::ostream& o, const Cube& x, const bool modify) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(o); if(x.is_empty() == false) { for(uword slice=0; slice < x.n_slices; ++slice) { const Mat tmp(const_cast(x.slice_memptr(slice)), x.n_rows, x.n_cols, false); o << "[cube slice: " << slice << ']' << '\n'; arma_ostream::print(o, tmp, modify); if((slice+1) < x.n_slices) { o << '\n'; } } } else { if(modify) { o.unsetf(ios::showbase); o.unsetf(ios::uppercase); o.unsetf(ios::showpos); o.setf(ios::fixed); } o << "[cube size: " << x.n_rows << 'x' << x.n_cols << 'x' << x.n_slices << "]\n"; } stream_state.restore(o); } //! Print a field to the specified stream //! Assumes type oT can be printed, ie. oT has std::ostream& operator<< (std::ostream&, const oT&) template arma_cold inline void arma_ostream::print(std::ostream& o, const field& x) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(o); const std::streamsize cell_width = o.width(); const uword x_n_rows = x.n_rows; const uword x_n_cols = x.n_cols; const uword x_n_slices = x.n_slices; if(x.is_empty() == false) { if(x_n_slices == 1) { for(uword col=0; col < x_n_cols; ++col) { o << "[field column: " << col << ']' << '\n'; for(uword row=0; row < x_n_rows; ++row) { o.width(cell_width); o << x.at(row,col) << '\n'; } o << '\n'; } } else { for(uword slice=0; slice < x_n_slices; ++slice) { o << "[field slice: " << slice << ']' << '\n'; for(uword col=0; col < x_n_cols; ++col) { o << "[field column: " << col << ']' << '\n'; for(uword row=0; row < x_n_rows; ++row) { o.width(cell_width); o << x.at(row,col,slice) << '\n'; } o << '\n'; } o << '\n'; } } } else { o.unsetf(ios::showbase); o.unsetf(ios::uppercase); o.unsetf(ios::showpos); o.setf(ios::fixed); o << "[field size: " << x_n_rows << 'x' << x_n_cols << 'x' << x_n_slices << "]\n"; } o.flush(); stream_state.restore(o); } //! Print a subfield to the specified stream //! Assumes type oT can be printed, ie. oT has std::ostream& operator<< (std::ostream&, const oT&) template arma_cold inline void arma_ostream::print(std::ostream& o, const subview_field& x) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(o); const std::streamsize cell_width = o.width(); const uword x_n_rows = x.n_rows; const uword x_n_cols = x.n_cols; const uword x_n_slices = x.n_slices; if(x.is_empty() == false) { if(x_n_slices == 1) { for(uword col=0; col < x_n_cols; ++col) { o << "[field column: " << col << ']' << '\n'; for(uword row=0; row arma_cold inline void arma_ostream::print_dense(std::ostream& o, const SpMat& m, const bool modify) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(o); std::streamsize cell_width = o.width(); if(modify) { if(m.n_nonzero > 0) { cell_width = arma_ostream::modify_stream(o, m.begin(), m.n_nonzero); } else { eT tmp[1]; tmp[0] = eT(0); cell_width = arma_ostream::modify_stream(o, &tmp[0], 1); } } const uword m_n_rows = m.n_rows; const uword m_n_cols = m.n_cols; if(m.is_empty() == false) { if(m_n_cols > 0) { if(cell_width > 0) { for(uword row=0; row < m_n_rows; ++row) { for(uword col=0; col < m_n_cols; ++col) { // the cell width appears to be reset after each element is printed, // hence we need to restore it o.width(cell_width); arma_ostream::print_elem(o, m.at(row,col), modify); } o << '\n'; } } else { for(uword row=0; row < m_n_rows; ++row) { for(uword col=0; col < m_n_cols-1; ++col) { arma_ostream::print_elem(o, m.at(row,col), modify); o << ' '; } arma_ostream::print_elem(o, m.at(row, m_n_cols-1), modify); o << '\n'; } } } } else { if(modify) { o.unsetf(ios::showbase); o.unsetf(ios::uppercase); o.unsetf(ios::showpos); o.setf(ios::fixed); } o << "[matrix size: " << m_n_rows << 'x' << m_n_cols << "]\n"; } o.flush(); stream_state.restore(o); } template arma_cold inline void arma_ostream::print(std::ostream& o, const SpMat& m, const bool modify) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(o); o.unsetf(ios::showbase); o.unsetf(ios::uppercase); o.unsetf(ios::showpos); o.unsetf(ios::scientific); o.setf(ios::right); o.setf(ios::fixed); const uword m_n_nonzero = m.n_nonzero; const double density = (m.n_elem > 0) ? (double(m_n_nonzero) / double(m.n_elem) * double(100)) : double(0); o << "[matrix size: " << m.n_rows << 'x' << m.n_cols << "; n_nonzero: " << m_n_nonzero; if(density == double(0)) { o.precision(0); } else if(density >= (double(10.0)-std::numeric_limits::epsilon())) { o.precision(1); } else if(density > (double(0.01)-std::numeric_limits::epsilon())) { o.precision(2); } else if(density > (double(0.001)-std::numeric_limits::epsilon())) { o.precision(3); } else if(density > (double(0.0001)-std::numeric_limits::epsilon())) { o.precision(4); } else { o.unsetf(ios::fixed); o.setf(ios::scientific); o.precision(2); } o << "; density: " << density << "%]\n\n"; if(modify == false) { stream_state.restore(o); } if(m_n_nonzero > 0) { const std::streamsize cell_width = modify ? arma_ostream::modify_stream(o, m.begin(), m_n_nonzero) : o.width(); typename SpMat::const_iterator it = m.begin(); typename SpMat::const_iterator it_end = m.end(); while(it != it_end) { const uword row = it.row(); const uword col = it.col(); // TODO: change the maximum number of spaces before and after each location to be dependent on n_rows and n_cols if(row < 10) { o << " "; } else if(row < 100) { o << " "; } else if(row < 1000) { o << " "; } else if(row < 10000) { o << " "; } else if(row < 100000) { o << " "; } else if(row < 1000000) { o << ' '; } o << '(' << row << ", " << col << ") "; if(col < 10) { o << " "; } else if(col < 100) { o << " "; } else if(col < 1000) { o << " "; } else if(col < 10000) { o << " "; } else if(col < 100000) { o << " "; } else if(col < 1000000) { o << ' '; } if(cell_width > 0) { o.width(cell_width); } arma_ostream::print_elem(o, eT(*it), modify); o << '\n'; ++it; } o << '\n'; } o.flush(); stream_state.restore(o); } arma_cold inline void arma_ostream::print(std::ostream& o, const SizeMat& S) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(o); o.unsetf(ios::showbase); o.unsetf(ios::uppercase); o.unsetf(ios::showpos); o.setf(ios::fixed); o << S.n_rows << 'x' << S.n_cols; stream_state.restore(o); } arma_cold inline void arma_ostream::print(std::ostream& o, const SizeCube& S) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(o); o.unsetf(ios::showbase); o.unsetf(ios::uppercase); o.unsetf(ios::showpos); o.setf(ios::fixed); o << S.n_rows << 'x' << S.n_cols << 'x' << S.n_slices; stream_state.restore(o); } template arma_cold inline void arma_ostream::brief_print(std::ostream& o, const Mat& m, const bool print_size) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(o); if(print_size) { o.unsetf(ios::showbase); o.unsetf(ios::uppercase); o.unsetf(ios::showpos); o.setf(ios::fixed); o << "[matrix size: " << m.n_rows << 'x' << m.n_cols << "]\n"; } if(m.n_elem == 0) { o.flush(); stream_state.restore(o); return; } if((m.n_rows <= 5) && (m.n_cols <= 5)) { arma_ostream::print(o, m, true); return; } const bool print_row_ellipsis = (m.n_rows >= 6); const bool print_col_ellipsis = (m.n_cols >= 6); if( (print_row_ellipsis == true) && (print_col_ellipsis == true) ) { Mat X(4, 4, arma_nozeros_indicator()); X( span(0,2), span(0,2) ) = m( span(0,2), span(0,2) ); // top left submatrix X( 3, span(0,2) ) = m( m.n_rows-1, span(0,2) ); // truncated last row X( span(0,2), 3 ) = m( span(0,2), m.n_cols-1 ); // truncated last column X( 3, 3 ) = m( m.n_rows-1, m.n_cols-1 ); // bottom right element const std::streamsize cell_width = arma_ostream::modify_stream(o, X.memptr(), X.n_elem); for(uword row=0; row <= 2; ++row) { for(uword col=0; col <= 2; ++col) { o.width(cell_width); arma_ostream::print_elem(o, X.at(row,col), true); } o.width(6); o << "..."; o.width(cell_width); arma_ostream::print_elem(o, X.at(row,3), true); o << '\n'; } for(uword col=0; col <= 2; ++col) { o.width(cell_width); o << ':'; } o.width(6); o << "..."; o.width(cell_width); o << ':' << '\n'; const uword row = 3; { for(uword col=0; col <= 2; ++col) { o.width(cell_width); arma_ostream::print_elem(o, X.at(row,col), true); } o.width(6); o << "..."; o.width(cell_width); arma_ostream::print_elem(o, X.at(row,3), true); o << '\n'; } } if( (print_row_ellipsis == true) && (print_col_ellipsis == false) ) { Mat X(4, m.n_cols, arma_nozeros_indicator()); X( span(0,2), span::all ) = m( span(0,2), span::all ); // top X( 3, span::all ) = m( m.n_rows-1, span::all ); // bottom const std::streamsize cell_width = arma_ostream::modify_stream(o, X.memptr(), X.n_elem); for(uword row=0; row <= 2; ++row) // first 3 rows { for(uword col=0; col < m.n_cols; ++col) { o.width(cell_width); arma_ostream::print_elem(o, X.at(row,col), true); } o << '\n'; } for(uword col=0; col < m.n_cols; ++col) { o.width(cell_width); o << ':'; } o.width(cell_width); o << '\n'; const uword row = 3; { for(uword col=0; col < m.n_cols; ++col) { o.width(cell_width); arma_ostream::print_elem(o, X.at(row,col), true); } } o << '\n'; } if( (print_row_ellipsis == false) && (print_col_ellipsis == true) ) { Mat X(m.n_rows, 4, arma_nozeros_indicator()); X( span::all, span(0,2) ) = m( span::all, span(0,2) ); // left X( span::all, 3 ) = m( span::all, m.n_cols-1 ); // right const std::streamsize cell_width = arma_ostream::modify_stream(o, X.memptr(), X.n_elem); for(uword row=0; row < m.n_rows; ++row) { for(uword col=0; col <= 2; ++col) { o.width(cell_width); arma_ostream::print_elem(o, X.at(row,col), true); } o.width(6); o << "..."; o.width(cell_width); arma_ostream::print_elem(o, X.at(row,3), true); o << '\n'; } } o.flush(); stream_state.restore(o); } template arma_cold inline void arma_ostream::brief_print(std::ostream& o, const Cube& x) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(o); o.unsetf(ios::showbase); o.unsetf(ios::uppercase); o.unsetf(ios::showpos); o.setf(ios::fixed); o << "[cube size: " << x.n_rows << 'x' << x.n_cols << 'x' << x.n_slices << "]\n"; if(x.n_elem == 0) { o.flush(); stream_state.restore(o); return; } if(x.n_slices <= 3) { for(uword slice=0; slice < x.n_slices; ++slice) { const Mat tmp(const_cast(x.slice_memptr(slice)), x.n_rows, x.n_cols, false); o << "[cube slice: " << slice << ']' << '\n'; arma_ostream::brief_print(o, tmp, false); if((slice+1) < x.n_slices) { o << '\n'; } } } else { for(uword slice=0; slice <= 1; ++slice) { const Mat tmp(const_cast(x.slice_memptr(slice)), x.n_rows, x.n_cols, false); o << "[cube slice: " << slice << ']' << '\n'; arma_ostream::brief_print(o, tmp, false); o << '\n'; } o << "[cube slice: ...]\n\n"; const uword slice = x.n_slices-1; { const Mat tmp(const_cast(x.slice_memptr(slice)), x.n_rows, x.n_cols, false); o << "[cube slice: " << slice << ']' << '\n'; arma_ostream::brief_print(o, tmp, false); } } stream_state.restore(o); } template arma_cold inline void arma_ostream::brief_print(std::ostream& o, const SpMat& m) { arma_extra_debug_sigprint(); if(m.n_nonzero <= 10) { arma_ostream::print(o, m, true); return; } const arma_ostream_state stream_state(o); o.unsetf(ios::showbase); o.unsetf(ios::uppercase); o.unsetf(ios::showpos); o.unsetf(ios::scientific); o.setf(ios::right); o.setf(ios::fixed); const uword m_n_nonzero = m.n_nonzero; const double density = (m.n_elem > 0) ? (double(m_n_nonzero) / double(m.n_elem) * double(100)) : double(0); o << "[matrix size: " << m.n_rows << 'x' << m.n_cols << "; n_nonzero: " << m_n_nonzero; if(density == double(0)) { o.precision(0); } else if(density >= (double(10.0)-std::numeric_limits::epsilon())) { o.precision(1); } else if(density > (double(0.01)-std::numeric_limits::epsilon())) { o.precision(2); } else if(density > (double(0.001)-std::numeric_limits::epsilon())) { o.precision(3); } else if(density > (double(0.0001)-std::numeric_limits::epsilon())) { o.precision(4); } else { o.unsetf(ios::fixed); o.setf(ios::scientific); o.precision(2); } o << "; density: " << density << "%]\n\n"; // get the first 9 elements and the last element typename SpMat::const_iterator it = m.begin(); typename SpMat::const_iterator it_end = m.end(); uvec storage_row(10); uvec storage_col(10); Col storage_val(10); uword count = 0; while( (it != it_end) && (count < 9) ) { storage_row(count) = it.row(); storage_col(count) = it.col(); storage_val(count) = (*it); ++it; ++count; } it = it_end; --it; storage_row(count) = it.row(); storage_col(count) = it.col(); storage_val(count) = (*it); const std::streamsize cell_width = arma_ostream::modify_stream(o, storage_val.memptr(), 10); for(uword i=0; i < 9; ++i) { const uword row = storage_row(i); const uword col = storage_col(i); if(row < 10) { o << " "; } else if(row < 100) { o << " "; } else if(row < 1000) { o << " "; } else if(row < 10000) { o << " "; } else if(row < 100000) { o << " "; } else if(row < 1000000) { o << ' '; } o << '(' << row << ", " << col << ") "; if(col < 10) { o << " "; } else if(col < 100) { o << " "; } else if(col < 1000) { o << " "; } else if(col < 10000) { o << " "; } else if(col < 100000) { o << " "; } else if(col < 1000000) { o << ' '; } if(cell_width > 0) { o.width(cell_width); } arma_ostream::print_elem(o, storage_val(i), true); o << '\n'; } o << " (:, :) "; if(cell_width > 0) { o.width(cell_width); } o << "...\n"; const uword i = 9; { const uword row = storage_row(i); const uword col = storage_col(i); if(row < 10) { o << " "; } else if(row < 100) { o << " "; } else if(row < 1000) { o << " "; } else if(row < 10000) { o << " "; } else if(row < 100000) { o << " "; } else if(row < 1000000) { o << ' '; } o << '(' << row << ", " << col << ") "; if(col < 10) { o << " "; } else if(col < 100) { o << " "; } else if(col < 1000) { o << " "; } else if(col < 10000) { o << " "; } else if(col < 100000) { o << " "; } else if(col < 1000000) { o << ' '; } if(cell_width > 0) { o.width(cell_width); } arma_ostream::print_elem(o, storage_val(i), true); o << '\n'; } o.flush(); stream_state.restore(o); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_rank_bones.hpp0000644000176200001440000000260414160256234023725 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_rank //! @{ class op_rank : public traits_op_default { public: template inline static bool apply(uword& out, const Base& expr, const typename T1::pod_type tol); template inline static bool apply_gen(uword& out, Mat& A, typename get_pod_type::result tol); template inline static bool apply_sym(uword& out, Mat& A, typename get_pod_type::result tol); template inline static bool apply_diag(uword& out, Mat& A, typename get_pod_type::result tol); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_trunc_log.hpp0000644000176200001440000000402614124060717023564 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_trunc_log //! @{ template arma_warn_unused inline static typename arma_real_only::result trunc_log(const eT x) { if(std::numeric_limits::is_iec559) { if(x == std::numeric_limits::infinity()) { return Datum::log_max; } else { return (x <= eT(0)) ? Datum::log_min : std::log(x); } } else { return std::log(x); } } template arma_warn_unused inline static typename arma_integral_only::result trunc_log(const eT x) { return eT( trunc_log( double(x) ) ); } template arma_warn_unused inline static std::complex trunc_log(const std::complex& x) { return std::complex( trunc_log( std::abs(x) ), std::arg(x) ); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result trunc_log(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube trunc_log(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } //! @} RcppArmadillo/inst/include/armadillo_bits/SpCol_meat.hpp0000644000176200001440000002114414124060717023133 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpCol //! @{ template inline SpCol::SpCol() : SpMat(arma_vec_indicator(), 1) { arma_extra_debug_sigprint(); } template inline SpCol::SpCol(const uword in_n_elem) : SpMat(arma_vec_indicator(), in_n_elem, 1, 1) { arma_extra_debug_sigprint(); } template inline SpCol::SpCol(const uword in_n_rows, const uword in_n_cols) : SpMat(arma_vec_indicator(), in_n_rows, in_n_cols, 1) { arma_extra_debug_sigprint(); } template inline SpCol::SpCol(const SizeMat& s) : SpMat(arma_vec_indicator(), 0, 0, 1) { arma_extra_debug_sigprint(); SpMat::init(s.n_rows, s.n_cols); } template inline SpCol::SpCol(const char* text) : SpMat(arma_vec_indicator(), 1) { arma_extra_debug_sigprint(); SpMat::init(std::string(text)); } template inline SpCol& SpCol::operator=(const char* text) { arma_extra_debug_sigprint(); SpMat::init(std::string(text)); return *this; } template inline SpCol::SpCol(const std::string& text) : SpMat(arma_vec_indicator(), 1) { arma_extra_debug_sigprint(); SpMat::init(text); } template inline SpCol& SpCol::operator=(const std::string& text) { arma_extra_debug_sigprint(); SpMat::init(text); return *this; } template inline SpCol& SpCol::operator=(const eT val) { arma_extra_debug_sigprint(); SpMat::operator=(val); return *this; } template template inline SpCol::SpCol(const Base& X) : SpMat(arma_vec_indicator(), 1) { arma_extra_debug_sigprint(); SpMat::operator=(X.get_ref()); } template template inline SpCol& SpCol::operator=(const Base& X) { arma_extra_debug_sigprint(); SpMat::operator=(X.get_ref()); return *this; } template template inline SpCol::SpCol(const SpBase& X) : SpMat(arma_vec_indicator(), 1) { arma_extra_debug_sigprint(); SpMat::operator=(X.get_ref()); } template template inline SpCol& SpCol::operator=(const SpBase& X) { arma_extra_debug_sigprint(); SpMat::operator=(X.get_ref()); return *this; } template template inline SpCol::SpCol ( const SpBase::pod_type, T1>& A, const SpBase::pod_type, T2>& B ) : SpMat(arma_vec_indicator(), 1) { arma_extra_debug_sigprint(); SpMat::init(A,B); } template inline arma_warn_unused const SpOp,spop_htrans> SpCol::t() const { return SpOp,spop_htrans>(*this); } template inline arma_warn_unused const SpOp,spop_htrans> SpCol::ht() const { return SpOp,spop_htrans>(*this); } template inline arma_warn_unused const SpOp,spop_strans> SpCol::st() const { return SpOp,spop_strans>(*this); } //! remove specified row template inline void SpCol::shed_row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( row_num >= SpMat::n_rows, "SpCol::shed_row(): out of bounds" ); shed_rows(row_num, row_num); } //! remove specified rows template inline void SpCol::shed_rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_row2 >= SpMat::n_rows), "SpCol::shed_rows(): indices out of bounds or incorrectly used" ); SpMat::sync_csc(); const uword diff = (in_row2 - in_row1 + 1); // This is easy because everything is in one column. uword start = 0, end = 0; bool start_found = false, end_found = false; for(uword i = 0; i < SpMat::n_nonzero; ++i) { // Start position found? if(SpMat::row_indices[i] >= in_row1 && !start_found) { start = i; start_found = true; } // End position found? if(SpMat::row_indices[i] > in_row2) { end = i; end_found = true; break; } } if(!end_found) { end = SpMat::n_nonzero; } // Now we can make the copy. if(start != end) { const uword elem_diff = end - start; eT* new_values = memory::acquire (SpMat::n_nonzero - elem_diff); uword* new_row_indices = memory::acquire(SpMat::n_nonzero - elem_diff); // Copy before the section we are dropping (if it exists). if(start > 0) { arrayops::copy(new_values, SpMat::values, start); arrayops::copy(new_row_indices, SpMat::row_indices, start); } // Copy after the section we are dropping (if it exists). if(end != SpMat::n_nonzero) { arrayops::copy(new_values + start, SpMat::values + end, (SpMat::n_nonzero - end)); arrayops::copy(new_row_indices + start, SpMat::row_indices + end, (SpMat::n_nonzero - end)); arrayops::inplace_minus(new_row_indices + start, diff, (SpMat::n_nonzero - end)); } memory::release(SpMat::values); memory::release(SpMat::row_indices); access::rw(SpMat::values) = new_values; access::rw(SpMat::row_indices) = new_row_indices; access::rw(SpMat::n_nonzero) -= elem_diff; access::rw(SpMat::col_ptrs[1]) -= elem_diff; } access::rw(SpMat::n_rows) -= diff; access::rw(SpMat::n_elem) -= diff; SpMat::invalidate_cache(); } // //! insert N rows at the specified row position, // //! optionally setting the elements of the inserted rows to zero // template // inline // void // SpCol::insert_rows(const uword row_num, const uword N, const bool set_to_zero) // { // arma_extra_debug_sigprint(); // // arma_debug_check(set_to_zero == false, "SpCol::insert_rows(): cannot set nonzero values"); // // arma_debug_check_bounds((row_num > SpMat::n_rows), "SpCol::insert_rows(): out of bounds"); // // for(uword row = 0; row < SpMat::n_rows; ++row) // { // if(SpMat::row_indices[row] >= row_num) // { // access::rw(SpMat::row_indices[row]) += N; // } // } // // access::rw(SpMat::n_rows) += N; // access::rw(SpMat::n_elem) += N; // } template inline typename SpCol::row_iterator SpCol::begin_row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (row_num >= SpMat::n_rows), "SpCol::begin_row(): index out of bounds" ); SpMat::sync_csc(); return row_iterator(*this, row_num, 0); } template inline typename SpCol::const_row_iterator SpCol::begin_row(const uword row_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (row_num >= SpMat::n_rows), "SpCol::begin_row(): index out of bounds" ); SpMat::sync_csc(); return const_row_iterator(*this, row_num, 0); } template inline typename SpCol::row_iterator SpCol::end_row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (row_num >= SpMat::n_rows), "SpCol::end_row(): index out of bounds" ); SpMat::sync_csc(); return row_iterator(*this, row_num + 1, 0); } template inline typename SpCol::const_row_iterator SpCol::end_row(const uword row_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (row_num >= SpMat::n_rows), "SpCol::end_row(): index out of bounds" ); SpMat::sync_csc(); return const_row_iterator(*this, row_num + 1, 0); } #ifdef ARMA_EXTRA_SPCOL_MEAT #include ARMA_INCFILE_WRAP(ARMA_EXTRA_SPCOL_MEAT) #endif //! @} RcppArmadillo/inst/include/armadillo_bits/fn_polyfit.hpp0000644000176200001440000000340214124060717023253 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_polyfit //! @{ template inline typename enable_if2 < is_supported_blas_type::value, bool >::result polyfit(Mat& out, const Base& X, const Base& Y, const uword N) { arma_extra_debug_sigprint(); const bool status = glue_polyfit::apply_direct(out, X.get_ref(), Y.get_ref(), N); if(status == false) { out.soft_reset(); arma_debug_warn_level(3, "polyfit(): failed"); } return status; } template arma_warn_unused inline typename enable_if2 < is_supported_blas_type::value, const Glue >::result polyfit(const Base& X, const Base& Y, const uword N) { arma_extra_debug_sigprint(); return Glue(X.get_ref(), Y.get_ref(), N); } //! @} RcppArmadillo/inst/include/armadillo_bits/compiler_check.hpp0000644000176200001440000000372514140222365024056 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #undef ARMA_HAVE_CXX11 #undef ARMA_HAVE_CXX14 #undef ARMA_HAVE_CXX17 #undef ARMA_HAVE_CXX20 #if (__cplusplus >= 201103L) #define ARMA_HAVE_CXX11 #endif #if (__cplusplus >= 201402L) #define ARMA_HAVE_CXX14 #endif #if (__cplusplus >= 201703L) #define ARMA_HAVE_CXX17 #endif #if (__cplusplus >= 202002L) #define ARMA_HAVE_CXX20 #endif // MS really can't get its proverbial shit together #if defined(_MSVC_LANG) #if (_MSVC_LANG >= 201402L) #undef ARMA_HAVE_CXX11 #undef ARMA_HAVE_CXX14 #define ARMA_HAVE_CXX11 #define ARMA_HAVE_CXX14 #endif #if (_MSVC_LANG >= 201703L) #undef ARMA_HAVE_CXX17 #define ARMA_HAVE_CXX17 #endif #if (_MSVC_LANG >= 202002L) #undef ARMA_HAVE_CXX20 #define ARMA_HAVE_CXX20 #endif #endif // warn about ignored option used in old versions of Armadillo #if defined(ARMA_DONT_USE_CXX11) #pragma message ("WARNING: option ARMA_DONT_USE_CXX11 ignored") #endif #if !defined(ARMA_HAVE_CXX11) #error "*** C++11 compiler required; enable C++11 mode in your compiler, or use an earlier version of Armadillo" #endif // for compatibility with earlier versions of Armadillo #undef ARMA_USE_CXX11 #define ARMA_USE_CXX11 RcppArmadillo/inst/include/armadillo_bits/spglue_plus_bones.hpp0000644000176200001440000000342314124060717024635 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_plus //! @{ class spglue_plus : public traits_glue_or { public: template arma_hot inline static void apply(SpMat& out, const SpGlue& X); template arma_hot inline static void apply_noalias(SpMat& out, const SpProxy& pa, const SpProxy& pb); template arma_hot inline static void apply_noalias(SpMat& out, const SpMat& A, const SpMat& B); }; class spglue_plus_mixed : public traits_glue_or { public: template inline static void apply(SpMat::eT>& out, const mtSpGlue::eT, T1, T2, spglue_plus_mixed>& expr); template inline static void dense_plus_sparse(Mat< typename promote_type::result>& out, const T1& X, const T2& Y); }; //! @} RcppArmadillo/inst/include/armadillo_bits/SpRow_meat.hpp0000644000176200001440000002246214124060717023171 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpRow //! @{ template inline SpRow::SpRow() : SpMat(arma_vec_indicator(), 2) { arma_extra_debug_sigprint(); } template inline SpRow::SpRow(const uword in_n_elem) : SpMat(arma_vec_indicator(), 1, in_n_elem, 2) { arma_extra_debug_sigprint(); } template inline SpRow::SpRow(const uword in_n_rows, const uword in_n_cols) : SpMat(arma_vec_indicator(), in_n_rows, in_n_cols, 2) { arma_extra_debug_sigprint(); } template inline SpRow::SpRow(const SizeMat& s) : SpMat(arma_vec_indicator(), 0, 0, 2) { arma_extra_debug_sigprint(); SpMat::init(s.n_rows, s.n_cols); } template inline SpRow::SpRow(const char* text) : SpMat(arma_vec_indicator(), 2) { arma_extra_debug_sigprint(); SpMat::init(std::string(text)); } template inline SpRow& SpRow::operator=(const char* text) { arma_extra_debug_sigprint(); SpMat::init(std::string(text)); return *this; } template inline SpRow::SpRow(const std::string& text) : SpMat(arma_vec_indicator(), 2) { arma_extra_debug_sigprint(); SpMat::init(text); } template inline SpRow& SpRow::operator=(const std::string& text) { arma_extra_debug_sigprint(); SpMat::init(text); return *this; } template inline SpRow& SpRow::operator=(const eT val) { arma_extra_debug_sigprint(); SpMat::operator=(val); return *this; } template template inline SpRow::SpRow(const Base& X) : SpMat(arma_vec_indicator(), 2) { arma_extra_debug_sigprint(); SpMat::operator=(X.get_ref()); } template template inline SpRow& SpRow::operator=(const Base& X) { arma_extra_debug_sigprint(); SpMat::operator=(X.get_ref()); return *this; } template template inline SpRow::SpRow(const SpBase& X) : SpMat(arma_vec_indicator(), 2) { arma_extra_debug_sigprint(); SpMat::operator=(X.get_ref()); } template template inline SpRow& SpRow::operator=(const SpBase& X) { arma_extra_debug_sigprint(); SpMat::operator=(X.get_ref()); return *this; } template template inline SpRow::SpRow ( const SpBase::pod_type, T1>& A, const SpBase::pod_type, T2>& B ) : SpMat(arma_vec_indicator(), 2) { arma_extra_debug_sigprint(); SpMat::init(A,B); } template inline arma_warn_unused const SpOp,spop_htrans> SpRow::t() const { return SpOp,spop_htrans>(*this); } template inline arma_warn_unused const SpOp,spop_htrans> SpRow::ht() const { return SpOp,spop_htrans>(*this); } template inline arma_warn_unused const SpOp,spop_strans> SpRow::st() const { return SpOp,spop_strans>(*this); } //! remove specified columns template inline void SpRow::shed_col(const uword col_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( col_num >= SpMat::n_cols, "SpRow::shed_col(): out of bounds" ); shed_cols(col_num, col_num); } //! remove specified columns template inline void SpRow::shed_cols(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_col1 > in_col2) || (in_col2 >= SpMat::n_cols), "SpRow::shed_cols(): indices out of bounds or incorrectly used" ); SpMat::sync_csc(); const uword diff = (in_col2 - in_col1 + 1); // This is doubleplus easy because we have all the column pointers stored. const uword start = SpMat::col_ptrs[in_col1]; const uword end = SpMat::col_ptrs[in_col2 + 1]; if(start != end) { const uword elem_diff = end - start; eT* new_values = memory::acquire (SpMat::n_nonzero - elem_diff); uword* new_row_indices = memory::acquire(SpMat::n_nonzero - elem_diff); // Copy first set of elements, if necessary. if(start > 0) { arrayops::copy(new_values, SpMat::values, start); arrayops::copy(new_row_indices, SpMat::row_indices, start); } // Copy last set of elements, if necessary. if(end != SpMat::n_nonzero) { arrayops::copy(new_values + start, SpMat::values + end, (SpMat::n_nonzero - end)); arrayops::copy(new_row_indices + start, SpMat::row_indices + end, (SpMat::n_nonzero - end)); } memory::release(SpMat::values); memory::release(SpMat::row_indices); access::rw(SpMat::values) = new_values; access::rw(SpMat::row_indices) = new_row_indices; access::rw(SpMat::n_nonzero) -= elem_diff; } // Update column pointers. uword* new_col_ptrs = memory::acquire(SpMat::n_cols - diff + 1); // Copy first part of column pointers. if(in_col1 > 0) { arrayops::copy(new_col_ptrs, SpMat::col_ptrs, in_col1); } // Copy last part of column pointers (and adjust their values as necessary). if(in_col2 < SpMat::n_cols - 1) { arrayops::copy(new_col_ptrs + in_col1, SpMat::col_ptrs + in_col2 + 1, SpMat::n_cols - in_col2); // Modify their values. arrayops::inplace_minus(new_col_ptrs + in_col1, (end - start), SpMat::n_cols - in_col2); } memory::release(SpMat::col_ptrs); access::rw(SpMat::col_ptrs) = new_col_ptrs; access::rw(SpMat::n_cols) -= diff; access::rw(SpMat::n_elem) -= diff; SpMat::invalidate_cache(); } // //! insert N cols at the specified col position, // //! optionally setting the elements of the inserted cols to zero // template // inline // void // SpRow::insert_cols(const uword col_num, const uword N, const bool set_to_zero) // { // arma_extra_debug_sigprint(); // // // insertion at col_num == n_cols is in effect an append operation // arma_debug_check_bounds( (col_num > SpMat::n_cols), "SpRow::insert_cols(): out of bounds" ); // // arma_debug_check( (set_to_zero == false), "SpRow::insert_cols(): cannot set elements to nonzero values" ); // // uword newVal = (col_num == 0) ? 0 : SpMat::col_ptrs[col_num]; // SpMat::col_ptrs.insert(col_num, N, newVal); // uword* new_col_ptrs = memory::acquire(SpMat::n_cols + N); // // arrayops::copy(new_col_ptrs, SpMat::col_ptrs, col_num); // // uword fill_value = (col_num == 0) ? 0 : SpMat::col_ptrs[col_num - 1]; // arrayops::inplace_set(new_col_ptrs + col_num, fill_value, N); // // arrayops::copy(new_col_ptrs + col_num + N, SpMat::col_ptrs + col_num, SpMat::n_cols - col_num); // // access::rw(SpMat::n_cols) += N; // access::rw(SpMat::n_elem) += N; // } template inline typename SpRow::row_iterator SpRow::begin_row(const uword row_num) { arma_extra_debug_sigprint(); // Since this is a row, row_num can only be 0. But the option is provided for // compatibility. arma_debug_check_bounds((row_num >= 1), "SpRow::begin_row(): index out of bounds"); return SpMat::begin(); } template inline typename SpRow::const_row_iterator SpRow::begin_row(const uword row_num) const { arma_extra_debug_sigprint(); // Since this is a row, row_num can only be 0. But the option is provided for // compatibility. arma_debug_check_bounds((row_num >= 1), "SpRow::begin_row(): index out of bounds"); return SpMat::begin(); } template inline typename SpRow::row_iterator SpRow::end_row(const uword row_num) { arma_extra_debug_sigprint(); // Since this is a row, row_num can only be 0. But the option is provided for // compatibility. arma_debug_check_bounds((row_num >= 1), "SpRow::end_row(): index out of bounds"); return SpMat::end(); } template inline typename SpRow::const_row_iterator SpRow::end_row(const uword row_num) const { arma_extra_debug_sigprint(); // Since this is a row, row_num can only be 0. But the option is provided for // compatibility. arma_debug_check_bounds((row_num >= 1), "SpRow::end_row(): index out of bounds"); return SpMat::end(); } #ifdef ARMA_EXTRA_SPROW_MEAT #include ARMA_INCFILE_WRAP(ARMA_EXTRA_SPROW_MEAT) #endif //! @} RcppArmadillo/inst/include/armadillo_bits/csv_name.hpp0000644000176200001440000000777514124060717022716 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup diskio //! @{ namespace csv_opts { typedef unsigned int flag_type; struct opts { const flag_type flags; inline explicit opts(const flag_type in_flags); inline const opts operator+(const opts& rhs) const; }; inline opts::opts(const flag_type in_flags) : flags(in_flags) {} inline const opts opts::operator+(const opts& rhs) const { const opts result( flags | rhs.flags ); return result; } // The values below (eg. 1u << 0) are for internal Armadillo use only. // The values can change without notice. static const flag_type flag_none = flag_type(0 ); static const flag_type flag_trans = flag_type(1u << 0); static const flag_type flag_no_header = flag_type(1u << 1); static const flag_type flag_with_header = flag_type(1u << 2); static const flag_type flag_semicolon = flag_type(1u << 3); struct opts_none : public opts { inline opts_none() : opts(flag_none ) {} }; struct opts_trans : public opts { inline opts_trans() : opts(flag_trans ) {} }; struct opts_no_header : public opts { inline opts_no_header() : opts(flag_no_header ) {} }; struct opts_with_header : public opts { inline opts_with_header() : opts(flag_with_header) {} }; struct opts_semicolon : public opts { inline opts_semicolon() : opts(flag_semicolon ) {} }; static const opts_none none; static const opts_trans trans; static const opts_no_header no_header; static const opts_with_header with_header; static const opts_semicolon semicolon; } struct csv_name { typedef field header_type; const std::string filename; const csv_opts::opts opts; header_type header_junk; const header_type& header_ro; header_type& header_rw; inline csv_name(const std::string& in_filename, const csv_opts::opts& in_opts = csv_opts::no_header) : filename (in_filename) , opts (in_opts ) , header_ro(header_junk) , header_rw(header_junk) {} inline csv_name(const std::string& in_filename, field& in_header) : filename (in_filename ) , opts (csv_opts::with_header) , header_ro(in_header ) , header_rw(in_header ) {} inline csv_name(const std::string& in_filename, const field& in_header) : filename (in_filename ) , opts (csv_opts::with_header) , header_ro(in_header ) , header_rw(header_junk ) {} inline csv_name(const std::string& in_filename, field& in_header, const csv_opts::opts& in_opts) : filename (in_filename ) , opts (csv_opts::with_header + in_opts) , header_ro(in_header ) , header_rw(in_header ) {} inline csv_name(const std::string& in_filename, const field& in_header, const csv_opts::opts& in_opts) : filename (in_filename ) , opts (csv_opts::with_header + in_opts) , header_ro(in_header ) , header_rw(header_junk ) {} }; //! @} RcppArmadillo/inst/include/armadillo_bits/spop_strans_meat.hpp0000644000176200001440000000612114124060717024464 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_strans //! @{ template inline void spop_strans::apply_noalias(SpMat& B, const SpMat& A) { arma_extra_debug_sigprint(); B.reserve(A.n_cols, A.n_rows, A.n_nonzero); // deliberately swapped if(A.n_nonzero == 0) { return; } // This follows the TRANSP algorithm described in // 'Sparse Matrix Multiplication Package (SMMP)' // (R.E. Bank and C.C. Douglas, 2001) const uword m = A.n_rows; const uword n = A.n_cols; const eT* a = A.values; eT* b = access::rwp(B.values); const uword* ia = A.col_ptrs; const uword* ja = A.row_indices; uword* ib = access::rwp(B.col_ptrs); uword* jb = access::rwp(B.row_indices); // // ib is already zeroed, as B is freshly constructed // // for(uword i=0; i < (m+1); ++i) // { // ib[i] = 0; // } for(uword i=0; i < n; ++i) { for(uword j = ia[i]; j < ia[i+1]; ++j) { ib[ ja[j] + 1 ]++; } } for(uword i=0; i < m; ++i) { ib[i+1] += ib[i]; } for(uword i=0; i < n; ++i) { for(uword j = ia[i]; j < ia[i+1]; ++j) { const uword jj = ja[j]; const uword ib_jj = ib[jj]; jb[ib_jj] = i; b[ib_jj] = a[j]; ib[jj]++; } } for(uword i = m-1; i >= 1; --i) { ib[i] = ib[i-1]; } ib[0] = 0; } template inline void spop_strans::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat U(in.m); if(U.is_alias(out)) { SpMat tmp; spop_strans::apply_noalias(tmp, U.M); out.steal_mem(tmp); } else { spop_strans::apply_noalias(out, U.M); } } //! for transpose of non-complex matrices, redirected from spop_htrans::apply() template inline void spop_strans::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat U(in.m); if(U.is_alias(out)) { SpMat tmp; spop_strans::apply_noalias(tmp, U.M); out.steal_mem(tmp); } else { spop_strans::apply_noalias(out, U.M); } } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_min_meat.hpp0000644000176200001440000004020514124060717023736 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_min //! @{ template inline void spop_min::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "min(): parameter 'dim' must be 0 or 1" ); const SpProxy p(in.m); const uword p_n_rows = p.get_n_rows(); const uword p_n_cols = p.get_n_cols(); if( (p_n_rows == 0) || (p_n_cols == 0) || (p.get_n_nonzero() == 0) ) { if(dim == 0) { out.zeros((p_n_rows > 0) ? 1 : 0, p_n_cols); } if(dim == 1) { out.zeros(p_n_rows, (p_n_cols > 0) ? 1 : 0); } return; } spop_min::apply_proxy(out, p, dim); } template inline void spop_min::apply_proxy ( SpMat& out, const SpProxy& p, const uword dim, const typename arma_not_cx::result* junk ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typename SpProxy::const_iterator_type it = p.begin(); typename SpProxy::const_iterator_type it_end = p.end(); const uword p_n_cols = p.get_n_cols(); const uword p_n_rows = p.get_n_rows(); if(dim == 0) // find the minimum in each column { Row value(p_n_cols, arma_zeros_indicator()); urowvec count(p_n_cols, arma_zeros_indicator()); while(it != it_end) { const uword col = it.col(); value[col] = (count[col] == 0) ? (*it) : (std::min)(value[col], (*it)); count[col]++; ++it; } for(uword col=0; col value(p_n_rows, arma_zeros_indicator()); ucolvec count(p_n_rows, arma_zeros_indicator()); while(it != it_end) { const uword row = it.row(); value[row] = (count[row] == 0) ? (*it) : (std::min)(value[row], (*it)); count[row]++; ++it; } for(uword row=0; row inline typename T1::elem_type spop_min::vector_min ( const T1& x, const typename arma_not_cx::result* junk ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; const SpProxy p(x); if(p.get_n_elem() == 0) { arma_debug_check(true, "min(): object has no elements"); return Datum::nan; } if(p.get_n_nonzero() == 0) { return eT(0); } if(SpProxy::use_iterator == false) { // direct access of values if(p.get_n_nonzero() == p.get_n_elem()) { return op_min::direct_min(p.get_values(), p.get_n_nonzero()); } else { return (std::min)(eT(0), op_min::direct_min(p.get_values(), p.get_n_nonzero())); } } else { // use iterator typename SpProxy::const_iterator_type it = p.begin(); typename SpProxy::const_iterator_type it_end = p.end(); eT result = (*it); ++it; while(it != it_end) { if((*it) < result) { result = (*it); } ++it; } if(p.get_n_nonzero() == p.get_n_elem()) { return result; } else { return (std::min)(eT(0), result); } } } template inline typename arma_not_cx::result spop_min::min(const SpBase& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const SpProxy P(X.get_ref()); const uword n_elem = P.get_n_elem(); const uword n_nonzero = P.get_n_nonzero(); if(n_elem == 0) { arma_debug_check(true, "min(): object has no elements"); return Datum::nan; } eT min_val = priv::most_pos(); if(SpProxy::use_iterator) { // We have to iterate over the elements. typedef typename SpProxy::const_iterator_type it_type; it_type it = P.begin(); it_type it_end = P.end(); while(it != it_end) { if((*it) < min_val) { min_val = *it; } ++it; } } else { // We can do direct access of the values, row_indices, and col_ptrs. // We don't need the location of the min value, so we can just call out to // other functions... min_val = op_min::direct_min(P.get_values(), n_nonzero); } if(n_elem == n_nonzero) { return min_val; } else { return (std::min)(eT(0), min_val); } } template inline typename arma_not_cx::result spop_min::min_with_index(const SpProxy& P, uword& index_of_min_val) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_elem = P.get_n_elem(); const uword n_nonzero = P.get_n_nonzero(); const uword n_rows = P.get_n_rows(); if(n_elem == 0) { arma_debug_check(true, "min(): object has no elements"); index_of_min_val = uword(0); return Datum::nan; } eT min_val = priv::most_pos(); if(SpProxy::use_iterator) { // We have to iterate over the elements. typedef typename SpProxy::const_iterator_type it_type; it_type it = P.begin(); it_type it_end = P.end(); while(it != it_end) { if((*it) < min_val) { min_val = *it; index_of_min_val = it.row() + it.col() * n_rows; } ++it; } } else { // We can do direct access. min_val = op_min::direct_min(P.get_values(), n_nonzero, index_of_min_val); // Convert to actual position in matrix. const uword row = P.get_row_indices()[index_of_min_val]; uword col = 0; while(P.get_col_ptrs()[++col] < index_of_min_val + 1) { } index_of_min_val = (col - 1) * n_rows + row; } if(n_elem != n_nonzero) { min_val = (std::min)(eT(0), min_val); // If the min_val is a nonzero element, we need its actual position in the matrix. if(min_val == eT(0)) { // Find first zero element. uword last_row = 0; uword last_col = 0; typedef typename SpProxy::const_iterator_type it_type; it_type it = P.begin(); it_type it_end = P.end(); while(it != it_end) { // Have we moved more than one position from the last place? if((it.col() == last_col) && (it.row() - last_row > 1)) { index_of_min_val = it.col() * n_rows + last_row + 1; break; } else if((it.col() >= last_col + 1) && (last_row < n_rows - 1)) { index_of_min_val = last_col * n_rows + last_row + 1; break; } else if((it.col() == last_col + 1) && (it.row() > 0)) { index_of_min_val = it.col() * n_rows; break; } else if(it.col() > last_col + 1) { index_of_min_val = (last_col + 1) * n_rows; break; } last_row = it.row(); last_col = it.col(); ++it; } } } return min_val; } template inline void spop_min::apply_proxy ( SpMat& out, const SpProxy& p, const uword dim, const typename arma_cx_only::result* junk ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; typename SpProxy::const_iterator_type it = p.begin(); typename SpProxy::const_iterator_type it_end = p.end(); const uword p_n_cols = p.get_n_cols(); const uword p_n_rows = p.get_n_rows(); if(dim == 0) // find the minimum in each column { Row rawval(p_n_cols, arma_zeros_indicator()); Row< T> absval(p_n_cols, arma_zeros_indicator()); urowvec count(p_n_cols, arma_zeros_indicator()); while(it != it_end) { const uword col = it.col(); const eT& v = (*it); const T a = std::abs(v); if(count[col] == 0) { absval[col] = a; rawval[col] = v; } else { if(a < absval[col]) { absval[col] = a; rawval[col] = v; } } count[col]++; ++it; } for(uword col=0; col < p_n_cols; ++col) { if(count[col] < p_n_rows) { if(T(0) < absval[col]) { rawval[col] = eT(0); } } } out = rawval; } else if(dim == 1) // find the minimum in each row { Col rawval(p_n_rows, arma_zeros_indicator()); Col< T> absval(p_n_rows, arma_zeros_indicator()); ucolvec count(p_n_rows, arma_zeros_indicator()); while(it != it_end) { const uword row = it.row(); const eT& v = (*it); const T a = std::abs(v); if(count[row] == 0) { absval[row] = a; rawval[row] = v; } else { if(a < absval[row]) { absval[row] = a; rawval[row] = v; } } count[row]++; ++it; } for(uword row=0; row < p_n_rows; ++row) { if(count[row] < p_n_cols) { if(T(0) < absval[row]) { rawval[row] = eT(0); } } } out = rawval; } } template inline typename T1::elem_type spop_min::vector_min ( const T1& x, const typename arma_cx_only::result* junk ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; const SpProxy p(x); if(p.get_n_elem() == 0) { arma_debug_check(true, "min(): object has no elements"); return Datum::nan; } if(p.get_n_nonzero() == 0) { return eT(0); } if(SpProxy::use_iterator == false) { // direct access of values if(p.get_n_nonzero() == p.get_n_elem()) { return op_min::direct_min(p.get_values(), p.get_n_nonzero()); } else { const eT val1 = eT(0); const eT val2 = op_min::direct_min(p.get_values(), p.get_n_nonzero()); return ( std::abs(val1) < std::abs(val2) ) ? val1 : val2; } } else { // use iterator typename SpProxy::const_iterator_type it = p.begin(); typename SpProxy::const_iterator_type it_end = p.end(); eT best_val_orig = *it; T best_val_abs = std::abs(best_val_orig); ++it; while(it != it_end) { eT val_orig = *it; T val_abs = std::abs(val_orig); if(val_abs < best_val_abs) { best_val_abs = val_abs; best_val_orig = val_orig; } ++it; } if(p.get_n_nonzero() == p.get_n_elem()) { return best_val_orig; } else { const eT val1 = eT(0); return ( std::abs(val1) < best_val_abs ) ? val1 : best_val_orig; } } } template inline typename arma_cx_only::result spop_min::min(const SpBase& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; const SpProxy P(X.get_ref()); const uword n_elem = P.get_n_elem(); const uword n_nonzero = P.get_n_nonzero(); if(n_elem == 0) { arma_debug_check(true, "min(): object has no elements"); return Datum::nan; } T min_val = priv::most_pos(); eT ret_val; if(SpProxy::use_iterator) { // We have to iterate over the elements. typedef typename SpProxy::const_iterator_type it_type; it_type it = P.begin(); it_type it_end = P.end(); while(it != it_end) { const T tmp_val = std::abs(*it); if(tmp_val < min_val) { min_val = tmp_val; ret_val = *it; } ++it; } } else { // We can do direct access of the values, row_indices, and col_ptrs. // We don't need the location of the min value, so we can just call out to // other functions... ret_val = op_min::direct_min(P.get_values(), n_nonzero); min_val = std::abs(ret_val); } if(n_elem == n_nonzero) { return ret_val; } else { return (T(0) < min_val) ? eT(0) : ret_val; } } template inline typename arma_cx_only::result spop_min::min_with_index(const SpProxy& P, uword& index_of_min_val) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; const uword n_elem = P.get_n_elem(); const uword n_nonzero = P.get_n_nonzero(); const uword n_rows = P.get_n_rows(); if(n_elem == 0) { arma_debug_check(true, "min(): object has no elements"); index_of_min_val = uword(0); return Datum::nan; } T min_val = priv::most_pos(); if(SpProxy::use_iterator) { // We have to iterate over the elements. typedef typename SpProxy::const_iterator_type it_type; it_type it = P.begin(); it_type it_end = P.end(); while(it != it_end) { const T tmp_val = std::abs(*it); if(tmp_val < min_val) { min_val = tmp_val; index_of_min_val = it.row() + it.col() * n_rows; } ++it; } } else { // We can do direct access. min_val = std::abs(op_min::direct_min(P.get_values(), n_nonzero, index_of_min_val)); // Convert to actual position in matrix. const uword row = P.get_row_indices()[index_of_min_val]; uword col = 0; while(P.get_col_ptrs()[++col] < index_of_min_val + 1) { } index_of_min_val = (col - 1) * n_rows + row; } if(n_elem != n_nonzero) { min_val = (std::min)(T(0), min_val); // If the min_val is a nonzero element, we need its actual position in the matrix. if(min_val == T(0)) { // Find first zero element. uword last_row = 0; uword last_col = 0; typedef typename SpProxy::const_iterator_type it_type; it_type it = P.begin(); it_type it_end = P.end(); while(it != it_end) { // Have we moved more than one position from the last place? if((it.col() == last_col) && (it.row() - last_row > 1)) { index_of_min_val = it.col() * n_rows + last_row + 1; break; } else if((it.col() >= last_col + 1) && (last_row < n_rows - 1)) { index_of_min_val = last_col * n_rows + last_row + 1; break; } else if((it.col() == last_col + 1) && (it.row() > 0)) { index_of_min_val = it.col() * n_rows; break; } else if(it.col() > last_col + 1) { index_of_min_val = (last_col + 1) * n_rows; break; } last_row = it.row(); last_col = it.col(); ++it; } } } return P[index_of_min_val]; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_chol_meat.hpp0000644000176200001440000000501214124060717023532 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_chol //! @{ template inline void op_chol::apply(Mat& out, const Op& X) { arma_extra_debug_sigprint(); const bool status = op_chol::apply_direct(out, X.m, X.aux_uword_a); if(status == false) { out.soft_reset(); arma_stop_runtime_error("chol(): decomposition failed"); } } template inline bool op_chol::apply_direct(Mat& out, const Base& A_expr, const uword layout) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; out = A_expr.get_ref(); arma_debug_check( (out.is_square() == false), "chol(): given matrix must be square sized" ); if(out.is_empty()) { return true; } // if(auxlib::rudimentary_sym_check(out) == false) // { // if(is_cx::no ) { arma_debug_warn_level(1, "chol(): given matrix is not symmetric"); } // if(is_cx::yes) { arma_debug_warn_level(1, "chol(): given matrix is not hermitian"); } // return false; // } if((arma_config::debug) && (auxlib::rudimentary_sym_check(out) == false)) { if(is_cx::no ) { arma_debug_warn_level(1, "chol(): given matrix is not symmetric"); } if(is_cx::yes) { arma_debug_warn_level(1, "chol(): given matrix is not hermitian"); } } uword KD = 0; #if defined(ARMA_OPTIMISE_BAND) const bool is_band = (auxlib::crippled_lapack(out)) ? false : ((layout == 0) ? band_helper::is_band_upper(KD, out, uword(32)) : band_helper::is_band_lower(KD, out, uword(32))); #else const bool is_band = false; #endif const bool status = (is_band) ? auxlib::chol_band(out, KD, layout) : auxlib::chol(out, layout); return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_times_bones.hpp0000644000176200001440000001236714124060717024437 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_times //! @{ //! \brief //! Template metaprogram depth_lhs //! calculates the number of Glue instances on the left hand side argument of Glue //! ie. it recursively expands each Tx, until the type of Tx is not "Glue<..,.., glue_type>" (i.e the "glue_type" changes) template struct depth_lhs { static constexpr uword num = 0; }; template struct depth_lhs< glue_type, Glue > { static constexpr uword num = 1 + depth_lhs::num; }; template struct glue_times_redirect2_helper { template arma_hot inline static void apply(Mat& out, const Glue& X); }; template<> struct glue_times_redirect2_helper { template arma_hot inline static void apply(Mat& out, const Glue& X); }; template struct glue_times_redirect3_helper { template arma_hot inline static void apply(Mat& out, const Glue< Glue,T3,glue_times>& X); }; template<> struct glue_times_redirect3_helper { template arma_hot inline static void apply(Mat& out, const Glue< Glue,T3,glue_times>& X); }; template struct glue_times_redirect { template arma_hot inline static void apply(Mat& out, const Glue& X); }; template<> struct glue_times_redirect<2> { template arma_hot inline static void apply(Mat& out, const Glue& X); }; template<> struct glue_times_redirect<3> { template arma_hot inline static void apply(Mat& out, const Glue< Glue,T3,glue_times>& X); }; template<> struct glue_times_redirect<4> { template arma_hot inline static void apply(Mat& out, const Glue< Glue< Glue, T3, glue_times>, T4, glue_times>& X); }; //! Class which implements the immediate multiplication of two or more matrices class glue_times { public: template struct traits { static constexpr bool is_row = T1::is_row; static constexpr bool is_col = T2::is_col; static constexpr bool is_xvec = false; }; template arma_hot inline static void apply(Mat& out, const Glue& X); template arma_hot inline static void apply_inplace(Mat& out, const T1& X); template arma_hot inline static void apply_inplace_plus(Mat& out, const Glue& X, const sword sign); // template arma_inline static uword mul_storage_cost(const TA& A, const TB& B); template arma_hot inline static void apply(Mat& out, const TA& A, const TB& B, const eT val); template arma_hot inline static void apply(Mat& out, const TA& A, const TB& B, const TC& C, const eT val); template arma_hot inline static void apply(Mat& out, const TA& A, const TB& B, const TC& C, const TD& D, const eT val); }; class glue_times_diag { public: template struct traits { static constexpr bool is_row = T1::is_row; static constexpr bool is_col = T2::is_col; static constexpr bool is_xvec = false; }; template arma_hot inline static void apply(Mat& out, const Glue& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/glue_conv_bones.hpp0000644000176200001440000000317514124060717024260 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_conv //! @{ class glue_conv { public: template struct traits { static constexpr bool is_row = T1::is_row; static constexpr bool is_col = T1::is_col; static constexpr bool is_xvec = T1::is_xvec; }; template inline static void apply(Mat& out, const Mat& A, const Mat& B, const bool A_is_col); template inline static void apply(Mat& out, const Glue& X); }; class glue_conv2 : public traits_glue_default { public: template inline static void apply(Mat& out, const Mat& A, const Mat& B); template inline static void apply(Mat& out, const Glue& expr); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_elem.hpp0000644000176200001440000005272414124060717022522 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_elem //! @{ // // real template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const T1& >::result real(const T1& X) { arma_extra_debug_sigprint(); return X; } template arma_warn_unused arma_inline const T1& real(const BaseCube& X) { arma_extra_debug_sigprint(); return X.get_ref(); } template arma_warn_unused arma_inline const T1& real(const SpBase& A) { arma_extra_debug_sigprint(); return A.get_ref(); } template arma_warn_unused inline typename enable_if2< (is_arma_type::value && is_cx::yes), const mtOp >::result real(const T1& X) { arma_extra_debug_sigprint(); return mtOp( X ); } template arma_warn_unused inline const mtOpCube real(const BaseCube, T1>& X) { arma_extra_debug_sigprint(); return mtOpCube( X.get_ref() ); } template arma_warn_unused arma_inline const mtSpOp real(const SpBase,T1>& A) { arma_extra_debug_sigprint(); return mtSpOp(A.get_ref()); } // // imag template arma_warn_unused inline const Gen< Mat, gen_zeros > imag(const Base& X) { arma_extra_debug_sigprint(); const Proxy A(X.get_ref()); return Gen< Mat, gen_zeros>(A.get_n_rows(), A.get_n_cols()); } template arma_warn_unused inline const GenCube imag(const BaseCube& X) { arma_extra_debug_sigprint(); const ProxyCube A(X.get_ref()); return GenCube(A.get_n_rows(), A.get_n_cols(), A.get_n_slices()); } template arma_warn_unused inline SpMat imag(const SpBase& A) { arma_extra_debug_sigprint(); const SpProxy P(A.get_ref()); return SpMat(P.get_n_rows(), P.get_n_cols()); } template arma_warn_unused inline typename enable_if2< (is_arma_type::value && is_cx::yes), const mtOp >::result imag(const T1& X) { arma_extra_debug_sigprint(); return mtOp( X ); } template arma_warn_unused inline const mtOpCube imag(const BaseCube,T1>& X) { arma_extra_debug_sigprint(); return mtOpCube( X.get_ref() ); } template arma_warn_unused arma_inline const mtSpOp imag(const SpBase,T1>& A) { arma_extra_debug_sigprint(); return mtSpOp(A.get_ref()); } // // log template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result log(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube log(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // log2 template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result log2(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube log2(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // log10 template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result log10(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube log10(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // log1p template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const eOp >::result log1p(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline typename enable_if2< is_cx::no, const eOpCube >::result log1p(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // exp template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result exp(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube exp(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // exp2 template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result exp2(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube exp2(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // exp10 template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result exp10(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube exp10(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // expm1 template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const eOp >::result expm1(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline typename enable_if2< is_cx::no, const eOpCube >::result expm1(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // abs template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const eOp >::result abs(const T1& X) { arma_extra_debug_sigprint(); return eOp(X); } template arma_warn_unused arma_inline const eOpCube abs(const BaseCube& X, const typename arma_not_cx::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return eOpCube(X.get_ref()); } template arma_warn_unused inline typename enable_if2< (is_arma_type::value && is_cx::yes), const mtOp >::result abs(const T1& X) { arma_extra_debug_sigprint(); return mtOp(X); } template arma_warn_unused inline const mtOpCube abs(const BaseCube< std::complex,T1>& X, const typename arma_cx_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return mtOpCube( X.get_ref() ); } template arma_warn_unused arma_inline const SpOp abs(const SpBase& X, const typename arma_not_cx::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return SpOp(X.get_ref()); } template arma_warn_unused arma_inline const mtSpOp abs(const SpBase< std::complex, T1>& X, const typename arma_cx_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return mtSpOp(X.get_ref()); } // // arg template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const eOp >::result arg(const T1& X) { arma_extra_debug_sigprint(); return eOp(X); } template arma_warn_unused arma_inline const eOpCube arg(const BaseCube& X, const typename arma_not_cx::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return eOpCube(X.get_ref()); } template arma_warn_unused inline typename enable_if2< (is_arma_type::value && is_cx::yes), const mtOp >::result arg(const T1& X) { arma_extra_debug_sigprint(); return mtOp(X); } template arma_warn_unused inline const mtOpCube arg(const BaseCube< std::complex,T1>& X, const typename arma_cx_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return mtOpCube( X.get_ref() ); } template arma_warn_unused arma_inline const SpOp arg(const SpBase& X, const typename arma_not_cx::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return SpOp(X.get_ref()); } template arma_warn_unused arma_inline const mtSpOp arg(const SpBase< std::complex, T1>& X, const typename arma_cx_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return mtSpOp(X.get_ref()); } // // square template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result square(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube square(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline const SpOp square(const SpBase& A) { arma_extra_debug_sigprint(); return SpOp(A.get_ref()); } // // sqrt template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result sqrt(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube sqrt(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline const SpOp sqrt(const SpBase& A) { arma_extra_debug_sigprint(); return SpOp(A.get_ref()); } // // conj template arma_warn_unused arma_inline const T1& conj(const Base& A) { arma_extra_debug_sigprint(); return A.get_ref(); } template arma_warn_unused arma_inline const T1& conj(const BaseCube& A) { arma_extra_debug_sigprint(); return A.get_ref(); } template arma_warn_unused arma_inline const T1& conj(const SpBase& A) { arma_extra_debug_sigprint(); return A.get_ref(); } template arma_warn_unused arma_inline const eOp conj(const Base,T1>& A) { arma_extra_debug_sigprint(); return eOp(A.get_ref()); } template arma_warn_unused arma_inline const eOpCube conj(const BaseCube,T1>& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline const SpOp conj(const SpBase,T1>& A) { arma_extra_debug_sigprint(); return SpOp(A.get_ref()); } // pow template arma_warn_unused arma_inline const eOp pow(const Base& A, const typename T1::elem_type exponent) { arma_extra_debug_sigprint(); return eOp(A.get_ref(), exponent); } template arma_warn_unused arma_inline const eOpCube pow(const BaseCube& A, const typename T1::elem_type exponent) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref(), exponent); } // pow, specialised handling (non-complex exponent for complex matrices) template arma_warn_unused arma_inline const eOp pow(const Base& A, const typename T1::elem_type::value_type exponent) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; return eOp(A.get_ref(), eT(exponent)); } template arma_warn_unused arma_inline const eOpCube pow(const BaseCube& A, const typename T1::elem_type::value_type exponent) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; return eOpCube(A.get_ref(), eT(exponent)); } // // floor template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result floor(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube floor(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline const SpOp floor(const SpBase& X) { arma_extra_debug_sigprint(); return SpOp(X.get_ref()); } // // ceil template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result ceil(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube ceil(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline const SpOp ceil(const SpBase& X) { arma_extra_debug_sigprint(); return SpOp(X.get_ref()); } // // round template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result round(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube round(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline const SpOp round(const SpBase& X) { arma_extra_debug_sigprint(); return SpOp(X.get_ref()); } // // trunc template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result trunc(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube trunc(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline const SpOp trunc(const SpBase& X) { arma_extra_debug_sigprint(); return SpOp(X.get_ref()); } // // sign template arma_warn_unused arma_inline typename arma_scalar_only::result sign(const eT x) { arma_extra_debug_sigprint(); return arma_sign(x); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result sign(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube sign(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } template arma_warn_unused arma_inline const SpOp sign(const SpBase& X) { arma_extra_debug_sigprint(); return SpOp(X.get_ref()); } // // erf template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const eOp >::result erf(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline typename enable_if2< is_cx::no, const eOpCube >::result erf(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // erfc template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const eOp >::result erfc(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline typename enable_if2< is_cx::no, const eOpCube >::result erfc(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // lgamma template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const eOp >::result lgamma(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline typename enable_if2< is_cx::no, const eOpCube >::result lgamma(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // tgamma template arma_warn_unused arma_inline typename enable_if2< (is_arma_type::value && is_cx::no), const eOp >::result tgamma(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline typename enable_if2< is_cx::no, const eOpCube >::result tgamma(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // the functions below are currently unused; reserved for potential future use template void exp_approx(const T1&) { arma_stop_logic_error("unimplemented"); } template void log_approx(const T1&) { arma_stop_logic_error("unimplemented"); } template void approx_exp(const T1&) { arma_stop_logic_error("unimplemented"); } template void approx_log(const T1&) { arma_stop_logic_error("unimplemented"); } //! @} RcppArmadillo/inst/include/armadillo_bits/subview_cube_slices_meat.hpp0000644000176200001440000002714614124060717026147 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup subview_cube_slices //! @{ template inline subview_cube_slices::~subview_cube_slices() { arma_extra_debug_sigprint(); } template arma_inline subview_cube_slices::subview_cube_slices ( const Cube& in_m, const Base& in_si ) : m (in_m ) , base_si(in_si) { arma_extra_debug_sigprint(); } template inline void subview_cube_slices::inplace_rand(const uword rand_mode) { arma_extra_debug_sigprint(); Cube& m_local = const_cast< Cube& >(m); const uword m_n_slices = m_local.n_slices; const uword m_n_elem_slice = m_local.n_elem_slice; const quasi_unwrap U(base_si.get_ref()); const umat& si = U.M; arma_debug_check ( ( (si.is_vec() == false) && (si.is_empty() == false) ), "Cube::slices(): given object must be a vector" ); const uword* si_mem = si.memptr(); const uword si_n_elem = si.n_elem; for(uword si_count=0; si_count < si_n_elem; ++si_count) { const uword i = si_mem[si_count]; arma_debug_check_bounds( (i >= m_n_slices), "Cube::slices(): index out of bounds" ); eT* m_slice_ptr = m_local.slice_memptr(i); if(rand_mode == 0) { arma_rng::randu::fill(m_slice_ptr, m_n_elem_slice); } if(rand_mode == 1) { arma_rng::randn::fill(m_slice_ptr, m_n_elem_slice); } } } template template inline void subview_cube_slices::inplace_op(const eT val) { arma_extra_debug_sigprint(); Cube& m_local = const_cast< Cube& >(m); const uword m_n_slices = m_local.n_slices; const uword m_n_elem_slice = m_local.n_elem_slice; const quasi_unwrap U(base_si.get_ref()); const umat& si = U.M; arma_debug_check ( ( (si.is_vec() == false) && (si.is_empty() == false) ), "Cube::slices(): given object must be a vector" ); const uword* si_mem = si.memptr(); const uword si_n_elem = si.n_elem; for(uword si_count=0; si_count < si_n_elem; ++si_count) { const uword i = si_mem[si_count]; arma_debug_check_bounds( (i >= m_n_slices), "Cube::slices(): index out of bounds" ); eT* m_slice_ptr = m_local.slice_memptr(i); if(is_same_type::yes) { arrayops::inplace_set (m_slice_ptr, val, m_n_elem_slice); } if(is_same_type::yes) { arrayops::inplace_plus (m_slice_ptr, val, m_n_elem_slice); } if(is_same_type::yes) { arrayops::inplace_minus(m_slice_ptr, val, m_n_elem_slice); } if(is_same_type::yes) { arrayops::inplace_mul (m_slice_ptr, val, m_n_elem_slice); } if(is_same_type::yes) { arrayops::inplace_div (m_slice_ptr, val, m_n_elem_slice); } } } template template inline void subview_cube_slices::inplace_op(const BaseCube& x) { arma_extra_debug_sigprint(); Cube& m_local = const_cast< Cube& >(m); const uword m_n_slices = m_local.n_slices; const uword m_n_elem_slice = m_local.n_elem_slice; const quasi_unwrap U(base_si.get_ref()); const umat& si = U.M; arma_debug_check ( ( (si.is_vec() == false) && (si.is_empty() == false) ), "Cube::slices(): given object must be a vector" ); const uword* si_mem = si.memptr(); const uword si_n_elem = si.n_elem; const unwrap_cube_check tmp(x.get_ref(), m_local); const Cube& X = tmp.M; arma_debug_assert_same_size( m_local.n_rows, m_local.n_cols, si_n_elem, X.n_rows, X.n_cols, X.n_slices, "Cube::slices()" ); for(uword si_count=0; si_count < si_n_elem; ++si_count) { const uword i = si_mem[si_count]; arma_debug_check_bounds( (i >= m_n_slices), "Cube::slices(): index out of bounds" ); eT* m_slice_ptr = m_local.slice_memptr(i); const eT* X_slice_ptr = X.slice_memptr(si_count); if(is_same_type::yes) { arrayops::copy (m_slice_ptr, X_slice_ptr, m_n_elem_slice); } if(is_same_type::yes) { arrayops::inplace_plus (m_slice_ptr, X_slice_ptr, m_n_elem_slice); } if(is_same_type::yes) { arrayops::inplace_minus(m_slice_ptr, X_slice_ptr, m_n_elem_slice); } if(is_same_type::yes) { arrayops::inplace_mul (m_slice_ptr, X_slice_ptr, m_n_elem_slice); } if(is_same_type::yes) { arrayops::inplace_div (m_slice_ptr, X_slice_ptr, m_n_elem_slice); } } } // // template inline void subview_cube_slices::fill(const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview_cube_slices::zeros() { arma_extra_debug_sigprint(); inplace_op(eT(0)); } template inline void subview_cube_slices::ones() { arma_extra_debug_sigprint(); inplace_op(eT(1)); } template inline void subview_cube_slices::randu() { arma_extra_debug_sigprint(); inplace_rand(0); } template inline void subview_cube_slices::randn() { arma_extra_debug_sigprint(); inplace_rand(1); } template inline void subview_cube_slices::operator+= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview_cube_slices::operator-= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview_cube_slices::operator*= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview_cube_slices::operator/= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } // // template template inline void subview_cube_slices::operator_equ(const subview_cube_slices& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_cube_slices::operator= (const subview_cube_slices& x) { arma_extra_debug_sigprint(); (*this).operator_equ(x); } //! work around compiler bugs template inline void subview_cube_slices::operator= (const subview_cube_slices& x) { arma_extra_debug_sigprint(); (*this).operator_equ(x); } template template inline void subview_cube_slices::operator+= (const subview_cube_slices& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_cube_slices::operator-= (const subview_cube_slices& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_cube_slices::operator%= (const subview_cube_slices& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_cube_slices::operator/= (const subview_cube_slices& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_cube_slices::operator= (const BaseCube& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_cube_slices::operator+= (const BaseCube& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_cube_slices::operator-= (const BaseCube& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_cube_slices::operator%= (const BaseCube& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_cube_slices::operator/= (const BaseCube& x) { arma_extra_debug_sigprint(); inplace_op(x); } // // template inline void subview_cube_slices::extract(Cube& out, const subview_cube_slices& in) { arma_extra_debug_sigprint(); const Cube& m_local = in.m; const uword m_n_slices = m_local.n_slices; const uword m_n_elem_slice = m_local.n_elem_slice; const quasi_unwrap U(in.base_si.get_ref()); const umat& si = U.M; arma_debug_check ( ( (si.is_vec() == false) && (si.is_empty() == false) ), "Cube::slices(): given object must be a vector" ); const uword* si_mem = si.memptr(); const uword si_n_elem = si.n_elem; out.set_size(m_local.n_rows, m_local.n_cols, si_n_elem); for(uword si_count=0; si_count < si_n_elem; ++si_count) { const uword i = si_mem[si_count]; arma_debug_check_bounds( (i >= m_n_slices), "Cube::slices(): index out of bounds" ); eT* out_slice_ptr = out.slice_memptr(si_count); const eT* m_slice_ptr = m_local.slice_memptr(i); arrayops::copy(out_slice_ptr, m_slice_ptr, m_n_elem_slice); } } // TODO: implement a dedicated function instead of creating a temporary template inline void subview_cube_slices::plus_inplace(Cube& out, const subview_cube_slices& in) { arma_extra_debug_sigprint(); const Cube tmp(in); out += tmp; } template inline void subview_cube_slices::minus_inplace(Cube& out, const subview_cube_slices& in) { arma_extra_debug_sigprint(); const Cube tmp(in); out -= tmp; } template inline void subview_cube_slices::schur_inplace(Cube& out, const subview_cube_slices& in) { arma_extra_debug_sigprint(); const Cube tmp(in); out %= tmp; } template inline void subview_cube_slices::div_inplace(Cube& out, const subview_cube_slices& in) { arma_extra_debug_sigprint(); const Cube tmp(in); out /= tmp; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_orth_null_meat.hpp0000644000176200001440000001002714124060717024615 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_orth_null //! @{ template inline void op_orth::apply(Mat& out, const Op& expr) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; const T tol = access::tmp_real(expr.aux); const bool status = op_orth::apply_direct(out, expr.m, tol); if(status == false) { out.soft_reset(); arma_stop_runtime_error("orth(): svd failed"); } } template inline bool op_orth::apply_direct(Mat& out, const Base& expr, typename T1::pod_type tol) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; arma_debug_check((tol < T(0)), "orth(): tolerance must be >= 0"); Mat A(expr.get_ref()); Mat U; Col< T> s; Mat V; const bool status = auxlib::svd_dc(U, s, V, A); V.reset(); if(status == false) { return false; } if(s.is_empty()) { out.reset(); return true; } const uword s_n_elem = s.n_elem; const T* s_mem = s.memptr(); // set tolerance to default if it hasn't been specified if(tol == T(0)) { tol = (std::max)(A.n_rows, A.n_cols) * s_mem[0] * std::numeric_limits::epsilon(); } uword count = 0; for(uword i=0; i < s_n_elem; ++i) { count += (s_mem[i] > tol) ? uword(1) : uword(0); } if(count > 0) { out = U.head_cols(count); // out *= eT(-1); } else { out.set_size(A.n_rows, 0); } return true; } // template inline void op_null::apply(Mat& out, const Op& expr) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; const T tol = access::tmp_real(expr.aux); const bool status = op_null::apply_direct(out, expr.m, tol); if(status == false) { out.soft_reset(); arma_stop_runtime_error("null(): svd failed"); } } template inline bool op_null::apply_direct(Mat& out, const Base& expr, typename T1::pod_type tol) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; arma_debug_check((tol < T(0)), "null(): tolerance must be >= 0"); Mat A(expr.get_ref()); Mat U; Col< T> s; Mat V; const bool status = auxlib::svd_dc(U, s, V, A); U.reset(); if(status == false) { return false; } if(s.is_empty()) { out.reset(); return true; } const uword s_n_elem = s.n_elem; const T* s_mem = s.memptr(); // set tolerance to default if it hasn't been specified if(tol == T(0)) { tol = (std::max)(A.n_rows, A.n_cols) * s_mem[0] * std::numeric_limits::epsilon(); } uword count = 0; for(uword i=0; i < s_n_elem; ++i) { count += (s_mem[i] > tol) ? uword(1) : uword(0); } if(count < A.n_cols) { out = V.tail_cols(A.n_cols - count); const uword out_n_elem = out.n_elem; eT* out_mem = out.memptr(); for(uword i=0; i::epsilon()) { out_mem[i] = eT(0); } } } else { out.set_size(A.n_cols, 0); } return true; } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_solve_meat.hpp0000644000176200001440000004527214162345366024277 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_solve //! @{ // // glue_solve_gen template inline void glue_solve_gen::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); const bool status = glue_solve_gen::apply( out, X.A, X.B, X.aux_uword ); if(status == false) { out.soft_reset(); arma_stop_runtime_error("solve(): solution not found"); } } template inline bool glue_solve_gen::apply(Mat& out, const Base& A_expr, const Base& B_expr, const uword flags) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const bool fast = bool(flags & solve_opts::flag_fast ); const bool equilibrate = bool(flags & solve_opts::flag_equilibrate ); const bool no_approx = bool(flags & solve_opts::flag_no_approx ); const bool no_band = bool(flags & solve_opts::flag_no_band ); const bool no_sympd = bool(flags & solve_opts::flag_no_sympd ); const bool allow_ugly = bool(flags & solve_opts::flag_allow_ugly ); const bool likely_sympd = bool(flags & solve_opts::flag_likely_sympd); const bool refine = bool(flags & solve_opts::flag_refine ); const bool no_trimat = bool(flags & solve_opts::flag_no_trimat ); const bool force_approx = bool(flags & solve_opts::flag_force_approx); arma_extra_debug_print("glue_solve_gen::apply(): enabled flags:"); if(fast ) { arma_extra_debug_print("fast"); } if(equilibrate ) { arma_extra_debug_print("equilibrate"); } if(no_approx ) { arma_extra_debug_print("no_approx"); } if(no_band ) { arma_extra_debug_print("no_band"); } if(no_sympd ) { arma_extra_debug_print("no_sympd"); } if(allow_ugly ) { arma_extra_debug_print("allow_ugly"); } if(likely_sympd) { arma_extra_debug_print("likely_sympd"); } if(refine ) { arma_extra_debug_print("refine"); } if(no_trimat ) { arma_extra_debug_print("no_trimat"); } if(force_approx) { arma_extra_debug_print("force_approx"); } arma_debug_check( (fast && equilibrate ), "solve(): options 'fast' and 'equilibrate' are mutually exclusive" ); arma_debug_check( (fast && refine ), "solve(): options 'fast' and 'refine' are mutually exclusive" ); arma_debug_check( (no_sympd && likely_sympd), "solve(): options 'no_sympd' and 'likely_sympd' are mutually exclusive" ); Mat A = A_expr.get_ref(); if(force_approx) { arma_extra_debug_print("glue_solve_gen::apply(): forced approximate solution"); arma_debug_check( no_approx, "solve(): options 'no_approx' and 'force_approx' are mutually exclusive" ); if(fast) { arma_debug_warn_level(2, "solve(): option 'fast' ignored for forced approximate solution" ); } if(equilibrate) { arma_debug_warn_level(2, "solve(): option 'equilibrate' ignored for forced approximate solution" ); } if(refine) { arma_debug_warn_level(2, "solve(): option 'refine' ignored for forced approximate solution" ); } if(likely_sympd) { arma_debug_warn_level(2, "solve(): option 'likely_sympd' ignored for forced approximate solution" ); } return auxlib::solve_approx_svd(out, A, B_expr.get_ref()); // A is overwritten } T rcond = T(0); bool status = false; if(A.n_rows == A.n_cols) { arma_extra_debug_print("glue_solve_gen::apply(): detected square system"); uword KL = 0; uword KU = 0; #if defined(ARMA_OPTIMISE_BAND) const bool is_band = (no_band || auxlib::crippled_lapack(A)) ? false : band_helper::is_band(KL, KU, A, uword(32)); #else const bool is_band = false; #endif const bool is_triu = (no_trimat || refine || equilibrate || likely_sympd || is_band ) ? false : trimat_helper::is_triu(A); const bool is_tril = (no_trimat || refine || equilibrate || likely_sympd || is_band || is_triu) ? false : trimat_helper::is_tril(A); #if defined(ARMA_OPTIMISE_SYMPD) const bool try_sympd = (no_sympd || auxlib::crippled_lapack(A) || is_band || is_triu || is_tril) ? false : (likely_sympd ? true : sympd_helper::guess_sympd(A, uword(16))); #else const bool try_sympd = false; #endif if(fast) { // fast mode: solvers without refinement and without rcond estimate arma_extra_debug_print("glue_solve_gen::apply(): fast mode"); if(is_band) { if( (KL == 1) && (KU == 1) ) { arma_extra_debug_print("glue_solve_gen::apply(): fast + tridiagonal"); status = auxlib::solve_tridiag_fast(out, A, B_expr.get_ref()); } else { arma_extra_debug_print("glue_solve_gen::apply(): fast + band"); status = auxlib::solve_band_fast(out, A, KL, KU, B_expr.get_ref()); } } else if(is_triu || is_tril) { if(is_triu) { arma_extra_debug_print("glue_solve_gen::apply(): fast + upper triangular matrix"); } if(is_tril) { arma_extra_debug_print("glue_solve_gen::apply(): fast + lower triangular matrix"); } const uword layout = (is_triu) ? uword(0) : uword(1); status = auxlib::solve_trimat_fast(out, A, B_expr.get_ref(), layout); } else if(try_sympd) { arma_extra_debug_print("glue_solve_gen::apply(): fast + try_sympd"); status = auxlib::solve_sympd_fast(out, A, B_expr.get_ref()); // A is overwritten if(status == false) { arma_extra_debug_print("glue_solve_gen::apply(): auxlib::solve_sympd_fast() failed; retrying"); // auxlib::solve_sympd_fast() may have failed because A isn't really sympd A = A_expr.get_ref(); status = auxlib::solve_square_fast(out, A, B_expr.get_ref()); // A is overwritten } } else { arma_extra_debug_print("glue_solve_gen::apply(): fast + dense"); status = auxlib::solve_square_fast(out, A, B_expr.get_ref()); // A is overwritten } } else if(refine || equilibrate) { // refine mode: solvers with refinement and with rcond estimate arma_extra_debug_print("glue_solve_gen::apply(): refine mode"); if(is_band) { arma_extra_debug_print("glue_solve_gen::apply(): refine + band"); status = auxlib::solve_band_refine(out, rcond, A, KL, KU, B_expr, equilibrate, allow_ugly); } else if(try_sympd) { arma_extra_debug_print("glue_solve_gen::apply(): refine + try_sympd"); status = auxlib::solve_sympd_refine(out, rcond, A, B_expr.get_ref(), equilibrate, allow_ugly); // A is overwritten if(status == false) { arma_extra_debug_print("glue_solve_gen::apply(): auxlib::solve_sympd_refine() failed; retrying"); // auxlib::solve_sympd_refine() may have failed because A isn't really sympd A = A_expr.get_ref(); status = auxlib::solve_square_refine(out, rcond, A, B_expr.get_ref(), equilibrate, allow_ugly); // A is overwritten } } else { arma_extra_debug_print("glue_solve_gen::apply(): refine + dense"); status = auxlib::solve_square_refine(out, rcond, A, B_expr, equilibrate, allow_ugly); // A is overwritten } } else { // default mode: solvers without refinement but with rcond estimate arma_extra_debug_print("glue_solve_gen::apply(): default mode"); if(is_band) { arma_extra_debug_print("glue_solve_gen::apply(): rcond + band"); status = auxlib::solve_band_rcond(out, rcond, A, KL, KU, B_expr.get_ref(), allow_ugly); } else if(is_triu || is_tril) { if(is_triu) { arma_extra_debug_print("glue_solve_gen::apply(): rcond + upper triangular matrix"); } if(is_tril) { arma_extra_debug_print("glue_solve_gen::apply(): rcond + lower triangular matrix"); } const uword layout = (is_triu) ? uword(0) : uword(1); status = auxlib::solve_trimat_rcond(out, rcond, A, B_expr.get_ref(), layout, allow_ugly); } else if(try_sympd) { status = auxlib::solve_sympd_rcond(out, rcond, A, B_expr.get_ref(), allow_ugly); // A is overwritten if(status == false) { arma_extra_debug_print("glue_solve_gen::apply(): auxlib::solve_sympd_rcond() failed; retrying"); // auxlib::solve_sympd_rcond() may have failed because A isn't really sympd A = A_expr.get_ref(); status = auxlib::solve_square_rcond(out, rcond, A, B_expr.get_ref(), allow_ugly); // A is overwritten } } else { status = auxlib::solve_square_rcond(out, rcond, A, B_expr.get_ref(), allow_ugly); // A is overwritten } } if( (status == true) && (rcond > T(0)) && (rcond < auxlib::epsilon_lapack(A)) ) { arma_debug_warn_level(2, "solve(): solution computed, but system is singular to working precision (rcond: ", rcond, ")"); } if( (status == false) && (no_approx == false) ) { arma_extra_debug_print("glue_solve_gen::apply(): solving rank deficient system"); if(rcond > T(0)) { arma_debug_warn_level(2, "solve(): system is singular (rcond: ", rcond, "); attempting approx solution"); } else { arma_debug_warn_level(2, "solve(): system is singular; attempting approx solution"); } // TODO: conditionally recreate A: have a separate state flag which indicates whether A was previously overwritten A = A_expr.get_ref(); // as A may have been overwritten status = auxlib::solve_approx_svd(out, A, B_expr.get_ref()); // A is overwritten } } else { arma_extra_debug_print("glue_solve_gen::apply(): detected non-square system"); if(equilibrate) { arma_debug_warn_level(2, "solve(): option 'equilibrate' ignored for non-square matrix" ); } if(refine) { arma_debug_warn_level(2, "solve(): option 'refine' ignored for non-square matrix" ); } if(likely_sympd) { arma_debug_warn_level(2, "solve(): option 'likely_sympd' ignored for non-square matrix" ); } if(fast) { status = auxlib::solve_rect_fast(out, A, B_expr.get_ref()); // A is overwritten } else { status = auxlib::solve_rect_rcond(out, rcond, A, B_expr.get_ref(), allow_ugly); // A is overwritten } if( (status == true) && (rcond > T(0)) && (rcond < auxlib::epsilon_lapack(A)) ) { arma_debug_warn_level(2, "solve(): solution computed, but system is singular to working precision (rcond: ", rcond, ")"); } if( (status == false) && (no_approx == false) ) { arma_extra_debug_print("glue_solve_gen::apply(): solving rank deficient system"); if(rcond > T(0)) { arma_debug_warn_level(2, "solve(): system is singular (rcond: ", rcond, "); attempting approx solution"); } else { arma_debug_warn_level(2, "solve(): system is singular; attempting approx solution"); } A = A_expr.get_ref(); // as A was overwritten status = auxlib::solve_approx_svd(out, A, B_expr.get_ref()); // A is overwritten } } return status; } // // glue_solve_tri template inline void glue_solve_tri_default::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); const bool status = glue_solve_tri_default::apply( out, X.A, X.B, X.aux_uword ); if(status == false) { out.soft_reset(); arma_stop_runtime_error("solve(): solution not found"); } } template inline bool glue_solve_tri_default::apply(Mat& actual_out, const Base& A_expr, const Base& B_expr, const uword flags) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const bool triu = bool(flags & solve_opts::flag_triu); const bool tril = bool(flags & solve_opts::flag_tril); const bool allow_ugly = false; arma_extra_debug_print("glue_solve_tri_default::apply(): enabled flags:"); if(triu) { arma_extra_debug_print("triu"); } if(tril) { arma_extra_debug_print("tril"); } const quasi_unwrap U(A_expr.get_ref()); const Mat& A = U.M; arma_debug_check( (A.is_square() == false), "solve(): matrix marked as triangular must be square sized" ); const uword layout = (triu) ? uword(0) : uword(1); const bool is_alias = U.is_alias(actual_out); T rcond = T(0); bool status = false; Mat tmp; Mat& out = (is_alias) ? tmp : actual_out; status = auxlib::solve_trimat_rcond(out, rcond, A, B_expr.get_ref(), layout, allow_ugly); // A is not modified if( (status == true) && (rcond > T(0)) && (rcond < auxlib::epsilon_lapack(A)) ) { arma_debug_warn_level(2, "solve(): solution computed, but system is singular to working precision (rcond: ", rcond, ")"); } if(status == false) { arma_extra_debug_print("glue_solve_tri::apply(): solving rank deficient system"); if(rcond > T(0)) { arma_debug_warn_level(2, "solve(): system is singular (rcond: ", rcond, "); attempting approx solution"); } else { arma_debug_warn_level(2, "solve(): system is singular; attempting approx solution"); } Mat triA = (triu) ? trimatu(A) : trimatl(A); // trimatu() and trimatl() return the same type status = auxlib::solve_approx_svd(out, triA, B_expr.get_ref()); // triA is overwritten } if(is_alias) { actual_out.steal_mem(out); } return status; } template inline void glue_solve_tri::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); const bool status = glue_solve_tri::apply( out, X.A, X.B, X.aux_uword ); if(status == false) { out.soft_reset(); arma_stop_runtime_error("solve(): solution not found"); } } template inline bool glue_solve_tri::apply(Mat& actual_out, const Base& A_expr, const Base& B_expr, const uword flags) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const bool fast = bool(flags & solve_opts::flag_fast ); const bool equilibrate = bool(flags & solve_opts::flag_equilibrate ); const bool no_approx = bool(flags & solve_opts::flag_no_approx ); const bool triu = bool(flags & solve_opts::flag_triu ); const bool tril = bool(flags & solve_opts::flag_tril ); const bool allow_ugly = bool(flags & solve_opts::flag_allow_ugly ); const bool likely_sympd = bool(flags & solve_opts::flag_likely_sympd); const bool refine = bool(flags & solve_opts::flag_refine ); const bool no_trimat = bool(flags & solve_opts::flag_no_trimat ); const bool force_approx = bool(flags & solve_opts::flag_force_approx); arma_extra_debug_print("glue_solve_tri::apply(): enabled flags:"); if(fast ) { arma_extra_debug_print("fast"); } if(equilibrate ) { arma_extra_debug_print("equilibrate"); } if(no_approx ) { arma_extra_debug_print("no_approx"); } if(triu ) { arma_extra_debug_print("triu"); } if(tril ) { arma_extra_debug_print("tril"); } if(allow_ugly ) { arma_extra_debug_print("allow_ugly"); } if(likely_sympd) { arma_extra_debug_print("likely_sympd"); } if(refine ) { arma_extra_debug_print("refine"); } if(no_trimat ) { arma_extra_debug_print("no_trimat"); } if(force_approx) { arma_extra_debug_print("force_approx"); } if(no_trimat || equilibrate || refine || force_approx) { const uword mask = ~(solve_opts::flag_triu | solve_opts::flag_tril); return glue_solve_gen::apply(actual_out, ((triu) ? trimatu(A_expr.get_ref()) : trimatl(A_expr.get_ref())), B_expr, (flags & mask)); } if(likely_sympd) { arma_debug_warn_level(2, "solve(): option 'likely_sympd' ignored for triangular matrix"); } const quasi_unwrap U(A_expr.get_ref()); const Mat& A = U.M; arma_debug_check( (A.is_square() == false), "solve(): matrix marked as triangular must be square sized" ); const uword layout = (triu) ? uword(0) : uword(1); const bool is_alias = U.is_alias(actual_out); T rcond = T(0); bool status = false; Mat tmp; Mat& out = (is_alias) ? tmp : actual_out; if(fast) { status = auxlib::solve_trimat_fast(out, A, B_expr.get_ref(), layout); // A is not modified } else { status = auxlib::solve_trimat_rcond(out, rcond, A, B_expr.get_ref(), layout, allow_ugly); // A is not modified } if( (status == true) && (rcond > T(0)) && (rcond < auxlib::epsilon_lapack(A)) ) { arma_debug_warn_level(2, "solve(): solution computed, but system is singular to working precision (rcond: ", rcond, ")"); } if( (status == false) && (no_approx == false) ) { arma_extra_debug_print("glue_solve_tri::apply(): solving rank deficient system"); if(rcond > T(0)) { arma_debug_warn_level(2, "solve(): system is singular (rcond: ", rcond, "); attempting approx solution"); } else { arma_debug_warn_level(2, "solve(): system is singular; attempting approx solution"); } Mat triA = (triu) ? trimatu(A) : trimatl(A); // trimatu() and trimatl() return the same type status = auxlib::solve_approx_svd(out, triA, B_expr.get_ref()); // triA is overwritten } if(is_alias) { actual_out.steal_mem(out); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_princomp.hpp0000644000176200001440000001071714124060717023423 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_princomp //! @{ //! \brief //! principal component analysis -- 4 arguments version //! coeff_out -> principal component coefficients //! score_out -> projected samples //! latent_out -> eigenvalues of principal vectors //! tsquared_out -> Hotelling's T^2 statistic template inline bool princomp ( Mat& coeff_out, Mat& score_out, Col& latent_out, Col& tsquared_out, const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); const bool status = op_princomp::direct_princomp(coeff_out, score_out, latent_out, tsquared_out, X); if(status == false) { coeff_out.soft_reset(); score_out.soft_reset(); latent_out.soft_reset(); tsquared_out.soft_reset(); arma_debug_warn_level(3, "princomp(): decomposition failed"); } return status; } //! \brief //! principal component analysis -- 3 arguments version //! coeff_out -> principal component coefficients //! score_out -> projected samples //! latent_out -> eigenvalues of principal vectors template inline bool princomp ( Mat& coeff_out, Mat& score_out, Col& latent_out, const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); const bool status = op_princomp::direct_princomp(coeff_out, score_out, latent_out, X); if(status == false) { coeff_out.soft_reset(); score_out.soft_reset(); latent_out.soft_reset(); arma_debug_warn_level(3, "princomp(): decomposition failed"); } return status; } //! \brief //! principal component analysis -- 2 arguments version //! coeff_out -> principal component coefficients //! score_out -> projected samples template inline bool princomp ( Mat& coeff_out, Mat& score_out, const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); const bool status = op_princomp::direct_princomp(coeff_out, score_out, X); if(status == false) { coeff_out.soft_reset(); score_out.soft_reset(); arma_debug_warn_level(3, "princomp(): decomposition failed"); } return status; } //! \brief //! principal component analysis -- 1 argument version //! coeff_out -> principal component coefficients template inline bool princomp ( Mat& coeff_out, const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); const bool status = op_princomp::direct_princomp(coeff_out, X); if(status == false) { coeff_out.soft_reset(); arma_debug_warn_level(3, "princomp(): decomposition failed"); } return status; } template arma_warn_unused inline const Op princomp ( const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); return Op(X.get_ref()); } //! @} RcppArmadillo/inst/include/armadillo_bits/SizeCube_meat.hpp0000644000176200001440000000642514124060717023631 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SizeCube //! @{ inline SizeCube::SizeCube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices) : n_rows (in_n_rows ) , n_cols (in_n_cols ) , n_slices(in_n_slices) { arma_extra_debug_sigprint(); } inline uword SizeCube::operator[](const uword dim) const { if(dim == 0) { return n_rows; } if(dim == 1) { return n_cols; } if(dim == 2) { return n_slices; } return uword(1); } inline uword SizeCube::operator()(const uword dim) const { if(dim == 0) { return n_rows; } if(dim == 1) { return n_cols; } if(dim == 2) { return n_slices; } arma_debug_check_bounds(true, "size(): index out of bounds"); return uword(1); } inline bool SizeCube::operator==(const SizeCube& s) const { if(n_rows != s.n_rows ) { return false; } if(n_cols != s.n_cols ) { return false; } if(n_slices != s.n_slices) { return false; } return true; } inline bool SizeCube::operator!=(const SizeCube& s) const { if(n_rows != s.n_rows ) { return true; } if(n_cols != s.n_cols ) { return true; } if(n_slices != s.n_slices) { return true; } return false; } inline SizeCube SizeCube::operator+(const SizeCube& s) const { return SizeCube( (n_rows + s.n_rows), (n_cols + s.n_cols), (n_slices + s.n_slices) ); } inline SizeCube SizeCube::operator-(const SizeCube& s) const { const uword out_n_rows = (n_rows > s.n_rows ) ? (n_rows - s.n_rows ) : uword(0); const uword out_n_cols = (n_cols > s.n_cols ) ? (n_cols - s.n_cols ) : uword(0); const uword out_n_slices = (n_slices > s.n_slices) ? (n_slices - s.n_slices) : uword(0); return SizeCube(out_n_rows, out_n_cols, out_n_slices); } inline SizeCube SizeCube::operator+(const uword val) const { return SizeCube( (n_rows + val), (n_cols + val), (n_slices + val) ); } inline SizeCube SizeCube::operator-(const uword val) const { const uword out_n_rows = (n_rows > val) ? (n_rows - val) : uword(0); const uword out_n_cols = (n_cols > val) ? (n_cols - val) : uword(0); const uword out_n_slices = (n_slices > val) ? (n_slices - val) : uword(0); return SizeCube(out_n_rows, out_n_cols, out_n_slices); } inline SizeCube SizeCube::operator*(const uword val) const { return SizeCube( (n_rows * val), (n_cols * val), (n_slices * val) ); } inline SizeCube SizeCube::operator/(const uword val) const { return SizeCube( (n_rows / val), (n_cols / val), (n_slices / val) ); } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_mixed_meat.hpp0000644000176200001440000003573314124060717024246 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_mixed //! @{ //! matrix multiplication with different element types template inline void glue_mixed_times::apply(Mat::eT>& out, const mtGlue::eT, T1, T2, glue_mixed_times>& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type in_eT1; typedef typename T2::elem_type in_eT2; typedef typename eT_promoter::eT out_eT; const partial_unwrap tmp1(X.A); const partial_unwrap tmp2(X.B); const typename partial_unwrap::stored_type& A = tmp1.M; const typename partial_unwrap::stored_type& B = tmp2.M; const bool use_alpha = partial_unwrap::do_times || partial_unwrap::do_times; const out_eT alpha = use_alpha ? (upgrade_val::apply(tmp1.get_val()) * upgrade_val::apply(tmp2.get_val())) : out_eT(0); const bool do_trans_A = partial_unwrap::do_trans; const bool do_trans_B = partial_unwrap::do_trans; arma_debug_assert_trans_mul_size(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "matrix multiplication"); const uword out_n_rows = (do_trans_A == false) ? A.n_rows : A.n_cols; const uword out_n_cols = (do_trans_B == false) ? B.n_cols : B.n_rows; const bool alias = tmp1.is_alias(out) || tmp2.is_alias(out); if(alias == false) { out.set_size(out_n_rows, out_n_cols); gemm_mixed::apply(out, A, B, alpha); } else { Mat tmp(out_n_rows, out_n_cols, arma_nozeros_indicator()); gemm_mixed::apply(tmp, A, B, alpha); out.steal_mem(tmp); } } //! matrix addition with different element types template inline void glue_mixed_plus::apply(Mat::eT>& out, const mtGlue::eT, T1, T2, glue_mixed_plus>& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); const Proxy A(X.A); const Proxy B(X.B); arma_debug_assert_same_size(A, B, "addition"); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); out.set_size(n_rows, n_cols); out_eT* out_mem = out.memptr(); const uword n_elem = out.n_elem; const bool use_at = (Proxy::use_at || Proxy::use_at); if(use_at == false) { typename Proxy::ea_type AA = A.get_ea(); typename Proxy::ea_type BB = B.get_ea(); if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); for(uword i=0; i::apply(AA[i]) + upgrade_val::apply(BB[i]); } } else { for(uword i=0; i::apply(AA[i]) + upgrade_val::apply(BB[i]); } } } else { for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { (*out_mem) = upgrade_val::apply(A.at(row,col)) + upgrade_val::apply(B.at(row,col)); out_mem++; } } } //! matrix subtraction with different element types template inline void glue_mixed_minus::apply(Mat::eT>& out, const mtGlue::eT, T1, T2, glue_mixed_minus>& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); const Proxy A(X.A); const Proxy B(X.B); arma_debug_assert_same_size(A, B, "subtraction"); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); out.set_size(n_rows, n_cols); out_eT* out_mem = out.memptr(); const uword n_elem = out.n_elem; const bool use_at = (Proxy::use_at || Proxy::use_at); if(use_at == false) { typename Proxy::ea_type AA = A.get_ea(); typename Proxy::ea_type BB = B.get_ea(); if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); for(uword i=0; i::apply(AA[i]) - upgrade_val::apply(BB[i]); } } else { for(uword i=0; i::apply(AA[i]) - upgrade_val::apply(BB[i]); } } } else { for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { (*out_mem) = upgrade_val::apply(A.at(row,col)) - upgrade_val::apply(B.at(row,col)); out_mem++; } } } //! element-wise matrix division with different element types template inline void glue_mixed_div::apply(Mat::eT>& out, const mtGlue::eT, T1, T2, glue_mixed_div>& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); const Proxy A(X.A); const Proxy B(X.B); arma_debug_assert_same_size(A, B, "element-wise division"); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); out.set_size(n_rows, n_cols); out_eT* out_mem = out.memptr(); const uword n_elem = out.n_elem; const bool use_at = (Proxy::use_at || Proxy::use_at); if(use_at == false) { typename Proxy::ea_type AA = A.get_ea(); typename Proxy::ea_type BB = B.get_ea(); if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); for(uword i=0; i::apply(AA[i]) / upgrade_val::apply(BB[i]); } } else { for(uword i=0; i::apply(AA[i]) / upgrade_val::apply(BB[i]); } } } else { for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { (*out_mem) = upgrade_val::apply(A.at(row,col)) / upgrade_val::apply(B.at(row,col)); out_mem++; } } } //! element-wise matrix multiplication with different element types template inline void glue_mixed_schur::apply(Mat::eT>& out, const mtGlue::eT, T1, T2, glue_mixed_schur>& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); const Proxy A(X.A); const Proxy B(X.B); arma_debug_assert_same_size(A, B, "element-wise multiplication"); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); out.set_size(n_rows, n_cols); out_eT* out_mem = out.memptr(); const uword n_elem = out.n_elem; const bool use_at = (Proxy::use_at || Proxy::use_at); if(use_at == false) { typename Proxy::ea_type AA = A.get_ea(); typename Proxy::ea_type BB = B.get_ea(); if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); for(uword i=0; i::apply(AA[i]) * upgrade_val::apply(BB[i]); } } else { for(uword i=0; i::apply(AA[i]) * upgrade_val::apply(BB[i]); } } } else { for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { (*out_mem) = upgrade_val::apply(A.at(row,col)) * upgrade_val::apply(B.at(row,col)); out_mem++; } } } // // // //! cube addition with different element types template inline void glue_mixed_plus::apply(Cube::eT>& out, const mtGlueCube::eT, T1, T2, glue_mixed_plus>& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); const ProxyCube A(X.A); const ProxyCube B(X.B); arma_debug_assert_same_size(A, B, "addition"); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); const uword n_slices = A.get_n_slices(); out.set_size(n_rows, n_cols, n_slices); out_eT* out_mem = out.memptr(); const uword n_elem = out.n_elem; const bool use_at = (ProxyCube::use_at || ProxyCube::use_at); if(use_at == false) { typename ProxyCube::ea_type AA = A.get_ea(); typename ProxyCube::ea_type BB = B.get_ea(); for(uword i=0; i::apply(AA[i]) + upgrade_val::apply(BB[i]); } } else { for(uword slice = 0; slice < n_slices; ++slice) for(uword col = 0; col < n_cols; ++col ) for(uword row = 0; row < n_rows; ++row ) { (*out_mem) = upgrade_val::apply(A.at(row,col,slice)) + upgrade_val::apply(B.at(row,col,slice)); out_mem++; } } } //! cube subtraction with different element types template inline void glue_mixed_minus::apply(Cube::eT>& out, const mtGlueCube::eT, T1, T2, glue_mixed_minus>& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); const ProxyCube A(X.A); const ProxyCube B(X.B); arma_debug_assert_same_size(A, B, "subtraction"); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); const uword n_slices = A.get_n_slices(); out.set_size(n_rows, n_cols, n_slices); out_eT* out_mem = out.memptr(); const uword n_elem = out.n_elem; const bool use_at = (ProxyCube::use_at || ProxyCube::use_at); if(use_at == false) { typename ProxyCube::ea_type AA = A.get_ea(); typename ProxyCube::ea_type BB = B.get_ea(); for(uword i=0; i::apply(AA[i]) - upgrade_val::apply(BB[i]); } } else { for(uword slice = 0; slice < n_slices; ++slice) for(uword col = 0; col < n_cols; ++col ) for(uword row = 0; row < n_rows; ++row ) { (*out_mem) = upgrade_val::apply(A.at(row,col,slice)) - upgrade_val::apply(B.at(row,col,slice)); out_mem++; } } } //! element-wise cube division with different element types template inline void glue_mixed_div::apply(Cube::eT>& out, const mtGlueCube::eT, T1, T2, glue_mixed_div>& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); const ProxyCube A(X.A); const ProxyCube B(X.B); arma_debug_assert_same_size(A, B, "element-wise division"); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); const uword n_slices = A.get_n_slices(); out.set_size(n_rows, n_cols, n_slices); out_eT* out_mem = out.memptr(); const uword n_elem = out.n_elem; const bool use_at = (ProxyCube::use_at || ProxyCube::use_at); if(use_at == false) { typename ProxyCube::ea_type AA = A.get_ea(); typename ProxyCube::ea_type BB = B.get_ea(); for(uword i=0; i::apply(AA[i]) / upgrade_val::apply(BB[i]); } } else { for(uword slice = 0; slice < n_slices; ++slice) for(uword col = 0; col < n_cols; ++col ) for(uword row = 0; row < n_rows; ++row ) { (*out_mem) = upgrade_val::apply(A.at(row,col,slice)) / upgrade_val::apply(B.at(row,col,slice)); out_mem++; } } } //! element-wise cube multiplication with different element types template inline void glue_mixed_schur::apply(Cube::eT>& out, const mtGlueCube::eT, T1, T2, glue_mixed_schur>& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); const ProxyCube A(X.A); const ProxyCube B(X.B); arma_debug_assert_same_size(A, B, "element-wise multiplication"); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); const uword n_slices = A.get_n_slices(); out.set_size(n_rows, n_cols, n_slices); out_eT* out_mem = out.memptr(); const uword n_elem = out.n_elem; const bool use_at = (ProxyCube::use_at || ProxyCube::use_at); if(use_at == false) { typename ProxyCube::ea_type AA = A.get_ea(); typename ProxyCube::ea_type BB = B.get_ea(); for(uword i=0; i::apply(AA[i]) * upgrade_val::apply(BB[i]); } } else { for(uword slice = 0; slice < n_slices; ++slice) for(uword col = 0; col < n_cols; ++col ) for(uword row = 0; row < n_rows; ++row ) { (*out_mem) = upgrade_val::apply(A.at(row,col,slice)) * upgrade_val::apply(B.at(row,col,slice)); out_mem++; } } } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_diagmat_bones.hpp0000644000176200001440000000413414124060717024742 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_diagmat //! @{ class spop_diagmat : public traits_op_default { public: template inline static void apply(SpMat& out, const SpOp& in); template inline static void apply_noalias(SpMat& out, const SpBase& expr); template inline static void apply_noalias(SpMat& out, const SpGlue& expr); template inline static void apply_noalias(SpMat& out, const SpGlue& expr); template inline static void apply_noalias(SpMat& out, const SpGlue& expr); template inline static void apply_noalias(SpMat& out, const SpGlue& expr); }; class spop_diagmat2 : public traits_op_default { public: template inline static void apply(SpMat& out, const SpOp& in); template inline static void apply_noalias(SpMat& out, const SpMat& X, const uword row_offset, const uword col_offset); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_sqrtmat_meat.hpp0000644000176200001440000002626414162345366024324 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_sqrtmat //! @{ //! implementation partly based on: //! N. J. Higham. //! A New sqrtm for Matlab. //! Numerical Analysis Report No. 336, January 1999. //! Department of Mathematics, University of Manchester. //! ISSN 1360-1725 //! http://www.maths.manchester.ac.uk/~higham/narep/narep336.ps.gz template inline void op_sqrtmat::apply(Mat< std::complex >& out, const mtOp,T1,op_sqrtmat>& in) { arma_extra_debug_sigprint(); const bool status = op_sqrtmat::apply_direct(out, in.m); if(status == false) { arma_debug_warn_level(3, "sqrtmat(): given matrix is singular; may not have a square root"); } } template inline bool op_sqrtmat::apply_direct(Mat< std::complex >& out, const Op& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type T; const diagmat_proxy P(expr.m); arma_debug_check( (P.n_rows != P.n_cols), "sqrtmat(): given matrix must be square sized" ); const uword N = P.n_rows; out.zeros(N,N); bool singular = false; for(uword i=0; i= T(0)) { singular = (singular || (val == T(0))); out.at(i,i) = std::sqrt(val); } else { out.at(i,i) = std::sqrt( std::complex(val) ); } } return (singular) ? false : true; } template inline bool op_sqrtmat::apply_direct(Mat< std::complex >& out, const Base& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type in_T; typedef typename std::complex out_T; const quasi_unwrap expr_unwrap(expr.get_ref()); const Mat& A = expr_unwrap.M; arma_debug_check( (A.is_square() == false), "sqrtmat(): given matrix must be square sized" ); if(A.n_elem == 0) { out.reset(); return true; } else if(A.n_elem == 1) { out.set_size(1,1); out[0] = std::sqrt( std::complex( A[0] ) ); return true; } if(A.is_diagmat()) { arma_extra_debug_print("op_sqrtmat: detected diagonal matrix"); const uword N = A.n_rows; out.zeros(N,N); // aliasing can't happen as op_sqrtmat is defined as cx_mat = op(mat) for(uword i=0; i= in_T(0)) { out.at(i,i) = std::sqrt(val); } else { out.at(i,i) = std::sqrt( out_T(val) ); } } return true; } #if defined(ARMA_OPTIMISE_SYMPD) const bool try_sympd = sympd_helper::guess_sympd(A); #else const bool try_sympd = false; #endif if(try_sympd) { arma_extra_debug_print("op_sqrtmat: attempting sympd optimisation"); // if matrix A is sympd, all its eigenvalues are positive Col eigval; Mat eigvec; const bool eig_status = eig_sym_helper(eigval, eigvec, A, 'd', "sqrtmat()"); if(eig_status) { // ensure each eigenvalue is > 0 const uword N = eigval.n_elem; const in_T* eigval_mem = eigval.memptr(); bool all_pos = true; for(uword i=0; i >::from( eigvec * diagmat(eigval) * eigvec.t() ); return true; } } arma_extra_debug_print("op_sqrtmat: sympd optimisation failed"); // fallthrough if eigen decomposition failed or an eigenvalue is zero } Mat U; Mat S(A.n_rows, A.n_cols, arma_nozeros_indicator()); const in_T* Amem = A.memptr(); out_T* Smem = S.memptr(); const uword n_elem = A.n_elem; for(uword i=0; i( Amem[i] ); } const bool schur_ok = auxlib::schur(U,S); if(schur_ok == false) { arma_extra_debug_print("sqrtmat(): schur decomposition failed"); out.soft_reset(); return false; } const bool status = op_sqrtmat_cx::helper(S); const Mat X = U*S; S.reset(); out = X*U.t(); return status; } template inline void op_sqrtmat_cx::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); const bool status = op_sqrtmat_cx::apply_direct(out, in.m); if(status == false) { arma_debug_warn_level(3, "sqrtmat(): given matrix is singular; may not have a square root"); } } template inline bool op_sqrtmat_cx::apply_direct(Mat& out, const Op& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const diagmat_proxy P(expr.m); bool status = false; if(P.is_alias(out)) { Mat tmp; status = op_sqrtmat_cx::apply_direct_noalias(tmp, P); out.steal_mem(tmp); } else { status = op_sqrtmat_cx::apply_direct_noalias(out, P); } return status; } template inline bool op_sqrtmat_cx::apply_direct_noalias(Mat& out, const diagmat_proxy& P) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; arma_debug_check( (P.n_rows != P.n_cols), "sqrtmat(): given matrix must be square sized" ); const uword N = P.n_rows; out.zeros(N,N); const eT zero = eT(0); bool singular = false; for(uword i=0; i inline bool op_sqrtmat_cx::apply_direct(Mat& out, const Base& expr) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; typedef typename T1::elem_type eT; Mat U; Mat S = expr.get_ref(); arma_debug_check( (S.n_rows != S.n_cols), "sqrtmat(): given matrix must be square sized" ); if(S.n_elem == 0) { out.reset(); return true; } else if(S.n_elem == 1) { out.set_size(1,1); out[0] = std::sqrt(S[0]); return true; } if(S.is_diagmat()) { arma_extra_debug_print("op_sqrtmat_cx: detected diagonal matrix"); const uword N = S.n_rows; out.zeros(N,N); // aliasing can't happen as S is generated for(uword i=0; i eigval; Mat eigvec; const bool eig_status = eig_sym_helper(eigval, eigvec, S, 'd', "sqrtmat()"); if(eig_status) { // ensure each eigenvalue is > 0 const uword N = eigval.n_elem; const T* eigval_mem = eigval.memptr(); bool all_pos = true; for(uword i=0; i X = U*S; S.reset(); out = X*U.t(); return status; } template inline bool op_sqrtmat_cx::helper(Mat< std::complex >& S) { typedef typename std::complex eT; if(S.is_empty()) { return true; } const uword N = S.n_rows; const eT zero = eT(0); eT& S_00 = S[0]; bool singular = (S_00 == zero); S_00 = std::sqrt(S_00); for(uword j=1; j < N; ++j) { eT* S_j = S.colptr(j); eT& S_jj = S_j[j]; singular = (singular || (S_jj == zero)); S_jj = std::sqrt(S_jj); for(uword ii=0; ii <= (j-1); ++ii) { const uword i = (j-1) - ii; const eT* S_i = S.colptr(i); //S_j[i] /= (S_i[i] + S_j[j]); S_j[i] /= (S_i[i] + S_jj); for(uword k=0; k < i; ++k) { S_j[k] -= S_i[k] * S_j[i]; } } } return (singular) ? false : true; } template inline void op_sqrtmat_sympd::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); const bool status = op_sqrtmat_sympd::apply_direct(out, in.m); if(status == false) { out.soft_reset(); arma_stop_runtime_error("sqrtmat_sympd(): transformation failed"); } } template inline bool op_sqrtmat_sympd::apply_direct(Mat& out, const Base& expr) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; typedef typename T1::elem_type eT; const unwrap U(expr.get_ref()); const Mat& X = U.M; arma_debug_check( (X.is_square() == false), "sqrtmat_sympd(): given matrix must be square sized" ); Col< T> eigval; Mat eigvec; const bool status = eig_sym_helper(eigval, eigvec, X, 'd', "sqrtmat_sympd()"); if(status == false) { return false; } const uword N = eigval.n_elem; const T* eigval_mem = eigval.memptr(); bool all_pos = true; for(uword i=0; i inline static void inplace_conj_copy_upper_tri_to_lower_tri(Mat& C) { // under the assumption that C is a square matrix const uword N = C.n_rows; for(uword k=0; k < N; ++k) { eT* colmem = C.colptr(k); for(uword i=(k+1); i < N; ++i) { colmem[i] = std::conj( C.at(k,i) ); } } } template static arma_hot inline eT dot_conj_row(const uword n_elem, const eT* const A, const Mat& B, const uword row) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; T val_real = T(0); T val_imag = T(0); for(uword i=0; i& X = A[i]; const std::complex& Y = B.at(row,i); const T a = X.real(); const T b = X.imag(); const T c = Y.real(); const T d = Y.imag(); val_real += (a*c) + (b*d); val_imag += (b*c) - (a*d); } return std::complex(val_real, val_imag); } }; template class herk_vec { public: template arma_hot inline static void apply ( Mat< std::complex >& C, const TA& A, const T alpha = T(1), const T beta = T(0) ) { arma_extra_debug_sigprint(); typedef std::complex eT; const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; // for beta != 0, C is assumed to be hermitian // do_trans_A == false -> C = alpha * A * A^H + beta*C // do_trans_A == true -> C = alpha * A^H * A + beta*C const eT* A_mem = A.memptr(); if(do_trans_A == false) { if(A_n_rows == 1) { const eT acc = op_cdot::direct_cdot(A_n_cols, A_mem, A_mem); if( (use_alpha == false) && (use_beta == false) ) { C[0] = acc; } else if( (use_alpha == true ) && (use_beta == false) ) { C[0] = alpha*acc; } else if( (use_alpha == false) && (use_beta == true ) ) { C[0] = acc + beta*C[0]; } else if( (use_alpha == true ) && (use_beta == true ) ) { C[0] = alpha*acc + beta*C[0]; } } else for(uword row_A=0; row_A < A_n_rows; ++row_A) { const eT& A_rowdata = A_mem[row_A]; for(uword k=row_A; k < A_n_rows; ++k) { const eT acc = A_rowdata * std::conj( A_mem[k] ); if( (use_alpha == false) && (use_beta == false) ) { C.at(row_A, k) = acc; if(row_A != k) { C.at(k, row_A) = std::conj(acc); } } else if( (use_alpha == true) && (use_beta == false) ) { const eT val = alpha*acc; C.at(row_A, k) = val; if(row_A != k) { C.at(k, row_A) = std::conj(val); } } else if( (use_alpha == false) && (use_beta == true) ) { C.at(row_A, k) = acc + beta*C.at(row_A, k); if(row_A != k) { C.at(k, row_A) = std::conj(acc) + beta*C.at(k, row_A); } } else if( (use_alpha == true) && (use_beta == true) ) { const eT val = alpha*acc; C.at(row_A, k) = val + beta*C.at(row_A, k); if(row_A != k) { C.at(k, row_A) = std::conj(val) + beta*C.at(k, row_A); } } } } } else if(do_trans_A == true) { if(A_n_cols == 1) { const eT acc = op_cdot::direct_cdot(A_n_rows, A_mem, A_mem); if( (use_alpha == false) && (use_beta == false) ) { C[0] = acc; } else if( (use_alpha == true ) && (use_beta == false) ) { C[0] = alpha*acc; } else if( (use_alpha == false) && (use_beta == true ) ) { C[0] = acc + beta*C[0]; } else if( (use_alpha == true ) && (use_beta == true ) ) { C[0] = alpha*acc + beta*C[0]; } } else for(uword col_A=0; col_A < A_n_cols; ++col_A) { // col_A is interpreted as row_A when storing the results in matrix C const eT A_coldata = std::conj( A_mem[col_A] ); for(uword k=col_A; k < A_n_cols ; ++k) { const eT acc = A_coldata * A_mem[k]; if( (use_alpha == false) && (use_beta == false) ) { C.at(col_A, k) = acc; if(col_A != k) { C.at(k, col_A) = std::conj(acc); } } else if( (use_alpha == true ) && (use_beta == false) ) { const eT val = alpha*acc; C.at(col_A, k) = val; if(col_A != k) { C.at(k, col_A) = std::conj(val); } } else if( (use_alpha == false) && (use_beta == true ) ) { C.at(col_A, k) = acc + beta*C.at(col_A, k); if(col_A != k) { C.at(k, col_A) = std::conj(acc) + beta*C.at(k, col_A); } } else if( (use_alpha == true ) && (use_beta == true ) ) { const eT val = alpha*acc; C.at(col_A, k) = val + beta*C.at(col_A, k); if(col_A != k) { C.at(k, col_A) = std::conj(val) + beta*C.at(k, col_A); } } } } } } }; template class herk_emul { public: template arma_hot inline static void apply ( Mat< std::complex >& C, const TA& A, const T alpha = T(1), const T beta = T(0) ) { arma_extra_debug_sigprint(); typedef std::complex eT; // do_trans_A == false -> C = alpha * A * A^H + beta*C // do_trans_A == true -> C = alpha * A^H * A + beta*C if(do_trans_A == false) { Mat AA; op_htrans::apply_mat_noalias(AA, A); herk_emul::apply(C, AA, alpha, beta); } else if(do_trans_A == true) { const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; for(uword col_A=0; col_A < A_n_cols; ++col_A) { // col_A is interpreted as row_A when storing the results in matrix C const eT* A_coldata = A.colptr(col_A); for(uword k=col_A; k < A_n_cols ; ++k) { const eT acc = op_cdot::direct_cdot(A_n_rows, A_coldata, A.colptr(k)); if( (use_alpha == false) && (use_beta == false) ) { C.at(col_A, k) = acc; if(col_A != k) { C.at(k, col_A) = std::conj(acc); } } else if( (use_alpha == true) && (use_beta == false) ) { const eT val = alpha*acc; C.at(col_A, k) = val; if(col_A != k) { C.at(k, col_A) = std::conj(val); } } else if( (use_alpha == false) && (use_beta == true) ) { C.at(col_A, k) = acc + beta*C.at(col_A, k); if(col_A != k) { C.at(k, col_A) = std::conj(acc) + beta*C.at(k, col_A); } } else if( (use_alpha == true) && (use_beta == true) ) { const eT val = alpha*acc; C.at(col_A, k) = val + beta*C.at(col_A, k); if(col_A != k) { C.at(k, col_A) = std::conj(val) + beta*C.at(k, col_A); } } } } } } }; template class herk { public: template inline static void apply_blas_type( Mat>& C, const TA& A, const T alpha = T(1), const T beta = T(0) ) { arma_extra_debug_sigprint(); const uword threshold = 16; if(A.is_vec()) { // work around poor handling of vectors by herk() in ATLAS 3.8.4 and standard BLAS herk_vec::apply(C,A,alpha,beta); return; } if( (A.n_elem <= threshold) ) { herk_emul::apply(C,A,alpha,beta); } else { #if defined(ARMA_USE_ATLAS) { if(use_beta == true) { typedef typename std::complex eT; // use a temporary matrix, as we can't assume that matrix C is already symmetric Mat D(C.n_rows, C.n_cols, arma_nozeros_indicator()); herk::apply_blas_type(D,A,alpha); // NOTE: assuming beta=1; this is okay for now, as currently glue_times only uses beta=1 arrayops::inplace_plus(C.memptr(), D.memptr(), C.n_elem); return; } atlas::cblas_herk ( atlas::CblasColMajor, atlas::CblasUpper, (do_trans_A) ? CblasConjTrans : atlas::CblasNoTrans, C.n_cols, (do_trans_A) ? A.n_rows : A.n_cols, (use_alpha) ? alpha : T(1), A.mem, (do_trans_A) ? A.n_rows : C.n_cols, (use_beta) ? beta : T(0), C.memptr(), C.n_cols ); herk_helper::inplace_conj_copy_upper_tri_to_lower_tri(C); } #elif defined(ARMA_USE_BLAS) { if(use_beta == true) { typedef typename std::complex eT; // use a temporary matrix, as we can't assume that matrix C is already symmetric Mat D(C.n_rows, C.n_cols, arma_nozeros_indicator()); herk::apply_blas_type(D,A,alpha); // NOTE: assuming beta=1; this is okay for now, as currently glue_times only uses beta=1 arrayops::inplace_plus(C.memptr(), D.memptr(), C.n_elem); return; } arma_extra_debug_print("blas::herk()"); const char uplo = 'U'; const char trans_A = (do_trans_A) ? 'C' : 'N'; const blas_int n = blas_int(C.n_cols); const blas_int k = (do_trans_A) ? blas_int(A.n_rows) : blas_int(A.n_cols); const T local_alpha = (use_alpha) ? alpha : T(1); const T local_beta = (use_beta) ? beta : T(0); const blas_int lda = (do_trans_A) ? k : n; arma_extra_debug_print( arma_str::format("blas::herk(): trans_A = %c") % trans_A ); blas::herk ( &uplo, &trans_A, &n, &k, &local_alpha, A.mem, &lda, &local_beta, C.memptr(), &n // &ldc ); herk_helper::inplace_conj_copy_upper_tri_to_lower_tri(C); } #else { herk_emul::apply(C,A,alpha,beta); } #endif } } template inline static void apply( Mat& C, const TA& A, const eT alpha = eT(1), const eT beta = eT(0), const typename arma_not_cx::result* junk = nullptr ) { arma_ignore(C); arma_ignore(A); arma_ignore(alpha); arma_ignore(beta); arma_ignore(junk); // herk() cannot be used by non-complex matrices return; } template arma_inline static void apply ( Mat< std::complex >& C, const TA& A, const float alpha = float(1), const float beta = float(0) ) { herk::apply_blas_type(C,A,alpha,beta); } template arma_inline static void apply ( Mat< std::complex >& C, const TA& A, const double alpha = double(1), const double beta = double(0) ) { herk::apply_blas_type(C,A,alpha,beta); } }; //! @} RcppArmadillo/inst/include/armadillo_bits/arma_config.hpp0000644000176200001440000001137514124060717023357 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup arma_config //! @{ struct arma_config { #if defined(ARMA_MAT_PREALLOC) static constexpr uword mat_prealloc = (sword(ARMA_MAT_PREALLOC) > 0) ? uword(ARMA_MAT_PREALLOC) : 1; #else static constexpr uword mat_prealloc = 16; #endif #if defined(ARMA_OPENMP_THRESHOLD) static constexpr uword mp_threshold = (sword(ARMA_OPENMP_THRESHOLD) > 0) ? uword(ARMA_OPENMP_THRESHOLD) : 320; #else static constexpr uword mp_threshold = 320; #endif #if defined(ARMA_OPENMP_THREADS) static constexpr uword mp_threads = (sword(ARMA_OPENMP_THREADS) > 0) ? uword(ARMA_OPENMP_THREADS) : 8; #else static constexpr uword mp_threads = 8; #endif #if defined(ARMA_USE_ATLAS) static constexpr bool atlas = true; #else static constexpr bool atlas = false; #endif #if defined(ARMA_USE_LAPACK) static constexpr bool lapack = true; #else static constexpr bool lapack = false; #endif #if defined(ARMA_USE_BLAS) static constexpr bool blas = true; #else static constexpr bool blas = false; #endif #if defined(ARMA_USE_NEWARP) static constexpr bool newarp = true; #else static constexpr bool newarp = false; #endif #if defined(ARMA_USE_ARPACK) static constexpr bool arpack = true; #else static constexpr bool arpack = false; #endif #if defined(ARMA_USE_SUPERLU) static constexpr bool superlu = true; #else static constexpr bool superlu = false; #endif #if defined(ARMA_USE_HDF5) static constexpr bool hdf5 = true; #else static constexpr bool hdf5 = false; #endif #if defined(ARMA_NO_DEBUG) static constexpr bool debug = false; #else static constexpr bool debug = true; #endif #if defined(ARMA_EXTRA_DEBUG) static constexpr bool extra_debug = true; #else static constexpr bool extra_debug = false; #endif #if defined(ARMA_GOOD_COMPILER) static constexpr bool good_comp = true; #else static constexpr bool good_comp = false; #endif #if ( \ defined(ARMA_EXTRA_MAT_PROTO) || defined(ARMA_EXTRA_MAT_MEAT) \ || defined(ARMA_EXTRA_COL_PROTO) || defined(ARMA_EXTRA_COL_MEAT) \ || defined(ARMA_EXTRA_ROW_PROTO) || defined(ARMA_EXTRA_ROW_MEAT) \ || defined(ARMA_EXTRA_CUBE_PROTO) || defined(ARMA_EXTRA_CUBE_MEAT) \ || defined(ARMA_EXTRA_FIELD_PROTO) || defined(ARMA_EXTRA_FIELD_MEAT) \ || defined(ARMA_EXTRA_SPMAT_PROTO) || defined(ARMA_EXTRA_SPMAT_MEAT) \ || defined(ARMA_EXTRA_SPCOL_PROTO) || defined(ARMA_EXTRA_SPCOL_MEAT) \ || defined(ARMA_EXTRA_SPROW_PROTO) || defined(ARMA_EXTRA_SPROW_MEAT) \ || defined(ARMA_ALIEN_MEM_ALLOC_FUNCTION) \ || defined(ARMA_ALIEN_MEM_FREE_FUNCTION) \ ) static constexpr bool extra_code = true; #else static constexpr bool extra_code = false; #endif #if defined(ARMA_HAVE_CXX14) static constexpr bool cxx14 = true; #else static constexpr bool cxx14 = false; #endif #if defined(ARMA_HAVE_CXX17) static constexpr bool cxx17 = true; #else static constexpr bool cxx17 = false; #endif #if (!defined(ARMA_DONT_USE_STD_MUTEX)) static constexpr bool std_mutex = true; #else static constexpr bool std_mutex = false; #endif #if (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L)) static constexpr bool posix = true; #else static constexpr bool posix = false; #endif #if defined(ARMA_USE_WRAPPER) static constexpr bool wrapper = true; #else static constexpr bool wrapper = false; #endif #if defined(ARMA_USE_OPENMP) static constexpr bool openmp = true; #else static constexpr bool openmp = false; #endif #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) static constexpr bool hidden_args = true; #else static constexpr bool hidden_args = false; #endif static constexpr uword warn_level = (sword(ARMA_WARN_LEVEL) > 0) ? uword(ARMA_WARN_LEVEL) : 0; }; //! @} RcppArmadillo/inst/include/armadillo_bits/SpToDOp_meat.hpp0000644000176200001440000000243514124060717023405 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpToDOp //! @{ template inline SpToDOp::SpToDOp(const T1& in_m) : m(in_m) { arma_extra_debug_sigprint(); } template inline SpToDOp::SpToDOp(const T1& in_m, const typename T1::elem_type in_aux) : m(in_m) , aux(in_aux) { arma_extra_debug_sigprint(); } template inline SpToDOp::~SpToDOp() { arma_extra_debug_sigprint(); } //! @} RcppArmadillo/inst/include/armadillo_bits/mtOp_meat.hpp0000644000176200001440000000500414124060717023027 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup mtOp //! @{ template inline mtOp::mtOp(const T1& in_m) : m(in_m) { arma_extra_debug_sigprint(); } template inline mtOp::mtOp(const T1& in_m, const typename T1::elem_type in_aux) : m(in_m) , aux(in_aux) { arma_extra_debug_sigprint(); } template inline mtOp::mtOp(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b) : m(in_m) , aux_uword_a(in_aux_uword_a) , aux_uword_b(in_aux_uword_b) { arma_extra_debug_sigprint(); } template inline mtOp::mtOp(const T1& in_m, const typename T1::elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b) : m(in_m) , aux(in_aux) , aux_uword_a(in_aux_uword_a) , aux_uword_b(in_aux_uword_b) { arma_extra_debug_sigprint(); } template inline mtOp::mtOp(const char junk, const T1& in_m, const out_eT in_aux) : m(in_m) , aux_out_eT(in_aux) { arma_ignore(junk); arma_extra_debug_sigprint(); } template inline mtOp::mtOp(const mtOp_dual_aux_indicator&, const T1& in_m, const typename T1::elem_type in_aux_a, const out_eT in_aux_b) : m (in_m ) , aux (in_aux_a) , aux_out_eT(in_aux_b) { arma_extra_debug_sigprint(); } template inline mtOp::~mtOp() { arma_extra_debug_sigprint(); } //! @} RcppArmadillo/inst/include/armadillo_bits/SpProxy.hpp0000644000176200001440000007573214124060717022545 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpProxy //! @{ // TODO: clarify and check which variables and functions are valid when 'use_iterator' is either true or false // within each specialisation of the Proxy class: // // elem_type = the type of the elements obtained from object Q // pod_type = the underlying type of elements if elem_type is std::complex // stored_type = the type of the Q object // // const_iterator_type = the type of iterator provided by begin() and begin_col() // const_row_iterator_type = the type of iterator provided by begin_row() // // use_iterator = boolean indicating that the provided iterators must be used for accessing elements // Q_is_generated = boolean indicating that the Q object was generated by SpProxy // // is_row = boolean indicating whether the Q object can be treated a row vector // is_col = boolean indicating whether the Q object can be treated a column vector // is_xvec = boolean indicating whether the Q object is a vector with unknown orientation // // Q = object that can be unwrapped via the unwrap_spmat family of classes (ie. Q must be convertible to SpMat) // // get_n_rows() = return the number of rows in Q // get_n_cols() = return the number of columns in Q // get_n_elem() = return the number of elements in Q // get_n_nonzero() = return the number of non-zero elements in Q // // operator[i] = linear element accessor; valid only if the 'use_iterator' boolean is false // at(row,col) = access elements via (row,col); valid only if the 'use_iterator' boolean is false // // get_values() = return pointer to the CSC values array in Q; valid only if the 'use_iterator' boolean is false // get_row_indices() = return pointer to the CSC row indices array in Q; valid only if the 'use_iterator' boolean is false // get_col_ptrs() = return pointer to the CSC column pointers array in Q; valid only if the 'use_iterator' boolean is false // // begin() = column-wise iterator indicating the first element in Q // begin_col(col_num) = column-wise iterator indicating the first element in column 'col_num' in Q // begin_row(row_num = 0) = row-wise iterator indicating the first element in row 'row_num' in Q // // end() = column-wise iterator indicating the "one-past-end" element in Q // end_row() = row-wise iterator indicating the "one-past-end" element in Q // end_row(row_num) = row-wise iterator indicating the "one-past-end" element in row 'row_num' in Q // // is_alias(X) = return true/false indicating whether the Q object aliases matrix X template struct SpProxy< SpMat > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef SpMat stored_type; typedef typename SpMat::const_iterator const_iterator_type; typedef typename SpMat::const_row_iterator const_row_iterator_type; static constexpr bool use_iterator = false; static constexpr bool Q_is_generated = false; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; arma_aligned const SpMat& Q; inline explicit SpProxy(const SpMat& A) : Q(A) { arma_extra_debug_sigprint(); Q.sync(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } arma_inline elem_type operator[](const uword i) const { return Q[i]; } arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); } arma_inline const eT* get_values() const { return Q.values; } arma_inline const uword* get_row_indices() const { return Q.row_indices; } arma_inline const uword* get_col_ptrs() const { return Q.col_ptrs; } arma_inline const_iterator_type begin() const { return Q.begin(); } arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); } arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } arma_inline const_iterator_type end() const { return Q.end(); } arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } template arma_inline bool is_alias(const SpMat& X) const { return (void_ptr(&Q) == void_ptr(&X)); } }; template struct SpProxy< SpCol > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef SpCol stored_type; typedef typename SpCol::const_iterator const_iterator_type; typedef typename SpCol::const_row_iterator const_row_iterator_type; static constexpr bool use_iterator = false; static constexpr bool Q_is_generated = false; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const SpCol& Q; inline explicit SpProxy(const SpCol& A) : Q(A) { arma_extra_debug_sigprint(); Q.sync(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } arma_inline elem_type operator[](const uword i) const { return Q[i]; } arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); } arma_inline const eT* get_values() const { return Q.values; } arma_inline const uword* get_row_indices() const { return Q.row_indices; } arma_inline const uword* get_col_ptrs() const { return Q.col_ptrs; } arma_inline const_iterator_type begin() const { return Q.begin(); } arma_inline const_iterator_type begin_col(const uword) const { return Q.begin(); } arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } arma_inline const_iterator_type end() const { return Q.end(); } arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } template arma_inline bool is_alias(const SpMat& X) const { return (void_ptr(&Q) == void_ptr(&X)); } }; template struct SpProxy< SpRow > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef SpRow stored_type; typedef typename SpRow::const_iterator const_iterator_type; typedef typename SpRow::const_row_iterator const_row_iterator_type; static constexpr bool use_iterator = false; static constexpr bool Q_is_generated = false; static constexpr bool is_row = true; static constexpr bool is_col = false; static constexpr bool is_xvec = false; arma_aligned const SpRow& Q; inline explicit SpProxy(const SpRow& A) : Q(A) { arma_extra_debug_sigprint(); Q.sync(); } arma_inline uword get_n_rows() const { return 1; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } arma_inline elem_type operator[](const uword i) const { return Q[i]; } arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); } arma_inline const eT* get_values() const { return Q.values; } arma_inline const uword* get_row_indices() const { return Q.row_indices; } arma_inline const uword* get_col_ptrs() const { return Q.col_ptrs; } arma_inline const_iterator_type begin() const { return Q.begin(); } arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); } arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } arma_inline const_iterator_type end() const { return Q.end(); } arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } template arma_inline bool is_alias(const SpMat& X) const { return (void_ptr(&Q) == void_ptr(&X)); } }; template struct SpProxy< SpSubview > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef SpSubview stored_type; typedef typename SpSubview::const_iterator const_iterator_type; typedef typename SpSubview::const_row_iterator const_row_iterator_type; static constexpr bool use_iterator = true; static constexpr bool Q_is_generated = false; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; arma_aligned const SpSubview& Q; inline explicit SpProxy(const SpSubview& A) : Q(A) { arma_extra_debug_sigprint(); Q.m.sync(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } arma_inline elem_type operator[](const uword i) const { return Q[i]; } arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); } arma_inline const eT* get_values() const { return Q.m.values; } arma_inline const uword* get_row_indices() const { return Q.m.row_indices; } arma_inline const uword* get_col_ptrs() const { return Q.m.col_ptrs; } arma_inline const_iterator_type begin() const { return Q.begin(); } arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); } arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } arma_inline const_iterator_type end() const { return Q.end(); } arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } template arma_inline bool is_alias(const SpMat& X) const { return (void_ptr(&Q.m) == void_ptr(&X)); } }; template struct SpProxy< SpSubview_col > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef SpSubview_col stored_type; typedef typename SpSubview::const_iterator const_iterator_type; typedef typename SpSubview::const_row_iterator const_row_iterator_type; static constexpr bool use_iterator = true; static constexpr bool Q_is_generated = false; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const SpSubview_col& Q; inline explicit SpProxy(const SpSubview_col& A) : Q(A) { arma_extra_debug_sigprint(); Q.m.sync(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } arma_inline elem_type operator[](const uword i) const { return Q.at(i, 0); } arma_inline elem_type at (const uword row, const uword) const { return Q.at(row, 0); } arma_inline const eT* get_values() const { return Q.m.values; } arma_inline const uword* get_row_indices() const { return Q.m.row_indices; } arma_inline const uword* get_col_ptrs() const { return Q.m.col_ptrs; } arma_inline const_iterator_type begin() const { return Q.begin(); } arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); } arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } arma_inline const_iterator_type end() const { return Q.end(); } arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } template arma_inline bool is_alias(const SpMat& X) const { return (void_ptr(&Q.m) == void_ptr(&X)); } }; template struct SpProxy< SpSubview_col_list > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef SpMat stored_type; typedef typename SpMat::const_iterator const_iterator_type; typedef typename SpMat::const_row_iterator const_row_iterator_type; static constexpr bool use_iterator = false; static constexpr bool Q_is_generated = true; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; arma_aligned const SpMat Q; inline explicit SpProxy(const SpSubview_col_list& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } arma_inline elem_type operator[](const uword i) const { return Q[i]; } arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); } arma_inline const eT* get_values() const { return Q.values; } arma_inline const uword* get_row_indices() const { return Q.row_indices; } arma_inline const uword* get_col_ptrs() const { return Q.col_ptrs; } arma_inline const_iterator_type begin() const { return Q.begin(); } arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); } arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } arma_inline const_iterator_type end() const { return Q.end(); } arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } template constexpr bool is_alias(const SpMat&) const { return false; } }; template struct SpProxy< SpSubview_row > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef SpSubview_row stored_type; typedef typename SpSubview::const_iterator const_iterator_type; typedef typename SpSubview::const_row_iterator const_row_iterator_type; static constexpr bool use_iterator = true; static constexpr bool Q_is_generated = false; static constexpr bool is_row = true; static constexpr bool is_col = false; static constexpr bool is_xvec = false; arma_aligned const SpSubview_row& Q; inline explicit SpProxy(const SpSubview_row& A) : Q(A) { arma_extra_debug_sigprint(); Q.m.sync(); } arma_inline uword get_n_rows() const { return 1; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } arma_inline elem_type operator[](const uword i) const { return Q.at(0, i ); } arma_inline elem_type at (const uword, const uword col) const { return Q.at(0, col); } arma_inline const eT* get_values() const { return Q.m.values; } arma_inline const uword* get_row_indices() const { return Q.m.row_indices; } arma_inline const uword* get_col_ptrs() const { return Q.m.col_ptrs; } arma_inline const_iterator_type begin() const { return Q.begin(); } arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); } arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } arma_inline const_iterator_type end() const { return Q.end(); } arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } template arma_inline bool is_alias(const SpMat& X) const { return (void_ptr(&Q.m) == void_ptr(&X)); } }; template struct SpProxy< spdiagview > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef SpMat stored_type; typedef typename SpMat::const_iterator const_iterator_type; typedef typename SpMat::const_row_iterator const_row_iterator_type; static constexpr bool use_iterator = false; static constexpr bool Q_is_generated = true; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const SpMat Q; inline explicit SpProxy(const spdiagview& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } arma_inline elem_type operator[](const uword i) const { return Q[i]; } arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); } arma_inline const eT* get_values() const { return Q.values; } arma_inline const uword* get_row_indices() const { return Q.row_indices; } arma_inline const uword* get_col_ptrs() const { return Q.col_ptrs; } arma_inline const_iterator_type begin() const { return Q.begin(); } arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); } arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } arma_inline const_iterator_type end() const { return Q.end(); } arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } template constexpr bool is_alias(const SpMat&) const { return false; } }; template struct SpProxy< SpOp > { typedef typename T1::elem_type elem_type; typedef typename T1::elem_type eT; typedef typename get_pod_type::result pod_type; typedef SpMat stored_type; typedef typename SpMat::const_iterator const_iterator_type; typedef typename SpMat::const_row_iterator const_row_iterator_type; static constexpr bool use_iterator = false; static constexpr bool Q_is_generated = true; static constexpr bool is_row = SpOp::is_row; static constexpr bool is_col = SpOp::is_col; static constexpr bool is_xvec = SpOp::is_xvec; arma_aligned const SpMat Q; inline explicit SpProxy(const SpOp& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; } arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } arma_inline elem_type operator[](const uword i) const { return Q[i]; } arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); } arma_inline const eT* get_values() const { return Q.values; } arma_inline const uword* get_row_indices() const { return Q.row_indices; } arma_inline const uword* get_col_ptrs() const { return Q.col_ptrs; } arma_inline const_iterator_type begin() const { return Q.begin(); } arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); } arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } arma_inline const_iterator_type end() const { return Q.end(); } arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } template constexpr bool is_alias(const SpMat&) const { return false; } }; template struct SpProxy< SpGlue > { typedef typename T1::elem_type elem_type; typedef typename T1::elem_type eT; typedef typename get_pod_type::result pod_type; typedef SpMat stored_type; typedef typename SpMat::const_iterator const_iterator_type; typedef typename SpMat::const_row_iterator const_row_iterator_type; static constexpr bool use_iterator = false; static constexpr bool Q_is_generated = true; static constexpr bool is_row = SpGlue::is_row; static constexpr bool is_col = SpGlue::is_col; static constexpr bool is_xvec = SpGlue::is_xvec; arma_aligned const SpMat Q; inline explicit SpProxy(const SpGlue& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; } arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } arma_inline elem_type operator[](const uword i) const { return Q[i]; } arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); } arma_inline const eT* get_values() const { return Q.values; } arma_inline const uword* get_row_indices() const { return Q.row_indices; } arma_inline const uword* get_col_ptrs() const { return Q.col_ptrs; } arma_inline const_iterator_type begin() const { return Q.begin(); } arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); } arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } arma_inline const_iterator_type end() const { return Q.end(); } arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } template constexpr bool is_alias(const SpMat&) const { return false; } }; template struct SpProxy< mtSpOp > { typedef out_eT elem_type; typedef typename get_pod_type::result pod_type; typedef SpMat stored_type; typedef typename SpMat::const_iterator const_iterator_type; typedef typename SpMat::const_row_iterator const_row_iterator_type; static constexpr bool use_iterator = false; static constexpr bool Q_is_generated = true; static constexpr bool is_row = mtSpOp::is_row; static constexpr bool is_col = mtSpOp::is_col; static constexpr bool is_xvec = mtSpOp::is_xvec; arma_aligned const SpMat Q; inline explicit SpProxy(const mtSpOp& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; } arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } arma_inline elem_type operator[](const uword i) const { return Q[i]; } arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); } arma_inline const out_eT* get_values() const { return Q.values; } arma_inline const uword* get_row_indices() const { return Q.row_indices; } arma_inline const uword* get_col_ptrs() const { return Q.col_ptrs; } arma_inline const_iterator_type begin() const { return Q.begin(); } arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); } arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } arma_inline const_iterator_type end() const { return Q.end(); } arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } template constexpr bool is_alias(const SpMat&) const { return false; } }; template struct SpProxy< mtSpGlue > { typedef out_eT elem_type; typedef typename get_pod_type::result pod_type; typedef SpMat stored_type; typedef typename SpMat::const_iterator const_iterator_type; typedef typename SpMat::const_row_iterator const_row_iterator_type; static constexpr bool use_iterator = false; static constexpr bool Q_is_generated = true; static constexpr bool is_row = mtSpGlue::is_row; static constexpr bool is_col = mtSpGlue::is_col; static constexpr bool is_xvec = mtSpGlue::is_xvec; arma_aligned const SpMat Q; inline explicit SpProxy(const mtSpGlue& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; } arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } arma_inline elem_type operator[](const uword i) const { return Q[i]; } arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); } arma_inline const out_eT* get_values() const { return Q.values; } arma_inline const uword* get_row_indices() const { return Q.row_indices; } arma_inline const uword* get_col_ptrs() const { return Q.col_ptrs; } arma_inline const_iterator_type begin() const { return Q.begin(); } arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); } arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } arma_inline const_iterator_type end() const { return Q.end(); } arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } template constexpr bool is_alias(const SpMat&) const { return false; } }; //! @} RcppArmadillo/inst/include/armadillo_bits/mul_gemm.hpp0000644000176200001440000003106214124060717022707 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup gemm //! @{ //! for tiny square matrices, size <= 4x4 template class gemm_emul_tinysq { public: template arma_cold inline static void apply ( Mat& C, const TA& A, const TB& B, const eT alpha = eT(1), const eT beta = eT(0) ) { arma_extra_debug_sigprint(); switch(A.n_rows) { case 4: gemv_emul_tinysq::apply( C.colptr(3), A, B.colptr(3), alpha, beta ); // fallthrough case 3: gemv_emul_tinysq::apply( C.colptr(2), A, B.colptr(2), alpha, beta ); // fallthrough case 2: gemv_emul_tinysq::apply( C.colptr(1), A, B.colptr(1), alpha, beta ); // fallthrough case 1: gemv_emul_tinysq::apply( C.colptr(0), A, B.colptr(0), alpha, beta ); // fallthrough default: ; } } }; //! emulation of gemm(), for non-complex matrices only, as it assumes only simple transposes (ie. doesn't do hermitian transposes) template class gemm_emul_large { public: template arma_hot inline static void apply ( Mat& C, const TA& A, const TB& B, const eT alpha = eT(1), const eT beta = eT(0) ) { arma_extra_debug_sigprint(); const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; if( (do_trans_A == false) && (do_trans_B == false) ) { arma_aligned podarray tmp(A_n_cols); eT* A_rowdata = tmp.memptr(); for(uword row_A=0; row_A < A_n_rows; ++row_A) { tmp.copy_row(A, row_A); for(uword col_B=0; col_B < B_n_cols; ++col_B) { const eT acc = op_dot::direct_dot_arma(B_n_rows, A_rowdata, B.colptr(col_B)); if( (use_alpha == false) && (use_beta == false) ) { C.at(row_A,col_B) = acc; } else if( (use_alpha == true ) && (use_beta == false) ) { C.at(row_A,col_B) = alpha*acc; } else if( (use_alpha == false) && (use_beta == true ) ) { C.at(row_A,col_B) = acc + beta*C.at(row_A,col_B); } else if( (use_alpha == true ) && (use_beta == true ) ) { C.at(row_A,col_B) = alpha*acc + beta*C.at(row_A,col_B); } } } } else if( (do_trans_A == true) && (do_trans_B == false) ) { for(uword col_A=0; col_A < A_n_cols; ++col_A) { // col_A is interpreted as row_A when storing the results in matrix C const eT* A_coldata = A.colptr(col_A); for(uword col_B=0; col_B < B_n_cols; ++col_B) { const eT acc = op_dot::direct_dot_arma(B_n_rows, A_coldata, B.colptr(col_B)); if( (use_alpha == false) && (use_beta == false) ) { C.at(col_A,col_B) = acc; } else if( (use_alpha == true ) && (use_beta == false) ) { C.at(col_A,col_B) = alpha*acc; } else if( (use_alpha == false) && (use_beta == true ) ) { C.at(col_A,col_B) = acc + beta*C.at(col_A,col_B); } else if( (use_alpha == true ) && (use_beta == true ) ) { C.at(col_A,col_B) = alpha*acc + beta*C.at(col_A,col_B); } } } } else if( (do_trans_A == false) && (do_trans_B == true) ) { Mat BB; op_strans::apply_mat_noalias(BB, B); gemm_emul_large::apply(C, A, BB, alpha, beta); } else if( (do_trans_A == true) && (do_trans_B == true) ) { // mat B_tmp = trans(B); // dgemm_arma::apply(C, A, B_tmp, alpha, beta); // By using the trans(A)*trans(B) = trans(B*A) equivalency, // transpose operations are not needed arma_aligned podarray tmp(B.n_cols); eT* B_rowdata = tmp.memptr(); for(uword row_B=0; row_B < B_n_rows; ++row_B) { tmp.copy_row(B, row_B); for(uword col_A=0; col_A < A_n_cols; ++col_A) { const eT acc = op_dot::direct_dot_arma(A_n_rows, B_rowdata, A.colptr(col_A)); if( (use_alpha == false) && (use_beta == false) ) { C.at(col_A,row_B) = acc; } else if( (use_alpha == true ) && (use_beta == false) ) { C.at(col_A,row_B) = alpha*acc; } else if( (use_alpha == false) && (use_beta == true ) ) { C.at(col_A,row_B) = acc + beta*C.at(col_A,row_B); } else if( (use_alpha == true ) && (use_beta == true ) ) { C.at(col_A,row_B) = alpha*acc + beta*C.at(col_A,row_B); } } } } } }; template class gemm_emul { public: template arma_hot inline static void apply ( Mat& C, const TA& A, const TB& B, const eT alpha = eT(1), const eT beta = eT(0), const typename arma_not_cx::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); gemm_emul_large::apply(C, A, B, alpha, beta); } template arma_hot inline static void apply ( Mat& C, const Mat& A, const Mat& B, const eT alpha = eT(1), const eT beta = eT(0), const typename arma_cx_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); // "better than nothing" handling of hermitian transposes for complex number matrices Mat tmp_A; Mat tmp_B; if(do_trans_A) { op_htrans::apply_mat_noalias(tmp_A, A); } if(do_trans_B) { op_htrans::apply_mat_noalias(tmp_B, B); } const Mat& AA = (do_trans_A == false) ? A : tmp_A; const Mat& BB = (do_trans_B == false) ? B : tmp_B; gemm_emul_large::apply(C, AA, BB, alpha, beta); } }; //! \brief //! Wrapper for ATLAS/BLAS dgemm function, using template arguments to control the arguments passed to dgemm. //! Matrix 'C' is assumed to have been set to the correct size (ie. taking into account transposes) template class gemm { public: template inline static void apply_blas_type( Mat& C, const TA& A, const TB& B, const eT alpha = eT(1), const eT beta = eT(0) ) { arma_extra_debug_sigprint(); if( (A.n_rows <= 4) && (A.n_rows == A.n_cols) && (A.n_rows == B.n_rows) && (B.n_rows == B.n_cols) && (is_cx::no) ) { if(do_trans_B == false) { gemm_emul_tinysq::apply(C, A, B, alpha, beta); } else { Mat BB(B.n_rows, B.n_rows, arma_nozeros_indicator()); op_strans::apply_mat_noalias_tinysq(BB, B); gemm_emul_tinysq::apply(C, A, BB, alpha, beta); } } else { #if defined(ARMA_USE_ATLAS) { arma_extra_debug_print("atlas::cblas_gemm()"); arma_debug_assert_atlas_size(A,B); atlas::cblas_gemm ( atlas::CblasColMajor, (do_trans_A) ? ( is_cx::yes ? CblasConjTrans : atlas::CblasTrans ) : atlas::CblasNoTrans, (do_trans_B) ? ( is_cx::yes ? CblasConjTrans : atlas::CblasTrans ) : atlas::CblasNoTrans, C.n_rows, C.n_cols, (do_trans_A) ? A.n_rows : A.n_cols, (use_alpha) ? alpha : eT(1), A.mem, (do_trans_A) ? A.n_rows : C.n_rows, B.mem, (do_trans_B) ? C.n_cols : ( (do_trans_A) ? A.n_rows : A.n_cols ), (use_beta) ? beta : eT(0), C.memptr(), C.n_rows ); } #elif defined(ARMA_USE_BLAS) { arma_extra_debug_print("blas::gemm()"); arma_debug_assert_blas_size(A,B); const char trans_A = (do_trans_A) ? ( is_cx::yes ? 'C' : 'T' ) : 'N'; const char trans_B = (do_trans_B) ? ( is_cx::yes ? 'C' : 'T' ) : 'N'; const blas_int m = blas_int(C.n_rows); const blas_int n = blas_int(C.n_cols); const blas_int k = (do_trans_A) ? blas_int(A.n_rows) : blas_int(A.n_cols); const eT local_alpha = (use_alpha) ? alpha : eT(1); const blas_int lda = (do_trans_A) ? k : m; const blas_int ldb = (do_trans_B) ? n : k; const eT local_beta = (use_beta) ? beta : eT(0); arma_extra_debug_print( arma_str::format("blas::gemm(): trans_A = %c") % trans_A ); arma_extra_debug_print( arma_str::format("blas::gemm(): trans_B = %c") % trans_B ); blas::gemm ( &trans_A, &trans_B, &m, &n, &k, &local_alpha, A.mem, &lda, B.mem, &ldb, &local_beta, C.memptr(), &m ); } #else { gemm_emul::apply(C,A,B,alpha,beta); } #endif } } //! immediate multiplication of matrices A and B, storing the result in C template inline static void apply( Mat& C, const TA& A, const TB& B, const eT alpha = eT(1), const eT beta = eT(0) ) { gemm_emul::apply(C,A,B,alpha,beta); } template arma_inline static void apply ( Mat& C, const TA& A, const TB& B, const float alpha = float(1), const float beta = float(0) ) { gemm::apply_blas_type(C,A,B,alpha,beta); } template arma_inline static void apply ( Mat& C, const TA& A, const TB& B, const double alpha = double(1), const double beta = double(0) ) { gemm::apply_blas_type(C,A,B,alpha,beta); } template arma_inline static void apply ( Mat< std::complex >& C, const TA& A, const TB& B, const std::complex alpha = std::complex(1), const std::complex beta = std::complex(0) ) { gemm::apply_blas_type(C,A,B,alpha,beta); } template arma_inline static void apply ( Mat< std::complex >& C, const TA& A, const TB& B, const std::complex alpha = std::complex(1), const std::complex beta = std::complex(0) ) { gemm::apply_blas_type(C,A,B,alpha,beta); } }; //! @} RcppArmadillo/inst/include/armadillo_bits/Row_bones.hpp0000644000176200001440000002603614124060717023047 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup Row //! @{ //! Class for row vectors (matrices with only one row) template class Row : public Mat { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_col = false; static constexpr bool is_row = true; static constexpr bool is_xvec = false; inline Row(); inline Row(const Row& X); inline explicit Row(const uword N); inline explicit Row(const uword in_rows, const uword in_cols); inline explicit Row(const SizeMat& s); template inline explicit Row(const uword N, const arma_initmode_indicator&); template inline explicit Row(const uword in_rows, const uword in_cols, const arma_initmode_indicator&); template inline explicit Row(const SizeMat& s, const arma_initmode_indicator&); template inline Row(const uword n_elem, const fill::fill_class& f); template inline Row(const uword in_rows, const uword in_cols, const fill::fill_class& f); template inline Row(const SizeMat& s, const fill::fill_class& f); inline Row(const uword N, const fill::scalar_holder f); inline Row(const uword in_rows, const uword in_cols, const fill::scalar_holder f); inline Row(const SizeMat& s, const fill::scalar_holder f); inline Row(const char* text); inline Row& operator=(const char* text); inline Row(const std::string& text); inline Row& operator=(const std::string& text); inline Row(const std::vector& x); inline Row& operator=(const std::vector& x); inline Row(const std::initializer_list& list); inline Row& operator=(const std::initializer_list& list); inline Row(Row&& m); inline Row& operator=(Row&& m); inline Row& operator=(const eT val); inline Row& operator=(const Row& X); template inline Row(const Base& X); template inline Row& operator=(const Base& X); template inline explicit Row(const SpBase& X); template inline Row& operator=(const SpBase& X); inline Row( eT* aux_mem, const uword aux_length, const bool copy_aux_mem = true, const bool strict = false); inline Row(const eT* aux_mem, const uword aux_length); template inline explicit Row(const Base& A, const Base& B); template inline Row(const BaseCube& X); template inline Row& operator=(const BaseCube& X); inline Row(const subview_cube& X); inline Row& operator=(const subview_cube& X); arma_cold inline mat_injector operator<<(const eT val); arma_inline arma_warn_unused const Op,op_htrans> t() const; arma_inline arma_warn_unused const Op,op_htrans> ht() const; arma_inline arma_warn_unused const Op,op_strans> st() const; arma_inline arma_warn_unused const Op,op_strans> as_col() const; arma_inline subview_row col(const uword col_num); arma_inline const subview_row col(const uword col_num) const; using Mat::cols; using Mat::operator(); arma_inline subview_row cols(const uword in_col1, const uword in_col2); arma_inline const subview_row cols(const uword in_col1, const uword in_col2) const; arma_inline subview_row subvec(const uword in_col1, const uword in_col2); arma_inline const subview_row subvec(const uword in_col1, const uword in_col2) const; arma_inline subview_row cols(const span& col_span); arma_inline const subview_row cols(const span& col_span) const; arma_inline subview_row subvec(const span& col_span); arma_inline const subview_row subvec(const span& col_span) const; arma_inline subview_row operator()(const span& col_span); arma_inline const subview_row operator()(const span& col_span) const; arma_inline subview_row subvec(const uword start_col, const SizeMat& s); arma_inline const subview_row subvec(const uword start_col, const SizeMat& s) const; arma_inline subview_row head(const uword N); arma_inline const subview_row head(const uword N) const; arma_inline subview_row tail(const uword N); arma_inline const subview_row tail(const uword N) const; arma_inline subview_row head_cols(const uword N); arma_inline const subview_row head_cols(const uword N) const; arma_inline subview_row tail_cols(const uword N); arma_inline const subview_row tail_cols(const uword N) const; inline void shed_col (const uword col_num); inline void shed_cols(const uword in_col1, const uword in_col2); template inline void shed_cols(const Base& indices); inline void insert_cols(const uword col_num, const uword N, const bool set_to_zero = true); template inline void insert_cols(const uword col_num, const Base& X); arma_inline arma_warn_unused eT& at(const uword i); arma_inline arma_warn_unused const eT& at(const uword i) const; arma_inline arma_warn_unused eT& at(const uword in_row, const uword in_col); arma_inline arma_warn_unused const eT& at(const uword in_row, const uword in_col) const; typedef eT* row_iterator; typedef const eT* const_row_iterator; inline row_iterator begin_row(const uword row_num); inline const_row_iterator begin_row(const uword row_num) const; inline row_iterator end_row (const uword row_num); inline const_row_iterator end_row (const uword row_num) const; template class fixed; protected: inline Row(const arma_fixed_indicator&, const uword in_n_elem, const eT* in_mem); public: #ifdef ARMA_EXTRA_ROW_PROTO #include ARMA_INCFILE_WRAP(ARMA_EXTRA_ROW_PROTO) #endif }; template template class Row::fixed : public Row { private: static constexpr bool use_extra = (fixed_n_elem > arma_config::mat_prealloc); arma_align_mem eT mem_local_extra[ (use_extra) ? fixed_n_elem : 1 ]; public: typedef fixed Row_fixed_type; typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_col = false; static constexpr bool is_row = true; static constexpr bool is_xvec = false; static const uword n_rows; // value provided below the class definition static const uword n_cols; // value provided below the class definition static const uword n_elem; // value provided below the class definition arma_inline fixed(); arma_inline fixed(const fixed& X); inline fixed(const subview_cube& X); inline fixed(const fill::scalar_holder f); template inline fixed(const fill::fill_class& f); template inline fixed(const Base& A); template inline fixed(const Base& A, const Base& B); inline fixed(const eT* aux_mem); inline fixed(const char* text); inline fixed(const std::string& text); template inline Row& operator=(const Base& A); inline Row& operator=(const eT val); inline Row& operator=(const char* text); inline Row& operator=(const std::string& text); inline Row& operator=(const subview_cube& X); using Row::operator(); inline fixed(const std::initializer_list& list); inline Row& operator=(const std::initializer_list& list); arma_inline Row& operator=(const fixed& X); #if defined(ARMA_GOOD_COMPILER) template inline Row& operator=(const eOp& X); template inline Row& operator=(const eGlue& X); #endif arma_inline arma_warn_unused const Op< Row_fixed_type, op_htrans > t() const; arma_inline arma_warn_unused const Op< Row_fixed_type, op_htrans > ht() const; arma_inline arma_warn_unused const Op< Row_fixed_type, op_strans > st() const; arma_inline arma_warn_unused const eT& at_alt (const uword i) const; arma_inline arma_warn_unused eT& operator[] (const uword i); arma_inline arma_warn_unused const eT& operator[] (const uword i) const; arma_inline arma_warn_unused eT& at (const uword i); arma_inline arma_warn_unused const eT& at (const uword i) const; arma_inline arma_warn_unused eT& operator() (const uword i); arma_inline arma_warn_unused const eT& operator() (const uword i) const; arma_inline arma_warn_unused eT& at (const uword in_row, const uword in_col); arma_inline arma_warn_unused const eT& at (const uword in_row, const uword in_col) const; arma_inline arma_warn_unused eT& operator() (const uword in_row, const uword in_col); arma_inline arma_warn_unused const eT& operator() (const uword in_row, const uword in_col) const; arma_inline arma_warn_unused eT* memptr(); arma_inline arma_warn_unused const eT* memptr() const; arma_hot inline const Row& fill(const eT val); arma_hot inline const Row& zeros(); arma_hot inline const Row& ones(); }; // these definitions are outside of the class due to bizarre C++ rules; // C++17 has inline variables to address this shortcoming template template const uword Row::fixed::n_rows = 1u; template template const uword Row::fixed::n_cols = fixed_n_elem; template template const uword Row::fixed::n_elem = fixed_n_elem; //! @} RcppArmadillo/inst/include/armadillo_bits/spglue_merge_meat.hpp0000644000176200001440000003421314124060717024572 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_merge //! @{ template arma_hot inline void spglue_merge::subview_merge(SpSubview& sv, const SpMat& B) { arma_extra_debug_sigprint(); if(sv.n_elem == 0) { return; } if(B.n_nonzero == 0) { sv.zeros(); return; } SpMat& A = access::rw(sv.m); const uword merge_n_nonzero = A.n_nonzero - sv.n_nonzero + B.n_nonzero; const uword sv_row_start = sv.aux_row1; const uword sv_col_start = sv.aux_col1; const uword sv_row_end = sv.aux_row1 + sv.n_rows - 1; const uword sv_col_end = sv.aux_col1 + sv.n_cols - 1; if(A.n_nonzero == sv.n_nonzero) { // A is either all zeros or has all of its elements in the subview // so the merge is equivalent to overwrite of A SpMat tmp(arma_reserve_indicator(), A.n_rows, A.n_cols, B.n_nonzero); typename SpMat::const_iterator B_it = B.begin(); typename SpMat::const_iterator B_it_end = B.end(); uword tmp_count = 0; for(; B_it != B_it_end; ++B_it) { access::rw(tmp.values[tmp_count]) = (*B_it); access::rw(tmp.row_indices[tmp_count]) = B_it.row() + sv_row_start; access::rw(tmp.col_ptrs[B_it.col() + sv_col_start + 1])++; ++tmp_count; } for(uword i=0; i < tmp.n_cols; ++i) { access::rw(tmp.col_ptrs[i + 1]) += tmp.col_ptrs[i]; } A.steal_mem(tmp); access::rw(sv.n_nonzero) = B.n_nonzero; return; } if(sv.n_nonzero > (A.n_nonzero/2)) { // A has most of its elements in the subview, // so regenerate A with zeros in the subview region // in order to increase merging efficiency sv.zeros(); } SpMat out(arma_reserve_indicator(), A.n_rows, A.n_cols, merge_n_nonzero); typename SpMat::const_iterator x_it = A.begin(); typename SpMat::const_iterator x_end = A.end(); typename SpMat::const_iterator y_it = B.begin(); typename SpMat::const_iterator y_end = B.end(); uword count = 0; bool x_it_valid = (x_it != x_end); bool y_it_valid = (y_it != y_end); while(x_it_valid || y_it_valid) { eT out_val = eT(0); const uword x_it_row = (x_it_valid) ? uword(x_it.row()) : uword(0); const uword x_it_col = (x_it_valid) ? uword(x_it.col()) : uword(0); const uword y_it_row = (y_it_valid) ? uword(sv_row_start + y_it.row()) : uword(0); const uword y_it_col = (y_it_valid) ? uword(sv_col_start + y_it.col()) : uword(0); bool use_y_loc = false; if(x_it_valid && y_it_valid) { if( (x_it_row == y_it_row) && (x_it_col == y_it_col) ) { out_val = (*y_it); ++x_it; ++y_it; } else { if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end { const bool x_inside_box = ((x_it_row >= sv_row_start) && (x_it_row <= sv_row_end)) && ((x_it_col >= sv_col_start) && (x_it_col <= sv_col_end)); out_val = (x_inside_box) ? eT(0) : (*x_it); ++x_it; } else { out_val = (*y_it); ++y_it; use_y_loc = true; } } } else if(x_it_valid) { const bool x_inside_box = ((x_it_row >= sv_row_start) && (x_it_row <= sv_row_end)) && ((x_it_col >= sv_col_start) && (x_it_col <= sv_col_end)); out_val = (x_inside_box) ? eT(0) : (*x_it); ++x_it; } else if(y_it_valid) { out_val = (*y_it); ++y_it; use_y_loc = true; } if(out_val != eT(0)) { access::rw(out.values[count]) = out_val; const uword out_row = (use_y_loc == false) ? x_it_row : y_it_row; const uword out_col = (use_y_loc == false) ? x_it_col : y_it_col; access::rw(out.row_indices[count]) = out_row; access::rw(out.col_ptrs[out_col + 1])++; ++count; } x_it_valid = (x_it != x_end); y_it_valid = (y_it != y_end); } arma_check( (count != merge_n_nonzero), "internal error: spglue_merge::subview_merge(): count != merge_n_nonzero" ); const uword out_n_cols = out.n_cols; uword* col_ptrs = access::rwp(out.col_ptrs); for(uword c = 1; c <= out_n_cols; ++c) { col_ptrs[c] += col_ptrs[c - 1]; } A.steal_mem(out); access::rw(sv.n_nonzero) = B.n_nonzero; } template arma_hot inline void spglue_merge::subview_merge(SpSubview& sv, const Mat& B) { arma_extra_debug_sigprint(); if(sv.n_elem == 0) { return; } const eT* B_memptr = B.memptr(); const uword B_n_elem = B.n_elem; uword B_n_nonzero = 0; for(uword i=0; i < B_n_elem; ++i) { B_n_nonzero += (B_memptr[i] != eT(0)) ? uword(1) : uword(0); } if(B_n_nonzero == 0) { sv.zeros(); return; } SpMat& A = access::rw(sv.m); const uword merge_n_nonzero = A.n_nonzero - sv.n_nonzero + B_n_nonzero; const uword sv_row_start = sv.aux_row1; const uword sv_col_start = sv.aux_col1; const uword sv_row_end = sv.aux_row1 + sv.n_rows - 1; const uword sv_col_end = sv.aux_col1 + sv.n_cols - 1; if(A.n_nonzero == sv.n_nonzero) { // A is either all zeros or has all of its elements in the subview // so the merge is equivalent to overwrite of A SpMat tmp(arma_reserve_indicator(), A.n_rows, A.n_cols, B_n_nonzero); typename Mat::const_row_col_iterator B_it = B.begin_row_col(); typename Mat::const_row_col_iterator B_it_end = B.end_row_col(); uword tmp_count = 0; for(; B_it != B_it_end; ++B_it) { const eT val = (*B_it); if(val != eT(0)) { access::rw(tmp.values[tmp_count]) = val; access::rw(tmp.row_indices[tmp_count]) = B_it.row() + sv_row_start; access::rw(tmp.col_ptrs[B_it.col() + sv_col_start + 1])++; ++tmp_count; } } for(uword i=0; i < tmp.n_cols; ++i) { access::rw(tmp.col_ptrs[i + 1]) += tmp.col_ptrs[i]; } A.steal_mem(tmp); access::rw(sv.n_nonzero) = B_n_nonzero; return; } if(sv.n_nonzero > (A.n_nonzero/2)) { // A has most of its elements in the subview, // so regenerate A with zeros in the subview region // in order to increase merging efficiency sv.zeros(); } SpMat out(arma_reserve_indicator(), A.n_rows, A.n_cols, merge_n_nonzero); typename SpMat::const_iterator x_it = A.begin(); typename SpMat::const_iterator x_end = A.end(); typename Mat::const_row_col_iterator y_it = B.begin_row_col(); typename Mat::const_row_col_iterator y_end = B.end_row_col(); uword count = 0; bool x_it_valid = (x_it != x_end); bool y_it_valid = (y_it != y_end); while(x_it_valid || y_it_valid) { eT out_val = eT(0); const uword x_it_row = (x_it_valid) ? uword(x_it.row()) : uword(0); const uword x_it_col = (x_it_valid) ? uword(x_it.col()) : uword(0); const uword y_it_row = (y_it_valid) ? uword(sv_row_start + y_it.row()) : uword(0); const uword y_it_col = (y_it_valid) ? uword(sv_col_start + y_it.col()) : uword(0); bool use_y_loc = false; if(x_it_valid && y_it_valid) { if( (x_it_row == y_it_row) && (x_it_col == y_it_col) ) { out_val = (*y_it); ++x_it; ++y_it; } else { if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end { const bool x_inside_box = ((x_it_row >= sv_row_start) && (x_it_row <= sv_row_end)) && ((x_it_col >= sv_col_start) && (x_it_col <= sv_col_end)); out_val = (x_inside_box) ? eT(0) : (*x_it); ++x_it; } else { out_val = (*y_it); ++y_it; use_y_loc = true; } } } else if(x_it_valid) { const bool x_inside_box = ((x_it_row >= sv_row_start) && (x_it_row <= sv_row_end)) && ((x_it_col >= sv_col_start) && (x_it_col <= sv_col_end)); out_val = (x_inside_box) ? eT(0) : (*x_it); ++x_it; } else if(y_it_valid) { out_val = (*y_it); ++y_it; use_y_loc = true; } if(out_val != eT(0)) { access::rw(out.values[count]) = out_val; const uword out_row = (use_y_loc == false) ? x_it_row : y_it_row; const uword out_col = (use_y_loc == false) ? x_it_col : y_it_col; access::rw(out.row_indices[count]) = out_row; access::rw(out.col_ptrs[out_col + 1])++; ++count; } x_it_valid = (x_it != x_end); y_it_valid = (y_it != y_end); } arma_check( (count != merge_n_nonzero), "internal error: spglue_merge::subview_merge(): count != merge_n_nonzero" ); const uword out_n_cols = out.n_cols; uword* col_ptrs = access::rwp(out.col_ptrs); for(uword c = 1; c <= out_n_cols; ++c) { col_ptrs[c] += col_ptrs[c - 1]; } A.steal_mem(out); access::rw(sv.n_nonzero) = B_n_nonzero; } template arma_hot inline void spglue_merge::symmat_merge(SpMat& out, const SpMat& A, const SpMat& B) { arma_extra_debug_sigprint(); out.reserve(A.n_rows, A.n_cols, 2*A.n_nonzero); // worst case scenario typename SpMat::const_iterator x_it = A.begin(); typename SpMat::const_iterator x_end = A.end(); typename SpMat::const_iterator y_it = B.begin(); typename SpMat::const_iterator y_end = B.end(); uword count = 0; while( (x_it != x_end) || (y_it != y_end) ) { eT out_val; const uword x_it_col = x_it.col(); const uword x_it_row = x_it.row(); const uword y_it_col = y_it.col(); const uword y_it_row = y_it.row(); bool use_y_loc = false; if(x_it == y_it) { // this can only happen on the diagonal out_val = (*x_it); ++x_it; ++y_it; } else { if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end { out_val = (*x_it); ++x_it; } else { out_val = (*y_it); ++y_it; use_y_loc = true; } } access::rw(out.values[count]) = out_val; const uword out_row = (use_y_loc == false) ? x_it_row : y_it_row; const uword out_col = (use_y_loc == false) ? x_it_col : y_it_col; access::rw(out.row_indices[count]) = out_row; access::rw(out.col_ptrs[out_col + 1])++; ++count; } const uword out_n_cols = out.n_cols; uword* col_ptrs = access::rwp(out.col_ptrs); // Fix column pointers to be cumulative. for(uword c = 1; c <= out_n_cols; ++c) { col_ptrs[c] += col_ptrs[c - 1]; } // quick resize without reallocating memory and copying data access::rw( out.n_nonzero) = count; access::rw( out.values[count]) = eT(0); access::rw(out.row_indices[count]) = uword(0); } template arma_hot inline void spglue_merge::diagview_merge(SpMat& out, const SpMat& A, const SpMat& B) { arma_extra_debug_sigprint(); // NOTE: assuming that B has non-zero elements only on the main diagonal out.reserve(A.n_rows, A.n_cols, A.n_nonzero + B.n_nonzero); // worst case scenario typename SpMat::const_iterator x_it = A.begin(); typename SpMat::const_iterator x_end = A.end(); typename SpMat::const_iterator y_it = B.begin(); typename SpMat::const_iterator y_end = B.end(); uword count = 0; while( (x_it != x_end) || (y_it != y_end) ) { eT out_val = eT(0); const uword x_it_col = x_it.col(); const uword x_it_row = x_it.row(); const uword y_it_col = y_it.col(); const uword y_it_row = y_it.row(); bool use_y_loc = false; if(x_it == y_it) { // this can only happen on the diagonal out_val = (*y_it); ++x_it; ++y_it; } else { if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end { if(x_it_col != x_it_row) { out_val = (*x_it); } // don't take values from the main diagonal of A ++x_it; } else { if(y_it_col == y_it_row) { out_val = (*y_it); use_y_loc = true; } // take values only from the main diagonal of B ++y_it; } } if(out_val != eT(0)) { access::rw(out.values[count]) = out_val; const uword out_row = (use_y_loc == false) ? x_it_row : y_it_row; const uword out_col = (use_y_loc == false) ? x_it_col : y_it_col; access::rw(out.row_indices[count]) = out_row; access::rw(out.col_ptrs[out_col + 1])++; ++count; } } const uword out_n_cols = out.n_cols; uword* col_ptrs = access::rwp(out.col_ptrs); // Fix column pointers to be cumulative. for(uword c = 1; c <= out_n_cols; ++c) { col_ptrs[c] += col_ptrs[c - 1]; } // quick resize without reallocating memory and copying data access::rw( out.n_nonzero) = count; access::rw( out.values[count]) = eT(0); access::rw(out.row_indices[count]) = uword(0); } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_normalise_meat.hpp0000644000176200001440000000641014124060717025144 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_normalise //! @{ template inline void spop_normalise::apply(SpMat& out, const SpOp& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword p = expr.aux_uword_a; const uword dim = expr.aux_uword_b; arma_debug_check( (p == 0), "normalise(): parameter 'p' must be greater than zero" ); arma_debug_check( (dim > 1), "normalise(): parameter 'dim' must be 0 or 1" ); const unwrap_spmat U(expr.m); const SpMat& X = U.M; X.sync(); if( X.is_empty() || (X.n_nonzero == 0) ) { out.zeros(X.n_rows, X.n_cols); return; } if(dim == 0) { spop_normalise::apply_direct(out, X, p); } else if(dim == 1) { SpMat tmp1; SpMat tmp2; spop_strans::apply_noalias(tmp1, X); spop_normalise::apply_direct(tmp2, tmp1, p); spop_strans::apply_noalias(out, tmp2); } } template inline void spop_normalise::apply_direct(SpMat& out, const SpMat& X, const uword p) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; SpMat tmp(arma_reserve_indicator(), X.n_rows, X.n_cols, X.n_nonzero); bool has_zero = false; podarray norm_vals(X.n_cols); T* norm_vals_mem = norm_vals.memptr(); for(uword col=0; col < X.n_cols; ++col) { const uword col_offset = X.col_ptrs[col ]; const uword next_col_offset = X.col_ptrs[col + 1]; const eT* start_ptr = &X.values[ col_offset]; const eT* end_ptr = &X.values[next_col_offset]; const uword n_elem = end_ptr - start_ptr; const Col fake_vec(const_cast(start_ptr), n_elem, false, false); const T norm_val = norm(fake_vec, p); norm_vals_mem[col] = (norm_val != T(0)) ? norm_val : T(1); } const uword N = X.n_nonzero; typename SpMat::const_iterator it = X.begin(); for(uword i=0; i < N; ++i) { const uword row = it.row(); const uword col = it.col(); const eT val = (*it) / norm_vals_mem[col]; if(val == eT(0)) { has_zero = true; } access::rw(tmp.values[i]) = val; access::rw(tmp.row_indices[i]) = row; access::rw(tmp.col_ptrs[col + 1])++; ++it; } for(uword c=0; c < tmp.n_cols; ++c) { access::rw(tmp.col_ptrs[c + 1]) += tmp.col_ptrs[c]; } if(has_zero) { tmp.remove_zeros(); } out.steal_mem(tmp); } //! @} RcppArmadillo/inst/include/armadillo_bits/GenSpecialiser.hpp0000644000176200001440000000334614124060717024006 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup GenSpecialiser //! @{ template struct GenSpecialiser { arma_inline elem_type generate() const { return elem_type(); } }; template struct GenSpecialiser { arma_inline elem_type generate() const { return elem_type(0); } }; template struct GenSpecialiser { arma_inline elem_type generate() const { return elem_type(1); } }; template struct GenSpecialiser { arma_inline elem_type generate() const { return elem_type(arma_rng::randu()); } }; template struct GenSpecialiser { arma_inline elem_type generate() const { return elem_type(arma_rng::randn()); } }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_index_max_bones.hpp0000644000176200001440000000341714124060717024750 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_index_max //! @{ class op_index_max : public traits_op_xvec { public: // dense matrices template inline static void apply(Mat& out, const mtOp& in); template inline static void apply_noalias(Mat& out, const Mat& X, const uword dim); // cubes template inline static void apply(Cube& out, const mtOpCube& in); template inline static void apply_noalias(Cube& out, const Cube& X, const uword dim, const typename arma_not_cx::result* junk = nullptr); template inline static void apply_noalias(Cube& out, const Cube& X, const uword dim, const typename arma_cx_only::result* junk = nullptr); // sparse matrices template inline static void apply(Mat& out, const SpBase& expr, const uword dim); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_index_min_meat.hpp0000644000176200001440000002364714124060717024575 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_index_min //! @{ template inline void op_index_min::apply(Mat& out, const mtOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "index_min(): parameter 'dim' must be 0 or 1" ); const quasi_unwrap U(in.m); const Mat& X = U.M; if(U.is_alias(out) == false) { op_index_min::apply_noalias(out, X, dim); } else { Mat tmp; op_index_min::apply_noalias(tmp, X, dim); out.steal_mem(tmp); } } template inline void op_index_min::apply_noalias(Mat& out, const Mat& X, const uword dim) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(dim == 0) { arma_extra_debug_print("op_index_min::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols); if(X_n_rows == 0) { return; } uword* out_mem = out.memptr(); for(uword col=0; col < X_n_cols; ++col) { op_min::direct_min( X.colptr(col), X_n_rows, out_mem[col] ); } } else if(dim == 1) { arma_extra_debug_print("op_index_min::apply(): dim = 1"); out.zeros(X_n_rows, (X_n_cols > 0) ? 1 : 0); if(X_n_cols == 0) { return; } uword* out_mem = out.memptr(); Col tmp(X_n_rows, arma_nozeros_indicator()); T* tmp_mem = tmp.memptr(); if(is_cx::yes) { const eT* col_mem = X.colptr(0); for(uword row=0; row < X_n_rows; ++row) { tmp_mem[row] = eop_aux::arma_abs(col_mem[row]); } } else { arrayops::copy(tmp_mem, (T*)(X.colptr(0)), X_n_rows); } for(uword col=1; col < X_n_cols; ++col) { const eT* col_mem = X.colptr(col); for(uword row=0; row < X_n_rows; ++row) { T& min_val = tmp_mem[row]; T col_val = (is_cx::yes) ? T(eop_aux::arma_abs(col_mem[row])) : T(access::tmp_real(col_mem[row])); if(min_val > col_val) { min_val = col_val; out_mem[row] = col; } } } } } template inline void op_index_min::apply(Cube& out, const mtOpCube& in) { arma_extra_debug_sigprint(); const uword dim = in.aux_uword_a; arma_debug_check( (dim > 2), "index_min(): parameter 'dim' must be 0 or 1 or 2" ); const unwrap_cube U(in.m); if(U.is_alias(out) == false) { op_index_min::apply_noalias(out, U.M, dim); } else { Cube tmp; op_index_min::apply_noalias(tmp, U.M, dim); out.steal_mem(tmp); } } template inline void op_index_min::apply_noalias(Cube& out, const Cube& X, const uword dim, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword X_n_slices = X.n_slices; if(dim == 0) { arma_extra_debug_print("op_index_min::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols, X_n_slices); if(out.is_empty() || X.is_empty()) { return; } for(uword slice=0; slice < X_n_slices; ++slice) { uword* out_mem = out.slice_memptr(slice); for(uword col=0; col < X_n_cols; ++col) { op_min::direct_min( X.slice_colptr(slice,col), X_n_rows, out_mem[col] ); } } } else if(dim == 1) { arma_extra_debug_print("op_index_min::apply(): dim = 1"); out.zeros(X_n_rows, (X_n_cols > 0) ? 1 : 0, X_n_slices); if(out.is_empty() || X.is_empty()) { return; } Col tmp(X_n_rows, arma_nozeros_indicator()); eT* tmp_mem = tmp.memptr(); for(uword slice=0; slice < X_n_slices; ++slice) { uword* out_mem = out.slice_memptr(slice); arrayops::copy(tmp_mem, X.slice_colptr(slice,0), X_n_rows); for(uword col=1; col < X_n_cols; ++col) { const eT* col_mem = X.slice_colptr(slice,col); for(uword row=0; row < X_n_rows; ++row) { const eT val = col_mem[row]; if(val < tmp_mem[row]) { tmp_mem[row] = val; out_mem[row] = col; } } } } } else if(dim == 2) { arma_extra_debug_print("op_index_min::apply(): dim = 2"); out.zeros(X_n_rows, X_n_cols, (X_n_slices > 0) ? 1 : 0); if(out.is_empty() || X.is_empty()) { return; } Mat tmp(X.slice_memptr(0), X_n_rows, X_n_cols); // copy slice 0 eT* tmp_mem = tmp.memptr(); uword* out_mem = out.memptr(); const uword N = X.n_elem_slice; for(uword slice=1; slice < X_n_slices; ++slice) { const eT* X_slice_mem = X.slice_memptr(slice); for(uword i=0; i < N; ++i) { const eT val = X_slice_mem[i]; if(val < tmp_mem[i]) { tmp_mem[i] = val; out_mem[i] = slice; } } } } } template inline void op_index_min::apply_noalias(Cube& out, const Cube& X, const uword dim, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename get_pod_type::result T; const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword X_n_slices = X.n_slices; if(dim == 0) { arma_extra_debug_print("op_index_min::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols, X_n_slices); if(out.is_empty() || X.is_empty()) { return; } for(uword slice=0; slice < X_n_slices; ++slice) { uword* out_mem = out.slice_memptr(slice); for(uword col=0; col < X_n_cols; ++col) { op_min::direct_min( X.slice_colptr(slice,col), X_n_rows, out_mem[col] ); } } } else if(dim == 1) { arma_extra_debug_print("op_index_min::apply(): dim = 1"); out.zeros(X_n_rows, (X_n_cols > 0) ? 1 : 0, X_n_slices); if(out.is_empty() || X.is_empty()) { return; } Col tmp(X_n_rows, arma_nozeros_indicator()); T* tmp_mem = tmp.memptr(); for(uword slice=0; slice < X_n_slices; ++slice) { uword* out_mem = out.slice_memptr(slice); const eT* col0_mem = X.slice_colptr(slice,0); for(uword row=0; row < X_n_rows; ++row) { tmp_mem[row] = std::abs( col0_mem[row] ); } for(uword col=1; col < X_n_cols; ++col) { const eT* col_mem = X.slice_colptr(slice,col); for(uword row=0; row < X_n_rows; ++row) { const T val = std::abs( col_mem[row] ); if(val < tmp_mem[row]) { tmp_mem[row] = val; out_mem[row] = col; } } } } } else if(dim == 2) { arma_extra_debug_print("op_index_min::apply(): dim = 2"); out.zeros(X_n_rows, X_n_cols, (X_n_slices > 0) ? 1 : 0); if(out.is_empty() || X.is_empty()) { return; } uword* out_mem = out.memptr(); Mat tmp(X_n_rows, X_n_cols, arma_nozeros_indicator()); T* tmp_mem = tmp.memptr(); const eT* X_slice0_mem = X.slice_memptr(0); const uword N = X.n_elem_slice; for(uword i=0; i inline void op_index_min::apply(Mat& out, const SpBase& expr, const uword dim) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; arma_debug_check( (dim > 1), "index_min(): parameter 'dim' must be 0 or 1" ); const unwrap_spmat U(expr.get_ref()); const SpMat& X = U.M; const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(dim == 0) { arma_extra_debug_print("op_index_min::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols); if(X_n_rows == 0) { return; } uword* out_mem = out.memptr(); for(uword col=0; col < X_n_cols; ++col) { out_mem[col] = X.col(col).index_min(); } } else if(dim == 1) { arma_extra_debug_print("op_index_min::apply(): dim = 1"); out.set_size(X_n_rows, (X_n_cols > 0) ? 1 : 0); if(X_n_cols == 0) { return; } uword* out_mem = out.memptr(); const SpMat Xt = X.st(); for(uword row=0; row < X_n_rows; ++row) { out_mem[row] = Xt.col(row).index_min(); } } } //! @} RcppArmadillo/inst/include/armadillo_bits/restrictors.hpp0000644000176200001440000002271714124060717023477 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup restrictors //! @{ // structures for template based restrictions of input/output arguments // (part of the SFINAE approach) // http://en.wikipedia.org/wiki/SFINAE template struct arma_scalar_only { }; template<> struct arma_scalar_only< u8 > { typedef u8 result; }; template<> struct arma_scalar_only< s8 > { typedef s8 result; }; template<> struct arma_scalar_only< u16 > { typedef u16 result; }; template<> struct arma_scalar_only< s16 > { typedef s16 result; }; template<> struct arma_scalar_only< u32 > { typedef u32 result; }; template<> struct arma_scalar_only< s32 > { typedef s32 result; }; template<> struct arma_scalar_only< u64 > { typedef u64 result; }; template<> struct arma_scalar_only< s64 > { typedef s64 result; }; template<> struct arma_scalar_only< ulng_t > { typedef ulng_t result; }; template<> struct arma_scalar_only< slng_t > { typedef slng_t result; }; template<> struct arma_scalar_only< float > { typedef float result; }; template<> struct arma_scalar_only< double > { typedef double result; }; template<> struct arma_scalar_only< cx_float > { typedef cx_float result; }; template<> struct arma_scalar_only< cx_double > { typedef cx_double result; }; template struct arma_integral_only { }; template<> struct arma_integral_only< u8 > { typedef u8 result; }; template<> struct arma_integral_only< s8 > { typedef s8 result; }; template<> struct arma_integral_only< u16 > { typedef u16 result; }; template<> struct arma_integral_only< s16 > { typedef s16 result; }; template<> struct arma_integral_only< u32 > { typedef u32 result; }; template<> struct arma_integral_only< s32 > { typedef s32 result; }; template<> struct arma_integral_only< u64 > { typedef u64 result; }; template<> struct arma_integral_only< s64 > { typedef s64 result; }; template<> struct arma_integral_only< ulng_t > { typedef ulng_t result; }; template<> struct arma_integral_only< slng_t > { typedef slng_t result; }; template struct arma_unsigned_integral_only { }; template<> struct arma_unsigned_integral_only< u8 > { typedef u8 result; }; template<> struct arma_unsigned_integral_only< u16 > { typedef u16 result; }; template<> struct arma_unsigned_integral_only< u32 > { typedef u32 result; }; template<> struct arma_unsigned_integral_only< u64 > { typedef u64 result; }; template<> struct arma_unsigned_integral_only< ulng_t > { typedef ulng_t result; }; template struct arma_signed_integral_only { }; template<> struct arma_signed_integral_only< s8 > { typedef s8 result; }; template<> struct arma_signed_integral_only< s16 > { typedef s16 result; }; template<> struct arma_signed_integral_only< s32 > { typedef s32 result; }; template<> struct arma_signed_integral_only< s64 > { typedef s64 result; }; template<> struct arma_signed_integral_only< slng_t > { typedef slng_t result; }; template struct arma_signed_only { }; template<> struct arma_signed_only< s8 > { typedef s8 result; }; template<> struct arma_signed_only< s16 > { typedef s16 result; }; template<> struct arma_signed_only< s32 > { typedef s32 result; }; template<> struct arma_signed_only< s64 > { typedef s64 result; }; template<> struct arma_signed_only< slng_t > { typedef slng_t result; }; template<> struct arma_signed_only< float > { typedef float result; }; template<> struct arma_signed_only< double > { typedef double result; }; template<> struct arma_signed_only< cx_float > { typedef cx_float result; }; template<> struct arma_signed_only< cx_double > { typedef cx_double result; }; template struct arma_real_only { }; template<> struct arma_real_only< float > { typedef float result; }; template<> struct arma_real_only< double > { typedef double result; }; template struct arma_real_or_cx_only { }; template<> struct arma_real_or_cx_only< float > { typedef float result; }; template<> struct arma_real_or_cx_only< double > { typedef double result; }; template<> struct arma_real_or_cx_only< cx_float > { typedef cx_float result; }; template<> struct arma_real_or_cx_only< cx_double > { typedef cx_double result; }; template struct arma_cx_only { }; template<> struct arma_cx_only< cx_float > { typedef cx_float result; }; template<> struct arma_cx_only< cx_double > { typedef cx_double result; }; template struct arma_not_cx { typedef T result; }; template struct arma_not_cx< std::complex > { }; template struct arma_blas_type_only { }; template<> struct arma_blas_type_only< float > { typedef float result; }; template<> struct arma_blas_type_only< double > { typedef double result; }; template<> struct arma_blas_type_only< cx_float > { typedef cx_float result; }; template<> struct arma_blas_type_only< cx_double > { typedef cx_double result; }; template struct arma_not_blas_type { typedef T result; }; template<> struct arma_not_blas_type< float > { }; template<> struct arma_not_blas_type< double > { }; template<> struct arma_not_blas_type< cx_float > { }; template<> struct arma_not_blas_type< cx_double > { }; template struct arma_op_rel_only { }; template<> struct arma_op_rel_only< op_rel_lt_pre > { typedef int result; }; template<> struct arma_op_rel_only< op_rel_lt_post > { typedef int result; }; template<> struct arma_op_rel_only< op_rel_gt_pre > { typedef int result; }; template<> struct arma_op_rel_only< op_rel_gt_post > { typedef int result; }; template<> struct arma_op_rel_only< op_rel_lteq_pre > { typedef int result; }; template<> struct arma_op_rel_only< op_rel_lteq_post > { typedef int result; }; template<> struct arma_op_rel_only< op_rel_gteq_pre > { typedef int result; }; template<> struct arma_op_rel_only< op_rel_gteq_post > { typedef int result; }; template<> struct arma_op_rel_only< op_rel_eq > { typedef int result; }; template<> struct arma_op_rel_only< op_rel_noteq > { typedef int result; }; template struct arma_not_op_rel { typedef int result; }; template<> struct arma_not_op_rel< op_rel_lt_pre > { }; template<> struct arma_not_op_rel< op_rel_lt_post > { }; template<> struct arma_not_op_rel< op_rel_gt_pre > { }; template<> struct arma_not_op_rel< op_rel_gt_post > { }; template<> struct arma_not_op_rel< op_rel_lteq_pre > { }; template<> struct arma_not_op_rel< op_rel_lteq_post > { }; template<> struct arma_not_op_rel< op_rel_gteq_pre > { }; template<> struct arma_not_op_rel< op_rel_gteq_post > { }; template<> struct arma_not_op_rel< op_rel_eq > { }; template<> struct arma_not_op_rel< op_rel_noteq > { }; template struct arma_glue_rel_only { }; template<> struct arma_glue_rel_only< glue_rel_lt > { typedef int result; }; template<> struct arma_glue_rel_only< glue_rel_gt > { typedef int result; }; template<> struct arma_glue_rel_only< glue_rel_lteq > { typedef int result; }; template<> struct arma_glue_rel_only< glue_rel_gteq > { typedef int result; }; template<> struct arma_glue_rel_only< glue_rel_eq > { typedef int result; }; template<> struct arma_glue_rel_only< glue_rel_noteq > { typedef int result; }; template<> struct arma_glue_rel_only< glue_rel_and > { typedef int result; }; template<> struct arma_glue_rel_only< glue_rel_or > { typedef int result; }; template struct arma_Mat_Col_Row_only { }; template struct arma_Mat_Col_Row_only< Mat > { typedef Mat result; }; template struct arma_Mat_Col_Row_only< Col > { typedef Col result; }; template struct arma_Mat_Col_Row_only< Row > { typedef Row result; }; template struct arma_Cube_only { }; template struct arma_Cube_only< Cube > { typedef Cube result; }; template struct arma_SpMat_SpCol_SpRow_only { }; template struct arma_SpMat_SpCol_SpRow_only< SpMat > { typedef SpMat result; }; template struct arma_SpMat_SpCol_SpRow_only< SpCol > { typedef SpCol result; }; template struct arma_SpMat_SpCol_SpRow_only< SpRow > { typedef SpRow result; }; template struct enable_if { }; template<> struct enable_if { typedef int result; }; template struct enable_if2 { }; template< typename result_type > struct enable_if2 { typedef result_type result; }; //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_EigsSelect.hpp0000644000176200001440000000434014124060717024507 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { //! The enumeration of selection rules of desired eigenvalues. struct EigsSelect { 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. }; }; } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/SpOp_bones.hpp0000644000176200001440000000366214124060717023161 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpOp //! @{ template class SpOp : public SpBase< typename T1::elem_type, SpOp > { public: typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = op_type::template traits::is_row; static constexpr bool is_col = op_type::template traits::is_col; static constexpr bool is_xvec = op_type::template traits::is_xvec; inline explicit SpOp(const T1& in_m); inline SpOp(const T1& in_m, const elem_type in_aux); inline SpOp(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b); inline ~SpOp(); arma_inline bool is_alias(const SpMat& X) const; arma_aligned const T1& m; //!< the operand; must be derived from SpBase arma_aligned elem_type aux; //!< auxiliary data, using the element type as used by T1 arma_aligned uword aux_uword_a; //!< auxiliary data, uword format arma_aligned uword aux_uword_b; //!< auxiliary data, uword format }; //! @} RcppArmadillo/inst/include/armadillo_bits/glue_hist_meat.hpp0000644000176200001440000001424114124060717024076 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_hist //! @{ template inline void glue_hist::apply_noalias(Mat& out, const Mat& X, const Mat& C, const uword dim) { arma_extra_debug_sigprint(); arma_debug_check( ((C.is_vec() == false) && (C.is_empty() == false)), "hist(): parameter 'centers' must be a vector" ); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword C_n_elem = C.n_elem; if( C_n_elem == 0 ) { out.reset(); return; } arma_debug_check ( ((Col(const_cast(C.memptr()), C_n_elem, false, false)).is_sorted("strictascend") == false), "hist(): given 'centers' vector does not contain monotonically increasing values" ); const eT* C_mem = C.memptr(); const eT center_0 = C_mem[0]; if(dim == 0) { out.zeros(C_n_elem, X_n_cols); for(uword col=0; col < X_n_cols; ++col) { const eT* X_coldata = X.colptr(col); uword* out_coldata = out.colptr(col); for(uword row=0; row < X_n_rows; ++row) { const eT val = X_coldata[row]; if(arma_isfinite(val)) { eT opt_dist = (center_0 >= val) ? (center_0 - val) : (val - center_0); uword opt_index = 0; for(uword j=1; j < C_n_elem; ++j) { const eT center = C_mem[j]; const eT dist = (center >= val) ? (center - val) : (val - center); if(dist < opt_dist) { opt_dist = dist; opt_index = j; } else { break; } } out_coldata[opt_index]++; } else { // -inf if(val < eT(0)) { out_coldata[0]++; } // +inf if(val > eT(0)) { out_coldata[C_n_elem-1]++; } // ignore NaN } } } } else if(dim == 1) { out.zeros(X_n_rows, C_n_elem); if(X_n_rows == 1) { const uword X_n_elem = X.n_elem; const eT* X_mem = X.memptr(); uword* out_mem = out.memptr(); for(uword i=0; i < X_n_elem; ++i) { const eT val = X_mem[i]; if(is_finite(val)) { eT opt_dist = (val >= center_0) ? (val - center_0) : (center_0 - val); uword opt_index = 0; for(uword j=1; j < C_n_elem; ++j) { const eT center = C_mem[j]; const eT dist = (val >= center) ? (val - center) : (center - val); if(dist < opt_dist) { opt_dist = dist; opt_index = j; } else { break; } } out_mem[opt_index]++; } else { // -inf if(val < eT(0)) { out_mem[0]++; } // +inf if(val > eT(0)) { out_mem[C_n_elem-1]++; } // ignore NaN } } } else { for(uword row=0; row < X_n_rows; ++row) { for(uword col=0; col < X_n_cols; ++col) { const eT val = X.at(row,col); if(arma_isfinite(val)) { eT opt_dist = (center_0 >= val) ? (center_0 - val) : (val - center_0); uword opt_index = 0; for(uword j=1; j < C_n_elem; ++j) { const eT center = C_mem[j]; const eT dist = (center >= val) ? (center - val) : (val - center); if(dist < opt_dist) { opt_dist = dist; opt_index = j; } else { break; } } out.at(row,opt_index)++; } else { // -inf if(val < eT(0)) { out.at(row,0)++; } // +inf if(val > eT(0)) { out.at(row,C_n_elem-1)++; } // ignore NaN } } } } } } template inline void glue_hist::apply(Mat& out, const mtGlue& expr) { arma_extra_debug_sigprint(); const uword dim = expr.aux_uword; arma_debug_check( (dim > 1), "hist(): parameter 'dim' must be 0 or 1" ); const quasi_unwrap UA(expr.A); const quasi_unwrap UB(expr.B); if(UA.is_alias(out) || UB.is_alias(out)) { Mat tmp; glue_hist::apply_noalias(tmp, UA.M, UB.M, dim); out.steal_mem(tmp); } else { glue_hist::apply_noalias(out, UA.M, UB.M, dim); } } template inline void glue_hist_default::apply(Mat& out, const mtGlue& expr) { arma_extra_debug_sigprint(); const quasi_unwrap UA(expr.A); const quasi_unwrap UB(expr.B); const uword dim = (T1::is_xvec) ? uword(UA.M.is_rowvec() ? 1 : 0) : uword((T1::is_row) ? 1 : 0); if(UA.is_alias(out) || UB.is_alias(out)) { Mat tmp; glue_hist::apply_noalias(tmp, UA.M, UB.M, dim); out.steal_mem(tmp); } else { glue_hist::apply_noalias(out, UA.M, UB.M, dim); } } //! @} RcppArmadillo/inst/include/armadillo_bits/op_median_bones.hpp0000644000176200001440000000411514124060717024225 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_median //! @{ template struct arma_cx_median_packet { T val; uword index; }; template arma_inline bool operator< (const arma_cx_median_packet& A, const arma_cx_median_packet& B) { return A.val < B.val; } //! Class for finding median values of a matrix class op_median : public traits_op_xvec { public: template inline static void apply(Mat& out, const Op& in, const typename arma_not_cx::result* junk = nullptr); template inline static void apply(Mat& out, const Op& in, const typename arma_cx_only::result* junk = nullptr); // // template inline static typename T1::elem_type median_vec(const T1& X, const typename arma_not_cx::result* junk = nullptr); template inline static typename T1::elem_type median_vec(const T1& X, const typename arma_cx_only::result* junk = nullptr); // // template inline static eT direct_median(std::vector& X); template inline static void direct_cx_median_index(uword& out_index1, uword& out_index2, std::vector< arma_cx_median_packet >& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/glue_affmul_bones.hpp0000644000176200001440000000340614124060717024562 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_affmul //! @{ class glue_affmul { public: template struct traits { static constexpr bool is_row = T1::is_row; static constexpr bool is_col = T2::is_col; static constexpr bool is_xvec = false; }; template inline static void apply(Mat& out, const Glue& X); template inline static void apply_noalias(Mat& out, const T1& A, const T2& B); template inline static void apply_noalias_square(Mat& out, const T1& A, const T2& B); template inline static void apply_noalias_rectangle(Mat& out, const T1& A, const T2& B); template inline static void apply_noalias_generic(Mat& out, const T1& A, const T2& B); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_normalise.hpp0000644000176200001440000000506214124060717023562 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_normalise //! @{ template arma_warn_unused inline typename enable_if2 < is_arma_type::value && resolves_to_vector::yes, const Op >::result normalise ( const T1& X, const uword p = uword(2), const arma_empty_class junk1 = arma_empty_class(), const typename arma_real_or_cx_only::result* junk2 = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); return Op(X, p, 0); } template arma_warn_unused inline typename enable_if2 < is_arma_type::value && resolves_to_vector::no, const Op >::result normalise ( const T1& X, const uword p = uword(2), const uword dim = 0, const typename arma_real_or_cx_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); return Op(X, p, dim); } template arma_warn_unused inline const SpOp normalise ( const SpBase& expr, const uword p = uword(2), const uword dim = 0, const typename arma_real_or_cx_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); return SpOp(expr.get_ref(), p, dim); } //! for compatibility purposes: allows compiling user code designed for earlier versions of Armadillo template arma_warn_unused arma_inline typename enable_if2 < is_supported_blas_type::value, Col >::result normalise(const T& val) { Col out(1, arma_nozeros_indicator()); out[0] = (val != T(0)) ? T(val / (std::abs)(val)) : T(val); return out; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_reshape_meat.hpp0000644000176200001440000001643014160256234024243 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_reshape //! @{ template inline void op_reshape::apply(Mat& actual_out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword new_n_rows = in.aux_uword_a; const uword new_n_cols = in.aux_uword_b; if(is_Mat::value || (arma_config::openmp && Proxy::use_mp)) { const unwrap U(in.m); const Mat& A = U.M; if(&actual_out == &A) { op_reshape::apply_mat_inplace(actual_out, new_n_rows, new_n_cols); } else { op_reshape::apply_mat_noalias(actual_out, A, new_n_rows, new_n_cols); } } else { const Proxy P(in.m); const bool is_alias = P.is_alias(actual_out); Mat tmp; Mat& out = (is_alias) ? tmp : actual_out; if(is_Mat::stored_type>::value) { const quasi_unwrap::stored_type> U(P.Q); op_reshape::apply_mat_noalias(out, U.M, new_n_rows, new_n_cols); } else { op_reshape::apply_proxy_noalias(out, P, new_n_rows, new_n_cols); } if(is_alias) { actual_out.steal_mem(tmp); } } } template inline void op_reshape::apply_mat_inplace(Mat& A, const uword new_n_rows, const uword new_n_cols) { arma_extra_debug_sigprint(); const uword new_n_elem = new_n_rows * new_n_cols; if(A.n_elem == new_n_elem) { A.set_size(new_n_rows, new_n_cols); return; } Mat B; op_reshape::apply_mat_noalias(B, A, new_n_rows, new_n_cols); A.steal_mem(B); } template inline void op_reshape::apply_mat_noalias(Mat& out, const Mat& A, const uword new_n_rows, const uword new_n_cols) { arma_extra_debug_sigprint(); out.set_size(new_n_rows, new_n_cols); const uword n_elem_to_copy = (std::min)(A.n_elem, out.n_elem); eT* out_mem = out.memptr(); arrayops::copy( out_mem, A.memptr(), n_elem_to_copy ); if(n_elem_to_copy < out.n_elem) { const uword n_elem_leftover = out.n_elem - n_elem_to_copy; arrayops::fill_zeros(&(out_mem[n_elem_to_copy]), n_elem_leftover); } } template inline void op_reshape::apply_proxy_noalias(Mat& out, const Proxy& P, const uword new_n_rows, const uword new_n_cols) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; out.set_size(new_n_rows, new_n_cols); const uword n_elem_to_copy = (std::min)(P.get_n_elem(), out.n_elem); eT* out_mem = out.memptr(); if(Proxy::use_at == false) { typename Proxy::ea_type Pea = P.get_ea(); for(uword i=0; i < n_elem_to_copy; ++i) { out_mem[i] = Pea[i]; } } else { uword i = 0; const uword P_n_rows = P.get_n_rows(); const uword P_n_cols = P.get_n_cols(); for(uword col=0; col < P_n_cols; ++col) for(uword row=0; row < P_n_rows; ++row) { if(i >= n_elem_to_copy) { goto nested_loop_end; } out_mem[i] = P.at(row,col); ++i; } nested_loop_end: ; } if(n_elem_to_copy < out.n_elem) { const uword n_elem_leftover = out.n_elem - n_elem_to_copy; arrayops::fill_zeros(&(out_mem[n_elem_to_copy]), n_elem_leftover); } } template inline void op_reshape::apply(Cube& out, const OpCube& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_cube U(in.m); const Cube& A = U.M; const uword new_n_rows = in.aux_uword_a; const uword new_n_cols = in.aux_uword_b; const uword new_n_slices = in.aux_uword_c; if(&out == &A) { op_reshape::apply_cube_inplace(out, new_n_rows, new_n_cols, new_n_slices); } else { op_reshape::apply_cube_noalias(out, A, new_n_rows, new_n_cols, new_n_slices); } } template inline void op_reshape::apply_cube_inplace(Cube& A, const uword new_n_rows, const uword new_n_cols, const uword new_n_slices) { arma_extra_debug_sigprint(); const uword new_n_elem = new_n_rows * new_n_cols * new_n_slices; if(A.n_elem == new_n_elem) { A.set_size(new_n_rows, new_n_cols, new_n_slices); return; } Cube B; op_reshape::apply_cube_noalias(B, A, new_n_rows, new_n_cols, new_n_slices); A.steal_mem(B); } template inline void op_reshape::apply_cube_noalias(Cube& out, const Cube& A, const uword new_n_rows, const uword new_n_cols, const uword new_n_slices) { arma_extra_debug_sigprint(); out.set_size(new_n_rows, new_n_cols, new_n_slices); const uword n_elem_to_copy = (std::min)(A.n_elem, out.n_elem); eT* out_mem = out.memptr(); arrayops::copy( out_mem, A.memptr(), n_elem_to_copy ); if(n_elem_to_copy < out.n_elem) { const uword n_elem_leftover = out.n_elem - n_elem_to_copy; arrayops::fill_zeros(&(out_mem[n_elem_to_copy]), n_elem_leftover); } } // template arma_cold inline void op_reshape_old::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword new_n_rows = in.aux_uword_a; const uword new_n_cols = in.aux_uword_b; const uword dim = in.aux_uword_c; const unwrap U(in.m); const Mat& A = U.M; if(&out == &A) { op_reshape_old::apply_mat_inplace(out, new_n_rows, new_n_cols, dim); } else { op_reshape_old::apply_mat_noalias(out, A, new_n_rows, new_n_cols, dim); } } template arma_cold inline void op_reshape_old::apply_mat_inplace(Mat& A, const uword new_n_rows, const uword new_n_cols, const uword dim) { arma_extra_debug_sigprint(); if(dim == 0) { op_reshape::apply_mat_inplace(A, new_n_rows, new_n_cols); } else if(dim == 1) { Mat tmp; op_strans::apply_mat_noalias(tmp, A); op_reshape::apply_mat_noalias(A, tmp, new_n_rows, new_n_cols); } } template arma_cold inline void op_reshape_old::apply_mat_noalias(Mat& out, const Mat& A, const uword new_n_rows, const uword new_n_cols, const uword dim) { arma_extra_debug_sigprint(); if(dim == 0) { op_reshape::apply_mat_noalias(out, A, new_n_rows, new_n_cols); } else if(dim == 1) { Mat tmp; op_strans::apply_mat_noalias(tmp, A); op_reshape::apply_mat_noalias(out, tmp, new_n_rows, new_n_cols); } } //! @} RcppArmadillo/inst/include/armadillo_bits/op_sort_bones.hpp0000644000176200001440000000332314124060717023757 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_sort //! @{ class op_sort : public traits_op_default { public: template inline static void copy_row(eT* X, const Mat& A, const uword row); template inline static void copy_row(Mat& A, const eT* X, const uword row); template inline static void direct_sort(eT* X, const uword N, const uword sort_type = 0); template inline static void direct_sort_ascending(eT* X, const uword N); template inline static void apply_noalias(Mat& out, const Mat& X, const uword sort_type, const uword dim); template inline static void apply(Mat& out, const Op& in); }; class op_sort_vec : public traits_op_passthru { public: template inline static void apply(Mat& out, const Op& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_zeros.hpp0000644000176200001440000001124614124060717022734 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_zeros //! @{ arma_warn_unused arma_inline const Gen zeros(const uword n_elem) { arma_extra_debug_sigprint(); return Gen(n_elem, 1); } template arma_warn_unused arma_inline const Gen zeros(const uword n_elem, const arma_empty_class junk1 = arma_empty_class(), const typename arma_Mat_Col_Row_only::result* junk2 = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); if(is_Row::value) { return Gen(1, n_elem); } else { return Gen(n_elem, 1); } } arma_warn_unused arma_inline const Gen zeros(const uword n_rows, const uword n_cols) { arma_extra_debug_sigprint(); return Gen(n_rows, n_cols); } arma_warn_unused arma_inline const Gen zeros(const SizeMat& s) { arma_extra_debug_sigprint(); return Gen(s.n_rows, s.n_cols); } template arma_warn_unused arma_inline const Gen zeros(const uword n_rows, const uword n_cols, const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); if(is_Col::value) { arma_debug_check( (n_cols != 1), "zeros(): incompatible size" ); } else if(is_Row::value) { arma_debug_check( (n_rows != 1), "zeros(): incompatible size" ); } return Gen(n_rows, n_cols); } template arma_warn_unused arma_inline const Gen zeros(const SizeMat& s, const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return zeros(s.n_rows, s.n_cols); } arma_warn_unused arma_inline const GenCube zeros(const uword n_rows, const uword n_cols, const uword n_slices) { arma_extra_debug_sigprint(); return GenCube(n_rows, n_cols, n_slices); } arma_warn_unused arma_inline const GenCube zeros(const SizeCube& s) { arma_extra_debug_sigprint(); return GenCube(s.n_rows, s.n_cols, s.n_slices); } template arma_warn_unused arma_inline const GenCube zeros(const uword n_rows, const uword n_cols, const uword n_slices, const typename arma_Cube_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return GenCube(n_rows, n_cols, n_slices); } template arma_warn_unused arma_inline const GenCube zeros(const SizeCube& s, const typename arma_Cube_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return GenCube(s.n_rows, s.n_cols, s.n_slices); } template arma_warn_unused inline sp_obj_type zeros(const uword n_rows, const uword n_cols, const typename arma_SpMat_SpCol_SpRow_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); if(is_SpCol::value) { arma_debug_check( (n_cols != 1), "zeros(): incompatible size" ); } else if(is_SpRow::value) { arma_debug_check( (n_rows != 1), "zeros(): incompatible size" ); } return sp_obj_type(n_rows, n_cols); } template arma_warn_unused inline sp_obj_type zeros(const SizeMat& s, const typename arma_SpMat_SpCol_SpRow_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return zeros(s.n_rows, s.n_cols); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_solve.hpp0000644000176200001440000001073314124060717022722 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_solve //! @{ // // solve_gen template arma_warn_unused inline typename enable_if2< is_supported_blas_type::value, const Glue >::result solve ( const Base& A, const Base& B, const solve_opts::opts& opts = solve_opts::none ) { arma_extra_debug_sigprint(); return Glue(A.get_ref(), B.get_ref(), opts.flags); } template inline typename enable_if2< is_supported_blas_type::value, bool >::result solve ( Mat& out, const Base& A, const Base& B, const solve_opts::opts& opts = solve_opts::none ) { arma_extra_debug_sigprint(); const bool status = glue_solve_gen::apply(out, A.get_ref(), B.get_ref(), opts.flags); if(status == false) { out.soft_reset(); arma_debug_warn_level(3, "solve(): solution not found"); } return status; } // // solve_tri template arma_warn_unused inline typename enable_if2< is_supported_blas_type::value, const Glue >::result solve ( const Op& A, const Base& B ) { arma_extra_debug_sigprint(); uword flags = uword(0); if(A.aux_uword_a == 0) { flags |= solve_opts::flag_triu; } if(A.aux_uword_a == 1) { flags |= solve_opts::flag_tril; } return Glue(A.m, B.get_ref(), flags); } template arma_warn_unused inline typename enable_if2< is_supported_blas_type::value, const Glue >::result solve ( const Op& A, const Base& B, const solve_opts::opts& opts ) { arma_extra_debug_sigprint(); uword flags = opts.flags; if(A.aux_uword_a == 0) { flags |= solve_opts::flag_triu; } if(A.aux_uword_a == 1) { flags |= solve_opts::flag_tril; } return Glue(A.m, B.get_ref(), flags); } template inline typename enable_if2< is_supported_blas_type::value, bool >::result solve ( Mat& out, const Op& A, const Base& B ) { arma_extra_debug_sigprint(); uword flags = uword(0); if(A.aux_uword_a == 0) { flags |= solve_opts::flag_triu; } if(A.aux_uword_a == 1) { flags |= solve_opts::flag_tril; } const bool status = glue_solve_tri_default::apply(out, A.m, B.get_ref(), flags); if(status == false) { out.soft_reset(); arma_debug_warn_level(3, "solve(): solution not found"); } return status; } template inline typename enable_if2< is_supported_blas_type::value, bool >::result solve ( Mat& out, const Op& A, const Base& B, const solve_opts::opts& opts ) { arma_extra_debug_sigprint(); uword flags = opts.flags; if(A.aux_uword_a == 0) { flags |= solve_opts::flag_triu; } if(A.aux_uword_a == 1) { flags |= solve_opts::flag_tril; } const bool status = glue_solve_tri::apply(out, A.m, B.get_ref(), flags); if(status == false) { out.soft_reset(); arma_debug_warn_level(3, "solve(): solution not found"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_cx_attrib.hpp0000644000176200001440000000255414124060717024444 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { //! Tiny functions to check attributes of complex numbers struct cx_attrib { template arma_inline static bool is_real (const std::complex& v, const T eps) { return (std::abs(v.imag()) <= eps); } template arma_inline static bool is_complex(const std::complex& v, const T eps) { return (std::abs(v.imag()) > eps); } template arma_inline static bool is_conj(const std::complex& v1, const std::complex& v2, const T eps) { return (std::abs(v1 - std::conj(v2)) <= eps); } }; } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/glue_affmul_meat.hpp0000644000176200001440000003153714124060717024410 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_affmul //! @{ template inline void glue_affmul::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap U1(X.A); const quasi_unwrap U2(X.B); const bool is_alias = (U1.is_alias(out) || U2.is_alias(out)); if(is_alias == false) { glue_affmul::apply_noalias(out, U1.M, U2.M); } else { Mat tmp; glue_affmul::apply_noalias(tmp, U1.M, U2.M); out.steal_mem(tmp); } } template inline void glue_affmul::apply_noalias(Mat& out, const T1& A, const T2& B) { arma_extra_debug_sigprint(); const uword A_n_cols = A.n_cols; const uword A_n_rows = A.n_rows; const uword B_n_rows = B.n_rows; arma_debug_check( (A_n_cols != B_n_rows+1), "affmul(): size mismatch" ); if(A_n_rows == A_n_cols) { glue_affmul::apply_noalias_square(out, A, B); } else if(A_n_rows == B_n_rows) { glue_affmul::apply_noalias_rectangle(out, A, B); } else { glue_affmul::apply_noalias_generic(out, A, B); } } template inline void glue_affmul::apply_noalias_square(Mat& out, const T1& A, const T2& B) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // assuming that A is square sized, and A.n_cols = B.n_rows+1 const uword N = A.n_rows; const uword B_n_cols = B.n_cols; out.set_size(N, B_n_cols); if(out.n_elem == 0) { return; } const eT* A_mem = A.memptr(); switch(N) { case 0: break; case 1: // A is 1x1 out.fill(A_mem[0]); break; case 2: // A is 2x2 { if(B_n_cols == 1) { const eT* B_mem = B.memptr(); eT* out_mem = out.memptr(); const eT x = B_mem[0]; out_mem[0] = A_mem[0]*x + A_mem[2]; out_mem[1] = A_mem[1]*x + A_mem[3]; } else for(uword col=0; col < B_n_cols; ++col) { const eT* B_mem = B.colptr(col); eT* out_mem = out.colptr(col); const eT x = B_mem[0]; out_mem[0] = A_mem[0]*x + A_mem[2]; out_mem[1] = A_mem[1]*x + A_mem[3]; } } break; case 3: // A is 3x3 { if(B_n_cols == 1) { const eT* B_mem = B.memptr(); eT* out_mem = out.memptr(); const eT x = B_mem[0]; const eT y = B_mem[1]; out_mem[0] = A_mem[0]*x + A_mem[3]*y + A_mem[6]; out_mem[1] = A_mem[1]*x + A_mem[4]*y + A_mem[7]; out_mem[2] = A_mem[2]*x + A_mem[5]*y + A_mem[8]; } else for(uword col=0; col < B_n_cols; ++col) { const eT* B_mem = B.colptr(col); eT* out_mem = out.colptr(col); const eT x = B_mem[0]; const eT y = B_mem[1]; out_mem[0] = A_mem[0]*x + A_mem[3]*y + A_mem[6]; out_mem[1] = A_mem[1]*x + A_mem[4]*y + A_mem[7]; out_mem[2] = A_mem[2]*x + A_mem[5]*y + A_mem[8]; } } break; case 4: // A is 4x4 { if(B_n_cols == 1) { const eT* B_mem = B.memptr(); eT* out_mem = out.memptr(); const eT x = B_mem[0]; const eT y = B_mem[1]; const eT z = B_mem[2]; out_mem[0] = A_mem[ 0]*x + A_mem[ 4]*y + A_mem[ 8]*z + A_mem[12]; out_mem[1] = A_mem[ 1]*x + A_mem[ 5]*y + A_mem[ 9]*z + A_mem[13]; out_mem[2] = A_mem[ 2]*x + A_mem[ 6]*y + A_mem[10]*z + A_mem[14]; out_mem[3] = A_mem[ 3]*x + A_mem[ 7]*y + A_mem[11]*z + A_mem[15]; } else for(uword col=0; col < B_n_cols; ++col) { const eT* B_mem = B.colptr(col); eT* out_mem = out.colptr(col); const eT x = B_mem[0]; const eT y = B_mem[1]; const eT z = B_mem[2]; out_mem[0] = A_mem[ 0]*x + A_mem[ 4]*y + A_mem[ 8]*z + A_mem[12]; out_mem[1] = A_mem[ 1]*x + A_mem[ 5]*y + A_mem[ 9]*z + A_mem[13]; out_mem[2] = A_mem[ 2]*x + A_mem[ 6]*y + A_mem[10]*z + A_mem[14]; out_mem[3] = A_mem[ 3]*x + A_mem[ 7]*y + A_mem[11]*z + A_mem[15]; } } break; case 5: // A is 5x5 { if(B_n_cols == 1) { const eT* B_mem = B.memptr(); eT* out_mem = out.memptr(); const eT x = B_mem[0]; const eT y = B_mem[1]; const eT z = B_mem[2]; const eT w = B_mem[3]; out_mem[0] = A_mem[ 0]*x + A_mem[ 5]*y + A_mem[10]*z + A_mem[15]*w + A_mem[20]; out_mem[1] = A_mem[ 1]*x + A_mem[ 6]*y + A_mem[11]*z + A_mem[16]*w + A_mem[21]; out_mem[2] = A_mem[ 2]*x + A_mem[ 7]*y + A_mem[12]*z + A_mem[17]*w + A_mem[22]; out_mem[3] = A_mem[ 3]*x + A_mem[ 8]*y + A_mem[13]*z + A_mem[18]*w + A_mem[23]; out_mem[4] = A_mem[ 4]*x + A_mem[ 9]*y + A_mem[14]*z + A_mem[19]*w + A_mem[24]; } else for(uword col=0; col < B_n_cols; ++col) { const eT* B_mem = B.colptr(col); eT* out_mem = out.colptr(col); const eT x = B_mem[0]; const eT y = B_mem[1]; const eT z = B_mem[2]; const eT w = B_mem[3]; out_mem[0] = A_mem[ 0]*x + A_mem[ 5]*y + A_mem[10]*z + A_mem[15]*w + A_mem[20]; out_mem[1] = A_mem[ 1]*x + A_mem[ 6]*y + A_mem[11]*z + A_mem[16]*w + A_mem[21]; out_mem[2] = A_mem[ 2]*x + A_mem[ 7]*y + A_mem[12]*z + A_mem[17]*w + A_mem[22]; out_mem[3] = A_mem[ 3]*x + A_mem[ 8]*y + A_mem[13]*z + A_mem[18]*w + A_mem[23]; out_mem[4] = A_mem[ 4]*x + A_mem[ 9]*y + A_mem[14]*z + A_mem[19]*w + A_mem[24]; } } break; default: { if(B_n_cols == 1) { Col tmp(N, arma_nozeros_indicator()); eT* tmp_mem = tmp.memptr(); arrayops::copy(tmp_mem, B.memptr(), N-1); tmp_mem[N-1] = eT(1); out = A * tmp; } else { Mat tmp(N, B_n_cols, arma_nozeros_indicator()); for(uword col=0; col < B_n_cols; ++col) { const eT* B_mem = B.colptr(col); eT* tmp_mem = tmp.colptr(col); arrayops::copy(tmp_mem, B_mem, N-1); tmp_mem[N-1] = eT(1); } out = A * tmp; } } } } template inline void glue_affmul::apply_noalias_rectangle(Mat& out, const T1& A, const T2& B) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // assuming that A.n_rows = A.n_cols-1, and A.n_cols = B.n_rows+1 // (A and B have the same number of rows) const uword A_n_rows = A.n_rows; const uword B_n_cols = B.n_cols; out.set_size(A_n_rows, B_n_cols); if(out.n_elem == 0) { return; } const eT* A_mem = A.memptr(); switch(A_n_rows) { case 0: break; case 1: // A is 1x2 { if(B_n_cols == 1) { const eT* B_mem = B.memptr(); eT* out_mem = out.memptr(); const eT x = B_mem[0]; out_mem[0] = A_mem[0]*x + A_mem[1]; } else for(uword col=0; col < B_n_cols; ++col) { const eT* B_mem = B.colptr(col); eT* out_mem = out.colptr(col); const eT x = B_mem[0]; out_mem[0] = A_mem[0]*x + A_mem[1]; } } break; case 2: // A is 2x3 { if(B_n_cols == 1) { const eT* B_mem = B.memptr(); eT* out_mem = out.memptr(); const eT x = B_mem[0]; const eT y = B_mem[1]; out_mem[0] = A_mem[0]*x + A_mem[2]*y + A_mem[4]; out_mem[1] = A_mem[1]*x + A_mem[3]*y + A_mem[5]; } else for(uword col=0; col < B_n_cols; ++col) { const eT* B_mem = B.colptr(col); eT* out_mem = out.colptr(col); const eT x = B_mem[0]; const eT y = B_mem[1]; out_mem[0] = A_mem[0]*x + A_mem[2]*y + A_mem[4]; out_mem[1] = A_mem[1]*x + A_mem[3]*y + A_mem[5]; } } break; case 3: // A is 3x4 { if(B_n_cols == 1) { const eT* B_mem = B.memptr(); eT* out_mem = out.memptr(); const eT x = B_mem[0]; const eT y = B_mem[1]; const eT z = B_mem[2]; out_mem[0] = A_mem[ 0]*x + A_mem[ 3]*y + A_mem[ 6]*z + A_mem[ 9]; out_mem[1] = A_mem[ 1]*x + A_mem[ 4]*y + A_mem[ 7]*z + A_mem[10]; out_mem[2] = A_mem[ 2]*x + A_mem[ 5]*y + A_mem[ 8]*z + A_mem[11]; } else for(uword col=0; col < B_n_cols; ++col) { const eT* B_mem = B.colptr(col); eT* out_mem = out.colptr(col); const eT x = B_mem[0]; const eT y = B_mem[1]; const eT z = B_mem[2]; out_mem[0] = A_mem[ 0]*x + A_mem[ 3]*y + A_mem[ 6]*z + A_mem[ 9]; out_mem[1] = A_mem[ 1]*x + A_mem[ 4]*y + A_mem[ 7]*z + A_mem[10]; out_mem[2] = A_mem[ 2]*x + A_mem[ 5]*y + A_mem[ 8]*z + A_mem[11]; } } break; case 4: // A is 4x5 { if(B_n_cols == 1) { const eT* B_mem = B.memptr(); eT* out_mem = out.memptr(); const eT x = B_mem[0]; const eT y = B_mem[1]; const eT z = B_mem[2]; const eT w = B_mem[3]; out_mem[0] = A_mem[ 0]*x + A_mem[ 4]*y + A_mem[ 8]*z + A_mem[12]*w + A_mem[16]; out_mem[1] = A_mem[ 1]*x + A_mem[ 5]*y + A_mem[ 9]*z + A_mem[13]*w + A_mem[17]; out_mem[2] = A_mem[ 2]*x + A_mem[ 6]*y + A_mem[10]*z + A_mem[14]*w + A_mem[18]; out_mem[3] = A_mem[ 3]*x + A_mem[ 7]*y + A_mem[11]*z + A_mem[15]*w + A_mem[19]; } else for(uword col=0; col < B_n_cols; ++col) { const eT* B_mem = B.colptr(col); eT* out_mem = out.colptr(col); const eT x = B_mem[0]; const eT y = B_mem[1]; const eT z = B_mem[2]; const eT w = B_mem[3]; out_mem[0] = A_mem[ 0]*x + A_mem[ 4]*y + A_mem[ 8]*z + A_mem[12]*w + A_mem[16]; out_mem[1] = A_mem[ 1]*x + A_mem[ 5]*y + A_mem[ 9]*z + A_mem[13]*w + A_mem[17]; out_mem[2] = A_mem[ 2]*x + A_mem[ 6]*y + A_mem[10]*z + A_mem[14]*w + A_mem[18]; out_mem[3] = A_mem[ 3]*x + A_mem[ 7]*y + A_mem[11]*z + A_mem[15]*w + A_mem[19]; } } break; default: { const uword A_n_cols = A.n_cols; if(B_n_cols == 1) { Col tmp(A_n_cols, arma_nozeros_indicator()); eT* tmp_mem = tmp.memptr(); arrayops::copy(tmp_mem, B.memptr(), A_n_cols-1); tmp_mem[A_n_cols-1] = eT(1); out = A * tmp; } else { Mat tmp(A_n_cols, B_n_cols, arma_nozeros_indicator()); for(uword col=0; col < B_n_cols; ++col) { const eT* B_mem = B.colptr(col); eT* tmp_mem = tmp.colptr(col); arrayops::copy(tmp_mem, B_mem, A_n_cols-1); tmp_mem[A_n_cols-1] = eT(1); } out = A * tmp; } } } } template inline void glue_affmul::apply_noalias_generic(Mat& out, const T1& A, const T2& B) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // assuming that A.n_cols = B.n_rows+1 const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; Mat tmp(B_n_rows+1, B_n_cols, arma_nozeros_indicator()); for(uword col=0; col < B_n_cols; ++col) { const eT* B_mem = B.colptr(col); eT* tmp_mem = tmp.colptr(col); arrayops::copy(tmp_mem, B_mem, B_n_rows); tmp_mem[B_n_rows] = eT(1); } out = A * tmp; } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_spsolve.hpp0000644000176200001440000001274114124060717023266 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_spsolve //! @{ //! Solve a system of linear equations, A*X = B, where X is unknown, //! A is sparse, and B is dense. X will be dense too. template inline bool spsolve_helper ( Mat& out, const SpBase& A, const Base& B, const char* solver, const spsolve_opts_base& settings, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::pod_type T; typedef typename T1::elem_type eT; const char sig = (solver != nullptr) ? solver[0] : char(0); arma_debug_check( ((sig != 'l') && (sig != 's')), "spsolve(): unknown solver" ); T rcond = T(0); bool status = false; superlu_opts superlu_opts_default; // if(is_float ::value) { superlu_opts_default.refine = superlu_opts::REF_SINGLE; } // if(is_double::value) { superlu_opts_default.refine = superlu_opts::REF_DOUBLE; } const superlu_opts& opts = (settings.id == 1) ? static_cast(settings) : superlu_opts_default; arma_debug_check( ( (opts.pivot_thresh < double(0)) || (opts.pivot_thresh > double(1)) ), "spsolve(): pivot_thresh must be in the [0,1] interval" ); if(sig == 's') // SuperLU solver { if( (opts.equilibrate == false) && (opts.refine == superlu_opts::REF_NONE) ) { status = sp_auxlib::spsolve_simple(out, A.get_ref(), B.get_ref(), opts); } else { status = sp_auxlib::spsolve_refine(out, rcond, A.get_ref(), B.get_ref(), opts); } } else if(sig == 'l') // brutal LAPACK solver { if( (settings.id != 0) && ((opts.symmetric) || (opts.pivot_thresh != double(1))) ) { arma_debug_warn_level(1, "spsolve(): ignoring settings not applicable to LAPACK based solver"); } Mat AA; bool conversion_ok = false; try { Mat tmp(A.get_ref()); // conversion from sparse to dense can throw std::bad_alloc AA.steal_mem(tmp); conversion_ok = true; } catch(...) { arma_debug_warn_level(1, "spsolve(): not enough memory to use LAPACK based solver"); } if(conversion_ok) { arma_debug_check( (AA.n_rows != AA.n_cols), "spsolve(): matrix A must be square sized" ); uword flags = solve_opts::flag_none; if(opts.refine != superlu_opts::REF_NONE) { flags |= solve_opts::flag_refine; } if(opts.equilibrate == true ) { flags |= solve_opts::flag_equilibrate; } if(opts.allow_ugly == true ) { flags |= solve_opts::flag_allow_ugly; } status = glue_solve_gen::apply(out, AA, B.get_ref(), flags); } } if( (status == false) && (rcond > T(0)) ) { arma_debug_warn_level(2, "spsolve(): system is singular (rcond: ", rcond, ")"); } if( (status == true) && (rcond > T(0)) && (rcond < auxlib::epsilon_lapack(out)) ) { arma_debug_warn_level(2, "solve(): solution computed, but system is singular to working precision (rcond: ", rcond, ")"); } return status; } template inline bool spsolve ( Mat& out, const SpBase& A, const Base& B, const char* solver = "superlu", const spsolve_opts_base& settings = spsolve_opts_none(), const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); const bool status = spsolve_helper(out, A.get_ref(), B.get_ref(), solver, settings); if(status == false) { out.soft_reset(); arma_debug_warn_level(3, "spsolve(): solution not found"); } return status; } template arma_warn_unused inline Mat spsolve ( const SpBase& A, const Base& B, const char* solver = "superlu", const spsolve_opts_base& settings = spsolve_opts_none(), const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; Mat out; const bool status = spsolve_helper(out, A.get_ref(), B.get_ref(), solver, settings); if(status == false) { out.soft_reset(); arma_stop_runtime_error("spsolve(): solution not found"); } return out; } //! @} RcppArmadillo/inst/include/armadillo_bits/def_lapack.hpp0000644000176200001440000034234314124060717023165 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #ifdef ARMA_USE_LAPACK #if defined(dgetrf) || defined(DGETRF) #pragma message ("WARNING: detected possible interference with definitions of LAPACK functions;") #pragma message ("WARNING: include the armadillo header before any other header as a workaround") #endif #if defined(ARMA_LAPACK_NOEXCEPT) #undef ARMA_NOEXCEPT #define ARMA_NOEXCEPT noexcept #else #undef ARMA_NOEXCEPT #define ARMA_NOEXCEPT #endif #if !defined(ARMA_BLAS_CAPITALS) #define arma_sgetrf sgetrf #define arma_dgetrf dgetrf #define arma_cgetrf cgetrf #define arma_zgetrf zgetrf #define arma_sgetrs sgetrs #define arma_dgetrs dgetrs #define arma_cgetrs cgetrs #define arma_zgetrs zgetrs #define arma_sgetri sgetri #define arma_dgetri dgetri #define arma_cgetri cgetri #define arma_zgetri zgetri #define arma_strtri strtri #define arma_dtrtri dtrtri #define arma_ctrtri ctrtri #define arma_ztrtri ztrtri #define arma_sgeev sgeev #define arma_dgeev dgeev #define arma_cgeev cgeev #define arma_zgeev zgeev #define arma_sgeevx sgeevx #define arma_dgeevx dgeevx #define arma_cgeevx cgeevx #define arma_zgeevx zgeevx #define arma_ssyev ssyev #define arma_dsyev dsyev #define arma_cheev cheev #define arma_zheev zheev #define arma_ssyevd ssyevd #define arma_dsyevd dsyevd #define arma_cheevd cheevd #define arma_zheevd zheevd #define arma_sggev sggev #define arma_dggev dggev #define arma_cggev cggev #define arma_zggev zggev #define arma_spotrf spotrf #define arma_dpotrf dpotrf #define arma_cpotrf cpotrf #define arma_zpotrf zpotrf #define arma_spotrs spotrs #define arma_dpotrs dpotrs #define arma_cpotrs cpotrs #define arma_zpotrs zpotrs #define arma_spbtrf spbtrf #define arma_dpbtrf dpbtrf #define arma_cpbtrf cpbtrf #define arma_zpbtrf zpbtrf #define arma_spotri spotri #define arma_dpotri dpotri #define arma_cpotri cpotri #define arma_zpotri zpotri #define arma_sgeqrf sgeqrf #define arma_dgeqrf dgeqrf #define arma_cgeqrf cgeqrf #define arma_zgeqrf zgeqrf #define arma_sgeqp3 sgeqp3 #define arma_dgeqp3 dgeqp3 #define arma_cgeqp3 cgeqp3 #define arma_zgeqp3 zgeqp3 #define arma_sorgqr sorgqr #define arma_dorgqr dorgqr #define arma_cungqr cungqr #define arma_zungqr zungqr #define arma_sgesvd sgesvd #define arma_dgesvd dgesvd #define arma_cgesvd cgesvd #define arma_zgesvd zgesvd #define arma_sgesdd sgesdd #define arma_dgesdd dgesdd #define arma_cgesdd cgesdd #define arma_zgesdd zgesdd #define arma_sgesv sgesv #define arma_dgesv dgesv #define arma_cgesv cgesv #define arma_zgesv zgesv #define arma_sgesvx sgesvx #define arma_dgesvx dgesvx #define arma_cgesvx cgesvx #define arma_zgesvx zgesvx #define arma_sposv sposv #define arma_dposv dposv #define arma_cposv cposv #define arma_zposv zposv #define arma_sposvx sposvx #define arma_dposvx dposvx #define arma_cposvx cposvx #define arma_zposvx zposvx #define arma_sgels sgels #define arma_dgels dgels #define arma_cgels cgels #define arma_zgels zgels #define arma_sgelsd sgelsd #define arma_dgelsd dgelsd #define arma_cgelsd cgelsd #define arma_zgelsd zgelsd #define arma_strtrs strtrs #define arma_dtrtrs dtrtrs #define arma_ctrtrs ctrtrs #define arma_ztrtrs ztrtrs #define arma_sgbtrf sgbtrf #define arma_dgbtrf dgbtrf #define arma_cgbtrf cgbtrf #define arma_zgbtrf zgbtrf #define arma_sgbtrs sgbtrs #define arma_dgbtrs dgbtrs #define arma_cgbtrs cgbtrs #define arma_zgbtrs zgbtrs #define arma_sgbsv sgbsv #define arma_dgbsv dgbsv #define arma_cgbsv cgbsv #define arma_zgbsv zgbsv #define arma_sgbsvx sgbsvx #define arma_dgbsvx dgbsvx #define arma_cgbsvx cgbsvx #define arma_zgbsvx zgbsvx #define arma_sgtsv sgtsv #define arma_dgtsv dgtsv #define arma_cgtsv cgtsv #define arma_zgtsv zgtsv #define arma_sgtsvx sgtsvx #define arma_dgtsvx dgtsvx #define arma_cgtsvx cgtsvx #define arma_zgtsvx zgtsvx #define arma_sgees sgees #define arma_dgees dgees #define arma_cgees cgees #define arma_zgees zgees #define arma_strsyl strsyl #define arma_dtrsyl dtrsyl #define arma_ctrsyl ctrsyl #define arma_ztrsyl ztrsyl #define arma_sgges sgges #define arma_dgges dgges #define arma_cgges cgges #define arma_zgges zgges #define arma_slange slange #define arma_dlange dlange #define arma_clange clange #define arma_zlange zlange #define arma_slansy slansy #define arma_dlansy dlansy #define arma_clansy clansy #define arma_zlansy zlansy #define arma_clanhe clanhe #define arma_zlanhe zlanhe #define arma_slangb slangb #define arma_dlangb dlangb #define arma_clangb clangb #define arma_zlangb zlangb #define arma_sgecon sgecon #define arma_dgecon dgecon #define arma_cgecon cgecon #define arma_zgecon zgecon #define arma_spocon spocon #define arma_dpocon dpocon #define arma_cpocon cpocon #define arma_zpocon zpocon #define arma_strcon strcon #define arma_dtrcon dtrcon #define arma_ctrcon ctrcon #define arma_ztrcon ztrcon #define arma_sgbcon sgbcon #define arma_dgbcon dgbcon #define arma_cgbcon cgbcon #define arma_zgbcon zgbcon #define arma_ilaenv ilaenv #define arma_slahqr slahqr #define arma_dlahqr dlahqr #define arma_sstedc sstedc #define arma_dstedc dstedc #define arma_strevc strevc #define arma_dtrevc dtrevc #define arma_slarnv slarnv #define arma_dlarnv dlarnv #define arma_sgehrd sgehrd #define arma_dgehrd dgehrd #define arma_cgehrd cgehrd #define arma_zgehrd zgehrd #define arma_spstrf spstrf #define arma_dpstrf dpstrf #define arma_cpstrf cpstrf #define arma_zpstrf zpstrf #else #define arma_sgetrf SGETRF #define arma_dgetrf DGETRF #define arma_cgetrf CGETRF #define arma_zgetrf ZGETRF #define arma_sgetrs SGETRS #define arma_dgetrs DGETRS #define arma_cgetrs CGETRS #define arma_zgetrs ZGETRS #define arma_sgetri SGETRI #define arma_dgetri DGETRI #define arma_cgetri CGETRI #define arma_zgetri ZGETRI #define arma_strtri STRTRI #define arma_dtrtri DTRTRI #define arma_ctrtri CTRTRI #define arma_ztrtri ZTRTRI #define arma_sgeev SGEEV #define arma_dgeev DGEEV #define arma_cgeev CGEEV #define arma_zgeev ZGEEV #define arma_sgeevx SGEEVX #define arma_dgeevx DGEEVX #define arma_cgeevx CGEEVX #define arma_zgeevx ZGEEVX #define arma_ssyev SSYEV #define arma_dsyev DSYEV #define arma_cheev CHEEV #define arma_zheev ZHEEV #define arma_ssyevd SSYEVD #define arma_dsyevd DSYEVD #define arma_cheevd CHEEVD #define arma_zheevd ZHEEVD #define arma_sggev SGGEV #define arma_dggev DGGEV #define arma_cggev CGGEV #define arma_zggev ZGGEV #define arma_spotrf SPOTRF #define arma_dpotrf DPOTRF #define arma_cpotrf CPOTRF #define arma_zpotrf ZPOTRF #define arma_spotrs SPOTRS #define arma_dpotrs DPOTRS #define arma_cpotrs CPOTRS #define arma_zpotrs ZPOTRS #define arma_spbtrf SPBTRF #define arma_dpbtrf DPBTRF #define arma_cpbtrf CPBTRF #define arma_zpbtrf ZPBTRF #define arma_spotri SPOTRI #define arma_dpotri DPOTRI #define arma_cpotri CPOTRI #define arma_zpotri ZPOTRI #define arma_sgeqrf SGEQRF #define arma_dgeqrf DGEQRF #define arma_cgeqrf CGEQRF #define arma_zgeqrf ZGEQRF #define arma_sgeqp3 SGEQP3 #define arma_dgeqp3 DGEQP3 #define arma_cgeqp3 CGEQP3 #define arma_zgeqp3 ZGEQP3 #define arma_sorgqr SORGQR #define arma_dorgqr DORGQR #define arma_cungqr CUNGQR #define arma_zungqr ZUNGQR #define arma_sgesvd SGESVD #define arma_dgesvd DGESVD #define arma_cgesvd CGESVD #define arma_zgesvd ZGESVD #define arma_sgesdd SGESDD #define arma_dgesdd DGESDD #define arma_cgesdd CGESDD #define arma_zgesdd ZGESDD #define arma_sgesv SGESV #define arma_dgesv DGESV #define arma_cgesv CGESV #define arma_zgesv ZGESV #define arma_sgesvx SGESVX #define arma_dgesvx DGESVX #define arma_cgesvx CGESVX #define arma_zgesvx ZGESVX #define arma_sposv SPOSV #define arma_dposv DPOSV #define arma_cposv CPOSV #define arma_zposv ZPOSV #define arma_sposvx SPOSVX #define arma_dposvx DPOSVX #define arma_cposvx CPOSVX #define arma_zposvx ZPOSVX #define arma_sgels SGELS #define arma_dgels DGELS #define arma_cgels CGELS #define arma_zgels ZGELS #define arma_sgelsd SGELSD #define arma_dgelsd DGELSD #define arma_cgelsd CGELSD #define arma_zgelsd ZGELSD #define arma_strtrs STRTRS #define arma_dtrtrs DTRTRS #define arma_ctrtrs CTRTRS #define arma_ztrtrs ZTRTRS #define arma_sgbtrf SGBTRF #define arma_dgbtrf DGBTRF #define arma_cgbtrf CGBTRF #define arma_zgbtrf ZGBTRF #define arma_sgbtrs SGBTRS #define arma_dgbtrs DGBTRS #define arma_cgbtrs CGBTRS #define arma_zgbtrs ZGBTRS #define arma_sgbsv SGBSV #define arma_dgbsv DGBSV #define arma_cgbsv CGBSV #define arma_zgbsv ZGBSV #define arma_sgbsvx SGBSVX #define arma_dgbsvx DGBSVX #define arma_cgbsvx CGBSVX #define arma_zgbsvx ZGBSVX #define arma_sgtsv SGTSV #define arma_dgtsv DGTSV #define arma_cgtsv CGTSV #define arma_zgtsv ZGTSV #define arma_sgtsvx SGTSVX #define arma_dgtsvx DGTSVX #define arma_cgtsvx CGTSVX #define arma_zgtsvx ZGTSVX #define arma_sgees SGEES #define arma_dgees DGEES #define arma_cgees CGEES #define arma_zgees ZGEES #define arma_strsyl STRSYL #define arma_dtrsyl DTRSYL #define arma_ctrsyl CTRSYL #define arma_ztrsyl ZTRSYL #define arma_sgges SGGES #define arma_dgges DGGES #define arma_cgges CGGES #define arma_zgges ZGGES #define arma_slange SLANGE #define arma_dlange DLANGE #define arma_clange CLANGE #define arma_zlange ZLANGE #define arma_slansy SLANSY #define arma_dlansy DLANSY #define arma_clansy CLANSY #define arma_zlansy ZLANSY #define arma_clanhe CLANHE #define arma_zlanhe ZLANHE #define arma_slangb SLANGB #define arma_dlangb DLANGB #define arma_clangb CLANGB #define arma_zlangb ZLANGB #define arma_sgecon SGECON #define arma_dgecon DGECON #define arma_cgecon CGECON #define arma_zgecon ZGECON #define arma_spocon SPOCON #define arma_dpocon DPOCON #define arma_cpocon CPOCON #define arma_zpocon ZPOCON #define arma_strcon STRCON #define arma_dtrcon DTRCON #define arma_ctrcon CTRCON #define arma_ztrcon ZTRCON #define arma_sgbcon SGBCON #define arma_dgbcon DGBCON #define arma_cgbcon CGBCON #define arma_zgbcon ZGBCON #define arma_ilaenv ILAENV #define arma_slahqr SLAHQR #define arma_dlahqr DLAHQR #define arma_sstedc SSTEDC #define arma_dstedc DSTEDC #define arma_strevc STREVC #define arma_dtrevc DTREVC #define arma_slarnv SLARNV #define arma_dlarnv DLARNV #define arma_sgehrd SGEHRD #define arma_dgehrd DGEHRD #define arma_cgehrd CGEHRD #define arma_zgehrd ZGEHRD #define arma_spstrf SPSTRF #define arma_dpstrf DPSTRF #define arma_cpstrf CPSTRF #define arma_zpstrf ZPSTRF #endif typedef blas_int (*fn_select_s2) (const float*, const float* ); typedef blas_int (*fn_select_s3) (const float*, const float*, const float*); typedef blas_int (*fn_select_d2) (const double*, const double* ); typedef blas_int (*fn_select_d3) (const double*, const double*, const double*); typedef blas_int (*fn_select_c1) (const blas_cxf* ); typedef blas_int (*fn_select_c2) (const blas_cxf*, const blas_cxf*); typedef blas_int (*fn_select_z1) (const blas_cxd* ); typedef blas_int (*fn_select_z2) (const blas_cxd*, const blas_cxd*); // NOTE: "For arguments of CHARACTER type, the character length is passed as a hidden argument at the end of the argument list." // NOTE: https://gcc.gnu.org/onlinedocs/gfortran/Argument-passing-conventions.html extern "C" { #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) // LU decomposition void arma_fortran(arma_sgetrf)(const blas_int* m, const blas_int* n, float* a, const blas_int* lda, blas_int* ipiv, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgetrf)(const blas_int* m, const blas_int* n, double* a, const blas_int* lda, blas_int* ipiv, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgetrf)(const blas_int* m, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_int* ipiv, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgetrf)(const blas_int* m, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_int* ipiv, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations using pre-computed LU decomposition void arma_fortran(arma_sgetrs)(const char* trans, const blas_int* n, const blas_int* nrhs, const float* a, const blas_int* lda, const blas_int* ipiv, float* b, const blas_int* ldb, blas_int* info, const blas_len trans_len) ARMA_NOEXCEPT; void arma_fortran(arma_dgetrs)(const char* trans, const blas_int* n, const blas_int* nrhs, const double* a, const blas_int* lda, const blas_int* ipiv, double* b, const blas_int* ldb, blas_int* info, const blas_len trans_len) ARMA_NOEXCEPT; void arma_fortran(arma_cgetrs)(const char* trans, const blas_int* n, const blas_int* nrhs, const blas_cxf* a, const blas_int* lda, const blas_int* ipiv, blas_cxf* b, const blas_int* ldb, blas_int* info, const blas_len trans_len) ARMA_NOEXCEPT; void arma_fortran(arma_zgetrs)(const char* trans, const blas_int* n, const blas_int* nrhs, const blas_cxd* a, const blas_int* lda, const blas_int* ipiv, blas_cxd* b, const blas_int* ldb, blas_int* info, const blas_len trans_len) ARMA_NOEXCEPT; // matrix inversion (using pre-computed LU decomposition) void arma_fortran(arma_sgetri)(const blas_int* n, float* a, const blas_int* lda, const blas_int* ipiv, float* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgetri)(const blas_int* n, double* a, const blas_int* lda, const blas_int* ipiv, double* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgetri)(const blas_int* n, blas_cxf* a, const blas_int* lda, const blas_int* ipiv, blas_cxf* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgetri)(const blas_int* n, blas_cxd* a, const blas_int* lda, const blas_int* ipiv, blas_cxd* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; // matrix inversion (triangular matrices) void arma_fortran(arma_strtri)(const char* uplo, const char* diag, const blas_int* n, float* a, const blas_int* lda, blas_int* info, blas_len uplo_len, blas_len diag_len) ARMA_NOEXCEPT; void arma_fortran(arma_dtrtri)(const char* uplo, const char* diag, const blas_int* n, double* a, const blas_int* lda, blas_int* info, blas_len uplo_len, blas_len diag_len) ARMA_NOEXCEPT; void arma_fortran(arma_ctrtri)(const char* uplo, const char* diag, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_int* info, blas_len uplo_len, blas_len diag_len) ARMA_NOEXCEPT; void arma_fortran(arma_ztrtri)(const char* uplo, const char* diag, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_int* info, blas_len uplo_len, blas_len diag_len) ARMA_NOEXCEPT; // eigen decomposition of general matrix (real) void arma_fortran(arma_sgeev)(const char* jobvl, const char* jobvr, const blas_int* n, float* a, const blas_int* lda, float* wr, float* wi, float* vl, const blas_int* ldvl, float* vr, const blas_int* ldvr, float* work, const blas_int* lwork, blas_int* info, blas_len jobvl_len, blas_len jobvr_len) ARMA_NOEXCEPT; void arma_fortran(arma_dgeev)(const char* jobvl, const char* jobvr, const blas_int* n, double* a, const blas_int* lda, double* wr, double* wi, double* vl, const blas_int* ldvl, double* vr, const blas_int* ldvr, double* work, const blas_int* lwork, blas_int* info, blas_len jobvl_len, blas_len jobvr_len) ARMA_NOEXCEPT; // eigen decomposition of general matrix (complex) void arma_fortran(arma_cgeev)(const char* jobvl, const char* jobvr, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_cxf* w, blas_cxf* vl, const blas_int* ldvl, blas_cxf* vr, const blas_int* ldvr, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* info, blas_len jobvl_len, blas_len jobvr_len) ARMA_NOEXCEPT; void arma_fortran(arma_zgeev)(const char* jobvl, const char* jobvr, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_cxd* w, blas_cxd* vl, const blas_int* ldvl, blas_cxd* vr, const blas_int* ldvr, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* info, blas_len jobvl_len, blas_len jobvr_len) ARMA_NOEXCEPT; // eigen decomposition of general matrix (real; advanced form) void arma_fortran(arma_sgeevx)(const char* balanc, const char* jobvl, const char* jobvr, const char* sense, const blas_int* n, float* a, const blas_int* lda, float* wr, float* wi, float* vl, const blas_int* ldvl, float* vr, const blas_int* ldvr, blas_int* ilo, blas_int* ihi, float* scale, float* abnrm, float* rconde, float* rcondv, float* work, const blas_int* lwork, blas_int* iwork, blas_int* info, blas_len balanc_len, blas_len jobvl_len, blas_len jobvr_len, blas_len sense_len) ARMA_NOEXCEPT; void arma_fortran(arma_dgeevx)(const char* balanc, const char* jobvl, const char* jobvr, const char* sense, const blas_int* n, double* a, const blas_int* lda, double* wr, double* wi, double* vl, const blas_int* ldvl, double* vr, const blas_int* ldvr, blas_int* ilo, blas_int* ihi, double* scale, double* abnrm, double* rconde, double* rcondv, double* work, const blas_int* lwork, blas_int* iwork, blas_int* info, blas_len balanc_len, blas_len jobvl_len, blas_len jobvr_len, blas_len sense_len) ARMA_NOEXCEPT; // eigen decomposition of general matrix (complex; advanced form) void arma_fortran(arma_cgeevx)(const char* balanc, const char* jobvl, const char* jobvr, const char* sense, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_cxf* w, blas_cxf* vl, const blas_int* ldvl, blas_cxf* vr, const blas_int* ldvr, blas_int* ilo, blas_int* ihi, float* scale, float* abnrm, float* rconde, float* rcondv, blas_cxf* work, const blas_int* lwork, float* rwork, const blas_int* info, blas_len balanc_len, blas_len jobvl_len, blas_len jobvr_len, blas_len sense_len) ARMA_NOEXCEPT; void arma_fortran(arma_zgeevx)(const char* balanc, const char* jobvl, const char* jobvr, const char* sense, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_cxd* w, blas_cxd* vl, const blas_int* ldvl, blas_cxd* vr, const blas_int* ldvr, blas_int* ilo, blas_int* ihi, double* scale, double* abnrm, double* rconde, double* rcondv, blas_cxd* work, const blas_int* lwork, double* rwork, const blas_int* info, blas_len balanc_len, blas_len jobvl_len, blas_len jobvr_len, blas_len sense_len) ARMA_NOEXCEPT; // eigen decomposition of symmetric real matrices void arma_fortran(arma_ssyev)(const char* jobz, const char* uplo, const blas_int* n, float* a, const blas_int* lda, float* w, float* work, const blas_int* lwork, blas_int* info, blas_len jobz_len, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_dsyev)(const char* jobz, const char* uplo, const blas_int* n, double* a, const blas_int* lda, double* w, double* work, const blas_int* lwork, blas_int* info, blas_len jobz_len, blas_len uplo_len) ARMA_NOEXCEPT; // eigen decomposition of hermitian matrices (complex) void arma_fortran(arma_cheev)(const char* jobz, const char* uplo, const blas_int* n, blas_cxf* a, const blas_int* lda, float* w, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* info, blas_len jobz_len, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_zheev)(const char* jobz, const char* uplo, const blas_int* n, blas_cxd* a, const blas_int* lda, double* w, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* info, blas_len jobz_len, blas_len uplo_len) ARMA_NOEXCEPT; // eigen decomposition of symmetric real matrices by divide and conquer void arma_fortran(arma_ssyevd)(const char* jobz, const char* uplo, const blas_int* n, float* a, const blas_int* lda, float* w, float* work, const blas_int* lwork, blas_int* iwork, const blas_int* liwork, blas_int* info, blas_len jobz_len, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_dsyevd)(const char* jobz, const char* uplo, const blas_int* n, double* a, const blas_int* lda, double* w, double* work, const blas_int* lwork, blas_int* iwork, const blas_int* liwork, blas_int* info, blas_len jobz_len, blas_len uplo_len) ARMA_NOEXCEPT; // eigen decomposition of hermitian matrices (complex) by divide and conquer void arma_fortran(arma_cheevd)(const char* jobz, const char* uplo, const blas_int* n, blas_cxf* a, const blas_int* lda, float* w, blas_cxf* work, const blas_int* lwork, float* rwork, const blas_int* lrwork, blas_int* iwork, const blas_int* liwork, blas_int* info, blas_len jobz_len, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_zheevd)(const char* jobz, const char* uplo, const blas_int* n, blas_cxd* a, const blas_int* lda, double* w, blas_cxd* work, const blas_int* lwork, double* rwork, const blas_int* lrwork, blas_int* iwork, const blas_int* liwork, blas_int* info, blas_len jobz_len, blas_len uplo_len) ARMA_NOEXCEPT; // eigen decomposition of general real matrix pair void arma_fortran(arma_sggev)(const char* jobvl, const char* jobvr, const blas_int* n, float* a, const blas_int* lda, float* b, const blas_int* ldb, float* alphar, float* alphai, float* beta, float* vl, const blas_int* ldvl, float* vr, const blas_int* ldvr, float* work, const blas_int* lwork, blas_int* info, blas_len jobvl_len, blas_len jobvr_len) ARMA_NOEXCEPT; void arma_fortran(arma_dggev)(const char* jobvl, const char* jobvr, const blas_int* n, double* a, const blas_int* lda, double* b, const blas_int* ldb, double* alphar, double* alphai, double* beta, double* vl, const blas_int* ldvl, double* vr, const blas_int* ldvr, double* work, const blas_int* lwork, blas_int* info, blas_len jobvl_len, blas_len jobvr_len) ARMA_NOEXCEPT; // eigen decomposition of general complex matrix pair void arma_fortran(arma_cggev)(const char* jobvl, const char* jobvr, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_cxf* b, const blas_int* ldb, blas_cxf* alpha, blas_cxf* beta, blas_cxf* vl, const blas_int* ldvl, blas_cxf* vr, const blas_int* ldvr, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* info, blas_len jobvl_len, blas_len jobvr_len) ARMA_NOEXCEPT; void arma_fortran(arma_zggev)(const char* jobvl, const char* jobvr, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_cxd* b, const blas_int* ldb, blas_cxd* alpha, blas_cxd* beta, blas_cxd* vl, const blas_int* ldvl, blas_cxd* vr, const blas_int* ldvr, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* info, blas_len jobvl_len, blas_len jobvr_len) ARMA_NOEXCEPT; // Cholesky decomposition void arma_fortran(arma_spotrf)(const char* uplo, const blas_int* n, float* a, const blas_int* lda, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_dpotrf)(const char* uplo, const blas_int* n, double* a, const blas_int* lda, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_cpotrf)(const char* uplo, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_zpotrf)(const char* uplo, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; // solve system of linear equations using pre-computed Cholesky decomposition void arma_fortran(arma_spotrs)(const char* uplo, const blas_int* n, const blas_int* nrhs, const float* a, const blas_int* lda, float* b, const blas_int* ldb, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_dpotrs)(const char* uplo, const blas_int* n, const blas_int* nrhs, const double* a, const blas_int* lda, double* b, const blas_int* ldb, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_cpotrs)(const char* uplo, const blas_int* n, const blas_int* nrhs, const blas_cxf* a, const blas_int* lda, blas_cxf* b, const blas_int* ldb, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_zpotrs)(const char* uplo, const blas_int* n, const blas_int* nrhs, const blas_cxd* a, const blas_int* lda, blas_cxd* b, const blas_int* ldb, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; // Cholesky decomposition (band matrices) void arma_fortran(arma_spbtrf)(const char* uplo, const blas_int* n, const blas_int* kd, float* ab, const blas_int* ldab, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_dpbtrf)(const char* uplo, const blas_int* n, const blas_int* kd, double* ab, const blas_int* ldab, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_cpbtrf)(const char* uplo, const blas_int* n, const blas_int* kd, blas_cxf* ab, const blas_int* ldab, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_zpbtrf)(const char* uplo, const blas_int* n, const blas_int* kd, blas_cxd* ab, const blas_int* ldab, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; // matrix inversion (using pre-computed Cholesky decomposition) void arma_fortran(arma_spotri)(const char* uplo, const blas_int* n, float* a, const blas_int* lda, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_dpotri)(const char* uplo, const blas_int* n, double* a, const blas_int* lda, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_cpotri)(const char* uplo, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_zpotri)(const char* uplo, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; // QR decomposition void arma_fortran(arma_sgeqrf)(const blas_int* m, const blas_int* n, float* a, const blas_int* lda, float* tau, float* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgeqrf)(const blas_int* m, const blas_int* n, double* a, const blas_int* lda, double* tau, double* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgeqrf)(const blas_int* m, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_cxf* tau, blas_cxf* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgeqrf)(const blas_int* m, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_cxd* tau, blas_cxd* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; // QR decomposition with pivoting (real matrices) void arma_fortran(arma_sgeqp3)(const blas_int* m, const blas_int* n, float* a, const blas_int* lda, blas_int* jpvt, float* tau, float* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgeqp3)(const blas_int* m, const blas_int* n, double* a, const blas_int* lda, blas_int* jpvt, double* tau, double* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; // QR decomposition with pivoting (complex matrices) void arma_fortran(arma_cgeqp3)(const blas_int* m, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_int* jpvt, blas_cxf* tau, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgeqp3)(const blas_int* m, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_int* jpvt, blas_cxd* tau, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* info) ARMA_NOEXCEPT; // Q matrix calculation from QR decomposition (real matrices) void arma_fortran(arma_sorgqr)(const blas_int* m, const blas_int* n, const blas_int* k, float* a, const blas_int* lda, const float* tau, float* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dorgqr)(const blas_int* m, const blas_int* n, const blas_int* k, double* a, const blas_int* lda, const double* tau, double* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; // Q matrix calculation from QR decomposition (complex matrices) void arma_fortran(arma_cungqr)(const blas_int* m, const blas_int* n, const blas_int* k, blas_cxf* a, const blas_int* lda, const blas_cxf* tau, blas_cxf* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zungqr)(const blas_int* m, const blas_int* n, const blas_int* k, blas_cxd* a, const blas_int* lda, const blas_cxd* tau, blas_cxd* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; // SVD (real matrices) void arma_fortran(arma_sgesvd)(const char* jobu, const char* jobvt, const blas_int* m, const blas_int* n, float* a, const blas_int* lda, float* s, float* u, const blas_int* ldu, float* vt, const blas_int* ldvt, float* work, const blas_int* lwork, blas_int* info, blas_len jobu_len, blas_len jobvt_len) ARMA_NOEXCEPT; void arma_fortran(arma_dgesvd)(const char* jobu, const char* jobvt, const blas_int* m, const blas_int* n, double* a, const blas_int* lda, double* s, double* u, const blas_int* ldu, double* vt, const blas_int* ldvt, double* work, const blas_int* lwork, blas_int* info, blas_len jobu_len, blas_len jobvt_len) ARMA_NOEXCEPT; // SVD (complex matrices) void arma_fortran(arma_cgesvd)(const char* jobu, const char* jobvt, const blas_int* m, const blas_int* n, blas_cxf* a, const blas_int* lda, float* s, blas_cxf* u, const blas_int* ldu, blas_cxf* vt, const blas_int* ldvt, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* info, blas_len jobu_len, blas_len jobvt_len) ARMA_NOEXCEPT; void arma_fortran(arma_zgesvd)(const char* jobu, const char* jobvt, const blas_int* m, const blas_int* n, blas_cxd* a, const blas_int* lda, double* s, blas_cxd* u, const blas_int* ldu, blas_cxd* vt, const blas_int* ldvt, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* info, blas_len jobu_len, blas_len jobvt_len) ARMA_NOEXCEPT; // SVD (real matrices) by divide and conquer void arma_fortran(arma_sgesdd)(const char* jobz, const blas_int* m, const blas_int* n, float* a, const blas_int* lda, float* s, float* u, const blas_int* ldu, float* vt, const blas_int* ldvt, float* work, const blas_int* lwork, blas_int* iwork, blas_int* info, blas_len jobz_len) ARMA_NOEXCEPT; void arma_fortran(arma_dgesdd)(const char* jobz, const blas_int* m, const blas_int* n, double* a, const blas_int* lda, double* s, double* u, const blas_int* ldu, double* vt, const blas_int* ldvt, double* work, const blas_int* lwork, blas_int* iwork, blas_int* info, blas_len jobz_len) ARMA_NOEXCEPT; // SVD (complex matrices) by divide and conquer void arma_fortran(arma_cgesdd)(const char* jobz, const blas_int* m, const blas_int* n, blas_cxf* a, const blas_int* lda, float* s, blas_cxf* u, const blas_int* ldu, blas_cxf* vt, const blas_int* ldvt, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* iwork, blas_int* info, blas_len jobz_len) ARMA_NOEXCEPT; void arma_fortran(arma_zgesdd)(const char* jobz, const blas_int* m, const blas_int* n, blas_cxd* a, const blas_int* lda, double* s, blas_cxd* u, const blas_int* ldu, blas_cxd* vt, const blas_int* ldvt, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* iwork, blas_int* info, blas_len jobz_len) ARMA_NOEXCEPT; // solve system of linear equations (general square matrix) void arma_fortran(arma_sgesv)(const blas_int* n, const blas_int* nrhs, float* a, const blas_int* lda, blas_int* ipiv, float* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgesv)(const blas_int* n, const blas_int* nrhs, double* a, const blas_int* lda, blas_int* ipiv, double* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgesv)(const blas_int* n, const blas_int* nrhs, blas_cxf* a, const blas_int* lda, blas_int* ipiv, blas_cxf* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgesv)(const blas_int* n, const blas_int* nrhs, blas_cxd* a, const blas_int* lda, blas_int* ipiv, blas_cxd* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations (general square matrix, advanced form, real matrices) void arma_fortran(arma_sgesvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* nrhs, float* a, const blas_int* lda, float* af, const blas_int* ldaf, blas_int* ipiv, char* equed, float* r, float* c, float* b, const blas_int* ldb, float* x, const blas_int* ldx, float* rcond, float* ferr, float* berr, float* work, blas_int* iwork, blas_int* info, blas_len fact_len, blas_len trans_len, blas_len equed_len) ARMA_NOEXCEPT; void arma_fortran(arma_dgesvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* nrhs, double* a, const blas_int* lda, double* af, const blas_int* ldaf, blas_int* ipiv, char* equed, double* r, double* c, double* b, const blas_int* ldb, double* x, const blas_int* ldx, double* rcond, double* ferr, double* berr, double* work, blas_int* iwork, blas_int* info, blas_len fact_len, blas_len trans_len, blas_len equed_len) ARMA_NOEXCEPT; // solve system of linear equations (general square matrix, advanced form, complex matrices) void arma_fortran(arma_cgesvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* nrhs, blas_cxf* a, const blas_int* lda, blas_cxf* af, const blas_int* ldaf, blas_int* ipiv, char* equed, float* r, float* c, blas_cxf* b, const blas_int* ldb, blas_cxf* x, const blas_int* ldx, float* rcond, float* ferr, float* berr, blas_cxf* work, float* rwork, blas_int* info, blas_len fact_len, blas_len trans_len, blas_len equed_len) ARMA_NOEXCEPT; void arma_fortran(arma_zgesvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* nrhs, blas_cxd* a, const blas_int* lda, blas_cxd* af, const blas_int* ldaf, blas_int* ipiv, char* equed, double* r, double* c, blas_cxd* b, const blas_int* ldb, blas_cxd* x, const blas_int* ldx, double* rcond, double* ferr, double* berr, blas_cxd* work, double* rwork, blas_int* info, blas_len fact_len, blas_len trans_len, blas_len equed_len) ARMA_NOEXCEPT; // solve system of linear equations (symmetric positive definite matrix) void arma_fortran(arma_sposv)(const char* uplo, const blas_int* n, const blas_int* nrhs, float* a, const blas_int* lda, float* b, const blas_int* ldb, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_dposv)(const char* uplo, const blas_int* n, const blas_int* nrhs, double* a, const blas_int* lda, double* b, const blas_int* ldb, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_cposv)(const char* uplo, const blas_int* n, const blas_int* nrhs, blas_cxf* a, const blas_int* lda, blas_cxf* b, const blas_int* ldb, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_zposv)(const char* uplo, const blas_int* n, const blas_int* nrhs, blas_cxd* a, const blas_int* lda, blas_cxd* b, const blas_int* ldb, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; // solve system of linear equations (symmetric positive definite matrix, advanced form, real matrices) void arma_fortran(arma_sposvx)(const char* fact, const char* uplo, const blas_int* n, const blas_int* nrhs, float* a, const blas_int* lda, float* af, const blas_int* ldaf, char* equed, float* s, float* b, const blas_int* ldb, float* x, const blas_int* ldx, float* rcond, float* ferr, float* berr, float* work, blas_int* iwork, blas_int* info, blas_len fact_len, blas_len uplo_len, blas_len equed_len) ARMA_NOEXCEPT; void arma_fortran(arma_dposvx)(const char* fact, const char* uplo, const blas_int* n, const blas_int* nrhs, double* a, const blas_int* lda, double* af, const blas_int* ldaf, char* equed, double* s, double* b, const blas_int* ldb, double* x, const blas_int* ldx, double* rcond, double* ferr, double* berr, double* work, blas_int* iwork, blas_int* info, blas_len fact_len, blas_len uplo_len, blas_len equed_len) ARMA_NOEXCEPT; // solve system of linear equations (hermitian positive definite matrix, advanced form, complex matrices) void arma_fortran(arma_cposvx)(const char* fact, const char* uplo, const blas_int* n, const blas_int* nrhs, blas_cxf* a, const blas_int* lda, blas_cxf* af, const blas_int* ldaf, char* equed, float* s, blas_cxf* b, const blas_int* ldb, blas_cxf* x, const blas_int* ldx, float* rcond, float* ferr, float* berr, blas_cxf* work, float* rwork, blas_int* info, blas_len fact_len, blas_len uplo_len, blas_len equed_len) ARMA_NOEXCEPT; void arma_fortran(arma_zposvx)(const char* fact, const char* uplo, const blas_int* n, const blas_int* nrhs, blas_cxd* a, const blas_int* lda, blas_cxd* af, const blas_int* ldaf, char* equed, double* s, blas_cxd* b, const blas_int* ldb, blas_cxd* x, const blas_int* ldx, double* rcond, double* ferr, double* berr, blas_cxd* work, double* rwork, blas_int* info, blas_len fact_len, blas_len uplo_len, blas_len equed_len) ARMA_NOEXCEPT; // solve over/under-determined system of linear equations void arma_fortran(arma_sgels)(const char* trans, const blas_int* m, const blas_int* n, const blas_int* nrhs, float* a, const blas_int* lda, float* b, const blas_int* ldb, float* work, const blas_int* lwork, blas_int* info, blas_len trans_len) ARMA_NOEXCEPT; void arma_fortran(arma_dgels)(const char* trans, const blas_int* m, const blas_int* n, const blas_int* nrhs, double* a, const blas_int* lda, double* b, const blas_int* ldb, double* work, const blas_int* lwork, blas_int* info, blas_len trans_len) ARMA_NOEXCEPT; void arma_fortran(arma_cgels)(const char* trans, const blas_int* m, const blas_int* n, const blas_int* nrhs, blas_cxf* a, const blas_int* lda, blas_cxf* b, const blas_int* ldb, blas_cxf* work, const blas_int* lwork, blas_int* info, blas_len trans_len) ARMA_NOEXCEPT; void arma_fortran(arma_zgels)(const char* trans, const blas_int* m, const blas_int* n, const blas_int* nrhs, blas_cxd* a, const blas_int* lda, blas_cxd* b, const blas_int* ldb, blas_cxd* work, const blas_int* lwork, blas_int* info, blas_len trans_len) ARMA_NOEXCEPT; // approximately solve system of linear equations using svd (real) void arma_fortran(arma_sgelsd)(const blas_int* m, const blas_int* n, const blas_int* nrhs, float* a, const blas_int* lda, float* b, const blas_int* ldb, float* S, const float* rcond, blas_int* rank, float* work, const blas_int* lwork, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgelsd)(const blas_int* m, const blas_int* n, const blas_int* nrhs, double* a, const blas_int* lda, double* b, const blas_int* ldb, double* S, const double* rcond, blas_int* rank, double* work, const blas_int* lwork, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; // approximately solve system of linear equations using svd (complex) void arma_fortran(arma_cgelsd)(const blas_int* m, const blas_int* n, const blas_int* nrhs, blas_cxf* a, const blas_int* lda, blas_cxf* b, const blas_int* ldb, float* S, const float* rcond, blas_int* rank, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgelsd)(const blas_int* m, const blas_int* n, const blas_int* nrhs, blas_cxd* a, const blas_int* lda, blas_cxd* b, const blas_int* ldb, double* S, const double* rcond, blas_int* rank, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations (triangular matrix) void arma_fortran(arma_strtrs)(const char* uplo, const char* trans, const char* diag, const blas_int* n, const blas_int* nrhs, const float* a, const blas_int* lda, float* b, const blas_int* ldb, blas_int* info, blas_len uplo_len, blas_len trans_len, blas_len diag_len) ARMA_NOEXCEPT; void arma_fortran(arma_dtrtrs)(const char* uplo, const char* trans, const char* diag, const blas_int* n, const blas_int* nrhs, const double* a, const blas_int* lda, double* b, const blas_int* ldb, blas_int* info, blas_len uplo_len, blas_len trans_len, blas_len diag_len) ARMA_NOEXCEPT; void arma_fortran(arma_ctrtrs)(const char* uplo, const char* trans, const char* diag, const blas_int* n, const blas_int* nrhs, const blas_cxf* a, const blas_int* lda, blas_cxf* b, const blas_int* ldb, blas_int* info, blas_len uplo_len, blas_len trans_len, blas_len diag_len) ARMA_NOEXCEPT; void arma_fortran(arma_ztrtrs)(const char* uplo, const char* trans, const char* diag, const blas_int* n, const blas_int* nrhs, const blas_cxd* a, const blas_int* lda, blas_cxd* b, const blas_int* ldb, blas_int* info, blas_len uplo_len, blas_len trans_len, blas_len diag_len) ARMA_NOEXCEPT; // LU factorisation (general band matrix) void arma_fortran(arma_sgbtrf)(const blas_int* m, const blas_int* n, const blas_int* kl, const blas_int* ku, float* ab, const blas_int* ldab, blas_int* ipiv, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgbtrf)(const blas_int* m, const blas_int* n, const blas_int* kl, const blas_int* ku, double* ab, const blas_int* ldab, blas_int* ipiv, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgbtrf)(const blas_int* m, const blas_int* n, const blas_int* kl, const blas_int* ku, blas_cxf* ab, const blas_int* ldab, blas_int* ipiv, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgbtrf)(const blas_int* m, const blas_int* n, const blas_int* kl, const blas_int* ku, blas_cxd* ab, const blas_int* ldab, blas_int* ipiv, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations using pre-computed LU decomposition (general band matrix) void arma_fortran(arma_sgbtrs)(const char* trans, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, const float* ab, const blas_int* ldab, const blas_int* ipiv, float* b, const blas_int* ldb, blas_int* info, blas_len trans_len) ARMA_NOEXCEPT; void arma_fortran(arma_dgbtrs)(const char* trans, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, const double* ab, const blas_int* ldab, const blas_int* ipiv, double* b, const blas_int* ldb, blas_int* info, blas_len trans_len) ARMA_NOEXCEPT; void arma_fortran(arma_cgbtrs)(const char* trans, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, const blas_cxf* ab, const blas_int* ldab, const blas_int* ipiv, blas_cxf* b, const blas_int* ldb, blas_int* info, blas_len trans_len) ARMA_NOEXCEPT; void arma_fortran(arma_zgbtrs)(const char* trans, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, const blas_cxd* ab, const blas_int* ldab, const blas_int* ipiv, blas_cxd* b, const blas_int* ldb, blas_int* info, blas_len trans_len) ARMA_NOEXCEPT; // solve system of linear equations (general band matrix) void arma_fortran(arma_sgbsv)(const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, float* ab, const blas_int* ldab, blas_int* ipiv, float* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgbsv)(const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, double* ab, const blas_int* ldab, blas_int* ipiv, double* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgbsv)(const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, blas_cxf* ab, const blas_int* ldab, blas_int* ipiv, blas_cxf* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgbsv)(const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, blas_cxd* ab, const blas_int* ldab, blas_int* ipiv, blas_cxd* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations (general band matrix, advanced form, real matrices) void arma_fortran(arma_sgbsvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, float* ab, const blas_int* ldab, float* afb, const blas_int* ldafb, blas_int* ipiv, char* equed, float* r, float* c, float* b, const blas_int* ldb, float* x, const blas_int* ldx, float* rcond, float* ferr, float* berr, float* work, blas_int* iwork, blas_int* info, blas_len fact_len, blas_len trans_len, blas_len equed_len) ARMA_NOEXCEPT; void arma_fortran(arma_dgbsvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, double* ab, const blas_int* ldab, double* afb, const blas_int* ldafb, blas_int* ipiv, char* equed, double* r, double* c, double* b, const blas_int* ldb, double* x, const blas_int* ldx, double* rcond, double* ferr, double* berr, double* work, blas_int* iwork, blas_int* info, blas_len fact_len, blas_len trans_len, blas_len equed_len) ARMA_NOEXCEPT; // solve system of linear equations (general band matrix, advanced form, complex matrices) void arma_fortran(arma_cgbsvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, blas_cxf* ab, const blas_int* ldab, blas_cxf* afb, const blas_int* ldafb, blas_int* ipiv, char* equed, float* r, float* c, blas_cxf* b, const blas_int* ldb, blas_cxf* x, const blas_int* ldx, float* rcond, float* ferr, float* berr, blas_cxf* work, float* rwork, blas_int* info, blas_len fact_len, blas_len trans_len, blas_len equed_len) ARMA_NOEXCEPT; void arma_fortran(arma_zgbsvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, blas_cxd* ab, const blas_int* ldab, blas_cxd* afb, const blas_int* ldafb, blas_int* ipiv, char* equed, double* r, double* c, blas_cxd* b, const blas_int* ldb, blas_cxd* x, const blas_int* ldx, double* rcond, double* ferr, double* berr, blas_cxd* work, double* rwork, blas_int* info, blas_len fact_len, blas_len trans_len, blas_len equed_len) ARMA_NOEXCEPT; // solve system of linear equations (tridiagonal band matrix) void arma_fortran(arma_sgtsv)(const blas_int* n, const blas_int* nrhs, float* dl, float* d, float* du, float* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgtsv)(const blas_int* n, const blas_int* nrhs, double* dl, double* d, double* du, double* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgtsv)(const blas_int* n, const blas_int* nrhs, blas_cxf* dl, blas_cxf* d, blas_cxf* du, blas_cxf* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgtsv)(const blas_int* n, const blas_int* nrhs, blas_cxd* dl, blas_cxd* d, blas_cxd* du, blas_cxd* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations (tridiagonal band matrix, advanced form, real matrices) void arma_fortran(arma_sgtsvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* nrhs, const float* dl, const float* d, const float* du, float* dlf, float* df, float* duf, float* du2, blas_int* ipiv, const float* b, const blas_int* ldb, float* x, const blas_int* ldx, float* rcond, float* ferr, float* berr, float* work, blas_int* iwork, blas_int* info, blas_len fact_len, blas_len trans_len) ARMA_NOEXCEPT; void arma_fortran(arma_dgtsvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* nrhs, const double* dl, const double* d, const double* du, double* dlf, double* df, double* duf, double* du2, blas_int* ipiv, const double* b, const blas_int* ldb, double* x, const blas_int* ldx, double* rcond, double* ferr, double* berr, double* work, blas_int* iwork, blas_int* info, blas_len fact_len, blas_len trans_len) ARMA_NOEXCEPT; // solve system of linear equations (tridiagonal band matrix, advanced form, complex matrices) void arma_fortran(arma_cgtsvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* nrhs, const blas_cxf* dl, const blas_cxf* d, const blas_cxf* du, blas_cxf* dlf, blas_cxf* df, blas_cxf* duf, blas_cxf* du2, blas_int* ipiv, const blas_cxf* b, const blas_int* ldb, blas_cxf* x, const blas_int* ldx, float* rcond, float* ferr, float* berr, blas_cxf* work, float* rwork, blas_int* info, blas_len fact_len, blas_len trans_len) ARMA_NOEXCEPT; void arma_fortran(arma_zgtsvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* nrhs, const blas_cxd* dl, const blas_cxd* d, const blas_cxd* du, blas_cxd* dlf, blas_cxd* df, blas_cxd* duf, blas_cxd* du2, blas_int* ipiv, const blas_cxd* b, const blas_int* ldb, blas_cxd* x, const blas_int* ldx, double* rcond, double* ferr, double* berr, blas_cxd* work, double* rwork, blas_int* info, blas_len fact_len, blas_len trans_len) ARMA_NOEXCEPT; // Schur decomposition (real matrices) void arma_fortran(arma_sgees)(const char* jobvs, const char* sort, fn_select_s2 select, const blas_int* n, float* a, const blas_int* lda, blas_int* sdim, float* wr, float* wi, float* vs, const blas_int* ldvs, float* work, const blas_int* lwork, blas_int* bwork, blas_int* info, blas_len jobvs_len, blas_len sort_len) ARMA_NOEXCEPT; void arma_fortran(arma_dgees)(const char* jobvs, const char* sort, fn_select_d2 select, const blas_int* n, double* a, const blas_int* lda, blas_int* sdim, double* wr, double* wi, double* vs, const blas_int* ldvs, double* work, const blas_int* lwork, blas_int* bwork, blas_int* info, blas_len jobvs_len, blas_len sort_len) ARMA_NOEXCEPT; // Schur decomposition (complex matrices) void arma_fortran(arma_cgees)(const char* jobvs, const char* sort, fn_select_c1 select, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_int* sdim, blas_cxf* w, blas_cxf* vs, const blas_int* ldvs, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* bwork, blas_int* info, blas_len jobvs_len, blas_len sort_len) ARMA_NOEXCEPT; void arma_fortran(arma_zgees)(const char* jobvs, const char* sort, fn_select_z1 select, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_int* sdim, blas_cxd* w, blas_cxd* vs, const blas_int* ldvs, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* bwork, blas_int* info, blas_len jobvs_len, blas_len sort_len) ARMA_NOEXCEPT; // solve a Sylvester equation ax + xb = c, with a and b assumed to be in Schur form void arma_fortran(arma_strsyl)(const char* transa, const char* transb, const blas_int* isgn, const blas_int* m, const blas_int* n, const float* a, const blas_int* lda, const float* b, const blas_int* ldb, float* c, const blas_int* ldc, float* scale, blas_int* info, blas_len transa_len, blas_len transb_len) ARMA_NOEXCEPT; void arma_fortran(arma_dtrsyl)(const char* transa, const char* transb, const blas_int* isgn, const blas_int* m, const blas_int* n, const double* a, const blas_int* lda, const double* b, const blas_int* ldb, double* c, const blas_int* ldc, double* scale, blas_int* info, blas_len transa_len, blas_len transb_len) ARMA_NOEXCEPT; void arma_fortran(arma_ctrsyl)(const char* transa, const char* transb, const blas_int* isgn, const blas_int* m, const blas_int* n, const blas_cxf* a, const blas_int* lda, const blas_cxf* b, const blas_int* ldb, blas_cxf* c, const blas_int* ldc, float* scale, blas_int* info, blas_len transa_len, blas_len transb_len) ARMA_NOEXCEPT; void arma_fortran(arma_ztrsyl)(const char* transa, const char* transb, const blas_int* isgn, const blas_int* m, const blas_int* n, const blas_cxd* a, const blas_int* lda, const blas_cxd* b, const blas_int* ldb, blas_cxd* c, const blas_int* ldc, double* scale, blas_int* info, blas_len transa_len, blas_len transb_len) ARMA_NOEXCEPT; // QZ decomposition (real matrices) void arma_fortran(arma_sgges)(const char* jobvsl, const char* jobvsr, const char* sort, fn_select_s3 selctg, const blas_int* n, float* a, const blas_int* lda, float* b, const blas_int* ldb, blas_int* sdim, float* alphar, float* alphai, float* beta, float* vsl, const blas_int* ldvsl, float* vsr, const blas_int* ldvsr, float* work, const blas_int* lwork, blas_int* bwork, blas_int* info, blas_len jobvsl_len, blas_len jobvsr_len, blas_len sort_len) ARMA_NOEXCEPT; void arma_fortran(arma_dgges)(const char* jobvsl, const char* jobvsr, const char* sort, fn_select_d3 selctg, const blas_int* n, double* a, const blas_int* lda, double* b, const blas_int* ldb, blas_int* sdim, double* alphar, double* alphai, double* beta, double* vsl, const blas_int* ldvsl, double* vsr, const blas_int* ldvsr, double* work, const blas_int* lwork, blas_int* bwork, blas_int* info, blas_len jobvsl_len, blas_len jobvsr_len, blas_len sort_len) ARMA_NOEXCEPT; // QZ decomposition (complex matrices) void arma_fortran(arma_cgges)(const char* jobvsl, const char* jobvsr, const char* sort, fn_select_c2 selctg, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_cxf* b, const blas_int* ldb, blas_int* sdim, blas_cxf* alpha, blas_cxf* beta, blas_cxf* vsl, const blas_int* ldvsl, blas_cxf* vsr, const blas_int* ldvsr, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* bwork, blas_int* info, blas_len jobvsl_len, blas_len jobvsr_len, blas_len sort_len) ARMA_NOEXCEPT; void arma_fortran(arma_zgges)(const char* jobvsl, const char* jobvsr, const char* sort, fn_select_z2 selctg, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_cxd* b, const blas_int* ldb, blas_int* sdim, blas_cxd* alpha, blas_cxd* beta, blas_cxd* vsl, const blas_int* ldvsl, blas_cxd* vsr, const blas_int* ldvsr, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* bwork, blas_int* info, blas_len jobvsl_len, blas_len jobvsr_len, blas_len sort_len) ARMA_NOEXCEPT; // 1-norm (general matrix) float arma_fortran(arma_slange)(const char* norm, const blas_int* m, const blas_int* n, const float* a, const blas_int* lda, float* work, blas_len norm_len) ARMA_NOEXCEPT; double arma_fortran(arma_dlange)(const char* norm, const blas_int* m, const blas_int* n, const double* a, const blas_int* lda, double* work, blas_len norm_len) ARMA_NOEXCEPT; float arma_fortran(arma_clange)(const char* norm, const blas_int* m, const blas_int* n, const blas_cxf* a, const blas_int* lda, float* work, blas_len norm_len) ARMA_NOEXCEPT; double arma_fortran(arma_zlange)(const char* norm, const blas_int* m, const blas_int* n, const blas_cxd* a, const blas_int* lda, double* work, blas_len norm_len) ARMA_NOEXCEPT; // 1-norm (real symmetric matrix) float arma_fortran(arma_slansy)(const char* norm, const char* uplo, const blas_int* n, const float* a, const blas_int* lda, float* work, blas_len norm_len, blas_len uplo_len) ARMA_NOEXCEPT; double arma_fortran(arma_dlansy)(const char* norm, const char* uplo, const blas_int* n, const double* a, const blas_int* lda, double* work, blas_len norm_len, blas_len uplo_len) ARMA_NOEXCEPT; float arma_fortran(arma_clansy)(const char* norm, const char* uplo, const blas_int* n, const blas_cxf* a, const blas_int* lda, float* work, blas_len norm_len, blas_len uplo_len) ARMA_NOEXCEPT; double arma_fortran(arma_zlansy)(const char* norm, const char* uplo, const blas_int* n, const blas_cxd* a, const blas_int* lda, double* work, blas_len norm_len, blas_len uplo_len) ARMA_NOEXCEPT; // 1-norm (complex hermitian matrix) float arma_fortran(arma_clanhe)(const char* norm, const char* uplo, const blas_int* n, const blas_cxf* a, const blas_int* lda, float* work, blas_len norm_len, blas_len uplo_len) ARMA_NOEXCEPT; double arma_fortran(arma_zlanhe)(const char* norm, const char* uplo, const blas_int* n, const blas_cxd* a, const blas_int* lda, double* work, blas_len norm_len, blas_len uplo_len) ARMA_NOEXCEPT; // 1-norm (band matrix) float arma_fortran(arma_slangb)(const char* norm, const blas_int* n, const blas_int* kl, const blas_int* ku, const float* ab, const blas_int* ldab, float* work, blas_len norm_len) ARMA_NOEXCEPT; double arma_fortran(arma_dlangb)(const char* norm, const blas_int* n, const blas_int* kl, const blas_int* ku, const double* ab, const blas_int* ldab, double* work, blas_len norm_len) ARMA_NOEXCEPT; float arma_fortran(arma_clangb)(const char* norm, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_cxf* ab, const blas_int* ldab, float* work, blas_len norm_len) ARMA_NOEXCEPT; double arma_fortran(arma_zlangb)(const char* norm, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_cxd* ab, const blas_int* ldab, double* work, blas_len norm_len) ARMA_NOEXCEPT; // reciprocal of condition number (real, generic matrix) void arma_fortran(arma_sgecon)(const char* norm, const blas_int* n, const float* a, const blas_int* lda, const float* anorm, float* rcond, float* work, blas_int* iwork, blas_int* info, blas_len norm_len) ARMA_NOEXCEPT; void arma_fortran(arma_dgecon)(const char* norm, const blas_int* n, const double* a, const blas_int* lda, const double* anorm, double* rcond, double* work, blas_int* iwork, blas_int* info, blas_len norm_len) ARMA_NOEXCEPT; // reciprocal of condition number (complex, generic matrix) void arma_fortran(arma_cgecon)(const char* norm, const blas_int* n, const blas_cxf* a, const blas_int* lda, const float* anorm, float* rcond, blas_cxf* work, float* rwork, blas_int* info, blas_len norm_len) ARMA_NOEXCEPT; void arma_fortran(arma_zgecon)(const char* norm, const blas_int* n, const blas_cxd* a, const blas_int* lda, const double* anorm, double* rcond, blas_cxd* work, double* rwork, blas_int* info, blas_len norm_len) ARMA_NOEXCEPT; // reciprocal of condition number (real, symmetric positive definite matrix) void arma_fortran(arma_spocon)(const char* uplo, const blas_int* n, const float* a, const blas_int* lda, const float* anorm, float* rcond, float* work, blas_int* iwork, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_dpocon)(const char* uplo, const blas_int* n, const double* a, const blas_int* lda, const double* anorm, double* rcond, double* work, blas_int* iwork, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; // reciprocal of condition number (complex, hermitian positive definite matrix) void arma_fortran(arma_cpocon)(const char* uplo, const blas_int* n, const blas_cxf* a, const blas_int* lda, const float* anorm, float* rcond, blas_cxf* work, float* rwork, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_zpocon)(const char* uplo, const blas_int* n, const blas_cxd* a, const blas_int* lda, const double* anorm, double* rcond, blas_cxd* work, double* rwork, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; // reciprocal of condition number (real, triangular matrix) void arma_fortran(arma_strcon)(const char* norm, const char* uplo, const char* diag, const blas_int* n, const float* a, const blas_int* lda, float* rcond, float* work, blas_int* iwork, blas_int* info, blas_len norm_len, blas_len uplo_len, blas_len diag_len) ARMA_NOEXCEPT; void arma_fortran(arma_dtrcon)(const char* norm, const char* uplo, const char* diag, const blas_int* n, const double* a, const blas_int* lda, double* rcond, double* work, blas_int* iwork, blas_int* info, blas_len norm_len, blas_len uplo_len, blas_len diag_len) ARMA_NOEXCEPT; // reciprocal of condition number (complex, triangular matrix) void arma_fortran(arma_ctrcon)(const char* norm, const char* uplo, const char* diag, const blas_int* n, const blas_cxf* a, const blas_int* lda, float* rcond, blas_cxf* work, float* rwork, blas_int* info, blas_len norm_len, blas_len uplo_len, blas_len diag_len) ARMA_NOEXCEPT; void arma_fortran(arma_ztrcon)(const char* norm, const char* uplo, const char* diag, const blas_int* n, const blas_cxd* a, const blas_int* lda, double* rcond, blas_cxd* work, double* rwork, blas_int* info, blas_len norm_len, blas_len uplo_len, blas_len diag_len) ARMA_NOEXCEPT; // reciprocal of condition number (real, band matrix) void arma_fortran(arma_sgbcon)(const char* norm, const blas_int* n, const blas_int* kl, const blas_int* ku, const float* ab, const blas_int* ldab, const blas_int* ipiv, const float* anorm, float* rcond, float* work, blas_int* iwork, blas_int* info, blas_len norm_len) ARMA_NOEXCEPT; void arma_fortran(arma_dgbcon)(const char* norm, const blas_int* n, const blas_int* kl, const blas_int* ku, const double* ab, const blas_int* ldab, const blas_int* ipiv, const double* anorm, double* rcond, double* work, blas_int* iwork, blas_int* info, blas_len norm_len) ARMA_NOEXCEPT; // reciprocal of condition number (complex, band matrix) void arma_fortran(arma_cgbcon)(const char* norm, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_cxf* ab, const blas_int* ldab, const blas_int* ipiv, const float* anorm, float* rcond, blas_cxf* work, float* rwork, blas_int* info, blas_len norm_len) ARMA_NOEXCEPT; void arma_fortran(arma_zgbcon)(const char* norm, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_cxd* ab, const blas_int* ldab, const blas_int* ipiv, const double* anorm, double* rcond, blas_cxd* work, double* rwork, blas_int* info, blas_len norm_len) ARMA_NOEXCEPT; // obtain parameters according to the local configuration of lapack blas_int arma_fortran(arma_ilaenv)(const blas_int* ispec, const char* name, const char* opts, const blas_int* n1, const blas_int* n2, const blas_int* n3, const blas_int* n4, blas_len name_len, blas_len opts_len) ARMA_NOEXCEPT; // calculate eigenvalues of an upper Hessenberg matrix void arma_fortran(arma_slahqr)(const blas_int* wantt, const blas_int* wantz, const blas_int* n, const blas_int* ilo, const blas_int* ihi, float* h, const blas_int* ldh, float* wr, float* wi, const blas_int* iloz, const blas_int* ihiz, float* z, const blas_int* ldz, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dlahqr)(const blas_int* wantt, const blas_int* wantz, const blas_int* n, const blas_int* ilo, const blas_int* ihi, double* h, const blas_int* ldh, double* wr, double* wi, const blas_int* iloz, const blas_int* ihiz, double* z, const blas_int* ldz, blas_int* info) ARMA_NOEXCEPT; // calculate eigenvalues of a symmetric tridiagonal matrix void arma_fortran(arma_sstedc)(const char* compz, const blas_int* n, float* d, float* e, float* z, const blas_int* ldz, float* work, const blas_int* lwork, blas_int* iwork, const blas_int* liwork, blas_int* info, blas_len compz_len) ARMA_NOEXCEPT; void arma_fortran(arma_dstedc)(const char* compz, const blas_int* n, double* d, double* e, double* z, const blas_int* ldz, double* work, const blas_int* lwork, blas_int* iwork, const blas_int* liwork, blas_int* info, blas_len compz_len) ARMA_NOEXCEPT; // calculate eigenvectors of a Schur form matrix void arma_fortran(arma_strevc)(const char* side, const char* howmny, blas_int* select, const blas_int* n, const float* t, const blas_int* ldt, float* vl, const blas_int* ldvl, float* vr, const blas_int* ldvr, const blas_int* mm, blas_int* m, float* work, blas_int* info, blas_len side_len, blas_len howmny_len) ARMA_NOEXCEPT; void arma_fortran(arma_dtrevc)(const char* side, const char* howmny, blas_int* select, const blas_int* n, const double* t, const blas_int* ldt, double* vl, const blas_int* ldvl, double* vr, const blas_int* ldvr, const blas_int* mm, blas_int* m, double* work, blas_int* info, blas_len side_len, blas_len howmny_len) ARMA_NOEXCEPT; // generate a vector of random numbers void arma_fortran(arma_slarnv)(const blas_int* idist, blas_int* iseed, const blas_int* n, float* x) ARMA_NOEXCEPT; void arma_fortran(arma_dlarnv)(const blas_int* idist, blas_int* iseed, const blas_int* n, double* x) ARMA_NOEXCEPT; // hessenberg decomposition void arma_fortran(arma_sgehrd)(const blas_int* n, const blas_int* ilo, const blas_int* ihi, float* a, const blas_int* lda, float* tao, float* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgehrd)(const blas_int* n, const blas_int* ilo, const blas_int* ihi, double* a, const blas_int* lda, double* tao, double* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgehrd)(const blas_int* n, const blas_int* ilo, const blas_int* ihi, blas_cxf* a, const blas_int* lda, blas_cxf* tao, blas_cxf* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgehrd)(const blas_int* n, const blas_int* ilo, const blas_int* ihi, blas_cxd* a, const blas_int* lda, blas_cxd* tao, blas_cxd* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; // pivoted cholesky void arma_fortran(arma_spstrf)(const char* uplo, const blas_int* n, float* a, const blas_int* lda, blas_int* piv, blas_int* rank, const float* tol, float* work, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_dpstrf)(const char* uplo, const blas_int* n, double* a, const blas_int* lda, blas_int* piv, blas_int* rank, const double* tol, double* work, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_cpstrf)(const char* uplo, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_int* piv, blas_int* rank, const float* tol, float* work, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; void arma_fortran(arma_zpstrf)(const char* uplo, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_int* piv, blas_int* rank, const double* tol, double* work, blas_int* info, blas_len uplo_len) ARMA_NOEXCEPT; #else // prototypes without hidden arguments // LU decomposition void arma_fortran(arma_sgetrf)(const blas_int* m, const blas_int* n, float* a, const blas_int* lda, blas_int* ipiv, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgetrf)(const blas_int* m, const blas_int* n, double* a, const blas_int* lda, blas_int* ipiv, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgetrf)(const blas_int* m, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_int* ipiv, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgetrf)(const blas_int* m, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_int* ipiv, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations using pre-computed LU decomposition void arma_fortran(arma_sgetrs)(const char* trans, const blas_int* n, const blas_int* nrhs, const float* a, const blas_int* lda, const blas_int* ipiv, float* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgetrs)(const char* trans, const blas_int* n, const blas_int* nrhs, const double* a, const blas_int* lda, const blas_int* ipiv, double* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgetrs)(const char* trans, const blas_int* n, const blas_int* nrhs, const blas_cxf* a, const blas_int* lda, const blas_int* ipiv, blas_cxf* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgetrs)(const char* trans, const blas_int* n, const blas_int* nrhs, const blas_cxd* a, const blas_int* lda, const blas_int* ipiv, blas_cxd* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; // matrix inversion (using pre-computed LU decomposition) void arma_fortran(arma_sgetri)(const blas_int* n, float* a, const blas_int* lda, const blas_int* ipiv, float* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgetri)(const blas_int* n, double* a, const blas_int* lda, const blas_int* ipiv, double* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgetri)(const blas_int* n, blas_cxf* a, const blas_int* lda, const blas_int* ipiv, blas_cxf* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgetri)(const blas_int* n, blas_cxd* a, const blas_int* lda, const blas_int* ipiv, blas_cxd* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; // matrix inversion (triangular matrices) void arma_fortran(arma_strtri)(const char* uplo, const char* diag, const blas_int* n, float* a, const blas_int* lda, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dtrtri)(const char* uplo, const char* diag, const blas_int* n, double* a, const blas_int* lda, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_ctrtri)(const char* uplo, const char* diag, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_ztrtri)(const char* uplo, const char* diag, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_int* info) ARMA_NOEXCEPT; // eigen decomposition of general matrix (real) void arma_fortran(arma_sgeev)(const char* jobvl, const char* jobvr, const blas_int* n, float* a, const blas_int* lda, float* wr, float* wi, float* vl, const blas_int* ldvl, float* vr, const blas_int* ldvr, float* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgeev)(const char* jobvl, const char* jobvr, const blas_int* n, double* a, const blas_int* lda, double* wr, double* wi, double* vl, const blas_int* ldvl, double* vr, const blas_int* ldvr, double* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; // eigen decomposition of general matrix (complex) void arma_fortran(arma_cgeev)(const char* jobvl, const char* jobvr, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_cxf* w, blas_cxf* vl, const blas_int* ldvl, blas_cxf* vr, const blas_int* ldvr, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgeev)(const char* jobvl, const char* jobvr, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_cxd* w, blas_cxd* vl, const blas_int* ldvl, blas_cxd* vr, const blas_int* ldvr, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* info) ARMA_NOEXCEPT; // eigen decomposition of general matrix (real; advanced form) void arma_fortran(arma_sgeevx)(const char* balanc, const char* jobvl, const char* jobvr, const char* sense, const blas_int* n, float* a, const blas_int* lda, float* wr, float* wi, float* vl, const blas_int* ldvl, float* vr, const blas_int* ldvr, blas_int* ilo, blas_int* ihi, float* scale, float* abnrm, float* rconde, float* rcondv, float* work, const blas_int* lwork, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgeevx)(const char* balanc, const char* jobvl, const char* jobvr, const char* sense, const blas_int* n, double* a, const blas_int* lda, double* wr, double* wi, double* vl, const blas_int* ldvl, double* vr, const blas_int* ldvr, blas_int* ilo, blas_int* ihi, double* scale, double* abnrm, double* rconde, double* rcondv, double* work, const blas_int* lwork, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; // eigen decomposition of general matrix (complex; advanced form) void arma_fortran(arma_cgeevx)(const char* balanc, const char* jobvl, const char* jobvr, const char* sense, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_cxf* w, blas_cxf* vl, const blas_int* ldvl, blas_cxf* vr, const blas_int* ldvr, blas_int* ilo, blas_int* ihi, float* scale, float* abnrm, float* rconde, float* rcondv, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgeevx)(const char* balanc, const char* jobvl, const char* jobvr, const char* sense, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_cxd* w, blas_cxd* vl, const blas_int* ldvl, blas_cxd* vr, const blas_int* ldvr, blas_int* ilo, blas_int* ihi, double* scale, double* abnrm, double* rconde, double* rcondv, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* info) ARMA_NOEXCEPT; // eigen decomposition of symmetric real matrices void arma_fortran(arma_ssyev)(const char* jobz, const char* uplo, const blas_int* n, float* a, const blas_int* lda, float* w, float* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dsyev)(const char* jobz, const char* uplo, const blas_int* n, double* a, const blas_int* lda, double* w, double* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; // eigen decomposition of hermitian matrices (complex) void arma_fortran(arma_cheev)(const char* jobz, const char* uplo, const blas_int* n, blas_cxf* a, const blas_int* lda, float* w, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zheev)(const char* jobz, const char* uplo, const blas_int* n, blas_cxd* a, const blas_int* lda, double* w, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* info) ARMA_NOEXCEPT; // eigen decomposition of symmetric real matrices by divide and conquer void arma_fortran(arma_ssyevd)(const char* jobz, const char* uplo, const blas_int* n, float* a, const blas_int* lda, float* w, float* work, const blas_int* lwork, blas_int* iwork, const blas_int* liwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dsyevd)(const char* jobz, const char* uplo, const blas_int* n, double* a, const blas_int* lda, double* w, double* work, const blas_int* lwork, blas_int* iwork, const blas_int* liwork, blas_int* info) ARMA_NOEXCEPT; // eigen decomposition of hermitian matrices (complex) by divide and conquer void arma_fortran(arma_cheevd)(const char* jobz, const char* uplo, const blas_int* n, blas_cxf* a, const blas_int* lda, float* w, blas_cxf* work, const blas_int* lwork, float* rwork, const blas_int* lrwork, blas_int* iwork, const blas_int* liwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zheevd)(const char* jobz, const char* uplo, const blas_int* n, blas_cxd* a, const blas_int* lda, double* w, blas_cxd* work, const blas_int* lwork, double* rwork, const blas_int* lrwork, blas_int* iwork, const blas_int* liwork, blas_int* info) ARMA_NOEXCEPT; // eigen decomposition of general real matrix pair void arma_fortran(arma_sggev)(const char* jobvl, const char* jobvr, const blas_int* n, float* a, const blas_int* lda, float* b, const blas_int* ldb, float* alphar, float* alphai, float* beta, float* vl, const blas_int* ldvl, float* vr, const blas_int* ldvr, float* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dggev)(const char* jobvl, const char* jobvr, const blas_int* n, double* a, const blas_int* lda, double* b, const blas_int* ldb, double* alphar, double* alphai, double* beta, double* vl, const blas_int* ldvl, double* vr, const blas_int* ldvr, double* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; // eigen decomposition of general complex matrix pair void arma_fortran(arma_cggev)(const char* jobvl, const char* jobvr, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_cxf* b, const blas_int* ldb, blas_cxf* alpha, blas_cxf* beta, blas_cxf* vl, const blas_int* ldvl, blas_cxf* vr, const blas_int* ldvr, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zggev)(const char* jobvl, const char* jobvr, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_cxd* b, const blas_int* ldb, blas_cxd* alpha, blas_cxd* beta, blas_cxd* vl, const blas_int* ldvl, blas_cxd* vr, const blas_int* ldvr, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* info) ARMA_NOEXCEPT; // Cholesky decomposition void arma_fortran(arma_spotrf)(const char* uplo, const blas_int* n, float* a, const blas_int* lda, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dpotrf)(const char* uplo, const blas_int* n, double* a, const blas_int* lda, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cpotrf)(const char* uplo, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zpotrf)(const char* uplo, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations with pre-computed Cholesky decomposition void arma_fortran(arma_spotrs)(const char* uplo, const blas_int* n, const blas_int* nrhs, const float* a, const blas_int* lda, float* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dpotrs)(const char* uplo, const blas_int* n, const blas_int* nrhs, const double* a, const blas_int* lda, double* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cpotrs)(const char* uplo, const blas_int* n, const blas_int* nrhs, const blas_cxf* a, const blas_int* lda, blas_cxf* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zpotrs)(const char* uplo, const blas_int* n, const blas_int* nrhs, const blas_cxd* a, const blas_int* lda, blas_cxd* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; // Cholesky decomposition (band matrices) void arma_fortran(arma_spbtrf)(const char* uplo, const blas_int* n, const blas_int* kd, float* ab, const blas_int* ldab, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dpbtrf)(const char* uplo, const blas_int* n, const blas_int* kd, double* ab, const blas_int* ldab, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cpbtrf)(const char* uplo, const blas_int* n, const blas_int* kd, blas_cxf* ab, const blas_int* ldab, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zpbtrf)(const char* uplo, const blas_int* n, const blas_int* kd, blas_cxd* ab, const blas_int* ldab, blas_int* info) ARMA_NOEXCEPT; // matrix inversion (using pre-computed Cholesky decomposition) void arma_fortran(arma_spotri)(const char* uplo, const blas_int* n, float* a, const blas_int* lda, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dpotri)(const char* uplo, const blas_int* n, double* a, const blas_int* lda, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cpotri)(const char* uplo, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zpotri)(const char* uplo, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_int* info) ARMA_NOEXCEPT; // QR decomposition void arma_fortran(arma_sgeqrf)(const blas_int* m, const blas_int* n, float* a, const blas_int* lda, float* tau, float* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgeqrf)(const blas_int* m, const blas_int* n, double* a, const blas_int* lda, double* tau, double* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgeqrf)(const blas_int* m, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_cxf* tau, blas_cxf* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgeqrf)(const blas_int* m, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_cxd* tau, blas_cxd* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; // QR decomposition with pivoting (real matrices) void arma_fortran(arma_sgeqp3)(const blas_int* m, const blas_int* n, float* a, const blas_int* lda, blas_int* jpvt, float* tau, float* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgeqp3)(const blas_int* m, const blas_int* n, double* a, const blas_int* lda, blas_int* jpvt, double* tau, double* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; // QR decomposition with pivoting (complex matrices) void arma_fortran(arma_cgeqp3)(const blas_int* m, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_int* jpvt, blas_cxf* tau, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgeqp3)(const blas_int* m, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_int* jpvt, blas_cxd* tau, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* info) ARMA_NOEXCEPT; // Q matrix calculation from QR decomposition (real matrices) void arma_fortran(arma_sorgqr)(const blas_int* m, const blas_int* n, const blas_int* k, float* a, const blas_int* lda, const float* tau, float* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dorgqr)(const blas_int* m, const blas_int* n, const blas_int* k, double* a, const blas_int* lda, const double* tau, double* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; // Q matrix calculation from QR decomposition (complex matrices) void arma_fortran(arma_cungqr)(const blas_int* m, const blas_int* n, const blas_int* k, blas_cxf* a, const blas_int* lda, const blas_cxf* tau, blas_cxf* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zungqr)(const blas_int* m, const blas_int* n, const blas_int* k, blas_cxd* a, const blas_int* lda, const blas_cxd* tau, blas_cxd* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; // SVD (real matrices) void arma_fortran(arma_sgesvd)(const char* jobu, const char* jobvt, const blas_int* m, const blas_int* n, float* a, const blas_int* lda, float* s, float* u, const blas_int* ldu, float* vt, const blas_int* ldvt, float* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgesvd)(const char* jobu, const char* jobvt, const blas_int* m, const blas_int* n, double* a, const blas_int* lda, double* s, double* u, const blas_int* ldu, double* vt, const blas_int* ldvt, double* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; // SVD (complex matrices) void arma_fortran(arma_cgesvd)(const char* jobu, const char* jobvt, const blas_int* m, const blas_int* n, blas_cxf* a, const blas_int* lda, float* s, blas_cxf* u, const blas_int* ldu, blas_cxf* vt, const blas_int* ldvt, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgesvd)(const char* jobu, const char* jobvt, const blas_int* m, const blas_int* n, blas_cxd* a, const blas_int* lda, double* s, blas_cxd* u, const blas_int* ldu, blas_cxd* vt, const blas_int* ldvt, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* info) ARMA_NOEXCEPT; // SVD (real matrices) by divide and conquer void arma_fortran(arma_sgesdd)(const char* jobz, const blas_int* m, const blas_int* n, float* a, const blas_int* lda, float* s, float* u, const blas_int* ldu, float* vt, const blas_int* ldvt, float* work, const blas_int* lwork, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgesdd)(const char* jobz, const blas_int* m, const blas_int* n, double* a, const blas_int* lda, double* s, double* u, const blas_int* ldu, double* vt, const blas_int* ldvt, double* work, const blas_int* lwork, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; // SVD (complex matrices) by divide and conquer void arma_fortran(arma_cgesdd)(const char* jobz, const blas_int* m, const blas_int* n, blas_cxf* a, const blas_int* lda, float* s, blas_cxf* u, const blas_int* ldu, blas_cxf* vt, const blas_int* ldvt, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgesdd)(const char* jobz, const blas_int* m, const blas_int* n, blas_cxd* a, const blas_int* lda, double* s, blas_cxd* u, const blas_int* ldu, blas_cxd* vt, const blas_int* ldvt, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations (general square matrix) void arma_fortran(arma_sgesv)(const blas_int* n, const blas_int* nrhs, float* a, const blas_int* lda, blas_int* ipiv, float* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgesv)(const blas_int* n, const blas_int* nrhs, double* a, const blas_int* lda, blas_int* ipiv, double* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgesv)(const blas_int* n, const blas_int* nrhs, blas_cxf* a, const blas_int* lda, blas_int* ipiv, blas_cxf* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgesv)(const blas_int* n, const blas_int* nrhs, blas_cxd* a, const blas_int* lda, blas_int* ipiv, blas_cxd* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations (general square matrix, advanced form, real matrices) void arma_fortran(arma_sgesvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* nrhs, float* a, const blas_int* lda, float* af, const blas_int* ldaf, blas_int* ipiv, char* equed, float* r, float* c, float* b, const blas_int* ldb, float* x, const blas_int* ldx, float* rcond, float* ferr, float* berr, float* work, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgesvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* nrhs, double* a, const blas_int* lda, double* af, const blas_int* ldaf, blas_int* ipiv, char* equed, double* r, double* c, double* b, const blas_int* ldb, double* x, const blas_int* ldx, double* rcond, double* ferr, double* berr, double* work, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations (general square matrix, advanced form, complex matrices) void arma_fortran(arma_cgesvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* nrhs, blas_cxf* a, const blas_int* lda, blas_cxf* af, const blas_int* ldaf, blas_int* ipiv, char* equed, float* r, float* c, blas_cxf* b, const blas_int* ldb, blas_cxf* x, const blas_int* ldx, float* rcond, float* ferr, float* berr, blas_cxf* work, float* rwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgesvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* nrhs, blas_cxd* a, const blas_int* lda, blas_cxd* af, const blas_int* ldaf, blas_int* ipiv, char* equed, double* r, double* c, blas_cxd* b, const blas_int* ldb, blas_cxd* x, const blas_int* ldx, double* rcond, double* ferr, double* berr, blas_cxd* work, double* rwork, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations (symmetric positive definite matrix) void arma_fortran(arma_sposv)(const char* uplo, const blas_int* n, const blas_int* nrhs, float* a, const blas_int* lda, float* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dposv)(const char* uplo, const blas_int* n, const blas_int* nrhs, double* a, const blas_int* lda, double* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cposv)(const char* uplo, const blas_int* n, const blas_int* nrhs, blas_cxf* a, const blas_int* lda, blas_cxf* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zposv)(const char* uplo, const blas_int* n, const blas_int* nrhs, blas_cxd* a, const blas_int* lda, blas_cxd* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations (symmetric positive definite matrix, advanced form, real matrices) void arma_fortran(arma_sposvx)(const char* fact, const char* uplo, const blas_int* n, const blas_int* nrhs, float* a, const blas_int* lda, float* af, const blas_int* ldaf, char* equed, float* s, float* b, const blas_int* ldb, float* x, const blas_int* ldx, float* rcond, float* ferr, float* berr, float* work, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dposvx)(const char* fact, const char* uplo, const blas_int* n, const blas_int* nrhs, double* a, const blas_int* lda, double* af, const blas_int* ldaf, char* equed, double* s, double* b, const blas_int* ldb, double* x, const blas_int* ldx, double* rcond, double* ferr, double* berr, double* work, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations (hermitian positive definite matrix, advanced form, complex matrices) void arma_fortran(arma_cposvx)(const char* fact, const char* uplo, const blas_int* n, const blas_int* nrhs, blas_cxf* a, const blas_int* lda, blas_cxf* af, const blas_int* ldaf, char* equed, float* s, blas_cxf* b, const blas_int* ldb, blas_cxf* x, const blas_int* ldx, float* rcond, float* ferr, float* berr, blas_cxf* work, float* rwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zposvx)(const char* fact, const char* uplo, const blas_int* n, const blas_int* nrhs, blas_cxd* a, const blas_int* lda, blas_cxd* af, const blas_int* ldaf, char* equed, double* s, blas_cxd* b, const blas_int* ldb, blas_cxd* x, const blas_int* ldx, double* rcond, double* ferr, double* berr, blas_cxd* work, double* rwork, blas_int* info) ARMA_NOEXCEPT; // solve over/under-determined system of linear equations void arma_fortran(arma_sgels)(const char* trans, const blas_int* m, const blas_int* n, const blas_int* nrhs, float* a, const blas_int* lda, float* b, const blas_int* ldb, float* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgels)(const char* trans, const blas_int* m, const blas_int* n, const blas_int* nrhs, double* a, const blas_int* lda, double* b, const blas_int* ldb, double* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgels)(const char* trans, const blas_int* m, const blas_int* n, const blas_int* nrhs, blas_cxf* a, const blas_int* lda, blas_cxf* b, const blas_int* ldb, blas_cxf* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgels)(const char* trans, const blas_int* m, const blas_int* n, const blas_int* nrhs, blas_cxd* a, const blas_int* lda, blas_cxd* b, const blas_int* ldb, blas_cxd* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; // approximately solve system of linear equations using svd (real) void arma_fortran(arma_sgelsd)(const blas_int* m, const blas_int* n, const blas_int* nrhs, float* a, const blas_int* lda, float* b, const blas_int* ldb, float* S, const float* rcond, blas_int* rank, float* work, const blas_int* lwork, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgelsd)(const blas_int* m, const blas_int* n, const blas_int* nrhs, double* a, const blas_int* lda, double* b, const blas_int* ldb, double* S, const double* rcond, blas_int* rank, double* work, const blas_int* lwork, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; // approximately solve system of linear equations using svd (complex) void arma_fortran(arma_cgelsd)(const blas_int* m, const blas_int* n, const blas_int* nrhs, blas_cxf* a, const blas_int* lda, blas_cxf* b, const blas_int* ldb, float* S, const float* rcond, blas_int* rank, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgelsd)(const blas_int* m, const blas_int* n, const blas_int* nrhs, blas_cxd* a, const blas_int* lda, blas_cxd* b, const blas_int* ldb, double* S, const double* rcond, blas_int* rank, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations (triangular matrix) void arma_fortran(arma_strtrs)(const char* uplo, const char* trans, const char* diag, const blas_int* n, const blas_int* nrhs, const float* a, const blas_int* lda, float* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dtrtrs)(const char* uplo, const char* trans, const char* diag, const blas_int* n, const blas_int* nrhs, const double* a, const blas_int* lda, double* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_ctrtrs)(const char* uplo, const char* trans, const char* diag, const blas_int* n, const blas_int* nrhs, const blas_cxf* a, const blas_int* lda, blas_cxf* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_ztrtrs)(const char* uplo, const char* trans, const char* diag, const blas_int* n, const blas_int* nrhs, const blas_cxd* a, const blas_int* lda, blas_cxd* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; // LU factorisation (general band matrix) void arma_fortran(arma_sgbtrf)(const blas_int* m, const blas_int* n, const blas_int* kl, const blas_int* ku, float* ab, const blas_int* ldab, blas_int* ipiv, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgbtrf)(const blas_int* m, const blas_int* n, const blas_int* kl, const blas_int* ku, double* ab, const blas_int* ldab, blas_int* ipiv, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgbtrf)(const blas_int* m, const blas_int* n, const blas_int* kl, const blas_int* ku, blas_cxf* ab, const blas_int* ldab, blas_int* ipiv, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgbtrf)(const blas_int* m, const blas_int* n, const blas_int* kl, const blas_int* ku, blas_cxd* ab, const blas_int* ldab, blas_int* ipiv, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations using pre-computed LU decomposition (general band matrix) void arma_fortran(arma_sgbtrs)(const char* trans, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, const float* ab, const blas_int* ldab, const blas_int* ipiv, float* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgbtrs)(const char* trans, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, const double* ab, const blas_int* ldab, const blas_int* ipiv, double* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgbtrs)(const char* trans, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, const blas_cxf* ab, const blas_int* ldab, const blas_int* ipiv, blas_cxf* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgbtrs)(const char* trans, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, const blas_cxd* ab, const blas_int* ldab, const blas_int* ipiv, blas_cxd* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations (general band matrix) void arma_fortran(arma_sgbsv)(const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, float* ab, const blas_int* ldab, blas_int* ipiv, float* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgbsv)(const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, double* ab, const blas_int* ldab, blas_int* ipiv, double* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgbsv)(const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, blas_cxf* ab, const blas_int* ldab, blas_int* ipiv, blas_cxf* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgbsv)(const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, blas_cxd* ab, const blas_int* ldab, blas_int* ipiv, blas_cxd* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations (general band matrix, advanced form, real matrices) void arma_fortran(arma_sgbsvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, float* ab, const blas_int* ldab, float* afb, const blas_int* ldafb, blas_int* ipiv, char* equed, float* r, float* c, float* b, const blas_int* ldb, float* x, const blas_int* ldx, float* rcond, float* ferr, float* berr, float* work, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgbsvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, double* ab, const blas_int* ldab, double* afb, const blas_int* ldafb, blas_int* ipiv, char* equed, double* r, double* c, double* b, const blas_int* ldb, double* x, const blas_int* ldx, double* rcond, double* ferr, double* berr, double* work, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations (general band matrix, advanced form, complex matrices) void arma_fortran(arma_cgbsvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, blas_cxf* ab, const blas_int* ldab, blas_cxf* afb, const blas_int* ldafb, blas_int* ipiv, char* equed, float* r, float* c, blas_cxf* b, const blas_int* ldb, blas_cxf* x, const blas_int* ldx, float* rcond, float* ferr, float* berr, blas_cxf* work, float* rwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgbsvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_int* nrhs, blas_cxd* ab, const blas_int* ldab, blas_cxd* afb, const blas_int* ldafb, blas_int* ipiv, char* equed, double* r, double* c, blas_cxd* b, const blas_int* ldb, blas_cxd* x, const blas_int* ldx, double* rcond, double* ferr, double* berr, blas_cxd* work, double* rwork, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations (tridiagonal band matrix) void arma_fortran(arma_sgtsv)(const blas_int* n, const blas_int* nrhs, float* dl, float* d, float* du, float* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgtsv)(const blas_int* n, const blas_int* nrhs, double* dl, double* d, double* du, double* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgtsv)(const blas_int* n, const blas_int* nrhs, blas_cxf* dl, blas_cxf* d, blas_cxf* du, blas_cxf* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgtsv)(const blas_int* n, const blas_int* nrhs, blas_cxd* dl, blas_cxd* d, blas_cxd* du, blas_cxd* b, const blas_int* ldb, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations (tridiagonal band matrix, advanced form, real matrices) void arma_fortran(arma_sgtsvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* nrhs, const float* dl, const float* d, const float* du, float* dlf, float* df, float* duf, float* du2, blas_int* ipiv, const float* b, const blas_int* ldb, float* x, const blas_int* ldx, float* rcond, float* ferr, float* berr, float* work, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgtsvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* nrhs, const double* dl, const double* d, const double* du, double* dlf, double* df, double* duf, double* du2, blas_int* ipiv, const double* b, const blas_int* ldb, double* x, const blas_int* ldx, double* rcond, double* ferr, double* berr, double* work, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; // solve system of linear equations (tridiagonal band matrix, advanced form, complex matrices) void arma_fortran(arma_cgtsvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* nrhs, const blas_cxf* dl, const blas_cxf* d, const blas_cxf* du, blas_cxf* dlf, blas_cxf* df, blas_cxf* duf, blas_cxf* du2, blas_int* ipiv, const blas_cxf* b, const blas_int* ldb, blas_cxf* x, const blas_int* ldx, float* rcond, float* ferr, float* berr, blas_cxf* work, float* rwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgtsvx)(const char* fact, const char* trans, const blas_int* n, const blas_int* nrhs, const blas_cxd* dl, const blas_cxd* d, const blas_cxd* du, blas_cxd* dlf, blas_cxd* df, blas_cxd* duf, blas_cxd* du2, blas_int* ipiv, const blas_cxd* b, const blas_int* ldb, blas_cxd* x, const blas_int* ldx, double* rcond, double* ferr, double* berr, blas_cxd* work, double* rwork, blas_int* info) ARMA_NOEXCEPT; // Schur decomposition (real matrices) void arma_fortran(arma_sgees)(const char* jobvs, const char* sort, fn_select_s2 select, const blas_int* n, float* a, const blas_int* lda, blas_int* sdim, float* wr, float* wi, float* vs, const blas_int* ldvs, float* work, const blas_int* lwork, blas_int* bwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgees)(const char* jobvs, const char* sort, fn_select_d2 select, const blas_int* n, double* a, const blas_int* lda, blas_int* sdim, double* wr, double* wi, double* vs, const blas_int* ldvs, double* work, const blas_int* lwork, blas_int* bwork, blas_int* info) ARMA_NOEXCEPT; // Schur decomposition (complex matrices) void arma_fortran(arma_cgees)(const char* jobvs, const char* sort, fn_select_c1 select, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_int* sdim, blas_cxf* w, blas_cxf* vs, const blas_int* ldvs, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* bwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgees)(const char* jobvs, const char* sort, fn_select_z1 select, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_int* sdim, blas_cxd* w, blas_cxd* vs, const blas_int* ldvs, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* bwork, blas_int* info) ARMA_NOEXCEPT; // solve a Sylvester equation ax + xb = c, with a and b assumed to be in Schur form void arma_fortran(arma_strsyl)(const char* transa, const char* transb, const blas_int* isgn, const blas_int* m, const blas_int* n, const float* a, const blas_int* lda, const float* b, const blas_int* ldb, float* c, const blas_int* ldc, float* scale, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dtrsyl)(const char* transa, const char* transb, const blas_int* isgn, const blas_int* m, const blas_int* n, const double* a, const blas_int* lda, const double* b, const blas_int* ldb, double* c, const blas_int* ldc, double* scale, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_ctrsyl)(const char* transa, const char* transb, const blas_int* isgn, const blas_int* m, const blas_int* n, const blas_cxf* a, const blas_int* lda, const blas_cxf* b, const blas_int* ldb, blas_cxf* c, const blas_int* ldc, float* scale, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_ztrsyl)(const char* transa, const char* transb, const blas_int* isgn, const blas_int* m, const blas_int* n, const blas_cxd* a, const blas_int* lda, const blas_cxd* b, const blas_int* ldb, blas_cxd* c, const blas_int* ldc, double* scale, blas_int* info) ARMA_NOEXCEPT; // QZ decomposition (real matrices) void arma_fortran(arma_sgges)(const char* jobvsl, const char* jobvsr, const char* sort, fn_select_s3 selctg, const blas_int* n, float* a, const blas_int* lda, float* b, const blas_int* ldb, blas_int* sdim, float* alphar, float* alphai, float* beta, float* vsl, const blas_int* ldvsl, float* vsr, const blas_int* ldvsr, float* work, const blas_int* lwork, blas_int* bwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgges)(const char* jobvsl, const char* jobvsr, const char* sort, fn_select_d3 selctg, const blas_int* n, double* a, const blas_int* lda, double* b, const blas_int* ldb, blas_int* sdim, double* alphar, double* alphai, double* beta, double* vsl, const blas_int* ldvsl, double* vsr, const blas_int* ldvsr, double* work, const blas_int* lwork, blas_int* bwork, blas_int* info) ARMA_NOEXCEPT; // QZ decomposition (complex matrices) void arma_fortran(arma_cgges)(const char* jobvsl, const char* jobvsr, const char* sort, fn_select_c2 selctg, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_cxf* b, const blas_int* ldb, blas_int* sdim, blas_cxf* alpha, blas_cxf* beta, blas_cxf* vsl, const blas_int* ldvsl, blas_cxf* vsr, const blas_int* ldvsr, blas_cxf* work, const blas_int* lwork, float* rwork, blas_int* bwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgges)(const char* jobvsl, const char* jobvsr, const char* sort, fn_select_z2 selctg, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_cxd* b, const blas_int* ldb, blas_int* sdim, blas_cxd* alpha, blas_cxd* beta, blas_cxd* vsl, const blas_int* ldvsl, blas_cxd* vsr, const blas_int* ldvsr, blas_cxd* work, const blas_int* lwork, double* rwork, blas_int* bwork, blas_int* info) ARMA_NOEXCEPT; // 1-norm (general matrix) float arma_fortran(arma_slange)(const char* norm, const blas_int* m, const blas_int* n, const float* a, const blas_int* lda, float* work) ARMA_NOEXCEPT; double arma_fortran(arma_dlange)(const char* norm, const blas_int* m, const blas_int* n, const double* a, const blas_int* lda, double* work) ARMA_NOEXCEPT; float arma_fortran(arma_clange)(const char* norm, const blas_int* m, const blas_int* n, const blas_cxf* a, const blas_int* lda, float* work) ARMA_NOEXCEPT; double arma_fortran(arma_zlange)(const char* norm, const blas_int* m, const blas_int* n, const blas_cxd* a, const blas_int* lda, double* work) ARMA_NOEXCEPT; // 1-norm (real symmetric matrix) float arma_fortran(arma_slansy)(const char* norm, const char* uplo, const blas_int* n, const float* a, const blas_int* lda, float* work) ARMA_NOEXCEPT; double arma_fortran(arma_dlansy)(const char* norm, const char* uplo, const blas_int* n, const double* a, const blas_int* lda, double* work) ARMA_NOEXCEPT; float arma_fortran(arma_clansy)(const char* norm, const char* uplo, const blas_int* n, const blas_cxf* a, const blas_int* lda, float* work) ARMA_NOEXCEPT; double arma_fortran(arma_zlansy)(const char* norm, const char* uplo, const blas_int* n, const blas_cxd* a, const blas_int* lda, double* work) ARMA_NOEXCEPT; // 1-norm (complex hermitian matrix) float arma_fortran(arma_clanhe)(const char* norm, const char* uplo, const blas_int* n, const blas_cxf* a, const blas_int* lda, float* work) ARMA_NOEXCEPT; double arma_fortran(arma_zlanhe)(const char* norm, const char* uplo, const blas_int* n, const blas_cxd* a, const blas_int* lda, double* work) ARMA_NOEXCEPT; // 1-norm (band matrix) float arma_fortran(arma_slangb)(const char* norm, const blas_int* n, const blas_int* kl, const blas_int* ku, const float* ab, const blas_int* ldab, float* work) ARMA_NOEXCEPT; double arma_fortran(arma_dlangb)(const char* norm, const blas_int* n, const blas_int* kl, const blas_int* ku, const double* ab, const blas_int* ldab, double* work) ARMA_NOEXCEPT; float arma_fortran(arma_clangb)(const char* norm, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_cxf* ab, const blas_int* ldab, float* work) ARMA_NOEXCEPT; double arma_fortran(arma_zlangb)(const char* norm, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_cxd* ab, const blas_int* ldab, double* work) ARMA_NOEXCEPT; // reciprocal of condition number (real, generic matrix) void arma_fortran(arma_sgecon)(const char* norm, const blas_int* n, const float* a, const blas_int* lda, const float* anorm, float* rcond, float* work, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgecon)(const char* norm, const blas_int* n, const double* a, const blas_int* lda, const double* anorm, double* rcond, double* work, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; // reciprocal of condition number (complex, generic matrix) void arma_fortran(arma_cgecon)(const char* norm, const blas_int* n, const blas_cxf* a, const blas_int* lda, const float* anorm, float* rcond, blas_cxf* work, float* rwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgecon)(const char* norm, const blas_int* n, const blas_cxd* a, const blas_int* lda, const double* anorm, double* rcond, blas_cxd* work, double* rwork, blas_int* info) ARMA_NOEXCEPT; // reciprocal of condition number (real, symmetric positive definite matrix) void arma_fortran(arma_spocon)(const char* uplo, const blas_int* n, const float* a, const blas_int* lda, const float* anorm, float* rcond, float* work, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dpocon)(const char* uplo, const blas_int* n, const double* a, const blas_int* lda, const double* anorm, double* rcond, double* work, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; // reciprocal of condition number (complex, hermitian positive definite matrix) void arma_fortran(arma_cpocon)(const char* uplo, const blas_int* n, const blas_cxf* a, const blas_int* lda, const float* anorm, float* rcond, blas_cxf* work, float* rwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zpocon)(const char* uplo, const blas_int* n, const blas_cxd* a, const blas_int* lda, const double* anorm, double* rcond, blas_cxd* work, double* rwork, blas_int* info) ARMA_NOEXCEPT; // reciprocal of condition number (real, triangular matrix) void arma_fortran(arma_strcon)(const char* norm, const char* uplo, const char* diag, const blas_int* n, const float* a, const blas_int* lda, float* rcond, float* work, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dtrcon)(const char* norm, const char* uplo, const char* diag, const blas_int* n, const double* a, const blas_int* lda, double* rcond, double* work, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; // reciprocal of condition number (complex, triangular matrix) void arma_fortran(arma_ctrcon)(const char* norm, const char* uplo, const char* diag, const blas_int* n, const blas_cxf* a, const blas_int* lda, float* rcond, blas_cxf* work, float* rwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_ztrcon)(const char* norm, const char* uplo, const char* diag, const blas_int* n, const blas_cxd* a, const blas_int* lda, double* rcond, blas_cxd* work, double* rwork, blas_int* info) ARMA_NOEXCEPT; // reciprocal of condition number (real, band matrix) void arma_fortran(arma_sgbcon)(const char* norm, const blas_int* n, const blas_int* kl, const blas_int* ku, const float* ab, const blas_int* ldab, const blas_int* ipiv, const float* anorm, float* rcond, float* work, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgbcon)(const char* norm, const blas_int* n, const blas_int* kl, const blas_int* ku, const double* ab, const blas_int* ldab, const blas_int* ipiv, const double* anorm, double* rcond, double* work, blas_int* iwork, blas_int* info) ARMA_NOEXCEPT; // reciprocal of condition number (complex, band matrix) void arma_fortran(arma_cgbcon)(const char* norm, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_cxf* ab, const blas_int* ldab, const blas_int* ipiv, const float* anorm, float* rcond, blas_cxf* work, float* rwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgbcon)(const char* norm, const blas_int* n, const blas_int* kl, const blas_int* ku, const blas_cxd* ab, const blas_int* ldab, const blas_int* ipiv, const double* anorm, double* rcond, blas_cxd* work, double* rwork, blas_int* info) ARMA_NOEXCEPT; // obtain parameters according to the local configuration of lapack // NOTE: DO NOT USE THIS FORM; kept only for compatibility // NOTE: this function takes 'name' and 'opts' argumments, which are strings with length != 1; their length needs to be given via "hidden" parameters, which this form lacks blas_int arma_fortran(arma_ilaenv)(const blas_int* ispec, const char* name, const char* opts, const blas_int* n1, const blas_int* n2, const blas_int* n3, const blas_int* n4) ARMA_NOEXCEPT; // calculate eigenvalues of an upper Hessenberg matrix void arma_fortran(arma_slahqr)(const blas_int* wantt, const blas_int* wantz, const blas_int* n, const blas_int* ilo, const blas_int* ihi, float* h, const blas_int* ldh, float* wr, float* wi, const blas_int* iloz, const blas_int* ihiz, float* z, const blas_int* ldz, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dlahqr)(const blas_int* wantt, const blas_int* wantz, const blas_int* n, const blas_int* ilo, const blas_int* ihi, double* h, const blas_int* ldh, double* wr, double* wi, const blas_int* iloz, const blas_int* ihiz, double* z, const blas_int* ldz, blas_int* info) ARMA_NOEXCEPT; // calculate eigenvalues of a symmetric tridiagonal matrix void arma_fortran(arma_sstedc)(const char* compz, const blas_int* n, float* d, float* e, float* z, const blas_int* ldz, float* work, const blas_int* lwork, blas_int* iwork, const blas_int* liwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dstedc)(const char* compz, const blas_int* n, double* d, double* e, double* z, const blas_int* ldz, double* work, const blas_int* lwork, blas_int* iwork, const blas_int* liwork, blas_int* info) ARMA_NOEXCEPT; // calculate eigenvectors of a Schur form matrix void arma_fortran(arma_strevc)(const char* side, const char* howmny, blas_int* select, const blas_int* n, const float* t, const blas_int* ldt, float* vl, const blas_int* ldvl, float* vr, const blas_int* ldvr, const blas_int* mm, blas_int* m, float* work, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dtrevc)(const char* side, const char* howmny, blas_int* select, const blas_int* n, const double* t, const blas_int* ldt, double* vl, const blas_int* ldvl, double* vr, const blas_int* ldvr, const blas_int* mm, blas_int* m, double* work, blas_int* info) ARMA_NOEXCEPT; // generate a vector of random numbers void arma_fortran(arma_slarnv)(const blas_int* idist, blas_int* iseed, const blas_int* n, float* x) ARMA_NOEXCEPT; void arma_fortran(arma_dlarnv)(const blas_int* idist, blas_int* iseed, const blas_int* n, double* x) ARMA_NOEXCEPT; // hessenberg decomposition void arma_fortran(arma_sgehrd)(const blas_int* n, const blas_int* ilo, const blas_int* ihi, float* a, const blas_int* lda, float* tao, float* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dgehrd)(const blas_int* n, const blas_int* ilo, const blas_int* ihi, double* a, const blas_int* lda, double* tao, double* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cgehrd)(const blas_int* n, const blas_int* ilo, const blas_int* ihi, blas_cxf* a, const blas_int* lda, blas_cxf* tao, blas_cxf* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zgehrd)(const blas_int* n, const blas_int* ilo, const blas_int* ihi, blas_cxd* a, const blas_int* lda, blas_cxd* tao, blas_cxd* work, const blas_int* lwork, blas_int* info) ARMA_NOEXCEPT; // pivoted cholesky void arma_fortran(arma_spstrf)(const char* uplo, const blas_int* n, float* a, const blas_int* lda, blas_int* piv, blas_int* rank, const float* tol, float* work, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_dpstrf)(const char* uplo, const blas_int* n, double* a, const blas_int* lda, blas_int* piv, blas_int* rank, const double* tol, double* work, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_cpstrf)(const char* uplo, const blas_int* n, blas_cxf* a, const blas_int* lda, blas_int* piv, blas_int* rank, const float* tol, float* work, blas_int* info) ARMA_NOEXCEPT; void arma_fortran(arma_zpstrf)(const char* uplo, const blas_int* n, blas_cxd* a, const blas_int* lda, blas_int* piv, blas_int* rank, const double* tol, double* work, blas_int* info) ARMA_NOEXCEPT; #endif } #undef ARMA_NOEXCEPT #endif RcppArmadillo/inst/include/armadillo_bits/SpMat_meat.hpp0000644000176200001440000044516514130024454023147 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpMat //! @{ /** * Initialize a sparse matrix with size 0x0 (empty). */ template inline SpMat::SpMat() : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(0,0); } /** * Clean up the memory of a sparse matrix and destruct it. */ template inline SpMat::~SpMat() { arma_extra_debug_sigprint_this(this); if(values ) { memory::release(access::rw(values)); } if(row_indices) { memory::release(access::rw(row_indices)); } if(col_ptrs ) { memory::release(access::rw(col_ptrs)); } } /** * Constructor with size given. */ template inline SpMat::SpMat(const uword in_rows, const uword in_cols) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(in_rows, in_cols); } template inline SpMat::SpMat(const SizeMat& s) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(s.n_rows, s.n_cols); } template inline SpMat::SpMat(const arma_reserve_indicator&, const uword in_rows, const uword in_cols, const uword new_n_nonzero) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(in_rows, in_cols, new_n_nonzero); } template template inline SpMat::SpMat(const arma_layout_indicator&, const SpMat& x) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(x.n_rows, x.n_cols, x.n_nonzero); if(x.n_nonzero == 0) { return; } if(x.row_indices) { arrayops::copy(access::rwp(row_indices), x.row_indices, x.n_nonzero + 1); } if(x.col_ptrs ) { arrayops::copy(access::rwp(col_ptrs), x.col_ptrs, x.n_cols + 1); } // NOTE: 'values' array is not initialised } /** * Assemble from text. */ template inline SpMat::SpMat(const char* text) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init(std::string(text)); } template inline SpMat& SpMat::operator=(const char* text) { arma_extra_debug_sigprint(); init(std::string(text)); return *this; } template inline SpMat::SpMat(const std::string& text) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint(); init(text); } template inline SpMat& SpMat::operator=(const std::string& text) { arma_extra_debug_sigprint(); init(text); return *this; } template inline SpMat::SpMat(const SpMat& x) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init(x); } template inline SpMat::SpMat(SpMat&& in_mat) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); arma_extra_debug_sigprint(arma_str::format("this = %x in_mat = %x") % this % &in_mat); (*this).steal_mem(in_mat); } template inline SpMat& SpMat::operator=(SpMat&& in_mat) { arma_extra_debug_sigprint(arma_str::format("this = %x in_mat = %x") % this % &in_mat); (*this).steal_mem(in_mat); return *this; } template inline SpMat::SpMat(const MapMat& x) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init(x); } template inline SpMat& SpMat::operator=(const MapMat& x) { arma_extra_debug_sigprint(); init(x); return *this; } //! Insert a large number of values at once. //! locations.row[0] should be row indices, locations.row[1] should be column indices, //! and values should be the corresponding values. //! If sort_locations is false, then it is assumed that the locations and values //! are already sorted in column-major ordering. template template inline SpMat::SpMat(const Base& locations_expr, const Base& vals_expr, const bool sort_locations) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); const unwrap locs_tmp( locations_expr.get_ref() ); const unwrap vals_tmp( vals_expr.get_ref() ); const Mat& locs = locs_tmp.M; const Mat& vals = vals_tmp.M; arma_debug_check( (vals.is_vec() == false), "SpMat::SpMat(): given 'values' object must be a vector" ); arma_debug_check( (locs.n_rows != 2), "SpMat::SpMat(): locations matrix must have two rows" ); arma_debug_check( (locs.n_cols != vals.n_elem), "SpMat::SpMat(): number of locations is different than number of values" ); // If there are no elements in the list, max() will fail. if(locs.n_cols == 0) { init_cold(0, 0); return; } // Automatically determine size before pruning zeros. uvec bounds = arma::max(locs, 1); init_cold(bounds[0] + 1, bounds[1] + 1); // Ensure that there are no zeros const uword N_old = vals.n_elem; uword N_new = 0; for(uword i=0; i < N_old; ++i) { N_new += (vals[i] != eT(0)) ? uword(1) : uword(0); } if(N_new != N_old) { Col filtered_vals( N_new, arma_nozeros_indicator()); Mat filtered_locs(2, N_new, arma_nozeros_indicator()); uword index = 0; for(uword i = 0; i < N_old; ++i) { if(vals[i] != eT(0)) { filtered_vals[index] = vals[i]; filtered_locs.at(0, index) = locs.at(0, i); filtered_locs.at(1, index) = locs.at(1, i); ++index; } } init_batch_std(filtered_locs, filtered_vals, sort_locations); } else { init_batch_std(locs, vals, sort_locations); } } //! Insert a large number of values at once. //! locations.row[0] should be row indices, locations.row[1] should be column indices, //! and values should be the corresponding values. //! If sort_locations is false, then it is assumed that the locations and values //! are already sorted in column-major ordering. //! In this constructor the size is explicitly given. template template inline SpMat::SpMat(const Base& locations_expr, const Base& vals_expr, const uword in_n_rows, const uword in_n_cols, const bool sort_locations, const bool check_for_zeros) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); const unwrap locs_tmp( locations_expr.get_ref() ); const unwrap vals_tmp( vals_expr.get_ref() ); const Mat& locs = locs_tmp.M; const Mat& vals = vals_tmp.M; arma_debug_check( (vals.is_vec() == false), "SpMat::SpMat(): given 'values' object must be a vector" ); arma_debug_check( (locs.n_rows != 2), "SpMat::SpMat(): locations matrix must have two rows" ); arma_debug_check( (locs.n_cols != vals.n_elem), "SpMat::SpMat(): number of locations is different than number of values" ); init_cold(in_n_rows, in_n_cols); // Ensure that there are no zeros, unless the user asked not to. if(check_for_zeros) { const uword N_old = vals.n_elem; uword N_new = 0; for(uword i=0; i < N_old; ++i) { N_new += (vals[i] != eT(0)) ? uword(1) : uword(0); } if(N_new != N_old) { Col filtered_vals( N_new, arma_nozeros_indicator()); Mat filtered_locs(2, N_new, arma_nozeros_indicator()); uword index = 0; for(uword i = 0; i < N_old; ++i) { if(vals[i] != eT(0)) { filtered_vals[index] = vals[i]; filtered_locs.at(0, index) = locs.at(0, i); filtered_locs.at(1, index) = locs.at(1, i); ++index; } } init_batch_std(filtered_locs, filtered_vals, sort_locations); } else { init_batch_std(locs, vals, sort_locations); } } else { init_batch_std(locs, vals, sort_locations); } } template template inline SpMat::SpMat(const bool add_values, const Base& locations_expr, const Base& vals_expr, const uword in_n_rows, const uword in_n_cols, const bool sort_locations, const bool check_for_zeros) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); const unwrap locs_tmp( locations_expr.get_ref() ); const unwrap vals_tmp( vals_expr.get_ref() ); const Mat& locs = locs_tmp.M; const Mat& vals = vals_tmp.M; arma_debug_check( (vals.is_vec() == false), "SpMat::SpMat(): given 'values' object must be a vector" ); arma_debug_check( (locs.n_rows != 2), "SpMat::SpMat(): locations matrix must have two rows" ); arma_debug_check( (locs.n_cols != vals.n_elem), "SpMat::SpMat(): number of locations is different than number of values" ); init_cold(in_n_rows, in_n_cols); // Ensure that there are no zeros, unless the user asked not to. if(check_for_zeros) { const uword N_old = vals.n_elem; uword N_new = 0; for(uword i=0; i < N_old; ++i) { N_new += (vals[i] != eT(0)) ? uword(1) : uword(0); } if(N_new != N_old) { Col filtered_vals( N_new, arma_nozeros_indicator()); Mat filtered_locs(2, N_new, arma_nozeros_indicator()); uword index = 0; for(uword i = 0; i < N_old; ++i) { if(vals[i] != eT(0)) { filtered_vals[index] = vals[i]; filtered_locs.at(0, index) = locs.at(0, i); filtered_locs.at(1, index) = locs.at(1, i); ++index; } } add_values ? init_batch_add(filtered_locs, filtered_vals, sort_locations) : init_batch_std(filtered_locs, filtered_vals, sort_locations); } else { add_values ? init_batch_add(locs, vals, sort_locations) : init_batch_std(locs, vals, sort_locations); } } else { add_values ? init_batch_add(locs, vals, sort_locations) : init_batch_std(locs, vals, sort_locations); } } //! Insert a large number of values at once. //! Per CSC format, rowind_expr should be row indices, //! colptr_expr should column ptr indices locations, //! and values should be the corresponding values. //! In this constructor the size is explicitly given. //! Values are assumed to be sorted, and the size //! information is trusted template template inline SpMat::SpMat ( const Base& rowind_expr, const Base& colptr_expr, const Base& values_expr, const uword in_n_rows, const uword in_n_cols ) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); const unwrap rowind_tmp( rowind_expr.get_ref() ); const unwrap colptr_tmp( colptr_expr.get_ref() ); const unwrap vals_tmp( values_expr.get_ref() ); const Mat& rowind = rowind_tmp.M; const Mat& colptr = colptr_tmp.M; const Mat& vals = vals_tmp.M; arma_debug_check( (rowind.is_vec() == false), "SpMat::SpMat(): given 'rowind' object must be a vector" ); arma_debug_check( (colptr.is_vec() == false), "SpMat::SpMat(): given 'colptr' object must be a vector" ); arma_debug_check( (vals.is_vec() == false), "SpMat::SpMat(): given 'values' object must be a vector" ); // Resize to correct number of elements (this also sets n_nonzero) init_cold(in_n_rows, in_n_cols, vals.n_elem); arma_debug_check( (rowind.n_elem != vals.n_elem), "SpMat::SpMat(): number of row indices is not equal to number of values" ); arma_debug_check( (colptr.n_elem != (n_cols+1) ), "SpMat::SpMat(): number of column pointers is not equal to n_cols+1" ); // copy supplied values into sparse matrix -- not checked for consistency arrayops::copy(access::rwp(row_indices), rowind.memptr(), rowind.n_elem ); arrayops::copy(access::rwp(col_ptrs), colptr.memptr(), colptr.n_elem ); arrayops::copy(access::rwp(values), vals.memptr(), vals.n_elem ); // important: set the sentinel as well access::rw(col_ptrs[n_cols + 1]) = std::numeric_limits::max(); // make sure no zeros are stored remove_zeros(); } template inline SpMat& SpMat::operator=(const eT val) { arma_extra_debug_sigprint(); if(val != eT(0)) { // Resize to 1x1 then set that to the right value. init(1, 1, 1); // Sets col_ptrs to 0. // Manually set element. access::rw(values[0]) = val; access::rw(row_indices[0]) = 0; access::rw(col_ptrs[1]) = 1; } else { init(0, 0); } return *this; } template inline SpMat& SpMat::operator*=(const eT val) { arma_extra_debug_sigprint(); if(val != eT(0)) { sync_csc(); invalidate_cache(); const uword n_nz = n_nonzero; eT* vals = access::rwp(values); bool has_zero = false; for(uword i=0; i inline SpMat& SpMat::operator/=(const eT val) { arma_extra_debug_sigprint(); arma_debug_check( (val == eT(0)), "element-wise division: division by zero" ); sync_csc(); invalidate_cache(); const uword n_nz = n_nonzero; eT* vals = access::rwp(values); bool has_zero = false; for(uword i=0; i inline SpMat& SpMat::operator=(const SpMat& x) { arma_extra_debug_sigprint(); init(x); return *this; } template inline SpMat& SpMat::operator+=(const SpMat& x) { arma_extra_debug_sigprint(); sync_csc(); SpMat out = (*this) + x; steal_mem(out); return *this; } template inline SpMat& SpMat::operator-=(const SpMat& x) { arma_extra_debug_sigprint(); sync_csc(); SpMat out = (*this) - x; steal_mem(out); return *this; } template inline SpMat& SpMat::operator*=(const SpMat& y) { arma_extra_debug_sigprint(); sync_csc(); SpMat z = (*this) * y; steal_mem(z); return *this; } // This is in-place element-wise matrix multiplication. template inline SpMat& SpMat::operator%=(const SpMat& y) { arma_extra_debug_sigprint(); sync_csc(); SpMat z = (*this) % y; steal_mem(z); return *this; } template inline SpMat& SpMat::operator/=(const SpMat& x) { arma_extra_debug_sigprint(); // NOTE: use of this function is not advised; it is implemented only for completeness arma_debug_assert_same_size(n_rows, n_cols, x.n_rows, x.n_cols, "element-wise division"); for(uword c = 0; c < n_cols; ++c) for(uword r = 0; r < n_rows; ++r) { at(r, c) /= x.at(r, c); } return *this; } template template inline SpMat::SpMat(const SpToDOp& expr) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); typedef typename T1::elem_type T; // Make sure the type is compatible. arma_type_check(( is_same_type< eT, T >::no )); op_type::apply(*this, expr); } // Construct a complex matrix out of two non-complex matrices template template inline SpMat::SpMat ( const SpBase::pod_type, T1>& A, const SpBase::pod_type, T2>& B ) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type T; // Make sure eT is complex and T is not (compile-time check). arma_type_check(( is_cx::no )); arma_type_check(( is_cx< T>::yes )); // Compile-time abort if types are not compatible. arma_type_check(( is_same_type< std::complex, eT >::no )); const unwrap_spmat tmp1(A.get_ref()); const unwrap_spmat tmp2(B.get_ref()); const SpMat& X = tmp1.M; const SpMat& Y = tmp2.M; arma_debug_assert_same_size(X.n_rows, X.n_cols, Y.n_rows, Y.n_cols, "SpMat()"); const uword l_n_rows = X.n_rows; const uword l_n_cols = X.n_cols; // Set size of matrix correctly. init_cold(l_n_rows, l_n_cols, n_unique(X, Y, op_n_unique_count())); // Now on a second iteration, fill it. typename SpMat::const_iterator x_it = X.begin(); typename SpMat::const_iterator x_end = X.end(); typename SpMat::const_iterator y_it = Y.begin(); typename SpMat::const_iterator y_end = Y.end(); uword cur_pos = 0; while((x_it != x_end) || (y_it != y_end)) { if(x_it == y_it) // if we are at the same place { access::rw(values[cur_pos]) = std::complex((T) *x_it, (T) *y_it); access::rw(row_indices[cur_pos]) = x_it.row(); ++access::rw(col_ptrs[x_it.col() + 1]); ++x_it; ++y_it; } else { if((x_it.col() < y_it.col()) || ((x_it.col() == y_it.col()) && (x_it.row() < y_it.row()))) // if y is closer to the end { access::rw(values[cur_pos]) = std::complex((T) *x_it, T(0)); access::rw(row_indices[cur_pos]) = x_it.row(); ++access::rw(col_ptrs[x_it.col() + 1]); ++x_it; } else // x is closer to the end { access::rw(values[cur_pos]) = std::complex(T(0), (T) *y_it); access::rw(row_indices[cur_pos]) = y_it.row(); ++access::rw(col_ptrs[y_it.col() + 1]); ++y_it; } } ++cur_pos; } // Now fix the column pointers; they are supposed to be a sum. for(uword c = 1; c <= n_cols; ++c) { access::rw(col_ptrs[c]) += col_ptrs[c - 1]; } } template template inline SpMat::SpMat(const Base& x) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); (*this).operator=(x); } template template inline SpMat& SpMat::operator=(const Base& expr) { arma_extra_debug_sigprint(); if(is_same_type< T1, Gen, gen_zeros> >::yes) { const Proxy P(expr.get_ref()); (*this).zeros( P.get_n_rows(), P.get_n_cols() ); return *this; } if(is_same_type< T1, Gen, gen_eye> >::yes) { const Proxy P(expr.get_ref()); (*this).eye( P.get_n_rows(), P.get_n_cols() ); return *this; } const quasi_unwrap tmp(expr.get_ref()); const Mat& x = tmp.M; const uword x_n_rows = x.n_rows; const uword x_n_cols = x.n_cols; const uword x_n_elem = x.n_elem; // Count number of nonzero elements in base object. uword n = 0; const eT* x_mem = x.memptr(); for(uword i=0; i < x_n_elem; ++i) { n += (x_mem[i] != eT(0)) ? uword(1) : uword(0); } init(x_n_rows, x_n_cols, n); if(n == 0) { return *this; } // Now the memory is resized correctly; set nonzero elements. n = 0; for(uword j = 0; j < x_n_cols; ++j) for(uword i = 0; i < x_n_rows; ++i) { const eT val = (*x_mem); x_mem++; if(val != eT(0)) { access::rw(values[n]) = val; access::rw(row_indices[n]) = i; access::rw(col_ptrs[j + 1])++; ++n; } } // Sum column counts to be column pointers. for(uword c = 1; c <= n_cols; ++c) { access::rw(col_ptrs[c]) += col_ptrs[c - 1]; } return *this; } template template inline SpMat& SpMat::operator+=(const Base& x) { arma_extra_debug_sigprint(); sync_csc(); return (*this).operator=( (*this) + x.get_ref() ); } template template inline SpMat& SpMat::operator-=(const Base& x) { arma_extra_debug_sigprint(); sync_csc(); return (*this).operator=( (*this) - x.get_ref() ); } template template inline SpMat& SpMat::operator*=(const Base& y) { arma_extra_debug_sigprint(); sync_csc(); const Proxy p(y.get_ref()); arma_debug_assert_mul_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "matrix multiplication"); // We assume the matrix structure is such that we will end up with a sparse // matrix. Assuming that every entry in the dense matrix is nonzero (which is // a fairly valid assumption), each row with any nonzero elements in it (in this // matrix) implies an entire nonzero column. Therefore, we iterate over all // the row_indices and count the number of rows with any elements in them // (using the quasi-linked-list idea from SYMBMM -- see spglue_times_meat.hpp). podarray index(n_rows); index.fill(n_rows); // Fill with invalid links. uword last_index = n_rows + 1; for(uword i = 0; i < n_nonzero; ++i) { if(index[row_indices[i]] == n_rows) { index[row_indices[i]] = last_index; last_index = row_indices[i]; } } // Now count the number of rows which have nonzero elements. uword nonzero_rows = 0; while(last_index != n_rows + 1) { ++nonzero_rows; last_index = index[last_index]; } SpMat z(arma_reserve_indicator(), n_rows, p.get_n_cols(), (nonzero_rows * p.get_n_cols())); // upper bound on size // Now we have to fill all the elements using a modification of the NUMBMM algorithm. uword cur_pos = 0; podarray partial_sums(n_rows); partial_sums.zeros(); for(uword lcol = 0; lcol < n_cols; ++lcol) { const_iterator it = begin(); const_iterator it_end = end(); while(it != it_end) { const eT value = (*it); partial_sums[it.row()] += (value * p.at(it.col(), lcol)); ++it; } // Now add all partial sums to the matrix. for(uword i = 0; i < n_rows; ++i) { if(partial_sums[i] != eT(0)) { access::rw(z.values[cur_pos]) = partial_sums[i]; access::rw(z.row_indices[cur_pos]) = i; ++access::rw(z.col_ptrs[lcol + 1]); //printf("colptr %d now %d\n", lcol + 1, z.col_ptrs[lcol + 1]); ++cur_pos; partial_sums[i] = 0; // Would it be faster to do this in batch later? } } } // Now fix the column pointers. for(uword c = 1; c <= z.n_cols; ++c) { access::rw(z.col_ptrs[c]) += z.col_ptrs[c - 1]; } // Resize to final correct size. z.mem_resize(z.col_ptrs[z.n_cols]); // Now take the memory of the temporary matrix. steal_mem(z); return *this; } // NOTE: use of this function is not advised; it is implemented only for completeness template template inline SpMat& SpMat::operator/=(const Base& x) { arma_extra_debug_sigprint(); sync_csc(); SpMat tmp = (*this) / x.get_ref(); steal_mem(tmp); return *this; } template template inline SpMat& SpMat::operator%=(const Base& x) { arma_extra_debug_sigprint(); SpMat tmp; // Just call the other order (these operations are commutative) // TODO: if there is a matrix size mismatch, the debug assert will print the matrix sizes in wrong order spglue_schur_misc::dense_schur_sparse(tmp, x.get_ref(), (*this)); steal_mem(tmp); return *this; } template template inline SpMat::SpMat(const Op& expr) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); (*this).operator=(expr); } template template inline SpMat& SpMat::operator=(const Op& expr) { arma_extra_debug_sigprint(); const diagmat_proxy P(expr.m); const uword max_n_nonzero = (std::min)(P.n_rows, P.n_cols); // resize memory to upper bound init(P.n_rows, P.n_cols, max_n_nonzero); uword count = 0; for(uword i=0; i < max_n_nonzero; ++i) { const eT val = P[i]; if(val != eT(0)) { access::rw(values[count]) = val; access::rw(row_indices[count]) = i; access::rw(col_ptrs[i + 1])++; ++count; } } // fix column pointers to be cumulative for(uword i = 1; i < n_cols + 1; ++i) { access::rw(col_ptrs[i]) += col_ptrs[i - 1]; } // quick resize without reallocating memory and copying data access::rw( n_nonzero) = count; access::rw( values[count]) = eT(0); access::rw(row_indices[count]) = uword(0); return *this; } template template inline SpMat& SpMat::operator+=(const Op& expr) { arma_extra_debug_sigprint(); const SpMat tmp(expr); return (*this).operator+=(tmp); } template template inline SpMat& SpMat::operator-=(const Op& expr) { arma_extra_debug_sigprint(); const SpMat tmp(expr); return (*this).operator-=(tmp); } template template inline SpMat& SpMat::operator*=(const Op& expr) { arma_extra_debug_sigprint(); const SpMat tmp(expr); return (*this).operator*=(tmp); } template template inline SpMat& SpMat::operator/=(const Op& expr) { arma_extra_debug_sigprint(); const SpMat tmp(expr); return (*this).operator/=(tmp); } template template inline SpMat& SpMat::operator%=(const Op& expr) { arma_extra_debug_sigprint(); const SpMat tmp(expr); return (*this).operator%=(tmp); } /** * Functions on subviews. */ template inline SpMat::SpMat(const SpSubview& X) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); (*this).operator=(X); } template inline SpMat& SpMat::operator=(const SpSubview& X) { arma_extra_debug_sigprint(); if(X.n_nonzero == 0) { zeros(X.n_rows, X.n_cols); return *this; } X.m.sync_csc(); const bool alias = (this == &(X.m)); if(alias) { SpMat tmp(X); steal_mem(tmp); } else { init(X.n_rows, X.n_cols, X.n_nonzero); if(X.n_rows == X.m.n_rows) { const uword sv_col_start = X.aux_col1; const uword sv_col_end = X.aux_col1 + X.n_cols - 1; typename SpMat::const_col_iterator m_it = X.m.begin_col(sv_col_start); typename SpMat::const_col_iterator m_it_end = X.m.end_col(sv_col_end); uword count = 0; while(m_it != m_it_end) { const uword m_it_col_adjusted = m_it.col() - sv_col_start; access::rw(row_indices[count]) = m_it.row(); access::rw(values[count]) = (*m_it); ++access::rw(col_ptrs[m_it_col_adjusted + 1]); count++; ++m_it; } } else { typename SpSubview::const_iterator it = X.begin(); typename SpSubview::const_iterator it_end = X.end(); while(it != it_end) { const uword it_pos = it.pos(); access::rw(row_indices[it_pos]) = it.row(); access::rw(values[it_pos]) = (*it); ++access::rw(col_ptrs[it.col() + 1]); ++it; } } // Now sum column pointers. for(uword c = 1; c <= n_cols; ++c) { access::rw(col_ptrs[c]) += col_ptrs[c - 1]; } } return *this; } template inline SpMat& SpMat::operator+=(const SpSubview& X) { arma_extra_debug_sigprint(); sync_csc(); SpMat tmp = (*this) + X; steal_mem(tmp); return *this; } template inline SpMat& SpMat::operator-=(const SpSubview& X) { arma_extra_debug_sigprint(); sync_csc(); SpMat tmp = (*this) - X; steal_mem(tmp); return *this; } template inline SpMat& SpMat::operator*=(const SpSubview& y) { arma_extra_debug_sigprint(); sync_csc(); SpMat z = (*this) * y; steal_mem(z); return *this; } template inline SpMat& SpMat::operator%=(const SpSubview& x) { arma_extra_debug_sigprint(); sync_csc(); SpMat tmp = (*this) % x; steal_mem(tmp); return *this; } template inline SpMat& SpMat::operator/=(const SpSubview& x) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(n_rows, n_cols, x.n_rows, x.n_cols, "element-wise division"); // There is no pretty way to do this. for(uword elem = 0; elem < n_elem; elem++) { at(elem) /= x(elem); } return *this; } template template inline SpMat::SpMat(const SpSubview_col_list& X) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); SpSubview_col_list::extract(*this, X); } template template inline SpMat& SpMat::operator=(const SpSubview_col_list& X) { arma_extra_debug_sigprint(); const bool alias = (this == &(X.m)); if(alias == false) { SpSubview_col_list::extract(*this, X); } else { SpMat tmp(X); steal_mem(tmp); } return *this; } template template inline SpMat& SpMat::operator+=(const SpSubview_col_list& X) { arma_extra_debug_sigprint(); SpSubview_col_list::plus_inplace(*this, X); return *this; } template template inline SpMat& SpMat::operator-=(const SpSubview_col_list& X) { arma_extra_debug_sigprint(); SpSubview_col_list::minus_inplace(*this, X); return *this; } template template inline SpMat& SpMat::operator*=(const SpSubview_col_list& X) { arma_extra_debug_sigprint(); sync_csc(); SpMat z = (*this) * X; steal_mem(z); return *this; } template template inline SpMat& SpMat::operator%=(const SpSubview_col_list& X) { arma_extra_debug_sigprint(); SpSubview_col_list::schur_inplace(*this, X); return *this; } template template inline SpMat& SpMat::operator/=(const SpSubview_col_list& X) { arma_extra_debug_sigprint(); SpSubview_col_list::div_inplace(*this, X); return *this; } template inline SpMat::SpMat(const spdiagview& X) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); spdiagview::extract(*this, X); } template inline SpMat& SpMat::operator=(const spdiagview& X) { arma_extra_debug_sigprint(); spdiagview::extract(*this, X); return *this; } template inline SpMat& SpMat::operator+=(const spdiagview& X) { arma_extra_debug_sigprint(); const SpMat tmp(X); return (*this).operator+=(tmp); } template inline SpMat& SpMat::operator-=(const spdiagview& X) { arma_extra_debug_sigprint(); const SpMat tmp(X); return (*this).operator-=(tmp); } template inline SpMat& SpMat::operator*=(const spdiagview& X) { arma_extra_debug_sigprint(); const SpMat tmp(X); return (*this).operator*=(tmp); } template inline SpMat& SpMat::operator%=(const spdiagview& X) { arma_extra_debug_sigprint(); const SpMat tmp(X); return (*this).operator%=(tmp); } template inline SpMat& SpMat::operator/=(const spdiagview& X) { arma_extra_debug_sigprint(); const SpMat tmp(X); return (*this).operator/=(tmp); } template template inline SpMat::SpMat(const SpOp& X) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) // set in application of sparse operation , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); spop_type::apply(*this, X); sync_csc(); // in case apply() used element accessors invalidate_cache(); // in case apply() modified the CSC representation } template template inline SpMat& SpMat::operator=(const SpOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); spop_type::apply(*this, X); sync_csc(); // in case apply() used element accessors invalidate_cache(); // in case apply() modified the CSC representation return *this; } template template inline SpMat& SpMat::operator+=(const SpOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); sync_csc(); const SpMat m(X); return (*this).operator+=(m); } template template inline SpMat& SpMat::operator-=(const SpOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); sync_csc(); const SpMat m(X); return (*this).operator-=(m); } template template inline SpMat& SpMat::operator*=(const SpOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); sync_csc(); const SpMat m(X); return (*this).operator*=(m); } template template inline SpMat& SpMat::operator%=(const SpOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); sync_csc(); const SpMat m(X); return (*this).operator%=(m); } template template inline SpMat& SpMat::operator/=(const SpOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); sync_csc(); const SpMat m(X); return (*this).operator/=(m); } template template inline SpMat::SpMat(const SpGlue& X) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); spglue_type::apply(*this, X); sync_csc(); // in case apply() used element accessors invalidate_cache(); // in case apply() modified the CSC representation } template template inline SpMat& SpMat::operator=(const SpGlue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); spglue_type::apply(*this, X); sync_csc(); // in case apply() used element accessors invalidate_cache(); // in case apply() modified the CSC representation return *this; } template template inline SpMat& SpMat::operator+=(const SpGlue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); sync_csc(); const SpMat m(X); return (*this).operator+=(m); } template template inline SpMat& SpMat::operator-=(const SpGlue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); sync_csc(); const SpMat m(X); return (*this).operator-=(m); } template template inline SpMat& SpMat::operator*=(const SpGlue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); sync_csc(); const SpMat m(X); return (*this).operator*=(m); } template template inline SpMat& SpMat::operator%=(const SpGlue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); sync_csc(); const SpMat m(X); return (*this).operator%=(m); } template template inline SpMat& SpMat::operator/=(const SpGlue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); sync_csc(); const SpMat m(X); return (*this).operator/=(m); } template template inline SpMat::SpMat(const mtSpOp& X) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); spop_type::apply(*this, X); sync_csc(); // in case apply() used element accessors invalidate_cache(); // in case apply() modified the CSC representation } template template inline SpMat& SpMat::operator=(const mtSpOp& X) { arma_extra_debug_sigprint(); spop_type::apply(*this, X); sync_csc(); // in case apply() used element accessors invalidate_cache(); // in case apply() modified the CSC representation return *this; } template template inline SpMat& SpMat::operator+=(const mtSpOp& X) { arma_extra_debug_sigprint(); sync_csc(); const SpMat m(X); return (*this).operator+=(m); } template template inline SpMat& SpMat::operator-=(const mtSpOp& X) { arma_extra_debug_sigprint(); sync_csc(); const SpMat m(X); return (*this).operator-=(m); } template template inline SpMat& SpMat::operator*=(const mtSpOp& X) { arma_extra_debug_sigprint(); sync_csc(); const SpMat m(X); return (*this).operator*=(m); } template template inline SpMat& SpMat::operator%=(const mtSpOp& X) { arma_extra_debug_sigprint(); sync_csc(); const SpMat m(X); return (*this).operator%=(m); } template template inline SpMat& SpMat::operator/=(const mtSpOp& X) { arma_extra_debug_sigprint(); sync_csc(); const SpMat m(X); return (*this).operator/=(m); } template template inline SpMat::SpMat(const mtSpGlue& X) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(0) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); spglue_type::apply(*this, X); sync_csc(); // in case apply() used element accessors invalidate_cache(); // in case apply() modified the CSC representation } template template inline SpMat& SpMat::operator=(const mtSpGlue& X) { arma_extra_debug_sigprint(); spglue_type::apply(*this, X); sync_csc(); // in case apply() used element accessors invalidate_cache(); // in case apply() modified the CSC representation return *this; } template template inline SpMat& SpMat::operator+=(const mtSpGlue& X) { arma_extra_debug_sigprint(); sync_csc(); const SpMat m(X); return (*this).operator+=(m); } template template inline SpMat& SpMat::operator-=(const mtSpGlue& X) { arma_extra_debug_sigprint(); sync_csc(); const SpMat m(X); return (*this).operator-=(m); } template template inline SpMat& SpMat::operator*=(const mtSpGlue& X) { arma_extra_debug_sigprint(); sync_csc(); const SpMat m(X); return (*this).operator*=(m); } template template inline SpMat& SpMat::operator%=(const mtSpGlue& X) { arma_extra_debug_sigprint(); sync_csc(); const SpMat m(X); return (*this).operator%=(m); } template template inline SpMat& SpMat::operator/=(const mtSpGlue& X) { arma_extra_debug_sigprint(); sync_csc(); const SpMat m(X); return (*this).operator/=(m); } template arma_inline SpSubview_row SpMat::row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds(row_num >= n_rows, "SpMat::row(): out of bounds"); return SpSubview_row(*this, row_num); } template arma_inline const SpSubview_row SpMat::row(const uword row_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds(row_num >= n_rows, "SpMat::row(): out of bounds"); return SpSubview_row(*this, row_num); } template inline SpSubview_row SpMat::operator()(const uword row_num, const span& col_span) { arma_extra_debug_sigprint(); const bool col_all = col_span.whole; const uword local_n_cols = n_cols; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds ( (row_num >= n_rows) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "SpMat::operator(): indices out of bounds or incorrectly used" ); return SpSubview_row(*this, row_num, in_col1, submat_n_cols); } template inline const SpSubview_row SpMat::operator()(const uword row_num, const span& col_span) const { arma_extra_debug_sigprint(); const bool col_all = col_span.whole; const uword local_n_cols = n_cols; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds ( (row_num >= n_rows) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "SpMat::operator(): indices out of bounds or incorrectly used" ); return SpSubview_row(*this, row_num, in_col1, submat_n_cols); } template arma_inline SpSubview_col SpMat::col(const uword col_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds(col_num >= n_cols, "SpMat::col(): out of bounds"); return SpSubview_col(*this, col_num); } template arma_inline const SpSubview_col SpMat::col(const uword col_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds(col_num >= n_cols, "SpMat::col(): out of bounds"); return SpSubview_col(*this, col_num); } template inline SpSubview_col SpMat::operator()(const span& row_span, const uword col_num) { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const uword local_n_rows = n_rows; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; arma_debug_check_bounds ( (col_num >= n_cols) || ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) , "SpMat::operator(): indices out of bounds or incorrectly used" ); return SpSubview_col(*this, col_num, in_row1, submat_n_rows); } template inline const SpSubview_col SpMat::operator()(const span& row_span, const uword col_num) const { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const uword local_n_rows = n_rows; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; arma_debug_check_bounds ( (col_num >= n_cols) || ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) , "SpMat::operator(): indices out of bounds or incorrectly used" ); return SpSubview_col(*this, col_num, in_row1, submat_n_rows); } template arma_inline SpSubview SpMat::rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_row2 >= n_rows), "SpMat::rows(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; return SpSubview(*this, in_row1, 0, subview_n_rows, n_cols); } template arma_inline const SpSubview SpMat::rows(const uword in_row1, const uword in_row2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_row2 >= n_rows), "SpMat::rows(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; return SpSubview(*this, in_row1, 0, subview_n_rows, n_cols); } template arma_inline SpSubview SpMat::cols(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_col1 > in_col2) || (in_col2 >= n_cols), "SpMat::cols(): indices out of bounds or incorrectly used" ); const uword subview_n_cols = in_col2 - in_col1 + 1; return SpSubview(*this, 0, in_col1, n_rows, subview_n_cols); } template arma_inline const SpSubview SpMat::cols(const uword in_col1, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_col1 > in_col2) || (in_col2 >= n_cols), "SpMat::cols(): indices out of bounds or incorrectly used" ); const uword subview_n_cols = in_col2 - in_col1 + 1; return SpSubview(*this, 0, in_col1, n_rows, subview_n_cols); } template arma_inline SpSubview SpMat::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols), "SpMat::submat(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; const uword subview_n_cols = in_col2 - in_col1 + 1; return SpSubview(*this, in_row1, in_col1, subview_n_rows, subview_n_cols); } template arma_inline const SpSubview SpMat::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols), "SpMat::submat(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; const uword subview_n_cols = in_col2 - in_col1 + 1; return SpSubview(*this, in_row1, in_col1, subview_n_rows, subview_n_cols); } template arma_inline SpSubview SpMat::submat(const uword in_row1, const uword in_col1, const SizeMat& s) { arma_extra_debug_sigprint(); const uword l_n_rows = n_rows; const uword l_n_cols = n_cols; const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; arma_debug_check_bounds ( ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols)), "SpMat::submat(): indices or size out of bounds" ); return SpSubview(*this, in_row1, in_col1, s_n_rows, s_n_cols); } template arma_inline const SpSubview SpMat::submat(const uword in_row1, const uword in_col1, const SizeMat& s) const { arma_extra_debug_sigprint(); const uword l_n_rows = n_rows; const uword l_n_cols = n_cols; const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; arma_debug_check_bounds ( ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols)), "SpMat::submat(): indices or size out of bounds" ); return SpSubview(*this, in_row1, in_col1, s_n_rows, s_n_cols); } template inline SpSubview SpMat::submat(const span& row_span, const span& col_span) { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const bool col_all = col_span.whole; const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "SpMat::submat(): indices out of bounds or incorrectly used" ); return SpSubview(*this, in_row1, in_col1, submat_n_rows, submat_n_cols); } template inline const SpSubview SpMat::submat(const span& row_span, const span& col_span) const { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const bool col_all = col_span.whole; const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "SpMat::submat(): indices out of bounds or incorrectly used" ); return SpSubview(*this, in_row1, in_col1, submat_n_rows, submat_n_cols); } template inline SpSubview SpMat::operator()(const span& row_span, const span& col_span) { arma_extra_debug_sigprint(); return submat(row_span, col_span); } template inline const SpSubview SpMat::operator()(const span& row_span, const span& col_span) const { arma_extra_debug_sigprint(); return submat(row_span, col_span); } template arma_inline SpSubview SpMat::operator()(const uword in_row1, const uword in_col1, const SizeMat& s) { arma_extra_debug_sigprint(); return (*this).submat(in_row1, in_col1, s); } template arma_inline const SpSubview SpMat::operator()(const uword in_row1, const uword in_col1, const SizeMat& s) const { arma_extra_debug_sigprint(); return (*this).submat(in_row1, in_col1, s); } template inline SpSubview SpMat::head_rows(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_rows), "SpMat::head_rows(): size out of bounds" ); return SpSubview(*this, 0, 0, N, n_cols); } template inline const SpSubview SpMat::head_rows(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_rows), "SpMat::head_rows(): size out of bounds" ); return SpSubview(*this, 0, 0, N, n_cols); } template inline SpSubview SpMat::tail_rows(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_rows), "SpMat::tail_rows(): size out of bounds" ); const uword start_row = n_rows - N; return SpSubview(*this, start_row, 0, N, n_cols); } template inline const SpSubview SpMat::tail_rows(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_rows), "SpMat::tail_rows(): size out of bounds" ); const uword start_row = n_rows - N; return SpSubview(*this, start_row, 0, N, n_cols); } template inline SpSubview SpMat::head_cols(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_cols), "SpMat::head_cols(): size out of bounds" ); return SpSubview(*this, 0, 0, n_rows, N); } template inline const SpSubview SpMat::head_cols(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_cols), "SpMat::head_cols(): size out of bounds" ); return SpSubview(*this, 0, 0, n_rows, N); } template inline SpSubview SpMat::tail_cols(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_cols), "SpMat::tail_cols(): size out of bounds" ); const uword start_col = n_cols - N; return SpSubview(*this, 0, start_col, n_rows, N); } template inline const SpSubview SpMat::tail_cols(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_cols), "SpMat::tail_cols(): size out of bounds" ); const uword start_col = n_cols - N; return SpSubview(*this, 0, start_col, n_rows, N); } template template arma_inline SpSubview_col_list SpMat::cols(const Base& indices) { arma_extra_debug_sigprint(); return SpSubview_col_list(*this, indices); } template template arma_inline const SpSubview_col_list SpMat::cols(const Base& indices) const { arma_extra_debug_sigprint(); return SpSubview_col_list(*this, indices); } //! creation of spdiagview (diagonal) template inline spdiagview SpMat::diag(const sword in_id) { arma_extra_debug_sigprint(); const uword row_offset = (in_id < 0) ? uword(-in_id) : 0; const uword col_offset = (in_id > 0) ? uword( in_id) : 0; arma_debug_check_bounds ( ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)), "SpMat::diag(): requested diagonal out of bounds" ); const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset); return spdiagview(*this, row_offset, col_offset, len); } //! creation of spdiagview (diagonal) template inline const spdiagview SpMat::diag(const sword in_id) const { arma_extra_debug_sigprint(); const uword row_offset = uword( (in_id < 0) ? -in_id : 0 ); const uword col_offset = uword( (in_id > 0) ? in_id : 0 ); arma_debug_check_bounds ( ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)), "SpMat::diag(): requested diagonal out of bounds" ); const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset); return spdiagview(*this, row_offset, col_offset, len); } template inline void SpMat::swap_rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check_bounds( ((in_row1 >= n_rows) || (in_row2 >= n_rows)), "SpMat::swap_rows(): out of bounds" ); if(in_row1 == in_row2) { return; } sync_csc(); invalidate_cache(); // The easier way to do this, instead of collecting all the elements in one row and then swapping with the other, will be // to iterate over each column of the matrix (since we store in column-major format) and then swap the two elements in the two rows at that time. // We will try to avoid using the at() call since it is expensive, instead preferring to use an iterator to track our position. uword col1 = (in_row1 < in_row2) ? in_row1 : in_row2; uword col2 = (in_row1 < in_row2) ? in_row2 : in_row1; for(uword lcol = 0; lcol < n_cols; lcol++) { // If there is nothing in this column we can ignore it. if(col_ptrs[lcol] == col_ptrs[lcol + 1]) { continue; } // These will represent the positions of the items themselves. uword loc1 = n_nonzero + 1; uword loc2 = n_nonzero + 1; for(uword search_pos = col_ptrs[lcol]; search_pos < col_ptrs[lcol + 1]; search_pos++) { if(row_indices[search_pos] == col1) { loc1 = search_pos; } if(row_indices[search_pos] == col2) { loc2 = search_pos; break; // No need to look any further. } } // There are four cases: we found both elements; we found one element (loc1); we found one element (loc2); we found zero elements. // If we found zero elements no work needs to be done and we can continue to the next column. if((loc1 != (n_nonzero + 1)) && (loc2 != (n_nonzero + 1))) { // This is an easy case: just swap the values. No index modifying necessary. eT tmp = values[loc1]; access::rw(values[loc1]) = values[loc2]; access::rw(values[loc2]) = tmp; } else if(loc1 != (n_nonzero + 1)) // We only found loc1 and not loc2. { // We need to find the correct place to move our value to. It will be forward (not backwards) because in_row2 > in_row1. // Each iteration of the loop swaps the current value (loc1) with (loc1 + 1); in this manner we move our value down to where it should be. while(((loc1 + 1) < col_ptrs[lcol + 1]) && (row_indices[loc1 + 1] < in_row2)) { // Swap both the values and the indices. The column should not change. eT tmp = values[loc1]; access::rw(values[loc1]) = values[loc1 + 1]; access::rw(values[loc1 + 1]) = tmp; uword tmp_index = row_indices[loc1]; access::rw(row_indices[loc1]) = row_indices[loc1 + 1]; access::rw(row_indices[loc1 + 1]) = tmp_index; loc1++; // And increment the counter. } // Now set the row index correctly. access::rw(row_indices[loc1]) = in_row2; } else if(loc2 != (n_nonzero + 1)) { // We need to find the correct place to move our value to. It will be backwards (not forwards) because in_row1 < in_row2. // Each iteration of the loop swaps the current value (loc2) with (loc2 - 1); in this manner we move our value up to where it should be. while(((loc2 - 1) >= col_ptrs[lcol]) && (row_indices[loc2 - 1] > in_row1)) { // Swap both the values and the indices. The column should not change. eT tmp = values[loc2]; access::rw(values[loc2]) = values[loc2 - 1]; access::rw(values[loc2 - 1]) = tmp; uword tmp_index = row_indices[loc2]; access::rw(row_indices[loc2]) = row_indices[loc2 - 1]; access::rw(row_indices[loc2 - 1]) = tmp_index; loc2--; // And decrement the counter. } // Now set the row index correctly. access::rw(row_indices[loc2]) = in_row1; } /* else: no need to swap anything; both values are zero */ } } template inline void SpMat::swap_cols(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds( ((in_col1 >= n_cols) || (in_col2 >= n_cols)), "SpMat::swap_cols(): out of bounds" ); if(in_col1 == in_col2) { return; } // TODO: this is a rudimentary implementation SpMat tmp = (*this); tmp.col(in_col1) = (*this).col(in_col2); tmp.col(in_col2) = (*this).col(in_col1); steal_mem(tmp); // for(uword lrow = 0; lrow < n_rows; ++lrow) // { // const eT tmp = at(lrow, in_col1); // at(lrow, in_col1) = eT( at(lrow, in_col2) ); // at(lrow, in_col2) = tmp; // } } template inline void SpMat::shed_row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds(row_num >= n_rows, "SpMat::shed_row(): out of bounds"); shed_rows (row_num, row_num); } template inline void SpMat::shed_col(const uword col_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds(col_num >= n_cols, "SpMat::shed_col(): out of bounds"); shed_cols(col_num, col_num); } template inline void SpMat::shed_rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_row2 >= n_rows), "SpMat::shed_rows(): indices out of bounds or incorectly used" ); sync_csc(); SpMat newmat(n_rows - (in_row2 - in_row1 + 1), n_cols); // First, count the number of elements we will be removing. uword removing = 0; for(uword i = 0; i < n_nonzero; ++i) { const uword lrow = row_indices[i]; if(lrow >= in_row1 && lrow <= in_row2) { ++removing; } } // Obtain counts of the number of points in each column and store them as the // (invalid) column pointers of the new matrix. for(uword i = 1; i < n_cols + 1; ++i) { access::rw(newmat.col_ptrs[i]) = col_ptrs[i] - col_ptrs[i - 1]; } // Now initialize memory for the new matrix. newmat.mem_resize(n_nonzero - removing); // Now, copy over the elements. // i is the index in the old matrix; j is the index in the new matrix. const_iterator it = begin(); const_iterator it_end = end(); uword j = 0; // The index in the new matrix. while(it != it_end) { const uword lrow = it.row(); const uword lcol = it.col(); if(lrow >= in_row1 && lrow <= in_row2) { // This element is being removed. Subtract it from the column counts. --access::rw(newmat.col_ptrs[lcol + 1]); } else { // This element is being kept. We may need to map the row index, // if it is past the section of rows we are removing. if(lrow > in_row2) { access::rw(newmat.row_indices[j]) = lrow - (in_row2 - in_row1 + 1); } else { access::rw(newmat.row_indices[j]) = lrow; } access::rw(newmat.values[j]) = (*it); ++j; // Increment index in new matrix. } ++it; } // Finally, sum the column counts so they are correct column pointers. for(uword i = 1; i < n_cols + 1; ++i) { access::rw(newmat.col_ptrs[i]) += newmat.col_ptrs[i - 1]; } // Now steal the memory of the new matrix. steal_mem(newmat); } template inline void SpMat::shed_cols(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_col1 > in_col2) || (in_col2 >= n_cols), "SpMat::shed_cols(): indices out of bounds or incorrectly used" ); sync_csc(); invalidate_cache(); // First we find the locations in values and row_indices for the column entries. uword col_beg = col_ptrs[in_col1]; uword col_end = col_ptrs[in_col2 + 1]; // Then we find the number of entries in the column. uword diff = col_end - col_beg; if(diff > 0) { eT* new_values = memory::acquire (n_nonzero - diff); uword* new_row_indices = memory::acquire(n_nonzero - diff); // Copy first part. if(col_beg != 0) { arrayops::copy(new_values, values, col_beg); arrayops::copy(new_row_indices, row_indices, col_beg); } // Copy second part. if(col_end != n_nonzero) { arrayops::copy(new_values + col_beg, values + col_end, n_nonzero - col_end); arrayops::copy(new_row_indices + col_beg, row_indices + col_end, n_nonzero - col_end); } if(values) { memory::release(access::rw(values)); } if(row_indices) { memory::release(access::rw(row_indices)); } access::rw(values) = new_values; access::rw(row_indices) = new_row_indices; // Update counts and such. access::rw(n_nonzero) -= diff; } // Update column pointers. const uword new_n_cols = n_cols - ((in_col2 - in_col1) + 1); uword* new_col_ptrs = memory::acquire(new_n_cols + 2); new_col_ptrs[new_n_cols + 1] = std::numeric_limits::max(); // Copy first set of columns (no manipulation required). if(in_col1 != 0) { arrayops::copy(new_col_ptrs, col_ptrs, in_col1); } // Copy second set of columns (manipulation required). uword cur_col = in_col1; for(uword i = in_col2 + 1; i <= n_cols; ++i, ++cur_col) { new_col_ptrs[cur_col] = col_ptrs[i] - diff; } if(col_ptrs) { memory::release(access::rw(col_ptrs)); } access::rw(col_ptrs) = new_col_ptrs; // We update the element and column counts, and we're done. access::rw(n_cols) = new_n_cols; access::rw(n_elem) = n_cols * n_rows; } /** * Element access; acces the i'th element (works identically to the Mat accessors). * If there is nothing at element i, 0 is returned. */ template arma_inline arma_warn_unused SpMat_MapMat_val SpMat::operator[](const uword i) { const uword in_col = i / n_rows; const uword in_row = i % n_rows; return SpMat_MapMat_val((*this), cache, in_row, in_col); } template arma_inline arma_warn_unused eT SpMat::operator[](const uword i) const { return get_value(i); } template arma_inline arma_warn_unused SpMat_MapMat_val SpMat::at(const uword i) { const uword in_col = i / n_rows; const uword in_row = i % n_rows; return SpMat_MapMat_val((*this), cache, in_row, in_col); } template arma_inline arma_warn_unused eT SpMat::at(const uword i) const { return get_value(i); } template arma_inline arma_warn_unused SpMat_MapMat_val SpMat::operator()(const uword i) { arma_debug_check_bounds( (i >= n_elem), "SpMat::operator(): out of bounds" ); const uword in_col = i / n_rows; const uword in_row = i % n_rows; return SpMat_MapMat_val((*this), cache, in_row, in_col); } template arma_inline arma_warn_unused eT SpMat::operator()(const uword i) const { arma_debug_check_bounds( (i >= n_elem), "SpMat::operator(): out of bounds" ); return get_value(i); } /** * Element access; access the element at row in_rows and column in_col. * If there is nothing at that position, 0 is returned. */ template arma_inline arma_warn_unused SpMat_MapMat_val SpMat::at(const uword in_row, const uword in_col) { return SpMat_MapMat_val((*this), cache, in_row, in_col); } template arma_inline arma_warn_unused eT SpMat::at(const uword in_row, const uword in_col) const { return get_value(in_row, in_col); } template arma_inline arma_warn_unused SpMat_MapMat_val SpMat::operator()(const uword in_row, const uword in_col) { arma_debug_check_bounds( ((in_row >= n_rows) || (in_col >= n_cols)), "SpMat::operator(): out of bounds" ); return SpMat_MapMat_val((*this), cache, in_row, in_col); } template arma_inline arma_warn_unused eT SpMat::operator()(const uword in_row, const uword in_col) const { arma_debug_check_bounds( ((in_row >= n_rows) || (in_col >= n_cols)), "SpMat::operator(): out of bounds" ); return get_value(in_row, in_col); } /** * Check if matrix is empty (no size, no values). */ template arma_inline arma_warn_unused bool SpMat::is_empty() const { return (n_elem == 0); } //! returns true if the object can be interpreted as a column or row vector template arma_inline arma_warn_unused bool SpMat::is_vec() const { return ( (n_rows == 1) || (n_cols == 1) ); } //! returns true if the object can be interpreted as a row vector template arma_inline arma_warn_unused bool SpMat::is_rowvec() const { return (n_rows == 1); } //! returns true if the object can be interpreted as a column vector template arma_inline arma_warn_unused bool SpMat::is_colvec() const { return (n_cols == 1); } //! returns true if the object has the same number of non-zero rows and columnns template arma_inline arma_warn_unused bool SpMat::is_square() const { return (n_rows == n_cols); } //! returns true if all of the elements are finite template inline arma_warn_unused bool SpMat::is_finite() const { arma_extra_debug_sigprint(); sync_csc(); return arrayops::is_finite(values, n_nonzero); } template inline arma_warn_unused bool SpMat::is_symmetric() const { arma_extra_debug_sigprint(); const SpMat& A = (*this); if(A.n_rows != A.n_cols) { return false; } const SpMat tmp = A - A.st(); return (tmp.n_nonzero == uword(0)); } template inline arma_warn_unused bool SpMat::is_symmetric(const typename get_pod_type::result tol) const { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; if(tol == T(0)) { return (*this).is_symmetric(); } arma_debug_check( (tol < T(0)), "is_symmetric(): parameter 'tol' must be >= 0" ); const SpMat& A = (*this); if(A.n_rows != A.n_cols) { return false; } const T norm_A = as_scalar( arma::max(sum(abs(A), 1), 0) ); if(norm_A == T(0)) { return true; } const T norm_A_Ast = as_scalar( arma::max(sum(abs(A - A.st()), 1), 0) ); return ( (norm_A_Ast / norm_A) <= tol ); } template inline arma_warn_unused bool SpMat::is_hermitian() const { arma_extra_debug_sigprint(); const SpMat& A = (*this); if(A.n_rows != A.n_cols) { return false; } const SpMat tmp = A - A.t(); return (tmp.n_nonzero == uword(0)); } template inline arma_warn_unused bool SpMat::is_hermitian(const typename get_pod_type::result tol) const { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; if(tol == T(0)) { return (*this).is_hermitian(); } arma_debug_check( (tol < T(0)), "is_hermitian(): parameter 'tol' must be >= 0" ); const SpMat& A = (*this); if(A.n_rows != A.n_cols) { return false; } const T norm_A = as_scalar( arma::max(sum(abs(A), 1), 0) ); if(norm_A == T(0)) { return true; } const T norm_A_At = as_scalar( arma::max(sum(abs(A - A.t()), 1), 0) ); return ( (norm_A_At / norm_A) <= tol ); } template inline arma_warn_unused bool SpMat::has_inf() const { arma_extra_debug_sigprint(); sync_csc(); return arrayops::has_inf(values, n_nonzero); } template inline arma_warn_unused bool SpMat::has_nan() const { arma_extra_debug_sigprint(); sync_csc(); return arrayops::has_nan(values, n_nonzero); } //! returns true if the given index is currently in range template arma_inline arma_warn_unused bool SpMat::in_range(const uword i) const { return (i < n_elem); } //! returns true if the given start and end indices are currently in range template arma_inline arma_warn_unused bool SpMat::in_range(const span& x) const { arma_extra_debug_sigprint(); if(x.whole) { return true; } else { const uword a = x.a; const uword b = x.b; return ( (a <= b) && (b < n_elem) ); } } //! returns true if the given location is currently in range template arma_inline arma_warn_unused bool SpMat::in_range(const uword in_row, const uword in_col) const { return ( (in_row < n_rows) && (in_col < n_cols) ); } template arma_inline arma_warn_unused bool SpMat::in_range(const span& row_span, const uword in_col) const { arma_extra_debug_sigprint(); if(row_span.whole) { return (in_col < n_cols); } else { const uword in_row1 = row_span.a; const uword in_row2 = row_span.b; return ( (in_row1 <= in_row2) && (in_row2 < n_rows) && (in_col < n_cols) ); } } template arma_inline arma_warn_unused bool SpMat::in_range(const uword in_row, const span& col_span) const { arma_extra_debug_sigprint(); if(col_span.whole) { return (in_row < n_rows); } else { const uword in_col1 = col_span.a; const uword in_col2 = col_span.b; return ( (in_row < n_rows) && (in_col1 <= in_col2) && (in_col2 < n_cols) ); } } template arma_inline arma_warn_unused bool SpMat::in_range(const span& row_span, const span& col_span) const { arma_extra_debug_sigprint(); const uword in_row1 = row_span.a; const uword in_row2 = row_span.b; const uword in_col1 = col_span.a; const uword in_col2 = col_span.b; const bool rows_ok = row_span.whole ? true : ( (in_row1 <= in_row2) && (in_row2 < n_rows) ); const bool cols_ok = col_span.whole ? true : ( (in_col1 <= in_col2) && (in_col2 < n_cols) ); return ( rows_ok && cols_ok ); } template arma_inline arma_warn_unused bool SpMat::in_range(const uword in_row, const uword in_col, const SizeMat& s) const { const uword l_n_rows = n_rows; const uword l_n_cols = n_cols; if( (in_row >= l_n_rows) || (in_col >= l_n_cols) || ((in_row + s.n_rows) > l_n_rows) || ((in_col + s.n_cols) > l_n_cols) ) { return false; } else { return true; } } //! Set the size to the size of another matrix. template template inline void SpMat::copy_size(const SpMat& m) { arma_extra_debug_sigprint(); set_size(m.n_rows, m.n_cols); } template template inline void SpMat::copy_size(const Mat& m) { arma_extra_debug_sigprint(); set_size(m.n_rows, m.n_cols); } template inline void SpMat::set_size(const uword in_elem) { arma_extra_debug_sigprint(); // If this is a row vector, we resize to a row vector. if(vec_state == 2) { set_size(1, in_elem); } else { set_size(in_elem, 1); } } template inline void SpMat::set_size(const uword in_rows, const uword in_cols) { arma_extra_debug_sigprint(); invalidate_cache(); // placed here, as set_size() is used during matrix modification if( (n_rows == in_rows) && (n_cols == in_cols) ) { return; } else { init(in_rows, in_cols); } } template inline void SpMat::set_size(const SizeMat& s) { arma_extra_debug_sigprint(); (*this).set_size(s.n_rows, s.n_cols); } template inline void SpMat::resize(const uword in_rows, const uword in_cols) { arma_extra_debug_sigprint(); if( (n_rows == in_rows) && (n_cols == in_cols) ) { return; } if( (n_elem == 0) || (n_nonzero == 0) ) { set_size(in_rows, in_cols); return; } SpMat tmp(in_rows, in_cols); if(tmp.n_elem > 0) { sync_csc(); const uword last_row = (std::min)(in_rows, n_rows) - 1; const uword last_col = (std::min)(in_cols, n_cols) - 1; tmp.submat(0, 0, last_row, last_col) = (*this).submat(0, 0, last_row, last_col); } steal_mem(tmp); } template inline void SpMat::resize(const SizeMat& s) { arma_extra_debug_sigprint(); (*this).resize(s.n_rows, s.n_cols); } template inline void SpMat::reshape(const uword in_rows, const uword in_cols) { arma_extra_debug_sigprint(); arma_check( ((in_rows*in_cols) != n_elem), "SpMat::reshape(): changing the number of elements in a sparse matrix is currently not supported" ); if( (n_rows == in_rows) && (n_cols == in_cols) ) { return; } if(vec_state == 1) { arma_debug_check( (in_cols != 1), "SpMat::reshape(): object is a column vector; requested size is not compatible" ); } if(vec_state == 2) { arma_debug_check( (in_rows != 1), "SpMat::reshape(): object is a row vector; requested size is not compatible" ); } if(n_nonzero == 0) { (*this).zeros(in_rows, in_cols); return; } if(in_cols == 1) { (*this).reshape_helper_intovec(); } else { (*this).reshape_helper_generic(in_rows, in_cols); } } template inline void SpMat::reshape(const SizeMat& s) { arma_extra_debug_sigprint(); (*this).reshape(s.n_rows, s.n_cols); } template inline void SpMat::reshape_helper_generic(const uword in_rows, const uword in_cols) { arma_extra_debug_sigprint(); sync_csc(); invalidate_cache(); // We have to modify all of the relevant row indices and the relevant column pointers. // Iterate over all the points to do this. We won't be deleting any points, but we will be modifying // columns and rows. We'll have to store a new set of column vectors. uword* new_col_ptrs = memory::acquire(in_cols + 2); new_col_ptrs[in_cols + 1] = std::numeric_limits::max(); uword* new_row_indices = memory::acquire(n_nonzero + 1); access::rw(new_row_indices[n_nonzero]) = 0; arrayops::fill_zeros(new_col_ptrs, in_cols + 1); const_iterator it = begin(); const_iterator it_end = end(); for(; it != it_end; ++it) { uword vector_position = (it.col() * n_rows) + it.row(); new_row_indices[it.pos()] = vector_position % in_rows; ++new_col_ptrs[vector_position / in_rows + 1]; } // Now sum the column counts to get the new column pointers. for(uword i = 1; i <= in_cols; i++) { access::rw(new_col_ptrs[i]) += new_col_ptrs[i - 1]; } // Copy the new row indices. if(row_indices) { memory::release(access::rw(row_indices)); } if(col_ptrs) { memory::release(access::rw(col_ptrs)); } access::rw(row_indices) = new_row_indices; access::rw(col_ptrs) = new_col_ptrs; // Now set the size. access::rw(n_rows) = in_rows; access::rw(n_cols) = in_cols; } template inline void SpMat::reshape_helper_intovec() { arma_extra_debug_sigprint(); sync_csc(); invalidate_cache(); const_iterator it = begin(); const uword t_n_rows = n_rows; const uword t_n_nonzero = n_nonzero; for(uword i=0; i < t_n_nonzero; ++i) { const uword t_index = (it.col() * t_n_rows) + it.row(); // ensure the iterator is pointing to the next element // before we overwrite the row index of the current element ++it; access::rw(row_indices[i]) = t_index; } access::rw(row_indices[n_nonzero]) = 0; access::rw(col_ptrs[0]) = 0; access::rw(col_ptrs[1]) = n_nonzero; access::rw(col_ptrs[2]) = std::numeric_limits::max(); access::rw(n_rows) = (n_rows * n_cols); access::rw(n_cols) = 1; } //! apply a functor to each non-zero element template template inline const SpMat& SpMat::for_each(functor F) { arma_extra_debug_sigprint(); sync_csc(); const uword N = (*this).n_nonzero; eT* rw_values = access::rwp(values); bool modified = false; bool has_zero = false; for(uword i=0; i < N; ++i) { eT& new_value = rw_values[i]; const eT old_value = new_value; F(new_value); if(new_value != old_value) { modified = true; } if(new_value == eT(0) ) { has_zero = true; } } if(modified) { invalidate_cache(); } if(has_zero) { remove_zeros(); } return *this; } template template inline const SpMat& SpMat::for_each(functor F) const { arma_extra_debug_sigprint(); sync_csc(); const uword N = (*this).n_nonzero; for(uword i=0; i < N; ++i) { F(values[i]); } return *this; } //! transform each non-zero element using a functor template template inline const SpMat& SpMat::transform(functor F) { arma_extra_debug_sigprint(); sync_csc(); invalidate_cache(); const uword N = (*this).n_nonzero; eT* rw_values = access::rwp(values); bool has_zero = false; for(uword i=0; i < N; ++i) { eT& rw_values_i = rw_values[i]; rw_values_i = eT( F(rw_values_i) ); if(rw_values_i == eT(0)) { has_zero = true; } } if(has_zero) { remove_zeros(); } return *this; } template inline const SpMat& SpMat::replace(const eT old_val, const eT new_val) { arma_extra_debug_sigprint(); if(old_val == eT(0)) { arma_debug_warn_level(1, "SpMat::replace(): replacement not done, as old_val = 0"); } else { sync_csc(); invalidate_cache(); arrayops::replace(access::rwp(values), n_nonzero, old_val, new_val); if(new_val == eT(0)) { remove_zeros(); } } return *this; } template inline const SpMat& SpMat::clean(const typename get_pod_type::result threshold) { arma_extra_debug_sigprint(); if(n_nonzero == 0) { return *this; } sync_csc(); invalidate_cache(); arrayops::clean(access::rwp(values), n_nonzero, threshold); remove_zeros(); return *this; } template inline const SpMat& SpMat::clamp(const eT min_val, const eT max_val) { arma_extra_debug_sigprint(); if(is_cx::no) { arma_debug_check( (access::tmp_real(min_val) > access::tmp_real(max_val)), "SpMat::clamp(): min_val must be less than max_val" ); } else { arma_debug_check( (access::tmp_real(min_val) > access::tmp_real(max_val)), "SpMat::clamp(): real(min_val) must be less than real(max_val)" ); arma_debug_check( (access::tmp_imag(min_val) > access::tmp_imag(max_val)), "SpMat::clamp(): imag(min_val) must be less than imag(max_val)" ); } if(n_nonzero == 0) { return *this; } sync_csc(); invalidate_cache(); arrayops::clamp(access::rwp(values), n_nonzero, min_val, max_val); if( (min_val == eT(0)) || (max_val == eT(0)) ) { remove_zeros(); } return *this; } template inline const SpMat& SpMat::zeros() { arma_extra_debug_sigprint(); const bool already_done = ( (sync_state != 1) && (n_nonzero == 0) ); if(already_done == false) { init(n_rows, n_cols); } return *this; } template inline const SpMat& SpMat::zeros(const uword in_elem) { arma_extra_debug_sigprint(); if(vec_state == 2) { zeros(1, in_elem); // Row vector } else { zeros(in_elem, 1); } return *this; } template inline const SpMat& SpMat::zeros(const uword in_rows, const uword in_cols) { arma_extra_debug_sigprint(); const bool already_done = ( (sync_state != 1) && (n_nonzero == 0) && (n_rows == in_rows) && (n_cols == in_cols) ); if(already_done == false) { init(in_rows, in_cols); } return *this; } template inline const SpMat& SpMat::zeros(const SizeMat& s) { arma_extra_debug_sigprint(); return (*this).zeros(s.n_rows, s.n_cols); } template inline const SpMat& SpMat::eye() { arma_extra_debug_sigprint(); return (*this).eye(n_rows, n_cols); } template inline const SpMat& SpMat::eye(const uword in_rows, const uword in_cols) { arma_extra_debug_sigprint(); const uword N = (std::min)(in_rows, in_cols); init(in_rows, in_cols, N); arrayops::inplace_set(access::rwp(values), eT(1), N); for(uword i = 0; i < N; ++i) { access::rw(row_indices[i]) = i; } for(uword i = 0; i <= N; ++i) { access::rw(col_ptrs[i]) = i; } // take into account non-square matrices for(uword i = (N+1); i <= in_cols; ++i) { access::rw(col_ptrs[i]) = N; } access::rw(n_nonzero) = N; return *this; } template inline const SpMat& SpMat::eye(const SizeMat& s) { arma_extra_debug_sigprint(); return (*this).eye(s.n_rows, s.n_cols); } template inline const SpMat& SpMat::speye() { arma_extra_debug_sigprint(); return (*this).eye(n_rows, n_cols); } template inline const SpMat& SpMat::speye(const uword in_n_rows, const uword in_n_cols) { arma_extra_debug_sigprint(); return (*this).eye(in_n_rows, in_n_cols); } template inline const SpMat& SpMat::speye(const SizeMat& s) { arma_extra_debug_sigprint(); return (*this).eye(s.n_rows, s.n_cols); } template inline const SpMat& SpMat::sprandu(const uword in_rows, const uword in_cols, const double density) { arma_extra_debug_sigprint(); arma_debug_check( ( (density < double(0)) || (density > double(1)) ), "sprandu(): density must be in the [0,1] interval" ); const uword new_n_nonzero = uword(density * double(in_rows) * double(in_cols) + 0.5); init(in_rows, in_cols, new_n_nonzero); if(new_n_nonzero == 0) { return *this; } arma_rng::randu::fill( access::rwp(values), new_n_nonzero ); uvec indices = linspace( 0u, in_rows*in_cols-1, new_n_nonzero ); // perturb the indices for(uword i=1; i < new_n_nonzero-1; ++i) { const uword index_left = indices[i-1]; const uword index_right = indices[i+1]; const uword center = (index_left + index_right) / 2; const uword delta1 = center - index_left - 1; const uword delta2 = index_right - center - 1; const uword min_delta = (std::min)(delta1, delta2); uword index_new = uword( double(center) + double(min_delta) * (2.0*randu()-1.0) ); // paranoia, but better be safe than sorry if( (index_left < index_new) && (index_new < index_right) ) { indices[i] = index_new; } } uword cur_index = 0; uword count = 0; for(uword lcol = 0; lcol < in_cols; ++lcol) for(uword lrow = 0; lrow < in_rows; ++lrow) { if(count == indices[cur_index]) { access::rw(row_indices[cur_index]) = lrow; access::rw(col_ptrs[lcol + 1])++; ++cur_index; } ++count; } if(cur_index != new_n_nonzero) { // Fix size to correct size. mem_resize(cur_index); } // Sum column pointers. for(uword lcol = 1; lcol <= in_cols; ++lcol) { access::rw(col_ptrs[lcol]) += col_ptrs[lcol - 1]; } return *this; } template inline const SpMat& SpMat::sprandu(const SizeMat& s, const double density) { arma_extra_debug_sigprint(); return (*this).sprandu(s.n_rows, s.n_cols, density); } template inline const SpMat& SpMat::sprandn(const uword in_rows, const uword in_cols, const double density) { arma_extra_debug_sigprint(); arma_debug_check( ( (density < double(0)) || (density > double(1)) ), "sprandn(): density must be in the [0,1] interval" ); const uword new_n_nonzero = uword(density * double(in_rows) * double(in_cols) + 0.5); init(in_rows, in_cols, new_n_nonzero); if(new_n_nonzero == 0) { return *this; } arma_rng::randn::fill( access::rwp(values), new_n_nonzero ); uvec indices = linspace( 0u, in_rows*in_cols-1, new_n_nonzero ); // perturb the indices for(uword i=1; i < new_n_nonzero-1; ++i) { const uword index_left = indices[i-1]; const uword index_right = indices[i+1]; const uword center = (index_left + index_right) / 2; const uword delta1 = center - index_left - 1; const uword delta2 = index_right - center - 1; const uword min_delta = (std::min)(delta1, delta2); uword index_new = uword( double(center) + double(min_delta) * (2.0*randu()-1.0) ); // paranoia, but better be safe than sorry if( (index_left < index_new) && (index_new < index_right) ) { indices[i] = index_new; } } uword cur_index = 0; uword count = 0; for(uword lcol = 0; lcol < in_cols; ++lcol) for(uword lrow = 0; lrow < in_rows; ++lrow) { if(count == indices[cur_index]) { access::rw(row_indices[cur_index]) = lrow; access::rw(col_ptrs[lcol + 1])++; ++cur_index; } ++count; } if(cur_index != new_n_nonzero) { // Fix size to correct size. mem_resize(cur_index); } // Sum column pointers. for(uword lcol = 1; lcol <= in_cols; ++lcol) { access::rw(col_ptrs[lcol]) += col_ptrs[lcol - 1]; } return *this; } template inline const SpMat& SpMat::sprandn(const SizeMat& s, const double density) { arma_extra_debug_sigprint(); return (*this).sprandn(s.n_rows, s.n_cols, density); } template inline void SpMat::reset() { arma_extra_debug_sigprint(); switch(vec_state) { default: init(0, 0); break; case 1: init(0, 1); break; case 2: init(1, 0); break; } } template inline void SpMat::reset_cache() { arma_extra_debug_sigprint(); sync_csc(); #if defined(ARMA_USE_OPENMP) { #pragma omp critical (arma_SpMat_cache) { cache.reset(); sync_state = 0; } } #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) { cache_mutex.lock(); cache.reset(); sync_state = 0; cache_mutex.unlock(); } #else { cache.reset(); sync_state = 0; } #endif } template inline void SpMat::reserve(const uword in_rows, const uword in_cols, const uword new_n_nonzero) { arma_extra_debug_sigprint(); init(in_rows, in_cols, new_n_nonzero); } template template inline void SpMat::set_real(const SpBase::pod_type,T1>& X) { arma_extra_debug_sigprint(); SpMat_aux::set_real(*this, X); } template template inline void SpMat::set_imag(const SpBase::pod_type,T1>& X) { arma_extra_debug_sigprint(); SpMat_aux::set_imag(*this, X); } //! save the matrix to a file template inline arma_cold bool SpMat::save(const std::string name, const file_type type) const { arma_extra_debug_sigprint(); sync_csc(); bool save_okay; switch(type) { case csv_ascii: return (*this).save(csv_name(name), type); break; case ssv_ascii: return (*this).save(csv_name(name), type); break; case arma_binary: save_okay = diskio::save_arma_binary(*this, name); break; case coord_ascii: save_okay = diskio::save_coord_ascii(*this, name); break; default: arma_debug_warn_level(1, "SpMat::save(): unsupported file type"); save_okay = false; } if(save_okay == false) { arma_debug_warn_level(3, "SpMat::save(): couldn't write; file: ", name); } return save_okay; } template inline arma_cold bool SpMat::save(const csv_name& spec, const file_type type) const { arma_extra_debug_sigprint(); if( (type != csv_ascii) && (type != ssv_ascii) ) { arma_stop_runtime_error("SpMat::save(): unsupported file type for csv_name()"); return false; } const bool do_trans = bool(spec.opts.flags & csv_opts::flag_trans ); const bool no_header = bool(spec.opts.flags & csv_opts::flag_no_header ); bool with_header = bool(spec.opts.flags & csv_opts::flag_with_header); const bool use_semicolon = bool(spec.opts.flags & csv_opts::flag_semicolon ) || (type == ssv_ascii); arma_extra_debug_print("SpMat::save(csv_name): enabled flags:"); if(do_trans ) { arma_extra_debug_print("trans"); } if(no_header ) { arma_extra_debug_print("no_header"); } if(with_header ) { arma_extra_debug_print("with_header"); } if(use_semicolon) { arma_extra_debug_print("semicolon"); } const char separator = (use_semicolon) ? char(';') : char(','); if(no_header) { with_header = false; } if(with_header) { if( (spec.header_ro.n_cols != 1) && (spec.header_ro.n_rows != 1) ) { arma_debug_warn_level(1, "SpMat::save(): given header must have a vector layout"); return false; } for(uword i=0; i < spec.header_ro.n_elem; ++i) { const std::string& token = spec.header_ro.at(i); if(token.find(separator) != std::string::npos) { arma_debug_warn_level(1, "SpMat::save(): token within the header contains the separator character: '", token, "'"); return false; } } const uword save_n_cols = (do_trans) ? (*this).n_rows : (*this).n_cols; if(spec.header_ro.n_elem != save_n_cols) { arma_debug_warn_level(1, "SpMat::save(): size mistmach between header and matrix"); return false; } } bool save_okay = false; if(do_trans) { const SpMat tmp = (*this).st(); save_okay = diskio::save_csv_ascii(tmp, spec.filename, spec.header_ro, with_header, separator); } else { save_okay = diskio::save_csv_ascii(*this, spec.filename, spec.header_ro, with_header, separator); } if(save_okay == false) { arma_debug_warn_level(3, "SpMat::save(): couldn't write; file: ", spec.filename); } return save_okay; } //! save the matrix to a stream template inline arma_cold bool SpMat::save(std::ostream& os, const file_type type) const { arma_extra_debug_sigprint(); sync_csc(); bool save_okay; switch(type) { case csv_ascii: save_okay = diskio::save_csv_ascii(*this, os, char(',')); break; case ssv_ascii: save_okay = diskio::save_csv_ascii(*this, os, char(';')); break; case arma_binary: save_okay = diskio::save_arma_binary(*this, os); break; case coord_ascii: save_okay = diskio::save_coord_ascii(*this, os); break; default: arma_debug_warn_level(1, "SpMat::save(): unsupported file type"); save_okay = false; } if(save_okay == false) { arma_debug_warn_level(3, "SpMat::save(): couldn't write to stream"); } return save_okay; } //! load a matrix from a file template inline arma_cold bool SpMat::load(const std::string name, const file_type type) { arma_extra_debug_sigprint(); invalidate_cache(); bool load_okay; std::string err_msg; switch(type) { // case auto_detect: // load_okay = diskio::load_auto_detect(*this, name, err_msg); // break; case csv_ascii: return (*this).load(csv_name(name), type); break; case ssv_ascii: return (*this).load(csv_name(name), type); break; case arma_binary: load_okay = diskio::load_arma_binary(*this, name, err_msg); break; case coord_ascii: load_okay = diskio::load_coord_ascii(*this, name, err_msg); break; default: arma_debug_warn_level(1, "SpMat::load(): unsupported file type"); load_okay = false; } if(load_okay == false) { if(err_msg.length() > 0) { arma_debug_warn_level(3, "SpMat::load(): ", err_msg, "; file: ", name); } else { arma_debug_warn_level(3, "SpMat::load(): couldn't read; file: ", name); } } if(load_okay == false) { (*this).reset(); } return load_okay; } template inline arma_cold bool SpMat::load(const csv_name& spec, const file_type type) { arma_extra_debug_sigprint(); if( (type != csv_ascii) && (type != ssv_ascii) ) { arma_stop_runtime_error("SpMat::load(): unsupported file type for csv_name()"); return false; } const bool do_trans = bool(spec.opts.flags & csv_opts::flag_trans ); const bool no_header = bool(spec.opts.flags & csv_opts::flag_no_header ); bool with_header = bool(spec.opts.flags & csv_opts::flag_with_header); const bool use_semicolon = bool(spec.opts.flags & csv_opts::flag_semicolon ) || (type == ssv_ascii); arma_extra_debug_print("SpMat::load(csv_name): enabled flags:"); if(do_trans ) { arma_extra_debug_print("trans"); } if(no_header ) { arma_extra_debug_print("no_header"); } if(with_header ) { arma_extra_debug_print("with_header"); } if(use_semicolon) { arma_extra_debug_print("semicolon"); } const char separator = (use_semicolon) ? char(';') : char(','); if(no_header) { with_header = false; } bool load_okay = false; std::string err_msg; if(do_trans) { SpMat tmp_mat; load_okay = diskio::load_csv_ascii(tmp_mat, spec.filename, err_msg, spec.header_rw, with_header, separator); if(load_okay) { (*this) = tmp_mat.st(); if(with_header) { // field::set_size() preserves data if the number of elements hasn't changed spec.header_rw.set_size(spec.header_rw.n_elem, 1); } } } else { load_okay = diskio::load_csv_ascii(*this, spec.filename, err_msg, spec.header_rw, with_header, separator); } if(load_okay == false) { if(err_msg.length() > 0) { arma_debug_warn_level(3, "SpMat::load(): ", err_msg, "; file: ", spec.filename); } else { arma_debug_warn_level(3, "SpMat::load(): couldn't read; file: ", spec.filename); } } else { const uword load_n_cols = (do_trans) ? (*this).n_rows : (*this).n_cols; if(with_header && (spec.header_rw.n_elem != load_n_cols)) { arma_debug_warn_level(3, "SpMat::load(): size mistmach between header and matrix"); } } if(load_okay == false) { (*this).reset(); if(with_header) { spec.header_rw.reset(); } } return load_okay; } //! load a matrix from a stream template inline arma_cold bool SpMat::load(std::istream& is, const file_type type) { arma_extra_debug_sigprint(); invalidate_cache(); bool load_okay; std::string err_msg; switch(type) { // case auto_detect: // load_okay = diskio::load_auto_detect(*this, is, err_msg); // break; case csv_ascii: load_okay = diskio::load_csv_ascii(*this, is, err_msg, char(',')); break; case ssv_ascii: load_okay = diskio::load_csv_ascii(*this, is, err_msg, char(';')); break; case arma_binary: load_okay = diskio::load_arma_binary(*this, is, err_msg); break; case coord_ascii: load_okay = diskio::load_coord_ascii(*this, is, err_msg); break; default: arma_debug_warn_level(1, "SpMat::load(): unsupported file type"); load_okay = false; } if(load_okay == false) { if(err_msg.length() > 0) { arma_debug_warn_level(3, "SpMat::load(): ", err_msg); } else { arma_debug_warn_level(3, "SpMat::load(): couldn't load from stream"); } } if(load_okay == false) { (*this).reset(); } return load_okay; } //! save the matrix to a file, without printing any error messages template inline arma_cold bool SpMat::quiet_save(const std::string name, const file_type type) const { arma_extra_debug_sigprint(); return (*this).save(name, type); } //! save the matrix to a stream, without printing any error messages template inline arma_cold bool SpMat::quiet_save(std::ostream& os, const file_type type) const { arma_extra_debug_sigprint(); return (*this).save(os, type); } //! load a matrix from a file, without printing any error messages template inline arma_cold bool SpMat::quiet_load(const std::string name, const file_type type) { arma_extra_debug_sigprint(); return (*this).load(name, type); } //! load a matrix from a stream, without printing any error messages template inline arma_cold bool SpMat::quiet_load(std::istream& is, const file_type type) { arma_extra_debug_sigprint(); return (*this).load(is, type); } /** * Initialize the matrix to the specified size. Data is not preserved, so the matrix is assumed to be entirely sparse (empty). */ template inline void SpMat::init(uword in_rows, uword in_cols, const uword new_n_nonzero) { arma_extra_debug_sigprint(); invalidate_cache(); // placed here, as init() is used during matrix modification // Clean out the existing memory. if(values ) { memory::release(access::rw(values)); } if(row_indices) { memory::release(access::rw(row_indices)); } if(col_ptrs ) { memory::release(access::rw(col_ptrs)); } // in case init_cold() throws an exception access::rw(n_rows) = 0; access::rw(n_cols) = 0; access::rw(n_elem) = 0; access::rw(n_nonzero) = 0; access::rw(values) = nullptr; access::rw(row_indices) = nullptr; access::rw(col_ptrs) = nullptr; init_cold(in_rows, in_cols, new_n_nonzero); } template inline void arma_cold SpMat::init_cold(uword in_rows, uword in_cols, const uword new_n_nonzero) { arma_extra_debug_sigprint(); // Verify that we are allowed to do this. if(vec_state > 0) { if((in_rows == 0) && (in_cols == 0)) { if(vec_state == 1) { in_cols = 1; } if(vec_state == 2) { in_rows = 1; } } else { if(vec_state == 1) { arma_debug_check( (in_cols != 1), "SpMat::init(): object is a column vector; requested size is not compatible" ); } if(vec_state == 2) { arma_debug_check( (in_rows != 1), "SpMat::init(): object is a row vector; requested size is not compatible" ); } } } #if defined(ARMA_64BIT_WORD) const char* error_message = "SpMat::init(): requested size is too large"; #else const char* error_message = "SpMat::init(): requested size is too large; suggest to enable ARMA_64BIT_WORD"; #endif // Ensure that n_elem can hold the result of (n_rows * n_cols) arma_debug_check ( ( ( (in_rows > ARMA_MAX_UHWORD) || (in_cols > ARMA_MAX_UHWORD) ) ? ( (double(in_rows) * double(in_cols)) > double(ARMA_MAX_UWORD) ) : false ), error_message ); access::rw(col_ptrs) = memory::acquire(in_cols + 2); access::rw(values) = memory::acquire (new_n_nonzero + 1); access::rw(row_indices) = memory::acquire(new_n_nonzero + 1); // fill column pointers with 0, // except for the last element which contains the maximum possible element // (so iterators terminate correctly). arrayops::fill_zeros(access::rwp(col_ptrs), in_cols + 1); access::rw(col_ptrs[in_cols + 1]) = std::numeric_limits::max(); access::rw( values[new_n_nonzero]) = 0; access::rw(row_indices[new_n_nonzero]) = 0; // Set the new size accordingly. access::rw(n_rows) = in_rows; access::rw(n_cols) = in_cols; access::rw(n_elem) = (in_rows * in_cols); access::rw(n_nonzero) = new_n_nonzero; } template inline void SpMat::init(const std::string& text) { arma_extra_debug_sigprint(); Mat tmp(text); if(vec_state == 1) { if((tmp.n_elem > 0) && tmp.is_vec()) { access::rw(tmp.n_rows) = tmp.n_elem; access::rw(tmp.n_cols) = 1; } } if(vec_state == 2) { if((tmp.n_elem > 0) && tmp.is_vec()) { access::rw(tmp.n_rows) = 1; access::rw(tmp.n_cols) = tmp.n_elem; } } (*this).operator=(tmp); } template inline void SpMat::init(const SpMat& x) { arma_extra_debug_sigprint(); if(this == &x) { return; } bool init_done = false; #if defined(ARMA_USE_OPENMP) if(x.sync_state == 1) { #pragma omp critical (arma_SpMat_init) if(x.sync_state == 1) { (*this).init(x.cache); init_done = true; } } #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) if(x.sync_state == 1) { x.cache_mutex.lock(); if(x.sync_state == 1) { (*this).init(x.cache); init_done = true; } x.cache_mutex.unlock(); } #else if(x.sync_state == 1) { (*this).init(x.cache); init_done = true; } #endif if(init_done == false) { (*this).init_simple(x); } } template inline void SpMat::init(const MapMat& x) { arma_extra_debug_sigprint(); const uword x_n_rows = x.n_rows; const uword x_n_cols = x.n_cols; const uword x_n_nz = x.get_n_nonzero(); init(x_n_rows, x_n_cols, x_n_nz); if(x_n_nz == 0) { return; } typename MapMat::map_type& x_map_ref = *(x.map_ptr); typename MapMat::map_type::const_iterator x_it = x_map_ref.begin(); uword x_col = 0; uword x_col_index_start = 0; uword x_col_index_endp1 = x_n_rows; for(uword i=0; i < x_n_nz; ++i) { const std::pair& x_entry = (*x_it); const uword x_index = x_entry.first; const eT x_val = x_entry.second; // have we gone past the curent column? if(x_index >= x_col_index_endp1) { x_col = x_index / x_n_rows; x_col_index_start = x_col * x_n_rows; x_col_index_endp1 = x_col_index_start + x_n_rows; } const uword x_row = x_index - x_col_index_start; // // sanity check // // const uword tmp_x_row = x_index % x_n_rows; // const uword tmp_x_col = x_index / x_n_rows; // // if(x_row != tmp_x_row) { cout << "x_row != tmp_x_row" << endl; exit(-1); } // if(x_col != tmp_x_col) { cout << "x_col != tmp_x_col" << endl; exit(-1); } access::rw(values[i]) = x_val; access::rw(row_indices[i]) = x_row; access::rw(col_ptrs[ x_col + 1 ])++; ++x_it; } for(uword i = 0; i < x_n_cols; ++i) { access::rw(col_ptrs[i + 1]) += col_ptrs[i]; } // // OLD METHOD // // for(uword i=0; i < x_n_nz; ++i) // { // const std::pair& x_entry = (*x_it); // // const uword x_index = x_entry.first; // const eT x_val = x_entry.second; // // const uword x_row = x_index % x_n_rows; // const uword x_col = x_index / x_n_rows; // // access::rw(values[i]) = x_val; // access::rw(row_indices[i]) = x_row; // // access::rw(col_ptrs[ x_col + 1 ])++; // // ++x_it; // } // // // for(uword i = 0; i < x_n_cols; ++i) // { // access::rw(col_ptrs[i + 1]) += col_ptrs[i]; // } } template inline void SpMat::init_simple(const SpMat& x) { arma_extra_debug_sigprint(); if(this == &x) { return; } init(x.n_rows, x.n_cols, x.n_nonzero); if(x.values ) { arrayops::copy(access::rwp(values), x.values, x.n_nonzero + 1); } if(x.row_indices) { arrayops::copy(access::rwp(row_indices), x.row_indices, x.n_nonzero + 1); } if(x.col_ptrs ) { arrayops::copy(access::rwp(col_ptrs), x.col_ptrs, x.n_cols + 1); } } template inline void SpMat::init_batch_std(const Mat& locs, const Mat& vals, const bool sort_locations) { arma_extra_debug_sigprint(); // Resize to correct number of elements. mem_resize(vals.n_elem); // Reset column pointers to zero. arrayops::fill_zeros(access::rwp(col_ptrs), n_cols + 1); bool actually_sorted = true; if(sort_locations) { // check if we really need a time consuming sort const uword locs_n_cols = locs.n_cols; for(uword i = 1; i < locs_n_cols; ++i) { const uword* locs_i = locs.colptr(i ); const uword* locs_im1 = locs.colptr(i-1); const uword row_i = locs_i[0]; const uword col_i = locs_i[1]; const uword row_im1 = locs_im1[0]; const uword col_im1 = locs_im1[1]; if( (col_i < col_im1) || ((col_i == col_im1) && (row_i <= row_im1)) ) { actually_sorted = false; break; } } if(actually_sorted == false) { // see op_sort_index_bones.hpp for the definition of arma_sort_index_packet and arma_sort_index_helper_ascend std::vector< arma_sort_index_packet > packet_vec(locs_n_cols); const uword* locs_mem = locs.memptr(); for(uword i = 0; i < locs_n_cols; ++i) { const uword row = (*locs_mem); locs_mem++; const uword col = (*locs_mem); locs_mem++; packet_vec[i].val = (col * n_rows) + row; packet_vec[i].index = i; } arma_sort_index_helper_ascend comparator; std::sort( packet_vec.begin(), packet_vec.end(), comparator ); // insert the elements in the sorted order for(uword i = 0; i < locs_n_cols; ++i) { const uword index = packet_vec[i].index; const uword* locs_i = locs.colptr(index); const uword row_i = locs_i[0]; const uword col_i = locs_i[1]; arma_debug_check( ( (row_i >= n_rows) || (col_i >= n_cols) ), "SpMat::SpMat(): invalid row or column index" ); if(i > 0) { const uword prev_index = packet_vec[i-1].index; const uword* locs_im1 = locs.colptr(prev_index); const uword row_im1 = locs_im1[0]; const uword col_im1 = locs_im1[1]; arma_debug_check( ( (row_i == row_im1) && (col_i == col_im1) ), "SpMat::SpMat(): detected identical locations" ); } access::rw(values[i]) = vals[index]; access::rw(row_indices[i]) = row_i; access::rw(col_ptrs[ col_i + 1 ])++; } } } if( (sort_locations == false) || (actually_sorted == true) ) { // Now set the values and row indices correctly. // Increment the column pointers in each column (so they are column "counts"). const uword locs_n_cols = locs.n_cols; for(uword i=0; i < locs_n_cols; ++i) { const uword* locs_i = locs.colptr(i); const uword row_i = locs_i[0]; const uword col_i = locs_i[1]; arma_debug_check( ( (row_i >= n_rows) || (col_i >= n_cols) ), "SpMat::SpMat(): invalid row or column index" ); if(i > 0) { const uword* locs_im1 = locs.colptr(i-1); const uword row_im1 = locs_im1[0]; const uword col_im1 = locs_im1[1]; arma_debug_check ( ( (col_i < col_im1) || ((col_i == col_im1) && (row_i < row_im1)) ), "SpMat::SpMat(): out of order points; either pass sort_locations = true, or sort points in column-major ordering" ); arma_debug_check( ( (col_i == col_im1) && (row_i == row_im1) ), "SpMat::SpMat(): detected identical locations" ); } access::rw(values[i]) = vals[i]; access::rw(row_indices[i]) = row_i; access::rw(col_ptrs[ col_i + 1 ])++; } } // Now fix the column pointers. for(uword i = 0; i < n_cols; ++i) { access::rw(col_ptrs[i + 1]) += col_ptrs[i]; } } template inline void SpMat::init_batch_add(const Mat& locs, const Mat& vals, const bool sort_locations) { arma_extra_debug_sigprint(); if(locs.n_cols < 2) { init_batch_std(locs, vals, false); return; } // Reset column pointers to zero. arrayops::fill_zeros(access::rwp(col_ptrs), n_cols + 1); bool actually_sorted = true; if(sort_locations) { // sort_index() uses std::sort() which may use quicksort... so we better // make sure it's not already sorted before taking an O(N^2) sort penalty. for(uword i = 1; i < locs.n_cols; ++i) { const uword* locs_i = locs.colptr(i ); const uword* locs_im1 = locs.colptr(i-1); if( (locs_i[1] < locs_im1[1]) || (locs_i[1] == locs_im1[1] && locs_i[0] <= locs_im1[0]) ) { actually_sorted = false; break; } } if(actually_sorted == false) { // This may not be the fastest possible implementation but it maximizes code reuse. Col abslocs(locs.n_cols, arma_nozeros_indicator()); for(uword i = 0; i < locs.n_cols; ++i) { const uword* locs_i = locs.colptr(i); abslocs[i] = locs_i[1] * n_rows + locs_i[0]; } uvec sorted_indices = sort_index(abslocs); // Ascending sort. // work out the number of unique elments uword n_unique = 1; // first element is unique for(uword i=1; i < sorted_indices.n_elem; ++i) { const uword* locs_i = locs.colptr( sorted_indices[i ] ); const uword* locs_im1 = locs.colptr( sorted_indices[i-1] ); if( (locs_i[1] != locs_im1[1]) || (locs_i[0] != locs_im1[0]) ) { ++n_unique; } } // resize to correct number of elements mem_resize(n_unique); // Now we add the elements in this sorted order. uword count = 0; // first element { const uword i = 0; const uword* locs_i = locs.colptr( sorted_indices[i] ); arma_debug_check( ( (locs_i[0] >= n_rows) || (locs_i[1] >= n_cols) ), "SpMat::SpMat(): invalid row or column index" ); access::rw(values[count]) = vals[ sorted_indices[i] ]; access::rw(row_indices[count]) = locs_i[0]; access::rw(col_ptrs[ locs_i[1] + 1 ])++; } for(uword i=1; i < sorted_indices.n_elem; ++i) { const uword* locs_i = locs.colptr( sorted_indices[i ] ); const uword* locs_im1 = locs.colptr( sorted_indices[i-1] ); arma_debug_check( ( (locs_i[0] >= n_rows) || (locs_i[1] >= n_cols) ), "SpMat::SpMat(): invalid row or column index" ); if( (locs_i[1] == locs_im1[1]) && (locs_i[0] == locs_im1[0]) ) { access::rw(values[count]) += vals[ sorted_indices[i] ]; } else { count++; access::rw(values[count]) = vals[ sorted_indices[i] ]; access::rw(row_indices[count]) = locs_i[0]; access::rw(col_ptrs[ locs_i[1] + 1 ])++; } } } } if( (sort_locations == false) || (actually_sorted == true) ) { // work out the number of unique elments uword n_unique = 1; // first element is unique for(uword i=1; i < locs.n_cols; ++i) { const uword* locs_i = locs.colptr(i ); const uword* locs_im1 = locs.colptr(i-1); if( (locs_i[1] != locs_im1[1]) || (locs_i[0] != locs_im1[0]) ) { ++n_unique; } } // resize to correct number of elements mem_resize(n_unique); // Now set the values and row indices correctly. // Increment the column pointers in each column (so they are column "counts"). uword count = 0; // first element { const uword i = 0; const uword* locs_i = locs.colptr(i); arma_debug_check( ( (locs_i[0] >= n_rows) || (locs_i[1] >= n_cols) ), "SpMat::SpMat(): invalid row or column index" ); access::rw(values[count]) = vals[i]; access::rw(row_indices[count]) = locs_i[0]; access::rw(col_ptrs[ locs_i[1] + 1 ])++; } for(uword i=1; i < locs.n_cols; ++i) { const uword* locs_i = locs.colptr(i ); const uword* locs_im1 = locs.colptr(i-1); arma_debug_check( ( (locs_i[0] >= n_rows) || (locs_i[1] >= n_cols) ), "SpMat::SpMat(): invalid row or column index" ); arma_debug_check ( ( (locs_i[1] < locs_im1[1]) || (locs_i[1] == locs_im1[1] && locs_i[0] < locs_im1[0]) ), "SpMat::SpMat(): out of order points; either pass sort_locations = true, or sort points in column-major ordering" ); if( (locs_i[1] == locs_im1[1]) && (locs_i[0] == locs_im1[0]) ) { access::rw(values[count]) += vals[i]; } else { count++; access::rw(values[count]) = vals[i]; access::rw(row_indices[count]) = locs_i[0]; access::rw(col_ptrs[ locs_i[1] + 1 ])++; } } } // Now fix the column pointers. for(uword i = 0; i < n_cols; ++i) { access::rw(col_ptrs[i + 1]) += col_ptrs[i]; } } //! constructor used by SpRow and SpCol classes template inline SpMat::SpMat(const arma_vec_indicator&, const uword in_vec_state) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(in_vec_state) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); const uword in_n_rows = (in_vec_state == 2) ? 1 : 0; const uword in_n_cols = (in_vec_state == 1) ? 1 : 0; init_cold(in_n_rows, in_n_cols); } //! constructor used by SpRow and SpCol classes template inline SpMat::SpMat(const arma_vec_indicator&, const uword in_n_rows, const uword in_n_cols, const uword in_vec_state) : n_rows(0) , n_cols(0) , n_elem(0) , n_nonzero(0) , vec_state(in_vec_state) , values(nullptr) , row_indices(nullptr) , col_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(in_n_rows, in_n_cols); } template inline void SpMat::mem_resize(const uword new_n_nonzero) { arma_extra_debug_sigprint(); invalidate_cache(); // placed here, as mem_resize() is used during matrix modification if(n_nonzero == new_n_nonzero) { return; } eT* new_values = memory::acquire (new_n_nonzero + 1); uword* new_row_indices = memory::acquire(new_n_nonzero + 1); if( (n_nonzero > 0 ) && (new_n_nonzero > 0) ) { // Copy old elements. uword copy_len = (std::min)(n_nonzero, new_n_nonzero); arrayops::copy(new_values, values, copy_len); arrayops::copy(new_row_indices, row_indices, copy_len); } if(values) { memory::release(access::rw(values)); } if(row_indices) { memory::release(access::rw(row_indices)); } access::rw(values) = new_values; access::rw(row_indices) = new_row_indices; // Set the "fake end" of the matrix by setting the last value and row index to 0. // This helps the iterators work correctly. access::rw( values[new_n_nonzero]) = 0; access::rw(row_indices[new_n_nonzero]) = 0; access::rw(n_nonzero) = new_n_nonzero; } template inline void SpMat::sync() const { arma_extra_debug_sigprint(); sync_csc(); } template inline void SpMat::remove_zeros() { arma_extra_debug_sigprint(); sync_csc(); invalidate_cache(); // placed here, as remove_zeros() is used during matrix modification const uword old_n_nonzero = n_nonzero; uword new_n_nonzero = 0; const eT* old_values = values; for(uword i=0; i < old_n_nonzero; ++i) { new_n_nonzero += (old_values[i] != eT(0)) ? uword(1) : uword(0); } if(new_n_nonzero != old_n_nonzero) { if(new_n_nonzero == 0) { init(n_rows, n_cols); return; } SpMat tmp(arma_reserve_indicator(), n_rows, n_cols, new_n_nonzero); uword new_index = 0; const_iterator it = begin(); const_iterator it_end = end(); for(; it != it_end; ++it) { const eT val = eT(*it); if(val != eT(0)) { access::rw(tmp.values[new_index]) = val; access::rw(tmp.row_indices[new_index]) = it.row(); access::rw(tmp.col_ptrs[it.col() + 1])++; ++new_index; } } for(uword i=0; i < n_cols; ++i) { access::rw(tmp.col_ptrs[i + 1]) += tmp.col_ptrs[i]; } steal_mem(tmp); } } // Steal memory from another matrix. template inline void SpMat::steal_mem(SpMat& x) { arma_extra_debug_sigprint(); if(this == &x) { return; } bool layout_ok = false; if((*this).vec_state == x.vec_state) { layout_ok = true; } else { if( ((*this).vec_state == 1) && (x.n_cols == 1) ) { layout_ok = true; } if( ((*this).vec_state == 2) && (x.n_rows == 1) ) { layout_ok = true; } } if(layout_ok) { x.sync_csc(); steal_mem_simple(x); x.invalidate_cache(); invalidate_cache(); } else { (*this).operator=(x); } } template inline void SpMat::steal_mem_simple(SpMat& x) { arma_extra_debug_sigprint(); if(this == &x) { return; } if(values ) { memory::release(access::rw(values)); } if(row_indices) { memory::release(access::rw(row_indices)); } if(col_ptrs ) { memory::release(access::rw(col_ptrs)); } access::rw(n_rows) = x.n_rows; access::rw(n_cols) = x.n_cols; access::rw(n_elem) = x.n_elem; access::rw(n_nonzero) = x.n_nonzero; access::rw(values) = x.values; access::rw(row_indices) = x.row_indices; access::rw(col_ptrs) = x.col_ptrs; // Set other matrix to empty. access::rw(x.n_rows) = 0; access::rw(x.n_cols) = 0; access::rw(x.n_elem) = 0; access::rw(x.n_nonzero) = 0; access::rw(x.values) = nullptr; access::rw(x.row_indices) = nullptr; access::rw(x.col_ptrs) = nullptr; } template template inline void SpMat::init_xform(const SpBase& A, const Functor& func) { arma_extra_debug_sigprint(); // if possible, avoid doing a copy and instead apply func to the generated elements if(SpProxy::Q_is_generated) { (*this) = A.get_ref(); const uword nnz = n_nonzero; eT* t_values = access::rwp(values); bool has_zero = false; for(uword i=0; i < nnz; ++i) { eT& t_values_i = t_values[i]; t_values_i = func(t_values_i); if(t_values_i == eT(0)) { has_zero = true; } } if(has_zero) { remove_zeros(); } } else { init_xform_mt(A.get_ref(), func); } } template template inline void SpMat::init_xform_mt(const SpBase& A, const Functor& func) { arma_extra_debug_sigprint(); const SpProxy P(A.get_ref()); if( P.is_alias(*this) || (is_SpMat::stored_type>::value) ) { // NOTE: unwrap_spmat will convert a submatrix to a matrix, which in effect takes care of aliasing with submatrices; // NOTE: however, when more delayed ops are implemented, more elaborate handling of aliasing will be necessary const unwrap_spmat::stored_type> tmp(P.Q); const SpMat& x = tmp.M; if(void_ptr(this) != void_ptr(&x)) { init(x.n_rows, x.n_cols, x.n_nonzero); arrayops::copy(access::rwp(row_indices), x.row_indices, x.n_nonzero + 1); arrayops::copy(access::rwp(col_ptrs), x.col_ptrs, x.n_cols + 1); } // initialise the elements array with a transformed version of the elements from x const uword nnz = n_nonzero; const eT2* x_values = x.values; eT* t_values = access::rwp(values); bool has_zero = false; for(uword i=0; i < nnz; ++i) { eT& t_values_i = t_values[i]; t_values_i = func(x_values[i]); // NOTE: func() must produce a value of type eT (ie. act as a convertor between eT2 and eT) if(t_values_i == eT(0)) { has_zero = true; } } if(has_zero) { remove_zeros(); } } else { init(P.get_n_rows(), P.get_n_cols(), P.get_n_nonzero()); typename SpProxy::const_iterator_type it = P.begin(); typename SpProxy::const_iterator_type it_end = P.end(); bool has_zero = false; while(it != it_end) { const eT val = func(*it); // NOTE: func() must produce a value of type eT (ie. act as a convertor between eT2 and eT) if(val == eT(0)) { has_zero = true; } const uword it_pos = it.pos(); access::rw(row_indices[it_pos]) = it.row(); access::rw(values[it_pos]) = val; ++access::rw(col_ptrs[it.col() + 1]); ++it; } // Now sum column pointers. for(uword c = 1; c <= n_cols; ++c) { access::rw(col_ptrs[c]) += col_ptrs[c - 1]; } if(has_zero) { remove_zeros(); } } } template arma_inline bool SpMat::is_alias(const SpMat& X) const { return (&X == this); } template inline typename SpMat::iterator SpMat::begin() { arma_extra_debug_sigprint(); sync_csc(); return iterator(*this); } template inline typename SpMat::const_iterator SpMat::begin() const { arma_extra_debug_sigprint(); sync_csc(); return const_iterator(*this); } template inline typename SpMat::const_iterator SpMat::cbegin() const { arma_extra_debug_sigprint(); sync_csc(); return const_iterator(*this); } template inline typename SpMat::iterator SpMat::end() { sync_csc(); return iterator(*this, 0, n_cols, n_nonzero); } template inline typename SpMat::const_iterator SpMat::end() const { sync_csc(); return const_iterator(*this, 0, n_cols, n_nonzero); } template inline typename SpMat::const_iterator SpMat::cend() const { sync_csc(); return const_iterator(*this, 0, n_cols, n_nonzero); } template inline typename SpMat::col_iterator SpMat::begin_col(const uword col_num) { sync_csc(); return col_iterator(*this, 0, col_num); } template inline typename SpMat::const_col_iterator SpMat::begin_col(const uword col_num) const { sync_csc(); return const_col_iterator(*this, 0, col_num); } template inline typename SpMat::col_iterator SpMat::begin_col_no_sync(const uword col_num) { return col_iterator(*this, 0, col_num); } template inline typename SpMat::const_col_iterator SpMat::begin_col_no_sync(const uword col_num) const { return const_col_iterator(*this, 0, col_num); } template inline typename SpMat::col_iterator SpMat::end_col(const uword col_num) { sync_csc(); return col_iterator(*this, 0, col_num + 1); } template inline typename SpMat::const_col_iterator SpMat::end_col(const uword col_num) const { sync_csc(); return const_col_iterator(*this, 0, col_num + 1); } template inline typename SpMat::col_iterator SpMat::end_col_no_sync(const uword col_num) { return col_iterator(*this, 0, col_num + 1); } template inline typename SpMat::const_col_iterator SpMat::end_col_no_sync(const uword col_num) const { return const_col_iterator(*this, 0, col_num + 1); } template inline typename SpMat::row_iterator SpMat::begin_row(const uword row_num) { sync_csc(); return row_iterator(*this, row_num, 0); } template inline typename SpMat::const_row_iterator SpMat::begin_row(const uword row_num) const { sync_csc(); return const_row_iterator(*this, row_num, 0); } template inline typename SpMat::row_iterator SpMat::end_row() { sync_csc(); return row_iterator(*this, n_nonzero); } template inline typename SpMat::const_row_iterator SpMat::end_row() const { sync_csc(); return const_row_iterator(*this, n_nonzero); } template inline typename SpMat::row_iterator SpMat::end_row(const uword row_num) { sync_csc(); return row_iterator(*this, row_num + 1, 0); } template inline typename SpMat::const_row_iterator SpMat::end_row(const uword row_num) const { sync_csc(); return const_row_iterator(*this, row_num + 1, 0); } template inline typename SpMat::row_col_iterator SpMat::begin_row_col() { sync_csc(); return begin(); } template inline typename SpMat::const_row_col_iterator SpMat::begin_row_col() const { sync_csc(); return begin(); } template inline typename SpMat::row_col_iterator SpMat::end_row_col() { sync_csc(); return end(); } template inline typename SpMat::const_row_col_iterator SpMat::end_row_col() const { sync_csc(); return end(); } template inline void SpMat::clear() { (*this).reset(); } template inline bool SpMat::empty() const { return (n_elem == 0); } template inline uword SpMat::size() const { return n_elem; } template arma_inline arma_warn_unused SpMat_MapMat_val SpMat::front() { arma_debug_check( (n_elem == 0), "SpMat::front(): matrix is empty" ); return SpMat_MapMat_val((*this), cache, 0, 0); } template arma_inline arma_warn_unused eT SpMat::front() const { arma_debug_check( (n_elem == 0), "SpMat::front(): matrix is empty" ); return get_value(0,0); } template arma_inline arma_warn_unused SpMat_MapMat_val SpMat::back() { arma_debug_check( (n_elem == 0), "SpMat::back(): matrix is empty" ); return SpMat_MapMat_val((*this), cache, n_rows-1, n_cols-1); } template arma_inline arma_warn_unused eT SpMat::back() const { arma_debug_check( (n_elem == 0), "SpMat::back(): matrix is empty" ); return get_value(n_rows-1, n_cols-1); } template inline arma_hot arma_warn_unused eT SpMat::get_value(const uword i) const { const MapMat& const_cache = cache; // declare as const for clarity of intent // get the element from the cache if it has more recent data than CSC return (sync_state == 1) ? const_cache.operator[](i) : get_value_csc(i); } template inline arma_hot arma_warn_unused eT SpMat::get_value(const uword in_row, const uword in_col) const { const MapMat& const_cache = cache; // declare as const for clarity of intent // get the element from the cache if it has more recent data than CSC return (sync_state == 1) ? const_cache.at(in_row, in_col) : get_value_csc(in_row, in_col); } template inline arma_hot arma_warn_unused eT SpMat::get_value_csc(const uword i) const { // First convert to the actual location. uword lcol = i / n_rows; // Integer division. uword lrow = i % n_rows; return get_value_csc(lrow, lcol); } template inline arma_hot arma_warn_unused const eT* SpMat::find_value_csc(const uword in_row, const uword in_col) const { const uword col_offset = col_ptrs[in_col ]; const uword next_col_offset = col_ptrs[in_col + 1]; const uword* start_ptr = &row_indices[ col_offset]; const uword* end_ptr = &row_indices[next_col_offset]; const uword* pos_ptr = std::lower_bound(start_ptr, end_ptr, in_row); // binary search if( (pos_ptr != end_ptr) && ((*pos_ptr) == in_row) ) { const uword offset = uword(pos_ptr - start_ptr); const uword index = offset + col_offset; return &(values[index]); } return nullptr; } template inline arma_hot arma_warn_unused eT SpMat::get_value_csc(const uword in_row, const uword in_col) const { const eT* val_ptr = find_value_csc(in_row, in_col); return (val_ptr != nullptr) ? eT(*val_ptr) : eT(0); } template inline arma_hot arma_warn_unused bool SpMat::try_set_value_csc(const uword in_row, const uword in_col, const eT in_val) { const eT* val_ptr = find_value_csc(in_row, in_col); // element not found, ie. it's zero; fail if trying to set it to non-zero value if(val_ptr == nullptr) { return (in_val == eT(0)); } // fail if trying to erase an existing element if(in_val == eT(0)) { return false; } access::rw(*val_ptr) = in_val; invalidate_cache(); return true; } template inline arma_hot arma_warn_unused bool SpMat::try_add_value_csc(const uword in_row, const uword in_col, const eT in_val) { const eT* val_ptr = find_value_csc(in_row, in_col); // element not found, ie. it's zero; fail if trying to add a non-zero value if(val_ptr == nullptr) { return (in_val == eT(0)); } const eT new_val = eT(*val_ptr) + in_val; // fail if trying to erase an existing element if(new_val == eT(0)) { return false; } access::rw(*val_ptr) = new_val; invalidate_cache(); return true; } template inline arma_hot arma_warn_unused bool SpMat::try_sub_value_csc(const uword in_row, const uword in_col, const eT in_val) { const eT* val_ptr = find_value_csc(in_row, in_col); // element not found, ie. it's zero; fail if trying to subtract a non-zero value if(val_ptr == nullptr) { return (in_val == eT(0)); } const eT new_val = eT(*val_ptr) - in_val; // fail if trying to erase an existing element if(new_val == eT(0)) { return false; } access::rw(*val_ptr) = new_val; invalidate_cache(); return true; } template inline arma_hot arma_warn_unused bool SpMat::try_mul_value_csc(const uword in_row, const uword in_col, const eT in_val) { const eT* val_ptr = find_value_csc(in_row, in_col); // element not found, ie. it's zero; succeed if given value is finite; zero multiplied by anything is zero, except for nan and inf if(val_ptr == nullptr) { return arma_isfinite(in_val); } const eT new_val = eT(*val_ptr) * in_val; // fail if trying to erase an existing element if(new_val == eT(0)) { return false; } access::rw(*val_ptr) = new_val; invalidate_cache(); return true; } template inline arma_hot arma_warn_unused bool SpMat::try_div_value_csc(const uword in_row, const uword in_col, const eT in_val) { const eT* val_ptr = find_value_csc(in_row, in_col); // element not found, ie. it's zero; succeed if given value is not zero and not nan; zero divided by anything is zero, except for zero and nan if(val_ptr == nullptr) { return ((in_val != eT(0)) && (arma_isnan(in_val) == false)); } const eT new_val = eT(*val_ptr) / in_val; // fail if trying to erase an existing element if(new_val == eT(0)) { return false; } access::rw(*val_ptr) = new_val; invalidate_cache(); return true; } /** * Insert an element at the given position, and return a reference to it. * The element will be set to 0, unless otherwise specified. * If the element already exists, its value will be overwritten. */ template inline arma_warn_unused eT& SpMat::insert_element(const uword in_row, const uword in_col, const eT val) { arma_extra_debug_sigprint(); sync_csc(); invalidate_cache(); // We will assume the new element does not exist and begin the search for // where to insert it. If we find that it already exists, we will then // overwrite it. uword colptr = col_ptrs[in_col ]; uword next_colptr = col_ptrs[in_col + 1]; uword pos = colptr; // The position in the matrix of this value. if(colptr != next_colptr) { // There are other elements in this column, so we must find where this // element will fit as compared to those. while(pos < next_colptr && in_row > row_indices[pos]) { pos++; } // We aren't inserting into the last position, so it is still possible // that the element may exist. if(pos != next_colptr && row_indices[pos] == in_row) { // It already exists. Then, just overwrite it. access::rw(values[pos]) = val; return access::rw(values[pos]); } } // // Element doesn't exist, so we have to insert it // // We have to update the rest of the column pointers. for(uword i = in_col + 1; i < n_cols + 1; i++) { access::rw(col_ptrs[i])++; // We are only inserting one new element. } const uword old_n_nonzero = n_nonzero; access::rw(n_nonzero)++; // Add to count of nonzero elements. // Allocate larger memory. eT* new_values = memory::acquire (n_nonzero + 1); uword* new_row_indices = memory::acquire(n_nonzero + 1); // Copy things over, before the new element. if(pos > 0) { arrayops::copy(new_values, values, pos); arrayops::copy(new_row_indices, row_indices, pos); } // Insert the new element. new_values[pos] = val; new_row_indices[pos] = in_row; // Copy the rest of things over (including the extra element at the end). arrayops::copy(new_values + pos + 1, values + pos, (old_n_nonzero - pos) + 1); arrayops::copy(new_row_indices + pos + 1, row_indices + pos, (old_n_nonzero - pos) + 1); // Assign new pointers. if(values) { memory::release(access::rw(values)); } if(row_indices) { memory::release(access::rw(row_indices)); } access::rw(values) = new_values; access::rw(row_indices) = new_row_indices; return access::rw(values[pos]); } /** * Delete an element at the given position. */ template inline void SpMat::delete_element(const uword in_row, const uword in_col) { arma_extra_debug_sigprint(); sync_csc(); invalidate_cache(); // We assume the element exists (although... it may not) and look for its // exact position. If it doesn't exist... well, we don't need to do anything. uword colptr = col_ptrs[in_col]; uword next_colptr = col_ptrs[in_col + 1]; if(colptr != next_colptr) { // There's at least one element in this column. // Let's see if we are one of them. for(uword pos = colptr; pos < next_colptr; pos++) { if(in_row == row_indices[pos]) { --access::rw(n_nonzero); // Remove one from the count of nonzero elements. // Found it. Now remove it. // Make new arrays. eT* new_values = memory::acquire (n_nonzero + 1); uword* new_row_indices = memory::acquire(n_nonzero + 1); if(pos > 0) { arrayops::copy(new_values, values, pos); arrayops::copy(new_row_indices, row_indices, pos); } arrayops::copy(new_values + pos, values + pos + 1, (n_nonzero - pos) + 1); arrayops::copy(new_row_indices + pos, row_indices + pos + 1, (n_nonzero - pos) + 1); if(values) { memory::release(access::rw(values)); } if(row_indices) { memory::release(access::rw(row_indices)); } access::rw(values) = new_values; access::rw(row_indices) = new_row_indices; // And lastly, update all the column pointers (decrement by one). for(uword i = in_col + 1; i < n_cols + 1; i++) { --access::rw(col_ptrs[i]); // We only removed one element. } return; // There is nothing left to do. } } } return; // The element does not exist, so there's nothing for us to do. } template arma_inline void SpMat::invalidate_cache() const { arma_extra_debug_sigprint(); if(sync_state == 0) { return; } cache.reset(); sync_state = 0; } template arma_inline void SpMat::invalidate_csc() const { arma_extra_debug_sigprint(); sync_state = 1; } template inline void SpMat::sync_cache() const { arma_extra_debug_sigprint(); // using approach adapted from http://preshing.com/20130930/double-checked-locking-is-fixed-in-cpp11/ // // OpenMP mode: // sync_state uses atomic read/write, which has an implied flush; // flush is also implicitly executed at the entrance and the exit of critical section; // data races are prevented by the 'critical' directive // // C++11 mode: // underlying type for sync_state is std::atomic; // reading and writing to sync_state uses std::memory_order_seq_cst which has an implied fence; // data races are prevented via the mutex #if defined(ARMA_USE_OPENMP) { if(sync_state == 0) { #pragma omp critical (arma_SpMat_cache) { sync_cache_simple(); } } } #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) { if(sync_state == 0) { cache_mutex.lock(); sync_cache_simple(); cache_mutex.unlock(); } } #else { sync_cache_simple(); } #endif } template inline void SpMat::sync_cache_simple() const { arma_extra_debug_sigprint(); if(sync_state == 0) { cache = (*this); sync_state = 2; } } template inline void SpMat::sync_csc() const { arma_extra_debug_sigprint(); #if defined(ARMA_USE_OPENMP) if(sync_state == 1) { #pragma omp critical (arma_SpMat_cache) { sync_csc_simple(); } } #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) if(sync_state == 1) { cache_mutex.lock(); sync_csc_simple(); cache_mutex.unlock(); } #else { sync_csc_simple(); } #endif } template inline void SpMat::sync_csc_simple() const { arma_extra_debug_sigprint(); // method: // 1. construct temporary matrix to prevent the cache from getting zapped // 2. steal memory from the temporary matrix // sync_state is only set to 1 by non-const element access operators, // so the shenanigans with const_cast are to satisfy the compiler // see also the note in sync_cache() above if(sync_state == 1) { SpMat& x = const_cast< SpMat& >(*this); SpMat tmp(cache); x.steal_mem_simple(tmp); sync_state = 2; } } // // SpMat_aux template inline void SpMat_aux::set_real(SpMat& out, const SpBase& X) { arma_extra_debug_sigprint(); const unwrap_spmat tmp(X.get_ref()); const SpMat& A = tmp.M; arma_debug_assert_same_size( out, A, "SpMat::set_real()" ); out = A; } template inline void SpMat_aux::set_imag(SpMat&, const SpBase&) { arma_extra_debug_sigprint(); } template inline void SpMat_aux::set_real(SpMat< std::complex >& out, const SpBase& X) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const unwrap_spmat U(X.get_ref()); const SpMat& Y = U.M; arma_debug_assert_same_size(out, Y, "SpMat::set_real()"); SpMat tmp(Y,arma::imag(out)); // arma:: prefix required due to bugs in GCC 4.4 - 4.6 out.steal_mem(tmp); } template inline void SpMat_aux::set_imag(SpMat< std::complex >& out, const SpBase& X) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const unwrap_spmat U(X.get_ref()); const SpMat& Y = U.M; arma_debug_assert_same_size(out, Y, "SpMat::set_imag()"); SpMat tmp(arma::real(out),Y); // arma:: prefix required due to bugs in GCC 4.4 - 4.6 out.steal_mem(tmp); } #ifdef ARMA_EXTRA_SPMAT_MEAT #include ARMA_INCFILE_WRAP(ARMA_EXTRA_SPMAT_MEAT) #endif //! @} RcppArmadillo/inst/include/armadillo_bits/op_norm_bones.hpp0000644000176200001440000000542314124060717023746 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_norm //! @{ class op_norm : public traits_op_default { public: template arma_hot inline static typename T1::pod_type vec_norm_1(const Proxy& P, const typename arma_not_cx::result* junk = nullptr); template arma_hot inline static typename T1::pod_type vec_norm_1(const Proxy& P, const typename arma_cx_only::result* junk = nullptr); template arma_hot inline static eT vec_norm_1_direct_std(const Mat& X); template arma_hot inline static eT vec_norm_1_direct_mem(const uword N, const eT* A); template arma_hot inline static typename T1::pod_type vec_norm_2(const Proxy& P, const typename arma_not_cx::result* junk = nullptr); template arma_hot inline static typename T1::pod_type vec_norm_2(const Proxy& P, const typename arma_cx_only::result* junk = nullptr); template arma_hot inline static eT vec_norm_2_direct_std(const Mat& X); template arma_hot inline static eT vec_norm_2_direct_mem(const uword N, const eT* A); template arma_hot inline static eT vec_norm_2_direct_robust(const Mat& X); template arma_hot inline static typename T1::pod_type vec_norm_k(const Proxy& P, const int k); template arma_hot inline static typename T1::pod_type vec_norm_max(const Proxy& P); template arma_hot inline static typename T1::pod_type vec_norm_min(const Proxy& P); template inline static typename get_pod_type::result mat_norm_1(const Mat& X); template inline static typename get_pod_type::result mat_norm_2(const Mat& X); template inline static typename get_pod_type::result mat_norm_inf(const Mat& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/eGlue_meat.hpp0000644000176200001440000000736514124060717023165 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup eGlue //! @{ template arma_inline eGlue::~eGlue() { arma_extra_debug_sigprint(); } template arma_inline eGlue::eGlue(const T1& in_A, const T2& in_B) : P1(in_A) , P2(in_B) { arma_extra_debug_sigprint(); // arma_debug_assert_same_size( P1, P2, eglue_type::text() ); arma_debug_assert_same_size ( P1.get_n_rows(), P1.get_n_cols(), P2.get_n_rows(), P2.get_n_cols(), eglue_type::text() ); } template arma_inline uword eGlue::get_n_rows() const { return is_row ? 1 : P1.get_n_rows(); } template arma_inline uword eGlue::get_n_cols() const { return is_col ? 1 : P1.get_n_cols(); } template arma_inline uword eGlue::get_n_elem() const { return P1.get_n_elem(); } template arma_inline typename T1::elem_type eGlue::operator[] (const uword ii) const { // the optimiser will keep only one return statement typedef typename T1::elem_type eT; if(is_same_type::yes) { return P1[ii] + P2[ii]; } else if(is_same_type::yes) { return P1[ii] - P2[ii]; } else if(is_same_type::yes) { return P1[ii] / P2[ii]; } else if(is_same_type::yes) { return P1[ii] * P2[ii]; } else return eT(0); } template arma_inline typename T1::elem_type eGlue::at(const uword row, const uword col) const { // the optimiser will keep only one return statement typedef typename T1::elem_type eT; if(is_same_type::yes) { return P1.at(row,col) + P2.at(row,col); } else if(is_same_type::yes) { return P1.at(row,col) - P2.at(row,col); } else if(is_same_type::yes) { return P1.at(row,col) / P2.at(row,col); } else if(is_same_type::yes) { return P1.at(row,col) * P2.at(row,col); } else return eT(0); } template arma_inline typename T1::elem_type eGlue::at_alt(const uword ii) const { // the optimiser will keep only one return statement typedef typename T1::elem_type eT; if(is_same_type::yes) { return P1.at_alt(ii) + P2.at_alt(ii); } else if(is_same_type::yes) { return P1.at_alt(ii) - P2.at_alt(ii); } else if(is_same_type::yes) { return P1.at_alt(ii) / P2.at_alt(ii); } else if(is_same_type::yes) { return P1.at_alt(ii) * P2.at_alt(ii); } else return eT(0); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_inplace_trans.hpp0000644000176200001440000000467614124060717024425 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_inplace_trans //! @{ template inline typename enable_if2 < is_cx::no, void >::result inplace_htrans ( Mat& X, const char* method = "std" ) { arma_extra_debug_sigprint(); inplace_strans(X, method); } template inline typename enable_if2 < is_cx::yes, void >::result inplace_htrans ( Mat& X, const char* method = "std" ) { arma_extra_debug_sigprint(); const char sig = (method != nullptr) ? method[0] : char(0); arma_debug_check( ((sig != 's') && (sig != 'l')), "inplace_htrans(): unknown method specified" ); const bool low_memory = (sig == 'l'); if( (low_memory == false) || (X.n_rows == X.n_cols) ) { op_htrans::apply_mat_inplace(X); } else { inplace_strans(X, method); X = conj(X); } } template inline typename enable_if2 < is_cx::no, void >::result inplace_trans ( Mat& X, const char* method = "std" ) { arma_extra_debug_sigprint(); const char sig = (method != nullptr) ? method[0] : char(0); arma_debug_check( ((sig != 's') && (sig != 'l')), "inplace_trans(): unknown method specified" ); inplace_strans(X, method); } template inline typename enable_if2 < is_cx::yes, void >::result inplace_trans ( Mat& X, const char* method = "std" ) { arma_extra_debug_sigprint(); const char sig = (method != nullptr) ? method[0] : char(0); arma_debug_check( ((sig != 's') && (sig != 'l')), "inplace_trans(): unknown method specified" ); inplace_htrans(X, method); } //! @} RcppArmadillo/inst/include/armadillo_bits/spglue_schur_bones.hpp0000644000176200001440000000376214124060717025004 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_schur //! @{ class spglue_schur : public traits_glue_or { public: template arma_hot inline static void apply(SpMat& out, const SpGlue& X); template arma_hot inline static void apply_noalias(SpMat& out, const SpProxy& pa, const SpProxy& pb); template arma_hot inline static void apply_noalias(SpMat& out, const SpMat& A, const SpMat& B); }; class spglue_schur_misc : public traits_glue_or { public: template inline static void dense_schur_sparse(SpMat& out, const T1& x, const T2& y); }; class spglue_schur_mixed : public traits_glue_or { public: template inline static void apply(SpMat::eT>& out, const mtSpGlue::eT, T1, T2, spglue_schur_mixed>& expr); template inline static void dense_schur_sparse(SpMat< typename promote_type::result>& out, const T1& X, const T2& Y); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_trans.hpp0000644000176200001440000000375014124060717022722 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_trans //! @{ template arma_warn_unused arma_inline const Op trans ( const T1& X, const typename enable_if< is_arma_type::value >::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); return Op(X); } template arma_warn_unused arma_inline const Op htrans ( const T1& X, const typename enable_if< is_arma_type::value >::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); return Op(X); } // // handling of sparse matrices template arma_warn_unused arma_inline const SpOp trans ( const T1& X, const typename enable_if< is_arma_sparse_type::value >::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); return SpOp(X); } template arma_warn_unused arma_inline const SpOp htrans ( const T1& X, const typename enable_if< is_arma_sparse_type::value >::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); return SpOp(X); } //! @} RcppArmadillo/inst/include/armadillo_bits/spglue_min_meat.hpp0000644000176200001440000001246314124060717024261 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_min //! @{ template inline void spglue_min::apply(SpMat& out, const SpGlue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const SpProxy pa(X.A); const SpProxy pb(X.B); const bool is_alias = pa.is_alias(out) || pb.is_alias(out); if(is_alias == false) { spglue_min::apply_noalias(out, pa, pb); } else { SpMat tmp; spglue_min::apply_noalias(tmp, pa, pb); out.steal_mem(tmp); } } template inline void spglue_min::apply_noalias(SpMat& out, const SpProxy& pa, const SpProxy& pb) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(pa.get_n_rows(), pa.get_n_cols(), pb.get_n_rows(), pb.get_n_cols(), "element-wise minimum"); const uword max_n_nonzero = pa.get_n_nonzero() + pb.get_n_nonzero(); // Resize memory to upper bound out.reserve(pa.get_n_rows(), pa.get_n_cols(), max_n_nonzero); // Now iterate across both matrices. typename SpProxy::const_iterator_type x_it = pa.begin(); typename SpProxy::const_iterator_type x_end = pa.end(); typename SpProxy::const_iterator_type y_it = pb.begin(); typename SpProxy::const_iterator_type y_end = pb.end(); uword count = 0; while( (x_it != x_end) || (y_it != y_end) ) { eT out_val; const uword x_it_col = x_it.col(); const uword x_it_row = x_it.row(); const uword y_it_col = y_it.col(); const uword y_it_row = y_it.row(); bool use_y_loc = false; if(x_it == y_it) { out_val = elem_min(eT(*x_it), eT(*y_it)); ++x_it; ++y_it; } else { if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end { out_val = elem_min(eT(*x_it), eT(0)); ++x_it; } else { out_val = elem_min(eT(*y_it), eT(0)); ++y_it; use_y_loc = true; } } if(out_val != eT(0)) { access::rw(out.values[count]) = out_val; const uword out_row = (use_y_loc == false) ? x_it_row : y_it_row; const uword out_col = (use_y_loc == false) ? x_it_col : y_it_col; access::rw(out.row_indices[count]) = out_row; access::rw(out.col_ptrs[out_col + 1])++; ++count; } arma_check( (count > max_n_nonzero), "internal error: spglue_min::apply_noalias(): count > max_n_nonzero" ); } const uword out_n_cols = out.n_cols; uword* col_ptrs = access::rwp(out.col_ptrs); // Fix column pointers to be cumulative. for(uword c = 1; c <= out_n_cols; ++c) { col_ptrs[c] += col_ptrs[c - 1]; } if(count < max_n_nonzero) { if(count <= (max_n_nonzero/2)) { out.mem_resize(count); } else { // quick resize without reallocating memory and copying data access::rw( out.n_nonzero) = count; access::rw( out.values[count]) = eT(0); access::rw(out.row_indices[count]) = uword(0); } } } template inline void spglue_min::apply_noalias(SpMat& out, const SpMat& A, const SpMat& B) { arma_extra_debug_sigprint(); const SpProxy< SpMat > pa(A); const SpProxy< SpMat > pb(B); spglue_min::apply_noalias(out, pa, pb); } template inline void spglue_min::dense_sparse_min(Mat& out, const Base& X, const SpBase& Y) { arma_extra_debug_sigprint(); // NOTE: this function assumes there is no aliasing between matrix 'out' and X const Proxy pa(X.get_ref()); const SpProxy pb(Y.get_ref()); const uword n_rows = pa.get_n_rows(); const uword n_cols = pa.get_n_cols(); arma_debug_assert_same_size( n_rows, n_cols, pb.get_n_rows(), pb.get_n_cols(), "element-wise minimum" ); out.set_size(n_rows, n_cols); for(uword c=0; c < n_cols; ++c) for(uword r=0; r < n_rows; ++r) { out.at(r,c) = elem_min(pa.at(r,c), pb.at(r,c)); } } // min of non-complex elements template inline typename enable_if2::no, eT>::result spglue_min::elem_min(const eT& a, const eT& b) { return (std::min)(a, b); } // min of complex elements template inline typename enable_if2::yes, eT>::result spglue_min::elem_min(const eT& a, const eT& b) { return (std::abs(a) < std::abs(b)) ? a : b; } //! @} RcppArmadillo/inst/include/armadillo_bits/podarray_bones.hpp0000644000176200001440000000460514124060717024117 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup podarray //! @{ struct podarray_prealloc_n_elem { static constexpr uword val = 16; }; //! A lightweight array for POD types. For internal use only! template class podarray { public: arma_aligned const uword n_elem; //!< number of elements held arma_aligned eT* mem; //!< pointer to memory used by the object protected: //! internal memory, to avoid calling the 'new' operator for small amounts of memory. arma_align_mem eT mem_local[ podarray_prealloc_n_elem::val ]; public: inline ~podarray(); inline podarray(); inline podarray (const podarray& x); inline const podarray& operator=(const podarray& x); arma_inline explicit podarray(const uword new_N); arma_inline explicit podarray(const eT* X, const uword new_N); // template // inline explicit podarray(const Proxy& P); arma_inline eT& operator[] (const uword i); arma_inline eT operator[] (const uword i) const; arma_inline eT& operator() (const uword i); arma_inline eT operator() (const uword i) const; inline void set_min_size(const uword min_n_elem); inline void set_size(const uword new_n_elem); inline void reset(); inline void fill(const eT val); inline void zeros(); inline void zeros(const uword new_n_elem); arma_inline eT* memptr(); arma_inline const eT* memptr() const; inline void copy_row(const Mat& A, const uword row); protected: inline void init_cold(const uword new_n_elem); inline void init_warm(const uword new_n_elem); }; //! @} RcppArmadillo/inst/include/armadillo_bits/eOp_bones.hpp0000644000176200001440000000475114124060717023023 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup eOp //! @{ template class eOp : public Base< typename T1::elem_type, eOp > { public: typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Proxy proxy_type; static constexpr bool use_at = Proxy::use_at; static constexpr bool use_mp = Proxy::use_mp || eop_type::use_mp; static constexpr bool has_subview = Proxy::has_subview; static constexpr bool is_row = Proxy::is_row; static constexpr bool is_col = Proxy::is_col; static constexpr bool is_xvec = Proxy::is_xvec; arma_aligned const Proxy P; arma_aligned elem_type aux; //!< storage of auxiliary data, user defined format arma_aligned uword aux_uword_a; //!< storage of auxiliary data, uword format arma_aligned uword aux_uword_b; //!< storage of auxiliary data, uword format inline ~eOp(); inline explicit eOp(const T1& in_m); inline eOp(const T1& in_m, const elem_type in_aux); inline eOp(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b); inline eOp(const T1& in_m, const elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b); arma_inline uword get_n_rows() const; arma_inline uword get_n_cols() const; arma_inline uword get_n_elem() const; arma_inline elem_type operator[] (const uword ii) const; arma_inline elem_type at (const uword row, const uword col) const; arma_inline elem_type at_alt (const uword ii) const; }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_cumprod_bones.hpp0000644000176200001440000000247014124060717024443 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_cumprod //! @{ class op_cumprod : public traits_op_default { public: template inline static void apply_noalias(Mat& out, const Mat& X, const uword dim); template inline static void apply(Mat& out, const Op& in); }; class op_cumprod_vec : public traits_op_passthru { public: template inline static void apply(Mat& out, const Op& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_index_max.hpp0000644000176200001440000000617714124060717023555 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_index_max //! @{ template arma_warn_unused inline typename enable_if2< is_arma_type::value && resolves_to_vector::yes, uword>::result index_max(const T1& X) { arma_extra_debug_sigprint(); return X.index_max(); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value && resolves_to_vector::no, const mtOp >::result index_max(const T1& X) { arma_extra_debug_sigprint(); return mtOp(X, 0, 0); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const mtOp >::result index_max(const T1& X, const uword dim) { arma_extra_debug_sigprint(); return mtOp(X, dim, 0); } template arma_warn_unused arma_inline const mtOpCube index_max ( const BaseCube& X, const uword dim = 0 ) { arma_extra_debug_sigprint(); return mtOpCube(X.get_ref(), dim, 0, 0); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value && resolves_to_sparse_vector::yes, typename T1::elem_type >::result index_max(const T1& x) { arma_extra_debug_sigprint(); return x.index_max(); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value && resolves_to_sparse_vector::no, Mat >::result index_max(const T1& X) { arma_extra_debug_sigprint(); Mat out; op_index_max::apply(out, X, 0); return out; } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value, Mat >::result index_max(const T1& X, const uword dim) { arma_extra_debug_sigprint(); Mat out; op_index_max::apply(out, X, dim); return out; } arma_warn_unused inline uword index_max(const SizeMat& s) { return (s.n_rows >= s.n_cols) ? uword(0) : uword(1); } arma_warn_unused inline uword index_max(const SizeCube& s) { const uword tmp_val = (s.n_rows >= s.n_cols) ? s.n_rows : s.n_cols; const uword tmp_index = (s.n_rows >= s.n_cols) ? uword(0) : uword(1); return (tmp_val >= s.n_slices) ? tmp_index : uword(2); } //! @} RcppArmadillo/inst/include/armadillo_bits/subview_elem1_meat.hpp0000644000176200001440000005554714124060717024700 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup subview_elem1 //! @{ template inline subview_elem1::~subview_elem1() { arma_extra_debug_sigprint(); } template arma_inline subview_elem1::subview_elem1(const Mat& in_m, const Base& in_a) : m(in_m) , a(in_a) { arma_extra_debug_sigprint(); } template arma_inline subview_elem1::subview_elem1(const Cube& in_q, const Base& in_a) : fake_m( const_cast< eT* >(in_q.memptr()), in_q.n_elem, 1, false ) , m( fake_m ) , a( in_a ) { arma_extra_debug_sigprint(); } template template inline void subview_elem1::inplace_op(const eT val) { arma_extra_debug_sigprint(); Mat& m_local = const_cast< Mat& >(m); eT* m_mem = m_local.memptr(); const uword m_n_elem = m_local.n_elem; const unwrap_check_mixed tmp(a.get_ref(), m_local); const umat& aa = tmp.M; arma_debug_check ( ( (aa.is_vec() == false) && (aa.is_empty() == false) ), "Mat::elem(): given object must be a vector" ); const uword* aa_mem = aa.memptr(); const uword aa_n_elem = aa.n_elem; uword iq,jq; for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2) { const uword ii = aa_mem[iq]; const uword jj = aa_mem[jq]; arma_debug_check_bounds( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" ); if(is_same_type::yes) { m_mem[ii] = val; m_mem[jj] = val; } if(is_same_type::yes) { m_mem[ii] += val; m_mem[jj] += val; } if(is_same_type::yes) { m_mem[ii] -= val; m_mem[jj] -= val; } if(is_same_type::yes) { m_mem[ii] *= val; m_mem[jj] *= val; } if(is_same_type::yes) { m_mem[ii] /= val; m_mem[jj] /= val; } } if(iq < aa_n_elem) { const uword ii = aa_mem[iq]; arma_debug_check_bounds( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" ); if(is_same_type::yes) { m_mem[ii] = val; } if(is_same_type::yes) { m_mem[ii] += val; } if(is_same_type::yes) { m_mem[ii] -= val; } if(is_same_type::yes) { m_mem[ii] *= val; } if(is_same_type::yes) { m_mem[ii] /= val; } } } template template inline void subview_elem1::inplace_op(const subview_elem1& x) { arma_extra_debug_sigprint(); subview_elem1& s = *this; if(&(s.m) == &(x.m)) { arma_extra_debug_print("subview_elem1::inplace_op(): aliasing detected"); const Mat tmp(x); if(is_same_type::yes) { s.operator= (tmp); } if(is_same_type::yes) { s.operator+=(tmp); } if(is_same_type::yes) { s.operator-=(tmp); } if(is_same_type::yes) { s.operator%=(tmp); } if(is_same_type::yes) { s.operator/=(tmp); } } else { Mat& s_m_local = const_cast< Mat& >(s.m); const Mat& x_m_local = x.m; const unwrap_check_mixed s_tmp(s.a.get_ref(), s_m_local); const unwrap_check_mixed x_tmp(x.a.get_ref(), s_m_local); const umat& s_aa = s_tmp.M; const umat& x_aa = x_tmp.M; arma_debug_check ( ( ((s_aa.is_vec() == false) && (s_aa.is_empty() == false)) || ((x_aa.is_vec() == false) && (x_aa.is_empty() == false)) ), "Mat::elem(): given object must be a vector" ); const uword* s_aa_mem = s_aa.memptr(); const uword* x_aa_mem = x_aa.memptr(); const uword s_aa_n_elem = s_aa.n_elem; arma_debug_check( (s_aa_n_elem != x_aa.n_elem), "Mat::elem(): size mismatch" ); eT* s_m_mem = s_m_local.memptr(); const uword s_m_n_elem = s_m_local.n_elem; const eT* x_m_mem = x_m_local.memptr(); const uword x_m_n_elem = x_m_local.n_elem; uword iq,jq; for(iq=0, jq=1; jq < s_aa_n_elem; iq+=2, jq+=2) { const uword s_ii = s_aa_mem[iq]; const uword s_jj = s_aa_mem[jq]; const uword x_ii = x_aa_mem[iq]; const uword x_jj = x_aa_mem[jq]; arma_debug_check_bounds ( (s_ii >= s_m_n_elem) || (s_jj >= s_m_n_elem) || (x_ii >= x_m_n_elem) || (x_jj >= x_m_n_elem), "Mat::elem(): index out of bounds" ); if(is_same_type::yes) { s_m_mem[s_ii] = x_m_mem[x_ii]; s_m_mem[s_jj] = x_m_mem[x_jj]; } if(is_same_type::yes) { s_m_mem[s_ii] += x_m_mem[x_ii]; s_m_mem[s_jj] += x_m_mem[x_jj]; } if(is_same_type::yes) { s_m_mem[s_ii] -= x_m_mem[x_ii]; s_m_mem[s_jj] -= x_m_mem[x_jj]; } if(is_same_type::yes) { s_m_mem[s_ii] *= x_m_mem[x_ii]; s_m_mem[s_jj] *= x_m_mem[x_jj]; } if(is_same_type::yes) { s_m_mem[s_ii] /= x_m_mem[x_ii]; s_m_mem[s_jj] /= x_m_mem[x_jj]; } } if(iq < s_aa_n_elem) { const uword s_ii = s_aa_mem[iq]; const uword x_ii = x_aa_mem[iq]; arma_debug_check_bounds ( ( (s_ii >= s_m_n_elem) || (x_ii >= x_m_n_elem) ), "Mat::elem(): index out of bounds" ); if(is_same_type::yes) { s_m_mem[s_ii] = x_m_mem[x_ii]; } if(is_same_type::yes) { s_m_mem[s_ii] += x_m_mem[x_ii]; } if(is_same_type::yes) { s_m_mem[s_ii] -= x_m_mem[x_ii]; } if(is_same_type::yes) { s_m_mem[s_ii] *= x_m_mem[x_ii]; } if(is_same_type::yes) { s_m_mem[s_ii] /= x_m_mem[x_ii]; } } } } template template inline void subview_elem1::inplace_op(const Base& x) { arma_extra_debug_sigprint(); Mat& m_local = const_cast< Mat& >(m); eT* m_mem = m_local.memptr(); const uword m_n_elem = m_local.n_elem; const unwrap_check_mixed aa_tmp(a.get_ref(), m_local); const umat& aa = aa_tmp.M; arma_debug_check ( ( (aa.is_vec() == false) && (aa.is_empty() == false) ), "Mat::elem(): given object must be a vector" ); const uword* aa_mem = aa.memptr(); const uword aa_n_elem = aa.n_elem; const Proxy P(x.get_ref()); arma_debug_check( (aa_n_elem != P.get_n_elem()), "Mat::elem(): size mismatch" ); const bool is_alias = P.is_alias(m); if( (is_alias == false) && (Proxy::use_at == false) ) { typename Proxy::ea_type X = P.get_ea(); uword iq,jq; for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2) { const uword ii = aa_mem[iq]; const uword jj = aa_mem[jq]; arma_debug_check_bounds( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" ); if(is_same_type::yes) { m_mem[ii] = X[iq]; m_mem[jj] = X[jq]; } if(is_same_type::yes) { m_mem[ii] += X[iq]; m_mem[jj] += X[jq]; } if(is_same_type::yes) { m_mem[ii] -= X[iq]; m_mem[jj] -= X[jq]; } if(is_same_type::yes) { m_mem[ii] *= X[iq]; m_mem[jj] *= X[jq]; } if(is_same_type::yes) { m_mem[ii] /= X[iq]; m_mem[jj] /= X[jq]; } } if(iq < aa_n_elem) { const uword ii = aa_mem[iq]; arma_debug_check_bounds( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" ); if(is_same_type::yes) { m_mem[ii] = X[iq]; } if(is_same_type::yes) { m_mem[ii] += X[iq]; } if(is_same_type::yes) { m_mem[ii] -= X[iq]; } if(is_same_type::yes) { m_mem[ii] *= X[iq]; } if(is_same_type::yes) { m_mem[ii] /= X[iq]; } } } else { arma_extra_debug_print("subview_elem1::inplace_op(): aliasing or use_at detected"); const unwrap_check::stored_type> tmp(P.Q, is_alias); const Mat& M = tmp.M; const eT* X = M.memptr(); uword iq,jq; for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2) { const uword ii = aa_mem[iq]; const uword jj = aa_mem[jq]; arma_debug_check_bounds( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" ); if(is_same_type::yes) { m_mem[ii] = X[iq]; m_mem[jj] = X[jq]; } if(is_same_type::yes) { m_mem[ii] += X[iq]; m_mem[jj] += X[jq]; } if(is_same_type::yes) { m_mem[ii] -= X[iq]; m_mem[jj] -= X[jq]; } if(is_same_type::yes) { m_mem[ii] *= X[iq]; m_mem[jj] *= X[jq]; } if(is_same_type::yes) { m_mem[ii] /= X[iq]; m_mem[jj] /= X[jq]; } } if(iq < aa_n_elem) { const uword ii = aa_mem[iq]; arma_debug_check_bounds( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" ); if(is_same_type::yes) { m_mem[ii] = X[iq]; } if(is_same_type::yes) { m_mem[ii] += X[iq]; } if(is_same_type::yes) { m_mem[ii] -= X[iq]; } if(is_same_type::yes) { m_mem[ii] *= X[iq]; } if(is_same_type::yes) { m_mem[ii] /= X[iq]; } } } } // // template arma_inline const Op,op_htrans> subview_elem1::t() const { return Op,op_htrans>(*this); } template arma_inline const Op,op_htrans> subview_elem1::ht() const { return Op,op_htrans>(*this); } template arma_inline const Op,op_strans> subview_elem1::st() const { return Op,op_strans>(*this); } template inline void subview_elem1::replace(const eT old_val, const eT new_val) { arma_extra_debug_sigprint(); Mat& m_local = const_cast< Mat& >(m); eT* m_mem = m_local.memptr(); const uword m_n_elem = m_local.n_elem; const unwrap_check_mixed tmp(a.get_ref(), m_local); const umat& aa = tmp.M; arma_debug_check ( ( (aa.is_vec() == false) && (aa.is_empty() == false) ), "Mat::elem(): given object must be a vector" ); const uword* aa_mem = aa.memptr(); const uword aa_n_elem = aa.n_elem; if(arma_isnan(old_val)) { for(uword iq=0; iq < aa_n_elem; ++iq) { const uword ii = aa_mem[iq]; arma_debug_check_bounds( (ii >= m_n_elem), "Mat::elem(): index out of bounds" ); eT& val = m_mem[ii]; val = (arma_isnan(val)) ? new_val : val; } } else { for(uword iq=0; iq < aa_n_elem; ++iq) { const uword ii = aa_mem[iq]; arma_debug_check_bounds( (ii >= m_n_elem), "Mat::elem(): index out of bounds" ); eT& val = m_mem[ii]; val = (val == old_val) ? new_val : val; } } } template inline void subview_elem1::clean(const pod_type threshold) { arma_extra_debug_sigprint(); Mat tmp(*this); tmp.clean(threshold); (*this).operator=(tmp); } template inline void subview_elem1::clamp(const eT min_val, const eT max_val) { arma_extra_debug_sigprint(); Mat tmp(*this); tmp.clamp(min_val, max_val); (*this).operator=(tmp); } template inline void subview_elem1::fill(const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview_elem1::zeros() { arma_extra_debug_sigprint(); inplace_op(eT(0)); } template inline void subview_elem1::ones() { arma_extra_debug_sigprint(); inplace_op(eT(1)); } template inline void subview_elem1::randu() { arma_extra_debug_sigprint(); Mat& m_local = const_cast< Mat& >(m); eT* m_mem = m_local.memptr(); const uword m_n_elem = m_local.n_elem; const unwrap_check_mixed tmp(a.get_ref(), m_local); const umat& aa = tmp.M; arma_debug_check ( ( (aa.is_vec() == false) && (aa.is_empty() == false) ), "Mat::elem(): given object must be a vector" ); const uword* aa_mem = aa.memptr(); const uword aa_n_elem = aa.n_elem; uword iq,jq; for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2) { const uword ii = aa_mem[iq]; const uword jj = aa_mem[jq]; arma_debug_check_bounds( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" ); const eT val1 = eT(arma_rng::randu()); const eT val2 = eT(arma_rng::randu()); m_mem[ii] = val1; m_mem[jj] = val2; } if(iq < aa_n_elem) { const uword ii = aa_mem[iq]; arma_debug_check_bounds( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" ); m_mem[ii] = eT(arma_rng::randu()); } } template inline void subview_elem1::randn() { arma_extra_debug_sigprint(); Mat& m_local = const_cast< Mat& >(m); eT* m_mem = m_local.memptr(); const uword m_n_elem = m_local.n_elem; const unwrap_check_mixed tmp(a.get_ref(), m_local); const umat& aa = tmp.M; arma_debug_check ( ( (aa.is_vec() == false) && (aa.is_empty() == false) ), "Mat::elem(): given object must be a vector" ); const uword* aa_mem = aa.memptr(); const uword aa_n_elem = aa.n_elem; uword iq,jq; for(iq=0, jq=1; jq < aa_n_elem; iq+=2, jq+=2) { const uword ii = aa_mem[iq]; const uword jj = aa_mem[jq]; arma_debug_check_bounds( ( (ii >= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" ); arma_rng::randn::dual_val( m_mem[ii], m_mem[jj] ); } if(iq < aa_n_elem) { const uword ii = aa_mem[iq]; arma_debug_check_bounds( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" ); m_mem[ii] = eT(arma_rng::randn()); } } template inline void subview_elem1::operator+= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview_elem1::operator-= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview_elem1::operator*= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview_elem1::operator/= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } // // template template inline void subview_elem1::operator_equ(const subview_elem1& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem1::operator= (const subview_elem1& x) { arma_extra_debug_sigprint(); (*this).operator_equ(x); } //! work around compiler bugs template inline void subview_elem1::operator= (const subview_elem1& x) { arma_extra_debug_sigprint(); (*this).operator_equ(x); } template template inline void subview_elem1::operator+= (const subview_elem1& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem1::operator-= (const subview_elem1& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem1::operator%= (const subview_elem1& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem1::operator/= (const subview_elem1& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem1::operator= (const Base& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem1::operator+= (const Base& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem1::operator-= (const Base& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem1::operator%= (const Base& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem1::operator/= (const Base& x) { arma_extra_debug_sigprint(); inplace_op(x); } // // template inline void subview_elem1::extract(Mat& actual_out, const subview_elem1& in) { arma_extra_debug_sigprint(); const unwrap_check_mixed tmp1(in.a.get_ref(), actual_out); const umat& aa = tmp1.M; arma_debug_check ( ( (aa.is_vec() == false) && (aa.is_empty() == false) ), "Mat::elem(): given object must be a vector" ); const uword* aa_mem = aa.memptr(); const uword aa_n_elem = aa.n_elem; const Mat& m_local = in.m; const eT* m_mem = m_local.memptr(); const uword m_n_elem = m_local.n_elem; const bool alias = (&actual_out == &m_local); if(alias) { arma_extra_debug_print("subview_elem1::extract(): aliasing detected"); } Mat* tmp_out = alias ? new Mat() : 0; Mat& out = alias ? *tmp_out : actual_out; out.set_size(aa_n_elem, 1); eT* out_mem = out.memptr(); uword i,j; for(i=0, j=1; j= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" ); out_mem[i] = m_mem[ii]; out_mem[j] = m_mem[jj]; } if(i < aa_n_elem) { const uword ii = aa_mem[i]; arma_debug_check_bounds( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" ); out_mem[i] = m_mem[ii]; } if(alias) { actual_out.steal_mem(out); delete tmp_out; } } template template inline void subview_elem1::mat_inplace_op(Mat& out, const subview_elem1& in) { arma_extra_debug_sigprint(); const unwrap tmp1(in.a.get_ref()); const umat& aa = tmp1.M; arma_debug_check ( ( (aa.is_vec() == false) && (aa.is_empty() == false) ), "Mat::elem(): given object must be a vector" ); const uword* aa_mem = aa.memptr(); const uword aa_n_elem = aa.n_elem; const unwrap_check< Mat > tmp2(in.m, out); const Mat& m_local = tmp2.M; const eT* m_mem = m_local.memptr(); const uword m_n_elem = m_local.n_elem; arma_debug_check( (out.n_elem != aa_n_elem), "Mat::elem(): size mismatch" ); eT* out_mem = out.memptr(); uword i,j; for(i=0, j=1; j= m_n_elem) || (jj >= m_n_elem) ), "Mat::elem(): index out of bounds" ); if(is_same_type::yes) { out_mem[i] += m_mem[ii]; out_mem[j] += m_mem[jj]; } if(is_same_type::yes) { out_mem[i] -= m_mem[ii]; out_mem[j] -= m_mem[jj]; } if(is_same_type::yes) { out_mem[i] *= m_mem[ii]; out_mem[j] *= m_mem[jj]; } if(is_same_type::yes) { out_mem[i] /= m_mem[ii]; out_mem[j] /= m_mem[jj]; } } if(i < aa_n_elem) { const uword ii = aa_mem[i]; arma_debug_check_bounds( (ii >= m_n_elem) , "Mat::elem(): index out of bounds" ); if(is_same_type::yes) { out_mem[i] += m_mem[ii]; } if(is_same_type::yes) { out_mem[i] -= m_mem[ii]; } if(is_same_type::yes) { out_mem[i] *= m_mem[ii]; } if(is_same_type::yes) { out_mem[i] /= m_mem[ii]; } } } template inline void subview_elem1::plus_inplace(Mat& out, const subview_elem1& in) { arma_extra_debug_sigprint(); mat_inplace_op(out, in); } template inline void subview_elem1::minus_inplace(Mat& out, const subview_elem1& in) { arma_extra_debug_sigprint(); mat_inplace_op(out, in); } template inline void subview_elem1::schur_inplace(Mat& out, const subview_elem1& in) { arma_extra_debug_sigprint(); mat_inplace_op(out, in); } template inline void subview_elem1::div_inplace(Mat& out, const subview_elem1& in) { arma_extra_debug_sigprint(); mat_inplace_op(out, in); } //! @} RcppArmadillo/inst/include/armadillo_bits/compiler_setup.hpp0000644000176200001440000003400514124060717024137 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #undef arma_hot #undef arma_cold #undef arma_aligned #undef arma_align_mem #undef arma_warn_unused #undef arma_deprecated #undef arma_malloc #undef arma_inline #undef arma_noinline #undef arma_ignore #define arma_hot #define arma_cold #define arma_aligned #define arma_align_mem #define arma_warn_unused #define arma_deprecated #define arma_malloc #define arma_inline inline #define arma_noinline #define arma_ignore(variable) ((void)(variable)) #undef arma_fortran_sans_prefix_B #undef arma_fortran_with_prefix_B #if defined(ARMA_BLAS_UNDERSCORE) #define arma_fortran_sans_prefix_B(function) function##_ #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) #define arma_fortran_with_prefix_B(function) wrapper2_##function##_ #else #define arma_fortran_with_prefix_B(function) wrapper_##function##_ #endif #else #define arma_fortran_sans_prefix_B(function) function #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) #define arma_fortran_with_prefix_B(function) wrapper2_##function #else #define arma_fortran_with_prefix_B(function) wrapper_##function #endif #endif #undef arma_fortran #undef arma_wrapper #if defined(ARMA_USE_WRAPPER) #define arma_fortran(function) arma_fortran_with_prefix_B(function) #define arma_wrapper(function) wrapper_##function #else #define arma_fortran(function) arma_fortran_sans_prefix_B(function) #define arma_wrapper(function) function #endif #undef arma_fortran_sans_prefix #undef arma_fortran_with_prefix #define arma_fortran_sans_prefix(function) arma_fortran_sans_prefix_B(function) #define arma_fortran_with_prefix(function) arma_fortran_with_prefix_B(function) #undef ARMA_INCFILE_WRAP #define ARMA_INCFILE_WRAP(x) #if !defined(ARMA_32BIT_WORD) #undef ARMA_64BIT_WORD #define ARMA_64BIT_WORD #endif #if defined(ARMA_64BIT_WORD) && defined(SIZE_MAX) #if (SIZE_MAX < 0xFFFFFFFFFFFFFFFFull) // #pragma message ("WARNING: disabled use of 64 bit integers, as std::size_t is smaller than 64 bits") #undef ARMA_64BIT_WORD #endif #endif // most compilers can't vectorise slightly elaborate loops; // for example clang: http://llvm.org/bugs/show_bug.cgi?id=16358 #undef ARMA_SIMPLE_LOOPS #define ARMA_SIMPLE_LOOPS #undef ARMA_GOOD_COMPILER // posix_memalign() is part of IEEE standard 1003.1 // http://pubs.opengroup.org/onlinepubs/009696899/functions/posix_memalign.html // http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html // http://sourceforge.net/p/predef/wiki/Standards/ #if ( defined(_POSIX_ADVISORY_INFO) && (_POSIX_ADVISORY_INFO >= 200112L) ) #undef ARMA_HAVE_POSIX_MEMALIGN #define ARMA_HAVE_POSIX_MEMALIGN #endif #if defined(__APPLE__) || defined(__apple_build_version__) #undef ARMA_BLAS_SDOT_BUG #define ARMA_BLAS_SDOT_BUG // #undef ARMA_HAVE_POSIX_MEMALIGN // NOTE: posix_memalign() is available since macOS 10.6 (late 2009 onwards) #endif #if defined(__MINGW32__) || defined(__CYGWIN__) || defined(_MSC_VER) #undef ARMA_HAVE_POSIX_MEMALIGN #endif #undef ARMA_FNSIG #if defined (__GNUG__) #define ARMA_FNSIG __PRETTY_FUNCTION__ #elif defined (_MSC_VER) #define ARMA_FNSIG __FUNCSIG__ #elif defined(__INTEL_COMPILER) #define ARMA_FNSIG __FUNCTION__ #else #define ARMA_FNSIG __func__ #endif // #if defined(ARMA_HAVE_CXX17) // #define arma_warn_unused [[nodiscard]] // #endif #if !defined(ARMA_ALLOW_FAKE_GCC) #if (defined(__GNUG__) || defined(__GNUC__)) && (defined(__INTEL_COMPILER) || defined(__NVCC__) || defined(__CUDACC__) || defined(__PGI) || defined(__PATHSCALE__) || defined(__ARMCC_VERSION) || defined(__IBMCPP__)) #undef ARMA_DETECTED_FAKE_GCC #define ARMA_DETECTED_FAKE_GCC #pragma message ("WARNING: this compiler is pretending to be GCC but it may not be fully compatible;") #pragma message ("WARNING: to allow this compiler to use GCC features such as data alignment attributes,") #pragma message ("WARNING: #define ARMA_ALLOW_FAKE_GCC before #include ") #endif #endif #if defined(__GNUG__) && (!defined(__clang__) && !defined(ARMA_DETECTED_FAKE_GCC)) // #pragma message ("using GCC extensions") #undef ARMA_GCC_VERSION #define ARMA_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) #if (ARMA_GCC_VERSION < 40800) #error "*** newer compiler required; need gcc 4.8 or later ***" #endif #define ARMA_GOOD_COMPILER #undef arma_hot #undef arma_cold #undef arma_aligned #undef arma_align_mem #undef arma_warn_unused #undef arma_deprecated #undef arma_malloc #undef arma_inline #undef arma_noinline #define arma_hot __attribute__((__hot__)) #define arma_cold __attribute__((__cold__)) #define arma_aligned __attribute__((__aligned__)) #define arma_align_mem __attribute__((__aligned__(16))) #define arma_warn_unused __attribute__((__warn_unused_result__)) #define arma_deprecated __attribute__((__deprecated__)) #define arma_malloc __attribute__((__malloc__)) #define arma_inline inline __attribute__((__always_inline__)) #define arma_noinline __attribute__((__noinline__)) #undef ARMA_HAVE_ALIGNED_ATTRIBUTE #define ARMA_HAVE_ALIGNED_ATTRIBUTE #undef ARMA_HAVE_GCC_ASSUME_ALIGNED #define ARMA_HAVE_GCC_ASSUME_ALIGNED // gcc's vectoriser can handle elaborate loops #undef ARMA_SIMPLE_LOOPS #if defined(__OPTIMIZE_SIZE__) #define ARMA_SIMPLE_LOOPS #endif #endif #if !defined(ARMA_ALLOW_FAKE_CLANG) #if defined(__clang__) && (defined(__INTEL_COMPILER) || defined(__NVCC__) || defined(__CUDACC__) || defined(__PGI) || defined(__PATHSCALE__) || defined(__ARMCC_VERSION) || defined(__IBMCPP__)) #undef ARMA_DETECTED_FAKE_CLANG #define ARMA_DETECTED_FAKE_CLANG #pragma message ("WARNING: this compiler is pretending to be Clang but it may not be fully compatible;") #pragma message ("WARNING: to allow this compiler to use Clang features such as data alignment attributes,") #pragma message ("WARNING: #define ARMA_ALLOW_FAKE_CLANG before #include ") #endif #endif #if defined(__clang__) && !defined(ARMA_DETECTED_FAKE_CLANG) // #pragma message ("using Clang extensions") #define ARMA_GOOD_COMPILER #if !defined(__has_attribute) #define __has_attribute(x) 0 #endif #if __has_attribute(__aligned__) #undef arma_aligned #undef arma_align_mem #define arma_aligned __attribute__((__aligned__)) #define arma_align_mem __attribute__((__aligned__(16))) #undef ARMA_HAVE_ALIGNED_ATTRIBUTE #define ARMA_HAVE_ALIGNED_ATTRIBUTE #endif #if __has_attribute(__warn_unused_result__) #undef arma_warn_unused #define arma_warn_unused __attribute__((__warn_unused_result__)) #endif #if __has_attribute(__deprecated__) #undef arma_deprecated #define arma_deprecated __attribute__((__deprecated__)) #endif #if __has_attribute(__malloc__) #undef arma_malloc #define arma_malloc __attribute__((__malloc__)) #endif #if __has_attribute(__always_inline__) #undef arma_inline #define arma_inline inline __attribute__((__always_inline__)) #endif #if __has_attribute(__noinline__) #undef arma_noinline #define arma_noinline __attribute__((__noinline__)) #endif #if __has_attribute(__hot__) #undef arma_hot #define arma_hot __attribute__((__hot__)) #endif #if __has_attribute(__minsize__) #undef arma_cold #define arma_cold __attribute__((__minsize__)) #elif __has_attribute(__cold__) #undef arma_cold #define arma_cold __attribute__((__cold__)) #endif #if defined(__has_builtin) && __has_builtin(__builtin_assume_aligned) #undef ARMA_HAVE_GCC_ASSUME_ALIGNED #define ARMA_HAVE_GCC_ASSUME_ALIGNED #endif #endif #if defined(__INTEL_COMPILER) #if (__INTEL_COMPILER == 9999) #error "*** newer compiler required ***" #endif #if (__INTEL_COMPILER < 1500) #error "*** newer compiler required ***" #endif #undef ARMA_HAVE_GCC_ASSUME_ALIGNED #undef ARMA_HAVE_ICC_ASSUME_ALIGNED #define ARMA_HAVE_ICC_ASSUME_ALIGNED #endif #if defined(_MSC_VER) #if (_MSC_VER < 1900) #error "*** newer compiler required ***" #endif #undef arma_deprecated #define arma_deprecated __declspec(deprecated) // #undef arma_inline // #define arma_inline inline __forceinline #pragma warning(push) #pragma warning(disable: 4127) // conditional expression is constant #pragma warning(disable: 4180) // qualifier has no meaning #pragma warning(disable: 4244) // possible loss of data when converting types (see also 4305) #pragma warning(disable: 4510) // default constructor could not be generated #pragma warning(disable: 4511) // copy constructor can't be generated #pragma warning(disable: 4512) // assignment operator can't be generated #pragma warning(disable: 4513) // destructor can't be generated #pragma warning(disable: 4514) // unreferenced inline function has been removed #pragma warning(disable: 4522) // multiple assignment operators specified #pragma warning(disable: 4623) // default constructor can't be generated #pragma warning(disable: 4624) // destructor can't be generated #pragma warning(disable: 4625) // copy constructor can't be generated #pragma warning(disable: 4626) // assignment operator can't be generated #pragma warning(disable: 4702) // unreachable code #pragma warning(disable: 4710) // function not inlined #pragma warning(disable: 4711) // call was inlined #pragma warning(disable: 4714) // __forceinline can't be inlined #pragma warning(disable: 4800) // value forced to bool #pragma warning(disable: 4519) // C++11: default template args are only allowed on a class template // #if (_MANAGED == 1) || (_M_CEE == 1) // // // don't do any alignment when compiling in "managed code" mode // // #undef arma_aligned // #define arma_aligned // // #undef arma_align_mem // #define arma_align_mem // // #elif (_MSC_VER >= 1700) // // #undef arma_align_mem // #define arma_align_mem __declspec(align(16)) // // #define ARMA_HAVE_ALIGNED_ATTRIBUTE // // // disable warnings: "structure was padded due to __declspec(align(16))" // #pragma warning(disable: 4324) // // #endif #endif #if defined(__SUNPRO_CC) // http://www.oracle.com/technetwork/server-storage/solarisstudio/training/index-jsp-141991.html // http://www.oracle.com/technetwork/server-storage/solarisstudio/documentation/cplusplus-faq-355066.html #if (__SUNPRO_CC < 0x5140) #error "*** newer compiler required ***" #endif #endif #if defined(__CYGWIN__) && !defined(ARMA_DONT_PRINT_CXX11_WARNING) #pragma message ("WARNING: Cygwin may have incomplete support for C++11 features.") #endif #if !defined(ARMA_DONT_USE_OPENMP) #if (defined(_OPENMP) && (_OPENMP >= 201107)) #undef ARMA_USE_OPENMP #define ARMA_USE_OPENMP #endif #endif #if ( defined(ARMA_USE_OPENMP) && (!defined(_OPENMP) || (defined(_OPENMP) && (_OPENMP < 201107))) ) // OpenMP 3.0 required for parallelisation of loops with unsigned integers // OpenMP 3.1 required for atomic read and atomic write #undef ARMA_USE_OPENMP #undef ARMA_PRINT_OPENMP_WARNING #define ARMA_PRINT_OPENMP_WARNING #endif #if defined(ARMA_PRINT_OPENMP_WARNING) && !defined(ARMA_DONT_PRINT_OPENMP_WARNING) #pragma message ("WARNING: use of OpenMP disabled; compiler support for OpenMP 3.1+ not detected") #if (defined(_OPENMP) && (_OPENMP < 201107)) #pragma message ("NOTE: your compiler appears to have an ancient version of OpenMP") #pragma message ("NOTE: consider upgrading to a better compiler") #endif #endif #if defined(ARMA_USE_OPENMP) #if (defined(ARMA_GCC_VERSION) && (ARMA_GCC_VERSION < 50400)) // due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57580 // TODO: gcc 4.9.4 is also fixed, so use a more fine-grained gcc version check? #undef ARMA_USE_OPENMP #if !defined(ARMA_DONT_PRINT_OPENMP_WARNING) #pragma message ("WARNING: use of OpenMP disabled due to compiler bug in gcc <= 5.3") #endif #endif #endif #if ( defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__) ) #undef ARMA_PRINT_EXCEPTIONS #define ARMA_PRINT_EXCEPTIONS #endif #if (defined(ARMA_ALIEN_MEM_ALLOC_FUNCTION) && !defined(ARMA_ALIEN_MEM_FREE_FUNCTION)) || (!defined(ARMA_ALIEN_MEM_ALLOC_FUNCTION) && defined(ARMA_ALIEN_MEM_FREE_FUNCTION)) #error "*** both ARMA_ALIEN_MEM_ALLOC_FUNCTION and ARMA_ALIEN_MEM_FREE_FUNCTION must be defined ***" #endif // cleanup #undef ARMA_DETECTED_FAKE_GCC #undef ARMA_DETECTED_FAKE_CLANG #undef ARMA_GCC_VERSION #undef ARMA_PRINT_OPENMP_WARNING #if defined(log2) #undef log2 #pragma message ("WARNING: detected 'log2' macro and undefined it") #endif // // whoever defined macros with the names "min" and "max" should be permanently removed from the gene pool #if defined(min) || defined(max) #undef min #undef max #pragma message ("WARNING: detected 'min' and/or 'max' macros and undefined them;") #pragma message ("WARNING: you may wish to define NOMINMAX before including any windows header") #endif // // handle more stupid macros // https://sourceware.org/bugzilla/show_bug.cgi?id=19239 #undef minor #undef major RcppArmadillo/inst/include/armadillo_bits/fn_log_normpdf.hpp0000644000176200001440000001265214124060717024102 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_log_normpdf //! @{ template inline typename enable_if2< (is_real::value), void >::result log_normpdf_helper(Mat& out, const Base& X_expr, const Base& M_expr, const Base& S_expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(Proxy::use_at || Proxy::use_at || Proxy::use_at) { const quasi_unwrap UX(X_expr.get_ref()); const quasi_unwrap UM(M_expr.get_ref()); const quasi_unwrap US(S_expr.get_ref()); log_normpdf_helper(out, UX.M, UM.M, US.M); return; } const Proxy PX(X_expr.get_ref()); const Proxy PM(M_expr.get_ref()); const Proxy PS(S_expr.get_ref()); arma_debug_check( ( (PX.get_n_rows() != PM.get_n_rows()) || (PX.get_n_cols() != PM.get_n_cols()) || (PM.get_n_rows() != PS.get_n_rows()) || (PM.get_n_cols() != PS.get_n_cols()) ), "log_normpdf(): size mismatch" ); out.set_size(PX.get_n_rows(), PX.get_n_cols()); eT* out_mem = out.memptr(); const uword N = PX.get_n_elem(); typename Proxy::ea_type X_ea = PX.get_ea(); typename Proxy::ea_type M_ea = PM.get_ea(); typename Proxy::ea_type S_ea = PS.get_ea(); const bool use_mp = arma_config::openmp && mp_gate::eval(N); if(use_mp) { #if defined(ARMA_USE_OPENMP) { const int n_threads = mp_thread_limit::get(); #pragma omp parallel for schedule(static) num_threads(n_threads) for(uword i=0; i::log_sqrt2pi); } } #endif } else { for(uword i=0; i::log_sqrt2pi); } } } template inline arma_warn_unused typename enable_if2< (is_real::value), eT >::result log_normpdf(const eT x) { const eT out = (eT(-0.5) * (x*x)) - Datum::log_sqrt2pi; return out; } template inline arma_warn_unused typename enable_if2< (is_real::value), eT >::result log_normpdf(const eT x, const eT mu, const eT sigma) { const eT tmp = (x - mu) / sigma; const eT out = (eT(-0.5) * (tmp*tmp)) - (std::log(sigma) + Datum::log_sqrt2pi); return out; } template inline arma_warn_unused typename enable_if2< (is_real::value), Mat >::result log_normpdf(const eT x, const Base& M_expr, const Base& S_expr) { arma_extra_debug_sigprint(); const quasi_unwrap UM(M_expr.get_ref()); const Mat& M = UM.M; Mat out; log_normpdf_helper(out, x*ones< Mat >(arma::size(M)), M, S_expr.get_ref()); return out; } template inline arma_warn_unused typename enable_if2< (is_real::value), Mat >::result log_normpdf(const Base& X_expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap UX(X_expr.get_ref()); const Mat& X = UX.M; Mat out; log_normpdf_helper(out, X, zeros< Mat >(arma::size(X)), ones< Mat >(arma::size(X))); return out; } template inline arma_warn_unused typename enable_if2< (is_real::value), Mat >::result log_normpdf(const Base& X_expr, const typename T1::elem_type mu, const typename T1::elem_type sigma) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap UX(X_expr.get_ref()); const Mat& X = UX.M; Mat out; log_normpdf_helper(out, X, mu*ones< Mat >(arma::size(X)), sigma*ones< Mat >(arma::size(X))); return out; } template inline arma_warn_unused typename enable_if2< (is_real::value), Mat >::result log_normpdf(const Base& X_expr, const Base& M_expr, const Base& S_expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; Mat out; log_normpdf_helper(out, X_expr.get_ref(), M_expr.get_ref(), S_expr.get_ref()); return out; } //! @} RcppArmadillo/inst/include/armadillo_bits/operator_minus.hpp0000644000176200001440000003047314124060717024160 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup operator_minus //! @{ //! unary - template arma_inline typename enable_if2< is_arma_type::value, const eOp >::result operator- (const T1& X) { arma_extra_debug_sigprint(); return eOp(X); } //! Base - scalar template arma_inline typename enable_if2< is_arma_type::value, const eOp >::result operator- ( const T1& X, const typename T1::elem_type k ) { arma_extra_debug_sigprint(); return eOp(X, k); } //! scalar - Base template arma_inline typename enable_if2< is_arma_type::value, const eOp >::result operator- ( const typename T1::elem_type k, const T1& X ) { arma_extra_debug_sigprint(); return eOp(X, k); } //! complex scalar - non-complex Base template arma_inline typename enable_if2 < (is_arma_type::value && is_cx::no), const mtOp, T1, op_cx_scalar_minus_pre> >::result operator- ( const std::complex& k, const T1& X ) { arma_extra_debug_sigprint(); return mtOp, T1, op_cx_scalar_minus_pre>('j', X, k); } //! non-complex Base - complex scalar template arma_inline typename enable_if2 < (is_arma_type::value && is_cx::no), const mtOp, T1, op_cx_scalar_minus_post> >::result operator- ( const T1& X, const std::complex& k ) { arma_extra_debug_sigprint(); return mtOp, T1, op_cx_scalar_minus_post>('j', X, k); } //! subtraction of Base objects with same element type template arma_inline typename enable_if2 < is_arma_type::value && is_arma_type::value && is_same_type::value, const eGlue >::result operator- ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); return eGlue(X, Y); } //! subtraction of Base objects with different element types template inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && (is_same_type::no)), const mtGlue::result, T1, T2, glue_mixed_minus> >::result operator- ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); return mtGlue( X, Y ); } //! unary "-" for sparse objects template inline typename enable_if2 < is_arma_sparse_type::value && is_signed::value, SpOp >::result operator- (const T1& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; return SpOp(X, eT(-1)); } //! subtraction of two sparse objects template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_sparse_type::value && is_same_type::value), const SpGlue >::result operator- ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); return SpGlue(X,Y); } //! subtraction of one sparse and one dense object template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_type::value && is_same_type::value), Mat >::result operator- ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); const SpProxy pa(x); Mat result(-y); arma_debug_assert_same_size( pa.get_n_rows(), pa.get_n_cols(), result.n_rows, result.n_cols, "subtraction" ); typename SpProxy::const_iterator_type it = pa.begin(); typename SpProxy::const_iterator_type it_end = pa.end(); while(it != it_end) { result.at(it.row(), it.col()) += (*it); ++it; } return result; } //! subtraction of one dense and one sparse object template inline typename enable_if2 < (is_arma_type::value && is_arma_sparse_type::value && is_same_type::value), Mat >::result operator- ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); Mat result(x); const SpProxy pb(y); arma_debug_assert_same_size( result.n_rows, result.n_cols, pb.get_n_rows(), pb.get_n_cols(), "subtraction" ); typename SpProxy::const_iterator_type it = pb.begin(); typename SpProxy::const_iterator_type it_end = pb.end(); while(it != it_end) { result.at(it.row(), it.col()) -= (*it); ++it; } return result; } //! subtraction of two sparse objects with different element types template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_sparse_type::value && is_same_type::no), const mtSpGlue< typename promote_type::result, T1, T2, spglue_minus_mixed > >::result operator- ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); return mtSpGlue( X, Y ); } //! subtraction of sparse and non-sparse objects with different element types template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_type::value && is_same_type::no), Mat< typename promote_type::result > >::result operator- ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); Mat< typename promote_type::result > out; spglue_minus_mixed::sparse_minus_dense(out, x, y); return out; } //! subtraction of sparse and non-sparse objects with different element types template inline typename enable_if2 < (is_arma_type::value && is_arma_sparse_type::value && is_same_type::no), Mat< typename promote_type::result > >::result operator- ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); Mat< typename promote_type::result > out; spglue_minus_mixed::dense_minus_sparse(out, x, y); return out; } //! sparse - scalar template arma_inline typename enable_if2< is_arma_sparse_type::value, const SpToDOp >::result operator- ( const T1& X, const typename T1::elem_type k ) { arma_extra_debug_sigprint(); return SpToDOp(X, k); } //! scalar - sparse template arma_inline typename enable_if2< is_arma_sparse_type::value, const SpToDOp >::result operator- ( const typename T1::elem_type k, const T1& X ) { arma_extra_debug_sigprint(); return SpToDOp(X, k); } // TODO: this is an uncommon use case; remove? //! multiple applications of add/subtract scalars can be condensed template inline typename enable_if2 < (is_arma_sparse_type::value && (is_same_type::value || is_same_type::value)), const SpToDOp >::result operator- ( const SpToDOp& x, const typename T1::elem_type k ) { arma_extra_debug_sigprint(); const typename T1::elem_type aux = (is_same_type::value) ? -x.aux : x.aux; return SpToDOp(x.m, aux + k); } // TODO: this is an uncommon use case; remove? //! multiple applications of add/subtract scalars can be condensed template inline typename enable_if2 < (is_arma_sparse_type::value && (is_same_type::value || is_same_type::value)), const SpToDOp >::result operator- ( const typename T1::elem_type k, const SpToDOp& x ) { arma_extra_debug_sigprint(); const typename T1::elem_type aux = (is_same_type::value) ? -x.aux : x.aux; return SpToDOp(x.m, k + aux); } // TODO: this is an uncommon use case; remove? //! multiple applications of add/subtract scalars can be condensed template inline typename enable_if2 < (is_arma_sparse_type::value && is_same_type::value), const SpToDOp >::result operator- ( const SpToDOp& x, const typename T1::elem_type k ) { arma_extra_debug_sigprint(); return SpToDOp(x.m, x.aux - k); } // TODO: this is an uncommon use case; remove? //! multiple applications of add/subtract scalars can be condensed template inline typename enable_if2 < (is_arma_sparse_type::value && is_same_type::value), const SpToDOp >::result operator- ( const typename T1::elem_type k, const SpToDOp& x ) { arma_extra_debug_sigprint(); return SpToDOp(x.m, k - x.aux); } template arma_inline Mat operator- ( const subview_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); return subview_each1_aux::operator_minus(X, Y.get_ref()); } template arma_inline Mat operator- ( const Base& X, const subview_each1& Y ) { arma_extra_debug_sigprint(); return subview_each1_aux::operator_minus(X.get_ref(), Y); } template arma_inline Mat operator- ( const subview_each2& X, const Base& Y ) { arma_extra_debug_sigprint(); return subview_each2_aux::operator_minus(X, Y.get_ref()); } template arma_inline Mat operator- ( const Base& X, const subview_each2& Y ) { arma_extra_debug_sigprint(); return subview_each2_aux::operator_minus(X.get_ref(), Y); } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_vectorise_bones.hpp0000644000176200001440000000321314124060717025334 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_vectorise //! @{ class spop_vectorise_col : public traits_op_col { public: template inline static void apply(SpMat& out, const SpOp& in); template inline static void apply_direct(SpMat& out, const T1& expr); }; class spop_vectorise_row : public traits_op_row { public: template inline static void apply(SpMat& out, const SpOp& in); template inline static void apply_direct(SpMat& out, const T1& expr); }; class spop_vectorise_all : public traits_op_xvec { public: template inline static void apply(SpMat& out, const SpOp& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_resize.hpp0000644000176200001440000000466714124060717023104 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_resize //! @{ template arma_warn_unused inline const Op resize(const Base& X, const uword in_n_rows, const uword in_n_cols) { arma_extra_debug_sigprint(); return Op(X.get_ref(), in_n_rows, in_n_cols); } template arma_warn_unused inline const Op resize(const Base& X, const SizeMat& s) { arma_extra_debug_sigprint(); return Op(X.get_ref(), s.n_rows, s.n_cols); } template arma_warn_unused inline const OpCube resize(const BaseCube& X, const uword in_n_rows, const uword in_n_cols, const uword in_n_slices) { arma_extra_debug_sigprint(); return OpCube(X.get_ref(), in_n_rows, in_n_cols, in_n_slices); } template arma_warn_unused inline const OpCube resize(const BaseCube& X, const SizeCube& s) { arma_extra_debug_sigprint(); return OpCube(X.get_ref(), s.n_rows, s.n_cols, s.n_slices); } template arma_warn_unused inline const SpOp resize(const SpBase& X, const uword in_n_rows, const uword in_n_cols) { arma_extra_debug_sigprint(); return SpOp(X.get_ref(), in_n_rows, in_n_cols); } template arma_warn_unused inline const SpOp resize(const SpBase& X, const SizeMat& s) { arma_extra_debug_sigprint(); return SpOp(X.get_ref(), s.n_rows, s.n_cols); } //! @} RcppArmadillo/inst/include/armadillo_bits/SpMat_iterators_meat.hpp0000644000176200001440000006173614124060717025246 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpMat //! @{ /////////////////////////////////////////////////////////////////////////////// // SpMat::iterator_base implementation // /////////////////////////////////////////////////////////////////////////////// template inline SpMat::iterator_base::iterator_base() : M(nullptr) , internal_col(0) , internal_pos(0) { // Technically this iterator is invalid (it does not point to a valid element) } template inline SpMat::iterator_base::iterator_base(const SpMat& in_M) : M(&in_M) , internal_col(0) , internal_pos(0) { // Technically this iterator is invalid (it may not point to a valid element) } template inline SpMat::iterator_base::iterator_base(const SpMat& in_M, const uword in_col, const uword in_pos) : M(&in_M) , internal_col(in_col) , internal_pos(in_pos) { // Nothing to do. } template arma_inline eT SpMat::iterator_base::operator*() const { return M->values[internal_pos]; } /////////////////////////////////////////////////////////////////////////////// // SpMat::const_iterator implementation // /////////////////////////////////////////////////////////////////////////////// template inline SpMat::const_iterator::const_iterator() : iterator_base() { } template inline SpMat::const_iterator::const_iterator(const SpMat& in_M, uword initial_pos) : iterator_base(in_M, 0, initial_pos) { // Corner case for empty matrices. if(in_M.n_nonzero == 0) { iterator_base::internal_col = in_M.n_cols; return; } // Determine which column we should be in. while(iterator_base::M->col_ptrs[iterator_base::internal_col + 1] <= iterator_base::internal_pos) { iterator_base::internal_col++; } } template inline SpMat::const_iterator::const_iterator(const SpMat& in_M, uword in_row, uword in_col) : iterator_base(in_M, in_col, 0) { // So we have a position we want to be right after. Skip to the column. iterator_base::internal_pos = iterator_base::M->col_ptrs[iterator_base::internal_col]; // Now we have to make sure that is the right column. while(iterator_base::M->col_ptrs[iterator_base::internal_col + 1] <= iterator_base::internal_pos) { iterator_base::internal_col++; } // Now we have to get to the right row. while((iterator_base::M->row_indices[iterator_base::internal_pos] < in_row) && (iterator_base::internal_col == in_col)) { ++(*this); // Increment iterator. } } template inline SpMat::const_iterator::const_iterator(const SpMat& in_M, const uword /* in_row */, const uword in_col, const uword in_pos) : iterator_base(in_M, in_col, in_pos) { // Nothing to do. } template inline SpMat::const_iterator::const_iterator(const typename SpMat::const_iterator& other) : iterator_base(*other.M, other.internal_col, other.internal_pos) { // Nothing to do. } template inline arma_hot typename SpMat::const_iterator& SpMat::const_iterator::operator++() { ++iterator_base::internal_pos; if(iterator_base::internal_pos == iterator_base::M->n_nonzero) { iterator_base::internal_col = iterator_base::M->n_cols; return *this; } // Check to see if we moved a column. while(iterator_base::M->col_ptrs[iterator_base::internal_col + 1] <= iterator_base::internal_pos) { ++iterator_base::internal_col; } return *this; } template inline arma_warn_unused typename SpMat::const_iterator SpMat::const_iterator::operator++(int) { typename SpMat::const_iterator tmp(*this); ++(*this); return tmp; } template inline arma_hot typename SpMat::const_iterator& SpMat::const_iterator::operator--() { --iterator_base::internal_pos; // First, see if we moved back a column. while(iterator_base::internal_pos < iterator_base::M->col_ptrs[iterator_base::internal_col]) { --iterator_base::internal_col; } return *this; } template inline arma_warn_unused typename SpMat::const_iterator SpMat::const_iterator::operator--(int) { typename SpMat::const_iterator tmp(*this); --(*this); return tmp; } template inline arma_hot bool SpMat::const_iterator::operator==(const const_iterator& rhs) const { return (rhs.row() == (*this).row()) && (rhs.col() == iterator_base::internal_col); } template inline arma_hot bool SpMat::const_iterator::operator!=(const const_iterator& rhs) const { return (rhs.row() != (*this).row()) || (rhs.col() != iterator_base::internal_col); } template inline arma_hot bool SpMat::const_iterator::operator==(const typename SpSubview::const_iterator& rhs) const { return (rhs.row() == (*this).row()) && (rhs.col() == iterator_base::internal_col); } template inline arma_hot bool SpMat::const_iterator::operator!=(const typename SpSubview::const_iterator& rhs) const { return (rhs.row() != (*this).row()) || (rhs.col() != iterator_base::internal_col); } template inline arma_hot bool SpMat::const_iterator::operator==(const const_row_iterator& rhs) const { return (rhs.row() == (*this).row()) && (rhs.col() == iterator_base::internal_col); } template inline arma_hot bool SpMat::const_iterator::operator!=(const const_row_iterator& rhs) const { return (rhs.row() != (*this).row()) || (rhs.col() != iterator_base::internal_col); } template inline arma_hot bool SpMat::const_iterator::operator==(const typename SpSubview::const_row_iterator& rhs) const { return (rhs.row() == (*this).row()) && (rhs.col() == iterator_base::internal_col); } template inline arma_hot bool SpMat::const_iterator::operator!=(const typename SpSubview::const_row_iterator& rhs) const { return (rhs.row() != (*this).row()) || (rhs.col() != iterator_base::internal_col); } /////////////////////////////////////////////////////////////////////////////// // SpMat::iterator implementation // /////////////////////////////////////////////////////////////////////////////// template inline arma_hot SpValProxy< SpMat > SpMat::iterator::operator*() { return SpValProxy< SpMat >( iterator_base::M->row_indices[iterator_base::internal_pos], iterator_base::internal_col, access::rw(*iterator_base::M), &access::rw(iterator_base::M->values[iterator_base::internal_pos])); } template inline arma_hot typename SpMat::iterator& SpMat::iterator::operator++() { const_iterator::operator++(); return *this; } template inline arma_warn_unused typename SpMat::iterator SpMat::iterator::operator++(int) { typename SpMat::iterator tmp(*this); const_iterator::operator++(); return tmp; } template inline arma_hot typename SpMat::iterator& SpMat::iterator::operator--() { const_iterator::operator--(); return *this; } template inline arma_warn_unused typename SpMat::iterator SpMat::iterator::operator--(int) { typename SpMat::iterator tmp(*this); const_iterator::operator--(); return tmp; } /////////////////////////////////////////////////////////////////////////////// // SpMat::const_row_iterator implementation // /////////////////////////////////////////////////////////////////////////////// /** * Initialize the const_row_iterator. */ template inline SpMat::const_row_iterator::const_row_iterator() : iterator_base() , internal_row(0) , actual_pos(0) { } template inline SpMat::const_row_iterator::const_row_iterator(const SpMat& in_M, uword initial_pos) : iterator_base(in_M, 0, initial_pos) , internal_row(0) , actual_pos(0) { // Corner case for the end of a matrix. if(initial_pos == in_M.n_nonzero) { iterator_base::internal_col = 0; internal_row = in_M.n_rows; actual_pos = in_M.n_nonzero; iterator_base::internal_pos = in_M.n_nonzero; return; } // We don't count zeros in our position count, so we have to find the nonzero // value corresponding to the given initial position. We assume initial_pos // is valid. // This is irritating because we don't know where the elements are in each row. // What we will do is loop across all columns looking for elements in row 0 // (and add to our sum), then in row 1, and so forth, until we get to the desired position. uword cur_pos = std::numeric_limits::max(); // Invalid value. uword cur_actual_pos = 0; for(uword row = 0; row < iterator_base::M->n_rows; ++row) { for(uword col = 0; col < iterator_base::M->n_cols; ++col) { // Find the first element with row greater than or equal to in_row. const uword col_offset = iterator_base::M->col_ptrs[col ]; const uword next_col_offset = iterator_base::M->col_ptrs[col + 1]; const uword* start_ptr = &iterator_base::M->row_indices[ col_offset]; const uword* end_ptr = &iterator_base::M->row_indices[next_col_offset]; if(start_ptr != end_ptr) { const uword* pos_ptr = std::lower_bound(start_ptr, end_ptr, row); // This is the number of elements in the column with row index less than in_row. const uword offset = uword(pos_ptr - start_ptr); if(iterator_base::M->row_indices[col_offset + offset] == row) { cur_actual_pos = col_offset + offset; // Increment position portably. if(cur_pos == std::numeric_limits::max()) { cur_pos = 0; } else { ++cur_pos; } // Do we terminate? if(cur_pos == initial_pos) { internal_row = row; iterator_base::internal_col = col; iterator_base::internal_pos = cur_pos; actual_pos = cur_actual_pos; return; } } } } } // If we got to here, then we have gone past the end of the matrix. // This shouldn't happen... iterator_base::internal_pos = iterator_base::M->n_nonzero; iterator_base::internal_col = 0; internal_row = iterator_base::M->n_rows; actual_pos = iterator_base::M->n_nonzero; } template inline SpMat::const_row_iterator::const_row_iterator(const SpMat& in_M, uword in_row, uword in_col) : iterator_base(in_M, in_col, 0) , internal_row(0) , actual_pos(0) { // Start our search in the given row. We need to find two things: // // 1. The first nonzero element (iterating by rows) after (in_row, in_col). // 2. The number of nonzero elements (iterating by rows) that come before // (in_row, in_col). // // We'll find these simultaneously, though we will have to loop over all // columns. // This will hold the total number of points with rows less than in_row. uword cur_pos = 0; uword cur_min_row = iterator_base::M->n_rows; uword cur_min_col = 0; uword cur_actual_pos = 0; for(uword col = 0; col < iterator_base::M->n_cols; ++col) { // Find the first element with row greater than or equal to in_row. const uword col_offset = iterator_base::M->col_ptrs[col ]; const uword next_col_offset = iterator_base::M->col_ptrs[col + 1]; const uword* start_ptr = &iterator_base::M->row_indices[ col_offset]; const uword* end_ptr = &iterator_base::M->row_indices[next_col_offset]; if(start_ptr != end_ptr) { const uword* pos_ptr = std::lower_bound(start_ptr, end_ptr, in_row); // This is the number of elements in the column with row index less than in_row. const uword offset = uword(pos_ptr - start_ptr); cur_pos += offset; if(pos_ptr != end_ptr) { // This is the row index of the first element in the column with row index // greater than or equal to in_row. if((*pos_ptr) < cur_min_row) { // If we are in the desired row but before the desired column, // we can't take this. if(col >= in_col) { cur_min_row = (*pos_ptr); cur_min_col = col; cur_actual_pos = col_offset + offset; } } } } } // Now we know what the minimum row is. internal_row = cur_min_row; iterator_base::internal_col = cur_min_col; iterator_base::internal_pos = cur_pos; actual_pos = cur_actual_pos; } /** * Initialize the const_row_iterator from another const_row_iterator. */ template inline SpMat::const_row_iterator::const_row_iterator(const typename SpMat::const_row_iterator& other) : iterator_base(*other.M, other.internal_col, other.internal_pos) , internal_row(other.internal_row) , actual_pos(other.actual_pos) { // Nothing to do. } /** * Increment the row_iterator. */ template inline arma_hot typename SpMat::const_row_iterator& SpMat::const_row_iterator::operator++() { // We just need to find the next nonzero element. iterator_base::internal_pos++; if(iterator_base::internal_pos == iterator_base::M->n_nonzero) { internal_row = iterator_base::M->n_rows; iterator_base::internal_col = 0; return *this; } // Otherwise, we need to search. We can start in the next column and use // lower_bound() to find the next element. uword next_min_row = iterator_base::M->n_rows; uword next_min_col = iterator_base::M->n_cols; uword next_actual_pos = 0; // Search from the current column to the end of the matrix. for(uword col = iterator_base::internal_col + 1; col < iterator_base::M->n_cols; ++col) { // Find the first element with row greater than or equal to in_row. const uword col_offset = iterator_base::M->col_ptrs[col ]; const uword next_col_offset = iterator_base::M->col_ptrs[col + 1]; const uword* start_ptr = &iterator_base::M->row_indices[ col_offset]; const uword* end_ptr = &iterator_base::M->row_indices[next_col_offset]; if(start_ptr != end_ptr) { // Find the first element in the column with row greater than or equal to // the current row. const uword* pos_ptr = std::lower_bound(start_ptr, end_ptr, internal_row); if(pos_ptr != end_ptr) { // We found something in the column, but is the row index correct? if((*pos_ptr) == internal_row) { // Exact match---so we are done. iterator_base::internal_col = col; actual_pos = col_offset + (pos_ptr - start_ptr); return *this; } else if((*pos_ptr) < next_min_row) { // The first element in this column is in a subsequent row, but it's // the minimum row we've seen so far. next_min_row = (*pos_ptr); next_min_col = col; next_actual_pos = col_offset + (pos_ptr - start_ptr); } else if((*pos_ptr) == next_min_row && col < next_min_col) { // The first element in this column is in a subsequent row that we // already have another element for, but the column index is less so // this element will come first. next_min_col = col; next_actual_pos = col_offset + (pos_ptr - start_ptr); } } } } // Restart the search in the next row. for(uword col = 0; col <= iterator_base::internal_col; ++col) { // Find the first element with row greater than or equal to in_row + 1. const uword col_offset = iterator_base::M->col_ptrs[col ]; const uword next_col_offset = iterator_base::M->col_ptrs[col + 1]; const uword* start_ptr = &iterator_base::M->row_indices[ col_offset]; const uword* end_ptr = &iterator_base::M->row_indices[next_col_offset]; if(start_ptr != end_ptr) { const uword* pos_ptr = std::lower_bound(start_ptr, end_ptr, internal_row + 1); if(pos_ptr != end_ptr) { // We found something in the column, but is the row index correct? if((*pos_ptr) == internal_row + 1) { // Exact match---so we are done. iterator_base::internal_col = col; internal_row++; actual_pos = col_offset + (pos_ptr - start_ptr); return *this; } else if((*pos_ptr) < next_min_row) { // The first element in this column is in a subsequent row, // but it's the minimum row we've seen so far. next_min_row = (*pos_ptr); next_min_col = col; next_actual_pos = col_offset + (pos_ptr - start_ptr); } else if((*pos_ptr) == next_min_row && col < next_min_col) { // The first element in this column is in a subsequent row that we // already have another element for, but the column index is less so // this element will come first. next_min_col = col; next_actual_pos = col_offset + (pos_ptr - start_ptr); } } } } iterator_base::internal_col = next_min_col; internal_row = next_min_row; actual_pos = next_actual_pos; return *this; // Now we are done. } /** * Increment the row_iterator (but do not return anything. */ template inline arma_warn_unused typename SpMat::const_row_iterator SpMat::const_row_iterator::operator++(int) { typename SpMat::const_row_iterator tmp(*this); ++(*this); return tmp; } /** * Decrement the row_iterator. */ template inline arma_hot typename SpMat::const_row_iterator& SpMat::const_row_iterator::operator--() { if(iterator_base::internal_pos == 0) { // Do nothing; we are already at the beginning. return *this; } iterator_base::internal_pos--; // We have to search backwards. We'll do this by going backwards over columns // and seeing if we find an element in the same row. uword max_row = 0; uword max_col = 0; uword next_actual_pos = 0; //for(uword col = iterator_base::internal_col; col > 1; --col) for(uword col = iterator_base::internal_col; col >= 1; --col) { // Find the first element with row greater than or equal to in_row + 1. const uword col_offset = iterator_base::M->col_ptrs[col - 1]; const uword next_col_offset = iterator_base::M->col_ptrs[col ]; const uword* start_ptr = &iterator_base::M->row_indices[ col_offset]; const uword* end_ptr = &iterator_base::M->row_indices[next_col_offset]; if(start_ptr != end_ptr) { // There are elements in this column. const uword* pos_ptr = std::lower_bound(start_ptr, end_ptr, internal_row + 1); if(pos_ptr != start_ptr) { // The element before pos_ptr is the one we are interested in. if(*(pos_ptr - 1) > max_row) { max_row = *(pos_ptr - 1); max_col = col - 1; next_actual_pos = col_offset + (pos_ptr - 1 - start_ptr); } else if(*(pos_ptr - 1) == max_row && (col - 1) > max_col) { max_col = col - 1; next_actual_pos = col_offset + (pos_ptr - 1 - start_ptr); } } } } // Now loop around to the columns at the end of the matrix. for(uword col = iterator_base::M->n_cols - 1; col >= iterator_base::internal_col; --col) { // Find the first element with row greater than or equal to in_row + 1. const uword col_offset = iterator_base::M->col_ptrs[col ]; const uword next_col_offset = iterator_base::M->col_ptrs[col + 1]; const uword* start_ptr = &iterator_base::M->row_indices[ col_offset]; const uword* end_ptr = &iterator_base::M->row_indices[next_col_offset]; if(start_ptr != end_ptr) { // There are elements in this column. const uword* pos_ptr = std::lower_bound(start_ptr, end_ptr, internal_row); if(pos_ptr != start_ptr) { // There are elements in this column with row index < internal_row. if(*(pos_ptr - 1) > max_row) { max_row = *(pos_ptr - 1); max_col = col; next_actual_pos = col_offset + (pos_ptr - 1 - start_ptr); } else if(*(pos_ptr - 1) == max_row && col > max_col) { max_col = col; next_actual_pos = col_offset + (pos_ptr - 1 - start_ptr); } } } if(col == 0) // Catch edge case that the loop termination condition won't. { break; } } iterator_base::internal_col = max_col; internal_row = max_row; actual_pos = next_actual_pos; return *this; } /** * Decrement the row_iterator. */ template inline arma_warn_unused typename SpMat::const_row_iterator SpMat::const_row_iterator::operator--(int) { typename SpMat::const_row_iterator tmp(*this); --(*this); return tmp; } template inline arma_hot bool SpMat::const_row_iterator::operator==(const const_iterator& rhs) const { return (rhs.row() == row()) && (rhs.col() == iterator_base::internal_col); } template inline arma_hot bool SpMat::const_row_iterator::operator!=(const const_iterator& rhs) const { return (rhs.row() != row()) || (rhs.col() != iterator_base::internal_col); } template inline arma_hot bool SpMat::const_row_iterator::operator==(const typename SpSubview::const_iterator& rhs) const { return (rhs.row() == row()) && (rhs.col() == iterator_base::internal_col); } template inline arma_hot bool SpMat::const_row_iterator::operator!=(const typename SpSubview::const_iterator& rhs) const { return (rhs.row() != row()) || (rhs.col() != iterator_base::internal_col); } template inline arma_hot bool SpMat::const_row_iterator::operator==(const const_row_iterator& rhs) const { return (rhs.row() == row()) && (rhs.col() == iterator_base::internal_col); } template inline arma_hot bool SpMat::const_row_iterator::operator!=(const const_row_iterator& rhs) const { return (rhs.row() != row()) || (rhs.col() != iterator_base::internal_col); } template inline arma_hot bool SpMat::const_row_iterator::operator==(const typename SpSubview::const_row_iterator& rhs) const { return (rhs.row() == row()) && (rhs.col() == iterator_base::internal_col); } template inline arma_hot bool SpMat::const_row_iterator::operator!=(const typename SpSubview::const_row_iterator& rhs) const { return (rhs.row() != row()) || (rhs.col() != iterator_base::internal_col); } /////////////////////////////////////////////////////////////////////////////// // SpMat::row_iterator implementation // /////////////////////////////////////////////////////////////////////////////// template inline arma_hot SpValProxy< SpMat > SpMat::row_iterator::operator*() { return SpValProxy< SpMat >( const_row_iterator::internal_row, iterator_base::internal_col, access::rw(*iterator_base::M), &access::rw(iterator_base::M->values[const_row_iterator::actual_pos])); } template inline arma_hot typename SpMat::row_iterator& SpMat::row_iterator::operator++() { const_row_iterator::operator++(); return *this; } template inline arma_warn_unused typename SpMat::row_iterator SpMat::row_iterator::operator++(int) { typename SpMat::row_iterator tmp(*this); const_row_iterator::operator++(); return tmp; } template inline arma_hot typename SpMat::row_iterator& SpMat::row_iterator::operator--() { const_row_iterator::operator--(); return *this; } template inline arma_warn_unused typename SpMat::row_iterator SpMat::row_iterator::operator--(int) { typename SpMat::row_iterator tmp(*this); const_row_iterator::operator--(); return tmp; } //! @} RcppArmadillo/inst/include/armadillo_bits/BaseCube_bones.hpp0000644000176200001440000000564014124060717023747 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup BaseCube //! @{ template struct BaseCube_eval_Cube { arma_inline arma_warn_unused const derived& eval() const; }; template struct BaseCube_eval_expr { inline arma_warn_unused Cube eval() const; //!< force the immediate evaluation of a delayed expression }; template struct BaseCube_eval {}; template struct BaseCube_eval { typedef BaseCube_eval_Cube result; }; template struct BaseCube_eval { typedef BaseCube_eval_expr result; }; //! Analog of the Base class, intended for cubes template struct BaseCube : public BaseCube_eval::value>::result { arma_inline const derived& get_ref() const; arma_cold inline void print( const std::string extra_text = "") const; arma_cold inline void print(std::ostream& user_stream, const std::string extra_text = "") const; arma_cold inline void raw_print( const std::string extra_text = "") const; arma_cold inline void raw_print(std::ostream& user_stream, const std::string extra_text = "") const; arma_cold inline void brief_print( const std::string extra_text = "") const; arma_cold inline void brief_print(std::ostream& user_stream, const std::string extra_text = "") const; inline arma_warn_unused elem_type min() const; inline arma_warn_unused elem_type max() const; inline arma_warn_unused uword index_min() const; inline arma_warn_unused uword index_max() const; inline arma_warn_unused bool is_zero(const typename get_pod_type::result tol = 0) const; inline arma_warn_unused bool is_empty() const; inline arma_warn_unused bool is_finite() const; inline arma_warn_unused bool has_inf() const; inline arma_warn_unused bool has_nan() const; }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_roots_bones.hpp0000644000176200001440000000253414124060717024141 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_roots //! @{ class op_roots : public traits_op_col { public: template inline static void apply(Mat< std::complex >& out, const mtOp, T1, op_roots>& expr); template inline static bool apply_direct(Mat< std::complex >& out, const Base& X); template inline static bool apply_noalias(Mat< std::complex::result> >& out, const Mat& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/eop_aux.hpp0000644000176200001440000003543014124060717022550 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup eop_aux //! @{ //! use of the SFINAE approach to work around compiler limitations //! http://en.wikipedia.org/wiki/SFINAE class eop_aux { public: template arma_inline static typename arma_integral_only::result acos (const eT x) { return eT( std::acos(double(x)) ); } template arma_inline static typename arma_integral_only::result asin (const eT x) { return eT( std::asin(double(x)) ); } template arma_inline static typename arma_integral_only::result atan (const eT x) { return eT( std::atan(double(x)) ); } template arma_inline static typename arma_real_only::result acos (const eT x) { return std::acos(x); } template arma_inline static typename arma_real_only::result asin (const eT x) { return std::asin(x); } template arma_inline static typename arma_real_only::result atan (const eT x) { return std::atan(x); } template arma_inline static typename arma_cx_only::result acos (const eT x) { return std::acos(x); } template arma_inline static typename arma_cx_only::result asin (const eT x) { return std::asin(x); } template arma_inline static typename arma_cx_only::result atan (const eT x) { return std::atan(x); } template arma_inline static typename arma_integral_only::result acosh (const eT x) { return eT( std::acosh(double(x)) ); } template arma_inline static typename arma_integral_only::result asinh (const eT x) { return eT( std::asinh(double(x)) ); } template arma_inline static typename arma_integral_only::result atanh (const eT x) { return eT( std::atanh(double(x)) ); } template arma_inline static typename arma_real_or_cx_only::result acosh (const eT x) { return std::acosh(x); } template arma_inline static typename arma_real_or_cx_only::result asinh (const eT x) { return std::asinh(x); } template arma_inline static typename arma_real_or_cx_only::result atanh (const eT x) { return std::atanh(x); } template arma_inline static typename arma_not_cx::result conj(const eT x) { return x; } template arma_inline static std::complex conj(const std::complex& x) { return std::conj(x); } template arma_inline static typename arma_integral_only::result sqrt (const eT x) { return eT( std::sqrt (double(x)) ); } template arma_inline static typename arma_integral_only::result log10 (const eT x) { return eT( std::log10(double(x)) ); } template arma_inline static typename arma_integral_only::result log (const eT x) { return eT( std::log (double(x)) ); } template arma_inline static typename arma_integral_only::result exp (const eT x) { return eT( std::exp (double(x)) ); } template arma_inline static typename arma_integral_only::result cos (const eT x) { return eT( std::cos (double(x)) ); } template arma_inline static typename arma_integral_only::result sin (const eT x) { return eT( std::sin (double(x)) ); } template arma_inline static typename arma_integral_only::result tan (const eT x) { return eT( std::tan (double(x)) ); } template arma_inline static typename arma_integral_only::result cosh (const eT x) { return eT( std::cosh (double(x)) ); } template arma_inline static typename arma_integral_only::result sinh (const eT x) { return eT( std::sinh (double(x)) ); } template arma_inline static typename arma_integral_only::result tanh (const eT x) { return eT( std::tanh (double(x)) ); } template arma_inline static typename arma_real_or_cx_only::result sqrt (const eT x) { return std::sqrt (x); } template arma_inline static typename arma_real_or_cx_only::result log10 (const eT x) { return std::log10(x); } template arma_inline static typename arma_real_or_cx_only::result log (const eT x) { return std::log (x); } template arma_inline static typename arma_real_or_cx_only::result exp (const eT x) { return std::exp (x); } template arma_inline static typename arma_real_or_cx_only::result cos (const eT x) { return std::cos (x); } template arma_inline static typename arma_real_or_cx_only::result sin (const eT x) { return std::sin (x); } template arma_inline static typename arma_real_or_cx_only::result tan (const eT x) { return std::tan (x); } template arma_inline static typename arma_real_or_cx_only::result cosh (const eT x) { return std::cosh (x); } template arma_inline static typename arma_real_or_cx_only::result sinh (const eT x) { return std::sinh (x); } template arma_inline static typename arma_real_or_cx_only::result tanh (const eT x) { return std::tanh (x); } template arma_inline static typename arma_unsigned_integral_only::result neg (const eT x) { return x; } template arma_inline static typename arma_signed_only::result neg (const eT x) { return -x; } template arma_inline static typename arma_integral_only::result floor (const eT x) { return x; } template arma_inline static typename arma_real_only::result floor (const eT x) { return std::floor(x); } template arma_inline static typename arma_cx_only::result floor (const eT& x) { return eT( std::floor(x.real()), std::floor(x.imag()) ); } template arma_inline static typename arma_integral_only::result ceil (const eT x) { return x; } template arma_inline static typename arma_real_only::result ceil (const eT x) { return std::ceil(x); } template arma_inline static typename arma_cx_only::result ceil (const eT& x) { return eT( std::ceil(x.real()), std::ceil(x.imag()) ); } template arma_inline static typename arma_integral_only::result round (const eT x) { return x; } template arma_inline static typename arma_real_only::result round (const eT x) { return std::round(x); } template arma_inline static typename arma_cx_only::result round (const eT& x) { return eT( std::round(x.real()), std::round(x.imag()) ); } template arma_inline static typename arma_integral_only::result trunc (const eT x) { return x; } template arma_inline static typename arma_real_only::result trunc (const eT x) { return std::trunc(x); } template arma_inline static typename arma_cx_only::result trunc (const eT& x) { return eT( std::trunc(x.real()), std::trunc(x.imag()) ); } template arma_inline static typename arma_integral_only::result log2 (const eT x) { return eT( std::log(double(x))/ double(0.69314718055994530942) ); } template arma_inline static typename arma_real_only::result log2 (const eT x) { return std::log2(x); } template arma_inline static typename arma_cx_only::result log2 (const eT& x) { typedef typename get_pod_type::result T; return std::log(x) / T(0.69314718055994530942); } template arma_inline static typename arma_integral_only::result log1p (const eT x) { return eT( std::log1p(double(x)) ); } template arma_inline static typename arma_real_only::result log1p (const eT x) { return std::log1p(x); } template arma_inline static typename arma_cx_only::result log1p (const eT& x) { arma_ignore(x); return eT(0); } template arma_inline static typename arma_integral_only::result exp2 (const eT x) { return eT( std::pow(double(2), double(x)) ); } template arma_inline static typename arma_real_only::result exp2 (const eT x) { return std::exp2(x); } template arma_inline static typename arma_cx_only::result exp2 (const eT& x) { typedef typename get_pod_type::result T; return std::pow( T(2), x); } template arma_inline static typename arma_integral_only::result exp10 (const eT x) { return eT( std::pow(double(10), double(x)) ); } template arma_inline static typename arma_real_or_cx_only::result exp10 (const eT x) { typedef typename get_pod_type::result T; return std::pow( T(10), x); } template arma_inline static typename arma_integral_only::result expm1 (const eT x) { return eT( std::expm1(double(x)) ); } template arma_inline static typename arma_real_only::result expm1 (const eT x) { return std::expm1(x); } template arma_inline static typename arma_cx_only::result expm1 (const eT& x) { arma_ignore(x); return eT(0); } template arma_inline static typename arma_unsigned_integral_only::result arma_abs (const eT x) { return x; } template arma_inline static typename arma_signed_integral_only::result arma_abs (const eT x) { return std::abs(x); } template arma_inline static typename arma_real_only::result arma_abs (const eT x) { return std::abs(x); } template arma_inline static typename arma_real_only< T>::result arma_abs (const std::complex& x) { return std::abs(x); } template arma_inline static typename arma_integral_only::result erf (const eT x) { return eT( std::erf(double(x)) ); } template arma_inline static typename arma_real_only::result erf (const eT x) { return std::erf(x); } template arma_inline static typename arma_cx_only::result erf (const eT& x) { arma_ignore(x); return eT(0); } template arma_inline static typename arma_integral_only::result erfc (const eT x) { return eT( std::erfc(double(x)) ); } template arma_inline static typename arma_real_only::result erfc (const eT x) { return std::erfc(x); } template arma_inline static typename arma_cx_only::result erfc (const eT& x) { arma_ignore(x); return eT(0); } template arma_inline static typename arma_integral_only::result lgamma (const eT x) { return eT( std::lgamma(double(x)) ); } template arma_inline static typename arma_real_only::result lgamma (const eT x) { return std::lgamma(x); } template arma_inline static typename arma_cx_only::result lgamma (const eT& x) { arma_ignore(x); return eT(0); } template arma_inline static typename arma_integral_only::result tgamma (const eT x) { return eT( std::tgamma(double(x)) ); } template arma_inline static typename arma_real_only::result tgamma (const eT x) { return std::tgamma(x); } template arma_inline static typename arma_cx_only::result tgamma (const eT& x) { arma_ignore(x); return eT(0); } template arma_inline static typename arma_integral_only::result pow (const T1 base, const T2 exponent) { return T1( std::pow( double(base), double(exponent) ) ); } template arma_inline static typename arma_real_or_cx_only::result pow (const T1 base, const T2 exponent) { return T1( std::pow( base, exponent ) ); } template arma_inline static typename arma_integral_only::result direct_eps(const eT) { return eT(0); } template inline static typename arma_real_only::result direct_eps(const eT x) { //arma_extra_debug_sigprint(); // acording to IEEE Standard for Floating-Point Arithmetic (IEEE 754) // the mantissa length for double is 53 bits = std::numeric_limits::digits // the mantissa length for float is 24 bits = std::numeric_limits::digits //return std::pow( std::numeric_limits::radix, (std::floor(std::log10(std::abs(x))/std::log10(std::numeric_limits::radix))-(std::numeric_limits::digits-1)) ); const eT radix_eT = eT(std::numeric_limits::radix); const eT digits_m1_eT = eT(std::numeric_limits::digits - 1); // return std::pow( radix_eT, eT(std::floor(std::log10(std::abs(x))/std::log10(radix_eT)) - digits_m1_eT) ); return eop_aux::pow( radix_eT, eT(std::floor(std::log10(std::abs(x))/std::log10(radix_eT)) - digits_m1_eT) ); } template inline static typename arma_real_only::result direct_eps(const std::complex& x) { //arma_extra_debug_sigprint(); //return std::pow( std::numeric_limits::radix, (std::floor(std::log10(std::abs(x))/std::log10(std::numeric_limits::radix))-(std::numeric_limits::digits-1)) ); const T radix_T = T(std::numeric_limits::radix); const T digits_m1_T = T(std::numeric_limits::digits - 1); return std::pow( radix_T, T(std::floor(std::log10(std::abs(x))/std::log10(radix_T)) - digits_m1_T) ); } }; //! @} RcppArmadillo/inst/include/armadillo_bits/spdiagview_bones.hpp0000644000176200001440000000730214124060717024435 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spdiagview //! @{ //! Class for storing data required to extract and set the diagonals of a sparse matrix template class spdiagview : public SpBase< eT, spdiagview > { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; arma_aligned const SpMat& m; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; const uword row_offset; const uword col_offset; const uword n_rows; // equal to n_elem const uword n_elem; static constexpr uword n_cols = 1; protected: arma_inline spdiagview(const SpMat& in_m, const uword in_row_offset, const uword in_col_offset, const uword len); public: inline ~spdiagview(); inline spdiagview() = delete; inline void operator=(const spdiagview& x); inline void operator+=(const eT val); inline void operator-=(const eT val); inline void operator*=(const eT val); inline void operator/=(const eT val); template inline void operator= (const Base& x); template inline void operator+=(const Base& x); template inline void operator-=(const Base& x); template inline void operator%=(const Base& x); template inline void operator/=(const Base& x); template inline void operator= (const SpBase& x); template inline void operator+=(const SpBase& x); template inline void operator-=(const SpBase& x); template inline void operator%=(const SpBase& x); template inline void operator/=(const SpBase& x); inline SpMat_MapMat_val operator[](const uword ii); inline eT operator[](const uword ii) const; inline SpMat_MapMat_val at(const uword ii); inline eT at(const uword ii) const; inline SpMat_MapMat_val operator()(const uword ii); inline eT operator()(const uword ii) const; inline SpMat_MapMat_val at(const uword in_n_row, const uword); inline eT at(const uword in_n_row, const uword) const; inline SpMat_MapMat_val operator()(const uword in_n_row, const uword in_n_col); inline eT operator()(const uword in_n_row, const uword in_n_col) const; inline void replace(const eT old_val, const eT new_val); inline void clean(const pod_type threshold); inline void clamp(const eT min_val, const eT max_val); inline void fill(const eT val); inline void zeros(); inline void ones(); inline void randu(); inline void randn(); inline static void extract(SpMat& out, const spdiagview& in); inline static void extract( Mat& out, const spdiagview& in); friend class SpMat; }; //! @} RcppArmadillo/inst/include/armadillo_bits/mtSpGlue_meat.hpp0000644000176200001440000000270414124060717023654 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup mtSpGlue //! @{ template inline mtSpGlue::mtSpGlue(const T1& in_A, const T2& in_B) : A(in_A) , B(in_B) { arma_extra_debug_sigprint(); } template inline mtSpGlue::~mtSpGlue() { arma_extra_debug_sigprint(); } template template arma_inline bool mtSpGlue::is_alias(const SpMat& X) const { return (A.is_alias(X) || B.is_alias(X)); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_chi2rnd_bones.hpp0000644000176200001440000000267014124060717024325 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_chi2rnd //! @{ class op_chi2rnd : public traits_op_passthru { public: template inline static void apply(Mat& out, const Op& in); template inline static void apply_noalias(Mat& out, const Proxy& P); template inline static void fill_constant_df(Mat& out, const eT df); }; template class op_chi2rnd_varying_df { public: arma_aligned std::mt19937_64 motor; inline ~op_chi2rnd_varying_df(); inline op_chi2rnd_varying_df(); inline eT operator()(const eT df); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_vectorise_bones.hpp0000644000176200001440000000470514125053103024770 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_vectorise //! @{ class op_vectorise_col : public traits_op_col { public: template inline static void apply(Mat& out, const Op& in); template inline static void apply_direct(Mat& out, const T1& expr); template inline static void apply_subview(Mat& out, const subview& sv); template inline static void apply_proxy(Mat& out, const Proxy& P); }; class op_vectorise_row : public traits_op_row { public: template inline static void apply(Mat& out, const Op& in); template inline static void apply_direct(Mat& out, const T1& expr); template inline static void apply_proxy(Mat& out, const Proxy& P); }; class op_vectorise_all : public traits_op_xvec { public: template inline static void apply(Mat& out, const Op& in); }; class op_vectorise_cube_col : public traits_op_col { public: template inline static void apply(Mat& out, const CubeToMatOp& in); template inline static void apply_subview(Mat& out, const subview_cube& sv); template inline static void apply_unwrap(Mat& out, const T1& expr); template inline static void apply_proxy(Mat& out, const T1& expr); }; //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_DoubleShiftQR_bones.hpp0000644000176200001440000000476714124060717026336 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { template class DoubleShiftQR { private: uword n; // Dimension of the matrix Mat mat_H; // A copy of the matrix to be factorised eT shift_s; // Shift constant eT shift_t; // Shift constant Mat ref_u; // Householder reflectors Col ref_nr; // How many rows does each reflector affects // 3 - A general reflector // 2 - A Givens rotation // 1 - An identity transformation const eT prec; // Approximately zero const eT eps_rel; const eT eps_abs; bool computed; // Whether matrix has been factorised inline void compute_reflector(const eT& x1, const eT& x2, const eT& x3, uword ind); arma_inline void compute_reflector(const eT* x, uword ind); // Update the block X = H(il:iu, il:iu) inline void update_block(uword il, uword iu); // P = I - 2 * u * u' = P' // PX = X - 2 * u * (u'X) inline void apply_PX(Mat& X, uword oi, uword oj, uword nrow, uword ncol, uword u_ind); // x is a pointer to a vector // Px = x - 2 * dot(x, u) * u inline void apply_PX(eT* x, uword u_ind); // XP = X - 2 * (X * u) * u' inline void apply_XP(Mat& X, uword oi, uword oj, uword nrow, uword ncol, uword u_ind); public: inline DoubleShiftQR(uword size); inline DoubleShiftQR(const Mat& mat_obj, eT s, eT t); inline void compute(const Mat& mat_obj, eT s, eT t); inline Mat matrix_QtHQ(); inline void apply_QtY(Col& y); inline void apply_YQ(Mat& Y); }; } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/op_trimat_meat.hpp0000644000176200001440000002022414125053103024077 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_trimat //! @{ template inline void op_trimat::fill_zeros(Mat& out, const bool upper) { arma_extra_debug_sigprint(); const uword N = out.n_rows; if(upper) { // upper triangular: set all elements below the diagonal to zero for(uword i=0; i inline void op_trimat::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const bool upper = (in.aux_uword_a == 0); // allow detection of in-place operation if(is_Mat::value || (arma_config::openmp && Proxy::use_mp)) { const unwrap U(in.m); op_trimat::apply_unwrap(out, U.M, upper); } else { const Proxy P(in.m); const bool is_alias = P.is_alias(out); if(is_Mat::stored_type>::value) { const quasi_unwrap::stored_type> U(P.Q); if(is_alias) { Mat tmp; op_trimat::apply_unwrap(tmp, U.M, upper); out.steal_mem(tmp); } else { op_trimat::apply_unwrap(out, U.M, upper); } } else { if(is_alias) { Mat tmp; op_trimat::apply_proxy(tmp, P, upper); out.steal_mem(tmp); } else { op_trimat::apply_proxy(out, P, upper); } } } } template inline void op_trimat::apply_unwrap(Mat& out, const Mat& A, const bool upper) { arma_extra_debug_sigprint(); arma_debug_check( (A.is_square() == false), "trimatu()/trimatl(): given matrix must be square sized" ); if(&out != &A) { out.copy_size(A); const uword N = A.n_rows; if(upper) { // upper triangular: copy the diagonal and the elements above the diagonal for(uword i=0; i inline void op_trimat::apply_proxy(Mat& out, const Proxy& P, const bool upper) { arma_extra_debug_sigprint(); arma_debug_check( (P.get_n_rows() != P.get_n_cols()), "trimatu()/trimatl(): given matrix must be square sized" ); const uword N = P.get_n_rows(); out.set_size(N,N); if(upper) { for(uword j=0; j < N; ++j) for(uword i=0; i < (j+1); ++i) { out.at(i,j) = P.at(i,j); } } else { for(uword j=0; j inline void op_trimatu_ext::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap tmp(in.m); const Mat& A = tmp.M; arma_debug_check( (A.is_square() == false), "trimatu(): given matrix must be square sized" ); const uword row_offset = in.aux_uword_a; const uword col_offset = in.aux_uword_b; const uword n_rows = A.n_rows; const uword n_cols = A.n_cols; arma_debug_check_bounds( ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)), "trimatu(): requested diagonal is out of bounds" ); if(&out != &A) { out.copy_size(A); const uword N = (std::min)(n_rows - row_offset, n_cols - col_offset); for(uword i=0; i < n_cols; ++i) { const uword col = i + col_offset; if(i < N) { const uword end_row = i + row_offset; for(uword row=0; row <= end_row; ++row) { out.at(row,col) = A.at(row,col); } } else { if(col < n_cols) { arrayops::copy(out.colptr(col), A.colptr(col), n_rows); } } } } op_trimatu_ext::fill_zeros(out, row_offset, col_offset); } template inline void op_trimatu_ext::fill_zeros(Mat& out, const uword row_offset, const uword col_offset) { arma_extra_debug_sigprint(); const uword n_rows = out.n_rows; const uword n_cols = out.n_cols; const uword N = (std::min)(n_rows - row_offset, n_cols - col_offset); for(uword col=0; col < col_offset; ++col) { arrayops::fill_zeros(out.colptr(col), n_rows); } for(uword i=0; i < N; ++i) { const uword start_row = i + row_offset + 1; const uword col = i + col_offset; for(uword row=start_row; row < n_rows; ++row) { out.at(row,col) = eT(0); } } } // template inline void op_trimatl_ext::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap tmp(in.m); const Mat& A = tmp.M; arma_debug_check( (A.is_square() == false), "trimatl(): given matrix must be square sized" ); const uword row_offset = in.aux_uword_a; const uword col_offset = in.aux_uword_b; const uword n_rows = A.n_rows; const uword n_cols = A.n_cols; arma_debug_check_bounds( ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)), "trimatl(): requested diagonal is out of bounds" ); if(&out != &A) { out.copy_size(A); const uword N = (std::min)(n_rows - row_offset, n_cols - col_offset); for(uword col=0; col < col_offset; ++col) { arrayops::copy( out.colptr(col), A.colptr(col), n_rows ); } for(uword i=0; i inline void op_trimatl_ext::fill_zeros(Mat& out, const uword row_offset, const uword col_offset) { arma_extra_debug_sigprint(); const uword n_rows = out.n_rows; const uword n_cols = out.n_cols; const uword N = (std::min)(n_rows - row_offset, n_cols - col_offset); for(uword i=0; i < n_cols; ++i) { const uword col = i + col_offset; if(i < N) { const uword end_row = i + row_offset; for(uword row=0; row < end_row; ++row) { out.at(row,col) = eT(0); } } else { if(col < n_cols) { arrayops::fill_zeros(out.colptr(col), n_rows); } } } } //! @} RcppArmadillo/inst/include/armadillo_bits/subview_elem1_bones.hpp0000644000176200001440000000775614124060717025057 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup subview_elem1 //! @{ template class subview_elem1 : public Base< eT, subview_elem1 > { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const Mat fake_m; arma_aligned const Mat& m; arma_aligned const Base& a; protected: arma_inline subview_elem1(const Mat& in_m, const Base& in_a); arma_inline subview_elem1(const Cube& in_q, const Base& in_a); public: inline ~subview_elem1(); inline subview_elem1() = delete; template inline void inplace_op(const eT val); template inline void inplace_op(const subview_elem1& x ); template inline void inplace_op(const Base& x ); arma_inline const Op,op_htrans> t() const; arma_inline const Op,op_htrans> ht() const; arma_inline const Op,op_strans> st() const; inline void replace(const eT old_val, const eT new_val); inline void clean(const pod_type threshold); inline void clamp(const eT min_val, const eT max_val); inline void fill(const eT val); inline void zeros(); inline void ones(); inline void randu(); inline void randn(); inline void operator+= (const eT val); inline void operator-= (const eT val); inline void operator*= (const eT val); inline void operator/= (const eT val); // deliberately returning void template inline void operator_equ(const subview_elem1& x); template inline void operator= (const subview_elem1& x); inline void operator= (const subview_elem1& x); template inline void operator+= (const subview_elem1& x); template inline void operator-= (const subview_elem1& x); template inline void operator%= (const subview_elem1& x); template inline void operator/= (const subview_elem1& x); template inline void operator= (const Base& x); template inline void operator+= (const Base& x); template inline void operator-= (const Base& x); template inline void operator%= (const Base& x); template inline void operator/= (const Base& x); inline static void extract(Mat& out, const subview_elem1& in); template inline static void mat_inplace_op(Mat& out, const subview_elem1& in); inline static void plus_inplace(Mat& out, const subview_elem1& in); inline static void minus_inplace(Mat& out, const subview_elem1& in); inline static void schur_inplace(Mat& out, const subview_elem1& in); inline static void div_inplace(Mat& out, const subview_elem1& in); friend class Mat; friend class Cube; }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_toeplitz_meat.hpp0000644000176200001440000000531214124060717024462 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_toeplitz //! @{ template inline void op_toeplitz::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_check tmp(in.m, out); const Mat& X = tmp.M; arma_debug_check( ((X.is_vec() == false) && (X.is_empty() == false)), "toeplitz(): given object must be a vector" ); const uword N = X.n_elem; const eT* X_mem = X.memptr(); out.set_size(N,N); for(uword col=0; col < N; ++col) { eT* col_mem = out.colptr(col); uword i; i = col; for(uword row=0; row < col; ++row, --i) { col_mem[row] = X_mem[i]; } i = 0; for(uword row=col; row < N; ++row, ++i) { col_mem[row] = X_mem[i]; } } } template inline void op_toeplitz_c::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_check tmp(in.m, out); const Mat& X = tmp.M; arma_debug_check( ((X.is_vec() == false) && (X.is_empty() == false)), "circ_toeplitz(): given object must be a vector" ); const uword N = X.n_elem; const eT* X_mem = X.memptr(); out.set_size(N,N); if(X.is_rowvec()) { for(uword row=0; row < N; ++row) { uword i; i = row; for(uword col=0; col < row; ++col, --i) { out.at(row,col) = X_mem[N-i]; } i = 0; for(uword col=row; col < N; ++col, ++i) { out.at(row,col) = X_mem[i]; } } } else { for(uword col=0; col < N; ++col) { eT* col_mem = out.colptr(col); uword i; i = col; for(uword row=0; row < col; ++row, --i) { col_mem[row] = X_mem[N-i]; } i = 0; for(uword row=col; row < N; ++row, ++i) { col_mem[row] = X_mem[i]; } } } } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_chi2rnd.hpp0000644000176200001440000000657414124060717023133 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_chi2rnd //! @{ arma_warn_unused inline double chi2rnd(const double df) { arma_extra_debug_sigprint(); op_chi2rnd_varying_df generator; return generator(df); } template arma_warn_unused inline typename arma_real_only::result chi2rnd(const eT df) { arma_extra_debug_sigprint(); op_chi2rnd_varying_df generator; return generator(df); } template arma_warn_unused inline typename enable_if2 < (is_arma_type::value && is_real::value), const Op >::result chi2rnd(const T1& expr) { arma_extra_debug_sigprint(); return Op(expr); } template arma_warn_unused inline typename enable_if2 < (is_Mat::value && is_real::value), obj_type >::result chi2rnd(const typename obj_type::elem_type df, const uword n_rows, const uword n_cols) { arma_extra_debug_sigprint(); if(is_Col::value) { arma_debug_check( (n_cols != 1), "chi2rnd(): incompatible size" ); } else if(is_Row::value) { arma_debug_check( (n_rows != 1), "chi2rnd(): incompatible size" ); } obj_type out(n_rows, n_cols, arma_nozeros_indicator()); op_chi2rnd::fill_constant_df(out, df); return out; } template arma_warn_unused inline typename enable_if2 < (is_Mat::value && is_real::value), obj_type >::result chi2rnd(const typename obj_type::elem_type df, const SizeMat& s) { arma_extra_debug_sigprint(); return chi2rnd(df, s.n_rows, s.n_cols); } template arma_warn_unused inline typename enable_if2 < (is_Mat::value && is_real::value), obj_type >::result chi2rnd(const typename obj_type::elem_type df, const uword n_elem) { arma_extra_debug_sigprint(); if(is_Row::value) { return chi2rnd(df, 1, n_elem); } else { return chi2rnd(df, n_elem, 1); } } arma_warn_unused inline mat chi2rnd(const double df, const uword n_rows, const uword n_cols) { arma_extra_debug_sigprint(); return chi2rnd(df, n_rows, n_cols); } arma_warn_unused inline mat chi2rnd(const double df, const SizeMat& s) { arma_extra_debug_sigprint(); return chi2rnd(df, s.n_rows, s.n_cols); } arma_warn_unused inline vec chi2rnd(const double df, const uword n_elem) { arma_extra_debug_sigprint(); return chi2rnd(df, n_elem, 1); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_unique_bones.hpp0000644000176200001440000000351414124060717024300 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_unique //! @{ class op_unique : public traits_op_col { public: template inline static bool apply_helper(Mat& out, const Proxy& P, const bool P_is_row); template inline static void apply(Mat& out, const Op& in); }; class op_unique_vec : public traits_op_passthru { public: template inline static void apply(Mat& out, const Op& in); }; template struct arma_unique_comparator { arma_inline bool operator() (const eT a, const eT b) const { return ( a < b ); } }; template struct arma_unique_comparator< std::complex > { arma_inline bool operator() (const std::complex& a, const std::complex& b) const { const T a_real = a.real(); const T b_real = b.real(); return ( (a_real < b_real) ? true : ((a_real == b_real) ? (a.imag() < b.imag()) : false) ); } }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_logmat.hpp0000644000176200001440000000674414124060717023064 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_logmat //! @{ template arma_warn_unused arma_inline typename enable_if2< (is_supported_blas_type::value && is_cx::no), const mtOp, T1, op_logmat> >::result logmat(const Base& X, const uword n_iters = 100u) { arma_extra_debug_sigprint(); return mtOp, T1, op_logmat>(X.get_ref(), n_iters, uword(0)); } template arma_warn_unused arma_inline typename enable_if2< (is_supported_blas_type::value && is_cx::yes), const Op >::result logmat(const Base& X, const uword n_iters = 100u) { arma_extra_debug_sigprint(); return Op(X.get_ref(), n_iters, uword(0)); } template inline typename enable_if2< (is_supported_blas_type::value && is_cx::no), bool >::result logmat(Mat< std::complex >& Y, const Base& X, const uword n_iters = 100u) { arma_extra_debug_sigprint(); const bool status = op_logmat::apply_direct(Y, X.get_ref(), n_iters); if(status == false) { Y.soft_reset(); arma_debug_warn_level(3, "logmat(): transformation failed"); } return status; } template inline typename enable_if2< (is_supported_blas_type::value && is_cx::yes), bool >::result logmat(Mat& Y, const Base& X, const uword n_iters = 100u) { arma_extra_debug_sigprint(); const bool status = op_logmat_cx::apply_direct(Y, X.get_ref(), n_iters); if(status == false) { Y.soft_reset(); arma_debug_warn_level(3, "logmat(): transformation failed"); } return status; } // template arma_warn_unused arma_inline typename enable_if2< is_supported_blas_type::value, const Op >::result logmat_sympd(const Base& X) { arma_extra_debug_sigprint(); return Op(X.get_ref()); } template inline typename enable_if2< is_supported_blas_type::value, bool >::result logmat_sympd(Mat& Y, const Base& X) { arma_extra_debug_sigprint(); const bool status = op_logmat_sympd::apply_direct(Y, X.get_ref()); if(status == false) { Y.soft_reset(); arma_debug_warn_level(3, "logmat_sympd(): transformation failed"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_DenseGenMatProd_meat.hpp0000644000176200001440000000255414124060717026452 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { template inline DenseGenMatProd::DenseGenMatProd(const Mat& mat_obj) : op_mat(mat_obj) , n_rows(mat_obj.n_rows) , n_cols(mat_obj.n_cols) { arma_extra_debug_sigprint(); } // Perform the matrix-vector multiplication operation \f$y=Ax\f$. // y_out = A * x_in template inline void DenseGenMatProd::perform_op(eT* x_in, eT* y_out) const { arma_extra_debug_sigprint(); const Col x(x_in , n_cols, false, true); Col y(y_out, n_rows, false, true); y = op_mat * x; } } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/fn_randperm.hpp0000644000176200001440000000620614124060717023402 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_randperm //! @{ template inline void internal_randperm_helper(obj_type& x, const uword N, const uword N_keep) { arma_extra_debug_sigprint(); typedef typename obj_type::elem_type eT; // see op_sort_index_bones.hpp for the definition of arma_sort_index_packet typedef arma_sort_index_packet packet; std::vector packet_vec(N); for(uword i=0; i < N; ++i) { packet_vec[i].val = int(arma_rng::randi()); packet_vec[i].index = i; } arma_sort_index_helper_ascend comparator; if(N >= 2) { if(N_keep < N) { typename std::vector::iterator first = packet_vec.begin(); typename std::vector::iterator nth = first + N_keep; typename std::vector::iterator pastlast = packet_vec.end(); std::partial_sort(first, nth, pastlast, comparator); } else { std::sort( packet_vec.begin(), packet_vec.end(), comparator ); } } if(is_Row::value) { x.set_size(1,N_keep); } else { x.set_size(N_keep,1); } eT* x_mem = x.memptr(); for(uword i=0; i < N_keep; ++i) { x_mem[i] = eT( packet_vec[i].index ); } } template arma_warn_unused inline typename enable_if2< is_Mat::value, obj_type >::result randperm(const uword N) { arma_extra_debug_sigprint(); obj_type x; if(N > 0) { internal_randperm_helper(x, N, N); } return x; } arma_warn_unused inline uvec randperm(const uword N) { arma_extra_debug_sigprint(); uvec x; if(N > 0) { internal_randperm_helper(x, N, N); } return x; } template arma_warn_unused inline typename enable_if2< is_Mat::value, obj_type >::result randperm(const uword N, const uword M) { arma_extra_debug_sigprint(); arma_debug_check( (M > N), "randperm(): 'M' must be less than or equal to 'N'" ); obj_type x; if( (N > 0) && (M > 0) ) { internal_randperm_helper(x, N, M); } return x; } arma_warn_unused inline uvec randperm(const uword N, const uword M) { arma_extra_debug_sigprint(); arma_debug_check( (M > N), "randperm(): 'M' must be less than or equal to 'N'" ); uvec x; if( (N > 0) && (M > 0) ) { internal_randperm_helper(x, N, M); } return x; } //! @} RcppArmadillo/inst/include/armadillo_bits/GenCube_bones.hpp0000644000176200001440000000450414124060717023604 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup GenCube //! @{ //! support class for generator functions (eg. zeros, randu, randn, ...) template class GenCube : public BaseCube< eT, GenCube > , public GenSpecialiser::yes, is_same_type::yes, is_same_type::yes, is_same_type::yes> { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool use_at = false; static constexpr bool is_simple = (is_same_type::value) || (is_same_type::value); arma_aligned const uword n_rows; arma_aligned const uword n_cols; arma_aligned const uword n_slices; arma_inline GenCube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices); arma_inline ~GenCube(); arma_inline eT operator[] (const uword i) const; arma_inline eT at (const uword row, const uword col, const uword slice) const; arma_inline eT at_alt (const uword i) const; inline void apply (Cube& out) const; inline void apply_inplace_plus (Cube& out) const; inline void apply_inplace_minus(Cube& out) const; inline void apply_inplace_schur(Cube& out) const; inline void apply_inplace_div (Cube& out) const; inline void apply(subview_cube& out) const; }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_intersect.hpp0000644000176200001440000000316014124060717023566 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_intersect //! @{ template arma_warn_unused inline typename enable_if2 < ( is_arma_type::value && is_arma_type::value && is_same_type::value ), const Glue >::result intersect ( const T1& A, const T2& B ) { arma_extra_debug_sigprint(); return Glue(A, B); } template inline void intersect ( Mat& C, uvec& iA, uvec& iB, const Base& A, const Base& B ) { arma_extra_debug_sigprint(); glue_intersect::apply(C, iA, iB, A.get_ref(), B.get_ref(), true); } //! @} RcppArmadillo/inst/include/armadillo_bits/injector_meat.hpp0000644000176200001440000002564714125053103023734 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup injector //! @{ template arma_cold inline mat_injector_row::mat_injector_row() : n_cols(0) { arma_extra_debug_sigprint(); A.set_size( podarray_prealloc_n_elem::val ); } template arma_cold inline void mat_injector_row::insert(const eT val) const { arma_extra_debug_sigprint(); if(n_cols < A.n_elem) { A[n_cols] = val; ++n_cols; } else { B.set_size(2 * A.n_elem); arrayops::copy(B.memptr(), A.memptr(), n_cols); B[n_cols] = val; ++n_cols; std::swap( access::rw(A.mem), access::rw(B.mem) ); std::swap( access::rw(A.n_elem), access::rw(B.n_elem) ); } } // // // template arma_cold inline mat_injector::mat_injector(T1& in_X, const typename mat_injector::elem_type val) : X(in_X) , n_rows(1) { arma_extra_debug_sigprint(); typedef typename mat_injector::elem_type eT; AA = new podarray< mat_injector_row* >; BB = new podarray< mat_injector_row* >; podarray< mat_injector_row* >& A = *AA; A.set_size(n_rows); for(uword row=0; row; } (*(A[0])).insert(val); } template arma_cold inline mat_injector::mat_injector(T1& in_X, const injector_end_of_row<>& x) : X(in_X) , n_rows(1) { arma_extra_debug_sigprint(); arma_ignore(x); typedef typename mat_injector::elem_type eT; AA = new podarray< mat_injector_row* >; BB = new podarray< mat_injector_row* >; podarray< mat_injector_row* >& A = *AA; A.set_size(n_rows); for(uword row=0; row; } (*this).end_of_row(); } template arma_cold inline mat_injector::~mat_injector() { arma_extra_debug_sigprint(); typedef typename mat_injector::elem_type eT; podarray< mat_injector_row* >& A = *AA; if(n_rows > 0) { uword max_n_cols = (*(A[0])).n_cols; for(uword row=1; row::value) { X.set_size(max_n_rows, max_n_cols); for(uword row=0; row::value) { arma_debug_check( (max_n_rows > 1), "matrix initialisation: incompatible dimensions" ); const uword n_cols = (*(A[0])).n_cols; X.set_size(1, n_cols); arrayops::copy( X.memptr(), (*(A[0])).A.memptr(), n_cols ); } else if(is_Col::value) { const bool is_vec = ( (max_n_rows == 1) || (max_n_cols == 1) ); arma_debug_check( (is_vec == false), "matrix initialisation: incompatible dimensions" ); const uword n_elem = (std::max)(max_n_rows, max_n_cols); X.set_size(n_elem, 1); uword i = 0; for(uword row=0; row arma_cold inline void mat_injector::insert(const typename mat_injector::elem_type val) const { arma_extra_debug_sigprint(); typedef typename mat_injector::elem_type eT; podarray< mat_injector_row* >& A = *AA; (*(A[n_rows-1])).insert(val); } template arma_cold inline void mat_injector::end_of_row() const { arma_extra_debug_sigprint(); typedef typename mat_injector::elem_type eT; podarray< mat_injector_row* >& A = *AA; podarray< mat_injector_row* >& B = *BB; B.set_size( n_rows+1 ); arrayops::copy(B.memptr(), A.memptr(), n_rows); for(uword row=n_rows; row<(n_rows+1); ++row) { B[row] = new mat_injector_row; } std::swap(AA, BB); n_rows += 1; } template arma_cold const mat_injector& operator<<(const mat_injector& ref, const typename mat_injector::elem_type val) { arma_extra_debug_sigprint(); ref.insert(val); return ref; } template arma_cold const mat_injector& operator<<(const mat_injector& ref, const injector_end_of_row<>& x) { arma_extra_debug_sigprint(); arma_ignore(x); ref.end_of_row(); return ref; } //// using a mixture of operator << and , doesn't work yet //// eg. A << 1, 2, 3 << endr //// in the above "3 << endr" requires special handling. //// similarly, special handling is necessary for "endr << 3" //// // template // arma_inline // const mat_injector& // operator,(const mat_injector& ref, const typename mat_injector::elem_type val) // { // arma_extra_debug_sigprint(); // // ref.insert(val); // // return ref; // } // template // arma_inline // const mat_injector& // operator,(const mat_injector& ref, const injector_end_of_row<>& x) // { // arma_extra_debug_sigprint(); // arma_ignore(x); // // ref.end_of_row(); // // return ref; // } // // // template arma_cold inline field_injector_row::field_injector_row() : n_cols(0) { arma_extra_debug_sigprint(); AA = new field; BB = new field; field& A = *AA; A.set_size( field_prealloc_n_elem::val ); } template arma_cold inline field_injector_row::~field_injector_row() { arma_extra_debug_sigprint(); delete AA; delete BB; } template arma_cold inline void field_injector_row::insert(const oT& val) const { arma_extra_debug_sigprint(); field& A = *AA; field& B = *BB; if(n_cols < A.n_elem) { A[n_cols] = val; ++n_cols; } else { B.set_size(2 * A.n_elem); for(uword i=0; i arma_cold inline field_injector::field_injector(T1& in_X, const typename field_injector::object_type& val) : X(in_X) , n_rows(1) { arma_extra_debug_sigprint(); typedef typename field_injector::object_type oT; AA = new podarray< field_injector_row* >; BB = new podarray< field_injector_row* >; podarray< field_injector_row* >& A = *AA; A.set_size(n_rows); for(uword row=0; row; } (*(A[0])).insert(val); } template arma_cold inline field_injector::field_injector(T1& in_X, const injector_end_of_row<>& x) : X(in_X) , n_rows(1) { arma_extra_debug_sigprint(); arma_ignore(x); typedef typename field_injector::object_type oT; AA = new podarray< field_injector_row* >; BB = new podarray< field_injector_row* >; podarray< field_injector_row* >& A = *AA; A.set_size(n_rows); for(uword row=0; row; } (*this).end_of_row(); } template arma_cold inline field_injector::~field_injector() { arma_extra_debug_sigprint(); typedef typename field_injector::object_type oT; podarray< field_injector_row* >& A = *AA; if(n_rows > 0) { uword max_n_cols = (*(A[0])).n_cols; for(uword row=1; row& tmp = *((*(A[row])).AA); X.at(row,col) = tmp[col]; } for(uword col=n_cols; col arma_cold inline void field_injector::insert(const typename field_injector::object_type& val) const { arma_extra_debug_sigprint(); typedef typename field_injector::object_type oT; podarray< field_injector_row* >& A = *AA; (*(A[n_rows-1])).insert(val); } template arma_cold inline void field_injector::end_of_row() const { arma_extra_debug_sigprint(); typedef typename field_injector::object_type oT; podarray< field_injector_row* >& A = *AA; podarray< field_injector_row* >& B = *BB; B.set_size( n_rows+1 ); for(uword row=0; row; } std::swap(AA, BB); n_rows += 1; } template arma_cold const field_injector& operator<<(const field_injector& ref, const typename field_injector::object_type& val) { arma_extra_debug_sigprint(); ref.insert(val); return ref; } template arma_cold const field_injector& operator<<(const field_injector& ref, const injector_end_of_row<>& x) { arma_extra_debug_sigprint(); arma_ignore(x); ref.end_of_row(); return ref; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_det_meat.hpp0000644000176200001440000001540314124060717023366 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_det //! @{ template inline bool op_det::apply_direct(typename T1::elem_type& out_val, const Base& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; if(strip_diagmat::do_diagmat) { const strip_diagmat strip(expr.get_ref()); out_val = op_det::apply_diagmat(strip.M); return true; } if(strip_trimat::do_trimat) { const strip_trimat strip(expr.get_ref()); out_val = op_det::apply_trimat(strip.M); return true; } Mat A(expr.get_ref()); arma_debug_check( (A.is_square() == false), "det(): given matrix must be square sized" ); if((A.n_rows <= 4) && is_cx::no) { constexpr T det_min = std::numeric_limits::epsilon(); constexpr T det_max = T(1) / std::numeric_limits::epsilon(); const eT det_val = op_det::apply_tiny(A); const T abs_det_val = std::abs(det_val); if((abs_det_val > det_min) && (abs_det_val < det_max)) { out_val = det_val; return true; } // fallthrough if det_val is suspect } if(A.is_diagmat()) { out_val = op_det::apply_diagmat(A); return true; } const bool is_triu = trimat_helper::is_triu(A); const bool is_tril = is_triu ? false : trimat_helper::is_tril(A); if(is_triu || is_tril) { out_val = op_det::apply_trimat(A); return true; } return auxlib::det(out_val, A); } template inline typename T1::elem_type op_det::apply_diagmat(const Base& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const diagmat_proxy A(expr.get_ref()); arma_debug_check( (A.n_rows != A.n_cols), "det(): given matrix must be square sized" ); const uword N = (std::min)(A.n_rows, A.n_cols); eT val = eT(1); for(uword i=0; i inline typename T1::elem_type op_det::apply_trimat(const Base& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy P(expr.get_ref()); const uword N = P.get_n_rows(); arma_debug_check( (N != P.get_n_cols()), "det(): given matrix must be square sized" ); eT val = eT(1); for(uword i=0; i arma_cold inline eT op_det::apply_tiny(const Mat& X) { arma_extra_debug_sigprint(); // NOTE: assuming matrix X is square sized const uword N = X.n_rows; const eT* Xm = X.memptr(); if(N == 0) { return eT(1); } if(N == 1) { return Xm[0]; } if(N == 2) { return ( Xm[pos<0,0>::n2]*Xm[pos<1,1>::n2] - Xm[pos<0,1>::n2]*Xm[pos<1,0>::n2] ); } if(N == 3) { // const double tmp1 = X.at(0,0) * X.at(1,1) * X.at(2,2); // const double tmp2 = X.at(0,1) * X.at(1,2) * X.at(2,0); // const double tmp3 = X.at(0,2) * X.at(1,0) * X.at(2,1); // const double tmp4 = X.at(2,0) * X.at(1,1) * X.at(0,2); // const double tmp5 = X.at(2,1) * X.at(1,2) * X.at(0,0); // const double tmp6 = X.at(2,2) * X.at(1,0) * X.at(0,1); // return (tmp1+tmp2+tmp3) - (tmp4+tmp5+tmp6); const eT val1 = Xm[pos<0,0>::n3]*(Xm[pos<2,2>::n3]*Xm[pos<1,1>::n3] - Xm[pos<2,1>::n3]*Xm[pos<1,2>::n3]); const eT val2 = Xm[pos<1,0>::n3]*(Xm[pos<2,2>::n3]*Xm[pos<0,1>::n3] - Xm[pos<2,1>::n3]*Xm[pos<0,2>::n3]); const eT val3 = Xm[pos<2,0>::n3]*(Xm[pos<1,2>::n3]*Xm[pos<0,1>::n3] - Xm[pos<1,1>::n3]*Xm[pos<0,2>::n3]); return ( val1 - val2 + val3 ); } if(N == 4) { const eT val_03_12 = Xm[pos<0,3>::n4] * Xm[pos<1,2>::n4]; const eT val_02_13 = Xm[pos<0,2>::n4] * Xm[pos<1,3>::n4]; const eT val_03_11 = Xm[pos<0,3>::n4] * Xm[pos<1,1>::n4]; const eT val_01_13 = Xm[pos<0,1>::n4] * Xm[pos<1,3>::n4]; const eT val_02_11 = Xm[pos<0,2>::n4] * Xm[pos<1,1>::n4]; const eT val_01_12 = Xm[pos<0,1>::n4] * Xm[pos<1,2>::n4]; const eT val_03_10 = Xm[pos<0,3>::n4] * Xm[pos<1,0>::n4]; const eT val_00_13 = Xm[pos<0,0>::n4] * Xm[pos<1,3>::n4]; const eT val_02_10 = Xm[pos<0,2>::n4] * Xm[pos<1,0>::n4]; const eT val_00_12 = Xm[pos<0,0>::n4] * Xm[pos<1,2>::n4]; const eT val_01_10 = Xm[pos<0,1>::n4] * Xm[pos<1,0>::n4]; const eT val_00_11 = Xm[pos<0,0>::n4] * Xm[pos<1,1>::n4]; const eT val_21_30 = Xm[pos<2,1>::n4] * Xm[pos<3,0>::n4]; const eT val_22_30 = Xm[pos<2,2>::n4] * Xm[pos<3,0>::n4]; const eT val_23_30 = Xm[pos<2,3>::n4] * Xm[pos<3,0>::n4]; const eT val_20_31 = Xm[pos<2,0>::n4] * Xm[pos<3,1>::n4]; const eT val_22_31 = Xm[pos<2,2>::n4] * Xm[pos<3,1>::n4]; const eT val_23_31 = Xm[pos<2,3>::n4] * Xm[pos<3,1>::n4]; const eT val_20_32 = Xm[pos<2,0>::n4] * Xm[pos<3,2>::n4]; const eT val_21_32 = Xm[pos<2,1>::n4] * Xm[pos<3,2>::n4]; const eT val_23_32 = Xm[pos<2,3>::n4] * Xm[pos<3,2>::n4]; const eT val_20_33 = Xm[pos<2,0>::n4] * Xm[pos<3,3>::n4]; const eT val_21_33 = Xm[pos<2,1>::n4] * Xm[pos<3,3>::n4]; const eT val_22_33 = Xm[pos<2,2>::n4] * Xm[pos<3,3>::n4]; const eT val = \ val_03_12 * val_21_30 \ - val_02_13 * val_21_30 \ - val_03_11 * val_22_30 \ + val_01_13 * val_22_30 \ + val_02_11 * val_23_30 \ - val_01_12 * val_23_30 \ - val_03_12 * val_20_31 \ + val_02_13 * val_20_31 \ + val_03_10 * val_22_31 \ - val_00_13 * val_22_31 \ - val_02_10 * val_23_31 \ + val_00_12 * val_23_31 \ + val_03_11 * val_20_32 \ - val_01_13 * val_20_32 \ - val_03_10 * val_21_32 \ + val_00_13 * val_21_32 \ + val_01_10 * val_23_32 \ - val_00_11 * val_23_32 \ - val_02_11 * val_20_33 \ + val_01_12 * val_20_33 \ + val_02_10 * val_21_33 \ - val_00_12 * val_21_33 \ - val_01_10 * val_22_33 \ + val_00_11 * val_22_33 \ ; return val; } return eT(0); } //! @} RcppArmadillo/inst/include/armadillo_bits/subview_cube_bones.hpp0000644000176200001440000002232614124060717024760 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup subview_cube //! @{ //! Class for storing data required to construct or apply operations to a subcube //! (ie. where the subcube starts and ends as well as a reference/pointer to the original cube), template class subview_cube : public BaseCube< eT, subview_cube > { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; arma_aligned const Cube& m; const uword aux_row1; const uword aux_col1; const uword aux_slice1; const uword n_rows; const uword n_cols; const uword n_elem_slice; const uword n_slices; const uword n_elem; protected: arma_inline subview_cube(const Cube& in_m, const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_n_rows, const uword in_n_cols, const uword in_n_slices); public: inline ~subview_cube(); inline subview_cube() = delete; inline subview_cube(const subview_cube& in); inline subview_cube( subview_cube&& in); template inline void inplace_op(const eT val ); template inline void inplace_op(const BaseCube& x, const char* identifier); template inline void inplace_op(const subview_cube& x, const char* identifier); inline void operator= (const eT val); inline void operator+= (const eT val); inline void operator-= (const eT val); inline void operator*= (const eT val); inline void operator/= (const eT val); // deliberately returning void template inline void operator= (const BaseCube& x); template inline void operator+= (const BaseCube& x); template inline void operator-= (const BaseCube& x); template inline void operator%= (const BaseCube& x); template inline void operator/= (const BaseCube& x); inline void operator= (const subview_cube& x); inline void operator+= (const subview_cube& x); inline void operator-= (const subview_cube& x); inline void operator%= (const subview_cube& x); inline void operator/= (const subview_cube& x); template inline void operator= (const Base& x); template inline void operator+= (const Base& x); template inline void operator-= (const Base& x); template inline void operator%= (const Base& x); template inline void operator/= (const Base& x); template inline void operator=(const GenCube& x); inline static void extract(Cube& out, const subview_cube& in); inline static void plus_inplace(Cube& out, const subview_cube& in); inline static void minus_inplace(Cube& out, const subview_cube& in); inline static void schur_inplace(Cube& out, const subview_cube& in); inline static void div_inplace(Cube& out, const subview_cube& in); inline static void extract(Mat& out, const subview_cube& in); inline static void plus_inplace(Mat& out, const subview_cube& in); inline static void minus_inplace(Mat& out, const subview_cube& in); inline static void schur_inplace(Mat& out, const subview_cube& in); inline static void div_inplace(Mat& out, const subview_cube& in); template inline void for_each(functor F); template inline void for_each(functor F) const; template inline void transform(functor F); template inline void imbue(functor F); inline void each_slice(const std::function< void( Mat&) >& F); inline void each_slice(const std::function< void(const Mat&) >& F) const; inline void replace(const eT old_val, const eT new_val); inline void clean(const pod_type threshold); inline void clamp(const eT min_val, const eT max_val); inline void fill(const eT val); inline void zeros(); inline void ones(); inline void randu(); inline void randn(); inline arma_warn_unused bool is_finite() const; inline arma_warn_unused bool is_zero(const pod_type tol = 0) const; inline arma_warn_unused bool has_inf() const; inline arma_warn_unused bool has_nan() const; inline eT at_alt (const uword i) const; inline eT& operator[](const uword i); inline eT operator[](const uword i) const; inline eT& operator()(const uword i); inline eT operator()(const uword i) const; arma_inline eT& operator()(const uword in_row, const uword in_col, const uword in_slice); arma_inline eT operator()(const uword in_row, const uword in_col, const uword in_slice) const; arma_inline eT& at(const uword in_row, const uword in_col, const uword in_slice); arma_inline eT at(const uword in_row, const uword in_col, const uword in_slice) const; arma_inline eT* slice_colptr(const uword in_slice, const uword in_col); arma_inline const eT* slice_colptr(const uword in_slice, const uword in_col) const; template inline bool check_overlap(const subview_cube& x) const; inline bool check_overlap(const Mat& x) const; class const_iterator; class iterator { public: inline iterator(); inline iterator(const iterator& X); inline iterator(subview_cube& in_sv, const uword in_row, const uword in_col, const uword in_slice); inline arma_warn_unused eT& operator*(); inline iterator& operator++(); inline arma_warn_unused iterator operator++(int); inline arma_warn_unused bool operator==(const iterator& rhs) const; inline arma_warn_unused bool operator!=(const iterator& rhs) const; inline arma_warn_unused bool operator==(const const_iterator& rhs) const; inline arma_warn_unused bool operator!=(const const_iterator& rhs) const; typedef std::forward_iterator_tag iterator_category; typedef eT value_type; typedef std::ptrdiff_t difference_type; // TODO: not certain on this one typedef eT* pointer; typedef eT& reference; arma_aligned Cube* M; arma_aligned eT* current_ptr; arma_aligned uword current_row; arma_aligned uword current_col; arma_aligned uword current_slice; arma_aligned const uword aux_row1; arma_aligned const uword aux_col1; arma_aligned const uword aux_row2_p1; arma_aligned const uword aux_col2_p1; }; class const_iterator { public: inline const_iterator(); inline const_iterator(const iterator& X); inline const_iterator(const const_iterator& X); inline const_iterator(const subview_cube& in_sv, const uword in_row, const uword in_col, const uword in_slice); inline arma_warn_unused const eT& operator*(); inline const_iterator& operator++(); inline arma_warn_unused const_iterator operator++(int); inline arma_warn_unused bool operator==(const iterator& rhs) const; inline arma_warn_unused bool operator!=(const iterator& rhs) const; inline arma_warn_unused bool operator==(const const_iterator& rhs) const; inline arma_warn_unused bool operator!=(const const_iterator& rhs) const; // So that we satisfy the STL iterator types. typedef std::forward_iterator_tag iterator_category; typedef eT value_type; typedef std::ptrdiff_t difference_type; // TODO: not certain on this one typedef const eT* pointer; typedef const eT& reference; arma_aligned const Cube* M; arma_aligned const eT* current_ptr; arma_aligned uword current_row; arma_aligned uword current_col; arma_aligned uword current_slice; arma_aligned const uword aux_row1; arma_aligned const uword aux_col1; arma_aligned const uword aux_row2_p1; arma_aligned const uword aux_col2_p1; }; inline iterator begin(); inline const_iterator begin() const; inline const_iterator cbegin() const; inline iterator end(); inline const_iterator end() const; inline const_iterator cend() const; friend class Mat; friend class Cube; }; //! @} RcppArmadillo/inst/include/armadillo_bits/gmm_diag_bones.hpp0000644000176200001440000001613214124060717024040 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup gmm_diag //! @{ namespace gmm_priv { template class gmm_diag { public: arma_aligned const Mat means; arma_aligned const Mat dcovs; arma_aligned const Row hefts; // // inline ~gmm_diag(); inline gmm_diag(); inline gmm_diag(const gmm_diag& x); inline gmm_diag& operator=(const gmm_diag& x); inline explicit gmm_diag(const gmm_full& x); inline gmm_diag& operator=(const gmm_full& x); inline gmm_diag(const uword in_n_dims, const uword in_n_gaus); inline void reset(const uword in_n_dims, const uword in_n_gaus); inline void reset(); template inline void set_params(const Base& in_means, const Base& in_dcovs, const Base& in_hefts); template inline void set_means(const Base& in_means); template inline void set_dcovs(const Base& in_dcovs); template inline void set_hefts(const Base& in_hefts); inline uword n_dims() const; inline uword n_gaus() const; inline bool load(const std::string name); inline bool save(const std::string name) const; inline Col generate() const; inline Mat generate(const uword N) const; template inline eT log_p(const T1& expr, const gmm_empty_arg& junk1 = gmm_empty_arg(), typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == true ))>::result* junk2 = nullptr) const; template inline eT log_p(const T1& expr, const uword gaus_id, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == true ))>::result* junk2 = nullptr) const; template inline Row log_p(const T1& expr, const gmm_empty_arg& junk1 = gmm_empty_arg(), typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == false))>::result* junk2 = nullptr) const; template inline Row log_p(const T1& expr, const uword gaus_id, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == false))>::result* junk2 = nullptr) const; template inline eT sum_log_p(const Base& expr) const; template inline eT sum_log_p(const Base& expr, const uword gaus_id) const; template inline eT avg_log_p(const Base& expr) const; template inline eT avg_log_p(const Base& expr, const uword gaus_id) const; template inline uword assign(const T1& expr, const gmm_dist_mode& dist, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == true ))>::result* junk = nullptr) const; template inline urowvec assign(const T1& expr, const gmm_dist_mode& dist, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == false))>::result* junk = nullptr) const; template inline urowvec raw_hist(const Base& expr, const gmm_dist_mode& dist_mode) const; template inline Row norm_hist(const Base& expr, const gmm_dist_mode& dist_mode) const; template inline bool learn ( const Base& data, const uword n_gaus, const gmm_dist_mode& dist_mode, const gmm_seed_mode& seed_mode, const uword km_iter, const uword em_iter, const eT var_floor, const bool print_mode ); template inline bool kmeans_wrapper ( Mat& user_means, const Base& data, const uword n_gaus, const gmm_seed_mode& seed_mode, const uword km_iter, const bool print_mode ); // protected: arma_aligned Mat inv_dcovs; arma_aligned Row log_det_etc; arma_aligned Row log_hefts; arma_aligned Col mah_aux; // inline void init(const gmm_diag& x); inline void init(const gmm_full& x); inline void init(const uword in_n_dim, const uword in_n_gaus); inline void init_constants(); inline umat internal_gen_boundaries(const uword N) const; inline eT internal_scalar_log_p(const eT* x ) const; inline eT internal_scalar_log_p(const eT* x, const uword gaus_id) const; inline Row internal_vec_log_p(const Mat& X ) const; inline Row internal_vec_log_p(const Mat& X, const uword gaus_id) const; inline eT internal_sum_log_p(const Mat& X ) const; inline eT internal_sum_log_p(const Mat& X, const uword gaus_id) const; inline eT internal_avg_log_p(const Mat& X ) const; inline eT internal_avg_log_p(const Mat& X, const uword gaus_id) const; inline uword internal_scalar_assign(const Mat& X, const gmm_dist_mode& dist_mode) const; inline void internal_vec_assign(urowvec& out, const Mat& X, const gmm_dist_mode& dist_mode) const; inline void internal_raw_hist(urowvec& hist, const Mat& X, const gmm_dist_mode& dist_mode) const; // template inline void generate_initial_means(const Mat& X, const gmm_seed_mode& seed); template inline void generate_initial_params(const Mat& X, const eT var_floor); template inline bool km_iterate(const Mat& X, const uword max_iter, const bool verbose, const char* signature); // inline bool em_iterate(const Mat& X, const uword max_iter, const eT var_floor, const bool verbose); inline void em_update_params(const Mat& X, const umat& boundaries, field< Mat >& t_acc_means, field< Mat >& t_acc_dcovs, field< Col >& t_acc_norm_lhoods, field< Col >& t_gaus_log_lhoods, Col& t_progress_log_lhoods); inline void em_generate_acc(const Mat& X, const uword start_index, const uword end_index, Mat& acc_means, Mat& acc_dcovs, Col& acc_norm_lhoods, Col& gaus_log_lhoods, eT& progress_log_lhood) const; inline void em_fix_params(const eT var_floor); }; } typedef gmm_priv::gmm_diag gmm_diag; typedef gmm_priv::gmm_diag fgmm_diag; //! @} RcppArmadillo/inst/include/armadillo_bits/op_repmat_bones.hpp0000644000176200001440000000225014124060717024256 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_repmat //! @{ class op_repmat : public traits_op_default { public: template inline static void apply_noalias(Mat& out, const obj& X, const uword copies_per_row, const uword copies_per_col); template inline static void apply(Mat& out, const Op& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/SpMat_bones.hpp0000644000176200001440000010506114124060717023320 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpMat //! @{ //! Sparse matrix class, with data stored in compressed sparse column (CSC) format template class SpMat : public SpBase< eT, SpMat > { public: typedef eT elem_type; //!< the type of elements stored in the matrix typedef typename get_pod_type::result pod_type; //!< if eT is std::complex, pod_type is T; otherwise pod_type is eT static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; const uword n_rows; //!< number of rows (read-only) const uword n_cols; //!< number of columns (read-only) const uword n_elem; //!< number of elements (read-only) const uword n_nonzero; //!< number of nonzero elements (read-only) const uword vec_state; //!< 0: matrix; 1: column vector; 2: row vector // The memory used to store the values of the matrix. // In accordance with the CSC format, this stores only the actual values. // The correct locations of the values are assembled from the row indices and column pointers. // // The length of this array is (n_nonzero + 1). // The final value values[n_nonzero] must be zero to ensure integrity of iterators. // Use mem_resize(new_n_nonzero) to resize this array. // // WARNING: the 'values' array is only valid after sync() is called; // WARNING: there is a separate cache for fast element insertion arma_aligned const eT* const values; // The row indices of each value. row_indices[i] is the row of values[i]. // // The length of this array is (n_nonzero + 1). // The final value row_indices[n_nonzero] must be zero to ensure integrity of iterators. // Use mem_resize(new_n_nonzero) to resize this array. // // WARNING: the 'row_indices' array is only valid after sync() is called; // WARNING: there is a separate cache for fast element insertion arma_aligned const uword* const row_indices; // The column pointers. This stores the index of the first item in column i. // That is, values[col_ptrs[i]] is the first value in column i, // and it is in the row indicated by row_indices[col_ptrs[i]]. // // The length of this array is (n_cols + 2). // The element col_ptrs[n_cols] must be equal to n_nonzero. // The element col_ptrs[n_cols + 1] must be an invalid very large value to ensure integrity of iterators. // // The col_ptrs array is set by the init() function // (which is called by constructors, set_size() and other functions that change the matrix size). // // WARNING: the 'col_ptrs' array is only valid after sync() is called; // WARNING: there is a separate cache for fast element insertion arma_aligned const uword* const col_ptrs; inline SpMat(); inline ~SpMat(); inline explicit SpMat(const uword in_rows, const uword in_cols); inline explicit SpMat(const SizeMat& s); inline SpMat(const char* text); inline SpMat& operator=(const char* text); inline SpMat(const std::string& text); inline SpMat& operator=(const std::string& text); inline SpMat(const SpMat& x); inline SpMat(SpMat&& m); inline SpMat& operator=(SpMat&& m); inline explicit SpMat(const MapMat& x); inline SpMat& operator= (const MapMat& x); template inline SpMat(const Base& rowind, const Base& colptr, const Base& values, const uword n_rows, const uword n_cols); template inline SpMat(const Base& locations, const Base& values, const bool sort_locations = true); template inline SpMat(const Base& locations, const Base& values, const uword n_rows, const uword n_cols, const bool sort_locations = true, const bool check_for_zeros = true); template inline SpMat(const bool add_values, const Base& locations, const Base& values, const uword n_rows, const uword n_cols, const bool sort_locations = true, const bool check_for_zeros = true); inline SpMat& operator= (const eT val); //! sets size to 1x1 inline SpMat& operator*=(const eT val); inline SpMat& operator/=(const eT val); // operator+=(val) and operator-=(val) are not defined as they don't make sense for sparse matrices inline SpMat& operator= (const SpMat& m); inline SpMat& operator+=(const SpMat& m); inline SpMat& operator-=(const SpMat& m); inline SpMat& operator*=(const SpMat& m); inline SpMat& operator%=(const SpMat& m); inline SpMat& operator/=(const SpMat& m); template inline explicit SpMat(const Base& m); template inline SpMat& operator= (const Base& m); template inline SpMat& operator+=(const Base& m); template inline SpMat& operator-=(const Base& m); template inline SpMat& operator*=(const Base& m); template inline SpMat& operator/=(const Base& m); template inline SpMat& operator%=(const Base& m); template inline explicit SpMat(const Op& expr); template inline SpMat& operator= (const Op& expr); template inline SpMat& operator+=(const Op& expr); template inline SpMat& operator-=(const Op& expr); template inline SpMat& operator*=(const Op& expr); template inline SpMat& operator/=(const Op& expr); template inline SpMat& operator%=(const Op& expr); //! explicit specification of sparse +/- scalar template inline explicit SpMat(const SpToDOp& expr); //! construction of complex matrix out of two non-complex matrices template inline explicit SpMat(const SpBase& A, const SpBase& B); inline SpMat(const SpSubview& X); inline SpMat& operator= (const SpSubview& X); inline SpMat& operator+=(const SpSubview& X); inline SpMat& operator-=(const SpSubview& X); inline SpMat& operator*=(const SpSubview& X); inline SpMat& operator%=(const SpSubview& X); inline SpMat& operator/=(const SpSubview& X); template inline SpMat(const SpSubview_col_list& X); template inline SpMat& operator= (const SpSubview_col_list& X); template inline SpMat& operator+=(const SpSubview_col_list& X); template inline SpMat& operator-=(const SpSubview_col_list& X); template inline SpMat& operator*=(const SpSubview_col_list& X); template inline SpMat& operator%=(const SpSubview_col_list& X); template inline SpMat& operator/=(const SpSubview_col_list& X); inline SpMat(const spdiagview& X); inline SpMat& operator= (const spdiagview& X); inline SpMat& operator+=(const spdiagview& X); inline SpMat& operator-=(const spdiagview& X); inline SpMat& operator*=(const spdiagview& X); inline SpMat& operator%=(const spdiagview& X); inline SpMat& operator/=(const spdiagview& X); // delayed unary ops template inline SpMat(const SpOp& X); template inline SpMat& operator= (const SpOp& X); template inline SpMat& operator+=(const SpOp& X); template inline SpMat& operator-=(const SpOp& X); template inline SpMat& operator*=(const SpOp& X); template inline SpMat& operator%=(const SpOp& X); template inline SpMat& operator/=(const SpOp& X); // delayed binary ops template inline SpMat(const SpGlue& X); template inline SpMat& operator= (const SpGlue& X); template inline SpMat& operator+=(const SpGlue& X); template inline SpMat& operator-=(const SpGlue& X); template inline SpMat& operator*=(const SpGlue& X); template inline SpMat& operator%=(const SpGlue& X); template inline SpMat& operator/=(const SpGlue& X); // delayed mixed-type unary ops template inline SpMat(const mtSpOp& X); template inline SpMat& operator= (const mtSpOp& X); template inline SpMat& operator+=(const mtSpOp& X); template inline SpMat& operator-=(const mtSpOp& X); template inline SpMat& operator*=(const mtSpOp& X); template inline SpMat& operator%=(const mtSpOp& X); template inline SpMat& operator/=(const mtSpOp& X); // delayed mixed-type binary ops template inline SpMat(const mtSpGlue& X); template inline SpMat& operator= (const mtSpGlue& X); template inline SpMat& operator+=(const mtSpGlue& X); template inline SpMat& operator-=(const mtSpGlue& X); template inline SpMat& operator*=(const mtSpGlue& X); template inline SpMat& operator%=(const mtSpGlue& X); template inline SpMat& operator/=(const mtSpGlue& X); arma_inline SpSubview_row row(const uword row_num); arma_inline const SpSubview_row row(const uword row_num) const; inline SpSubview_row operator()(const uword row_num, const span& col_span); inline const SpSubview_row operator()(const uword row_num, const span& col_span) const; arma_inline SpSubview_col col(const uword col_num); arma_inline const SpSubview_col col(const uword col_num) const; inline SpSubview_col operator()(const span& row_span, const uword col_num); inline const SpSubview_col operator()(const span& row_span, const uword col_num) const; arma_inline SpSubview rows(const uword in_row1, const uword in_row2); arma_inline const SpSubview rows(const uword in_row1, const uword in_row2) const; arma_inline SpSubview cols(const uword in_col1, const uword in_col2); arma_inline const SpSubview cols(const uword in_col1, const uword in_col2) const; arma_inline SpSubview submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2); arma_inline const SpSubview submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const; arma_inline SpSubview submat(const uword in_row1, const uword in_col1, const SizeMat& s); arma_inline const SpSubview submat(const uword in_row1, const uword in_col1, const SizeMat& s) const; inline SpSubview submat (const span& row_span, const span& col_span); inline const SpSubview submat (const span& row_span, const span& col_span) const; inline SpSubview operator()(const span& row_span, const span& col_span); inline const SpSubview operator()(const span& row_span, const span& col_span) const; arma_inline SpSubview operator()(const uword in_row1, const uword in_col1, const SizeMat& s); arma_inline const SpSubview operator()(const uword in_row1, const uword in_col1, const SizeMat& s) const; inline SpSubview head_rows(const uword N); inline const SpSubview head_rows(const uword N) const; inline SpSubview tail_rows(const uword N); inline const SpSubview tail_rows(const uword N) const; inline SpSubview head_cols(const uword N); inline const SpSubview head_cols(const uword N) const; inline SpSubview tail_cols(const uword N); inline const SpSubview tail_cols(const uword N) const; template arma_inline SpSubview_col_list cols(const Base& ci); template arma_inline const SpSubview_col_list cols(const Base& ci) const; inline spdiagview diag(const sword in_id = 0); inline const spdiagview diag(const sword in_id = 0) const; inline void swap_rows(const uword in_row1, const uword in_row2); inline void swap_cols(const uword in_col1, const uword in_col2); inline void shed_row(const uword row_num); inline void shed_col(const uword col_num); inline void shed_rows(const uword in_row1, const uword in_row2); inline void shed_cols(const uword in_col1, const uword in_col2); // access the i-th element; if there is nothing at element i, 0 is returned arma_inline arma_warn_unused SpMat_MapMat_val operator[] (const uword i); arma_inline arma_warn_unused eT operator[] (const uword i) const; arma_inline arma_warn_unused SpMat_MapMat_val at (const uword i); arma_inline arma_warn_unused eT at (const uword i) const; arma_inline arma_warn_unused SpMat_MapMat_val operator() (const uword i); arma_inline arma_warn_unused eT operator() (const uword i) const; // access the element at the given row and column; if there is nothing at that position, 0 is returned arma_inline arma_warn_unused SpMat_MapMat_val at (const uword in_row, const uword in_col); arma_inline arma_warn_unused eT at (const uword in_row, const uword in_col) const; arma_inline arma_warn_unused SpMat_MapMat_val operator() (const uword in_row, const uword in_col); arma_inline arma_warn_unused eT operator() (const uword in_row, const uword in_col) const; arma_inline arma_warn_unused bool is_empty() const; arma_inline arma_warn_unused bool is_vec() const; arma_inline arma_warn_unused bool is_rowvec() const; arma_inline arma_warn_unused bool is_colvec() const; arma_inline arma_warn_unused bool is_square() const; inline arma_warn_unused bool is_finite() const; inline arma_warn_unused bool is_symmetric() const; inline arma_warn_unused bool is_symmetric(const typename get_pod_type::result tol) const; inline arma_warn_unused bool is_hermitian() const; inline arma_warn_unused bool is_hermitian(const typename get_pod_type::result tol) const; inline arma_warn_unused bool has_inf() const; inline arma_warn_unused bool has_nan() const; arma_inline arma_warn_unused bool in_range(const uword i) const; arma_inline arma_warn_unused bool in_range(const span& x) const; arma_inline arma_warn_unused bool in_range(const uword in_row, const uword in_col) const; arma_inline arma_warn_unused bool in_range(const span& row_span, const uword in_col) const; arma_inline arma_warn_unused bool in_range(const uword in_row, const span& col_span) const; arma_inline arma_warn_unused bool in_range(const span& row_span, const span& col_span) const; arma_inline arma_warn_unused bool in_range(const uword in_row, const uword in_col, const SizeMat& s) const; template inline void copy_size(const SpMat& m); template inline void copy_size(const Mat& m); inline void set_size(const uword in_elem); inline void set_size(const uword in_rows, const uword in_cols); inline void set_size(const SizeMat& s); inline void resize(const uword in_rows, const uword in_cols); inline void resize(const SizeMat& s); inline void reshape(const uword in_rows, const uword in_cols); inline void reshape(const SizeMat& s); inline void reshape_helper_generic(const uword in_rows, const uword in_cols); //! internal use only inline void reshape_helper_intovec(); //! internal use only template inline const SpMat& for_each(functor F); template inline const SpMat& for_each(functor F) const; template inline const SpMat& transform(functor F); inline const SpMat& replace(const eT old_val, const eT new_val); inline const SpMat& clean(const pod_type threshold); inline const SpMat& clamp(const eT min_val, const eT max_val); inline const SpMat& zeros(); inline const SpMat& zeros(const uword in_elem); inline const SpMat& zeros(const uword in_rows, const uword in_cols); inline const SpMat& zeros(const SizeMat& s); inline const SpMat& eye(); inline const SpMat& eye(const uword in_rows, const uword in_cols); inline const SpMat& eye(const SizeMat& s); inline const SpMat& speye(); inline const SpMat& speye(const uword in_rows, const uword in_cols); inline const SpMat& speye(const SizeMat& s); inline const SpMat& sprandu(const uword in_rows, const uword in_cols, const double density); inline const SpMat& sprandu(const SizeMat& s, const double density); inline const SpMat& sprandn(const uword in_rows, const uword in_cols, const double density); inline const SpMat& sprandn(const SizeMat& s, const double density); inline void reset(); inline void reset_cache(); //! don't use this unless you're writing internal Armadillo code inline void reserve(const uword in_rows, const uword in_cols, const uword new_n_nonzero); //! don't use this unless you're writing internal Armadillo code inline SpMat(const arma_reserve_indicator&, const uword in_rows, const uword in_cols, const uword new_n_nonzero); //! don't use this unless you're writing internal Armadillo code template inline SpMat(const arma_layout_indicator&, const SpMat& x); template inline void set_real(const SpBase& X); template inline void set_imag(const SpBase& X); // saving and loading // TODO: implement auto_detect for sparse matrices inline arma_cold bool save(const std::string name, const file_type type = arma_binary) const; inline arma_cold bool save(const csv_name& spec, const file_type type = csv_ascii) const; inline arma_cold bool save( std::ostream& os, const file_type type = arma_binary) const; inline arma_cold bool load(const std::string name, const file_type type = arma_binary); inline arma_cold bool load(const csv_name& spec, const file_type type = csv_ascii); inline arma_cold bool load( std::istream& is, const file_type type = arma_binary); inline arma_cold bool quiet_save(const std::string name, const file_type type = arma_binary) const; inline arma_cold bool quiet_save(const csv_name& spec, const file_type type = csv_ascii) const; inline arma_cold bool quiet_save( std::ostream& os, const file_type type = arma_binary) const; inline arma_cold bool quiet_load(const std::string name, const file_type type = arma_binary); inline arma_cold bool quiet_load(const csv_name& spec, const file_type type = csv_ascii); inline arma_cold bool quiet_load( std::istream& is, const file_type type = arma_binary); // necessary forward declarations class iterator_base; class iterator; class const_iterator; class row_iterator; class const_row_iterator; // iterator_base provides basic operators but not how to compare or how to iterate class iterator_base { public: inline iterator_base(); inline iterator_base(const SpMat& in_M); inline iterator_base(const SpMat& in_M, const uword col, const uword pos); arma_inline eT operator*() const; // don't hold location internally; call "dummy" methods to get that information arma_inline uword row() const { return M->row_indices[internal_pos]; } arma_inline uword col() const { return internal_col; } arma_inline uword pos() const { return internal_pos; } arma_aligned const SpMat* M; arma_aligned uword internal_col; arma_aligned uword internal_pos; typedef std::bidirectional_iterator_tag iterator_category; typedef eT value_type; typedef std::ptrdiff_t difference_type; // TODO: not certain on this one typedef const eT* pointer; typedef const eT& reference; }; class const_iterator : public iterator_base { public: inline const_iterator(); inline const_iterator(const SpMat& in_M, uword initial_pos = 0); // assumes initial_pos is valid //! once initialised, will be at the first nonzero value after the given position (using forward columnwise traversal) inline const_iterator(const SpMat& in_M, uword in_row, uword in_col); //! if you know the exact position of the iterator; in_row is a dummy argument inline const_iterator(const SpMat& in_M, uword in_row, uword in_col, uword in_pos); inline const_iterator(const const_iterator& other); inline arma_hot const_iterator& operator++(); inline arma_warn_unused const_iterator operator++(int); inline arma_hot const_iterator& operator--(); inline arma_warn_unused const_iterator operator--(int); inline arma_hot bool operator==(const const_iterator& rhs) const; inline arma_hot bool operator!=(const const_iterator& rhs) const; inline arma_hot bool operator==(const typename SpSubview::const_iterator& rhs) const; inline arma_hot bool operator!=(const typename SpSubview::const_iterator& rhs) const; inline arma_hot bool operator==(const const_row_iterator& rhs) const; inline arma_hot bool operator!=(const const_row_iterator& rhs) const; inline arma_hot bool operator==(const typename SpSubview::const_row_iterator& rhs) const; inline arma_hot bool operator!=(const typename SpSubview::const_row_iterator& rhs) const; }; /** * So that we can iterate over nonzero values, we need an iterator implementation. * This can't be as simple as for Mat, which is just a pointer to an eT. * If a value is set to 0 using this iterator, the iterator is no longer valid! */ class iterator : public const_iterator { public: inline iterator() : const_iterator() { } inline iterator(SpMat& in_M, uword initial_pos = 0) : const_iterator(in_M, initial_pos) { } inline iterator(SpMat& in_M, uword in_row, uword in_col) : const_iterator(in_M, in_row, in_col) { } inline iterator(SpMat& in_M, uword in_row, uword in_col, uword in_pos) : const_iterator(in_M, in_row, in_col, in_pos) { } inline iterator(const iterator& other) : const_iterator(other) { } inline arma_hot SpValProxy< SpMat > operator*(); // overloads needed for return type correctness inline arma_hot iterator& operator++(); inline arma_warn_unused iterator operator++(int); inline arma_hot iterator& operator--(); inline arma_warn_unused iterator operator--(int); // this has a different value_type than iterator_base typedef SpValProxy< SpMat > value_type; typedef const SpValProxy< SpMat >* pointer; typedef const SpValProxy< SpMat >& reference; }; class const_row_iterator : public iterator_base { public: inline const_row_iterator(); inline const_row_iterator(const SpMat& in_M, uword initial_pos = 0); //! once initialised, will be at the first nonzero value after the given position (using forward row-wise traversal) inline const_row_iterator(const SpMat& in_M, uword in_row, uword in_col); inline const_row_iterator(const const_row_iterator& other); inline arma_hot const_row_iterator& operator++(); inline arma_warn_unused const_row_iterator operator++(int); inline arma_hot const_row_iterator& operator--(); inline arma_warn_unused const_row_iterator operator--(int); uword internal_row; // hold row internally uword actual_pos; // this holds the true position we are at in the matrix, as column-major indexing arma_inline eT operator*() const { return iterator_base::M->values[actual_pos]; } arma_inline uword row() const { return internal_row; } inline arma_hot bool operator==(const const_iterator& rhs) const; inline arma_hot bool operator!=(const const_iterator& rhs) const; inline arma_hot bool operator==(const typename SpSubview::const_iterator& rhs) const; inline arma_hot bool operator!=(const typename SpSubview::const_iterator& rhs) const; inline arma_hot bool operator==(const const_row_iterator& rhs) const; inline arma_hot bool operator!=(const const_row_iterator& rhs) const; inline arma_hot bool operator==(const typename SpSubview::const_row_iterator& rhs) const; inline arma_hot bool operator!=(const typename SpSubview::const_row_iterator& rhs) const; }; class row_iterator : public const_row_iterator { public: inline row_iterator() : const_row_iterator() {} inline row_iterator(SpMat& in_M, uword initial_pos = 0) : const_row_iterator(in_M, initial_pos) { } //! once initialised, will be at the first nonzero value after the given position (using forward row-wise traversal) inline row_iterator(SpMat& in_M, uword in_row, uword in_col) : const_row_iterator(in_M, in_row, in_col) { } inline row_iterator(const row_iterator& other) : const_row_iterator(other) { } inline arma_hot SpValProxy< SpMat > operator*(); // overloads required for return type correctness inline arma_hot row_iterator& operator++(); inline arma_warn_unused row_iterator operator++(int); inline arma_hot row_iterator& operator--(); inline arma_warn_unused row_iterator operator--(int); // this has a different value_type than iterator_base typedef SpValProxy< SpMat > value_type; typedef const SpValProxy< SpMat >* pointer; typedef const SpValProxy< SpMat >& reference; }; typedef iterator col_iterator; typedef const_iterator const_col_iterator; typedef iterator row_col_iterator; typedef const_iterator const_row_col_iterator; inline iterator begin(); inline const_iterator begin() const; inline const_iterator cbegin() const; inline iterator end(); inline const_iterator end() const; inline const_iterator cend() const; inline col_iterator begin_col(const uword col_num); inline const_col_iterator begin_col(const uword col_num) const; inline col_iterator begin_col_no_sync(const uword col_num); inline const_col_iterator begin_col_no_sync(const uword col_num) const; inline col_iterator end_col(const uword col_num); inline const_col_iterator end_col(const uword col_num) const; inline col_iterator end_col_no_sync(const uword col_num); inline const_col_iterator end_col_no_sync(const uword col_num) const; inline row_iterator begin_row(const uword row_num = 0); inline const_row_iterator begin_row(const uword row_num = 0) const; inline row_iterator end_row(); inline const_row_iterator end_row() const; inline row_iterator end_row(const uword row_num); inline const_row_iterator end_row(const uword row_num) const; inline row_col_iterator begin_row_col(); inline const_row_col_iterator begin_row_col() const; inline row_col_iterator end_row_col(); inline const_row_col_iterator end_row_col() const; inline void clear(); inline bool empty() const; inline uword size() const; arma_inline arma_warn_unused SpMat_MapMat_val front(); arma_inline arma_warn_unused eT front() const; arma_inline arma_warn_unused SpMat_MapMat_val back(); arma_inline arma_warn_unused eT back() const; // Resize memory. // If the new size is larger, the column pointers and new memory still need to be correctly set. // If the new size is smaller, the first new_n_nonzero elements will be copied. // n_nonzero is updated. inline void mem_resize(const uword new_n_nonzero); //! synchronise CSC from cache inline void sync() const; //! don't use this unless you're writing internal Armadillo code inline void remove_zeros(); //! don't use this unless you're writing internal Armadillo code inline void steal_mem(SpMat& X); //! don't use this unless you're writing internal Armadillo code inline void steal_mem_simple(SpMat& X); //! don't use this unless you're writing internal Armadillo code template< typename T1, typename Functor> inline void init_xform (const SpBase& x, const Functor& func); template inline void init_xform_mt(const SpBase& x, const Functor& func); //! don't use this unless you're writing internal Armadillo code arma_inline bool is_alias(const SpMat& X) const; protected: inline void init(uword in_rows, uword in_cols, const uword new_n_nonzero = 0); inline void arma_cold init_cold(uword in_rows, uword in_cols, const uword new_n_nonzero = 0); inline void init(const std::string& text); inline void init(const SpMat& x); inline void init(const MapMat& x); inline void init_simple(const SpMat& x); inline void init_batch_std(const Mat& locations, const Mat& values, const bool sort_locations); inline void init_batch_add(const Mat& locations, const Mat& values, const bool sort_locations); inline SpMat(const arma_vec_indicator&, const uword in_vec_state); inline SpMat(const arma_vec_indicator&, const uword in_n_rows, const uword in_n_cols, const uword in_vec_state); private: inline arma_hot arma_warn_unused const eT* find_value_csc(const uword in_row, const uword in_col) const; inline arma_hot arma_warn_unused eT get_value(const uword i ) const; inline arma_hot arma_warn_unused eT get_value(const uword in_row, const uword in_col) const; inline arma_hot arma_warn_unused eT get_value_csc(const uword i ) const; inline arma_hot arma_warn_unused eT get_value_csc(const uword in_row, const uword in_col) const; inline arma_hot arma_warn_unused bool try_set_value_csc(const uword in_row, const uword in_col, const eT in_val); inline arma_hot arma_warn_unused bool try_add_value_csc(const uword in_row, const uword in_col, const eT in_val); inline arma_hot arma_warn_unused bool try_sub_value_csc(const uword in_row, const uword in_col, const eT in_val); inline arma_hot arma_warn_unused bool try_mul_value_csc(const uword in_row, const uword in_col, const eT in_val); inline arma_hot arma_warn_unused bool try_div_value_csc(const uword in_row, const uword in_col, const eT in_val); inline arma_warn_unused eT& insert_element(const uword in_row, const uword in_col, const eT in_val = eT(0)); inline void delete_element(const uword in_row, const uword in_col); // cache related arma_aligned mutable MapMat cache; arma_aligned mutable state_type sync_state; // 0: cache needs to be updated from CSC (ie. CSC has more recent data) // 1: CSC needs to be updated from cache (ie. cache has more recent data) // 2: no update required (ie. CSC and cache contain the same data) #if (!defined(ARMA_DONT_USE_STD_MUTEX)) arma_aligned mutable std::mutex cache_mutex; #endif arma_inline void invalidate_cache() const; arma_inline void invalidate_csc() const; inline void sync_cache() const; inline void sync_cache_simple() const; inline void sync_csc() const; inline void sync_csc_simple() const; friend class SpValProxy< SpMat >; // allow SpValProxy to call insert_element() and delete_element() friend class SpSubview; friend class SpRow; friend class SpCol; friend class SpMat_MapMat_val; friend class SpSubview_MapMat_val; friend class spdiagview; template friend class SpSubview_col_list; public: #ifdef ARMA_EXTRA_SPMAT_PROTO #include ARMA_INCFILE_WRAP(ARMA_EXTRA_SPMAT_PROTO) #endif }; class SpMat_aux { public: template inline static void set_real(SpMat& out, const SpBase& X); template inline static void set_real(SpMat< std::complex >& out, const SpBase< T,T1>& X); template inline static void set_imag(SpMat& out, const SpBase& X); template inline static void set_imag(SpMat< std::complex >& out, const SpBase< T,T1>& X); }; #define ARMA_HAS_SPMAT //! @} RcppArmadillo/inst/include/armadillo_bits/arma_rel_comparators.hpp0000644000176200001440000001065714124060717025310 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup arma_rel_comparators //! @{ template struct arma_lt_comparator { arma_inline bool operator() (const eT a, const eT b) const { return (a < b); } }; template struct arma_gt_comparator { arma_inline bool operator() (const eT a, const eT b) const { return (a > b); } }; template struct arma_leq_comparator { arma_inline bool operator() (const eT a, const eT b) const { return (a <= b); } }; template struct arma_geq_comparator { arma_inline bool operator() (const eT a, const eT b) const { return (a >= b); } }; template struct arma_lt_comparator< std::complex > { typedef typename std::complex eT; inline bool operator() (const eT& a, const eT& b) const { return (std::abs(a) < std::abs(b)); } // inline // bool // operator() (const eT& a, const eT& b) const // { // const T abs_a = std::abs(a); // const T abs_b = std::abs(b); // // return ( (abs_a != abs_b) ? (abs_a < abs_b) : (std::arg(a) < std::arg(b)) ); // } // inline // bool // operator() (const eT& a, const eT& b) const // { // const T a_real = a.real(); // const T a_imag = a.imag(); // // const T a_mag_squared = a_real*a_real + a_imag*a_imag; // // const T b_real = b.real(); // const T b_imag = b.imag(); // // const T b_mag_squared = b_real*b_real + b_imag*b_imag; // // if( (a_mag_squared != T(0)) && (b_mag_squared != T(0)) && std::isfinite(a_mag_squared) && std::isfinite(b_mag_squared) ) // { // return ( (a_mag_squared != b_mag_squared) ? (a_mag_squared < b_mag_squared) : (std::arg(a) < std::arg(b)) ); // } // else // { // const T abs_a = std::abs(a); // const T abs_b = std::abs(b); // // return ( (abs_a != abs_b) ? (abs_a < abs_b) : (std::arg(a) < std::arg(b)) ); // } // } }; template struct arma_gt_comparator< std::complex > { typedef typename std::complex eT; inline bool operator() (const eT& a, const eT& b) const { return (std::abs(a) > std::abs(b)); } // inline // bool // operator() (const eT& a, const eT& b) const // { // const T abs_a = std::abs(a); // const T abs_b = std::abs(b); // // return ( (abs_a != abs_b) ? (abs_a > abs_b) : (std::arg(a) > std::arg(b)) ); // } // inline // bool // operator() (const eT& a, const eT& b) const // { // const T a_real = a.real(); // const T a_imag = a.imag(); // // const T a_mag_squared = a_real*a_real + a_imag*a_imag; // // const T b_real = b.real(); // const T b_imag = b.imag(); // // const T b_mag_squared = b_real*b_real + b_imag*b_imag; // // if( (a_mag_squared != T(0)) && (b_mag_squared != T(0)) && std::isfinite(a_mag_squared) && std::isfinite(b_mag_squared) ) // { // return ( (a_mag_squared != b_mag_squared) ? (a_mag_squared > b_mag_squared) : (std::arg(a) > std::arg(b)) ); // } // else // { // const T abs_a = std::abs(a); // const T abs_b = std::abs(b); // // return ( (abs_a != abs_b) ? (abs_a > abs_b) : (std::arg(a) > std::arg(b)) ); // } // } }; template struct arma_leq_comparator< std::complex > { typedef typename std::complex eT; inline bool operator() (const eT& a, const eT& b) const { return (std::abs(a) <= std::abs(b)); } }; template struct arma_geq_comparator< std::complex > { typedef typename std::complex eT; inline bool operator() (const eT& a, const eT& b) const { return (std::abs(a) >= std::abs(b)); } }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_pinv_meat.hpp0000644000176200001440000001657414162345366023610 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_pinv //! @{ template inline void op_pinv::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; const T tol = access::tmp_real(in.aux); const uword method_id = in.aux_uword_a; const bool status = op_pinv::apply_direct(out, in.m, tol, method_id); if(status == false) { out.soft_reset(); arma_stop_runtime_error("pinv(): svd failed"); } } template inline bool op_pinv::apply_direct(Mat& out, const Base& expr, typename T1::pod_type tol, const uword method_id) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; arma_debug_check((tol < T(0)), "pinv(): tolerance must be >= 0"); // method_id = 0 -> default setting // method_id = 1 -> use standard algorithm // method_id = 2 -> use divide and conquer algorithm Mat A(expr.get_ref()); const uword n_rows = A.n_rows; const uword n_cols = A.n_cols; if(A.is_empty()) { out.set_size(n_cols,n_rows); return true; } if(is_op_diagmat::value || A.is_diagmat()) { arma_extra_debug_print("op_pinv: detected diagonal matrix"); return op_pinv::apply_diag(out, A, tol); } #if defined(ARMA_OPTIMISE_SYMPD) bool do_sym = false; bool do_sympd = false; if(auxlib::crippled_lapack(A) == false) { bool is_approx_sym = false; bool is_approx_sympd = false; sympd_helper::analyse_matrix(is_approx_sym, is_approx_sympd, A); do_sym = (is_cx::no) ? (is_approx_sym) : (is_approx_sym && is_approx_sympd); do_sympd = is_approx_sympd && (tol == T(0)) && (method_id == uword(0)); } #else const bool do_sym = false; const bool do_sympd = false; #endif if(do_sympd) { arma_extra_debug_print("op_pinv: attempting sympd optimisation"); out = A; const T rcond_threshold = T((std::max)(uword(100), uword(A.n_rows))) * std::numeric_limits::epsilon(); const bool status = auxlib::inv_sympd_rcond(out, rcond_threshold); if(status) { return true; } arma_extra_debug_print("op_pinv: sympd optimisation failed"); // auxlib::inv_sympd_rcond() will fail if A isn't really positive definite or its rcond is below rcond_threshold } if(do_sym) { arma_extra_debug_print("op_pinv: symmetric/hermitian optimisation"); return op_pinv::apply_sym(out, A, tol, method_id); } // economical SVD decomposition Mat U; Col< T> s; Mat V; if(n_cols > n_rows) { A = trans(A); } const bool status = ((method_id == uword(0)) || (method_id == uword(2))) ? auxlib::svd_dc_econ(U, s, V, A) : auxlib::svd_econ(U, s, V, A, 'b'); if(status == false) { return false; } // set tolerance to default if it hasn't been specified if( (tol == T(0)) && (s.n_elem > 0) ) { tol = (std::max)(n_rows, n_cols) * s[0] * std::numeric_limits::epsilon(); } uword count = 0; for(uword i=0; i < s.n_elem; ++i) { count += (s[i] >= tol) ? uword(1) : uword(0); } if(count == 0) { out.zeros(n_cols, n_rows); return true; } Col s2(count, arma_nozeros_indicator()); uword count2 = 0; for(uword i=0; i < s.n_elem; ++i) { const T val = s[i]; if(val >= tol) { s2[count2] = (val > T(0)) ? T(T(1) / val) : T(0); ++count2; } } const Mat U_use(U.memptr(), U.n_rows, count, false); const Mat V_use(V.memptr(), V.n_rows, count, false); Mat tmp; if(n_rows >= n_cols) { // out = ( (V.n_cols > count) ? V.cols(0,count-1) : V ) * diagmat(s2) * trans( (U.n_cols > count) ? U.cols(0,count-1) : U ); tmp = V_use * diagmat(s2); out = tmp * trans(U_use); } else { // out = ( (U.n_cols > count) ? U.cols(0,count-1) : U ) * diagmat(s2) * trans( (V.n_cols > count) ? V.cols(0,count-1) : V ); tmp = U_use * diagmat(s2); out = tmp * trans(V_use); } return true; } template inline bool op_pinv::apply_diag(Mat& out, const Mat& A, typename get_pod_type::result tol) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; out.zeros(A.n_cols, A.n_rows); const uword N = (std::min)(A.n_rows, A.n_cols); podarray diag_abs_vals(N); T max_abs_Aii = T(0); for(uword i=0; i max_abs_Aii) ? abs_Aii : max_abs_Aii; } if(tol == T(0)) { tol = (std::max)(A.n_rows, A.n_cols) * max_abs_Aii * std::numeric_limits::epsilon(); } for(uword i=0; i= tol) { const eT Aii = A.at(i,i); if(Aii != eT(0)) { out.at(i,i) = eT(eT(1) / Aii); } } } return true; } template inline bool op_pinv::apply_sym(Mat& out, const Mat& A, typename get_pod_type::result tol, const uword method_id) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; Col< T> eigval; Mat eigvec; const bool status = ((method_id == uword(0)) || (method_id == uword(2))) ? auxlib::eig_sym_dc(eigval, eigvec, A) : auxlib::eig_sym(eigval, eigvec, A); if(status == false) { return false; } if(eigval.n_elem == 0) { out.zeros(A.n_cols, A.n_rows); return true; } Col abs_eigval = arma::abs(eigval); const uvec indices = sort_index(abs_eigval, "descend"); abs_eigval = abs_eigval.elem(indices); eigval = eigval.elem(indices); eigvec = eigvec.cols(indices); // set tolerance to default if it hasn't been specified if(tol == T(0)) { tol = (std::max)(A.n_rows, A.n_cols) * abs_eigval[0] * std::numeric_limits::epsilon(); } uword count = 0; for(uword i=0; i < abs_eigval.n_elem; ++i) { count += (abs_eigval[i] >= tol) ? uword(1) : uword(0); } if(count == 0) { out.zeros(A.n_cols, A.n_rows); return true; } Col eigval2(count, arma_nozeros_indicator()); uword count2 = 0; for(uword i=0; i < eigval.n_elem; ++i) { const T abs_val = abs_eigval[i]; const T val = eigval[i]; if(abs_val >= tol) { eigval2[count2] = (val != T(0)) ? T(T(1) / val) : T(0); ++count2; } } const Mat eigvec_use(eigvec.memptr(), eigvec.n_rows, count, false); out = (eigvec_use * diagmat(eigval2)).eval() * eigvec_use.t(); return true; } //! @} RcppArmadillo/inst/include/armadillo_bits/running_stat_vec_bones.hpp0000644000176200001440000001313214124060717025641 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup running_stat_vec //! @{ template struct rsv_get_elem_type_worker { }; template struct rsv_get_elem_type_worker { typedef obj_type result; }; template struct rsv_get_elem_type_worker { typedef typename obj_type::elem_type result; }; template struct rsv_get_elem_type { typedef typename rsv_get_elem_type_worker::value>::result elem_type; }; template struct rsv_get_return_type1_worker { }; template struct rsv_get_return_type1_worker { typedef Mat result; }; template struct rsv_get_return_type1_worker { typedef obj_type result; }; template struct rsv_get_return_type1 { typedef typename rsv_get_return_type1_worker::value>::result return_type1; }; template struct rsv_get_return_type2 { }; template struct rsv_get_return_type2< Mat > { typedef Mat::result> return_type2; }; template struct rsv_get_return_type2< Row > { typedef Row::result> return_type2; }; template struct rsv_get_return_type2< Col > { typedef Col::result> return_type2; }; //! Class for keeping statistics of a continuously sampled process / signal. //! Useful if the storage of individual samples is not necessary or desired. //! Also useful if the number of samples is not known beforehand or exceeds //! available memory. template class running_stat_vec { public: // voodoo for compatibility with old user code typedef typename rsv_get_elem_type::elem_type eT; typedef typename get_pod_type::result T; typedef typename rsv_get_return_type1::return_type1 return_type1; typedef typename rsv_get_return_type2::return_type2 return_type2; inline ~running_stat_vec(); inline running_stat_vec(const bool in_calc_cov = false); // TODO: investigate char* overload, eg. "calc_cov", "no_calc_cov" inline running_stat_vec(const running_stat_vec& in_rsv); inline running_stat_vec& operator=(const running_stat_vec& in_rsv); template arma_hot inline void operator() (const Base< T, T1>& X); template arma_hot inline void operator() (const Base, T1>& X); inline void reset(); inline const return_type1& mean() const; inline const return_type2& var (const uword norm_type = 0); inline return_type2 stddev(const uword norm_type = 0) const; inline const Mat& cov (const uword norm_type = 0); inline const return_type1& min() const; inline const return_type1& max() const; inline return_type1 range() const; inline T count() const; // // private: const bool calc_cov; arma_aligned arma_counter counter; arma_aligned return_type1 r_mean; arma_aligned return_type2 r_var; arma_aligned Mat r_cov; arma_aligned return_type1 min_val; arma_aligned return_type1 max_val; arma_aligned Mat< T> min_val_norm; arma_aligned Mat< T> max_val_norm; arma_aligned return_type2 r_var_dummy; arma_aligned Mat r_cov_dummy; arma_aligned Mat tmp1; arma_aligned Mat tmp2; friend class running_stat_vec_aux; }; class running_stat_vec_aux { public: template inline static void update_stats ( running_stat_vec& x, const Mat::eT>& sample, const typename arma_not_cx::eT>::result* junk = nullptr ); template inline static void update_stats ( running_stat_vec& x, const Mat::T > >& sample, const typename arma_not_cx::eT>::result* junk = nullptr ); template inline static void update_stats ( running_stat_vec& x, const Mat< typename running_stat_vec::T >& sample, const typename arma_cx_only::eT>::result* junk = nullptr ); template inline static void update_stats ( running_stat_vec& x, const Mat::eT>& sample, const typename arma_cx_only::eT>::result* junk = nullptr ); }; //! @} RcppArmadillo/inst/include/armadillo_bits/def_arpack.hpp0000644000176200001440000002502714124060717023170 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #ifdef ARMA_USE_ARPACK // I'm not sure this is necessary. #if !defined(ARMA_BLAS_CAPITALS) #define arma_snaupd snaupd #define arma_dnaupd dnaupd #define arma_cnaupd cnaupd #define arma_znaupd znaupd #define arma_sneupd sneupd #define arma_dneupd dneupd #define arma_cneupd cneupd #define arma_zneupd zneupd #define arma_ssaupd ssaupd #define arma_dsaupd dsaupd #define arma_sseupd sseupd #define arma_dseupd dseupd #else #define arma_snaupd SNAUPD #define arma_dnaupd DNAUPD #define arma_cnaupd CNAUPD #define arma_znaupd ZNAUPD #define arma_sneupd SNEUPD #define arma_dneupd DNEUPD #define arma_cneupd CNEUPD #define arma_zneupd ZNEUPD #define arma_ssaupd SSAUPD #define arma_dsaupd DSAUPD #define arma_sseupd SSEUPD #define arma_dseupd DSEUPD #endif extern "C" { #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) // eigendecomposition of non-symmetric positive semi-definite matrices void arma_fortran(arma_snaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, float* resid, blas_int* ncv, float* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, float* workd, float* workl, blas_int* lworkl, blas_int* info, blas_len bmat_len, blas_len which_len); void arma_fortran(arma_dnaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, double* resid, blas_int* ncv, double* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, double* workd, double* workl, blas_int* lworkl, blas_int* info, blas_len bmat_len, blas_len which_len); void arma_fortran(arma_cnaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, void* resid, blas_int* ncv, void* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, void* workd, void* workl, blas_int* lworkl, float* rwork, blas_int* info, blas_len bmat_len, blas_len which_len); void arma_fortran(arma_znaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, void* resid, blas_int* ncv, void* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, void* workd, void* workl, blas_int* lworkl, double* rwork, blas_int* info, blas_len bmat_len, blas_len which_len); // recovery of eigenvectors after naupd(); uses blas_int for LOGICAL types void arma_fortran(arma_sneupd)(blas_int* rvec, char* howmny, blas_int* select, float* dr, float* di, float* z, blas_int* ldz, float* sigmar, float* sigmai, float* workev, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, float* resid, blas_int* ncv, float* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, float* workd, float* workl, blas_int* lworkl, blas_int* info, blas_len howmny_len, blas_len bmat_len, blas_len which_len); void arma_fortran(arma_dneupd)(blas_int* rvec, char* howmny, blas_int* select, double* dr, double* di, double* z, blas_int* ldz, double* sigmar, double* sigmai, double* workev, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, double* resid, blas_int* ncv, double* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, double* workd, double* workl, blas_int* lworkl, blas_int* info, blas_len howmny_len, blas_len bmat_len, blas_len which_len); void arma_fortran(arma_cneupd)(blas_int* rvec, char* howmny, blas_int* select, void* d, void* z, blas_int* ldz, void* sigma, void* workev, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, void* resid, blas_int* ncv, void* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, void* workd, void* workl, blas_int* lworkl, float* rwork, blas_int* info, blas_len howmny_len, blas_len bmat_len, blas_len which_len); void arma_fortran(arma_zneupd)(blas_int* rvec, char* howmny, blas_int* select, void* d, void* z, blas_int* ldz, void* sigma, void* workev, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, void* resid, blas_int* ncv, void* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, void* workd, void* workl, blas_int* lworkl, double* rwork, blas_int* info, blas_len howmny_len, blas_len bmat_len, blas_len which_len); // eigendecomposition of symmetric positive semi-definite matrices void arma_fortran(arma_ssaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, float* resid, blas_int* ncv, float* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, float* workd, float* workl, blas_int* lworkl, blas_int* info, blas_len bmat_len, blas_len which_len); void arma_fortran(arma_dsaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, double* resid, blas_int* ncv, double* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, double* workd, double* workl, blas_int* lworkl, blas_int* info, blas_len bmat_len, blas_len which_len); // recovery of eigenvectors after saupd(); uses blas_int for LOGICAL types void arma_fortran(arma_sseupd)(blas_int* rvec, char* howmny, blas_int* select, float* d, float* z, blas_int* ldz, float* sigma, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, float* resid, blas_int* ncv, float* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, float* workd, float* workl, blas_int* lworkl, blas_int* info, blas_len howmny_len, blas_len bmat_len, blas_len which_len); void arma_fortran(arma_dseupd)(blas_int* rvec, char* howmny, blas_int* select, double* d, double* z, blas_int* ldz, double* sigma, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, double* resid, blas_int* ncv, double* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, double* workd, double* workl, blas_int* lworkl, blas_int* info, blas_len howmny_len, blas_len bmat_len, blas_len which_len); #else // eigendecomposition of non-symmetric positive semi-definite matrices void arma_fortran(arma_snaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, float* resid, blas_int* ncv, float* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, float* workd, float* workl, blas_int* lworkl, blas_int* info); void arma_fortran(arma_dnaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, double* resid, blas_int* ncv, double* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, double* workd, double* workl, blas_int* lworkl, blas_int* info); void arma_fortran(arma_cnaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, void* resid, blas_int* ncv, void* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, void* workd, void* workl, blas_int* lworkl, float* rwork, blas_int* info); void arma_fortran(arma_znaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, void* resid, blas_int* ncv, void* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, void* workd, void* workl, blas_int* lworkl, double* rwork, blas_int* info); // recovery of eigenvectors after naupd(); uses blas_int for LOGICAL types void arma_fortran(arma_sneupd)(blas_int* rvec, char* howmny, blas_int* select, float* dr, float* di, float* z, blas_int* ldz, float* sigmar, float* sigmai, float* workev, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, float* resid, blas_int* ncv, float* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, float* workd, float* workl, blas_int* lworkl, blas_int* info); void arma_fortran(arma_dneupd)(blas_int* rvec, char* howmny, blas_int* select, double* dr, double* di, double* z, blas_int* ldz, double* sigmar, double* sigmai, double* workev, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, double* resid, blas_int* ncv, double* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, double* workd, double* workl, blas_int* lworkl, blas_int* info); void arma_fortran(arma_cneupd)(blas_int* rvec, char* howmny, blas_int* select, void* d, void* z, blas_int* ldz, void* sigma, void* workev, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, void* resid, blas_int* ncv, void* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, void* workd, void* workl, blas_int* lworkl, float* rwork, blas_int* info); void arma_fortran(arma_zneupd)(blas_int* rvec, char* howmny, blas_int* select, void* d, void* z, blas_int* ldz, void* sigma, void* workev, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, void* resid, blas_int* ncv, void* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, void* workd, void* workl, blas_int* lworkl, double* rwork, blas_int* info); // eigendecomposition of symmetric positive semi-definite matrices void arma_fortran(arma_ssaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, float* resid, blas_int* ncv, float* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, float* workd, float* workl, blas_int* lworkl, blas_int* info); void arma_fortran(arma_dsaupd)(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, double* resid, blas_int* ncv, double* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, double* workd, double* workl, blas_int* lworkl, blas_int* info); // recovery of eigenvectors after saupd(); uses blas_int for LOGICAL types void arma_fortran(arma_sseupd)(blas_int* rvec, char* howmny, blas_int* select, float* d, float* z, blas_int* ldz, float* sigma, char* bmat, blas_int* n, char* which, blas_int* nev, float* tol, float* resid, blas_int* ncv, float* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, float* workd, float* workl, blas_int* lworkl, blas_int* info); void arma_fortran(arma_dseupd)(blas_int* rvec, char* howmny, blas_int* select, double* d, double* z, blas_int* ldz, double* sigma, char* bmat, blas_int* n, char* which, blas_int* nev, double* tol, double* resid, blas_int* ncv, double* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, double* workd, double* workl, blas_int* lworkl, blas_int* info); #endif } #endif RcppArmadillo/inst/include/armadillo_bits/newarp_SymEigsSolver_meat.hpp0000644000176200001440000003120514124060717026241 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { template inline void SymEigsSolver::factorise_from(uword from_k, uword to_m, const Col& fk) { arma_extra_debug_sigprint(); if(to_m <= from_k) { return; } fac_f = fk; Col w(dim_n, arma_zeros_indicator()); // Norm of f eT beta = norm(fac_f); // Used to test beta~=0 const eT beta_thresh = eps * eop_aux::sqrt(dim_n); // Keep the upperleft k x k submatrix of H and set other elements to 0 fac_H.tail_cols(ncv - from_k).zeros(); fac_H.submat(span(from_k, ncv - 1), span(0, from_k - 1)).zeros(); for(uword 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(beta < near0) { // Generate new random vector for fac_f blas_int idist = 2; blas_int iseed[4] = {1, 3, 5, 7}; iseed[0] = (i + 100) % 4095; blas_int n = dim_n; lapack::larnv(&idist, &iseed[0], &n, fac_f.memptr()); // f <- f - V * V' * f, so that f is orthogonal to V Mat Vs(fac_V.memptr(), dim_n, i, false); // First i columns Col Vf = Vs.t() * fac_f; fac_f -= Vs * Vf; // beta <- ||f|| beta = norm(fac_f); restart = true; } // v <- f / ||f|| Col v(fac_V.colptr(i), dim_n, false); // The (i+1)-th column v = fac_f / beta; // Note that H[i+1, i] equals to the unrestarted beta fac_H(i, i - 1) = restart ? eT(0) : beta; // w <- A * v, v = fac_V.col(i) op.perform_op(v.memptr(), w.memptr()); nmatop++; fac_H(i - 1, i) = fac_H(i, i - 1); // Due to symmetry eT Hii = dot(v, w); fac_H(i, i) = Hii; // f <- w - V * V' * w = 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) { fac_f = w - Hii * v; } else { fac_f = w - fac_H(i, i - 1) * fac_V.col(i - 1) - Hii * v; } beta = norm(fac_f); // f/||f|| is going to be the next column of V, so we need to test // whether V' * (f/||f||) ~= 0 Mat Vs(fac_V.memptr(), dim_n, i + 1, false); // First i+1 columns Col Vf = Vs.t() * fac_f; eT ortho_err = abs(Vf).max(); // If not, iteratively correct the residual uword count = 0; while(count < 5 && ortho_err > eps * beta) { // There is an edge case: when beta=||f|| is close to zero, f mostly consists // 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(beta < beta_thresh) { fac_f.zeros(); beta = eT(0); break; } // f <- f - V * Vf fac_f -= Vs * Vf; // h <- h + Vf fac_H(i - 1, i) += Vf[i - 1]; fac_H(i, i - 1) = fac_H(i - 1, i); fac_H(i, i) += Vf[i]; // beta <- ||f|| beta = norm(fac_f); Vf = Vs.t() * fac_f; ortho_err = abs(Vf).max(); count++; } } } template inline void SymEigsSolver::restart(uword k) { arma_extra_debug_sigprint(); if(k >= ncv) { return; } TridiagQR decomp; Mat Q(ncv, ncv, fill::eye); for(uword i = k; i < ncv; i++) { // QR decomposition of H-mu*I, mu is the shift fac_H.diag() -= ritz_val(i); decomp.compute(fac_H); // 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 fac_H = decomp.matrix_RQ(); fac_H.diag() += ritz_val(i); } // V -> VQ, only need to update the first k+1 columns // Q has some elements being zero // The first (ncv - k + i) elements of the i-th column of Q are non-zero Mat Vs(dim_n, k + 1, arma_nozeros_indicator()); uword nnz; for(uword i = 0; i < k; i++) { nnz = ncv - k + i + 1; Mat V(fac_V.memptr(), dim_n, nnz, false); Col q(Q.colptr(i), nnz, false); // OLD CODE: // Vs.col(i) = V * q; // NEW CODE: Col v(Vs.colptr(i), dim_n, false, true); v = V * q; } Vs.col(k) = fac_V * Q.col(k); fac_V.head_cols(k + 1) = Vs; Col fk = fac_f * Q(ncv - 1, k - 1) + fac_V.col(k) * fac_H(k, k - 1); factorise_from(k, ncv, fk); retrieve_ritzpair(); } template inline uword SymEigsSolver::num_converged(eT tol) { arma_extra_debug_sigprint(); // thresh = tol * max(approx0, abs(theta)), theta for ritz value const eT f_norm = norm(fac_f); for(uword i = 0; i < nev; i++) { eT thresh = tol * (std::max)(eps23, std::abs(ritz_val(i))); eT resid = std::abs(ritz_est(i)) * f_norm; ritz_conv[i] = (resid < thresh); } return std::count(ritz_conv.begin(), ritz_conv.end(), true); } template inline uword SymEigsSolver::nev_adjusted(uword nconv) { arma_extra_debug_sigprint(); uword nev_new = nev; for(uword i = nev; i < ncv; i++) { if(std::abs(ritz_est(i)) < near0) { nev_new++; } } // Adjust nev_new, according to dsaup2.f line 677~684 in ARPACK nev_new += (std::min)(nconv, (ncv - nev_new) / 2); if(nev_new >= ncv) { nev_new = ncv - 1; } if(nev_new == 1 && ncv >= 6) { nev_new = ncv / 2; } else if(nev_new == 1 && ncv > 2) { nev_new = 2; } return nev_new; } template inline void SymEigsSolver::retrieve_ritzpair() { arma_extra_debug_sigprint(); TridiagEigen decomp(fac_H); Col evals = decomp.eigenvalues(); Mat evecs = decomp.eigenvectors(); SortEigenvalue sorting(evals.memptr(), evals.n_elem); 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 == EigsSelect::BOTH_ENDS) { std::vector ind_copy(ind); for(uword i = 0; i < 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[ncv - 1 - i / 2]; } } } // Copy the ritz values and vectors to ritz_val and ritz_vec, respectively for(uword i = 0; i < ncv; i++) { ritz_val(i) = evals(ind[i]); ritz_est(i) = evecs(ncv - 1, ind[i]); } for(uword i = 0; i < nev; i++) { ritz_vec.col(i) = evecs.col(ind[i]); } } template inline void SymEigsSolver::sort_ritzpair() { arma_extra_debug_sigprint(); // SortEigenvalue sorting(ritz_val.memptr(), nev); // Sort Ritz values in ascending algebraic, to be consistent with ARPACK SortEigenvalue sorting(ritz_val.memptr(), nev); std::vector ind = sorting.index(); Col new_ritz_val(ncv, arma_zeros_indicator() ); Mat new_ritz_vec(ncv, nev, arma_nozeros_indicator()); std::vector new_ritz_conv(nev); for(uword i = 0; i < nev; i++) { new_ritz_val(i) = ritz_val(ind[i]); new_ritz_vec.col(i) = ritz_vec.col(ind[i]); new_ritz_conv[i] = ritz_conv[ind[i]]; } ritz_val.swap(new_ritz_val); ritz_vec.swap(new_ritz_vec); ritz_conv.swap(new_ritz_conv); } template inline SymEigsSolver::SymEigsSolver(const OpType& op_, uword nev_, uword ncv_) : op(op_) , nev(nev_) , dim_n(op.n_rows) , ncv(ncv_ > dim_n ? dim_n : ncv_) , nmatop(0) , niter(0) , eps(std::numeric_limits::epsilon()) , eps23(std::pow(eps, eT(2.0) / 3)) , near0(std::numeric_limits::min() * eT(10)) { arma_extra_debug_sigprint(); arma_debug_check( (nev_ < 1 || nev_ > dim_n - 1), "newarp::SymEigsSolver: nev must satisfy 1 <= nev <= n - 1, n is the size of matrix" ); arma_debug_check( (ncv_ <= nev_ || ncv_ > dim_n), "newarp::SymEigsSolver: ncv must satisfy nev < ncv <= n, n is the size of matrix" ); } template inline void SymEigsSolver::init(eT* init_resid) { arma_extra_debug_sigprint(); // Reset all matrices/vectors to zero fac_V.zeros(dim_n, ncv); fac_H.zeros(ncv, ncv); fac_f.zeros(dim_n); ritz_val.zeros(ncv); ritz_vec.zeros(ncv, nev); ritz_est.zeros(ncv); ritz_conv.assign(nev, false); nmatop = 0; niter = 0; Col r(init_resid, dim_n, false); // The first column of fac_V Col v(fac_V.colptr(0), dim_n, false); eT rnorm = norm(r); arma_check( (rnorm < near0), "newarp::SymEigsSolver::init(): initial residual vector cannot be zero" ); v = r / rnorm; Col w(dim_n, arma_zeros_indicator()); op.perform_op(v.memptr(), w.memptr()); nmatop++; fac_H(0, 0) = dot(v, w); fac_f = w - v * 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(abs(fac_f).max() < eps) { fac_f.zeros(); } } template inline void SymEigsSolver::init() { arma_extra_debug_sigprint(); podarray init_resid(dim_n); blas_int idist = 2; // Uniform(-1, 1) blas_int iseed[4] = {1, 3, 5, 7}; // Fixed random seed blas_int n = dim_n; lapack::larnv(&idist, &iseed[0], &n, init_resid.memptr()); init(init_resid.memptr()); } template inline uword SymEigsSolver::compute(uword maxit, eT tol) { arma_extra_debug_sigprint(); // The m-step Arnoldi factorisation factorise_from(1, ncv, fac_f); retrieve_ritzpair(); // Restarting uword i, nconv = 0, nev_adj; for(i = 0; i < maxit; i++) { nconv = num_converged(tol); if(nconv >= nev) { break; } nev_adj = nev_adjusted(nconv); restart(nev_adj); } // Sorting results sort_ritzpair(); niter = i + 1; return (std::min)(nev, nconv); } template inline Col SymEigsSolver::eigenvalues() { arma_extra_debug_sigprint(); uword nconv = std::count(ritz_conv.begin(), ritz_conv.end(), true); Col res(nconv, arma_zeros_indicator()); if(nconv > 0) { uword j = 0; for(uword i = 0; i < nev; i++) { if(ritz_conv[i]) { res(j) = ritz_val(i); j++; } } } return res; } template inline Mat SymEigsSolver::eigenvectors(uword nvec) { arma_extra_debug_sigprint(); uword nconv = std::count(ritz_conv.begin(), ritz_conv.end(), true); nvec = (std::min)(nvec, nconv); Mat res(dim_n, nvec); if(nvec > 0) { Mat ritz_vec_conv(ncv, nvec, arma_zeros_indicator()); uword j = 0; for(uword i = 0; i < nev && j < nvec; i++) { if(ritz_conv[i]) { ritz_vec_conv.col(j) = ritz_vec.col(i); j++; } } res = fac_V * ritz_vec_conv; } return res; } } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/fn_hess.hpp0000644000176200001440000000721214124060717022532 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_hess //! @{ template inline bool hess ( Mat& H, const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; Col tao; const bool status = auxlib::hess(H, X.get_ref(), tao); if(H.n_rows > 2) { for(uword i=0; i < H.n_rows-2; ++i) { H(span(i+2, H.n_rows-1), i).zeros(); } } if(status == false) { H.soft_reset(); arma_debug_warn_level(3, "hess(): decomposition failed"); } return status; } template arma_warn_unused inline Mat hess ( const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; Mat H; Col tao; const bool status = auxlib::hess(H, X.get_ref(), tao); if(H.n_rows > 2) { for(uword i=0; i < H.n_rows-2; ++i) { H(span(i+2, H.n_rows-1), i).zeros(); } } if(status == false) { H.soft_reset(); arma_stop_runtime_error("hess(): decomposition failed"); } return H; } template inline bool hess ( Mat& U, Mat& H, const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); arma_debug_check( void_ptr(&U) == void_ptr(&H), "hess(): 'U' is an alias of 'H'" ); typedef typename T1::elem_type eT; Col tao; const bool status = auxlib::hess(H, X.get_ref(), tao); if(H.n_rows == 0) { U.reset(); } else if(H.n_rows == 1) { U.ones(1, 1); } else if(H.n_rows == 2) { U.eye(2, 2); } else { U.eye(size(H)); Col v; for(uword i=0; i < H.n_rows-2; ++i) { // TODO: generate v in a more efficient manner; // TODO: the .ones() operation is an overkill, as most of v is overwritten afterwards v.ones(H.n_rows-i-1); v(span(1, H.n_rows-i-2)) = H(span(i+2, H.n_rows-1), i); U(span::all, span(i+1, H.n_rows-1)) -= tao(i) * (U(span::all, span(i+1, H.n_rows-1)) * v * v.t()); } U(span::all, H.n_rows-1) = U(span::all, H.n_rows-1) * (eT(1) - tao(H.n_rows-2)); for(uword i=0; i < H.n_rows-2; ++i) { H(span(i+2, H.n_rows-1), i).zeros(); } } if(status == false) { U.soft_reset(); H.soft_reset(); arma_debug_warn_level(3, "hess(): decomposition failed"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_norm_meat.hpp0000644000176200001440000004331314124060717023566 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_norm //! @{ template arma_hot inline typename T1::pod_type op_norm::vec_norm_1(const Proxy& P, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const bool use_direct_mem = (is_Mat::stored_type>::value) || (is_subview_col::stored_type>::value) || (arma_config::openmp && Proxy::use_mp); if(use_direct_mem) { const quasi_unwrap::stored_type> tmp(P.Q); return op_norm::vec_norm_1_direct_std(tmp.M); } typedef typename T1::pod_type T; T acc = T(0); if(Proxy::use_at == false) { typename Proxy::ea_type A = P.get_ea(); const uword N = P.get_n_elem(); T acc1 = T(0); T acc2 = T(0); uword i,j; for(i=0, j=1; j arma_hot inline typename T1::pod_type op_norm::vec_norm_1(const Proxy& P, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; T acc = T(0); if(Proxy::use_at == false) { typename Proxy::ea_type A = P.get_ea(); const uword N = P.get_n_elem(); for(uword i=0; i& X = A[i]; const T a = X.real(); const T b = X.imag(); acc += std::sqrt( (a*a) + (b*b) ); } } else { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); if(n_rows == 1) { for(uword col=0; col& X = P.at(0,col); const T a = X.real(); const T b = X.imag(); acc += std::sqrt( (a*a) + (b*b) ); } } else { for(uword col=0; col& X = P.at(row,col); const T a = X.real(); const T b = X.imag(); acc += std::sqrt( (a*a) + (b*b) ); } } } if( (acc != T(0)) && arma_isfinite(acc) ) { return acc; } else { arma_extra_debug_print("op_norm::vec_norm_1(): detected possible underflow or overflow"); const quasi_unwrap::stored_type> R(P.Q); const uword N = R.M.n_elem; const eT* R_mem = R.M.memptr(); T max_val = priv::most_neg(); for(uword i=0; i& X = R_mem[i]; const T a = std::abs(X.real()); const T b = std::abs(X.imag()); if(a > max_val) { max_val = a; } if(b > max_val) { max_val = b; } } if(max_val == T(0)) { return T(0); } T alt_acc = T(0); for(uword i=0; i& X = R_mem[i]; const T a = X.real() / max_val; const T b = X.imag() / max_val; alt_acc += std::sqrt( (a*a) + (b*b) ); } return ( alt_acc * max_val ); } } template arma_hot inline eT op_norm::vec_norm_1_direct_std(const Mat& X) { arma_extra_debug_sigprint(); const uword N = X.n_elem; const eT* A = X.memptr(); if(N < uword(32)) { return op_norm::vec_norm_1_direct_mem(N,A); } else { #if defined(ARMA_USE_ATLAS) { return atlas::cblas_asum(N,A); } #elif defined(ARMA_USE_BLAS) { return blas::asum(N,A); } #else { return op_norm::vec_norm_1_direct_mem(N,A); } #endif } } template arma_hot inline eT op_norm::vec_norm_1_direct_mem(const uword N, const eT* A) { arma_extra_debug_sigprint(); #if defined(ARMA_SIMPLE_LOOPS) || (defined(__FINITE_MATH_ONLY__) && (__FINITE_MATH_ONLY__ > 0)) { eT acc1 = eT(0); if(memory::is_aligned(A)) { memory::mark_as_aligned(A); for(uword i=0; i arma_hot inline typename T1::pod_type op_norm::vec_norm_2(const Proxy& P, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const bool use_direct_mem = (is_Mat::stored_type>::value) || (is_subview_col::stored_type>::value) || (arma_config::openmp && Proxy::use_mp); if(use_direct_mem) { const quasi_unwrap::stored_type> tmp(P.Q); return op_norm::vec_norm_2_direct_std(tmp.M); } typedef typename T1::pod_type T; T acc = T(0); if(Proxy::use_at == false) { typename Proxy::ea_type A = P.get_ea(); const uword N = P.get_n_elem(); T acc1 = T(0); T acc2 = T(0); uword i,j; for(i=0, j=1; j::stored_type> tmp(P.Q); return op_norm::vec_norm_2_direct_robust(tmp.M); } } template arma_hot inline typename T1::pod_type op_norm::vec_norm_2(const Proxy& P, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; T acc = T(0); if(Proxy::use_at == false) { typename Proxy::ea_type A = P.get_ea(); const uword N = P.get_n_elem(); for(uword i=0; i& X = A[i]; const T a = X.real(); const T b = X.imag(); acc += (a*a) + (b*b); } } else { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); if(n_rows == 1) { for(uword col=0; col& X = P.at(0,col); const T a = X.real(); const T b = X.imag(); acc += (a*a) + (b*b); } } else { for(uword col=0; col& X = P.at(row,col); const T a = X.real(); const T b = X.imag(); acc += (a*a) + (b*b); } } } const T sqrt_acc = std::sqrt(acc); if( (sqrt_acc != T(0)) && arma_isfinite(sqrt_acc) ) { return sqrt_acc; } else { arma_extra_debug_print("op_norm::vec_norm_2(): detected possible underflow or overflow"); const quasi_unwrap::stored_type> R(P.Q); const uword N = R.M.n_elem; const eT* R_mem = R.M.memptr(); T max_val = priv::most_neg(); for(uword i=0; i max_val) { max_val = val_i; } } if(max_val == T(0)) { return T(0); } T alt_acc = T(0); for(uword i=0; i arma_hot inline eT op_norm::vec_norm_2_direct_std(const Mat& X) { arma_extra_debug_sigprint(); const uword N = X.n_elem; const eT* A = X.memptr(); eT result; if(N < uword(32)) { result = op_norm::vec_norm_2_direct_mem(N,A); } else { #if defined(ARMA_USE_ATLAS) { result = atlas::cblas_nrm2(N,A); } #elif defined(ARMA_USE_BLAS) { result = blas::nrm2(N,A); } #else { result = op_norm::vec_norm_2_direct_mem(N,A); } #endif } if( (result != eT(0)) && arma_isfinite(result) ) { return result; } else { arma_extra_debug_print("op_norm::vec_norm_2_direct_std(): detected possible underflow or overflow"); return op_norm::vec_norm_2_direct_robust(X); } } template arma_hot inline eT op_norm::vec_norm_2_direct_mem(const uword N, const eT* A) { arma_extra_debug_sigprint(); eT acc; #if defined(ARMA_SIMPLE_LOOPS) || (defined(__FINITE_MATH_ONLY__) && (__FINITE_MATH_ONLY__ > 0)) { eT acc1 = eT(0); if(memory::is_aligned(A)) { memory::mark_as_aligned(A); for(uword i=0; i arma_hot inline eT op_norm::vec_norm_2_direct_robust(const Mat& X) { arma_extra_debug_sigprint(); const uword N = X.n_elem; const eT* A = X.memptr(); eT max_val = priv::most_neg(); uword j; for(j=1; j max_val) { max_val = val_i; } if(val_j > max_val) { max_val = val_j; } } if((j-1) < N) { const eT val_i = std::abs(*A); if(val_i > max_val) { max_val = val_i; } } if(max_val == eT(0)) { return eT(0); } const eT* B = X.memptr(); eT acc1 = eT(0); eT acc2 = eT(0); for(j=1; j arma_hot inline typename T1::pod_type op_norm::vec_norm_k(const Proxy& P, const int k) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; T acc = T(0); if(Proxy::use_at == false) { typename Proxy::ea_type A = P.get_ea(); const uword N = P.get_n_elem(); for(uword i=0; i arma_hot inline typename T1::pod_type op_norm::vec_norm_max(const Proxy& P) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; const uword N = P.get_n_elem(); T max_val = (N != 1) ? priv::most_neg() : std::abs(P[0]); if(Proxy::use_at == false) { typename Proxy::ea_type A = P.get_ea(); uword i,j; for(i=0, j=1; j arma_hot inline typename T1::pod_type op_norm::vec_norm_min(const Proxy& P) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; const uword N = P.get_n_elem(); T min_val = (N != 1) ? priv::most_pos() : std::abs(P[0]); if(Proxy::use_at == false) { typename Proxy::ea_type A = P.get_ea(); uword i,j; for(i=0, j=1; j tmp_i) { min_val = tmp_i; } if(min_val > tmp_j) { min_val = tmp_j; } } if(i < N) { const T tmp_i = std::abs(A[i]); if(min_val > tmp_i) { min_val = tmp_i; } } } else { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); if(n_rows != 1) { for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { const T tmp = std::abs(P.at(row,col)); if(min_val > tmp) { min_val = tmp; } } } else { for(uword col=0; col < n_cols; ++col) { const T tmp = std::abs(P.at(0,col)); if(min_val > tmp) { min_val = tmp; } } } } return min_val; } template inline typename get_pod_type::result op_norm::mat_norm_1(const Mat& X) { arma_extra_debug_sigprint(); // TODO: this can be sped up with a dedicated implementation return as_scalar( max( sum(abs(X), 0), 1) ); } template inline typename get_pod_type::result op_norm::mat_norm_2(const Mat& X) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; if(X.is_finite() == false) { arma_debug_warn_level(1, "norm(): given matrix has non-finite elements"); } Col S; svd(S, X); return (S.n_elem > 0) ? S[0] : T(0); } template inline typename get_pod_type::result op_norm::mat_norm_inf(const Mat& X) { arma_extra_debug_sigprint(); // TODO: this can be sped up with a dedicated implementation return as_scalar( max( sum(abs(X), 1), 0) ); } //! @} RcppArmadillo/inst/include/armadillo_bits/trimat_helper.hpp0000644000176200001440000000434614156657715023770 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup trimat_helper //! @{ namespace trimat_helper { template inline bool is_triu(const Mat& A) { arma_extra_debug_sigprint(); // NOTE: assuming that A has a square size const uword N = A.n_rows; const uword Nm1 = N-1; if(N < 2) { return false; } const eT* A_col = A.memptr(); const eT eT_zero = eT(0); // quickly check element at bottom-left if(A_col[Nm1] != eT_zero) { return false; } // if we got to this point, do a thorough check for(uword j=0; j < Nm1; ++j) { for(uword i=(j+1); i < N; ++i) { const eT A_ij = A_col[i]; if(A_ij != eT_zero) { return false; } } A_col += N; } return true; } template inline bool is_tril(const Mat& A) { arma_extra_debug_sigprint(); // NOTE: assuming that A has a square size const uword N = A.n_rows; if(N < 2) { return false; } const eT eT_zero = eT(0); // quickly check element at top-right const eT* A_colNm1 = A.colptr(N-1); if(A_colNm1[0] != eT_zero) { return false; } // if we got to this point, do a thorough check const eT* A_col = A.memptr() + N; for(uword j=1; j < N; ++j) { for(uword i=0; i < j; ++i) { const eT A_ij = A_col[i]; if(A_ij != eT_zero) { return false; } } A_col += N; } return true; } } // end of namespace trimat_helper //! @} RcppArmadillo/inst/include/armadillo_bits/fn_cor.hpp0000644000176200001440000000304214124060717022350 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_cor //! @{ template arma_warn_unused inline const Op cor(const Base& X, const uword norm_type = 0) { arma_extra_debug_sigprint(); arma_debug_check( (norm_type > 1), "cor(): parameter 'norm_type' must be 0 or 1" ); return Op(X.get_ref(), norm_type, 0); } template arma_warn_unused inline const Glue cor(const Base& A, const Base& B, const uword norm_type = 0) { arma_extra_debug_sigprint(); arma_debug_check( (norm_type > 1), "cor(): parameter 'norm_type' must be 0 or 1" ); return Glue(A.get_ref(), B.get_ref(), norm_type); } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_mean_meat.hpp0000644000176200001440000002074114124060717024076 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_mean //! @{ template inline void spop_mean::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "mean(): parameter 'dim' must be 0 or 1" ); const SpProxy p(in.m); if(p.is_alias(out) == false) { spop_mean::apply_noalias_fast(out, p, dim); } else { SpMat tmp; spop_mean::apply_noalias_fast(tmp, p, dim); out.steal_mem(tmp); } } template inline void spop_mean::apply_noalias_fast ( SpMat& out, const SpProxy& p, const uword dim ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const uword p_n_rows = p.get_n_rows(); const uword p_n_cols = p.get_n_cols(); if( (p_n_rows == 0) || (p_n_cols == 0) || (p.get_n_nonzero() == 0) ) { if(dim == 0) { out.zeros((p_n_rows > 0) ? 1 : 0, p_n_cols); } if(dim == 1) { out.zeros(p_n_rows, (p_n_cols > 0) ? 1 : 0); } return; } if(dim == 0) // find the mean in each column { Row acc(p_n_cols, arma_zeros_indicator()); eT* acc_mem = acc.memptr(); if(SpProxy::use_iterator) { typename SpProxy::const_iterator_type it = p.begin(); const uword N = p.get_n_nonzero(); for(uword i=0; i < N; ++i) { acc_mem[it.col()] += (*it); ++it; } acc /= T(p_n_rows); } else { for(uword col = 0; col < p_n_cols; ++col) { acc_mem[col] = arrayops::accumulate ( &p.get_values()[p.get_col_ptrs()[col]], p.get_col_ptrs()[col + 1] - p.get_col_ptrs()[col] ) / T(p_n_rows); } } out = acc; } else if(dim == 1) // find the mean in each row { Col acc(p_n_rows, arma_zeros_indicator()); eT* acc_mem = acc.memptr(); typename SpProxy::const_iterator_type it = p.begin(); const uword N = p.get_n_nonzero(); for(uword i=0; i < N; ++i) { acc_mem[it.row()] += (*it); ++it; } acc /= T(p_n_cols); out = acc; } if(out.is_finite() == false) { spop_mean::apply_noalias_slow(out, p, dim); } } template inline void spop_mean::apply_noalias_slow ( SpMat& out, const SpProxy& p, const uword dim ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword p_n_rows = p.get_n_rows(); const uword p_n_cols = p.get_n_cols(); if(dim == 0) // find the mean in each column { arma_extra_debug_print("spop_mean::apply_noalias(): dim = 0"); out.set_size((p_n_rows > 0) ? 1 : 0, p_n_cols); if( (p_n_rows == 0) || (p.get_n_nonzero() == 0) ) { return; } for(uword col = 0; col < p_n_cols; ++col) { // Do we have to use an iterator or can we use memory directly? if(SpProxy::use_iterator) { typename SpProxy::const_iterator_type it = p.begin_col(col); typename SpProxy::const_iterator_type end = p.begin_col(col + 1); const uword n_zero = p_n_rows - (end.pos() - it.pos()); out.at(0,col) = spop_mean::iterator_mean(it, end, n_zero, eT(0)); } else { out.at(0,col) = spop_mean::direct_mean ( &p.get_values()[p.get_col_ptrs()[col]], p.get_col_ptrs()[col + 1] - p.get_col_ptrs()[col], p_n_rows ); } } } else if(dim == 1) // find the mean in each row { arma_extra_debug_print("spop_mean::apply_noalias(): dim = 1"); out.set_size(p_n_rows, (p_n_cols > 0) ? 1 : 0); if( (p_n_cols == 0) || (p.get_n_nonzero() == 0) ) { return; } for(uword row = 0; row < p_n_rows; ++row) { // We must use an iterator regardless of how it is stored. typename SpProxy::const_row_iterator_type it = p.begin_row(row); typename SpProxy::const_row_iterator_type end = p.end_row(row); const uword n_zero = p_n_cols - (end.pos() - it.pos()); out.at(row,0) = spop_mean::iterator_mean(it, end, n_zero, eT(0)); } } } template inline eT spop_mean::direct_mean ( const eT* const X, const uword length, const uword N ) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const eT result = ((length > 0) && (N > 0)) ? eT(arrayops::accumulate(X, length) / T(N)) : eT(0); return arma_isfinite(result) ? result : spop_mean::direct_mean_robust(X, length, N); } template inline eT spop_mean::direct_mean_robust ( const eT* const X, const uword length, const uword N ) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; uword i, j; eT r_mean = eT(0); const uword diff = (N - length); // number of zeros for(i = 0, j = 1; j < length; i += 2, j += 2) { const eT Xi = X[i]; const eT Xj = X[j]; r_mean += (Xi - r_mean) / T(diff + j); r_mean += (Xj - r_mean) / T(diff + j + 1); } if(i < length) { const eT Xi = X[i]; r_mean += (Xi - r_mean) / T(diff + i + 1); } return r_mean; } template inline typename T1::elem_type spop_mean::mean_all(const SpBase& X) { arma_extra_debug_sigprint(); SpProxy p(X.get_ref()); if(SpProxy::use_iterator) { typename SpProxy::const_iterator_type it = p.begin(); typename SpProxy::const_iterator_type end = p.end(); return spop_mean::iterator_mean(it, end, p.get_n_elem() - p.get_n_nonzero(), typename T1::elem_type(0)); } else // use_iterator == false; that is, we can directly access the values array { return spop_mean::direct_mean(p.get_values(), p.get_n_nonzero(), p.get_n_elem()); } } template inline typename T1::elem_type spop_mean::mean_all(const SpOp& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const bool is_vectorise = \ (is_same_type::yes) || (is_same_type::yes) || (is_same_type::yes); if(is_vectorise) { return spop_mean::mean_all(expr.m); } const SpMat tmp = expr; return spop_mean::mean_all(tmp); } template inline eT spop_mean::iterator_mean(T1& it, const T1& end, const uword n_zero, const eT junk) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename get_pod_type::result T; eT acc = eT(0); T1 backup_it(it); // in case we have to use robust iterator_mean const uword it_begin_pos = it.pos(); while(it != end) { acc += (*it); ++it; } const uword count = n_zero + (it.pos() - it_begin_pos); const eT result = (count > 0) ? eT(acc / T(count)) : eT(0); return arma_isfinite(result) ? result : spop_mean::iterator_mean_robust(backup_it, end, n_zero, eT(0)); } template inline eT spop_mean::iterator_mean_robust(T1& it, const T1& end, const uword n_zero, const eT junk) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename get_pod_type::result T; eT r_mean = eT(0); const uword it_begin_pos = it.pos(); while(it != end) { r_mean += ((*it - r_mean) / T(n_zero + (it.pos() - it_begin_pos) + 1)); ++it; } return r_mean; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_any_meat.hpp0000644000176200001440000002445114124060717023404 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_any //! @{ template inline bool op_any::any_vec_helper(const Base& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy P(X.get_ref()); const uword n_elem = P.get_n_elem(); if(Proxy::use_at == false) { typename Proxy::ea_type Pea = P.get_ea(); for(uword i=0; i inline bool op_any::any_vec_helper(const subview& X) { arma_extra_debug_sigprint(); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(X_n_rows == 1) { for(uword col=0; col < X_n_cols; ++col) { if(X.at(0,col) != eT(0)) { return true; } } } else { for(uword col=0; col < X_n_cols; ++col) { const eT* X_colmem = X.colptr(col); for(uword row=0; row < X_n_rows; ++row) { if(X_colmem[row] != eT(0)) { return true; } } } } return false; } template inline bool op_any::any_vec_helper(const Op& X) { arma_extra_debug_sigprint(); return op_any::any_vec_helper(X.m); } template inline bool op_any::any_vec_helper ( const mtOp& X, const typename arma_op_rel_only::result* junk1, const typename arma_not_cx::result* junk2 ) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); typedef typename T1::elem_type eT; const eT val = X.aux; const Proxy P(X.m); if(Proxy::use_at == false) { typename Proxy::ea_type Pea = P.get_ea(); const uword n_elem = P.get_n_elem(); for(uword i=0; i < n_elem; ++i) { const eT tmp = Pea[i]; if(is_same_type::yes) { if(val < tmp) { return true; } } else if(is_same_type::yes) { if(tmp < val) { return true; } } else if(is_same_type::yes) { if(val > tmp) { return true; } } else if(is_same_type::yes) { if(tmp > val) { return true; } } else if(is_same_type::yes) { if(val <= tmp) { return true; } } else if(is_same_type::yes) { if(tmp <= val) { return true; } } else if(is_same_type::yes) { if(val >= tmp) { return true; } } else if(is_same_type::yes) { if(tmp >= val) { return true; } } else if(is_same_type::yes) { if(tmp == val) { return true; } } else if(is_same_type::yes) { if(tmp != val) { return true; } } } } else { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { const eT tmp = P.at(row,col); if(is_same_type::yes) { if(val < tmp) { return true; } } else if(is_same_type::yes) { if(tmp < val) { return true; } } else if(is_same_type::yes) { if(val > tmp) { return true; } } else if(is_same_type::yes) { if(tmp > val) { return true; } } else if(is_same_type::yes) { if(val <= tmp) { return true; } } else if(is_same_type::yes) { if(tmp <= val) { return true; } } else if(is_same_type::yes) { if(val >= tmp) { return true; } } else if(is_same_type::yes) { if(tmp >= val) { return true; } } else if(is_same_type::yes) { if(tmp == val) { return true; } } else if(is_same_type::yes) { if(tmp != val) { return true; } } } } return false; } template inline bool op_any::any_vec_helper ( const mtGlue& X, const typename arma_glue_rel_only::result* junk1, const typename arma_not_cx::result* junk2, const typename arma_not_cx::result* junk3 ) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); arma_ignore(junk3); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename Proxy::ea_type ea_type1; typedef typename Proxy::ea_type ea_type2; const Proxy A(X.A); const Proxy B(X.B); arma_debug_assert_same_size(A, B, "relational operator"); const bool use_at = (Proxy::use_at || Proxy::use_at); if(use_at == false) { ea_type1 PA = A.get_ea(); ea_type2 PB = B.get_ea(); const uword n_elem = A.get_n_elem(); for(uword i=0; i::yes) { if(tmp1 < tmp2) { return true; } } else if(is_same_type::yes) { if(tmp1 > tmp2) { return true; } } else if(is_same_type::yes) { if(tmp1 <= tmp2) { return true; } } else if(is_same_type::yes) { if(tmp1 >= tmp2) { return true; } } else if(is_same_type::yes) { if(tmp1 == tmp2) { return true; } } else if(is_same_type::yes) { if(tmp1 != tmp2) { return true; } } else if(is_same_type::yes) { if(tmp1 && tmp2) { return true; } } else if(is_same_type::yes) { if(tmp1 || tmp2) { return true; } } } } else { const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { const eT1 tmp1 = A.at(row,col); const eT2 tmp2 = B.at(row,col); if(is_same_type::yes) { if(tmp1 < tmp2) { return true; } } else if(is_same_type::yes) { if(tmp1 > tmp2) { return true; } } else if(is_same_type::yes) { if(tmp1 <= tmp2) { return true; } } else if(is_same_type::yes) { if(tmp1 >= tmp2) { return true; } } else if(is_same_type::yes) { if(tmp1 == tmp2) { return true; } } else if(is_same_type::yes) { if(tmp1 != tmp2) { return true; } } else if(is_same_type::yes) { if(tmp1 && tmp2) { return true; } } else if(is_same_type::yes) { if(tmp1 || tmp2) { return true; } } } } return false; } template inline bool op_any::any_vec(T1& X) { arma_extra_debug_sigprint(); return op_any::any_vec_helper(X); } template inline void op_any::apply_helper(Mat& out, const Proxy& P, const uword dim) { arma_extra_debug_sigprint(); const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); typedef typename Proxy::elem_type eT; if(dim == 0) // traverse rows (ie. process each column) { out.zeros(1, n_cols); uword* out_mem = out.memptr(); if(is_Mat::stored_type>::value) { const unwrap::stored_type> U(P.Q); for(uword col=0; col < n_cols; ++col) { const eT* colmem = U.M.colptr(col); for(uword row=0; row < n_rows; ++row) { if(colmem[row] != eT(0)) { out_mem[col] = uword(1); break; } } } } else { for(uword col=0; col < n_cols; ++col) { for(uword row=0; row < n_rows; ++row) { if(P.at(row,col) != eT(0)) { out_mem[col] = uword(1); break; } } } } } else { out.zeros(n_rows, 1); uword* out_mem = out.memptr(); if(is_Mat::stored_type>::value) { const unwrap::stored_type> U(P.Q); for(uword col=0; col < n_cols; ++col) { const eT* colmem = U.M.colptr(col); for(uword row=0; row < n_rows; ++row) { if(colmem[row] != eT(0)) { out_mem[row] = uword(1); } } } } else { for(uword col=0; col < n_cols; ++col) { for(uword row=0; row < n_rows; ++row) { if(P.at(row,col) != eT(0)) { out_mem[row] = uword(1); } } } } } } template inline void op_any::apply(Mat& out, const mtOp& X) { arma_extra_debug_sigprint(); const uword dim = X.aux_uword_a; const Proxy P(X.m); if(P.is_alias(out) == false) { op_any::apply_helper(out, P, dim); } else { Mat out2; op_any::apply_helper(out2, P, dim); out.steal_mem(out2); } } //! @} RcppArmadillo/inst/include/armadillo_bits/SpBase_bones.hpp0000644000176200001440000001130514124060717023446 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpBase //! @{ template struct SpBase_eval_SpMat { inline arma_warn_unused const derived& eval() const; }; template struct SpBase_eval_expr { inline arma_warn_unused SpMat eval() const; //!< force the immediate evaluation of a delayed expression }; template struct SpBase_eval {}; template struct SpBase_eval { typedef SpBase_eval_SpMat result; }; template struct SpBase_eval { typedef SpBase_eval_expr result; }; template struct SpBase : public SpBase_eval::value>::result { arma_inline const derived& get_ref() const; arma_inline bool is_alias(const SpMat& X) const; inline arma_warn_unused const SpOp t() const; //!< Hermitian transpose inline arma_warn_unused const SpOp ht() const; //!< Hermitian transpose inline arma_warn_unused const SpOp st() const; //!< simple transpose arma_cold inline void print( const std::string extra_text = "") const; arma_cold inline void print(std::ostream& user_stream, const std::string extra_text = "") const; arma_cold inline void raw_print( const std::string extra_text = "") const; arma_cold inline void raw_print(std::ostream& user_stream, const std::string extra_text = "") const; arma_cold inline void print_dense( const std::string extra_text = "") const; arma_cold inline void print_dense(std::ostream& user_stream, const std::string extra_text = "") const; arma_cold inline void raw_print_dense( const std::string extra_text = "") const; arma_cold inline void raw_print_dense(std::ostream& user_stream, const std::string extra_text = "") const; arma_cold inline void brief_print( const std::string extra_text = "") const; arma_cold inline void brief_print(std::ostream& user_stream, const std::string extra_text = "") const; inline arma_warn_unused elem_type min() const; inline arma_warn_unused elem_type max() const; inline elem_type min(uword& index_of_min_val) const; inline elem_type max(uword& index_of_max_val) const; inline elem_type min(uword& row_of_min_val, uword& col_of_min_val) const; inline elem_type max(uword& row_of_max_val, uword& col_of_max_val) const; inline arma_warn_unused uword index_min() const; inline arma_warn_unused uword index_max() const; inline arma_warn_unused bool is_symmetric() const; inline arma_warn_unused bool is_symmetric(const typename get_pod_type::result tol) const; inline arma_warn_unused bool is_hermitian() const; inline arma_warn_unused bool is_hermitian(const typename get_pod_type::result tol) const; inline arma_warn_unused bool is_zero(const typename get_pod_type::result tol = 0) const; inline arma_warn_unused bool is_trimatu() const; inline arma_warn_unused bool is_trimatl() const; inline arma_warn_unused bool is_diagmat() const; inline arma_warn_unused bool is_empty() const; inline arma_warn_unused bool is_square() const; inline arma_warn_unused bool is_vec() const; inline arma_warn_unused bool is_colvec() const; inline arma_warn_unused bool is_rowvec() const; inline arma_warn_unused bool is_finite() const; inline arma_warn_unused bool has_inf() const; inline arma_warn_unused bool has_nan() const; inline arma_warn_unused const SpOp as_col() const; inline arma_warn_unused const SpOp as_row() const; }; //! @} RcppArmadillo/inst/include/armadillo_bits/eOpCube_meat.hpp0000644000176200001440000000747514124060717023450 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup eOpCube //! @{ template inline eOpCube::eOpCube(const BaseCube& in_m) : P (in_m.get_ref()) { arma_extra_debug_sigprint(); } template inline eOpCube::eOpCube(const BaseCube& in_m, const typename T1::elem_type in_aux) : P (in_m.get_ref()) , aux (in_aux) { arma_extra_debug_sigprint(); } template inline eOpCube::eOpCube(const BaseCube& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b) : P (in_m.get_ref()) , aux_uword_a (in_aux_uword_a) , aux_uword_b (in_aux_uword_b) { arma_extra_debug_sigprint(); } template inline eOpCube::eOpCube(const BaseCube& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c) : P (in_m.get_ref()) , aux_uword_a (in_aux_uword_a) , aux_uword_b (in_aux_uword_b) , aux_uword_c (in_aux_uword_c) { arma_extra_debug_sigprint(); } template inline eOpCube::eOpCube(const BaseCube& in_m, const typename T1::elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c) : P (in_m.get_ref()) , aux (in_aux) , aux_uword_a (in_aux_uword_a) , aux_uword_b (in_aux_uword_b) , aux_uword_c (in_aux_uword_c) { arma_extra_debug_sigprint(); } template inline eOpCube::~eOpCube() { arma_extra_debug_sigprint(); } template arma_inline uword eOpCube::get_n_rows() const { return P.get_n_rows(); } template arma_inline uword eOpCube::get_n_cols() const { return P.get_n_cols(); } template arma_inline uword eOpCube::get_n_elem_slice() const { return P.get_n_elem_slice(); } template arma_inline uword eOpCube::get_n_slices() const { return P.get_n_slices(); } template arma_inline uword eOpCube::get_n_elem() const { return P.get_n_elem(); } template arma_inline typename T1::elem_type eOpCube::operator[] (const uword i) const { return eop_core::process(P[i], aux); } template arma_inline typename T1::elem_type eOpCube::at(const uword row, const uword col, const uword slice) const { return eop_core::process(P.at(row, col, slice), aux); } template arma_inline typename T1::elem_type eOpCube::at_alt(const uword i) const { return eop_core::process(P.at_alt(i), aux); } //! @} RcppArmadillo/inst/include/armadillo_bits/subview_cube_each_bones.hpp0000644000176200001440000001150614124060717025736 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup subview_cube_each //! @{ template class subview_cube_each_common { public: const Cube& P; inline void check_size(const Mat& A) const; protected: arma_inline subview_cube_each_common(const Cube& in_p); inline subview_cube_each_common() = delete; arma_cold inline const std::string incompat_size_string(const Mat& A) const; }; template class subview_cube_each1 : public subview_cube_each_common { protected: arma_inline subview_cube_each1(const Cube& in_p); inline subview_cube_each1() = delete; public: inline ~subview_cube_each1(); // deliberately returning void template inline void operator= (const Base& x); template inline void operator+= (const Base& x); template inline void operator-= (const Base& x); template inline void operator%= (const Base& x); template inline void operator/= (const Base& x); template inline void operator*= (const Base& x); friend class Cube; }; template class subview_cube_each2 : public subview_cube_each_common { protected: inline subview_cube_each2(const Cube& in_p, const Base& in_indices); inline subview_cube_each2() = delete; public: const Base& base_indices; inline void check_indices(const Mat& indices) const; inline ~subview_cube_each2(); // deliberately returning void template inline void operator= (const Base& x); template inline void operator+= (const Base& x); template inline void operator-= (const Base& x); template inline void operator%= (const Base& x); template inline void operator/= (const Base& x); friend class Cube; }; class subview_cube_each1_aux { public: template static inline Cube operator_plus(const subview_cube_each1& X, const Base& Y); template static inline Cube operator_minus(const subview_cube_each1& X, const Base& Y); template static inline Cube operator_minus(const Base& X, const subview_cube_each1& Y); template static inline Cube operator_schur(const subview_cube_each1& X, const Base& Y); template static inline Cube operator_div(const subview_cube_each1& X,const Base& Y); template static inline Cube operator_div(const Base& X, const subview_cube_each1& Y); template static inline Cube operator_times(const subview_cube_each1& X,const Base& Y); template static inline Cube operator_times(const Base& X, const subview_cube_each1& Y); }; class subview_cube_each2_aux { public: template static inline Cube operator_plus(const subview_cube_each2& X, const Base& Y); template static inline Cube operator_minus(const subview_cube_each2& X, const Base& Y); template static inline Cube operator_minus(const Base& X, const subview_cube_each2& Y); template static inline Cube operator_schur(const subview_cube_each2& X, const Base& Y); template static inline Cube operator_div(const subview_cube_each2& X, const Base& Y); template static inline Cube operator_div(const Base& X, const subview_cube_each2& Y); // TODO: operator_times }; //! @} RcppArmadillo/inst/include/armadillo_bits/Base_bones.hpp0000644000176200001440000001413014124060717023142 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup Base //! @{ template struct Base_extra_yes { inline arma_warn_unused const Op i() const; //!< matrix inverse inline arma_warn_unused bool is_sympd() const; inline arma_warn_unused bool is_sympd(typename get_pod_type::result tol) const; }; template struct Base_extra_no { }; template struct Base_extra {}; template struct Base_extra { typedef Base_extra_yes result; }; template struct Base_extra { typedef Base_extra_no result; }; template struct Base_eval_Mat { arma_inline arma_warn_unused const derived& eval() const; }; template struct Base_eval_expr { inline arma_warn_unused Mat eval() const; //!< force the immediate evaluation of a delayed expression }; template struct Base_eval {}; template struct Base_eval { typedef Base_eval_Mat result; }; template struct Base_eval { typedef Base_eval_expr result; }; template struct Base_trans_cx { arma_inline arma_warn_unused const Op t() const; arma_inline arma_warn_unused const Op ht() const; arma_inline arma_warn_unused const Op st() const; // simple transpose: no complex conjugates }; template struct Base_trans_default { arma_inline arma_warn_unused const Op t() const; arma_inline arma_warn_unused const Op ht() const; arma_inline arma_warn_unused const Op st() const; // return op_htrans instead of op_strans, as it's handled better by matrix multiplication code }; template struct Base_trans {}; template struct Base_trans { typedef Base_trans_cx result; }; template struct Base_trans { typedef Base_trans_default result; }; //! Class for static polymorphism, modelled after the "Curiously Recurring Template Pattern" (CRTP). //! Used for type-safe downcasting in functions that restrict their input(s) to be classes that are //! derived from Base (eg. Mat, Op, Glue, diagview, subview). //! A Base object can be converted to a Mat object by the unwrap class. template struct Base : public Base_extra::value>::result , public Base_eval::value>::result , public Base_trans::value>::result { arma_inline const derived& get_ref() const; arma_cold inline void print( const std::string extra_text = "") const; arma_cold inline void print(std::ostream& user_stream, const std::string extra_text = "") const; arma_cold inline void raw_print( const std::string extra_text = "") const; arma_cold inline void raw_print(std::ostream& user_stream, const std::string extra_text = "") const; arma_cold inline void brief_print( const std::string extra_text = "") const; arma_cold inline void brief_print(std::ostream& user_stream, const std::string extra_text = "") const; inline arma_warn_unused elem_type min() const; inline arma_warn_unused elem_type max() const; inline elem_type min(uword& index_of_min_val) const; inline elem_type max(uword& index_of_max_val) const; inline elem_type min(uword& row_of_min_val, uword& col_of_min_val) const; inline elem_type max(uword& row_of_max_val, uword& col_of_max_val) const; inline arma_warn_unused uword index_min() const; inline arma_warn_unused uword index_max() const; inline arma_warn_unused bool is_symmetric() const; inline arma_warn_unused bool is_symmetric(const typename get_pod_type::result tol) const; inline arma_warn_unused bool is_hermitian() const; inline arma_warn_unused bool is_hermitian(const typename get_pod_type::result tol) const; inline arma_warn_unused bool is_zero(const typename get_pod_type::result tol = 0) const; inline arma_warn_unused bool is_trimatu() const; inline arma_warn_unused bool is_trimatl() const; inline arma_warn_unused bool is_diagmat() const; inline arma_warn_unused bool is_empty() const; inline arma_warn_unused bool is_square() const; inline arma_warn_unused bool is_vec() const; inline arma_warn_unused bool is_colvec() const; inline arma_warn_unused bool is_rowvec() const; inline arma_warn_unused bool is_finite() const; inline arma_warn_unused bool has_inf() const; inline arma_warn_unused bool has_nan() const; inline arma_warn_unused const Op as_col() const; inline arma_warn_unused const Op as_row() const; }; //! @} RcppArmadillo/inst/include/armadillo_bits/Op_bones.hpp0000644000176200001440000000517414124060717022656 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup Op //! @{ template struct Op_traits {}; template struct Op_traits { static constexpr bool is_row = op_type::template traits::is_row; static constexpr bool is_col = op_type::template traits::is_col; static constexpr bool is_xvec = op_type::template traits::is_xvec; }; template struct Op_traits { static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; }; template class Op : public Base< typename T1::elem_type, Op > , public Op_traits::value> { public: typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; inline explicit Op(const T1& in_m); inline Op(const T1& in_m, const elem_type in_aux); inline Op(const T1& in_m, const elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b); inline Op(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b); inline Op(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c, const char junk); inline ~Op(); arma_aligned const T1& m; //!< the operand; must be derived from Base arma_aligned elem_type aux; //!< auxiliary data, using the element type as used by T1 arma_aligned uword aux_uword_a; //!< auxiliary data, uword format arma_aligned uword aux_uword_b; //!< auxiliary data, uword format arma_aligned uword aux_uword_c; //!< auxiliary data, uword format }; //! @} RcppArmadillo/inst/include/armadillo_bits/operator_cube_relational.hpp0000644000176200001440000001661614124060717026160 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup operator_cube_relational //! @{ // < : lt // > : gt // <= : lteq // >= : gteq // == : eq // != : noteq // && : and // || : or template inline const mtGlueCube operator< (const BaseCube::result,T1>& X, const BaseCube::result,T2>& Y) { arma_extra_debug_sigprint(); return mtGlueCube( X.get_ref(), Y.get_ref() ); } template inline const mtGlueCube operator> (const BaseCube::result,T1>& X, const BaseCube::result,T2>& Y) { arma_extra_debug_sigprint(); return mtGlueCube( X.get_ref(), Y.get_ref() ); } template inline const mtGlueCube operator<= (const BaseCube::result,T1>& X, const BaseCube::result,T2>& Y) { arma_extra_debug_sigprint(); return mtGlueCube( X.get_ref(), Y.get_ref() ); } template inline const mtGlueCube operator>= (const BaseCube::result,T1>& X, const BaseCube::result,T2>& Y) { arma_extra_debug_sigprint(); return mtGlueCube( X.get_ref(), Y.get_ref() ); } template inline const mtGlueCube operator== (const BaseCube& X, const BaseCube& Y) { arma_extra_debug_sigprint(); return mtGlueCube( X.get_ref(), Y.get_ref() ); } template inline const mtGlueCube operator!= (const BaseCube& X, const BaseCube& Y) { arma_extra_debug_sigprint(); return mtGlueCube( X.get_ref(), Y.get_ref() ); } template inline const mtGlueCube operator&& (const BaseCube::result,T1>& X, const BaseCube::result,T2>& Y) { arma_extra_debug_sigprint(); return mtGlueCube( X.get_ref(), Y.get_ref() ); } template inline const mtGlueCube operator|| (const BaseCube::result,T1>& X, const BaseCube::result,T2>& Y) { arma_extra_debug_sigprint(); return mtGlueCube( X.get_ref(), Y.get_ref() ); } // // // template inline const mtOpCube operator< (const typename arma_not_cx::result val, const BaseCube::result,T1>& X) { arma_extra_debug_sigprint(); return mtOpCube(X.get_ref(), val); } template inline const mtOpCube operator< (const BaseCube::result,T1>& X, const typename arma_not_cx::result val) { arma_extra_debug_sigprint(); return mtOpCube(X.get_ref(), val); } template inline const mtOpCube operator> (const typename arma_not_cx::result val, const BaseCube::result,T1>& X) { arma_extra_debug_sigprint(); return mtOpCube(X.get_ref(), val); } template inline const mtOpCube operator> (const BaseCube::result,T1>& X, const typename arma_not_cx::result val) { arma_extra_debug_sigprint(); return mtOpCube(X.get_ref(), val); } template inline const mtOpCube operator<= (const typename arma_not_cx::result val, const BaseCube::result,T1>& X) { arma_extra_debug_sigprint(); return mtOpCube(X.get_ref(), val); } template inline const mtOpCube operator<= (const BaseCube::result,T1>& X, const typename arma_not_cx::result val) { arma_extra_debug_sigprint(); return mtOpCube(X.get_ref(), val); } template inline const mtOpCube operator>= (const typename arma_not_cx::result val, const BaseCube::result,T1>& X) { arma_extra_debug_sigprint(); return mtOpCube(X.get_ref(), val); } template inline const mtOpCube operator>= (const BaseCube::result,T1>& X, const typename arma_not_cx::result val) { arma_extra_debug_sigprint(); return mtOpCube(X.get_ref(), val); } template inline const mtOpCube operator== (const typename T1::elem_type val, const BaseCube& X) { arma_extra_debug_sigprint(); return mtOpCube(X.get_ref(), val); } template inline const mtOpCube operator== (const BaseCube& X, const typename T1::elem_type val) { arma_extra_debug_sigprint(); return mtOpCube(X.get_ref(), val); } template inline const mtOpCube operator!= (const typename T1::elem_type val, const BaseCube& X) { arma_extra_debug_sigprint(); return mtOpCube(X.get_ref(), val); } template inline const mtOpCube operator!= (const BaseCube& X, const typename T1::elem_type val) { arma_extra_debug_sigprint(); return mtOpCube(X.get_ref(), val); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_symmat_bones.hpp0000644000176200001440000000307614124060717024307 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_symmat //! @{ class op_symmatu : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); }; class op_symmatl : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); }; class op_symmatu_cx : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); }; class op_symmatl_cx : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_inv.hpp0000644000176200001440000000460214124060717022364 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_inv //! @{ template arma_warn_unused arma_inline typename enable_if2< is_supported_blas_type::value, const Op >::result inv ( const Base& X ) { arma_extra_debug_sigprint(); return Op(X.get_ref()); } template inline typename enable_if2< is_supported_blas_type::value, bool >::result inv ( Mat& out, const Base& X ) { arma_extra_debug_sigprint(); const bool status = op_inv::apply_direct(out, X.get_ref(), "inv()"); if(status == false) { out.soft_reset(); arma_debug_warn_level(3, "inv(): matrix is singular"); } return status; } template arma_warn_unused arma_inline typename enable_if2< is_supported_blas_type::value, const Op >::result inv_sympd ( const Base& X ) { arma_extra_debug_sigprint(); return Op(X.get_ref()); } template inline typename enable_if2< is_supported_blas_type::value, bool >::result inv_sympd ( Mat& out, const Base& X ) { arma_extra_debug_sigprint(); const bool status = op_inv_sympd::apply_direct(out, X.get_ref()); if(status == false) { out.soft_reset(); arma_debug_warn_level(3, "inv_sympd(): matrix is singular or not positive definite"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/mtSpOp_meat.hpp0000644000176200001440000000357114124060717023341 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup mtSpOp //! @{ template inline mtSpOp::mtSpOp(const T1& in_m) : m(in_m) { arma_extra_debug_sigprint(); } template inline mtSpOp::mtSpOp(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b) : m(in_m) , aux_uword_a(in_aux_uword_a) , aux_uword_b(in_aux_uword_b) { arma_extra_debug_sigprint(); } template inline mtSpOp::mtSpOp(const char junk, const T1& in_m, const out_eT in_aux) : m(in_m) , aux_out_eT(in_aux) { arma_ignore(junk); arma_extra_debug_sigprint(); } template inline mtSpOp::~mtSpOp() { arma_extra_debug_sigprint(); } template template arma_inline bool mtSpOp::is_alias(const SpMat& X) const { return (void_ptr(&X) == void_ptr(&m)); } //! @} RcppArmadillo/inst/include/armadillo_bits/SpSubview_meat.hpp0000644000176200001440000011217414130024454024041 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpSubview //! @{ template inline SpSubview::~SpSubview() { arma_extra_debug_sigprint_this(this); } template inline SpSubview::SpSubview(const SpMat& in_m, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols) : m(in_m) , aux_row1(in_row1) , aux_col1(in_col1) , n_rows(in_n_rows) , n_cols(in_n_cols) , n_elem(in_n_rows * in_n_cols) , n_nonzero(0) { arma_extra_debug_sigprint_this(this); m.sync_csc(); // There must be a O(1) way to do this uword lend = m.col_ptrs[in_col1 + in_n_cols]; uword lend_row = in_row1 + in_n_rows; uword count = 0; for(uword i = m.col_ptrs[in_col1]; i < lend; ++i) { const uword m_row_indices_i = m.row_indices[i]; const bool condition = (m_row_indices_i >= in_row1) && (m_row_indices_i < lend_row); count += condition ? uword(1) : uword(0); } access::rw(n_nonzero) = count; } template inline SpSubview::SpSubview(const SpSubview& in) : m (in.m ) , aux_row1 (in.aux_row1 ) , aux_col1 (in.aux_col1 ) , n_rows (in.n_rows ) , n_cols (in.n_cols ) , n_elem (in.n_elem ) , n_nonzero(in.n_nonzero) { arma_extra_debug_sigprint(arma_str::format("this = %x in = %x") % this % &in); } template inline SpSubview::SpSubview(SpSubview&& in) : m (in.m ) , aux_row1 (in.aux_row1 ) , aux_col1 (in.aux_col1 ) , n_rows (in.n_rows ) , n_cols (in.n_cols ) , n_elem (in.n_elem ) , n_nonzero(in.n_nonzero) { arma_extra_debug_sigprint(arma_str::format("this = %x in = %x") % this % &in); // for paranoia access::rw(in.aux_row1 ) = 0; access::rw(in.aux_col1 ) = 0; access::rw(in.n_rows ) = 0; access::rw(in.n_cols ) = 0; access::rw(in.n_elem ) = 0; access::rw(in.n_nonzero) = 0; } template inline const SpSubview& SpSubview::operator+=(const eT val) { arma_extra_debug_sigprint(); if(val == eT(0)) { return *this; } Mat tmp( (*this).n_rows, (*this).n_cols, arma_nozeros_indicator() ); tmp.fill(val); return (*this).operator=( (*this) + tmp ); } template inline const SpSubview& SpSubview::operator-=(const eT val) { arma_extra_debug_sigprint(); if(val == eT(0)) { return *this; } Mat tmp( (*this).n_rows, (*this).n_cols, arma_nozeros_indicator() ); tmp.fill(val); return (*this).operator=( (*this) - tmp ); } template inline const SpSubview& SpSubview::operator*=(const eT val) { arma_extra_debug_sigprint(); if(val == eT(0)) { (*this).zeros(); return *this; } if((n_elem == 0) || (n_nonzero == 0)) { return *this; } m.sync_csc(); m.invalidate_cache(); const uword lstart_row = aux_row1; const uword lend_row = aux_row1 + n_rows; const uword lstart_col = aux_col1; const uword lend_col = aux_col1 + n_cols; const uword* m_row_indices = m.row_indices; eT* m_values = access::rwp(m.values); bool has_zero = false; for(uword c = lstart_col; c < lend_col; ++c) { const uword r_start = m.col_ptrs[c ]; const uword r_end = m.col_ptrs[c + 1]; for(uword r = r_start; r < r_end; ++r) { const uword m_row_indices_r = m_row_indices[r]; if( (m_row_indices_r >= lstart_row) && (m_row_indices_r < lend_row) ) { eT& m_values_r = m_values[r]; m_values_r *= val; if(m_values_r == eT(0)) { has_zero = true; } } } } if(has_zero) { const uword old_m_n_nonzero = m.n_nonzero; access::rw(m).remove_zeros(); if(m.n_nonzero != old_m_n_nonzero) { access::rw(n_nonzero) = n_nonzero - (old_m_n_nonzero - m.n_nonzero); } } return *this; } template inline const SpSubview& SpSubview::operator/=(const eT val) { arma_extra_debug_sigprint(); arma_debug_check( (val == eT(0)), "element-wise division: division by zero" ); m.sync_csc(); m.invalidate_cache(); const uword lstart_row = aux_row1; const uword lend_row = aux_row1 + n_rows; const uword lstart_col = aux_col1; const uword lend_col = aux_col1 + n_cols; const uword* m_row_indices = m.row_indices; eT* m_values = access::rwp(m.values); bool has_zero = false; for(uword c = lstart_col; c < lend_col; ++c) { const uword r_start = m.col_ptrs[c ]; const uword r_end = m.col_ptrs[c + 1]; for(uword r = r_start; r < r_end; ++r) { const uword m_row_indices_r = m_row_indices[r]; if( (m_row_indices_r >= lstart_row) && (m_row_indices_r < lend_row) ) { eT& m_values_r = m_values[r]; m_values_r /= val; if(m_values_r == eT(0)) { has_zero = true; } } } } if(has_zero) { const uword old_m_n_nonzero = m.n_nonzero; access::rw(m).remove_zeros(); if(m.n_nonzero != old_m_n_nonzero) { access::rw(n_nonzero) = n_nonzero - (old_m_n_nonzero - m.n_nonzero); } } return *this; } template template inline const SpSubview& SpSubview::operator=(const Base& in) { arma_extra_debug_sigprint(); if(is_same_type< T1, Gen, gen_zeros> >::yes) { const Proxy P(in.get_ref()); arma_debug_assert_same_size(n_rows, n_cols, P.get_n_rows(), P.get_n_cols(), "insertion into sparse submatrix"); (*this).zeros(); return *this; } if(is_same_type< T1, Gen, gen_eye> >::yes) { const Proxy P(in.get_ref()); arma_debug_assert_same_size(n_rows, n_cols, P.get_n_rows(), P.get_n_cols(), "insertion into sparse submatrix"); (*this).eye(); return *this; } const quasi_unwrap U(in.get_ref()); arma_debug_assert_same_size(n_rows, n_cols, U.M.n_rows, U.M.n_cols, "insertion into sparse submatrix"); spglue_merge::subview_merge(*this, U.M); return *this; } template template inline const SpSubview& SpSubview::operator+=(const Base& x) { arma_extra_debug_sigprint(); return (*this).operator=( (*this) + x.get_ref() ); } template template inline const SpSubview& SpSubview::operator-=(const Base& x) { arma_extra_debug_sigprint(); return (*this).operator=( (*this) - x.get_ref() ); } template template inline const SpSubview& SpSubview::operator*=(const Base& x) { arma_extra_debug_sigprint(); SpMat tmp(*this); tmp *= x.get_ref(); return (*this).operator=(tmp); } template template inline const SpSubview& SpSubview::operator%=(const Base& x) { arma_extra_debug_sigprint(); return (*this).operator=( (*this) % x.get_ref() ); } template template inline const SpSubview& SpSubview::operator/=(const Base& x) { arma_extra_debug_sigprint(); return (*this).operator=( (*this) / x.get_ref() ); } template inline const SpSubview& SpSubview::operator=(const SpSubview& x) { arma_extra_debug_sigprint(); return (*this).operator_equ_common(x); } template template inline const SpSubview& SpSubview::operator=(const SpBase& x) { arma_extra_debug_sigprint(); return (*this).operator_equ_common( x.get_ref() ); } template template inline const SpSubview& SpSubview::operator_equ_common(const SpBase& in) { arma_extra_debug_sigprint(); const unwrap_spmat U(in.get_ref()); arma_debug_assert_same_size(n_rows, n_cols, U.M.n_rows, U.M.n_cols, "insertion into sparse submatrix"); if(U.is_alias(m)) { const SpMat tmp(U.M); spglue_merge::subview_merge(*this, tmp); } else { spglue_merge::subview_merge(*this, U.M); } return *this; } template template inline const SpSubview& SpSubview::operator+=(const SpBase& x) { arma_extra_debug_sigprint(); // TODO: implement dedicated machinery return (*this).operator=( (*this) + x.get_ref() ); } template template inline const SpSubview& SpSubview::operator-=(const SpBase& x) { arma_extra_debug_sigprint(); // TODO: implement dedicated machinery return (*this).operator=( (*this) - x.get_ref() ); } template template inline const SpSubview& SpSubview::operator*=(const SpBase& x) { arma_extra_debug_sigprint(); return (*this).operator=( (*this) * x.get_ref() ); } template template inline const SpSubview& SpSubview::operator%=(const SpBase& x) { arma_extra_debug_sigprint(); // TODO: implement dedicated machinery return (*this).operator=( (*this) % x.get_ref() ); } template template inline const SpSubview& SpSubview::operator/=(const SpBase& x) { arma_extra_debug_sigprint(); // NOTE: use of this function is not advised; it is implemented only for completeness SpProxy p(x.get_ref()); arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "element-wise division"); if(p.is_alias(m) == false) { for(uword lcol = 0; lcol < n_cols; ++lcol) for(uword lrow = 0; lrow < n_rows; ++lrow) { at(lrow,lcol) /= p.at(lrow,lcol); } } else { const SpMat tmp(p.Q); (*this).operator/=(tmp); } return *this; } //! apply a functor to each element template template inline void SpSubview::for_each(functor F) { arma_extra_debug_sigprint(); m.sync_csc(); m.invalidate_cache(); const uword lstart_row = aux_row1; const uword lend_row = aux_row1 + n_rows; const uword lstart_col = aux_col1; const uword lend_col = aux_col1 + n_cols; const uword* m_row_indices = m.row_indices; eT* m_values = access::rwp(m.values); bool has_zero = false; for(uword c = lstart_col; c < lend_col; ++c) { const uword r_start = m.col_ptrs[c ]; const uword r_end = m.col_ptrs[c + 1]; for(uword r = r_start; r < r_end; ++r) { const uword m_row_indices_r = m_row_indices[r]; if( (m_row_indices_r >= lstart_row) && (m_row_indices_r < lend_row) ) { eT& m_values_r = m_values[r]; F(m_values_r); if(m_values_r == eT(0)) { has_zero = true; } } } } if(has_zero) { const uword old_m_n_nonzero = m.n_nonzero; access::rw(m).remove_zeros(); if(m.n_nonzero != old_m_n_nonzero) { access::rw(n_nonzero) = n_nonzero - (old_m_n_nonzero - m.n_nonzero); } } } template template inline void SpSubview::for_each(functor F) const { arma_extra_debug_sigprint(); m.sync_csc(); const uword lstart_row = aux_row1; const uword lend_row = aux_row1 + n_rows; const uword lstart_col = aux_col1; const uword lend_col = aux_col1 + n_cols; const uword* m_row_indices = m.row_indices; for(uword c = lstart_col; c < lend_col; ++c) { const uword r_start = m.col_ptrs[c ]; const uword r_end = m.col_ptrs[c + 1]; for(uword r = r_start; r < r_end; ++r) { const uword m_row_indices_r = m_row_indices[r]; if( (m_row_indices_r >= lstart_row) && (m_row_indices_r < lend_row) ) { F(m.values[r]); } } } } //! transform each element using a functor template template inline void SpSubview::transform(functor F) { arma_extra_debug_sigprint(); m.sync_csc(); m.invalidate_cache(); const uword lstart_row = aux_row1; const uword lend_row = aux_row1 + n_rows; const uword lstart_col = aux_col1; const uword lend_col = aux_col1 + n_cols; const uword* m_row_indices = m.row_indices; eT* m_values = access::rwp(m.values); bool has_zero = false; for(uword c = lstart_col; c < lend_col; ++c) { const uword r_start = m.col_ptrs[c ]; const uword r_end = m.col_ptrs[c + 1]; for(uword r = r_start; r < r_end; ++r) { const uword m_row_indices_r = m_row_indices[r]; if( (m_row_indices_r >= lstart_row) && (m_row_indices_r < lend_row) ) { eT& m_values_r = m_values[r]; m_values_r = eT( F(m_values_r) ); if(m_values_r == eT(0)) { has_zero = true; } } } } if(has_zero) { const uword old_m_n_nonzero = m.n_nonzero; access::rw(m).remove_zeros(); if(m.n_nonzero != old_m_n_nonzero) { access::rw(n_nonzero) = n_nonzero - (old_m_n_nonzero - m.n_nonzero); } } } template inline void SpSubview::replace(const eT old_val, const eT new_val) { arma_extra_debug_sigprint(); if(old_val == eT(0)) { if(new_val != eT(0)) { Mat tmp(*this); tmp.replace(old_val, new_val); (*this).operator=(tmp); } return; } m.sync_csc(); m.invalidate_cache(); const uword lstart_row = aux_row1; const uword lend_row = aux_row1 + n_rows; const uword lstart_col = aux_col1; const uword lend_col = aux_col1 + n_cols; const uword* m_row_indices = m.row_indices; eT* m_values = access::rwp(m.values); if(arma_isnan(old_val)) { for(uword c = lstart_col; c < lend_col; ++c) { const uword r_start = m.col_ptrs[c ]; const uword r_end = m.col_ptrs[c + 1]; for(uword r = r_start; r < r_end; ++r) { const uword m_row_indices_r = m_row_indices[r]; if( (m_row_indices_r >= lstart_row) && (m_row_indices_r < lend_row) ) { eT& val = m_values[r]; val = (arma_isnan(val)) ? new_val : val; } } } } else { for(uword c = lstart_col; c < lend_col; ++c) { const uword r_start = m.col_ptrs[c ]; const uword r_end = m.col_ptrs[c + 1]; for(uword r = r_start; r < r_end; ++r) { const uword m_row_indices_r = m_row_indices[r]; if( (m_row_indices_r >= lstart_row) && (m_row_indices_r < lend_row) ) { eT& val = m_values[r]; val = (val == old_val) ? new_val : val; } } } } if(new_val == eT(0)) { access::rw(m).remove_zeros(); } } template inline void SpSubview::clean(const typename get_pod_type::result threshold) { arma_extra_debug_sigprint(); if((n_elem == 0) || (n_nonzero == 0)) { return; } // TODO: replace with a more efficient implementation SpMat tmp(*this); tmp.clean(threshold); if(is_cx::yes) { (*this).operator=(tmp); } else if(tmp.n_nonzero != n_nonzero) { (*this).operator=(tmp); } } template inline void SpSubview::clamp(const eT min_val, const eT max_val) { arma_extra_debug_sigprint(); if(is_cx::no) { arma_debug_check( (access::tmp_real(min_val) > access::tmp_real(max_val)), "SpSubview::clamp(): min_val must be less than max_val" ); } else { arma_debug_check( (access::tmp_real(min_val) > access::tmp_real(max_val)), "SpSubview::clamp(): real(min_val) must be less than real(max_val)" ); arma_debug_check( (access::tmp_imag(min_val) > access::tmp_imag(max_val)), "SpSubview::clamp(): imag(min_val) must be less than imag(max_val)" ); } if((n_elem == 0) || (n_nonzero == 0)) { return; } // TODO: replace with a more efficient implementation SpMat tmp(*this); tmp.clamp(min_val, max_val); (*this).operator=(tmp); } template inline void SpSubview::fill(const eT val) { arma_extra_debug_sigprint(); if(val != eT(0)) { Mat tmp( (*this).n_rows, (*this).n_cols, arma_nozeros_indicator() ); tmp.fill(val); (*this).operator=(tmp); } else { (*this).zeros(); } } template inline void SpSubview::zeros() { arma_extra_debug_sigprint(); if((n_elem == 0) || (n_nonzero == 0)) { return; } if((m.n_nonzero - n_nonzero) == 0) { access::rw(m).zeros(); access::rw(n_nonzero) = 0; return; } SpMat tmp(arma_reserve_indicator(), m.n_rows, m.n_cols, m.n_nonzero - n_nonzero); const uword sv_row_start = aux_row1; const uword sv_col_start = aux_col1; const uword sv_row_end = aux_row1 + n_rows - 1; const uword sv_col_end = aux_col1 + n_cols - 1; typename SpMat::const_iterator m_it = m.begin(); typename SpMat::const_iterator m_it_end = m.end(); uword tmp_count = 0; for(; m_it != m_it_end; ++m_it) { const uword m_it_row = m_it.row(); const uword m_it_col = m_it.col(); const bool inside_box = ((m_it_row >= sv_row_start) && (m_it_row <= sv_row_end)) && ((m_it_col >= sv_col_start) && (m_it_col <= sv_col_end)); if(inside_box == false) { access::rw(tmp.values[tmp_count]) = (*m_it); access::rw(tmp.row_indices[tmp_count]) = m_it_row; access::rw(tmp.col_ptrs[m_it_col + 1])++; ++tmp_count; } } for(uword i=0; i < tmp.n_cols; ++i) { access::rw(tmp.col_ptrs[i + 1]) += tmp.col_ptrs[i]; } access::rw(m).steal_mem(tmp); access::rw(n_nonzero) = 0; } template inline void SpSubview::ones() { arma_extra_debug_sigprint(); (*this).fill(eT(1)); } template inline void SpSubview::eye() { arma_extra_debug_sigprint(); SpMat tmp; tmp.eye( (*this).n_rows, (*this).n_cols ); (*this).operator=(tmp); } template inline void SpSubview::randu() { arma_extra_debug_sigprint(); Mat tmp( (*this).n_rows, (*this).n_cols, fill::randu ); (*this).operator=(tmp); } template inline void SpSubview::randn() { arma_extra_debug_sigprint(); Mat tmp( (*this).n_rows, (*this).n_cols, fill::randn ); (*this).operator=(tmp); } template arma_hot inline SpSubview_MapMat_val SpSubview::operator[](const uword i) { const uword lrow = i % n_rows; const uword lcol = i / n_rows; return (*this).at(lrow, lcol); } template arma_hot inline eT SpSubview::operator[](const uword i) const { const uword lrow = i % n_rows; const uword lcol = i / n_rows; return (*this).at(lrow, lcol); } template arma_hot inline SpSubview_MapMat_val SpSubview::operator()(const uword i) { arma_debug_check_bounds( (i >= n_elem), "SpSubview::operator(): index out of bounds" ); const uword lrow = i % n_rows; const uword lcol = i / n_rows; return (*this).at(lrow, lcol); } template arma_hot inline eT SpSubview::operator()(const uword i) const { arma_debug_check_bounds( (i >= n_elem), "SpSubview::operator(): index out of bounds" ); const uword lrow = i % n_rows; const uword lcol = i / n_rows; return (*this).at(lrow, lcol); } template arma_hot inline SpSubview_MapMat_val SpSubview::operator()(const uword in_row, const uword in_col) { arma_debug_check_bounds( (in_row >= n_rows) || (in_col >= n_cols), "SpSubview::operator(): index out of bounds" ); return (*this).at(in_row, in_col); } template arma_hot inline eT SpSubview::operator()(const uword in_row, const uword in_col) const { arma_debug_check_bounds( (in_row >= n_rows) || (in_col >= n_cols), "SpSubview::operator(): index out of bounds" ); return (*this).at(in_row, in_col); } template arma_hot inline SpSubview_MapMat_val SpSubview::at(const uword i) { const uword lrow = i % n_rows; const uword lcol = i / n_cols; return (*this).at(lrow, lcol); } template arma_hot inline eT SpSubview::at(const uword i) const { const uword lrow = i % n_rows; const uword lcol = i / n_cols; return (*this).at(lrow, lcol); } template arma_hot inline SpSubview_MapMat_val SpSubview::at(const uword in_row, const uword in_col) { return SpSubview_MapMat_val((*this), m.cache, aux_row1 + in_row, aux_col1 + in_col); } template arma_hot inline eT SpSubview::at(const uword in_row, const uword in_col) const { return m.at(aux_row1 + in_row, aux_col1 + in_col); } template inline bool SpSubview::check_overlap(const SpSubview& x) const { const SpSubview& t = *this; if(&t.m != &x.m) { return false; } else { if( (t.n_elem == 0) || (x.n_elem == 0) ) { return false; } else { const uword t_row_start = t.aux_row1; const uword t_row_end_p1 = t_row_start + t.n_rows; const uword t_col_start = t.aux_col1; const uword t_col_end_p1 = t_col_start + t.n_cols; const uword x_row_start = x.aux_row1; const uword x_row_end_p1 = x_row_start + x.n_rows; const uword x_col_start = x.aux_col1; const uword x_col_end_p1 = x_col_start + x.n_cols; const bool outside_rows = ( (x_row_start >= t_row_end_p1) || (t_row_start >= x_row_end_p1) ); const bool outside_cols = ( (x_col_start >= t_col_end_p1) || (t_col_start >= x_col_end_p1) ); return ( (outside_rows == false) && (outside_cols == false) ); } } } template inline bool SpSubview::is_vec() const { return ( (n_rows == 1) || (n_cols == 1) ); } template inline SpSubview_row SpSubview::row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds(row_num >= n_rows, "SpSubview::row(): out of bounds"); return SpSubview_row(const_cast< SpMat& >(m), row_num + aux_row1, aux_col1, n_cols); } template inline const SpSubview_row SpSubview::row(const uword row_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds(row_num >= n_rows, "SpSubview::row(): out of bounds"); return SpSubview_row(m, row_num + aux_row1, aux_col1, n_cols); } template inline SpSubview_col SpSubview::col(const uword col_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds(col_num >= n_cols, "SpSubview::col(): out of bounds"); return SpSubview_col(const_cast< SpMat& >(m), col_num + aux_col1, aux_row1, n_rows); } template inline const SpSubview_col SpSubview::col(const uword col_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds(col_num >= n_cols, "SpSubview::col(): out of bounds"); return SpSubview_col(m, col_num + aux_col1, aux_row1, n_rows); } template inline SpSubview SpSubview::rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_row2 >= n_rows), "SpSubview::rows(): indices out of bounds or incorrectly used" ); return submat(in_row1, 0, in_row2, n_cols - 1); } template inline const SpSubview SpSubview::rows(const uword in_row1, const uword in_row2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_row2 >= n_rows), "SpSubview::rows(): indices out of bounds or incorrectly used" ); return submat(in_row1, 0, in_row2, n_cols - 1); } template inline SpSubview SpSubview::cols(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_col1 > in_col2) || (in_col2 >= n_cols), "SpSubview::cols(): indices out of bounds or incorrectly used" ); return submat(0, in_col1, n_rows - 1, in_col2); } template inline const SpSubview SpSubview::cols(const uword in_col1, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_col1 > in_col2) || (in_col2 >= n_cols), "SpSubview::cols(): indices out of bounds or incorrectly used" ); return submat(0, in_col1, n_rows - 1, in_col2); } template inline SpSubview SpSubview::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols), "SpSubview::submat(): indices out of bounds or incorrectly used" ); return access::rw(m).submat(in_row1 + aux_row1, in_col1 + aux_col1, in_row2 + aux_row1, in_col2 + aux_col1); } template inline const SpSubview SpSubview::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols), "SpSubview::submat(): indices out of bounds or incorrectly used" ); return m.submat(in_row1 + aux_row1, in_col1 + aux_col1, in_row2 + aux_row1, in_col2 + aux_col1); } template inline SpSubview SpSubview::submat(const span& row_span, const span& col_span) { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const bool col_all = row_span.whole; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_all ? n_rows : row_span.b; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_all ? n_cols : col_span.b; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= n_rows))) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= n_cols))), "SpSubview::submat(): indices out of bounds or incorrectly used" ); return submat(in_row1, in_col1, in_row2, in_col2); } template inline const SpSubview SpSubview::submat(const span& row_span, const span& col_span) const { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const bool col_all = row_span.whole; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_all ? n_rows - 1 : row_span.b; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_all ? n_cols - 1 : col_span.b; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= n_rows))) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= n_cols))), "SpSubview::submat(): indices out of bounds or incorrectly used" ); return submat(in_row1, in_col1, in_row2, in_col2); } template inline SpSubview SpSubview::operator()(const uword row_num, const span& col_span) { arma_extra_debug_sigprint(); return submat(span(row_num, row_num), col_span); } template inline const SpSubview SpSubview::operator()(const uword row_num, const span& col_span) const { arma_extra_debug_sigprint(); return submat(span(row_num, row_num), col_span); } template inline SpSubview SpSubview::operator()(const span& row_span, const uword col_num) { arma_extra_debug_sigprint(); return submat(row_span, span(col_num, col_num)); } template inline const SpSubview SpSubview::operator()(const span& row_span, const uword col_num) const { arma_extra_debug_sigprint(); return submat(row_span, span(col_num, col_num)); } template inline SpSubview SpSubview::operator()(const span& row_span, const span& col_span) { arma_extra_debug_sigprint(); return submat(row_span, col_span); } template inline const SpSubview SpSubview::operator()(const span& row_span, const span& col_span) const { arma_extra_debug_sigprint(); return submat(row_span, col_span); } template inline void SpSubview::swap_rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check((in_row1 >= n_rows) || (in_row2 >= n_rows), "SpSubview::swap_rows(): invalid row index"); const uword lstart_col = aux_col1; const uword lend_col = aux_col1 + n_cols; for(uword c = lstart_col; c < lend_col; ++c) { const eT val = access::rw(m).at(in_row1 + aux_row1, c); access::rw(m).at(in_row2 + aux_row1, c) = eT( access::rw(m).at(in_row1 + aux_row1, c) ); access::rw(m).at(in_row1 + aux_row1, c) = val; } } template inline void SpSubview::swap_cols(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check((in_col1 >= n_cols) || (in_col2 >= n_cols), "SpSubview::swap_cols(): invalid column index"); const uword lstart_row = aux_row1; const uword lend_row = aux_row1 + n_rows; for(uword r = lstart_row; r < lend_row; ++r) { const eT val = access::rw(m).at(r, in_col1 + aux_col1); access::rw(m).at(r, in_col1 + aux_col1) = eT( access::rw(m).at(r, in_col2 + aux_col1) ); access::rw(m).at(r, in_col2 + aux_col1) = val; } } template inline typename SpSubview::iterator SpSubview::begin() { return iterator(*this); } template inline typename SpSubview::const_iterator SpSubview::begin() const { m.sync_csc(); return const_iterator(*this); } template inline typename SpSubview::const_iterator SpSubview::cbegin() const { m.sync_csc(); return const_iterator(*this); } template inline typename SpSubview::iterator SpSubview::begin_col(const uword col_num) { m.sync_csc(); return iterator(*this, 0, col_num); } template inline typename SpSubview::const_iterator SpSubview::begin_col(const uword col_num) const { m.sync_csc(); return const_iterator(*this, 0, col_num); } template inline typename SpSubview::row_iterator SpSubview::begin_row(const uword row_num) { m.sync_csc(); return row_iterator(*this, row_num, 0); } template inline typename SpSubview::const_row_iterator SpSubview::begin_row(const uword row_num) const { m.sync_csc(); return const_row_iterator(*this, row_num, 0); } template inline typename SpSubview::iterator SpSubview::end() { m.sync_csc(); return iterator(*this, 0, n_cols, n_nonzero, m.n_nonzero - n_nonzero); } template inline typename SpSubview::const_iterator SpSubview::end() const { m.sync_csc(); return const_iterator(*this, 0, n_cols, n_nonzero, m.n_nonzero - n_nonzero); } template inline typename SpSubview::const_iterator SpSubview::cend() const { m.sync_csc(); return const_iterator(*this, 0, n_cols, n_nonzero, m.n_nonzero - n_nonzero); } template inline typename SpSubview::row_iterator SpSubview::end_row() { m.sync_csc(); return row_iterator(*this, n_nonzero); } template inline typename SpSubview::const_row_iterator SpSubview::end_row() const { m.sync_csc(); return const_row_iterator(*this, n_nonzero); } template inline typename SpSubview::row_iterator SpSubview::end_row(const uword row_num) { m.sync_csc(); return row_iterator(*this, row_num + 1, 0); } template inline typename SpSubview::const_row_iterator SpSubview::end_row(const uword row_num) const { m.sync_csc(); return const_row_iterator(*this, row_num + 1, 0); } template arma_inline bool SpSubview::is_alias(const SpMat& X) const { return m.is_alias(X); } template inline arma_warn_unused eT& SpSubview::insert_element(const uword in_row, const uword in_col, const eT in_val) { arma_extra_debug_sigprint(); // This may not actually insert an element. const uword old_n_nonzero = m.n_nonzero; eT& retval = access::rw(m).insert_element(in_row + aux_row1, in_col + aux_col1, in_val); // Update n_nonzero (if necessary). access::rw(n_nonzero) += (m.n_nonzero - old_n_nonzero); return retval; } template inline void SpSubview::delete_element(const uword in_row, const uword in_col) { arma_extra_debug_sigprint(); // This may not actually delete an element. const uword old_n_nonzero = m.n_nonzero; access::rw(m).delete_element(in_row + aux_row1, in_col + aux_col1); access::rw(n_nonzero) -= (old_n_nonzero - m.n_nonzero); } template inline void SpSubview::invalidate_cache() const { arma_extra_debug_sigprint(); m.invalidate_cache(); } // // // template inline SpSubview_col::SpSubview_col(const SpMat& in_m, const uword in_col) : SpSubview(in_m, 0, in_col, in_m.n_rows, 1) { arma_extra_debug_sigprint(); } template inline SpSubview_col::SpSubview_col(const SpMat& in_m, const uword in_col, const uword in_row1, const uword in_n_rows) : SpSubview(in_m, in_row1, in_col, in_n_rows, 1) { arma_extra_debug_sigprint(); } template inline void SpSubview_col::operator=(const SpSubview& x) { arma_extra_debug_sigprint(); SpSubview::operator=(x); } template inline void SpSubview_col::operator=(const SpSubview_col& x) { arma_extra_debug_sigprint(); SpSubview::operator=(x); // interprets 'SpSubview_col' as 'SpSubview' } template template inline void SpSubview_col::operator=(const SpBase& x) { arma_extra_debug_sigprint(); SpSubview::operator=(x); } template template inline void SpSubview_col::operator=(const Base& x) { arma_extra_debug_sigprint(); SpSubview::operator=(x); } template inline arma_warn_unused const SpOp,spop_htrans> SpSubview_col::t() const { return SpOp,spop_htrans>(*this); } template inline arma_warn_unused const SpOp,spop_htrans> SpSubview_col::ht() const { return SpOp,spop_htrans>(*this); } template inline arma_warn_unused const SpOp,spop_strans> SpSubview_col::st() const { return SpOp,spop_strans>(*this); } // // // template inline SpSubview_row::SpSubview_row(const SpMat& in_m, const uword in_row) : SpSubview(in_m, in_row, 0, 1, in_m.n_cols) { arma_extra_debug_sigprint(); } template inline SpSubview_row::SpSubview_row(const SpMat& in_m, const uword in_row, const uword in_col1, const uword in_n_cols) : SpSubview(in_m, in_row, in_col1, 1, in_n_cols) { arma_extra_debug_sigprint(); } template inline void SpSubview_row::operator=(const SpSubview& x) { arma_extra_debug_sigprint(); SpSubview::operator=(x); } template inline void SpSubview_row::operator=(const SpSubview_row& x) { arma_extra_debug_sigprint(); SpSubview::operator=(x); // interprets 'SpSubview_row' as 'SpSubview' } template template inline void SpSubview_row::operator=(const SpBase& x) { arma_extra_debug_sigprint(); SpSubview::operator=(x); } template template inline void SpSubview_row::operator=(const Base& x) { arma_extra_debug_sigprint(); SpSubview::operator=(x); } template inline arma_warn_unused const SpOp,spop_htrans> SpSubview_row::t() const { return SpOp,spop_htrans>(*this); } template inline arma_warn_unused const SpOp,spop_htrans> SpSubview_row::ht() const { return SpOp,spop_htrans>(*this); } template inline arma_warn_unused const SpOp,spop_strans> SpSubview_row::st() const { return SpOp,spop_strans>(*this); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_shuffle.hpp0000644000176200001440000000323514124060717023225 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_shuffle //! @{ template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && resolves_to_vector::yes, const Op >::result shuffle ( const T1& X ) { arma_extra_debug_sigprint(); return Op(X); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && resolves_to_vector::no, const Op >::result shuffle ( const T1& X ) { arma_extra_debug_sigprint(); return Op(X, 0, 0); } template arma_warn_unused arma_inline typename enable_if2 < (is_arma_type::value), const Op >::result shuffle ( const T1& X, const uword dim ) { arma_extra_debug_sigprint(); return Op(X, dim, 0); } //! @} RcppArmadillo/inst/include/armadillo_bits/subview_elem2_meat.hpp0000644000176200001440000005163514124060717024673 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup subview_elem2 //! @{ template inline subview_elem2::~subview_elem2() { arma_extra_debug_sigprint(); } template arma_inline subview_elem2::subview_elem2 ( const Mat& in_m, const Base& in_ri, const Base& in_ci, const bool in_all_rows, const bool in_all_cols ) : m (in_m ) , base_ri (in_ri ) , base_ci (in_ci ) , all_rows (in_all_rows) , all_cols (in_all_cols) { arma_extra_debug_sigprint(); } template template inline void subview_elem2::inplace_op(const eT val) { arma_extra_debug_sigprint(); Mat& m_local = const_cast< Mat& >(m); const uword m_n_rows = m_local.n_rows; const uword m_n_cols = m_local.n_cols; if( (all_rows == false) && (all_cols == false) ) { const unwrap_check_mixed tmp1(base_ri.get_ref(), m_local); const unwrap_check_mixed tmp2(base_ci.get_ref(), m_local); const umat& ri = tmp1.M; const umat& ci = tmp2.M; arma_debug_check ( ( ((ri.is_vec() == false) && (ri.is_empty() == false)) || ((ci.is_vec() == false) && (ci.is_empty() == false)) ), "Mat::elem(): given object must be a vector" ); const uword* ri_mem = ri.memptr(); const uword ri_n_elem = ri.n_elem; const uword* ci_mem = ci.memptr(); const uword ci_n_elem = ci.n_elem; for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) { const uword col = ci_mem[ci_count]; arma_debug_check_bounds( (col >= m_n_cols), "Mat::elem(): index out of bounds" ); for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count) { const uword row = ri_mem[ri_count]; arma_debug_check_bounds( (row >= m_n_rows), "Mat::elem(): index out of bounds" ); if(is_same_type::yes) { m_local.at(row,col) = val; } if(is_same_type::yes) { m_local.at(row,col) += val; } if(is_same_type::yes) { m_local.at(row,col) -= val; } if(is_same_type::yes) { m_local.at(row,col) *= val; } if(is_same_type::yes) { m_local.at(row,col) /= val; } } } } else if( (all_rows == true) && (all_cols == false) ) { const unwrap_check_mixed tmp2(base_ci.get_ref(), m_local); const umat& ci = tmp2.M; arma_debug_check ( ( (ci.is_vec() == false) && (ci.is_empty() == false) ), "Mat::elem(): given object must be a vector" ); const uword* ci_mem = ci.memptr(); const uword ci_n_elem = ci.n_elem; for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) { const uword col = ci_mem[ci_count]; arma_debug_check_bounds( (col >= m_n_cols), "Mat::elem(): index out of bounds" ); eT* colptr = m_local.colptr(col); if(is_same_type::yes) { arrayops::inplace_set (colptr, val, m_n_rows); } if(is_same_type::yes) { arrayops::inplace_plus (colptr, val, m_n_rows); } if(is_same_type::yes) { arrayops::inplace_minus(colptr, val, m_n_rows); } if(is_same_type::yes) { arrayops::inplace_mul (colptr, val, m_n_rows); } if(is_same_type::yes) { arrayops::inplace_div (colptr, val, m_n_rows); } } } else if( (all_rows == false) && (all_cols == true) ) { const unwrap_check_mixed tmp1(base_ri.get_ref(), m_local); const umat& ri = tmp1.M; arma_debug_check ( ( (ri.is_vec() == false) && (ri.is_empty() == false) ), "Mat::elem(): given object must be a vector" ); const uword* ri_mem = ri.memptr(); const uword ri_n_elem = ri.n_elem; for(uword col=0; col < m_n_cols; ++col) { for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count) { const uword row = ri_mem[ri_count]; arma_debug_check_bounds( (row >= m_n_rows), "Mat::elem(): index out of bounds" ); if(is_same_type::yes) { m_local.at(row,col) = val; } if(is_same_type::yes) { m_local.at(row,col) += val; } if(is_same_type::yes) { m_local.at(row,col) -= val; } if(is_same_type::yes) { m_local.at(row,col) *= val; } if(is_same_type::yes) { m_local.at(row,col) /= val; } } } } } template template inline void subview_elem2::inplace_op(const Base& x) { arma_extra_debug_sigprint(); Mat& m_local = const_cast< Mat& >(m); const uword m_n_rows = m_local.n_rows; const uword m_n_cols = m_local.n_cols; const unwrap_check tmp(x.get_ref(), m_local); const Mat& X = tmp.M; if( (all_rows == false) && (all_cols == false) ) { const unwrap_check_mixed tmp1(base_ri.get_ref(), m_local); const unwrap_check_mixed tmp2(base_ci.get_ref(), m_local); const umat& ri = tmp1.M; const umat& ci = tmp2.M; arma_debug_check ( ( ((ri.is_vec() == false) && (ri.is_empty() == false)) || ((ci.is_vec() == false) && (ci.is_empty() == false)) ), "Mat::elem(): given object must be a vector" ); const uword* ri_mem = ri.memptr(); const uword ri_n_elem = ri.n_elem; const uword* ci_mem = ci.memptr(); const uword ci_n_elem = ci.n_elem; arma_debug_assert_same_size( ri_n_elem, ci_n_elem, X.n_rows, X.n_cols, "Mat::elem()" ); for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) { const uword col = ci_mem[ci_count]; arma_debug_check_bounds( (col >= m_n_cols), "Mat::elem(): index out of bounds" ); for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count) { const uword row = ri_mem[ri_count]; arma_debug_check_bounds( (row >= m_n_rows), "Mat::elem(): index out of bounds" ); if(is_same_type::yes) { m_local.at(row,col) = X.at(ri_count, ci_count); } if(is_same_type::yes) { m_local.at(row,col) += X.at(ri_count, ci_count); } if(is_same_type::yes) { m_local.at(row,col) -= X.at(ri_count, ci_count); } if(is_same_type::yes) { m_local.at(row,col) *= X.at(ri_count, ci_count); } if(is_same_type::yes) { m_local.at(row,col) /= X.at(ri_count, ci_count); } } } } else if( (all_rows == true) && (all_cols == false) ) { const unwrap_check_mixed tmp2(base_ci.get_ref(), m_local); const umat& ci = tmp2.M; arma_debug_check ( ( (ci.is_vec() == false) && (ci.is_empty() == false) ), "Mat::elem(): given object must be a vector" ); const uword* ci_mem = ci.memptr(); const uword ci_n_elem = ci.n_elem; arma_debug_assert_same_size( m_n_rows, ci_n_elem, X.n_rows, X.n_cols, "Mat::elem()" ); for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) { const uword col = ci_mem[ci_count]; arma_debug_check_bounds( (col >= m_n_cols), "Mat::elem(): index out of bounds" ); eT* m_colptr = m_local.colptr(col); const eT* X_colptr = X.colptr(ci_count); if(is_same_type::yes) { arrayops::copy (m_colptr, X_colptr, m_n_rows); } if(is_same_type::yes) { arrayops::inplace_plus (m_colptr, X_colptr, m_n_rows); } if(is_same_type::yes) { arrayops::inplace_minus(m_colptr, X_colptr, m_n_rows); } if(is_same_type::yes) { arrayops::inplace_mul (m_colptr, X_colptr, m_n_rows); } if(is_same_type::yes) { arrayops::inplace_div (m_colptr, X_colptr, m_n_rows); } } } else if( (all_rows == false) && (all_cols == true) ) { const unwrap_check_mixed tmp1(base_ri.get_ref(), m_local); const umat& ri = tmp1.M; arma_debug_check ( ( (ri.is_vec() == false) && (ri.is_empty() == false) ), "Mat::elem(): given object must be a vector" ); const uword* ri_mem = ri.memptr(); const uword ri_n_elem = ri.n_elem; arma_debug_assert_same_size( ri_n_elem, m_n_cols, X.n_rows, X.n_cols, "Mat::elem()" ); for(uword col=0; col < m_n_cols; ++col) { for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count) { const uword row = ri_mem[ri_count]; arma_debug_check_bounds( (row >= m_n_rows), "Mat::elem(): index out of bounds" ); if(is_same_type::yes) { m_local.at(row,col) = X.at(ri_count, col); } if(is_same_type::yes) { m_local.at(row,col) += X.at(ri_count, col); } if(is_same_type::yes) { m_local.at(row,col) -= X.at(ri_count, col); } if(is_same_type::yes) { m_local.at(row,col) *= X.at(ri_count, col); } if(is_same_type::yes) { m_local.at(row,col) /= X.at(ri_count, col); } } } } } // // template inline void subview_elem2::replace(const eT old_val, const eT new_val) { arma_extra_debug_sigprint(); Mat tmp(*this); tmp.replace(old_val, new_val); (*this).operator=(tmp); } template inline void subview_elem2::clean(const pod_type threshold) { arma_extra_debug_sigprint(); Mat tmp(*this); tmp.clean(threshold); (*this).operator=(tmp); } template inline void subview_elem2::clamp(const eT min_val, const eT max_val) { arma_extra_debug_sigprint(); Mat tmp(*this); tmp.clamp(min_val, max_val); (*this).operator=(tmp); } template inline void subview_elem2::fill(const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview_elem2::zeros() { arma_extra_debug_sigprint(); inplace_op(eT(0)); } template inline void subview_elem2::ones() { arma_extra_debug_sigprint(); inplace_op(eT(1)); } template inline void subview_elem2::operator+= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview_elem2::operator-= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview_elem2::operator*= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview_elem2::operator/= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } // // template template inline void subview_elem2::operator_equ(const subview_elem2& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem2::operator= (const subview_elem2& x) { arma_extra_debug_sigprint(); (*this).operator_equ(x); } //! work around compiler bugs template inline void subview_elem2::operator= (const subview_elem2& x) { arma_extra_debug_sigprint(); (*this).operator_equ(x); } template template inline void subview_elem2::operator+= (const subview_elem2& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem2::operator-= (const subview_elem2& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem2::operator%= (const subview_elem2& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem2::operator/= (const subview_elem2& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem2::operator= (const Base& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem2::operator+= (const Base& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem2::operator-= (const Base& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem2::operator%= (const Base& x) { arma_extra_debug_sigprint(); inplace_op(x); } template template inline void subview_elem2::operator/= (const Base& x) { arma_extra_debug_sigprint(); inplace_op(x); } // // template template inline void subview_elem2::operator= (const SpBase& x) { arma_extra_debug_sigprint(); const Mat tmp(x); inplace_op(tmp); } template template inline void subview_elem2::operator+= (const SpBase& x) { arma_extra_debug_sigprint(); const Mat tmp(x); inplace_op(tmp); } template template inline void subview_elem2::operator-= (const SpBase& x) { arma_extra_debug_sigprint(); const Mat tmp(x); inplace_op(tmp); } template template inline void subview_elem2::operator%= (const SpBase& x) { arma_extra_debug_sigprint(); const Mat tmp(x); inplace_op(tmp); } template template inline void subview_elem2::operator/= (const SpBase& x) { arma_extra_debug_sigprint(); const Mat tmp(x); inplace_op(tmp); } // // template inline void subview_elem2::extract(Mat& actual_out, const subview_elem2& in) { arma_extra_debug_sigprint(); Mat& m_local = const_cast< Mat& >(in.m); const uword m_n_rows = m_local.n_rows; const uword m_n_cols = m_local.n_cols; const bool alias = (&actual_out == &m_local); if(alias) { arma_extra_debug_print("subview_elem2::extract(): aliasing detected"); } Mat* tmp_out = alias ? new Mat() : 0; Mat& out = alias ? *tmp_out : actual_out; if( (in.all_rows == false) && (in.all_cols == false) ) { const unwrap_check_mixed tmp1(in.base_ri.get_ref(), actual_out); const unwrap_check_mixed tmp2(in.base_ci.get_ref(), actual_out); const umat& ri = tmp1.M; const umat& ci = tmp2.M; arma_debug_check ( ( ((ri.is_vec() == false) && (ri.is_empty() == false)) || ((ci.is_vec() == false) && (ci.is_empty() == false)) ), "Mat::elem(): given object must be a vector" ); const uword* ri_mem = ri.memptr(); const uword ri_n_elem = ri.n_elem; const uword* ci_mem = ci.memptr(); const uword ci_n_elem = ci.n_elem; out.set_size(ri_n_elem, ci_n_elem); eT* out_mem = out.memptr(); uword out_count = 0; for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) { const uword col = ci_mem[ci_count]; arma_debug_check_bounds( (col >= m_n_cols), "Mat::elem(): index out of bounds" ); for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count) { const uword row = ri_mem[ri_count]; arma_debug_check_bounds( (row >= m_n_rows), "Mat::elem(): index out of bounds" ); out_mem[out_count] = m_local.at(row,col); ++out_count; } } } else if( (in.all_rows == true) && (in.all_cols == false) ) { const unwrap_check_mixed tmp2(in.base_ci.get_ref(), m_local); const umat& ci = tmp2.M; arma_debug_check ( ( (ci.is_vec() == false) && (ci.is_empty() == false) ), "Mat::elem(): given object must be a vector" ); const uword* ci_mem = ci.memptr(); const uword ci_n_elem = ci.n_elem; out.set_size(m_n_rows, ci_n_elem); for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) { const uword col = ci_mem[ci_count]; arma_debug_check_bounds( (col >= m_n_cols), "Mat::elem(): index out of bounds" ); arrayops::copy( out.colptr(ci_count), m_local.colptr(col), m_n_rows ); } } else if( (in.all_rows == false) && (in.all_cols == true) ) { const unwrap_check_mixed tmp1(in.base_ri.get_ref(), m_local); const umat& ri = tmp1.M; arma_debug_check ( ( (ri.is_vec() == false) && (ri.is_empty() == false) ), "Mat::elem(): given object must be a vector" ); const uword* ri_mem = ri.memptr(); const uword ri_n_elem = ri.n_elem; out.set_size(ri_n_elem, m_n_cols); for(uword col=0; col < m_n_cols; ++col) { for(uword ri_count=0; ri_count < ri_n_elem; ++ri_count) { const uword row = ri_mem[ri_count]; arma_debug_check_bounds( (row >= m_n_rows), "Mat::elem(): index out of bounds" ); out.at(ri_count,col) = m_local.at(row,col); } } } if(alias) { actual_out.steal_mem(out); delete tmp_out; } } // TODO: implement a dedicated function instead of creating a temporary (but lots of potential aliasing issues) template inline void subview_elem2::plus_inplace(Mat& out, const subview_elem2& in) { arma_extra_debug_sigprint(); const Mat tmp(in); out += tmp; } template inline void subview_elem2::minus_inplace(Mat& out, const subview_elem2& in) { arma_extra_debug_sigprint(); const Mat tmp(in); out -= tmp; } template inline void subview_elem2::schur_inplace(Mat& out, const subview_elem2& in) { arma_extra_debug_sigprint(); const Mat tmp(in); out %= tmp; } template inline void subview_elem2::div_inplace(Mat& out, const subview_elem2& in) { arma_extra_debug_sigprint(); const Mat tmp(in); out /= tmp; } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_randu.hpp0000644000176200001440000001053114124060717022677 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_randu //! @{ arma_warn_unused inline double randu() { return double(arma_rng::randu()); } template arma_warn_unused inline typename arma_real_or_cx_only::result randu() { return eT(arma_rng::randu()); } //! Generate a vector with all elements set to random values in the [0,1] interval (uniform distribution) arma_warn_unused arma_inline const Gen randu(const uword n_elem) { arma_extra_debug_sigprint(); return Gen(n_elem, 1); } template arma_warn_unused arma_inline const Gen randu(const uword n_elem, const arma_empty_class junk1 = arma_empty_class(), const typename arma_Mat_Col_Row_only::result* junk2 = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); const uword n_rows = (is_Row::value) ? uword(1) : n_elem; const uword n_cols = (is_Row::value) ? n_elem : uword(1); return Gen(n_rows, n_cols); } //! Generate a dense matrix with all elements set to random values in the [0,1] interval (uniform distribution) arma_warn_unused arma_inline const Gen randu(const uword n_rows, const uword n_cols) { arma_extra_debug_sigprint(); return Gen(n_rows, n_cols); } arma_warn_unused arma_inline const Gen randu(const SizeMat& s) { arma_extra_debug_sigprint(); return Gen(s.n_rows, s.n_cols); } template arma_warn_unused arma_inline const Gen randu(const uword n_rows, const uword n_cols, const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); if(is_Col::value) { arma_debug_check( (n_cols != 1), "randu(): incompatible size" ); } else if(is_Row::value) { arma_debug_check( (n_rows != 1), "randu(): incompatible size" ); } return Gen(n_rows, n_cols); } template arma_warn_unused arma_inline const Gen randu(const SizeMat& s, const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return randu(s.n_rows, s.n_cols); } arma_warn_unused arma_inline const GenCube randu(const uword n_rows, const uword n_cols, const uword n_slices) { arma_extra_debug_sigprint(); return GenCube(n_rows, n_cols, n_slices); } arma_warn_unused arma_inline const GenCube randu(const SizeCube& s) { arma_extra_debug_sigprint(); return GenCube(s.n_rows, s.n_cols, s.n_slices); } template arma_warn_unused arma_inline const GenCube randu(const uword n_rows, const uword n_cols, const uword n_slices, const typename arma_Cube_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return GenCube(n_rows, n_cols, n_slices); } template arma_warn_unused arma_inline const GenCube randu(const SizeCube& s, const typename arma_Cube_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return GenCube(s.n_rows, s.n_cols, s.n_slices); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_quantile.hpp0000644000176200001440000000336614124060717023420 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_quantile //! @{ template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && is_cx::no && is_real::value, const mtGlue >::result quantile(const T1& X, const Base& P) { arma_extra_debug_sigprint(); return mtGlue(X, P.get_ref()); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && is_cx::no && is_real::value, const mtGlue >::result quantile(const T1& X, const Base& P, const uword dim) { arma_extra_debug_sigprint(); return mtGlue(X, P.get_ref(), dim); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_index_min_bones.hpp0000644000176200001440000000341714124060717024746 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_index_min //! @{ class op_index_min : public traits_op_xvec { public: // dense matrices template inline static void apply(Mat& out, const mtOp& in); template inline static void apply_noalias(Mat& out, const Mat& X, const uword dim); // cubes template inline static void apply(Cube& out, const mtOpCube& in); template inline static void apply_noalias(Cube& out, const Cube& X, const uword dim, const typename arma_not_cx::result* junk = nullptr); template inline static void apply_noalias(Cube& out, const Cube& X, const uword dim, const typename arma_cx_only::result* junk = nullptr); // sparse matrices template inline static void apply(Mat& out, const SpBase& expr, const uword dim); }; //! @} RcppArmadillo/inst/include/armadillo_bits/subview_elem2_bones.hpp0000644000176200001440000001007714124060717025046 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup subview_elem2 //! @{ template class subview_elem2 : public Base< eT, subview_elem2 > { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; arma_aligned const Mat& m; arma_aligned const Base& base_ri; arma_aligned const Base& base_ci; const bool all_rows; const bool all_cols; protected: arma_inline subview_elem2(const Mat& in_m, const Base& in_ri, const Base& in_ci, const bool in_all_rows, const bool in_all_cols); public: inline ~subview_elem2(); inline subview_elem2() = delete; template inline void inplace_op(const eT val); template inline void inplace_op(const Base& x); inline void replace(const eT old_val, const eT new_val); inline void clean(const pod_type threshold); inline void clamp(const eT min_val, const eT max_val); inline void fill(const eT val); inline void zeros(); inline void ones(); inline void operator+= (const eT val); inline void operator-= (const eT val); inline void operator*= (const eT val); inline void operator/= (const eT val); // deliberately returning void template inline void operator_equ(const subview_elem2& x); template inline void operator= (const subview_elem2& x); inline void operator= (const subview_elem2& x); template inline void operator+= (const subview_elem2& x); template inline void operator-= (const subview_elem2& x); template inline void operator%= (const subview_elem2& x); template inline void operator/= (const subview_elem2& x); template inline void operator= (const Base& x); template inline void operator+= (const Base& x); template inline void operator-= (const Base& x); template inline void operator%= (const Base& x); template inline void operator/= (const Base& x); template inline void operator= (const SpBase& x); template inline void operator+= (const SpBase& x); template inline void operator-= (const SpBase& x); template inline void operator%= (const SpBase& x); template inline void operator/= (const SpBase& x); inline static void extract(Mat& out, const subview_elem2& in); inline static void plus_inplace(Mat& out, const subview_elem2& in); inline static void minus_inplace(Mat& out, const subview_elem2& in); inline static void schur_inplace(Mat& out, const subview_elem2& in); inline static void div_inplace(Mat& out, const subview_elem2& in); friend class Mat; }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_all_bones.hpp0000644000176200001440000000423514124060717023543 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_all //! @{ class op_all : public traits_op_xvec { public: template static inline bool all_vec_helper(const Base& X); template static inline bool all_vec_helper(const subview& X); template static inline bool all_vec_helper(const Op& X); template static inline bool all_vec_helper ( const mtOp& X, const typename arma_op_rel_only::result* junk1 = nullptr, const typename arma_not_cx::result* junk2 = nullptr ); template static inline bool all_vec_helper ( const mtGlue& X, const typename arma_glue_rel_only::result* junk1 = nullptr, const typename arma_not_cx::result* junk2 = nullptr, const typename arma_not_cx::result* junk3 = nullptr ); template static inline bool all_vec(T1& X); template static inline void apply_helper(Mat& out, const Proxy& P, const uword dim); template static inline void apply(Mat& out, const mtOp& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/glue_conv_meat.hpp0000644000176200001440000002154714124060717024103 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_conv //! @{ // TODO: this implementation of conv() is rudimentary; replace with faster version template inline void glue_conv::apply(Mat& out, const Mat& A, const Mat& B, const bool A_is_col) { arma_extra_debug_sigprint(); const Mat& h = (A.n_elem <= B.n_elem) ? A : B; const Mat& x = (A.n_elem <= B.n_elem) ? B : A; const uword h_n_elem = h.n_elem; const uword h_n_elem_m1 = h_n_elem - 1; const uword x_n_elem = x.n_elem; const uword out_n_elem = ((h_n_elem + x_n_elem) > 0) ? (h_n_elem + x_n_elem - 1) : uword(0); if( (h_n_elem == 0) || (x_n_elem == 0) ) { out.zeros(); return; } Col hh(h_n_elem, arma_nozeros_indicator()); // flipped version of h const eT* h_mem = h.memptr(); eT* hh_mem = hh.memptr(); for(uword i=0; i < h_n_elem; ++i) { hh_mem[h_n_elem_m1-i] = h_mem[i]; } Col xx( (x_n_elem + 2*h_n_elem_m1), arma_zeros_indicator() ); // zero padded version of x const eT* x_mem = x.memptr(); eT* xx_mem = xx.memptr(); arrayops::copy( &(xx_mem[h_n_elem_m1]), x_mem, x_n_elem ); (A_is_col) ? out.set_size(out_n_elem, 1) : out.set_size(1, out_n_elem); eT* out_mem = out.memptr(); for(uword i=0; i < out_n_elem; ++i) { // out_mem[i] = dot( hh, xx.subvec(i, (i + h_n_elem_m1)) ); out_mem[i] = op_dot::direct_dot( h_n_elem, hh_mem, &(xx_mem[i]) ); } } // // alternative implementation of 1d convolution // template // inline // void // glue_conv::apply(Mat& out, const Mat& A, const Mat& B, const bool A_is_col) // { // arma_extra_debug_sigprint(); // // const Mat& h = (A.n_elem <= B.n_elem) ? A : B; // const Mat& x = (A.n_elem <= B.n_elem) ? B : A; // // const uword h_n_elem = h.n_elem; // const uword h_n_elem_m1 = h_n_elem - 1; // const uword x_n_elem = x.n_elem; // const uword out_n_elem = ((h_n_elem + x_n_elem) > 0) ? (h_n_elem + x_n_elem - 1) : uword(0); // // if( (h_n_elem == 0) || (x_n_elem == 0) ) { out.zeros(); return; } // // // Col hh(h_n_elem, arma_nozeros_indicator()); // flipped version of h // // const eT* h_mem = h.memptr(); // eT* hh_mem = hh.memptr(); // // for(uword i=0; i < h_n_elem; ++i) // { // hh_mem[h_n_elem_m1-i] = h_mem[i]; // } // // // construct HH matrix, with the column containing shifted versions of hh; // // upper limit for number of zeros is about 50%; may not be optimal // const uword N_copies = (std::min)(uword(10), h_n_elem); // // const uword HH_n_rows = h_n_elem + (N_copies-1); // // Mat HH(HH_n_rows, N_copies, arma_zeros_indicator()); // // for(uword i=0; i xx( (x_n_elem + 2*h_n_elem_m1), arma_zeros_indicator() ); // zero padded version of x // // const eT* x_mem = x.memptr(); // eT* xx_mem = xx.memptr(); // // arrayops::copy( &(xx_mem[h_n_elem_m1]), x_mem, x_n_elem ); // // // (A_is_col) ? out.set_size(out_n_elem, 1) : out.set_size(1, out_n_elem); // // eT* out_mem = out.memptr(); // // uword last_i = 0; // bool last_i_done = false; // // for(uword i=0; i < xx.n_elem; i += N_copies) // { // if( ((i + HH_n_rows) <= xx.n_elem) && ((i + N_copies) <= out_n_elem) ) // { // const Row xx_sub(xx_mem + i, HH_n_rows, false, true); // // Row out_sub(out_mem + i, N_copies, false, true); // // out_sub = xx_sub * HH; // // last_i_done = true; // } // else // { // last_i = i; // last_i_done = false; // break; // } // } // // if(last_i_done == false) // { // for(uword i=last_i; i < out_n_elem; ++i) // { // // out_mem[i] = dot( hh, xx.subvec(i, (i + h_n_elem_m1)) ); // // out_mem[i] = op_dot::direct_dot( h_n_elem, hh_mem, &(xx_mem[i]) ); // } // } // } template inline void glue_conv::apply(Mat& out, const Glue& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap UA(expr.A); const quasi_unwrap UB(expr.B); const Mat& A = UA.M; const Mat& B = UB.M; arma_debug_check ( ( ((A.is_vec() == false) && (A.is_empty() == false)) || ((B.is_vec() == false) && (B.is_empty() == false)) ), "conv(): given object must be a vector" ); const bool A_is_col = ((T1::is_col) || (A.n_cols == 1)); const uword mode = expr.aux_uword; if(mode == 0) // full convolution { glue_conv::apply(out, A, B, A_is_col); } else if(mode == 1) // same size as A { Mat tmp; glue_conv::apply(tmp, A, B, A_is_col); if( (tmp.is_empty() == false) && (A.is_empty() == false) && (B.is_empty() == false) ) { const uword start = uword( std::floor( double(B.n_elem) / double(2) ) ); out = (A_is_col) ? tmp(start, 0, arma::size(A)) : tmp(0, start, arma::size(A)); } else { out.zeros( arma::size(A) ); } } } /// // TODO: this implementation of conv2() is rudimentary; replace with faster version template inline void glue_conv2::apply(Mat& out, const Mat& A, const Mat& B) { arma_extra_debug_sigprint(); const Mat& G = (A.n_elem <= B.n_elem) ? A : B; // unflipped filter coefficients const Mat& W = (A.n_elem <= B.n_elem) ? B : A; // original 2D image const uword out_n_rows = ((W.n_rows + G.n_rows) > 0) ? (W.n_rows + G.n_rows - 1) : uword(0); const uword out_n_cols = ((W.n_cols + G.n_cols) > 0) ? (W.n_cols + G.n_cols - 1) : uword(0); if(G.is_empty() || W.is_empty()) { out.zeros(); return; } Mat H(G.n_rows, G.n_cols, arma_nozeros_indicator()); // flipped filter coefficients const uword H_n_rows = H.n_rows; const uword H_n_cols = H.n_cols; const uword H_n_rows_m1 = H_n_rows - 1; const uword H_n_cols_m1 = H_n_cols - 1; for(uword col=0; col < H_n_cols; ++col) { eT* H_colptr = H.colptr(H_n_cols_m1 - col); const eT* G_colptr = G.colptr(col); for(uword row=0; row < H_n_rows; ++row) { H_colptr[H_n_rows_m1 - row] = G_colptr[row]; } } Mat X( (W.n_rows + 2*H_n_rows_m1), (W.n_cols + 2*H_n_cols_m1), arma_zeros_indicator() ); X( H_n_rows_m1, H_n_cols_m1, arma::size(W) ) = W; // zero padded version of 2D image out.set_size( out_n_rows, out_n_cols ); for(uword col=0; col < out_n_cols; ++col) { eT* out_colptr = out.colptr(col); for(uword row=0; row < out_n_rows; ++row) { // out.at(row, col) = accu( H % X(row, col, size(H)) ); eT acc = eT(0); for(uword H_col = 0; H_col < H_n_cols; ++H_col) { const eT* X_colptr = X.colptr(col + H_col); acc += op_dot::direct_dot( H_n_rows, H.colptr(H_col), &(X_colptr[row]) ); } out_colptr[row] = acc; } } } template inline void glue_conv2::apply(Mat& out, const Glue& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap UA(expr.A); const quasi_unwrap UB(expr.B); const Mat& A = UA.M; const Mat& B = UB.M; const uword mode = expr.aux_uword; if(mode == 0) // full convolution { glue_conv2::apply(out, A, B); } else if(mode == 1) // same size as A { Mat tmp; glue_conv2::apply(tmp, A, B); if( (tmp.is_empty() == false) && (A.is_empty() == false) && (B.is_empty() == false) ) { const uword start_row = uword( std::floor( double(B.n_rows) / double(2) ) ); const uword start_col = uword( std::floor( double(B.n_cols) / double(2) ) ); out = tmp(start_row, start_col, arma::size(A)); } else { out.zeros( arma::size(A) ); } } } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_trimat.hpp0000644000176200001440000000631714124060717023075 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_trimat //! @{ template arma_warn_unused arma_inline const Op trimatu(const Base& X) { arma_extra_debug_sigprint(); return Op(X.get_ref(), 0, 0); } template arma_warn_unused arma_inline const Op trimatl(const Base& X) { arma_extra_debug_sigprint(); return Op(X.get_ref(), 1, 0); } template arma_warn_unused arma_inline const SpOp trimatu(const SpBase& X) { arma_extra_debug_sigprint(); return SpOp(X.get_ref(), 0, 0); } template arma_warn_unused arma_inline const SpOp trimatl(const SpBase& X) { arma_extra_debug_sigprint(); return SpOp(X.get_ref(), 1, 0); } // template arma_warn_unused arma_inline const Op trimatl(const Base& X, const sword k) { arma_extra_debug_sigprint(); const uword row_offset = (k < 0) ? uword(-k) : uword(0); const uword col_offset = (k > 0) ? uword( k) : uword(0); return Op(X.get_ref(), row_offset, col_offset); } template arma_warn_unused arma_inline const Op trimatu(const Base& X, const sword k) { arma_extra_debug_sigprint(); const uword row_offset = (k < 0) ? uword(-k) : uword(0); const uword col_offset = (k > 0) ? uword( k) : uword(0); return Op(X.get_ref(), row_offset, col_offset); } template arma_warn_unused arma_inline const SpOp trimatu(const SpBase& X, const sword k) { arma_extra_debug_sigprint(); const uword row_offset = (k < 0) ? uword(-k) : uword(0); const uword col_offset = (k > 0) ? uword( k) : uword(0); return SpOp(X.get_ref(), row_offset, col_offset); } template arma_warn_unused arma_inline const SpOp trimatl(const SpBase& X, const sword k) { arma_extra_debug_sigprint(); const uword row_offset = (k < 0) ? uword(-k) : uword(0); const uword col_offset = (k > 0) ? uword( k) : uword(0); return SpOp(X.get_ref(), row_offset, col_offset); } //! @} RcppArmadillo/inst/include/armadillo_bits/eglue_core_bones.hpp0000644000176200001440000000576714124060717024421 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup eglue_core //! @{ template struct eglue_core { // matrices template arma_hot inline static void apply(outT& out, const eGlue& x); template arma_hot inline static void apply_inplace_plus (Mat& out, const eGlue& x); template arma_hot inline static void apply_inplace_minus(Mat& out, const eGlue& x); template arma_hot inline static void apply_inplace_schur(Mat& out, const eGlue& x); template arma_hot inline static void apply_inplace_div (Mat& out, const eGlue& x); // cubes template arma_hot inline static void apply(Cube& out, const eGlueCube& x); template arma_hot inline static void apply_inplace_plus (Cube& out, const eGlueCube& x); template arma_hot inline static void apply_inplace_minus(Cube& out, const eGlueCube& x); template arma_hot inline static void apply_inplace_schur(Cube& out, const eGlueCube& x); template arma_hot inline static void apply_inplace_div (Cube& out, const eGlueCube& x); }; class eglue_plus : public eglue_core { public: inline static const char* text() { return "addition"; } }; class eglue_minus : public eglue_core { public: inline static const char* text() { return "subtraction"; } }; class eglue_div : public eglue_core { public: inline static const char* text() { return "element-wise division"; } }; class eglue_schur : public eglue_core { public: inline static const char* text() { return "element-wise multiplication"; } }; //! @} RcppArmadillo/inst/include/armadillo_bits/operator_ostream.hpp0000644000176200001440000000612214124060717024471 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup operator_ostream //! @{ template inline std::ostream& operator<< (std::ostream& o, const Base& X) { arma_extra_debug_sigprint(); const unwrap tmp(X.get_ref()); arma_ostream::print(o, tmp.M, true); return o; } template inline std::ostream& operator<< (std::ostream& o, const SpBase& X) { arma_extra_debug_sigprint(); const unwrap_spmat tmp(X.get_ref()); arma_ostream::print(o, tmp.M, true); return o; } template inline std::ostream& operator<< (std::ostream& o, const SpValProxy& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; o << eT(X); return o; } template inline std::ostream& operator<< (std::ostream& o, const MapMat_val& X) { arma_extra_debug_sigprint(); o << eT(X); return o; } template inline std::ostream& operator<< (std::ostream& o, const SpMat_MapMat_val& X) { arma_extra_debug_sigprint(); o << eT(X); return o; } template inline std::ostream& operator<< (std::ostream& o, const SpSubview_MapMat_val& X) { arma_extra_debug_sigprint(); o << eT(X); return o; } template inline std::ostream& operator<< (std::ostream& o, const BaseCube& X) { arma_extra_debug_sigprint(); const unwrap_cube tmp(X.get_ref()); arma_ostream::print(o, tmp.M, true); return o; } //! Print the contents of a field to the specified stream. template inline std::ostream& operator<< (std::ostream& o, const field& X) { arma_extra_debug_sigprint(); arma_ostream::print(o, X); return o; } //! Print the contents of a subfield to the specified stream template inline std::ostream& operator<< (std::ostream& o, const subview_field& X) { arma_extra_debug_sigprint(); arma_ostream::print(o, X); return o; } inline std::ostream& operator<< (std::ostream& o, const SizeMat& S) { arma_extra_debug_sigprint(); arma_ostream::print(o, S); return o; } inline std::ostream& operator<< (std::ostream& o, const SizeCube& S) { arma_extra_debug_sigprint(); arma_ostream::print(o, S); return o; } //! @} RcppArmadillo/inst/include/armadillo_bits/def_hdf5.hpp0000644000176200001440000001503114124060717022547 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #if defined(ARMA_USE_HDF5) #if !defined(ARMA_USE_HDF5_ALT) // macros needed if the wrapper run-time library is not being used #define arma_H5Tcopy H5Tcopy #define arma_H5Tcreate H5Tcreate #define arma_H5Tinsert H5Tinsert #define arma_H5Tequal H5Tequal #define arma_H5Tclose H5Tclose #define arma_H5Dopen H5Dopen #define arma_H5Dget_type H5Dget_type #define arma_H5Dclose H5Dclose #define arma_H5Dwrite H5Dwrite #define arma_H5Dget_space H5Dget_space #define arma_H5Dread H5Dread #define arma_H5Dcreate H5Dcreate #define arma_H5Sget_simple_extent_ndims H5Sget_simple_extent_ndims #define arma_H5Sget_simple_extent_dims H5Sget_simple_extent_dims #define arma_H5Sclose H5Sclose #define arma_H5Screate_simple H5Screate_simple #define arma_H5Ovisit H5Ovisit #define arma_H5Eset_auto H5Eset_auto #define arma_H5Eget_auto H5Eget_auto #define arma_H5Fopen H5Fopen #define arma_H5Fcreate H5Fcreate #define arma_H5Fclose H5Fclose #define arma_H5Fis_hdf5 H5Fis_hdf5 #define arma_H5Gcreate H5Gcreate #define arma_H5Gopen H5Gopen #define arma_H5Gclose H5Gclose #define arma_H5Lexists H5Lexists #define arma_H5Ldelete H5Ldelete #define arma_H5T_NATIVE_UCHAR H5T_NATIVE_UCHAR #define arma_H5T_NATIVE_CHAR H5T_NATIVE_CHAR #define arma_H5T_NATIVE_SHORT H5T_NATIVE_SHORT #define arma_H5T_NATIVE_USHORT H5T_NATIVE_USHORT #define arma_H5T_NATIVE_INT H5T_NATIVE_INT #define arma_H5T_NATIVE_UINT H5T_NATIVE_UINT #define arma_H5T_NATIVE_LONG H5T_NATIVE_LONG #define arma_H5T_NATIVE_ULONG H5T_NATIVE_ULONG #define arma_H5T_NATIVE_LLONG H5T_NATIVE_LLONG #define arma_H5T_NATIVE_ULLONG H5T_NATIVE_ULLONG #define arma_H5T_NATIVE_FLOAT H5T_NATIVE_FLOAT #define arma_H5T_NATIVE_DOUBLE H5T_NATIVE_DOUBLE #else // prototypes for the wrapper functions defined in the wrapper run-time library (src/wrapper.cpp) extern "C" { // Wrapper functions for H5* functions. hid_t arma_H5Tcopy(hid_t dtype_id); hid_t arma_H5Tcreate(H5T_class_t cl, size_t size); herr_t arma_H5Tinsert(hid_t dtype_id, const char* name, size_t offset, hid_t field_id); htri_t arma_H5Tequal(hid_t dtype_id1, hid_t dtype_id2); herr_t arma_H5Tclose(hid_t dtype_id); hid_t arma_H5Dopen(hid_t loc_id, const char* name, hid_t dapl_id); hid_t arma_H5Dget_type(hid_t dataset_id); herr_t arma_H5Dclose(hid_t dataset_id); hid_t arma_H5Dcreate(hid_t loc_id, const char* name, hid_t dtype_id, hid_t space_id, hid_t lcpl_id, hid_t dcpl_id, hid_t dapl_id); herr_t arma_H5Dwrite(hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_id, hid_t xfer_plist_id, const void* buf); hid_t arma_H5Dget_space(hid_t dataset_id); herr_t arma_H5Dread(hid_t dataset_id, hid_t mem_type_id, hid_t mem_space_id, hid_t file_space_id, hid_t xfer_plist_id, void* buf); int arma_H5Sget_simple_extent_ndims(hid_t space_id); int arma_H5Sget_simple_extent_dims(hid_t space_id, hsize_t* dims, hsize_t* maxdims); herr_t arma_H5Sclose(hid_t space_id); hid_t arma_H5Screate_simple(int rank, const hsize_t* current_dims, const hsize_t* maximum_dims); herr_t arma_H5Ovisit(hid_t object_id, H5_index_t index_type, H5_iter_order_t order, H5O_iterate_t op, void* op_data); herr_t arma_H5Eset_auto(hid_t estack_id, H5E_auto_t func, void* client_data); herr_t arma_H5Eget_auto(hid_t estack_id, H5E_auto_t* func, void** client_data); hid_t arma_H5Fopen(const char* name, unsigned flags, hid_t fapl_id); hid_t arma_H5Fcreate(const char* name, unsigned flags, hid_t fcpl_id, hid_t fapl_id); herr_t arma_H5Fclose(hid_t file_id); htri_t arma_H5Fis_hdf5(const char* name); hid_t arma_H5Gcreate(hid_t loc_id, const char* name, hid_t lcpl_id, hid_t gcpl_id, hid_t gapl_id); hid_t arma_H5Gopen(hid_t loc_id, const char* name, hid_t gapl_id); herr_t arma_H5Gclose(hid_t group_id); htri_t arma_H5Lexists(hid_t loc_id, const char* name, hid_t lapl_id); herr_t arma_H5Ldelete(hid_t loc_id, const char* name, hid_t lapl_id); // Wrapper variables that represent the hid_t values for the H5T_NATIVE_* // types. Note that H5T_NATIVE_UCHAR itself is a macro that resolves to about // forty other macros, and we definitely don't want to hijack those, // so this is the best way to go about wrapping these... extern hid_t arma_H5T_NATIVE_UCHAR; extern hid_t arma_H5T_NATIVE_CHAR; extern hid_t arma_H5T_NATIVE_SHORT; extern hid_t arma_H5T_NATIVE_USHORT; extern hid_t arma_H5T_NATIVE_INT; extern hid_t arma_H5T_NATIVE_UINT; extern hid_t arma_H5T_NATIVE_LONG; extern hid_t arma_H5T_NATIVE_ULONG; extern hid_t arma_H5T_NATIVE_LLONG; extern hid_t arma_H5T_NATIVE_ULLONG; extern hid_t arma_H5T_NATIVE_FLOAT; extern hid_t arma_H5T_NATIVE_DOUBLE; } // Lastly, we have to hijack H5open() and H5check_version(), which are called // by some expanded macros of the other H5* functions. This means we can't // create arma_H5open(), because we can't modify those macros. Instead, we'll // create arma::H5open() and arma::H5check_version(), and then issue a using // directive so that arma::H5open() and arma::H5check_version() are always // called. // // There is potential danger in the use of a using directive like this, but in // this case, I can't think of a better way to solve the problem, and I doubt // this will cause problems in any situations that aren't truly bizarre. And // if it does cause problems, the user can #define ARMA_DONT_USE_WRAPPER or // #undef ARMA_USE_WRAPPER in their Armadillo configuration. herr_t H5open(); herr_t H5check_version(unsigned majnum, unsigned minnum, unsigned relnum); using arma::H5open; using arma::H5check_version; #endif #endif RcppArmadillo/inst/include/armadillo_bits/fn_all.hpp0000644000176200001440000000357014124060717022343 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_all //! @{ template arma_warn_unused inline typename enable_if2 < is_arma_type::value && resolves_to_vector::yes, bool >::result all(const T1& X) { arma_extra_debug_sigprint(); return op_all::all_vec(X); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && resolves_to_vector::no, const mtOp >::result all(const T1& X) { arma_extra_debug_sigprint(); return mtOp(X, 0, 0); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value, const mtOp >::result all(const T1& X, const uword dim) { arma_extra_debug_sigprint(); return mtOp(X, dim, 0); } //! for compatibility purposes: allows compiling user code designed for earlier versions of Armadillo template arma_warn_unused arma_inline typename enable_if2 < is_supported_elem_type::value, bool >::result all(const T& val) { return (val != T(0)); } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_trimat_bones.hpp0000644000176200001440000000352114124060717024633 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_trimat //! @{ class spop_trimat : public traits_op_default { public: template inline static void apply_noalias(SpMat& out, const SpProxy& P, const bool upper); template inline static void apply(SpMat& out, const SpOp& in); }; class spop_trimatu_ext : public traits_op_default { public: template inline static void apply_noalias(SpMat& out, const SpMat& A, const uword row_offset, const uword col_offset); template inline static void apply(SpMat& out, const SpOp& in); }; class spop_trimatl_ext : public traits_op_default { public: template inline static void apply_noalias(SpMat& out, const SpMat& A, const uword row_offset, const uword col_offset); template inline static void apply(SpMat& out, const SpOp& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_max.hpp0000644000176200001440000001231214124060717022352 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_max //! @{ template arma_warn_unused inline typename enable_if2< is_arma_type::value && resolves_to_vector::yes, typename T1::elem_type >::result max(const T1& X) { arma_extra_debug_sigprint(); return op_max::max(X); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value && resolves_to_vector::no, const Op >::result max(const T1& X) { arma_extra_debug_sigprint(); return Op(X, 0, 0); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const Op >::result max(const T1& X, const uword dim) { arma_extra_debug_sigprint(); return Op(X, dim, 0); } template arma_warn_unused arma_inline typename arma_scalar_only::result max(const T& x) { return x; } //! element-wise maximum template arma_warn_unused arma_inline typename enable_if2 < ( is_arma_type::value && is_arma_type::value && is_same_type::value ), const Glue >::result max ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); return Glue(X, Y); } template arma_warn_unused arma_inline const OpCube max ( const BaseCube& X, const uword dim = 0 ) { arma_extra_debug_sigprint(); return OpCube(X.get_ref(), dim, 0); } template arma_warn_unused arma_inline const GlueCube max ( const BaseCube& X, const BaseCube& Y ) { arma_extra_debug_sigprint(); return GlueCube(X.get_ref(), Y.get_ref()); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value && resolves_to_sparse_vector::yes, typename T1::elem_type >::result max(const T1& x) { arma_extra_debug_sigprint(); return spop_max::vector_max(x); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value && resolves_to_sparse_vector::no, const SpOp >::result max(const T1& X) { arma_extra_debug_sigprint(); return SpOp(X, 0, 0); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value, const SpOp >::result max(const T1& X, const uword dim) { arma_extra_debug_sigprint(); return SpOp(X, dim, 0); } // elementwise sparse max template arma_warn_unused inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_sparse_type::value && is_same_type::value), const SpGlue >::result max(const T1& x, const T2& y) { arma_extra_debug_sigprint(); return SpGlue(x, y); } //! elementwise max of dense and sparse objects with the same element type template inline typename enable_if2 < (is_arma_type::value && is_arma_sparse_type::value && is_same_type::value), Mat >::result max ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); Mat out; spglue_max::dense_sparse_max(out, x, y); return out; } //! elementwise max of sparse and dense objects with the same element type template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_type::value && is_same_type::value), Mat >::result max ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); Mat out; // Just call the other order (these operations are commutative) // TODO: if there is a matrix size mismatch, the debug assert will print the matrix sizes in wrong order spglue_max::dense_sparse_max(out, y, x); return out; } arma_warn_unused inline uword max(const SizeMat& s) { return (std::max)(s.n_rows, s.n_cols); } arma_warn_unused inline uword max(const SizeCube& s) { return (std::max)( (std::max)(s.n_rows, s.n_cols), s.n_slices ); } //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_SparseGenRealShiftSolve_bones.hpp0000644000176200001440000000305014124060717030345 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { //! Define matrix operations on existing matrix objects template class SparseGenRealShiftSolve { private: #if defined(ARMA_USE_SUPERLU) // The following objects are read-only in perform_op() mutable superlu_supermatrix_wrangler l; mutable superlu_supermatrix_wrangler u; mutable superlu_array_wrangler perm_c; mutable superlu_array_wrangler perm_r; #endif public: bool valid = false; const uword n_rows; // number of rows of the underlying matrix const uword n_cols; // number of columns of the underlying matrix inline SparseGenRealShiftSolve(const SpMat& mat_obj, const eT shift); inline void perform_op(eT* x_in, eT* y_out) const; }; } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/fn_repelem.hpp0000644000176200001440000000253514124060717023224 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_repelem //! @{ template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value, const Op >::result repelem(const T1& A, const uword r, const uword c) { arma_extra_debug_sigprint(); return Op(A, r, c); } template arma_warn_unused arma_inline const SpOp repelem(const SpBase& A, const uword r, const uword c) { arma_extra_debug_sigprint(); return SpOp(A.get_ref(), r, c); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_trapz.hpp0000644000176200001440000000267514124060717022740 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_trapz //! @{ template arma_warn_unused inline const Glue trapz ( const Base& X, const Base& Y, const uword dim = 0 ) { arma_extra_debug_sigprint(); return Glue(X.get_ref(), Y.get_ref(), dim); } template arma_warn_unused inline const Op trapz ( const Base& Y, const uword dim = 0 ) { arma_extra_debug_sigprint(); return Op(Y.get_ref(), dim, uword(0)); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_reshape_bones.hpp0000644000176200001440000000464614160256234024431 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_reshape //! @{ class op_reshape : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); template inline static void apply_mat_inplace(Mat& A, const uword new_n_rows, const uword new_n_cols); template inline static void apply_mat_noalias(Mat& out, const Mat& A, const uword new_n_rows, const uword new_n_cols); template inline static void apply_proxy_noalias(Mat& out, const Proxy& P, const uword new_n_rows, const uword new_n_cols); // template inline static void apply(Cube& out, const OpCube& in); template inline static void apply_cube_inplace(Cube& A, const uword new_n_rows, const uword new_n_cols, const uword new_n_slices); template inline static void apply_cube_noalias(Cube& out, const Cube& A, const uword new_n_rows, const uword new_n_cols, const uword new_n_slices); }; //! NOTE: deprecated class op_reshape_old : public traits_op_default { public: template arma_cold inline static void apply(Mat& out, const Op& in); template arma_cold inline static void apply_mat_inplace(Mat& A, const uword new_n_rows, const uword new_n_cols, const uword dim); template arma_cold inline static void apply_mat_noalias(Mat& out, const Mat& A, const uword new_n_rows, const uword new_n_cols, const uword dim); }; //! @} RcppArmadillo/inst/include/armadillo_bits/diagview_meat.hpp0000644000176200001440000005375714124060717023731 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup diagview //! @{ template inline diagview::~diagview() { arma_extra_debug_sigprint_this(this); } template arma_inline diagview::diagview(const Mat& in_m, const uword in_row_offset, const uword in_col_offset, const uword in_len) : m (in_m ) , row_offset(in_row_offset) , col_offset(in_col_offset) , n_rows (in_len ) , n_elem (in_len ) { arma_extra_debug_sigprint_this(this); } template inline diagview::diagview(const diagview& in) : m (in.m ) , row_offset(in.row_offset) , col_offset(in.col_offset) , n_rows (in.n_rows ) , n_elem (in.n_elem ) { arma_extra_debug_sigprint(arma_str::format("this = %x in = %x") % this % &in); } template inline diagview::diagview(diagview&& in) : m (in.m ) , row_offset(in.row_offset) , col_offset(in.col_offset) , n_rows (in.n_rows ) , n_elem (in.n_elem ) { arma_extra_debug_sigprint(arma_str::format("this = %x in = %x") % this % &in); // for paranoia access::rw(in.row_offset) = 0; access::rw(in.col_offset) = 0; access::rw(in.n_rows ) = 0; access::rw(in.n_elem ) = 0; } //! set a diagonal of our matrix using a diagonal from a foreign matrix template inline void diagview::operator= (const diagview& x) { arma_extra_debug_sigprint(); diagview& d = *this; arma_debug_check( (d.n_elem != x.n_elem), "diagview: diagonals have incompatible lengths" ); Mat& d_m = const_cast< Mat& >(d.m); const Mat& x_m = x.m; if(&d_m != &x_m) { const uword d_n_elem = d.n_elem; const uword d_row_offset = d.row_offset; const uword d_col_offset = d.col_offset; const uword x_row_offset = x.row_offset; const uword x_col_offset = x.col_offset; uword ii,jj; for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2) { const eT tmp_i = x_m.at(ii + x_row_offset, ii + x_col_offset); const eT tmp_j = x_m.at(jj + x_row_offset, jj + x_col_offset); d_m.at(ii + d_row_offset, ii + d_col_offset) = tmp_i; d_m.at(jj + d_row_offset, jj + d_col_offset) = tmp_j; } if(ii < d_n_elem) { d_m.at(ii + d_row_offset, ii + d_col_offset) = x_m.at(ii + x_row_offset, ii + x_col_offset); } } else { const Mat tmp = x; (*this).operator=(tmp); } } template inline void diagview::operator+=(const eT val) { arma_extra_debug_sigprint(); Mat& t_m = const_cast< Mat& >(m); const uword t_n_elem = n_elem; const uword t_row_offset = row_offset; const uword t_col_offset = col_offset; for(uword ii=0; ii < t_n_elem; ++ii) { t_m.at( ii + t_row_offset, ii + t_col_offset) += val; } } template inline void diagview::operator-=(const eT val) { arma_extra_debug_sigprint(); Mat& t_m = const_cast< Mat& >(m); const uword t_n_elem = n_elem; const uword t_row_offset = row_offset; const uword t_col_offset = col_offset; for(uword ii=0; ii < t_n_elem; ++ii) { t_m.at( ii + t_row_offset, ii + t_col_offset) -= val; } } template inline void diagview::operator*=(const eT val) { arma_extra_debug_sigprint(); Mat& t_m = const_cast< Mat& >(m); const uword t_n_elem = n_elem; const uword t_row_offset = row_offset; const uword t_col_offset = col_offset; for(uword ii=0; ii < t_n_elem; ++ii) { t_m.at( ii + t_row_offset, ii + t_col_offset) *= val; } } template inline void diagview::operator/=(const eT val) { arma_extra_debug_sigprint(); Mat& t_m = const_cast< Mat& >(m); const uword t_n_elem = n_elem; const uword t_row_offset = row_offset; const uword t_col_offset = col_offset; for(uword ii=0; ii < t_n_elem; ++ii) { t_m.at( ii + t_row_offset, ii + t_col_offset) /= val; } } //! set a diagonal of our matrix using data from a foreign object template template inline void diagview::operator= (const Base& o) { arma_extra_debug_sigprint(); diagview& d = *this; Mat& d_m = const_cast< Mat& >(d.m); const uword d_n_elem = d.n_elem; const uword d_row_offset = d.row_offset; const uword d_col_offset = d.col_offset; const Proxy P( o.get_ref() ); arma_debug_check ( ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ), "diagview: given object has incompatible size" ); const bool is_alias = P.is_alias(d_m); if(is_alias) { arma_extra_debug_print("aliasing detected"); } if( (is_Mat::stored_type>::value) || (Proxy::use_at) || (is_alias) ) { const unwrap_check::stored_type> tmp(P.Q, is_alias); const Mat& x = tmp.M; const eT* x_mem = x.memptr(); uword ii,jj; for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2) { const eT tmp_i = x_mem[ii]; const eT tmp_j = x_mem[jj]; d_m.at( ii + d_row_offset, ii + d_col_offset) = tmp_i; d_m.at( jj + d_row_offset, jj + d_col_offset) = tmp_j; } if(ii < d_n_elem) { d_m.at( ii + d_row_offset, ii + d_col_offset) = x_mem[ii]; } } else { typename Proxy::ea_type Pea = P.get_ea(); uword ii,jj; for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2) { const eT tmp_i = Pea[ii]; const eT tmp_j = Pea[jj]; d_m.at( ii + d_row_offset, ii + d_col_offset) = tmp_i; d_m.at( jj + d_row_offset, jj + d_col_offset) = tmp_j; } if(ii < d_n_elem) { d_m.at( ii + d_row_offset, ii + d_col_offset) = Pea[ii]; } } } template template inline void diagview::operator+=(const Base& o) { arma_extra_debug_sigprint(); diagview& d = *this; Mat& d_m = const_cast< Mat& >(d.m); const uword d_n_elem = d.n_elem; const uword d_row_offset = d.row_offset; const uword d_col_offset = d.col_offset; const Proxy P( o.get_ref() ); arma_debug_check ( ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ), "diagview: given object has incompatible size" ); const bool is_alias = P.is_alias(d_m); if(is_alias) { arma_extra_debug_print("aliasing detected"); } if( (is_Mat::stored_type>::value) || (Proxy::use_at) || (is_alias) ) { const unwrap_check::stored_type> tmp(P.Q, is_alias); const Mat& x = tmp.M; const eT* x_mem = x.memptr(); uword ii,jj; for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2) { const eT tmp_i = x_mem[ii]; const eT tmp_j = x_mem[jj]; d_m.at( ii + d_row_offset, ii + d_col_offset) += tmp_i; d_m.at( jj + d_row_offset, jj + d_col_offset) += tmp_j; } if(ii < d_n_elem) { d_m.at( ii + d_row_offset, ii + d_col_offset) += x_mem[ii]; } } else { typename Proxy::ea_type Pea = P.get_ea(); uword ii,jj; for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2) { const eT tmp_i = Pea[ii]; const eT tmp_j = Pea[jj]; d_m.at( ii + d_row_offset, ii + d_col_offset) += tmp_i; d_m.at( jj + d_row_offset, jj + d_col_offset) += tmp_j; } if(ii < d_n_elem) { d_m.at( ii + d_row_offset, ii + d_col_offset) += Pea[ii]; } } } template template inline void diagview::operator-=(const Base& o) { arma_extra_debug_sigprint(); diagview& d = *this; Mat& d_m = const_cast< Mat& >(d.m); const uword d_n_elem = d.n_elem; const uword d_row_offset = d.row_offset; const uword d_col_offset = d.col_offset; const Proxy P( o.get_ref() ); arma_debug_check ( ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ), "diagview: given object has incompatible size" ); const bool is_alias = P.is_alias(d_m); if(is_alias) { arma_extra_debug_print("aliasing detected"); } if( (is_Mat::stored_type>::value) || (Proxy::use_at) || (is_alias) ) { const unwrap_check::stored_type> tmp(P.Q, is_alias); const Mat& x = tmp.M; const eT* x_mem = x.memptr(); uword ii,jj; for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2) { const eT tmp_i = x_mem[ii]; const eT tmp_j = x_mem[jj]; d_m.at( ii + d_row_offset, ii + d_col_offset) -= tmp_i; d_m.at( jj + d_row_offset, jj + d_col_offset) -= tmp_j; } if(ii < d_n_elem) { d_m.at( ii + d_row_offset, ii + d_col_offset) -= x_mem[ii]; } } else { typename Proxy::ea_type Pea = P.get_ea(); uword ii,jj; for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2) { const eT tmp_i = Pea[ii]; const eT tmp_j = Pea[jj]; d_m.at( ii + d_row_offset, ii + d_col_offset) -= tmp_i; d_m.at( jj + d_row_offset, jj + d_col_offset) -= tmp_j; } if(ii < d_n_elem) { d_m.at( ii + d_row_offset, ii + d_col_offset) -= Pea[ii]; } } } template template inline void diagview::operator%=(const Base& o) { arma_extra_debug_sigprint(); diagview& d = *this; Mat& d_m = const_cast< Mat& >(d.m); const uword d_n_elem = d.n_elem; const uword d_row_offset = d.row_offset; const uword d_col_offset = d.col_offset; const Proxy P( o.get_ref() ); arma_debug_check ( ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ), "diagview: given object has incompatible size" ); const bool is_alias = P.is_alias(d_m); if(is_alias) { arma_extra_debug_print("aliasing detected"); } if( (is_Mat::stored_type>::value) || (Proxy::use_at) || (is_alias) ) { const unwrap_check::stored_type> tmp(P.Q, is_alias); const Mat& x = tmp.M; const eT* x_mem = x.memptr(); uword ii,jj; for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2) { const eT tmp_i = x_mem[ii]; const eT tmp_j = x_mem[jj]; d_m.at( ii + d_row_offset, ii + d_col_offset) *= tmp_i; d_m.at( jj + d_row_offset, jj + d_col_offset) *= tmp_j; } if(ii < d_n_elem) { d_m.at( ii + d_row_offset, ii + d_col_offset) *= x_mem[ii]; } } else { typename Proxy::ea_type Pea = P.get_ea(); uword ii,jj; for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2) { const eT tmp_i = Pea[ii]; const eT tmp_j = Pea[jj]; d_m.at( ii + d_row_offset, ii + d_col_offset) *= tmp_i; d_m.at( jj + d_row_offset, jj + d_col_offset) *= tmp_j; } if(ii < d_n_elem) { d_m.at( ii + d_row_offset, ii + d_col_offset) *= Pea[ii]; } } } template template inline void diagview::operator/=(const Base& o) { arma_extra_debug_sigprint(); diagview& d = *this; Mat& d_m = const_cast< Mat& >(d.m); const uword d_n_elem = d.n_elem; const uword d_row_offset = d.row_offset; const uword d_col_offset = d.col_offset; const Proxy P( o.get_ref() ); arma_debug_check ( ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ), "diagview: given object has incompatible size" ); const bool is_alias = P.is_alias(d_m); if(is_alias) { arma_extra_debug_print("aliasing detected"); } if( (is_Mat::stored_type>::value) || (Proxy::use_at) || (is_alias) ) { const unwrap_check::stored_type> tmp(P.Q, is_alias); const Mat& x = tmp.M; const eT* x_mem = x.memptr(); uword ii,jj; for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2) { const eT tmp_i = x_mem[ii]; const eT tmp_j = x_mem[jj]; d_m.at( ii + d_row_offset, ii + d_col_offset) /= tmp_i; d_m.at( jj + d_row_offset, jj + d_col_offset) /= tmp_j; } if(ii < d_n_elem) { d_m.at( ii + d_row_offset, ii + d_col_offset) /= x_mem[ii]; } } else { typename Proxy::ea_type Pea = P.get_ea(); uword ii,jj; for(ii=0, jj=1; jj < d_n_elem; ii+=2, jj+=2) { const eT tmp_i = Pea[ii]; const eT tmp_j = Pea[jj]; d_m.at( ii + d_row_offset, ii + d_col_offset) /= tmp_i; d_m.at( jj + d_row_offset, jj + d_col_offset) /= tmp_j; } if(ii < d_n_elem) { d_m.at( ii + d_row_offset, ii + d_col_offset) /= Pea[ii]; } } } //! extract a diagonal and store it as a column vector template inline void diagview::extract(Mat& out, const diagview& in) { arma_extra_debug_sigprint(); // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing; // size setting and alias checking is done by either the Mat contructor or operator=() const Mat& in_m = in.m; const uword in_n_elem = in.n_elem; const uword in_row_offset = in.row_offset; const uword in_col_offset = in.col_offset; eT* out_mem = out.memptr(); uword i,j; for(i=0, j=1; j < in_n_elem; i+=2, j+=2) { const eT tmp_i = in_m.at( i + in_row_offset, i + in_col_offset ); const eT tmp_j = in_m.at( j + in_row_offset, j + in_col_offset ); out_mem[i] = tmp_i; out_mem[j] = tmp_j; } if(i < in_n_elem) { out_mem[i] = in_m.at( i + in_row_offset, i + in_col_offset ); } } //! X += Y.diag() template inline void diagview::plus_inplace(Mat& out, const diagview& in) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out.n_rows, out.n_cols, in.n_rows, in.n_cols, "addition"); const Mat& in_m = in.m; const uword in_n_elem = in.n_elem; const uword in_row_offset = in.row_offset; const uword in_col_offset = in.col_offset; eT* out_mem = out.memptr(); uword i,j; for(i=0, j=1; j < in_n_elem; i+=2, j+=2) { const eT tmp_i = in_m.at( i + in_row_offset, i + in_col_offset ); const eT tmp_j = in_m.at( j + in_row_offset, j + in_col_offset ); out_mem[i] += tmp_i; out_mem[j] += tmp_j; } if(i < in_n_elem) { out_mem[i] += in_m.at( i + in_row_offset, i + in_col_offset ); } } //! X -= Y.diag() template inline void diagview::minus_inplace(Mat& out, const diagview& in) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out.n_rows, out.n_cols, in.n_rows, in.n_cols, "subtraction"); const Mat& in_m = in.m; const uword in_n_elem = in.n_elem; const uword in_row_offset = in.row_offset; const uword in_col_offset = in.col_offset; eT* out_mem = out.memptr(); uword i,j; for(i=0, j=1; j < in_n_elem; i+=2, j+=2) { const eT tmp_i = in_m.at( i + in_row_offset, i + in_col_offset ); const eT tmp_j = in_m.at( j + in_row_offset, j + in_col_offset ); out_mem[i] -= tmp_i; out_mem[j] -= tmp_j; } if(i < in_n_elem) { out_mem[i] -= in_m.at( i + in_row_offset, i + in_col_offset ); } } //! X %= Y.diag() template inline void diagview::schur_inplace(Mat& out, const diagview& in) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out.n_rows, out.n_cols, in.n_rows, in.n_cols, "element-wise multiplication"); const Mat& in_m = in.m; const uword in_n_elem = in.n_elem; const uword in_row_offset = in.row_offset; const uword in_col_offset = in.col_offset; eT* out_mem = out.memptr(); uword i,j; for(i=0, j=1; j < in_n_elem; i+=2, j+=2) { const eT tmp_i = in_m.at( i + in_row_offset, i + in_col_offset ); const eT tmp_j = in_m.at( j + in_row_offset, j + in_col_offset ); out_mem[i] *= tmp_i; out_mem[j] *= tmp_j; } if(i < in_n_elem) { out_mem[i] *= in_m.at( i + in_row_offset, i + in_col_offset ); } } //! X /= Y.diag() template inline void diagview::div_inplace(Mat& out, const diagview& in) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out.n_rows, out.n_cols, in.n_rows, in.n_cols, "element-wise division"); const Mat& in_m = in.m; const uword in_n_elem = in.n_elem; const uword in_row_offset = in.row_offset; const uword in_col_offset = in.col_offset; eT* out_mem = out.memptr(); uword i,j; for(i=0, j=1; j < in_n_elem; i+=2, j+=2) { const eT tmp_i = in_m.at( i + in_row_offset, i + in_col_offset ); const eT tmp_j = in_m.at( j + in_row_offset, j + in_col_offset ); out_mem[i] /= tmp_i; out_mem[j] /= tmp_j; } if(i < in_n_elem) { out_mem[i] /= in_m.at( i + in_row_offset, i + in_col_offset ); } } template arma_inline eT diagview::at_alt(const uword ii) const { return m.at(ii+row_offset, ii+col_offset); } template arma_inline eT& diagview::operator[](const uword ii) { return (const_cast< Mat& >(m)).at(ii+row_offset, ii+col_offset); } template arma_inline eT diagview::operator[](const uword ii) const { return m.at(ii+row_offset, ii+col_offset); } template arma_inline eT& diagview::at(const uword ii) { return (const_cast< Mat& >(m)).at(ii+row_offset, ii+col_offset); } template arma_inline eT diagview::at(const uword ii) const { return m.at(ii+row_offset, ii+col_offset); } template arma_inline eT& diagview::operator()(const uword ii) { arma_debug_check_bounds( (ii >= n_elem), "diagview::operator(): out of bounds" ); return (const_cast< Mat& >(m)).at(ii+row_offset, ii+col_offset); } template arma_inline eT diagview::operator()(const uword ii) const { arma_debug_check_bounds( (ii >= n_elem), "diagview::operator(): out of bounds" ); return m.at(ii+row_offset, ii+col_offset); } template arma_inline eT& diagview::at(const uword row, const uword) { return (const_cast< Mat& >(m)).at(row+row_offset, row+col_offset); } template arma_inline eT diagview::at(const uword row, const uword) const { return m.at(row+row_offset, row+col_offset); } template arma_inline eT& diagview::operator()(const uword row, const uword col) { arma_debug_check_bounds( ((row >= n_elem) || (col > 0)), "diagview::operator(): out of bounds" ); return (const_cast< Mat& >(m)).at(row+row_offset, row+col_offset); } template arma_inline eT diagview::operator()(const uword row, const uword col) const { arma_debug_check_bounds( ((row >= n_elem) || (col > 0)), "diagview::operator(): out of bounds" ); return m.at(row+row_offset, row+col_offset); } template inline void diagview::replace(const eT old_val, const eT new_val) { arma_extra_debug_sigprint(); Mat& x = const_cast< Mat& >(m); const uword local_n_elem = n_elem; if(arma_isnan(old_val)) { for(uword ii=0; ii < local_n_elem; ++ii) { eT& val = x.at(ii+row_offset, ii+col_offset); val = (arma_isnan(val)) ? new_val : val; } } else { for(uword ii=0; ii < local_n_elem; ++ii) { eT& val = x.at(ii+row_offset, ii+col_offset); val = (val == old_val) ? new_val : val; } } } template inline void diagview::clean(const typename get_pod_type::result threshold) { arma_extra_debug_sigprint(); Mat tmp(*this); tmp.clean(threshold); (*this).operator=(tmp); } template inline void diagview::clamp(const eT min_val, const eT max_val) { arma_extra_debug_sigprint(); Mat tmp(*this); tmp.clamp(min_val, max_val); (*this).operator=(tmp); } template inline void diagview::fill(const eT val) { arma_extra_debug_sigprint(); Mat& x = const_cast< Mat& >(m); const uword local_n_elem = n_elem; for(uword ii=0; ii < local_n_elem; ++ii) { x.at(ii+row_offset, ii+col_offset) = val; } } template inline void diagview::zeros() { arma_extra_debug_sigprint(); (*this).fill(eT(0)); } template inline void diagview::ones() { arma_extra_debug_sigprint(); (*this).fill(eT(1)); } template inline void diagview::randu() { arma_extra_debug_sigprint(); Mat& x = const_cast< Mat& >(m); const uword local_n_elem = n_elem; for(uword ii=0; ii < local_n_elem; ++ii) { x.at(ii+row_offset, ii+col_offset) = eT(arma_rng::randu()); } } template inline void diagview::randn() { arma_extra_debug_sigprint(); Mat& x = const_cast< Mat& >(m); const uword local_n_elem = n_elem; for(uword ii=0; ii < local_n_elem; ++ii) { x.at(ii+row_offset, ii+col_offset) = eT(arma_rng::randn()); } } //! @} RcppArmadillo/inst/include/armadillo_bits/SpGlue_bones.hpp0000644000176200001440000000333114124060717023470 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpGlue //! @{ template class SpGlue : public SpBase< typename T1::elem_type, SpGlue > { public: typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = spglue_type::template traits::is_row; static constexpr bool is_col = spglue_type::template traits::is_col; static constexpr bool is_xvec = spglue_type::template traits::is_xvec; inline SpGlue(const T1& in_A, const T2& in_B); inline SpGlue(const T1& in_A, const T2& in_B, const elem_type in_aux); inline ~SpGlue(); arma_inline bool is_alias(const SpMat& X) const; const T1& A; //!< first operand; must be derived from SpBase const T2& B; //!< second operand; must be derived from SpBase elem_type aux; }; //! @} RcppArmadillo/inst/include/armadillo_bits/unwrap.hpp0000644000176200001440000022776014124060717022435 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup unwrap //! @{ // TODO: document the conditions and restrictions for the use of each unwrap variant: // TODO: unwrap, unwrap_check, quasi_unwrap, partial_unwrap, partial_unwrap_check template struct unwrap_default { typedef typename T1::elem_type eT; typedef Mat stored_type; inline unwrap_default(const T1& A) : M(A) { arma_extra_debug_sigprint(); } const Mat M; }; template struct unwrap_fixed { typedef T1 stored_type; inline explicit unwrap_fixed(const T1& A) : M(A) { arma_extra_debug_sigprint(); } const T1& M; }; template struct unwrap_redirect {}; template struct unwrap_redirect { typedef unwrap_default result; }; template struct unwrap_redirect { typedef unwrap_fixed result; }; template struct unwrap : public unwrap_redirect::value>::result { inline unwrap(const T1& A) : unwrap_redirect::value>::result(A) { } }; template struct unwrap< Mat > { typedef Mat stored_type; inline unwrap(const Mat& A) : M(A) { arma_extra_debug_sigprint(); } const Mat& M; }; template struct unwrap< Row > { typedef Row stored_type; inline unwrap(const Row& A) : M(A) { arma_extra_debug_sigprint(); } const Row& M; }; template struct unwrap< Col > { typedef Col stored_type; inline unwrap(const Col& A) : M(A) { arma_extra_debug_sigprint(); } const Col& M; }; template struct unwrap< subview_col > { typedef Col stored_type; inline unwrap(const subview_col& A) : M(A.colmem, A.n_rows) { arma_extra_debug_sigprint(); } const Col M; }; template struct unwrap< subview_cols > { typedef Mat stored_type; inline unwrap(const subview_cols& A) : M(A.colptr(0), A.n_rows, A.n_cols) { arma_extra_debug_sigprint(); } const Mat M; }; template struct unwrap< mtGlue > { typedef Mat stored_type; inline unwrap(const mtGlue& A) : M(A) { arma_extra_debug_sigprint(); } const Mat M; }; template struct unwrap< mtOp > { typedef Mat stored_type; inline unwrap(const mtOp& A) : M(A) { arma_extra_debug_sigprint(); } const Mat M; }; // // // template struct quasi_unwrap_default { typedef typename T1::elem_type eT; inline quasi_unwrap_default(const T1& A) : M(A) { arma_extra_debug_sigprint(); } // NOTE: DO NOT DIRECTLY CHECK FOR ALIASING BY TAKING THE ADDRESS OF THE "M" OBJECT IN ANY quasi_unwrap CLASS !!! Mat M; static constexpr bool is_const = false; static constexpr bool has_subview = false; static constexpr bool has_orig_mem = false; template constexpr bool is_alias(const Mat&) const { return false; } }; template struct quasi_unwrap_fixed { typedef typename T1::elem_type eT; inline explicit quasi_unwrap_fixed(const T1& A) : M(A) { arma_extra_debug_sigprint(); } const T1& M; static constexpr bool is_const = true; static constexpr bool has_subview = false; static constexpr bool has_orig_mem = true; template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&M) == void_ptr(&X)); } }; template struct quasi_unwrap_redirect {}; template struct quasi_unwrap_redirect { typedef quasi_unwrap_default result; }; template struct quasi_unwrap_redirect { typedef quasi_unwrap_fixed result; }; template struct quasi_unwrap : public quasi_unwrap_redirect::value>::result { typedef typename quasi_unwrap_redirect::value>::result quasi_unwrap_extra; inline quasi_unwrap(const T1& A) : quasi_unwrap_extra(A) { } static constexpr bool is_const = quasi_unwrap_extra::is_const; static constexpr bool has_subview = quasi_unwrap_extra::has_subview; static constexpr bool has_orig_mem = quasi_unwrap_extra::has_orig_mem; using quasi_unwrap_extra::M; using quasi_unwrap_extra::is_alias; }; template struct quasi_unwrap< Mat > { inline quasi_unwrap(const Mat& A) : M(A) { arma_extra_debug_sigprint(); } const Mat& M; static constexpr bool is_const = true; static constexpr bool has_subview = false; static constexpr bool has_orig_mem = true; template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&M) == void_ptr(&X)); } }; template struct quasi_unwrap< Row > { inline quasi_unwrap(const Row& A) : M(A) { arma_extra_debug_sigprint(); } const Row& M; static constexpr bool is_const = true; static constexpr bool has_subview = false; static constexpr bool has_orig_mem = true; template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&M) == void_ptr(&X)); } }; template struct quasi_unwrap< Col > { inline quasi_unwrap(const Col& A) : M(A) { arma_extra_debug_sigprint(); } const Col& M; static constexpr bool is_const = true; static constexpr bool has_subview = false; static constexpr bool has_orig_mem = true; template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&M) == void_ptr(&X)); } }; template struct quasi_unwrap< subview > { inline quasi_unwrap(const subview& A) : sv( A ) , M ( A, ((A.aux_row1 == 0) && (A.n_rows == A.m.n_rows)) ) // reuse memory if the subview is a contiguous chunk { arma_extra_debug_sigprint(); } const subview& sv; const Mat M; static constexpr bool is_const = true; static constexpr bool has_subview = true; static constexpr bool has_orig_mem = false; // NOTE: set to false as this is the general case; original memory is only used when the subview is a contiguous chunk template arma_inline bool is_alias(const Mat& X) const { return ( ((sv.aux_row1 == 0) && (sv.n_rows == sv.m.n_rows)) ? (void_ptr(&(sv.m)) == void_ptr(&X)) : false ); } }; template struct quasi_unwrap< subview_row > { inline quasi_unwrap(const subview_row& A) : M(A) { arma_extra_debug_sigprint(); } Row M; static constexpr bool is_const = false; static constexpr bool has_subview = false; static constexpr bool has_orig_mem = false; template constexpr bool is_alias(const Mat&) const { return false; } }; template struct quasi_unwrap< subview_col > { inline quasi_unwrap(const subview_col& A) : orig( A.m ) , M ( const_cast( A.colmem ), A.n_rows, false, false ) { arma_extra_debug_sigprint(); } const Mat& orig; const Col M; static constexpr bool is_const = true; static constexpr bool has_subview = true; static constexpr bool has_orig_mem = true; template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&orig) == void_ptr(&X)); } }; template struct quasi_unwrap< subview_cols > { inline quasi_unwrap(const subview_cols& A) : orig( A.m ) , M ( const_cast( A.colptr(0) ), A.n_rows, A.n_cols, false, false ) { arma_extra_debug_sigprint(); } const Mat& orig; const Mat M; static constexpr bool is_const = true; static constexpr bool has_subview = true; static constexpr bool has_orig_mem = true; template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&orig) == void_ptr(&X)); } }; template struct quasi_unwrap< mtGlue > { inline quasi_unwrap(const mtGlue& A) : M(A) { arma_extra_debug_sigprint(); } Mat M; static constexpr bool is_const = false; static constexpr bool has_subview = false; static constexpr bool has_orig_mem = false; template constexpr bool is_alias(const Mat&) const { return false; } }; template struct quasi_unwrap< mtOp > { inline quasi_unwrap(const mtOp& A) : M(A) { arma_extra_debug_sigprint(); } Mat M; static constexpr bool is_const = false; static constexpr bool has_subview = false; static constexpr bool has_orig_mem = false; template constexpr bool is_alias(const Mat&) const { return false; } }; template struct quasi_unwrap< Op > { typedef typename T1::elem_type eT; inline quasi_unwrap(const Op& A) : U( A.m ) , M( const_cast(U.M.memptr()), U.M.n_elem, 1, false, false ) { arma_extra_debug_sigprint(); } const quasi_unwrap U; const Mat M; static constexpr bool is_const = true; static constexpr bool has_subview = true; static constexpr bool has_orig_mem = true; template arma_inline bool is_alias(const Mat& X) const { return U.is_alias(X); } }; template struct quasi_unwrap< Op, op_strans> > { inline quasi_unwrap(const Op, op_strans>& A) : orig(A.m) , M (const_cast(A.m.memptr()), A.m.n_elem, false, false) { arma_extra_debug_sigprint(); } const Col& orig; const Row M; static constexpr bool is_const = true; static constexpr bool has_subview = true; static constexpr bool has_orig_mem = true; template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&orig) == void_ptr(&X)); } }; template struct quasi_unwrap< Op, op_strans> > { inline quasi_unwrap(const Op, op_strans>& A) : orig(A.m) , M (const_cast(A.m.memptr()), A.m.n_elem, false, false) { arma_extra_debug_sigprint(); } const Row& orig; const Col M; static constexpr bool is_const = true; static constexpr bool has_subview = true; static constexpr bool has_orig_mem = true; template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&orig) == void_ptr(&X)); } }; template struct quasi_unwrap< Op, op_strans> > { inline quasi_unwrap(const Op, op_strans>& A) : orig( A.m.m ) , M ( const_cast( A.m.colmem ), A.m.n_rows, false, false ) { arma_extra_debug_sigprint(); } const Mat& orig; const Row M; static constexpr bool is_const = true; static constexpr bool has_subview = true; static constexpr bool has_orig_mem = true; template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&orig)); } }; template struct quasi_unwrap_Col_htrans { inline quasi_unwrap_Col_htrans(const T1&) {} }; template struct quasi_unwrap_Col_htrans< Op, op_htrans> > { inline quasi_unwrap_Col_htrans(const Op, op_htrans>& A) : orig(A.m) , M (const_cast(A.m.memptr()), A.m.n_elem, false, false) { arma_extra_debug_sigprint(); } const Col& orig; const Row M; static constexpr bool is_const = true; static constexpr bool has_subview = true; static constexpr bool has_orig_mem = true; template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&orig) == void_ptr(&X)); } }; template struct quasi_unwrap_Col_htrans_redirect {}; template struct quasi_unwrap_Col_htrans_redirect { typedef quasi_unwrap_default result; }; template struct quasi_unwrap_Col_htrans_redirect { typedef quasi_unwrap_Col_htrans result; }; template struct quasi_unwrap< Op, op_htrans> > : public quasi_unwrap_Col_htrans_redirect< Op, op_htrans>, is_cx::value >::result { typedef typename quasi_unwrap_Col_htrans_redirect< Op, op_htrans>, is_cx::value >::result quasi_unwrap_Col_htrans_extra; inline quasi_unwrap(const Op, op_htrans>& A) : quasi_unwrap_Col_htrans_extra(A) { } static constexpr bool is_const = quasi_unwrap_Col_htrans_extra::is_const; static constexpr bool has_subview = quasi_unwrap_Col_htrans_extra::has_subview; static constexpr bool has_orig_mem = quasi_unwrap_Col_htrans_extra::has_orig_mem; using quasi_unwrap_Col_htrans_extra::M; using quasi_unwrap_Col_htrans_extra::is_alias; }; template struct quasi_unwrap_Row_htrans { inline quasi_unwrap_Row_htrans(const T1&) {} }; template struct quasi_unwrap_Row_htrans< Op, op_htrans> > { inline quasi_unwrap_Row_htrans(const Op, op_htrans>& A) : orig(A.m) , M (const_cast(A.m.memptr()), A.m.n_elem, false, false) { arma_extra_debug_sigprint(); } const Row& orig; const Col M; static constexpr bool is_const = true; static constexpr bool has_subview = true; static constexpr bool has_orig_mem = true; template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&orig) == void_ptr(&X)); } }; template struct quasi_unwrap_Row_htrans_redirect {}; template struct quasi_unwrap_Row_htrans_redirect { typedef quasi_unwrap_default result; }; template struct quasi_unwrap_Row_htrans_redirect { typedef quasi_unwrap_Row_htrans result; }; template struct quasi_unwrap< Op, op_htrans> > : public quasi_unwrap_Row_htrans_redirect< Op, op_htrans>, is_cx::value >::result { typedef typename quasi_unwrap_Row_htrans_redirect< Op, op_htrans>, is_cx::value >::result quasi_unwrap_Row_htrans_extra; inline quasi_unwrap(const Op, op_htrans>& A) : quasi_unwrap_Row_htrans_extra(A) { } static constexpr bool is_const = quasi_unwrap_Row_htrans_extra::is_const; static constexpr bool has_subview = quasi_unwrap_Row_htrans_extra::has_subview; static constexpr bool has_orig_mem = quasi_unwrap_Row_htrans_extra::has_orig_mem; using quasi_unwrap_Row_htrans_extra::M; using quasi_unwrap_Row_htrans_extra::is_alias; }; template struct quasi_unwrap_subview_col_htrans { inline quasi_unwrap_subview_col_htrans(const T1&) {} }; template struct quasi_unwrap_subview_col_htrans< Op, op_htrans> > { inline quasi_unwrap_subview_col_htrans(const Op, op_htrans>& A) : orig(A.m.m) , M (const_cast(A.m.colmem), A.m.n_rows, false, false) { arma_extra_debug_sigprint(); } const Mat& orig; const Row M; static constexpr bool is_const = true; static constexpr bool has_subview = true; static constexpr bool has_orig_mem = true; template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&orig) == void_ptr(&X)); } }; template struct quasi_unwrap_subview_col_htrans_redirect {}; template struct quasi_unwrap_subview_col_htrans_redirect { typedef quasi_unwrap_default result; }; template struct quasi_unwrap_subview_col_htrans_redirect { typedef quasi_unwrap_subview_col_htrans result; }; template struct quasi_unwrap< Op, op_htrans> > : public quasi_unwrap_subview_col_htrans_redirect< Op, op_htrans>, is_cx::value >::result { typedef typename quasi_unwrap_subview_col_htrans_redirect< Op, op_htrans>, is_cx::value >::result quasi_unwrap_subview_col_htrans_extra; inline quasi_unwrap(const Op, op_htrans>& A) : quasi_unwrap_subview_col_htrans_extra(A) { } static constexpr bool is_const = quasi_unwrap_subview_col_htrans_extra::is_const; static constexpr bool has_subview = quasi_unwrap_subview_col_htrans_extra::has_subview; static constexpr bool has_orig_mem = quasi_unwrap_subview_col_htrans_extra::has_orig_mem; using quasi_unwrap_subview_col_htrans_extra::M; using quasi_unwrap_subview_col_htrans_extra::is_alias; }; template struct quasi_unwrap< CubeToMatOp > { typedef typename T1::elem_type eT; inline quasi_unwrap(const CubeToMatOp& A) : U( A.m ) , M( const_cast(U.M.memptr()), U.M.n_elem, 1, false, true ) { arma_extra_debug_sigprint(); } const unwrap_cube U; const Mat M; static constexpr bool is_const = true; static constexpr bool has_subview = true; static constexpr bool has_orig_mem = true; template constexpr bool is_alias(const Mat&) const { return false; } }; template struct quasi_unwrap< SpToDOp > { typedef typename T1::elem_type eT; inline quasi_unwrap(const SpToDOp& A) : U( A.m ) , M( const_cast(U.M.values), U.M.n_nonzero, 1, false, true ) { arma_extra_debug_sigprint(); } const unwrap_spmat U; const Mat M; static constexpr bool is_const = true; static constexpr bool has_subview = true; static constexpr bool has_orig_mem = true; template constexpr bool is_alias(const Mat&) const { return false; } }; // // // template struct unwrap_check_default { typedef typename T1::elem_type eT; typedef Mat stored_type; inline unwrap_check_default(const T1& A, const Mat&) : M(A) { arma_extra_debug_sigprint(); } inline unwrap_check_default(const T1& A, const bool) : M(A) { arma_extra_debug_sigprint(); } const Mat M; }; template struct unwrap_check_fixed { typedef typename T1::elem_type eT; typedef T1 stored_type; inline unwrap_check_fixed(const T1& A, const Mat& B) : M_local( (&A == &B) ? new T1(A) : nullptr ) , M ( (&A == &B) ? *M_local : A ) { arma_extra_debug_sigprint(); } inline unwrap_check_fixed(const T1& A, const bool is_alias) : M_local( is_alias ? new T1(A) : nullptr ) , M ( is_alias ? *M_local : A ) { arma_extra_debug_sigprint(); } inline ~unwrap_check_fixed() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } // the order below is important const T1* M_local; const T1& M; }; template struct unwrap_check_redirect {}; template struct unwrap_check_redirect { typedef unwrap_check_default result; }; template struct unwrap_check_redirect { typedef unwrap_check_fixed result; }; template struct unwrap_check : public unwrap_check_redirect::value>::result { inline unwrap_check(const T1& A, const Mat& B) : unwrap_check_redirect::value>::result(A, B) { } inline unwrap_check(const T1& A, const bool is_alias) : unwrap_check_redirect::value>::result(A, is_alias) { } }; template struct unwrap_check< Mat > { typedef Mat stored_type; inline unwrap_check(const Mat& A, const Mat& B) : M_local( (&A == &B) ? new Mat(A) : nullptr ) , M ( (&A == &B) ? (*M_local) : A ) { arma_extra_debug_sigprint(); } inline unwrap_check(const Mat& A, const bool is_alias) : M_local( is_alias ? new Mat(A) : nullptr ) , M ( is_alias ? (*M_local) : A ) { arma_extra_debug_sigprint(); } inline ~unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } // the order below is important const Mat* M_local; const Mat& M; }; template struct unwrap_check< Row > { typedef Row stored_type; inline unwrap_check(const Row& A, const Mat& B) : M_local( (&A == &B) ? new Row(A) : nullptr ) , M ( (&A == &B) ? (*M_local) : A ) { arma_extra_debug_sigprint(); } inline unwrap_check(const Row& A, const bool is_alias) : M_local( is_alias ? new Row(A) : nullptr ) , M ( is_alias ? (*M_local) : A ) { arma_extra_debug_sigprint(); } inline ~unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } // the order below is important const Row* M_local; const Row& M; }; template struct unwrap_check< Col > { typedef Col stored_type; inline unwrap_check(const Col& A, const Mat& B) : M_local( (&A == &B) ? new Col(A) : nullptr ) , M ( (&A == &B) ? (*M_local) : A ) { arma_extra_debug_sigprint(); } inline unwrap_check(const Col& A, const bool is_alias) : M_local( is_alias ? new Col(A) : nullptr ) , M ( is_alias ? (*M_local) : A ) { arma_extra_debug_sigprint(); } inline ~unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } // the order below is important const Col* M_local; const Col& M; }; // // // template struct unwrap_check_mixed { typedef typename T1::elem_type eT1; template inline unwrap_check_mixed(const T1& A, const Mat&) : M(A) { arma_extra_debug_sigprint(); } //template inline unwrap_check_mixed(const T1& A, const bool) : M(A) { arma_extra_debug_sigprint(); } const Mat M; }; template struct unwrap_check_mixed< Mat > { template inline unwrap_check_mixed(const Mat& A, const Mat& B) : M_local( (void_ptr(&A) == void_ptr(&B)) ? new Mat(A) : nullptr ) , M ( (void_ptr(&A) == void_ptr(&B)) ? (*M_local) : A ) { arma_extra_debug_sigprint(); } //template inline unwrap_check_mixed(const Mat& A, const bool is_alias) : M_local( is_alias ? new Mat(A) : nullptr ) , M ( is_alias ? (*M_local) : A ) { arma_extra_debug_sigprint(); } inline ~unwrap_check_mixed() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } // the order below is important const Mat* M_local; const Mat& M; }; template struct unwrap_check_mixed< Row > { template inline unwrap_check_mixed(const Row& A, const Mat& B) : M_local( (void_ptr(&A) == void_ptr(&B)) ? new Row(A) : nullptr ) , M ( (void_ptr(&A) == void_ptr(&B)) ? (*M_local) : A ) { arma_extra_debug_sigprint(); } //template inline unwrap_check_mixed(const Row& A, const bool is_alias) : M_local( is_alias ? new Row(A) : nullptr ) , M ( is_alias ? (*M_local) : A ) { arma_extra_debug_sigprint(); } inline ~unwrap_check_mixed() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } // the order below is important const Row* M_local; const Row& M; }; template struct unwrap_check_mixed< Col > { template inline unwrap_check_mixed(const Col& A, const Mat& B) : M_local( (void_ptr(&A) == void_ptr(&B)) ? new Col(A) : nullptr ) , M ( (void_ptr(&A) == void_ptr(&B)) ? (*M_local) : A ) { arma_extra_debug_sigprint(); } //template inline unwrap_check_mixed(const Col& A, const bool is_alias) : M_local( is_alias ? new Col(A) : nullptr ) , M ( is_alias ? (*M_local) : A ) { arma_extra_debug_sigprint(); } inline ~unwrap_check_mixed() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } // the order below is important const Col* M_local; const Col& M; }; // // // template struct partial_unwrap_default { typedef typename T1::elem_type eT; typedef Mat stored_type; inline partial_unwrap_default(const T1& A) : M(A) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template constexpr bool is_alias(const Mat&) const { return false; } static constexpr bool do_trans = false; static constexpr bool do_times = false; const Mat M; }; template struct partial_unwrap_fixed { typedef typename T1::elem_type eT; typedef T1 stored_type; inline explicit partial_unwrap_fixed(const T1& A) : M(A) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = false; static constexpr bool do_times = false; const T1& M; }; template struct partial_unwrap_redirect {}; template struct partial_unwrap_redirect { typedef partial_unwrap_default result; }; template struct partial_unwrap_redirect { typedef partial_unwrap_fixed result; }; template struct partial_unwrap : public partial_unwrap_redirect::value>::result { inline partial_unwrap(const T1& A) : partial_unwrap_redirect< T1, is_Mat_fixed::value>::result(A) { } }; template struct partial_unwrap< Mat > { typedef Mat stored_type; inline partial_unwrap(const Mat& A) : M(A) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = false; static constexpr bool do_times = false; const Mat& M; }; template struct partial_unwrap< Row > { typedef Row stored_type; inline partial_unwrap(const Row& A) : M(A) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = false; static constexpr bool do_times = false; const Row& M; }; template struct partial_unwrap< Col > { typedef Col stored_type; inline partial_unwrap(const Col& A) : M(A) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = false; static constexpr bool do_times = false; const Col& M; }; template struct partial_unwrap< subview > { typedef Mat stored_type; inline partial_unwrap(const subview& A) : sv( A ) , M ( A, ((A.aux_row1 == 0) && (A.n_rows == A.m.n_rows)) ) // reuse memory if the subview is a contiguous chunk { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template arma_inline bool is_alias(const Mat& X) const { return ( ((sv.aux_row1 == 0) && (sv.n_rows == sv.m.n_rows)) ? (void_ptr(&(sv.m)) == void_ptr(&X)) : false ); } static constexpr bool do_trans = false; static constexpr bool do_times = false; const subview& sv; const Mat M; }; template struct partial_unwrap< subview_col > { typedef Col stored_type; inline partial_unwrap(const subview_col& A) : orig( A.m ) , M ( const_cast( A.colmem ), A.n_rows, false, false ) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&orig)); } static constexpr bool do_trans = false; static constexpr bool do_times = false; const Mat& orig; const Col M; }; template struct partial_unwrap< subview_cols > { typedef Mat stored_type; inline partial_unwrap(const subview_cols& A) : orig( A.m ) , M ( const_cast( A.colptr(0) ), A.n_rows, A.n_cols, false, false ) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&orig)); } static constexpr bool do_trans = false; static constexpr bool do_times = false; const Mat& orig; const Mat M; }; template struct partial_unwrap< subview_row > { typedef Row stored_type; inline partial_unwrap(const subview_row& A) : M(A) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template constexpr bool is_alias(const Mat&) const { return false; } static constexpr bool do_trans = false; static constexpr bool do_times = false; const Row M; }; template struct partial_unwrap_htrans_default { typedef typename T1::elem_type eT; typedef Mat stored_type; inline partial_unwrap_htrans_default(const Op& A) : M(A.m) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template constexpr bool is_alias(const Mat&) const { return false; } static constexpr bool do_trans = true; static constexpr bool do_times = false; const Mat M; }; template struct partial_unwrap_htrans_fixed { typedef typename T1::elem_type eT; typedef T1 stored_type; inline explicit partial_unwrap_htrans_fixed(const Op& A) : M(A.m) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = true; static constexpr bool do_times = false; const T1& M; }; template struct partial_unwrap_htrans_redirect {}; template struct partial_unwrap_htrans_redirect { typedef partial_unwrap_htrans_default result; }; template struct partial_unwrap_htrans_redirect { typedef partial_unwrap_htrans_fixed result; }; template struct partial_unwrap< Op > : public partial_unwrap_htrans_redirect::value>::result { inline partial_unwrap(const Op& A) : partial_unwrap_htrans_redirect::value>::result(A) { } }; template struct partial_unwrap< Op< Mat, op_htrans> > { typedef Mat stored_type; inline partial_unwrap(const Op< Mat, op_htrans>& A) : M(A.m) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = true; static constexpr bool do_times = false; const Mat& M; }; template struct partial_unwrap< Op< Row, op_htrans> > { typedef Row stored_type; inline partial_unwrap(const Op< Row, op_htrans>& A) : M(A.m) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = true; static constexpr bool do_times = false; const Row& M; }; template struct partial_unwrap< Op< Col, op_htrans> > { typedef Col stored_type; inline partial_unwrap(const Op< Col, op_htrans>& A) : M(A.m) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = true; static constexpr bool do_times = false; const Col& M; }; template struct partial_unwrap< Op< subview, op_htrans> > { typedef Mat stored_type; inline partial_unwrap(const Op< subview, op_htrans>& A) : sv( A.m ) , M ( A.m, ((A.m.aux_row1 == 0) && (A.m.n_rows == A.m.m.n_rows)) ) // reuse memory if the subview is a contiguous chunk { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template arma_inline bool is_alias(const Mat& X) const { return ( ((sv.aux_row1 == 0) && (sv.n_rows == sv.m.n_rows)) ? (void_ptr(&(sv.m)) == void_ptr(&X)) : false ); } static constexpr bool do_trans = true; static constexpr bool do_times = false; const subview& sv; const Mat M; }; template struct partial_unwrap< Op< subview_cols, op_htrans> > { typedef Mat stored_type; inline partial_unwrap(const Op< subview_cols, op_htrans>& A) : orig( A.m.m ) , M ( const_cast( A.m.colptr(0) ), A.m.n_rows, A.m.n_cols, false, false ) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&orig) == void_ptr(&X)); } static constexpr bool do_trans = true; static constexpr bool do_times = false; const Mat& orig; const Mat M; }; template struct partial_unwrap< Op< subview_col, op_htrans> > { typedef Col stored_type; inline partial_unwrap(const Op< subview_col, op_htrans>& A) : orig( A.m.m ) , M ( const_cast( A.m.colmem ), A.m.n_rows, false, false ) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&orig)); } static constexpr bool do_trans = true; static constexpr bool do_times = false; const Mat& orig; const Col M; }; template struct partial_unwrap< Op< subview_row, op_htrans> > { typedef Row stored_type; inline partial_unwrap(const Op< subview_row, op_htrans>& A) : M(A.m) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } template constexpr bool is_alias(const Mat&) const { return false; } static constexpr bool do_trans = true; static constexpr bool do_times = false; const Row M; }; template struct partial_unwrap_htrans2_default { typedef typename T1::elem_type eT; typedef Mat stored_type; inline partial_unwrap_htrans2_default(const Op& A) : val(A.aux) , M (A.m) { arma_extra_debug_sigprint(); } arma_inline eT get_val() const { return val; } template constexpr bool is_alias(const Mat&) const { return false; } static constexpr bool do_trans = true; static constexpr bool do_times = true; const eT val; const Mat M; }; template struct partial_unwrap_htrans2_fixed { typedef typename T1::elem_type eT; typedef T1 stored_type; inline explicit partial_unwrap_htrans2_fixed(const Op& A) : val(A.aux) , M (A.m) { arma_extra_debug_sigprint(); } arma_inline eT get_val() const { return val; } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = true; static constexpr bool do_times = true; const eT val; const T1& M; }; template struct partial_unwrap_htrans2_redirect {}; template struct partial_unwrap_htrans2_redirect { typedef partial_unwrap_htrans2_default result; }; template struct partial_unwrap_htrans2_redirect { typedef partial_unwrap_htrans2_fixed result; }; template struct partial_unwrap< Op > : public partial_unwrap_htrans2_redirect::value>::result { inline partial_unwrap(const Op& A) : partial_unwrap_htrans2_redirect::value>::result(A) { } }; template struct partial_unwrap< Op< Mat, op_htrans2> > { typedef Mat stored_type; inline partial_unwrap(const Op< Mat, op_htrans2>& A) : val(A.aux) , M (A.m) { arma_extra_debug_sigprint(); } inline eT get_val() const { return val; } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = true; static constexpr bool do_times = true; const eT val; const Mat& M; }; template struct partial_unwrap< Op< Row, op_htrans2> > { typedef Row stored_type; inline partial_unwrap(const Op< Row, op_htrans2>& A) : val(A.aux) , M (A.m) { arma_extra_debug_sigprint(); } inline eT get_val() const { return val; } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = true; static constexpr bool do_times = true; const eT val; const Row& M; }; template struct partial_unwrap< Op< Col, op_htrans2> > { typedef Col stored_type; inline partial_unwrap(const Op< Col, op_htrans2>& A) : val(A.aux) , M (A.m) { arma_extra_debug_sigprint(); } inline eT get_val() const { return val; } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = true; static constexpr bool do_times = true; const eT val; const Col& M; }; template struct partial_unwrap< Op< subview, op_htrans2> > { typedef Mat stored_type; inline partial_unwrap(const Op< subview, op_htrans2>& A) : sv ( A.m ) , val( A.aux ) , M ( A.m, ((A.m.aux_row1 == 0) && (A.m.n_rows == A.m.m.n_rows)) ) // reuse memory if the subview is a contiguous chunk { arma_extra_debug_sigprint(); } inline eT get_val() const { return val; } template arma_inline bool is_alias(const Mat& X) const { return ( ((sv.aux_row1 == 0) && (sv.n_rows == sv.m.n_rows)) ? (void_ptr(&(sv.m)) == void_ptr(&X)) : false ); } static constexpr bool do_trans = true; static constexpr bool do_times = true; const subview& sv; const eT val; const Mat M; }; template struct partial_unwrap< Op< subview_cols, op_htrans2> > { typedef Mat stored_type; inline partial_unwrap(const Op< subview_cols, op_htrans2>& A) : orig( A.m.m ) , val ( A.aux ) , M ( const_cast( A.m.colptr(0) ), A.m.n_rows, A.m.n_cols, false, false ) { arma_extra_debug_sigprint(); } inline eT get_val() const { return val; } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&orig) == void_ptr(&X)); } static constexpr bool do_trans = true; static constexpr bool do_times = true; const Mat& orig; const eT val; const Mat M; }; template struct partial_unwrap< Op< subview_col, op_htrans2> > { typedef Col stored_type; inline partial_unwrap(const Op< subview_col, op_htrans2>& A) : orig( A.m.m ) , val ( A.aux ) , M ( const_cast( A.m.colmem ), A.m.n_rows, false, false ) { arma_extra_debug_sigprint(); } inline eT get_val() const { return val; } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&orig)); } static constexpr bool do_trans = true; static constexpr bool do_times = true; const Mat& orig; const eT val; const Col M; }; template struct partial_unwrap< Op< subview_row, op_htrans2> > { typedef Row stored_type; inline partial_unwrap(const Op< subview_row, op_htrans2>& A) : val(A.aux) , M (A.m ) { arma_extra_debug_sigprint(); } arma_inline eT get_val() const { return val; } template constexpr bool is_alias(const Mat&) const { return false; } static constexpr bool do_trans = true; static constexpr bool do_times = true; const eT val; const Row M; }; template struct partial_unwrap_scalar_times_default { typedef typename T1::elem_type eT; typedef Mat stored_type; inline partial_unwrap_scalar_times_default(const eOp& A) : val(A.aux) , M (A.P.Q) { arma_extra_debug_sigprint(); } arma_inline eT get_val() const { return val; } template constexpr bool is_alias(const Mat&) const { return false; } static constexpr bool do_trans = false; static constexpr bool do_times = true; const eT val; const Mat M; }; template struct partial_unwrap_scalar_times_fixed { typedef typename T1::elem_type eT; typedef T1 stored_type; inline explicit partial_unwrap_scalar_times_fixed(const eOp& A) : val(A.aux) , M (A.P.Q) { arma_extra_debug_sigprint(); } arma_inline eT get_val() const { return val; } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = false; static constexpr bool do_times = true; const eT val; const T1& M; }; template struct partial_unwrap_scalar_times_redirect {}; template struct partial_unwrap_scalar_times_redirect { typedef partial_unwrap_scalar_times_default result; }; template struct partial_unwrap_scalar_times_redirect { typedef partial_unwrap_scalar_times_fixed result; }; template struct partial_unwrap< eOp > : public partial_unwrap_scalar_times_redirect::value>::result { typedef typename T1::elem_type eT; inline partial_unwrap(const eOp& A) : partial_unwrap_scalar_times_redirect< T1, is_Mat_fixed::value>::result(A) { } }; template struct partial_unwrap< eOp, eop_scalar_times> > { typedef Mat stored_type; inline partial_unwrap(const eOp,eop_scalar_times>& A) : val(A.aux) , M (A.P.Q) { arma_extra_debug_sigprint(); } inline eT get_val() const { return val; } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = false; static constexpr bool do_times = true; const eT val; const Mat& M; }; template struct partial_unwrap< eOp, eop_scalar_times> > { typedef Row stored_type; inline partial_unwrap(const eOp,eop_scalar_times>& A) : val(A.aux) , M (A.P.Q) { arma_extra_debug_sigprint(); } inline eT get_val() const { return val; } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = false; static constexpr bool do_times = true; const eT val; const Row& M; }; template struct partial_unwrap< eOp, eop_scalar_times> > { typedef Col stored_type; inline partial_unwrap(const eOp,eop_scalar_times>& A) : val(A.aux) , M (A.P.Q) { arma_extra_debug_sigprint(); } inline eT get_val() const { return val; } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = false; static constexpr bool do_times = true; const eT val; const Col& M; }; template struct partial_unwrap< eOp, eop_scalar_times> > { typedef Col stored_type; inline partial_unwrap(const eOp,eop_scalar_times>& A) : orig( A.P.Q.m ) , val ( A.aux ) , M ( const_cast( A.P.Q.colmem ), A.P.Q.n_rows, false, false ) { arma_extra_debug_sigprint(); } arma_inline eT get_val() const { return val; } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&orig)); } static constexpr bool do_trans = false; static constexpr bool do_times = true; const Mat& orig; const eT val; const Col M; }; template struct partial_unwrap< eOp, eop_scalar_times> > { typedef Row stored_type; inline partial_unwrap(const eOp,eop_scalar_times>& A) : val(A.aux) , M (A.P.Q) { arma_extra_debug_sigprint(); } arma_inline eT get_val() const { return val; } template constexpr bool is_alias(const Mat&) const { return false; } static constexpr bool do_trans = false; static constexpr bool do_times = true; const eT val; const Row M; }; template struct partial_unwrap_neg_default { typedef typename T1::elem_type eT; typedef Mat stored_type; inline partial_unwrap_neg_default(const eOp& A) : M(A.P.Q) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(-1); } template constexpr bool is_alias(const Mat&) const { return false; } static constexpr bool do_trans = false; static constexpr bool do_times = true; const Mat M; }; template struct partial_unwrap_neg_fixed { typedef typename T1::elem_type eT; typedef T1 stored_type; inline explicit partial_unwrap_neg_fixed(const eOp& A) : M(A.P.Q) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(-1); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = false; static constexpr bool do_times = true; const T1& M; }; template struct partial_unwrap_neg_redirect {}; template struct partial_unwrap_neg_redirect { typedef partial_unwrap_neg_default result; }; template struct partial_unwrap_neg_redirect { typedef partial_unwrap_neg_fixed result; }; template struct partial_unwrap< eOp > : public partial_unwrap_neg_redirect::value>::result { typedef typename T1::elem_type eT; inline partial_unwrap(const eOp& A) : partial_unwrap_neg_redirect< T1, is_Mat_fixed::value>::result(A) { } }; template struct partial_unwrap< eOp, eop_neg> > { typedef Mat stored_type; inline partial_unwrap(const eOp,eop_neg>& A) : M(A.P.Q) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(-1); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = false; static constexpr bool do_times = true; const Mat& M; }; template struct partial_unwrap< eOp, eop_neg> > { typedef Row stored_type; inline partial_unwrap(const eOp,eop_neg>& A) : M(A.P.Q) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(-1); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = false; static constexpr bool do_times = true; const Row& M; }; template struct partial_unwrap< eOp, eop_neg> > { typedef Col stored_type; inline partial_unwrap(const eOp,eop_neg>& A) : M(A.P.Q) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(-1); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&M)); } static constexpr bool do_trans = false; static constexpr bool do_times = true; const Col& M; }; template struct partial_unwrap< eOp, eop_neg> > { typedef Col stored_type; inline partial_unwrap(const eOp,eop_neg>& A) : orig( A.P.Q.m ) , M ( const_cast( A.P.Q.colmem ), A.P.Q.n_rows, false, false ) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(-1); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&orig)); } static constexpr bool do_trans = false; static constexpr bool do_times = true; const Mat& orig; const Col M; }; template struct partial_unwrap< eOp, eop_neg> > { typedef Row stored_type; inline partial_unwrap(const eOp,eop_neg>& A) : M(A.P.Q) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(-1); } template constexpr bool is_alias(const Mat&) const { return false; } static constexpr bool do_trans = false; static constexpr bool do_times = true; const Row M; }; // template struct partial_unwrap_check_default { typedef typename T1::elem_type eT; typedef Mat stored_type; inline partial_unwrap_check_default(const T1& A, const Mat&) : M(A) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } static constexpr bool do_trans = false; static constexpr bool do_times = false; const Mat M; }; template struct partial_unwrap_check_fixed { typedef typename T1::elem_type eT; typedef T1 stored_type; inline explicit partial_unwrap_check_fixed(const T1& A, const Mat& B) : M_local( (&A == &B) ? new T1(A) : nullptr ) , M ( (&A == &B) ? (*M_local) : A ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check_fixed() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } constexpr eT get_val() const { return eT(1); } static constexpr bool do_trans = false; static constexpr bool do_times = false; const T1* M_local; const T1& M; }; template struct partial_unwrap_check_redirect {}; template struct partial_unwrap_check_redirect { typedef partial_unwrap_check_default result; }; template struct partial_unwrap_check_redirect { typedef partial_unwrap_check_fixed result; }; template struct partial_unwrap_check : public partial_unwrap_check_redirect::value>::result { typedef typename T1::elem_type eT; inline partial_unwrap_check(const T1& A, const Mat& B) : partial_unwrap_check_redirect::value>::result(A, B) { } }; template struct partial_unwrap_check< Mat > { typedef Mat stored_type; inline partial_unwrap_check(const Mat& A, const Mat& B) : M_local ( (&A == &B) ? new Mat(A) : nullptr ) , M ( (&A == &B) ? (*M_local) : A ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } constexpr eT get_val() const { return eT(1); } static constexpr bool do_trans = false; static constexpr bool do_times = false; // the order below is important const Mat* M_local; const Mat& M; }; template struct partial_unwrap_check< Row > { typedef Row stored_type; inline partial_unwrap_check(const Row& A, const Mat& B) : M_local ( (&A == &B) ? new Row(A) : nullptr ) , M ( (&A == &B) ? (*M_local) : A ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } constexpr eT get_val() const { return eT(1); } static constexpr bool do_trans = false; static constexpr bool do_times = false; // the order below is important const Row* M_local; const Row& M; }; template struct partial_unwrap_check< Col > { typedef Col stored_type; inline partial_unwrap_check(const Col& A, const Mat& B) : M_local ( (&A == &B) ? new Col(A) : nullptr ) , M ( (&A == &B) ? (*M_local) : A ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } constexpr eT get_val() const { return eT(1); } static constexpr bool do_trans = false; static constexpr bool do_times = false; // the order below is important const Col* M_local; const Col& M; }; // NOTE: we can get away with this shortcut as the partial_unwrap_check class is only used by the glue_times class, // NOTE: which relies on partial_unwrap_check to check for aliasing template struct partial_unwrap_check< subview_col > { typedef Col stored_type; inline partial_unwrap_check(const subview_col& A, const Mat& B) : M ( const_cast( A.colmem ), A.n_rows, (&(A.m) == &B), false ) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } static constexpr bool do_trans = false; static constexpr bool do_times = false; const Col M; }; template struct partial_unwrap_check_htrans_default { typedef typename T1::elem_type eT; typedef Mat stored_type; inline partial_unwrap_check_htrans_default(const Op& A, const Mat&) : M(A.m) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } static constexpr bool do_trans = true; static constexpr bool do_times = false; const Mat M; }; template struct partial_unwrap_check_htrans_fixed { typedef typename T1::elem_type eT; typedef T1 stored_type; inline explicit partial_unwrap_check_htrans_fixed(const Op& A, const Mat& B) : M_local( (&(A.m) == &B) ? new T1(A.m) : nullptr ) , M ( (&(A.m) == &B) ? (*M_local) : A.m ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check_htrans_fixed() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } constexpr eT get_val() const { return eT(1); } static constexpr bool do_trans = true; static constexpr bool do_times = false; const T1* M_local; const T1& M; }; template struct partial_unwrap_check_htrans_redirect {}; template struct partial_unwrap_check_htrans_redirect { typedef partial_unwrap_check_htrans_default result; }; template struct partial_unwrap_check_htrans_redirect { typedef partial_unwrap_check_htrans_fixed result; }; template struct partial_unwrap_check< Op > : public partial_unwrap_check_htrans_redirect::value>::result { typedef typename T1::elem_type eT; inline partial_unwrap_check(const Op& A, const Mat& B) : partial_unwrap_check_htrans_redirect::value>::result(A, B) { } }; template struct partial_unwrap_check< Op< Mat, op_htrans> > { typedef Mat stored_type; inline partial_unwrap_check(const Op< Mat, op_htrans>& A, const Mat& B) : M_local ( (&A.m == &B) ? new Mat(A.m) : nullptr ) , M ( (&A.m == &B) ? (*M_local) : A.m ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } constexpr eT get_val() const { return eT(1); } static constexpr bool do_trans = true; static constexpr bool do_times = false; // the order below is important const Mat* M_local; const Mat& M; }; template struct partial_unwrap_check< Op< Row, op_htrans> > { typedef Row stored_type; inline partial_unwrap_check(const Op< Row, op_htrans>& A, const Mat& B) : M_local ( (&A.m == &B) ? new Row(A.m) : nullptr ) , M ( (&A.m == &B) ? (*M_local) : A.m ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } constexpr eT get_val() const { return eT(1); } static constexpr bool do_trans = true; static constexpr bool do_times = false; // the order below is important const Row* M_local; const Row& M; }; template struct partial_unwrap_check< Op< Col, op_htrans> > { typedef Col stored_type; inline partial_unwrap_check(const Op< Col, op_htrans>& A, const Mat& B) : M_local ( (&A.m == &B) ? new Col(A.m) : nullptr ) , M ( (&A.m == &B) ? (*M_local) : A.m ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } constexpr eT get_val() const { return eT(1); } static constexpr bool do_trans = true; static constexpr bool do_times = false; // the order below is important const Col* M_local; const Col& M; }; // NOTE: we can get away with this shortcut as the partial_unwrap_check class is only used by the glue_times class, // NOTE: which relies on partial_unwrap_check to check for aliasing template struct partial_unwrap_check< Op< subview_col, op_htrans> > { typedef Col stored_type; inline partial_unwrap_check(const Op< subview_col, op_htrans>& A, const Mat& B) : M ( const_cast( A.m.colmem ), A.m.n_rows, (&(A.m.m) == &B), false ) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(1); } static constexpr bool do_trans = true; static constexpr bool do_times = false; const Col M; }; template struct partial_unwrap_check_htrans2_default { typedef typename T1::elem_type eT; typedef Mat stored_type; inline partial_unwrap_check_htrans2_default(const Op& A, const Mat&) : val(A.aux) , M (A.m) { arma_extra_debug_sigprint(); } arma_inline eT get_val() const { return val; } static constexpr bool do_trans = true; static constexpr bool do_times = true; const eT val; const Mat M; }; template struct partial_unwrap_check_htrans2_fixed { typedef typename T1::elem_type eT; typedef T1 stored_type; inline explicit partial_unwrap_check_htrans2_fixed(const Op& A, const Mat& B) : val (A.aux) , M_local( (&(A.m) == &B) ? new T1(A.m) : nullptr ) , M ( (&(A.m) == &B) ? (*M_local) : A.m ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check_htrans2_fixed() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } arma_inline eT get_val() const { return val; } static constexpr bool do_trans = true; static constexpr bool do_times = true; const eT val; const T1* M_local; const T1& M; }; template struct partial_unwrap_check_htrans2_redirect {}; template struct partial_unwrap_check_htrans2_redirect { typedef partial_unwrap_check_htrans2_default result; }; template struct partial_unwrap_check_htrans2_redirect { typedef partial_unwrap_check_htrans2_fixed result; }; template struct partial_unwrap_check< Op > : public partial_unwrap_check_htrans2_redirect::value>::result { typedef typename T1::elem_type eT; inline partial_unwrap_check(const Op& A, const Mat& B) : partial_unwrap_check_htrans2_redirect::value>::result(A, B) { } }; template struct partial_unwrap_check< Op< Mat, op_htrans2> > { typedef Mat stored_type; inline partial_unwrap_check(const Op< Mat, op_htrans2>& A, const Mat& B) : val (A.aux) , M_local ( (&A.m == &B) ? new Mat(A.m) : nullptr ) , M ( (&A.m == &B) ? (*M_local) : A.m ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } arma_inline eT get_val() const { return val; } static constexpr bool do_trans = true; static constexpr bool do_times = true; // the order below is important const eT val; const Mat* M_local; const Mat& M; }; template struct partial_unwrap_check< Op< Row, op_htrans2> > { typedef Row stored_type; inline partial_unwrap_check(const Op< Row, op_htrans2>& A, const Mat& B) : val (A.aux) , M_local ( (&A.m == &B) ? new Row(A.m) : nullptr ) , M ( (&A.m == &B) ? (*M_local) : A.m ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } arma_inline eT get_val() const { return val; } static constexpr bool do_trans = true; static constexpr bool do_times = true; // the order below is important const eT val; const Row* M_local; const Row& M; }; template struct partial_unwrap_check< Op< Col, op_htrans2> > { typedef Col stored_type; inline partial_unwrap_check(const Op< Col, op_htrans2>& A, const Mat& B) : val (A.aux) , M_local ( (&A.m == &B) ? new Col(A.m) : nullptr ) , M ( (&A.m == &B) ? (*M_local) : A.m ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } arma_inline eT get_val() const { return val; } static constexpr bool do_trans = true; static constexpr bool do_times = true; // the order below is important const eT val; const Col* M_local; const Col& M; }; // NOTE: we can get away with this shortcut as the partial_unwrap_check class is only used by the glue_times class, // NOTE: which relies on partial_unwrap_check to check for aliasing template struct partial_unwrap_check< Op< subview_col, op_htrans2> > { typedef Col stored_type; inline partial_unwrap_check(const Op< subview_col, op_htrans2>& A, const Mat& B) : val( A.aux ) , M ( const_cast( A.m.colmem ), A.m.n_rows, (&(A.m.m) == &B), false ) { arma_extra_debug_sigprint(); } arma_inline eT get_val() const { return val; } static constexpr bool do_trans = true; static constexpr bool do_times = true; const eT val; const Col M; }; template struct partial_unwrap_check_scalar_times_default { typedef typename T1::elem_type eT; typedef Mat stored_type; inline partial_unwrap_check_scalar_times_default(const eOp& A, const Mat&) : val(A.aux) , M (A.P.Q) { arma_extra_debug_sigprint(); } arma_inline eT get_val() const { return val; } static constexpr bool do_trans = false; static constexpr bool do_times = true; const eT val; const Mat M; }; template struct partial_unwrap_check_scalar_times_fixed { typedef typename T1::elem_type eT; typedef T1 stored_type; inline explicit partial_unwrap_check_scalar_times_fixed(const eOp& A, const Mat& B) : val ( A.aux ) , M_local( (&(A.P.Q) == &B) ? new T1(A.P.Q) : nullptr ) , M ( (&(A.P.Q) == &B) ? (*M_local) : A.P.Q ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check_scalar_times_fixed() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } arma_inline eT get_val() const { return val; } static constexpr bool do_trans = false; static constexpr bool do_times = true; const eT val; const T1* M_local; const T1& M; }; template struct partial_unwrap_check_scalar_times_redirect {}; template struct partial_unwrap_check_scalar_times_redirect { typedef partial_unwrap_check_scalar_times_default result; }; template struct partial_unwrap_check_scalar_times_redirect { typedef partial_unwrap_check_scalar_times_fixed result; }; template struct partial_unwrap_check< eOp > : public partial_unwrap_check_scalar_times_redirect::value>::result { typedef typename T1::elem_type eT; inline partial_unwrap_check(const eOp& A, const Mat& B) : partial_unwrap_check_scalar_times_redirect::value>::result(A, B) { } }; template struct partial_unwrap_check< eOp, eop_scalar_times> > { typedef Mat stored_type; inline partial_unwrap_check(const eOp,eop_scalar_times>& A, const Mat& B) : val (A.aux) , M_local( (&(A.P.Q) == &B) ? new Mat(A.P.Q) : nullptr ) , M ( (&(A.P.Q) == &B) ? *M_local : A.P.Q ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } arma_inline eT get_val() const { return val; } static constexpr bool do_trans = false; static constexpr bool do_times = true; const eT val; const Mat* M_local; const Mat& M; }; template struct partial_unwrap_check< eOp, eop_scalar_times> > { typedef Row stored_type; inline partial_unwrap_check(const eOp,eop_scalar_times>& A, const Mat& B) : val(A.aux) , M_local( (&(A.P.Q) == &B) ? new Row(A.P.Q) : nullptr ) , M ( (&(A.P.Q) == &B) ? *M_local : A.P.Q ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } arma_inline eT get_val() const { return val; } static constexpr bool do_trans = false; static constexpr bool do_times = true; const eT val; const Row* M_local; const Row& M; }; template struct partial_unwrap_check< eOp, eop_scalar_times> > { typedef Col stored_type; inline partial_unwrap_check(const eOp,eop_scalar_times>& A, const Mat& B) : val ( A.aux ) , M_local( (&(A.P.Q) == &B) ? new Col(A.P.Q) : nullptr ) , M ( (&(A.P.Q) == &B) ? *M_local : A.P.Q ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } arma_inline eT get_val() const { return val; } static constexpr bool do_trans = false; static constexpr bool do_times = true; const eT val; const Col* M_local; const Col& M; }; // NOTE: we can get away with this shortcut as the partial_unwrap_check class is only used by the glue_times class, // NOTE: which relies on partial_unwrap_check to check for aliasing template struct partial_unwrap_check< eOp, eop_scalar_times> > { typedef Col stored_type; inline partial_unwrap_check(const eOp,eop_scalar_times>& A, const Mat& B) : val( A.aux ) , M ( const_cast( A.P.Q.colmem ), A.P.Q.n_rows, (&(A.P.Q.m) == &B), false ) { arma_extra_debug_sigprint(); } arma_inline eT get_val() const { return val; } static constexpr bool do_trans = false; static constexpr bool do_times = true; const eT val; const Col M; }; template struct partial_unwrap_check_neg_default { typedef typename T1::elem_type eT; typedef Mat stored_type; inline partial_unwrap_check_neg_default(const eOp& A, const Mat&) : M(A.P.Q) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(-1); } static constexpr bool do_trans = false; static constexpr bool do_times = true; const Mat M; }; template struct partial_unwrap_check_neg_fixed { typedef typename T1::elem_type eT; typedef T1 stored_type; inline explicit partial_unwrap_check_neg_fixed(const eOp& A, const Mat& B) : M_local( (&(A.P.Q) == &B) ? new T1(A.P.Q) : nullptr ) , M ( (&(A.P.Q) == &B) ? (*M_local) : A.P.Q ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check_neg_fixed() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } constexpr eT get_val() const { return eT(-1); } static constexpr bool do_trans = false; static constexpr bool do_times = true; const T1* M_local; const T1& M; }; template struct partial_unwrap_check_neg_redirect {}; template struct partial_unwrap_check_neg_redirect { typedef partial_unwrap_check_neg_default result; }; template struct partial_unwrap_check_neg_redirect { typedef partial_unwrap_check_neg_fixed result; }; template struct partial_unwrap_check< eOp > : public partial_unwrap_check_neg_redirect::value>::result { typedef typename T1::elem_type eT; inline partial_unwrap_check(const eOp& A, const Mat& B) : partial_unwrap_check_neg_redirect::value>::result(A, B) { } }; template struct partial_unwrap_check< eOp, eop_neg> > { typedef Mat stored_type; inline partial_unwrap_check(const eOp,eop_neg>& A, const Mat& B) : M_local( (&(A.P.Q) == &B) ? new Mat(A.P.Q) : nullptr ) , M ( (&(A.P.Q) == &B) ? *M_local : A.P.Q ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } constexpr eT get_val() const { return eT(-1); } static constexpr bool do_trans = false; static constexpr bool do_times = true; const Mat* M_local; const Mat& M; }; template struct partial_unwrap_check< eOp, eop_neg> > { typedef Row stored_type; inline partial_unwrap_check(const eOp,eop_neg>& A, const Mat& B) : M_local( (&(A.P.Q) == &B) ? new Row(A.P.Q) : nullptr ) , M ( (&(A.P.Q) == &B) ? *M_local : A.P.Q ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } constexpr eT get_val() const { return eT(-1); } static constexpr bool do_trans = false; static constexpr bool do_times = true; const Row* M_local; const Row& M; }; template struct partial_unwrap_check< eOp, eop_neg> > { typedef Col stored_type; inline partial_unwrap_check(const eOp,eop_neg>& A, const Mat& B) : M_local( (&(A.P.Q) == &B) ? new Col(A.P.Q) : nullptr ) , M ( (&(A.P.Q) == &B) ? *M_local : A.P.Q ) { arma_extra_debug_sigprint(); } inline ~partial_unwrap_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } constexpr eT get_val() const { return eT(-1); } static constexpr bool do_trans = false; static constexpr bool do_times = true; const Col* M_local; const Col& M; }; // NOTE: we can get away with this shortcut as the partial_unwrap_check class is only used by the glue_times class, // NOTE: which relies on partial_unwrap_check to check for aliasing template struct partial_unwrap_check< eOp, eop_neg> > { typedef Col stored_type; inline partial_unwrap_check(const eOp,eop_neg>& A, const Mat& B) : M ( const_cast( A.P.Q.colmem ), A.P.Q.n_rows, (&(A.P.Q.m) == &B), false ) { arma_extra_debug_sigprint(); } constexpr eT get_val() const { return eT(-1); } static constexpr bool do_trans = false; static constexpr bool do_times = true; const Col M; }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_cond.hpp0000644000176200001440000000327414124060717022517 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_cond //! @{ template arma_warn_unused inline typename enable_if2::value, typename T1::pod_type>::result cond(const Base& X) { arma_extra_debug_sigprint(); return op_cond::cond(X.get_ref()); } template arma_warn_unused inline typename enable_if2::value, typename T1::pod_type>::result rcond(const Base& X) { arma_extra_debug_sigprint(); return op_cond::rcond(X.get_ref()); } // template // arma_warn_unused // inline // typename enable_if2::value, typename T1::pod_type>::result // rcond(const SpBase& X) // { // arma_extra_debug_sigprint(); // // return sp_auxlib::rcond(X.get_ref()); // } //! @} RcppArmadillo/inst/include/armadillo_bits/op_find_bones.hpp0000644000176200001440000000610214124060717023706 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_find //! @{ class op_find : public traits_op_col { public: template inline static uword helper ( Mat& indices, const Base& X ); template inline static uword helper ( Mat& indices, const mtOp& X, const typename arma_op_rel_only::result* junk1 = nullptr, const typename arma_not_cx::result* junk2 = nullptr ); template inline static uword helper ( Mat& indices, const mtOp& X, const typename arma_op_rel_only::result* junk1 = nullptr, const typename arma_cx_only::result* junk2 = nullptr ); template inline static uword helper ( Mat& indices, const mtGlue& X, const typename arma_glue_rel_only::result* junk1 = nullptr, const typename arma_not_cx::result* junk2 = nullptr, const typename arma_not_cx::result* junk3 = nullptr ); template inline static uword helper ( Mat& indices, const mtGlue& X, const typename arma_glue_rel_only::result* junk1 = nullptr, const typename arma_cx_only::result* junk2 = nullptr, const typename arma_cx_only::result* junk3 = nullptr ); template inline static void apply(Mat& out, const mtOp& X); }; class op_find_simple : public traits_op_col { public: template inline static void apply(Mat& out, const mtOp& X); }; class op_find_finite : public traits_op_col { public: template inline static void apply(Mat& out, const mtOp& X); }; class op_find_nonfinite : public traits_op_col { public: template inline static void apply(Mat& out, const mtOp& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_symmat_meat.hpp0000644000176200001440000001445314124060717024130 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_symmat //! @{ template inline void op_symmatu::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap tmp(in.m); const Mat& A = tmp.M; arma_debug_check( (A.is_square() == false), "symmatu(): given matrix must be square sized" ); const uword N = A.n_rows; if(&out != &A) { out.copy_size(A); // upper triangular: copy the diagonal and the elements above the diagonal for(uword i=0; i inline void op_symmatl::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap tmp(in.m); const Mat& A = tmp.M; arma_debug_check( (A.is_square() == false), "symmatl(): given matrix must be square sized" ); const uword N = A.n_rows; if(&out != &A) { out.copy_size(A); // lower triangular: copy the diagonal and the elements below the diagonal for(uword i=0; i inline void op_symmatu_cx::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap tmp(in.m); const Mat& A = tmp.M; arma_debug_check( (A.is_square() == false), "symmatu(): given matrix must be square sized" ); const uword N = A.n_rows; const bool do_conj = (in.aux_uword_b == 1); if(&out != &A) { out.copy_size(A); // upper triangular: copy the diagonal and the elements above the diagonal for(uword i=0; i inline void op_symmatl_cx::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap tmp(in.m); const Mat& A = tmp.M; arma_debug_check( (A.is_square() == false), "symmatl(): given matrix must be square sized" ); const uword N = A.n_rows; const bool do_conj = (in.aux_uword_b == 1); if(&out != &A) { out.copy_size(A); // lower triangular: copy the diagonal and the elements below the diagonal for(uword i=0; i inline void glue_quantile::worker(eTb* out_mem, Col& Y, const Mat& P) { arma_extra_debug_sigprint(); // NOTE: assuming out_mem is an array with P.n_elem elements // TODO: ignore non-finite values ? // algorithm based on "Definition 5" in: // Rob J. Hyndman and Yanan Fan. // Sample Quantiles in Statistical Packages. // The American Statistician, Vol. 50, No. 4, pp. 361-365, 1996. // http://doi.org/10.2307/2684934 const eTb* P_mem = P.memptr(); const uword P_n_elem = P.n_elem; const eTb alpha = 0.5; const eTb N = eTb(Y.n_elem); const eTb P_min = (eTb(1) - alpha) / N; const eTb P_max = (N - alpha) / N; for(uword i=0; i < P_n_elem; ++i) { const eTb P_i = P_mem[i]; eTb out_val = eTb(0); if(P_i < P_min) { out_val = (P_i < eTb(0)) ? eTb(-std::numeric_limits::infinity()) : eTb(Y.min()); } else if(P_i > P_max) { out_val = (P_i > eTb(1)) ? eTb( std::numeric_limits::infinity()) : eTb(Y.max()); } else { const uword k = uword(std::floor(N * P_i + alpha)); const eTb P_k = (eTb(k) - alpha) / N; const eTb w = (P_i - P_k) * N; eTa* Y_k_ptr = Y.begin() + uword(k); std::nth_element( Y.begin(), Y_k_ptr, Y.end() ); const eTa Y_k_val = (*Y_k_ptr); eTa* Y_km1_ptr = Y.begin() + uword(k-1); // std::nth_element( Y.begin(), Y_km1_ptr, Y.end() ); std::nth_element( Y.begin(), Y_km1_ptr, Y_k_ptr ); const eTa Y_km1_val = (*Y_km1_ptr); out_val = ((eTb(1) - w) * Y_km1_val) + (w * Y_k_val); } out_mem[i] = out_val; } } template inline void glue_quantile::apply_noalias(Mat& out, const Mat& X, const Mat& P, const uword dim) { arma_extra_debug_sigprint(); arma_debug_check( ((P.is_vec() == false) && (P.is_empty() == false)), "quantile(): parameter 'P' must be a vector" ); if(X.is_empty()) { out.reset(); return; } const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword P_n_elem = P.n_elem; if(dim == 0) { out.set_size(P_n_elem, X_n_cols); if(out.is_empty()) { return; } Col Y(X_n_rows, arma_nozeros_indicator()); if(X_n_cols == 1) { arrayops::copy(Y.memptr(), X.memptr(), X_n_rows); glue_quantile::worker(out.memptr(), Y, P); } else { for(uword col=0; col < X_n_cols; ++col) { arrayops::copy(Y.memptr(), X.colptr(col), X_n_rows); glue_quantile::worker(out.colptr(col), Y, P); } } } else if(dim == 1) { out.set_size(X_n_rows, P_n_elem); if(out.is_empty()) { return; } Col Y(X_n_cols, arma_nozeros_indicator()); if(X_n_rows == 1) { arrayops::copy(Y.memptr(), X.memptr(), X_n_cols); glue_quantile::worker(out.memptr(), Y, P); } else { Col tmp(P_n_elem, arma_nozeros_indicator()); eTb* tmp_mem = tmp.memptr(); for(uword row=0; row < X_n_rows; ++row) { eTa* Y_mem = Y.memptr(); for(uword col=0; col < X_n_cols; ++col) { Y_mem[col] = X.at(row,col); } glue_quantile::worker(tmp_mem, Y, P); for(uword i=0; i < P_n_elem; ++i) { out.at(row,i) = tmp_mem[i]; } } } } } template inline void glue_quantile::apply(Mat& out, const mtGlue& expr) { arma_extra_debug_sigprint(); typedef typename T2::elem_type eTb; const uword dim = expr.aux_uword; arma_debug_check( (dim > 1), "quantile(): parameter 'dim' must be 0 or 1" ); const quasi_unwrap UA(expr.A); const quasi_unwrap UB(expr.B); if(UA.is_alias(out) || UB.is_alias(out)) { Mat tmp; glue_quantile::apply_noalias(tmp, UA.M, UB.M, dim); out.steal_mem(tmp); } else { glue_quantile::apply_noalias(out, UA.M, UB.M, dim); } } template inline void glue_quantile_default::apply(Mat& out, const mtGlue& expr) { arma_extra_debug_sigprint(); typedef typename T2::elem_type eTb; const quasi_unwrap UA(expr.A); const quasi_unwrap UB(expr.B); const uword dim = (T1::is_xvec) ? uword(UA.M.is_rowvec() ? 1 : 0) : uword((T1::is_row) ? 1 : 0); if(UA.is_alias(out) || UB.is_alias(out)) { Mat tmp; glue_quantile::apply_noalias(tmp, UA.M, UB.M, dim); out.steal_mem(tmp); } else { glue_quantile::apply_noalias(out, UA.M, UB.M, dim); } } //! @} RcppArmadillo/inst/include/armadillo_bits/compiler_setup_post.hpp0000644000176200001440000000153214124060717025203 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #if defined(_MSC_VER) #pragma warning(pop) #endif RcppArmadillo/inst/include/armadillo_bits/op_unique_meat.hpp0000644000176200001440000000711014124060717024114 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_unique //! @{ template inline bool op_unique::apply_helper(Mat& out, const Proxy& P, const bool P_is_row) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_elem = P.get_n_elem(); if(n_elem == 0) { if(P_is_row) { out.set_size(1,0); } else { out.set_size(0,1); } return true; } if(n_elem == 1) { const eT tmp = (Proxy::use_at) ? P.at(0,0) : P[0]; out.set_size(1, 1); out[0] = tmp; return true; } Mat X(n_elem, 1, arma_nozeros_indicator()); eT* X_mem = X.memptr(); if(Proxy::use_at == false) { typename Proxy::ea_type Pea = P.get_ea(); for(uword i=0; i comparator; std::sort( X.begin(), X.end(), comparator ); uword N_unique = 1; for(uword i=1; i < n_elem; ++i) { const eT a = X_mem[i-1]; const eT b = X_mem[i ]; const eT diff = a - b; if(diff != eT(0)) { ++N_unique; } } if(P_is_row) { out.set_size(1, N_unique); } else { out.set_size(N_unique, 1); } eT* out_mem = out.memptr(); if(n_elem > 0) { (*out_mem) = X_mem[0]; out_mem++; } for(uword i=1; i < n_elem; ++i) { const eT a = X_mem[i-1]; const eT b = X_mem[i ]; const eT diff = a - b; if(diff != eT(0)) { (*out_mem) = b; out_mem++; } } return true; } template inline void op_unique::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); const Proxy P(in.m); const bool all_non_nan = op_unique::apply_helper(out, P, false); arma_debug_check( (all_non_nan == false), "unique(): detected NaN" ); } template inline void op_unique_vec::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); const Proxy P(in.m); const bool P_is_row = (T1::is_xvec) ? bool(P.get_n_rows() == 1) : bool(T1::is_row); const bool all_non_nan = op_unique::apply_helper(out, P, P_is_row); arma_debug_check( (all_non_nan == false), "unique(): detected NaN" ); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_cov.hpp0000644000176200001440000000304014124060717022352 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_cov //! @{ template arma_warn_unused inline const Op cov(const Base& X, const uword norm_type = 0) { arma_extra_debug_sigprint(); arma_debug_check( (norm_type > 1), "cov(): parameter 'norm_type' must be 0 or 1" ); return Op(X.get_ref(), norm_type, 0); } template arma_warn_unused inline const Glue cov(const Base& A, const Base& B, const uword norm_type = 0) { arma_extra_debug_sigprint(); arma_debug_check( (norm_type > 1), "cov(): parameter 'norm_type' must be 0 or 1" ); return Glue(A.get_ref(), B.get_ref(), norm_type); } //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_TridiagEigen_meat.hpp0000644000176200001440000000612314124060717026022 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { template inline TridiagEigen::TridiagEigen() : n(0) , computed(false) { arma_extra_debug_sigprint(); } template inline TridiagEigen::TridiagEigen(const Mat& mat_obj) : n(mat_obj.n_rows) , computed(false) { arma_extra_debug_sigprint(); compute(mat_obj); } template inline void TridiagEigen::compute(const Mat& mat_obj) { arma_extra_debug_sigprint(); arma_debug_check( (mat_obj.is_square() == false), "newarp::TridiagEigen::compute(): matrix must be square" ); n = blas_int(mat_obj.n_rows); main_diag = mat_obj.diag(); sub_diag = mat_obj.diag(-1); evecs.set_size(n, n); char compz = 'I'; blas_int lwork = blas_int(-1); eT lwork_opt = eT(0); blas_int liwork = blas_int(-1); blas_int liwork_opt = blas_int(0); blas_int info = blas_int(0); // query for lwork and liwork lapack::stedc(&compz, &n, main_diag.memptr(), sub_diag.memptr(), evecs.memptr(), &n, &lwork_opt, &lwork, &liwork_opt, &liwork, &info); if(info == 0) { lwork = blas_int(lwork_opt); liwork = liwork_opt; } else { lwork = 1 + 4 * n + n * n; liwork = 3 + 5 * n; } info = blas_int(0); podarray work(static_cast(lwork) ); podarray iwork(static_cast(liwork)); lapack::stedc(&compz, &n, main_diag.memptr(), sub_diag.memptr(), evecs.memptr(), &n, work.memptr(), &lwork, iwork.memptr(), &liwork, &info); if(info < 0) { arma_stop_logic_error("lapack::stedc(): illegal value"); return; } if(info > 0) { arma_stop_runtime_error("lapack::stedc(): failed to compute all eigenvalues"); return; } computed = true; } template inline Col TridiagEigen::eigenvalues() { arma_extra_debug_sigprint(); arma_debug_check( (computed == false), "newarp::TridiagEigen::eigenvalues(): need to call compute() first" ); // After calling compute(), main_diag will contain the eigenvalues. return main_diag; } template inline Mat TridiagEigen::eigenvectors() { arma_extra_debug_sigprint(); arma_debug_check( (computed == false), "newarp::TridiagEigen::eigenvectors(): need to call compute() first" ); return evecs; } } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/field_bones.hpp0000644000176200001440000003757314124060717023373 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup field //! @{ struct field_prealloc_n_elem { static constexpr uword val = 16; }; //! A lightweight 1D/2D/3D container for arbitrary objects //! (the objects must have a copy constructor) template class field { public: typedef oT object_type; const uword n_rows; //!< number of rows (read-only) const uword n_cols; //!< number of columns (read-only) const uword n_slices; //!< number of slices (read-only) const uword n_elem; //!< number of elements (read-only) private: arma_aligned oT** mem; //!< pointers to stored objects arma_aligned oT* mem_local[ field_prealloc_n_elem::val ]; //!< local storage, for small fields public: inline ~field(); inline field(); inline field(const field& x); inline field& operator=(const field& x); inline field(const subview_field& x); inline field& operator=(const subview_field& x); inline explicit field(const uword n_elem_in); inline explicit field(const uword n_rows_in, const uword n_cols_in); inline explicit field(const uword n_rows_in, const uword n_cols_in, const uword n_slices_in); inline explicit field(const SizeMat& s); inline explicit field(const SizeCube& s); inline void set_size(const uword n_obj_in); inline void set_size(const uword n_rows_in, const uword n_cols_in); inline void set_size(const uword n_rows_in, const uword n_cols_in, const uword n_slices_in); inline void set_size(const SizeMat& s); inline void set_size(const SizeCube& s); inline field(const std::vector& x); inline field& operator=(const std::vector& x); inline field(const std::initializer_list& list); inline field& operator=(const std::initializer_list& list); inline field(const std::initializer_list< std::initializer_list >& list); inline field& operator=(const std::initializer_list< std::initializer_list >& list); inline field(field&& X); inline field& operator=(field&& X); template inline void copy_size(const field& x); arma_inline arma_warn_unused oT& operator[](const uword i); arma_inline arma_warn_unused const oT& operator[](const uword i) const; arma_inline arma_warn_unused oT& at(const uword i); arma_inline arma_warn_unused const oT& at(const uword i) const; arma_inline arma_warn_unused oT& operator()(const uword i); arma_inline arma_warn_unused const oT& operator()(const uword i) const; arma_inline arma_warn_unused oT& at(const uword row, const uword col); arma_inline arma_warn_unused const oT& at(const uword row, const uword col) const; arma_inline arma_warn_unused oT& at(const uword row, const uword col, const uword slice); arma_inline arma_warn_unused const oT& at(const uword row, const uword col, const uword slice) const; arma_inline arma_warn_unused oT& operator()(const uword row, const uword col); arma_inline arma_warn_unused const oT& operator()(const uword row, const uword col) const; arma_inline arma_warn_unused oT& operator()(const uword row, const uword col, const uword slice); arma_inline arma_warn_unused const oT& operator()(const uword row, const uword col, const uword slice) const; arma_inline arma_warn_unused oT& front(); arma_inline arma_warn_unused const oT& front() const; arma_inline arma_warn_unused oT& back(); arma_inline arma_warn_unused const oT& back() const; arma_cold inline field_injector operator<<(const oT& val); arma_cold inline field_injector operator<<(const injector_end_of_row<>& x); inline subview_field row(const uword row_num); inline const subview_field row(const uword row_num) const; inline subview_field col(const uword col_num); inline const subview_field col(const uword col_num) const; inline subview_field slice(const uword slice_num); inline const subview_field slice(const uword slice_num) const; inline subview_field rows(const uword in_row1, const uword in_row2); inline const subview_field rows(const uword in_row1, const uword in_row2) const; inline subview_field cols(const uword in_col1, const uword in_col2); inline const subview_field cols(const uword in_col1, const uword in_col2) const; inline subview_field slices(const uword in_slice1, const uword in_slice2); inline const subview_field slices(const uword in_slice1, const uword in_slice2) const; inline subview_field subfield(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2); inline const subview_field subfield(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const; inline subview_field subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2); inline const subview_field subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2) const; inline subview_field subfield(const uword in_row1, const uword in_col1, const SizeMat& s); inline const subview_field subfield(const uword in_row1, const uword in_col1, const SizeMat& s) const; inline subview_field subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s); inline const subview_field subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const; inline subview_field subfield(const span& row_span, const span& col_span); inline const subview_field subfield(const span& row_span, const span& col_span) const; inline subview_field subfield(const span& row_span, const span& col_span, const span& slice_span); inline const subview_field subfield(const span& row_span, const span& col_span, const span& slice_span) const; inline subview_field operator()(const span& row_span, const span& col_span); inline const subview_field operator()(const span& row_span, const span& col_span) const; inline subview_field operator()(const span& row_span, const span& col_span, const span& slice_span); inline const subview_field operator()(const span& row_span, const span& col_span, const span& slice_span) const; inline subview_field operator()(const uword in_row1, const uword in_col1, const SizeMat& s); inline const subview_field operator()(const uword in_row1, const uword in_col1, const SizeMat& s) const; inline subview_field operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s); inline const subview_field operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const; arma_cold inline void print( const std::string extra_text = "") const; arma_cold inline void print(std::ostream& user_stream, const std::string extra_text = "") const; inline const field& for_each(const std::function< void( oT&) >& F); inline const field& for_each(const std::function< void(const oT&) >& F) const; inline const field& fill(const oT& x); inline void reset(); inline void reset_objects(); arma_inline bool is_empty() const; arma_inline arma_warn_unused bool in_range(const uword i) const; arma_inline arma_warn_unused bool in_range(const span& x) const; arma_inline arma_warn_unused bool in_range(const uword in_row, const uword in_col) const; arma_inline arma_warn_unused bool in_range(const span& row_span, const uword in_col) const; arma_inline arma_warn_unused bool in_range(const uword in_row, const span& col_span) const; arma_inline arma_warn_unused bool in_range(const span& row_span, const span& col_span) const; arma_inline arma_warn_unused bool in_range(const uword in_row, const uword in_col, const SizeMat& s) const; arma_inline arma_warn_unused bool in_range(const uword in_row, const uword in_col, const uword in_slice) const; arma_inline arma_warn_unused bool in_range(const span& row_span, const span& col_span, const span& slice_span) const; arma_inline arma_warn_unused bool in_range(const uword in_row, const uword in_col, const uword in_slice, const SizeCube& s) const; inline arma_cold bool save(const std::string name, const file_type type = arma_binary) const; inline arma_cold bool save( std::ostream& os, const file_type type = arma_binary) const; inline arma_cold bool load(const std::string name, const file_type type = auto_detect); inline arma_cold bool load( std::istream& is, const file_type type = auto_detect); inline arma_cold bool quiet_save(const std::string name, const file_type type = arma_binary) const; inline arma_cold bool quiet_save( std::ostream& os, const file_type type = arma_binary) const; inline arma_cold bool quiet_load(const std::string name, const file_type type = auto_detect); inline arma_cold bool quiet_load( std::istream& is, const file_type type = auto_detect); // for container-like functionality typedef oT value_type; typedef uword size_type; class iterator { public: inline iterator(field& in_M, const bool at_end = false); inline oT& operator* (); inline iterator& operator++(); inline void operator++(int); inline iterator& operator--(); inline void operator--(int); inline bool operator!=(const iterator& X) const; inline bool operator==(const iterator& X) const; arma_aligned field& M; arma_aligned uword i; }; class const_iterator { public: const_iterator(const field& in_M, const bool at_end = false); const_iterator(const iterator& X); inline const oT& operator*() const; inline const_iterator& operator++(); inline void operator++(int); inline const_iterator& operator--(); inline void operator--(int); inline bool operator!=(const const_iterator& X) const; inline bool operator==(const const_iterator& X) const; arma_aligned const field& M; arma_aligned uword i; }; inline iterator begin(); inline const_iterator begin() const; inline const_iterator cbegin() const; inline iterator end(); inline const_iterator end() const; inline const_iterator cend() const; inline void clear(); inline bool empty() const; inline uword size() const; private: inline void init(const field& x); inline void init(const uword n_rows_in, const uword n_cols_in); inline void init(const uword n_rows_in, const uword n_cols_in, const uword n_slices_in); inline void delete_objects(); inline void create_objects(); friend class field_aux; friend class subview_field; public: #ifdef ARMA_EXTRA_FIELD_PROTO #include ARMA_INCFILE_WRAP(ARMA_EXTRA_FIELD_PROTO) #endif }; class field_aux { public: template inline static void reset_objects(field< oT >& x); template inline static void reset_objects(field< Mat >& x); template inline static void reset_objects(field< Col >& x); template inline static void reset_objects(field< Row >& x); template inline static void reset_objects(field< Cube >& x); inline static void reset_objects(field< std::string >& x); template inline static bool save(const field< oT >& x, const std::string& name, const file_type type, std::string& err_msg); template inline static bool save(const field< oT >& x, std::ostream& os, const file_type type, std::string& err_msg); template inline static bool load( field< oT >& x, const std::string& name, const file_type type, std::string& err_msg); template inline static bool load( field< oT >& x, std::istream& is, const file_type type, std::string& err_msg); template inline static bool save(const field< Mat >& x, const std::string& name, const file_type type, std::string& err_msg); template inline static bool save(const field< Mat >& x, std::ostream& os, const file_type type, std::string& err_msg); template inline static bool load( field< Mat >& x, const std::string& name, const file_type type, std::string& err_msg); template inline static bool load( field< Mat >& x, std::istream& is, const file_type type, std::string& err_msg); template inline static bool save(const field< Col >& x, const std::string& name, const file_type type, std::string& err_msg); template inline static bool save(const field< Col >& x, std::ostream& os, const file_type type, std::string& err_msg); template inline static bool load( field< Col >& x, const std::string& name, const file_type type, std::string& err_msg); template inline static bool load( field< Col >& x, std::istream& is, const file_type type, std::string& err_msg); template inline static bool save(const field< Row >& x, const std::string& name, const file_type type, std::string& err_msg); template inline static bool save(const field< Row >& x, std::ostream& os, const file_type type, std::string& err_msg); template inline static bool load( field< Row >& x, const std::string& name, const file_type type, std::string& err_msg); template inline static bool load( field< Row >& x, std::istream& is, const file_type type, std::string& err_msg); template inline static bool save(const field< Cube >& x, const std::string& name, const file_type type, std::string& err_msg); template inline static bool save(const field< Cube >& x, std::ostream& os, const file_type type, std::string& err_msg); template inline static bool load( field< Cube >& x, const std::string& name, const file_type type, std::string& err_msg); template inline static bool load( field< Cube >& x, std::istream& is, const file_type type, std::string& err_msg); inline static bool save(const field< std::string >& x, const std::string& name, const file_type type, std::string& err_msg); inline static bool save(const field< std::string >& x, std::ostream& os, const file_type type, std::string& err_msg); inline static bool load( field< std::string >& x, const std::string& name, const file_type type, std::string& err_msg); inline static bool load( field< std::string >& x, std::istream& is, const file_type type, std::string& err_msg); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_dotext_bones.hpp0000644000176200001440000000304314124060717024276 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_dotext //! @{ class op_dotext : public traits_op_default { public: template inline static eT direct_rowvec_mat_colvec (const eT* A_mem, const Mat& B, const eT* C_mem); template inline static eT direct_rowvec_transmat_colvec (const eT* A_mem, const Mat& B, const eT* C_mem); template inline static eT direct_rowvec_diagmat_colvec (const eT* A_mem, const Mat& B, const eT* C_mem); template inline static eT direct_rowvec_invdiagmat_colvec(const eT* A_mem, const Mat& B, const eT* C_mem); template inline static eT direct_rowvec_invdiagvec_colvec(const eT* A_mem, const Mat& B, const eT* C_mem); }; //! @} RcppArmadillo/inst/include/armadillo_bits/band_helper.hpp0000644000176200001440000002261614124060717023355 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup band_helper //! @{ namespace band_helper { template inline bool is_band(uword& out_KL, uword& out_KU, const Mat& A, const uword N_min) { arma_extra_debug_sigprint(); // NOTE: assuming that A has a square size // NOTE: assuming that N_min is >= 4 const uword N = A.n_rows; if(N < N_min) { return false; } // first, quickly check bottom-left and top-right corners const eT eT_zero = eT(0); const eT* A_col0 = A.memptr(); const eT* A_col1 = A_col0 + N; if( (A_col0[N-2] != eT_zero) || (A_col0[N-1] != eT_zero) || (A_col1[N-2] != eT_zero) || (A_col1[N-1] != eT_zero) ) { return false; } const eT* A_colNm2 = A.colptr(N-2); const eT* A_colNm1 = A_colNm2 + N; if( (A_colNm2[0] != eT_zero) || (A_colNm2[1] != eT_zero) || (A_colNm1[0] != eT_zero) || (A_colNm1[1] != eT_zero) ) { return false; } // if we reached this point, go through the entire matrix to work out number of subdiagonals and superdiagonals const uword n_nonzero_threshold = (N*N)/4; // empirically determined uword KL = 0; // number of subdiagonals uword KU = 0; // number of superdiagonals const eT* A_colptr = A.memptr(); for(uword col=0; col < N; ++col) { uword first_nonzero_row = col; uword last_nonzero_row = col; for(uword row=0; row < col; ++row) { if( A_colptr[row] != eT_zero ) { first_nonzero_row = row; break; } } for(uword row=(col+1); row < N; ++row) { last_nonzero_row = (A_colptr[row] != eT_zero) ? row : last_nonzero_row; } const uword L_count = last_nonzero_row - col; const uword U_count = col - first_nonzero_row; if( (L_count > KL) || (U_count > KU) ) { KL = (std::max)(KL, L_count); KU = (std::max)(KU, U_count); const uword n_nonzero = N*(KL+KU+1) - (KL*(KL+1) + KU*(KU+1))/2; // return as soon as we know that it's not worth analysing the matrix any further if(n_nonzero > n_nonzero_threshold) { return false; } } A_colptr += N; } out_KL = KL; out_KU = KU; return true; } template inline bool is_band_lower(uword& out_KD, const Mat& A, const uword N_min) { arma_extra_debug_sigprint(); // NOTE: assuming that A has a square size // NOTE: assuming that N_min is >= 4 const uword N = A.n_rows; if(N < N_min) { return false; } // first, quickly check bottom-left corner const eT eT_zero = eT(0); const eT* A_col0 = A.memptr(); const eT* A_col1 = A_col0 + N; if( (A_col0[N-2] != eT_zero) || (A_col0[N-1] != eT_zero) || (A_col1[N-2] != eT_zero) || (A_col1[N-1] != eT_zero) ) { return false; } // if we reached this point, go through the bottom triangle to work out number of subdiagonals const uword n_nonzero_threshold = ( N*N - (N*(N-1))/2 ) / 4; // empirically determined uword KL = 0; // number of subdiagonals const eT* A_colptr = A.memptr(); for(uword col=0; col < N; ++col) { uword last_nonzero_row = col; for(uword row=(col+1); row < N; ++row) { last_nonzero_row = (A_colptr[row] != eT_zero) ? row : last_nonzero_row; } const uword L_count = last_nonzero_row - col; if(L_count > KL) { KL = L_count; const uword n_nonzero = N*(KL+1) - (KL*(KL+1))/2; // return as soon as we know that it's not worth analysing the matrix any further if(n_nonzero > n_nonzero_threshold) { return false; } } A_colptr += N; } out_KD = KL; return true; } template inline bool is_band_upper(uword& out_KD, const Mat& A, const uword N_min) { arma_extra_debug_sigprint(); // NOTE: assuming that A has a square size // NOTE: assuming that N_min is >= 4 const uword N = A.n_rows; if(N < N_min) { return false; } // first, quickly check top-right corner const eT eT_zero = eT(0); const eT* A_colNm2 = A.colptr(N-2); const eT* A_colNm1 = A_colNm2 + N; if( (A_colNm2[0] != eT_zero) || (A_colNm2[1] != eT_zero) || (A_colNm1[0] != eT_zero) || (A_colNm1[1] != eT_zero) ) { return false; } // if we reached this point, go through the entire matrix to work out number of superdiagonals const uword n_nonzero_threshold = ( N*N - (N*(N-1))/2 ) / 4; // empirically determined uword KU = 0; // number of superdiagonals const eT* A_colptr = A.memptr(); for(uword col=0; col < N; ++col) { uword first_nonzero_row = col; for(uword row=0; row < col; ++row) { if( A_colptr[row] != eT_zero ) { first_nonzero_row = row; break; } } const uword U_count = col - first_nonzero_row; if(U_count > KU) { KU = U_count; const uword n_nonzero = N*(KU+1) - (KU*(KU+1))/2; // return as soon as we know that it's not worth analysing the matrix any further if(n_nonzero > n_nonzero_threshold) { return false; } } A_colptr += N; } out_KD = KU; return true; } template inline void compress(Mat& AB, const Mat& A, const uword KL, const uword KU, const bool use_offset) { arma_extra_debug_sigprint(); // NOTE: assuming that A has a square size // band matrix storage format // http://www.netlib.org/lapack/lug/node124.html // for ?gbsv, matrix AB size: 2*KL+KU+1 x N; band representation of A stored in rows KL+1 to 2*KL+KU+1 (note: fortran counts from 1) // for ?gbsvx, matrix AB size: KL+KU+1 x N; band representaiton of A stored in rows 1 to KL+KU+1 (note: fortran counts from 1) // // the +1 in the above formulas is to take into account the main diagonal const uword AB_n_rows = (use_offset) ? uword(2*KL + KU + 1) : uword(KL + KU + 1); const uword N = A.n_rows; AB.set_size(AB_n_rows, N); if(A.is_empty()) { AB.zeros(); return; } if(AB_n_rows == uword(1)) { eT* AB_mem = AB.memptr(); for(uword i=0; i KU) ? uword(j - KU) : uword(0); const uword A_row_endp1 = (std::min)(N, j+KL+1); const uword length = A_row_endp1 - A_row_start; const uword AB_row_start = (KU > j) ? (KU - j) : uword(0); const eT* A_colptr = A.colptr(j) + A_row_start; eT* AB_colptr = AB.colptr(j) + AB_row_start + ( (use_offset) ? KL : uword(0) ); arrayops::copy( AB_colptr, A_colptr, length ); } } } template inline void uncompress(Mat& A, const Mat& AB, const uword KL, const uword KU, const bool use_offset) { arma_extra_debug_sigprint(); const uword AB_n_rows = AB.n_rows; const uword N = AB.n_cols; arma_debug_check( (AB_n_rows != ((use_offset) ? uword(2*KL + KU + 1) : uword(KL + KU + 1))), "band_helper::uncompress(): detected inconsistency" ); A.zeros(N,N); // assuming there is no aliasing between A and AB if(AB_n_rows == uword(1)) { const eT* AB_mem = AB.memptr(); for(uword i=0; i KU) ? uword(j - KU) : uword(0); const uword A_row_endp1 = (std::min)(N, j+KL+1); const uword length = A_row_endp1 - A_row_start; const uword AB_row_start = (KU > j) ? (KU - j) : uword(0); const eT* AB_colptr = AB.colptr(j) + AB_row_start + ( (use_offset) ? KL : uword(0) ); eT* A_colptr = A.colptr(j) + A_row_start; arrayops::copy( A_colptr, AB_colptr, length ); } } } template inline void extract_tridiag(Mat& out, const Mat& A) { arma_extra_debug_sigprint(); // NOTE: assuming that A has a square size and is at least 2x2 const uword N = A.n_rows; out.set_size(N, 3); // assuming there is no aliasing between 'out' and 'A' if(N < 2) { return; } eT* DL = out.colptr(0); eT* DD = out.colptr(1); eT* DU = out.colptr(2); DD[0] = A[0]; DL[0] = A[1]; const uword Nm1 = N-1; const uword Nm2 = N-2; for(uword i=0; i < Nm2; ++i) { const uword ip1 = i+1; const eT* data = &(A.at(i, ip1)); const eT tmp0 = data[0]; const eT tmp1 = data[1]; const eT tmp2 = data[2]; DL[ip1] = tmp2; DD[ip1] = tmp1; DU[i ] = tmp0; } const eT* data = &(A.at(Nm2, Nm1)); DL[Nm1] = 0; DU[Nm2] = data[0]; DU[Nm1] = 0; DD[Nm1] = data[1]; } } // end of namespace band_helper //! @} RcppArmadillo/inst/include/armadillo_bits/eOp_meat.hpp0000644000176200001440000000600514124060717022635 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup eOp //! @{ template inline eOp::eOp(const T1& in_m) : P(in_m) { arma_extra_debug_sigprint(); } template inline eOp::eOp(const T1& in_m, const typename T1::elem_type in_aux) : P(in_m) , aux(in_aux) { arma_extra_debug_sigprint(); } template inline eOp::eOp(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b) : P(in_m) , aux_uword_a(in_aux_uword_a) , aux_uword_b(in_aux_uword_b) { arma_extra_debug_sigprint(); } template inline eOp::eOp(const T1& in_m, const typename T1::elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b) : P(in_m) , aux(in_aux) , aux_uword_a(in_aux_uword_a) , aux_uword_b(in_aux_uword_b) { arma_extra_debug_sigprint(); } template inline eOp::~eOp() { arma_extra_debug_sigprint(); } template arma_inline uword eOp::get_n_rows() const { return is_row ? 1 : P.get_n_rows(); } template arma_inline uword eOp::get_n_cols() const { return is_col ? 1 : P.get_n_cols(); } template arma_inline uword eOp::get_n_elem() const { return P.get_n_elem(); } template arma_inline typename T1::elem_type eOp::operator[] (const uword ii) const { return eop_core::process(P[ii], aux); } template arma_inline typename T1::elem_type eOp::at(const uword row, const uword col) const { if(is_row) { return eop_core::process(P.at(0, col), aux); } else if(is_col) { return eop_core::process(P.at(row, 0), aux); } else { return eop_core::process(P.at(row, col), aux); } } template arma_inline typename T1::elem_type eOp::at_alt(const uword ii) const { return eop_core::process(P.at_alt(ii), aux); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_var_meat.hpp0000644000176200001440000001610714124060717023404 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_var //! @{ //! \brief //! For each row or for each column, find the variance. //! The result is stored in a dense matrix that has either one column or one row. //! The dimension, for which the variances are found, is set via the var() function. template inline void op_var::apply(Mat& out, const mtOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type in_eT; typedef typename T1::pod_type out_eT; const unwrap_check_mixed tmp(in.m, out); const Mat& X = tmp.M; const uword norm_type = in.aux_uword_a; const uword dim = in.aux_uword_b; arma_debug_check( (norm_type > 1), "var(): parameter 'norm_type' must be 0 or 1" ); arma_debug_check( (dim > 1), "var(): parameter 'dim' must be 0 or 1" ); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(dim == 0) { arma_extra_debug_print("op_var::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols); if(X_n_rows > 0) { out_eT* out_mem = out.memptr(); for(uword col=0; col 0) ? 1 : 0); if(X_n_cols > 0) { podarray dat(X_n_cols); in_eT* dat_mem = dat.memptr(); out_eT* out_mem = out.memptr(); for(uword row=0; row inline typename T1::pod_type op_var::var_vec(const Base& X, const uword norm_type) { arma_extra_debug_sigprint(); arma_debug_check( (norm_type > 1), "var(): parameter 'norm_type' must be 0 or 1" ); const quasi_unwrap U(X.get_ref()); return op_var::direct_var(U.M.memptr(), U.M.n_elem, norm_type); } template inline typename get_pod_type::result op_var::var_vec(const subview_col& X, const uword norm_type) { arma_extra_debug_sigprint(); arma_debug_check( (norm_type > 1), "var(): parameter 'norm_type' must be 0 or 1" ); return op_var::direct_var(X.colptr(0), X.n_rows, norm_type); } template inline typename get_pod_type::result op_var::var_vec(const subview_row& X, const uword norm_type) { arma_extra_debug_sigprint(); arma_debug_check( (norm_type > 1), "var(): parameter 'norm_type' must be 0 or 1" ); const Mat& A = X.m; const uword start_row = X.aux_row1; const uword start_col = X.aux_col1; const uword end_col_p1 = start_col + X.n_cols; podarray tmp(X.n_elem); eT* tmp_mem = tmp.memptr(); for(uword i=0, col=start_col; col < end_col_p1; ++col, ++i) { tmp_mem[i] = A.at(start_row, col); } return op_var::direct_var(tmp.memptr(), tmp.n_elem, norm_type); } //! find the variance of an array template inline eT op_var::direct_var(const eT* const X, const uword n_elem, const uword norm_type) { arma_extra_debug_sigprint(); if(n_elem >= 2) { const eT acc1 = op_mean::direct_mean(X, n_elem); eT acc2 = eT(0); eT acc3 = eT(0); uword i,j; for(i=0, j=1; j inline eT op_var::direct_var_robust(const eT* const X, const uword n_elem, const uword norm_type) { arma_extra_debug_sigprint(); if(n_elem > 1) { eT r_mean = X[0]; eT r_var = eT(0); for(uword i=1; i inline T op_var::direct_var(const std::complex* const X, const uword n_elem, const uword norm_type) { arma_extra_debug_sigprint(); typedef typename std::complex eT; if(n_elem >= 2) { const eT acc1 = op_mean::direct_mean(X, n_elem); T acc2 = T(0); eT acc3 = eT(0); for(uword i=0; i inline T op_var::direct_var_robust(const std::complex* const X, const uword n_elem, const uword norm_type) { arma_extra_debug_sigprint(); typedef typename std::complex eT; if(n_elem > 1) { eT r_mean = X[0]; T r_var = T(0); for(uword i=1; i inline static void apply(Mat< std::complex >& out, const mtOp,T1,op_logmat>& in); template inline static bool apply_direct(Mat< std::complex >& out, const Op& expr, const uword); template inline static bool apply_direct(Mat< std::complex >& out, const Base& expr, const uword n_iters); }; class op_logmat_cx : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); template inline static bool apply_direct(Mat& out, const Op& expr, const uword); template inline static bool apply_direct_noalias(Mat& out, const diagmat_proxy& P); template inline static bool apply_direct(Mat& out, const Base& expr, const uword n_iters); template inline static bool apply_common(Mat< std::complex >& out, Mat< std::complex >& S, const uword n_iters); template inline static bool helper(Mat& S, const uword m); }; class op_logmat_sympd : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); template inline static bool apply_direct(Mat& out, const Base& expr); }; //! @} RcppArmadillo/inst/include/armadillo_bits/glue_polyfit_meat.hpp0000644000176200001440000000656214124060717024624 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_polyfit //! @{ template inline bool glue_polyfit::apply_noalias(Mat& out, const Col& X, const Col& Y, const uword N) { arma_extra_debug_sigprint(); // create Vandermonde matrix Mat V(X.n_elem, N+1, arma_nozeros_indicator()); V.tail_cols(1).ones(); for(uword i=1; i <= N; ++i) { const uword j = N-i; Col V_col_j (V.colptr(j ), V.n_rows, false, false); Col V_col_jp1(V.colptr(j+1), V.n_rows, false, false); V_col_j = V_col_jp1 % X; } Mat Q; Mat R; const bool status1 = auxlib::qr_econ(Q, R, V); if(status1 == false) { return false; } const bool status2 = auxlib::solve_trimat_fast(out, R, (Q.t() * Y), uword(0)); if(status2 == false) { return false; } return true; } template inline bool glue_polyfit::apply_direct(Mat& out, const Base& X_expr, const Base& Y_expr, const uword N) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap UX(X_expr.get_ref()); const quasi_unwrap UY(Y_expr.get_ref()); const Mat& X = UX.M; const Mat& Y = UY.M; arma_debug_check ( ( ((X.is_vec() == false) && (X.is_empty() == false)) || ((Y.is_vec() == false) && (Y.is_empty() == false)) ), "polyfit(): given object must be a vector" ); arma_debug_check( (X.n_elem != Y.n_elem), "polyfit(): given vectors must have the same number of elements" ); if(X.n_elem == 0) { out.reset(); return true; } arma_debug_check( (N >= X.n_elem), "polyfit(): N must be less than the number of elements in X" ); const Col X_as_colvec( const_cast(X.memptr()), X.n_elem, false, false); const Col Y_as_colvec( const_cast(Y.memptr()), Y.n_elem, false, false); bool status = false; if(UX.is_alias(out) || UY.is_alias(out)) { Mat tmp; status = glue_polyfit::apply_noalias(tmp, X_as_colvec, Y_as_colvec, N); out.steal_mem(tmp); } else { status = glue_polyfit::apply_noalias(out, X_as_colvec, Y_as_colvec, N); } return status; } template inline void glue_polyfit::apply(Mat& out, const Glue& expr) { arma_extra_debug_sigprint(); const bool status = glue_polyfit::apply_direct(out, expr.A, expr.B, expr.aux_uword); if(status == false) { out.soft_reset(); arma_stop_runtime_error("polyfit(): failed"); } } //! @} RcppArmadillo/inst/include/armadillo_bits/op_strans_bones.hpp0000644000176200001440000000530114124060717024300 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_strans //! @{ //! 'matrix transpose' operation (simple transpose, ie. without taking the conjugate of the elements) class op_strans { public: template struct traits { static constexpr bool is_row = T1::is_col; // deliberately swapped static constexpr bool is_col = T1::is_row; static constexpr bool is_xvec = T1::is_xvec; }; template struct pos { static constexpr uword n2 = (do_flip == false) ? (row + col*2) : (col + row*2); static constexpr uword n3 = (do_flip == false) ? (row + col*3) : (col + row*3); static constexpr uword n4 = (do_flip == false) ? (row + col*4) : (col + row*4); }; template arma_cold inline static void apply_mat_noalias_tinysq(Mat& out, const TA& A); template arma_hot inline static void block_worker(eT* Y, const eT* X, const uword X_n_rows, const uword Y_n_rows, const uword n_rows, const uword n_cols); template arma_hot inline static void apply_mat_noalias_large(Mat& out, const Mat& A); template arma_hot inline static void apply_mat_noalias(Mat& out, const TA& A); template arma_hot inline static void apply_mat_inplace(Mat& out); template inline static void apply_mat(Mat& out, const TA& A); template inline static void apply_proxy(Mat& out, const Proxy& P); template inline static void apply_direct(Mat& out, const T1& X); template inline static void apply(Mat& out, const Op& in); }; class op_strans_cube { public: template inline static void apply_noalias(Cube& out, const Cube& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/glue_times_meat.hpp0000644000176200001440000010534114160256234024253 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_times //! @{ template template arma_hot inline void glue_times_redirect2_helper::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const partial_unwrap tmp1(X.A); const partial_unwrap tmp2(X.B); const typename partial_unwrap::stored_type& A = tmp1.M; const typename partial_unwrap::stored_type& B = tmp2.M; const bool use_alpha = partial_unwrap::do_times || partial_unwrap::do_times; const eT alpha = use_alpha ? (tmp1.get_val() * tmp2.get_val()) : eT(0); const bool alias = tmp1.is_alias(out) || tmp2.is_alias(out); if(alias == false) { glue_times::apply < eT, partial_unwrap::do_trans, partial_unwrap::do_trans, (partial_unwrap::do_times || partial_unwrap::do_times) > (out, A, B, alpha); } else { Mat tmp; glue_times::apply < eT, partial_unwrap::do_trans, partial_unwrap::do_trans, (partial_unwrap::do_times || partial_unwrap::do_times) > (tmp, A, B, alpha); out.steal_mem(tmp); } } template arma_hot inline void glue_times_redirect2_helper::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(strip_inv::do_inv) { // replace inv(A)*B with solve(A,B) arma_extra_debug_print("glue_times_redirect<2>::apply(): detected inv(A)*B"); const strip_inv A_strip(X.A); Mat A = A_strip.M; arma_debug_check( (A.is_square() == false), "inv(): given matrix must be square sized" ); if(strip_inv::do_inv_sympd) { // if(auxlib::rudimentary_sym_check(A) == false) // { // if(is_cx::no ) { arma_debug_warn_level(1, "inv_sympd(): given matrix is not symmetric"); } // if(is_cx::yes) { arma_debug_warn_level(1, "inv_sympd(): given matrix is not hermitian"); } // // out.soft_reset(); // arma_stop_runtime_error("matrix multiplication: problem with matrix inverse; suggest to use solve() instead"); // // return; // } if( (arma_config::debug) && (auxlib::rudimentary_sym_check(A) == false) ) { if(is_cx::no ) { arma_debug_warn_level(1, "inv_sympd(): given matrix is not symmetric"); } if(is_cx::yes) { arma_debug_warn_level(1, "inv_sympd(): given matrix is not hermitian"); } } } const unwrap_check B_tmp(X.B, out); const Mat& B = B_tmp.M; arma_debug_assert_mul_size(A, B, "matrix multiplication"); // TODO: detect sympd via sympd_helper::guess_sympd(A) ? #if defined(ARMA_OPTIMISE_SYMPD) const bool status = (strip_inv::do_inv_sympd) ? auxlib::solve_sympd_fast(out, A, B) : auxlib::solve_square_fast(out, A, B); #else const bool status = auxlib::solve_square_fast(out, A, B); #endif if(status == false) { out.soft_reset(); arma_stop_runtime_error("matrix multiplication: problem with matrix inverse; suggest to use solve() instead"); } return; } #if defined(ARMA_OPTIMISE_SYMPD) { if(strip_inv::do_inv_sympd) { // replace A*inv_sympd(B) with trans( solve(trans(B),trans(A)) ) // transpose of B is avoided as B is explicitly marked as symmetric arma_extra_debug_print("glue_times_redirect<2>::apply(): detected A*inv_sympd(B)"); const Mat At = trans(X.A); const strip_inv B_strip(X.B); Mat B = B_strip.M; arma_debug_check( (B.is_square() == false), "inv_sympd(): given matrix must be square sized" ); // if(auxlib::rudimentary_sym_check(B) == false) // { // if(is_cx::no ) { arma_debug_warn_level(1, "inv_sympd(): given matrix is not symmetric"); } // if(is_cx::yes) { arma_debug_warn_level(1, "inv_sympd(): given matrix is not hermitian"); } // // out.soft_reset(); // arma_stop_runtime_error("matrix multiplication: problem with matrix inverse; suggest to use solve() instead"); // // return; // } if( (arma_config::debug) && (auxlib::rudimentary_sym_check(B) == false) ) { if(is_cx::no ) { arma_debug_warn_level(1, "inv_sympd(): given matrix is not symmetric"); } if(is_cx::yes) { arma_debug_warn_level(1, "inv_sympd(): given matrix is not hermitian"); } } arma_debug_assert_mul_size(At.n_cols, At.n_rows, B.n_rows, B.n_cols, "matrix multiplication"); const bool status = auxlib::solve_sympd_fast(out, B, At); if(status == false) { out.soft_reset(); arma_stop_runtime_error("matrix multiplication: problem with matrix inverse; suggest to use solve() instead"); } out = trans(out); return; } } #endif glue_times_redirect2_helper::apply(out, X); } template template arma_hot inline void glue_times_redirect3_helper::apply(Mat& out, const Glue< Glue, T3, glue_times>& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // we have exactly 3 objects // hence we can safely expand X as X.A.A, X.A.B and X.B const partial_unwrap tmp1(X.A.A); const partial_unwrap tmp2(X.A.B); const partial_unwrap tmp3(X.B ); const typename partial_unwrap::stored_type& A = tmp1.M; const typename partial_unwrap::stored_type& B = tmp2.M; const typename partial_unwrap::stored_type& C = tmp3.M; const bool use_alpha = partial_unwrap::do_times || partial_unwrap::do_times || partial_unwrap::do_times; const eT alpha = use_alpha ? (tmp1.get_val() * tmp2.get_val() * tmp3.get_val()) : eT(0); const bool alias = tmp1.is_alias(out) || tmp2.is_alias(out) || tmp3.is_alias(out); if(alias == false) { glue_times::apply < eT, partial_unwrap::do_trans, partial_unwrap::do_trans, partial_unwrap::do_trans, (partial_unwrap::do_times || partial_unwrap::do_times || partial_unwrap::do_times) > (out, A, B, C, alpha); } else { Mat tmp; glue_times::apply < eT, partial_unwrap::do_trans, partial_unwrap::do_trans, partial_unwrap::do_trans, (partial_unwrap::do_times || partial_unwrap::do_times || partial_unwrap::do_times) > (tmp, A, B, C, alpha); out.steal_mem(tmp); } } template arma_hot inline void glue_times_redirect3_helper::apply(Mat& out, const Glue< Glue, T3, glue_times>& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(strip_inv::do_inv) { // replace inv(A)*B*C with solve(A,B*C); arma_extra_debug_print("glue_times_redirect<3>::apply(): detected inv(A)*B*C"); const strip_inv A_strip(X.A.A); Mat A = A_strip.M; arma_debug_check( (A.is_square() == false), "inv(): given matrix must be square sized" ); const partial_unwrap tmp2(X.A.B); const partial_unwrap tmp3(X.B ); const typename partial_unwrap::stored_type& B = tmp2.M; const typename partial_unwrap::stored_type& C = tmp3.M; const bool use_alpha = partial_unwrap::do_times || partial_unwrap::do_times; const eT alpha = use_alpha ? (tmp2.get_val() * tmp3.get_val()) : eT(0); Mat BC; glue_times::apply < eT, partial_unwrap::do_trans, partial_unwrap::do_trans, (partial_unwrap::do_times || partial_unwrap::do_times) > (BC, B, C, alpha); arma_debug_assert_mul_size(A, BC, "matrix multiplication"); // TODO: detect sympd via sympd_helper::guess_sympd(A) ? #if defined(ARMA_OPTIMISE_SYMPD) const bool status = (strip_inv::do_inv_sympd) ? auxlib::solve_sympd_fast(out, A, BC) : auxlib::solve_square_fast(out, A, BC); #else const bool status = auxlib::solve_square_fast(out, A, BC); #endif if(status == false) { out.soft_reset(); arma_stop_runtime_error("matrix multiplication: problem with matrix inverse; suggest to use solve() instead"); } return; } if(strip_inv::do_inv) { // replace A*inv(B)*C with A*solve(B,C) arma_extra_debug_print("glue_times_redirect<3>::apply(): detected A*inv(B)*C"); const strip_inv B_strip(X.A.B); Mat B = B_strip.M; arma_debug_check( (B.is_square() == false), "inv(): given matrix must be square sized" ); const unwrap C_tmp(X.B); const Mat& C = C_tmp.M; arma_debug_assert_mul_size(B, C, "matrix multiplication"); Mat solve_result; #if defined(ARMA_OPTIMISE_SYMPD) const bool status = (strip_inv::do_inv_sympd) ? auxlib::solve_sympd_fast(solve_result, B, C) : auxlib::solve_square_fast(solve_result, B, C); #else const bool status = auxlib::solve_square_fast(solve_result, B, C); #endif if(status == false) { out.soft_reset(); arma_stop_runtime_error("matrix multiplication: problem with matrix inverse; suggest to use solve() instead"); return; } const partial_unwrap_check tmp1(X.A.A, out); const typename partial_unwrap_check::stored_type& A = tmp1.M; const bool use_alpha = partial_unwrap_check::do_times; const eT alpha = use_alpha ? tmp1.get_val() : eT(0); glue_times::apply < eT, partial_unwrap_check::do_trans, false, partial_unwrap_check::do_times > (out, A, solve_result, alpha); return; } glue_times_redirect3_helper::apply(out, X); } template template arma_hot inline void glue_times_redirect::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const partial_unwrap tmp1(X.A); const partial_unwrap tmp2(X.B); const typename partial_unwrap::stored_type& A = tmp1.M; const typename partial_unwrap::stored_type& B = tmp2.M; const bool use_alpha = partial_unwrap::do_times || partial_unwrap::do_times; const eT alpha = use_alpha ? (tmp1.get_val() * tmp2.get_val()) : eT(0); const bool alias = tmp1.is_alias(out) || tmp2.is_alias(out); if(alias == false) { glue_times::apply < eT, partial_unwrap::do_trans, partial_unwrap::do_trans, (partial_unwrap::do_times || partial_unwrap::do_times) > (out, A, B, alpha); } else { Mat tmp; glue_times::apply < eT, partial_unwrap::do_trans, partial_unwrap::do_trans, (partial_unwrap::do_times || partial_unwrap::do_times) > (tmp, A, B, alpha); out.steal_mem(tmp); } } template arma_hot inline void glue_times_redirect<2>::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; glue_times_redirect2_helper< is_supported_blas_type::value >::apply(out, X); } template arma_hot inline void glue_times_redirect<3>::apply(Mat& out, const Glue< Glue, T3, glue_times>& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; glue_times_redirect3_helper< is_supported_blas_type::value >::apply(out, X); } template arma_hot inline void glue_times_redirect<4>::apply(Mat& out, const Glue< Glue< Glue, T3, glue_times>, T4, glue_times>& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // there is exactly 4 objects // hence we can safely expand X as X.A.A.A, X.A.A.B, X.A.B and X.B const partial_unwrap tmp1(X.A.A.A); const partial_unwrap tmp2(X.A.A.B); const partial_unwrap tmp3(X.A.B ); const partial_unwrap tmp4(X.B ); const typename partial_unwrap::stored_type& A = tmp1.M; const typename partial_unwrap::stored_type& B = tmp2.M; const typename partial_unwrap::stored_type& C = tmp3.M; const typename partial_unwrap::stored_type& D = tmp4.M; const bool use_alpha = partial_unwrap::do_times || partial_unwrap::do_times || partial_unwrap::do_times || partial_unwrap::do_times; const eT alpha = use_alpha ? (tmp1.get_val() * tmp2.get_val() * tmp3.get_val() * tmp4.get_val()) : eT(0); const bool alias = tmp1.is_alias(out) || tmp2.is_alias(out) || tmp3.is_alias(out) || tmp4.is_alias(out); if(alias == false) { glue_times::apply < eT, partial_unwrap::do_trans, partial_unwrap::do_trans, partial_unwrap::do_trans, partial_unwrap::do_trans, (partial_unwrap::do_times || partial_unwrap::do_times || partial_unwrap::do_times || partial_unwrap::do_times) > (out, A, B, C, D, alpha); } else { Mat tmp; glue_times::apply < eT, partial_unwrap::do_trans, partial_unwrap::do_trans, partial_unwrap::do_trans, partial_unwrap::do_trans, (partial_unwrap::do_times || partial_unwrap::do_times || partial_unwrap::do_times || partial_unwrap::do_times) > (tmp, A, B, C, D, alpha); out.steal_mem(tmp); } } template arma_hot inline void glue_times::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); constexpr uword N_mat = 1 + depth_lhs< glue_times, Glue >::num; arma_extra_debug_print(arma_str::format("N_mat = %u") % N_mat); glue_times_redirect::apply(out, X); } template arma_hot inline void glue_times::apply_inplace(Mat& out, const T1& X) { arma_extra_debug_sigprint(); out = out * X; } template arma_hot inline void glue_times::apply_inplace_plus(Mat& out, const Glue& X, const sword sign) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; if( (is_outer_product::value) || (has_op_inv::value) || (has_op_inv::value) || (has_op_inv_sympd::value) || (has_op_inv_sympd::value) ) { // partial workaround for corner cases const Mat tmp(X); if(sign > sword(0)) { out += tmp; } else { out -= tmp; } return; } const partial_unwrap_check tmp1(X.A, out); const partial_unwrap_check tmp2(X.B, out); typedef typename partial_unwrap_check::stored_type TA; typedef typename partial_unwrap_check::stored_type TB; const TA& A = tmp1.M; const TB& B = tmp2.M; const bool do_trans_A = partial_unwrap_check::do_trans; const bool do_trans_B = partial_unwrap_check::do_trans; const bool use_alpha = partial_unwrap_check::do_times || partial_unwrap_check::do_times || (sign < sword(0)); const eT alpha = use_alpha ? ( tmp1.get_val() * tmp2.get_val() * ( (sign > sword(0)) ? eT(1) : eT(-1) ) ) : eT(0); arma_debug_assert_mul_size(A, B, do_trans_A, do_trans_B, "matrix multiplication"); const uword result_n_rows = (do_trans_A == false) ? (TA::is_row ? 1 : A.n_rows) : (TA::is_col ? 1 : A.n_cols); const uword result_n_cols = (do_trans_B == false) ? (TB::is_col ? 1 : B.n_cols) : (TB::is_row ? 1 : B.n_rows); arma_debug_assert_same_size(out.n_rows, out.n_cols, result_n_rows, result_n_cols, ( (sign > sword(0)) ? "addition" : "subtraction" ) ); if(out.n_elem == 0) { return; } if( (do_trans_A == false) && (do_trans_B == false) && (use_alpha == false) ) { if( ((A.n_rows == 1) || (TA::is_row)) && (is_cx::no) ) { gemv::apply(out.memptr(), B, A.memptr(), alpha, eT(1)); } else if( (B.n_cols == 1) || (TB::is_col) ) { gemv::apply(out.memptr(), A, B.memptr(), alpha, eT(1)); } else { gemm::apply(out, A, B, alpha, eT(1)); } } else if( (do_trans_A == false) && (do_trans_B == false) && (use_alpha == true) ) { if( ((A.n_rows == 1) || (TA::is_row)) && (is_cx::no) ) { gemv::apply(out.memptr(), B, A.memptr(), alpha, eT(1)); } else if( (B.n_cols == 1) || (TB::is_col) ) { gemv::apply(out.memptr(), A, B.memptr(), alpha, eT(1)); } else { gemm::apply(out, A, B, alpha, eT(1)); } } else if( (do_trans_A == true) && (do_trans_B == false) && (use_alpha == false) ) { if( ((A.n_cols == 1) || (TA::is_col)) && (is_cx::no) ) { gemv::apply(out.memptr(), B, A.memptr(), alpha, eT(1)); } else if( (B.n_cols == 1) || (TB::is_col) ) { gemv::apply(out.memptr(), A, B.memptr(), alpha, eT(1)); } else if( (void_ptr(&A) == void_ptr(&B)) && (is_cx::no) ) { syrk::apply(out, A, alpha, eT(1)); } else if( (void_ptr(&A) == void_ptr(&B)) && (is_cx::yes) ) { herk::apply(out, A, T(0), T(1)); } else { gemm::apply(out, A, B, alpha, eT(1)); } } else if( (do_trans_A == true) && (do_trans_B == false) && (use_alpha == true) ) { if( ((A.n_cols == 1) || (TA::is_col)) && (is_cx::no) ) { gemv::apply(out.memptr(), B, A.memptr(), alpha, eT(1)); } else if( (B.n_cols == 1) || (TB::is_col) ) { gemv::apply(out.memptr(), A, B.memptr(), alpha, eT(1)); } else if( (void_ptr(&A) == void_ptr(&B)) && (is_cx::no) ) { syrk::apply(out, A, alpha, eT(1)); } else { gemm::apply(out, A, B, alpha, eT(1)); } } else if( (do_trans_A == false) && (do_trans_B == true) && (use_alpha == false) ) { if( ((A.n_rows == 1) || (TA::is_row)) && (is_cx::no) ) { gemv::apply(out.memptr(), B, A.memptr(), alpha, eT(1)); } else if( ((B.n_rows == 1) || (TB::is_row)) && (is_cx::no) ) { gemv::apply(out.memptr(), A, B.memptr(), alpha, eT(1)); } else if( (void_ptr(&A) == void_ptr(&B)) && (is_cx::no) ) { syrk::apply(out, A, alpha, eT(1)); } else if( (void_ptr(&A) == void_ptr(&B)) && (is_cx::yes) ) { herk::apply(out, A, T(0), T(1)); } else { gemm::apply(out, A, B, alpha, eT(1)); } } else if( (do_trans_A == false) && (do_trans_B == true) && (use_alpha == true) ) { if( ((A.n_rows == 1) || (TA::is_row)) && (is_cx::no) ) { gemv::apply(out.memptr(), B, A.memptr(), alpha, eT(1)); } else if( ((B.n_rows == 1) || (TB::is_row)) && (is_cx::no) ) { gemv::apply(out.memptr(), A, B.memptr(), alpha, eT(1)); } else if( (void_ptr(&A) == void_ptr(&B)) && (is_cx::no) ) { syrk::apply(out, A, alpha, eT(1)); } else { gemm::apply(out, A, B, alpha, eT(1)); } } else if( (do_trans_A == true) && (do_trans_B == true) && (use_alpha == false) ) { if( ((A.n_cols == 1) || (TA::is_col)) && (is_cx::no) ) { gemv::apply(out.memptr(), B, A.memptr(), alpha, eT(1)); } else if( ((B.n_rows == 1) || (TB::is_row)) && (is_cx::no) ) { gemv::apply(out.memptr(), A, B.memptr(), alpha, eT(1)); } else { gemm::apply(out, A, B, alpha, eT(1)); } } else if( (do_trans_A == true) && (do_trans_B == true) && (use_alpha == true) ) { if( ((A.n_cols == 1) || (TA::is_col)) && (is_cx::no) ) { gemv::apply(out.memptr(), B, A.memptr(), alpha, eT(1)); } else if( ((B.n_rows == 1) || (TB::is_row)) && (is_cx::no) ) { gemv::apply(out.memptr(), A, B.memptr(), alpha, eT(1)); } else { gemm::apply(out, A, B, alpha, eT(1)); } } } template arma_inline uword glue_times::mul_storage_cost(const TA& A, const TB& B) { const uword final_A_n_rows = (do_trans_A == false) ? ( TA::is_row ? 1 : A.n_rows ) : ( TA::is_col ? 1 : A.n_cols ); const uword final_B_n_cols = (do_trans_B == false) ? ( TB::is_col ? 1 : B.n_cols ) : ( TB::is_row ? 1 : B.n_rows ); return final_A_n_rows * final_B_n_cols; } template < typename eT, const bool do_trans_A, const bool do_trans_B, const bool use_alpha, typename TA, typename TB > arma_hot inline void glue_times::apply ( Mat& out, const TA& A, const TB& B, const eT alpha ) { arma_extra_debug_sigprint(); //arma_debug_assert_mul_size(A, B, do_trans_A, do_trans_B, "matrix multiplication"); arma_debug_assert_trans_mul_size(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "matrix multiplication"); const uword final_n_rows = (do_trans_A == false) ? (TA::is_row ? 1 : A.n_rows) : (TA::is_col ? 1 : A.n_cols); const uword final_n_cols = (do_trans_B == false) ? (TB::is_col ? 1 : B.n_cols) : (TB::is_row ? 1 : B.n_rows); out.set_size(final_n_rows, final_n_cols); if( (A.n_elem == 0) || (B.n_elem == 0) ) { out.zeros(); return; } if( (do_trans_A == false) && (do_trans_B == false) && (use_alpha == false) ) { if( ((A.n_rows == 1) || (TA::is_row)) && (is_cx::no) ) { gemv::apply(out.memptr(), B, A.memptr()); } else if( (B.n_cols == 1) || (TB::is_col) ) { gemv::apply(out.memptr(), A, B.memptr()); } else { gemm::apply(out, A, B ); } } else if( (do_trans_A == false) && (do_trans_B == false) && (use_alpha == true) ) { if( ((A.n_rows == 1) || (TA::is_row)) && (is_cx::no) ) { gemv::apply(out.memptr(), B, A.memptr(), alpha); } else if( (B.n_cols == 1) || (TB::is_col) ) { gemv::apply(out.memptr(), A, B.memptr(), alpha); } else { gemm::apply(out, A, B, alpha); } } else if( (do_trans_A == true) && (do_trans_B == false) && (use_alpha == false) ) { if( ((A.n_cols == 1) || (TA::is_col)) && (is_cx::no) ) { gemv::apply(out.memptr(), B, A.memptr()); } else if( (B.n_cols == 1) || (TB::is_col) ) { gemv::apply(out.memptr(), A, B.memptr()); } else if( (void_ptr(&A) == void_ptr(&B)) && (is_cx::no) ) { syrk::apply(out, A ); } else if( (void_ptr(&A) == void_ptr(&B)) && (is_cx::yes) ) { herk::apply(out, A ); } else { gemm::apply(out, A, B ); } } else if( (do_trans_A == true) && (do_trans_B == false) && (use_alpha == true) ) { if( ((A.n_cols == 1) || (TA::is_col)) && (is_cx::no) ) { gemv::apply(out.memptr(), B, A.memptr(), alpha); } else if( (B.n_cols == 1) || (TB::is_col) ) { gemv::apply(out.memptr(), A, B.memptr(), alpha); } else if( (void_ptr(&A) == void_ptr(&B)) && (is_cx::no) ) { syrk::apply(out, A, alpha); } else { gemm::apply(out, A, B, alpha); } } else if( (do_trans_A == false) && (do_trans_B == true) && (use_alpha == false) ) { if( ((A.n_rows == 1) || (TA::is_row)) && (is_cx::no) ) { gemv::apply(out.memptr(), B, A.memptr()); } else if( ((B.n_rows == 1) || (TB::is_row)) && (is_cx::no) ) { gemv::apply(out.memptr(), A, B.memptr()); } else if( (void_ptr(&A) == void_ptr(&B)) && (is_cx::no) ) { syrk::apply(out, A ); } else if( (void_ptr(&A) == void_ptr(&B)) && (is_cx::yes) ) { herk::apply(out, A ); } else { gemm::apply(out, A, B ); } } else if( (do_trans_A == false) && (do_trans_B == true) && (use_alpha == true) ) { if( ((A.n_rows == 1) || (TA::is_row)) && (is_cx::no) ) { gemv::apply(out.memptr(), B, A.memptr(), alpha); } else if( ((B.n_rows == 1) || (TB::is_row)) && (is_cx::no) ) { gemv::apply(out.memptr(), A, B.memptr(), alpha); } else if( (void_ptr(&A) == void_ptr(&B)) && (is_cx::no) ) { syrk::apply(out, A, alpha); } else { gemm::apply(out, A, B, alpha); } } else if( (do_trans_A == true) && (do_trans_B == true) && (use_alpha == false) ) { if( ((A.n_cols == 1) || (TA::is_col)) && (is_cx::no) ) { gemv::apply(out.memptr(), B, A.memptr()); } else if( ((B.n_rows == 1) || (TB::is_row)) && (is_cx::no) ) { gemv::apply(out.memptr(), A, B.memptr()); } else { gemm::apply(out, A, B ); } } else if( (do_trans_A == true) && (do_trans_B == true) && (use_alpha == true) ) { if( ((A.n_cols == 1) || (TA::is_col)) && (is_cx::no) ) { gemv::apply(out.memptr(), B, A.memptr(), alpha); } else if( ((B.n_rows == 1) || (TB::is_row)) && (is_cx::no) ) { gemv::apply(out.memptr(), A, B.memptr(), alpha); } else { gemm::apply(out, A, B, alpha); } } } template < typename eT, const bool do_trans_A, const bool do_trans_B, const bool do_trans_C, const bool use_alpha, typename TA, typename TB, typename TC > arma_hot inline void glue_times::apply ( Mat& out, const TA& A, const TB& B, const TC& C, const eT alpha ) { arma_extra_debug_sigprint(); Mat tmp; const uword storage_cost_AB = glue_times::mul_storage_cost(A, B); const uword storage_cost_BC = glue_times::mul_storage_cost(B, C); if(storage_cost_AB <= storage_cost_BC) { // out = (A*B)*C glue_times::apply(tmp, A, B, alpha); glue_times::apply(out, tmp, C, eT(0)); } else { // out = A*(B*C) glue_times::apply(tmp, B, C, alpha); glue_times::apply(out, A, tmp, eT(0)); } } template < typename eT, const bool do_trans_A, const bool do_trans_B, const bool do_trans_C, const bool do_trans_D, const bool use_alpha, typename TA, typename TB, typename TC, typename TD > arma_hot inline void glue_times::apply ( Mat& out, const TA& A, const TB& B, const TC& C, const TD& D, const eT alpha ) { arma_extra_debug_sigprint(); Mat tmp; const uword storage_cost_AC = glue_times::mul_storage_cost(A, C); const uword storage_cost_BD = glue_times::mul_storage_cost(B, D); if(storage_cost_AC <= storage_cost_BD) { // out = (A*B*C)*D glue_times::apply(tmp, A, B, C, alpha); glue_times::apply(out, tmp, D, eT(0)); } else { // out = A*(B*C*D) glue_times::apply(tmp, B, C, D, alpha); glue_times::apply(out, A, tmp, eT(0)); } } // // glue_times_diag template arma_hot inline void glue_times_diag::apply(Mat& actual_out, const Glue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const strip_diagmat S1(X.A); const strip_diagmat S2(X.B); typedef typename strip_diagmat::stored_type T1_stripped; typedef typename strip_diagmat::stored_type T2_stripped; if( (strip_diagmat::do_diagmat == true) && (strip_diagmat::do_diagmat == false) ) { arma_extra_debug_print("glue_times_diag::apply(): diagmat(A) * B"); const diagmat_proxy A(S1.M); const quasi_unwrap UB(X.B); const Mat& B = UB.M; const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword A_length = (std::min)(A_n_rows, A_n_cols); const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; arma_debug_assert_mul_size(A_n_rows, A_n_cols, B_n_rows, B_n_cols, "matrix multiplication"); const bool is_alias = (A.is_alias(actual_out) || UB.is_alias(actual_out)); if(is_alias) { arma_extra_debug_print("glue_times_diag::apply(): aliasing detected"); } Mat tmp; Mat& out = (is_alias) ? tmp : actual_out; out.zeros(A_n_rows, B_n_cols); for(uword col=0; col < B_n_cols; ++col) { eT* out_coldata = out.colptr(col); const eT* B_coldata = B.colptr(col); for(uword i=0; i < A_length; ++i) { out_coldata[i] = A[i] * B_coldata[i]; } } if(is_alias) { actual_out.steal_mem(tmp); } } else if( (strip_diagmat::do_diagmat == false) && (strip_diagmat::do_diagmat == true) ) { arma_extra_debug_print("glue_times_diag::apply(): A * diagmat(B)"); const quasi_unwrap UA(X.A); const Mat& A = UA.M; const diagmat_proxy B(S2.M); const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; const uword B_length = (std::min)(B_n_rows, B_n_cols); arma_debug_assert_mul_size(A_n_rows, A_n_cols, B_n_rows, B_n_cols, "matrix multiplication"); const bool is_alias = (UA.is_alias(actual_out) || B.is_alias(actual_out)); if(is_alias) { arma_extra_debug_print("glue_times_diag::apply(): aliasing detected"); } Mat tmp; Mat& out = (is_alias) ? tmp : actual_out; out.zeros(A_n_rows, B_n_cols); for(uword col=0; col < B_length; ++col) { const eT val = B[col]; eT* out_coldata = out.colptr(col); const eT* A_coldata = A.colptr(col); for(uword i=0; i < A_n_rows; ++i) { out_coldata[i] = A_coldata[i] * val; } } if(is_alias) { actual_out.steal_mem(tmp); } } else if( (strip_diagmat::do_diagmat == true) && (strip_diagmat::do_diagmat == true) ) { arma_extra_debug_print("glue_times_diag::apply(): diagmat(A) * diagmat(B)"); const diagmat_proxy A(S1.M); const diagmat_proxy B(S2.M); arma_debug_assert_mul_size(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "matrix multiplication"); const bool is_alias = (A.is_alias(actual_out) || B.is_alias(actual_out)); if(is_alias) { arma_extra_debug_print("glue_times_diag::apply(): aliasing detected"); } Mat tmp; Mat& out = (is_alias) ? tmp : actual_out; out.zeros(A.n_rows, B.n_cols); const uword A_length = (std::min)(A.n_rows, A.n_cols); const uword B_length = (std::min)(B.n_rows, B.n_cols); const uword N = (std::min)(A_length, B_length); for(uword i=0; i < N; ++i) { out.at(i,i) = A[i] * B[i]; } if(is_alias) { actual_out.steal_mem(tmp); } } } //! @} RcppArmadillo/inst/include/armadillo_bits/SizeCube_bones.hpp0000644000176200001440000000306014124060717024001 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SizeCube //! @{ class SizeCube { public: const uword n_rows; const uword n_cols; const uword n_slices; inline explicit SizeCube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices); inline uword operator[](const uword dim) const; inline uword operator()(const uword dim) const; inline bool operator==(const SizeCube& s) const; inline bool operator!=(const SizeCube& s) const; inline SizeCube operator+(const SizeCube& s) const; inline SizeCube operator-(const SizeCube& s) const; inline SizeCube operator+(const uword val) const; inline SizeCube operator-(const uword val) const; inline SizeCube operator*(const uword val) const; inline SizeCube operator/(const uword val) const; }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_eps.hpp0000644000176200001440000000441014124060717022354 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_eps //! @{ template arma_warn_unused inline const eOp eps(const Base& X, const typename arma_not_cx::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return eOp(X.get_ref()); } template arma_warn_unused inline Mat< typename T1::pod_type > eps(const Base< std::complex, T1>& X, const typename arma_cx_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::pod_type T; typedef typename T1::elem_type eT; const unwrap tmp(X.get_ref()); const Mat& A = tmp.M; Mat out(A.n_rows, A.n_cols, arma_nozeros_indicator()); T* out_mem = out.memptr(); const eT* A_mem = A.memptr(); const uword n_elem = A.n_elem; for(uword i=0; i arma_warn_unused arma_inline typename arma_integral_only::result eps(const eT& x) { arma_ignore(x); return eT(0); } template arma_warn_unused arma_inline typename arma_real_only::result eps(const eT& x) { return eop_aux::direct_eps(x); } template arma_warn_unused arma_inline typename arma_real_only::result eps(const std::complex& x) { return eop_aux::direct_eps(x); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_misc_bones.hpp0000644000176200001440000000427614124060717023733 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_misc //! @{ class op_real : public traits_op_passthru { public: template inline static void apply( Mat& out, const mtOp& X); template inline static void apply( Cube& out, const mtOpCube& X); }; class op_imag : public traits_op_passthru { public: template inline static void apply( Mat& out, const mtOp& X); template inline static void apply( Cube& out, const mtOpCube& X); }; class op_abs : public traits_op_passthru { public: template inline static void apply( Mat& out, const mtOp& X); template inline static void apply( Cube& out, const mtOpCube& X); }; class op_arg : public traits_op_passthru { public: template inline static void apply( Mat& out, const mtOp& X); template inline static void apply( Cube& out, const mtOpCube& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/spglue_times_bones.hpp0000644000176200001440000000553314124060717024777 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_times //! @{ class spglue_times { public: template struct traits { static constexpr bool is_row = T1::is_row; static constexpr bool is_col = T2::is_col; static constexpr bool is_xvec = false; }; template inline static void apply(SpMat& out, const SpGlue& X); template inline static void apply(SpMat& out, const SpGlue,T2,spglue_times>& X); template arma_hot inline static void apply_noalias(SpMat& c, const SpMat& x, const SpMat& y); }; class spglue_times_misc { public: template struct traits { static constexpr bool is_row = T1::is_row; static constexpr bool is_col = T2::is_col; static constexpr bool is_xvec = false; }; template inline static void sparse_times_dense(Mat& out, const T1& x, const T2& y); template inline static void dense_times_sparse(Mat& out, const T1& x, const T2& y); }; class spglue_times_mixed { public: template struct traits { static constexpr bool is_row = T1::is_row; static constexpr bool is_col = T2::is_col; static constexpr bool is_xvec = false; }; template inline static void apply(SpMat::eT>& out, const mtSpGlue::eT, T1, T2, spglue_times_mixed>& expr); template inline static void sparse_times_dense(Mat< typename promote_type::result >& out, const T1& X, const T2& Y); template inline static void dense_times_sparse(Mat< typename promote_type::result >& out, const T1& X, const T2& Y); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_symmat.hpp0000644000176200001440000000674314124060717023112 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_symmat //! @{ template arma_warn_unused arma_inline typename enable_if2< is_cx::no, const Op >::result symmatu(const Base& X, const bool do_conj = false) { arma_extra_debug_sigprint(); arma_ignore(do_conj); return Op(X.get_ref()); } template arma_warn_unused arma_inline typename enable_if2< is_cx::no, const Op >::result symmatl(const Base& X, const bool do_conj = false) { arma_extra_debug_sigprint(); arma_ignore(do_conj); return Op(X.get_ref()); } template arma_warn_unused arma_inline typename enable_if2< is_cx::yes, const Op >::result symmatu(const Base& X, const bool do_conj = true) { arma_extra_debug_sigprint(); return Op(X.get_ref(), 0, (do_conj ? 1 : 0)); } template arma_warn_unused arma_inline typename enable_if2< is_cx::yes, const Op >::result symmatl(const Base& X, const bool do_conj = true) { arma_extra_debug_sigprint(); return Op(X.get_ref(), 0, (do_conj ? 1 : 0)); } // template arma_warn_unused arma_inline typename enable_if2< is_cx::no, const SpOp >::result symmatu(const SpBase& X, const bool do_conj = false) { arma_extra_debug_sigprint(); arma_ignore(do_conj); return SpOp(X.get_ref(), 0, 0); } template arma_warn_unused arma_inline typename enable_if2< is_cx::no, const SpOp >::result symmatl(const SpBase& X, const bool do_conj = false) { arma_extra_debug_sigprint(); arma_ignore(do_conj); return SpOp(X.get_ref(), 1, 0); } template arma_warn_unused arma_inline typename enable_if2< is_cx::yes, const SpOp >::result symmatu(const SpBase& X, const bool do_conj = true) { arma_extra_debug_sigprint(); return SpOp(X.get_ref(), 0, (do_conj ? 1 : 0)); } template arma_warn_unused arma_inline typename enable_if2< is_cx::yes, const SpOp >::result symmatl(const SpBase& X, const bool do_conj = true) { arma_extra_debug_sigprint(); return SpOp(X.get_ref(), 1, (do_conj ? 1 : 0)); } //! @} RcppArmadillo/inst/include/armadillo_bits/operator_cube_schur.hpp0000644000176200001440000000622314124060717025143 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup operator_cube_schur //! @{ // operator %, which we define it to do a schur product (element-wise multiplication) //! element-wise multiplication of BaseCube objects with same element type template arma_inline const eGlueCube operator% ( const BaseCube& X, const BaseCube& Y ) { arma_extra_debug_sigprint(); return eGlueCube(X.get_ref(), Y.get_ref()); } //! element-wise multiplication of BaseCube objects with different element types template inline const mtGlueCube::result, T1, T2, glue_mixed_schur> operator% ( const BaseCube< typename force_different_type::T1_result, T1>& X, const BaseCube< typename force_different_type::T2_result, T2>& Y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); return mtGlueCube( X.get_ref(), Y.get_ref() ); } template arma_inline Cube operator% ( const subview_cube_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); return subview_cube_each1_aux::operator_schur(X, Y.get_ref()); } template arma_inline Cube operator% ( const Base& X, const subview_cube_each1& Y ) { arma_extra_debug_sigprint(); return subview_cube_each1_aux::operator_schur(Y, X.get_ref()); // NOTE: swapped order } template arma_inline Cube operator% ( const subview_cube_each2& X, const Base& Y ) { arma_extra_debug_sigprint(); return subview_cube_each2_aux::operator_schur(X, Y.get_ref()); } template arma_inline Cube operator% ( const Base& X, const subview_cube_each2& Y ) { arma_extra_debug_sigprint(); return subview_cube_each2_aux::operator_schur(Y, X.get_ref()); // NOTE: swapped order } //! @} RcppArmadillo/inst/include/armadillo_bits/op_index_max_meat.hpp0000644000176200001440000002364714124060717024577 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_index_max //! @{ template inline void op_index_max::apply(Mat& out, const mtOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "index_max(): parameter 'dim' must be 0 or 1" ); const quasi_unwrap U(in.m); const Mat& X = U.M; if(U.is_alias(out) == false) { op_index_max::apply_noalias(out, X, dim); } else { Mat tmp; op_index_max::apply_noalias(tmp, X, dim); out.steal_mem(tmp); } } template inline void op_index_max::apply_noalias(Mat& out, const Mat& X, const uword dim) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(dim == 0) { arma_extra_debug_print("op_index_max::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols); if(X_n_rows == 0) { return; } uword* out_mem = out.memptr(); for(uword col=0; col < X_n_cols; ++col) { op_max::direct_max( X.colptr(col), X_n_rows, out_mem[col] ); } } else if(dim == 1) { arma_extra_debug_print("op_index_max::apply(): dim = 1"); out.zeros(X_n_rows, (X_n_cols > 0) ? 1 : 0); if(X_n_cols == 0) { return; } uword* out_mem = out.memptr(); Col tmp(X_n_rows, arma_nozeros_indicator()); T* tmp_mem = tmp.memptr(); if(is_cx::yes) { const eT* col_mem = X.colptr(0); for(uword row=0; row < X_n_rows; ++row) { tmp_mem[row] = eop_aux::arma_abs(col_mem[row]); } } else { arrayops::copy(tmp_mem, (T*)(X.colptr(0)), X_n_rows); } for(uword col=1; col < X_n_cols; ++col) { const eT* col_mem = X.colptr(col); for(uword row=0; row < X_n_rows; ++row) { T& max_val = tmp_mem[row]; T col_val = (is_cx::yes) ? T(eop_aux::arma_abs(col_mem[row])) : T(access::tmp_real(col_mem[row])); if(max_val < col_val) { max_val = col_val; out_mem[row] = col; } } } } } template inline void op_index_max::apply(Cube& out, const mtOpCube& in) { arma_extra_debug_sigprint(); const uword dim = in.aux_uword_a; arma_debug_check( (dim > 2), "index_max(): parameter 'dim' must be 0 or 1 or 2" ); const unwrap_cube U(in.m); if(U.is_alias(out) == false) { op_index_max::apply_noalias(out, U.M, dim); } else { Cube tmp; op_index_max::apply_noalias(tmp, U.M, dim); out.steal_mem(tmp); } } template inline void op_index_max::apply_noalias(Cube& out, const Cube& X, const uword dim, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword X_n_slices = X.n_slices; if(dim == 0) { arma_extra_debug_print("op_index_max::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols, X_n_slices); if(out.is_empty() || X.is_empty()) { return; } for(uword slice=0; slice < X_n_slices; ++slice) { uword* out_mem = out.slice_memptr(slice); for(uword col=0; col < X_n_cols; ++col) { op_max::direct_max( X.slice_colptr(slice,col), X_n_rows, out_mem[col] ); } } } else if(dim == 1) { arma_extra_debug_print("op_index_max::apply(): dim = 1"); out.zeros(X_n_rows, (X_n_cols > 0) ? 1 : 0, X_n_slices); if(out.is_empty() || X.is_empty()) { return; } Col tmp(X_n_rows, arma_nozeros_indicator()); eT* tmp_mem = tmp.memptr(); for(uword slice=0; slice < X_n_slices; ++slice) { uword* out_mem = out.slice_memptr(slice); arrayops::copy(tmp_mem, X.slice_colptr(slice,0), X_n_rows); for(uword col=1; col < X_n_cols; ++col) { const eT* col_mem = X.slice_colptr(slice,col); for(uword row=0; row < X_n_rows; ++row) { const eT val = col_mem[row]; if(val > tmp_mem[row]) { tmp_mem[row] = val; out_mem[row] = col; } } } } } else if(dim == 2) { arma_extra_debug_print("op_index_max::apply(): dim = 2"); out.zeros(X_n_rows, X_n_cols, (X_n_slices > 0) ? 1 : 0); if(out.is_empty() || X.is_empty()) { return; } Mat tmp(X.slice_memptr(0), X_n_rows, X_n_cols); // copy slice 0 eT* tmp_mem = tmp.memptr(); uword* out_mem = out.memptr(); const uword N = X.n_elem_slice; for(uword slice=1; slice < X_n_slices; ++slice) { const eT* X_slice_mem = X.slice_memptr(slice); for(uword i=0; i < N; ++i) { const eT val = X_slice_mem[i]; if(val > tmp_mem[i]) { tmp_mem[i] = val; out_mem[i] = slice; } } } } } template inline void op_index_max::apply_noalias(Cube& out, const Cube& X, const uword dim, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename get_pod_type::result T; const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword X_n_slices = X.n_slices; if(dim == 0) { arma_extra_debug_print("op_index_max::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols, X_n_slices); if(out.is_empty() || X.is_empty()) { return; } for(uword slice=0; slice < X_n_slices; ++slice) { uword* out_mem = out.slice_memptr(slice); for(uword col=0; col < X_n_cols; ++col) { op_max::direct_max( X.slice_colptr(slice,col), X_n_rows, out_mem[col] ); } } } else if(dim == 1) { arma_extra_debug_print("op_index_max::apply(): dim = 1"); out.zeros(X_n_rows, (X_n_cols > 0) ? 1 : 0, X_n_slices); if(out.is_empty() || X.is_empty()) { return; } Col tmp(X_n_rows, arma_nozeros_indicator()); T* tmp_mem = tmp.memptr(); for(uword slice=0; slice < X_n_slices; ++slice) { uword* out_mem = out.slice_memptr(slice); const eT* col0_mem = X.slice_colptr(slice,0); for(uword row=0; row < X_n_rows; ++row) { tmp_mem[row] = std::abs( col0_mem[row] ); } for(uword col=1; col < X_n_cols; ++col) { const eT* col_mem = X.slice_colptr(slice,col); for(uword row=0; row < X_n_rows; ++row) { const T val = std::abs( col_mem[row] ); if(val > tmp_mem[row]) { tmp_mem[row] = val; out_mem[row] = col; } } } } } else if(dim == 2) { arma_extra_debug_print("op_index_max::apply(): dim = 2"); out.zeros(X_n_rows, X_n_cols, (X_n_slices > 0) ? 1 : 0); if(out.is_empty() || X.is_empty()) { return; } uword* out_mem = out.memptr(); Mat tmp(X_n_rows, X_n_cols, arma_nozeros_indicator()); T* tmp_mem = tmp.memptr(); const eT* X_slice0_mem = X.slice_memptr(0); const uword N = X.n_elem_slice; for(uword i=0; i tmp_mem[i]) { tmp_mem[i] = val; out_mem[i] = slice; } } } } } template inline void op_index_max::apply(Mat& out, const SpBase& expr, const uword dim) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; arma_debug_check( (dim > 1), "index_max(): parameter 'dim' must be 0 or 1" ); const unwrap_spmat U(expr.get_ref()); const SpMat& X = U.M; const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(dim == 0) { arma_extra_debug_print("op_index_max::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols); if(X_n_rows == 0) { return; } uword* out_mem = out.memptr(); for(uword col=0; col < X_n_cols; ++col) { out_mem[col] = X.col(col).index_max(); } } else if(dim == 1) { arma_extra_debug_print("op_index_max::apply(): dim = 1"); out.set_size(X_n_rows, (X_n_cols > 0) ? 1 : 0); if(X_n_cols == 0) { return; } uword* out_mem = out.memptr(); const SpMat Xt = X.st(); for(uword row=0; row < X_n_rows; ++row) { out_mem[row] = Xt.col(row).index_max(); } } } //! @} RcppArmadillo/inst/include/armadillo_bits/mtSpOp_bones.hpp0000644000176200001440000000417114124060717023516 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup mtSpOp //! @{ // Class for delayed multi-type sparse operations. These are operations where // the resulting type is different than the stored type. template class mtSpOp : public SpBase< out_eT, mtSpOp > { public: typedef out_eT elem_type; typedef typename get_pod_type::result pod_type; typedef typename T1::elem_type in_eT; static constexpr bool is_row = spop_type::template traits::is_row; static constexpr bool is_col = spop_type::template traits::is_col; static constexpr bool is_xvec = spop_type::template traits::is_xvec; inline explicit mtSpOp(const T1& in_m); inline mtSpOp(const T1& in_m, const uword aux_uword_a, const uword aux_uword_b); inline mtSpOp(const char junk, const T1& in_m, const out_eT in_aux); inline ~mtSpOp(); template arma_inline bool is_alias(const SpMat& X) const; arma_aligned const T1& m; //!< the operand; must be derived from SpBase arma_aligned out_eT aux_out_eT; //!< auxiliary data, using the element type as specified by the out_eT template parameter arma_aligned uword aux_uword_a; arma_aligned uword aux_uword_b; }; //! @} RcppArmadillo/inst/include/armadillo_bits/Mat_meat.hpp0000644000176200001440000061441114160256234022642 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup Mat //! @{ template inline Mat::~Mat() { arma_extra_debug_sigprint_this(this); if(n_alloc > 0) { arma_extra_debug_print("Mat::destructor: releasing memory"); memory::release( access::rw(mem) ); } // try to expose buggy user code that accesses deleted objects if(arma_config::debug) { access::rw(mem) = nullptr; } arma_type_check(( is_supported_elem_type::value == false )); } template inline Mat::Mat() : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); } //! construct the matrix to have user specified dimensions template inline Mat::Mat(const uword in_n_rows, const uword in_n_cols) : n_rows(in_n_rows) , n_cols(in_n_cols) , n_elem(in_n_rows*in_n_cols) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); #if (!defined(ARMA_DONT_ZERO_INIT)) { arma_extra_debug_print("Mat::constructor: zeroing memory"); arrayops::fill_zeros(memptr(), n_elem); } #endif } template inline Mat::Mat(const SizeMat& s) : n_rows(s.n_rows) , n_cols(s.n_cols) , n_elem(s.n_rows*s.n_cols) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); #if (!defined(ARMA_DONT_ZERO_INIT)) { arma_extra_debug_print("Mat::constructor: zeroing memory"); arrayops::fill_zeros(memptr(), n_elem); } #endif } //! internal use only template template inline Mat::Mat(const uword in_n_rows, const uword in_n_cols, const arma_initmode_indicator&) : n_rows(in_n_rows) , n_cols(in_n_cols) , n_elem(in_n_rows*in_n_cols) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); if(do_zeros) { arma_extra_debug_print("Mat::constructor: zeroing memory"); arrayops::fill_zeros(memptr(), n_elem); } } //! internal use only template template inline Mat::Mat(const SizeMat& s, const arma_initmode_indicator&) : n_rows(s.n_rows) , n_cols(s.n_cols) , n_elem(s.n_rows*s.n_cols) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); if(do_zeros) { arma_extra_debug_print("Mat::constructor: zeroing memory"); arrayops::fill_zeros(memptr(), n_elem); } } //! construct the matrix to have user specified dimensions and fill with specified pattern template template inline Mat::Mat(const uword in_n_rows, const uword in_n_cols, const fill::fill_class& f) : n_rows(in_n_rows) , n_cols(in_n_cols) , n_elem(in_n_rows*in_n_cols) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); (*this).fill(f); } template template inline Mat::Mat(const SizeMat& s, const fill::fill_class& f) : n_rows(s.n_rows) , n_cols(s.n_cols) , n_elem(s.n_rows*s.n_cols) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); (*this).fill(f); } //! construct the matrix to have user specified dimensions and fill with specified value template inline Mat::Mat(const uword in_n_rows, const uword in_n_cols, const fill::scalar_holder f) : n_rows(in_n_rows) , n_cols(in_n_cols) , n_elem(in_n_rows*in_n_cols) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); (*this).fill(f.scalar); } template inline Mat::Mat(const SizeMat& s, const fill::scalar_holder f) : n_rows(s.n_rows) , n_cols(s.n_cols) , n_elem(s.n_rows*s.n_cols) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); (*this).fill(f.scalar); } //! constructor used by Row and Col classes template inline Mat::Mat(const arma_vec_indicator&, const uhword in_vec_state) : n_rows( (in_vec_state == 2) ? 1 : 0 ) , n_cols( (in_vec_state == 1) ? 1 : 0 ) , n_elem(0) , n_alloc(0) , vec_state(in_vec_state) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); } //! constructor used by Row and Col classes template inline Mat::Mat(const arma_vec_indicator&, const uword in_n_rows, const uword in_n_cols, const uhword in_vec_state) : n_rows(in_n_rows) , n_cols(in_n_cols) , n_elem(in_n_rows*in_n_cols) , n_alloc() , vec_state(in_vec_state) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); } template inline Mat::Mat(const arma_fixed_indicator&, const uword in_n_rows, const uword in_n_cols, const uhword in_vec_state, const eT* in_mem) : n_rows (in_n_rows) , n_cols (in_n_cols) , n_elem (in_n_rows*in_n_cols) , n_alloc (0) , vec_state (in_vec_state) , mem_state (3) , mem (in_mem) { arma_extra_debug_sigprint_this(this); } template inline void Mat::init_cold() { arma_extra_debug_sigprint( arma_str::format("n_rows = %d, n_cols = %d") % n_rows % n_cols ); // ensure that n_elem can hold the result of (n_rows * n_cols) #if defined(ARMA_64BIT_WORD) const char* error_message = "Mat::init(): requested size is too large"; #else const char* error_message = "Mat::init(): requested size is too large; suggest to enable ARMA_64BIT_WORD"; #endif arma_debug_check ( ( ( (n_rows > ARMA_MAX_UHWORD) || (n_cols > ARMA_MAX_UHWORD) ) ? ( (double(n_rows) * double(n_cols)) > double(ARMA_MAX_UWORD) ) : false ), error_message ); if(n_elem <= arma_config::mat_prealloc) { if(n_elem > 0) { arma_extra_debug_print("Mat::init(): using local memory"); } access::rw(mem) = (n_elem == 0) ? nullptr : mem_local; access::rw(n_alloc) = 0; } else { arma_extra_debug_print("Mat::init(): acquiring memory"); access::rw(mem) = memory::acquire(n_elem); access::rw(n_alloc) = n_elem; } } template inline void Mat::init_warm(uword in_n_rows, uword in_n_cols) { arma_extra_debug_sigprint( arma_str::format("in_n_rows = %d, in_n_cols = %d") % in_n_rows % in_n_cols ); if( (n_rows == in_n_rows) && (n_cols == in_n_cols) ) { return; } bool err_state = false; char* err_msg = nullptr; const uhword t_vec_state = vec_state; const uhword t_mem_state = mem_state; arma_debug_set_error( err_state, err_msg, (t_mem_state == 3), "Mat::init(): size is fixed and hence cannot be changed" ); if(t_vec_state > 0) { if( (in_n_rows == 0) && (in_n_cols == 0) ) { if(t_vec_state == 1) { in_n_cols = 1; } if(t_vec_state == 2) { in_n_rows = 1; } } else { if(t_vec_state == 1) { arma_debug_set_error( err_state, err_msg, (in_n_cols != 1), "Mat::init(): requested size is not compatible with column vector layout" ); } if(t_vec_state == 2) { arma_debug_set_error( err_state, err_msg, (in_n_rows != 1), "Mat::init(): requested size is not compatible with row vector layout" ); } } } // ensure that n_elem can hold the result of (n_rows * n_cols) #if defined(ARMA_64BIT_WORD) const char* error_message = "Mat::init(): requested size is too large"; #else const char* error_message = "Mat::init(): requested size is too large; suggest to enable ARMA_64BIT_WORD"; #endif arma_debug_set_error ( err_state, err_msg, ( ( (in_n_rows > ARMA_MAX_UHWORD) || (in_n_cols > ARMA_MAX_UHWORD) ) ? ( (double(in_n_rows) * double(in_n_cols)) > double(ARMA_MAX_UWORD) ) : false ), error_message ); arma_debug_check(err_state, err_msg); const uword old_n_elem = n_elem; const uword new_n_elem = in_n_rows * in_n_cols; if(old_n_elem == new_n_elem) { arma_extra_debug_print("Mat::init(): reusing memory"); access::rw(n_rows) = in_n_rows; access::rw(n_cols) = in_n_cols; return; } arma_debug_check( (t_mem_state == 2), "Mat::init(): mismatch between size of auxiliary memory and requested size" ); if(new_n_elem <= arma_config::mat_prealloc) { if(n_alloc > 0) { arma_extra_debug_print("Mat::init(): releasing memory"); memory::release( access::rw(mem) ); } if(new_n_elem > 0) { arma_extra_debug_print("Mat::init(): using local memory"); } access::rw(mem) = (new_n_elem == 0) ? nullptr : mem_local; access::rw(n_alloc) = 0; } else // condition: new_n_elem > arma_config::mat_prealloc { if(new_n_elem > n_alloc) { if(n_alloc > 0) { arma_extra_debug_print("Mat::init(): releasing memory"); memory::release( access::rw(mem) ); // in case memory::acquire() throws an exception access::rw(mem) = nullptr; access::rw(n_rows) = 0; access::rw(n_cols) = 0; access::rw(n_elem) = 0; access::rw(n_alloc) = 0; } arma_extra_debug_print("Mat::init(): acquiring memory"); access::rw(mem) = memory::acquire(new_n_elem); access::rw(n_alloc) = new_n_elem; } else // condition: new_n_elem <= n_alloc { arma_extra_debug_print("Mat::init(): reusing memory"); } } access::rw(n_rows) = in_n_rows; access::rw(n_cols) = in_n_cols; access::rw(n_elem) = new_n_elem; access::rw(mem_state) = 0; } //! create the matrix from a textual description template inline arma_cold Mat::Mat(const char* text) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init( std::string(text) ); } //! create the matrix from a textual description template inline arma_cold Mat& Mat::operator=(const char* text) { arma_extra_debug_sigprint(); init( std::string(text) ); return *this; } //! create the matrix from a textual description template inline arma_cold Mat::Mat(const std::string& text) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init(text); } //! create the matrix from a textual description template inline arma_cold Mat& Mat::operator=(const std::string& text) { arma_extra_debug_sigprint(); init(text); return *this; } //! internal function to create the matrix from a textual description template inline arma_cold void Mat::init(const std::string& text_orig) { arma_extra_debug_sigprint(); const bool replace_commas = (is_cx::yes) ? false : ( text_orig.find(',') != std::string::npos ); std::string text_mod; if(replace_commas) { text_mod = text_orig; std::replace(text_mod.begin(), text_mod.end(), ',', ' '); } const std::string& text = (replace_commas) ? text_mod : text_orig; // // work out the size uword t_n_rows = 0; uword t_n_cols = 0; bool has_semicolon = false; bool has_token = false; std::string token; std::string::size_type line_start = 0; std::string::size_type line_end = 0; std::string::size_type line_len = 0; std::stringstream line_stream; while( line_start < text.length() ) { line_end = text.find(';', line_start); if(line_end == std::string::npos) { has_semicolon = false; line_end = text.length()-1; line_len = line_end - line_start + 1; } else { has_semicolon = true; line_len = line_end - line_start; // omit the ';' character } line_stream.clear(); line_stream.str( text.substr(line_start,line_len) ); has_token = false; uword line_n_cols = 0; while(line_stream >> token) { has_token = true; ++line_n_cols; } if(t_n_rows == 0) { t_n_cols = line_n_cols; } else { if(has_semicolon || has_token) { arma_check( (line_n_cols != t_n_cols), "Mat::init(): inconsistent number of columns in given string"); } } ++t_n_rows; line_start = line_end+1; } // if the last line was empty, ignore it if( (has_semicolon == false) && (has_token == false) && (t_n_rows >= 1) ) { --t_n_rows; } Mat& x = (*this); x.set_size(t_n_rows, t_n_cols); if(x.is_empty()) { return; } line_start = 0; line_end = 0; line_len = 0; uword urow = 0; while( line_start < text.length() ) { line_end = text.find(';', line_start); if(line_end == std::string::npos) { line_end = text.length()-1; line_len = line_end - line_start + 1; } else { line_len = line_end - line_start; // omit the ';' character } line_stream.clear(); line_stream.str( text.substr(line_start,line_len) ); uword ucol = 0; while(line_stream >> token) { diskio::convert_token( x.at(urow,ucol), token ); ++ucol; } ++urow; line_start = line_end+1; } } //! create the matrix from std::vector template inline Mat::Mat(const std::vector& x) : n_rows(uword(x.size())) , n_cols(1) , n_elem(uword(x.size())) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); if(n_elem > 0) { arrayops::copy( memptr(), &(x[0]), n_elem ); } } //! create the matrix from std::vector template inline Mat& Mat::operator=(const std::vector& x) { arma_extra_debug_sigprint(); init_warm(uword(x.size()), 1); if(x.size() > 0) { arrayops::copy( memptr(), &(x[0]), uword(x.size()) ); } return *this; } template inline Mat::Mat(const std::initializer_list& list) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init(list); } template inline Mat& Mat::operator=(const std::initializer_list& list) { arma_extra_debug_sigprint(); init(list); return *this; } template inline Mat::Mat(const std::initializer_list< std::initializer_list >& list) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init(list); } template inline Mat& Mat::operator=(const std::initializer_list< std::initializer_list >& list) { arma_extra_debug_sigprint(); init(list); return *this; } template inline Mat::Mat(Mat&& X) : n_rows (X.n_rows ) , n_cols (X.n_cols ) , n_elem (X.n_elem ) , n_alloc (X.n_alloc) , vec_state(0 ) , mem_state(0 ) , mem ( ) { arma_extra_debug_sigprint(arma_str::format("this = %x X = %x") % this % &X); if( (X.n_alloc > arma_config::mat_prealloc) || (X.mem_state == 1) || (X.mem_state == 2) ) { access::rw(mem_state) = X.mem_state; access::rw(mem) = X.mem; access::rw(X.n_rows) = 0; access::rw(X.n_cols) = 0; access::rw(X.n_elem) = 0; access::rw(X.n_alloc) = 0; access::rw(X.mem_state) = 0; access::rw(X.mem) = nullptr; } else // condition: (X.n_alloc <= arma_config::mat_prealloc) || (X.mem_state == 0) || (X.mem_state == 3) { init_cold(); arrayops::copy( memptr(), X.mem, X.n_elem ); if( (X.mem_state == 0) && (X.n_alloc <= arma_config::mat_prealloc) ) { access::rw(X.n_rows) = 0; access::rw(X.n_cols) = 0; access::rw(X.n_elem) = 0; access::rw(X.mem) = nullptr; } } } template inline Mat& Mat::operator=(Mat&& X) { arma_extra_debug_sigprint(arma_str::format("this = %x X = %x") % this % &X); (*this).steal_mem(X); if( (X.mem_state == 0) && (X.n_alloc <= arma_config::mat_prealloc) && (this != &X) ) { access::rw(X.n_rows) = 0; access::rw(X.n_cols) = 0; access::rw(X.n_elem) = 0; access::rw(X.mem) = nullptr; } return *this; } //! Set the matrix to be equal to the specified scalar. //! NOTE: the size of the matrix will be 1x1 template inline Mat& Mat::operator=(const eT val) { arma_extra_debug_sigprint(); init_warm(1,1); access::rw(mem[0]) = val; return *this; } //! In-place addition of a scalar to all elements of the matrix template inline Mat& Mat::operator+=(const eT val) { arma_extra_debug_sigprint(); arrayops::inplace_plus( memptr(), val, n_elem ); return *this; } //! In-place subtraction of a scalar from all elements of the matrix template inline Mat& Mat::operator-=(const eT val) { arma_extra_debug_sigprint(); arrayops::inplace_minus( memptr(), val, n_elem ); return *this; } //! In-place multiplication of all elements of the matrix with a scalar template inline Mat& Mat::operator*=(const eT val) { arma_extra_debug_sigprint(); arrayops::inplace_mul( memptr(), val, n_elem ); return *this; } //! In-place division of all elements of the matrix with a scalar template inline Mat& Mat::operator/=(const eT val) { arma_extra_debug_sigprint(); arrayops::inplace_div( memptr(), val, n_elem ); return *this; } //! construct a matrix from a given matrix template inline Mat::Mat(const Mat& in_mat) : n_rows(in_mat.n_rows) , n_cols(in_mat.n_cols) , n_elem(in_mat.n_elem) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint(arma_str::format("this = %x in_mat = %x") % this % &in_mat); init_cold(); arrayops::copy( memptr(), in_mat.mem, in_mat.n_elem ); } //! construct a matrix from a given matrix template inline Mat& Mat::operator=(const Mat& in_mat) { arma_extra_debug_sigprint(arma_str::format("this = %x in_mat = %x") % this % &in_mat); if(this != &in_mat) { init_warm(in_mat.n_rows, in_mat.n_cols); arrayops::copy( memptr(), in_mat.mem, in_mat.n_elem ); } return *this; } template inline void Mat::init(const std::initializer_list& list) { arma_extra_debug_sigprint(); const uword N = uword(list.size()); set_size(1, N); arrayops::copy( memptr(), list.begin(), N ); } template inline void Mat::init(const std::initializer_list< std::initializer_list >& list) { arma_extra_debug_sigprint(); uword x_n_rows = uword(list.size()); uword x_n_cols = 0; auto it = list.begin(); auto it_end = list.end(); for(; it != it_end; ++it) { x_n_cols = (std::max)(x_n_cols, uword((*it).size())); } Mat& t = (*this); if(t.mem_state == 3) { arma_debug_check( ((x_n_rows != t.n_rows) || (x_n_cols != t.n_cols)), "Mat::init(): size mismatch between fixed size matrix and initialiser list" ); } else { t.set_size(x_n_rows, x_n_cols); } uword row_num = 0; auto row_it = list.begin(); auto row_it_end = list.end(); for(; row_it != row_it_end; ++row_it) { uword col_num = 0; auto col_it = (*row_it).begin(); auto col_it_end = (*row_it).end(); for(; col_it != col_it_end; ++col_it) { t.at(row_num, col_num) = (*col_it); ++col_num; } for(uword c=col_num; c < x_n_cols; ++c) { t.at(row_num, c) = eT(0); } ++row_num; } } //! for constructing a complex matrix out of two non-complex matrices template template inline void Mat::init ( const Base::pod_type, T1>& X, const Base::pod_type, T2>& Y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type T; arma_type_check(( is_cx::no )); //!< compile-time abort if eT is not std::complex arma_type_check(( is_cx< T>::yes )); //!< compile-time abort if T is std::complex arma_type_check(( is_same_type< std::complex, eT >::no )); //!< compile-time abort if types are not compatible const Proxy PX(X.get_ref()); const Proxy PY(Y.get_ref()); arma_debug_assert_same_size(PX, PY, "Mat()"); const uword local_n_rows = PX.get_n_rows(); const uword local_n_cols = PX.get_n_cols(); init_warm(local_n_rows, local_n_cols); eT* out_mem = (*this).memptr(); const bool use_at = ( Proxy::use_at || Proxy::use_at ); if(use_at == false) { typedef typename Proxy::ea_type ea_type1; typedef typename Proxy::ea_type ea_type2; const uword N = n_elem; ea_type1 A = PX.get_ea(); ea_type2 B = PY.get_ea(); for(uword ii=0; ii < N; ++ii) { out_mem[ii] = std::complex(A[ii], B[ii]); } } else { for(uword ucol=0; ucol < local_n_cols; ++ucol) for(uword urow=0; urow < local_n_rows; ++urow) { *out_mem = std::complex(PX.at(urow,ucol), PY.at(urow,ucol)); out_mem++; } } } //! swap the contents of this matrix, denoted as matrix A, with given matrix B template inline void Mat::swap(Mat& B) { Mat& A = (*this); arma_extra_debug_sigprint(arma_str::format("A = %x B = %x") % &A % &B); bool layout_ok = false; if(A.vec_state == B.vec_state) { layout_ok = true; } else { const uhword A_vec_state = A.vec_state; const uhword B_vec_state = B.vec_state; const bool A_absorbs_B = (A_vec_state == 0) || ( (A_vec_state == 1) && (B.n_cols == 1) ) || ( (A_vec_state == 2) && (B.n_rows == 1) ); const bool B_absorbs_A = (B_vec_state == 0) || ( (B_vec_state == 1) && (A.n_cols == 1) ) || ( (B_vec_state == 2) && (A.n_rows == 1) ); layout_ok = A_absorbs_B && B_absorbs_A; } const uhword A_mem_state = A.mem_state; const uhword B_mem_state = B.mem_state; if( (A_mem_state == 0) && (B_mem_state == 0) && layout_ok ) { const uword A_n_elem = A.n_elem; const uword B_n_elem = B.n_elem; const bool A_use_local_mem = (A.n_alloc <= arma_config::mat_prealloc); const bool B_use_local_mem = (B.n_alloc <= arma_config::mat_prealloc); if( (A_use_local_mem == false) && (B_use_local_mem == false) ) { std::swap( access::rw(A.mem), access::rw(B.mem) ); } else if( (A_use_local_mem == true) && (B_use_local_mem == true) ) { eT* A_mem_local = &(A.mem_local[0]); eT* B_mem_local = &(B.mem_local[0]); access::rw(A.mem) = A_mem_local; access::rw(B.mem) = B_mem_local; const uword N = (std::max)(A_n_elem, B_n_elem); for(uword ii=0; ii < N; ++ii) { std::swap( A_mem_local[ii], B_mem_local[ii] ); } } else if( (A_use_local_mem == true) && (B_use_local_mem == false) ) { eT* A_mem_local = &(A.mem_local[0]); eT* B_mem_local = &(B.mem_local[0]); arrayops::copy(B_mem_local, A_mem_local, A_n_elem); access::rw(A.mem) = B.mem; access::rw(B.mem) = B_mem_local; } else if( (A_use_local_mem == false) && (B_use_local_mem == true) ) { eT* A_mem_local = &(A.mem_local[0]); eT* B_mem_local = &(B.mem_local[0]); arrayops::copy(A_mem_local, B_mem_local, B_n_elem); access::rw(B.mem) = A.mem; access::rw(A.mem) = A_mem_local; } std::swap( access::rw(A.n_rows), access::rw(B.n_rows) ); std::swap( access::rw(A.n_cols), access::rw(B.n_cols) ); std::swap( access::rw(A.n_elem), access::rw(B.n_elem) ); std::swap( access::rw(A.n_alloc), access::rw(B.n_alloc) ); } else if( (A_mem_state <= 2) && (B_mem_state <= 2) && (A.n_elem == B.n_elem) && layout_ok ) { std::swap( access::rw(A.n_rows), access::rw(B.n_rows) ); std::swap( access::rw(A.n_cols), access::rw(B.n_cols) ); const uword N = A.n_elem; eT* A_mem = A.memptr(); eT* B_mem = B.memptr(); for(uword ii=0; ii < N; ++ii) { std::swap(A_mem[ii], B_mem[ii]); } } else if( (A.n_rows == B.n_rows) && (A.n_cols == B.n_cols) ) { const uword N = A.n_elem; eT* A_mem = A.memptr(); eT* B_mem = B.memptr(); for(uword ii=0; ii < N; ++ii) { std::swap(A_mem[ii], B_mem[ii]); } } else { // generic swap to handle remaining cases if(A.n_elem <= B.n_elem) { Mat C = A; A.steal_mem(B); B.steal_mem(C); } else { Mat C = B; B.steal_mem(A); A.steal_mem(C); } } } //! try to steal the memory from a given matrix; //! if memory can't be stolen, copy the given matrix template inline void Mat::steal_mem(Mat& x) { arma_extra_debug_sigprint(); if(this == &x) { return; } const uword x_n_rows = x.n_rows; const uword x_n_cols = x.n_cols; const uword x_n_elem = x.n_elem; const uword x_n_alloc = x.n_alloc; const uhword x_vec_state = x.vec_state; const uhword x_mem_state = x.mem_state; const uhword t_vec_state = vec_state; const uhword t_mem_state = mem_state; const bool layout_ok = (t_vec_state == x_vec_state) || ((t_vec_state == 1) && (x_n_cols == 1)) || ((t_vec_state == 2) && (x_n_rows == 1)); if( layout_ok && (t_mem_state <= 1) && ((x_n_alloc > arma_config::mat_prealloc) || (x_mem_state == 1)) ) { reset(); access::rw(n_rows) = x_n_rows; access::rw(n_cols) = x_n_cols; access::rw(n_elem) = x_n_elem; access::rw(n_alloc) = x_n_alloc; access::rw(mem_state) = x_mem_state; access::rw(mem) = x.mem; access::rw(x.n_rows) = 0; access::rw(x.n_cols) = 0; access::rw(x.n_elem) = 0; access::rw(x.n_alloc) = 0; access::rw(x.mem_state) = 0; access::rw(x.mem) = nullptr; } else { (*this).operator=(x); } } template inline void Mat::steal_mem_col(Mat& x, const uword max_n_rows) { arma_extra_debug_sigprint(); const uword x_n_elem = x.n_elem; const uword x_n_alloc = x.n_alloc; const uhword x_mem_state = x.mem_state; const uhword t_vec_state = vec_state; const uhword t_mem_state = mem_state; const uword alt_n_rows = (std::min)(x.n_rows, max_n_rows); if((x_n_elem == 0) || (alt_n_rows == 0)) { (*this).set_size(0,1); return; } if( (this != &x) && (t_vec_state <= 1) && (t_mem_state <= 1) && (x_mem_state <= 1) ) { if( (x_mem_state == 0) && ((x_n_alloc <= arma_config::mat_prealloc) || (alt_n_rows <= arma_config::mat_prealloc)) ) { (*this).set_size(alt_n_rows, uword(1)); arrayops::copy( (*this).memptr(), x.memptr(), alt_n_rows ); } else { reset(); access::rw(n_rows) = alt_n_rows; access::rw(n_cols) = 1; access::rw(n_elem) = alt_n_rows; access::rw(n_alloc) = x_n_alloc; access::rw(mem_state) = x_mem_state; access::rw(mem) = x.mem; access::rw(x.n_rows) = 0; access::rw(x.n_cols) = 0; access::rw(x.n_elem) = 0; access::rw(x.n_alloc) = 0; access::rw(x.mem_state) = 0; access::rw(x.mem) = nullptr; } } else { Mat tmp(alt_n_rows, 1, arma_nozeros_indicator()); arrayops::copy( tmp.memptr(), x.memptr(), alt_n_rows ); steal_mem(tmp); } } //! construct a matrix from a given auxiliary array of eTs. //! if copy_aux_mem is true, new memory is allocated and the array is copied. //! if copy_aux_mem is false, the auxiliary array is used directly (without allocating memory and copying). //! the default is to copy the array. template inline Mat::Mat(eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const bool copy_aux_mem, const bool strict) : n_rows ( aux_n_rows ) , n_cols ( aux_n_cols ) , n_elem ( aux_n_rows*aux_n_cols ) , n_alloc ( 0 ) , vec_state( 0 ) , mem_state( copy_aux_mem ? 0 : ( strict ? 2 : 1 ) ) , mem ( copy_aux_mem ? nullptr : aux_mem ) { arma_extra_debug_sigprint_this(this); if(copy_aux_mem) { init_cold(); arrayops::copy( memptr(), aux_mem, n_elem ); } } //! construct a matrix from a given auxiliary read-only array of eTs. //! the array is copied. template inline Mat::Mat(const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols) : n_rows(aux_n_rows) , n_cols(aux_n_cols) , n_elem(aux_n_rows*aux_n_cols) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); arrayops::copy( memptr(), aux_mem, n_elem ); } //! DANGEROUS! Construct a temporary matrix, using auxiliary memory. //! This constructor is NOT intended for usage by user code. //! Its sole purpose is to be used by the Cube class. template inline Mat::Mat(const char junk, const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols) : n_rows (aux_n_rows ) , n_cols (aux_n_cols ) , n_elem (aux_n_rows*aux_n_cols) , n_alloc (0 ) , vec_state(0 ) , mem_state(3 ) , mem (aux_mem ) { arma_extra_debug_sigprint_this(this); arma_ignore(junk); } //! in-place matrix addition template inline Mat& Mat::operator+=(const Mat& m) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(*this, m, "addition"); arrayops::inplace_plus( memptr(), m.memptr(), n_elem ); return *this; } //! in-place matrix subtraction template inline Mat& Mat::operator-=(const Mat& m) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(*this, m, "subtraction"); arrayops::inplace_minus( memptr(), m.memptr(), n_elem ); return *this; } //! in-place matrix multiplication template inline Mat& Mat::operator*=(const Mat& m) { arma_extra_debug_sigprint(); glue_times::apply_inplace(*this, m); return *this; } //! in-place element-wise matrix multiplication template inline Mat& Mat::operator%=(const Mat& m) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(*this, m, "element-wise multiplication"); arrayops::inplace_mul( memptr(), m.memptr(), n_elem ); return *this; } //! in-place element-wise matrix division template inline Mat& Mat::operator/=(const Mat& m) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(*this, m, "element-wise division"); arrayops::inplace_div( memptr(), m.memptr(), n_elem ); return *this; } template template inline Mat::Mat(const BaseCube& X) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); (*this).operator=(X); } template template inline Mat& Mat::operator=(const BaseCube& X) { arma_extra_debug_sigprint(); Mat& out = *this; const unwrap_cube tmp(X.get_ref()); const Cube& in = tmp.M; arma_debug_assert_cube_as_mat(out, in, "copy into matrix", false); const uword in_n_rows = in.n_rows; const uword in_n_cols = in.n_cols; const uword in_n_slices = in.n_slices; const uword out_vec_state = out.vec_state; if(in_n_slices == 1) { out.set_size(in_n_rows, in_n_cols); for(uword ucol=0; ucol < in_n_cols; ++ucol) { arrayops::copy( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows ); } } else { if(out_vec_state == 0) { if(in_n_cols == 1) { out.set_size(in_n_rows, in_n_slices); for(uword i=0; i < in_n_slices; ++i) { arrayops::copy( out.colptr(i), in.slice_colptr(i, 0), in_n_rows ); } } else if(in_n_rows == 1) { out.set_size(in_n_cols, in_n_slices); for(uword slice=0; slice < in_n_slices; ++slice) { eT* out_colptr = out.colptr(slice); uword i,j; for(i=0, j=1; j < in_n_cols; i+=2, j+=2) { const eT tmp_i = in.at(0, i, slice); const eT tmp_j = in.at(0, j, slice); out_colptr[i] = tmp_i; out_colptr[j] = tmp_j; } if(i < in_n_cols) { out_colptr[i] = in.at(0, i, slice); } } } } else { out.set_size(in_n_slices); eT* out_mem = out.memptr(); for(uword i=0; i template inline Mat& Mat::operator+=(const BaseCube& X) { arma_extra_debug_sigprint(); Mat& out = *this; const unwrap_cube tmp(X.get_ref()); const Cube& in = tmp.M; arma_debug_assert_cube_as_mat(out, in, "addition", true); const uword in_n_rows = in.n_rows; const uword in_n_cols = in.n_cols; const uword in_n_slices = in.n_slices; const uword out_n_rows = out.n_rows; const uword out_n_cols = out.n_cols; const uword out_vec_state = out.vec_state; if(in_n_slices == 1) { for(uword ucol=0; ucol < in_n_cols; ++ucol) { arrayops::inplace_plus( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows ); } } else { if(out_vec_state == 0) { if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) ) { for(uword i=0; i < in_n_slices; ++i) { arrayops::inplace_plus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows ); } } else if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) ) { for(uword slice=0; slice < in_n_slices; ++slice) { eT* out_colptr = out.colptr(slice); uword i,j; for(i=0, j=1; j < in_n_cols; i+=2, j+=2) { const eT tmp_i = in.at(0, i, slice); const eT tmp_j = in.at(0, j, slice); out_colptr[i] += tmp_i; out_colptr[j] += tmp_j; } if(i < in_n_cols) { out_colptr[i] += in.at(0, i, slice); } } } } else { eT* out_mem = out.memptr(); for(uword i=0; i template inline Mat& Mat::operator-=(const BaseCube& X) { arma_extra_debug_sigprint(); Mat& out = *this; const unwrap_cube tmp(X.get_ref()); const Cube& in = tmp.M; arma_debug_assert_cube_as_mat(out, in, "subtraction", true); const uword in_n_rows = in.n_rows; const uword in_n_cols = in.n_cols; const uword in_n_slices = in.n_slices; const uword out_n_rows = out.n_rows; const uword out_n_cols = out.n_cols; const uword out_vec_state = out.vec_state; if(in_n_slices == 1) { for(uword ucol=0; ucol < in_n_cols; ++ucol) { arrayops::inplace_minus( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows ); } } else { if(out_vec_state == 0) { if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) ) { for(uword i=0; i < in_n_slices; ++i) { arrayops::inplace_minus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows ); } } else if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) ) { for(uword slice=0; slice < in_n_slices; ++slice) { eT* out_colptr = out.colptr(slice); uword i,j; for(i=0, j=1; j < in_n_cols; i+=2, j+=2) { const eT tmp_i = in.at(0, i, slice); const eT tmp_j = in.at(0, j, slice); out_colptr[i] -= tmp_i; out_colptr[j] -= tmp_j; } if(i < in_n_cols) { out_colptr[i] -= in.at(0, i, slice); } } } } else { eT* out_mem = out.memptr(); for(uword i=0; i template inline Mat& Mat::operator*=(const BaseCube& X) { arma_extra_debug_sigprint(); const Mat B(X); (*this).operator*=(B); return *this; } template template inline Mat& Mat::operator%=(const BaseCube& X) { arma_extra_debug_sigprint(); Mat& out = *this; const unwrap_cube tmp(X.get_ref()); const Cube& in = tmp.M; arma_debug_assert_cube_as_mat(out, in, "element-wise multiplication", true); const uword in_n_rows = in.n_rows; const uword in_n_cols = in.n_cols; const uword in_n_slices = in.n_slices; const uword out_n_rows = out.n_rows; const uword out_n_cols = out.n_cols; const uword out_vec_state = out.vec_state; if(in_n_slices == 1) { for(uword ucol=0; ucol < in_n_cols; ++ucol) { arrayops::inplace_mul( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows ); } } else { if(out_vec_state == 0) { if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) ) { for(uword i=0; i < in_n_slices; ++i) { arrayops::inplace_mul( out.colptr(i), in.slice_colptr(i, 0), in_n_rows ); } } else if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) ) { for(uword slice=0; slice < in_n_slices; ++slice) { eT* out_colptr = out.colptr(slice); uword i,j; for(i=0, j=1; j < in_n_cols; i+=2, j+=2) { const eT tmp_i = in.at(0, i, slice); const eT tmp_j = in.at(0, j, slice); out_colptr[i] *= tmp_i; out_colptr[j] *= tmp_j; } if(i < in_n_cols) { out_colptr[i] *= in.at(0, i, slice); } } } } else { eT* out_mem = out.memptr(); for(uword i=0; i template inline Mat& Mat::operator/=(const BaseCube& X) { arma_extra_debug_sigprint(); Mat& out = *this; const unwrap_cube tmp(X.get_ref()); const Cube& in = tmp.M; arma_debug_assert_cube_as_mat(out, in, "element-wise division", true); const uword in_n_rows = in.n_rows; const uword in_n_cols = in.n_cols; const uword in_n_slices = in.n_slices; const uword out_n_rows = out.n_rows; const uword out_n_cols = out.n_cols; const uword out_vec_state = out.vec_state; if(in_n_slices == 1) { for(uword ucol=0; ucol < in_n_cols; ++ucol) { arrayops::inplace_div( out.colptr(ucol), in.slice_colptr(0, ucol), in_n_rows ); } } else { if(out_vec_state == 0) { if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) ) { for(uword i=0; i < in_n_slices; ++i) { arrayops::inplace_div( out.colptr(i), in.slice_colptr(i, 0), in_n_rows ); } } else if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) ) { for(uword slice=0; slice < in_n_slices; ++slice) { eT* out_colptr = out.colptr(slice); uword i,j; for(i=0, j=1; j < in_n_cols; i+=2, j+=2) { const eT tmp_i = in.at(0, i, slice); const eT tmp_j = in.at(0, j, slice); out_colptr[i] /= tmp_i; out_colptr[j] /= tmp_j; } if(i < in_n_cols) { out_colptr[i] /= in.at(0, i, slice); } } } } else { eT* out_mem = out.memptr(); for(uword i=0; i template inline Mat::Mat ( const Base::pod_type,T1>& A, const Base::pod_type,T2>& B ) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init(A,B); } template inline Mat::Mat(const subview& X, const bool use_colmem) : n_rows(X.n_rows) , n_cols(X.n_cols) , n_elem(X.n_elem) , n_alloc(0) , vec_state(0) , mem_state(use_colmem ? 3 : 0) , mem (use_colmem ? X.colptr(0) : nullptr) { arma_extra_debug_sigprint_this(this); if(use_colmem) { arma_extra_debug_print("Mat::Mat(): using existing memory in a submatrix"); } else { init_cold(); subview::extract(*this, X); } } //! construct a matrix from subview (eg. construct a matrix from a delayed submatrix operation) template inline Mat::Mat(const subview& X) : n_rows(X.n_rows) , n_cols(X.n_cols) , n_elem(X.n_elem) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); subview::extract(*this, X); } //! construct a matrix from subview (eg. construct a matrix from a delayed submatrix operation) template inline Mat& Mat::operator=(const subview& X) { arma_extra_debug_sigprint(); const bool alias = (this == &(X.m)); if(alias == false) { init_warm(X.n_rows, X.n_cols); subview::extract(*this, X); } else { Mat tmp(X); steal_mem(tmp); } return *this; } //! in-place matrix addition (using a submatrix on the right-hand-side) template inline Mat& Mat::operator+=(const subview& X) { arma_extra_debug_sigprint(); subview::plus_inplace(*this, X); return *this; } //! in-place matrix subtraction (using a submatrix on the right-hand-side) template inline Mat& Mat::operator-=(const subview& X) { arma_extra_debug_sigprint(); subview::minus_inplace(*this, X); return *this; } //! in-place matrix mutiplication (using a submatrix on the right-hand-side) template inline Mat& Mat::operator*=(const subview& X) { arma_extra_debug_sigprint(); glue_times::apply_inplace(*this, X); return *this; } //! in-place element-wise matrix mutiplication (using a submatrix on the right-hand-side) template inline Mat& Mat::operator%=(const subview& X) { arma_extra_debug_sigprint(); subview::schur_inplace(*this, X); return *this; } //! in-place element-wise matrix division (using a submatrix on the right-hand-side) template inline Mat& Mat::operator/=(const subview& X) { arma_extra_debug_sigprint(); subview::div_inplace(*this, X); return *this; } template inline Mat::Mat(const subview_row_strans& X) : n_rows(X.n_rows) , n_cols(X.n_cols) , n_elem(X.n_elem) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); X.extract(*this); } template inline Mat::Mat(const subview_row_htrans& X) : n_rows(X.n_rows) , n_cols(X.n_cols) , n_elem(X.n_elem) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); X.extract(*this); } template inline Mat::Mat(const xvec_htrans& X) : n_rows(X.n_rows) , n_cols(X.n_cols) , n_elem(X.n_elem) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); X.extract(*this); } template template inline Mat::Mat(const xtrans_mat& X) : n_rows(X.n_rows) , n_cols(X.n_cols) , n_elem(X.n_elem) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); X.extract(*this); } //! construct a matrix from a subview_cube instance template inline Mat::Mat(const subview_cube& x) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); this->operator=(x); } //! construct a matrix from a subview_cube instance template inline Mat& Mat::operator=(const subview_cube& X) { arma_extra_debug_sigprint(); subview_cube::extract(*this, X); return *this; } //! in-place matrix addition (using a single-slice subcube on the right-hand-side) template inline Mat& Mat::operator+=(const subview_cube& X) { arma_extra_debug_sigprint(); subview_cube::plus_inplace(*this, X); return *this; } //! in-place matrix subtraction (using a single-slice subcube on the right-hand-side) template inline Mat& Mat::operator-=(const subview_cube& X) { arma_extra_debug_sigprint(); subview_cube::minus_inplace(*this, X); return *this; } //! in-place matrix mutiplication (using a single-slice subcube on the right-hand-side) template inline Mat& Mat::operator*=(const subview_cube& X) { arma_extra_debug_sigprint(); const Mat tmp(X); glue_times::apply_inplace(*this, tmp); return *this; } //! in-place element-wise matrix mutiplication (using a single-slice subcube on the right-hand-side) template inline Mat& Mat::operator%=(const subview_cube& X) { arma_extra_debug_sigprint(); subview_cube::schur_inplace(*this, X); return *this; } //! in-place element-wise matrix division (using a single-slice subcube on the right-hand-side) template inline Mat& Mat::operator/=(const subview_cube& X) { arma_extra_debug_sigprint(); subview_cube::div_inplace(*this, X); return *this; } //! construct a matrix from diagview (eg. construct a matrix from a delayed diag operation) template inline Mat::Mat(const diagview& X) : n_rows(X.n_rows) , n_cols(X.n_cols) , n_elem(X.n_elem) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); diagview::extract(*this, X); } //! construct a matrix from diagview (eg. construct a matrix from a delayed diag operation) template inline Mat& Mat::operator=(const diagview& X) { arma_extra_debug_sigprint(); const bool alias = (this == &(X.m)); if(alias == false) { init_warm(X.n_rows, X.n_cols); diagview::extract(*this, X); } else { Mat tmp(X); steal_mem(tmp); } return *this; } //! in-place matrix addition (using a diagview on the right-hand-side) template inline Mat& Mat::operator+=(const diagview& X) { arma_extra_debug_sigprint(); diagview::plus_inplace(*this, X); return *this; } //! in-place matrix subtraction (using a diagview on the right-hand-side) template inline Mat& Mat::operator-=(const diagview& X) { arma_extra_debug_sigprint(); diagview::minus_inplace(*this, X); return *this; } //! in-place matrix mutiplication (using a diagview on the right-hand-side) template inline Mat& Mat::operator*=(const diagview& X) { arma_extra_debug_sigprint(); glue_times::apply_inplace(*this, X); return *this; } //! in-place element-wise matrix mutiplication (using a diagview on the right-hand-side) template inline Mat& Mat::operator%=(const diagview& X) { arma_extra_debug_sigprint(); diagview::schur_inplace(*this, X); return *this; } //! in-place element-wise matrix division (using a diagview on the right-hand-side) template inline Mat& Mat::operator/=(const diagview& X) { arma_extra_debug_sigprint(); diagview::div_inplace(*this, X); return *this; } template template inline Mat::Mat(const subview_elem1& X) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); this->operator=(X); } template template inline Mat& Mat::operator=(const subview_elem1& X) { arma_extra_debug_sigprint(); subview_elem1::extract(*this, X); return *this; } template template inline Mat& Mat::operator+=(const subview_elem1& X) { arma_extra_debug_sigprint(); subview_elem1::plus_inplace(*this, X); return *this; } template template inline Mat& Mat::operator-=(const subview_elem1& X) { arma_extra_debug_sigprint(); subview_elem1::minus_inplace(*this, X); return *this; } template template inline Mat& Mat::operator*=(const subview_elem1& X) { arma_extra_debug_sigprint(); glue_times::apply_inplace(*this, X); return *this; } template template inline Mat& Mat::operator%=(const subview_elem1& X) { arma_extra_debug_sigprint(); subview_elem1::schur_inplace(*this, X); return *this; } template template inline Mat& Mat::operator/=(const subview_elem1& X) { arma_extra_debug_sigprint(); subview_elem1::div_inplace(*this, X); return *this; } template template inline Mat::Mat(const subview_elem2& X) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); this->operator=(X); } template template inline Mat& Mat::operator=(const subview_elem2& X) { arma_extra_debug_sigprint(); subview_elem2::extract(*this, X); return *this; } template template inline Mat& Mat::operator+=(const subview_elem2& X) { arma_extra_debug_sigprint(); subview_elem2::plus_inplace(*this, X); return *this; } template template inline Mat& Mat::operator-=(const subview_elem2& X) { arma_extra_debug_sigprint(); subview_elem2::minus_inplace(*this, X); return *this; } template template inline Mat& Mat::operator*=(const subview_elem2& X) { arma_extra_debug_sigprint(); glue_times::apply_inplace(*this, X); return *this; } template template inline Mat& Mat::operator%=(const subview_elem2& X) { arma_extra_debug_sigprint(); subview_elem2::schur_inplace(*this, X); return *this; } template template inline Mat& Mat::operator/=(const subview_elem2& X) { arma_extra_debug_sigprint(); subview_elem2::div_inplace(*this, X); return *this; } template template inline Mat::Mat(const SpBase& m) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); (*this).operator=(m); } template template inline Mat& Mat::operator=(const SpBase& m) { arma_extra_debug_sigprint(); const unwrap_spmat U(m.get_ref()); const SpMat& x = U.M; const uword x_n_cols = x.n_cols; (*this).zeros(x.n_rows, x_n_cols); const eT* x_values = x.values; const uword* x_row_indices = x.row_indices; const uword* x_col_ptrs = x.col_ptrs; for(uword x_col = 0; x_col < x_n_cols; ++x_col) { const uword start = x_col_ptrs[x_col ]; const uword end = x_col_ptrs[x_col + 1]; for(uword i = start; i < end; ++i) { const uword x_row = x_row_indices[i]; const eT x_val = x_values[i]; at(x_row, x_col) = x_val; } } return *this; } template template inline Mat& Mat::operator+=(const SpBase& m) { arma_extra_debug_sigprint(); const SpProxy p(m.get_ref()); arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "addition"); typename SpProxy::const_iterator_type it = p.begin(); typename SpProxy::const_iterator_type it_end = p.end(); for(; it != it_end; ++it) { at(it.row(), it.col()) += (*it); } return *this; } template template inline Mat& Mat::operator-=(const SpBase& m) { arma_extra_debug_sigprint(); const SpProxy p(m.get_ref()); arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "subtraction"); typename SpProxy::const_iterator_type it = p.begin(); typename SpProxy::const_iterator_type it_end = p.end(); for(; it != it_end; ++it) { at(it.row(), it.col()) -= (*it); } return *this; } template template inline Mat& Mat::operator*=(const SpBase& m) { arma_extra_debug_sigprint(); Mat z = (*this) * m.get_ref(); steal_mem(z); return *this; } template template inline Mat& Mat::operator%=(const SpBase& m) { arma_extra_debug_sigprint(); const SpProxy p(m.get_ref()); arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "element-wise multiplication"); typename SpProxy::const_iterator_type it = p.begin(); typename SpProxy::const_iterator_type it_end = p.end(); // We have to zero everything that isn't being used. arrayops::inplace_set(memptr(), eT(0), (it.col() * n_rows) + it.row()); while(it != it_end) { const uword cur_loc = (it.col() * n_rows) + it.row(); access::rw(mem[cur_loc]) *= (*it); ++it; const uword next_loc = (it == it_end) ? (p.get_n_cols() * n_rows) : (it.col() * n_rows) + it.row(); arrayops::inplace_set(memptr() + cur_loc + 1, eT(0), (next_loc - cur_loc - 1)); } return *this; } template template inline Mat& Mat::operator/=(const SpBase& m) { arma_extra_debug_sigprint(); // NOTE: use of this function is not advised; it is implemented only for completeness const SpProxy p(m.get_ref()); arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "element-wise division"); for(uword c = 0; c < n_cols; ++c) for(uword r = 0; r < n_rows; ++r) { at(r, c) /= p.at(r, c); } return *this; } template inline Mat::Mat(const SpSubview& X) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); (*this).operator=(X); } template inline Mat& Mat::operator=(const SpSubview& X) { arma_extra_debug_sigprint(); (*this).zeros(X.n_rows, X.n_cols); if(X.n_rows == X.m.n_rows) { const uword sv_col_start = X.aux_col1; const uword sv_col_end = X.aux_col1 + X.n_cols - 1; const eT* m_values = X.m.values; const uword* m_row_indices = X.m.row_indices; const uword* m_col_ptrs = X.m.col_ptrs; for(uword m_col = sv_col_start; m_col <= sv_col_end; ++m_col) { const uword m_col_adjusted = m_col - sv_col_start; const uword start = m_col_ptrs[m_col ]; const uword end = m_col_ptrs[m_col + 1]; for(uword ii = start; ii < end; ++ii) { const uword m_row = m_row_indices[ii]; const eT m_val = m_values[ii]; at(m_row, m_col_adjusted) = m_val; } } } else { typename SpSubview::const_iterator it = X.begin(); typename SpSubview::const_iterator it_end = X.end(); for(; it != it_end; ++it) { at(it.row(), it.col()) = (*it); } } return *this; } template inline Mat::Mat(const spdiagview& X) : n_rows(X.n_rows) , n_cols(X.n_cols) , n_elem(X.n_elem) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); init_cold(); spdiagview::extract(*this, X); } template inline Mat& Mat::operator=(const spdiagview& X) { arma_extra_debug_sigprint(); init_warm(X.n_rows, X.n_cols); spdiagview::extract(*this, X); return *this; } template inline Mat& Mat::operator+=(const spdiagview& X) { arma_extra_debug_sigprint(); const Mat tmp(X); (*this).operator+=(tmp); return *this; } template inline Mat& Mat::operator-=(const spdiagview& X) { arma_extra_debug_sigprint(); const Mat tmp(X); (*this).operator-=(tmp); return *this; } template inline Mat& Mat::operator*=(const spdiagview& X) { arma_extra_debug_sigprint(); const Mat tmp(X); (*this).operator*=(tmp); return *this; } template inline Mat& Mat::operator%=(const spdiagview& X) { arma_extra_debug_sigprint(); const Mat tmp(X); (*this).operator%=(tmp); return *this; } template inline Mat& Mat::operator/=(const spdiagview& X) { arma_extra_debug_sigprint(); const Mat tmp(X); (*this).operator/=(tmp); return *this; } template arma_cold inline mat_injector< Mat > Mat::operator<<(const eT val) { return mat_injector< Mat >(*this, val); } template arma_cold inline mat_injector< Mat > Mat::operator<<(const injector_end_of_row<>& x) { return mat_injector< Mat >(*this, x); } //! creation of subview (row vector) template arma_inline subview_row Mat::row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( row_num >= n_rows, "Mat::row(): index out of bounds" ); return subview_row(*this, row_num); } //! creation of subview (row vector) template arma_inline const subview_row Mat::row(const uword row_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( row_num >= n_rows, "Mat::row(): index out of bounds" ); return subview_row(*this, row_num); } template inline subview_row Mat::operator()(const uword row_num, const span& col_span) { arma_extra_debug_sigprint(); const bool col_all = col_span.whole; const uword local_n_cols = n_cols; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds ( (row_num >= n_rows) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "Mat::operator(): indices out of bounds or incorrectly used" ); return subview_row(*this, row_num, in_col1, submat_n_cols); } template inline const subview_row Mat::operator()(const uword row_num, const span& col_span) const { arma_extra_debug_sigprint(); const bool col_all = col_span.whole; const uword local_n_cols = n_cols; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds ( (row_num >= n_rows) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "Mat::operator(): indices out of bounds or incorrectly used" ); return subview_row(*this, row_num, in_col1, submat_n_cols); } //! creation of subview (column vector) template arma_inline subview_col Mat::col(const uword col_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( col_num >= n_cols, "Mat::col(): index out of bounds" ); return subview_col(*this, col_num); } //! creation of subview (column vector) template arma_inline const subview_col Mat::col(const uword col_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( col_num >= n_cols, "Mat::col(): index out of bounds" ); return subview_col(*this, col_num); } template inline subview_col Mat::operator()(const span& row_span, const uword col_num) { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const uword local_n_rows = n_rows; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; arma_debug_check_bounds ( (col_num >= n_cols) || ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) , "Mat::operator(): indices out of bounds or incorrectly used" ); return subview_col(*this, col_num, in_row1, submat_n_rows); } template inline const subview_col Mat::operator()(const span& row_span, const uword col_num) const { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const uword local_n_rows = n_rows; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; arma_debug_check_bounds ( (col_num >= n_cols) || ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) , "Mat::operator(): indices out of bounds or incorrectly used" ); return subview_col(*this, col_num, in_row1, submat_n_rows); } //! create a Col object which uses memory from an existing matrix object. //! this approach is currently not alias safe //! and does not take into account that the parent matrix object could be deleted. //! if deleted memory is accessed by the created Col object, //! it will cause memory corruption and/or a crash template inline Col Mat::unsafe_col(const uword col_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( col_num >= n_cols, "Mat::unsafe_col(): index out of bounds" ); return Col(colptr(col_num), n_rows, false, true); } //! create a Col object which uses memory from an existing matrix object. //! this approach is currently not alias safe //! and does not take into account that the parent matrix object could be deleted. //! if deleted memory is accessed by the created Col object, //! it will cause memory corruption and/or a crash template inline const Col Mat::unsafe_col(const uword col_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( col_num >= n_cols, "Mat::unsafe_col(): index out of bounds" ); typedef const Col out_type; return out_type(const_cast(colptr(col_num)), n_rows, false, true); } //! creation of subview (submatrix comprised of specified row vectors) template arma_inline subview Mat::rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_row2 >= n_rows), "Mat::rows(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; return subview(*this, in_row1, 0, subview_n_rows, n_cols ); } //! creation of subview (submatrix comprised of specified row vectors) template arma_inline const subview Mat::rows(const uword in_row1, const uword in_row2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_row2 >= n_rows), "Mat::rows(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; return subview(*this, in_row1, 0, subview_n_rows, n_cols ); } //! creation of subview (submatrix comprised of specified column vectors) template arma_inline subview_cols Mat::cols(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_col1 > in_col2) || (in_col2 >= n_cols), "Mat::cols(): indices out of bounds or incorrectly used" ); const uword subview_n_cols = in_col2 - in_col1 + 1; return subview_cols(*this, in_col1, subview_n_cols); } //! creation of subview (submatrix comprised of specified column vectors) template arma_inline const subview_cols Mat::cols(const uword in_col1, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_col1 > in_col2) || (in_col2 >= n_cols), "Mat::cols(): indices out of bounds or incorrectly used" ); const uword subview_n_cols = in_col2 - in_col1 + 1; return subview_cols(*this, in_col1, subview_n_cols); } //! creation of subview (submatrix comprised of specified row vectors) template inline subview Mat::rows(const span& row_span) { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const uword local_n_rows = n_rows; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) , "Mat::rows(): indices out of bounds or incorrectly used" ); return subview(*this, in_row1, 0, submat_n_rows, n_cols); } //! creation of subview (submatrix comprised of specified row vectors) template inline const subview Mat::rows(const span& row_span) const { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const uword local_n_rows = n_rows; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) , "Mat::rows(): indices out of bounds or incorrectly used" ); return subview(*this, in_row1, 0, submat_n_rows, n_cols); } //! creation of subview (submatrix comprised of specified column vectors) template arma_inline subview_cols Mat::cols(const span& col_span) { arma_extra_debug_sigprint(); const bool col_all = col_span.whole; const uword local_n_cols = n_cols; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds ( ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "Mat::cols(): indices out of bounds or incorrectly used" ); return subview_cols(*this, in_col1, submat_n_cols); } //! creation of subview (submatrix comprised of specified column vectors) template arma_inline const subview_cols Mat::cols(const span& col_span) const { arma_extra_debug_sigprint(); const bool col_all = col_span.whole; const uword local_n_cols = n_cols; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds ( ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "Mat::cols(): indices out of bounds or incorrectly used" ); return subview_cols(*this, in_col1, submat_n_cols); } //! creation of subview (submatrix) template arma_inline subview Mat::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols), "Mat::submat(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; const uword subview_n_cols = in_col2 - in_col1 + 1; return subview(*this, in_row1, in_col1, subview_n_rows, subview_n_cols); } //! creation of subview (generic submatrix) template arma_inline const subview Mat::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols), "Mat::submat(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; const uword subview_n_cols = in_col2 - in_col1 + 1; return subview(*this, in_row1, in_col1, subview_n_rows, subview_n_cols); } //! creation of subview (submatrix) template arma_inline subview Mat::submat(const uword in_row1, const uword in_col1, const SizeMat& s) { arma_extra_debug_sigprint(); const uword l_n_rows = n_rows; const uword l_n_cols = n_cols; const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; arma_debug_check_bounds ( ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols)), "Mat::submat(): indices or size out of bounds" ); return subview(*this, in_row1, in_col1, s_n_rows, s_n_cols); } //! creation of subview (submatrix) template arma_inline const subview Mat::submat(const uword in_row1, const uword in_col1, const SizeMat& s) const { arma_extra_debug_sigprint(); const uword l_n_rows = n_rows; const uword l_n_cols = n_cols; const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; arma_debug_check_bounds ( ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols)), "Mat::submat(): indices or size out of bounds" ); return subview(*this, in_row1, in_col1, s_n_rows, s_n_cols); } //! creation of subview (submatrix) template inline subview Mat::submat(const span& row_span, const span& col_span) { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const bool col_all = col_span.whole; const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "Mat::submat(): indices out of bounds or incorrectly used" ); return subview(*this, in_row1, in_col1, submat_n_rows, submat_n_cols); } //! creation of subview (generic submatrix) template inline const subview Mat::submat(const span& row_span, const span& col_span) const { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const bool col_all = col_span.whole; const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "Mat::submat(): indices out of bounds or incorrectly used" ); return subview(*this, in_row1, in_col1, submat_n_rows, submat_n_cols); } template inline subview Mat::operator()(const span& row_span, const span& col_span) { arma_extra_debug_sigprint(); return (*this).submat(row_span, col_span); } template inline const subview Mat::operator()(const span& row_span, const span& col_span) const { arma_extra_debug_sigprint(); return (*this).submat(row_span, col_span); } template inline subview Mat::operator()(const uword in_row1, const uword in_col1, const SizeMat& s) { arma_extra_debug_sigprint(); return (*this).submat(in_row1, in_col1, s); } template inline const subview Mat::operator()(const uword in_row1, const uword in_col1, const SizeMat& s) const { arma_extra_debug_sigprint(); return (*this).submat(in_row1, in_col1, s); } template inline subview Mat::head_rows(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_rows), "Mat::head_rows(): size out of bounds" ); return subview(*this, 0, 0, N, n_cols); } template inline const subview Mat::head_rows(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_rows), "Mat::head_rows(): size out of bounds" ); return subview(*this, 0, 0, N, n_cols); } template inline subview Mat::tail_rows(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_rows), "Mat::tail_rows(): size out of bounds" ); const uword start_row = n_rows - N; return subview(*this, start_row, 0, N, n_cols); } template inline const subview Mat::tail_rows(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_rows), "Mat::tail_rows(): size out of bounds" ); const uword start_row = n_rows - N; return subview(*this, start_row, 0, N, n_cols); } template inline subview_cols Mat::head_cols(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_cols), "Mat::head_cols(): size out of bounds" ); return subview_cols(*this, 0, N); } template inline const subview_cols Mat::head_cols(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_cols), "Mat::head_cols(): size out of bounds" ); return subview_cols(*this, 0, N); } template inline subview_cols Mat::tail_cols(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_cols), "Mat::tail_cols(): size out of bounds" ); const uword start_col = n_cols - N; return subview_cols(*this, start_col, N); } template inline const subview_cols Mat::tail_cols(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_cols), "Mat::tail_cols(): size out of bounds" ); const uword start_col = n_cols - N; return subview_cols(*this, start_col, N); } template template arma_inline subview_elem1 Mat::elem(const Base& a) { arma_extra_debug_sigprint(); return subview_elem1(*this, a); } template template arma_inline const subview_elem1 Mat::elem(const Base& a) const { arma_extra_debug_sigprint(); return subview_elem1(*this, a); } template template arma_inline subview_elem1 Mat::operator()(const Base& a) { arma_extra_debug_sigprint(); return subview_elem1(*this, a); } template template arma_inline const subview_elem1 Mat::operator()(const Base& a) const { arma_extra_debug_sigprint(); return subview_elem1(*this, a); } template template arma_inline subview_elem2 Mat::elem(const Base& ri, const Base& ci) { arma_extra_debug_sigprint(); return subview_elem2(*this, ri, ci, false, false); } template template arma_inline const subview_elem2 Mat::elem(const Base& ri, const Base& ci) const { arma_extra_debug_sigprint(); return subview_elem2(*this, ri, ci, false, false); } template template arma_inline subview_elem2 Mat::submat(const Base& ri, const Base& ci) { arma_extra_debug_sigprint(); return subview_elem2(*this, ri, ci, false, false); } template template arma_inline const subview_elem2 Mat::submat(const Base& ri, const Base& ci) const { arma_extra_debug_sigprint(); return subview_elem2(*this, ri, ci, false, false); } template template arma_inline subview_elem2 Mat::operator()(const Base& ri, const Base& ci) { arma_extra_debug_sigprint(); return subview_elem2(*this, ri, ci, false, false); } template template arma_inline const subview_elem2 Mat::operator()(const Base& ri, const Base& ci) const { arma_extra_debug_sigprint(); return subview_elem2(*this, ri, ci, false, false); } template template arma_inline subview_elem2 Mat::rows(const Base& ri) { arma_extra_debug_sigprint(); return subview_elem2(*this, ri, ri, false, true); } template template arma_inline const subview_elem2 Mat::rows(const Base& ri) const { arma_extra_debug_sigprint(); return subview_elem2(*this, ri, ri, false, true); } template template arma_inline subview_elem2 Mat::cols(const Base& ci) { arma_extra_debug_sigprint(); return subview_elem2(*this, ci, ci, true, false); } template template arma_inline const subview_elem2 Mat::cols(const Base& ci) const { arma_extra_debug_sigprint(); return subview_elem2(*this, ci, ci, true, false); } template arma_inline subview_each1< Mat, 0 > Mat::each_col() { arma_extra_debug_sigprint(); return subview_each1< Mat, 0>(*this); } template arma_inline subview_each1< Mat, 1 > Mat::each_row() { arma_extra_debug_sigprint(); return subview_each1< Mat, 1>(*this); } template arma_inline const subview_each1< Mat, 0 > Mat::each_col() const { arma_extra_debug_sigprint(); return subview_each1< Mat, 0>(*this); } template arma_inline const subview_each1< Mat, 1 > Mat::each_row() const { arma_extra_debug_sigprint(); return subview_each1< Mat, 1>(*this); } template template inline subview_each2< Mat, 0, T1 > Mat::each_col(const Base& indices) { arma_extra_debug_sigprint(); return subview_each2< Mat, 0, T1 >(*this, indices); } template template inline subview_each2< Mat, 1, T1 > Mat::each_row(const Base& indices) { arma_extra_debug_sigprint(); return subview_each2< Mat, 1, T1 >(*this, indices); } template template inline const subview_each2< Mat, 0, T1 > Mat::each_col(const Base& indices) const { arma_extra_debug_sigprint(); return subview_each2< Mat, 0, T1 >(*this, indices); } template template inline const subview_each2< Mat, 1, T1 > Mat::each_row(const Base& indices) const { arma_extra_debug_sigprint(); return subview_each2< Mat, 1, T1 >(*this, indices); } //! apply a lambda function to each column, where each column is interpreted as a column vector template inline const Mat& Mat::each_col(const std::function< void(Col&) >& F) { arma_extra_debug_sigprint(); for(uword ii=0; ii < n_cols; ++ii) { Col tmp(colptr(ii), n_rows, false, true); F(tmp); } return *this; } template inline const Mat& Mat::each_col(const std::function< void(const Col&) >& F) const { arma_extra_debug_sigprint(); for(uword ii=0; ii < n_cols; ++ii) { const Col tmp(const_cast(colptr(ii)), n_rows, false, true); F(tmp); } return *this; } //! apply a lambda function to each row, where each row is interpreted as a row vector template inline const Mat& Mat::each_row(const std::function< void(Row&) >& F) { arma_extra_debug_sigprint(); podarray array1(n_cols); podarray array2(n_cols); Row tmp1( array1.memptr(), n_cols, false, true ); Row tmp2( array2.memptr(), n_cols, false, true ); eT* tmp1_mem = tmp1.memptr(); eT* tmp2_mem = tmp2.memptr(); uword ii, jj; for(ii=0, jj=1; jj < n_rows; ii+=2, jj+=2) { for(uword col_id = 0; col_id < n_cols; ++col_id) { const eT* col_mem = colptr(col_id); tmp1_mem[col_id] = col_mem[ii]; tmp2_mem[col_id] = col_mem[jj]; } F(tmp1); F(tmp2); for(uword col_id = 0; col_id < n_cols; ++col_id) { eT* col_mem = colptr(col_id); col_mem[ii] = tmp1_mem[col_id]; col_mem[jj] = tmp2_mem[col_id]; } } if(ii < n_rows) { tmp1 = (*this).row(ii); F(tmp1); (*this).row(ii) = tmp1; } return *this; } template inline const Mat& Mat::each_row(const std::function< void(const Row&) >& F) const { arma_extra_debug_sigprint(); podarray array1(n_cols); podarray array2(n_cols); Row tmp1( array1.memptr(), n_cols, false, true ); Row tmp2( array2.memptr(), n_cols, false, true ); eT* tmp1_mem = tmp1.memptr(); eT* tmp2_mem = tmp2.memptr(); uword ii, jj; for(ii=0, jj=1; jj < n_rows; ii+=2, jj+=2) { for(uword col_id = 0; col_id < n_cols; ++col_id) { const eT* col_mem = colptr(col_id); tmp1_mem[col_id] = col_mem[ii]; tmp2_mem[col_id] = col_mem[jj]; } F(tmp1); F(tmp2); } if(ii < n_rows) { tmp1 = (*this).row(ii); F(tmp1); } return *this; } //! creation of diagview (diagonal) template arma_inline diagview Mat::diag(const sword in_id) { arma_extra_debug_sigprint(); const uword row_offset = (in_id < 0) ? uword(-in_id) : 0; const uword col_offset = (in_id > 0) ? uword( in_id) : 0; arma_debug_check_bounds ( ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)), "Mat::diag(): requested diagonal out of bounds" ); const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset); return diagview(*this, row_offset, col_offset, len); } //! creation of diagview (diagonal) template arma_inline const diagview Mat::diag(const sword in_id) const { arma_extra_debug_sigprint(); const uword row_offset = uword( (in_id < 0) ? -in_id : 0 ); const uword col_offset = uword( (in_id > 0) ? in_id : 0 ); arma_debug_check_bounds ( ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)), "Mat::diag(): requested diagonal out of bounds" ); const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset); return diagview(*this, row_offset, col_offset, len); } template inline void Mat::swap_rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; arma_debug_check_bounds ( (in_row1 >= local_n_rows) || (in_row2 >= local_n_rows), "Mat::swap_rows(): index out of bounds" ); if(n_elem > 0) { for(uword ucol=0; ucol < local_n_cols; ++ucol) { const uword offset = ucol * local_n_rows; const uword pos1 = in_row1 + offset; const uword pos2 = in_row2 + offset; std::swap( access::rw(mem[pos1]), access::rw(mem[pos2]) ); } } } template inline void Mat::swap_cols(const uword in_colA, const uword in_colB) { arma_extra_debug_sigprint(); const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; arma_debug_check_bounds ( (in_colA >= local_n_cols) || (in_colB >= local_n_cols), "Mat::swap_cols(): index out of bounds" ); if(n_elem > 0) { eT* ptrA = colptr(in_colA); eT* ptrB = colptr(in_colB); eT tmp_i; eT tmp_j; uword iq,jq; for(iq=0, jq=1; jq < local_n_rows; iq+=2, jq+=2) { tmp_i = ptrA[iq]; tmp_j = ptrA[jq]; ptrA[iq] = ptrB[iq]; ptrA[jq] = ptrB[jq]; ptrB[iq] = tmp_i; ptrB[jq] = tmp_j; } if(iq < local_n_rows) { std::swap( ptrA[iq], ptrB[iq] ); } } } //! remove specified row template inline void Mat::shed_row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( row_num >= n_rows, "Mat::shed_row(): index out of bounds" ); shed_rows(row_num, row_num); } //! remove specified column template inline void Mat::shed_col(const uword col_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( col_num >= n_cols, "Mat::shed_col(): index out of bounds" ); shed_cols(col_num, col_num); } //! remove specified rows template inline void Mat::shed_rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_row2 >= n_rows), "Mat::shed_rows(): indices out of bounds or incorrectly used" ); const uword n_keep_front = in_row1; const uword n_keep_back = n_rows - (in_row2 + 1); Mat X(n_keep_front + n_keep_back, n_cols, arma_nozeros_indicator()); if(n_keep_front > 0) { X.rows( 0, (n_keep_front-1) ) = rows( 0, (in_row1-1) ); } if(n_keep_back > 0) { X.rows( n_keep_front, (n_keep_front+n_keep_back-1) ) = rows( (in_row2+1), (n_rows-1) ); } steal_mem(X); } //! remove specified columns template inline void Mat::shed_cols(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_col1 > in_col2) || (in_col2 >= n_cols), "Mat::shed_cols(): indices out of bounds or incorrectly used" ); const uword n_keep_front = in_col1; const uword n_keep_back = n_cols - (in_col2 + 1); Mat X(n_rows, n_keep_front + n_keep_back, arma_nozeros_indicator()); if(n_keep_front > 0) { X.cols( 0, (n_keep_front-1) ) = cols( 0, (in_col1-1) ); } if(n_keep_back > 0) { X.cols( n_keep_front, (n_keep_front+n_keep_back-1) ) = cols( (in_col2+1), (n_cols-1) ); } steal_mem(X); } //! remove specified rows template template inline void Mat::shed_rows(const Base& indices) { arma_extra_debug_sigprint(); const unwrap_check_mixed U(indices.get_ref(), *this); const Mat& tmp1 = U.M; arma_debug_check( ((tmp1.is_vec() == false) && (tmp1.is_empty() == false)), "Mat::shed_rows(): list of indices must be a vector" ); if(tmp1.is_empty()) { return; } const Col tmp2(const_cast(tmp1.memptr()), tmp1.n_elem, false, false); const Col& rows_to_shed = (tmp2.is_sorted("strictascend") == false) ? Col(unique(tmp2)) : Col(const_cast(tmp2.memptr()), tmp2.n_elem, false, false); const uword* rows_to_shed_mem = rows_to_shed.memptr(); const uword N = rows_to_shed.n_elem; if(arma_config::debug) { for(uword i=0; i= n_rows), "Mat::shed_rows(): indices out of bounds" ); } } Col tmp3(n_rows, arma_nozeros_indicator()); uword* tmp3_mem = tmp3.memptr(); uword i = 0; uword count = 0; for(uword j=0; j < n_rows; ++j) { if(i < N) { if( j != rows_to_shed_mem[i] ) { tmp3_mem[count] = j; ++count; } else { ++i; } } else { tmp3_mem[count] = j; ++count; } } const Col rows_to_keep(tmp3.memptr(), count, false, false); Mat X = (*this).rows(rows_to_keep); steal_mem(X); } //! remove specified columns template template inline void Mat::shed_cols(const Base& indices) { arma_extra_debug_sigprint(); const unwrap_check_mixed U(indices.get_ref(), *this); const Mat& tmp1 = U.M; arma_debug_check( ((tmp1.is_vec() == false) && (tmp1.is_empty() == false)), "Mat::shed_cols(): list of indices must be a vector" ); if(tmp1.is_empty()) { return; } const Col tmp2(const_cast(tmp1.memptr()), tmp1.n_elem, false, false); const Col& cols_to_shed = (tmp2.is_sorted("strictascend") == false) ? Col(unique(tmp2)) : Col(const_cast(tmp2.memptr()), tmp2.n_elem, false, false); const uword* cols_to_shed_mem = cols_to_shed.memptr(); const uword N = cols_to_shed.n_elem; if(arma_config::debug) { for(uword i=0; i= n_cols), "Mat::shed_cols(): indices out of bounds" ); } } Col tmp3(n_cols, arma_nozeros_indicator()); uword* tmp3_mem = tmp3.memptr(); uword i = 0; uword count = 0; for(uword j=0; j < n_cols; ++j) { if(i < N) { if( j != cols_to_shed_mem[i] ) { tmp3_mem[count] = j; ++count; } else { ++i; } } else { tmp3_mem[count] = j; ++count; } } const Col cols_to_keep(tmp3.memptr(), count, false, false); Mat X = (*this).cols(cols_to_keep); steal_mem(X); } //! insert N rows at the specified row position, //! optionally setting the elements of the inserted rows to zero template inline void Mat::insert_rows(const uword row_num, const uword N, const bool set_to_zero) { arma_extra_debug_sigprint(); const uword t_n_rows = n_rows; const uword t_n_cols = n_cols; const uword A_n_rows = row_num; const uword B_n_rows = t_n_rows - row_num; // insertion at row_num == n_rows is in effect an append operation arma_debug_check_bounds( (row_num > t_n_rows), "Mat::insert_rows(): index out of bounds" ); if(N > 0) { Mat out(t_n_rows + N, t_n_cols, arma_nozeros_indicator()); if(A_n_rows > 0) { out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1); } if(B_n_rows > 0) { out.rows(row_num + N, t_n_rows + N - 1) = rows(row_num, t_n_rows-1); } if(set_to_zero) { out.rows(row_num, row_num + N - 1).zeros(); } steal_mem(out); } } //! insert N columns at the specified column position, //! optionally setting the elements of the inserted columns to zero template inline void Mat::insert_cols(const uword col_num, const uword N, const bool set_to_zero) { arma_extra_debug_sigprint(); const uword t_n_rows = n_rows; const uword t_n_cols = n_cols; const uword A_n_cols = col_num; const uword B_n_cols = t_n_cols - col_num; // insertion at col_num == n_cols is in effect an append operation arma_debug_check_bounds( (col_num > t_n_cols), "Mat::insert_cols(): index out of bounds" ); if(N > 0) { Mat out(t_n_rows, t_n_cols + N, arma_nozeros_indicator()); if(A_n_cols > 0) { out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1); } if(B_n_cols > 0) { out.cols(col_num + N, t_n_cols + N - 1) = cols(col_num, t_n_cols-1); } if(set_to_zero) { out.cols(col_num, col_num + N - 1).zeros(); } steal_mem(out); } } //! insert the given object at the specified row position; //! the given object must have the same number of columns as the matrix template template inline void Mat::insert_rows(const uword row_num, const Base& X) { arma_extra_debug_sigprint(); const unwrap tmp(X.get_ref()); const Mat& C = tmp.M; const uword C_n_rows = C.n_rows; const uword C_n_cols = C.n_cols; const uword t_n_rows = n_rows; const uword t_n_cols = n_cols; const uword A_n_rows = row_num; const uword B_n_rows = t_n_rows - row_num; bool err_state = false; char* err_msg = nullptr; // insertion at row_num == n_rows is in effect an append operation arma_debug_set_error ( err_state, err_msg, (row_num > t_n_rows), "Mat::insert_rows(): index out of bounds" ); arma_debug_set_error ( err_state, err_msg, ( (C_n_cols != t_n_cols) && ( (t_n_rows > 0) || (t_n_cols > 0) ) && ( (C_n_rows > 0) || (C_n_cols > 0) ) ), "Mat::insert_rows(): given object has an incompatible number of columns" ); arma_debug_check_bounds(err_state, err_msg); if(C_n_rows > 0) { Mat out( t_n_rows + C_n_rows, (std::max)(t_n_cols, C_n_cols), arma_nozeros_indicator() ); if(t_n_cols > 0) { if(A_n_rows > 0) { out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1); } if( (t_n_cols > 0) && (B_n_rows > 0) ) { out.rows(row_num + C_n_rows, t_n_rows + C_n_rows - 1) = rows(row_num, t_n_rows - 1); } } if(C_n_cols > 0) { out.rows(row_num, row_num + C_n_rows - 1) = C; } steal_mem(out); } } //! insert the given object at the specified column position; //! the given object must have the same number of rows as the matrix template template inline void Mat::insert_cols(const uword col_num, const Base& X) { arma_extra_debug_sigprint(); const unwrap tmp(X.get_ref()); const Mat& C = tmp.M; const uword C_n_rows = C.n_rows; const uword C_n_cols = C.n_cols; const uword t_n_rows = n_rows; const uword t_n_cols = n_cols; const uword A_n_cols = col_num; const uword B_n_cols = t_n_cols - col_num; bool err_state = false; char* err_msg = nullptr; // insertion at col_num == n_cols is in effect an append operation arma_debug_set_error ( err_state, err_msg, (col_num > t_n_cols), "Mat::insert_cols(): index out of bounds" ); arma_debug_set_error ( err_state, err_msg, ( (C_n_rows != t_n_rows) && ( (t_n_rows > 0) || (t_n_cols > 0) ) && ( (C_n_rows > 0) || (C_n_cols > 0) ) ), "Mat::insert_cols(): given object has an incompatible number of rows" ); arma_debug_check_bounds(err_state, err_msg); if(C_n_cols > 0) { Mat out( (std::max)(t_n_rows, C_n_rows), t_n_cols + C_n_cols, arma_nozeros_indicator() ); if(t_n_rows > 0) { if(A_n_cols > 0) { out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1); } if(B_n_cols > 0) { out.cols(col_num + C_n_cols, t_n_cols + C_n_cols - 1) = cols(col_num, t_n_cols - 1); } } if(C_n_rows > 0) { out.cols(col_num, col_num + C_n_cols - 1) = C; } steal_mem(out); } } template template inline Mat::Mat(const Gen& X) : n_rows(X.n_rows) , n_cols(X.n_cols) , n_elem(n_rows*n_cols) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); init_cold(); X.apply(*this); } template template inline Mat& Mat::operator=(const Gen& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); init_warm(X.n_rows, X.n_cols); X.apply(*this); return *this; } template template inline Mat& Mat::operator+=(const Gen& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); X.apply_inplace_plus(*this); return *this; } template template inline Mat& Mat::operator-=(const Gen& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); X.apply_inplace_minus(*this); return *this; } template template inline Mat& Mat::operator*=(const Gen& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const Mat tmp(X); return (*this).operator*=(tmp); } template template inline Mat& Mat::operator%=(const Gen& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); X.apply_inplace_schur(*this); return *this; } template template inline Mat& Mat::operator/=(const Gen& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); X.apply_inplace_div(*this); return *this; } //! create a matrix from Op, ie. run the previously delayed unary operations template template inline Mat::Mat(const Op& X) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); op_type::apply(*this, X); } //! create a matrix from Op, ie. run the previously delayed unary operations template template inline Mat& Mat::operator=(const Op& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); op_type::apply(*this, X); return *this; } //! in-place matrix addition, with the right-hand-side operand having delayed operations template template inline Mat& Mat::operator+=(const Op& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const Mat m(X); return (*this).operator+=(m); } //! in-place matrix subtraction, with the right-hand-side operand having delayed operations template template inline Mat& Mat::operator-=(const Op& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const Mat m(X); return (*this).operator-=(m); } //! in-place matrix multiplication, with the right-hand-side operand having delayed operations template template inline Mat& Mat::operator*=(const Op& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); glue_times::apply_inplace(*this, X); return *this; } //! in-place matrix element-wise multiplication, with the right-hand-side operand having delayed operations template template inline Mat& Mat::operator%=(const Op& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const Mat m(X); return (*this).operator%=(m); } //! in-place matrix element-wise division, with the right-hand-side operand having delayed operations template template inline Mat& Mat::operator/=(const Op& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const Mat m(X); return (*this).operator/=(m); } //! create a matrix from eOp, ie. run the previously delayed unary operations template template inline Mat::Mat(const eOp& X) : n_rows(X.get_n_rows()) , n_cols(X.get_n_cols()) , n_elem(X.get_n_elem()) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); init_cold(); eop_type::apply(*this, X); } //! create a matrix from eOp, ie. run the previously delayed unary operations template template inline Mat& Mat::operator=(const eOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const bool bad_alias = (eOp::proxy_type::has_subview && X.P.is_alias(*this)); if(bad_alias == false) { init_warm(X.get_n_rows(), X.get_n_cols()); eop_type::apply(*this, X); } else { arma_extra_debug_print("bad_alias = true"); Mat tmp(X); steal_mem(tmp); } return *this; } template template inline Mat& Mat::operator+=(const eOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); eop_type::apply_inplace_plus(*this, X); return *this; } template template inline Mat& Mat::operator-=(const eOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); eop_type::apply_inplace_minus(*this, X); return *this; } template template inline Mat& Mat::operator*=(const eOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); glue_times::apply_inplace(*this, X); return *this; } template template inline Mat& Mat::operator%=(const eOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); eop_type::apply_inplace_schur(*this, X); return *this; } template template inline Mat& Mat::operator/=(const eOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); eop_type::apply_inplace_div(*this, X); return *this; } template template inline Mat::Mat(const mtOp& X) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); op_type::apply(*this, X); } template template inline Mat& Mat::operator=(const mtOp& X) { arma_extra_debug_sigprint(); op_type::apply(*this, X); return *this; } template template inline Mat& Mat::operator+=(const mtOp& X) { arma_extra_debug_sigprint(); const Mat m(X); return (*this).operator+=(m); } template template inline Mat& Mat::operator-=(const mtOp& X) { arma_extra_debug_sigprint(); const Mat m(X); return (*this).operator-=(m); } template template inline Mat& Mat::operator*=(const mtOp& X) { arma_extra_debug_sigprint(); const Mat m(X); return (*this).operator*=(m); } template template inline Mat& Mat::operator%=(const mtOp& X) { arma_extra_debug_sigprint(); const Mat m(X); return (*this).operator%=(m); } template template inline Mat& Mat::operator/=(const mtOp& X) { arma_extra_debug_sigprint(); const Mat m(X); return (*this).operator/=(m); } template template inline Mat::Mat(const CubeToMatOp& X) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); op_type::apply(*this, X); } template template inline Mat& Mat::operator=(const CubeToMatOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); op_type::apply(*this, X); return *this; } template template inline Mat& Mat::operator+=(const CubeToMatOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); (*this) = (*this) + X; return (*this); } template template inline Mat& Mat::operator-=(const CubeToMatOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); (*this) = (*this) - X; return (*this); } template template inline Mat& Mat::operator*=(const CubeToMatOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); glue_times::apply_inplace(*this, X); return *this; } template template inline Mat& Mat::operator%=(const CubeToMatOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); (*this) = (*this) % X; return (*this); } template template inline Mat& Mat::operator/=(const CubeToMatOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); (*this) = (*this) / X; return (*this); } template template inline Mat::Mat(const SpToDOp& X) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); op_type::apply(*this, X); } //! create a matrix from an SpToDOp, ie. run the previously delayed unary operations template template inline Mat& Mat::operator=(const SpToDOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); op_type::apply(*this, X); return *this; } //! in-place matrix addition, with the right-hand-side operand having delayed operations template template inline Mat& Mat::operator+=(const SpToDOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const Mat m(X); return (*this).operator+=(m); } //! in-place matrix subtraction, with the right-hand-side operand having delayed operations template template inline Mat& Mat::operator-=(const SpToDOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const Mat m(X); return (*this).operator-=(m); } //! in-place matrix multiplication, with the right-hand-side operand having delayed operations template template inline Mat& Mat::operator*=(const SpToDOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); glue_times::apply_inplace(*this, X); return *this; } //! in-place matrix element-wise multiplication, with the right-hand-side operand having delayed operations template template inline Mat& Mat::operator%=(const SpToDOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const Mat m(X); return (*this).operator%=(m); } //! in-place matrix element-wise division, with the right-hand-side operand having delayed operations template template inline Mat& Mat::operator/=(const SpToDOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const Mat m(X); return (*this).operator/=(m); } //! create a matrix from Glue, ie. run the previously delayed binary operations template template inline Mat::Mat(const Glue& X) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); glue_type::apply(*this, X); } //! create a matrix from Glue, ie. run the previously delayed binary operations template template inline Mat& Mat::operator=(const Glue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); glue_type::apply(*this, X); return *this; } //! in-place matrix addition, with the right-hand-side operands having delayed operations template template inline Mat& Mat::operator+=(const Glue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); const Mat m(X); return (*this).operator+=(m); } //! in-place matrix subtraction, with the right-hand-side operands having delayed operations template template inline Mat& Mat::operator-=(const Glue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); const Mat m(X); return (*this).operator-=(m); } //! in-place matrix multiplications, with the right-hand-side operands having delayed operations template template inline Mat& Mat::operator*=(const Glue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); glue_times::apply_inplace(*this, X); return *this; } //! in-place matrix element-wise multiplication, with the right-hand-side operands having delayed operations template template inline Mat& Mat::operator%=(const Glue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); const Mat m(X); return (*this).operator%=(m); } //! in-place matrix element-wise division, with the right-hand-side operands having delayed operations template template inline Mat& Mat::operator/=(const Glue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); const Mat m(X); return (*this).operator/=(m); } template template inline Mat& Mat::operator+=(const Glue& X) { arma_extra_debug_sigprint(); glue_times::apply_inplace_plus(*this, X, sword(+1)); return *this; } template template inline Mat& Mat::operator-=(const Glue& X) { arma_extra_debug_sigprint(); glue_times::apply_inplace_plus(*this, X, sword(-1)); return *this; } //! create a matrix from eGlue, ie. run the previously delayed binary operations template template inline Mat::Mat(const eGlue& X) : n_rows(X.get_n_rows()) , n_cols(X.get_n_cols()) , n_elem(X.get_n_elem()) , n_alloc() , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); init_cold(); eglue_type::apply(*this, X); } //! create a matrix from eGlue, ie. run the previously delayed binary operations template template inline Mat& Mat::operator=(const eGlue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); const bool bad_alias = ( (eGlue::proxy1_type::has_subview && X.P1.is_alias(*this)) || (eGlue::proxy2_type::has_subview && X.P2.is_alias(*this)) ); if(bad_alias == false) { init_warm(X.get_n_rows(), X.get_n_cols()); eglue_type::apply(*this, X); } else { arma_extra_debug_print("bad_alias = true"); Mat tmp(X); steal_mem(tmp); } return *this; } //! in-place matrix addition, with the right-hand-side operands having delayed operations template template inline Mat& Mat::operator+=(const eGlue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); eglue_type::apply_inplace_plus(*this, X); return *this; } //! in-place matrix subtraction, with the right-hand-side operands having delayed operations template template inline Mat& Mat::operator-=(const eGlue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); eglue_type::apply_inplace_minus(*this, X); return *this; } template template inline Mat& Mat::operator*=(const eGlue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); glue_times::apply_inplace(*this, X); return *this; } template template inline Mat& Mat::operator%=(const eGlue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); eglue_type::apply_inplace_schur(*this, X); return *this; } template template inline Mat& Mat::operator/=(const eGlue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); eglue_type::apply_inplace_div(*this, X); return *this; } template template inline Mat::Mat(const mtGlue& X) : n_rows(0) , n_cols(0) , n_elem(0) , n_alloc(0) , vec_state(0) , mem_state(0) , mem() { arma_extra_debug_sigprint_this(this); glue_type::apply(*this, X); } template template inline Mat& Mat::operator=(const mtGlue& X) { arma_extra_debug_sigprint(); glue_type::apply(*this, X); return *this; } template template inline Mat& Mat::operator+=(const mtGlue& X) { arma_extra_debug_sigprint(); const Mat m(X); return (*this).operator+=(m); } template template inline Mat& Mat::operator-=(const mtGlue& X) { arma_extra_debug_sigprint(); const Mat m(X); return (*this).operator-=(m); } template template inline Mat& Mat::operator*=(const mtGlue& X) { arma_extra_debug_sigprint(); const Mat m(X); glue_times::apply_inplace(*this, m); return *this; } template template inline Mat& Mat::operator%=(const mtGlue& X) { arma_extra_debug_sigprint(); const Mat m(X); return (*this).operator%=(m); } template template inline Mat& Mat::operator/=(const mtGlue& X) { arma_extra_debug_sigprint(); const Mat m(X); return (*this).operator/=(m); } //! linear element accessor (treats the matrix as a vector); no bounds check; assumes memory is aligned template arma_inline arma_warn_unused const eT& Mat::at_alt(const uword ii) const { const eT* mem_aligned = mem; memory::mark_as_aligned(mem_aligned); return mem_aligned[ii]; } //! linear element accessor (treats the matrix as a vector); bounds checking not done when ARMA_NO_DEBUG is defined template arma_inline arma_warn_unused eT& Mat::operator() (const uword ii) { arma_debug_check_bounds( (ii >= n_elem), "Mat::operator(): index out of bounds" ); return access::rw(mem[ii]); } //! linear element accessor (treats the matrix as a vector); bounds checking not done when ARMA_NO_DEBUG is defined template arma_inline arma_warn_unused const eT& Mat::operator() (const uword ii) const { arma_debug_check_bounds( (ii >= n_elem), "Mat::operator(): index out of bounds" ); return mem[ii]; } //! linear element accessor (treats the matrix as a vector); no bounds check. template arma_inline arma_warn_unused eT& Mat::operator[] (const uword ii) { return access::rw(mem[ii]); } //! linear element accessor (treats the matrix as a vector); no bounds check template arma_inline arma_warn_unused const eT& Mat::operator[] (const uword ii) const { return mem[ii]; } //! linear element accessor (treats the matrix as a vector); no bounds check. template arma_inline arma_warn_unused eT& Mat::at(const uword ii) { return access::rw(mem[ii]); } //! linear element accessor (treats the matrix as a vector); no bounds check template arma_inline arma_warn_unused const eT& Mat::at(const uword ii) const { return mem[ii]; } //! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined template arma_inline arma_warn_unused eT& Mat::operator() (const uword in_row, const uword in_col) { arma_debug_check_bounds( ((in_row >= n_rows) || (in_col >= n_cols)), "Mat::operator(): index out of bounds" ); return access::rw(mem[in_row + in_col*n_rows]); } //! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined template arma_inline arma_warn_unused const eT& Mat::operator() (const uword in_row, const uword in_col) const { arma_debug_check_bounds( ((in_row >= n_rows) || (in_col >= n_cols)), "Mat::operator(): index out of bounds" ); return mem[in_row + in_col*n_rows]; } //! element accessor; no bounds check template arma_inline arma_warn_unused eT& Mat::at(const uword in_row, const uword in_col) { return access::rw( mem[in_row + in_col*n_rows] ); } //! element accessor; no bounds check template arma_inline arma_warn_unused const eT& Mat::at(const uword in_row, const uword in_col) const { return mem[in_row + in_col*n_rows]; } //! prefix ++ template arma_inline const Mat& Mat::operator++() { Mat_aux::prefix_pp(*this); return *this; } //! postfix ++ (must not return the object by reference) template arma_inline void Mat::operator++(int) { Mat_aux::postfix_pp(*this); } //! prefix -- template arma_inline const Mat& Mat::operator--() { Mat_aux::prefix_mm(*this); return *this; } //! postfix -- (must not return the object by reference) template arma_inline void Mat::operator--(int) { Mat_aux::postfix_mm(*this); } //! returns true if the matrix has no elements template arma_inline arma_warn_unused bool Mat::is_empty() const { return (n_elem == 0); } //! returns true if the object can be interpreted as a column or row vector template arma_inline arma_warn_unused bool Mat::is_vec() const { return ( (n_rows == 1) || (n_cols == 1) ); } //! returns true if the object can be interpreted as a row vector template arma_inline arma_warn_unused bool Mat::is_rowvec() const { return (n_rows == 1); } //! returns true if the object can be interpreted as a column vector template arma_inline arma_warn_unused bool Mat::is_colvec() const { return (n_cols == 1); } //! returns true if the object has the same number of non-zero rows and columnns template arma_inline arma_warn_unused bool Mat::is_square() const { return (n_rows == n_cols); } //! returns true if all of the elements are finite template inline arma_warn_unused bool Mat::is_finite() const { return arrayops::is_finite( memptr(), n_elem ); } template inline arma_warn_unused bool Mat::has_inf() const { arma_extra_debug_sigprint(); return arrayops::has_inf(memptr(), n_elem); } template inline arma_warn_unused bool Mat::has_nan() const { arma_extra_debug_sigprint(); return arrayops::has_nan(memptr(), n_elem); } template inline arma_warn_unused bool Mat::is_sorted(const char* direction) const { arma_extra_debug_sigprint(); return (*this).is_sorted(direction, (((vec_state == 2) || (n_rows == 1)) ? uword(1) : uword(0))); } template inline arma_warn_unused bool Mat::is_sorted(const char* direction, const uword dim) const { arma_extra_debug_sigprint(); const char sig1 = (direction != nullptr) ? direction[0] : char(0); // direction is one of: // "ascend" // "descend" // "strictascend" // "strictdescend" arma_debug_check( ((sig1 != 'a') && (sig1 != 'd') && (sig1 != 's')), "Mat::is_sorted(): unknown sort direction" ); // "strictascend" // "strictdescend" // 0123456 const char sig2 = (sig1 == 's') ? direction[6] : char(0); if(sig1 == 's') { arma_debug_check( ((sig2 != 'a') && (sig2 != 'd')), "Mat::is_sorted(): unknown sort direction" ); } arma_debug_check( (dim > 1), "Mat::is_sorted(): parameter 'dim' must be 0 or 1" ); if(sig1 == 'a') { // case: ascend // deliberately using the opposite direction comparator, // as we need to handle the case of two elements being equal arma_gt_comparator comparator; return (*this).is_sorted_helper(comparator, dim); } else if(sig1 == 'd') { // case: descend // deliberately using the opposite direction comparator, // as we need to handle the case of two elements being equal arma_lt_comparator comparator; return (*this).is_sorted_helper(comparator, dim); } else if((sig1 == 's') && (sig2 == 'a')) { // case: strict ascend arma_geq_comparator comparator; return (*this).is_sorted_helper(comparator, dim); } else if((sig1 == 's') && (sig2 == 'd')) { // case: strict descend arma_leq_comparator comparator; return (*this).is_sorted_helper(comparator, dim); } return true; } template template inline arma_warn_unused bool Mat::is_sorted_helper(const comparator& comp, const uword dim) const { arma_extra_debug_sigprint(); if(n_elem <= 1) { return true; } const uword local_n_cols = n_cols; const uword local_n_rows = n_rows; if(dim == 0) { if(local_n_rows <= 1u) { return true; } const uword local_n_rows_m1 = local_n_rows - 1; for(uword c=0; c < local_n_cols; ++c) { const eT* coldata = colptr(c); for(uword r=0; r < local_n_rows_m1; ++r) { const eT val1 = (*coldata); coldata++; const eT val2 = (*coldata); if(comp(val1,val2)) { return false; } } } } else if(dim == 1) { if(local_n_cols <= 1u) { return true; } const uword local_n_cols_m1 = local_n_cols - 1; if(local_n_rows == 1) { const eT* rowdata = memptr(); for(uword c=0; c < local_n_cols_m1; ++c) { const eT val1 = (*rowdata); rowdata++; const eT val2 = (*rowdata); if(comp(val1,val2)) { return false; } } } else { for(uword r=0; r < local_n_rows; ++r) for(uword c=0; c < local_n_cols_m1; ++c) { const eT val1 = at(r,c ); const eT val2 = at(r,c+1); if(comp(val1,val2)) { return false; } } } } return true; } //! returns true if the given index is currently in range template arma_inline arma_warn_unused bool Mat::in_range(const uword ii) const { return (ii < n_elem); } //! returns true if the given start and end indices are currently in range template arma_inline arma_warn_unused bool Mat::in_range(const span& x) const { arma_extra_debug_sigprint(); if(x.whole) { return true; } else { const uword a = x.a; const uword b = x.b; return ( (a <= b) && (b < n_elem) ); } } //! returns true if the given location is currently in range template arma_inline arma_warn_unused bool Mat::in_range(const uword in_row, const uword in_col) const { return ( (in_row < n_rows) && (in_col < n_cols) ); } template arma_inline arma_warn_unused bool Mat::in_range(const span& row_span, const uword in_col) const { arma_extra_debug_sigprint(); if(row_span.whole) { return (in_col < n_cols); } else { const uword in_row1 = row_span.a; const uword in_row2 = row_span.b; return ( (in_row1 <= in_row2) && (in_row2 < n_rows) && (in_col < n_cols) ); } } template arma_inline arma_warn_unused bool Mat::in_range(const uword in_row, const span& col_span) const { arma_extra_debug_sigprint(); if(col_span.whole) { return (in_row < n_rows); } else { const uword in_col1 = col_span.a; const uword in_col2 = col_span.b; return ( (in_row < n_rows) && (in_col1 <= in_col2) && (in_col2 < n_cols) ); } } template arma_inline arma_warn_unused bool Mat::in_range(const span& row_span, const span& col_span) const { arma_extra_debug_sigprint(); const uword in_row1 = row_span.a; const uword in_row2 = row_span.b; const uword in_col1 = col_span.a; const uword in_col2 = col_span.b; const bool rows_ok = row_span.whole ? true : ( (in_row1 <= in_row2) && (in_row2 < n_rows) ); const bool cols_ok = col_span.whole ? true : ( (in_col1 <= in_col2) && (in_col2 < n_cols) ); return ( rows_ok && cols_ok ); } template arma_inline arma_warn_unused bool Mat::in_range(const uword in_row, const uword in_col, const SizeMat& s) const { const uword l_n_rows = n_rows; const uword l_n_cols = n_cols; if( (in_row >= l_n_rows) || (in_col >= l_n_cols) || ((in_row + s.n_rows) > l_n_rows) || ((in_col + s.n_cols) > l_n_cols) ) { return false; } else { return true; } } //! returns a pointer to array of eTs for a specified column; no bounds check template arma_inline arma_warn_unused eT* Mat::colptr(const uword in_col) { return & access::rw(mem[in_col*n_rows]); } //! returns a pointer to array of eTs for a specified column; no bounds check template arma_inline arma_warn_unused const eT* Mat::colptr(const uword in_col) const { return & mem[in_col*n_rows]; } //! returns a pointer to array of eTs used by the matrix template arma_inline arma_warn_unused eT* Mat::memptr() { return const_cast(mem); } //! returns a pointer to array of eTs used by the matrix template arma_inline arma_warn_unused const eT* Mat::memptr() const { return mem; } //! change the matrix to have user specified dimensions (data is not preserved) template inline void Mat::set_size(const uword new_n_elem) { arma_extra_debug_sigprint(); switch(vec_state) { case 0: // fallthrough case 1: init_warm(new_n_elem, 1); break; case 2: init_warm(1, new_n_elem); break; default: ; } } //! change the matrix to have user specified dimensions (data is not preserved) template inline void Mat::set_size(const uword new_n_rows, const uword new_n_cols) { arma_extra_debug_sigprint(); init_warm(new_n_rows, new_n_cols); } template inline void Mat::set_size(const SizeMat& s) { arma_extra_debug_sigprint(); init_warm(s.n_rows, s.n_cols); } //! change the matrix to have user specified dimensions (data is preserved) template inline void Mat::resize(const uword new_n_elem) { arma_extra_debug_sigprint(); switch(vec_state) { case 0: // fallthrough case 1: (*this).resize(new_n_elem, 1); break; case 2: (*this).resize(1, new_n_elem); break; default: ; } } //! change the matrix to have user specified dimensions (data is preserved) template inline void Mat::resize(const uword new_n_rows, const uword new_n_cols) { arma_extra_debug_sigprint(); op_resize::apply_mat_inplace((*this), new_n_rows, new_n_cols); } template inline void Mat::resize(const SizeMat& s) { arma_extra_debug_sigprint(); op_resize::apply_mat_inplace((*this), s.n_rows, s.n_cols); } //! change the matrix to have user specified dimensions (data is preserved) template inline void Mat::reshape(const uword new_n_rows, const uword new_n_cols) { arma_extra_debug_sigprint(); op_reshape::apply_mat_inplace((*this), new_n_rows, new_n_cols); } template inline void Mat::reshape(const SizeMat& s) { arma_extra_debug_sigprint(); op_reshape::apply_mat_inplace((*this), s.n_rows, s.n_cols); } //! NOTE: don't use this form; it's deprecated and will be removed template arma_deprecated inline void Mat::reshape(const uword new_n_rows, const uword new_n_cols, const uword dim) { arma_extra_debug_sigprint(); // arma_debug_warn_level(1, "this form of reshape() is deprecated and will be removed"); arma_debug_check( (dim > 1), "reshape(): parameter 'dim' must be 0 or 1" ); op_reshape_old::apply_mat_inplace((*this), new_n_rows, new_n_cols, dim); } //! change the matrix (without preserving data) to have the same dimensions as the given expression template template inline void Mat::copy_size(const Base& X) { arma_extra_debug_sigprint(); const Proxy P(X.get_ref()); const uword X_n_rows = P.get_n_rows(); const uword X_n_cols = P.get_n_cols(); init_warm(X_n_rows, X_n_cols); } //! apply a functor to each element template template inline const Mat& Mat::for_each(functor F) { arma_extra_debug_sigprint(); eT* data = memptr(); const uword N = n_elem; uword ii, jj; for(ii=0, jj=1; jj < N; ii+=2, jj+=2) { F(data[ii]); F(data[jj]); } if(ii < N) { F(data[ii]); } return *this; } template template inline const Mat& Mat::for_each(functor F) const { arma_extra_debug_sigprint(); const eT* data = memptr(); const uword N = n_elem; uword ii, jj; for(ii=0, jj=1; jj < N; ii+=2, jj+=2) { F(data[ii]); F(data[jj]); } if(ii < N) { F(data[ii]); } return *this; } //! transform each element in the matrix using a functor template template inline const Mat& Mat::transform(functor F) { arma_extra_debug_sigprint(); eT* out_mem = memptr(); const uword N = n_elem; uword ii, jj; for(ii=0, jj=1; jj < N; ii+=2, jj+=2) { eT tmp_ii = out_mem[ii]; eT tmp_jj = out_mem[jj]; tmp_ii = eT( F(tmp_ii) ); tmp_jj = eT( F(tmp_jj) ); out_mem[ii] = tmp_ii; out_mem[jj] = tmp_jj; } if(ii < N) { out_mem[ii] = eT( F(out_mem[ii]) ); } return *this; } //! imbue (fill) the matrix with values provided by a functor template template inline const Mat& Mat::imbue(functor F) { arma_extra_debug_sigprint(); eT* out_mem = memptr(); const uword N = n_elem; uword ii, jj; for(ii=0, jj=1; jj < N; ii+=2, jj+=2) { const eT tmp_ii = eT( F() ); const eT tmp_jj = eT( F() ); out_mem[ii] = tmp_ii; out_mem[jj] = tmp_jj; } if(ii < N) { out_mem[ii] = eT( F() ); } return *this; } template inline const Mat& Mat::replace(const eT old_val, const eT new_val) { arma_extra_debug_sigprint(); arrayops::replace(memptr(), n_elem, old_val, new_val); return *this; } template inline const Mat& Mat::clean(const typename get_pod_type::result threshold) { arma_extra_debug_sigprint(); arrayops::clean(memptr(), n_elem, threshold); return *this; } template inline const Mat& Mat::clamp(const eT min_val, const eT max_val) { arma_extra_debug_sigprint(); if(is_cx::no) { arma_debug_check( (access::tmp_real(min_val) > access::tmp_real(max_val)), "Mat::clamp(): min_val must be less than max_val" ); } else { arma_debug_check( (access::tmp_real(min_val) > access::tmp_real(max_val)), "Mat::clamp(): real(min_val) must be less than real(max_val)" ); arma_debug_check( (access::tmp_imag(min_val) > access::tmp_imag(max_val)), "Mat::clamp(): imag(min_val) must be less than imag(max_val)" ); } arrayops::clamp(memptr(), n_elem, min_val, max_val); return *this; } //! fill the matrix with the specified value template inline const Mat& Mat::fill(const eT val) { arma_extra_debug_sigprint(); arrayops::inplace_set( memptr(), val, n_elem ); return *this; } //! fill the matrix with the specified pattern template template inline const Mat& Mat::fill(const fill::fill_class&) { arma_extra_debug_sigprint(); if(is_same_type::yes) { (*this).zeros(); } if(is_same_type::yes) { (*this).ones(); } if(is_same_type::yes) { (*this).eye(); } if(is_same_type::yes) { (*this).randu(); } if(is_same_type::yes) { (*this).randn(); } return *this; } template inline const Mat& Mat::zeros() { arma_extra_debug_sigprint(); arrayops::fill_zeros(memptr(), n_elem); return *this; } template inline const Mat& Mat::zeros(const uword new_n_elem) { arma_extra_debug_sigprint(); set_size(new_n_elem); return (*this).zeros(); } template inline const Mat& Mat::zeros(const uword new_n_rows, const uword new_n_cols) { arma_extra_debug_sigprint(); set_size(new_n_rows, new_n_cols); return (*this).zeros(); } template inline const Mat& Mat::zeros(const SizeMat& s) { arma_extra_debug_sigprint(); return (*this).zeros(s.n_rows, s.n_cols); } template inline const Mat& Mat::ones() { arma_extra_debug_sigprint(); return fill(eT(1)); } template inline const Mat& Mat::ones(const uword new_n_elem) { arma_extra_debug_sigprint(); set_size(new_n_elem); return fill(eT(1)); } template inline const Mat& Mat::ones(const uword new_n_rows, const uword new_n_cols) { arma_extra_debug_sigprint(); set_size(new_n_rows, new_n_cols); return fill(eT(1)); } template inline const Mat& Mat::ones(const SizeMat& s) { arma_extra_debug_sigprint(); return (*this).ones(s.n_rows, s.n_cols); } template inline const Mat& Mat::randu() { arma_extra_debug_sigprint(); arma_rng::randu::fill( memptr(), n_elem ); return *this; } template inline const Mat& Mat::randu(const uword new_n_elem) { arma_extra_debug_sigprint(); set_size(new_n_elem); return (*this).randu(); } template inline const Mat& Mat::randu(const uword new_n_rows, const uword new_n_cols) { arma_extra_debug_sigprint(); set_size(new_n_rows, new_n_cols); return (*this).randu(); } template inline const Mat& Mat::randu(const SizeMat& s) { arma_extra_debug_sigprint(); return (*this).randu(s.n_rows, s.n_cols); } template inline const Mat& Mat::randn() { arma_extra_debug_sigprint(); arma_rng::randn::fill( memptr(), n_elem ); return *this; } template inline const Mat& Mat::randn(const uword new_n_elem) { arma_extra_debug_sigprint(); set_size(new_n_elem); return (*this).randn(); } template inline const Mat& Mat::randn(const uword new_n_rows, const uword new_n_cols) { arma_extra_debug_sigprint(); set_size(new_n_rows, new_n_cols); return (*this).randn(); } template inline const Mat& Mat::randn(const SizeMat& s) { arma_extra_debug_sigprint(); return (*this).randn(s.n_rows, s.n_cols); } template inline const Mat& Mat::eye() { arma_extra_debug_sigprint(); (*this).zeros(); const uword N = (std::min)(n_rows, n_cols); for(uword ii=0; ii inline const Mat& Mat::eye(const uword new_n_rows, const uword new_n_cols) { arma_extra_debug_sigprint(); set_size(new_n_rows, new_n_cols); return (*this).eye(); } template inline const Mat& Mat::eye(const SizeMat& s) { arma_extra_debug_sigprint(); return (*this).eye(s.n_rows, s.n_cols); } template inline arma_cold void Mat::reset() { arma_extra_debug_sigprint(); const uword new_n_rows = (vec_state == 2) ? 1 : 0; const uword new_n_cols = (vec_state == 1) ? 1 : 0; init_warm(new_n_rows, new_n_cols); } template inline arma_cold void Mat::soft_reset() { arma_extra_debug_sigprint(); // don't change the size if the matrix has a fixed size or is a cube slice if(mem_state <= 1) { reset(); } else { zeros(); } } template template inline void Mat::set_real(const Base::pod_type,T1>& X) { arma_extra_debug_sigprint(); Mat_aux::set_real(*this, X); } template template inline void Mat::set_imag(const Base::pod_type,T1>& X) { arma_extra_debug_sigprint(); Mat_aux::set_imag(*this, X); } template inline arma_warn_unused eT Mat::min() const { arma_extra_debug_sigprint(); if(n_elem == 0) { arma_debug_check(true, "Mat::min(): object has no elements"); return Datum::nan; } return op_min::direct_min(memptr(), n_elem); } template inline arma_warn_unused eT Mat::max() const { arma_extra_debug_sigprint(); if(n_elem == 0) { arma_debug_check(true, "Mat::max(): object has no elements"); return Datum::nan; } return op_max::direct_max(memptr(), n_elem); } template inline eT Mat::min(uword& index_of_min_val) const { arma_extra_debug_sigprint(); if(n_elem == 0) { arma_debug_check(true, "Mat::min(): object has no elements"); index_of_min_val = uword(0); return Datum::nan; } return op_min::direct_min(memptr(), n_elem, index_of_min_val); } template inline eT Mat::max(uword& index_of_max_val) const { arma_extra_debug_sigprint(); if(n_elem == 0) { arma_debug_check(true, "Mat::max(): object has no elements"); index_of_max_val = uword(0); return Datum::nan; } return op_max::direct_max(memptr(), n_elem, index_of_max_val); } template inline eT Mat::min(uword& row_of_min_val, uword& col_of_min_val) const { arma_extra_debug_sigprint(); if(n_elem == 0) { arma_debug_check(true, "Mat::min(): object has no elements"); row_of_min_val = uword(0); col_of_min_val = uword(0); return Datum::nan; } uword iq; eT val = op_min::direct_min(memptr(), n_elem, iq); row_of_min_val = iq % n_rows; col_of_min_val = iq / n_rows; return val; } template inline eT Mat::max(uword& row_of_max_val, uword& col_of_max_val) const { arma_extra_debug_sigprint(); if(n_elem == 0) { arma_debug_check(true, "Mat::max(): object has no elements"); row_of_max_val = uword(0); col_of_max_val = uword(0); return Datum::nan; } uword iq; eT val = op_max::direct_max(memptr(), n_elem, iq); row_of_max_val = iq % n_rows; col_of_max_val = iq / n_rows; return val; } //! save the matrix to a file template inline arma_cold bool Mat::save(const std::string name, const file_type type) const { arma_extra_debug_sigprint(); bool save_okay = false; switch(type) { case raw_ascii: save_okay = diskio::save_raw_ascii(*this, name); break; case arma_ascii: save_okay = diskio::save_arma_ascii(*this, name); break; case csv_ascii: return (*this).save(csv_name(name), type); break; case ssv_ascii: return (*this).save(csv_name(name), type); break; case coord_ascii: save_okay = diskio::save_coord_ascii(*this, name); break; case raw_binary: save_okay = diskio::save_raw_binary(*this, name); break; case arma_binary: save_okay = diskio::save_arma_binary(*this, name); break; case pgm_binary: save_okay = diskio::save_pgm_binary(*this, name); break; case hdf5_binary: return (*this).save(hdf5_name(name)); break; case hdf5_binary_trans: // kept for compatibility with earlier versions of Armadillo return (*this).save(hdf5_name(name, std::string(), hdf5_opts::trans)); break; default: arma_debug_warn_level(1, "Mat::save(): unsupported file type"); save_okay = false; } if(save_okay == false) { arma_debug_warn_level(3, "Mat::save(): couldn't write; file: ", name); } return save_okay; } template inline arma_cold bool Mat::save(const hdf5_name& spec, const file_type type) const { arma_extra_debug_sigprint(); // handling of hdf5_binary_trans kept for compatibility with earlier versions of Armadillo if( (type != hdf5_binary) && (type != hdf5_binary_trans) ) { arma_stop_runtime_error("Mat::save(): unsupported file type for hdf5_name()"); return false; } const bool do_trans = bool(spec.opts.flags & hdf5_opts::flag_trans ) || (type == hdf5_binary_trans); const bool append = bool(spec.opts.flags & hdf5_opts::flag_append ); const bool replace = bool(spec.opts.flags & hdf5_opts::flag_replace); if(append && replace) { arma_stop_runtime_error("Mat::save(): only one of 'append' or 'replace' options can be used"); return false; } bool save_okay = false; std::string err_msg; if(do_trans) { Mat tmp; op_strans::apply_mat_noalias(tmp, *this); save_okay = diskio::save_hdf5_binary(tmp, spec, err_msg); } else { save_okay = diskio::save_hdf5_binary(*this, spec, err_msg); } if(save_okay == false) { if(err_msg.length() > 0) { arma_debug_warn_level(3, "Mat::save(): ", err_msg, "; file: ", spec.filename); } else { arma_debug_warn_level(3, "Mat::save(): couldn't write; file: ", spec.filename); } } return save_okay; } template inline arma_cold bool Mat::save(const csv_name& spec, const file_type type) const { arma_extra_debug_sigprint(); if( (type != csv_ascii) && (type != ssv_ascii) ) { arma_stop_runtime_error("Mat::save(): unsupported file type for csv_name()"); return false; } const bool do_trans = bool(spec.opts.flags & csv_opts::flag_trans ); const bool no_header = bool(spec.opts.flags & csv_opts::flag_no_header ); bool with_header = bool(spec.opts.flags & csv_opts::flag_with_header); const bool use_semicolon = bool(spec.opts.flags & csv_opts::flag_semicolon ) || (type == ssv_ascii); arma_extra_debug_print("Mat::save(csv_name): enabled flags:"); if(do_trans ) { arma_extra_debug_print("trans"); } if(no_header ) { arma_extra_debug_print("no_header"); } if(with_header ) { arma_extra_debug_print("with_header"); } if(use_semicolon) { arma_extra_debug_print("semicolon"); } const char separator = (use_semicolon) ? char(';') : char(','); if(no_header) { with_header = false; } if(with_header) { if( (spec.header_ro.n_cols != 1) && (spec.header_ro.n_rows != 1) ) { arma_debug_warn_level(1, "Mat::save(): given header must have a vector layout"); return false; } for(uword i=0; i < spec.header_ro.n_elem; ++i) { const std::string& token = spec.header_ro.at(i); if(token.find(separator) != std::string::npos) { arma_debug_warn_level(1, "Mat::save(): token within the header contains the separator character: '", token, "'"); return false; } } const uword save_n_cols = (do_trans) ? (*this).n_rows : (*this).n_cols; if(spec.header_ro.n_elem != save_n_cols) { arma_debug_warn_level(1, "Mat::save(): size mistmach between header and matrix"); return false; } } bool save_okay = false; if(do_trans) { const Mat tmp = (*this).st(); save_okay = diskio::save_csv_ascii(tmp, spec.filename, spec.header_ro, with_header, separator); } else { save_okay = diskio::save_csv_ascii(*this, spec.filename, spec.header_ro, with_header, separator); } if(save_okay == false) { arma_debug_warn_level(3, "Mat::save(): couldn't write; file: ", spec.filename); } return save_okay; } //! save the matrix to a stream template inline arma_cold bool Mat::save(std::ostream& os, const file_type type) const { arma_extra_debug_sigprint(); bool save_okay = false; switch(type) { case raw_ascii: save_okay = diskio::save_raw_ascii(*this, os); break; case arma_ascii: save_okay = diskio::save_arma_ascii(*this, os); break; case csv_ascii: save_okay = diskio::save_csv_ascii(*this, os, char(',')); break; case ssv_ascii: save_okay = diskio::save_csv_ascii(*this, os, char(';')); break; case coord_ascii: save_okay = diskio::save_coord_ascii(*this, os); break; case raw_binary: save_okay = diskio::save_raw_binary(*this, os); break; case arma_binary: save_okay = diskio::save_arma_binary(*this, os); break; case pgm_binary: save_okay = diskio::save_pgm_binary(*this, os); break; default: arma_debug_warn_level(1, "Mat::save(): unsupported file type"); save_okay = false; } if(save_okay == false) { arma_debug_warn_level(3, "Mat::save(): couldn't write to stream"); } return save_okay; } //! load a matrix from a file template inline arma_cold bool Mat::load(const std::string name, const file_type type) { arma_extra_debug_sigprint(); bool load_okay = false; std::string err_msg; switch(type) { case auto_detect: load_okay = diskio::load_auto_detect(*this, name, err_msg); break; case raw_ascii: load_okay = diskio::load_raw_ascii(*this, name, err_msg); break; case arma_ascii: load_okay = diskio::load_arma_ascii(*this, name, err_msg); break; case csv_ascii: return (*this).load(csv_name(name), type); break; case ssv_ascii: return (*this).load(csv_name(name), type); break; case coord_ascii: load_okay = diskio::load_coord_ascii(*this, name, err_msg); break; case raw_binary: load_okay = diskio::load_raw_binary(*this, name, err_msg); break; case arma_binary: load_okay = diskio::load_arma_binary(*this, name, err_msg); break; case pgm_binary: load_okay = diskio::load_pgm_binary(*this, name, err_msg); break; case hdf5_binary: return (*this).load(hdf5_name(name)); break; case hdf5_binary_trans: // kept for compatibility with earlier versions of Armadillo return (*this).load(hdf5_name(name, std::string(), hdf5_opts::trans)); break; default: arma_debug_warn_level(1, "Mat::load(): unsupported file type"); load_okay = false; } if(load_okay == false) { if(err_msg.length() > 0) { arma_debug_warn_level(3, "Mat::load(): ", err_msg, "; file: ", name); } else { arma_debug_warn_level(3, "Mat::load(): couldn't read; file: ", name); } } if(load_okay == false) { (*this).soft_reset(); } return load_okay; } template inline arma_cold bool Mat::load(const hdf5_name& spec, const file_type type) { arma_extra_debug_sigprint(); if( (type != hdf5_binary) && (type != hdf5_binary_trans) ) { arma_stop_runtime_error("Mat::load(): unsupported file type for hdf5_name()"); return false; } bool load_okay = false; std::string err_msg; const bool do_trans = bool(spec.opts.flags & hdf5_opts::flag_trans) || (type == hdf5_binary_trans); if(do_trans) { Mat tmp; load_okay = diskio::load_hdf5_binary(tmp, spec, err_msg); if(load_okay) { op_strans::apply_mat_noalias(*this, tmp); } } else { load_okay = diskio::load_hdf5_binary(*this, spec, err_msg); } if(load_okay == false) { if(err_msg.length() > 0) { arma_debug_warn_level(3, "Mat::load(): ", err_msg, "; file: ", spec.filename); } else { arma_debug_warn_level(3, "Mat::load(): couldn't read; file: ", spec.filename); } } if(load_okay == false) { (*this).soft_reset(); } return load_okay; } template inline arma_cold bool Mat::load(const csv_name& spec, const file_type type) { arma_extra_debug_sigprint(); if( (type != csv_ascii) && (type != ssv_ascii) ) { arma_stop_runtime_error("Mat::load(): unsupported file type for csv_name()"); return false; } const bool do_trans = bool(spec.opts.flags & csv_opts::flag_trans ); const bool no_header = bool(spec.opts.flags & csv_opts::flag_no_header ); bool with_header = bool(spec.opts.flags & csv_opts::flag_with_header); const bool use_semicolon = bool(spec.opts.flags & csv_opts::flag_semicolon ) || (type == ssv_ascii); arma_extra_debug_print("Mat::load(csv_name): enabled flags:"); if(do_trans ) { arma_extra_debug_print("trans"); } if(no_header ) { arma_extra_debug_print("no_header"); } if(with_header ) { arma_extra_debug_print("with_header"); } if(use_semicolon) { arma_extra_debug_print("semicolon"); } const char separator = (use_semicolon) ? char(';') : char(','); if(no_header) { with_header = false; } bool load_okay = false; std::string err_msg; if(do_trans) { Mat tmp_mat; load_okay = diskio::load_csv_ascii(tmp_mat, spec.filename, err_msg, spec.header_rw, with_header, separator); if(load_okay) { (*this) = tmp_mat.st(); if(with_header) { // field::set_size() preserves data if the number of elements hasn't changed spec.header_rw.set_size(spec.header_rw.n_elem, 1); } } } else { load_okay = diskio::load_csv_ascii(*this, spec.filename, err_msg, spec.header_rw, with_header, separator); } if(load_okay == false) { if(err_msg.length() > 0) { arma_debug_warn_level(3, "Mat::load(): ", err_msg, "; file: ", spec.filename); } else { arma_debug_warn_level(3, "Mat::load(): couldn't read; file: ", spec.filename); } } else { const uword load_n_cols = (do_trans) ? (*this).n_rows : (*this).n_cols; if(with_header && (spec.header_rw.n_elem != load_n_cols)) { arma_debug_warn_level(3, "Mat::load(): size mistmach between header and matrix"); } } if(load_okay == false) { (*this).soft_reset(); if(with_header) { spec.header_rw.reset(); } } return load_okay; } //! load a matrix from a stream template inline arma_cold bool Mat::load(std::istream& is, const file_type type) { arma_extra_debug_sigprint(); bool load_okay = false; std::string err_msg; switch(type) { case auto_detect: load_okay = diskio::load_auto_detect(*this, is, err_msg); break; case raw_ascii: load_okay = diskio::load_raw_ascii(*this, is, err_msg); break; case arma_ascii: load_okay = diskio::load_arma_ascii(*this, is, err_msg); break; case csv_ascii: load_okay = diskio::load_csv_ascii(*this, is, err_msg, char(',')); break; case ssv_ascii: load_okay = diskio::load_csv_ascii(*this, is, err_msg, char(';')); break; case coord_ascii: load_okay = diskio::load_coord_ascii(*this, is, err_msg); break; case raw_binary: load_okay = diskio::load_raw_binary(*this, is, err_msg); break; case arma_binary: load_okay = diskio::load_arma_binary(*this, is, err_msg); break; case pgm_binary: load_okay = diskio::load_pgm_binary(*this, is, err_msg); break; default: arma_debug_warn_level(1, "Mat::load(): unsupported file type"); load_okay = false; } if(load_okay == false) { if(err_msg.length() > 0) { arma_debug_warn_level(3, "Mat::load(): ", err_msg); } else { arma_debug_warn_level(3, "Mat::load(): couldn't load from stream"); } } if(load_okay == false) { (*this).soft_reset(); } return load_okay; } //! save the matrix to a file, without printing any error messages template inline arma_cold bool Mat::quiet_save(const std::string name, const file_type type) const { arma_extra_debug_sigprint(); return (*this).save(name, type); } template inline arma_cold bool Mat::quiet_save(const hdf5_name& spec, const file_type type) const { arma_extra_debug_sigprint(); return (*this).save(spec, type); } template inline arma_cold bool Mat::quiet_save(const csv_name& spec, const file_type type) const { arma_extra_debug_sigprint(); return (*this).save(spec, type); } //! save the matrix to a stream, without printing any error messages template inline arma_cold bool Mat::quiet_save(std::ostream& os, const file_type type) const { arma_extra_debug_sigprint(); return (*this).save(os, type); } //! load a matrix from a file, without printing any error messages template inline arma_cold bool Mat::quiet_load(const std::string name, const file_type type) { arma_extra_debug_sigprint(); return (*this).load(name, type); } template inline arma_cold bool Mat::quiet_load(const hdf5_name& spec, const file_type type) { arma_extra_debug_sigprint(); return (*this).load(spec, type); } template inline arma_cold bool Mat::quiet_load(const csv_name& spec, const file_type type) { arma_extra_debug_sigprint(); return (*this).load(spec, type); } //! load a matrix from a stream, without printing any error messages template inline arma_cold bool Mat::quiet_load(std::istream& is, const file_type type) { arma_extra_debug_sigprint(); return (*this).load(is, type); } template inline Mat::row_iterator::row_iterator() : M (nullptr) , current_row(0 ) , current_col(0 ) { arma_extra_debug_sigprint(); // NOTE: this instance of row_iterator is invalid (it does not point to a valid element) } template inline Mat::row_iterator::row_iterator(const row_iterator& X) : M (X.M ) , current_row(X.current_row) , current_col(X.current_col) { arma_extra_debug_sigprint(); } template inline Mat::row_iterator::row_iterator(Mat& in_M, const uword in_row, const uword in_col) : M (&in_M ) , current_row(in_row) , current_col(in_col) { arma_extra_debug_sigprint(); } template inline arma_warn_unused eT& Mat::row_iterator::operator*() { return M->at(current_row,current_col); } template inline typename Mat::row_iterator& Mat::row_iterator::operator++() { current_col++; if(current_col == M->n_cols) { current_col = 0; current_row++; } return *this; } template inline arma_warn_unused typename Mat::row_iterator Mat::row_iterator::operator++(int) { typename Mat::row_iterator temp(*this); ++(*this); return temp; } template inline typename Mat::row_iterator& Mat::row_iterator::operator--() { if(current_col > 0) { current_col--; } else { if(current_row > 0) { current_col = M->n_cols - 1; current_row--; } } return *this; } template inline arma_warn_unused typename Mat::row_iterator Mat::row_iterator::operator--(int) { typename Mat::row_iterator temp(*this); --(*this); return temp; } template inline arma_warn_unused bool Mat::row_iterator::operator!=(const typename Mat::row_iterator& X) const { return ( (current_row != X.current_row) || (current_col != X.current_col) ); } template inline arma_warn_unused bool Mat::row_iterator::operator==(const typename Mat::row_iterator& X) const { return ( (current_row == X.current_row) && (current_col == X.current_col) ); } template inline arma_warn_unused bool Mat::row_iterator::operator!=(const typename Mat::const_row_iterator& X) const { return ( (current_row != X.current_row) || (current_col != X.current_col) ); } template inline arma_warn_unused bool Mat::row_iterator::operator==(const typename Mat::const_row_iterator& X) const { return ( (current_row == X.current_row) && (current_col == X.current_col) ); } template inline Mat::const_row_iterator::const_row_iterator() : M (nullptr) , current_row(0 ) , current_col(0 ) { arma_extra_debug_sigprint(); // NOTE: this instance of const_row_iterator is invalid (it does not point to a valid element) } template inline Mat::const_row_iterator::const_row_iterator(const typename Mat::row_iterator& X) : M (X.M ) , current_row(X.current_row) , current_col(X.current_col) { arma_extra_debug_sigprint(); } template inline Mat::const_row_iterator::const_row_iterator(const typename Mat::const_row_iterator& X) : M (X.M ) , current_row(X.current_row) , current_col(X.current_col) { arma_extra_debug_sigprint(); } template inline Mat::const_row_iterator::const_row_iterator(const Mat& in_M, const uword in_row, const uword in_col) : M (&in_M ) , current_row(in_row) , current_col(in_col) { arma_extra_debug_sigprint(); } template inline arma_warn_unused const eT& Mat::const_row_iterator::operator*() const { return M->at(current_row,current_col); } template inline typename Mat::const_row_iterator& Mat::const_row_iterator::operator++() { current_col++; if(current_col == M->n_cols) { current_col = 0; current_row++; } return *this; } template inline arma_warn_unused typename Mat::const_row_iterator Mat::const_row_iterator::operator++(int) { typename Mat::const_row_iterator temp(*this); ++(*this); return temp; } template inline typename Mat::const_row_iterator& Mat::const_row_iterator::operator--() { if(current_col > 0) { current_col--; } else { if(current_row > 0) { current_col = M->n_cols - 1; current_row--; } } return *this; } template inline arma_warn_unused typename Mat::const_row_iterator Mat::const_row_iterator::operator--(int) { typename Mat::const_row_iterator temp(*this); --(*this); return temp; } template inline arma_warn_unused bool Mat::const_row_iterator::operator!=(const typename Mat::row_iterator& X) const { return ( (current_row != X.current_row) || (current_col != X.current_col) ); } template inline arma_warn_unused bool Mat::const_row_iterator::operator==(const typename Mat::row_iterator& X) const { return ( (current_row == X.current_row) && (current_col == X.current_col) ); } template inline arma_warn_unused bool Mat::const_row_iterator::operator!=(const typename Mat::const_row_iterator& X) const { return ( (current_row != X.current_row) || (current_col != X.current_col) ); } template inline arma_warn_unused bool Mat::const_row_iterator::operator==(const typename Mat::const_row_iterator& X) const { return ( (current_row == X.current_row) && (current_col == X.current_col) ); } template inline Mat::row_col_iterator::row_col_iterator() : M (nullptr) , current_ptr(nullptr) , current_col(0 ) , current_row(0 ) { arma_extra_debug_sigprint(); // Technically this iterator is invalid (it does not point to a valid element) } template inline Mat::row_col_iterator::row_col_iterator(const row_col_iterator& in_it) : M (in_it.M ) , current_ptr(in_it.current_ptr) , current_col(in_it.current_col) , current_row(in_it.current_row) { arma_extra_debug_sigprint(); } template inline Mat::row_col_iterator::row_col_iterator(Mat& in_M, const uword in_row, const uword in_col) : M (&in_M ) , current_ptr(&in_M.at(in_row,in_col)) , current_col(in_col ) , current_row(in_row ) { arma_extra_debug_sigprint(); } template inline arma_warn_unused eT& Mat::row_col_iterator::operator*() { return *current_ptr; } template inline typename Mat::row_col_iterator& Mat::row_col_iterator::operator++() { if(current_col < M->n_cols) { current_ptr++; current_row++; // Check to see if we moved a column. if(current_row == M->n_rows) { current_col++; current_row = 0; } } return *this; } template inline arma_warn_unused typename Mat::row_col_iterator Mat::row_col_iterator::operator++(int) { typename Mat::row_col_iterator temp(*this); ++(*this); return temp; } template inline typename Mat::row_col_iterator& Mat::row_col_iterator::operator--() { if(current_row > 0) { current_ptr--; current_row--; } else if(current_col > 0) { current_ptr--; current_col--; current_row = M->n_rows - 1; } return *this; } template inline arma_warn_unused typename Mat::row_col_iterator Mat::row_col_iterator::operator--(int) { typename Mat::row_col_iterator temp(*this); --(*this); return temp; } template inline arma_warn_unused uword Mat::row_col_iterator::row() const { return current_row; } template inline arma_warn_unused uword Mat::row_col_iterator::col() const { return current_col; } template inline arma_warn_unused bool Mat::row_col_iterator::operator==(const row_col_iterator& rhs) const { return (current_ptr == rhs.current_ptr); } template inline arma_warn_unused bool Mat::row_col_iterator::operator!=(const row_col_iterator& rhs) const { return (current_ptr != rhs.current_ptr); } template inline arma_warn_unused bool Mat::row_col_iterator::operator==(const const_row_col_iterator& rhs) const { return (current_ptr == rhs.current_ptr); } template inline arma_warn_unused bool Mat::row_col_iterator::operator!=(const const_row_col_iterator& rhs) const { return (current_ptr != rhs.current_ptr); } template inline Mat::const_row_col_iterator::const_row_col_iterator() : M (nullptr) , current_ptr(nullptr) , current_col(0 ) , current_row(0 ) { arma_extra_debug_sigprint(); // Technically this iterator is invalid (it does not point to a valid element) } template inline Mat::const_row_col_iterator::const_row_col_iterator(const row_col_iterator& in_it) : M (in_it.M ) , current_ptr(in_it.current_ptr) , current_col(in_it.col() ) , current_row(in_it.row() ) { arma_extra_debug_sigprint(); } template inline Mat::const_row_col_iterator::const_row_col_iterator(const const_row_col_iterator& in_it) : M (in_it.M ) , current_ptr(in_it.current_ptr) , current_col(in_it.col() ) , current_row(in_it.row() ) { arma_extra_debug_sigprint(); } template inline Mat::const_row_col_iterator::const_row_col_iterator(const Mat& in_M, const uword in_row, const uword in_col) : M (&in_M ) , current_ptr(&in_M.at(in_row,in_col)) , current_col(in_col ) , current_row(in_row ) { arma_extra_debug_sigprint(); } template inline arma_warn_unused const eT& Mat::const_row_col_iterator::operator*() const { return *current_ptr; } template inline typename Mat::const_row_col_iterator& Mat::const_row_col_iterator::operator++() { if(current_col < M->n_cols) { current_ptr++; current_row++; // Check to see if we moved a column. if(current_row == M->n_rows) { current_col++; current_row = 0; } } return *this; } template inline arma_warn_unused typename Mat::const_row_col_iterator Mat::const_row_col_iterator::operator++(int) { typename Mat::const_row_col_iterator temp(*this); ++(*this); return temp; } template inline typename Mat::const_row_col_iterator& Mat::const_row_col_iterator::operator--() { if(current_row > 0) { current_ptr--; current_row--; } else if(current_col > 0) { current_ptr--; current_col--; current_row = M->n_rows - 1; } return *this; } template inline arma_warn_unused typename Mat::const_row_col_iterator Mat::const_row_col_iterator::operator--(int) { typename Mat::const_row_col_iterator temp(*this); --(*this); return temp; } template inline arma_warn_unused uword Mat::const_row_col_iterator::row() const { return current_row; } template inline arma_warn_unused uword Mat::const_row_col_iterator::col() const { return current_col; } template inline arma_warn_unused bool Mat::const_row_col_iterator::operator==(const const_row_col_iterator& rhs) const { return (current_ptr == rhs.current_ptr); } template inline arma_warn_unused bool Mat::const_row_col_iterator::operator!=(const const_row_col_iterator& rhs) const { return (current_ptr != rhs.current_ptr); } template inline arma_warn_unused bool Mat::const_row_col_iterator::operator==(const row_col_iterator& rhs) const { return (current_ptr == rhs.current_ptr); } template inline arma_warn_unused bool Mat::const_row_col_iterator::operator!=(const row_col_iterator& rhs) const { return (current_ptr != rhs.current_ptr); } template inline typename Mat::iterator Mat::begin() { arma_extra_debug_sigprint(); return memptr(); } template inline typename Mat::const_iterator Mat::begin() const { arma_extra_debug_sigprint(); return memptr(); } template inline typename Mat::const_iterator Mat::cbegin() const { arma_extra_debug_sigprint(); return memptr(); } template inline typename Mat::iterator Mat::end() { arma_extra_debug_sigprint(); return memptr() + n_elem; } template inline typename Mat::const_iterator Mat::end() const { arma_extra_debug_sigprint(); return memptr() + n_elem; } template inline typename Mat::const_iterator Mat::cend() const { arma_extra_debug_sigprint(); return memptr() + n_elem; } template inline typename Mat::col_iterator Mat::begin_col(const uword col_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (col_num >= n_cols), "Mat::begin_col(): index out of bounds" ); return colptr(col_num); } template inline typename Mat::const_col_iterator Mat::begin_col(const uword col_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (col_num >= n_cols), "Mat::begin_col(): index out of bounds" ); return colptr(col_num); } template inline typename Mat::col_iterator Mat::end_col(const uword col_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (col_num >= n_cols), "Mat::end_col(): index out of bounds" ); return colptr(col_num) + n_rows; } template inline typename Mat::const_col_iterator Mat::end_col(const uword col_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (col_num >= n_cols), "Mat::end_col(): index out of bounds" ); return colptr(col_num) + n_rows; } template inline typename Mat::row_iterator Mat::begin_row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (row_num >= n_rows), "Mat::begin_row(): index out of bounds" ); return typename Mat::row_iterator(*this, row_num, uword(0)); } template inline typename Mat::const_row_iterator Mat::begin_row(const uword row_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (row_num >= n_rows), "Mat::begin_row(): index out of bounds" ); return typename Mat::const_row_iterator(*this, row_num, uword(0)); } template inline typename Mat::row_iterator Mat::end_row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (row_num >= n_rows), "Mat::end_row(): index out of bounds" ); return typename Mat::row_iterator(*this, (row_num + uword(1)), 0); } template inline typename Mat::const_row_iterator Mat::end_row(const uword row_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (row_num >= n_rows), "Mat::end_row(): index out of bounds" ); return typename Mat::const_row_iterator(*this, (row_num + uword(1)), 0); } template inline typename Mat::row_col_iterator Mat::begin_row_col() { return row_col_iterator(*this); } template inline typename Mat::const_row_col_iterator Mat::begin_row_col() const { return const_row_col_iterator(*this); } template inline typename Mat::row_col_iterator Mat::end_row_col() { return row_col_iterator(*this, 0, n_cols); } template inline typename Mat::const_row_col_iterator Mat::end_row_col() const { return const_row_col_iterator(*this, 0, n_cols); } //! resets this matrix to an empty matrix template inline void Mat::clear() { reset(); } //! returns true if the matrix has no elements template inline bool Mat::empty() const { return (n_elem == 0); } //! returns the number of elements in this matrix template inline uword Mat::size() const { return n_elem; } template inline arma_warn_unused eT& Mat::front() { arma_debug_check( (n_elem == 0), "Mat::front(): matrix is empty" ); return access::rw(mem[0]); } template inline arma_warn_unused const eT& Mat::front() const { arma_debug_check( (n_elem == 0), "Mat::front(): matrix is empty" ); return mem[0]; } template inline arma_warn_unused eT& Mat::back() { arma_debug_check( (n_elem == 0), "Mat::back(): matrix is empty" ); return access::rw(mem[n_elem-1]); } template inline arma_warn_unused const eT& Mat::back() const { arma_debug_check( (n_elem == 0), "Mat::back(): matrix is empty" ); return mem[n_elem-1]; } template template arma_inline Mat::fixed::fixed() : Mat( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); #if (!defined(ARMA_DONT_ZERO_INIT)) { arma_extra_debug_print("Mat::fixed::constructor: zeroing memory"); eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(mem_local[0]); arrayops::inplace_set_fixed( mem_use, eT(0) ); } #endif } template template arma_inline Mat::fixed::fixed(const fixed& X) : Mat( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); eT* dest = (use_extra) ? mem_local_extra : mem_local; const eT* src = (use_extra) ? X.mem_local_extra : X.mem_local; arrayops::copy( dest, src, fixed_n_elem ); } template template inline Mat::fixed::fixed(const fill::scalar_holder f) : Mat( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); (*this).fill(f.scalar); } template template template inline Mat::fixed::fixed(const fill::fill_class&) : Mat( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); if(is_same_type::yes) { (*this).zeros(); } if(is_same_type::yes) { (*this).ones(); } if(is_same_type::yes) { (*this).eye(); } if(is_same_type::yes) { (*this).randu(); } if(is_same_type::yes) { (*this).randn(); } } template template template inline Mat::fixed::fixed(const Base& A) : Mat( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); Mat::operator=(A.get_ref()); } template template template inline Mat::fixed::fixed(const Base& A, const Base& B) : Mat( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); Mat::init(A,B); } template template inline Mat::fixed::fixed(const eT* aux_mem) : Mat( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); eT* dest = (use_extra) ? mem_local_extra : mem_local; arrayops::copy( dest, aux_mem, fixed_n_elem ); } template template inline Mat::fixed::fixed(const char* text) : Mat( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); Mat::operator=(text); } template template inline Mat::fixed::fixed(const std::string& text) : Mat( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); Mat::operator=(text); } template template inline Mat::fixed::fixed(const std::initializer_list& list) : Mat( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); (*this).operator=(list); } template template inline Mat& Mat::fixed::operator=(const std::initializer_list& list) { arma_extra_debug_sigprint(); const uword N = uword(list.size()); arma_debug_check( (N > fixed_n_elem), "Mat::fixed: initialiser list is too long" ); eT* this_mem = (*this).memptr(); arrayops::copy( this_mem, list.begin(), N ); for(uword iq=N; iq < fixed_n_elem; ++iq) { this_mem[iq] = eT(0); } return *this; } template template inline Mat::fixed::fixed(const std::initializer_list< std::initializer_list >& list) : Mat( arma_fixed_indicator(), fixed_n_rows, fixed_n_cols, 0, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); Mat::init(list); } template template inline Mat& Mat::fixed::operator=(const std::initializer_list< std::initializer_list >& list) { arma_extra_debug_sigprint(); Mat::init(list); return *this; } template template arma_inline Mat& Mat::fixed::operator=(const fixed& X) { arma_extra_debug_sigprint(); if(this != &X) { eT* dest = (use_extra) ? mem_local_extra : mem_local; const eT* src = (use_extra) ? X.mem_local_extra : X.mem_local; arrayops::copy( dest, src, fixed_n_elem ); } return *this; } #if defined(ARMA_GOOD_COMPILER) template template template inline Mat& Mat::fixed::operator=(const eOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const bool bad_alias = (eOp::proxy_type::has_subview && X.P.is_alias(*this)); if(bad_alias == false) { arma_debug_assert_same_size(fixed_n_rows, fixed_n_cols, X.get_n_rows(), X.get_n_cols(), "Mat::fixed::operator="); eop_type::apply(*this, X); } else { arma_extra_debug_print("bad_alias = true"); Mat tmp(X); (*this) = tmp; } return *this; } template template template inline Mat& Mat::fixed::operator=(const eGlue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); const bool bad_alias = ( (eGlue::proxy1_type::has_subview && X.P1.is_alias(*this)) || (eGlue::proxy2_type::has_subview && X.P2.is_alias(*this)) ); if(bad_alias == false) { arma_debug_assert_same_size(fixed_n_rows, fixed_n_cols, X.get_n_rows(), X.get_n_cols(), "Mat::fixed::operator="); eglue_type::apply(*this, X); } else { arma_extra_debug_print("bad_alias = true"); Mat tmp(X); (*this) = tmp; } return *this; } #endif template template arma_inline arma_warn_unused const Op< typename Mat::template fixed::Mat_fixed_type, op_htrans > Mat::fixed::t() const { return Op< typename Mat::template fixed::Mat_fixed_type, op_htrans >(*this); } template template arma_inline arma_warn_unused const Op< typename Mat::template fixed::Mat_fixed_type, op_htrans > Mat::fixed::ht() const { return Op< typename Mat::template fixed::Mat_fixed_type, op_htrans >(*this); } template template arma_inline arma_warn_unused const Op< typename Mat::template fixed::Mat_fixed_type, op_strans > Mat::fixed::st() const { return Op< typename Mat::template fixed::Mat_fixed_type, op_strans >(*this); } template template arma_inline arma_warn_unused const eT& Mat::fixed::at_alt(const uword ii) const { #if defined(ARMA_HAVE_ALIGNED_ATTRIBUTE) return (use_extra) ? mem_local_extra[ii] : mem_local[ii]; #else const eT* mem_aligned = (use_extra) ? mem_local_extra : mem_local; memory::mark_as_aligned(mem_aligned); return mem_aligned[ii]; #endif } template template arma_inline arma_warn_unused eT& Mat::fixed::operator[] (const uword ii) { return (use_extra) ? mem_local_extra[ii] : mem_local[ii]; } template template arma_inline arma_warn_unused const eT& Mat::fixed::operator[] (const uword ii) const { return (use_extra) ? mem_local_extra[ii] : mem_local[ii]; } template template arma_inline arma_warn_unused eT& Mat::fixed::at(const uword ii) { return (use_extra) ? mem_local_extra[ii] : mem_local[ii]; } template template arma_inline arma_warn_unused const eT& Mat::fixed::at(const uword ii) const { return (use_extra) ? mem_local_extra[ii] : mem_local[ii]; } template template arma_inline arma_warn_unused eT& Mat::fixed::operator() (const uword ii) { arma_debug_check_bounds( (ii >= fixed_n_elem), "Mat::operator(): index out of bounds" ); return (use_extra) ? mem_local_extra[ii] : mem_local[ii]; } template template arma_inline arma_warn_unused const eT& Mat::fixed::operator() (const uword ii) const { arma_debug_check_bounds( (ii >= fixed_n_elem), "Mat::operator(): index out of bounds" ); return (use_extra) ? mem_local_extra[ii] : mem_local[ii]; } template template arma_inline arma_warn_unused eT& Mat::fixed::at(const uword in_row, const uword in_col) { const uword iq = in_row + in_col*fixed_n_rows; return (use_extra) ? mem_local_extra[iq] : mem_local[iq]; } template template arma_inline arma_warn_unused const eT& Mat::fixed::at(const uword in_row, const uword in_col) const { const uword iq = in_row + in_col*fixed_n_rows; return (use_extra) ? mem_local_extra[iq] : mem_local[iq]; } template template arma_inline arma_warn_unused eT& Mat::fixed::operator() (const uword in_row, const uword in_col) { arma_debug_check_bounds( ((in_row >= fixed_n_rows) || (in_col >= fixed_n_cols)), "Mat::operator(): index out of bounds" ); const uword iq = in_row + in_col*fixed_n_rows; return (use_extra) ? mem_local_extra[iq] : mem_local[iq]; } template template arma_inline arma_warn_unused const eT& Mat::fixed::operator() (const uword in_row, const uword in_col) const { arma_debug_check_bounds( ((in_row >= fixed_n_rows) || (in_col >= fixed_n_cols)), "Mat::operator(): index out of bounds" ); const uword iq = in_row + in_col*fixed_n_rows; return (use_extra) ? mem_local_extra[iq] : mem_local[iq]; } template template arma_inline arma_warn_unused eT* Mat::fixed::colptr(const uword in_col) { eT* mem_actual = (use_extra) ? mem_local_extra : mem_local; return & access::rw(mem_actual[in_col*fixed_n_rows]); } template template arma_inline arma_warn_unused const eT* Mat::fixed::colptr(const uword in_col) const { const eT* mem_actual = (use_extra) ? mem_local_extra : mem_local; return & mem_actual[in_col*fixed_n_rows]; } template template arma_inline arma_warn_unused eT* Mat::fixed::memptr() { return (use_extra) ? mem_local_extra : mem_local; } template template arma_inline arma_warn_unused const eT* Mat::fixed::memptr() const { return (use_extra) ? mem_local_extra : mem_local; } template template arma_inline arma_warn_unused bool Mat::fixed::is_vec() const { return ( (fixed_n_rows == 1) || (fixed_n_cols == 1) ); } template template inline const Mat& Mat::fixed::fill(const eT val) { arma_extra_debug_sigprint(); eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(mem_local[0]); arrayops::inplace_set_fixed( mem_use, val ); return *this; } template template inline const Mat& Mat::fixed::zeros() { arma_extra_debug_sigprint(); eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(mem_local[0]); arrayops::inplace_set_fixed( mem_use, eT(0) ); return *this; } template template inline const Mat& Mat::fixed::ones() { arma_extra_debug_sigprint(); eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(mem_local[0]); arrayops::inplace_set_fixed( mem_use, eT(1) ); return *this; } //! prefix ++ template inline void Mat_aux::prefix_pp(Mat& x) { eT* memptr = x.memptr(); const uword n_elem = x.n_elem; uword i,j; for(i=0, j=1; j inline void Mat_aux::prefix_pp(Mat< std::complex >& x) { x += T(1); } //! postfix ++ template inline void Mat_aux::postfix_pp(Mat& x) { eT* memptr = x.memptr(); const uword n_elem = x.n_elem; uword i,j; for(i=0, j=1; j inline void Mat_aux::postfix_pp(Mat< std::complex >& x) { x += T(1); } //! prefix -- template inline void Mat_aux::prefix_mm(Mat& x) { eT* memptr = x.memptr(); const uword n_elem = x.n_elem; uword i,j; for(i=0, j=1; j inline void Mat_aux::prefix_mm(Mat< std::complex >& x) { x -= T(1); } //! postfix -- template inline void Mat_aux::postfix_mm(Mat& x) { eT* memptr = x.memptr(); const uword n_elem = x.n_elem; uword i,j; for(i=0, j=1; j inline void Mat_aux::postfix_mm(Mat< std::complex >& x) { x -= T(1); } template inline void Mat_aux::set_real(Mat& out, const Base& X) { arma_extra_debug_sigprint(); const unwrap tmp(X.get_ref()); const Mat& A = tmp.M; arma_debug_assert_same_size( out, A, "Mat::set_real()" ); out = A; } template inline void Mat_aux::set_imag(Mat&, const Base&) { arma_extra_debug_sigprint(); } template inline void Mat_aux::set_real(Mat< std::complex >& out, const Base& X) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const Proxy P(X.get_ref()); const uword local_n_rows = P.get_n_rows(); const uword local_n_cols = P.get_n_cols(); arma_debug_assert_same_size( out.n_rows, out.n_cols, local_n_rows, local_n_cols, "Mat::set_real()" ); eT* out_mem = out.memptr(); if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; ea_type A = P.get_ea(); const uword N = out.n_elem; for(uword i=0; i( A[i], out_mem[i].imag() ); } } else { for(uword col=0; col < local_n_cols; ++col) for(uword row=0; row < local_n_rows; ++row) { (*out_mem) = std::complex( P.at(row,col), (*out_mem).imag() ); out_mem++; } } } template inline void Mat_aux::set_imag(Mat< std::complex >& out, const Base& X) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const Proxy P(X.get_ref()); const uword local_n_rows = P.get_n_rows(); const uword local_n_cols = P.get_n_cols(); arma_debug_assert_same_size( out.n_rows, out.n_cols, local_n_rows, local_n_cols, "Mat::set_imag()" ); eT* out_mem = out.memptr(); if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; ea_type A = P.get_ea(); const uword N = out.n_elem; for(uword i=0; i( out_mem[i].real(), A[i] ); } } else { for(uword col=0; col < local_n_cols; ++col) for(uword row=0; row < local_n_rows; ++row) { (*out_mem) = std::complex( (*out_mem).real(), P.at(row,col) ); out_mem++; } } } #ifdef ARMA_EXTRA_MAT_MEAT #include ARMA_INCFILE_WRAP(ARMA_EXTRA_MAT_MEAT) #endif //! @} RcppArmadillo/inst/include/armadillo_bits/op_chol_bones.hpp0000644000176200001440000000223614124060717023717 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_chol //! @{ class op_chol : public traits_op_default { public: template inline static void apply(Mat& out, const Op& X); template inline static bool apply_direct(Mat& out, const Base& A_expr, const uword layout); }; //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_UpperHessenbergQR_meat.hpp0000644000176200001440000001644314124060717027041 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { template inline UpperHessenbergQR::UpperHessenbergQR() : n(0) , computed(false) { arma_extra_debug_sigprint(); } template inline UpperHessenbergQR::UpperHessenbergQR(const Mat& mat_obj) : n(mat_obj.n_rows) , mat_T(n, n) , rot_cos(n - 1) , rot_sin(n - 1) , computed(false) { arma_extra_debug_sigprint(); compute(mat_obj); } template void UpperHessenbergQR::compute(const Mat& mat_obj) { arma_extra_debug_sigprint(); n = mat_obj.n_rows; mat_T.set_size(n, n); rot_cos.set_size(n - 1); rot_sin.set_size(n - 1); // Make a copy of mat_obj mat_T = mat_obj; eT xi, xj, r, c, s, eps = std::numeric_limits::epsilon(); eT *ptr; for(uword i = 0; i < n - 1; i++) { // Make sure mat_T is upper Hessenberg // Zero the elements below mat_T(i + 1, i) if(i < n - 2) { mat_T(span(i + 2, n - 1), i).zeros(); } xi = mat_T(i, i); // mat_T(i, i) xj = mat_T(i + 1, i); // mat_T(i + 1, i) r = arma_hypot(xi, xj); if(r <= eps) { r = 0; rot_cos(i) = c = 1; rot_sin(i) = s = 0; } else { rot_cos(i) = c = xi / r; rot_sin(i) = s = -xj / r; } // 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)] // mat_T.submat(i, i, i + 1, n - 1) = Gt * mat_T.submat(i, i, i + 1, n - 1); mat_T(i, i) = r; // mat_T(i, i) => r mat_T(i + 1, i) = 0; // mat_T(i + 1, i) => 0 ptr = &mat_T(i, i + 1); // mat_T(i, k), k = i+1, i+2, ..., n-1 for(uword j = i + 1; j < n; j++, ptr += n) { eT tmp = ptr[0]; ptr[0] = c * tmp - s * ptr[1]; ptr[1] = s * tmp + c * ptr[1]; } } computed = true; } template Mat UpperHessenbergQR::matrix_RQ() { arma_extra_debug_sigprint(); arma_debug_check( (computed == false), "newarp::UpperHessenbergQR::matrix_RQ(): need to call compute() first" ); // Make a copy of the R matrix Mat RQ = trimatu(mat_T); for(uword i = 0; i < n - 1; i++) { // RQ[, i:(i + 1)] = RQ[, i:(i + 1)] * Gi // Gi = [ cos[i] sin[i]] // [-sin[i] cos[i]] const eT c = rot_cos(i); const eT s = rot_sin(i); eT *Yi, *Yi1; Yi = RQ.colptr(i); Yi1 = RQ.colptr(i + 1); for(uword j = 0; j < i + 2; j++) { eT tmp = Yi[j]; Yi[j] = c * tmp - s * Yi1[j]; Yi1[j] = s * tmp + c * Yi1[j]; } /* Yi = RQ(span(0, i + 1), i); RQ(span(0, i + 1), i) = (*c) * Yi - (*s) * RQ(span(0, i + 1), i + 1); RQ(span(0, i + 1), i + 1) = (*s) * Yi + (*c) * RQ(span(0, i + 1), i + 1); */ } return RQ; } template inline void UpperHessenbergQR::apply_YQ(Mat& Y) { arma_extra_debug_sigprint(); arma_debug_check( (computed == false), "newarp::UpperHessenbergQR::apply_YQ(): need to call compute() first" ); eT *Y_col_i, *Y_col_i1; uword nrow = Y.n_rows; for(uword i = 0; i < n - 1; i++) { const eT c = rot_cos(i); const eT s = rot_sin(i); Y_col_i = Y.colptr(i); Y_col_i1 = Y.colptr(i + 1); for(uword j = 0; j < nrow; j++) { eT 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]; } } } template inline TridiagQR::TridiagQR() : UpperHessenbergQR() { arma_extra_debug_sigprint(); } template inline TridiagQR::TridiagQR(const Mat& mat_obj) : UpperHessenbergQR() { arma_extra_debug_sigprint(); this->compute(mat_obj); } template inline void TridiagQR::compute(const Mat& mat_obj) { arma_extra_debug_sigprint(); this->n = mat_obj.n_rows; this->mat_T.set_size(this->n, this->n); this->rot_cos.set_size(this->n - 1); this->rot_sin.set_size(this->n - 1); this->mat_T.zeros(); this->mat_T.diag() = mat_obj.diag(); this->mat_T.diag(1) = mat_obj.diag(-1); this->mat_T.diag(-1) = mat_obj.diag(-1); eT xi, xj, r, c, s, tmp, eps = std::numeric_limits::epsilon(); eT *ptr; // A number of pointers to avoid repeated address calculation for(uword i = 0; i < this->n - 1; i++) { xi = this->mat_T(i, i); // mat_T(i, i) xj = this->mat_T(i + 1, i); // mat_T(i + 1, i) r = arma_hypot(xi, xj); if(r <= eps) { r = 0; this->rot_cos(i) = c = 1; this->rot_sin(i) = s = 0; } else { this->rot_cos(i) = c = xi / r; this->rot_sin(i) = s = -xj / r; } // 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 this->mat_T(i, i) = r; this->mat_T(i + 1, i) = 0; // Update T[i, i + 1] and T[i + 1, i + 1] // ptr[0] == T[i, i + 1] // ptr[1] == T[i + 1, i + 1] ptr = &(this->mat_T(i, i + 1)); tmp = *ptr; ptr[0] = c * tmp - s * ptr[1]; ptr[1] = s * tmp + c * ptr[1]; if(i < this->n - 2) { // Update T[i, i + 2] and T[i + 1, i + 2] // ptr[0] == T[i, i + 2] == 0 // ptr[1] == T[i + 1, i + 2] ptr = &(this->mat_T(i, i + 2)); ptr[0] = -s * ptr[1]; ptr[1] *= c; } } this->computed = true; } template Mat TridiagQR::matrix_RQ() { arma_extra_debug_sigprint(); arma_debug_check( (this->computed == false), "newarp::TridiagQR::matrix_RQ(): need to call compute() first" ); // Make a copy of the R matrix Mat RQ(this->n, this->n, arma_zeros_indicator()); RQ.diag() = this->mat_T.diag(); RQ.diag(1) = this->mat_T.diag(1); // [m11 m12] will point to RQ[i:(i+1), i:(i+1)] // [m21 m22] eT *m11 = RQ.memptr(), *m12, *m21, *m22, tmp; for(uword i = 0; i < this->n - 1; i++) { const eT c = this->rot_cos(i); const eT s = this->rot_sin(i); m21 = m11 + 1; m12 = m11 + this->n; m22 = m12 + 1; tmp = *m21; // Update diagonal and the below-subdiagonal *m11 = c * (*m11) - s * (*m12); *m21 = c * tmp - s * (*m22); *m22 = s * tmp + c * (*m22); // Move m11 to RQ[i+1, i+1] m11 = m22; } // Copy the below-subdiagonal to above-subdiagonal RQ.diag(1) = RQ.diag(-1); return RQ; } } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/op_cor_bones.hpp0000644000176200001440000000220514124060717023551 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_cor //! @{ class op_cor : public traits_op_default { public: template inline static void apply(Mat& out, const Op< T1, op_cor>& in); template inline static void apply(Mat& out, const Op< Op, op_cor>& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/OpCube_bones.hpp0000644000176200001440000000500114124060717023442 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup OpCube //! @{ //! Analog of the Op class, intended for cubes template class OpCube : public BaseCube< typename T1::elem_type, OpCube > { public: typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; inline explicit OpCube(const BaseCube& in_m); inline OpCube(const BaseCube& in_m, const elem_type in_aux); inline OpCube(const BaseCube& in_m, const elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c); inline OpCube(const BaseCube& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b); inline OpCube(const BaseCube& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c); inline OpCube(const BaseCube& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c, const uword in_aux_uword_d, const char junk); inline ~OpCube(); arma_aligned const T1& m; //!< the operand; must be derived from BaseCube arma_aligned elem_type aux; //!< auxiliary data, using the element type as used by T1 arma_aligned uword aux_uword_a; //!< auxiliary data, uword format arma_aligned uword aux_uword_b; //!< auxiliary data, uword format arma_aligned uword aux_uword_c; //!< auxiliary data, uword format arma_aligned uword aux_uword_d; //!< auxiliary data, uword format }; //! @} RcppArmadillo/inst/include/armadillo_bits/spop_normalise_bones.hpp0000644000176200001440000000221014124060717025316 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_normalise //! @{ class spop_normalise : public traits_op_passthru { public: template inline static void apply(SpMat& out, const SpOp& expr); template inline static void apply_direct(SpMat& out, const SpMat& X, const uword p); }; //! @} RcppArmadillo/inst/include/armadillo_bits/mtGlueCube_meat.hpp0000644000176200001440000000275414124060717024155 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup mtGlueCube //! @{ template inline mtGlueCube::mtGlueCube(const T1& in_A, const T2& in_B) : A(in_A) , B(in_B) { arma_extra_debug_sigprint(); } template inline mtGlueCube::mtGlueCube(const T1& in_A, const T2& in_B, const uword in_aux_uword) : A(in_A) , B(in_B) , aux_uword(in_aux_uword) { arma_extra_debug_sigprint(); } template inline mtGlueCube::~mtGlueCube() { arma_extra_debug_sigprint(); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_svd.hpp0000644000176200001440000001156414124060717022371 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_svd //! @{ template inline bool svd ( Col& S, const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; Mat A(X.get_ref()); const bool status = auxlib::svd_dc(S, A); if(status == false) { S.soft_reset(); arma_debug_warn_level(3, "svd(): decomposition failed"); } return status; } template arma_warn_unused inline Col svd ( const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; Col out; Mat A(X.get_ref()); const bool status = auxlib::svd_dc(out, A); if(status == false) { out.soft_reset(); arma_stop_runtime_error("svd(): decomposition failed"); } return out; } template inline bool svd ( Mat& U, Col& S, Mat& V, const Base& X, const char* method = "dc", const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; arma_debug_check ( ( ((void*)(&U) == (void*)(&S)) || (&U == &V) || ((void*)(&S) == (void*)(&V)) ), "svd(): two or more output objects are the same object" ); const char sig = (method != nullptr) ? method[0] : char(0); arma_debug_check( ((sig != 's') && (sig != 'd')), "svd(): unknown method specified" ); Mat A(X.get_ref()); const bool status = (sig == 'd') ? auxlib::svd_dc(U, S, V, A) : auxlib::svd(U, S, V, A); if(status == false) { U.soft_reset(); S.soft_reset(); V.soft_reset(); arma_debug_warn_level(3, "svd(): decomposition failed"); } return status; } template inline bool svd_econ ( Mat& U, Col& S, Mat& V, const Base& X, const char mode, const char* method = "dc", const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; arma_debug_check ( ( ((void*)(&U) == (void*)(&S)) || (&U == &V) || ((void*)(&S) == (void*)(&V)) ), "svd_econ(): two or more output objects are the same object" ); arma_debug_check ( ( (mode != 'l') && (mode != 'r') && (mode != 'b') ), "svd_econ(): parameter 'mode' is incorrect" ); const char sig = (method != nullptr) ? method[0] : char(0); arma_debug_check( ((sig != 's') && (sig != 'd')), "svd_econ(): unknown method specified" ); Mat A(X.get_ref()); const bool status = ((mode == 'b') && (sig == 'd')) ? auxlib::svd_dc_econ(U, S, V, A) : auxlib::svd_econ(U, S, V, A, mode); if(status == false) { U.soft_reset(); S.soft_reset(); V.soft_reset(); arma_debug_warn_level(3, "svd_econ(): decomposition failed"); } return status; } template inline bool svd_econ ( Mat& U, Col& S, Mat& V, const Base& X, const char* mode = "both", const char* method = "dc", const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); return svd_econ(U, S, V, X, ((mode != nullptr) ? mode[0] : char(0)), method); } //! @} RcppArmadillo/inst/include/armadillo_bits/eOpCube_bones.hpp0000644000176200001440000000561614124060717023623 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup eOpCube //! @{ template class eOpCube : public BaseCube< typename T1::elem_type, eOpCube > { public: typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool use_at = ProxyCube::use_at; static constexpr bool use_mp = ProxyCube::use_mp || eop_type::use_mp; static constexpr bool has_subview = ProxyCube::has_subview; arma_aligned const ProxyCube P; arma_aligned elem_type aux; //!< storage of auxiliary data, user defined format arma_aligned uword aux_uword_a; //!< storage of auxiliary data, uword format arma_aligned uword aux_uword_b; //!< storage of auxiliary data, uword format arma_aligned uword aux_uword_c; //!< storage of auxiliary data, uword format inline ~eOpCube(); inline explicit eOpCube(const BaseCube& in_m); inline eOpCube(const BaseCube& in_m, const elem_type in_aux); inline eOpCube(const BaseCube& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b); inline eOpCube(const BaseCube& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c); inline eOpCube(const BaseCube& in_m, const elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c); arma_inline uword get_n_rows() const; arma_inline uword get_n_cols() const; arma_inline uword get_n_elem_slice() const; arma_inline uword get_n_slices() const; arma_inline uword get_n_elem() const; arma_inline elem_type operator[] (const uword i) const; arma_inline elem_type at (const uword row, const uword col, const uword slice) const; arma_inline elem_type at_alt (const uword i) const; }; //! @} RcppArmadillo/inst/include/armadillo_bits/subview_cube_slices_bones.hpp0000644000176200001440000000654014124060717026322 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup subview_cube_slices //! @{ template class subview_cube_slices : public BaseCube< eT, subview_cube_slices > { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; arma_aligned const Cube& m; arma_aligned const Base& base_si; protected: arma_inline subview_cube_slices(const Cube& in_m, const Base& in_si); public: inline ~subview_cube_slices(); inline subview_cube_slices() = delete; inline void inplace_rand(const uword rand_mode); template inline void inplace_op(const eT val); template inline void inplace_op(const BaseCube& x); inline void fill(const eT val); inline void zeros(); inline void ones(); inline void randu(); inline void randn(); inline void operator+= (const eT val); inline void operator-= (const eT val); inline void operator*= (const eT val); inline void operator/= (const eT val); // deliberately returning void template inline void operator_equ(const subview_cube_slices& x); template inline void operator= (const subview_cube_slices& x); inline void operator= (const subview_cube_slices& x); template inline void operator+= (const subview_cube_slices& x); template inline void operator-= (const subview_cube_slices& x); template inline void operator%= (const subview_cube_slices& x); template inline void operator/= (const subview_cube_slices& x); template inline void operator= (const BaseCube& x); template inline void operator+= (const BaseCube& x); template inline void operator-= (const BaseCube& x); template inline void operator%= (const BaseCube& x); template inline void operator/= (const BaseCube& x); inline static void extract(Cube& out, const subview_cube_slices& in); inline static void plus_inplace(Cube& out, const subview_cube_slices& in); inline static void minus_inplace(Cube& out, const subview_cube_slices& in); inline static void schur_inplace(Cube& out, const subview_cube_slices& in); inline static void div_inplace(Cube& out, const subview_cube_slices& in); friend class Cube; }; //! @} RcppArmadillo/inst/include/armadillo_bits/glue_max_meat.hpp0000644000176200001440000001033014124060717023707 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_max //! @{ template inline void glue_max::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy PA(X.A); const Proxy PB(X.B); if( (PA.is_alias(out) && PA.has_subview) || (PB.is_alias(out) && PB.has_subview) ) { Mat tmp; glue_max::apply(tmp, PA, PB); out.steal_mem(tmp); } else { glue_max::apply(out, PA, PB); } } template inline void glue_max::apply(Mat& out, const Proxy& PA, const Proxy& PB) { arma_extra_debug_sigprint(); const uword n_rows = PA.get_n_rows(); const uword n_cols = PA.get_n_cols(); arma_debug_assert_same_size(n_rows, n_cols, PB.get_n_rows(), PB.get_n_cols(), "element-wise max()"); const arma_gt_comparator comparator; out.set_size(n_rows, n_cols); eT* out_mem = out.memptr(); if( (Proxy::use_at == false) && (Proxy::use_at == false) ) { typename Proxy::ea_type A = PA.get_ea(); typename Proxy::ea_type B = PB.get_ea(); const uword N = PA.get_n_elem(); for(uword i=0; i inline void glue_max::apply(Cube& out, const GlueCube& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const ProxyCube PA(X.A); const ProxyCube PB(X.B); if( (PA.is_alias(out) && PA.has_subview) || (PB.is_alias(out) && PB.has_subview) ) { Cube tmp; glue_max::apply(tmp, PA, PB); out.steal_mem(tmp); } else { glue_max::apply(out, PA, PB); } } template inline void glue_max::apply(Cube& out, const ProxyCube& PA, const ProxyCube& PB) { arma_extra_debug_sigprint(); const uword n_rows = PA.get_n_rows(); const uword n_cols = PA.get_n_cols(); const uword n_slices = PA.get_n_slices(); arma_debug_assert_same_size(n_rows, n_cols, n_slices, PB.get_n_rows(), PB.get_n_cols(), PB.get_n_slices(), "element-wise max()"); const arma_gt_comparator comparator; out.set_size(n_rows, n_cols, n_slices); eT* out_mem = out.memptr(); if( (ProxyCube::use_at == false) && (ProxyCube::use_at == false) ) { typename ProxyCube::ea_type A = PA.get_ea(); typename ProxyCube::ea_type B = PB.get_ea(); const uword N = PA.get_n_elem(); for(uword i=0; i struct fft_store {}; template struct fft_store { static constexpr uword N = fixed_N; arma_aligned cx_type coeffs_array[fixed_N]; inline fft_store() {} inline fft_store(uword) {} arma_inline cx_type* coeffs_ptr() { return &coeffs_array[0]; } arma_inline const cx_type* coeffs_ptr() const { return &coeffs_array[0]; } }; template struct fft_store { const uword N; podarray coeffs_array; inline fft_store() : N(0) {} inline fft_store(uword in_N) : N(in_N) { coeffs_array.set_size(N); } arma_inline cx_type* coeffs_ptr() { return coeffs_array.memptr(); } arma_inline const cx_type* coeffs_ptr() const { return coeffs_array.memptr(); } }; template class fft_engine : public fft_store 0)> { public: typedef typename get_pod_type::result T; using fft_store 0)>::N; using fft_store 0)>::coeffs_ptr; podarray residue; podarray radix; podarray tmp_array; template inline uword calc_radix() { uword i = 0; for(uword n = N, r=4; n >= 2; ++i) { while( (n % r) > 0 ) { switch(r) { case 2: r = 3; break; case 4: r = 2; break; default: r += 2; break; } if(r*r > n) { r = n; } } n /= r; if(fill) { residue[i] = n; radix[i] = r; } } return i; } inline fft_engine(const uword in_N) : fft_store< cx_type, fixed_N, (fixed_N > 0) >(in_N) { arma_extra_debug_sigprint(); const uword len = calc_radix(); residue.set_size(len); radix.set_size(len); calc_radix(); // calculate the constant coefficients cx_type* coeffs = coeffs_ptr(); const T k = T( (inverse) ? +2 : -2 ) * std::acos( T(-1) ) / T(N); for(uword i=0; i < N; ++i) { coeffs[i] = std::exp( cx_type(T(0), i*k) ); } } arma_hot inline void butterfly_2(cx_type* Y, const uword stride, const uword m) { arma_extra_debug_sigprint(); const cx_type* coeffs = coeffs_ptr(); for(uword i=0; i < m; ++i) { const cx_type t = Y[i+m] * coeffs[i*stride]; Y[i+m] = Y[i] - t; Y[i ] += t; } } arma_hot inline void butterfly_3(cx_type* Y, const uword stride, const uword m) { arma_extra_debug_sigprint(); arma_aligned cx_type tmp[5]; cx_type* coeffs1 = coeffs_ptr(); cx_type* coeffs2 = coeffs1; const T coeff_sm_imag = coeffs1[stride*m].imag(); const uword n = m*2; // TODO: rearrange the indices within tmp[] into a more sane order for(uword i = m; i > 0; --i) { tmp[1] = Y[m] * (*coeffs1); tmp[2] = Y[n] * (*coeffs2); tmp[0] = tmp[1] - tmp[2]; tmp[0] *= coeff_sm_imag; tmp[3] = tmp[1] + tmp[2]; Y[m] = cx_type( (Y[0].real() - (T(0.5)*tmp[3].real())), (Y[0].imag() - (T(0.5)*tmp[3].imag())) ); Y[0] += tmp[3]; Y[n] = cx_type( (Y[m].real() + tmp[0].imag()), (Y[m].imag() - tmp[0].real()) ); Y[m] += cx_type( -tmp[0].imag(), tmp[0].real() ); Y++; coeffs1 += stride; coeffs2 += stride*2; } } arma_hot inline void butterfly_4(cx_type* Y, const uword stride, const uword m) { arma_extra_debug_sigprint(); arma_aligned cx_type tmp[7]; const cx_type* coeffs = coeffs_ptr(); const uword m2 = m*2; const uword m3 = m*3; // TODO: rearrange the indices within tmp[] into a more sane order for(uword i=0; i < m; ++i) { tmp[0] = Y[i + m ] * coeffs[i*stride ]; tmp[2] = Y[i + m3] * coeffs[i*stride*3]; tmp[3] = tmp[0] + tmp[2]; //tmp[4] = tmp[0] - tmp[2]; //tmp[4] = (inverse) ? cx_type( -(tmp[4].imag()), tmp[4].real() ) : cx_type( tmp[4].imag(), -tmp[4].real() ); tmp[4] = (inverse) ? cx_type( (tmp[2].imag() - tmp[0].imag()), (tmp[0].real() - tmp[2].real()) ) : cx_type( (tmp[0].imag() - tmp[2].imag()), (tmp[2].real() - tmp[0].real()) ); tmp[1] = Y[i + m2] * coeffs[i*stride*2]; tmp[5] = Y[i] - tmp[1]; Y[i ] += tmp[1]; Y[i + m2] = Y[i] - tmp[3]; Y[i ] += tmp[3]; Y[i + m ] = tmp[5] + tmp[4]; Y[i + m3] = tmp[5] - tmp[4]; } } inline arma_hot void butterfly_5(cx_type* Y, const uword stride, const uword m) { arma_extra_debug_sigprint(); arma_aligned cx_type tmp[13]; const cx_type* coeffs = coeffs_ptr(); const T a_real = coeffs[stride*1*m].real(); const T a_imag = coeffs[stride*1*m].imag(); const T b_real = coeffs[stride*2*m].real(); const T b_imag = coeffs[stride*2*m].imag(); cx_type* Y0 = Y; cx_type* Y1 = Y + 1*m; cx_type* Y2 = Y + 2*m; cx_type* Y3 = Y + 3*m; cx_type* Y4 = Y + 4*m; for(uword i=0; i < m; ++i) { tmp[0] = (*Y0); tmp[1] = (*Y1) * coeffs[stride*1*i]; tmp[2] = (*Y2) * coeffs[stride*2*i]; tmp[3] = (*Y3) * coeffs[stride*3*i]; tmp[4] = (*Y4) * coeffs[stride*4*i]; tmp[7] = tmp[1] + tmp[4]; tmp[8] = tmp[2] + tmp[3]; tmp[9] = tmp[2] - tmp[3]; tmp[10] = tmp[1] - tmp[4]; (*Y0) += tmp[7]; (*Y0) += tmp[8]; tmp[5] = tmp[0] + cx_type( ( (tmp[7].real() * a_real) + (tmp[8].real() * b_real) ), ( (tmp[7].imag() * a_real) + (tmp[8].imag() * b_real) ) ); tmp[6] = cx_type( ( (tmp[10].imag() * a_imag) + (tmp[9].imag() * b_imag) ), ( -(tmp[10].real() * a_imag) - (tmp[9].real() * b_imag) ) ); (*Y1) = tmp[5] - tmp[6]; (*Y4) = tmp[5] + tmp[6]; tmp[11] = tmp[0] + cx_type( ( (tmp[7].real() * b_real) + (tmp[8].real() * a_real) ), ( (tmp[7].imag() * b_real) + (tmp[8].imag() * a_real) ) ); tmp[12] = cx_type( ( -(tmp[10].imag() * b_imag) + (tmp[9].imag() * a_imag) ), ( (tmp[10].real() * b_imag) - (tmp[9].real() * a_imag) ) ); (*Y2) = tmp[11] + tmp[12]; (*Y3) = tmp[11] - tmp[12]; Y0++; Y1++; Y2++; Y3++; Y4++; } } arma_hot inline void butterfly_N(cx_type* Y, const uword stride, const uword m, const uword r) { arma_extra_debug_sigprint(); const cx_type* coeffs = coeffs_ptr(); tmp_array.set_min_size(r); cx_type* tmp = tmp_array.memptr(); for(uword u=0; u < m; ++u) { uword k = u; for(uword v=0; v < r; ++v) { tmp[v] = Y[k]; k += m; } k = u; for(uword v=0; v < r; ++v) { Y[k] = tmp[0]; uword j = 0; for(uword w=1; w < r; ++w) { j += stride * k; if(j >= N) { j -= N; } Y[k] += tmp[w] * coeffs[j]; } k += m; } } } inline void run(cx_type* Y, const cx_type* X, const uword stage = 0, const uword stride = 1) { arma_extra_debug_sigprint(); const uword m = residue[stage]; const uword r = radix[stage]; const cx_type *Y_end = Y + r*m; if(m == 1) { for(cx_type* Yi = Y; Yi != Y_end; Yi++, X += stride) { (*Yi) = (*X); } } else { const uword next_stage = stage + 1; const uword next_stride = stride * r; for(cx_type* Yi = Y; Yi != Y_end; Yi += m, X += stride) { run(Yi, X, next_stage, next_stride); } } switch(r) { case 2: butterfly_2(Y, stride, m ); break; case 3: butterfly_3(Y, stride, m ); break; case 4: butterfly_4(Y, stride, m ); break; case 5: butterfly_5(Y, stride, m ); break; default: butterfly_N(Y, stride, m, r); break; } } }; //! @} RcppArmadillo/inst/include/armadillo_bits/promote_type.hpp0000644000176200001440000003404414124060717023636 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup promote_type //! @{ template struct is_promotable { static constexpr bool value = false; typedef T1 result; }; struct is_promotable_ok { static constexpr bool value = true; }; template struct is_promotable : public is_promotable_ok { typedef T result; }; template struct is_promotable, T> : public is_promotable_ok { typedef std::complex result; }; template<> struct is_promotable, std::complex> : public is_promotable_ok { typedef std::complex result; }; template<> struct is_promotable, float> : public is_promotable_ok { typedef std::complex result; }; template<> struct is_promotable, double> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable, u64> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable, s64> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable, ulng_t> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable, slng_t> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable, s32> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable, u32> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable, s16> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable, u16> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable, s8> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable, u8> : public is_promotable_ok { typedef std::complex result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef u64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef u64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef u64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s64 result; }; // float ? template<> struct is_promotable : public is_promotable_ok { typedef s64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s32 result; }; // float ? template<> struct is_promotable : public is_promotable_ok { typedef s32 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s32 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s32 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s32 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s32 result; }; // float ? template<> struct is_promotable : public is_promotable_ok { typedef u32 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s32 result; }; // float ? template<> struct is_promotable : public is_promotable_ok { typedef u32 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s16 result; }; // s32 ? template<> struct is_promotable : public is_promotable_ok { typedef s16 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s16 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s16 result; }; // s32 ? template<> struct is_promotable : public is_promotable_ok { typedef u16 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s8 result; }; // s16 ? // // mirrored versions template struct is_promotable> : public is_promotable_ok { typedef std::complex result; }; template<> struct is_promotable, std::complex> : public is_promotable_ok { typedef std::complex result; }; template<> struct is_promotable> : public is_promotable_ok { typedef std::complex result; }; template<> struct is_promotable > : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable> : public is_promotable_ok { typedef std::complex result; }; template struct is_promotable> : public is_promotable_ok { typedef std::complex result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef double result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef float result; }; template<> struct is_promotable : public is_promotable_ok { typedef u64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef u64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef u64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s64 result; }; // float ? template<> struct is_promotable : public is_promotable_ok { typedef s64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s64 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s32 result; }; // float ? template<> struct is_promotable : public is_promotable_ok { typedef s32 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s32 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s32 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s32 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s32 result; }; // float ? template<> struct is_promotable : public is_promotable_ok { typedef u32 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s32 result; }; // float ? template<> struct is_promotable : public is_promotable_ok { typedef u32 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s16 result; }; // s32 ? template<> struct is_promotable : public is_promotable_ok { typedef s16 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s16 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s16 result; }; // s32 ? template<> struct is_promotable : public is_promotable_ok { typedef u16 result; }; template<> struct is_promotable : public is_promotable_ok { typedef s8 result; }; // s16 ? template struct promote_type { inline static void check() { arma_type_check(( is_promotable::value == false )); } typedef typename is_promotable::result result; }; template struct eT_promoter { typedef typename promote_type::result eT; }; //! @} RcppArmadillo/inst/include/armadillo_bits/wall_clock_bones.hpp0000644000176200001440000000232614124060717024406 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup wall_clock //! @{ //! Class for measuring time intervals class wall_clock { public: inline wall_clock(); inline ~wall_clock(); inline void tic(); //!< start the timer inline arma_warn_unused double toc(); //!< return the number of seconds since the last call to tic() private: bool valid = false; std::chrono::steady_clock::time_point chrono_time1; }; //! @} RcppArmadillo/inst/include/armadillo_bits/podarray_meat.hpp0000644000176200001440000001544214124060717023740 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup podarray //! @{ template arma_hot inline podarray::~podarray() { arma_extra_debug_sigprint_this(this); if(n_elem > podarray_prealloc_n_elem::val ) { memory::release( mem ); } } template inline podarray::podarray() : n_elem(0) , mem (0) { arma_extra_debug_sigprint_this(this); } template inline podarray::podarray(const podarray& x) : n_elem(x.n_elem) { arma_extra_debug_sigprint(); const uword x_n_elem = x.n_elem; init_cold(x_n_elem); arrayops::copy( memptr(), x.memptr(), x_n_elem ); } template inline const podarray& podarray::operator=(const podarray& x) { arma_extra_debug_sigprint(); if(this != &x) { const uword x_n_elem = x.n_elem; init_warm(x_n_elem); arrayops::copy( memptr(), x.memptr(), x_n_elem ); } return *this; } template arma_hot arma_inline podarray::podarray(const uword new_n_elem) : n_elem(new_n_elem) { arma_extra_debug_sigprint_this(this); init_cold(new_n_elem); } template arma_inline podarray::podarray(const eT* X, const uword new_n_elem) : n_elem(new_n_elem) { arma_extra_debug_sigprint_this(this); init_cold(new_n_elem); arrayops::copy( memptr(), X, new_n_elem ); } // template // template // inline // podarray::podarray(const Proxy& P) // : n_elem(P.get_n_elem()) // { // arma_extra_debug_sigprint_this(this); // // const uword P_n_elem = P.get_n_elem(); // // init_cold(P_n_elem); // // eT* out_mem = (*this).memptr(); // // if(Proxy::use_at == false) // { // typename Proxy::ea_type A = P.get_ea(); // // uword i,j; // for(i=0, j=1; j < P_n_elem; i+=2, j+=2) // { // const eT val_i = A[i]; // const eT val_j = A[j]; // // out_mem[i] = val_i; // out_mem[j] = val_j; // } // // if(i < P_n_elem) // { // out_mem[i] = A[i]; // } // } // else // { // const uword P_n_rows = P.get_n_rows(); // const uword P_n_cols = P.get_n_cols(); // // if(P_n_rows != 1) // { // uword count = 0; // // for(uword col=0; col < P_n_cols; ++col) // for(uword row=0; row < P_n_rows; ++row, ++count) // { // out_mem[count] = P.at(row,col); // } // } // else // { // for(uword col=0; col < P_n_cols; ++col) // { // out_mem[col] = P.at(0,col); // } // } // } // } template arma_inline eT podarray::operator[] (const uword i) const { return mem[i]; } template arma_inline eT& podarray::operator[] (const uword i) { return access::rw(mem[i]); } template arma_inline eT podarray::operator() (const uword i) const { arma_debug_check_bounds( (i >= n_elem), "podarray::operator(): index out of bounds" ); return mem[i]; } template arma_inline eT& podarray::operator() (const uword i) { arma_debug_check_bounds( (i >= n_elem), "podarray::operator(): index out of bounds" ); return access::rw(mem[i]); } template inline void podarray::set_min_size(const uword min_n_elem) { arma_extra_debug_sigprint(); if(min_n_elem > n_elem) { init_warm(min_n_elem); } } template inline void podarray::set_size(const uword new_n_elem) { arma_extra_debug_sigprint(); init_warm(new_n_elem); } template inline void podarray::reset() { arma_extra_debug_sigprint(); init_warm(0); } template inline void podarray::fill(const eT val) { arma_extra_debug_sigprint(); arrayops::inplace_set(memptr(), val, n_elem); } template inline void podarray::zeros() { arma_extra_debug_sigprint(); arrayops::fill_zeros(memptr(), n_elem); } template inline void podarray::zeros(const uword new_n_elem) { arma_extra_debug_sigprint(); init_warm(new_n_elem); arrayops::fill_zeros(memptr(), n_elem); } template arma_inline eT* podarray::memptr() { return mem; } template arma_inline const eT* podarray::memptr() const { return mem; } template inline void podarray::copy_row(const Mat& A, const uword row) { const uword cols = A.n_cols; // note: this function assumes that the podarray has been set to the correct size beforehand eT* out = memptr(); switch(cols) { default: { uword i,j; for(i=0, j=1; j < cols; i+=2, j+=2) { const eT tmp_i = A.at(row, i); const eT tmp_j = A.at(row, j); out[i] = tmp_i; out[j] = tmp_j; } if(i < cols) { out[i] = A.at(row, i); } } break; case 8: out[7] = A.at(row, 7); // fallthrough case 7: out[6] = A.at(row, 6); // fallthrough case 6: out[5] = A.at(row, 5); // fallthrough case 5: out[4] = A.at(row, 4); // fallthrough case 4: out[3] = A.at(row, 3); // fallthrough case 3: out[2] = A.at(row, 2); // fallthrough case 2: out[1] = A.at(row, 1); // fallthrough case 1: out[0] = A.at(row, 0); // fallthrough case 0: ; // fallthrough } } template inline void podarray::init_cold(const uword new_n_elem) { arma_extra_debug_sigprint(); mem = (new_n_elem <= podarray_prealloc_n_elem::val) ? mem_local : memory::acquire(new_n_elem); } template inline void podarray::init_warm(const uword new_n_elem) { arma_extra_debug_sigprint(); if(n_elem == new_n_elem) { return; } if(n_elem > podarray_prealloc_n_elem::val) { memory::release( mem ); } mem = (new_n_elem <= podarray_prealloc_n_elem::val) ? mem_local : memory::acquire(new_n_elem); access::rw(n_elem) = new_n_elem; } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_inplace_strans.hpp0000644000176200001440000000512114124060717024572 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_inplace_strans //! @{ template inline void inplace_strans ( Mat& X, const char* method = "std" ) { arma_extra_debug_sigprint(); const char sig = (method != nullptr) ? method[0] : char(0); arma_debug_check( ((sig != 's') && (sig != 'l')), "inplace_strans(): unknown method specified" ); const bool low_memory = (sig == 'l'); if( (low_memory == false) || (X.n_rows == X.n_cols) ) { op_strans::apply_mat_inplace(X); } else { // in-place algorithm inspired by: // Fred G. Gustavson, Tadeusz Swirszcz. // In-Place Transposition of Rectangular Matrices. // Applied Parallel Computing. State of the Art in Scientific Computing. // Lecture Notes in Computer Science. Volume 4699, pp. 560-569, 2007. // X.set_size() will check whether we can change the dimensions of X; // X.set_size() will also reuse existing memory, as the number of elements hasn't changed X.set_size(X.n_cols, X.n_rows); const uword m = X.n_cols; const uword n = X.n_rows; std::vector visited(X.n_elem); // TODO: replace std::vector with a better implementation for(uword col = 0; col < m; ++col) for(uword row = 0; row < n; ++row) { const uword pos = col*n + row; if(visited[pos] == false) { uword curr_pos = pos; eT val = X.at(row, col); while(visited[curr_pos] == false) { visited[curr_pos] = true; const uword j = curr_pos / m; const uword i = curr_pos - m * j; const eT tmp = X.at(j, i); X.at(j, i) = val; val = tmp; curr_pos = i*n + j; } } } } } //! @} RcppArmadillo/inst/include/armadillo_bits/Proxy.hpp0000644000176200001440000027477014124060717022245 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup Proxy //! @{ // within each specialisation of the Proxy class: // // elem_type = the type of the elements obtained from object Q // pod_type = the underlying type of elements if elem_type is std::complex // stored_type = the type of the Q object // ea_type = the type of the object that provides access to elements via operator[i] // aligned_ea_type = the type of the object that provides access to elements via at_alt(i) // // use_at = boolean indicating whether at(row,col) must be used to get elements // use_mp = boolean indicating whether OpenMP can be used while processing elements // has_subview = boolean indicating whether the Q object has a subview // // is_row = boolean indicating whether the Q object can be treated a row vector // is_col = boolean indicating whether the Q object can be treated a column vector // is_xvec = boolean indicating whether the Q object is a vector with unknown orientation // // Q = object that can be unwrapped via the unwrap family of classes (ie. Q must be convertible to Mat) // // get_n_rows() = return the number of rows in Q // get_n_cols() = return the number of columns in Q // get_n_elem() = return the number of elements in Q // // operator[i] = linear element accessor; valid only if the 'use_at' boolean is false // at(row,col) = access elements via (row,col); valid only if the 'use_at' boolean is true // at_alt(i) = aligned linear element accessor; valid only if the 'use_at' boolean is false and is_aligned() returns true // // get_ea() = return the object that provides linear access to elements via operator[i] // get_aligned_ea() = return the object that provides linear access to elements via at_alt(i); valid only if is_aligned() returns true // // is_alias(X) = return true/false indicating whether the Q object aliases matrix X // has_overlap(X) = return true/false indicating whether the Q object has overlap with subview X // is_aligned() = return true/false indicating whether the Q object has aligned memory template struct Proxy_default { inline Proxy_default(const T1&) { arma_type_check(( is_arma_type::value == false )); } }; template struct Proxy_fixed { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef T1 stored_type; typedef const elem_type* ea_type; typedef const T1& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = T1::is_row; static constexpr bool is_col = T1::is_col; static constexpr bool is_xvec = T1::is_xvec; arma_aligned const T1& Q; inline explicit Proxy_fixed(const T1& A) : Q(A) { arma_extra_debug_sigprint(); } //// this may require T1::n_elem etc to be declared as static constexpr inline variables (C++17) //// see also the notes in Mat::fixed //// https://en.cppreference.com/w/cpp/language/static //// https://en.cppreference.com/w/cpp/language/inline // // static constexpr uword get_n_rows() { return T1::n_rows; } // static constexpr uword get_n_cols() { return T1::n_cols; } // static constexpr uword get_n_elem() { return T1::n_elem; } arma_inline uword get_n_rows() const { return is_row ? 1 : T1::n_rows; } arma_inline uword get_n_cols() const { return is_col ? 1 : T1::n_cols; } arma_inline uword get_n_elem() const { return T1::n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&Q) == void_ptr(&X)); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } arma_inline bool is_aligned() const { #if defined(ARMA_HAVE_ALIGNED_ATTRIBUTE) return true; #else return memory::is_aligned(Q.memptr()); #endif } }; template struct Proxy_redirect {}; template struct Proxy_redirect { typedef Proxy_default result; }; template struct Proxy_redirect { typedef Proxy_fixed result; }; template struct Proxy : public Proxy_redirect::value>::result { inline Proxy(const T1& A) : Proxy_redirect::value>::result(A) { } }; template struct Proxy< Mat > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const eT* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; arma_aligned const Mat& Q; inline explicit Proxy(const Mat& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return (is_same_type::value) ? (void_ptr(&Q) == void_ptr(&X)) : false; } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy< Col > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef Col stored_type; typedef const eT* ea_type; typedef const Col& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const Col& Q; inline explicit Proxy(const Col& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword) const { return Q[r]; } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return (is_same_type::value) ? (void_ptr(&Q) == void_ptr(&X)) : false; } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy< Row > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef Row stored_type; typedef const eT* ea_type; typedef const Row& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = true; static constexpr bool is_col = false; static constexpr bool is_xvec = false; arma_aligned const Row& Q; inline explicit Proxy(const Row& A) : Q(A) { arma_extra_debug_sigprint(); } constexpr uword get_n_rows() const { return 1; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword, const uword c) const { return Q[c]; } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return (is_same_type::value) ? (void_ptr(&Q) == void_ptr(&X)) : false; } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy< Gen > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Gen stored_type; typedef const Gen& ea_type; typedef const Gen& aligned_ea_type; static constexpr bool use_at = Gen::use_at; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = Gen::is_row; static constexpr bool is_col = Gen::is_col; static constexpr bool is_xvec = Gen::is_xvec; arma_aligned const Gen& Q; inline explicit Proxy(const Gen& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return (is_row ? 1 : Q.n_rows); } arma_inline uword get_n_cols() const { return (is_col ? 1 : Q.n_cols); } arma_inline uword get_n_elem() const { return (is_row ? 1 : Q.n_rows) * (is_col ? 1 : Q.n_cols); } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } arma_inline elem_type at_alt (const uword i) const { return Q[i]; } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Mat&) const { return false; } template constexpr bool has_overlap(const subview&) const { return false; } arma_inline bool is_aligned() const { return Gen::is_simple; } }; template struct Proxy< Gen > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const elem_type* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = Gen::is_row; static constexpr bool is_col = Gen::is_col; static constexpr bool is_xvec = Gen::is_xvec; arma_aligned const Mat Q; inline explicit Proxy(const Gen& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return (is_row ? 1 : Q.n_rows); } arma_inline uword get_n_cols() const { return (is_col ? 1 : Q.n_cols); } arma_inline uword get_n_elem() const { return (is_row ? 1 : Q.n_rows) * (is_col ? 1 : Q.n_cols); } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Mat&) const { return false; } template constexpr bool has_overlap(const subview&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy< Gen > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const elem_type* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = Gen::is_row; static constexpr bool is_col = Gen::is_col; static constexpr bool is_xvec = Gen::is_xvec; arma_aligned const Mat Q; inline explicit Proxy(const Gen& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return (is_row ? 1 : Q.n_rows); } arma_inline uword get_n_cols() const { return (is_col ? 1 : Q.n_cols); } arma_inline uword get_n_elem() const { return (is_row ? 1 : Q.n_rows) * (is_col ? 1 : Q.n_cols); } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Mat&) const { return false; } template constexpr bool has_overlap(const subview&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy< eOp > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef eOp stored_type; typedef const eOp& ea_type; typedef const eOp& aligned_ea_type; static constexpr bool use_at = eOp::use_at; static constexpr bool use_mp = eOp::use_mp; static constexpr bool has_subview = eOp::has_subview; static constexpr bool is_row = eOp::is_row; static constexpr bool is_col = eOp::is_col; static constexpr bool is_xvec = eOp::is_xvec; arma_aligned const eOp& Q; inline explicit Proxy(const eOp& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return is_row ? 1 : Q.get_n_rows(); } arma_inline uword get_n_cols() const { return is_col ? 1 : Q.get_n_cols(); } arma_inline uword get_n_elem() const { return Q.get_n_elem(); } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return Q.P.is_alias(X); } template arma_inline bool has_overlap(const subview& X) const { return Q.P.has_overlap(X); } arma_inline bool is_aligned() const { return Q.P.is_aligned(); } }; template struct Proxy< eGlue > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef eGlue stored_type; typedef const eGlue& ea_type; typedef const eGlue& aligned_ea_type; static constexpr bool use_at = eGlue::use_at; static constexpr bool use_mp = eGlue::use_mp; static constexpr bool has_subview = eGlue::has_subview; static constexpr bool is_row = eGlue::is_row; static constexpr bool is_col = eGlue::is_col; static constexpr bool is_xvec = eGlue::is_xvec; arma_aligned const eGlue& Q; inline explicit Proxy(const eGlue& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return is_row ? 1 : Q.get_n_rows(); } arma_inline uword get_n_cols() const { return is_col ? 1 : Q.get_n_cols(); } arma_inline uword get_n_elem() const { return Q.get_n_elem(); } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return (Q.P1.is_alias(X) || Q.P2.is_alias(X)); } template arma_inline bool has_overlap(const subview& X) const { return (Q.P1.has_overlap(X) || Q.P2.has_overlap(X)); } arma_inline bool is_aligned() const { return (Q.P1.is_aligned() && Q.P2.is_aligned()); } }; template struct Proxy< Op > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const elem_type* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = Op::is_row; static constexpr bool is_col = Op::is_col; static constexpr bool is_xvec = Op::is_xvec; arma_aligned const Mat Q; inline explicit Proxy(const Op& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; } arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Mat&) const { return false; } template constexpr bool has_overlap(const subview&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy< Glue > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const elem_type* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = Glue::is_row; static constexpr bool is_col = Glue::is_col; static constexpr bool is_xvec = Glue::is_xvec; arma_aligned const Mat Q; inline explicit Proxy(const Glue& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; } arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Mat&) const { return false; } template constexpr bool has_overlap(const subview&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy< Glue > { typedef Glue this_Glue_type; typedef Proxy< Glue > this_Proxy_type; typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef this_Glue_type stored_type; typedef const this_Proxy_type& ea_type; typedef const this_Proxy_type& aligned_ea_type; static constexpr bool use_at = (Proxy::use_at || Proxy::use_at ); static constexpr bool use_mp = (Proxy::use_mp || Proxy::use_mp ); static constexpr bool has_subview = (Proxy::has_subview || Proxy::has_subview); static constexpr bool is_row = this_Glue_type::is_row; static constexpr bool is_col = this_Glue_type::is_col; static constexpr bool is_xvec = this_Glue_type::is_xvec; arma_aligned const this_Glue_type& Q; arma_aligned const Proxy P1; arma_aligned const Proxy P2; arma_lt_comparator comparator; inline explicit Proxy(const this_Glue_type& X) : Q (X ) , P1(X.A) , P2(X.B) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(P1, P2, "element-wise min()"); } arma_inline uword get_n_rows() const { return is_row ? 1 : P1.get_n_rows(); } arma_inline uword get_n_cols() const { return is_col ? 1 : P1.get_n_cols(); } arma_inline uword get_n_elem() const { return P1.get_n_elem(); } arma_inline elem_type operator[] (const uword i) const { const elem_type A = P1[i]; const elem_type B = P2[i]; return comparator(A,B) ? A : B; } arma_inline elem_type at (const uword r, const uword c) const { const elem_type A = P1.at(r,c); const elem_type B = P2.at(r,c); return comparator(A,B) ? A : B; } arma_inline elem_type at_alt (const uword i) const { const elem_type A = P1.at_alt(i); const elem_type B = P2.at_alt(i); return comparator(A,B) ? A : B; } arma_inline ea_type get_ea() const { return *this; } arma_inline aligned_ea_type get_aligned_ea() const { return *this; } template arma_inline bool is_alias(const Mat& X) const { return (P1.is_alias(X) || P2.is_alias(X)); } template arma_inline bool has_overlap(const subview& X) const { return (P1.has_overlap(X) || P2.has_overlap(X)); } arma_inline bool is_aligned() const { return (P1.is_aligned() && P2.is_aligned()); } }; template struct Proxy< Glue > { typedef Glue this_Glue_type; typedef Proxy< Glue > this_Proxy_type; typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef this_Glue_type stored_type; typedef const this_Proxy_type& ea_type; typedef const this_Proxy_type& aligned_ea_type; static constexpr bool use_at = (Proxy::use_at || Proxy::use_at ); static constexpr bool use_mp = (Proxy::use_mp || Proxy::use_mp ); static constexpr bool has_subview = (Proxy::has_subview || Proxy::has_subview); static constexpr bool is_row = this_Glue_type::is_row; static constexpr bool is_col = this_Glue_type::is_col; static constexpr bool is_xvec = this_Glue_type::is_xvec; arma_aligned const this_Glue_type& Q; arma_aligned const Proxy P1; arma_aligned const Proxy P2; arma_gt_comparator comparator; inline explicit Proxy(const this_Glue_type& X) : Q (X ) , P1(X.A) , P2(X.B) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(P1, P2, "element-wise max()"); } arma_inline uword get_n_rows() const { return is_row ? 1 : P1.get_n_rows(); } arma_inline uword get_n_cols() const { return is_col ? 1 : P1.get_n_cols(); } arma_inline uword get_n_elem() const { return P1.get_n_elem(); } arma_inline elem_type operator[] (const uword i) const { const elem_type A = P1[i]; const elem_type B = P2[i]; return comparator(A,B) ? A : B; } arma_inline elem_type at (const uword r, const uword c) const { const elem_type A = P1.at(r,c); const elem_type B = P2.at(r,c); return comparator(A,B) ? A : B; } arma_inline elem_type at_alt (const uword i) const { const elem_type A = P1.at_alt(i); const elem_type B = P2.at_alt(i); return comparator(A,B) ? A : B; } arma_inline ea_type get_ea() const { return *this; } arma_inline aligned_ea_type get_aligned_ea() const { return *this; } template arma_inline bool is_alias(const Mat& X) const { return (P1.is_alias(X) || P2.is_alias(X)); } template arma_inline bool has_overlap(const subview& X) const { return (P1.has_overlap(X) || P2.has_overlap(X)); } arma_inline bool is_aligned() const { return (P1.is_aligned() && P2.is_aligned()); } }; template struct Proxy< mtOp > { typedef out_eT elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const elem_type* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = mtOp::is_row; static constexpr bool is_col = mtOp::is_col; static constexpr bool is_xvec = mtOp::is_xvec; arma_aligned const Mat Q; inline explicit Proxy(const mtOp& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; } arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r,c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Mat&) const { return false; } template constexpr bool has_overlap(const subview&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy< mtGlue > { typedef out_eT elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const elem_type* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = mtGlue::is_row; static constexpr bool is_col = mtGlue::is_col; static constexpr bool is_xvec = mtGlue::is_xvec; arma_aligned const Mat Q; inline explicit Proxy(const mtGlue& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; } arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r,c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Mat&) const { return false; } template constexpr bool has_overlap(const subview&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy< CubeToMatOp > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const elem_type* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = CubeToMatOp::is_row; static constexpr bool is_col = CubeToMatOp::is_col; static constexpr bool is_xvec = CubeToMatOp::is_xvec; arma_aligned const Mat Q; inline explicit Proxy(const CubeToMatOp& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; } arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Mat&) const { return false; } template constexpr bool has_overlap(const subview&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy< CubeToMatOp > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const elem_type* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const unwrap_cube U; arma_aligned const Mat Q; inline explicit Proxy(const CubeToMatOp& A) : U(A.m) , Q(const_cast(U.M.memptr()), U.M.n_elem, 1, false, true) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword) const { return Q[r]; } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Mat&) const { return false; } template constexpr bool has_overlap(const subview&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy< SpToDOp > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const elem_type* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = SpToDOp::is_row; static constexpr bool is_col = SpToDOp::is_col; static constexpr bool is_xvec = SpToDOp::is_xvec; arma_aligned const Mat Q; inline explicit Proxy(const SpToDOp& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; } arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Mat&) const { return false; } template constexpr bool has_overlap(const subview&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy< SpToDOp > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const elem_type* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const unwrap_spmat U; arma_aligned const Mat Q; inline explicit Proxy(const SpToDOp& A) : U(A.m) , Q(const_cast(U.M.values), U.M.n_nonzero, 1, false, true) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword) const { return Q[r]; } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Mat&) const { return false; } template constexpr bool has_overlap(const subview&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy< subview > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef subview stored_type; typedef const subview& ea_type; typedef const subview& aligned_ea_type; static constexpr bool use_at = true; static constexpr bool use_mp = false; static constexpr bool has_subview = true; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; arma_aligned const subview& Q; inline explicit Proxy(const subview& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } arma_inline elem_type at_alt (const uword i) const { return Q[i]; } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return (is_same_type::value) ? (void_ptr(&(Q.m)) == void_ptr(&X)) : false; } template arma_inline bool has_overlap(const subview& X) const { return Q.check_overlap(X); } constexpr bool is_aligned() const { return false; } }; template struct Proxy< subview_col > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef subview_col stored_type; typedef const eT* ea_type; typedef const subview_col& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = true; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const subview_col& Q; inline explicit Proxy(const subview_col& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword) const { return Q[r]; } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.colmem; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return (is_same_type::value) ? (void_ptr(&(Q.m)) == void_ptr(&X)) : false; } template arma_inline bool has_overlap(const subview& X) const { return Q.check_overlap(X); } arma_inline bool is_aligned() const { return memory::is_aligned(Q.colmem); } }; template struct Proxy< subview_cols > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const eT* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = true; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; arma_aligned const subview_cols& sv; arma_aligned const Mat Q; inline explicit Proxy(const subview_cols& A) : sv(A) , Q ( const_cast( A.colptr(0) ), A.n_rows, A.n_cols, false, false ) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r,c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return (is_same_type::value) ? (void_ptr(&(sv.m)) == void_ptr(&X)) : false; } template arma_inline bool has_overlap(const subview& X) const { return sv.check_overlap(X); } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy< subview_row > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef subview_row stored_type; typedef const subview_row& ea_type; typedef const subview_row& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = true; static constexpr bool is_row = true; static constexpr bool is_col = false; static constexpr bool is_xvec = false; arma_aligned const subview_row& Q; inline explicit Proxy(const subview_row& A) : Q(A) { arma_extra_debug_sigprint(); } constexpr uword get_n_rows() const { return 1; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword, const uword c) const { return Q[c]; } arma_inline elem_type at_alt (const uword i) const { return Q[i]; } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return (is_same_type::value) ? (void_ptr(&(Q.m)) == void_ptr(&X)) : false; } template arma_inline bool has_overlap(const subview& X) const { return Q.check_overlap(X); } constexpr bool is_aligned() const { return false; } }; template struct Proxy< subview_elem1 > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef subview_elem1 stored_type; typedef const Proxy< subview_elem1 >& ea_type; typedef const Proxy< subview_elem1 >& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = true; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const subview_elem1& Q; arma_aligned const Proxy R; inline explicit Proxy(const subview_elem1& A) : Q(A) , R(A.a.get_ref()) { arma_extra_debug_sigprint(); const bool R_is_vec = ((R.get_n_rows() == 1) || (R.get_n_cols() == 1)); const bool R_is_empty = (R.get_n_elem() == 0); arma_debug_check( ((R_is_vec == false) && (R_is_empty == false)), "Mat::elem(): given object must be a vector" ); } arma_inline uword get_n_rows() const { return R.get_n_elem(); } constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return R.get_n_elem(); } arma_inline elem_type operator[] (const uword i) const { const uword ii = (Proxy::use_at) ? R.at(i,0) : R[i]; arma_debug_check_bounds( (ii >= Q.m.n_elem), "Mat::elem(): index out of bounds" ); return Q.m[ii]; } arma_inline elem_type at (const uword r, const uword) const { const uword ii = (Proxy::use_at) ? R.at(r,0) : R[r]; arma_debug_check_bounds( (ii >= Q.m.n_elem), "Mat::elem(): index out of bounds" ); return Q.m[ii]; } arma_inline elem_type at_alt (const uword i) const { const uword ii = (Proxy::use_at) ? R.at(i,0) : R[i]; arma_debug_check_bounds( (ii >= Q.m.n_elem), "Mat::elem(): index out of bounds" ); return Q.m[ii]; } arma_inline ea_type get_ea() const { return (*this); } arma_inline aligned_ea_type get_aligned_ea() const { return (*this); } template arma_inline bool is_alias(const Mat& X) const { return ( (void_ptr(&X) == void_ptr(&(Q.m))) || (R.is_alias(X)) ); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } constexpr bool is_aligned() const { return false; } }; template struct Proxy< subview_elem2 > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const eT* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; arma_aligned const Mat Q; inline explicit Proxy(const subview_elem2& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Mat&) const { return false; } template constexpr bool has_overlap(const subview&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy< diagview > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef diagview stored_type; typedef const diagview& ea_type; typedef const diagview& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = true; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const diagview& Q; inline explicit Proxy(const diagview& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword) const { return Q.at(r, 0); } arma_inline elem_type at_alt (const uword i) const { return Q[i]; } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return (is_same_type::value) ? (void_ptr(&(Q.m)) == void_ptr(&X)) : false; } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } constexpr bool is_aligned() const { return false; } }; template struct Proxy_diagvec_mat { inline Proxy_diagvec_mat(const T1&) {} }; template struct Proxy_diagvec_mat< Op > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef diagview stored_type; typedef const diagview& ea_type; typedef const diagview& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = true; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const Mat& R; arma_aligned const diagview Q; inline explicit Proxy_diagvec_mat(const Op& A) : R(A.m), Q( R.diag() ) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword) const { return Q.at(r, 0); } arma_inline elem_type at_alt (const uword i) const { return Q[i]; } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&R) == void_ptr(&X)); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } constexpr bool is_aligned() const { return false; } }; template struct Proxy_diagvec_expr { inline Proxy_diagvec_expr(const T1&) {} }; template struct Proxy_diagvec_expr< Op > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const elem_type* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const Mat Q; inline explicit Proxy_diagvec_expr(const Op& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword) const { return Q.at(r, 0); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Mat&) const { return false; } template constexpr bool has_overlap(const subview&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy_diagvec_redirect {}; template struct Proxy_diagvec_redirect< Op, true > { typedef Proxy_diagvec_mat < Op > result; }; template struct Proxy_diagvec_redirect< Op, false> { typedef Proxy_diagvec_expr< Op > result; }; template struct Proxy< Op > : public Proxy_diagvec_redirect< Op, is_Mat::value >::result { typedef typename Proxy_diagvec_redirect< Op, is_Mat::value >::result Proxy_diagvec; inline explicit Proxy(const Op& A) : Proxy_diagvec(A) { arma_extra_debug_sigprint(); } }; template struct Proxy< Op > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const elem_type* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const Mat Q; inline explicit Proxy(const Op& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword) const { return Q.at(r, 0); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Mat&) const { return false; } template constexpr bool has_overlap(const subview&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy_xtrans_default { inline Proxy_xtrans_default(const T1&) {} }; template struct Proxy_xtrans_default< Op > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef xtrans_mat stored_type; typedef const xtrans_mat& ea_type; typedef const xtrans_mat& aligned_ea_type; static constexpr bool use_at = true; static constexpr bool use_mp = false; static constexpr bool has_subview = true; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; const unwrap U; const xtrans_mat Q; inline explicit Proxy_xtrans_default(const Op& A) : U(A.m) , Q(U.M) { arma_extra_debug_sigprint(); } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return void_ptr(&(U.M)) == void_ptr(&X); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } constexpr bool is_aligned() const { return false; } }; template struct Proxy_xtrans_default< Op > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef xtrans_mat stored_type; typedef const xtrans_mat& ea_type; typedef const xtrans_mat& aligned_ea_type; static constexpr bool use_at = true; static constexpr bool use_mp = false; static constexpr bool has_subview = true; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; const unwrap U; const xtrans_mat Q; inline explicit Proxy_xtrans_default(const Op& A) : U(A.m) , Q(U.M) { arma_extra_debug_sigprint(); } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return void_ptr(&(U.M)) == void_ptr(&X); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } constexpr bool is_aligned() const { return false; } }; template struct Proxy_xtrans_vector { inline Proxy_xtrans_vector(const T1&) {} }; template struct Proxy_xtrans_vector< Op > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const elem_type* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = quasi_unwrap::has_subview; // NOTE: the Op class takes care of swapping row and col for op_htrans static constexpr bool is_row = Op::is_row; static constexpr bool is_col = Op::is_col; static constexpr bool is_xvec = Op::is_xvec; arma_aligned const quasi_unwrap U; // avoid copy if T1 is a Row, Col or subview_col arma_aligned const Mat Q; inline Proxy_xtrans_vector(const Op& A) : U(A.m) , Q(const_cast(U.M.memptr()), U.M.n_cols, U.M.n_rows, false, false) { arma_extra_debug_sigprint(); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return U.is_alias(X); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy_xtrans_vector< Op > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const elem_type* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = quasi_unwrap::has_subview; // NOTE: the Op class takes care of swapping row and col for op_strans static constexpr bool is_row = Op::is_row; static constexpr bool is_col = Op::is_col; static constexpr bool is_xvec = Op::is_xvec; arma_aligned const quasi_unwrap U; // avoid copy if T1 is a Row, Col or subview_col arma_aligned const Mat Q; inline Proxy_xtrans_vector(const Op& A) : U(A.m) , Q(const_cast(U.M.memptr()), U.M.n_cols, U.M.n_rows, false, false) { arma_extra_debug_sigprint(); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return U.is_alias(X); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy_xtrans_redirect {}; template struct Proxy_xtrans_redirect { typedef Proxy_xtrans_default result; }; template struct Proxy_xtrans_redirect { typedef Proxy_xtrans_vector result; }; template struct Proxy< Op > : public Proxy_xtrans_redirect < Op, ((is_cx::no) && ((Op::is_row) || (Op::is_col)) ) >::result { typedef typename Proxy_xtrans_redirect < Op, ((is_cx::no) && ((Op::is_row) || (Op::is_col)) ) >::result Proxy_xtrans; typedef typename Proxy_xtrans::elem_type elem_type; typedef typename Proxy_xtrans::pod_type pod_type; typedef typename Proxy_xtrans::stored_type stored_type; typedef typename Proxy_xtrans::ea_type ea_type; typedef typename Proxy_xtrans::aligned_ea_type aligned_ea_type; static constexpr bool use_at = Proxy_xtrans::use_at; static constexpr bool use_mp = Proxy_xtrans::use_mp; static constexpr bool has_subview = Proxy_xtrans::has_subview; static constexpr bool is_row = Proxy_xtrans::is_row; static constexpr bool is_col = Proxy_xtrans::is_col; static constexpr bool is_xvec = Proxy_xtrans::is_xvec; using Proxy_xtrans::Q; inline explicit Proxy(const Op& A) : Proxy_xtrans(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; } arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Proxy_xtrans::get_ea(); } arma_inline aligned_ea_type get_aligned_ea() const { return Proxy_xtrans::get_aligned_ea(); } template arma_inline bool is_alias(const Mat& X) const { return Proxy_xtrans::is_alias(X); } template arma_inline bool has_overlap(const subview& X) const { return Proxy_xtrans::has_overlap(X); } arma_inline bool is_aligned() const { return Proxy_xtrans::is_aligned(); } }; template struct Proxy< Op > : public Proxy_xtrans_redirect < Op, ( (Op::is_row) || (Op::is_col) ) >::result { typedef typename Proxy_xtrans_redirect < Op, ( (Op::is_row) || (Op::is_col) ) >::result Proxy_xtrans; typedef typename Proxy_xtrans::elem_type elem_type; typedef typename Proxy_xtrans::pod_type pod_type; typedef typename Proxy_xtrans::stored_type stored_type; typedef typename Proxy_xtrans::ea_type ea_type; typedef typename Proxy_xtrans::aligned_ea_type aligned_ea_type; static constexpr bool use_at = Proxy_xtrans::use_at; static constexpr bool use_mp = Proxy_xtrans::use_mp; static constexpr bool has_subview = Proxy_xtrans::has_subview; static constexpr bool is_row = Proxy_xtrans::is_row; static constexpr bool is_col = Proxy_xtrans::is_col; static constexpr bool is_xvec = Proxy_xtrans::is_xvec; using Proxy_xtrans::Q; inline explicit Proxy(const Op& A) : Proxy_xtrans(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; } arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Proxy_xtrans::get_ea(); } arma_inline aligned_ea_type get_aligned_ea() const { return Proxy_xtrans::get_aligned_ea(); } template arma_inline bool is_alias(const Mat& X) const { return Proxy_xtrans::is_alias(X); } template arma_inline bool has_overlap(const subview& X) const { return Proxy_xtrans::has_overlap(X); } arma_inline bool is_aligned() const { return Proxy_xtrans::is_aligned(); } }; template struct Proxy_subview_row_htrans_cx { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef subview_row_htrans stored_type; typedef const subview_row_htrans& ea_type; typedef const subview_row_htrans& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = true; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const subview_row_htrans Q; inline explicit Proxy_subview_row_htrans_cx(const Op, op_htrans>& A) : Q(A.m) { arma_extra_debug_sigprint(); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&(Q.sv_row.m)) == void_ptr(&X)); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } }; template struct Proxy_subview_row_htrans_non_cx { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef subview_row_strans stored_type; typedef const subview_row_strans& ea_type; typedef const subview_row_strans& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = true; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const subview_row_strans Q; inline explicit Proxy_subview_row_htrans_non_cx(const Op, op_htrans>& A) : Q(A.m) { arma_extra_debug_sigprint(); } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&(Q.sv_row.m)) == void_ptr(&X)); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } }; template struct Proxy_subview_row_htrans_redirect {}; template struct Proxy_subview_row_htrans_redirect { typedef Proxy_subview_row_htrans_cx result; }; template struct Proxy_subview_row_htrans_redirect { typedef Proxy_subview_row_htrans_non_cx result; }; template struct Proxy< Op, op_htrans> > : public Proxy_subview_row_htrans_redirect < eT, is_cx::yes >::result { typedef typename Proxy_subview_row_htrans_redirect < eT, is_cx::yes >::result Proxy_sv_row_ht; typedef typename Proxy_sv_row_ht::elem_type elem_type; typedef typename Proxy_sv_row_ht::pod_type pod_type; typedef typename Proxy_sv_row_ht::stored_type stored_type; typedef typename Proxy_sv_row_ht::ea_type ea_type; typedef typename Proxy_sv_row_ht::ea_type aligned_ea_type; static constexpr bool use_at = Proxy_sv_row_ht::use_at; static constexpr bool use_mp = Proxy_sv_row_ht::use_mp; static constexpr bool has_subview = Proxy_sv_row_ht::has_subview; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; using Proxy_sv_row_ht::Q; inline explicit Proxy(const Op, op_htrans>& A) : Proxy_sv_row_ht(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword) const { return Q[r]; } arma_inline elem_type at_alt (const uword i) const { return Q[i]; } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return Proxy_sv_row_ht::is_alias(X); } template arma_inline bool has_overlap(const subview& X) const { return Proxy_sv_row_ht::has_overlap(X); } constexpr bool is_aligned() const { return false; } }; template struct Proxy< Op, op_strans> > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef subview_row_strans stored_type; typedef const subview_row_strans& ea_type; typedef const subview_row_strans& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = true; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const subview_row_strans Q; inline explicit Proxy(const Op, op_strans>& A) : Q(A.m) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword) const { return Q[r]; } arma_inline elem_type at_alt (const uword i) const { return Q[i]; } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&(Q.sv_row.m)) == void_ptr(&X)); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } constexpr bool is_aligned() const { return false; } }; template struct Proxy< Op< Row< std::complex >, op_htrans> > { typedef typename std::complex eT; typedef typename std::complex elem_type; typedef T pod_type; typedef xvec_htrans stored_type; typedef const xvec_htrans& ea_type; typedef const xvec_htrans& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; const xvec_htrans Q; const Row& src; inline explicit Proxy(const Op< Row< std::complex >, op_htrans>& A) : Q (A.m.memptr(), A.m.n_rows, A.m.n_cols) , src(A.m) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword) const { return Q[r]; } arma_inline elem_type at_alt (const uword i) const { return Q[i]; } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return void_ptr(&src) == void_ptr(&X); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } constexpr bool is_aligned() const { return false; } }; template struct Proxy< Op< Col< std::complex >, op_htrans> > { typedef typename std::complex eT; typedef typename std::complex elem_type; typedef T pod_type; typedef xvec_htrans stored_type; typedef const xvec_htrans& ea_type; typedef const xvec_htrans& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = true; static constexpr bool is_col = false; static constexpr bool is_xvec = false; const xvec_htrans Q; const Col& src; inline explicit Proxy(const Op< Col< std::complex >, op_htrans>& A) : Q (A.m.memptr(), A.m.n_rows, A.m.n_cols) , src(A.m) { arma_extra_debug_sigprint(); } constexpr uword get_n_rows() const { return 1; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword, const uword c) const { return Q[c]; } arma_inline elem_type at_alt (const uword i) const { return Q[i]; } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return void_ptr(&src) == void_ptr(&X); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } constexpr bool is_aligned() const { return false; } }; template struct Proxy< Op< subview_col< std::complex >, op_htrans> > { typedef typename std::complex eT; typedef typename std::complex elem_type; typedef T pod_type; typedef xvec_htrans stored_type; typedef const xvec_htrans& ea_type; typedef const xvec_htrans& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = true; static constexpr bool is_row = true; static constexpr bool is_col = false; static constexpr bool is_xvec = false; const xvec_htrans Q; const subview_col& src; inline explicit Proxy(const Op< subview_col< std::complex >, op_htrans>& A) : Q (A.m.colptr(0), A.m.n_rows, A.m.n_cols) , src(A.m) { arma_extra_debug_sigprint(); } constexpr uword get_n_rows() const { return 1; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword, const uword c) const { return Q[c]; } arma_inline elem_type at_alt (const uword i) const { return Q[i]; } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return void_ptr(&src.m) == void_ptr(&X); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } constexpr bool is_aligned() const { return false; } }; template struct Proxy< Op > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef eOp< Op, eop_scalar_times> stored_type; typedef const eOp< Op, eop_scalar_times>& ea_type; typedef const eOp< Op, eop_scalar_times>& aligned_ea_type; static constexpr bool use_at = eOp< Op, eop_scalar_times>::use_at; static constexpr bool use_mp = eOp< Op, eop_scalar_times>::use_mp; static constexpr bool has_subview = eOp< Op, eop_scalar_times>::has_subview; // NOTE: the Op class takes care of swapping row and col for op_htrans static constexpr bool is_row = eOp< Op, eop_scalar_times>::is_row; static constexpr bool is_col = eOp< Op, eop_scalar_times>::is_col; static constexpr bool is_xvec = eOp< Op, eop_scalar_times>::is_xvec; arma_aligned const Op R; arma_aligned const eOp< Op, eop_scalar_times > Q; inline explicit Proxy(const Op& A) : R(A.m) , Q(R, A.aux) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return is_row ? 1 : Q.get_n_rows(); } arma_inline uword get_n_cols() const { return is_col ? 1 : Q.get_n_cols(); } arma_inline uword get_n_elem() const { return Q.get_n_elem(); } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return Q.P.is_alias(X); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } arma_inline bool is_aligned() const { return Q.P.is_aligned(); } }; template struct Proxy< subview_row_strans > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef subview_row_strans stored_type; typedef const subview_row_strans& ea_type; typedef const subview_row_strans& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = true; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const subview_row_strans& Q; inline explicit Proxy(const subview_row_strans& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword) const { return Q[r]; } arma_inline elem_type at_alt (const uword i) const { return Q[i]; } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&(Q.sv_row.m)) == void_ptr(&X)); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } constexpr bool is_aligned() const { return false; } }; template struct Proxy< subview_row_htrans > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef subview_row_htrans stored_type; typedef const subview_row_htrans& ea_type; typedef const subview_row_htrans& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = true; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const subview_row_htrans& Q; inline explicit Proxy(const subview_row_htrans& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword) const { return Q[r]; } arma_inline elem_type at_alt (const uword i) const { return Q[i]; } arma_inline ea_type get_ea() const { return Q; } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&(Q.sv_row.m)) == void_ptr(&X)); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } constexpr bool is_aligned() const { return false; } }; template struct Proxy< xtrans_mat > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const eT* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; arma_aligned const Mat Q; inline explicit Proxy(const xtrans_mat& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r,c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Mat&) const { return false; } template constexpr bool has_overlap(const subview&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy< xvec_htrans > { typedef eT elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const eT* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = false; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = true; arma_aligned const Mat Q; inline explicit Proxy(const xvec_htrans& A) : Q(A) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r,c); } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template constexpr bool is_alias(const Mat&) const { return false; } template constexpr bool has_overlap(const subview&) const { return false; } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy_vectorise_col_mat { inline Proxy_vectorise_col_mat(const T1&) {} }; template struct Proxy_vectorise_col_mat< Op > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Mat stored_type; typedef const elem_type* ea_type; typedef const Mat& aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = false; static constexpr bool has_subview = true; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const unwrap U; arma_aligned const Mat Q; inline explicit Proxy_vectorise_col_mat(const Op& A) : U(A.m) , Q(const_cast(U.M.memptr()), U.M.n_elem, 1, false, false) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return Q.n_rows; } constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline elem_type operator[] (const uword i) const { return Q[i]; } arma_inline elem_type at (const uword r, const uword) const { return Q[r]; } arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } arma_inline ea_type get_ea() const { return Q.memptr(); } arma_inline aligned_ea_type get_aligned_ea() const { return Q; } template arma_inline bool is_alias(const Mat& X) const { return ( void_ptr(&X) == void_ptr(&(U.M)) ); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } }; template struct Proxy_vectorise_col_expr { inline Proxy_vectorise_col_expr(const T1&) {} }; template struct Proxy_vectorise_col_expr< Op > { typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Op stored_type; typedef typename Proxy::ea_type ea_type; typedef typename Proxy::aligned_ea_type aligned_ea_type; static constexpr bool use_at = false; static constexpr bool use_mp = Proxy::use_mp; static constexpr bool has_subview = Proxy::has_subview; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const Op& Q; arma_aligned const Proxy R; inline explicit Proxy_vectorise_col_expr(const Op& A) : Q(A) , R(A.m) { arma_extra_debug_sigprint(); } arma_inline uword get_n_rows() const { return R.get_n_elem(); } constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return R.get_n_elem(); } arma_inline elem_type operator[] (const uword i) const { return R[i]; } arma_inline elem_type at (const uword r, const uword) const { return R.at(r, 0); } arma_inline elem_type at_alt (const uword i) const { return R.at_alt(i); } arma_inline ea_type get_ea() const { return R.get_ea(); } arma_inline aligned_ea_type get_aligned_ea() const { return R.get_aligned_ea(); } template arma_inline bool is_alias(const Mat& X) const { return R.is_alias(X); } template arma_inline bool has_overlap(const subview& X) const { return is_alias(X.m); } arma_inline bool is_aligned() const { return R.is_aligned(); } }; template struct Proxy_vectorise_col_redirect {}; template struct Proxy_vectorise_col_redirect< Op, true > { typedef Proxy_vectorise_col_mat < Op > result; }; template struct Proxy_vectorise_col_redirect< Op, false> { typedef Proxy_vectorise_col_expr< Op > result; }; template struct Proxy< Op > : public Proxy_vectorise_col_redirect< Op, (Proxy::use_at) >::result { typedef typename Proxy_vectorise_col_redirect< Op, (Proxy::use_at) >::result Proxy_vectorise_col; inline explicit Proxy(const Op& A) : Proxy_vectorise_col(A) { arma_extra_debug_sigprint(); } }; //! @} RcppArmadillo/inst/include/armadillo_bits/spop_trimat_meat.hpp0000644000176200001440000002157214124060717024461 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_trimat //! @{ template inline void spop_trimat::apply_noalias(SpMat& out, const SpProxy& P, const bool upper) { arma_extra_debug_sigprint(); typename SpProxy::const_iterator_type it = P.begin(); const uword old_n_nonzero = P.get_n_nonzero(); uword new_n_nonzero = 0; if(upper) { // upper triangular: count elements on the diagonal and above the diagonal for(uword i=0; i < old_n_nonzero; ++i) { new_n_nonzero += (it.row() <= it.col()) ? uword(1) : uword(0); ++it; } } else { // lower triangular: count elements on the diagonal and below the diagonal for(uword i=0; i < old_n_nonzero; ++i) { new_n_nonzero += (it.row() >= it.col()) ? uword(1) : uword(0); ++it; } } const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); out.reserve(n_rows, n_cols, new_n_nonzero); uword new_index = 0; it = P.begin(); if(upper) { // upper triangular: copy elements on the diagonal and above the diagonal for(uword i=0; i < old_n_nonzero; ++i) { const uword row = it.row(); const uword col = it.col(); if(row <= col) { access::rw(out.values[new_index]) = (*it); access::rw(out.row_indices[new_index]) = row; access::rw(out.col_ptrs[col + 1])++; ++new_index; } ++it; } } else { // lower triangular: copy elements on the diagonal and below the diagonal for(uword i=0; i < old_n_nonzero; ++i) { const uword row = it.row(); const uword col = it.col(); if(row >= col) { access::rw(out.values[new_index]) = (*it); access::rw(out.row_indices[new_index]) = row; access::rw(out.col_ptrs[col + 1])++; ++new_index; } ++it; } } for(uword i=0; i < n_cols; ++i) { access::rw(out.col_ptrs[i + 1]) += out.col_ptrs[i]; } } template inline void spop_trimat::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const SpProxy P(in.m); arma_debug_check( (P.get_n_rows() != P.get_n_cols()), "trimatu()/trimatl(): given matrix must be square sized" ); const bool upper = (in.aux_uword_a == 0); if(P.is_alias(out)) { SpMat tmp; spop_trimat::apply_noalias(tmp, P, upper); out.steal_mem(tmp); } else { spop_trimat::apply_noalias(out, P, upper); } } // template inline void spop_trimatu_ext::apply_noalias(SpMat& out, const SpMat& A, const uword row_offset, const uword col_offset) { arma_extra_debug_sigprint(); const uword n_rows = A.n_rows; const uword n_cols = A.n_cols; arma_debug_check_bounds( ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)), "trimatu(): requested diagonal is out of bounds" ); if(A.n_nonzero == 0) { out.zeros(n_rows, n_cols); return; } out.reserve(n_rows, n_cols, A.n_nonzero); // upper bound on n_nonzero uword count = 0; const uword N = (std::min)(n_rows - row_offset, n_cols - col_offset); for(uword i=0; i < n_cols; ++i) { const uword col = i + col_offset; if(i < N) { typename SpMat::const_col_iterator it = A.begin_col_no_sync(col); typename SpMat::const_col_iterator it_end = A.end_col_no_sync(col); const uword end_row = i + row_offset; for(; it != it_end; ++it) { const uword it_row = it.row(); if(it_row <= end_row) { const uword it_col = it.col(); access::rw(out.values[count]) = (*it); access::rw(out.row_indices[count]) = it_row; access::rw(out.col_ptrs[it_col + 1])++; ++count; } else { break; } } } else { if(col < n_cols) { typename SpMat::const_col_iterator it = A.begin_col_no_sync(col); typename SpMat::const_col_iterator it_end = A.end_col_no_sync(col); for(; it != it_end; ++it) { const uword it_row = it.row(); const uword it_col = it.col(); access::rw(out.values[count]) = (*it); access::rw(out.row_indices[count]) = it_row; access::rw(out.col_ptrs[it_col + 1])++; ++count; } } } } for(uword i=0; i < n_cols; ++i) { access::rw(out.col_ptrs[i + 1]) += out.col_ptrs[i]; } if(count < A.n_nonzero) { out.mem_resize(count); } } template inline void spop_trimatu_ext::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat U(in.m); const SpMat& A = U.M; arma_debug_check( (A.is_square() == false), "trimatu(): given matrix must be square sized" ); const uword row_offset = in.aux_uword_a; const uword col_offset = in.aux_uword_b; if(U.is_alias(out)) { SpMat tmp; spop_trimatu_ext::apply_noalias(tmp, A, row_offset, col_offset); out.steal_mem(tmp); } else { spop_trimatu_ext::apply_noalias(out, A, row_offset, col_offset); } } // template inline void spop_trimatl_ext::apply_noalias(SpMat& out, const SpMat& A, const uword row_offset, const uword col_offset) { arma_extra_debug_sigprint(); const uword n_rows = A.n_rows; const uword n_cols = A.n_cols; arma_debug_check_bounds( ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)), "trimatl(): requested diagonal is out of bounds" ); if(A.n_nonzero == 0) { out.zeros(n_rows, n_cols); return; } out.reserve(n_rows, n_cols, A.n_nonzero); // upper bound on n_nonzero uword count = 0; if(col_offset > 0) { typename SpMat::const_col_iterator it = A.begin_col_no_sync(0); typename SpMat::const_col_iterator it_end = A.end_col_no_sync(col_offset-1); for(; it != it_end; ++it) { const uword it_row = it.row(); const uword it_col = it.col(); access::rw(out.values[count]) = (*it); access::rw(out.row_indices[count]) = it_row; access::rw(out.col_ptrs[it_col + 1])++; ++count; } } const uword N = (std::min)(n_rows - row_offset, n_cols - col_offset); for(uword i=0; i < N; ++i) { const uword start_row = i + row_offset; const uword col = i + col_offset; typename SpMat::const_col_iterator it = A.begin_col_no_sync(col); typename SpMat::const_col_iterator it_end = A.end_col_no_sync(col); for(; it != it_end; ++it) { const uword it_row = it.row(); if(it_row >= start_row) { const uword it_col = it.col(); access::rw(out.values[count]) = (*it); access::rw(out.row_indices[count]) = it_row; access::rw(out.col_ptrs[it_col + 1])++; ++count; } } } for(uword i=0; i < n_cols; ++i) { access::rw(out.col_ptrs[i + 1]) += out.col_ptrs[i]; } if(count < A.n_nonzero) { out.mem_resize(count); } } template inline void spop_trimatl_ext::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat U(in.m); const SpMat& A = U.M; arma_debug_check( (A.is_square() == false), "trimatl(): given matrix must be square sized" ); const uword row_offset = in.aux_uword_a; const uword col_offset = in.aux_uword_b; if(U.is_alias(out)) { SpMat tmp; spop_trimatl_ext::apply_noalias(tmp, A, row_offset, col_offset); out.steal_mem(tmp); } else { spop_trimatl_ext::apply_noalias(out, A, row_offset, col_offset); } } //! @} RcppArmadillo/inst/include/armadillo_bits/distr_param.hpp0000644000176200001440000000246714124060717023421 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup distr_param //! @{ class distr_param { public: uword state; union { int a_int; double a_double; }; union { int b_int; double b_double; }; inline distr_param() : state(0) { } inline explicit distr_param(const int a, const int b) : state(1) , a_int(a) , b_int(b) { } inline explicit distr_param(const double a, const double b) : state(2) , a_double(a) , b_double(b) { } }; //! @} RcppArmadillo/inst/include/armadillo_bits/eop_core_meat.hpp0000644000176200001440000007377214124060717023724 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup eop_core //! @{ #undef arma_applier_1u #undef arma_applier_1a #undef arma_applier_2 #undef arma_applier_3 #undef operatorA #undef arma_applier_1_mp #undef arma_applier_2_mp #undef arma_applier_3_mp #if defined(ARMA_SIMPLE_LOOPS) #define arma_applier_1u(operatorA) \ {\ for(uword i=0; i::process(P[i], k);\ }\ } #else #define arma_applier_1u(operatorA) \ {\ uword i,j;\ \ for(i=0, j=1; j::process(tmp_i, k);\ tmp_j = eop_core::process(tmp_j, k);\ \ out_mem[i] operatorA tmp_i;\ out_mem[j] operatorA tmp_j;\ }\ \ if(i < n_elem)\ {\ out_mem[i] operatorA eop_core::process(P[i], k);\ }\ } #endif #if defined(ARMA_SIMPLE_LOOPS) #define arma_applier_1a(operatorA) \ {\ for(uword i=0; i::process(P.at_alt(i), k);\ }\ } #else #define arma_applier_1a(operatorA) \ {\ uword i,j;\ \ for(i=0, j=1; j::process(tmp_i, k);\ tmp_j = eop_core::process(tmp_j, k);\ \ out_mem[i] operatorA tmp_i;\ out_mem[j] operatorA tmp_j;\ }\ \ if(i < n_elem)\ {\ out_mem[i] operatorA eop_core::process(P.at_alt(i), k);\ }\ } #endif #define arma_applier_2(operatorA) \ {\ if(n_rows != 1)\ {\ for(uword col=0; col::process(tmp_i, k);\ tmp_j = eop_core::process(tmp_j, k);\ \ *out_mem operatorA tmp_i; out_mem++;\ *out_mem operatorA tmp_j; out_mem++;\ }\ \ if(i < n_rows)\ {\ *out_mem operatorA eop_core::process(P.at(i,col), k); out_mem++;\ }\ }\ }\ else\ {\ for(uword count=0; count < n_cols; ++count)\ {\ out_mem[count] operatorA eop_core::process(P.at(0,count), k);\ }\ }\ } #define arma_applier_3(operatorA) \ {\ for(uword slice=0; slice::process(tmp_i, k);\ tmp_j = eop_core::process(tmp_j, k);\ \ *out_mem operatorA tmp_i; out_mem++; \ *out_mem operatorA tmp_j; out_mem++; \ }\ \ if(i < n_rows)\ {\ *out_mem operatorA eop_core::process(P.at(i,col,slice), k); out_mem++; \ }\ }\ }\ } #if defined(ARMA_USE_OPENMP) #define arma_applier_1_mp(operatorA) \ {\ const int n_threads = mp_thread_limit::get();\ _Pragma("omp parallel for schedule(static) num_threads(n_threads)")\ for(uword i=0; i::process(P[i], k);\ }\ } #define arma_applier_2_mp(operatorA) \ {\ const int n_threads = mp_thread_limit::get();\ if(n_cols == 1)\ {\ _Pragma("omp parallel for schedule(static) num_threads(n_threads)")\ for(uword count=0; count < n_rows; ++count)\ {\ out_mem[count] operatorA eop_core::process(P.at(count,0), k);\ }\ }\ else\ if(n_rows == 1)\ {\ _Pragma("omp parallel for schedule(static) num_threads(n_threads)")\ for(uword count=0; count < n_cols; ++count)\ {\ out_mem[count] operatorA eop_core::process(P.at(0,count), k);\ }\ }\ else\ {\ _Pragma("omp parallel for schedule(static) num_threads(n_threads)")\ for(uword col=0; col < n_cols; ++col)\ {\ for(uword row=0; row < n_rows; ++row)\ {\ out.at(row,col) operatorA eop_core::process(P.at(row,col), k);\ }\ }\ }\ } #define arma_applier_3_mp(operatorA) \ {\ const int n_threads = mp_thread_limit::get();\ _Pragma("omp parallel for schedule(static) num_threads(n_threads)")\ for(uword slice=0; slice::process(P.at(row,col,slice), k);\ }\ }\ } #else #define arma_applier_1_mp(operatorA) arma_applier_1u(operatorA) #define arma_applier_2_mp(operatorA) arma_applier_2(operatorA) #define arma_applier_3_mp(operatorA) arma_applier_3(operatorA) #endif // // matrices template template arma_hot inline void eop_core::apply(outT& out, const eOp& x) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing; // size setting and alias checking is done by either the Mat contructor or operator=() const eT k = x.aux; eT* out_mem = out.memptr(); const bool use_mp = (arma_config::openmp) && (eOp::use_mp || (is_same_type::value && (is_cx::yes || x.aux != eT(2)))); if(Proxy::use_at == false) { const uword n_elem = x.get_n_elem(); if(use_mp && mp_gate::eval(n_elem)) { typename Proxy::ea_type P = x.P.get_ea(); arma_applier_1_mp(=); } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P.is_aligned()) { typename Proxy::aligned_ea_type P = x.P.get_aligned_ea(); arma_applier_1a(=); } else { typename Proxy::ea_type P = x.P.get_ea(); arma_applier_1u(=); } } else { typename Proxy::ea_type P = x.P.get_ea(); arma_applier_1u(=); } } } else { const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); const Proxy& P = x.P; if(use_mp && mp_gate::eval(x.get_n_elem())) { arma_applier_2_mp(=); } else { arma_applier_2(=); } } } template template arma_hot inline void eop_core::apply_inplace_plus(Mat& out, const eOp& x) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "addition"); const eT k = x.aux; eT* out_mem = out.memptr(); const bool use_mp = (arma_config::openmp) && (eOp::use_mp || (is_same_type::value && (is_cx::yes || x.aux != eT(2)))); if(Proxy::use_at == false) { const uword n_elem = x.get_n_elem(); if(use_mp && mp_gate::eval(n_elem)) { typename Proxy::ea_type P = x.P.get_ea(); arma_applier_1_mp(+=); } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P.is_aligned()) { typename Proxy::aligned_ea_type P = x.P.get_aligned_ea(); arma_applier_1a(+=); } else { typename Proxy::ea_type P = x.P.get_ea(); arma_applier_1u(+=); } } else { typename Proxy::ea_type P = x.P.get_ea(); arma_applier_1u(+=); } } } else { const Proxy& P = x.P; if(use_mp && mp_gate::eval(x.get_n_elem())) { arma_applier_2_mp(+=); } else { arma_applier_2(+=); } } } template template arma_hot inline void eop_core::apply_inplace_minus(Mat& out, const eOp& x) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "subtraction"); const eT k = x.aux; eT* out_mem = out.memptr(); const bool use_mp = (arma_config::openmp) && (eOp::use_mp || (is_same_type::value && (is_cx::yes || x.aux != eT(2)))); if(Proxy::use_at == false) { const uword n_elem = x.get_n_elem(); if(use_mp && mp_gate::eval(n_elem)) { typename Proxy::ea_type P = x.P.get_ea(); arma_applier_1_mp(-=); } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P.is_aligned()) { typename Proxy::aligned_ea_type P = x.P.get_aligned_ea(); arma_applier_1a(-=); } else { typename Proxy::ea_type P = x.P.get_ea(); arma_applier_1u(-=); } } else { typename Proxy::ea_type P = x.P.get_ea(); arma_applier_1u(-=); } } } else { const Proxy& P = x.P; if(use_mp && mp_gate::eval(x.get_n_elem())) { arma_applier_2_mp(-=); } else { arma_applier_2(-=); } } } template template arma_hot inline void eop_core::apply_inplace_schur(Mat& out, const eOp& x) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "element-wise multiplication"); const eT k = x.aux; eT* out_mem = out.memptr(); const bool use_mp = (arma_config::openmp) && (eOp::use_mp || (is_same_type::value && (is_cx::yes || x.aux != eT(2)))); if(Proxy::use_at == false) { const uword n_elem = x.get_n_elem(); if(use_mp && mp_gate::eval(n_elem)) { typename Proxy::ea_type P = x.P.get_ea(); arma_applier_1_mp(*=); } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P.is_aligned()) { typename Proxy::aligned_ea_type P = x.P.get_aligned_ea(); arma_applier_1a(*=); } else { typename Proxy::ea_type P = x.P.get_ea(); arma_applier_1u(*=); } } else { typename Proxy::ea_type P = x.P.get_ea(); arma_applier_1u(*=); } } } else { const Proxy& P = x.P; if(use_mp && mp_gate::eval(x.get_n_elem())) { arma_applier_2_mp(*=); } else { arma_applier_2(*=); } } } template template arma_hot inline void eop_core::apply_inplace_div(Mat& out, const eOp& x) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "element-wise division"); const eT k = x.aux; eT* out_mem = out.memptr(); const bool use_mp = (arma_config::openmp) && (eOp::use_mp || (is_same_type::value && (is_cx::yes || x.aux != eT(2)))); if(Proxy::use_at == false) { const uword n_elem = x.get_n_elem(); if(use_mp && mp_gate::eval(n_elem)) { typename Proxy::ea_type P = x.P.get_ea(); arma_applier_1_mp(/=); } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P.is_aligned()) { typename Proxy::aligned_ea_type P = x.P.get_aligned_ea(); arma_applier_1a(/=); } else { typename Proxy::ea_type P = x.P.get_ea(); arma_applier_1u(/=); } } else { typename Proxy::ea_type P = x.P.get_ea(); arma_applier_1u(/=); } } } else { const Proxy& P = x.P; if(use_mp && mp_gate::eval(x.get_n_elem())) { arma_applier_2_mp(/=); } else { arma_applier_2(/=); } } } // // cubes template template arma_hot inline void eop_core::apply(Cube& out, const eOpCube& x) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing; // size setting and alias checking is done by either the Mat contructor or operator=() const eT k = x.aux; eT* out_mem = out.memptr(); const bool use_mp = (arma_config::openmp) && (eOpCube::use_mp || (is_same_type::value && (is_cx::yes || x.aux != eT(2)))); if(ProxyCube::use_at == false) { const uword n_elem = out.n_elem; if(use_mp && mp_gate::eval(n_elem)) { typename ProxyCube::ea_type P = x.P.get_ea(); arma_applier_1_mp(=); } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P.is_aligned()) { typename ProxyCube::aligned_ea_type P = x.P.get_aligned_ea(); arma_applier_1a(=); } else { typename ProxyCube::ea_type P = x.P.get_ea(); arma_applier_1u(=); } } else { typename ProxyCube::ea_type P = x.P.get_ea(); arma_applier_1u(=); } } } else { const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); const uword n_slices = x.get_n_slices(); const ProxyCube& P = x.P; if(use_mp && mp_gate::eval(x.get_n_elem())) { arma_applier_3_mp(=); } else { arma_applier_3(=); } } } template template arma_hot inline void eop_core::apply_inplace_plus(Cube& out, const eOpCube& x) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); const uword n_slices = x.get_n_slices(); arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "addition"); const eT k = x.aux; eT* out_mem = out.memptr(); const bool use_mp = (arma_config::openmp) && (eOpCube::use_mp || (is_same_type::value && (is_cx::yes || x.aux != eT(2)))); if(ProxyCube::use_at == false) { const uword n_elem = out.n_elem; if(use_mp && mp_gate::eval(n_elem)) { typename ProxyCube::ea_type P = x.P.get_ea(); arma_applier_1_mp(+=); } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P.is_aligned()) { typename ProxyCube::aligned_ea_type P = x.P.get_aligned_ea(); arma_applier_1a(+=); } else { typename ProxyCube::ea_type P = x.P.get_ea(); arma_applier_1u(+=); } } else { typename ProxyCube::ea_type P = x.P.get_ea(); arma_applier_1u(+=); } } } else { const ProxyCube& P = x.P; if(use_mp && mp_gate::eval(x.get_n_elem())) { arma_applier_3_mp(+=); } else { arma_applier_3(+=); } } } template template arma_hot inline void eop_core::apply_inplace_minus(Cube& out, const eOpCube& x) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); const uword n_slices = x.get_n_slices(); arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "subtraction"); const eT k = x.aux; eT* out_mem = out.memptr(); const bool use_mp = (arma_config::openmp) && (eOpCube::use_mp || (is_same_type::value && (is_cx::yes || x.aux != eT(2)))); if(ProxyCube::use_at == false) { const uword n_elem = out.n_elem; if(use_mp && mp_gate::eval(n_elem)) { typename ProxyCube::ea_type P = x.P.get_ea(); arma_applier_1_mp(-=); } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P.is_aligned()) { typename ProxyCube::aligned_ea_type P = x.P.get_aligned_ea(); arma_applier_1a(-=); } else { typename ProxyCube::ea_type P = x.P.get_ea(); arma_applier_1u(-=); } } else { typename ProxyCube::ea_type P = x.P.get_ea(); arma_applier_1u(-=); } } } else { const ProxyCube& P = x.P; if(use_mp && mp_gate::eval(x.get_n_elem())) { arma_applier_3_mp(-=); } else { arma_applier_3(-=); } } } template template arma_hot inline void eop_core::apply_inplace_schur(Cube& out, const eOpCube& x) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); const uword n_slices = x.get_n_slices(); arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "element-wise multiplication"); const eT k = x.aux; eT* out_mem = out.memptr(); const bool use_mp = (arma_config::openmp) && (eOpCube::use_mp || (is_same_type::value && (is_cx::yes || x.aux != eT(2)))); if(ProxyCube::use_at == false) { const uword n_elem = out.n_elem; if(use_mp && mp_gate::eval(n_elem)) { typename ProxyCube::ea_type P = x.P.get_ea(); arma_applier_1_mp(*=); } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P.is_aligned()) { typename ProxyCube::aligned_ea_type P = x.P.get_aligned_ea(); arma_applier_1a(*=); } else { typename ProxyCube::ea_type P = x.P.get_ea(); arma_applier_1u(*=); } } else { typename ProxyCube::ea_type P = x.P.get_ea(); arma_applier_1u(*=); } } } else { const ProxyCube& P = x.P; if(use_mp && mp_gate::eval(x.get_n_elem())) { arma_applier_3_mp(*=); } else { arma_applier_3(*=); } } } template template arma_hot inline void eop_core::apply_inplace_div(Cube& out, const eOpCube& x) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); const uword n_slices = x.get_n_slices(); arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "element-wise division"); const eT k = x.aux; eT* out_mem = out.memptr(); const bool use_mp = (arma_config::openmp) && (eOpCube::use_mp || (is_same_type::value && (is_cx::yes || x.aux != eT(2)))); if(ProxyCube::use_at == false) { const uword n_elem = out.n_elem; if(use_mp && mp_gate::eval(n_elem)) { typename ProxyCube::ea_type P = x.P.get_ea(); arma_applier_1_mp(/=); } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P.is_aligned()) { typename ProxyCube::aligned_ea_type P = x.P.get_aligned_ea(); arma_applier_1a(/=); } else { typename ProxyCube::ea_type P = x.P.get_ea(); arma_applier_1u(/=); } } else { typename ProxyCube::ea_type P = x.P.get_ea(); arma_applier_1u(/=); } } } else { const ProxyCube& P = x.P; if(use_mp && mp_gate::eval(x.get_n_elem())) { arma_applier_3_mp(/=); } else { arma_applier_3(/=); } } } // // common template template arma_inline eT eop_core::process(const eT, const eT) { arma_stop_logic_error("eop_core::process(): unhandled eop_type"); return eT(0); } template<> template arma_inline eT eop_core::process(const eT val, const eT k) { return val + k; } template<> template arma_inline eT eop_core::process(const eT val, const eT k) { return k - val; } template<> template arma_inline eT eop_core::process(const eT val, const eT k) { return val - k; } template<> template arma_inline eT eop_core::process(const eT val, const eT k) { return val * k; } template<> template arma_inline eT eop_core::process(const eT val, const eT k) { return k / val; } template<> template arma_inline eT eop_core::process(const eT val, const eT k) { return val / k; } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return val*val; } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::neg(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::sqrt(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::log(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::log2(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::log10(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return arma::trunc_log(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::log1p(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::exp(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::exp2(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::exp10(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return arma::trunc_exp(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::expm1(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::cos(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::sin(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::tan(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::acos(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::asin(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::atan(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::cosh(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::sinh(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::tanh(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::acosh(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::asinh(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::atanh(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return arma_sinc(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::direct_eps(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::arma_abs(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return arma_arg::eval(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::conj(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT k) { return eop_aux::pow(val, k); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::floor(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::ceil(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::round(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::trunc(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return arma_sign(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::erf(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::erfc(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::lgamma(val); } template<> template arma_inline eT eop_core::process(const eT val, const eT ) { return eop_aux::tgamma(val); } #undef arma_applier_1u #undef arma_applier_1a #undef arma_applier_2 #undef arma_applier_3 #undef arma_applier_1_mp #undef arma_applier_2_mp #undef arma_applier_3_mp //! @} RcppArmadillo/inst/include/armadillo_bits/arrayops_meat.hpp0000644000176200001440000005211114124060717023751 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup arrayops //! @{ template arma_inline void arrayops::copy(eT* dest, const eT* src, const uword n_elem) { if( (dest == src) || (n_elem == 0) ) { return; } if(is_cx::no) { if(n_elem <= 9) { arrayops::copy_small(dest, src, n_elem); } else { std::memcpy(dest, src, n_elem*sizeof(eT)); } } else { std::memcpy(dest, src, n_elem*sizeof(eT)); } } template arma_cold inline void arrayops::copy_small(eT* dest, const eT* src, const uword n_elem) { switch(n_elem) { case 9: dest[ 8] = src[ 8]; // fallthrough case 8: dest[ 7] = src[ 7]; // fallthrough case 7: dest[ 6] = src[ 6]; // fallthrough case 6: dest[ 5] = src[ 5]; // fallthrough case 5: dest[ 4] = src[ 4]; // fallthrough case 4: dest[ 3] = src[ 3]; // fallthrough case 3: dest[ 2] = src[ 2]; // fallthrough case 2: dest[ 1] = src[ 1]; // fallthrough case 1: dest[ 0] = src[ 0]; // fallthrough default: ; } } template inline void arrayops::fill_zeros(eT* dest, const uword n_elem) { typedef typename get_pod_type::result pod_type; if(n_elem == 0) { return; } if(std::numeric_limits::is_integer || std::numeric_limits::is_iec559) { std::memset((void*)dest, 0, sizeof(eT)*n_elem); } else { arrayops::inplace_set_simple(dest, eT(0), n_elem); } } template arma_hot inline void arrayops::replace(eT* mem, const uword n_elem, const eT old_val, const eT new_val) { if(arma_isnan(old_val)) { for(uword i=0; i arma_hot inline void arrayops::clean(eT* mem, const uword n_elem, const eT abs_limit, const typename arma_not_cx::result* junk) { arma_ignore(junk); for(uword i=0; i arma_hot inline void arrayops::clean(std::complex* mem, const uword n_elem, const T abs_limit) { typedef typename std::complex eT; for(uword i=0; i(T(0), val_imag); } else if(std::abs(val_imag) <= abs_limit) { val = std::complex(val_real, T(0)); } } } template inline void arrayops::clamp(eT* mem, const uword n_elem, const eT min_val, const eT max_val, const typename arma_not_cx::result* junk) { arma_ignore(junk); for(uword i=0; i max_val) ? max_val : val); } } template inline void arrayops::clamp(std::complex* mem, const uword n_elem, const std::complex& min_val, const std::complex& max_val) { typedef typename std::complex eT; const T min_val_real = std::real(min_val); const T min_val_imag = std::imag(min_val); const T max_val_real = std::real(max_val); const T max_val_imag = std::imag(max_val); for(uword i=0; i max_val_real) ? max_val_real : val_real); val_imag = (val_imag < min_val_imag) ? min_val_imag : ((val_imag > max_val_imag) ? max_val_imag : val_imag); val = std::complex(val_real,val_imag); } } template arma_inline void arrayops::convert_cx_scalar ( out_eT& out, const in_eT& in, const typename arma_not_cx::result* junk1, const typename arma_not_cx< in_eT>::result* junk2 ) { arma_ignore(junk1); arma_ignore(junk2); out = out_eT(in); } template arma_inline void arrayops::convert_cx_scalar ( out_eT& out, const std::complex& in, const typename arma_not_cx::result* junk ) { arma_ignore(junk); const in_T val = in.real(); const bool conversion_ok = (std::is_integral::value && std::is_floating_point::value) ? arma_isfinite(val) : true; out = conversion_ok ? out_eT(val) : out_eT(0); } template arma_inline void arrayops::convert_cx_scalar ( std::complex& out, const std::complex< in_T>& in ) { typedef std::complex out_eT; out = out_eT(in); } template arma_hot inline void arrayops::convert(out_eT* dest, const in_eT* src, const uword n_elem) { if(is_same_type::value) { const out_eT* src2 = (const out_eT*)src; if(dest != src2) { arrayops::copy(dest, src2, n_elem); } return; } const bool check_finite = (std::is_integral::value && std::is_floating_point::value); uword j; for(j=1; j::value) ? out_eT( tmp_i ) : ( cond_rel< is_signed::value >::lt(tmp_i, in_eT(0)) ? out_eT(0) : out_eT(tmp_i) ) ) : out_eT(0); dest++; (*dest) = ok_j ? ( (is_signed::value) ? out_eT( tmp_j ) : ( cond_rel< is_signed::value >::lt(tmp_j, in_eT(0)) ? out_eT(0) : out_eT(tmp_j) ) ) : out_eT(0); dest++; } if((j-1) < n_elem) { const in_eT tmp_i = (*src); // dest[i] = out_eT( tmp_i ); const bool ok_i = check_finite ? arma_isfinite(tmp_i) : true; (*dest) = ok_i ? ( (is_signed::value) ? out_eT( tmp_i ) : ( cond_rel< is_signed::value >::lt(tmp_i, in_eT(0)) ? out_eT(0) : out_eT(tmp_i) ) ) : out_eT(0); } } template arma_hot inline void arrayops::convert_cx(out_eT* dest, const in_eT* src, const uword n_elem) { uword j; for(j=1; j arma_hot inline void arrayops::inplace_plus(eT* dest, const eT* src, const uword n_elem) { if(memory::is_aligned(dest)) { memory::mark_as_aligned(dest); if(memory::is_aligned(src)) { memory::mark_as_aligned(src); arrayops::inplace_plus_base(dest, src, n_elem); } else { arrayops::inplace_plus_base(dest, src, n_elem); } } else { if(memory::is_aligned(src)) { memory::mark_as_aligned(src); arrayops::inplace_plus_base(dest, src, n_elem); } else { arrayops::inplace_plus_base(dest, src, n_elem); } } } template arma_hot inline void arrayops::inplace_minus(eT* dest, const eT* src, const uword n_elem) { if(memory::is_aligned(dest)) { memory::mark_as_aligned(dest); if(memory::is_aligned(src)) { memory::mark_as_aligned(src); arrayops::inplace_minus_base(dest, src, n_elem); } else { arrayops::inplace_minus_base(dest, src, n_elem); } } else { if(memory::is_aligned(src)) { memory::mark_as_aligned(src); arrayops::inplace_minus_base(dest, src, n_elem); } else { arrayops::inplace_minus_base(dest, src, n_elem); } } } template arma_hot inline void arrayops::inplace_mul(eT* dest, const eT* src, const uword n_elem) { if(memory::is_aligned(dest)) { memory::mark_as_aligned(dest); if(memory::is_aligned(src)) { memory::mark_as_aligned(src); arrayops::inplace_mul_base(dest, src, n_elem); } else { arrayops::inplace_mul_base(dest, src, n_elem); } } else { if(memory::is_aligned(src)) { memory::mark_as_aligned(src); arrayops::inplace_mul_base(dest, src, n_elem); } else { arrayops::inplace_mul_base(dest, src, n_elem); } } } template arma_hot inline void arrayops::inplace_div(eT* dest, const eT* src, const uword n_elem) { if(memory::is_aligned(dest)) { memory::mark_as_aligned(dest); if(memory::is_aligned(src)) { memory::mark_as_aligned(src); arrayops::inplace_div_base(dest, src, n_elem); } else { arrayops::inplace_div_base(dest, src, n_elem); } } else { if(memory::is_aligned(src)) { memory::mark_as_aligned(src); arrayops::inplace_div_base(dest, src, n_elem); } else { arrayops::inplace_div_base(dest, src, n_elem); } } } template arma_hot inline void arrayops::inplace_plus_base(eT* dest, const eT* src, const uword n_elem) { #if defined(ARMA_SIMPLE_LOOPS) { for(uword i=0; i arma_hot inline void arrayops::inplace_minus_base(eT* dest, const eT* src, const uword n_elem) { #if defined(ARMA_SIMPLE_LOOPS) { for(uword i=0; i arma_hot inline void arrayops::inplace_mul_base(eT* dest, const eT* src, const uword n_elem) { #if defined(ARMA_SIMPLE_LOOPS) { for(uword i=0; i arma_hot inline void arrayops::inplace_div_base(eT* dest, const eT* src, const uword n_elem) { #if defined(ARMA_SIMPLE_LOOPS) { for(uword i=0; i arma_hot inline void arrayops::inplace_set(eT* dest, const eT val, const uword n_elem) { if(val == eT(0)) { arrayops::fill_zeros(dest, n_elem); } else { if( (n_elem <= 9) && (is_cx::no) ) { arrayops::inplace_set_small(dest, val, n_elem); } else { arrayops::inplace_set_simple(dest, val, n_elem); } } } template arma_hot inline void arrayops::inplace_set_simple(eT* dest, const eT val, const uword n_elem) { if(memory::is_aligned(dest)) { memory::mark_as_aligned(dest); arrayops::inplace_set_base(dest, val, n_elem); } else { arrayops::inplace_set_base(dest, val, n_elem); } } template arma_hot inline void arrayops::inplace_set_base(eT* dest, const eT val, const uword n_elem) { #if defined(ARMA_SIMPLE_LOOPS) { for(uword i=0; i arma_cold inline void arrayops::inplace_set_small(eT* dest, const eT val, const uword n_elem) { switch(n_elem) { case 9: dest[ 8] = val; // fallthrough case 8: dest[ 7] = val; // fallthrough case 7: dest[ 6] = val; // fallthrough case 6: dest[ 5] = val; // fallthrough case 5: dest[ 4] = val; // fallthrough case 4: dest[ 3] = val; // fallthrough case 3: dest[ 2] = val; // fallthrough case 2: dest[ 1] = val; // fallthrough case 1: dest[ 0] = val; // fallthrough default:; } } template arma_hot inline void arrayops::inplace_set_fixed(eT* dest, const eT val) { for(uword i=0; i arma_hot inline void arrayops::inplace_plus(eT* dest, const eT val, const uword n_elem) { if(memory::is_aligned(dest)) { memory::mark_as_aligned(dest); arrayops::inplace_plus_base(dest, val, n_elem); } else { arrayops::inplace_plus_base(dest, val, n_elem); } } template arma_hot inline void arrayops::inplace_minus(eT* dest, const eT val, const uword n_elem) { if(memory::is_aligned(dest)) { memory::mark_as_aligned(dest); arrayops::inplace_minus_base(dest, val, n_elem); } else { arrayops::inplace_minus_base(dest, val, n_elem); } } template arma_hot inline void arrayops::inplace_mul(eT* dest, const eT val, const uword n_elem) { if(memory::is_aligned(dest)) { memory::mark_as_aligned(dest); arrayops::inplace_mul_base(dest, val, n_elem); } else { arrayops::inplace_mul_base(dest, val, n_elem); } } template arma_hot inline void arrayops::inplace_div(eT* dest, const eT val, const uword n_elem) { if(memory::is_aligned(dest)) { memory::mark_as_aligned(dest); arrayops::inplace_div_base(dest, val, n_elem); } else { arrayops::inplace_div_base(dest, val, n_elem); } } template arma_hot inline void arrayops::inplace_plus_base(eT* dest, const eT val, const uword n_elem) { #if defined(ARMA_SIMPLE_LOOPS) { for(uword i=0; i arma_hot inline void arrayops::inplace_minus_base(eT* dest, const eT val, const uword n_elem) { #if defined(ARMA_SIMPLE_LOOPS) { for(uword i=0; i arma_hot inline void arrayops::inplace_mul_base(eT* dest, const eT val, const uword n_elem) { #if defined(ARMA_SIMPLE_LOOPS) { for(uword i=0; i arma_hot inline void arrayops::inplace_div_base(eT* dest, const eT val, const uword n_elem) { #if defined(ARMA_SIMPLE_LOOPS) { for(uword i=0; i arma_hot inline eT arrayops::accumulate(const eT* src, const uword n_elem) { #if defined(__FINITE_MATH_ONLY__) && (__FINITE_MATH_ONLY__ > 0) { eT acc = eT(0); if(memory::is_aligned(src)) { memory::mark_as_aligned(src); for(uword i=0; i arma_hot inline eT arrayops::product(const eT* src, const uword n_elem) { eT val1 = eT(1); eT val2 = eT(1); uword i,j; for(i=0, j=1; j arma_hot inline bool arrayops::is_zero(const eT* mem, const uword n_elem, const eT abs_limit, const typename arma_not_cx::result* junk) { arma_ignore(junk); if(n_elem == 0) { return false; } if(abs_limit == eT(0)) { for(uword i=0; i abs_limit) { return false; } } } return true; } template arma_hot inline bool arrayops::is_zero(const std::complex* mem, const uword n_elem, const T abs_limit) { typedef typename std::complex eT; if(n_elem == 0) { return false; } if(abs_limit == T(0)) { for(uword i=0; i abs_limit) { return false; } if(std::abs(std::imag(val)) > abs_limit) { return false; } } } return true; } template arma_hot inline bool arrayops::is_finite(const eT* src, const uword n_elem) { uword j; for(j=1; j arma_hot inline bool arrayops::has_inf(const eT* src, const uword n_elem) { uword j; for(j=1; j arma_hot inline bool arrayops::has_nan(const eT* src, const uword n_elem) { uword j; for(j=1; j class GenEigsSolver { protected: const OpType& op; // object to conduct matrix operation, eg. matrix-vector product const uword nev; // number of eigenvalues requested Col< std::complex > ritz_val; // ritz values // Sort the first nev Ritz pairs in decreasing magnitude order // This is used to return the final results virtual void sort_ritzpair(); private: const uword dim_n; // dimension of matrix A const uword ncv; // number of ritz values uword nmatop; // number of matrix operations called uword niter; // number of restarting iterations Mat fac_V; // V matrix in the Arnoldi factorisation Mat fac_H; // H matrix in the Arnoldi factorisation Col fac_f; // residual in the Arnoldi factorisation Mat< std::complex > ritz_vec; // ritz vectors Col< std::complex > ritz_est; // last row of ritz_vec std::vector ritz_conv; // indicator of the convergence of ritz values const eT eps; // the machine precision // eg. ~= 1e-16 for double type const eT approx0; // a number that is approximately zero // approx0 = eps^(2/3) // used to test the orthogonality of vectors, // and in convergence test, tol*approx0 is // the absolute tolerance // Arnoldi factorisation starting from step-k inline void factorise_from(uword from_k, uword to_m, const Col& fk); // Implicitly restarted Arnoldi factorisation inline void restart(uword k); // Calculate the number of converged Ritz values inline uword num_converged(eT tol); // Return the adjusted nev for restarting inline uword nev_adjusted(uword nconv); // Retrieve and sort ritz values and ritz vectors inline void retrieve_ritzpair(); public: //! Constructor to create a solver object. inline GenEigsSolver(const OpType& op_, uword nev_, uword ncv_); //! Providing the initial residual vector for the algorithm. inline void init(eT* init_resid); //! Providing a random initial residual vector. inline void init(); //! Conducting the major computation procedure. inline uword compute(uword maxit = 1000, eT tol = 1e-10); //! Returning the number of iterations used in the computation. inline int num_iterations() { return niter; } //! Returning the number of matrix operations used in the computation. inline int num_operations() { return nmatop; } //! Returning the converged eigenvalues. inline Col< std::complex > eigenvalues(); //! Returning the eigenvectors associated with the converged eigenvalues. inline Mat< std::complex > eigenvectors(uword nvec); //! Returning all converged eigenvectors. inline Mat< std::complex > eigenvectors() { return eigenvectors(nev); } }; } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/glue_cross_meat.hpp0000644000176200001440000000443014124060717024257 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_cross //! @{ template inline void glue_cross::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy PA(X.A); const Proxy PB(X.B); arma_debug_check( ((PA.get_n_elem() != 3) || (PB.get_n_elem() != 3)), "cross(): each vector must have 3 elements" ); out.set_size(PA.get_n_rows(), PA.get_n_cols()); eT* out_mem = out.memptr(); if( (Proxy::use_at == false) && (Proxy::use_at == false) ) { typename Proxy::ea_type A = PA.get_ea(); typename Proxy::ea_type B = PB.get_ea(); const eT ax = A[0]; const eT ay = A[1]; const eT az = A[2]; const eT bx = B[0]; const eT by = B[1]; const eT bz = B[2]; out_mem[0] = ay*bz - az*by; out_mem[1] = az*bx - ax*bz; out_mem[2] = ax*by - ay*bx; } else { const bool PA_is_col = Proxy::is_col ? true : (PA.get_n_cols() == 1); const bool PB_is_col = Proxy::is_col ? true : (PB.get_n_cols() == 1); const eT ax = PA.at(0,0); const eT ay = PA_is_col ? PA.at(1,0) : PA.at(0,1); const eT az = PA_is_col ? PA.at(2,0) : PA.at(0,2); const eT bx = PB.at(0,0); const eT by = PB_is_col ? PB.at(1,0) : PB.at(0,1); const eT bz = PB_is_col ? PB.at(2,0) : PB.at(0,2); out_mem[0] = ay*bz - az*by; out_mem[1] = az*bx - ax*bz; out_mem[2] = ax*by - ay*bx; } } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_max_bones.hpp0000644000176200001440000000272414124060717024077 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_max //! @{ class glue_max : public traits_glue_or { public: // dense matrices template inline static void apply(Mat& out, const Glue& X); template inline static void apply(Mat& out, const Proxy& PA, const Proxy& PB); // cubes template inline static void apply(Cube& out, const GlueCube& X); template inline static void apply(Cube& out, const ProxyCube& PA, const ProxyCube& PB); }; //! @} RcppArmadillo/inst/include/armadillo_bits/include_hdf5.hpp0000644000176200001440000000267014124060717023441 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #if defined(ARMA_USE_HDF5) #undef H5_USE_110_API #define H5_USE_110_API #if !defined(ARMA_HDF5_INCLUDE_DIR) #include #else #define ARMA_STR1(x) x #define ARMA_STR2(x) ARMA_STR1(x) #define ARMA_HDF5_HEADER ARMA_STR2(ARMA_HDF5_INCLUDE_DIR)ARMA_STR2(hdf5.h) #include ARMA_INCFILE_WRAP(ARMA_HDF5_HEADER) #undef ARMA_STR1 #undef ARMA_STR2 #undef ARMA_HDF5_HEADER #endif #if defined(H5_USE_16_API_DEFAULT) || defined(H5_USE_16_API) #pragma message ("WARNING: disabling use of HDF5 due to its incompatible configuration") #undef ARMA_USE_HDF5 #undef ARMA_USE_HDF5_ALT #endif #endif RcppArmadillo/inst/include/armadillo_bits/newarp_SparseGenRealShiftSolve_meat.hpp0000644000176200001440000001113514124060717030170 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { template inline SparseGenRealShiftSolve::SparseGenRealShiftSolve(const SpMat& mat_obj, const eT shift) #if defined(ARMA_USE_SUPERLU) : perm_c(mat_obj.n_cols + 1) , perm_r(mat_obj.n_rows + 1) , n_rows(mat_obj.n_rows) , n_cols(mat_obj.n_cols) #endif { arma_extra_debug_sigprint(); #if defined(ARMA_USE_SUPERLU) { // Derived from sp_auxlib::run_aupd_shiftinvert() superlu_opts superlu_opts_default; superlu::superlu_options_t options; sp_auxlib::set_superlu_opts(options, superlu_opts_default); superlu::GlobalLU_t Glu; arrayops::fill_zeros(reinterpret_cast(&Glu), sizeof(superlu::GlobalLU_t)); superlu_supermatrix_wrangler x; superlu_supermatrix_wrangler xC; superlu_array_wrangler etree(mat_obj.n_cols+1); // Copy A-shift*I to x const bool status_x = sp_auxlib::copy_to_supermatrix_with_shift(x.get_ref(), mat_obj, shift); if(status_x == false) { arma_stop_runtime_error("newarp::SparseGenRealShiftSolve::SparseGenRealShiftSolve(): could not construct SuperLU matrix"); return; } int panel_size = superlu::sp_ispec_environ(1); int relax = superlu::sp_ispec_environ(2); int slu_info = 0; // Return code int lwork = 0; // lwork = 0: allocate space internally by system malloc superlu_stat_wrangler stat; arma_extra_debug_print("superlu::gstrf()"); superlu::get_permutation_c(options.ColPerm, x.get_ptr(), perm_c.get_ptr()); superlu::sp_preorder_mat(&options, x.get_ptr(), perm_c.get_ptr(), etree.get_ptr(), xC.get_ptr()); superlu::gstrf(&options, xC.get_ptr(), relax, panel_size, etree.get_ptr(), NULL, lwork, perm_c.get_ptr(), perm_r.get_ptr(), l.get_ptr(), u.get_ptr(), &Glu, stat.get_ptr(), &slu_info); if(slu_info != 0) { arma_debug_warn_level(2, "matrix is singular to working precision"); return; } eT x_norm_val = sp_auxlib::norm1(x.get_ptr()); eT x_rcond = sp_auxlib::lu_rcond(l.get_ptr(), u.get_ptr(), x_norm_val); if( (x_rcond < std::numeric_limits::epsilon()) || arma_isnan(x_rcond) ) { if(x_rcond > eT(0)) { arma_debug_warn_level(2, "matrix is singular to working precision (rcond: ", x_rcond, ")"); } else { arma_debug_warn_level(2, "matrix is singular to working precision"); } return; } valid = true; } #else { arma_ignore(mat_obj); arma_ignore(shift); } #endif } // Perform the shift-solve operation \f$y=(A-\sigma I)^{-1}x\f$. // y_out = inv(A - sigma * I) * x_in template inline void SparseGenRealShiftSolve::perform_op(eT* x_in, eT* y_out) const { arma_extra_debug_sigprint(); #if defined(ARMA_USE_SUPERLU) { const Col x(x_in , n_cols, false, true); Col y(y_out, n_rows, false, true); // Derived from sp_auxlib::run_aupd_shiftinvert() y = x; superlu_supermatrix_wrangler out_slu; const bool status_out_slu = sp_auxlib::wrap_to_supermatrix(out_slu.get_ref(), y); if(status_out_slu == false) { arma_stop_runtime_error("newarp::SparseGenRealShiftSolve::perform_op(): could not construct SuperLU matrix"); return; } superlu_stat_wrangler stat; int info = 0; arma_extra_debug_print("superlu::gstrs()"); superlu::gstrs(superlu::NOTRANS, l.get_ptr(), u.get_ptr(), perm_c.get_ptr(), perm_r.get_ptr(), out_slu.get_ptr(), stat.get_ptr(), &info); if(info != 0) { arma_stop_runtime_error("newarp::SparseGenRealShiftSolve::perform_op(): could not solve linear equation"); return; } // No need to modify memory further since it was all done in-place. } #else { arma_ignore(x_in); arma_ignore(y_out); } #endif } } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/spglue_relational_meat.hpp0000644000176200001440000003162114124060717025625 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_relational //! @{ template inline void spglue_rel_lt::apply(SpMat& out, const mtSpGlue& X) { arma_extra_debug_sigprint(); const SpProxy PA(X.A); const SpProxy PB(X.B); const bool is_alias = PA.is_alias(out) || PB.is_alias(out); if(is_alias == false) { spglue_rel_lt::apply_noalias(out, PA, PB); } else { SpMat tmp; spglue_rel_lt::apply_noalias(tmp, PA, PB); out.steal_mem(tmp); } } template inline void spglue_rel_lt::apply_noalias(SpMat& out, const SpProxy& PA, const SpProxy& PB) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; arma_debug_assert_same_size(PA.get_n_rows(), PA.get_n_cols(), PB.get_n_rows(), PB.get_n_cols(), "operator<"); const uword max_n_nonzero = PA.get_n_nonzero() + PB.get_n_nonzero(); // Resize memory to upper bound out.reserve(PA.get_n_rows(), PA.get_n_cols(), max_n_nonzero); // Now iterate across both matrices. typename SpProxy::const_iterator_type x_it = PA.begin(); typename SpProxy::const_iterator_type x_end = PA.end(); typename SpProxy::const_iterator_type y_it = PB.begin(); typename SpProxy::const_iterator_type y_end = PB.end(); uword count = 0; while( (x_it != x_end) || (y_it != y_end) ) { uword out_val; const uword x_it_col = x_it.col(); const uword x_it_row = x_it.row(); const uword y_it_col = y_it.col(); const uword y_it_row = y_it.row(); bool use_y_loc = false; if(x_it == y_it) { out_val = ((*x_it) < (*y_it)) ? uword(1) : uword(0); ++x_it; ++y_it; } else { if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end { out_val = ((*x_it) < eT(0)) ? uword(1) : uword(0); ++x_it; } else { out_val = (eT(0) < (*y_it)) ? uword(1) : uword(0); ++y_it; use_y_loc = true; } } if(out_val != uword(0)) { access::rw(out.values[count]) = out_val; const uword out_row = (use_y_loc == false) ? x_it_row : y_it_row; const uword out_col = (use_y_loc == false) ? x_it_col : y_it_col; access::rw(out.row_indices[count]) = out_row; access::rw(out.col_ptrs[out_col + 1])++; ++count; } arma_check( (count > max_n_nonzero), "internal error: spglue_rel_lt::apply_noalias(): count > max_n_nonzero" ); } const uword out_n_cols = out.n_cols; uword* col_ptrs = access::rwp(out.col_ptrs); // Fix column pointers to be cumulative. for(uword c = 1; c <= out_n_cols; ++c) { col_ptrs[c] += col_ptrs[c - 1]; } if(count < max_n_nonzero) { if(count <= (max_n_nonzero/2)) { out.mem_resize(count); } else { // quick resize without reallocating memory and copying data access::rw( out.n_nonzero) = count; access::rw( out.values[count]) = eT(0); access::rw(out.row_indices[count]) = uword(0); } } } // template inline void spglue_rel_gt::apply(SpMat& out, const mtSpGlue& X) { arma_extra_debug_sigprint(); const SpProxy PA(X.A); const SpProxy PB(X.B); const bool is_alias = PA.is_alias(out) || PB.is_alias(out); if(is_alias == false) { spglue_rel_gt::apply_noalias(out, PA, PB); } else { SpMat tmp; spglue_rel_gt::apply_noalias(tmp, PA, PB); out.steal_mem(tmp); } } template inline void spglue_rel_gt::apply_noalias(SpMat& out, const SpProxy& PA, const SpProxy& PB) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; arma_debug_assert_same_size(PA.get_n_rows(), PA.get_n_cols(), PB.get_n_rows(), PB.get_n_cols(), "operator>"); const uword max_n_nonzero = PA.get_n_nonzero() + PB.get_n_nonzero(); // Resize memory to upper bound out.reserve(PA.get_n_rows(), PA.get_n_cols(), max_n_nonzero); // Now iterate across both matrices. typename SpProxy::const_iterator_type x_it = PA.begin(); typename SpProxy::const_iterator_type x_end = PA.end(); typename SpProxy::const_iterator_type y_it = PB.begin(); typename SpProxy::const_iterator_type y_end = PB.end(); uword count = 0; while( (x_it != x_end) || (y_it != y_end) ) { uword out_val; const uword x_it_col = x_it.col(); const uword x_it_row = x_it.row(); const uword y_it_col = y_it.col(); const uword y_it_row = y_it.row(); bool use_y_loc = false; if(x_it == y_it) { out_val = ((*x_it) > (*y_it)) ? uword(1) : uword(0); ++x_it; ++y_it; } else { if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end { out_val = ((*x_it) > eT(0)) ? uword(1) : uword(0); ++x_it; } else { out_val = (eT(0) > (*y_it)) ? uword(1) : uword(0); ++y_it; use_y_loc = true; } } if(out_val != uword(0)) { access::rw(out.values[count]) = out_val; const uword out_row = (use_y_loc == false) ? x_it_row : y_it_row; const uword out_col = (use_y_loc == false) ? x_it_col : y_it_col; access::rw(out.row_indices[count]) = out_row; access::rw(out.col_ptrs[out_col + 1])++; ++count; } arma_check( (count > max_n_nonzero), "internal error: spglue_rel_gt::apply_noalias(): count > max_n_nonzero" ); } const uword out_n_cols = out.n_cols; uword* col_ptrs = access::rwp(out.col_ptrs); // Fix column pointers to be cumulative. for(uword c = 1; c <= out_n_cols; ++c) { col_ptrs[c] += col_ptrs[c - 1]; } if(count < max_n_nonzero) { if(count <= (max_n_nonzero/2)) { out.mem_resize(count); } else { // quick resize without reallocating memory and copying data access::rw( out.n_nonzero) = count; access::rw( out.values[count]) = eT(0); access::rw(out.row_indices[count]) = uword(0); } } } // template inline void spglue_rel_and::apply(SpMat& out, const mtSpGlue& X) { arma_extra_debug_sigprint(); const SpProxy PA(X.A); const SpProxy PB(X.B); const bool is_alias = PA.is_alias(out) || PB.is_alias(out); if(is_alias == false) { spglue_rel_and::apply_noalias(out, PA, PB); } else { SpMat tmp; spglue_rel_and::apply_noalias(tmp, PA, PB); out.steal_mem(tmp); } } template inline void spglue_rel_and::apply_noalias(SpMat& out, const SpProxy& PA, const SpProxy& PB) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; arma_debug_assert_same_size(PA.get_n_rows(), PA.get_n_cols(), PB.get_n_rows(), PB.get_n_cols(), "operator&&"); if( (PA.get_n_nonzero() == 0) || (PB.get_n_nonzero() == 0) ) { out.zeros(PA.get_n_rows(), PA.get_n_cols()); return; } const uword max_n_nonzero = (std::min)(PA.get_n_nonzero(), PB.get_n_nonzero()); // Resize memory to upper bound out.reserve(PA.get_n_rows(), PA.get_n_cols(), max_n_nonzero); // Now iterate across both matrices. typename SpProxy::const_iterator_type x_it = PA.begin(); typename SpProxy::const_iterator_type x_end = PA.end(); typename SpProxy::const_iterator_type y_it = PB.begin(); typename SpProxy::const_iterator_type y_end = PB.end(); uword count = 0; while( (x_it != x_end) || (y_it != y_end) ) { const uword x_it_row = x_it.row(); const uword x_it_col = x_it.col(); const uword y_it_row = y_it.row(); const uword y_it_col = y_it.col(); if(x_it == y_it) { access::rw(out.values[count]) = uword(1); access::rw(out.row_indices[count]) = x_it_row; access::rw(out.col_ptrs[x_it_col + 1])++; ++count; ++x_it; ++y_it; } else { if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end { ++x_it; } else { ++y_it; } } arma_check( (count > max_n_nonzero), "internal error: spglue_rel_and::apply_noalias(): count > max_n_nonzero" ); } const uword out_n_cols = out.n_cols; uword* col_ptrs = access::rwp(out.col_ptrs); // Fix column pointers to be cumulative. for(uword c = 1; c <= out_n_cols; ++c) { col_ptrs[c] += col_ptrs[c - 1]; } if(count < max_n_nonzero) { if(count <= (max_n_nonzero/2)) { out.mem_resize(count); } else { // quick resize without reallocating memory and copying data access::rw( out.n_nonzero) = count; access::rw( out.values[count]) = eT(0); access::rw(out.row_indices[count]) = uword(0); } } } // template inline void spglue_rel_or::apply(SpMat& out, const mtSpGlue& X) { arma_extra_debug_sigprint(); const SpProxy PA(X.A); const SpProxy PB(X.B); const bool is_alias = PA.is_alias(out) || PB.is_alias(out); if(is_alias == false) { spglue_rel_or::apply_noalias(out, PA, PB); } else { SpMat tmp; spglue_rel_or::apply_noalias(tmp, PA, PB); out.steal_mem(tmp); } } template inline void spglue_rel_or::apply_noalias(SpMat& out, const SpProxy& PA, const SpProxy& PB) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; arma_debug_assert_same_size(PA.get_n_rows(), PA.get_n_cols(), PB.get_n_rows(), PB.get_n_cols(), "operator||"); const uword max_n_nonzero = PA.get_n_nonzero() + PB.get_n_nonzero(); // Resize memory to upper bound out.reserve(PA.get_n_rows(), PA.get_n_cols(), max_n_nonzero); // Now iterate across both matrices. typename SpProxy::const_iterator_type x_it = PA.begin(); typename SpProxy::const_iterator_type x_end = PA.end(); typename SpProxy::const_iterator_type y_it = PB.begin(); typename SpProxy::const_iterator_type y_end = PB.end(); uword count = 0; while( (x_it != x_end) || (y_it != y_end) ) { const uword x_it_col = x_it.col(); const uword x_it_row = x_it.row(); const uword y_it_col = y_it.col(); const uword y_it_row = y_it.row(); bool use_y_loc = false; if(x_it == y_it) { ++x_it; ++y_it; } else { if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end { ++x_it; } else { ++y_it; use_y_loc = true; } } access::rw(out.values[count]) = uword(1); const uword out_row = (use_y_loc == false) ? x_it_row : y_it_row; const uword out_col = (use_y_loc == false) ? x_it_col : y_it_col; access::rw(out.row_indices[count]) = out_row; access::rw(out.col_ptrs[out_col + 1])++; ++count; arma_check( (count > max_n_nonzero), "internal error: spglue_rel_or::apply_noalias(): count > max_n_nonzero" ); } const uword out_n_cols = out.n_cols; uword* col_ptrs = access::rwp(out.col_ptrs); // Fix column pointers to be cumulative. for(uword c = 1; c <= out_n_cols; ++c) { col_ptrs[c] += col_ptrs[c - 1]; } if(count < max_n_nonzero) { if(count <= (max_n_nonzero/2)) { out.mem_resize(count); } else { // quick resize without reallocating memory and copying data access::rw( out.n_nonzero) = count; access::rw( out.values[count]) = eT(0); access::rw(out.row_indices[count]) = uword(0); } } } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_polyval_meat.hpp0000644000176200001440000000371214124060717024616 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_polyval //! @{ template inline void glue_polyval::apply_noalias(Mat& out, const Mat& P, const Mat& X) { arma_extra_debug_sigprint(); out.set_size(X.n_rows, X.n_cols); const eT* P_mem = P.memptr(); const uword P_n_elem = P.n_elem; out.fill(P_mem[0]); for(uword i=1; i < P_n_elem; ++i) { out = out % X + P_mem[i]; } } template inline void glue_polyval::apply(Mat& out, const Glue& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap UP(expr.A); const quasi_unwrap UX(expr.B); const Mat& P = UP.M; const Mat& X = UX.M; arma_debug_check( ((P.is_vec() == false) && (P.is_empty() == false)), "polyval(): argument P must be a vector" ); if(P.is_empty() || X.is_empty()) { out.zeros(X.n_rows, X.n_cols); return; } if(UP.is_alias(out) || UX.is_alias(out)) { Mat tmp; glue_polyval::apply_noalias(tmp, P, X); out.steal_mem(tmp); } else { glue_polyval::apply_noalias(out, P, X); } } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_sum_meat.hpp0000644000176200001440000000473014124060717023762 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_sum //! @{ template arma_hot inline void spop_sum::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "sum(): parameter 'dim' must be 0 or 1" ); const SpProxy p(in.m); const uword p_n_rows = p.get_n_rows(); const uword p_n_cols = p.get_n_cols(); if(p.get_n_nonzero() == 0) { if(dim == 0) { out.zeros(1,p_n_cols); } if(dim == 1) { out.zeros(p_n_rows,1); } return; } if(dim == 0) // find the sum in each column { Row acc(p_n_cols, arma_zeros_indicator()); eT* acc_mem = acc.memptr(); if(SpProxy::use_iterator) { typename SpProxy::const_iterator_type it = p.begin(); const uword N = p.get_n_nonzero(); for(uword i=0; i < N; ++i) { acc_mem[it.col()] += (*it); ++it; } } else { for(uword col = 0; col < p_n_cols; ++col) { acc_mem[col] = arrayops::accumulate ( &p.get_values()[p.get_col_ptrs()[col]], p.get_col_ptrs()[col + 1] - p.get_col_ptrs()[col] ); } } out = acc; } else if(dim == 1) // find the sum in each row { Col acc(p_n_rows, arma_zeros_indicator()); eT* acc_mem = acc.memptr(); typename SpProxy::const_iterator_type it = p.begin(); const uword N = p.get_n_nonzero(); for(uword i=0; i < N; ++i) { acc_mem[it.row()] += (*it); ++it; } out = acc; } } //! @} RcppArmadillo/inst/include/armadillo_bits/op_range_meat.hpp0000644000176200001440000000434614124060717023712 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_range //! @{ template inline void op_range::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "range(): parameter 'dim' must be 0 or 1" ); const quasi_unwrap U(in.m); const Mat& X = U.M; if(U.is_alias(out) == false) { op_range::apply_noalias(out, X, dim); } else { Mat tmp; op_range::apply_noalias(tmp, X, dim); out.steal_mem(tmp); } } template inline void op_range::apply_noalias(Mat& out, const Mat& X, const uword dim) { arma_extra_debug_sigprint(); // TODO: replace with dedicated implementation which finds min and max at the same time out = max(X,dim) - min(X,dim); } template inline typename T1::elem_type op_range::vector_range(const T1& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap U(expr); const Mat& X = U.M; const eT* X_mem = X.memptr(); const uword N = X.n_elem; if(N == 0) { arma_debug_check(true, "range(): object has no elements"); return Datum::nan; } // TODO: replace with dedicated implementation which finds min and max at the same time return op_max::direct_max(X_mem, N) - op_min::direct_min(X_mem, N); } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_toeplitz_meat.hpp0000644000176200001440000000363614124060717025007 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_toeplitz //! @{ template inline void glue_toeplitz::apply(Mat& out, const Glue& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_check tmp1(in.A, out); const unwrap_check tmp2(in.B, out); const Mat& A = tmp1.M; const Mat& B = tmp2.M; arma_debug_check ( ( ((A.is_vec() == false) && (A.is_empty() == false)) || ((B.is_vec() == false) && (B.is_empty() == false)) ), "toeplitz(): given object must be a vector" ); const uword A_N = A.n_elem; const uword B_N = B.n_elem; const eT* A_mem = A.memptr(); const eT* B_mem = B.memptr(); out.set_size(A_N, B_N); if( out.is_empty() ) { return; } for(uword col=0; col < B_N; ++col) { eT* col_mem = out.colptr(col); uword i = 0; for(uword row=col; row < A_N; ++row, ++i) { col_mem[row] = A_mem[i]; } } for(uword row=0; row < A_N; ++row) { uword i = 1; for(uword col=(row+1); col < B_N; ++col, ++i) { out.at(row,col) = B_mem[i]; } } } //! @} RcppArmadillo/inst/include/armadillo_bits/spglue_max_bones.hpp0000644000176200001440000000330614124060717024437 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_max //! @{ class spglue_max : public traits_glue_or { public: template inline static void apply(SpMat& out, const SpGlue& X); template inline static void apply_noalias(SpMat& out, const SpProxy& pa, const SpProxy& pb); template inline static void apply_noalias(SpMat& out, const SpMat& A, const SpMat& B); template inline static void dense_sparse_max(Mat& out, const Base& X, const SpBase& Y); template inline static typename enable_if2::no, eT>::result elem_max(const eT& a, const eT& b); template inline static typename enable_if2::yes, eT>::result elem_max(const eT& a, const eT& b); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_dot.hpp0000644000176200001440000001561714124060717022366 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_dot //! @{ template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && is_arma_type::value && is_same_type::yes, typename T1::elem_type >::result dot ( const T1& A, const T2& B ) { arma_extra_debug_sigprint(); return op_dot::apply(A,B); } template arma_warn_unused inline typename enable_if2 < is_arma_type::value && is_arma_type::value && is_same_type::no, typename promote_type::result >::result dot ( const T1& A, const T2& B ) { arma_extra_debug_sigprint(); return op_dot_mixed::apply(A,B); } template arma_warn_unused inline typename enable_if2 < is_arma_type::value && is_arma_type::value && is_same_type::value, typename T1::elem_type >::result norm_dot ( const T1& A, const T2& B ) { arma_extra_debug_sigprint(); return op_norm_dot::apply(A,B); } // // cdot template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && is_arma_type::value && is_same_type::value && is_cx::no, typename T1::elem_type >::result cdot ( const T1& A, const T2& B ) { arma_extra_debug_sigprint(); return op_dot::apply(A,B); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && is_arma_type::value && is_same_type::value && is_cx::yes, typename T1::elem_type >::result cdot ( const T1& A, const T2& B ) { arma_extra_debug_sigprint(); return op_cdot::apply(A,B); } // convert dot(htrans(x), y) to cdot(x,y) template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && is_same_type::value && is_cx::yes, typename T1::elem_type >::result dot ( const Op& A, const T2& B ) { arma_extra_debug_sigprint(); return cdot(A.m, B); } // // for sparse matrices // namespace priv { template arma_hot inline typename T1::elem_type dot_helper(const SpProxy& pa, const SpProxy& pb) { typedef typename T1::elem_type eT; // Iterate over both objects and see when they are the same eT result = eT(0); typename SpProxy::const_iterator_type a_it = pa.begin(); typename SpProxy::const_iterator_type a_end = pa.end(); typename SpProxy::const_iterator_type b_it = pb.begin(); typename SpProxy::const_iterator_type b_end = pb.end(); while((a_it != a_end) && (b_it != b_end)) { if(a_it == b_it) { result += (*a_it) * (*b_it); ++a_it; ++b_it; } else if((a_it.col() < b_it.col()) || ((a_it.col() == b_it.col()) && (a_it.row() < b_it.row()))) { // a_it is "behind" ++a_it; } else { // b_it is "behind" ++b_it; } } return result; } } //! dot product of two sparse objects template arma_warn_unused arma_hot inline typename enable_if2 <(is_arma_sparse_type::value) && (is_arma_sparse_type::value) && (is_same_type::value), typename T1::elem_type >::result dot ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); const SpProxy pa(x); const SpProxy pb(y); arma_debug_assert_same_size(pa.get_n_rows(), pa.get_n_cols(), pb.get_n_rows(), pb.get_n_cols(), "dot()"); typedef typename T1::elem_type eT; typedef typename SpProxy::stored_type pa_Q_type; typedef typename SpProxy::stored_type pb_Q_type; if( ( (SpProxy::use_iterator == false) && (SpProxy::use_iterator == false) ) && ( (is_SpMat::value == true ) && (is_SpMat::value == true ) ) ) { const unwrap_spmat tmp_a(pa.Q); const unwrap_spmat tmp_b(pb.Q); const SpMat& A = tmp_a.M; const SpMat& B = tmp_b.M; if( &A == &B ) { // We can do it directly! return op_dot::direct_dot_arma(A.n_nonzero, A.values, A.values); } else { return priv::dot_helper(pa,pb); } } else { return priv::dot_helper(pa,pb); } } //! dot product of one dense and one sparse object template arma_warn_unused arma_hot inline typename enable_if2 <(is_arma_type::value) && (is_arma_sparse_type::value) && (is_same_type::value), typename T1::elem_type >::result dot ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); const Proxy pa(x); const SpProxy pb(y); arma_debug_assert_same_size(pa.get_n_rows(), pa.get_n_cols(), pb.get_n_rows(), pb.get_n_cols(), "dot()"); typedef typename T1::elem_type eT; eT result = eT(0); typename SpProxy::const_iterator_type it = pb.begin(); typename SpProxy::const_iterator_type it_end = pb.end(); // use_at == false won't save us operations while(it != it_end) { result += (*it) * pa.at(it.row(), it.col()); ++it; } return result; } //! dot product of one sparse and one dense object template arma_warn_unused arma_hot inline typename enable_if2 <(is_arma_sparse_type::value) && (is_arma_type::value) && (is_same_type::value), typename T1::elem_type >::result dot ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); // this is commutative return dot(y, x); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_diagvec_meat.hpp0000644000176200001440000003207614124060717024221 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_diagvec //! @{ template inline void op_diagvec::apply(Mat& out, const Op& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy P(X.m); if(P.is_alias(out) == false) { op_diagvec::apply_proxy(out, P); } else { Mat tmp; op_diagvec::apply_proxy(tmp, P); out.steal_mem(tmp); } } template inline void op_diagvec::apply_proxy(Mat& out, const Proxy& P) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword len = (std::min)(n_rows, n_cols); out.set_size(len, 1); eT* out_mem = out.memptr(); uword i,j; for(i=0, j=1; j < len; i+=2, j+=2) { const eT tmp_i = P.at(i, i); const eT tmp_j = P.at(j, j); out_mem[i] = tmp_i; out_mem[j] = tmp_j; } if(i < len) { out_mem[i] = P.at(i, i); } } template inline void op_diagvec::apply(Mat& actual_out, const Op< Glue, op_diagvec>& X, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; const partial_unwrap UA(X.m.A); const partial_unwrap UB(X.m.B); const typename partial_unwrap::stored_type& A = UA.M; const typename partial_unwrap::stored_type& B = UB.M; arma_debug_assert_trans_mul_size< partial_unwrap::do_trans, partial_unwrap::do_trans >(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "matrix multiplication"); if( (A.n_elem == 0) || (B.n_elem == 0) ) { actual_out.reset(); return; } const bool use_alpha = partial_unwrap::do_times || partial_unwrap::do_times; const eT alpha = use_alpha ? (UA.get_val() * UB.get_val()) : eT(0); const bool is_alias = (UA.is_alias(actual_out) || UB.is_alias(actual_out)); Mat tmp; Mat& out = (is_alias) ? tmp : actual_out; const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; if( (partial_unwrap::do_trans == false) && (partial_unwrap::do_trans == false) ) { arma_extra_debug_print("trans_A = false; trans_B = false;"); const uword N = (std::min)(A_n_rows, B_n_cols); out.set_size(N,1); eT* out_mem = out.memptr(); for(uword k=0; k < N; ++k) { eT acc1 = eT(0); eT acc2 = eT(0); const eT* B_colptr = B.colptr(k); // condition: A_n_cols = B_n_rows uword j; for(j=1; j < A_n_cols; j+=2) { const uword i = (j-1); const eT tmp_i = B_colptr[i]; const eT tmp_j = B_colptr[j]; acc1 += A.at(k, i) * tmp_i; acc2 += A.at(k, j) * tmp_j; } const uword i = (j-1); if(i < A_n_cols) { acc1 += A.at(k, i) * B_colptr[i]; } const eT acc = acc1 + acc2; out_mem[k] = (use_alpha) ? eT(alpha * acc) : eT(acc); } } else if( (partial_unwrap::do_trans == true ) && (partial_unwrap::do_trans == false) ) { arma_extra_debug_print("trans_A = true; trans_B = false;"); const uword N = (std::min)(A_n_cols, B_n_cols); out.set_size(N,1); eT* out_mem = out.memptr(); for(uword k=0; k < N; ++k) { const eT* A_colptr = A.colptr(k); const eT* B_colptr = B.colptr(k); // condition: A_n_rows = B_n_rows const eT acc = op_dot::direct_dot(A_n_rows, A_colptr, B_colptr); out_mem[k] = (use_alpha) ? eT(alpha * acc) : eT(acc); } } else if( (partial_unwrap::do_trans == false) && (partial_unwrap::do_trans == true ) ) { arma_extra_debug_print("trans_A = false; trans_B = true;"); const uword N = (std::min)(A_n_rows, B_n_rows); out.set_size(N,1); eT* out_mem = out.memptr(); for(uword k=0; k < N; ++k) { eT acc = eT(0); // condition: A_n_cols = B_n_cols for(uword i=0; i < A_n_cols; ++i) { acc += A.at(k,i) * B.at(k,i); } out_mem[k] = (use_alpha) ? eT(alpha * acc) : eT(acc); } } else if( (partial_unwrap::do_trans == true ) && (partial_unwrap::do_trans == true ) ) { arma_extra_debug_print("trans_A = true; trans_B = true;"); const uword N = (std::min)(A_n_cols, B_n_rows); out.set_size(N,1); eT* out_mem = out.memptr(); for(uword k=0; k < N; ++k) { eT acc = eT(0); const eT* A_colptr = A.colptr(k); // condition: A_n_rows = B_n_cols for(uword i=0; i < A_n_rows; ++i) { acc += A_colptr[i] * B.at(k,i); } out_mem[k] = (use_alpha) ? eT(alpha * acc) : eT(acc); } } if(is_alias) { actual_out.steal_mem(tmp); } } template inline void op_diagvec::apply(Mat& actual_out, const Op< Glue, op_diagvec>& X, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::pod_type T; typedef typename T1::elem_type eT; const partial_unwrap UA(X.m.A); const partial_unwrap UB(X.m.B); const typename partial_unwrap::stored_type& A = UA.M; const typename partial_unwrap::stored_type& B = UB.M; arma_debug_assert_trans_mul_size< partial_unwrap::do_trans, partial_unwrap::do_trans >(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "matrix multiplication"); if( (A.n_elem == 0) || (B.n_elem == 0) ) { actual_out.reset(); return; } const bool use_alpha = partial_unwrap::do_times || partial_unwrap::do_times; const eT alpha = use_alpha ? (UA.get_val() * UB.get_val()) : eT(0); const bool is_alias = (UA.is_alias(actual_out) || UB.is_alias(actual_out)); Mat tmp; Mat& out = (is_alias) ? tmp : actual_out; const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; if( (partial_unwrap::do_trans == false) && (partial_unwrap::do_trans == false) ) { arma_extra_debug_print("trans_A = false; trans_B = false;"); const uword N = (std::min)(A_n_rows, B_n_cols); out.set_size(N,1); eT* out_mem = out.memptr(); for(uword k=0; k < N; ++k) { T acc_real = T(0); T acc_imag = T(0); const eT* B_colptr = B.colptr(k); // condition: A_n_cols = B_n_rows for(uword i=0; i < A_n_cols; ++i) { // acc += A.at(k, i) * B_colptr[i]; const std::complex& xx = A.at(k, i); const std::complex& yy = B_colptr[i]; const T a = xx.real(); const T b = xx.imag(); const T c = yy.real(); const T d = yy.imag(); acc_real += (a*c) - (b*d); acc_imag += (a*d) + (b*c); } const eT acc = std::complex(acc_real, acc_imag); out_mem[k] = (use_alpha) ? eT(alpha * acc) : eT(acc); } } else if( (partial_unwrap::do_trans == true) && (partial_unwrap::do_trans == false) ) { arma_extra_debug_print("trans_A = true; trans_B = false;"); const uword N = (std::min)(A_n_cols, B_n_cols); out.set_size(N,1); eT* out_mem = out.memptr(); for(uword k=0; k < N; ++k) { T acc_real = T(0); T acc_imag = T(0); const eT* A_colptr = A.colptr(k); const eT* B_colptr = B.colptr(k); // condition: A_n_rows = B_n_rows for(uword i=0; i < A_n_rows; ++i) { // acc += std::conj(A_colptr[i]) * B_colptr[i]; const std::complex& xx = A_colptr[i]; const std::complex& yy = B_colptr[i]; const T a = xx.real(); const T b = xx.imag(); const T c = yy.real(); const T d = yy.imag(); // take into account the complex conjugate of xx acc_real += (a*c) + (b*d); acc_imag += (a*d) - (b*c); } const eT acc = std::complex(acc_real, acc_imag); out_mem[k] = (use_alpha) ? eT(alpha * acc) : eT(acc); } } else if( (partial_unwrap::do_trans == false) && (partial_unwrap::do_trans == true) ) { arma_extra_debug_print("trans_A = false; trans_B = true;"); const uword N = (std::min)(A_n_rows, B_n_rows); out.set_size(N,1); eT* out_mem = out.memptr(); for(uword k=0; k < N; ++k) { T acc_real = T(0); T acc_imag = T(0); // condition: A_n_cols = B_n_cols for(uword i=0; i < A_n_cols; ++i) { // acc += A.at(k,i) * std::conj(B.at(k,i)); const std::complex& xx = A.at(k, i); const std::complex& yy = B.at(k, i); const T a = xx.real(); const T b = xx.imag(); const T c = yy.real(); const T d = -yy.imag(); // take the conjugate acc_real += (a*c) - (b*d); acc_imag += (a*d) + (b*c); } const eT acc = std::complex(acc_real, acc_imag); out_mem[k] = (use_alpha) ? eT(alpha * acc) : eT(acc); } } else if( (partial_unwrap::do_trans == true) && (partial_unwrap::do_trans == true) ) { arma_extra_debug_print("trans_A = true; trans_B = true;"); const uword N = (std::min)(A_n_cols, B_n_rows); out.set_size(N,1); eT* out_mem = out.memptr(); for(uword k=0; k < N; ++k) { T acc_real = T(0); T acc_imag = T(0); const eT* A_colptr = A.colptr(k); // condition: A_n_rows = B_n_cols for(uword i=0; i < A_n_rows; ++i) { // acc += std::conj(A_colptr[i]) * std::conj(B.at(k,i)); const std::complex& xx = A_colptr[i]; const std::complex& yy = B.at(k, i); const T a = xx.real(); const T b = -xx.imag(); // take the conjugate const T c = yy.real(); const T d = -yy.imag(); // take the conjugate acc_real += (a*c) - (b*d); acc_imag += (a*d) + (b*c); } const eT acc = std::complex(acc_real, acc_imag); out_mem[k] = (use_alpha) ? eT(alpha * acc) : eT(acc); } } if(is_alias) { actual_out.steal_mem(tmp); } } // // // template inline void op_diagvec2::apply(Mat& out, const Op& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword a = X.aux_uword_a; const uword b = X.aux_uword_b; const uword row_offset = (b > 0) ? a : 0; const uword col_offset = (b == 0) ? a : 0; const Proxy P(X.m); if(P.is_alias(out) == false) { op_diagvec2::apply_proxy(out, P, row_offset, col_offset); } else { Mat tmp; op_diagvec2::apply_proxy(tmp, P, row_offset, col_offset); out.steal_mem(tmp); } } template inline void op_diagvec2::apply_proxy(Mat& out, const Proxy& P, const uword row_offset, const uword col_offset) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); arma_debug_check_bounds ( ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)), "diagvec(): requested diagonal is out of bounds" ); const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset); out.set_size(len, 1); eT* out_mem = out.memptr(); uword i,j; for(i=0, j=1; j < len; i+=2, j+=2) { const eT tmp_i = P.at( i + row_offset, i + col_offset ); const eT tmp_j = P.at( j + row_offset, j + col_offset ); out_mem[i] = tmp_i; out_mem[j] = tmp_j; } if(i < len) { out_mem[i] = P.at( i + row_offset, i + col_offset ); } } //! @} RcppArmadillo/inst/include/armadillo_bits/op_chi2rnd_meat.hpp0000644000176200001440000000672014124060717024145 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_chi2rnd //! @{ template inline void op_chi2rnd::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy P(in.m); if(P.is_alias(out) == false) { op_chi2rnd::apply_noalias(out, P); } else { Mat tmp; op_chi2rnd::apply_noalias(tmp, P); out.steal_mem(tmp); } } template inline void op_chi2rnd::apply_noalias(Mat& out, const Proxy& P) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; op_chi2rnd_varying_df generator; const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); out.set_size(n_rows, n_cols); eT* out_mem = out.memptr(); if(Proxy::use_at == false) { const uword N = P.get_n_elem(); typename Proxy::ea_type Pea = P.get_ea(); for(uword i=0; i inline void op_chi2rnd::fill_constant_df(Mat& out, const eT df) { arma_extra_debug_sigprint(); if(df > eT(0)) { typedef std::mt19937_64 motor_type; typedef std::mt19937_64::result_type seed_type; typedef std::chi_squared_distribution distr_type; motor_type motor; motor.seed( seed_type(arma_rng::randi()) ); distr_type distr(df); const uword N = out.n_elem; eT* out_mem = out.memptr(); for(uword i=0; i::nan ); } } // template inline op_chi2rnd_varying_df::~op_chi2rnd_varying_df() { arma_extra_debug_sigprint(); } template inline op_chi2rnd_varying_df::op_chi2rnd_varying_df() { arma_extra_debug_sigprint(); typedef std::mt19937_64::result_type seed_type; motor.seed( seed_type(arma_rng::randi()) ); } template inline eT op_chi2rnd_varying_df::operator()(const eT df) { arma_extra_debug_sigprint(); // as C++11 doesn't seem to provide a way to explicitly set the parameter // of an existing chi_squared_distribution object, // we need to create a new object each time if(df > eT(0)) { std::chi_squared_distribution distr(df); return eT( distr(motor) ); } else { return Datum::nan; } } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_reverse.hpp0000644000176200001440000000360514124060717023245 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_reverse //! @{ template arma_warn_unused inline typename enable_if2 < is_arma_type::value && resolves_to_vector::yes, const Op >::result reverse ( const T1& X ) { arma_extra_debug_sigprint(); return Op(X); } template arma_warn_unused inline typename enable_if2 < is_arma_type::value && resolves_to_vector::no, const Op >::result reverse ( const T1& X ) { arma_extra_debug_sigprint(); return Op(X, 0, 0); } template arma_warn_unused inline typename enable_if2< is_arma_type::value, const Op >::result reverse ( const T1& X, const uword dim ) { arma_extra_debug_sigprint(); return Op(X, dim, 0); } template arma_warn_unused inline const SpOp reverse ( const SpBase& X, const uword dim = 0 ) { arma_extra_debug_sigprint(); return SpOp(X.get_ref(), dim, 0); } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_cor_meat.hpp0000644000176200001440000000422314124060717023711 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_cor //! @{ template inline void glue_cor::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword norm_type = X.aux_uword; const unwrap UA(X.A); const unwrap UB(X.B); const Mat& A = UA.M; const Mat& B = UB.M; const Mat& AA = (A.n_rows == 1) ? Mat(const_cast(A.memptr()), A.n_cols, A.n_rows, false, false) : Mat(const_cast(A.memptr()), A.n_rows, A.n_cols, false, false); const Mat& BB = (B.n_rows == 1) ? Mat(const_cast(B.memptr()), B.n_cols, B.n_rows, false, false) : Mat(const_cast(B.memptr()), B.n_rows, B.n_cols, false, false); arma_debug_assert_mul_size(AA, BB, true, false, "cor()"); if( (AA.n_elem == 0) || (BB.n_elem == 0) ) { out.reset(); return; } const uword N = AA.n_rows; const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N); const Mat tmp1 = AA.each_row() - mean(AA,0); const Mat tmp2 = BB.each_row() - mean(BB,0); out = tmp1.t() * tmp2; out /= norm_val; out /= conv_to< Mat >::from( stddev(AA).t() * stddev(BB) ); // TODO: check for zeros? } //! @} RcppArmadillo/inst/include/armadillo_bits/op_repelem_meat.hpp0000644000176200001440000000527514124060717024251 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_repelem //! @{ template inline void op_repelem::apply_noalias(Mat& out, const obj& X, const uword copies_per_row, const uword copies_per_col) { arma_extra_debug_sigprint(); typedef typename obj::elem_type eT; const uword X_n_rows = obj::is_row ? uword(1) : X.n_rows; const uword X_n_cols = obj::is_col ? uword(1) : X.n_cols; out.set_size(X_n_rows * copies_per_row, X_n_cols * copies_per_col); if(out.n_elem == 0) { return; } for(uword col=0; col < X_n_cols; ++col) { const uword out_col_offset = col * copies_per_col; eT* out_colptr_first = out.colptr(out_col_offset); for(uword row=0; row < X_n_rows; ++row) { const uword out_row_offset = row * copies_per_row; const eT copy_value = X.at(row, col); for(uword row_copy=0; row_copy < copies_per_row; ++row_copy) { out_colptr_first[out_row_offset + row_copy] = copy_value; } if(copies_per_col != 1) { for(uword col_copy=1; col_copy < copies_per_col; ++col_copy) { eT* out_colptr = out.colptr(out_col_offset + col_copy); arrayops::copy(&out_colptr[out_row_offset], &out_colptr_first[out_row_offset], copies_per_row); } } } } } template inline void op_repelem::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword copies_per_row = in.aux_uword_a; const uword copies_per_col = in.aux_uword_b; const quasi_unwrap U(in.m); if(U.is_alias(out)) { Mat tmp; op_repelem::apply_noalias(tmp, U.M, copies_per_row, copies_per_col); out.steal_mem(tmp); } else { op_repelem::apply_noalias(out, U.M, copies_per_row, copies_per_col); } } //! @} RcppArmadillo/inst/include/armadillo_bits/op_sp_plus_meat.hpp0000644000176200001440000000731614124060717024303 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_sp_plus //! @{ template inline void op_sp_plus::apply(Mat& out, const SpToDOp& in) { arma_extra_debug_sigprint(); // Note that T1 will be a sparse type, so we use SpProxy. const SpProxy proxy(in.m); out.set_size(proxy.get_n_rows(), proxy.get_n_cols()); out.fill(in.aux); typename SpProxy::const_iterator_type it = proxy.begin(); typename SpProxy::const_iterator_type it_end = proxy.end(); for(; it != it_end; ++it) { out.at(it.row(), it.col()) += (*it); } } // force apply into sparse matrix template inline void op_sp_plus::apply(SpMat& out, const SpToDOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // Note that T1 will be a sparse type, so we use SpProxy. const SpProxy proxy(in.m); const uword n_rows = proxy.get_n_rows(); const uword n_cols = proxy.get_n_cols(); out.set_size(n_rows, n_cols); const eT k = in.aux; // We have to loop over all the elements. for(uword c = 0; c < n_cols; ++c) for(uword r = 0; r < n_rows; ++r) { out.at(r, c) = proxy.at(r, c) + k; } } // used for the optimization of sparse % (sparse + scalar) template inline void op_sp_plus::apply_inside_schur(SpMat& out, const T2& x, const SpToDOp& y) { arma_extra_debug_sigprint(); const SpProxy proxy2(x); const SpProxy proxy3(y.m); arma_debug_assert_same_size(proxy2.get_n_rows(), proxy2.get_n_cols(), proxy3.get_n_rows(), proxy3.get_n_cols(), "element-wise multiplication"); out.zeros(proxy2.get_n_rows(), proxy2.get_n_cols()); typename SpProxy::const_iterator_type it = proxy2.begin(); typename SpProxy::const_iterator_type it_end = proxy2.end(); const eT k = y.aux; for(; it != it_end; ++it) { const uword it_row = it.row(); const uword it_col = it.col(); out.at(it_row, it_col) = (*it) * (proxy3.at(it_row, it_col) + k); } } // used for the optimization of sparse / (sparse + scalar) template inline void op_sp_plus::apply_inside_div(SpMat& out, const T2& x, const SpToDOp& y) { arma_extra_debug_sigprint(); const SpProxy proxy2(x); const SpProxy proxy3(y.m); arma_debug_assert_same_size(proxy2.get_n_rows(), proxy2.get_n_cols(), proxy3.get_n_rows(), proxy3.get_n_cols(), "element-wise division"); out.zeros(proxy2.get_n_rows(), proxy2.get_n_cols()); typename SpProxy::const_iterator_type it = proxy2.begin(); typename SpProxy::const_iterator_type it_end = proxy2.end(); const eT k = y.aux; for(; it != it_end; ++it) { const uword it_row = it.row(); const uword it_col = it.col(); out.at(it_row, it_col) = (*it) / (proxy3.at(it_row, it_col) + k); } } //! @} RcppArmadillo/inst/include/armadillo_bits/op_log_det_bones.hpp0000644000176200001440000000315414124060717024407 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_log_det //! @{ class op_log_det : public traits_op_default { public: template inline static bool apply_direct(typename T1::elem_type& out_val, typename T1::pod_type& out_sign, const Base& expr); template inline static bool apply_diagmat(typename T1::elem_type& out_val, typename T1::pod_type& out_sign, const Base& expr); template inline static bool apply_trimat(typename T1::elem_type& out_val, typename T1::pod_type& out_sign, const Base& expr); }; class op_log_det_sympd : public traits_op_default { public: template inline static bool apply_direct(typename T1::pod_type& out_val, const Base& expr); }; //! @} RcppArmadillo/inst/include/armadillo_bits/gmm_full_bones.hpp0000644000176200001440000001562114124060717024100 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup gmm_full //! @{ namespace gmm_priv { template class gmm_full { public: arma_aligned const Mat means; arma_aligned const Cube fcovs; arma_aligned const Row hefts; // // inline ~gmm_full(); inline gmm_full(); inline gmm_full(const gmm_full& x); inline gmm_full& operator=(const gmm_full& x); inline explicit gmm_full(const gmm_diag& x); inline gmm_full& operator=(const gmm_diag& x); inline gmm_full(const uword in_n_dims, const uword in_n_gaus); inline void reset(const uword in_n_dims, const uword in_n_gaus); inline void reset(); template inline void set_params(const Base& in_means, const BaseCube& in_fcovs, const Base& in_hefts); template inline void set_means(const Base & in_means); template inline void set_fcovs(const BaseCube& in_fcovs); template inline void set_hefts(const Base & in_hefts); inline uword n_dims() const; inline uword n_gaus() const; inline bool load(const std::string name); inline bool save(const std::string name) const; inline Col generate() const; inline Mat generate(const uword N) const; template inline eT log_p(const T1& expr, const gmm_empty_arg& junk1 = gmm_empty_arg(), typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == true ))>::result* junk2 = nullptr) const; template inline eT log_p(const T1& expr, const uword gaus_id, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == true ))>::result* junk2 = nullptr) const; template inline Row log_p(const T1& expr, const gmm_empty_arg& junk1 = gmm_empty_arg(), typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == false))>::result* junk2 = nullptr) const; template inline Row log_p(const T1& expr, const uword gaus_id, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == false))>::result* junk2 = nullptr) const; template inline eT sum_log_p(const Base& expr) const; template inline eT sum_log_p(const Base& expr, const uword gaus_id) const; template inline eT avg_log_p(const Base& expr) const; template inline eT avg_log_p(const Base& expr, const uword gaus_id) const; template inline uword assign(const T1& expr, const gmm_dist_mode& dist, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == true ))>::result* junk = nullptr) const; template inline urowvec assign(const T1& expr, const gmm_dist_mode& dist, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == false))>::result* junk = nullptr) const; template inline urowvec raw_hist(const Base& expr, const gmm_dist_mode& dist_mode) const; template inline Row norm_hist(const Base& expr, const gmm_dist_mode& dist_mode) const; template inline bool learn ( const Base& data, const uword n_gaus, const gmm_dist_mode& dist_mode, const gmm_seed_mode& seed_mode, const uword km_iter, const uword em_iter, const eT var_floor, const bool print_mode ); // protected: arma_aligned Cube inv_fcovs; arma_aligned Row log_det_etc; arma_aligned Row log_hefts; arma_aligned Col mah_aux; arma_aligned Cube chol_fcovs; // inline void init(const gmm_full& x); inline void init(const gmm_diag& x); inline void init(const uword in_n_dim, const uword in_n_gaus); inline void init_constants(const bool calc_chol = true); inline umat internal_gen_boundaries(const uword N) const; inline eT internal_scalar_log_p(const eT* x ) const; inline eT internal_scalar_log_p(const eT* x, const uword gaus_id) const; inline Row internal_vec_log_p(const Mat& X ) const; inline Row internal_vec_log_p(const Mat& X, const uword gaus_id) const; inline eT internal_sum_log_p(const Mat& X ) const; inline eT internal_sum_log_p(const Mat& X, const uword gaus_id) const; inline eT internal_avg_log_p(const Mat& X ) const; inline eT internal_avg_log_p(const Mat& X, const uword gaus_id) const; inline uword internal_scalar_assign(const Mat& X, const gmm_dist_mode& dist_mode) const; inline void internal_vec_assign(urowvec& out, const Mat& X, const gmm_dist_mode& dist_mode) const; inline void internal_raw_hist(urowvec& hist, const Mat& X, const gmm_dist_mode& dist_mode) const; // template inline void generate_initial_means(const Mat& X, const gmm_seed_mode& seed); template inline void generate_initial_params(const Mat& X, const eT var_floor); template inline bool km_iterate(const Mat& X, const uword max_iter, const bool verbose); // inline bool em_iterate(const Mat& X, const uword max_iter, const eT var_floor, const bool verbose); inline void em_update_params(const Mat& X, const umat& boundaries, field< Mat >& t_acc_means, field< Cube >& t_acc_fcovs, field< Col >& t_acc_norm_lhoods, field< Col >& t_gaus_log_lhoods, Col& t_progress_log_lhoods, const eT var_floor); inline void em_generate_acc(const Mat& X, const uword start_index, const uword end_index, Mat& acc_means, Cube& acc_fcovs, Col& acc_norm_lhoods, Col& gaus_log_lhoods, eT& progress_log_lhood) const; inline void em_fix_params(const eT var_floor); }; } typedef gmm_priv::gmm_full gmm_full; typedef gmm_priv::gmm_full fgmm_full; //! @} RcppArmadillo/inst/include/armadillo_bits/op_sort_index_meat.hpp0000644000176200001440000001055714124060717024775 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_sort_index //! @{ template inline bool arma_sort_index_helper(Mat& out, const Proxy& P, const uword sort_type) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_elem = P.get_n_elem(); out.set_size(n_elem, 1); std::vector< arma_sort_index_packet > packet_vec(n_elem); if(Proxy::use_at == false) { for(uword i=0; i comparator; if(sort_stable == false) { std::sort( packet_vec.begin(), packet_vec.end(), comparator ); } else { std::stable_sort( packet_vec.begin(), packet_vec.end(), comparator ); } } else { // descend arma_sort_index_helper_descend comparator; if(sort_stable == false) { std::sort( packet_vec.begin(), packet_vec.end(), comparator ); } else { std::stable_sort( packet_vec.begin(), packet_vec.end(), comparator ); } } uword* out_mem = out.memptr(); for(uword i=0; i inline bool op_sort_index::apply_noalias(Mat& out, const Proxy& P, const uword sort_type) { arma_extra_debug_sigprint(); return arma_sort_index_helper(out, P, sort_type); } template inline void op_sort_index::apply(Mat& out, const mtOp& in) { arma_extra_debug_sigprint(); const Proxy P(in.m); if(P.get_n_elem() == 0) { out.set_size(0,1); return; } const uword sort_type = in.aux_uword_a; bool all_non_nan = false; if(P.is_alias(out)) { Mat out2; all_non_nan = op_sort_index::apply_noalias(out2, P, sort_type); out.steal_mem(out2); } else { all_non_nan = op_sort_index::apply_noalias(out, P, sort_type); } arma_debug_check( (all_non_nan == false), "sort_index(): detected NaN" ); } template inline bool op_stable_sort_index::apply_noalias(Mat& out, const Proxy& P, const uword sort_type) { arma_extra_debug_sigprint(); return arma_sort_index_helper(out, P, sort_type); } template inline void op_stable_sort_index::apply(Mat& out, const mtOp& in) { arma_extra_debug_sigprint(); const Proxy P(in.m); if(P.get_n_elem() == 0) { out.set_size(0,1); return; } const uword sort_type = in.aux_uword_a; bool all_non_nan = false; if(P.is_alias(out)) { Mat out2; all_non_nan = op_stable_sort_index::apply_noalias(out2, P, sort_type); out.steal_mem(out2); } else { all_non_nan = op_stable_sort_index::apply_noalias(out, P, sort_type); } arma_debug_check( (all_non_nan == false), "stable_sort_index(): detected NaN" ); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_diff_bones.hpp0000644000176200001440000000247014124060717023702 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_diff //! @{ class op_diff : public traits_op_default { public: template inline static void apply_noalias(Mat& out, const Mat& X, const uword k, const uword dim); template inline static void apply(Mat& out, const Op& in); }; class op_diff_vec : public traits_op_passthru { public: template inline static void apply(Mat& out, const Op& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/spglue_relational_bones.hpp0000644000176200001440000000427014124060717026005 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_relational //! @{ class spglue_rel_lt : public traits_glue_or { public: template inline static void apply(SpMat& out, const mtSpGlue& X); template inline static void apply_noalias(SpMat& out, const SpProxy& PA, const SpProxy& PB); }; class spglue_rel_gt : public traits_glue_or { public: template inline static void apply(SpMat& out, const mtSpGlue& X); template inline static void apply_noalias(SpMat& out, const SpProxy& PA, const SpProxy& PB); }; class spglue_rel_and : public traits_glue_or { public: template inline static void apply(SpMat& out, const mtSpGlue& X); template inline static void apply_noalias(SpMat& out, const SpProxy& PA, const SpProxy& PB); }; class spglue_rel_or : public traits_glue_or { public: template inline static void apply(SpMat& out, const mtSpGlue& X); template inline static void apply_noalias(SpMat& out, const SpProxy& PA, const SpProxy& PB); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_speye.hpp0000644000176200001440000000415714124060717022722 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_speye //! @{ //! Generate a sparse matrix with the values along the main diagonal set to one template arma_warn_unused inline obj_type speye(const uword n_rows, const uword n_cols, const typename arma_SpMat_SpCol_SpRow_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); if(is_SpCol::value) { arma_debug_check( (n_cols != 1), "speye(): incompatible size" ); } else if(is_SpRow::value) { arma_debug_check( (n_rows != 1), "speye(): incompatible size" ); } obj_type out; out.eye(n_rows, n_cols); return out; } template arma_warn_unused inline obj_type speye(const SizeMat& s, const typename arma_SpMat_SpCol_SpRow_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return speye(s.n_rows, s.n_cols); } // Convenience shortcut method (no template parameter necessary) arma_warn_unused inline sp_mat speye(const uword n_rows, const uword n_cols) { arma_extra_debug_sigprint(); sp_mat out; out.eye(n_rows, n_cols); return out; } arma_warn_unused inline sp_mat speye(const SizeMat& s) { arma_extra_debug_sigprint(); sp_mat out; out.eye(s.n_rows, s.n_cols); return out; } //! @} RcppArmadillo/inst/include/armadillo_bits/operator_div.hpp0000644000176200001440000002055314124060717023605 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup operator_div //! @{ //! Base / scalar template arma_inline typename enable_if2< is_arma_type::value, const eOp< T1, eop_scalar_div_post> >::result operator/ ( const T1& X, const typename T1::elem_type k ) { arma_extra_debug_sigprint(); return eOp(X, k); } //! scalar / Base template arma_inline typename enable_if2< is_arma_type::value, const eOp< T1, eop_scalar_div_pre> >::result operator/ ( const typename T1::elem_type k, const T1& X ) { arma_extra_debug_sigprint(); return eOp(X, k); } //! complex scalar / non-complex Base template arma_inline typename enable_if2 < (is_arma_type::value && is_cx::no), const mtOp, T1, op_cx_scalar_div_pre> >::result operator/ ( const std::complex& k, const T1& X ) { arma_extra_debug_sigprint(); return mtOp, T1, op_cx_scalar_div_pre>('j', X, k); } //! non-complex Base / complex scalar template arma_inline typename enable_if2 < (is_arma_type::value && is_cx::no), const mtOp, T1, op_cx_scalar_div_post> >::result operator/ ( const T1& X, const std::complex& k ) { arma_extra_debug_sigprint(); return mtOp, T1, op_cx_scalar_div_post>('j', X, k); } //! element-wise division of Base objects with same element type template arma_inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && is_same_type::value), const eGlue >::result operator/ ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); return eGlue(X, Y); } //! element-wise division of Base objects with different element types template inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && (is_same_type::no)), const mtGlue::result, T1, T2, glue_mixed_div> >::result operator/ ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); return mtGlue( X, Y ); } //! element-wise division of sparse matrix by scalar template inline typename enable_if2< is_arma_sparse_type::value, SpMat >::result operator/ ( const T1& X, const typename T1::elem_type y ) { arma_extra_debug_sigprint(); SpMat result(X); result /= y; return result; } //! element-wise division of one sparse and one dense object template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_type::value && is_same_type::value), SpMat >::result operator/ ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const SpProxy pa(x); const Proxy pb(y); const uword n_rows = pa.get_n_rows(); const uword n_cols = pa.get_n_cols(); arma_debug_assert_same_size(n_rows, n_cols, pb.get_n_rows(), pb.get_n_cols(), "element-wise division"); uword new_n_nonzero = 0; for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { const eT val = pa.at(row,col) / pb.at(row, col); if(val != eT(0)) { ++new_n_nonzero; } } SpMat result(arma_reserve_indicator(), n_rows, n_cols, new_n_nonzero); uword cur_pos = 0; for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { const eT val = pa.at(row,col) / pb.at(row, col); if(val != eT(0)) { access::rw(result.values[cur_pos]) = val; access::rw(result.row_indices[cur_pos]) = row; ++access::rw(result.col_ptrs[col + 1]); ++cur_pos; } } // Fix column pointers for(uword col = 1; col <= result.n_cols; ++col) { access::rw(result.col_ptrs[col]) += result.col_ptrs[col - 1]; } return result; } //! optimization: element-wise division of sparse / (sparse +/- scalar) template inline typename enable_if2 < ( is_arma_sparse_type::value && is_arma_sparse_type::value && is_same_type::yes && (is_same_type::value || is_same_type::value || is_same_type::value) ), SpMat >::result operator/ ( const T1& x, const SpToDOp& y ) { arma_extra_debug_sigprint(); SpMat out; op_type::apply_inside_div(out, x, y); return out; } //! element-wise division of one dense and one sparse object template inline typename enable_if2 < (is_arma_type::value && is_arma_sparse_type::value && is_same_type::value), Mat >::result operator/ ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy pa(x); const SpProxy pb(y); const uword n_rows = pa.get_n_rows(); const uword n_cols = pa.get_n_cols(); arma_debug_assert_same_size(n_rows, n_cols, pb.get_n_rows(), pb.get_n_cols(), "element-wise division"); Mat result(n_rows, n_cols, arma_nozeros_indicator()); for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { result.at(row, col) = pa.at(row, col) / pb.at(row, col); } return result; } template arma_inline Mat operator/ ( const subview_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); return subview_each1_aux::operator_div(X, Y.get_ref()); } template arma_inline Mat operator/ ( const Base& X, const subview_each1& Y ) { arma_extra_debug_sigprint(); return subview_each1_aux::operator_div(X.get_ref(), Y); } template arma_inline Mat operator/ ( const subview_each2& X, const Base& Y ) { arma_extra_debug_sigprint(); return subview_each2_aux::operator_div(X, Y.get_ref()); } template arma_inline Mat operator/ ( const Base& X, const subview_each2& Y ) { arma_extra_debug_sigprint(); return subview_each2_aux::operator_div(X.get_ref(), Y); } //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_SparseGenMatProd_meat.hpp0000644000176200001440000000256014124060717026646 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { template inline SparseGenMatProd::SparseGenMatProd(const SpMat& mat_obj) : op_mat(mat_obj) , n_rows(mat_obj.n_rows) , n_cols(mat_obj.n_cols) { arma_extra_debug_sigprint(); } // Perform the matrix-vector multiplication operation \f$y=Ax\f$. // y_out = A * x_in template inline void SparseGenMatProd::perform_op(eT* x_in, eT* y_out) const { arma_extra_debug_sigprint(); const Col x(x_in , n_cols, false, true); Col y(y_out, n_rows, false, true); y = op_mat * x; } } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/typedef_elem.hpp0000644000176200001440000001137214124060717023551 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup typedef_elem //! @{ #if (defined(ARMA_U8_TYPE) && defined(ARMA_S8_TYPE)) typedef ARMA_U8_TYPE u8; typedef ARMA_S8_TYPE s8; #else #if UCHAR_MAX >= 0xff typedef unsigned char u8; typedef char s8; #elif defined(UINT8_MAX) typedef uint8_t u8; typedef int8_t s8; #else #error "don't know how to typedef 'u8' on this system" #endif #endif // NOTE: // "char" is not guaranteed to be the same as "signed char" // https://en.wikipedia.org/wiki/C_data_types #if USHRT_MAX >= 0xffff typedef unsigned short u16; typedef short s16; #elif defined(UINT16_MAX) typedef uint16_t u16; typedef int16_t s16; #else #error "don't know how to typedef 'u16' on this system" #endif #if UINT_MAX >= 0xffffffff typedef unsigned int u32; typedef int s32; #elif defined(UINT32_MAX) typedef uint32_t u32; typedef int32_t s32; #else #error "don't know how to typedef 'u32' on this system" #endif #if ULLONG_MAX >= 0xffffffffffffffff typedef unsigned long long u64; typedef long long s64; #elif defined(UINT64_MAX) typedef uint64_t u64; typedef int64_t s64; #else #error "don't know how to typedef 'u64' on this system" #endif // for compatibility with earlier versions of Armadillo typedef unsigned long ulng_t; typedef long slng_t; #if defined(ARMA_64BIT_WORD) typedef u64 uword; typedef s64 sword; typedef u32 uhword; typedef s32 shword; #define ARMA_MAX_UWORD 0xffffffffffffffff #define ARMA_MAX_UHWORD 0xffffffff #else typedef u32 uword; typedef s32 sword; typedef u16 uhword; typedef s16 shword; #define ARMA_MAX_UWORD 0xffffffff #define ARMA_MAX_UHWORD 0xffff #endif typedef std::complex cx_float; typedef std::complex cx_double; typedef void* void_ptr; // #if defined(ARMA_BLAS_LONG_LONG) typedef long long blas_int; #define ARMA_MAX_BLAS_INT 0x7fffffffffffffffULL #elif defined(ARMA_BLAS_LONG) typedef long blas_int; #define ARMA_MAX_BLAS_INT 0x7fffffffffffffffUL #else typedef int blas_int; #define ARMA_MAX_BLAS_INT 0x7fffffffU #endif // #ifdef ARMA_USE_MKL_TYPES // for compatibility with MKL typedef MKL_Complex8 blas_cxf; typedef MKL_Complex16 blas_cxd; #else // standard BLAS and LAPACK prototypes use "void*" pointers for complex arrays typedef void blas_cxf; typedef void blas_cxd; #endif // // NOTE: blas_len is the fortran type for "hidden" arguments that specify the length of character arguments; // NOTE: it varies across compilers, compiler versions and systems (eg. 32 bit vs 64 bit); // NOTE: the default setting of "size_t" is an educated guess. // NOTE: --- // NOTE: for gcc / gfortran: https://gcc.gnu.org/onlinedocs/gfortran/Argument-passing-conventions.html // NOTE: gcc 7 and earlier: int // NOTE: gcc 8 and 9: size_t // NOTE: --- // NOTE: for ifort (intel fortran compiler): // NOTE: "Intel Fortran Compiler User and Reference Guides", Document Number: 304970-006US, 2009, p. 301 // NOTE: http://www.complexfluids.ethz.ch/MK/ifort.pdf // NOTE: the type is unsigned 4-byte integer on 32 bit systems // NOTE: the type is unsigned 8-byte integer on 64 bit systems // NOTE: --- // NOTE: for NAG fortran: https://www.nag.co.uk/nagware/np/r62_doc/manual/compiler_11_1.html#AUTOTOC_11_1 // NOTE: Chrlen = usually int, or long long on 64-bit Windows // NOTE: --- // TODO: flang: https://github.com/flang-compiler/flang/wiki // TODO: other compilers: http://fortranwiki.org/fortran/show/Compilers #if !defined(ARMA_FORTRAN_CHARLEN_TYPE) #if defined(__GNUC__) && !defined(__clang__) #if (__GNUC__ <= 7) #define ARMA_FORTRAN_CHARLEN_TYPE int #else #define ARMA_FORTRAN_CHARLEN_TYPE size_t #endif #else // TODO: determine the type for other compilers #define ARMA_FORTRAN_CHARLEN_TYPE size_t #endif #endif typedef ARMA_FORTRAN_CHARLEN_TYPE blas_len; //! @} RcppArmadillo/inst/include/armadillo_bits/glue_relational_meat.hpp0000644000176200001440000001760214124060717025265 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_relational //! @{ #undef operator_rel #undef operator_str #undef arma_applier_mat #undef arma_applier_cube #define arma_applier_mat(operator_rel, operator_str) \ {\ const Proxy P1(X.A);\ const Proxy P2(X.B);\ \ arma_debug_assert_same_size(P1, P2, operator_str);\ \ const bool bad_alias = (Proxy::has_subview && P1.is_alias(out)) || (Proxy::has_subview && P2.is_alias(out));\ \ if(bad_alias == false)\ {\ \ const uword n_rows = P1.get_n_rows();\ const uword n_cols = P1.get_n_cols();\ \ out.set_size(n_rows, n_cols);\ \ uword* out_mem = out.memptr();\ \ const bool use_at = (Proxy::use_at || Proxy::use_at);\ \ if(use_at == false)\ {\ typename Proxy::ea_type A = P1.get_ea();\ typename Proxy::ea_type B = P2.get_ea();\ \ const uword n_elem = out.n_elem;\ \ for(uword i=0; i::stored_type> tmp1(P1.Q, P1.is_alias(out));\ const unwrap_check::stored_type> tmp2(P2.Q, P2.is_alias(out));\ \ out = (tmp1.M) operator_rel (tmp2.M);\ }\ } #define arma_applier_cube(operator_rel, operator_str) \ {\ const ProxyCube P1(X.A);\ const ProxyCube P2(X.B);\ \ arma_debug_assert_same_size(P1, P2, operator_str);\ \ const bool bad_alias = (ProxyCube::has_subview && P1.is_alias(out)) || (ProxyCube::has_subview && P2.is_alias(out));\ \ if(bad_alias == false)\ {\ \ const uword n_rows = P1.get_n_rows();\ const uword n_cols = P1.get_n_cols();\ const uword n_slices = P1.get_n_slices();\ \ out.set_size(n_rows, n_cols, n_slices);\ \ uword* out_mem = out.memptr();\ \ const bool use_at = (ProxyCube::use_at || ProxyCube::use_at);\ \ if(use_at == false)\ {\ typename ProxyCube::ea_type A = P1.get_ea();\ typename ProxyCube::ea_type B = P2.get_ea();\ \ const uword n_elem = out.n_elem;\ \ for(uword i=0; i::stored_type> tmp1(P1.Q);\ const unwrap_cube::stored_type> tmp2(P2.Q);\ \ out = (tmp1.M) operator_rel (tmp2.M);\ }\ } template inline void glue_rel_lt::apply ( Mat & out, const mtGlue& X ) { arma_extra_debug_sigprint(); arma_applier_mat(<, "operator<"); } template inline void glue_rel_gt::apply ( Mat & out, const mtGlue& X ) { arma_extra_debug_sigprint(); arma_applier_mat(>, "operator>"); } template inline void glue_rel_lteq::apply ( Mat & out, const mtGlue& X ) { arma_extra_debug_sigprint(); arma_applier_mat(<=, "operator<="); } template inline void glue_rel_gteq::apply ( Mat & out, const mtGlue& X ) { arma_extra_debug_sigprint(); arma_applier_mat(>=, "operator>="); } template inline void glue_rel_eq::apply ( Mat & out, const mtGlue& X ) { arma_extra_debug_sigprint(); arma_applier_mat(==, "operator=="); } template inline void glue_rel_noteq::apply ( Mat & out, const mtGlue& X ) { arma_extra_debug_sigprint(); arma_applier_mat(!=, "operator!="); } template inline void glue_rel_and::apply ( Mat & out, const mtGlue& X ) { arma_extra_debug_sigprint(); arma_applier_mat(&&, "operator&&"); } template inline void glue_rel_or::apply ( Mat & out, const mtGlue& X ) { arma_extra_debug_sigprint(); arma_applier_mat(||, "operator||"); } // // // template inline void glue_rel_lt::apply ( Cube & out, const mtGlueCube& X ) { arma_extra_debug_sigprint(); arma_applier_cube(<, "operator<"); } template inline void glue_rel_gt::apply ( Cube & out, const mtGlueCube& X ) { arma_extra_debug_sigprint(); arma_applier_cube(>, "operator>"); } template inline void glue_rel_lteq::apply ( Cube & out, const mtGlueCube& X ) { arma_extra_debug_sigprint(); arma_applier_cube(<=, "operator<="); } template inline void glue_rel_gteq::apply ( Cube & out, const mtGlueCube& X ) { arma_extra_debug_sigprint(); arma_applier_cube(>=, "operator>="); } template inline void glue_rel_eq::apply ( Cube & out, const mtGlueCube& X ) { arma_extra_debug_sigprint(); arma_applier_cube(==, "operator=="); } template inline void glue_rel_noteq::apply ( Cube & out, const mtGlueCube& X ) { arma_extra_debug_sigprint(); arma_applier_cube(!=, "operator!="); } template inline void glue_rel_and::apply ( Cube & out, const mtGlueCube& X ) { arma_extra_debug_sigprint(); arma_applier_cube(&&, "operator&&"); } template inline void glue_rel_or::apply ( Cube & out, const mtGlueCube& X ) { arma_extra_debug_sigprint(); arma_applier_cube(||, "operator||"); } #undef arma_applier_mat #undef arma_applier_cube //! @} RcppArmadillo/inst/include/armadillo_bits/fn_var.hpp0000644000176200001440000000556614147163451022376 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_var //! @{ template arma_warn_unused inline typename enable_if2 < is_arma_type::value && resolves_to_vector::yes, typename T1::pod_type >::result var(const T1& X, const uword norm_type = 0) { arma_extra_debug_sigprint(); return op_var::var_vec(X, norm_type); } template arma_warn_unused inline typename enable_if2 < is_arma_type::value && resolves_to_vector::no, const mtOp >::result var(const T1& X, const uword norm_type = 0) { arma_extra_debug_sigprint(); return mtOp(X, norm_type, 0); } template arma_warn_unused inline typename enable_if2 < is_arma_type::value, const mtOp >::result var(const T1& X, const uword norm_type, const uword dim) { arma_extra_debug_sigprint(); return mtOp(X, norm_type, dim); } template arma_warn_unused inline typename arma_scalar_only::result var(const T&) { return T(0); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value && resolves_to_sparse_vector::yes, typename T1::pod_type >::result var(const T1& X, const uword norm_type = 0) { arma_extra_debug_sigprint(); return spop_var::var_vec(X, norm_type); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value && resolves_to_sparse_vector::no, const mtSpOp >::result var(const T1& X, const uword norm_type = 0) { arma_extra_debug_sigprint(); return mtSpOp(X, norm_type, 0); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value, const mtSpOp >::result var(const T1& X, const uword norm_type, const uword dim) { arma_extra_debug_sigprint(); return mtSpOp(X, norm_type, dim); } //! @} RcppArmadillo/inst/include/armadillo_bits/SpGlue_meat.hpp0000644000176200001440000000314514124060717023313 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpGlue //! @{ template inline SpGlue::SpGlue(const T1& in_A, const T2& in_B) : A(in_A) , B(in_B) { arma_extra_debug_sigprint(); } template inline SpGlue::SpGlue(const T1& in_A, const T2& in_B, const typename T1::elem_type in_aux) : A(in_A) , B(in_B) , aux(in_aux) { arma_extra_debug_sigprint(); } template inline SpGlue::~SpGlue() { arma_extra_debug_sigprint(); } template arma_inline bool SpGlue::is_alias(const SpMat& X) const { return (A.is_alias(X) || B.is_alias(X)); } //! @} RcppArmadillo/inst/include/armadillo_bits/spglue_schur_meat.hpp0000644000176200001440000002261514124060717024622 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_schur //! @{ template arma_hot inline void spglue_schur::apply(SpMat& out, const SpGlue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const SpProxy pa(X.A); const SpProxy pb(X.B); const bool is_alias = pa.is_alias(out) || pb.is_alias(out); if(is_alias == false) { spglue_schur::apply_noalias(out, pa, pb); } else { SpMat tmp; spglue_schur::apply_noalias(tmp, pa, pb); out.steal_mem(tmp); } } template arma_hot inline void spglue_schur::apply_noalias(SpMat& out, const SpProxy& pa, const SpProxy& pb) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(pa.get_n_rows(), pa.get_n_cols(), pb.get_n_rows(), pb.get_n_cols(), "element-wise multiplication"); if( (pa.get_n_nonzero() == 0) || (pb.get_n_nonzero() == 0) ) { out.zeros(pa.get_n_rows(), pa.get_n_cols()); return; } const uword max_n_nonzero = (std::min)(pa.get_n_nonzero(), pb.get_n_nonzero()); // Resize memory to upper bound out.reserve(pa.get_n_rows(), pa.get_n_cols(), max_n_nonzero); // Now iterate across both matrices. typename SpProxy::const_iterator_type x_it = pa.begin(); typename SpProxy::const_iterator_type x_end = pa.end(); typename SpProxy::const_iterator_type y_it = pb.begin(); typename SpProxy::const_iterator_type y_end = pb.end(); uword count = 0; while( (x_it != x_end) || (y_it != y_end) ) { const uword x_it_row = x_it.row(); const uword x_it_col = x_it.col(); const uword y_it_row = y_it.row(); const uword y_it_col = y_it.col(); if(x_it == y_it) { const eT out_val = (*x_it) * (*y_it); if(out_val != eT(0)) { access::rw(out.values[count]) = out_val; access::rw(out.row_indices[count]) = x_it_row; access::rw(out.col_ptrs[x_it_col + 1])++; ++count; } ++x_it; ++y_it; } else { if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end { ++x_it; } else { ++y_it; } } arma_check( (count > max_n_nonzero), "internal error: spglue_schur::apply_noalias(): count > max_n_nonzero" ); } const uword out_n_cols = out.n_cols; uword* col_ptrs = access::rwp(out.col_ptrs); // Fix column pointers to be cumulative. for(uword c = 1; c <= out_n_cols; ++c) { col_ptrs[c] += col_ptrs[c - 1]; } if(count < max_n_nonzero) { if(count <= (max_n_nonzero/2)) { out.mem_resize(count); } else { // quick resize without reallocating memory and copying data access::rw( out.n_nonzero) = count; access::rw( out.values[count]) = eT(0); access::rw(out.row_indices[count]) = uword(0); } } } template arma_hot inline void spglue_schur::apply_noalias(SpMat& out, const SpMat& A, const SpMat& B) { arma_extra_debug_sigprint(); const SpProxy< SpMat > pa(A); const SpProxy< SpMat > pb(B); spglue_schur::apply_noalias(out, pa, pb); } // // // template inline void spglue_schur_misc::dense_schur_sparse(SpMat& out, const T1& x, const T2& y) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy pa(x); const SpProxy pb(y); arma_debug_assert_same_size(pa.get_n_rows(), pa.get_n_cols(), pb.get_n_rows(), pb.get_n_cols(), "element-wise multiplication"); const uword max_n_nonzero = pb.get_n_nonzero(); // Resize memory to upper bound. out.reserve(pa.get_n_rows(), pa.get_n_cols(), max_n_nonzero); uword count = 0; typename SpProxy::const_iterator_type it = pb.begin(); typename SpProxy::const_iterator_type it_end = pb.end(); while(it != it_end) { const uword it_row = it.row(); const uword it_col = it.col(); const eT val = (*it) * pa.at(it_row, it_col); if(val != eT(0)) { access::rw( out.values[count]) = val; access::rw( out.row_indices[count]) = it_row; access::rw(out.col_ptrs[it_col + 1])++; ++count; } ++it; arma_check( (count > max_n_nonzero), "internal error: spglue_schur_misc::dense_schur_sparse(): count > max_n_nonzero" ); } // Fix column pointers. for(uword c = 1; c <= out.n_cols; ++c) { access::rw(out.col_ptrs[c]) += out.col_ptrs[c - 1]; } if(count < max_n_nonzero) { if(count <= (max_n_nonzero/2)) { out.mem_resize(count); } else { // quick resize without reallocating memory and copying data access::rw( out.n_nonzero) = count; access::rw( out.values[count]) = eT(0); access::rw(out.row_indices[count]) = uword(0); } } } // template inline void spglue_schur_mixed::apply(SpMat::eT>& out, const mtSpGlue::eT, T1, T2, spglue_schur_mixed>& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); if( (is_same_type::no) && (is_same_type::yes) ) { // upgrade T1 const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; SpMat AA(arma_layout_indicator(), A); for(uword i=0; i < A.n_nonzero; ++i) { access::rw(AA.values[i]) = out_eT(A.values[i]); } const SpMat& BB = reinterpret_cast< const SpMat& >(B); out = AA % BB; } else if( (is_same_type::yes) && (is_same_type::no) ) { // upgrade T2 const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; const SpMat& AA = reinterpret_cast< const SpMat& >(A); SpMat BB(arma_layout_indicator(), B); for(uword i=0; i < B.n_nonzero; ++i) { access::rw(BB.values[i]) = out_eT(B.values[i]); } out = AA % BB; } else { // upgrade T1 and T2 const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; SpMat AA(arma_layout_indicator(), A); SpMat BB(arma_layout_indicator(), B); for(uword i=0; i < A.n_nonzero; ++i) { access::rw(AA.values[i]) = out_eT(A.values[i]); } for(uword i=0; i < B.n_nonzero; ++i) { access::rw(BB.values[i]) = out_eT(B.values[i]); } out = AA % BB; } } template inline void spglue_schur_mixed::dense_schur_sparse(SpMat< typename promote_type::result>& out, const T1& X, const T2& Y) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); const Proxy pa(X); const SpProxy pb(Y); arma_debug_assert_same_size(pa.get_n_rows(), pa.get_n_cols(), pb.get_n_rows(), pb.get_n_cols(), "element-wise multiplication"); // count new size uword new_n_nonzero = 0; typename SpProxy::const_iterator_type it = pb.begin(); typename SpProxy::const_iterator_type it_end = pb.end(); while(it != it_end) { if( (out_eT(*it) * out_eT(pa.at(it.row(), it.col()))) != out_eT(0) ) { ++new_n_nonzero; } ++it; } // Resize memory accordingly. out.reserve(pa.get_n_rows(), pa.get_n_cols(), new_n_nonzero); uword count = 0; typename SpProxy::const_iterator_type it2 = pb.begin(); while(it2 != it_end) { const uword it2_row = it2.row(); const uword it2_col = it2.col(); const out_eT val = out_eT(*it2) * out_eT(pa.at(it2_row, it2_col)); if(val != out_eT(0)) { access::rw( out.values[count]) = val; access::rw( out.row_indices[count]) = it2_row; access::rw(out.col_ptrs[it2_col + 1])++; ++count; } ++it2; } // Fix column pointers. for(uword c = 1; c <= out.n_cols; ++c) { access::rw(out.col_ptrs[c]) += out.col_ptrs[c - 1]; } } //! @} RcppArmadillo/inst/include/armadillo_bits/op_cx_scalar_bones.hpp0000644000176200001440000000777614124060717024747 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_cx_scalar //! @{ class op_cx_scalar_times : public traits_op_passthru { public: template inline static void apply ( Mat< typename std::complex >& out, const mtOp, T1, op_cx_scalar_times>& X ); template inline static void apply ( Cube< typename std::complex >& out, const mtOpCube, T1, op_cx_scalar_times>& X ); }; class op_cx_scalar_plus : public traits_op_passthru { public: template inline static void apply ( Mat< typename std::complex >& out, const mtOp, T1, op_cx_scalar_plus>& X ); template inline static void apply ( Cube< typename std::complex >& out, const mtOpCube, T1, op_cx_scalar_plus>& X ); }; class op_cx_scalar_minus_pre : public traits_op_passthru { public: template inline static void apply ( Mat< typename std::complex >& out, const mtOp, T1, op_cx_scalar_minus_pre>& X ); template inline static void apply ( Cube< typename std::complex >& out, const mtOpCube, T1, op_cx_scalar_minus_pre>& X ); }; class op_cx_scalar_minus_post : public traits_op_passthru { public: template inline static void apply ( Mat< typename std::complex >& out, const mtOp, T1, op_cx_scalar_minus_post>& X ); template inline static void apply ( Cube< typename std::complex >& out, const mtOpCube, T1, op_cx_scalar_minus_post>& X ); }; class op_cx_scalar_div_pre : public traits_op_passthru { public: template inline static void apply ( Mat< typename std::complex >& out, const mtOp, T1, op_cx_scalar_div_pre>& X ); template inline static void apply ( Cube< typename std::complex >& out, const mtOpCube, T1, op_cx_scalar_div_pre>& X ); }; class op_cx_scalar_div_post : public traits_op_passthru { public: template inline static void apply ( Mat< typename std::complex >& out, const mtOp, T1, op_cx_scalar_div_post>& X ); template inline static void apply ( Cube< typename std::complex >& out, const mtOpCube, T1, op_cx_scalar_div_post>& X ); }; //! @} RcppArmadillo/inst/include/armadillo_bits/glue_mixed_bones.hpp0000644000176200001440000000600214124060717024411 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_mixed //! @{ class glue_mixed_times { public: template struct traits { static constexpr bool is_row = T1::is_row; static constexpr bool is_col = T2::is_col; static constexpr bool is_xvec = false; }; template inline static void apply(Mat::eT>& out, const mtGlue::eT, T1, T2, glue_mixed_times>& X); }; class glue_mixed_plus : public traits_glue_or { public: template inline static void apply(Mat::eT>& out, const mtGlue::eT, T1, T2, glue_mixed_plus>& X); template inline static void apply(Cube::eT>& out, const mtGlueCube::eT, T1, T2, glue_mixed_plus>& X); }; class glue_mixed_minus : public traits_glue_or { public: template inline static void apply(Mat::eT>& out, const mtGlue::eT, T1, T2, glue_mixed_minus>& X); template inline static void apply(Cube::eT>& out, const mtGlueCube::eT, T1, T2, glue_mixed_minus>& X); }; class glue_mixed_div : public traits_glue_or { public: template inline static void apply(Mat::eT>& out, const mtGlue::eT, T1, T2, glue_mixed_div>& X); template inline static void apply(Cube::eT>& out, const mtGlueCube::eT, T1, T2, glue_mixed_div>& X); }; class glue_mixed_schur : public traits_glue_or { public: template inline static void apply(Mat::eT>& out, const mtGlue::eT, T1, T2, glue_mixed_schur>& X); template inline static void apply(Cube::eT>& out, const mtGlueCube::eT, T1, T2, glue_mixed_schur>& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/spop_max_meat.hpp0000644000176200001440000003664114124060717023751 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_max //! @{ template inline void spop_max::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "max(): parameter 'dim' must be 0 or 1" ); const SpProxy p(in.m); const uword p_n_rows = p.get_n_rows(); const uword p_n_cols = p.get_n_cols(); if( (p_n_rows == 0) || (p_n_cols == 0) || (p.get_n_nonzero() == 0) ) { if(dim == 0) { out.zeros((p_n_rows > 0) ? 1 : 0, p_n_cols); } if(dim == 1) { out.zeros(p_n_rows, (p_n_cols > 0) ? 1 : 0); } return; } spop_max::apply_proxy(out, p, dim); } template inline void spop_max::apply_proxy ( SpMat& out, const SpProxy& p, const uword dim, const typename arma_not_cx::result* junk ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typename SpProxy::const_iterator_type it = p.begin(); typename SpProxy::const_iterator_type it_end = p.end(); const uword p_n_cols = p.get_n_cols(); const uword p_n_rows = p.get_n_rows(); if(dim == 0) // find the maximum in each column { Row value(p_n_cols, arma_zeros_indicator()); urowvec count(p_n_cols, arma_zeros_indicator()); while(it != it_end) { const uword col = it.col(); value[col] = (count[col] == 0) ? (*it) : (std::max)(value[col], (*it)); count[col]++; ++it; } for(uword col=0; col value(p_n_rows, arma_zeros_indicator()); ucolvec count(p_n_rows, arma_zeros_indicator()); while(it != it_end) { const uword row = it.row(); value[row] = (count[row] == 0) ? (*it) : (std::max)(value[row], (*it)); count[row]++; ++it; } for(uword row=0; row inline typename T1::elem_type spop_max::vector_max ( const T1& x, const typename arma_not_cx::result* junk ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; const SpProxy p(x); if(p.get_n_elem() == 0) { arma_debug_check(true, "max(): object has no elements"); return Datum::nan; } if(p.get_n_nonzero() == 0) { return eT(0); } if(SpProxy::use_iterator == false) { // direct access of values if(p.get_n_nonzero() == p.get_n_elem()) { return op_max::direct_max(p.get_values(), p.get_n_nonzero()); } else { return (std::max)(eT(0), op_max::direct_max(p.get_values(), p.get_n_nonzero())); } } else { // use iterator typename SpProxy::const_iterator_type it = p.begin(); typename SpProxy::const_iterator_type it_end = p.end(); eT result = (*it); ++it; while(it != it_end) { if((*it) > result) { result = (*it); } ++it; } if(p.get_n_nonzero() == p.get_n_elem()) { return result; } else { return (std::max)(eT(0), result); } } } template inline typename arma_not_cx::result spop_max::max(const SpBase& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const SpProxy P(X.get_ref()); const uword n_elem = P.get_n_elem(); const uword n_nonzero = P.get_n_nonzero(); if(n_elem == 0) { arma_debug_check(true, "max(): object has no elements"); return Datum::nan; } eT max_val = priv::most_neg(); if(SpProxy::use_iterator) { // We have to iterate over the elements. typedef typename SpProxy::const_iterator_type it_type; it_type it = P.begin(); it_type it_end = P.end(); while(it != it_end) { if((*it) > max_val) { max_val = *it; } ++it; } } else { // We can do direct access of the values, row_indices, and col_ptrs. // We don't need the location of the max value, so we can just call out to // other functions... max_val = op_max::direct_max(P.get_values(), n_nonzero); } if(n_elem == n_nonzero) { return max_val; } else { return (std::max)(eT(0), max_val); } } template inline typename arma_not_cx::result spop_max::max_with_index(const SpProxy& P, uword& index_of_max_val) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_elem = P.get_n_elem(); const uword n_nonzero = P.get_n_nonzero(); const uword n_rows = P.get_n_rows(); if(n_elem == 0) { arma_debug_check(true, "max(): object has no elements"); index_of_max_val = uword(0); return Datum::nan; } eT max_val = priv::most_neg(); if(SpProxy::use_iterator) { // We have to iterate over the elements. typedef typename SpProxy::const_iterator_type it_type; it_type it = P.begin(); it_type it_end = P.end(); while(it != it_end) { if((*it) > max_val) { max_val = *it; index_of_max_val = it.row() + it.col() * n_rows; } ++it; } } else { // We can do direct access. max_val = op_max::direct_max(P.get_values(), n_nonzero, index_of_max_val); // Convert to actual position in matrix. const uword row = P.get_row_indices()[index_of_max_val]; uword col = 0; while(P.get_col_ptrs()[++col] <= index_of_max_val) { } index_of_max_val = (col - 1) * n_rows + row; } if(n_elem != n_nonzero) { max_val = (std::max)(eT(0), max_val); // If the max_val is a nonzero element, we need its actual position in the matrix. if(max_val == eT(0)) { // Find first zero element. uword last_row = 0; uword last_col = 0; typedef typename SpProxy::const_iterator_type it_type; it_type it = P.begin(); it_type it_end = P.end(); while(it != it_end) { // Have we moved more than one position from the last place? if((it.col() == last_col) && (it.row() - last_row > 1)) { index_of_max_val = it.col() * n_rows + last_row + 1; break; } else if((it.col() >= last_col + 1) && (last_row < n_rows - 1)) { index_of_max_val = last_col * n_rows + last_row + 1; break; } else if((it.col() == last_col + 1) && (it.row() > 0)) { index_of_max_val = it.col() * n_rows; break; } else if(it.col() > last_col + 1) { index_of_max_val = (last_col + 1) * n_rows; break; } last_row = it.row(); last_col = it.col(); ++it; } } } return max_val; } template inline void spop_max::apply_proxy ( SpMat& out, const SpProxy& p, const uword dim, const typename arma_cx_only::result* junk ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; typename SpProxy::const_iterator_type it = p.begin(); typename SpProxy::const_iterator_type it_end = p.end(); const uword p_n_cols = p.get_n_cols(); const uword p_n_rows = p.get_n_rows(); if(dim == 0) // find the maximum in each column { Row rawval(p_n_cols, arma_zeros_indicator()); Row< T> absval(p_n_cols, arma_zeros_indicator()); while(it != it_end) { const uword col = it.col(); const eT& v = (*it); const T a = std::abs(v); if(a > absval[col]) { absval[col] = a; rawval[col] = v; } ++it; } out = rawval; } else if(dim == 1) // find the maximum in each row { Col rawval(p_n_rows, arma_zeros_indicator()); Col< T> absval(p_n_rows, arma_zeros_indicator()); while(it != it_end) { const uword row = it.row(); const eT& v = (*it); const T a = std::abs(v); if(a > absval[row]) { absval[row] = a; rawval[row] = v; } ++it; } out = rawval; } } template inline typename T1::elem_type spop_max::vector_max ( const T1& x, const typename arma_cx_only::result* junk ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; const SpProxy p(x); if(p.get_n_elem() == 0) { arma_debug_check(true, "max(): object has no elements"); return Datum::nan; } if(p.get_n_nonzero() == 0) { return eT(0); } if(SpProxy::use_iterator == false) { // direct access of values if(p.get_n_nonzero() == p.get_n_elem()) { return op_max::direct_max(p.get_values(), p.get_n_nonzero()); } else { const eT val1 = eT(0); const eT val2 = op_max::direct_max(p.get_values(), p.get_n_nonzero()); return ( std::abs(val1) >= std::abs(val2) ) ? val1 : val2; } } else { // use iterator typename SpProxy::const_iterator_type it = p.begin(); typename SpProxy::const_iterator_type it_end = p.end(); eT best_val_orig = *it; T best_val_abs = std::abs(best_val_orig); ++it; while(it != it_end) { eT val_orig = *it; T val_abs = std::abs(val_orig); if(val_abs > best_val_abs) { best_val_abs = val_abs; best_val_orig = val_orig; } ++it; } if(p.get_n_nonzero() == p.get_n_elem()) { return best_val_orig; } else { const eT val1 = eT(0); return ( std::abs(val1) >= best_val_abs ) ? val1 : best_val_orig; } } } template inline typename arma_cx_only::result spop_max::max(const SpBase& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; const SpProxy P(X.get_ref()); const uword n_elem = P.get_n_elem(); const uword n_nonzero = P.get_n_nonzero(); if(n_elem == 0) { arma_debug_check(true, "max(): object has no elements"); return Datum::nan; } T max_val = priv::most_neg(); eT ret_val; if(SpProxy::use_iterator) { // We have to iterate over the elements. typedef typename SpProxy::const_iterator_type it_type; it_type it = P.begin(); it_type it_end = P.end(); while(it != it_end) { const T tmp_val = std::abs(*it); if(tmp_val > max_val) { max_val = tmp_val; ret_val = *it; } ++it; } } else { // We can do direct access of the values, row_indices, and col_ptrs. // We don't need the location of the max value, so we can just call out to // other functions... ret_val = op_max::direct_max(P.get_values(), n_nonzero); max_val = std::abs(ret_val); } if(n_elem == n_nonzero) { return max_val; } else { return (T(0) > max_val) ? eT(0) : ret_val; } } template inline typename arma_cx_only::result spop_max::max_with_index(const SpProxy& P, uword& index_of_max_val) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; const uword n_elem = P.get_n_elem(); const uword n_nonzero = P.get_n_nonzero(); const uword n_rows = P.get_n_rows(); if(n_elem == 0) { arma_debug_check(true, "max(): object has no elements"); index_of_max_val = uword(0); return Datum::nan; } T max_val = priv::most_neg(); if(SpProxy::use_iterator) { // We have to iterate over the elements. typedef typename SpProxy::const_iterator_type it_type; it_type it = P.begin(); it_type it_end = P.end(); while(it != it_end) { const T tmp_val = std::abs(*it); if(tmp_val > max_val) { max_val = tmp_val; index_of_max_val = it.row() + it.col() * n_rows; } ++it; } } else { // We can do direct access. max_val = std::abs(op_max::direct_max(P.get_values(), n_nonzero, index_of_max_val)); // Convert to actual position in matrix. const uword row = P.get_row_indices()[index_of_max_val]; uword col = 0; while(P.get_col_ptrs()[++col] <= index_of_max_val) { } index_of_max_val = (col - 1) * n_rows + row; } if(n_elem != n_nonzero) { max_val = (std::max)(T(0), max_val); // If the max_val is a nonzero element, we need its actual position in the matrix. if(max_val == T(0)) { // Find first zero element. uword last_row = 0; uword last_col = 0; typedef typename SpProxy::const_iterator_type it_type; it_type it = P.begin(); it_type it_end = P.end(); while(it != it_end) { // Have we moved more than one position from the last place? if((it.col() == last_col) && (it.row() - last_row > 1)) { index_of_max_val = it.col() * n_rows + last_row + 1; break; } else if((it.col() >= last_col + 1) && (last_row < n_rows - 1)) { index_of_max_val = last_col * n_rows + last_row + 1; break; } else if((it.col() == last_col + 1) && (it.row() > 0)) { index_of_max_val = it.col() * n_rows; break; } else if(it.col() > last_col + 1) { index_of_max_val = (last_col + 1) * n_rows; break; } last_row = it.row(); last_col = it.col(); ++it; } } } return P[index_of_max_val]; } //! @} RcppArmadillo/inst/include/armadillo_bits/arma_ostream_bones.hpp0000644000176200001440000000714314124060717024750 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup arma_ostream //! @{ class arma_ostream_state { private: const ios::fmtflags orig_flags; const std::streamsize orig_precision; const std::streamsize orig_width; const char orig_fill; public: inline arma_ostream_state(const std::ostream& o); inline void restore(std::ostream& o) const; }; class arma_ostream { public: template inline static std::streamsize modify_stream(std::ostream& o, const eT* data, const uword n_elem); template inline static std::streamsize modify_stream(std::ostream& o, const std::complex* data, const uword n_elem); template inline static std::streamsize modify_stream(std::ostream& o, typename SpMat::const_iterator begin, const uword n_elem, const typename arma_not_cx::result* junk = nullptr); template inline static std::streamsize modify_stream(std::ostream& o, typename SpMat::const_iterator begin, const uword n_elem, const typename arma_cx_only::result* junk = nullptr); template inline static void print_elem_zero(std::ostream& o, const bool modify); template inline static void raw_print_elem_zero(std::ostream& o); template inline static void print_elem(std::ostream& o, const eT& x, const bool modify); template inline static void raw_print_elem(std::ostream& o, const eT& x); template inline static void print_elem(std::ostream& o, const std::complex& x, const bool modify); template inline static void raw_print_elem(std::ostream& o, const std::complex& x); template arma_cold inline static void print(std::ostream& o, const Mat& m, const bool modify); template arma_cold inline static void print(std::ostream& o, const Cube& m, const bool modify); template arma_cold inline static void print(std::ostream& o, const field& m); template arma_cold inline static void print(std::ostream& o, const subview_field& m); template arma_cold inline static void print_dense(std::ostream& o, const SpMat& m, const bool modify); template arma_cold inline static void print(std::ostream& o, const SpMat& m, const bool modify); arma_cold inline static void print(std::ostream& o, const SizeMat& S); arma_cold inline static void print(std::ostream& o, const SizeCube& S); template arma_cold inline static void brief_print(std::ostream& o, const Mat& m, const bool print_size = true); template arma_cold inline static void brief_print(std::ostream& o, const Cube& m); template arma_cold inline static void brief_print(std::ostream& o, const SpMat& m); }; //! @} RcppArmadillo/inst/include/armadillo_bits/memory.hpp0000644000176200001440000001270414124060717022417 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup memory //! @{ class memory { public: template inline arma_malloc static eT* acquire(const uword n_elem); template arma_inline static void release(eT* mem); template arma_inline static bool is_aligned(const eT* mem); template arma_inline static void mark_as_aligned( eT*& mem); template arma_inline static void mark_as_aligned(const eT*& mem); }; template inline arma_malloc eT* memory::acquire(const uword n_elem) { if(n_elem == 0) { return nullptr; } arma_debug_check ( ( size_t(n_elem) > (std::numeric_limits::max() / sizeof(eT)) ), "arma::memory::acquire(): requested size is too large" ); eT* out_memptr; #if defined(ARMA_ALIEN_MEM_ALLOC_FUNCTION) { out_memptr = (eT *) ARMA_ALIEN_MEM_ALLOC_FUNCTION(sizeof(eT)*n_elem); } #elif defined(ARMA_USE_TBB_ALLOC) { out_memptr = (eT *) scalable_malloc(sizeof(eT)*n_elem); } #elif defined(ARMA_USE_MKL_ALLOC) { out_memptr = (eT *) mkl_malloc( sizeof(eT)*n_elem, 32 ); } #elif defined(ARMA_HAVE_POSIX_MEMALIGN) { eT* memptr = nullptr; const size_t n_bytes = sizeof(eT)*size_t(n_elem); const size_t alignment = (n_bytes >= size_t(1024)) ? size_t(32) : size_t(16); // TODO: investigate apparent memory leak when using alignment >= 64 (as shown on Fedora 28, glibc 2.27) int status = posix_memalign((void **)&memptr, ( (alignment >= sizeof(void*)) ? alignment : sizeof(void*) ), n_bytes); out_memptr = (status == 0) ? memptr : nullptr; } #elif defined(_MSC_VER) { //out_memptr = (eT *) malloc(sizeof(eT)*n_elem); //out_memptr = (eT *) _aligned_malloc( sizeof(eT)*n_elem, 16 ); // lives in malloc.h const size_t n_bytes = sizeof(eT)*size_t(n_elem); const size_t alignment = (n_bytes >= size_t(1024)) ? size_t(32) : size_t(16); out_memptr = (eT *) _aligned_malloc( n_bytes, alignment ); } #else { //return ( new(std::nothrow) eT[n_elem] ); out_memptr = (eT *) malloc(sizeof(eT)*n_elem); } #endif // TODO: for mingw, use __mingw_aligned_malloc arma_check_bad_alloc( (out_memptr == nullptr), "arma::memory::acquire(): out of memory" ); return out_memptr; } template arma_inline void memory::release(eT* mem) { if(mem == nullptr) { return; } #if defined(ARMA_ALIEN_MEM_FREE_FUNCTION) { ARMA_ALIEN_MEM_FREE_FUNCTION( (void *)(mem) ); } #elif defined(ARMA_USE_TBB_ALLOC) { scalable_free( (void *)(mem) ); } #elif defined(ARMA_USE_MKL_ALLOC) { mkl_free( (void *)(mem) ); } #elif defined(ARMA_HAVE_POSIX_MEMALIGN) { free( (void *)(mem) ); } #elif defined(_MSC_VER) { //free( (void *)(mem) ); _aligned_free( (void *)(mem) ); } #else { //delete [] mem; free( (void *)(mem) ); } #endif // TODO: for mingw, use __mingw_aligned_free } template arma_inline bool memory::is_aligned(const eT* mem) { #if (defined(ARMA_HAVE_ICC_ASSUME_ALIGNED) || defined(ARMA_HAVE_GCC_ASSUME_ALIGNED)) && !defined(ARMA_DONT_CHECK_ALIGNMENT) { return (sizeof(std::size_t) >= sizeof(eT*)) ? ((std::size_t(mem) & 0x0F) == 0) : false; } #else { arma_ignore(mem); return false; } #endif } template arma_inline void memory::mark_as_aligned(eT*& mem) { #if defined(ARMA_HAVE_ICC_ASSUME_ALIGNED) { __assume_aligned(mem, 16); } #elif defined(ARMA_HAVE_GCC_ASSUME_ALIGNED) { mem = (eT*)__builtin_assume_aligned(mem, 16); } #else { arma_ignore(mem); } #endif // TODO: MSVC? __assume( (mem & 0x0F) == 0 ); // // http://comments.gmane.org/gmane.comp.gcc.patches/239430 // GCC __builtin_assume_aligned is similar to ICC's __assume_aligned, // so for lvalue first argument ICC's __assume_aligned can be emulated using // #define __assume_aligned(lvalueptr, align) lvalueptr = __builtin_assume_aligned (lvalueptr, align) // // http://www.inf.ethz.ch/personal/markusp/teaching/263-2300-ETH-spring11/slides/class19.pdf // http://software.intel.com/sites/products/documentation/hpc/composerxe/en-us/cpp/lin/index.htm // http://d3f8ykwhia686p.cloudfront.net/1live/intel/CompilerAutovectorizationGuide.pdf } template arma_inline void memory::mark_as_aligned(const eT*& mem) { #if defined(ARMA_HAVE_ICC_ASSUME_ALIGNED) { __assume_aligned(mem, 16); } #elif defined(ARMA_HAVE_GCC_ASSUME_ALIGNED) { mem = (const eT*)__builtin_assume_aligned(mem, 16); } #else { arma_ignore(mem); } #endif } //! @} RcppArmadillo/inst/include/armadillo_bits/translate_blas.hpp0000644000176200001440000002423214124060717024104 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #ifdef ARMA_USE_BLAS //! \namespace blas namespace for BLAS functions namespace blas { template inline void gemv(const char* transA, const blas_int* m, const blas_int* n, const eT* alpha, const eT* A, const blas_int* ldA, const eT* x, const blas_int* incx, const eT* beta, eT* y, const blas_int* incy) { arma_type_check((is_supported_blas_type::value == false)); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) { if( is_float::value) { typedef float T; arma_fortran(arma_sgemv)(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy, 1); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgemv)(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy, 1); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgemv)(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy, 1); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgemv)(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy, 1); } } #else { if( is_float::value) { typedef float T; arma_fortran(arma_sgemv)(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgemv)(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgemv)(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgemv)(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy); } } #endif } template inline void gemm(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const eT* alpha, const eT* A, const blas_int* ldA, const eT* B, const blas_int* ldB, const eT* beta, eT* C, const blas_int* ldC) { arma_type_check((is_supported_blas_type::value == false)); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) { if( is_float::value) { typedef float T; arma_fortran(arma_sgemm)(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC, 1, 1); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgemm)(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC, 1, 1); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgemm)(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC, 1, 1); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgemm)(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC, 1, 1); } } #else { if( is_float::value) { typedef float T; arma_fortran(arma_sgemm)(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgemm)(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgemm)(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgemm)(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC); } } #endif } template inline void syrk(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const eT* alpha, const eT* A, const blas_int* ldA, const eT* beta, eT* C, const blas_int* ldC) { arma_type_check((is_supported_blas_type::value == false)); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) { if( is_float::value) { typedef float T; arma_fortran(arma_ssyrk)(uplo, transA, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)beta, (T*)C, ldC, 1, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dsyrk)(uplo, transA, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)beta, (T*)C, ldC, 1, 1); } } #else { if( is_float::value) { typedef float T; arma_fortran(arma_ssyrk)(uplo, transA, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)beta, (T*)C, ldC); } else if(is_double::value) { typedef double T; arma_fortran(arma_dsyrk)(uplo, transA, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)beta, (T*)C, ldC); } } #endif } template inline void herk(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const T* alpha, const std::complex* A, const blas_int* ldA, const T* beta, std::complex* C, const blas_int* ldC) { arma_type_check((is_supported_blas_type::value == false)); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) { if( is_float::value) { typedef float TT; typedef blas_cxf cx_TT; arma_fortran(arma_cherk)(uplo, transA, n, k, (const TT*)alpha, (const cx_TT*)A, ldA, (const TT*)beta, (cx_TT*)C, ldC, 1, 1); } else if(is_double::value) { typedef double TT; typedef blas_cxd cx_TT; arma_fortran(arma_zherk)(uplo, transA, n, k, (const TT*)alpha, (const cx_TT*)A, ldA, (const TT*)beta, (cx_TT*)C, ldC, 1, 1); } } #else { if( is_float::value) { typedef float TT; typedef blas_cxf cx_TT; arma_fortran(arma_cherk)(uplo, transA, n, k, (const TT*)alpha, (const cx_TT*)A, ldA, (const TT*)beta, (cx_TT*)C, ldC); } else if(is_double::value) { typedef double TT; typedef blas_cxd cx_TT; arma_fortran(arma_zherk)(uplo, transA, n, k, (const TT*)alpha, (const cx_TT*)A, ldA, (const TT*)beta, (cx_TT*)C, ldC); } } #endif } template inline eT dot(const uword n_elem, const eT* x, const eT* y) { arma_type_check((is_supported_blas_type::value == false)); if(is_float::value) { #if defined(ARMA_BLAS_SDOT_BUG) { if(n_elem == 0) { return eT(0); } const char trans = 'T'; const blas_int m = blas_int(n_elem); const blas_int n = 1; const blas_int inc = 1; const eT alpha = eT(1); const eT beta = eT(0); eT result[2]; // paranoia: using two elements instead of one blas::gemv(&trans, &m, &n, &alpha, x, &m, y, &inc, &beta, &result[0], &inc); return result[0]; } #else { blas_int n = blas_int(n_elem); blas_int inc = 1; typedef float T; return eT( arma_fortran(arma_sdot)(&n, (const T*)x, &inc, (const T*)y, &inc) ); } #endif } else if(is_double::value) { blas_int n = blas_int(n_elem); blas_int inc = 1; typedef double T; return eT( arma_fortran(arma_ddot)(&n, (const T*)x, &inc, (const T*)y, &inc) ); } else if( (is_cx_float::value) || (is_cx_double::value) ) { if(n_elem == 0) { return eT(0); } // using gemv() workaround due to compatibility issues with cdotu() and zdotu() const char trans = 'T'; const blas_int m = blas_int(n_elem); const blas_int n = 1; const blas_int inc = 1; const eT alpha = eT(1); const eT beta = eT(0); eT result[2]; // paranoia: using two elements instead of one blas::gemv(&trans, &m, &n, &alpha, x, &m, y, &inc, &beta, &result[0], &inc); return result[0]; } return eT(0); } template arma_inline eT asum(const uword n_elem, const eT* x) { arma_type_check((is_supported_blas_type::value == false)); if(is_float::value) { blas_int n = blas_int(n_elem); blas_int inc = 1; typedef float T; return arma_fortran(arma_sasum)(&n, (const T*)x, &inc); } else if(is_double::value) { blas_int n = blas_int(n_elem); blas_int inc = 1; typedef double T; return arma_fortran(arma_dasum)(&n, (const T*)x, &inc); } return eT(0); } template arma_inline eT nrm2(const uword n_elem, const eT* x) { arma_type_check((is_supported_blas_type::value == false)); if(is_float::value) { blas_int n = blas_int(n_elem); blas_int inc = 1; typedef float T; return arma_fortran(arma_snrm2)(&n, (const T*)x, &inc); } else if(is_double::value) { blas_int n = blas_int(n_elem); blas_int inc = 1; typedef double T; return arma_fortran(arma_dnrm2)(&n, (const T*)x, &inc); } return eT(0); } } // namespace blas #endif RcppArmadillo/inst/include/armadillo_bits/Col_bones.hpp0000644000176200001440000002605114124060717023012 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup Col //! @{ //! Class for column vectors (matrices with only one column) template class Col : public Mat { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_col = true; static constexpr bool is_row = false; static constexpr bool is_xvec = false; inline Col(); inline Col(const Col& X); inline explicit Col(const uword n_elem); inline explicit Col(const uword in_rows, const uword in_cols); inline explicit Col(const SizeMat& s); template inline explicit Col(const uword n_elem, const arma_initmode_indicator&); template inline explicit Col(const uword in_rows, const uword in_cols, const arma_initmode_indicator&); template inline explicit Col(const SizeMat& s, const arma_initmode_indicator&); template inline Col(const uword n_elem, const fill::fill_class& f); template inline Col(const uword in_rows, const uword in_cols, const fill::fill_class& f); template inline Col(const SizeMat& s, const fill::fill_class& f); inline Col(const uword N, const fill::scalar_holder f); inline Col(const uword in_rows, const uword in_cols, const fill::scalar_holder f); inline Col(const SizeMat& s, const fill::scalar_holder f); inline Col(const char* text); inline Col& operator=(const char* text); inline Col(const std::string& text); inline Col& operator=(const std::string& text); inline Col(const std::vector& x); inline Col& operator=(const std::vector& x); inline Col(const std::initializer_list& list); inline Col& operator=(const std::initializer_list& list); inline Col(Col&& m); inline Col& operator=(Col&& m); inline Col& operator=(const eT val); inline Col& operator=(const Col& m); template inline Col(const Base& X); template inline Col& operator=(const Base& X); template inline explicit Col(const SpBase& X); template inline Col& operator=(const SpBase& X); inline Col( eT* aux_mem, const uword aux_length, const bool copy_aux_mem = true, const bool strict = false); inline Col(const eT* aux_mem, const uword aux_length); template inline explicit Col(const Base& A, const Base& B); template inline Col(const BaseCube& X); template inline Col& operator=(const BaseCube& X); inline Col(const subview_cube& X); inline Col& operator=(const subview_cube& X); arma_cold inline mat_injector operator<<(const eT val); arma_inline arma_warn_unused const Op,op_htrans> t() const; arma_inline arma_warn_unused const Op,op_htrans> ht() const; arma_inline arma_warn_unused const Op,op_strans> st() const; arma_inline arma_warn_unused const Op,op_strans> as_row() const; arma_inline subview_col row(const uword row_num); arma_inline const subview_col row(const uword row_num) const; using Mat::rows; using Mat::operator(); arma_inline subview_col rows(const uword in_row1, const uword in_row2); arma_inline const subview_col rows(const uword in_row1, const uword in_row2) const; arma_inline subview_col subvec(const uword in_row1, const uword in_row2); arma_inline const subview_col subvec(const uword in_row1, const uword in_row2) const; arma_inline subview_col rows(const span& row_span); arma_inline const subview_col rows(const span& row_span) const; arma_inline subview_col subvec(const span& row_span); arma_inline const subview_col subvec(const span& row_span) const; arma_inline subview_col operator()(const span& row_span); arma_inline const subview_col operator()(const span& row_span) const; arma_inline subview_col subvec(const uword start_row, const SizeMat& s); arma_inline const subview_col subvec(const uword start_row, const SizeMat& s) const; arma_inline subview_col head(const uword N); arma_inline const subview_col head(const uword N) const; arma_inline subview_col tail(const uword N); arma_inline const subview_col tail(const uword N) const; arma_inline subview_col head_rows(const uword N); arma_inline const subview_col head_rows(const uword N) const; arma_inline subview_col tail_rows(const uword N); arma_inline const subview_col tail_rows(const uword N) const; inline void shed_row (const uword row_num); inline void shed_rows(const uword in_row1, const uword in_row2); template inline void shed_rows(const Base& indices); inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero = true); template inline void insert_rows(const uword row_num, const Base& X); arma_inline arma_warn_unused eT& at(const uword i); arma_inline arma_warn_unused const eT& at(const uword i) const; arma_inline arma_warn_unused eT& at(const uword in_row, const uword in_col); arma_inline arma_warn_unused const eT& at(const uword in_row, const uword in_col) const; typedef eT* row_iterator; typedef const eT* const_row_iterator; inline row_iterator begin_row(const uword row_num); inline const_row_iterator begin_row(const uword row_num) const; inline row_iterator end_row (const uword row_num); inline const_row_iterator end_row (const uword row_num) const; template class fixed; protected: inline Col(const arma_fixed_indicator&, const uword in_n_elem, const eT* in_mem); public: #ifdef ARMA_EXTRA_COL_PROTO #include ARMA_INCFILE_WRAP(ARMA_EXTRA_COL_PROTO) #endif }; template template class Col::fixed : public Col { private: static constexpr bool use_extra = (fixed_n_elem > arma_config::mat_prealloc); arma_align_mem eT mem_local_extra[ (use_extra) ? fixed_n_elem : 1 ]; public: typedef fixed Col_fixed_type; typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_col = true; static constexpr bool is_row = false; static constexpr bool is_xvec = false; static const uword n_rows; // value provided below the class definition static const uword n_cols; // value provided below the class definition static const uword n_elem; // value provided below the class definition arma_inline fixed(); arma_inline fixed(const fixed& X); inline fixed(const subview_cube& X); inline fixed(const fill::scalar_holder f); template inline fixed(const fill::fill_class& f); template inline fixed(const Base& A); template inline fixed(const Base& A, const Base& B); inline fixed(const eT* aux_mem); inline fixed(const char* text); inline fixed(const std::string& text); template inline Col& operator=(const Base& A); inline Col& operator=(const eT val); inline Col& operator=(const char* text); inline Col& operator=(const std::string& text); inline Col& operator=(const subview_cube& X); using Col::operator(); inline fixed(const std::initializer_list& list); inline Col& operator=(const std::initializer_list& list); arma_inline Col& operator=(const fixed& X); #if defined(ARMA_GOOD_COMPILER) template inline Col& operator=(const eOp& X); template inline Col& operator=(const eGlue& X); #endif arma_inline arma_warn_unused const Op< Col_fixed_type, op_htrans > t() const; arma_inline arma_warn_unused const Op< Col_fixed_type, op_htrans > ht() const; arma_inline arma_warn_unused const Op< Col_fixed_type, op_strans > st() const; arma_inline arma_warn_unused const eT& at_alt (const uword i) const; arma_inline arma_warn_unused eT& operator[] (const uword i); arma_inline arma_warn_unused const eT& operator[] (const uword i) const; arma_inline arma_warn_unused eT& at (const uword i); arma_inline arma_warn_unused const eT& at (const uword i) const; arma_inline arma_warn_unused eT& operator() (const uword i); arma_inline arma_warn_unused const eT& operator() (const uword i) const; arma_inline arma_warn_unused eT& at (const uword in_row, const uword in_col); arma_inline arma_warn_unused const eT& at (const uword in_row, const uword in_col) const; arma_inline arma_warn_unused eT& operator() (const uword in_row, const uword in_col); arma_inline arma_warn_unused const eT& operator() (const uword in_row, const uword in_col) const; arma_inline arma_warn_unused eT* memptr(); arma_inline arma_warn_unused const eT* memptr() const; arma_hot inline const Col& fill(const eT val); arma_hot inline const Col& zeros(); arma_hot inline const Col& ones(); }; // these definitions are outside of the class due to bizarre C++ rules; // C++17 has inline variables to address this shortcoming template template const uword Col::fixed::n_rows = fixed_n_elem; template template const uword Col::fixed::n_cols = 1u; template template const uword Col::fixed::n_elem = fixed_n_elem; //! @} RcppArmadillo/inst/include/armadillo_bits/glue_min_bones.hpp0000644000176200001440000000272414124060717024075 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_min //! @{ class glue_min : public traits_glue_or { public: // dense matrices template inline static void apply(Mat& out, const Glue& X); template inline static void apply(Mat& out, const Proxy& PA, const Proxy& PB); // cubes template inline static void apply(Cube& out, const GlueCube& X); template inline static void apply(Cube& out, const ProxyCube& PA, const ProxyCube& PB); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_cross.hpp0000644000176200001440000000236514124060717022725 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_cross //! @{ //! cross product (only valid for 3 dimensional vectors) template arma_warn_unused inline typename enable_if2 < is_arma_type::value && is_arma_type::value && is_same_type::value, const Glue >::result cross(const T1& X, const T2& Y) { arma_extra_debug_sigprint(); return Glue(X, Y); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_cumprod_meat.hpp0000644000176200001440000000724514124060717024270 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_cumprod //! @{ template inline void op_cumprod::apply_noalias(Mat& out, const Mat& X, const uword dim) { arma_extra_debug_sigprint(); uword n_rows = X.n_rows; uword n_cols = X.n_cols; out.set_size(n_rows,n_cols); if(out.n_elem == 0) { return; } if(dim == 0) { if(n_cols == 1) { const eT* X_mem = X.memptr(); eT* out_mem = out.memptr(); eT acc = eT(1); for(uword row=0; row < n_rows; ++row) { acc *= X_mem[row]; out_mem[row] = acc; } } else { for(uword col=0; col < n_cols; ++col) { const eT* X_colmem = X.colptr(col); eT* out_colmem = out.colptr(col); eT acc = eT(1); for(uword row=0; row < n_rows; ++row) { acc *= X_colmem[row]; out_colmem[row] = acc; } } } } else if(dim == 1) { if(n_rows == 1) { const eT* X_mem = X.memptr(); eT* out_mem = out.memptr(); eT acc = eT(1); for(uword col=0; col < n_cols; ++col) { acc *= X_mem[col]; out_mem[col] = acc; } } else { if(n_cols > 0) { arrayops::copy( out.colptr(0), X.colptr(0), n_rows ); for(uword col=1; col < n_cols; ++col) { const eT* out_colmem_prev = out.colptr(col-1); eT* out_colmem = out.colptr(col ); const eT* X_colmem = X.colptr(col ); for(uword row=0; row < n_rows; ++row) { out_colmem[row] = out_colmem_prev[row] * X_colmem[row]; } } } } } } template inline void op_cumprod::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "cumprod(): parameter 'dim' must be 0 or 1" ); const quasi_unwrap U(in.m); if(U.is_alias(out)) { Mat tmp; op_cumprod::apply_noalias(tmp, U.M, dim); out.steal_mem(tmp); } else { op_cumprod::apply_noalias(out, U.M, dim); } } template inline void op_cumprod_vec::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap U(in.m); const uword dim = (T1::is_xvec) ? uword(U.M.is_rowvec() ? 1 : 0) : uword((T1::is_row) ? 1 : 0); if(U.is_alias(out)) { Mat tmp; op_cumprod::apply_noalias(tmp, U.M, dim); out.steal_mem(tmp); } else { op_cumprod::apply_noalias(out, U.M, dim); } } //! @} RcppArmadillo/inst/include/armadillo_bits/operator_plus.hpp0000644000176200001440000003020114124060717023775 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup operator_plus //! @{ //! unary plus operation (does nothing, but is required for completeness) template arma_inline typename enable_if2< is_arma_type::value, const T1& >::result operator+ (const T1& X) { arma_extra_debug_sigprint(); return X; } //! Base + scalar template arma_inline typename enable_if2< is_arma_type::value, const eOp >::result operator+ (const T1& X, const typename T1::elem_type k) { arma_extra_debug_sigprint(); return eOp(X, k); } //! scalar + Base template arma_inline typename enable_if2< is_arma_type::value, const eOp >::result operator+ (const typename T1::elem_type k, const T1& X) { arma_extra_debug_sigprint(); return eOp(X, k); // NOTE: order is swapped } //! non-complex Base + complex scalar template arma_inline typename enable_if2 < (is_arma_type::value && is_cx::no), const mtOp, T1, op_cx_scalar_plus> >::result operator+ ( const T1& X, const std::complex& k ) { arma_extra_debug_sigprint(); return mtOp, T1, op_cx_scalar_plus>('j', X, k); } //! complex scalar + non-complex Base template arma_inline typename enable_if2 < (is_arma_type::value && is_cx::no), const mtOp, T1, op_cx_scalar_plus> >::result operator+ ( const std::complex& k, const T1& X ) { arma_extra_debug_sigprint(); return mtOp, T1, op_cx_scalar_plus>('j', X, k); // NOTE: order is swapped } //! addition of user-accessible Armadillo objects with same element type template arma_inline typename enable_if2 < is_arma_type::value && is_arma_type::value && is_same_type::value, const eGlue >::result operator+ ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); return eGlue(X, Y); } //! addition of user-accessible Armadillo objects with different element types template inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && (is_same_type::no)), const mtGlue::result, T1, T2, glue_mixed_plus> >::result operator+ ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); return mtGlue( X, Y ); } //! addition of two sparse objects template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_sparse_type::value && is_same_type::value), SpGlue >::result operator+ ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); return SpGlue(x, y); } //! addition of one dense and one sparse object template inline typename enable_if2 < (is_arma_type::value && is_arma_sparse_type::value && is_same_type::value), Mat >::result operator+ ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); Mat result(x); const SpProxy pb(y); arma_debug_assert_same_size( result.n_rows, result.n_cols, pb.get_n_rows(), pb.get_n_cols(), "addition" ); typename SpProxy::const_iterator_type it = pb.begin(); typename SpProxy::const_iterator_type it_end = pb.end(); while(it != it_end) { result.at(it.row(), it.col()) += (*it); ++it; } return result; } //! addition of one sparse and one dense object template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_type::value && is_same_type::value), Mat >::result operator+ ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); const SpProxy pa(x); Mat result(y); arma_debug_assert_same_size( pa.get_n_rows(), pa.get_n_cols(), result.n_rows, result.n_cols, "addition" ); typename SpProxy::const_iterator_type it = pa.begin(); typename SpProxy::const_iterator_type it_end = pa.end(); while(it != it_end) { result.at(it.row(), it.col()) += (*it); ++it; } return result; } //! addition of two sparse objects with different element types template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_sparse_type::value && is_same_type::no), const mtSpGlue< typename promote_type::result, T1, T2, spglue_plus_mixed > >::result operator+ ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); return mtSpGlue( X, Y ); } //! addition of sparse and non-sparse objects with different element types template inline typename enable_if2 < (is_arma_type::value && is_arma_sparse_type::value && is_same_type::no), Mat< typename promote_type::result > >::result operator+ ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); Mat< typename promote_type::result > out; spglue_plus_mixed::dense_plus_sparse(out, x, y); return out; } //! addition of sparse and non-sparse objects with different element types template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_type::value && is_same_type::no), Mat< typename promote_type::result > >::result operator+ ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); Mat< typename promote_type::result > out; // Just call the other order (these operations are commutative) // TODO: if there is a matrix size mismatch, the debug assert will print the matrix sizes in wrong order spglue_plus_mixed::dense_plus_sparse(out, y, x); return out; } //! addition of sparse object with scalar template inline typename enable_if2< is_arma_sparse_type::value, const SpToDOp >::result operator+ ( const T1& X, const typename T1::elem_type k ) { arma_extra_debug_sigprint(); return SpToDOp(X, k); } template inline typename enable_if2< is_arma_sparse_type::value, const SpToDOp >::result operator+ ( const typename T1::elem_type k, const T1& X ) { arma_extra_debug_sigprint(); return SpToDOp(X, k); // NOTE: swapped order } // TODO: this is an uncommon use case; remove? //! multiple applications of add/subtract scalars can be condensed template inline typename enable_if2 < (is_arma_sparse_type::value && (is_same_type::value || is_same_type::value)), const SpToDOp >::result operator+ ( const SpToDOp& x, const typename T1::elem_type k ) { arma_extra_debug_sigprint(); const typename T1::elem_type aux = (is_same_type::value) ? x.aux : -x.aux; return SpToDOp(x.m, aux + k); } // TODO: this is an uncommon use case; remove? //! multiple applications of add/subtract scalars can be condensed template inline typename enable_if2 < (is_arma_sparse_type::value && is_same_type::value), const SpToDOp >::result operator+ ( const SpToDOp& x, const typename T1::elem_type k ) { arma_extra_debug_sigprint(); return SpToDOp(x.m, x.aux + k); } // TODO: this is an uncommon use case; remove? //! multiple applications of add/subtract scalars can be condensed template inline typename enable_if2 < (is_arma_sparse_type::value && (is_same_type::value || is_same_type::value)), const SpToDOp >::result operator+ ( const typename T1::elem_type k, const SpToDOp& x ) { arma_extra_debug_sigprint(); const typename T1::elem_type aux = (is_same_type::value) ? x.aux : -x.aux; return SpToDOp(x.m, aux + k); } // TODO: this is an uncommon use case; remove? //! multiple applications of add/subtract scalars can be condensed template inline typename enable_if2 < (is_arma_sparse_type::value && is_same_type::value), const SpToDOp >::result operator+ ( const typename T1::elem_type k, const SpToDOp& x ) { arma_extra_debug_sigprint(); return SpToDOp(x.m, x.aux + k); } template arma_inline Mat operator+ ( const subview_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); return subview_each1_aux::operator_plus(X, Y.get_ref()); } template arma_inline Mat operator+ ( const Base& X, const subview_each1& Y ) { arma_extra_debug_sigprint(); return subview_each1_aux::operator_plus(Y, X.get_ref()); // NOTE: swapped order } template arma_inline Mat operator+ ( const subview_each2& X, const Base& Y ) { arma_extra_debug_sigprint(); return subview_each2_aux::operator_plus(X, Y.get_ref()); } template arma_inline Mat operator+ ( const Base& X, const subview_each2& Y ) { arma_extra_debug_sigprint(); return subview_each2_aux::operator_plus(Y, X.get_ref()); // NOTE: swapped order } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_kron.hpp0000644000176200001440000000462414124060717022545 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_kron //! @{ template arma_warn_unused arma_inline const Glue kron(const Base& A, const Base& B) { arma_extra_debug_sigprint(); return Glue(A.get_ref(), B.get_ref()); } template arma_warn_unused inline Mat::eT> kron(const Base,T1>& X, const Base& Y) { arma_extra_debug_sigprint(); typedef typename std::complex eT1; promote_type::check(); const quasi_unwrap tmp1(X.get_ref()); const quasi_unwrap tmp2(Y.get_ref()); const Mat& A = tmp1.M; const Mat& B = tmp2.M; Mat out; glue_kron::direct_kron(out, A, B); return out; } template arma_warn_unused inline Mat::eT> kron(const Base& X, const Base,T2>& Y) { arma_extra_debug_sigprint(); typedef typename std::complex eT2; promote_type::check(); const quasi_unwrap tmp1(X.get_ref()); const quasi_unwrap tmp2(Y.get_ref()); const Mat& A = tmp1.M; const Mat& B = tmp2.M; Mat out; glue_kron::direct_kron(out, A, B); return out; } template arma_warn_unused arma_inline const SpGlue kron(const SpBase& A, const SpBase& B) { arma_extra_debug_sigprint(); return SpGlue(A.get_ref(), B.get_ref()); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_numel.hpp0000644000176200001440000000343714124060717022715 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_numel //! @{ template arma_warn_unused inline typename enable_if2< is_arma_type::value, uword >::result numel(const T1& X) { arma_extra_debug_sigprint(); const Proxy P(X); return P.get_n_elem(); } template arma_warn_unused inline typename enable_if2< is_arma_cube_type::value, uword >::result numel(const T1& X) { arma_extra_debug_sigprint(); const ProxyCube P(X); return P.get_n_elem(); } template arma_warn_unused inline typename enable_if2< is_arma_sparse_type::value, uword >::result numel(const T1& X) { arma_extra_debug_sigprint(); const SpProxy P(X); return P.get_n_elem(); } template arma_warn_unused inline uword numel(const field& X) { arma_extra_debug_sigprint(); return X.n_elem; } template arma_warn_unused inline uword numel(const subview_field& X) { arma_extra_debug_sigprint(); return X.n_elem; } //! @} RcppArmadillo/inst/include/armadillo_bits/spglue_plus_meat.hpp0000644000176200001440000001635514124060717024465 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_plus //! @{ template arma_hot inline void spglue_plus::apply(SpMat& out, const SpGlue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const SpProxy pa(X.A); const SpProxy pb(X.B); const bool is_alias = pa.is_alias(out) || pb.is_alias(out); if(is_alias == false) { spglue_plus::apply_noalias(out, pa, pb); } else { SpMat tmp; spglue_plus::apply_noalias(tmp, pa, pb); out.steal_mem(tmp); } } template arma_hot inline void spglue_plus::apply_noalias(SpMat& out, const SpProxy& pa, const SpProxy& pb) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(pa.get_n_rows(), pa.get_n_cols(), pb.get_n_rows(), pb.get_n_cols(), "addition"); if(pa.get_n_nonzero() == 0) { out = pb.Q; return; } if(pb.get_n_nonzero() == 0) { out = pa.Q; return; } const uword max_n_nonzero = pa.get_n_nonzero() + pb.get_n_nonzero(); // Resize memory to upper bound out.reserve(pa.get_n_rows(), pa.get_n_cols(), max_n_nonzero); // Now iterate across both matrices. typename SpProxy::const_iterator_type x_it = pa.begin(); typename SpProxy::const_iterator_type x_end = pa.end(); typename SpProxy::const_iterator_type y_it = pb.begin(); typename SpProxy::const_iterator_type y_end = pb.end(); uword count = 0; while( (x_it != x_end) || (y_it != y_end) ) { eT out_val; const uword x_it_col = x_it.col(); const uword x_it_row = x_it.row(); const uword y_it_col = y_it.col(); const uword y_it_row = y_it.row(); bool use_y_loc = false; if(x_it == y_it) { out_val = (*x_it) + (*y_it); ++x_it; ++y_it; } else { if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end { out_val = (*x_it); ++x_it; } else { out_val = (*y_it); ++y_it; use_y_loc = true; } } if(out_val != eT(0)) { access::rw(out.values[count]) = out_val; const uword out_row = (use_y_loc == false) ? x_it_row : y_it_row; const uword out_col = (use_y_loc == false) ? x_it_col : y_it_col; access::rw(out.row_indices[count]) = out_row; access::rw(out.col_ptrs[out_col + 1])++; ++count; } arma_check( (count > max_n_nonzero), "internal error: spglue_plus::apply_noalias(): count > max_n_nonzero" ); } const uword out_n_cols = out.n_cols; uword* col_ptrs = access::rwp(out.col_ptrs); // Fix column pointers to be cumulative. for(uword c = 1; c <= out_n_cols; ++c) { col_ptrs[c] += col_ptrs[c - 1]; } if(count < max_n_nonzero) { if(count <= (max_n_nonzero/2)) { out.mem_resize(count); } else { // quick resize without reallocating memory and copying data access::rw( out.n_nonzero) = count; access::rw( out.values[count]) = eT(0); access::rw(out.row_indices[count]) = uword(0); } } } template arma_hot inline void spglue_plus::apply_noalias(SpMat& out, const SpMat& A, const SpMat& B) { arma_extra_debug_sigprint(); const SpProxy< SpMat > pa(A); const SpProxy< SpMat > pb(B); spglue_plus::apply_noalias(out, pa, pb); } // template inline void spglue_plus_mixed::apply(SpMat::eT>& out, const mtSpGlue::eT, T1, T2, spglue_plus_mixed>& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); if( (is_same_type::no) && (is_same_type::yes) ) { // upgrade T1 const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; SpMat AA(arma_layout_indicator(), A); for(uword i=0; i < A.n_nonzero; ++i) { access::rw(AA.values[i]) = out_eT(A.values[i]); } const SpMat& BB = reinterpret_cast< const SpMat& >(B); out = AA + BB; } else if( (is_same_type::yes) && (is_same_type::no) ) { // upgrade T2 const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; const SpMat& AA = reinterpret_cast< const SpMat& >(A); SpMat BB(arma_layout_indicator(), B); for(uword i=0; i < B.n_nonzero; ++i) { access::rw(BB.values[i]) = out_eT(B.values[i]); } out = AA + BB; } else { // upgrade T1 and T2 const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; SpMat AA(arma_layout_indicator(), A); SpMat BB(arma_layout_indicator(), B); for(uword i=0; i < A.n_nonzero; ++i) { access::rw(AA.values[i]) = out_eT(A.values[i]); } for(uword i=0; i < B.n_nonzero; ++i) { access::rw(BB.values[i]) = out_eT(B.values[i]); } out = AA + BB; } } template inline void spglue_plus_mixed::dense_plus_sparse(Mat< typename promote_type::result>& out, const T1& X, const T2& Y) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); if(is_same_type::no) { out = conv_to< Mat >::from(X); } else { const quasi_unwrap UA(X); const Mat& A = UA.M; out = reinterpret_cast< const Mat& >(A); } const SpProxy pb(Y); arma_debug_assert_same_size( out.n_rows, out.n_cols, pb.get_n_rows(), pb.get_n_cols(), "addition" ); typename SpProxy::const_iterator_type it = pb.begin(); typename SpProxy::const_iterator_type it_end = pb.end(); while(it != it_end) { out.at(it.row(), it.col()) += out_eT(*it); ++it; } } //! @} RcppArmadillo/inst/include/armadillo_bits/typedef_mat_fixed.hpp0000644000176200001440000002340614124060717024570 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup typedef_mat_fixed //! @{ typedef umat::fixed<2,2> umat22; typedef umat::fixed<3,3> umat33; typedef umat::fixed<4,4> umat44; typedef umat::fixed<5,5> umat55; typedef umat::fixed<6,6> umat66; typedef umat::fixed<7,7> umat77; typedef umat::fixed<8,8> umat88; typedef umat::fixed<9,9> umat99; typedef imat::fixed<2,2> imat22; typedef imat::fixed<3,3> imat33; typedef imat::fixed<4,4> imat44; typedef imat::fixed<5,5> imat55; typedef imat::fixed<6,6> imat66; typedef imat::fixed<7,7> imat77; typedef imat::fixed<8,8> imat88; typedef imat::fixed<9,9> imat99; typedef fmat::fixed<2,2> fmat22; typedef fmat::fixed<3,3> fmat33; typedef fmat::fixed<4,4> fmat44; typedef fmat::fixed<5,5> fmat55; typedef fmat::fixed<6,6> fmat66; typedef fmat::fixed<7,7> fmat77; typedef fmat::fixed<8,8> fmat88; typedef fmat::fixed<9,9> fmat99; typedef dmat::fixed<2,2> dmat22; typedef dmat::fixed<3,3> dmat33; typedef dmat::fixed<4,4> dmat44; typedef dmat::fixed<5,5> dmat55; typedef dmat::fixed<6,6> dmat66; typedef dmat::fixed<7,7> dmat77; typedef dmat::fixed<8,8> dmat88; typedef dmat::fixed<9,9> dmat99; typedef mat::fixed<2,2> mat22; typedef mat::fixed<3,3> mat33; typedef mat::fixed<4,4> mat44; typedef mat::fixed<5,5> mat55; typedef mat::fixed<6,6> mat66; typedef mat::fixed<7,7> mat77; typedef mat::fixed<8,8> mat88; typedef mat::fixed<9,9> mat99; typedef cx_fmat::fixed<2,2> cx_fmat22; typedef cx_fmat::fixed<3,3> cx_fmat33; typedef cx_fmat::fixed<4,4> cx_fmat44; typedef cx_fmat::fixed<5,5> cx_fmat55; typedef cx_fmat::fixed<6,6> cx_fmat66; typedef cx_fmat::fixed<7,7> cx_fmat77; typedef cx_fmat::fixed<8,8> cx_fmat88; typedef cx_fmat::fixed<9,9> cx_fmat99; typedef cx_dmat::fixed<2,2> cx_dmat22; typedef cx_dmat::fixed<3,3> cx_dmat33; typedef cx_dmat::fixed<4,4> cx_dmat44; typedef cx_dmat::fixed<5,5> cx_dmat55; typedef cx_dmat::fixed<6,6> cx_dmat66; typedef cx_dmat::fixed<7,7> cx_dmat77; typedef cx_dmat::fixed<8,8> cx_dmat88; typedef cx_dmat::fixed<9,9> cx_dmat99; typedef cx_mat::fixed<2,2> cx_mat22; typedef cx_mat::fixed<3,3> cx_mat33; typedef cx_mat::fixed<4,4> cx_mat44; typedef cx_mat::fixed<5,5> cx_mat55; typedef cx_mat::fixed<6,6> cx_mat66; typedef cx_mat::fixed<7,7> cx_mat77; typedef cx_mat::fixed<8,8> cx_mat88; typedef cx_mat::fixed<9,9> cx_mat99; // typedef uvec::fixed<2> uvec2; typedef uvec::fixed<3> uvec3; typedef uvec::fixed<4> uvec4; typedef uvec::fixed<5> uvec5; typedef uvec::fixed<6> uvec6; typedef uvec::fixed<7> uvec7; typedef uvec::fixed<8> uvec8; typedef uvec::fixed<9> uvec9; typedef ivec::fixed<2> ivec2; typedef ivec::fixed<3> ivec3; typedef ivec::fixed<4> ivec4; typedef ivec::fixed<5> ivec5; typedef ivec::fixed<6> ivec6; typedef ivec::fixed<7> ivec7; typedef ivec::fixed<8> ivec8; typedef ivec::fixed<9> ivec9; typedef fvec::fixed<2> fvec2; typedef fvec::fixed<3> fvec3; typedef fvec::fixed<4> fvec4; typedef fvec::fixed<5> fvec5; typedef fvec::fixed<6> fvec6; typedef fvec::fixed<7> fvec7; typedef fvec::fixed<8> fvec8; typedef fvec::fixed<9> fvec9; typedef dvec::fixed<2> dvec2; typedef dvec::fixed<3> dvec3; typedef dvec::fixed<4> dvec4; typedef dvec::fixed<5> dvec5; typedef dvec::fixed<6> dvec6; typedef dvec::fixed<7> dvec7; typedef dvec::fixed<8> dvec8; typedef dvec::fixed<9> dvec9; typedef vec::fixed<2> vec2; typedef vec::fixed<3> vec3; typedef vec::fixed<4> vec4; typedef vec::fixed<5> vec5; typedef vec::fixed<6> vec6; typedef vec::fixed<7> vec7; typedef vec::fixed<8> vec8; typedef vec::fixed<9> vec9; typedef cx_fvec::fixed<2> cx_fvec2; typedef cx_fvec::fixed<3> cx_fvec3; typedef cx_fvec::fixed<4> cx_fvec4; typedef cx_fvec::fixed<5> cx_fvec5; typedef cx_fvec::fixed<6> cx_fvec6; typedef cx_fvec::fixed<7> cx_fvec7; typedef cx_fvec::fixed<8> cx_fvec8; typedef cx_fvec::fixed<9> cx_fvec9; typedef cx_dvec::fixed<2> cx_dvec2; typedef cx_dvec::fixed<3> cx_dvec3; typedef cx_dvec::fixed<4> cx_dvec4; typedef cx_dvec::fixed<5> cx_dvec5; typedef cx_dvec::fixed<6> cx_dvec6; typedef cx_dvec::fixed<7> cx_dvec7; typedef cx_dvec::fixed<8> cx_dvec8; typedef cx_dvec::fixed<9> cx_dvec9; typedef cx_vec::fixed<2> cx_vec2; typedef cx_vec::fixed<3> cx_vec3; typedef cx_vec::fixed<4> cx_vec4; typedef cx_vec::fixed<5> cx_vec5; typedef cx_vec::fixed<6> cx_vec6; typedef cx_vec::fixed<7> cx_vec7; typedef cx_vec::fixed<8> cx_vec8; typedef cx_vec::fixed<9> cx_vec9; // typedef ucolvec::fixed<2> ucolvec2; typedef ucolvec::fixed<3> ucolvec3; typedef ucolvec::fixed<4> ucolvec4; typedef ucolvec::fixed<5> ucolvec5; typedef ucolvec::fixed<6> ucolvec6; typedef ucolvec::fixed<7> ucolvec7; typedef ucolvec::fixed<8> ucolvec8; typedef ucolvec::fixed<9> ucolvec9; typedef icolvec::fixed<2> icolvec2; typedef icolvec::fixed<3> icolvec3; typedef icolvec::fixed<4> icolvec4; typedef icolvec::fixed<5> icolvec5; typedef icolvec::fixed<6> icolvec6; typedef icolvec::fixed<7> icolvec7; typedef icolvec::fixed<8> icolvec8; typedef icolvec::fixed<9> icolvec9; typedef fcolvec::fixed<2> fcolvec2; typedef fcolvec::fixed<3> fcolvec3; typedef fcolvec::fixed<4> fcolvec4; typedef fcolvec::fixed<5> fcolvec5; typedef fcolvec::fixed<6> fcolvec6; typedef fcolvec::fixed<7> fcolvec7; typedef fcolvec::fixed<8> fcolvec8; typedef fcolvec::fixed<9> fcolvec9; typedef dcolvec::fixed<2> dcolvec2; typedef dcolvec::fixed<3> dcolvec3; typedef dcolvec::fixed<4> dcolvec4; typedef dcolvec::fixed<5> dcolvec5; typedef dcolvec::fixed<6> dcolvec6; typedef dcolvec::fixed<7> dcolvec7; typedef dcolvec::fixed<8> dcolvec8; typedef dcolvec::fixed<9> dcolvec9; typedef colvec::fixed<2> colvec2; typedef colvec::fixed<3> colvec3; typedef colvec::fixed<4> colvec4; typedef colvec::fixed<5> colvec5; typedef colvec::fixed<6> colvec6; typedef colvec::fixed<7> colvec7; typedef colvec::fixed<8> colvec8; typedef colvec::fixed<9> colvec9; typedef cx_fcolvec::fixed<2> cx_fcolvec2; typedef cx_fcolvec::fixed<3> cx_fcolvec3; typedef cx_fcolvec::fixed<4> cx_fcolvec4; typedef cx_fcolvec::fixed<5> cx_fcolvec5; typedef cx_fcolvec::fixed<6> cx_fcolvec6; typedef cx_fcolvec::fixed<7> cx_fcolvec7; typedef cx_fcolvec::fixed<8> cx_fcolvec8; typedef cx_fcolvec::fixed<9> cx_fcolvec9; typedef cx_dcolvec::fixed<2> cx_dcolvec2; typedef cx_dcolvec::fixed<3> cx_dcolvec3; typedef cx_dcolvec::fixed<4> cx_dcolvec4; typedef cx_dcolvec::fixed<5> cx_dcolvec5; typedef cx_dcolvec::fixed<6> cx_dcolvec6; typedef cx_dcolvec::fixed<7> cx_dcolvec7; typedef cx_dcolvec::fixed<8> cx_dcolvec8; typedef cx_dcolvec::fixed<9> cx_dcolvec9; typedef cx_colvec::fixed<2> cx_colvec2; typedef cx_colvec::fixed<3> cx_colvec3; typedef cx_colvec::fixed<4> cx_colvec4; typedef cx_colvec::fixed<5> cx_colvec5; typedef cx_colvec::fixed<6> cx_colvec6; typedef cx_colvec::fixed<7> cx_colvec7; typedef cx_colvec::fixed<8> cx_colvec8; typedef cx_colvec::fixed<9> cx_colvec9; // typedef urowvec::fixed<2> urowvec2; typedef urowvec::fixed<3> urowvec3; typedef urowvec::fixed<4> urowvec4; typedef urowvec::fixed<5> urowvec5; typedef urowvec::fixed<6> urowvec6; typedef urowvec::fixed<7> urowvec7; typedef urowvec::fixed<8> urowvec8; typedef urowvec::fixed<9> urowvec9; typedef irowvec::fixed<2> irowvec2; typedef irowvec::fixed<3> irowvec3; typedef irowvec::fixed<4> irowvec4; typedef irowvec::fixed<5> irowvec5; typedef irowvec::fixed<6> irowvec6; typedef irowvec::fixed<7> irowvec7; typedef irowvec::fixed<8> irowvec8; typedef irowvec::fixed<9> irowvec9; typedef frowvec::fixed<2> frowvec2; typedef frowvec::fixed<3> frowvec3; typedef frowvec::fixed<4> frowvec4; typedef frowvec::fixed<5> frowvec5; typedef frowvec::fixed<6> frowvec6; typedef frowvec::fixed<7> frowvec7; typedef frowvec::fixed<8> frowvec8; typedef frowvec::fixed<9> frowvec9; typedef drowvec::fixed<2> drowvec2; typedef drowvec::fixed<3> drowvec3; typedef drowvec::fixed<4> drowvec4; typedef drowvec::fixed<5> drowvec5; typedef drowvec::fixed<6> drowvec6; typedef drowvec::fixed<7> drowvec7; typedef drowvec::fixed<8> drowvec8; typedef drowvec::fixed<9> drowvec9; typedef rowvec::fixed<2> rowvec2; typedef rowvec::fixed<3> rowvec3; typedef rowvec::fixed<4> rowvec4; typedef rowvec::fixed<5> rowvec5; typedef rowvec::fixed<6> rowvec6; typedef rowvec::fixed<7> rowvec7; typedef rowvec::fixed<8> rowvec8; typedef rowvec::fixed<9> rowvec9; typedef cx_frowvec::fixed<2> cx_frowvec2; typedef cx_frowvec::fixed<3> cx_frowvec3; typedef cx_frowvec::fixed<4> cx_frowvec4; typedef cx_frowvec::fixed<5> cx_frowvec5; typedef cx_frowvec::fixed<6> cx_frowvec6; typedef cx_frowvec::fixed<7> cx_frowvec7; typedef cx_frowvec::fixed<8> cx_frowvec8; typedef cx_frowvec::fixed<9> cx_frowvec9; typedef cx_drowvec::fixed<2> cx_drowvec2; typedef cx_drowvec::fixed<3> cx_drowvec3; typedef cx_drowvec::fixed<4> cx_drowvec4; typedef cx_drowvec::fixed<5> cx_drowvec5; typedef cx_drowvec::fixed<6> cx_drowvec6; typedef cx_drowvec::fixed<7> cx_drowvec7; typedef cx_drowvec::fixed<8> cx_drowvec8; typedef cx_drowvec::fixed<9> cx_drowvec9; typedef cx_rowvec::fixed<2> cx_rowvec2; typedef cx_rowvec::fixed<3> cx_rowvec3; typedef cx_rowvec::fixed<4> cx_rowvec4; typedef cx_rowvec::fixed<5> cx_rowvec5; typedef cx_rowvec::fixed<6> cx_rowvec6; typedef cx_rowvec::fixed<7> cx_rowvec7; typedef cx_rowvec::fixed<8> cx_rowvec8; typedef cx_rowvec::fixed<9> cx_rowvec9; //! @} RcppArmadillo/inst/include/armadillo_bits/op_roots_meat.hpp0000644000176200001440000000637514124060717023770 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_roots //! @{ template inline void op_roots::apply(Mat< std::complex >& out, const mtOp, T1, op_roots>& expr) { arma_extra_debug_sigprint(); const bool status = op_roots::apply_direct(out, expr.m); if(status == false) { out.soft_reset(); arma_stop_runtime_error("roots(): eigen decomposition failed"); } } template inline bool op_roots::apply_direct(Mat< std::complex >& out, const Base& X) { arma_extra_debug_sigprint(); typedef std::complex out_eT; const quasi_unwrap U(X.get_ref()); bool status = false; if(U.is_alias(out)) { Mat tmp; status = op_roots::apply_noalias(tmp, U.M); out.steal_mem(tmp); } else { status = op_roots::apply_noalias(out, U.M); } return status; } template inline bool op_roots::apply_noalias(Mat< std::complex::result> >& out, const Mat& X) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; typedef std::complex::result> out_eT; arma_debug_check( (X.is_vec() == false), "roots(): given object must be a vector" ); if(X.is_finite() == false) { return false; } // treat X as a column vector const Col Y( const_cast(X.memptr()), X.n_elem, false, false); const T Y_max = (Y.is_empty() == false) ? T(max(abs(Y))) : T(0); if(Y_max == T(0)) { out.set_size(1,0); return true; } const uvec indices = find( Y / Y_max ); const uword n_tail_zeros = (indices.n_elem > 0) ? uword( (Y.n_elem-1) - indices[indices.n_elem-1] ) : uword(0); const Col Z = Y.subvec( indices[0], indices[indices.n_elem-1] ); if(Z.n_elem >= uword(2)) { Mat tmp; if(Z.n_elem == uword(2)) { tmp.set_size(1,1); tmp[0] = -Z[1] / Z[0]; } else { tmp = diagmat(ones< Col >(Z.n_elem - 2), -1); tmp.row(0) = strans(-Z.subvec(1, Z.n_elem-1) / Z[0]); } Mat junk; const bool status = auxlib::eig_gen(out, junk, false, tmp); if(status == false) { return false; } if(n_tail_zeros > 0) { out.resize(out.n_rows + n_tail_zeros, 1); } } else { out.zeros(n_tail_zeros,1); } return true; } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_histc_bones.hpp0000644000176200001440000000303114124060717024414 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_histc //! @{ class glue_histc : public traits_glue_default { public: template inline static void apply_noalias(Mat& C, const Mat& A, const Mat& B, const uword dim); template inline static void apply(Mat& C, const mtGlue& expr); }; class glue_histc_default { public: template struct traits { static constexpr bool is_row = T1::is_row; static constexpr bool is_col = T1::is_col; static constexpr bool is_xvec = T1::is_xvec; }; template inline static void apply(Mat& C, const mtGlue& expr); }; //! @} RcppArmadillo/inst/include/armadillo_bits/spop_strans_bones.hpp0000644000176200001440000000277114124060717024653 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_strans //! @{ //! simple transpose operation (no complex conjugates) for sparse matrices class spop_strans { public: template struct traits { static constexpr bool is_row = T1::is_col; // deliberately swapped static constexpr bool is_col = T1::is_row; static constexpr bool is_xvec = T1::is_xvec; }; template inline static void apply_noalias(SpMat& B, const SpMat& A); template inline static void apply(SpMat& out, const SpOp& in); template inline static void apply(SpMat& out, const SpOp& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/include_superlu.hpp0000644000176200001440000002333214124060717024310 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // ------------------------------------------------------------------------ // // This file includes portions of SuperLU 5.2 software, // licensed under the following conditions. // // Copyright (c) 2003, 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. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // (1) Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // (2) Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // (3) Neither the name of Lawrence Berkeley National Laboratory, U.S. Dept. of // Energy nor the names of its contributors may be used to endorse or promote // products derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE // OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // ------------------------------------------------------------------------ #if defined(ARMA_USE_SUPERLU) #if defined(ARMA_USE_SUPERLU_HEADERS) || defined(ARMA_SUPERLU_INCLUDE_DIR) // Since we need to suport float, double, cx_float and cx_double, // as well as preserve the sanity of the user, // we cannot simply include all the SuperLU headers due to their messy state // (duplicate definitions, pollution of global namespace, bizarro defines). // As such we are forced to include only a subset of the headers // and manually specify a few SuperLU structures and function prototypes. // // CAVEAT: // This code requires SuperLU version 5.2, // and assumes that newer 5.x versions will have no API changes. namespace arma { namespace superlu { // slu_*defs.h has int typedefed to int_t. // I'll just write it as int for simplicity, where I can, but supermatrix.h needs int_t. typedef int int_t; // Include supermatrix.h. This gives us SuperMatrix. // Put it in the slu namespace. // For versions of SuperLU I am familiar with, supermatrix.h does not include any other files. // Therefore, putting it in the superlu namespace is reasonably safe. // This same reasoning is true for superlu_enum_consts.h. #if defined(ARMA_SUPERLU_INCLUDE_DIR) #define ARMA_SLU_STR(x) x #define ARMA_SLU_STR2(x) ARMA_SLU_STR(x) #define ARMA_SLU_SUPERMATRIX_H ARMA_SLU_STR2(ARMA_SUPERLU_INCLUDE_DIR)ARMA_SLU_STR2(supermatrix.h) #define ARMA_SLU_SUPERLU_ENUM_CONSTS_H ARMA_SLU_STR2(ARMA_SUPERLU_INCLUDE_DIR)ARMA_SLU_STR2(superlu_enum_consts.h) #else #define ARMA_SLU_SUPERMATRIX_H supermatrix.h #define ARMA_SLU_SUPERLU_ENUM_CONSTS_H superlu_enum_consts.h #endif #include ARMA_INCFILE_WRAP(ARMA_SLU_SUPERMATRIX_H) #include ARMA_INCFILE_WRAP(ARMA_SLU_SUPERLU_ENUM_CONSTS_H) #undef ARMA_SLU_SUPERMATRIX_H #undef ARMA_SLU_SUPERLU_ENUM_CONSTS_H typedef struct { int* panel_histo; double* utime; float* ops; int TinyPivots; int RefineSteps; int expansions; } SuperLUStat_t; 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; double ILU_FillFactor; norm_t ILU_Norm; double ILU_FillTol; milu_t ILU_MILU; double ILU_MILU_Dim; yes_no_t ParSymbFact; yes_no_t ReplaceTinyPivot; yes_no_t SolveInitialized; yes_no_t RefineInitialized; yes_no_t PrintStat; int nnzL, nnzU; int num_lookaheads; yes_no_t lookahead_etree; yes_no_t SymPattern; } superlu_options_t; typedef struct { float for_lu; float total_needed; } mem_usage_t; typedef struct e_node { int size; void* mem; } ExpHeader; typedef struct { int size; int used; int top1; int top2; void* array; } LU_stack_t; typedef struct { int* xsup; int* supno; int* lsub; int* xlsub; void* lusup; int* xlusup; void* ucol; int* usub; int* xusub; int nzlmax; int nzumax; int nzlumax; int n; LU_space_t MemModel; int num_expansions; ExpHeader* expanders; LU_stack_t stack; } GlobalLU_t; } } #else // Not using any SuperLU headers, so define all required enums and structs. // // CAVEAT: // This code requires SuperLU version 5.2, // and assumes that newer 5.x versions will have no API changes. namespace arma { namespace superlu { typedef int int_t; typedef enum { SLU_NC, SLU_NCP, SLU_NR, SLU_SC, SLU_SCP, SLU_SR, SLU_DN, SLU_NR_loc } Stype_t; typedef enum { SLU_S, SLU_D, SLU_C, SLU_Z } Dtype_t; typedef enum { SLU_GE, SLU_TRLU, SLU_TRUU, SLU_TRL, SLU_TRU, SLU_SYL, SLU_SYU, SLU_HEL, SLU_HEU } Mtype_t; typedef struct { Stype_t Stype; Dtype_t Dtype; Mtype_t Mtype; int_t nrow; int_t ncol; void* Store; } SuperMatrix; typedef struct { int* panel_histo; double* utime; float* ops; int TinyPivots; int RefineSteps; int expansions; } SuperLUStat_t; 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 {NOREFINE, SLU_SINGLE=1, SLU_DOUBLE, SLU_EXTRA} IterRefine_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; 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; double ILU_FillFactor; norm_t ILU_Norm; double ILU_FillTol; milu_t ILU_MILU; double ILU_MILU_Dim; yes_no_t ParSymbFact; yes_no_t ReplaceTinyPivot; yes_no_t SolveInitialized; yes_no_t RefineInitialized; yes_no_t PrintStat; int nnzL, nnzU; int num_lookaheads; yes_no_t lookahead_etree; yes_no_t SymPattern; } superlu_options_t; typedef struct { float for_lu; float total_needed; } mem_usage_t; typedef struct { int_t nnz; void* nzval; int_t* rowind; int_t* colptr; } NCformat; typedef struct { int_t lda; void* nzval; } DNformat; typedef struct e_node { int size; void* mem; } ExpHeader; typedef struct { int size; int used; int top1; int top2; void* array; } LU_stack_t; typedef struct { int* xsup; int* supno; int* lsub; int* xlsub; void* lusup; int* xlusup; void* ucol; int* usub; int* xusub; int nzlmax; int nzumax; int nzlumax; int n; LU_space_t MemModel; int num_expansions; ExpHeader* expanders; LU_stack_t stack; } GlobalLU_t; } } #endif #endif RcppArmadillo/inst/include/armadillo_bits/BaseCube_meat.hpp0000644000176200001440000002251214124060717023564 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup BaseCube //! @{ template arma_inline const derived& BaseCube::get_ref() const { return static_cast(*this); } template arma_cold inline void BaseCube::print(const std::string extra_text) const { arma_extra_debug_sigprint(); const unwrap_cube tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = get_cout_stream().width(); get_cout_stream() << extra_text << '\n'; get_cout_stream().width(orig_width); } arma_ostream::print(get_cout_stream(), tmp.M, true); } template arma_cold inline void BaseCube::print(std::ostream& user_stream, const std::string extra_text) const { arma_extra_debug_sigprint(); const unwrap_cube tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = user_stream.width(); user_stream << extra_text << '\n'; user_stream.width(orig_width); } arma_ostream::print(user_stream, tmp.M, true); } template arma_cold inline void BaseCube::raw_print(const std::string extra_text) const { arma_extra_debug_sigprint(); const unwrap_cube tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = get_cout_stream().width(); get_cout_stream() << extra_text << '\n'; get_cout_stream().width(orig_width); } arma_ostream::print(get_cout_stream(), tmp.M, false); } template arma_cold inline void BaseCube::raw_print(std::ostream& user_stream, const std::string extra_text) const { arma_extra_debug_sigprint(); const unwrap_cube tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = user_stream.width(); user_stream << extra_text << '\n'; user_stream.width(orig_width); } arma_ostream::print(user_stream, tmp.M, false); } template arma_cold inline void BaseCube::brief_print(const std::string extra_text) const { arma_extra_debug_sigprint(); const unwrap_cube tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = get_cout_stream().width(); get_cout_stream() << extra_text << '\n'; get_cout_stream().width(orig_width); } arma_ostream::brief_print(get_cout_stream(), tmp.M); } template arma_cold inline void BaseCube::brief_print(std::ostream& user_stream, const std::string extra_text) const { arma_extra_debug_sigprint(); const unwrap_cube tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = user_stream.width(); user_stream << extra_text << '\n'; user_stream.width(orig_width); } arma_ostream::brief_print(user_stream, tmp.M); } template inline arma_warn_unused elem_type BaseCube::min() const { return op_min::min( (*this).get_ref() ); } template inline arma_warn_unused elem_type BaseCube::max() const { return op_max::max( (*this).get_ref() ); } template inline arma_warn_unused uword BaseCube::index_min() const { const ProxyCube P( (*this).get_ref() ); uword index = 0; if(P.get_n_elem() == 0) { arma_debug_check(true, "index_min(): object has no elements"); } else { op_min::min_with_index(P, index); } return index; } template inline arma_warn_unused uword BaseCube::index_max() const { const ProxyCube P( (*this).get_ref() ); uword index = 0; if(P.get_n_elem() == 0) { arma_debug_check(true, "index_max(): object has no elements"); } else { op_max::max_with_index(P, index); } return index; } template inline arma_warn_unused bool BaseCube::is_zero(const typename get_pod_type::result tol) const { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; arma_debug_check( (tol < T(0)), "is_zero(): parameter 'tol' must be >= 0" ); if(ProxyCube::use_at || is_Cube::stored_type>::value) { const unwrap_cube U( (*this).get_ref() ); return arrayops::is_zero( U.M.memptr(), U.M.n_elem, tol ); } const ProxyCube P( (*this).get_ref() ); const uword n_elem = P.get_n_elem(); if(n_elem == 0) { return false; } const typename ProxyCube::ea_type Pea = P.get_ea(); if(is_cx::yes) { for(uword i=0; i tol) { return false; } if(eop_aux::arma_abs(val_imag) > tol) { return false; } } } else // not complex { for(uword i=0; i < n_elem; ++i) { if(eop_aux::arma_abs(Pea[i]) > tol) { return false; } } } return true; } template inline arma_warn_unused bool BaseCube::is_empty() const { arma_extra_debug_sigprint(); const ProxyCube P( (*this).get_ref() ); return (P.get_n_elem() == uword(0)); } template inline arma_warn_unused bool BaseCube::is_finite() const { arma_extra_debug_sigprint(); const ProxyCube P( (*this).get_ref() ); if(is_Cube::stored_type>::value) { const unwrap_cube::stored_type> U(P.Q); return arrayops::is_finite( U.M.memptr(), U.M.n_elem ); } const uword n_r = P.get_n_rows(); const uword n_c = P.get_n_cols(); const uword n_s = P.get_n_slices(); for(uword s=0; s inline arma_warn_unused bool BaseCube::has_inf() const { arma_extra_debug_sigprint(); const ProxyCube P( (*this).get_ref() ); if(is_Cube::stored_type>::value) { const unwrap_cube::stored_type> U(P.Q); return arrayops::has_inf( U.M.memptr(), U.M.n_elem ); } const uword n_r = P.get_n_rows(); const uword n_c = P.get_n_cols(); const uword n_s = P.get_n_slices(); for(uword s=0; s inline arma_warn_unused bool BaseCube::has_nan() const { arma_extra_debug_sigprint(); const ProxyCube P( (*this).get_ref() ); if(is_Cube::stored_type>::value) { const unwrap_cube::stored_type> U(P.Q); return arrayops::has_nan( U.M.memptr(), U.M.n_elem ); } const uword n_r = P.get_n_rows(); const uword n_c = P.get_n_cols(); const uword n_s = P.get_n_slices(); for(uword s=0; s arma_inline arma_warn_unused const derived& BaseCube_eval_Cube::eval() const { arma_extra_debug_sigprint(); return static_cast(*this); } // // extra functions defined in BaseCube_eval_expr template inline arma_warn_unused Cube BaseCube_eval_expr::eval() const { arma_extra_debug_sigprint(); return Cube( static_cast(*this) ); } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_reverse_meat.hpp0000644000176200001440000001001714124060717024624 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_reverse //! @{ template inline void spop_reverse::apply_spmat(SpMat& out, const SpMat& X, const uword dim) { arma_extra_debug_sigprint(); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword X_n_rows_m1 = X_n_rows - 1; const uword X_n_cols_m1 = X_n_cols - 1; const uword N = X.n_nonzero; if(N == uword(0)) { out.zeros(X_n_rows, X_n_cols); return; } umat locs(2, N, arma_nozeros_indicator()); uword* locs_mem = locs.memptr(); typename SpMat::const_iterator it = X.begin(); if(dim == 0) { for(uword i=0; i < N; ++i) { const uword row = it.row(); const uword col = it.col(); (*locs_mem) = X_n_rows_m1 - row; locs_mem++; (*locs_mem) = col; locs_mem++; ++it; } } else if(dim == 1) { for(uword i=0; i < N; ++i) { const uword row = it.row(); const uword col = it.col(); (*locs_mem) = row; locs_mem++; (*locs_mem) = X_n_cols_m1 - col; locs_mem++; ++it; } } const Col vals(const_cast(X.values), N, false); SpMat tmp(locs, vals, X_n_rows, X_n_cols, true, false); out.steal_mem(tmp); } template inline void spop_reverse::apply_proxy(SpMat& out, const T1& X, const uword dim) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const SpProxy P(X); const uword P_n_rows = P.get_n_rows(); const uword P_n_cols = P.get_n_cols(); const uword P_n_rows_m1 = P_n_rows - 1; const uword P_n_cols_m1 = P_n_cols - 1; const uword N = P.get_n_nonzero(); if(N == uword(0)) { out.zeros(P_n_rows, P_n_cols); return; } umat locs(2, N, arma_nozeros_indicator()); Col vals( N, arma_nozeros_indicator()); uword* locs_mem = locs.memptr(); eT* vals_mem = vals.memptr(); typename SpProxy::const_iterator_type it = P.begin(); if(dim == 0) { for(uword i=0; i < N; ++i) { const uword row = it.row(); const uword col = it.col(); (*locs_mem) = P_n_rows_m1 - row; locs_mem++; (*locs_mem) = col; locs_mem++; (*vals_mem) = (*it); vals_mem++; ++it; } } else if(dim == 1) { for(uword i=0; i < N; ++i) { const uword row = it.row(); const uword col = it.col(); (*locs_mem) = row; locs_mem++; (*locs_mem) = P_n_cols_m1 - col; locs_mem++; (*vals_mem) = (*it); vals_mem++; ++it; } } SpMat tmp(locs, vals, P_n_rows, P_n_cols, true, false); out.steal_mem(tmp); } template inline void spop_reverse::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "reverse(): parameter 'dim' must be 0 or 1" ); if(is_SpMat::value) { const unwrap_spmat tmp(in.m); spop_reverse::apply_spmat(out, tmp.M, dim); } else { spop_reverse::apply_proxy(out, in.m, dim); } } //! @} RcppArmadillo/inst/include/armadillo_bits/op_sort_meat.hpp0000644000176200001440000001225514124060717023603 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_sort //! @{ template inline void op_sort::direct_sort(eT* X, const uword n_elem, const uword sort_type) { arma_extra_debug_sigprint(); if(sort_type == 0) { arma_lt_comparator comparator; std::sort(&X[0], &X[n_elem], comparator); } else { arma_gt_comparator comparator; std::sort(&X[0], &X[n_elem], comparator); } } template inline void op_sort::direct_sort_ascending(eT* X, const uword n_elem) { arma_extra_debug_sigprint(); arma_lt_comparator comparator; std::sort(&X[0], &X[n_elem], comparator); } template inline void op_sort::copy_row(eT* X, const Mat& A, const uword row) { const uword N = A.n_cols; uword i,j; for(i=0, j=1; j inline void op_sort::copy_row(Mat& A, const eT* X, const uword row) { const uword N = A.n_cols; uword i,j; for(i=0, j=1; j inline void op_sort::apply_noalias(Mat& out, const Mat& X, const uword sort_type, const uword dim) { arma_extra_debug_sigprint(); if((X.n_rows * X.n_cols) <= 1) { out = X; return; } if(dim == 0) // sort the contents of each column { arma_extra_debug_print("op_sort::apply(): dim = 0"); out = X; const uword n_rows = out.n_rows; const uword n_cols = out.n_cols; for(uword col=0; col < n_cols; ++col) { op_sort::direct_sort( out.colptr(col), n_rows, sort_type ); } } else if(dim == 1) // sort the contents of each row { if(X.n_rows == 1) // a row vector { arma_extra_debug_print("op_sort::apply(): dim = 1, vector specific"); out = X; op_sort::direct_sort(out.memptr(), out.n_elem, sort_type); } else // not a row vector { arma_extra_debug_print("op_sort::apply(): dim = 1, generic"); out.copy_size(X); const uword n_rows = out.n_rows; const uword n_cols = out.n_cols; podarray tmp_array(n_cols); for(uword row=0; row < n_rows; ++row) { op_sort::copy_row(tmp_array.memptr(), X, row); op_sort::direct_sort( tmp_array.memptr(), n_cols, sort_type ); op_sort::copy_row(out, tmp_array.memptr(), row); } } } } template inline void op_sort::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap U(in.m); const Mat& X = U.M; const uword sort_type = in.aux_uword_a; const uword dim = in.aux_uword_b; arma_debug_check( (sort_type > 1), "sort(): parameter 'sort_type' must be 0 or 1" ); arma_debug_check( (dim > 1), "sort(): parameter 'dim' must be 0 or 1" ); arma_debug_check( (X.has_nan()), "sort(): detected NaN" ); if(U.is_alias(out)) { Mat tmp; op_sort::apply_noalias(tmp, X, sort_type, dim); out.steal_mem(tmp); } else { op_sort::apply_noalias(out, X, sort_type, dim); } } template inline void op_sort_vec::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap U(in.m); // not using quasi_unwrap, to ensure there is no aliasing with subviews const Mat& X = U.M; const uword sort_type = in.aux_uword_a; arma_debug_check( (sort_type > 1), "sort(): parameter 'sort_type' must be 0 or 1" ); arma_debug_check( (X.has_nan()), "sort(): detected NaN" ); out = X; // not checking for aliasing, to allow inplace sorting of vectors if(out.n_elem <= 1) { return; } eT* out_mem = out.memptr(); eT* start_ptr = out_mem; eT* endp1_ptr = &out_mem[out.n_elem]; if(sort_type == 0) { arma_lt_comparator comparator; std::sort(start_ptr, endp1_ptr, comparator); } else { arma_gt_comparator comparator; std::sort(start_ptr, endp1_ptr, comparator); } } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_shift.hpp0000644000176200001440000000407114124060717022705 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_shift //! @{ template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && resolves_to_vector::yes, const Op >::result shift ( const T1& X, const sword N ) { arma_extra_debug_sigprint(); const uword len = (N < 0) ? uword(-N) : uword(N); const uword neg = (N < 0) ? uword( 1) : uword(0); return Op(X, len, neg, uword(0), 'j'); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && resolves_to_vector::no, const Op >::result shift ( const T1& X, const sword N ) { arma_extra_debug_sigprint(); const uword len = (N < 0) ? uword(-N) : uword(N); const uword neg = (N < 0) ? uword( 1) : uword(0); return Op(X, len, neg, uword(0), 'j'); } template arma_warn_unused arma_inline typename enable_if2 < (is_arma_type::value), const Op >::result shift ( const T1& X, const sword N, const uword dim ) { arma_extra_debug_sigprint(); const uword len = (N < 0) ? uword(-N) : uword(N); const uword neg = (N < 0) ? uword( 1) : uword(0); return Op(X, len, neg, dim, 'j'); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_rank.hpp0000644000176200001440000000315414160256234022525 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_rank //! @{ template arma_warn_unused inline typename enable_if2< is_supported_blas_type::value, uword >::result rank(const Base& expr, const typename T1::pod_type tol = 0) { arma_extra_debug_sigprint(); uword out = uword(0); const bool status = op_rank::apply(out, expr.get_ref(), tol); if(status == false) { arma_stop_runtime_error("rank(): failed"); return uword(0); } return out; } template inline typename enable_if2< is_supported_blas_type::value, bool >::result rank(uword& out, const Base& expr, const typename T1::pod_type tol = 0) { arma_extra_debug_sigprint(); out = uword(0); return op_rank::apply(out, expr.get_ref(), tol); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_trace.hpp0000644000176200001440000003774314124060717022702 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_trace //! @{ template arma_warn_unused inline typename T1::elem_type trace(const Base& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy P(X.get_ref()); const uword N = (std::min)(P.get_n_rows(), P.get_n_cols()); eT val1 = eT(0); eT val2 = eT(0); uword i,j; for(i=0, j=1; j arma_warn_unused inline typename T1::elem_type trace(const Op& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const diagmat_proxy A(X.m); const uword N = (std::min)(A.n_rows, A.n_cols); eT val = eT(0); for(uword i=0; i arma_warn_unused inline typename enable_if2< is_cx::no, typename T1::elem_type>::result trace(const Glue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const partial_unwrap tmp1(X.A); const partial_unwrap tmp2(X.B); const typename partial_unwrap::stored_type& A = tmp1.M; const typename partial_unwrap::stored_type& B = tmp2.M; const bool use_alpha = partial_unwrap::do_times || partial_unwrap::do_times; const eT alpha = use_alpha ? (tmp1.get_val() * tmp2.get_val()) : eT(0); arma_debug_assert_trans_mul_size< partial_unwrap::do_trans, partial_unwrap::do_trans >(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "matrix multiplication"); if( (A.n_elem == 0) || (B.n_elem == 0) ) { return eT(0); } const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; eT acc = eT(0); if( (partial_unwrap::do_trans == false) && (partial_unwrap::do_trans == false) ) { const uword N = (std::min)(A_n_rows, B_n_cols); eT acc1 = eT(0); eT acc2 = eT(0); for(uword k=0; k < N; ++k) { const eT* B_colptr = B.colptr(k); // condition: A_n_cols = B_n_rows uword j; for(j=1; j < A_n_cols; j+=2) { const uword i = (j-1); const eT tmp_i = B_colptr[i]; const eT tmp_j = B_colptr[j]; acc1 += A.at(k, i) * tmp_i; acc2 += A.at(k, j) * tmp_j; } const uword i = (j-1); if(i < A_n_cols) { acc1 += A.at(k, i) * B_colptr[i]; } } acc = (acc1 + acc2); } else if( (partial_unwrap::do_trans == true ) && (partial_unwrap::do_trans == false) ) { const uword N = (std::min)(A_n_cols, B_n_cols); for(uword k=0; k < N; ++k) { const eT* A_colptr = A.colptr(k); const eT* B_colptr = B.colptr(k); // condition: A_n_rows = B_n_rows acc += op_dot::direct_dot(A_n_rows, A_colptr, B_colptr); } } else if( (partial_unwrap::do_trans == false) && (partial_unwrap::do_trans == true ) ) { const uword N = (std::min)(A_n_rows, B_n_rows); for(uword k=0; k < N; ++k) { // condition: A_n_cols = B_n_cols for(uword i=0; i < A_n_cols; ++i) { acc += A.at(k,i) * B.at(k,i); } } } else if( (partial_unwrap::do_trans == true ) && (partial_unwrap::do_trans == true ) ) { const uword N = (std::min)(A_n_cols, B_n_rows); for(uword k=0; k < N; ++k) { const eT* A_colptr = A.colptr(k); // condition: A_n_rows = B_n_cols for(uword i=0; i < A_n_rows; ++i) { acc += A_colptr[i] * B.at(k,i); } } } return (use_alpha) ? (alpha * acc) : acc; } //! speedup for trace(A*B); complex elements template arma_warn_unused inline typename enable_if2< is_cx::yes, typename T1::elem_type>::result trace(const Glue& X) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; typedef typename T1::elem_type eT; const partial_unwrap tmp1(X.A); const partial_unwrap tmp2(X.B); const typename partial_unwrap::stored_type& A = tmp1.M; const typename partial_unwrap::stored_type& B = tmp2.M; const bool use_alpha = partial_unwrap::do_times || partial_unwrap::do_times; const eT alpha = use_alpha ? (tmp1.get_val() * tmp2.get_val()) : eT(0); arma_debug_assert_trans_mul_size< partial_unwrap::do_trans, partial_unwrap::do_trans >(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "matrix multiplication"); if( (A.n_elem == 0) || (B.n_elem == 0) ) { return eT(0); } const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; eT acc = eT(0); if( (partial_unwrap::do_trans == false) && (partial_unwrap::do_trans == false) ) { const uword N = (std::min)(A_n_rows, B_n_cols); T acc_real = T(0); T acc_imag = T(0); for(uword k=0; k < N; ++k) { const eT* B_colptr = B.colptr(k); // condition: A_n_cols = B_n_rows for(uword i=0; i < A_n_cols; ++i) { // acc += A.at(k, i) * B_colptr[i]; const std::complex& xx = A.at(k, i); const std::complex& yy = B_colptr[i]; const T a = xx.real(); const T b = xx.imag(); const T c = yy.real(); const T d = yy.imag(); acc_real += (a*c) - (b*d); acc_imag += (a*d) + (b*c); } } acc = std::complex(acc_real, acc_imag); } else if( (partial_unwrap::do_trans == true) && (partial_unwrap::do_trans == false) ) { const uword N = (std::min)(A_n_cols, B_n_cols); T acc_real = T(0); T acc_imag = T(0); for(uword k=0; k < N; ++k) { const eT* A_colptr = A.colptr(k); const eT* B_colptr = B.colptr(k); // condition: A_n_rows = B_n_rows for(uword i=0; i < A_n_rows; ++i) { // acc += std::conj(A_colptr[i]) * B_colptr[i]; const std::complex& xx = A_colptr[i]; const std::complex& yy = B_colptr[i]; const T a = xx.real(); const T b = xx.imag(); const T c = yy.real(); const T d = yy.imag(); // take into account the complex conjugate of xx acc_real += (a*c) + (b*d); acc_imag += (a*d) - (b*c); } } acc = std::complex(acc_real, acc_imag); } else if( (partial_unwrap::do_trans == false) && (partial_unwrap::do_trans == true) ) { const uword N = (std::min)(A_n_rows, B_n_rows); T acc_real = T(0); T acc_imag = T(0); for(uword k=0; k < N; ++k) { // condition: A_n_cols = B_n_cols for(uword i=0; i < A_n_cols; ++i) { // acc += A.at(k,i) * std::conj(B.at(k,i)); const std::complex& xx = A.at(k, i); const std::complex& yy = B.at(k, i); const T a = xx.real(); const T b = xx.imag(); const T c = yy.real(); const T d = -yy.imag(); // take the conjugate acc_real += (a*c) - (b*d); acc_imag += (a*d) + (b*c); } } acc = std::complex(acc_real, acc_imag); } else if( (partial_unwrap::do_trans == true) && (partial_unwrap::do_trans == true) ) { const uword N = (std::min)(A_n_cols, B_n_rows); T acc_real = T(0); T acc_imag = T(0); for(uword k=0; k < N; ++k) { const eT* A_colptr = A.colptr(k); // condition: A_n_rows = B_n_cols for(uword i=0; i < A_n_rows; ++i) { // acc += std::conj(A_colptr[i]) * std::conj(B.at(k,i)); const std::complex& xx = A_colptr[i]; const std::complex& yy = B.at(k, i); const T a = xx.real(); const T b = -xx.imag(); // take the conjugate const T c = yy.real(); const T d = -yy.imag(); // take the conjugate acc_real += (a*c) - (b*d); acc_imag += (a*d) + (b*c); } } acc = std::complex(acc_real, acc_imag); } return (use_alpha) ? eT(alpha * acc) : eT(acc); } //! trace of sparse object; generic version template arma_warn_unused inline typename T1::elem_type trace(const SpBase& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const SpProxy P(expr.get_ref()); const uword N = (std::min)(P.get_n_rows(), P.get_n_cols()); eT acc = eT(0); if( (is_SpMat::stored_type>::value) && (P.get_n_nonzero() >= 5*N) ) { const unwrap_spmat::stored_type> U(P.Q); const SpMat& X = U.M; for(uword i=0; i < N; ++i) { acc += X.at(i,i); // use binary search } } else { typename SpProxy::const_iterator_type it = P.begin(); const uword P_n_nz = P.get_n_nonzero(); for(uword i=0; i < P_n_nz; ++i) { if(it.row() == it.col()) { acc += (*it); } ++it; } } return acc; } //! trace of sparse object; speedup for trace(A + B) template arma_warn_unused inline typename T1::elem_type trace(const SpGlue& expr) { arma_extra_debug_sigprint(); const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); arma_debug_assert_same_size(UA.M.n_rows, UA.M.n_cols, UB.M.n_rows, UB.M.n_cols, "addition"); return (trace(UA.M) + trace(UB.M)); } //! trace of sparse object; speedup for trace(A - B) template arma_warn_unused inline typename T1::elem_type trace(const SpGlue& expr) { arma_extra_debug_sigprint(); const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); arma_debug_assert_same_size(UA.M.n_rows, UA.M.n_cols, UB.M.n_rows, UB.M.n_cols, "subtraction"); return (trace(UA.M) - trace(UB.M)); } //! trace of sparse object; speedup for trace(A % B) template arma_warn_unused inline typename T1::elem_type trace(const SpGlue& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; arma_debug_assert_same_size(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "element-wise multiplication"); const uword N = (std::min)(A.n_rows, A.n_cols); eT acc = eT(0); for(uword i=0; i arma_warn_unused inline typename T1::elem_type trace(const SpGlue& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // better-than-nothing implementation const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; arma_debug_assert_mul_size(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "matrix multiplication"); if( (A.n_nonzero == 0) || (B.n_nonzero == 0) ) { return eT(0); } const uword N = (std::min)(A.n_rows, B.n_cols); eT acc = eT(0); // TODO: the threshold may need tuning for complex matrices if( (A.n_nonzero >= 5*N) || (B.n_nonzero >= 5*N) ) { for(uword k=0; k < N; ++k) { typename SpMat::const_col_iterator B_it = B.begin_col_no_sync(k); typename SpMat::const_col_iterator B_it_end = B.end_col_no_sync(k); while(B_it != B_it_end) { const eT B_val = (*B_it); const uword i = B_it.row(); acc += A.at(k,i) * B_val; ++B_it; } } } else { const SpMat AB = A * B; acc = trace(AB); } return acc; } //! trace of sparse object; speedup for trace(A.t()*B); non-complex elements template arma_warn_unused inline typename enable_if2< is_cx::no, typename T1::elem_type>::result trace(const SpGlue, T2, spglue_times>& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat UA(expr.A.m); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; // NOTE: deliberately swapped A.n_rows and A.n_cols to take into account the requested transpose operation arma_debug_assert_mul_size(A.n_cols, A.n_rows, B.n_rows, B.n_cols, "matrix multiplication"); if( (A.n_nonzero == 0) || (B.n_nonzero == 0) ) { return eT(0); } const uword N = (std::min)(A.n_cols, B.n_cols); eT acc = eT(0); if( (A.n_nonzero >= 5*N) || (B.n_nonzero >= 5*N) ) { for(uword k=0; k < N; ++k) { typename SpMat::const_col_iterator B_it = B.begin_col_no_sync(k); typename SpMat::const_col_iterator B_it_end = B.end_col_no_sync(k); while(B_it != B_it_end) { const eT B_val = (*B_it); const uword i = B_it.row(); acc += A.at(i,k) * B_val; ++B_it; } } } else { const SpMat AtB = A.t() * B; acc = trace(AtB); } return acc; } //! trace of sparse object; speedup for trace(A.t()*B); complex elements template arma_warn_unused inline typename enable_if2< is_cx::yes, typename T1::elem_type>::result trace(const SpGlue, T2, spglue_times>& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat UA(expr.A.m); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; // NOTE: deliberately swapped A.n_rows and A.n_cols to take into account the requested transpose operation arma_debug_assert_mul_size(A.n_cols, A.n_rows, B.n_rows, B.n_cols, "matrix multiplication"); if( (A.n_nonzero == 0) || (B.n_nonzero == 0) ) { return eT(0); } const uword N = (std::min)(A.n_cols, B.n_cols); eT acc = eT(0); // TODO: the threshold may need tuning for complex matrices if( (A.n_nonzero >= 5*N) || (B.n_nonzero >= 5*N) ) { for(uword k=0; k < N; ++k) { typename SpMat::const_col_iterator B_it = B.begin_col_no_sync(k); typename SpMat::const_col_iterator B_it_end = B.end_col_no_sync(k); while(B_it != B_it_end) { const eT B_val = (*B_it); const uword i = B_it.row(); acc += std::conj(A.at(i,k)) * B_val; ++B_it; } } } else { const SpMat AtB = A.t() * B; acc = trace(AtB); } return acc; } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_trapz_bones.hpp0000644000176200001440000000313514124060717024447 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_trapz //! @{ class glue_trapz { public: template struct traits { static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = true; }; template inline static void apply(Mat& out, const Glue& in); template inline static void apply_noalias(Mat& out, const Mat& X, const Mat& Y, const uword dim); }; class op_trapz : public traits_op_xvec { public: template inline static void apply(Mat& out, const Op& in); template inline static void apply_noalias(Mat& out, const Mat& Y, const uword dim); }; //! @} RcppArmadillo/inst/include/armadillo_bits/Cube_bones.hpp0000644000176200001440000006437414160256234023166 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup Cube //! @{ struct Cube_prealloc { static constexpr uword mat_ptrs_size = 4; static constexpr uword mem_n_elem = 64; }; //! Dense cube class template class Cube : public BaseCube< eT, Cube > { public: typedef eT elem_type; //!< the type of elements stored in the cube typedef typename get_pod_type::result pod_type; //!< if eT is std::complex, pod_type is T; otherwise pod_type is eT const uword n_rows; //!< number of rows in each slice (read-only) const uword n_cols; //!< number of columns in each slice (read-only) const uword n_elem_slice; //!< number of elements in each slice (read-only) const uword n_slices; //!< number of slices in the cube (read-only) const uword n_elem; //!< number of elements in the cube (read-only) const uword n_alloc; //!< number of allocated elements (read-only); NOTE: n_alloc can be 0, even if n_elem > 0 const uword mem_state; // mem_state = 0: normal cube which manages its own memory // mem_state = 1: use auxiliary memory until a size change // mem_state = 2: use auxiliary memory and don't allow the number of elements to be changed // mem_state = 3: fixed size (eg. via template based size specification) arma_aligned const eT* const mem; //!< pointer to the memory used for storing elements (memory is read-only) protected: arma_aligned const Mat** const mat_ptrs; arma_align_mem Mat* mat_ptrs_local[ Cube_prealloc::mat_ptrs_size ]; arma_align_mem eT mem_local[ Cube_prealloc::mem_n_elem ]; // local storage, for small cubes public: inline ~Cube(); inline Cube(); inline explicit Cube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices); inline explicit Cube(const SizeCube& s); template inline explicit Cube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices, const arma_initmode_indicator&); template inline explicit Cube(const SizeCube& s, const arma_initmode_indicator&); template inline Cube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices, const fill::fill_class& f); template inline Cube(const SizeCube& s, const fill::fill_class& f); inline Cube(const uword in_rows, const uword in_cols, const uword in_slices, const fill::scalar_holder f); inline Cube(const SizeCube& s, const fill::scalar_holder f); inline Cube(Cube&& m); inline Cube& operator=(Cube&& m); inline Cube( eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const uword aux_n_slices, const bool copy_aux_mem = true, const bool strict = false, const bool prealloc_mat = false); inline Cube(const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const uword aux_n_slices); inline Cube& operator= (const eT val); inline Cube& operator+=(const eT val); inline Cube& operator-=(const eT val); inline Cube& operator*=(const eT val); inline Cube& operator/=(const eT val); inline Cube(const Cube& m); inline Cube& operator= (const Cube& m); inline Cube& operator+=(const Cube& m); inline Cube& operator-=(const Cube& m); inline Cube& operator%=(const Cube& m); inline Cube& operator/=(const Cube& m); template inline explicit Cube(const BaseCube& A, const BaseCube& B); inline Cube(const subview_cube& X); inline Cube& operator= (const subview_cube& X); inline Cube& operator+=(const subview_cube& X); inline Cube& operator-=(const subview_cube& X); inline Cube& operator%=(const subview_cube& X); inline Cube& operator/=(const subview_cube& X); template inline Cube(const subview_cube_slices& X); template inline Cube& operator= (const subview_cube_slices& X); template inline Cube& operator+=(const subview_cube_slices& X); template inline Cube& operator-=(const subview_cube_slices& X); template inline Cube& operator%=(const subview_cube_slices& X); template inline Cube& operator/=(const subview_cube_slices& X); arma_inline subview_cube row(const uword in_row); arma_inline const subview_cube row(const uword in_row) const; arma_inline subview_cube col(const uword in_col); arma_inline const subview_cube col(const uword in_col) const; inline Mat& slice(const uword in_slice); inline const Mat& slice(const uword in_slice) const; arma_inline subview_cube rows(const uword in_row1, const uword in_row2); arma_inline const subview_cube rows(const uword in_row1, const uword in_row2) const; arma_inline subview_cube cols(const uword in_col1, const uword in_col2); arma_inline const subview_cube cols(const uword in_col1, const uword in_col2) const; arma_inline subview_cube slices(const uword in_slice1, const uword in_slice2); arma_inline const subview_cube slices(const uword in_slice1, const uword in_slice2) const; arma_inline subview_cube subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2); arma_inline const subview_cube subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2) const; inline subview_cube subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s); inline const subview_cube subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const; inline subview_cube subcube(const span& row_span, const span& col_span, const span& slice_span); inline const subview_cube subcube(const span& row_span, const span& col_span, const span& slice_span) const; inline subview_cube operator()(const span& row_span, const span& col_span, const span& slice_span); inline const subview_cube operator()(const span& row_span, const span& col_span, const span& slice_span) const; inline subview_cube operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s); inline const subview_cube operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const; arma_inline subview_cube tube(const uword in_row1, const uword in_col1); arma_inline const subview_cube tube(const uword in_row1, const uword in_col1) const; arma_inline subview_cube tube(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2); arma_inline const subview_cube tube(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const; arma_inline subview_cube tube(const uword in_row1, const uword in_col1, const SizeMat& s); arma_inline const subview_cube tube(const uword in_row1, const uword in_col1, const SizeMat& s) const; inline subview_cube tube(const span& row_span, const span& col_span); inline const subview_cube tube(const span& row_span, const span& col_span) const; inline subview_cube head_slices(const uword N); inline const subview_cube head_slices(const uword N) const; inline subview_cube tail_slices(const uword N); inline const subview_cube tail_slices(const uword N) const; template arma_inline subview_elem1 elem(const Base& a); template arma_inline const subview_elem1 elem(const Base& a) const; template arma_inline subview_elem1 operator()(const Base& a); template arma_inline const subview_elem1 operator()(const Base& a) const; arma_inline subview_cube_each1 each_slice(); arma_inline const subview_cube_each1 each_slice() const; template inline subview_cube_each2 each_slice(const Base& indices); template inline const subview_cube_each2 each_slice(const Base& indices) const; inline const Cube& each_slice(const std::function< void( Mat&) >& F); inline const Cube& each_slice(const std::function< void(const Mat&) >& F) const; inline const Cube& each_slice(const std::function< void( Mat&) >& F, const bool use_mp); inline const Cube& each_slice(const std::function< void(const Mat&) >& F, const bool use_mp) const; template arma_inline subview_cube_slices slices(const Base& indices); template arma_inline const subview_cube_slices slices(const Base& indices) const; inline void shed_row(const uword row_num); inline void shed_col(const uword col_num); inline void shed_slice(const uword slice_num); inline void shed_rows(const uword in_row1, const uword in_row2); inline void shed_cols(const uword in_col1, const uword in_col2); inline void shed_slices(const uword in_slice1, const uword in_slice2); template inline void shed_slices(const Base& indices); inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero = true); inline void insert_cols(const uword row_num, const uword N, const bool set_to_zero = true); inline void insert_slices(const uword slice_num, const uword N, const bool set_to_zero = true); template inline void insert_rows(const uword row_num, const BaseCube& X); template inline void insert_cols(const uword col_num, const BaseCube& X); template inline void insert_slices(const uword slice_num, const BaseCube& X); template inline Cube(const GenCube& X); template inline Cube& operator= (const GenCube& X); template inline Cube& operator+=(const GenCube& X); template inline Cube& operator-=(const GenCube& X); template inline Cube& operator%=(const GenCube& X); template inline Cube& operator/=(const GenCube& X); template inline Cube(const OpCube& X); template inline Cube& operator= (const OpCube& X); template inline Cube& operator+=(const OpCube& X); template inline Cube& operator-=(const OpCube& X); template inline Cube& operator%=(const OpCube& X); template inline Cube& operator/=(const OpCube& X); template inline Cube(const eOpCube& X); template inline Cube& operator= (const eOpCube& X); template inline Cube& operator+=(const eOpCube& X); template inline Cube& operator-=(const eOpCube& X); template inline Cube& operator%=(const eOpCube& X); template inline Cube& operator/=(const eOpCube& X); template inline Cube(const mtOpCube& X); template inline Cube& operator= (const mtOpCube& X); template inline Cube& operator+=(const mtOpCube& X); template inline Cube& operator-=(const mtOpCube& X); template inline Cube& operator%=(const mtOpCube& X); template inline Cube& operator/=(const mtOpCube& X); template inline Cube(const GlueCube& X); template inline Cube& operator= (const GlueCube& X); template inline Cube& operator+=(const GlueCube& X); template inline Cube& operator-=(const GlueCube& X); template inline Cube& operator%=(const GlueCube& X); template inline Cube& operator/=(const GlueCube& X); template inline Cube(const eGlueCube& X); template inline Cube& operator= (const eGlueCube& X); template inline Cube& operator+=(const eGlueCube& X); template inline Cube& operator-=(const eGlueCube& X); template inline Cube& operator%=(const eGlueCube& X); template inline Cube& operator/=(const eGlueCube& X); template inline Cube(const mtGlueCube& X); template inline Cube& operator= (const mtGlueCube& X); template inline Cube& operator+=(const mtGlueCube& X); template inline Cube& operator-=(const mtGlueCube& X); template inline Cube& operator%=(const mtGlueCube& X); template inline Cube& operator/=(const mtGlueCube& X); arma_inline arma_warn_unused const eT& at_alt (const uword i) const; arma_inline arma_warn_unused eT& operator[] (const uword i); arma_inline arma_warn_unused const eT& operator[] (const uword i) const; arma_inline arma_warn_unused eT& at(const uword i); arma_inline arma_warn_unused const eT& at(const uword i) const; arma_inline arma_warn_unused eT& operator() (const uword i); arma_inline arma_warn_unused const eT& operator() (const uword i) const; arma_inline arma_warn_unused eT& at (const uword in_row, const uword in_col, const uword in_slice); arma_inline arma_warn_unused const eT& at (const uword in_row, const uword in_col, const uword in_slice) const; arma_inline arma_warn_unused eT& operator() (const uword in_row, const uword in_col, const uword in_slice); arma_inline arma_warn_unused const eT& operator() (const uword in_row, const uword in_col, const uword in_slice) const; arma_inline const Cube& operator++(); arma_inline void operator++(int); arma_inline const Cube& operator--(); arma_inline void operator--(int); inline arma_warn_unused bool is_finite() const; arma_inline arma_warn_unused bool is_empty() const; inline arma_warn_unused bool has_inf() const; inline arma_warn_unused bool has_nan() const; arma_inline arma_warn_unused bool in_range(const uword i) const; arma_inline arma_warn_unused bool in_range(const span& x) const; arma_inline arma_warn_unused bool in_range(const uword in_row, const uword in_col, const uword in_slice) const; inline arma_warn_unused bool in_range(const span& row_span, const span& col_span, const span& slice_span) const; inline arma_warn_unused bool in_range(const uword in_row, const uword in_col, const uword in_slice, const SizeCube& s) const; arma_inline arma_warn_unused eT* memptr(); arma_inline arma_warn_unused const eT* memptr() const; arma_inline arma_warn_unused eT* slice_memptr(const uword slice); arma_inline arma_warn_unused const eT* slice_memptr(const uword slice) const; arma_inline arma_warn_unused eT* slice_colptr(const uword in_slice, const uword in_col); arma_inline arma_warn_unused const eT* slice_colptr(const uword in_slice, const uword in_col) const; inline void set_size(const uword new_n_rows, const uword new_n_cols, const uword new_n_slices); inline void set_size(const SizeCube& s); inline void reshape(const uword new_n_rows, const uword new_n_cols, const uword new_n_slices); inline void reshape(const SizeCube& s); inline void resize(const uword new_n_rows, const uword new_n_cols, const uword new_n_slices); inline void resize(const SizeCube& s); template inline void copy_size(const Cube& m); template inline const Cube& for_each(functor F); template inline const Cube& for_each(functor F) const; template inline const Cube& transform(functor F); template inline const Cube& imbue(functor F); inline const Cube& replace(const eT old_val, const eT new_val); inline const Cube& clean(const pod_type threshold); inline const Cube& clamp(const eT min_val, const eT max_val); inline const Cube& fill(const eT val); inline const Cube& zeros(); inline const Cube& zeros(const uword new_n_rows, const uword new_n_cols, const uword new_n_slices); inline const Cube& zeros(const SizeCube& s); inline const Cube& ones(); inline const Cube& ones(const uword new_n_rows, const uword new_n_cols, const uword new_n_slices); inline const Cube& ones(const SizeCube& s); inline const Cube& randu(); inline const Cube& randu(const uword new_n_rows, const uword new_n_cols, const uword new_n_slices); inline const Cube& randu(const SizeCube& s); inline const Cube& randn(); inline const Cube& randn(const uword new_n_rows, const uword new_n_cols, const uword new_n_slices); inline const Cube& randn(const SizeCube& s); inline void reset(); inline void soft_reset(); template inline void set_real(const BaseCube& X); template inline void set_imag(const BaseCube& X); inline arma_warn_unused eT min() const; inline arma_warn_unused eT max() const; inline eT min(uword& index_of_min_val) const; inline eT max(uword& index_of_max_val) const; inline eT min(uword& row_of_min_val, uword& col_of_min_val, uword& slice_of_min_val) const; inline eT max(uword& row_of_max_val, uword& col_of_max_val, uword& slice_of_max_val) const; inline arma_cold bool save(const std::string name, const file_type type = arma_binary) const; inline arma_cold bool save(const hdf5_name& spec, const file_type type = hdf5_binary) const; inline arma_cold bool save( std::ostream& os, const file_type type = arma_binary) const; inline arma_cold bool load(const std::string name, const file_type type = auto_detect); inline arma_cold bool load(const hdf5_name& spec, const file_type type = hdf5_binary); inline arma_cold bool load( std::istream& is, const file_type type = auto_detect); inline arma_cold bool quiet_save(const std::string name, const file_type type = arma_binary) const; inline arma_cold bool quiet_save(const hdf5_name& spec, const file_type type = hdf5_binary) const; inline arma_cold bool quiet_save( std::ostream& os, const file_type type = arma_binary) const; inline arma_cold bool quiet_load(const std::string name, const file_type type = auto_detect); inline arma_cold bool quiet_load(const hdf5_name& spec, const file_type type = hdf5_binary); inline arma_cold bool quiet_load( std::istream& is, const file_type type = auto_detect); // iterators typedef eT* iterator; typedef const eT* const_iterator; typedef eT* slice_iterator; typedef const eT* const_slice_iterator; inline iterator begin(); inline const_iterator begin() const; inline const_iterator cbegin() const; inline iterator end(); inline const_iterator end() const; inline const_iterator cend() const; inline slice_iterator begin_slice(const uword slice_num); inline const_slice_iterator begin_slice(const uword slice_num) const; inline slice_iterator end_slice(const uword slice_num); inline const_slice_iterator end_slice(const uword slice_num) const; inline void clear(); inline bool empty() const; inline uword size() const; inline arma_warn_unused eT& front(); inline arma_warn_unused const eT& front() const; inline arma_warn_unused eT& back(); inline arma_warn_unused const eT& back() const; inline void swap(Cube& B); inline void steal_mem(Cube& X); //!< don't use this unless you're writing code internal to Armadillo template class fixed; protected: inline void init_cold(); inline void init_warm(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices); template inline void init(const BaseCube& A, const BaseCube& B); inline void delete_mat(); inline void create_mat(); friend class glue_join; friend class op_reshape; friend class op_resize; friend class subview_cube; public: #ifdef ARMA_EXTRA_CUBE_PROTO #include ARMA_INCFILE_WRAP(ARMA_EXTRA_CUBE_PROTO) #endif }; template template class Cube::fixed : public Cube { private: static constexpr uword fixed_n_elem = fixed_n_rows * fixed_n_cols * fixed_n_slices; static constexpr uword fixed_n_elem_slice = fixed_n_rows * fixed_n_cols; static constexpr bool use_extra = (fixed_n_elem > Cube_prealloc::mem_n_elem); arma_aligned Mat* mat_ptrs_local_extra[ (fixed_n_slices > Cube_prealloc::mat_ptrs_size) ? fixed_n_slices : 1 ]; arma_align_mem eT mem_local_extra [ use_extra ? fixed_n_elem : 1 ]; arma_inline void mem_setup(); public: inline fixed(); inline fixed(const fixed& X); inline fixed(const fill::scalar_holder f); template inline fixed(const fill::fill_class& f); template inline fixed(const BaseCube& A); template inline fixed(const BaseCube& A, const BaseCube& B); using Cube::operator=; using Cube::operator(); inline Cube& operator=(const fixed& X); arma_inline arma_warn_unused eT& operator[] (const uword i); arma_inline arma_warn_unused const eT& operator[] (const uword i) const; arma_inline arma_warn_unused eT& at (const uword i); arma_inline arma_warn_unused const eT& at (const uword i) const; arma_inline arma_warn_unused eT& operator() (const uword i); arma_inline arma_warn_unused const eT& operator() (const uword i) const; arma_inline arma_warn_unused eT& at (const uword in_row, const uword in_col, const uword in_slice); arma_inline arma_warn_unused const eT& at (const uword in_row, const uword in_col, const uword in_slice) const; arma_inline arma_warn_unused eT& operator() (const uword in_row, const uword in_col, const uword in_slice); arma_inline arma_warn_unused const eT& operator() (const uword in_row, const uword in_col, const uword in_slice) const; }; class Cube_aux { public: template arma_inline static void prefix_pp(Cube& x); template arma_inline static void prefix_pp(Cube< std::complex >& x); template arma_inline static void postfix_pp(Cube& x); template arma_inline static void postfix_pp(Cube< std::complex >& x); template arma_inline static void prefix_mm(Cube& x); template arma_inline static void prefix_mm(Cube< std::complex >& x); template arma_inline static void postfix_mm(Cube& x); template arma_inline static void postfix_mm(Cube< std::complex >& x); template inline static void set_real(Cube& out, const BaseCube& X); template inline static void set_imag(Cube& out, const BaseCube& X); template inline static void set_real(Cube< std::complex >& out, const BaseCube< T,T1>& X); template inline static void set_imag(Cube< std::complex >& out, const BaseCube< T,T1>& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_pinv_bones.hpp0000644000176200001440000000272114160256234023746 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_pinv //! @{ class op_pinv : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); template inline static bool apply_direct(Mat& out, const Base& expr, typename T1::pod_type tol, const uword method_id); template inline static bool apply_diag(Mat& out, const Mat& A, typename get_pod_type::result tol); template inline static bool apply_sym (Mat& out, const Mat& A, typename get_pod_type::result tol, const uword method_id); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_logmat_meat.hpp0000644000176200001440000003134114162345366024104 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_logmat //! @{ // Partly based on algorithm 11.9 (inverse scaling and squaring algorithm with Schur decomposition) in: // Nicholas J. Higham. // Functions of Matrices: Theory and Computation. // SIAM, 2008. // ISBN 978-0-89871-646-7 template inline void op_logmat::apply(Mat< std::complex >& out, const mtOp,T1,op_logmat>& in) { arma_extra_debug_sigprint(); const bool status = op_logmat::apply_direct(out, in.m, in.aux_uword_a); if(status == false) { out.soft_reset(); arma_stop_runtime_error("logmat(): transformation failed"); } } template inline bool op_logmat::apply_direct(Mat< std::complex >& out, const Op& expr, const uword) { arma_extra_debug_sigprint(); typedef typename T1::elem_type T; const diagmat_proxy P(expr.m); arma_debug_check( (P.n_rows != P.n_cols), "logmat(): given matrix must be square sized" ); const uword N = P.n_rows; out.zeros(N,N); // aliasing can't happen as op_logmat is defined as cx_mat = op(mat) for(uword i=0; i= T(0)) { out.at(i,i) = std::log(val); } else { out.at(i,i) = std::log( std::complex(val) ); } } return true; } template inline bool op_logmat::apply_direct(Mat< std::complex >& out, const Base& expr, const uword n_iters) { arma_extra_debug_sigprint(); typedef typename T1::elem_type in_T; typedef typename std::complex out_T; const quasi_unwrap expr_unwrap(expr.get_ref()); const Mat& A = expr_unwrap.M; arma_debug_check( (A.is_square() == false), "logmat(): given matrix must be square sized" ); if(A.n_elem == 0) { out.reset(); return true; } else if(A.n_elem == 1) { out.set_size(1,1); out[0] = std::log( std::complex( A[0] ) ); return true; } if(A.is_diagmat()) { arma_extra_debug_print("op_logmat: detected diagonal matrix"); const uword N = A.n_rows; out.zeros(N,N); // aliasing can't happen as op_logmat is defined as cx_mat = op(mat) for(uword i=0; i= in_T(0)) { out.at(i,i) = std::log(val); } else { out.at(i,i) = std::log( out_T(val) ); } } return true; } #if defined(ARMA_OPTIMISE_SYMPD) const bool try_sympd = sympd_helper::guess_sympd(A); #else const bool try_sympd = false; #endif if(try_sympd) { arma_extra_debug_print("op_logmat: attempting sympd optimisation"); // if matrix A is sympd, all its eigenvalues are positive Col eigval; Mat eigvec; const bool eig_status = eig_sym_helper(eigval, eigvec, A, 'd', "logmat()"); if(eig_status) { // ensure each eigenvalue is > 0 const uword N = eigval.n_elem; const in_T* eigval_mem = eigval.memptr(); bool all_pos = true; for(uword i=0; i >::from( eigvec * diagmat(eigval) * eigvec.t() ); return true; } } arma_extra_debug_print("op_logmat: sympd optimisation failed"); // fallthrough if eigen decomposition failed or an eigenvalue is zero } Mat S(A.n_rows, A.n_cols, arma_nozeros_indicator()); const in_T* Amem = A.memptr(); out_T* Smem = S.memptr(); const uword n_elem = A.n_elem; for(uword i=0; i( Amem[i] ); } return op_logmat_cx::apply_common(out, S, n_iters); } template inline void op_logmat_cx::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); const bool status = op_logmat_cx::apply_direct(out, in.m, in.aux_uword_a); if(status == false) { out.soft_reset(); arma_stop_runtime_error("logmat(): transformation failed"); } } template inline bool op_logmat_cx::apply_direct(Mat& out, const Op& expr, const uword) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const diagmat_proxy P(expr.m); bool status = false; if(P.is_alias(out)) { Mat tmp; status = op_logmat_cx::apply_direct_noalias(tmp, P); out.steal_mem(tmp); } else { status = op_logmat_cx::apply_direct_noalias(out, P); } return status; } template inline bool op_logmat_cx::apply_direct_noalias(Mat& out, const diagmat_proxy& P) { arma_extra_debug_sigprint(); arma_debug_check( (P.n_rows != P.n_cols), "logmat(): given matrix must be square sized" ); const uword N = P.n_rows; out.zeros(N,N); for(uword i=0; i inline bool op_logmat_cx::apply_direct(Mat& out, const Base& expr, const uword n_iters) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; typedef typename T1::elem_type eT; Mat S = expr.get_ref(); arma_debug_check( (S.n_rows != S.n_cols), "logmat(): given matrix must be square sized" ); if(S.n_elem == 0) { out.reset(); return true; } else if(S.n_elem == 1) { out.set_size(1,1); out[0] = std::log(S[0]); return true; } if(S.is_diagmat()) { arma_extra_debug_print("op_logmat_cx: detected diagonal matrix"); const uword N = S.n_rows; out.zeros(N,N); // aliasing can't happen as S is generated for(uword i=0; i eigval; Mat eigvec; const bool eig_status = eig_sym_helper(eigval, eigvec, S, 'd', "logmat()"); if(eig_status) { // ensure each eigenvalue is > 0 const uword N = eigval.n_elem; const T* eigval_mem = eigval.memptr(); bool all_pos = true; for(uword i=0; i inline bool op_logmat_cx::apply_common(Mat< std::complex >& out, Mat< std::complex >& S, const uword n_iters) { arma_extra_debug_sigprint(); typedef typename std::complex eT; Mat U; const bool schur_ok = auxlib::schur(U,S); if(schur_ok == false) { arma_extra_debug_print("logmat(): schur decomposition failed"); return false; } //double theta[] = { 1.10e-5, 1.82e-3, 1.62e-2, 5.39e-2, 1.14e-1, 1.87e-1, 2.64e-1 }; double theta[] = { 0.0, 0.0, 1.6206284795015624e-2, 5.3873532631381171e-2, 1.1352802267628681e-1, 1.8662860613541288e-1, 2.642960831111435e-1 }; // theta[0] and theta[1] not really used const uword N = S.n_rows; uword p = 0; uword m = 6; uword iter = 0; while(iter < n_iters) { const T tau = norm( (S - eye< Mat >(N,N)), 1 ); if(tau <= theta[6]) { p++; uword j1 = 0; uword j2 = 0; for(uword i=2; i<=6; ++i) { if( tau <= theta[i]) { j1 = i; break; } } for(uword i=2; i<=6; ++i) { if((tau/2.0) <= theta[i]) { j2 = i; break; } } // sanity check, for development purposes only arma_debug_check( (j2 > j1), "internal error: op_logmat::apply_direct(): j2 > j1" ); if( ((j1 - j2) <= 1) || (p == 2) ) { m = j1; break; } } const bool sqrtmat_ok = op_sqrtmat_cx::apply_direct(S,S); if(sqrtmat_ok == false) { arma_extra_debug_print("logmat(): sqrtmat() failed"); return false; } iter++; } if(iter >= n_iters) { arma_debug_warn_level(2, "logmat(): reached max iterations without full convergence"); } S.diag() -= eT(1); if(m >= 1) { const bool helper_ok = op_logmat_cx::helper(S,m); if(helper_ok == false) { return false; } } out = U * S * U.t(); out *= eT(eop_aux::pow(double(2), double(iter))); return true; } template inline bool op_logmat_cx::helper(Mat& A, const uword m) { arma_extra_debug_sigprint(); if(A.is_finite() == false) { return false; } const vec indices = regspace(1,m-1); mat tmp(m, m, arma_zeros_indicator()); tmp.diag(-1) = indices / sqrt(square(2.0*indices) - 1.0); tmp.diag(+1) = indices / sqrt(square(2.0*indices) - 1.0); vec eigval; mat eigvec; const bool eig_ok = eig_sym_helper(eigval, eigvec, tmp, 'd', "logmat()"); if(eig_ok == false) { arma_extra_debug_print("logmat(): eig_sym() failed"); return false; } const vec nodes = (eigval + 1.0) / 2.0; const vec weights = square(eigvec.row(0).t()); const uword N = A.n_rows; Mat B(N, N, arma_zeros_indicator()); Mat X; for(uword i=0; i < m; ++i) { // B += weights(i) * solve( (nodes(i)*A + eye< Mat >(N,N)), A ); //const bool solve_ok = solve( X, (nodes(i)*A + eye< Mat >(N,N)), A, solve_opts::fast ); const bool solve_ok = solve( X, trimatu(nodes(i)*A + eye< Mat >(N,N)), A, solve_opts::no_approx ); if(solve_ok == false) { arma_extra_debug_print("logmat(): solve() failed"); return false; } B += weights(i) * X; } A = B; return true; } template inline void op_logmat_sympd::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); const bool status = op_logmat_sympd::apply_direct(out, in.m); if(status == false) { out.soft_reset(); arma_stop_runtime_error("logmat_sympd(): transformation failed"); } } template inline bool op_logmat_sympd::apply_direct(Mat& out, const Base& expr) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; typedef typename T1::elem_type eT; const unwrap U(expr.get_ref()); const Mat& X = U.M; arma_debug_check( (X.is_square() == false), "logmat_sympd(): given matrix must be square sized" ); Col< T> eigval; Mat eigvec; const bool status = eig_sym_helper(eigval, eigvec, X, 'd', "logmat_sympd()"); if(status == false) { return false; } const uword N = eigval.n_elem; const T* eigval_mem = eigval.memptr(); bool all_pos = true; for(uword i=0; i inline static void apply(SpMat& out, const SpOp& in); template inline static void apply_noalias_fast(SpMat& out, const SpProxy& p, const uword dim); template inline static void apply_noalias_slow(SpMat& out, const SpProxy& p, const uword dim); // Take direct mean of a set of values. Length of array and number of values can be different. template inline static eT direct_mean(const eT* const X, const uword length, const uword N); template inline static eT direct_mean_robust(const eT* const X, const uword length, const uword N); template inline static typename T1::elem_type mean_all(const SpBase& X); template inline static typename T1::elem_type mean_all(const SpOp& expr); // Take the mean using an iterator. template inline static eT iterator_mean(T1& it, const T1& end, const uword n_zero, const eT junk); template inline static eT iterator_mean_robust(T1& it, const T1& end, const uword n_zero, const eT junk); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_median.hpp0000644000176200001440000000331514124060717023025 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_median //! @{ template arma_warn_unused inline typename enable_if2< is_arma_type::value && resolves_to_vector::yes, typename T1::elem_type >::result median(const T1& X) { arma_extra_debug_sigprint(); return op_median::median_vec(X); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value && resolves_to_vector::no, const Op >::result median(const T1& X) { arma_extra_debug_sigprint(); return Op(X, 0, 0); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const Op >::result median(const T1& X, const uword dim) { arma_extra_debug_sigprint(); return Op(X, dim, 0); } template arma_warn_unused arma_inline typename arma_scalar_only::result median(const T& x) { return x; } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_trapz_meat.hpp0000644000176200001440000000730014124060717024265 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_trapz //! @{ template inline void glue_trapz::apply(Mat& out, const Glue& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword; const quasi_unwrap UX(in.A); const quasi_unwrap UY(in.B); if( UX.is_alias(out) || UY.is_alias(out) ) { Mat tmp; glue_trapz::apply_noalias(tmp, UX.M, UY.M, dim); out.steal_mem(tmp); } else { glue_trapz::apply_noalias(out, UX.M, UY.M, dim); } } template inline void glue_trapz::apply_noalias(Mat& out, const Mat& X, const Mat& Y, const uword dim) { arma_extra_debug_sigprint(); arma_debug_check( (dim > 1), "trapz(): argument 'dim' must be 0 or 1" ); arma_debug_check( ((X.is_vec() == false) && (X.is_empty() == false)), "trapz(): argument 'X' must be a vector" ); const uword N = X.n_elem; if(dim == 0) { arma_debug_check( (N != Y.n_rows), "trapz(): length of X must equal the number of rows in Y when dim=0" ); } else if(dim == 1) { arma_debug_check( (N != Y.n_cols), "trapz(): length of X must equal the number of columns in Y when dim=1" ); } if(N <= 1) { if(dim == 0) { out.zeros(1, Y.n_cols); } else if(dim == 1) { out.zeros(Y.n_rows, 1); } return; } const Col vec_X( const_cast(X.memptr()), X.n_elem, false, true ); const Col diff_X = diff(vec_X); if(dim == 0) { const Row diff_X_t( const_cast(diff_X.memptr()), diff_X.n_elem, false, true ); out = diff_X_t * (0.5 * (Y.rows(0, N-2) + Y.rows(1, N-1))); } else if(dim == 1) { out = (0.5 * (Y.cols(0, N-2) + Y.cols(1, N-1))) * diff_X; } } template inline void op_trapz::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; const quasi_unwrap UY(in.m); if(UY.is_alias(out)) { Mat tmp; op_trapz::apply_noalias(tmp, UY.M, dim); out.steal_mem(tmp); } else { op_trapz::apply_noalias(out, UY.M, dim); } } template inline void op_trapz::apply_noalias(Mat& out, const Mat& Y, const uword dim) { arma_extra_debug_sigprint(); arma_debug_check( (dim > 1), "trapz(): argument 'dim' must be 0 or 1" ); uword N = 0; if(dim == 0) { N = Y.n_rows; } else if(dim == 1) { N = Y.n_cols; } if(N <= 1) { if(dim == 0) { out.zeros(1, Y.n_cols); } else if(dim == 1) { out.zeros(Y.n_rows, 1); } return; } if(dim == 0) { out = sum( (0.5 * (Y.rows(0, N-2) + Y.rows(1, N-1))), 0 ); } else if(dim == 1) { out = sum( (0.5 * (Y.cols(0, N-2) + Y.cols(1, N-1))), 1 ); } } //! @} RcppArmadillo/inst/include/armadillo_bits/hdf5_misc.hpp0000644000176200001440000005015114124060717022746 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup hdf5_misc //! @{ #if defined(ARMA_USE_HDF5) namespace hdf5_misc { //! Given a certain type, find the corresponding HDF5 datatype. This can't be //! done entirely at compile time, unfortunately, because the H5T_* macros //! depend on function calls. template< typename eT > inline hid_t get_hdf5_type() { return -1; // Return invalid. } //! Specializations for each valid element type //! (taken from all the possible typedefs of {u8, s8, ..., u64, s64} and the other native types. //! We can't use the actual u8/s8 typedefs because their relations to the H5T_... types are unclear. template<> inline hid_t get_hdf5_type< unsigned char >() { return arma_H5Tcopy(arma_H5T_NATIVE_UCHAR); } template<> inline hid_t get_hdf5_type< char >() { return arma_H5Tcopy(arma_H5T_NATIVE_CHAR); } template<> inline hid_t get_hdf5_type< short >() { return arma_H5Tcopy(arma_H5T_NATIVE_SHORT); } template<> inline hid_t get_hdf5_type< unsigned short >() { return arma_H5Tcopy(arma_H5T_NATIVE_USHORT); } template<> inline hid_t get_hdf5_type< int >() { return arma_H5Tcopy(arma_H5T_NATIVE_INT); } template<> inline hid_t get_hdf5_type< unsigned int >() { return arma_H5Tcopy(arma_H5T_NATIVE_UINT); } template<> inline hid_t get_hdf5_type< long >() { return arma_H5Tcopy(arma_H5T_NATIVE_LONG); } template<> inline hid_t get_hdf5_type< unsigned long >() { return arma_H5Tcopy(arma_H5T_NATIVE_ULONG); } template<> inline hid_t get_hdf5_type< long long >() { return arma_H5Tcopy(arma_H5T_NATIVE_LLONG); } template<> inline hid_t get_hdf5_type< unsigned long long >() { return arma_H5Tcopy(arma_H5T_NATIVE_ULLONG); } template<> inline hid_t get_hdf5_type< float >() { return arma_H5Tcopy(arma_H5T_NATIVE_FLOAT); } template<> inline hid_t get_hdf5_type< double >() { return arma_H5Tcopy(arma_H5T_NATIVE_DOUBLE); } //! Utility hid_t since HOFFSET() won't work with std::complex. template struct hdf5_complex_t { eT real; eT imag; }; template<> inline hid_t get_hdf5_type< std::complex >() { hid_t type = arma_H5Tcreate(H5T_COMPOUND, sizeof(hdf5_complex_t)); arma_H5Tinsert(type, "real", HOFFSET(hdf5_complex_t, real), arma_H5T_NATIVE_FLOAT); arma_H5Tinsert(type, "imag", HOFFSET(hdf5_complex_t, imag), arma_H5T_NATIVE_FLOAT); return type; } template<> inline hid_t get_hdf5_type< std::complex >() { hid_t type = arma_H5Tcreate(H5T_COMPOUND, sizeof(hdf5_complex_t)); arma_H5Tinsert(type, "real", HOFFSET(hdf5_complex_t, real), arma_H5T_NATIVE_DOUBLE); arma_H5Tinsert(type, "imag", HOFFSET(hdf5_complex_t, imag), arma_H5T_NATIVE_DOUBLE); return type; } // Compare datatype against all supported types. inline bool is_supported_arma_hdf5_type(hid_t datatype) { hid_t search_type; bool is_equal; // start with most likely used types: double, complex, float, complex search_type = get_hdf5_type(); is_equal = ( arma_H5Tequal(datatype, search_type) > 0 ); arma_H5Tclose(search_type); if(is_equal) { return true; } search_type = get_hdf5_type< std::complex >(); is_equal = ( arma_H5Tequal(datatype, search_type) > 0 ); arma_H5Tclose(search_type); if(is_equal) { return true; } search_type = get_hdf5_type(); is_equal = ( arma_H5Tequal(datatype, search_type) > 0 ); arma_H5Tclose(search_type); if(is_equal) { return true; } search_type = get_hdf5_type< std::complex >(); is_equal = ( arma_H5Tequal(datatype, search_type) > 0 ); arma_H5Tclose(search_type); if(is_equal) { return true; } // remaining supported types: u8, s8, u16, s16, u32, s32, u64, s64, ulng_t, slng_t search_type = get_hdf5_type(); is_equal = ( arma_H5Tequal(datatype, search_type) > 0 ); arma_H5Tclose(search_type); if(is_equal) { return true; } search_type = get_hdf5_type(); is_equal = ( arma_H5Tequal(datatype, search_type) > 0 ); arma_H5Tclose(search_type); if(is_equal) { return true; } search_type = get_hdf5_type(); is_equal = ( arma_H5Tequal(datatype, search_type) > 0 ); arma_H5Tclose(search_type); if(is_equal) { return true; } search_type = get_hdf5_type(); is_equal = ( arma_H5Tequal(datatype, search_type) > 0 ); arma_H5Tclose(search_type); if(is_equal) { return true; } search_type = get_hdf5_type(); is_equal = ( arma_H5Tequal(datatype, search_type) > 0 ); arma_H5Tclose(search_type); if(is_equal) { return true; } search_type = get_hdf5_type(); is_equal = ( arma_H5Tequal(datatype, search_type) > 0 ); arma_H5Tclose(search_type); if(is_equal) { return true; } search_type = get_hdf5_type(); is_equal = ( arma_H5Tequal(datatype, search_type) > 0 ); arma_H5Tclose(search_type); if(is_equal) { return true; } search_type = get_hdf5_type(); is_equal = ( arma_H5Tequal(datatype, search_type) > 0 ); arma_H5Tclose(search_type); if(is_equal) { return true; } search_type = get_hdf5_type(); is_equal = ( arma_H5Tequal(datatype, search_type) > 0 ); arma_H5Tclose(search_type); if(is_equal) { return true; } search_type = get_hdf5_type(); is_equal = ( arma_H5Tequal(datatype, search_type) > 0 ); arma_H5Tclose(search_type); if(is_equal) { return true; } return false; } //! Auxiliary functions and structs for search_hdf5_file. struct hdf5_search_info { const std::vector& names; int num_dims; bool exact; hid_t best_match; size_t best_match_position; // Position of best match in names vector. }; inline herr_t hdf5_search_callback ( hid_t loc_id, const char* name, const H5O_info_t* info, void* operator_data // hdf5_search_info ) { hdf5_search_info* search_info = (hdf5_search_info*) operator_data; // We are looking for datasets. if(info->type == H5O_TYPE_DATASET) { // Check type of dataset to see if we could even load it. hid_t dataset = arma_H5Dopen(loc_id, name, H5P_DEFAULT); hid_t datatype = arma_H5Dget_type(dataset); const bool is_supported = is_supported_arma_hdf5_type(datatype); arma_H5Tclose(datatype); arma_H5Dclose(dataset); if(is_supported == false) { // Forget about it and move on. return 0; } // Now we have to check against our set of names. // Only check names which could be better. for(size_t string_pos = 0; string_pos < search_info->best_match_position; ++string_pos) { // name is the full path (/path/to/dataset); names[string_pos] may be // "dataset", "/to/dataset", or "/path/to/dataset". // So if we count the number of forward slashes in names[string_pos], // and then simply take the last substring of name containing that number of slashes, // we can do the comparison. // Count the number of forward slashes in names[string_pos]. uword name_count = 0; for(uword i = 0; i < search_info->names[string_pos].length(); ++i) { if((search_info->names[string_pos])[i] == '/') { ++name_count; } } // Count the number of forward slashes in the full name. uword count = 0; const std::string str = std::string(name); for(uword i = 0; i < str.length(); ++i) { if(str[i] == '/') { ++count; } } // Is the full string the same? if(str == search_info->names[string_pos]) { // We found it exactly. hid_t match_candidate = arma_H5Dopen(loc_id, name, H5P_DEFAULT); if(match_candidate < 0) { return -1; } // Ensure that the dataset is valid and of the correct dimensionality. hid_t filespace = arma_H5Dget_space(match_candidate); int num_dims = arma_H5Sget_simple_extent_ndims(filespace); if(num_dims <= search_info->num_dims) { // Valid dataset -- we'll keep it. // If we already have an existing match we have to close it. if(search_info->best_match != -1) { arma_H5Dclose(search_info->best_match); } search_info->best_match_position = string_pos; search_info->best_match = match_candidate; } arma_H5Sclose(filespace); // There is no possibility of anything better, so terminate the search. return 1; } // If we are asking for more slashes than we have, this can't be a match. // Skip to below, where we decide whether or not to keep it anyway based // on the exactness condition of the search. if(count <= name_count) { size_t start_pos = (count == 0) ? 0 : std::string::npos; while(count > 0) { // Move pointer to previous slash. start_pos = str.rfind('/', start_pos); // Break if we've run out of slashes. if(start_pos == std::string::npos) { break; } --count; } // Now take the substring (this may end up being the full string). const std::string substring = str.substr(start_pos); // Are they the same? if(substring == search_info->names[string_pos]) { // We have found the object; it must be better than our existing match. hid_t match_candidate = arma_H5Dopen(loc_id, name, H5P_DEFAULT); // arma_check(match_candidate < 0, "Mat::load(): cannot open an HDF5 dataset"); if(match_candidate < 0) { return -1; } // Ensure that the dataset is valid and of the correct dimensionality. hid_t filespace = arma_H5Dget_space(match_candidate); int num_dims = arma_H5Sget_simple_extent_ndims(filespace); if(num_dims <= search_info->num_dims) { // Valid dataset -- we'll keep it. // If we already have an existing match we have to close it. if(search_info->best_match != -1) { arma_H5Dclose(search_info->best_match); } search_info->best_match_position = string_pos; search_info->best_match = match_candidate; } arma_H5Sclose(filespace); } } // If they are not the same, but we have not found anything and we don't need an exact match, take this. if((search_info->exact == false) && (search_info->best_match == -1)) { hid_t match_candidate = arma_H5Dopen(loc_id, name, H5P_DEFAULT); // arma_check(match_candidate < 0, "Mat::load(): cannot open an HDF5 dataset"); if(match_candidate < 0) { return -1; } hid_t filespace = arma_H5Dget_space(match_candidate); int num_dims = arma_H5Sget_simple_extent_ndims(filespace); if(num_dims <= search_info->num_dims) { // Valid dataset -- we'll keep it. search_info->best_match = arma_H5Dopen(loc_id, name, H5P_DEFAULT); } arma_H5Sclose(filespace); } } } return 0; } //! Search an HDF5 file for the given dataset names. //! If 'exact' is true, failure to find a dataset in the list of names means that -1 is returned. //! If 'exact' is false and no datasets are found, -1 is returned. //! The number of dimensions is used to help prune down invalid datasets; //! 2 dimensions is a matrix, 1 dimension is a vector, and 3 dimensions is a cube. //! If the number of dimensions in a dataset is less than or equal to num_dims, //! it will be considered -- for instance, a one-dimensional HDF5 vector can be loaded as a single-column matrix. inline hid_t search_hdf5_file ( const std::vector& names, hid_t hdf5_file, int num_dims = 2, bool exact = false ) { hdf5_search_info search_info = { names, num_dims, exact, -1, names.size() }; // We'll use the H5Ovisit to track potential entries. herr_t status = arma_H5Ovisit(hdf5_file, H5_INDEX_NAME, H5_ITER_NATIVE, hdf5_search_callback, void_ptr(&search_info)); // Return the best match; it will be -1 if there was a problem. return (status < 0) ? -1 : search_info.best_match; } //! Load an HDF5 matrix into an array of type specified by datatype, //! then convert that into the desired array 'dest'. //! This should only be called when eT is not the datatype. template inline hid_t load_and_convert_hdf5 ( eT *dest, hid_t dataset, hid_t datatype, uword n_elem ) { // We can't use nice template specializations here // as the determination of the type of 'datatype' must be done at runtime. // So we end up with this ugliness... hid_t search_type; bool is_equal; // u8 search_type = get_hdf5_type(); is_equal = (arma_H5Tequal(datatype, search_type) > 0); arma_H5Tclose(search_type); if(is_equal) { Col v(n_elem, arma_nozeros_indicator()); hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr())); arrayops::convert(dest, v.memptr(), n_elem); return status; } // s8 search_type = get_hdf5_type(); is_equal = (arma_H5Tequal(datatype, search_type) > 0); arma_H5Tclose(search_type); if(is_equal) { Col v(n_elem, arma_nozeros_indicator()); hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr())); arrayops::convert(dest, v.memptr(), n_elem); return status; } // u16 search_type = get_hdf5_type(); is_equal = (arma_H5Tequal(datatype, search_type) > 0); arma_H5Tclose(search_type); if(is_equal) { Col v(n_elem, arma_nozeros_indicator()); hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr())); arrayops::convert(dest, v.memptr(), n_elem); return status; } // s16 search_type = get_hdf5_type(); is_equal = (arma_H5Tequal(datatype, search_type) > 0); arma_H5Tclose(search_type); if(is_equal) { Col v(n_elem, arma_nozeros_indicator()); hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr())); arrayops::convert(dest, v.memptr(), n_elem); return status; } // u32 search_type = get_hdf5_type(); is_equal = (arma_H5Tequal(datatype, search_type) > 0); arma_H5Tclose(search_type); if(is_equal) { Col v(n_elem, arma_nozeros_indicator()); hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr())); arrayops::convert(dest, v.memptr(), n_elem); return status; } // s32 search_type = get_hdf5_type(); is_equal = (arma_H5Tequal(datatype, search_type) > 0); arma_H5Tclose(search_type); if(is_equal) { Col v(n_elem, arma_nozeros_indicator()); hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr())); arrayops::convert(dest, v.memptr(), n_elem); return status; } // u64 search_type = get_hdf5_type(); is_equal = (arma_H5Tequal(datatype, search_type) > 0); arma_H5Tclose(search_type); if(is_equal) { Col v(n_elem, arma_nozeros_indicator()); hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr())); arrayops::convert(dest, v.memptr(), n_elem); return status; } // s64 search_type = get_hdf5_type(); is_equal = (arma_H5Tequal(datatype, search_type) > 0); arma_H5Tclose(search_type); if(is_equal) { Col v(n_elem, arma_nozeros_indicator()); hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr())); arrayops::convert(dest, v.memptr(), n_elem); return status; } // ulng_t search_type = get_hdf5_type(); is_equal = (arma_H5Tequal(datatype, search_type) > 0); arma_H5Tclose(search_type); if(is_equal) { Col v(n_elem, arma_nozeros_indicator()); hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr())); arrayops::convert(dest, v.memptr(), n_elem); return status; } // slng_t search_type = get_hdf5_type(); is_equal = (arma_H5Tequal(datatype, search_type) > 0); arma_H5Tclose(search_type); if(is_equal) { Col v(n_elem, arma_nozeros_indicator()); hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr())); arrayops::convert(dest, v.memptr(), n_elem); return status; } // float search_type = get_hdf5_type(); is_equal = (arma_H5Tequal(datatype, search_type) > 0); arma_H5Tclose(search_type); if(is_equal) { Col v(n_elem, arma_nozeros_indicator()); hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr())); arrayops::convert(dest, v.memptr(), n_elem); return status; } // double search_type = get_hdf5_type(); is_equal = (arma_H5Tequal(datatype, search_type) > 0); arma_H5Tclose(search_type); if(is_equal) { Col v(n_elem, arma_nozeros_indicator()); hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr())); arrayops::convert(dest, v.memptr(), n_elem); return status; } // complex float search_type = get_hdf5_type< std::complex >(); is_equal = (arma_H5Tequal(datatype, search_type) > 0); arma_H5Tclose(search_type); if(is_equal) { if(is_cx::no) { return -1; // can't read complex data into non-complex matrix/cube } Col< std::complex > v(n_elem, arma_nozeros_indicator()); hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr())); arrayops::convert_cx(dest, v.memptr(), n_elem); return status; } // complex double search_type = get_hdf5_type< std::complex >(); is_equal = (arma_H5Tequal(datatype, search_type) > 0); arma_H5Tclose(search_type); if(is_equal) { if(is_cx::no) { return -1; // can't read complex data into non-complex matrix/cube } Col< std::complex > v(n_elem, arma_nozeros_indicator()); hid_t status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(v.memptr())); arrayops::convert_cx(dest, v.memptr(), n_elem); return status; } return -1; // Failure. } struct hdf5_suspend_printing_errors { #if defined(ARMA_PRINT_HDF5_ERRORS) inline hdf5_suspend_printing_errors() {} #else herr_t (*old_client_func)(hid_t, void*); void* old_client_data; inline hdf5_suspend_printing_errors() { // Save old error handler. arma_H5Eget_auto(H5E_DEFAULT, &old_client_func, &old_client_data); // Disable annoying HDF5 error messages. arma_H5Eset_auto(H5E_DEFAULT, NULL, NULL); } inline ~hdf5_suspend_printing_errors() { arma_H5Eset_auto(H5E_DEFAULT, old_client_func, old_client_data); } #endif }; } // namespace hdf5_misc #endif // #if defined(ARMA_USE_HDF5) //! @} RcppArmadillo/inst/include/armadillo_bits/fn_sqrtmat.hpp0000644000176200001440000000654514124060717023273 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_sqrtmat //! @{ template arma_warn_unused arma_inline typename enable_if2< (is_supported_blas_type::value && is_cx::no), const mtOp, T1, op_sqrtmat> >::result sqrtmat(const Base& X) { arma_extra_debug_sigprint(); return mtOp, T1, op_sqrtmat>(X.get_ref()); } template arma_warn_unused arma_inline typename enable_if2< (is_supported_blas_type::value && is_cx::yes), const Op >::result sqrtmat(const Base& X) { arma_extra_debug_sigprint(); return Op(X.get_ref()); } template inline typename enable_if2< (is_supported_blas_type::value && is_cx::no), bool >::result sqrtmat(Mat< std::complex >& Y, const Base& X) { arma_extra_debug_sigprint(); const bool status = op_sqrtmat::apply_direct(Y, X.get_ref()); if(status == false) { arma_debug_warn_level(3, "sqrtmat(): given matrix is singular; may not have a square root"); } return status; } template inline typename enable_if2< (is_supported_blas_type::value && is_cx::yes), bool >::result sqrtmat(Mat& Y, const Base& X) { arma_extra_debug_sigprint(); const bool status = op_sqrtmat_cx::apply_direct(Y, X.get_ref()); if(status == false) { arma_debug_warn_level(3, "sqrtmat(): given matrix is singular; may not have a square root"); } return status; } // template arma_warn_unused arma_inline typename enable_if2< is_supported_blas_type::value, const Op >::result sqrtmat_sympd(const Base& X) { arma_extra_debug_sigprint(); return Op(X.get_ref()); } template inline typename enable_if2< is_supported_blas_type::value, bool >::result sqrtmat_sympd(Mat& Y, const Base& X) { arma_extra_debug_sigprint(); const bool status = op_sqrtmat_sympd::apply_direct(Y, X.get_ref()); if(status == false) { Y.soft_reset(); arma_debug_warn_level(3, "sqrtmat_sympd(): transformation failed"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/operator_times.hpp0000644000176200001440000002543714124060717024152 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup operator_times //! @{ //! Base * scalar template arma_inline typename enable_if2< is_arma_type::value, const eOp >::result operator* (const T1& X, const typename T1::elem_type k) { arma_extra_debug_sigprint(); return eOp(X,k); } //! scalar * Base template arma_inline typename enable_if2< is_arma_type::value, const eOp >::result operator* (const typename T1::elem_type k, const T1& X) { arma_extra_debug_sigprint(); return eOp(X,k); // NOTE: order is swapped } //! non-complex Base * complex scalar template arma_inline typename enable_if2 < (is_arma_type::value && is_cx::no), const mtOp, T1, op_cx_scalar_times> >::result operator* ( const T1& X, const std::complex& k ) { arma_extra_debug_sigprint(); return mtOp, T1, op_cx_scalar_times>('j', X, k); } //! complex scalar * non-complex Base template arma_inline typename enable_if2 < (is_arma_type::value && is_cx::no), const mtOp, T1, op_cx_scalar_times> >::result operator* ( const std::complex& k, const T1& X ) { arma_extra_debug_sigprint(); return mtOp, T1, op_cx_scalar_times>('j', X, k); } //! scalar * trans(T1) template arma_inline const Op operator* (const typename T1::elem_type k, const Op& X) { arma_extra_debug_sigprint(); return Op(X.m, k); } //! trans(T1) * scalar template arma_inline const Op operator* (const Op& X, const typename T1::elem_type k) { arma_extra_debug_sigprint(); return Op(X.m, k); } //! Base * diagmat template arma_inline typename enable_if2 < (is_arma_type::value && is_same_type::value), const Glue, glue_times_diag> >::result operator* (const T1& X, const Op& Y) { arma_extra_debug_sigprint(); return Glue, glue_times_diag>(X, Y); } //! diagmat * Base template arma_inline typename enable_if2 < (is_arma_type::value && is_same_type::value), const Glue, T2, glue_times_diag> >::result operator* (const Op& X, const T2& Y) { arma_extra_debug_sigprint(); return Glue, T2, glue_times_diag>(X, Y); } //! diagmat * diagmat template inline Mat< typename promote_type::result > operator* (const Op& X, const Op& Y) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); const diagmat_proxy A(X.m); const diagmat_proxy B(Y.m); arma_debug_assert_mul_size(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "matrix multiplication"); Mat out(A.n_rows, B.n_cols, arma_zeros_indicator()); const uword A_length = (std::min)(A.n_rows, A.n_cols); const uword B_length = (std::min)(B.n_rows, B.n_cols); const uword N = (std::min)(A_length, B_length); for(uword i=0; i::apply( A[i] ) * upgrade_val::apply( B[i] ); } return out; } //! multiplication of Base objects with same element type template arma_inline typename enable_if2 < is_arma_type::value && is_arma_type::value && is_same_type::value, const Glue >::result operator* (const T1& X, const T2& Y) { arma_extra_debug_sigprint(); return Glue(X, Y); } //! multiplication of Base objects with different element types template inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && (is_same_type::no)), const mtGlue< typename promote_type::result, T1, T2, glue_mixed_times > >::result operator* ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); return mtGlue( X, Y ); } //! sparse multiplied by scalar template inline typename enable_if2 < is_arma_sparse_type::value, SpOp >::result operator* ( const T1& X, const typename T1::elem_type k ) { arma_extra_debug_sigprint(); return SpOp(X, k); } template inline typename enable_if2 < is_arma_sparse_type::value, SpOp >::result operator* ( const typename T1::elem_type k, const T1& X ) { arma_extra_debug_sigprint(); return SpOp(X, k); } //! non-complex sparse * complex scalar template arma_inline typename enable_if2 < (is_arma_sparse_type::value && is_cx::no), const mtSpOp, T1, spop_cx_scalar_times> >::result operator* ( const T1& X, const std::complex& k ) { arma_extra_debug_sigprint(); return mtSpOp, T1, spop_cx_scalar_times>('j', X, k); } //! complex scalar * non-complex sparse template arma_inline typename enable_if2 < (is_arma_sparse_type::value && is_cx::no), const mtSpOp, T1, spop_cx_scalar_times> >::result operator* ( const std::complex& k, const T1& X ) { arma_extra_debug_sigprint(); return mtSpOp, T1, spop_cx_scalar_times>('j', X, k); } //! multiplication of two sparse objects template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_sparse_type::value && is_same_type::value), const SpGlue >::result operator* ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); return SpGlue(x, y); } //! multiplication of one sparse and one dense object template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_type::value && is_same_type::value), Mat >::result operator* ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; Mat result; spglue_times_misc::sparse_times_dense(result, x, y); return result; } //! multiplication of one dense and one sparse object template inline typename enable_if2 < (is_arma_type::value && is_arma_sparse_type::value && is_same_type::value), Mat >::result operator* ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; Mat result; spglue_times_misc::dense_times_sparse(result, x, y); return result; } //! multiplication of two sparse objects with different element types template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_sparse_type::value && (is_same_type::no)), const mtSpGlue< typename promote_type::result, T1, T2, spglue_times_mixed > >::result operator* ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); return mtSpGlue( X, Y ); } //! multiplication of one sparse and one dense object with different element types template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_type::value && is_same_type::no), Mat< typename promote_type::result > >::result operator* ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); Mat< typename promote_type::result > out; spglue_times_mixed::sparse_times_dense(out, X, Y); return out; } //! multiplication of one dense and one sparse object with different element types template inline typename enable_if2 < (is_arma_type::value && is_arma_sparse_type::value && is_same_type::no), Mat< typename promote_type::result > >::result operator* ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); Mat< typename promote_type::result > out; spglue_times_mixed::dense_times_sparse(out, X, Y); return out; } //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_DenseGenMatProd_bones.hpp0000644000176200001440000000234614124060717026631 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { //! Define matrix operations on existing matrix objects template class DenseGenMatProd { private: const Mat& op_mat; public: const uword n_rows; // number of rows of the underlying matrix const uword n_cols; // number of columns of the underlying matrix inline DenseGenMatProd(const Mat& mat_obj); inline void perform_op(eT* x_in, eT* y_out) const; }; } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/mtGlue_meat.hpp0000644000176200001440000000272014124060717023347 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup mtGlue //! @{ template inline mtGlue::mtGlue(const T1& in_A, const T2& in_B) : A(in_A) , B(in_B) { arma_extra_debug_sigprint(); } template inline mtGlue::mtGlue(const T1& in_A, const T2& in_B, const uword in_aux_uword) : A(in_A) , B(in_B) , aux_uword(in_aux_uword) { arma_extra_debug_sigprint(); } template inline mtGlue::~mtGlue() { arma_extra_debug_sigprint(); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_conv.hpp0000644000176200001440000000424314124060717022536 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_conv //! @{ //! Convolution, which is also equivalent to polynomial multiplication and FIR digital filtering. template arma_warn_unused inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && is_same_type::value), const Glue >::result conv(const T1& A, const T2& B, const char* shape = "full") { arma_extra_debug_sigprint(); const char sig = (shape != nullptr) ? shape[0] : char(0); arma_debug_check( ((sig != 'f') && (sig != 's')), "conv(): unsupported value of 'shape' parameter" ); const uword mode = (sig == 's') ? uword(1) : uword(0); return Glue(A, B, mode); } template arma_warn_unused inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && is_same_type::value), const Glue >::result conv2(const T1& A, const T2& B, const char* shape = "full") { arma_extra_debug_sigprint(); const char sig = (shape != nullptr) ? shape[0] : char(0); arma_debug_check( ((sig != 'f') && (sig != 's')), "conv2(): unsupported value of 'shape' parameter" ); const uword mode = (sig == 's') ? uword(1) : uword(0); return Glue(A, B, mode); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_sp_minus_bones.hpp0000644000176200001440000000506514124060717024632 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_sp_minus //! @{ // Subtract a sparse object from a scalar; the output will be a dense object. class op_sp_minus_pre : public traits_op_passthru { public: template inline static void apply(Mat& out, const SpToDOp& in); // force apply into sparse matrix template inline static void apply(SpMat& out, const SpToDOp& in); // used for the optimization of sparse % (scalar - sparse) template inline static void apply_inside_schur(SpMat& out, const T2& x, const SpToDOp& y); // used for the optimization of sparse / (scalar - sparse) template inline static void apply_inside_div(SpMat& out, const T2& x, const SpToDOp& y); }; // Subtract a scalar from a sparse object; the output will be a dense object. class op_sp_minus_post : public traits_op_passthru { public: template inline static void apply(Mat& out, const SpToDOp& in); // force apply into sparse matrix template inline static void apply(SpMat& out, const SpToDOp& in); // used for the optimization of sparse % (sparse - scalar) template inline static void apply_inside_schur(SpMat& out, const T2& x, const SpToDOp& y); // used for the optimization of sparse / (sparse - scalar) template inline static void apply_inside_div(SpMat& out, const T2& x, const SpToDOp& y); }; //! @} RcppArmadillo/inst/include/armadillo_bits/eGlue_bones.hpp0000644000176200001440000000433514124060717023337 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup eGlue //! @{ template class eGlue : public Base< typename T1::elem_type, eGlue > { public: typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; typedef Proxy proxy1_type; typedef Proxy proxy2_type; static constexpr bool use_at = (Proxy::use_at || Proxy::use_at ); static constexpr bool use_mp = (Proxy::use_mp || Proxy::use_mp ); static constexpr bool has_subview = (Proxy::has_subview || Proxy::has_subview); static constexpr bool is_col = (Proxy::is_col || Proxy::is_col ); static constexpr bool is_row = (Proxy::is_row || Proxy::is_row ); static constexpr bool is_xvec = (Proxy::is_xvec || Proxy::is_xvec); arma_aligned const Proxy P1; arma_aligned const Proxy P2; arma_inline ~eGlue(); arma_inline eGlue(const T1& in_A, const T2& in_B); arma_inline uword get_n_rows() const; arma_inline uword get_n_cols() const; arma_inline uword get_n_elem() const; arma_inline elem_type operator[] (const uword ii) const; arma_inline elem_type at (const uword row, const uword col) const; arma_inline elem_type at_alt (const uword ii) const; }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_reverse_meat.hpp0000644000176200001440000000562114140733015024262 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_reverse //! @{ template inline void op_reverse::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "reverse(): parameter 'dim' must be 0 or 1" ); if(is_Mat::value) { // allow detection of in-place operation const unwrap U(in.m); if(dim == 0) { op_flipud::apply_direct(out, U.M); } if(dim == 1) { op_fliplr::apply_direct(out, U.M); } } else { const Proxy P(in.m); if(P.is_alias(out)) { Mat tmp; if(dim == 0) { op_flipud::apply_proxy_noalias(tmp, P); } if(dim == 1) { op_fliplr::apply_proxy_noalias(tmp, P); } out.steal_mem(tmp); } else { if(dim == 0) { op_flipud::apply_proxy_noalias(out, P); } if(dim == 1) { op_fliplr::apply_proxy_noalias(out, P); } } } } template inline void op_reverse_vec::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(is_Mat::value) { // allow detection of in-place operation const unwrap U(in.m); if((T1::is_xvec) ? bool(U.M.is_rowvec()) : bool(T1::is_row)) { op_fliplr::apply_direct(out, U.M); } else { op_flipud::apply_direct(out, U.M); } } else { const Proxy P(in.m); if(P.is_alias(out)) { Mat tmp; if((T1::is_xvec) ? bool(P.get_n_rows() == 1) : bool(T1::is_row)) { op_fliplr::apply_proxy_noalias(tmp, P); } else { op_flipud::apply_proxy_noalias(tmp, P); } out.steal_mem(tmp); } else { if((T1::is_xvec) ? bool(P.get_n_rows() == 1) : bool(T1::is_row)) { op_fliplr::apply_proxy_noalias(out, P); } else { op_flipud::apply_proxy_noalias(out, P); } } } } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_cumprod.hpp0000644000176200001440000000337614124060717023250 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_cumprod //! @{ template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && resolves_to_vector::yes, const Op >::result cumprod(const T1& X) { arma_extra_debug_sigprint(); return Op(X); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && resolves_to_vector::no, const Op >::result cumprod(const T1& X) { arma_extra_debug_sigprint(); return Op(X, 0, 0); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value, const Op >::result cumprod(const T1& X, const uword dim) { arma_extra_debug_sigprint(); return Op(X, dim, 0); } template arma_warn_unused arma_inline typename arma_scalar_only::result cumprod(const T& x) { return x; } //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_SortEigenvalue.hpp0000644000176200001440000001220714124060717025415 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { // 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 -std::abs(x). // The minus sign is due to the fact that std::sort() sorts in ascending order. // default target: throw an exception template struct SortingTarget { arma_inline static typename get_pod_type::result get(const eT& val) { arma_ignore(val); arma_stop_logic_error("newarp::SortingTarget: incompatible selection rule"); typedef typename get_pod_type::result out_T; return out_T(0); } }; // specialisation for LARGEST_MAGN: this covers [float, double, complex] x [LARGEST_MAGN] template struct SortingTarget { arma_inline static typename get_pod_type::result get(const eT& val) { return -std::abs(val); } }; // specialisation for LARGEST_REAL: this covers [complex] x [LARGEST_REAL] template struct SortingTarget, EigsSelect::LARGEST_REAL> { arma_inline static T get(const std::complex& val) { return -val.real(); } }; // specialisation for LARGEST_IMAG: this covers [complex] x [LARGEST_IMAG] template struct SortingTarget, EigsSelect::LARGEST_IMAG> { arma_inline static T get(const std::complex& val) { return -std::abs(val.imag()); } }; // specialisation for LARGEST_ALGE: this covers [float, double] x [LARGEST_ALGE] template struct SortingTarget { arma_inline static eT get(const eT& val) { return -val; } }; // Here BOTH_ENDS is the same as LARGEST_ALGE, but we need some additional steps, // which are done in SymEigsSolver => retrieve_ritzpair(). // There we move the smallest values to the proper locations. template struct SortingTarget { arma_inline static eT get(const eT& val) { return -val; } }; // specialisation for SMALLEST_MAGN: this covers [float, double, complex] x [SMALLEST_MAGN] template struct SortingTarget { arma_inline static typename get_pod_type::result get(const eT& val) { return std::abs(val); } }; // specialisation for SMALLEST_REAL: this covers [complex] x [SMALLEST_REAL] template struct SortingTarget, EigsSelect::SMALLEST_REAL> { arma_inline static T get(const std::complex& val) { return val.real(); } }; // specialisation for SMALLEST_IMAG: this covers [complex] x [SMALLEST_IMAG] template struct SortingTarget, EigsSelect::SMALLEST_IMAG> { arma_inline static T get(const std::complex& val) { return std::abs(val.imag()); } }; // specialisation for SMALLEST_ALGE: this covers [float, double] x [SMALLEST_ALGE] template struct SortingTarget { arma_inline static eT get(const eT& val) { return val; } }; // Sort eigenvalues and return the order index template struct PairComparator { arma_inline bool operator() (const PairType& v1, const PairType& v2) { return v1.first < v2.first; } }; template class SortEigenvalue { private: typedef typename get_pod_type::result TargetType; // type of the sorting target, will be a floating number type, eg. double typedef std::pair PairType; // type of the sorting pair, including the sorting target and the index std::vector pair_sort; public: inline SortEigenvalue(const eT* start, const uword size) : pair_sort(size) { arma_extra_debug_sigprint(); for(uword 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); } inline std::vector index() { arma_extra_debug_sigprint(); const uword len = pair_sort.size(); std::vector ind(len); for(uword i = 0; i < len; i++) { ind[i] = pair_sort[i].second; } return ind; } }; } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/fn_repmat.hpp0000644000176200001440000000252614124060717023063 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_repmat //! @{ template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value, const Op >::result repmat(const T1& A, const uword r, const uword c) { arma_extra_debug_sigprint(); return Op(A, r, c); } template arma_warn_unused arma_inline const SpOp repmat(const SpBase& A, const uword r, const uword c) { arma_extra_debug_sigprint(); return SpOp(A.get_ref(), r, c); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_diagmat_meat.hpp0000644000176200001440000004745114124060717024230 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_diagmat //! @{ template inline void op_diagmat::apply(Mat& out, const Op& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(is_Mat::value) { // allow detection of in-place operation const unwrap U(X.m); const Mat& A = U.M; if(&out != &A) // no aliasing { const Proxy< Mat > P(A); op_diagmat::apply(out, P); } else // we have aliasing { const uword n_rows = out.n_rows; const uword n_cols = out.n_cols; if((n_rows == 1) || (n_cols == 1)) // create diagonal matrix from vector { const eT* out_mem = out.memptr(); const uword N = out.n_elem; Mat tmp(N,N, arma_zeros_indicator()); for(uword i=0; i P(X.m); if(P.is_alias(out)) { Mat tmp; op_diagmat::apply(tmp, P); out.steal_mem(tmp); } else { op_diagmat::apply(out, P); } } } template inline void op_diagmat::apply(Mat& out, const Proxy& P) { arma_extra_debug_sigprint(); const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_elem = P.get_n_elem(); if(n_elem == 0) { out.reset(); return; } const bool P_is_vec = (T1::is_row) || (T1::is_col) || (n_rows == 1) || (n_cols == 1); if(P_is_vec) { out.zeros(n_elem, n_elem); if(Proxy::use_at == false) { typename Proxy::ea_type Pea = P.get_ea(); for(uword i=0; i < n_elem; ++i) { out.at(i,i) = Pea[i]; } } else { if(n_rows == 1) { for(uword i=0; i < n_elem; ++i) { out.at(i,i) = P.at(0,i); } } else { for(uword i=0; i < n_elem; ++i) { out.at(i,i) = P.at(i,0); } } } } else // P represents a matrix { out.zeros(n_rows, n_cols); const uword N = (std::min)(n_rows, n_cols); for(uword i=0; i inline void op_diagmat::apply(Mat& out, const Op< Glue, op_diagmat>& X) { arma_extra_debug_sigprint(); op_diagmat::apply_times(out, X.m.A, X.m.B); } template inline void op_diagmat::apply_times(Mat& actual_out, const T1& X, const T2& Y, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; const partial_unwrap UA(X); const partial_unwrap UB(Y); const typename partial_unwrap::stored_type& A = UA.M; const typename partial_unwrap::stored_type& B = UB.M; arma_debug_assert_trans_mul_size< partial_unwrap::do_trans, partial_unwrap::do_trans >(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "matrix multiplication"); const bool use_alpha = partial_unwrap::do_times || partial_unwrap::do_times; const eT alpha = use_alpha ? (UA.get_val() * UB.get_val()) : eT(0); const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; // check if the multiplication results in a vector if( (partial_unwrap::do_trans == false) && (partial_unwrap::do_trans == false) ) { if((A_n_rows == 1) || (B_n_cols == 1)) { arma_extra_debug_print("trans_A = false; trans_B = false; vector result"); const Mat C = A*B; const eT* C_mem = C.memptr(); const uword N = C.n_elem; actual_out.zeros(N,N); for(uword i=0; i::do_trans == true ) && (partial_unwrap::do_trans == false) ) { if((A_n_cols == 1) || (B_n_cols == 1)) { arma_extra_debug_print("trans_A = true; trans_B = false; vector result"); const Mat C = trans(A)*B; const eT* C_mem = C.memptr(); const uword N = C.n_elem; actual_out.zeros(N,N); for(uword i=0; i::do_trans == false) && (partial_unwrap::do_trans == true ) ) { if((A_n_rows == 1) || (B_n_rows == 1)) { arma_extra_debug_print("trans_A = false; trans_B = true; vector result"); const Mat C = A*trans(B); const eT* C_mem = C.memptr(); const uword N = C.n_elem; actual_out.zeros(N,N); for(uword i=0; i::do_trans == true ) && (partial_unwrap::do_trans == true ) ) { if((A_n_cols == 1) || (B_n_rows == 1)) { arma_extra_debug_print("trans_A = true; trans_B = true; vector result"); const Mat C = trans(A)*trans(B); const eT* C_mem = C.memptr(); const uword N = C.n_elem; actual_out.zeros(N,N); for(uword i=0; i tmp; Mat& out = (is_alias) ? tmp : actual_out; if( (partial_unwrap::do_trans == false) && (partial_unwrap::do_trans == false) ) { arma_extra_debug_print("trans_A = false; trans_B = false; matrix result"); out.zeros(A_n_rows, B_n_cols); const uword N = (std::min)(A_n_rows, B_n_cols); for(uword k=0; k < N; ++k) { eT acc1 = eT(0); eT acc2 = eT(0); const eT* B_colptr = B.colptr(k); // condition: A_n_cols = B_n_rows uword j; for(j=1; j < A_n_cols; j+=2) { const uword i = (j-1); const eT tmp_i = B_colptr[i]; const eT tmp_j = B_colptr[j]; acc1 += A.at(k, i) * tmp_i; acc2 += A.at(k, j) * tmp_j; } const uword i = (j-1); if(i < A_n_cols) { acc1 += A.at(k, i) * B_colptr[i]; } const eT acc = acc1 + acc2; out.at(k,k) = (use_alpha) ? eT(alpha * acc) : eT(acc); } } else if( (partial_unwrap::do_trans == true ) && (partial_unwrap::do_trans == false) ) { arma_extra_debug_print("trans_A = true; trans_B = false; matrix result"); out.zeros(A_n_cols, B_n_cols); const uword N = (std::min)(A_n_cols, B_n_cols); for(uword k=0; k < N; ++k) { const eT* A_colptr = A.colptr(k); const eT* B_colptr = B.colptr(k); // condition: A_n_rows = B_n_rows const eT acc = op_dot::direct_dot(A_n_rows, A_colptr, B_colptr); out.at(k,k) = (use_alpha) ? eT(alpha * acc) : eT(acc); } } else if( (partial_unwrap::do_trans == false) && (partial_unwrap::do_trans == true ) ) { arma_extra_debug_print("trans_A = false; trans_B = true; matrix result"); out.zeros(A_n_rows, B_n_rows); const uword N = (std::min)(A_n_rows, B_n_rows); for(uword k=0; k < N; ++k) { eT acc = eT(0); // condition: A_n_cols = B_n_cols for(uword i=0; i < A_n_cols; ++i) { acc += A.at(k,i) * B.at(k,i); } out.at(k,k) = (use_alpha) ? eT(alpha * acc) : eT(acc); } } else if( (partial_unwrap::do_trans == true ) && (partial_unwrap::do_trans == true ) ) { arma_extra_debug_print("trans_A = true; trans_B = true; matrix result"); out.zeros(A_n_cols, B_n_rows); const uword N = (std::min)(A_n_cols, B_n_rows); for(uword k=0; k < N; ++k) { eT acc = eT(0); const eT* A_colptr = A.colptr(k); // condition: A_n_rows = B_n_cols for(uword i=0; i < A_n_rows; ++i) { acc += A_colptr[i] * B.at(k,i); } out.at(k,k) = (use_alpha) ? eT(alpha * acc) : eT(acc); } } if(is_alias) { actual_out.steal_mem(tmp); } } template inline void op_diagmat::apply_times(Mat& actual_out, const T1& X, const T2& Y, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::pod_type T; typedef typename T1::elem_type eT; const partial_unwrap UA(X); const partial_unwrap UB(Y); const typename partial_unwrap::stored_type& A = UA.M; const typename partial_unwrap::stored_type& B = UB.M; arma_debug_assert_trans_mul_size< partial_unwrap::do_trans, partial_unwrap::do_trans >(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "matrix multiplication"); const bool use_alpha = partial_unwrap::do_times || partial_unwrap::do_times; const eT alpha = use_alpha ? (UA.get_val() * UB.get_val()) : eT(0); const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; // check if the multiplication results in a vector if( (partial_unwrap::do_trans == false) && (partial_unwrap::do_trans == false) ) { if((A_n_rows == 1) || (B_n_cols == 1)) { arma_extra_debug_print("trans_A = false; trans_B = false; vector result"); const Mat C = A*B; const eT* C_mem = C.memptr(); const uword N = C.n_elem; actual_out.zeros(N,N); for(uword i=0; i::do_trans == true ) && (partial_unwrap::do_trans == false) ) { if((A_n_cols == 1) || (B_n_cols == 1)) { arma_extra_debug_print("trans_A = true; trans_B = false; vector result"); const Mat C = trans(A)*B; const eT* C_mem = C.memptr(); const uword N = C.n_elem; actual_out.zeros(N,N); for(uword i=0; i::do_trans == false) && (partial_unwrap::do_trans == true ) ) { if((A_n_rows == 1) || (B_n_rows == 1)) { arma_extra_debug_print("trans_A = false; trans_B = true; vector result"); const Mat C = A*trans(B); const eT* C_mem = C.memptr(); const uword N = C.n_elem; actual_out.zeros(N,N); for(uword i=0; i::do_trans == true ) && (partial_unwrap::do_trans == true ) ) { if((A_n_cols == 1) || (B_n_rows == 1)) { arma_extra_debug_print("trans_A = true; trans_B = true; vector result"); const Mat C = trans(A)*trans(B); const eT* C_mem = C.memptr(); const uword N = C.n_elem; actual_out.zeros(N,N); for(uword i=0; i tmp; Mat& out = (is_alias) ? tmp : actual_out; if( (partial_unwrap::do_trans == false) && (partial_unwrap::do_trans == false) ) { arma_extra_debug_print("trans_A = false; trans_B = false; matrix result"); out.zeros(A_n_rows, B_n_cols); const uword N = (std::min)(A_n_rows, B_n_cols); for(uword k=0; k < N; ++k) { T acc_real = T(0); T acc_imag = T(0); const eT* B_colptr = B.colptr(k); // condition: A_n_cols = B_n_rows for(uword i=0; i < A_n_cols; ++i) { // acc += A.at(k, i) * B_colptr[i]; const std::complex& xx = A.at(k, i); const std::complex& yy = B_colptr[i]; const T a = xx.real(); const T b = xx.imag(); const T c = yy.real(); const T d = yy.imag(); acc_real += (a*c) - (b*d); acc_imag += (a*d) + (b*c); } const eT acc = std::complex(acc_real, acc_imag); out.at(k,k) = (use_alpha) ? eT(alpha * acc) : eT(acc); } } else if( (partial_unwrap::do_trans == true) && (partial_unwrap::do_trans == false) ) { arma_extra_debug_print("trans_A = true; trans_B = false; matrix result"); out.zeros(A_n_cols, B_n_cols); const uword N = (std::min)(A_n_cols, B_n_cols); for(uword k=0; k < N; ++k) { T acc_real = T(0); T acc_imag = T(0); const eT* A_colptr = A.colptr(k); const eT* B_colptr = B.colptr(k); // condition: A_n_rows = B_n_rows for(uword i=0; i < A_n_rows; ++i) { // acc += std::conj(A_colptr[i]) * B_colptr[i]; const std::complex& xx = A_colptr[i]; const std::complex& yy = B_colptr[i]; const T a = xx.real(); const T b = xx.imag(); const T c = yy.real(); const T d = yy.imag(); // take into account the complex conjugate of xx acc_real += (a*c) + (b*d); acc_imag += (a*d) - (b*c); } const eT acc = std::complex(acc_real, acc_imag); out.at(k,k) = (use_alpha) ? eT(alpha * acc) : eT(acc); } } else if( (partial_unwrap::do_trans == false) && (partial_unwrap::do_trans == true) ) { arma_extra_debug_print("trans_A = false; trans_B = true; matrix result"); out.zeros(A_n_rows, B_n_rows); const uword N = (std::min)(A_n_rows, B_n_rows); for(uword k=0; k < N; ++k) { T acc_real = T(0); T acc_imag = T(0); // condition: A_n_cols = B_n_cols for(uword i=0; i < A_n_cols; ++i) { // acc += A.at(k,i) * std::conj(B.at(k,i)); const std::complex& xx = A.at(k, i); const std::complex& yy = B.at(k, i); const T a = xx.real(); const T b = xx.imag(); const T c = yy.real(); const T d = -yy.imag(); // take the conjugate acc_real += (a*c) - (b*d); acc_imag += (a*d) + (b*c); } const eT acc = std::complex(acc_real, acc_imag); out.at(k,k) = (use_alpha) ? eT(alpha * acc) : eT(acc); } } else if( (partial_unwrap::do_trans == true) && (partial_unwrap::do_trans == true) ) { arma_extra_debug_print("trans_A = true; trans_B = true; matrix result"); out.zeros(A_n_cols, B_n_rows); const uword N = (std::min)(A_n_cols, B_n_rows); for(uword k=0; k < N; ++k) { T acc_real = T(0); T acc_imag = T(0); const eT* A_colptr = A.colptr(k); // condition: A_n_rows = B_n_cols for(uword i=0; i < A_n_rows; ++i) { // acc += std::conj(A_colptr[i]) * std::conj(B.at(k,i)); const std::complex& xx = A_colptr[i]; const std::complex& yy = B.at(k, i); const T a = xx.real(); const T b = -xx.imag(); // take the conjugate const T c = yy.real(); const T d = -yy.imag(); // take the conjugate acc_real += (a*c) - (b*d); acc_imag += (a*d) + (b*c); } const eT acc = std::complex(acc_real, acc_imag); out.at(k,k) = (use_alpha) ? eT(alpha * acc) : eT(acc); } } if(is_alias) { actual_out.steal_mem(tmp); } } // // // template inline void op_diagmat2::apply(Mat& out, const Op& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword row_offset = X.aux_uword_a; const uword col_offset = X.aux_uword_b; const Proxy P(X.m); if(P.is_alias(out)) { Mat tmp; op_diagmat2::apply(tmp, P, row_offset, col_offset); out.steal_mem(tmp); } else { op_diagmat2::apply(out, P, row_offset, col_offset); } } template inline void op_diagmat2::apply(Mat& out, const Proxy& P, const uword row_offset, const uword col_offset) { arma_extra_debug_sigprint(); const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_elem = P.get_n_elem(); if(n_elem == 0) { out.reset(); return; } const bool P_is_vec = (T1::is_row) || (T1::is_col) || (n_rows == 1) || (n_cols == 1); if(P_is_vec) { const uword n_pad = (std::max)(row_offset, col_offset); out.zeros(n_elem + n_pad, n_elem + n_pad); if(Proxy::use_at == false) { typename Proxy::ea_type Pea = P.get_ea(); for(uword i=0; i < n_elem; ++i) { out.at(row_offset + i, col_offset + i) = Pea[i]; } } else { if(n_rows == 1) { for(uword i=0; i < n_elem; ++i) { out.at(row_offset + i, col_offset + i) = P.at(0,i); } } else { for(uword i=0; i < n_elem; ++i) { out.at(row_offset + i, col_offset + i) = P.at(i,0); } } } } else // P represents a matrix { arma_debug_check_bounds ( ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)), "diagmat(): requested diagonal out of bounds" ); out.zeros(n_rows, n_cols); const uword N = (std::min)(n_rows - row_offset, n_cols - col_offset); for(uword i=0; i class subview : public Base< eT, subview > { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; arma_aligned const Mat& m; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; const uword aux_row1; const uword aux_col1; const uword n_rows; const uword n_cols; const uword n_elem; protected: arma_inline subview(const Mat& in_m, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols); public: inline ~subview(); inline subview() = delete; inline subview(const subview& in); inline subview( subview&& in); template inline void inplace_op(const eT val ); template inline void inplace_op(const Base& x, const char* identifier); template inline void inplace_op(const subview& x, const char* identifier); // deliberately returning void inline void operator= (const eT val); inline void operator+= (const eT val); inline void operator-= (const eT val); inline void operator*= (const eT val); inline void operator/= (const eT val); inline void operator= (const subview& x); inline void operator+= (const subview& x); inline void operator-= (const subview& x); inline void operator%= (const subview& x); inline void operator/= (const subview& x); template inline void operator= (const Base& x); template inline void operator+= (const Base& x); template inline void operator-= (const Base& x); template inline void operator%= (const Base& x); template inline void operator/= (const Base& x); template inline void operator= (const SpBase& x); template inline void operator+= (const SpBase& x); template inline void operator-= (const SpBase& x); template inline void operator%= (const SpBase& x); template inline void operator/= (const SpBase& x); template inline typename enable_if2< is_same_type::value, void>::result operator=(const Gen& x); inline void operator=(const std::initializer_list& list); inline void operator=(const std::initializer_list< std::initializer_list >& list); inline static void extract(Mat& out, const subview& in); inline static void plus_inplace(Mat& out, const subview& in); inline static void minus_inplace(Mat& out, const subview& in); inline static void schur_inplace(Mat& out, const subview& in); inline static void div_inplace(Mat& out, const subview& in); template inline void for_each(functor F); template inline void for_each(functor F) const; template inline void transform(functor F); template inline void imbue(functor F); inline void replace(const eT old_val, const eT new_val); inline void clean(const pod_type threshold); inline void clamp(const eT min_val, const eT max_val); inline void fill(const eT val); inline void zeros(); inline void ones(); inline void eye(); inline void randu(); inline void randn(); inline arma_warn_unused eT at_alt (const uword ii) const; inline arma_warn_unused eT& operator[](const uword ii); inline arma_warn_unused eT operator[](const uword ii) const; inline arma_warn_unused eT& operator()(const uword ii); inline arma_warn_unused eT operator()(const uword ii) const; inline arma_warn_unused eT& operator()(const uword in_row, const uword in_col); inline arma_warn_unused eT operator()(const uword in_row, const uword in_col) const; inline arma_warn_unused eT& at(const uword in_row, const uword in_col); inline arma_warn_unused eT at(const uword in_row, const uword in_col) const; inline arma_warn_unused eT& front(); inline arma_warn_unused eT front() const; inline arma_warn_unused eT& back(); inline arma_warn_unused eT back() const; arma_inline eT* colptr(const uword in_col); arma_inline const eT* colptr(const uword in_col) const; template inline bool check_overlap(const subview& x) const; inline arma_warn_unused bool is_vec() const; inline arma_warn_unused bool is_finite() const; inline arma_warn_unused bool is_zero(const pod_type tol = 0) const; inline arma_warn_unused bool has_inf() const; inline arma_warn_unused bool has_nan() const; inline subview_row row(const uword row_num); inline const subview_row row(const uword row_num) const; inline subview_row operator()(const uword row_num, const span& col_span); inline const subview_row operator()(const uword row_num, const span& col_span) const; inline subview_col col(const uword col_num); inline const subview_col col(const uword col_num) const; inline subview_col operator()(const span& row_span, const uword col_num); inline const subview_col operator()(const span& row_span, const uword col_num) const; inline Col unsafe_col(const uword col_num); inline const Col unsafe_col(const uword col_num) const; inline subview rows(const uword in_row1, const uword in_row2); inline const subview rows(const uword in_row1, const uword in_row2) const; inline subview cols(const uword in_col1, const uword in_col2); inline const subview cols(const uword in_col1, const uword in_col2) const; inline subview submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2); inline const subview submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const; inline subview submat (const span& row_span, const span& col_span); inline const subview submat (const span& row_span, const span& col_span) const; inline subview operator()(const span& row_span, const span& col_span); inline const subview operator()(const span& row_span, const span& col_span) const; inline subview_each1< subview, 0 > each_col(); inline subview_each1< subview, 1 > each_row(); template inline subview_each2< subview, 0, T1 > each_col(const Base& indices); template inline subview_each2< subview, 1, T1 > each_row(const Base& indices); inline void each_col(const std::function< void( Col&) >& F); inline void each_col(const std::function< void(const Col&) >& F) const; inline void each_row(const std::function< void( Row&) >& F); inline void each_row(const std::function< void(const Row&) >& F) const; inline diagview diag(const sword in_id = 0); inline const diagview diag(const sword in_id = 0) const; inline void swap_rows(const uword in_row1, const uword in_row2); inline void swap_cols(const uword in_col1, const uword in_col2); class const_iterator; class iterator { public: inline iterator(); inline iterator(const iterator& X); inline iterator(subview& in_sv, const uword in_row, const uword in_col); inline arma_warn_unused eT& operator*(); inline iterator& operator++(); inline arma_warn_unused iterator operator++(int); inline arma_warn_unused bool operator==(const iterator& rhs) const; inline arma_warn_unused bool operator!=(const iterator& rhs) const; inline arma_warn_unused bool operator==(const const_iterator& rhs) const; inline arma_warn_unused bool operator!=(const const_iterator& rhs) const; typedef std::forward_iterator_tag iterator_category; typedef eT value_type; typedef std::ptrdiff_t difference_type; // TODO: not certain on this one typedef eT* pointer; typedef eT& reference; arma_aligned Mat* M; arma_aligned eT* current_ptr; arma_aligned uword current_row; arma_aligned uword current_col; arma_aligned const uword aux_row1; arma_aligned const uword aux_row2_p1; }; class const_iterator { public: inline const_iterator(); inline const_iterator(const iterator& X); inline const_iterator(const const_iterator& X); inline const_iterator(const subview& in_sv, const uword in_row, const uword in_col); inline arma_warn_unused const eT& operator*(); inline const_iterator& operator++(); inline arma_warn_unused const_iterator operator++(int); inline arma_warn_unused bool operator==(const iterator& rhs) const; inline arma_warn_unused bool operator!=(const iterator& rhs) const; inline arma_warn_unused bool operator==(const const_iterator& rhs) const; inline arma_warn_unused bool operator!=(const const_iterator& rhs) const; // So that we satisfy the STL iterator types. typedef std::forward_iterator_tag iterator_category; typedef eT value_type; typedef std::ptrdiff_t difference_type; // TODO: not certain on this one typedef const eT* pointer; typedef const eT& reference; arma_aligned const Mat* M; arma_aligned const eT* current_ptr; arma_aligned uword current_row; arma_aligned uword current_col; arma_aligned const uword aux_row1; arma_aligned const uword aux_row2_p1; }; class const_row_iterator; class row_iterator { public: inline row_iterator(); inline row_iterator(const row_iterator& X); inline row_iterator(subview& in_sv, const uword in_row, const uword in_col); inline arma_warn_unused eT& operator* (); inline row_iterator& operator++(); inline arma_warn_unused row_iterator operator++(int); inline arma_warn_unused bool operator!=(const row_iterator& X) const; inline arma_warn_unused bool operator==(const row_iterator& X) const; inline arma_warn_unused bool operator!=(const const_row_iterator& X) const; inline arma_warn_unused bool operator==(const const_row_iterator& X) const; typedef std::forward_iterator_tag iterator_category; typedef eT value_type; typedef std::ptrdiff_t difference_type; // TODO: not certain on this one typedef eT* pointer; typedef eT& reference; arma_aligned Mat* M; arma_aligned uword current_row; arma_aligned uword current_col; arma_aligned const uword aux_col1; arma_aligned const uword aux_col2_p1; }; class const_row_iterator { public: inline const_row_iterator(); inline const_row_iterator(const row_iterator& X); inline const_row_iterator(const const_row_iterator& X); inline const_row_iterator(const subview& in_sv, const uword in_row, const uword in_col); inline arma_warn_unused const eT& operator*() const; inline const_row_iterator& operator++(); inline arma_warn_unused const_row_iterator operator++(int); inline arma_warn_unused bool operator!=(const row_iterator& X) const; inline arma_warn_unused bool operator==(const row_iterator& X) const; inline arma_warn_unused bool operator!=(const const_row_iterator& X) const; inline arma_warn_unused bool operator==(const const_row_iterator& X) const; typedef std::forward_iterator_tag iterator_category; typedef eT value_type; typedef std::ptrdiff_t difference_type; // TODO: not certain on this one typedef const eT* pointer; typedef const eT& reference; arma_aligned const Mat* M; arma_aligned uword current_row; arma_aligned uword current_col; arma_aligned const uword aux_col1; arma_aligned const uword aux_col2_p1; }; inline iterator begin(); inline const_iterator begin() const; inline const_iterator cbegin() const; inline iterator end(); inline const_iterator end() const; inline const_iterator cend() const; friend class Mat; }; template class subview_col : public subview { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; const eT* colmem; inline void operator= (const subview& x); inline void operator= (const subview_col& x); inline void operator= (const eT val); inline void operator= (const std::initializer_list& list); template inline void operator= (const Base& x); template inline void operator= (const SpBase& x); template inline typename enable_if2< is_same_type::value, void>::result operator=(const Gen& x); arma_inline arma_warn_unused const Op,op_htrans> t() const; arma_inline arma_warn_unused const Op,op_htrans> ht() const; arma_inline arma_warn_unused const Op,op_strans> st() const; arma_inline arma_warn_unused const Op,op_strans> as_row() const; inline void fill(const eT val); inline void zeros(); inline void ones(); arma_inline eT at_alt (const uword i) const; arma_inline eT& operator[](const uword i); arma_inline eT operator[](const uword i) const; inline eT& operator()(const uword i); inline eT operator()(const uword i) const; inline eT& operator()(const uword in_row, const uword in_col); inline eT operator()(const uword in_row, const uword in_col) const; inline eT& at(const uword in_row, const uword in_col); inline eT at(const uword in_row, const uword in_col) const; arma_inline eT* colptr(const uword in_col); arma_inline const eT* colptr(const uword in_col) const; inline subview_col rows(const uword in_row1, const uword in_row2); inline const subview_col rows(const uword in_row1, const uword in_row2) const; inline subview_col subvec(const uword in_row1, const uword in_row2); inline const subview_col subvec(const uword in_row1, const uword in_row2) const; inline subview_col subvec(const uword start_row, const SizeMat& s); inline const subview_col subvec(const uword start_row, const SizeMat& s) const; inline subview_col head(const uword N); inline const subview_col head(const uword N) const; inline subview_col tail(const uword N); inline const subview_col tail(const uword N) const; inline arma_warn_unused eT min() const; inline arma_warn_unused eT max() const; inline eT min(uword& index_of_min_val) const; inline eT max(uword& index_of_max_val) const; inline arma_warn_unused uword index_min() const; inline arma_warn_unused uword index_max() const; inline subview_col(const subview_col& in); inline subview_col( subview_col&& in); protected: inline subview_col(const Mat& in_m, const uword in_col); inline subview_col(const Mat& in_m, const uword in_col, const uword in_row1, const uword in_n_rows); inline subview_col() = delete; friend class Mat; friend class Col; friend class subview; }; template class subview_cols : public subview { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; inline subview_cols(const subview_cols& in); inline subview_cols( subview_cols&& in); inline void operator= (const subview& x); inline void operator= (const subview_cols& x); inline void operator= (const eT val); inline void operator= (const std::initializer_list& list); inline void operator= (const std::initializer_list< std::initializer_list >& list); template inline void operator= (const Base& x); template inline void operator= (const SpBase& x); template inline typename enable_if2< is_same_type::value, void>::result operator=(const Gen& x); arma_inline arma_warn_unused const Op,op_htrans> t() const; arma_inline arma_warn_unused const Op,op_htrans> ht() const; arma_inline arma_warn_unused const Op,op_strans> st() const; arma_inline arma_warn_unused const Op,op_vectorise_col> as_col() const; inline arma_warn_unused eT at_alt (const uword ii) const; inline arma_warn_unused eT& operator[](const uword ii); inline arma_warn_unused eT operator[](const uword ii) const; inline arma_warn_unused eT& operator()(const uword ii); inline arma_warn_unused eT operator()(const uword ii) const; inline arma_warn_unused eT& operator()(const uword in_row, const uword in_col); inline arma_warn_unused eT operator()(const uword in_row, const uword in_col) const; inline arma_warn_unused eT& at(const uword in_row, const uword in_col); inline arma_warn_unused eT at(const uword in_row, const uword in_col) const; arma_inline eT* colptr(const uword in_col); arma_inline const eT* colptr(const uword in_col) const; protected: inline subview_cols(const Mat& in_m, const uword in_col1, const uword in_n_cols); inline subview_cols() = delete; friend class Mat; friend class subview; }; template class subview_row : public subview { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = true; static constexpr bool is_col = false; static constexpr bool is_xvec = false; inline void operator= (const subview& x); inline void operator= (const subview_row& x); inline void operator= (const eT val); inline void operator= (const std::initializer_list& list); template inline void operator= (const Base& x); template inline void operator= (const SpBase& x); template inline typename enable_if2< is_same_type::value, void>::result operator=(const Gen& x); arma_inline arma_warn_unused const Op,op_htrans> t() const; arma_inline arma_warn_unused const Op,op_htrans> ht() const; arma_inline arma_warn_unused const Op,op_strans> st() const; arma_inline arma_warn_unused const Op,op_strans> as_col() const; inline eT at_alt (const uword i) const; inline eT& operator[](const uword i); inline eT operator[](const uword i) const; inline eT& operator()(const uword i); inline eT operator()(const uword i) const; inline eT& operator()(const uword in_row, const uword in_col); inline eT operator()(const uword in_row, const uword in_col) const; inline eT& at(const uword in_row, const uword in_col); inline eT at(const uword in_row, const uword in_col) const; inline subview_row cols(const uword in_col1, const uword in_col2); inline const subview_row cols(const uword in_col1, const uword in_col2) const; inline subview_row subvec(const uword in_col1, const uword in_col2); inline const subview_row subvec(const uword in_col1, const uword in_col2) const; inline subview_row subvec(const uword start_col, const SizeMat& s); inline const subview_row subvec(const uword start_col, const SizeMat& s) const; inline subview_row head(const uword N); inline const subview_row head(const uword N) const; inline subview_row tail(const uword N); inline const subview_row tail(const uword N) const; inline arma_warn_unused uword index_min() const; inline arma_warn_unused uword index_max() const; inline typename subview::row_iterator begin(); inline typename subview::const_row_iterator begin() const; inline typename subview::const_row_iterator cbegin() const; inline typename subview::row_iterator end(); inline typename subview::const_row_iterator end() const; inline typename subview::const_row_iterator cend() const; inline subview_row(const subview_row& in); inline subview_row( subview_row&& in); protected: inline subview_row(const Mat& in_m, const uword in_row); inline subview_row(const Mat& in_m, const uword in_row, const uword in_col1, const uword in_n_cols); inline subview_row() = delete; friend class Mat; friend class Row; friend class subview; }; template class subview_row_strans : public Base< eT, subview_row_strans > { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const subview_row& sv_row; const uword n_rows; // equal to n_elem const uword n_elem; static constexpr uword n_cols = 1; inline explicit subview_row_strans(const subview_row& in_sv_row); inline void extract(Mat& out) const; inline eT at_alt (const uword i) const; inline eT operator[](const uword i) const; inline eT operator()(const uword i) const; inline eT operator()(const uword in_row, const uword in_col) const; inline eT at(const uword in_row, const uword in_col) const; }; template class subview_row_htrans : public Base< eT, subview_row_htrans > { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; arma_aligned const subview_row& sv_row; const uword n_rows; // equal to n_elem const uword n_elem; static constexpr uword n_cols = 1; inline explicit subview_row_htrans(const subview_row& in_sv_row); inline void extract(Mat& out) const; inline eT at_alt (const uword i) const; inline eT operator[](const uword i) const; inline eT operator()(const uword i) const; inline eT operator()(const uword in_row, const uword in_col) const; inline eT at(const uword in_row, const uword in_col) const; }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_find.hpp0000644000176200001440000001651014124060717022511 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_find //! @{ template arma_warn_unused inline typename enable_if2 < is_arma_type::value, const mtOp >::result find(const T1& X) { arma_extra_debug_sigprint(); return mtOp(X); } template arma_warn_unused inline const mtOp find(const Base& X, const uword k, const char* direction = "first") { arma_extra_debug_sigprint(); const char sig = (direction != nullptr) ? direction[0] : char(0); arma_debug_check ( ( (sig != 'f') && (sig != 'F') && (sig != 'l') && (sig != 'L') ), "find(): direction must be \"first\" or \"last\"" ); const uword type = ( (sig == 'f') || (sig == 'F') ) ? 0 : 1; return mtOp(X.get_ref(), k, type); } // template arma_warn_unused inline uvec find(const BaseCube& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_cube tmp(X.get_ref()); const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); return find(R); } template arma_warn_unused inline uvec find(const BaseCube& X, const uword k, const char* direction = "first") { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_cube tmp(X.get_ref()); const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); return find(R, k, direction); } template arma_warn_unused inline uvec find(const mtOpCube& X, const uword k = 0, const char* direction = "first") { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_cube tmp(X.m); const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); return find( mtOp, op_rel_type>(R, X.aux), k, direction ); } template arma_warn_unused inline uvec find(const mtGlueCube& X, const uword k = 0, const char* direction = "first") { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; const unwrap_cube tmp1(X.A); const unwrap_cube tmp2(X.B); arma_debug_assert_same_size( tmp1.M, tmp2.M, "relational operator" ); const Mat R1( const_cast< eT1* >(tmp1.M.memptr()), tmp1.M.n_elem, 1, false ); const Mat R2( const_cast< eT2* >(tmp2.M.memptr()), tmp2.M.n_elem, 1, false ); return find( mtGlue, Mat, glue_rel_type>(R1, R2), k, direction ); } // template arma_warn_unused inline Col find(const SpBase& X, const uword k = 0) { arma_extra_debug_sigprint(); const SpProxy P(X.get_ref()); const uword n_rows = P.get_n_rows(); const uword n_nz = P.get_n_nonzero(); Mat tmp(n_nz, 1, arma_nozeros_indicator()); uword* tmp_mem = tmp.memptr(); typename SpProxy::const_iterator_type it = P.begin(); for(uword i=0; i out; const uword count = (k == 0) ? uword(n_nz) : uword( (std::min)(n_nz, k) ); out.steal_mem_col(tmp, count); return out; } template arma_warn_unused inline Col find(const SpBase& X, const uword k, const char* direction) { arma_extra_debug_sigprint(); arma_ignore(X); arma_ignore(k); arma_ignore(direction); arma_check(true, "find(SpBase,k,direction): not implemented yet"); // TODO Col out; return out; } // template arma_warn_unused inline typename enable_if2 < is_arma_type::value, const mtOp >::result find_finite(const T1& X) { arma_extra_debug_sigprint(); return mtOp(X); } template arma_warn_unused inline typename enable_if2 < is_arma_type::value, const mtOp >::result find_nonfinite(const T1& X) { arma_extra_debug_sigprint(); return mtOp(X); } // template arma_warn_unused inline uvec find_finite(const BaseCube& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_cube tmp(X.get_ref()); const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); return find_finite(R); } template arma_warn_unused inline uvec find_nonfinite(const BaseCube& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_cube tmp(X.get_ref()); const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); return find_nonfinite(R); } // template arma_warn_unused inline Col find_finite(const SpBase& X) { arma_extra_debug_sigprint(); const SpProxy P(X.get_ref()); const uword n_rows = P.get_n_rows(); const uword n_nz = P.get_n_nonzero(); Mat tmp(n_nz, 1, arma_nozeros_indicator()); uword* tmp_mem = tmp.memptr(); typename SpProxy::const_iterator_type it = P.begin(); uword count = 0; for(uword i=0; i out; if(count > 0) { out.steal_mem_col(tmp, count); } return out; } template arma_warn_unused inline Col find_nonfinite(const SpBase& X) { arma_extra_debug_sigprint(); const SpProxy P(X.get_ref()); const uword n_rows = P.get_n_rows(); const uword n_nz = P.get_n_nonzero(); Mat tmp(n_nz, 1, arma_nozeros_indicator()); uword* tmp_mem = tmp.memptr(); typename SpProxy::const_iterator_type it = P.begin(); uword count = 0; for(uword i=0; i out; if(count > 0) { out.steal_mem_col(tmp, count); } return out; } //! @} RcppArmadillo/inst/include/armadillo_bits/arma_version.hpp0000644000176200001440000000276714173165515023612 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup arma_version //! @{ #define ARMA_VERSION_MAJOR 10 #define ARMA_VERSION_MINOR 8 #define ARMA_VERSION_PATCH 1 #define ARMA_VERSION_NAME "Realm Raider" struct arma_version { static constexpr unsigned int major = ARMA_VERSION_MAJOR; static constexpr unsigned int minor = ARMA_VERSION_MINOR; static constexpr unsigned int patch = ARMA_VERSION_PATCH; static inline std::string as_string() { const char* nickname = ARMA_VERSION_NAME; std::ostringstream ss; ss << arma_version::major << '.' << arma_version::minor << '.' << arma_version::patch << " (" << nickname << ')'; return ss.str(); } }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_stddev_bones.hpp0000644000176200001440000000210114124060717024252 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_stddev //! @{ //! Class for finding the standard deviation class op_stddev : public traits_op_xvec { public: template inline static void apply(Mat& out, const mtOp& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_mean_meat.hpp0000644000176200001440000003356414124060717023542 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_mean //! @{ template inline void op_mean::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "mean(): parameter 'dim' must be 0 or 1" ); const Proxy P(in.m); if(P.is_alias(out) == false) { op_mean::apply_noalias(out, P, dim); } else { Mat tmp; op_mean::apply_noalias(tmp, P, dim); out.steal_mem(tmp); } } template inline void op_mean::apply_noalias(Mat& out, const Proxy& P, const uword dim) { arma_extra_debug_sigprint(); if(is_Mat::stored_type>::value) { op_mean::apply_noalias_unwrap(out, P, dim); } else { op_mean::apply_noalias_proxy(out, P, dim); } } template inline void op_mean::apply_noalias_unwrap(Mat& out, const Proxy& P, const uword dim) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; typedef typename Proxy::stored_type P_stored_type; const unwrap tmp(P.Q); const typename unwrap::stored_type& X = tmp.M; const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(dim == 0) { out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols); if(X_n_rows == 0) { return; } eT* out_mem = out.memptr(); for(uword col=0; col < X_n_cols; ++col) { out_mem[col] = op_mean::direct_mean( X.colptr(col), X_n_rows ); } } else if(dim == 1) { out.zeros(X_n_rows, (X_n_cols > 0) ? 1 : 0); if(X_n_cols == 0) { return; } eT* out_mem = out.memptr(); for(uword col=0; col < X_n_cols; ++col) { const eT* col_mem = X.colptr(col); for(uword row=0; row < X_n_rows; ++row) { out_mem[row] += col_mem[row]; } } out /= T(X_n_cols); for(uword row=0; row < X_n_rows; ++row) { if(arma_isfinite(out_mem[row]) == false) { out_mem[row] = op_mean::direct_mean_robust( X, row ); } } } } template arma_hot inline void op_mean::apply_noalias_proxy(Mat& out, const Proxy& P, const uword dim) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; const uword P_n_rows = P.get_n_rows(); const uword P_n_cols = P.get_n_cols(); if(dim == 0) { out.set_size((P_n_rows > 0) ? 1 : 0, P_n_cols); if(P_n_rows == 0) { return; } eT* out_mem = out.memptr(); for(uword col=0; col < P_n_cols; ++col) { eT val1 = eT(0); eT val2 = eT(0); uword i,j; for(i=0, j=1; j < P_n_rows; i+=2, j+=2) { val1 += P.at(i,col); val2 += P.at(j,col); } if(i < P_n_rows) { val1 += P.at(i,col); } out_mem[col] = (val1 + val2) / T(P_n_rows); } } else if(dim == 1) { out.zeros(P_n_rows, (P_n_cols > 0) ? 1 : 0); if(P_n_cols == 0) { return; } eT* out_mem = out.memptr(); for(uword col=0; col < P_n_cols; ++col) for(uword row=0; row < P_n_rows; ++row) { out_mem[row] += P.at(row,col); } out /= T(P_n_cols); } if(out.is_finite() == false) { // TODO: replace with dedicated handling to avoid unwrapping op_mean::apply_noalias_unwrap(out, P, dim); } } // // cubes template inline void op_mean::apply(Cube& out, const OpCube& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 2), "mean(): parameter 'dim' must be 0 or 1 or 2" ); const ProxyCube P(in.m); if(P.is_alias(out) == false) { op_mean::apply_noalias(out, P, dim); } else { Cube tmp; op_mean::apply_noalias(tmp, P, dim); out.steal_mem(tmp); } } template inline void op_mean::apply_noalias(Cube& out, const ProxyCube& P, const uword dim) { arma_extra_debug_sigprint(); if(is_Cube::stored_type>::value) { op_mean::apply_noalias_unwrap(out, P, dim); } else { op_mean::apply_noalias_proxy(out, P, dim); } } template inline void op_mean::apply_noalias_unwrap(Cube& out, const ProxyCube& P, const uword dim) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; typedef typename ProxyCube::stored_type P_stored_type; const unwrap_cube U(P.Q); const Cube& X = U.M; const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword X_n_slices = X.n_slices; if(dim == 0) { out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols, X_n_slices); if(X_n_rows == 0) { return; } for(uword slice=0; slice < X_n_slices; ++slice) { eT* out_mem = out.slice_memptr(slice); for(uword col=0; col < X_n_cols; ++col) { out_mem[col] = op_mean::direct_mean( X.slice_colptr(slice,col), X_n_rows ); } } } else if(dim == 1) { out.zeros(X_n_rows, (X_n_cols > 0) ? 1 : 0, X_n_slices); if(X_n_cols == 0) { return; } for(uword slice=0; slice < X_n_slices; ++slice) { eT* out_mem = out.slice_memptr(slice); for(uword col=0; col < X_n_cols; ++col) { const eT* col_mem = X.slice_colptr(slice,col); for(uword row=0; row < X_n_rows; ++row) { out_mem[row] += col_mem[row]; } } const Mat tmp('j', X.slice_memptr(slice), X_n_rows, X_n_cols); for(uword row=0; row < X_n_rows; ++row) { out_mem[row] /= T(X_n_cols); if(arma_isfinite(out_mem[row]) == false) { out_mem[row] = op_mean::direct_mean_robust( tmp, row ); } } } } else if(dim == 2) { out.zeros(X_n_rows, X_n_cols, (X_n_slices > 0) ? 1 : 0); if(X_n_slices == 0) { return; } eT* out_mem = out.memptr(); for(uword slice=0; slice < X_n_slices; ++slice) { arrayops::inplace_plus(out_mem, X.slice_memptr(slice), X.n_elem_slice ); } out /= T(X_n_slices); podarray tmp(X_n_slices); for(uword col=0; col < X_n_cols; ++col) for(uword row=0; row < X_n_rows; ++row) { if(arma_isfinite(out.at(row,col,0)) == false) { for(uword slice=0; slice < X_n_slices; ++slice) { tmp[slice] = X.at(row,col,slice); } out.at(row,col,0) = op_mean::direct_mean_robust(tmp.memptr(), X_n_slices); } } } } template arma_hot inline void op_mean::apply_noalias_proxy(Cube& out, const ProxyCube& P, const uword dim) { arma_extra_debug_sigprint(); op_mean::apply_noalias_unwrap(out, P, dim); // TODO: implement specialised handling } // template inline eT op_mean::direct_mean(const eT* const X, const uword n_elem) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const eT result = arrayops::accumulate(X, n_elem) / T(n_elem); return arma_isfinite(result) ? result : op_mean::direct_mean_robust(X, n_elem); } template inline eT op_mean::direct_mean_robust(const eT* const X, const uword n_elem) { arma_extra_debug_sigprint(); // use an adapted form of the mean finding algorithm from the running_stat class typedef typename get_pod_type::result T; uword i,j; eT r_mean = eT(0); for(i=0, j=1; j inline eT op_mean::direct_mean(const Mat& X, const uword row) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const uword X_n_cols = X.n_cols; eT val = eT(0); uword i,j; for(i=0, j=1; j < X_n_cols; i+=2, j+=2) { val += X.at(row,i); val += X.at(row,j); } if(i < X_n_cols) { val += X.at(row,i); } const eT result = val / T(X_n_cols); return arma_isfinite(result) ? result : op_mean::direct_mean_robust(X, row); } template inline eT op_mean::direct_mean_robust(const Mat& X, const uword row) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const uword X_n_cols = X.n_cols; eT r_mean = eT(0); for(uword col=0; col < X_n_cols; ++col) { r_mean = r_mean + (X.at(row,col) - r_mean)/T(col+1); } return r_mean; } template inline eT op_mean::mean_all(const subview& X) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword X_n_elem = X.n_elem; if(X_n_elem == 0) { arma_debug_check(true, "mean(): object has no elements"); return Datum::nan; } eT val = eT(0); if(X_n_rows == 1) { const Mat& A = X.m; const uword start_row = X.aux_row1; const uword start_col = X.aux_col1; const uword end_col_p1 = start_col + X_n_cols; uword i,j; for(i=start_col, j=start_col+1; j < end_col_p1; i+=2, j+=2) { val += A.at(start_row, i); val += A.at(start_row, j); } if(i < end_col_p1) { val += A.at(start_row, i); } } else { for(uword col=0; col < X_n_cols; ++col) { val += arrayops::accumulate(X.colptr(col), X_n_rows); } } const eT result = val / T(X_n_elem); return arma_isfinite(result) ? result : op_mean::mean_all_robust(X); } template inline eT op_mean::mean_all_robust(const subview& X) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword start_row = X.aux_row1; const uword start_col = X.aux_col1; const uword end_row_p1 = start_row + X_n_rows; const uword end_col_p1 = start_col + X_n_cols; const Mat& A = X.m; eT r_mean = eT(0); if(X_n_rows == 1) { uword i=0; for(uword col = start_col; col < end_col_p1; ++col, ++i) { r_mean = r_mean + (A.at(start_row,col) - r_mean)/T(i+1); } } else { uword i=0; for(uword col = start_col; col < end_col_p1; ++col) for(uword row = start_row; row < end_row_p1; ++row, ++i) { r_mean = r_mean + (A.at(row,col) - r_mean)/T(i+1); } } return r_mean; } template inline eT op_mean::mean_all(const diagview& X) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const uword X_n_elem = X.n_elem; if(X_n_elem == 0) { arma_debug_check(true, "mean(): object has no elements"); return Datum::nan; } eT val = eT(0); for(uword i=0; i inline eT op_mean::mean_all_robust(const diagview& X) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const uword X_n_elem = X.n_elem; eT r_mean = eT(0); for(uword i=0; i inline typename T1::elem_type op_mean::mean_all(const Op& X) { arma_extra_debug_sigprint(); return op_mean::mean_all(X.m); } template inline typename T1::elem_type op_mean::mean_all(const Base& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap tmp(X.get_ref()); const Mat& A = tmp.M; const uword A_n_elem = A.n_elem; if(A_n_elem == 0) { arma_debug_check(true, "mean(): object has no elements"); return Datum::nan; } return op_mean::direct_mean(A.memptr(), A_n_elem); } template arma_inline eT op_mean::robust_mean(const eT A, const eT B) { return A + (B - A)/eT(2); } template arma_inline std::complex op_mean::robust_mean(const std::complex& A, const std::complex& B) { return A + (B - A)/T(2); } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_norm_meat.hpp0000644000176200001440000000540614124060717024132 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_norm //! @{ template inline typename get_pod_type::result spop_norm::mat_norm_1(const SpMat& X) { arma_extra_debug_sigprint(); // TODO: this can be sped up with a dedicated implementation return as_scalar( max( sum(abs(X), 0), 1) ); } template inline typename get_pod_type::result spop_norm::mat_norm_2(const SpMat& X, const typename arma_real_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); // norm = sqrt( largest eigenvalue of (A^H)*A ), where ^H is the conjugate transpose // http://math.stackexchange.com/questions/4368/computing-the-largest-eigenvalue-of-a-very-large-sparse-matrix typedef typename get_pod_type::result T; const SpMat& A = X; const SpMat B = trans(A); const SpMat C = (A.n_rows <= A.n_cols) ? (A*B) : (B*A); Col eigval; eigs_sym(eigval, C, 1); return (eigval.n_elem > 0) ? T(std::sqrt(eigval[0])) : T(0); } template inline typename get_pod_type::result spop_norm::mat_norm_2(const SpMat& X, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename get_pod_type::result T; // we're calling eigs_gen(), which currently requires ARPACK #if !defined(ARMA_USE_ARPACK) { arma_stop_logic_error("norm(): use of ARPACK must be enabled for norm of complex matrices"); return T(0); } #endif const SpMat& A = X; const SpMat B = trans(A); const SpMat C = (A.n_rows <= A.n_cols) ? (A*B) : (B*A); Col eigval; eigs_gen(eigval, C, 1); return (eigval.n_elem > 0) ? T(std::sqrt(std::real(eigval[0]))) : T(0); } template inline typename get_pod_type::result spop_norm::mat_norm_inf(const SpMat& X) { arma_extra_debug_sigprint(); // TODO: this can be sped up with a dedicated implementation return as_scalar( max( sum(abs(X), 1), 0) ); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_mean_bones.hpp0000644000176200001440000000633214124060717023713 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_mean //! @{ //! Class for finding mean values of a matrix class op_mean : public traits_op_xvec { public: // dense matrices template inline static void apply(Mat& out, const Op& in); template inline static void apply_noalias(Mat& out, const Proxy& P, const uword dim); template inline static void apply_noalias_unwrap(Mat& out, const Proxy& P, const uword dim); template inline static void apply_noalias_proxy(Mat& out, const Proxy& P, const uword dim); // cubes template inline static void apply(Cube& out, const OpCube& in); template inline static void apply_noalias(Cube& out, const ProxyCube& P, const uword dim); template inline static void apply_noalias_unwrap(Cube& out, const ProxyCube& P, const uword dim); template inline static void apply_noalias_proxy(Cube& out, const ProxyCube& P, const uword dim); // template inline static eT direct_mean(const eT* const X, const uword N); template inline static eT direct_mean_robust(const eT* const X, const uword N); // template inline static eT direct_mean(const Mat& X, const uword row); template inline static eT direct_mean_robust(const Mat& X, const uword row); // template inline static eT mean_all(const subview& X); template inline static eT mean_all_robust(const subview& X); // template inline static eT mean_all(const diagview& X); template inline static eT mean_all_robust(const diagview& X); // template inline static typename T1::elem_type mean_all(const Op& X); template inline static typename T1::elem_type mean_all(const Base& X); // template arma_inline static eT robust_mean(const eT A, const eT B); template arma_inline static std::complex robust_mean(const std::complex& A, const std::complex& B); }; //! @} RcppArmadillo/inst/include/armadillo_bits/glue_quantile_bones.hpp0000644000176200001440000000337514124060717025137 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_quantile //! @{ class glue_quantile : public traits_glue_default { public: template inline static void worker(eTb* out_mem, Col& Y, const Mat& P); template inline static void apply_noalias(Mat& out, const Mat& X, const Mat& P, const uword dim); template inline static void apply(Mat& out, const mtGlue& expr); }; class glue_quantile_default { public: template struct traits { static constexpr bool is_row = T1::is_row; static constexpr bool is_col = T1::is_col; static constexpr bool is_xvec = T1::is_xvec; }; template inline static void apply(Mat& out, const mtGlue& expr); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_eye.hpp0000644000176200001440000000543314124060717022355 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_eye //! @{ arma_warn_unused arma_inline const Gen eye(const uword n_rows, const uword n_cols) { arma_extra_debug_sigprint(); return Gen(n_rows, n_cols); } arma_warn_unused arma_inline const Gen eye(const SizeMat& s) { arma_extra_debug_sigprint(); return Gen(s.n_rows, s.n_cols); } template arma_warn_unused arma_inline const Gen eye(const uword n_rows, const uword n_cols, const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); if(is_Col::value) { arma_debug_check( (n_cols != 1), "eye(): incompatible size" ); } else if(is_Row::value) { arma_debug_check( (n_rows != 1), "eye(): incompatible size" ); } return Gen(n_rows, n_cols); } template arma_warn_unused arma_inline const Gen eye(const SizeMat& s, const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return eye(s.n_rows, s.n_cols); } template arma_warn_unused inline obj_type eye(const uword n_rows, const uword n_cols, const typename arma_SpMat_SpCol_SpRow_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); if(is_SpCol::value) { arma_debug_check( (n_cols != 1), "eye(): incompatible size" ); } else if(is_SpRow::value) { arma_debug_check( (n_rows != 1), "eye(): incompatible size" ); } obj_type out; out.eye(n_rows, n_cols); return out; } template arma_warn_unused inline obj_type eye(const SizeMat& s, const typename arma_SpMat_SpCol_SpRow_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return eye(s.n_rows, s.n_cols); } //! @} RcppArmadillo/inst/include/armadillo_bits/SizeMat_meat.hpp0000644000176200001440000000530214124060717023465 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SizeMat //! @{ inline SizeMat::SizeMat(const uword in_n_rows, const uword in_n_cols) : n_rows(in_n_rows) , n_cols(in_n_cols) { arma_extra_debug_sigprint(); } inline uword SizeMat::operator[](const uword dim) const { if(dim == 0) { return n_rows; } if(dim == 1) { return n_cols; } return uword(1); } inline uword SizeMat::operator()(const uword dim) const { if(dim == 0) { return n_rows; } if(dim == 1) { return n_cols; } arma_debug_check_bounds(true, "size(): index out of bounds"); return uword(1); } inline bool SizeMat::operator==(const SizeMat& s) const { if(n_rows != s.n_rows) { return false; } if(n_cols != s.n_cols) { return false; } return true; } inline bool SizeMat::operator!=(const SizeMat& s) const { if(n_rows != s.n_rows) { return true; } if(n_cols != s.n_cols) { return true; } return false; } inline SizeMat SizeMat::operator+(const SizeMat& s) const { return SizeMat( (n_rows + s.n_rows), (n_cols + s.n_cols) ); } inline SizeMat SizeMat::operator-(const SizeMat& s) const { const uword out_n_rows = (n_rows > s.n_rows) ? (n_rows - s.n_rows) : uword(0); const uword out_n_cols = (n_cols > s.n_cols) ? (n_cols - s.n_cols) : uword(0); return SizeMat(out_n_rows, out_n_cols); } inline SizeMat SizeMat::operator+(const uword val) const { return SizeMat( (n_rows + val), (n_cols + val) ); } inline SizeMat SizeMat::operator-(const uword val) const { const uword out_n_rows = (n_rows > val) ? (n_rows - val) : uword(0); const uword out_n_cols = (n_cols > val) ? (n_cols - val) : uword(0); return SizeMat(out_n_rows, out_n_cols); } inline SizeMat SizeMat::operator*(const uword val) const { return SizeMat( (n_rows * val), (n_cols * val) ); } inline SizeMat SizeMat::operator/(const uword val) const { return SizeMat( (n_rows / val), (n_cols / val) ); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_dotext_meat.hpp0000644000176200001440000000736214124060717024126 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_dotext //! @{ template inline eT op_dotext::direct_rowvec_mat_colvec ( const eT* A_mem, const Mat& B, const eT* C_mem ) { arma_extra_debug_sigprint(); const uword cost_AB = B.n_cols; const uword cost_BC = B.n_rows; if(cost_AB <= cost_BC) { podarray tmp(B.n_cols); for(uword col=0; col tmp(B.n_rows); for(uword row=0; row inline eT op_dotext::direct_rowvec_transmat_colvec ( const eT* A_mem, const Mat& B, const eT* C_mem ) { arma_extra_debug_sigprint(); const uword cost_AB = B.n_rows; const uword cost_BC = B.n_cols; if(cost_AB <= cost_BC) { podarray tmp(B.n_rows); for(uword row=0; row tmp(B.n_cols); for(uword col=0; col inline eT op_dotext::direct_rowvec_diagmat_colvec ( const eT* A_mem, const Mat& B, const eT* C_mem ) { arma_extra_debug_sigprint(); eT val = eT(0); for(uword i=0; i inline eT op_dotext::direct_rowvec_invdiagmat_colvec ( const eT* A_mem, const Mat& B, const eT* C_mem ) { arma_extra_debug_sigprint(); eT val = eT(0); for(uword i=0; i inline eT op_dotext::direct_rowvec_invdiagvec_colvec ( const eT* A_mem, const Mat& B, const eT* C_mem ) { arma_extra_debug_sigprint(); const eT* B_mem = B.mem; eT val = eT(0); for(uword i=0; i inline std::ostream& arma_cout_stream(std::ostream* user_stream) { static std::ostream* cout_stream = &(ARMA_COUT_STREAM); if(user_stream != nullptr) { cout_stream = user_stream; } return (*cout_stream); } template inline std::ostream& arma_cerr_stream(std::ostream* user_stream) { static std::ostream* cerr_stream = &(ARMA_CERR_STREAM); if(user_stream != nullptr) { cerr_stream = user_stream; } return (*cerr_stream); } inline void set_cout_stream(std::ostream& user_stream) { arma_cout_stream(&user_stream); } inline void set_cerr_stream(std::ostream& user_stream) { arma_cerr_stream(&user_stream); } inline std::ostream& get_cout_stream() { return arma_cout_stream(nullptr); } inline std::ostream& get_cerr_stream() { return arma_cerr_stream(nullptr); } //! do not use this function - it's deprecated and will be removed inline arma_deprecated void set_stream_err1(std::ostream& user_stream) { set_cerr_stream(user_stream); } //! do not use this function - it's deprecated and will be removed inline arma_deprecated void set_stream_err2(std::ostream& user_stream) { set_cerr_stream(user_stream); } //! do not use this function - it's deprecated and will be removed inline arma_deprecated std::ostream& get_stream_err1() { return get_cerr_stream(); } //! do not use this function - it's deprecated and will be removed inline arma_deprecated std::ostream& get_stream_err2() { return get_cerr_stream(); } //! print a message to get_cerr_stream() and throw logic_error exception template arma_cold arma_noinline static void arma_stop_logic_error(const T1& x) { #if (defined(ARMA_PRINT_EXCEPTIONS) && defined(ARMA_PRINT_ERRORS)) { get_cerr_stream() << "\nerror: " << x << std::endl; } #endif throw std::logic_error( std::string(x) ); } arma_cold arma_noinline static void arma_stop_logic_error(const char* x, const char* y) { arma_stop_logic_error( std::string(x) + std::string(y) ); } //! print a message to get_cerr_stream() and throw logic_error exception template arma_cold arma_noinline static void arma_stop_bounds_error(const T1& x) { #if (defined(ARMA_PRINT_EXCEPTIONS) && defined(ARMA_PRINT_ERRORS)) { get_cerr_stream() << "\nerror: " << x << std::endl; } #endif throw std::out_of_range( std::string(x) ); } //! print a message to get_cerr_stream() and throw bad_alloc exception template arma_cold arma_noinline static void arma_stop_bad_alloc(const T1& x) { #if (defined(ARMA_PRINT_EXCEPTIONS) && defined(ARMA_PRINT_ERRORS)) { get_cerr_stream() << "\nerror: " << x << std::endl; } #else { arma_ignore(x); } #endif throw std::bad_alloc(); } //! print a message to get_cerr_stream() and throw runtime_error exception template arma_cold arma_noinline static void arma_stop_runtime_error(const T1& x) { #if (defined(ARMA_PRINT_EXCEPTIONS) && defined(ARMA_PRINT_ERRORS)) { get_cerr_stream() << "\nerror: " << x << std::endl; } #endif throw std::runtime_error( std::string(x) ); } // // arma_print arma_cold inline void arma_print() { get_cerr_stream() << std::endl; } template arma_cold arma_noinline static void arma_print(const T1& x) { get_cerr_stream() << x << std::endl; } template arma_cold arma_noinline static void arma_print(const T1& x, const T2& y) { get_cerr_stream() << x << y << std::endl; } template arma_cold arma_noinline static void arma_print(const T1& x, const T2& y, const T3& z) { get_cerr_stream() << x << y << z << std::endl; } // // arma_sigprint //! print a message the the log stream with a preceding @ character. //! by default the log stream is cout. //! used for printing the signature of a function //! (see the arma_extra_debug_sigprint macro) inline void arma_sigprint(const char* x) { get_cerr_stream() << "@ " << x; } // // arma_bktprint inline void arma_bktprint() { get_cerr_stream() << std::endl; } template inline void arma_bktprint(const T1& x) { get_cerr_stream() << " [" << x << ']' << std::endl; } template inline void arma_bktprint(const T1& x, const T2& y) { get_cerr_stream() << " [" << x << y << ']' << std::endl; } // // arma_thisprint inline void arma_thisprint(const void* this_ptr) { get_cerr_stream() << " [this = " << this_ptr << ']' << std::endl; } // // arma_warn //! print a message to the warn stream template arma_cold arma_noinline static void arma_warn(const T1& arg1) { #if defined(ARMA_PRINT_ERRORS) { get_cerr_stream() << "\nwarning: " << arg1 << '\n'; } #else { arma_ignore(arg1); } #endif } template arma_cold arma_noinline static void arma_warn(const T1& arg1, const T2& arg2) { #if defined(ARMA_PRINT_ERRORS) { get_cerr_stream() << "\nwarning: " << arg1 << arg2 << '\n'; } #else { arma_ignore(arg1); arma_ignore(arg2); } #endif } template arma_cold arma_noinline static void arma_warn(const T1& arg1, const T2& arg2, const T3& arg3) { #if defined(ARMA_PRINT_ERRORS) { get_cerr_stream() << "\nwarning: " << arg1 << arg2 << arg3 << '\n'; } #else { arma_ignore(arg1); arma_ignore(arg2); arma_ignore(arg3); } #endif } template arma_cold arma_noinline static void arma_warn(const T1& arg1, const T2& arg2, const T3& arg3, const T4& arg4) { #if defined(ARMA_PRINT_ERRORS) { get_cerr_stream() << "\nwarning: " << arg1 << arg2 << arg3 << arg4 << '\n'; } #else { arma_ignore(arg1); arma_ignore(arg2); arma_ignore(arg3); arma_ignore(arg4); } #endif } // // arma_warn_level template inline void arma_warn_level(const uword level, const T1& arg1) { constexpr uword config_level = (sword(ARMA_WARN_LEVEL) > 0) ? uword(ARMA_WARN_LEVEL) : uword(0); if((config_level > 0) && (level <= config_level)) { arma_warn(arg1); } } template inline void arma_warn_level(const uword level, const T1& arg1, const T2& arg2) { constexpr uword config_level = (sword(ARMA_WARN_LEVEL) > 0) ? uword(ARMA_WARN_LEVEL) : uword(0); if((config_level > 0) && (level <= config_level)) { arma_warn(arg1,arg2); } } template inline void arma_warn_level(const uword level, const T1& arg1, const T2& arg2, const T3& arg3) { constexpr uword config_level = (sword(ARMA_WARN_LEVEL) > 0) ? uword(ARMA_WARN_LEVEL) : uword(0); if((config_level > 0) && (level <= config_level)) { arma_warn(arg1,arg2,arg3); } } template inline void arma_warn_level(const uword level, const T1& arg1, const T2& arg2, const T3& arg3, const T4& arg4) { constexpr uword config_level = (sword(ARMA_WARN_LEVEL) > 0) ? uword(ARMA_WARN_LEVEL) : uword(0); if((config_level > 0) && (level <= config_level)) { arma_warn(arg1,arg2,arg3,arg4); } } // // arma_check //! if state is true, abort program template arma_hot inline void arma_check(const bool state, const T1& x) { if(state) { arma_stop_logic_error(arma_str::str_wrapper(x)); } } arma_hot inline void arma_check(const bool state, const char* x, const char* y) { if(state) { arma_stop_logic_error(x,y); } } template arma_hot inline void arma_check_bounds(const bool state, const T1& x) { if(state) { arma_stop_bounds_error(arma_str::str_wrapper(x)); } } template arma_hot inline void arma_check_bad_alloc(const bool state, const T1& x) { if(state) { arma_stop_bad_alloc(x); } } // // arma_set_error arma_hot arma_inline void arma_set_error(bool& err_state, char*& err_msg, const bool expression, const char* message) { if(expression) { err_state = true; err_msg = const_cast(message); } } // // functions for generating strings indicating size errors arma_cold arma_noinline static std::string arma_incompat_size_string(const uword A_n_rows, const uword A_n_cols, const uword B_n_rows, const uword B_n_cols, const char* x) { std::ostringstream tmp; tmp << x << ": incompatible matrix dimensions: " << A_n_rows << 'x' << A_n_cols << " and " << B_n_rows << 'x' << B_n_cols; return tmp.str(); } arma_cold arma_noinline static std::string arma_incompat_size_string(const uword A_n_rows, const uword A_n_cols, const uword A_n_slices, const uword B_n_rows, const uword B_n_cols, const uword B_n_slices, const char* x) { std::ostringstream tmp; tmp << x << ": incompatible cube dimensions: " << A_n_rows << 'x' << A_n_cols << 'x' << A_n_slices << " and " << B_n_rows << 'x' << B_n_cols << 'x' << B_n_slices; return tmp.str(); } template arma_cold arma_noinline static std::string arma_incompat_size_string(const subview_cube& Q, const Mat& A, const char* x) { std::ostringstream tmp; tmp << x << ": interpreting matrix as cube with dimensions: " << A.n_rows << 'x' << A.n_cols << 'x' << 1 << " or " << A.n_rows << 'x' << 1 << 'x' << A.n_cols << " or " << 1 << 'x' << A.n_rows << 'x' << A.n_cols << " is incompatible with cube dimensions: " << Q.n_rows << 'x' << Q.n_cols << 'x' << Q.n_slices; return tmp.str(); } // // functions for checking whether two dense matrices have the same dimensions arma_inline arma_hot void arma_assert_same_size(const uword A_n_rows, const uword A_n_cols, const uword B_n_rows, const uword B_n_cols, const char* x) { if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) { arma_stop_logic_error( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); } } //! stop if given matrices have different sizes template arma_hot inline void arma_assert_same_size(const Mat& A, const Mat& B, const char* x) { const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) { arma_stop_logic_error( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); } } //! stop if given proxies have different sizes template arma_hot inline void arma_assert_same_size(const Proxy& A, const Proxy& B, const char* x) { const uword A_n_rows = A.get_n_rows(); const uword A_n_cols = A.get_n_cols(); const uword B_n_rows = B.get_n_rows(); const uword B_n_cols = B.get_n_cols(); if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) { arma_stop_logic_error( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); } } template arma_hot inline void arma_assert_same_size(const subview& A, const subview& B, const char* x) { const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) { arma_stop_logic_error( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); } } template arma_hot inline void arma_assert_same_size(const Mat& A, const subview& B, const char* x) { const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) { arma_stop_logic_error( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); } } template arma_hot inline void arma_assert_same_size(const subview& A, const Mat& B, const char* x) { const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) { arma_stop_logic_error( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); } } template arma_hot inline void arma_assert_same_size(const Mat& A, const Proxy& B, const char* x) { const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.get_n_rows(); const uword B_n_cols = B.get_n_cols(); if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) { arma_stop_logic_error( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); } } template arma_hot inline void arma_assert_same_size(const Proxy& A, const Mat& B, const char* x) { const uword A_n_rows = A.get_n_rows(); const uword A_n_cols = A.get_n_cols(); const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) { arma_stop_logic_error( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); } } template arma_hot inline void arma_assert_same_size(const Proxy& A, const subview& B, const char* x) { const uword A_n_rows = A.get_n_rows(); const uword A_n_cols = A.get_n_cols(); const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) { arma_stop_logic_error( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); } } template arma_hot inline void arma_assert_same_size(const subview& A, const Proxy& B, const char* x) { const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.get_n_rows(); const uword B_n_cols = B.get_n_cols(); if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) { arma_stop_logic_error( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); } } // // functions for checking whether two sparse matrices have the same dimensions template arma_hot inline void arma_assert_same_size(const SpMat& A, const SpMat& B, const char* x) { const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) ) { arma_stop_logic_error( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); } } // // functions for checking whether two cubes have the same dimensions arma_hot inline void arma_assert_same_size(const uword A_n_rows, const uword A_n_cols, const uword A_n_slices, const uword B_n_rows, const uword B_n_cols, const uword B_n_slices, const char* x) { if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) || (A_n_slices != B_n_slices) ) { arma_stop_logic_error( arma_incompat_size_string(A_n_rows, A_n_cols, A_n_slices, B_n_rows, B_n_cols, B_n_slices, x) ); } } //! stop if given cubes have different sizes template arma_hot inline void arma_assert_same_size(const Cube& A, const Cube& B, const char* x) { if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != B.n_slices) ) { arma_stop_logic_error( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, B.n_slices, x) ); } } template arma_hot inline void arma_assert_same_size(const Cube& A, const subview_cube& B, const char* x) { if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != B.n_slices) ) { arma_stop_logic_error( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, B.n_slices, x) ); } } template arma_hot inline void arma_assert_same_size(const subview_cube& A, const Cube& B, const char* x) { if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != B.n_slices) ) { arma_stop_logic_error( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, B.n_slices, x) ); } } template arma_hot inline void arma_assert_same_size(const subview_cube& A, const subview_cube& B, const char* x) { if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != B.n_slices)) { arma_stop_logic_error( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, B.n_slices, x) ); } } template arma_hot inline void arma_assert_same_size(const subview_cube& A, const ProxyCube& B, const char* x) { const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword A_n_slices = A.n_slices; const uword B_n_rows = B.get_n_rows(); const uword B_n_cols = B.get_n_cols(); const uword B_n_slices = B.get_n_slices(); if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) || (A_n_slices != B_n_slices) ) { arma_stop_logic_error( arma_incompat_size_string(A_n_rows, A_n_cols, A_n_slices, B_n_rows, B_n_cols, B_n_slices, x) ); } } //! stop if given cube proxies have different sizes template arma_hot inline void arma_assert_same_size(const ProxyCube& A, const ProxyCube& B, const char* x) { const uword A_n_rows = A.get_n_rows(); const uword A_n_cols = A.get_n_cols(); const uword A_n_slices = A.get_n_slices(); const uword B_n_rows = B.get_n_rows(); const uword B_n_cols = B.get_n_cols(); const uword B_n_slices = B.get_n_slices(); if( (A_n_rows != B_n_rows) || (A_n_cols != B_n_cols) || (A_n_slices != B_n_slices)) { arma_stop_logic_error( arma_incompat_size_string(A_n_rows, A_n_cols, A_n_slices, B_n_rows, B_n_cols, B_n_slices, x) ); } } // // functions for checking whether a cube or subcube can be interpreted as a matrix (ie. single slice) template arma_hot inline void arma_assert_same_size(const Cube& A, const Mat& B, const char* x) { if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != 1) ) { arma_stop_logic_error( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, 1, x) ); } } template arma_hot inline void arma_assert_same_size(const Mat& A, const Cube& B, const char* x) { if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (1 != B.n_slices) ) { arma_stop_logic_error( arma_incompat_size_string(A.n_rows, A.n_cols, 1, B.n_rows, B.n_cols, B.n_slices, x) ); } } template arma_hot inline void arma_assert_same_size(const subview_cube& A, const Mat& B, const char* x) { if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (A.n_slices != 1) ) { arma_stop_logic_error( arma_incompat_size_string(A.n_rows, A.n_cols, A.n_slices, B.n_rows, B.n_cols, 1, x) ); } } template arma_hot inline void arma_assert_same_size(const Mat& A, const subview_cube& B, const char* x) { if( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) || (1 != B.n_slices) ) { arma_stop_logic_error( arma_incompat_size_string(A.n_rows, A.n_cols, 1, B.n_rows, B.n_cols, B.n_slices, x) ); } } template inline void arma_assert_cube_as_mat(const Mat& M, const T1& Q, const char* x, const bool check_compat_size) { const uword Q_n_rows = Q.n_rows; const uword Q_n_cols = Q.n_cols; const uword Q_n_slices = Q.n_slices; const uword M_vec_state = M.vec_state; if(M_vec_state == 0) { if( ( (Q_n_rows == 1) || (Q_n_cols == 1) || (Q_n_slices == 1) ) == false ) { std::ostringstream tmp; tmp << x << ": can't interpret cube with dimensions " << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices << " as a matrix; one of the dimensions must be 1"; arma_stop_logic_error( tmp.str() ); } } else { if(Q_n_slices == 1) { if( (M_vec_state == 1) && (Q_n_cols != 1) ) { std::ostringstream tmp; tmp << x << ": can't interpret cube with dimensions " << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices << " as a column vector"; arma_stop_logic_error( tmp.str() ); } if( (M_vec_state == 2) && (Q_n_rows != 1) ) { std::ostringstream tmp; tmp << x << ": can't interpret cube with dimensions " << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices << " as a row vector"; arma_stop_logic_error( tmp.str() ); } } else { if( (Q_n_cols != 1) && (Q_n_rows != 1) ) { std::ostringstream tmp; tmp << x << ": can't interpret cube with dimensions " << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices << " as a vector"; arma_stop_logic_error( tmp.str() ); } } } if(check_compat_size) { const uword M_n_rows = M.n_rows; const uword M_n_cols = M.n_cols; if(M_vec_state == 0) { if( ( ( (Q_n_rows == M_n_rows) && (Q_n_cols == M_n_cols) ) || ( (Q_n_rows == M_n_rows) && (Q_n_slices == M_n_cols) ) || ( (Q_n_cols == M_n_rows) && (Q_n_slices == M_n_cols) ) ) == false ) { std::ostringstream tmp; tmp << x << ": can't interpret cube with dimensions " << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices << " as a matrix with dimensions " << M_n_rows << 'x' << M_n_cols; arma_stop_logic_error( tmp.str() ); } } else { if(Q_n_slices == 1) { if( (M_vec_state == 1) && (Q_n_rows != M_n_rows) ) { std::ostringstream tmp; tmp << x << ": can't interpret cube with dimensions " << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices << " as a column vector with dimensions " << M_n_rows << 'x' << M_n_cols; arma_stop_logic_error( tmp.str() ); } if( (M_vec_state == 2) && (Q_n_cols != M_n_cols) ) { std::ostringstream tmp; tmp << x << ": can't interpret cube with dimensions " << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices << " as a row vector with dimensions " << M_n_rows << 'x' << M_n_cols; arma_stop_logic_error( tmp.str() ); } } else { if( ( (M_n_cols == Q_n_slices) || (M_n_rows == Q_n_slices) ) == false ) { std::ostringstream tmp; tmp << x << ": can't interpret cube with dimensions " << Q_n_rows << 'x' << Q_n_cols << 'x' << Q_n_slices << " as a vector with dimensions " << M_n_rows << 'x' << M_n_cols; arma_stop_logic_error( tmp.str() ); } } } } } // // functions for checking whether two matrices have dimensions that are compatible with the matrix multiply operation arma_hot inline void arma_assert_mul_size(const uword A_n_rows, const uword A_n_cols, const uword B_n_rows, const uword B_n_cols, const char* x) { if(A_n_cols != B_n_rows) { arma_stop_logic_error( arma_incompat_size_string(A_n_rows, A_n_cols, B_n_rows, B_n_cols, x) ); } } //! stop if given matrices are incompatible for multiplication template arma_hot inline void arma_assert_mul_size(const Mat& A, const Mat& B, const char* x) { const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; if(A_n_cols != B_n_rows) { arma_stop_logic_error( arma_incompat_size_string(A.n_rows, A_n_cols, B_n_rows, B.n_cols, x) ); } } //! stop if given matrices are incompatible for multiplication template arma_hot inline void arma_assert_mul_size(const Mat& A, const Mat& B, const bool do_trans_A, const bool do_trans_B, const char* x) { const uword final_A_n_cols = (do_trans_A == false) ? A.n_cols : A.n_rows; const uword final_B_n_rows = (do_trans_B == false) ? B.n_rows : B.n_cols; if(final_A_n_cols != final_B_n_rows) { const uword final_A_n_rows = (do_trans_A == false) ? A.n_rows : A.n_cols; const uword final_B_n_cols = (do_trans_B == false) ? B.n_cols : B.n_rows; arma_stop_logic_error( arma_incompat_size_string(final_A_n_rows, final_A_n_cols, final_B_n_rows, final_B_n_cols, x) ); } } template arma_hot inline void arma_assert_trans_mul_size(const uword A_n_rows, const uword A_n_cols, const uword B_n_rows, const uword B_n_cols, const char* x) { const uword final_A_n_cols = (do_trans_A == false) ? A_n_cols : A_n_rows; const uword final_B_n_rows = (do_trans_B == false) ? B_n_rows : B_n_cols; if(final_A_n_cols != final_B_n_rows) { const uword final_A_n_rows = (do_trans_A == false) ? A_n_rows : A_n_cols; const uword final_B_n_cols = (do_trans_B == false) ? B_n_cols : B_n_rows; arma_stop_logic_error( arma_incompat_size_string(final_A_n_rows, final_A_n_cols, final_B_n_rows, final_B_n_cols, x) ); } } template arma_hot inline void arma_assert_mul_size(const Mat& A, const subview& B, const char* x) { if(A.n_cols != B.n_rows) { arma_stop_logic_error( arma_incompat_size_string(A.n_rows, A.n_cols, B.n_rows, B.n_cols, x) ); } } template arma_hot inline void arma_assert_mul_size(const subview& A, const Mat& B, const char* x) { if(A.n_cols != B.n_rows) { arma_stop_logic_error( arma_incompat_size_string(A.n_rows, A.n_cols, B.n_rows, B.n_cols, x) ); } } template arma_hot inline void arma_assert_mul_size(const subview& A, const subview& B, const char* x) { if(A.n_cols != B.n_rows) { arma_stop_logic_error( arma_incompat_size_string(A.n_rows, A.n_cols, B.n_rows, B.n_cols, x) ); } } template arma_hot inline void arma_assert_blas_size(const T1& A) { if(sizeof(uword) >= sizeof(blas_int)) { bool overflow; overflow = (A.n_rows > ARMA_MAX_BLAS_INT); overflow = (A.n_cols > ARMA_MAX_BLAS_INT) || overflow; if(overflow) { arma_stop_runtime_error("integer overflow: matrix dimensions are too large for integer type used by BLAS and LAPACK"); } } } template arma_hot inline void arma_assert_blas_size(const T1& A, const T2& B) { if(sizeof(uword) >= sizeof(blas_int)) { bool overflow; overflow = (A.n_rows > ARMA_MAX_BLAS_INT); overflow = (A.n_cols > ARMA_MAX_BLAS_INT) || overflow; overflow = (B.n_rows > ARMA_MAX_BLAS_INT) || overflow; overflow = (B.n_cols > ARMA_MAX_BLAS_INT) || overflow; if(overflow) { arma_stop_runtime_error("integer overflow: matrix dimensions are too large for integer type used by BLAS and LAPACK"); } } } template arma_hot inline void arma_assert_atlas_size(const T1& A) { if(sizeof(uword) >= sizeof(int)) { bool overflow; overflow = (A.n_rows > INT_MAX); overflow = (A.n_cols > INT_MAX) || overflow; if(overflow) { arma_stop_runtime_error("integer overflow: matrix dimensions are too large for integer type used by ATLAS"); } } } template arma_hot inline void arma_assert_atlas_size(const T1& A, const T2& B) { if(sizeof(uword) >= sizeof(int)) { bool overflow; overflow = (A.n_rows > INT_MAX); overflow = (A.n_cols > INT_MAX) || overflow; overflow = (B.n_rows > INT_MAX) || overflow; overflow = (B.n_cols > INT_MAX) || overflow; if(overflow) { arma_stop_runtime_error("integer overflow: matrix dimensions are too large for integer type used by ATLAS"); } } } // // macros // #define ARMA_STRING1(x) #x // #define ARMA_STRING2(x) ARMA_STRING1(x) // #define ARMA_FILELINE __FILE__ ": " ARMA_STRING2(__LINE__) #if defined(ARMA_NO_DEBUG) #define arma_debug_print true ? (void)0 : arma_print #define arma_debug_warn true ? (void)0 : arma_warn #define arma_debug_warn_level true ? (void)0 : arma_warn_level #define arma_debug_check true ? (void)0 : arma_check #define arma_debug_check_bounds true ? (void)0 : arma_check_bounds #define arma_debug_set_error true ? (void)0 : arma_set_error #define arma_debug_assert_same_size true ? (void)0 : arma_assert_same_size #define arma_debug_assert_mul_size true ? (void)0 : arma_assert_mul_size #define arma_debug_assert_trans_mul_size true ? (void)0 : arma_assert_trans_mul_size #define arma_debug_assert_cube_as_mat true ? (void)0 : arma_assert_cube_as_mat #define arma_debug_assert_blas_size true ? (void)0 : arma_assert_blas_size #define arma_debug_assert_atlas_size true ? (void)0 : arma_assert_atlas_size #else #define arma_debug_print arma_print #define arma_debug_warn arma_warn #define arma_debug_warn_level arma_warn_level #define arma_debug_check arma_check #define arma_debug_check_bounds arma_check_bounds #define arma_debug_set_error arma_set_error #define arma_debug_assert_same_size arma_assert_same_size #define arma_debug_assert_mul_size arma_assert_mul_size #define arma_debug_assert_trans_mul_size arma_assert_trans_mul_size #define arma_debug_assert_cube_as_mat arma_assert_cube_as_mat #define arma_debug_assert_blas_size arma_assert_blas_size #define arma_debug_assert_atlas_size arma_assert_atlas_size #endif #if defined(ARMA_EXTRA_DEBUG) #undef ARMA_WARN_LEVEL #define ARMA_WARN_LEVEL 3 #define arma_extra_debug_sigprint arma_sigprint(ARMA_FNSIG); arma_bktprint #define arma_extra_debug_sigprint_this arma_sigprint(ARMA_FNSIG); arma_thisprint #define arma_extra_debug_print arma_print #else #define arma_extra_debug_sigprint true ? (void)0 : arma_bktprint #define arma_extra_debug_sigprint_this true ? (void)0 : arma_thisprint #define arma_extra_debug_print true ? (void)0 : arma_print #endif #if defined(ARMA_EXTRA_DEBUG) namespace junk { class arma_first_extra_debug_message { public: inline arma_first_extra_debug_message() { union { unsigned short a; unsigned char b[sizeof(unsigned short)]; } endian_test; endian_test.a = 1; const bool little_endian = (endian_test.b[0] == 1); const char* nickname = ARMA_VERSION_NAME; std::ostream& out = get_cerr_stream(); out << "@ ---" << '\n'; out << "@ Armadillo " << arma_version::major << '.' << arma_version::minor << '.' << arma_version::patch << " (" << nickname << ")\n"; out << "@ arma_config::wrapper = " << arma_config::wrapper << '\n'; out << "@ arma_config::cxx14 = " << arma_config::cxx14 << '\n'; out << "@ arma_config::cxx17 = " << arma_config::cxx17 << '\n'; out << "@ arma_config::std_mutex = " << arma_config::std_mutex << '\n'; out << "@ arma_config::posix = " << arma_config::posix << '\n'; out << "@ arma_config::openmp = " << arma_config::openmp << '\n'; out << "@ arma_config::lapack = " << arma_config::lapack << '\n'; out << "@ arma_config::blas = " << arma_config::blas << '\n'; out << "@ arma_config::newarp = " << arma_config::newarp << '\n'; out << "@ arma_config::arpack = " << arma_config::arpack << '\n'; out << "@ arma_config::superlu = " << arma_config::superlu << '\n'; out << "@ arma_config::atlas = " << arma_config::atlas << '\n'; out << "@ arma_config::hdf5 = " << arma_config::hdf5 << '\n'; out << "@ arma_config::good_comp = " << arma_config::good_comp << '\n'; out << "@ arma_config::extra_code = " << arma_config::extra_code << '\n'; out << "@ arma_config::hidden_args = " << arma_config::hidden_args << '\n'; out << "@ arma_config::mat_prealloc = " << arma_config::mat_prealloc << '\n'; out << "@ arma_config::mp_threshold = " << arma_config::mp_threshold << '\n'; out << "@ arma_config::mp_threads = " << arma_config::mp_threads << '\n'; out << "@ sizeof(void*) = " << sizeof(void*) << '\n'; out << "@ sizeof(int) = " << sizeof(int) << '\n'; out << "@ sizeof(long) = " << sizeof(long) << '\n'; out << "@ sizeof(uword) = " << sizeof(uword) << '\n'; out << "@ sizeof(blas_int) = " << sizeof(blas_int) << '\n'; out << "@ little_endian = " << little_endian << '\n'; out << "@ ---" << std::endl; } }; static arma_first_extra_debug_message arma_first_extra_debug_message_run; } #endif //! @} RcppArmadillo/inst/include/armadillo_bits/op_relational_meat.hpp0000644000176200001440000002404514124060717024746 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_relational //! @{ #undef operator_rel #undef arma_applier_mat_pre #undef arma_applier_mat_post #undef arma_applier_cube_pre #undef arma_applier_cube_post #define arma_applier_mat_pre(operator_rel) \ {\ typedef typename T1::elem_type eT;\ typedef typename Proxy::ea_type ea_type;\ \ const eT val = X.aux;\ \ const Proxy P(X.m);\ \ const uword n_rows = P.get_n_rows();\ const uword n_cols = P.get_n_cols();\ \ const bool bad_alias = ( Proxy::has_subview && P.is_alias(out) );\ \ if(bad_alias == false)\ {\ out.set_size(n_rows, n_cols);\ \ uword* out_mem = out.memptr();\ \ if(Proxy::use_at == false)\ {\ ea_type PA = P.get_ea();\ const uword n_elem = out.n_elem;\ \ for(uword i=0; i tmp(P.Q);\ \ out = (val) operator_rel (tmp);\ }\ } #define arma_applier_mat_post(operator_rel) \ {\ typedef typename T1::elem_type eT;\ typedef typename Proxy::ea_type ea_type;\ \ const eT val = X.aux;\ \ const Proxy P(X.m);\ \ const uword n_rows = P.get_n_rows();\ const uword n_cols = P.get_n_cols();\ \ const bool bad_alias = ( Proxy::has_subview && P.is_alias(out) );\ \ if(bad_alias == false)\ {\ out.set_size(n_rows, n_cols);\ \ uword* out_mem = out.memptr();\ \ if(Proxy::use_at == false)\ {\ ea_type PA = P.get_ea();\ const uword n_elem = out.n_elem;\ \ for(uword i=0; i tmp(P.Q);\ \ out = (tmp) operator_rel (val);\ }\ } #define arma_applier_cube_pre(operator_rel) \ {\ typedef typename T1::elem_type eT;\ typedef typename ProxyCube::ea_type ea_type;\ \ const eT val = X.aux;\ \ const ProxyCube P(X.m);\ \ const uword n_rows = P.get_n_rows();\ const uword n_cols = P.get_n_cols();\ const uword n_slices = P.get_n_slices();\ \ const bool bad_alias = ( ProxyCube::has_subview && P.is_alias(out) );\ \ if(bad_alias == false)\ {\ out.set_size(n_rows, n_cols, n_slices);\ \ uword* out_mem = out.memptr();\ \ if(ProxyCube::use_at == false)\ {\ ea_type PA = P.get_ea();\ const uword n_elem = out.n_elem;\ \ for(uword i=0; i::stored_type> tmp(P.Q);\ \ out = (val) operator_rel (tmp.M);\ }\ } #define arma_applier_cube_post(operator_rel) \ {\ typedef typename T1::elem_type eT;\ typedef typename ProxyCube::ea_type ea_type;\ \ const eT val = X.aux;\ \ const ProxyCube P(X.m);\ \ const uword n_rows = P.get_n_rows();\ const uword n_cols = P.get_n_cols();\ const uword n_slices = P.get_n_slices();\ \ const bool bad_alias = ( ProxyCube::has_subview && P.is_alias(out) );\ \ if(bad_alias == false)\ {\ out.set_size(n_rows, n_cols, n_slices);\ \ uword* out_mem = out.memptr();\ \ if(ProxyCube::use_at == false)\ {\ ea_type PA = P.get_ea();\ const uword n_elem = out.n_elem;\ \ for(uword i=0; i::stored_type> tmp(P.Q);\ \ out = (tmp.M) operator_rel (val);\ }\ } template inline void op_rel_lt_pre::apply(Mat& out, const mtOp& X) { arma_extra_debug_sigprint(); arma_applier_mat_pre( < ); } template inline void op_rel_gt_pre::apply(Mat& out, const mtOp& X) { arma_extra_debug_sigprint(); arma_applier_mat_pre( > ); } template inline void op_rel_lteq_pre::apply(Mat& out, const mtOp& X) { arma_extra_debug_sigprint(); arma_applier_mat_pre( <= ); } template inline void op_rel_gteq_pre::apply(Mat& out, const mtOp& X) { arma_extra_debug_sigprint(); arma_applier_mat_pre( >= ); } template inline void op_rel_lt_post::apply(Mat& out, const mtOp& X) { arma_extra_debug_sigprint(); arma_applier_mat_post( < ); } template inline void op_rel_gt_post::apply(Mat& out, const mtOp& X) { arma_extra_debug_sigprint(); arma_applier_mat_post( > ); } template inline void op_rel_lteq_post::apply(Mat& out, const mtOp& X) { arma_extra_debug_sigprint(); arma_applier_mat_post( <= ); } template inline void op_rel_gteq_post::apply(Mat& out, const mtOp& X) { arma_extra_debug_sigprint(); arma_applier_mat_post( >= ); } template inline void op_rel_eq::apply(Mat& out, const mtOp& X) { arma_extra_debug_sigprint(); arma_applier_mat_post( == ); } template inline void op_rel_noteq::apply(Mat& out, const mtOp& X) { arma_extra_debug_sigprint(); arma_applier_mat_post( != ); } // // // template inline void op_rel_lt_pre::apply(Cube& out, const mtOpCube& X) { arma_extra_debug_sigprint(); arma_applier_cube_pre( < ); } template inline void op_rel_gt_pre::apply(Cube& out, const mtOpCube& X) { arma_extra_debug_sigprint(); arma_applier_cube_pre( > ); } template inline void op_rel_lteq_pre::apply(Cube& out, const mtOpCube& X) { arma_extra_debug_sigprint(); arma_applier_cube_pre( <= ); } template inline void op_rel_gteq_pre::apply(Cube& out, const mtOpCube& X) { arma_extra_debug_sigprint(); arma_applier_cube_pre( >= ); } template inline void op_rel_lt_post::apply(Cube& out, const mtOpCube& X) { arma_extra_debug_sigprint(); arma_applier_cube_post( < ); } template inline void op_rel_gt_post::apply(Cube& out, const mtOpCube& X) { arma_extra_debug_sigprint(); arma_applier_cube_post( > ); } template inline void op_rel_lteq_post::apply(Cube& out, const mtOpCube& X) { arma_extra_debug_sigprint(); arma_applier_cube_post( <= ); } template inline void op_rel_gteq_post::apply(Cube& out, const mtOpCube& X) { arma_extra_debug_sigprint(); arma_applier_cube_post( >= ); } template inline void op_rel_eq::apply(Cube& out, const mtOpCube& X) { arma_extra_debug_sigprint(); arma_applier_cube_post( == ); } template inline void op_rel_noteq::apply(Cube& out, const mtOpCube& X) { arma_extra_debug_sigprint(); arma_applier_cube_post( != ); } #undef arma_applier_mat_pre #undef arma_applier_mat_post #undef arma_applier_cube_pre #undef arma_applier_cube_post //! @} RcppArmadillo/inst/include/armadillo_bits/access.hpp0000644000176200001440000000417014124060717022346 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup access //! @{ class access { public: //! internal function to allow modification of data declared as read-only (use with caution) template constexpr static T1& rw (const T1& x) { return const_cast(x); } template constexpr static T1*& rwp(const T1* const& x) { return const_cast(x); } //! internal function to obtain the real part of either a plain number or a complex number template constexpr static const eT& tmp_real(const eT& X) { return X; } template constexpr static const T tmp_real(const std::complex& X) { return X.real(); } //! internal function to obtain the imag part of either a plain number or a complex number template constexpr static const eT tmp_imag(const eT ) { return eT(0); } template constexpr static const T tmp_imag(const std::complex& X) { return X.imag(); } //! internal function to work around braindead compilers template constexpr static const typename enable_if2::no, const eT&>::result alt_conj(const eT& X) { return X; } template arma_inline static const typename enable_if2::yes, const eT >::result alt_conj(const eT& X) { return std::conj(X); } }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_orth_null.hpp0000644000176200001440000000472314124060717023602 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_orth_null //! @{ template arma_warn_unused arma_inline typename enable_if2< is_real::value, const Op >::result orth(const Base& X, const typename T1::pod_type tol = 0.0) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; return Op(X.get_ref(), eT(tol)); } template inline typename enable_if2< is_real::value, bool >::result orth(Mat& out, const Base& X, const typename T1::pod_type tol = 0.0) { arma_extra_debug_sigprint(); const bool status = op_orth::apply_direct(out, X.get_ref(), tol); if(status == false) { out.soft_reset(); arma_debug_warn_level(3, "orth(): svd failed"); } return status; } // template arma_warn_unused arma_inline typename enable_if2< is_real::value, const Op >::result null(const Base& X, const typename T1::pod_type tol = 0.0) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; return Op(X.get_ref(), eT(tol)); } template inline typename enable_if2< is_real::value, bool >::result null(Mat& out, const Base& X, const typename T1::pod_type tol = 0.0) { arma_extra_debug_sigprint(); const bool status = op_null::apply_direct(out, X.get_ref(), tol); if(status == false) { out.soft_reset(); arma_debug_warn_level(3, "null(): svd failed"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_mean.hpp0000644000176200001440000000535314124060717022514 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_mean //! @{ template arma_warn_unused inline typename enable_if2< is_arma_type::value && resolves_to_vector::yes, typename T1::elem_type >::result mean(const T1& X) { arma_extra_debug_sigprint(); return op_mean::mean_all(X); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value && resolves_to_vector::no, const Op >::result mean(const T1& X) { arma_extra_debug_sigprint(); return Op(X, 0, 0); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const Op >::result mean(const T1& X, const uword dim) { arma_extra_debug_sigprint(); return Op(X, dim, 0); } template arma_warn_unused arma_inline typename arma_scalar_only::result mean(const T& x) { return x; } template arma_warn_unused arma_inline const OpCube mean ( const BaseCube& X, const uword dim = 0 ) { arma_extra_debug_sigprint(); return OpCube(X.get_ref(), dim, 0); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value && resolves_to_sparse_vector::yes, typename T1::elem_type >::result mean(const T1& x) { arma_extra_debug_sigprint(); return spop_mean::mean_all(x); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value && resolves_to_sparse_vector::no, const SpOp >::result mean(const T1& x) { arma_extra_debug_sigprint(); return SpOp(x, 0, 0); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value, const SpOp >::result mean(const T1& x, const uword dim) { arma_extra_debug_sigprint(); return SpOp(x, dim, 0); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_prod_bones.hpp0000644000176200001440000000244414124060717023737 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_prod //! @{ class op_prod : public traits_op_xvec { public: template inline static void apply_noalias(Mat& out, const Mat& X, const uword dim); template inline static void apply(Mat& out, const Op& in); template inline static eT prod(const subview& S); template inline static typename T1::elem_type prod(const Base& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/glue_polyval_bones.hpp0000644000176200001440000000250714124060717024777 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_polyval //! @{ class glue_polyval { public: template struct traits { static constexpr bool is_row = T2::is_row; static constexpr bool is_col = T2::is_col; static constexpr bool is_xvec = T2::is_xvec; }; template inline static void apply_noalias(Mat& out, const Mat& P, const Mat& X); template inline static void apply(Mat& out, const Glue& expr); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_prod.hpp0000644000176200001440000000414014124060717022531 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_prod //! @{ //! \brief //! Delayed product of elements of a matrix along a specified dimension (either rows or columns). //! The result is stored in a dense matrix that has either one column or one row. //! For dim = 0, find the sum of each column (ie. traverse across rows) //! For dim = 1, find the sum of each row (ie. traverse across columns) //! The default is dim = 0. //! NOTE: this function works differently than in Matlab/Octave. template arma_warn_unused inline typename enable_if2< is_arma_type::value && resolves_to_vector::yes, typename T1::elem_type >::result prod(const T1& X) { arma_extra_debug_sigprint(); return op_prod::prod(X); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value && resolves_to_vector::no, const Op >::result prod(const T1& X) { arma_extra_debug_sigprint(); return Op(X, 0, 0); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const Op >::result prod(const T1& X, const uword dim) { arma_extra_debug_sigprint(); return Op(X, dim, 0); } template arma_warn_unused arma_inline typename arma_scalar_only::result prod(const T& x) { return x; } //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_GenEigsSolver_meat.hpp0000644000176200001440000002735114124060717026211 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { template inline void GenEigsSolver::factorise_from(uword from_k, uword to_m, const Col& fk) { arma_extra_debug_sigprint(); if(to_m <= from_k) { return; } fac_f = fk; Col w(dim_n, arma_zeros_indicator()); eT beta = norm(fac_f); // Keep the upperleft k x k submatrix of H and set other elements to 0 fac_H.tail_cols(ncv - from_k).zeros(); fac_H.submat(span(from_k, ncv - 1), span(0, from_k - 1)).zeros(); for(uword 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(beta < eps) { // Generate new random vector for fac_f blas_int idist = 2; blas_int iseed[4] = {1, 3, 5, 7}; iseed[0] = (i + 100) % 4095; blas_int n = dim_n; lapack::larnv(&idist, &iseed[0], &n, fac_f.memptr()); // f <- f - V * V' * f, so that f is orthogonal to V Mat Vs(fac_V.memptr(), dim_n, i, false); // First i columns Col Vf = Vs.t() * fac_f; fac_f -= Vs * Vf; // beta <- ||f|| beta = norm(fac_f); restart = true; } // v <- f / ||f|| fac_V.col(i) = fac_f / beta; // The (i+1)-th column // Note that H[i+1, i] equals to the unrestarted beta if(restart) { fac_H(i, i - 1) = 0.0; } else { fac_H(i, i - 1) = beta; } // w <- A * v, v = fac_V.col(i) op.perform_op(fac_V.colptr(i), w.memptr()); nmatop++; // First i+1 columns of V Mat Vs(fac_V.memptr(), dim_n, i + 1, false); // h = fac_H(0:i, i) Col h(fac_H.colptr(i), i + 1, false); // h <- V' * w h = Vs.t() * w; // f <- w - V * h fac_f = w - Vs * h; beta = norm(fac_f); if(beta > 0.717 * norm(h)) { continue; } // f/||f|| is going to be the next column of V, so we need to test // whether V' * (f/||f||) ~= 0 Col Vf = Vs.t() * fac_f; // If not, iteratively correct the residual uword count = 0; while(count < 5 && abs(Vf).max() > approx0 * beta) { // f <- f - V * Vf fac_f -= Vs * Vf; // h <- h + Vf h += Vf; // beta <- ||f|| beta = norm(fac_f); Vf = Vs.t() * fac_f; count++; } } } template inline void GenEigsSolver::restart(uword k) { arma_extra_debug_sigprint(); if(k >= ncv) { return; } DoubleShiftQR decomp_ds(ncv); UpperHessenbergQR decomp; Mat Q(ncv, ncv, fill::eye); for(uword i = k; i < ncv; i++) { if(cx_attrib::is_complex(ritz_val(i), eT(0)) && (i < (ncv - 1)) && cx_attrib::is_conj(ritz_val(i), ritz_val(i + 1), eT(0))) { // 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 eT s = 2 * ritz_val(i).real(); eT t = std::norm(ritz_val(i)); decomp_ds.compute(fac_H, s, t); // Q -> Q * Qi decomp_ds.apply_YQ(Q); // H -> Q'HQ fac_H = decomp_ds.matrix_QtHQ(); i++; } else { // QR decomposition of H - mu * I, mu is real fac_H.diag() -= ritz_val(i).real(); decomp.compute(fac_H); // Q -> Q * Qi decomp.apply_YQ(Q); // H -> Q'HQ = RQ + mu * I fac_H = decomp.matrix_RQ(); fac_H.diag() += ritz_val(i).real(); } } // V -> VQ // Q has some elements being zero // The first (ncv - k + i) elements of the i-th column of Q are non-zero Mat Vs(dim_n, k + 1, arma_nozeros_indicator()); uword nnz; for(uword i = 0; i < k; i++) { nnz = ncv - k + i + 1; Mat V(fac_V.memptr(), dim_n, nnz, false); Col q(Q.colptr(i), nnz, false); Col v(Vs.colptr(i), dim_n, false); v = V * q; } Vs.col(k) = fac_V * Q.col(k); fac_V.head_cols(k + 1) = Vs; Col fk = fac_f * Q(ncv - 1, k - 1) + fac_V.col(k) * fac_H(k, k - 1); factorise_from(k, ncv, fk); retrieve_ritzpair(); } template inline uword GenEigsSolver::num_converged(eT tol) { arma_extra_debug_sigprint(); // thresh = tol * max(prec, abs(theta)), theta for ritz value const eT f_norm = arma::norm(fac_f); for(uword i = 0; i < nev; i++) { eT thresh = tol * (std::max)(approx0, std::abs(ritz_val(i))); eT resid = std::abs(ritz_est(i)) * f_norm; ritz_conv[i] = (resid < thresh); } return std::count(ritz_conv.begin(), ritz_conv.end(), true); } template inline uword GenEigsSolver::nev_adjusted(uword nconv) { arma_extra_debug_sigprint(); uword nev_new = nev; for(uword i = nev; i < ncv; i++) { if(std::abs(ritz_est(i)) < eps) { nev_new++; } } // Adjust nev_new again, according to dnaup2.f line 660~674 in ARPACK nev_new += (std::min)(nconv, (ncv - nev_new) / 2); if(nev_new == 1 && ncv >= 6) { nev_new = ncv / 2; } else if(nev_new == 1 && ncv > 3) { nev_new = 2; } if(nev_new > ncv - 2) { nev_new = ncv - 2; } // Increase nev by one if ritz_val[nev - 1] and // ritz_val[nev] are conjugate pairs if(cx_attrib::is_complex(ritz_val(nev_new - 1), eps) && cx_attrib::is_conj(ritz_val(nev_new - 1), ritz_val(nev_new), eps)) { nev_new++; } return nev_new; } template inline void GenEigsSolver::retrieve_ritzpair() { arma_extra_debug_sigprint(); UpperHessenbergEigen decomp(fac_H); Col< std::complex > evals = decomp.eigenvalues(); Mat< std::complex > evecs = decomp.eigenvectors(); SortEigenvalue< std::complex, SelectionRule > sorting(evals.memptr(), evals.n_elem); std::vector ind = sorting.index(); // Copy the ritz values and vectors to ritz_val and ritz_vec, respectively for(uword i = 0; i < ncv; i++) { ritz_val(i) = evals(ind[i]); ritz_est(i) = evecs(ncv - 1, ind[i]); } for(uword i = 0; i < nev; i++) { ritz_vec.col(i) = evecs.col(ind[i]); } } template inline void GenEigsSolver::sort_ritzpair() { arma_extra_debug_sigprint(); // SortEigenvalue< std::complex, EigsSelect::LARGEST_MAGN > sorting(ritz_val.memptr(), nev); // sort Ritz values according to SelectionRule, to be consistent with ARPACK SortEigenvalue< std::complex, SelectionRule > sorting(ritz_val.memptr(), nev); std::vector ind = sorting.index(); Col< std::complex > new_ritz_val(ncv, arma_zeros_indicator() ); Mat< std::complex > new_ritz_vec(ncv, nev, arma_nozeros_indicator()); std::vector new_ritz_conv(nev); for(uword i = 0; i < nev; i++) { new_ritz_val(i) = ritz_val(ind[i]); new_ritz_vec.col(i) = ritz_vec.col(ind[i]); new_ritz_conv[i] = ritz_conv[ind[i]]; } ritz_val.swap(new_ritz_val); ritz_vec.swap(new_ritz_vec); ritz_conv.swap(new_ritz_conv); } template inline GenEigsSolver::GenEigsSolver(const OpType& op_, uword nev_, uword ncv_) : op(op_) , nev(nev_) , dim_n(op.n_rows) , ncv(ncv_ > dim_n ? dim_n : ncv_) , nmatop(0) , niter(0) , eps(std::numeric_limits::epsilon()) , approx0(std::pow(eps, eT(2.0) / 3)) { arma_extra_debug_sigprint(); arma_debug_check( (nev_ < 1 || nev_ > dim_n - 2), "newarp::GenEigsSolver: nev must satisfy 1 <= nev <= n - 2, n is the size of matrix" ); arma_debug_check( (ncv_ < nev_ + 2 || ncv_ > dim_n), "newarp::GenEigsSolver: ncv must satisfy nev + 2 <= ncv <= n, n is the size of matrix" ); } template inline void GenEigsSolver::init(eT* init_resid) { arma_extra_debug_sigprint(); // Reset all matrices/vectors to zero fac_V.zeros(dim_n, ncv); fac_H.zeros(ncv, ncv); fac_f.zeros(dim_n); ritz_val.zeros(ncv); ritz_vec.zeros(ncv, nev); ritz_est.zeros(ncv); ritz_conv.assign(nev, false); nmatop = 0; niter = 0; Col r(init_resid, dim_n, false); // The first column of fac_V Col v(fac_V.colptr(0), dim_n, false); eT rnorm = norm(r); arma_check( (rnorm < eps), "newarp::GenEigsSolver::init(): initial residual vector cannot be zero" ); v = r / rnorm; Col w(dim_n, arma_zeros_indicator()); op.perform_op(v.memptr(), w.memptr()); nmatop++; fac_H(0, 0) = dot(v, w); fac_f = w - v * fac_H(0, 0); } template inline void GenEigsSolver::init() { arma_extra_debug_sigprint(); podarray init_resid(dim_n); blas_int idist = 2; // Uniform(-1, 1) blas_int iseed[4] = {1, 3, 5, 7}; // Fixed random seed blas_int n = dim_n; lapack::larnv(&idist, &iseed[0], &n, init_resid.memptr()); init(init_resid.memptr()); } template inline uword GenEigsSolver::compute(uword maxit, eT tol) { arma_extra_debug_sigprint(); // The m-step Arnoldi factorisation factorise_from(1, ncv, fac_f); retrieve_ritzpair(); // Restarting uword i, nconv = 0, nev_adj; for(i = 0; i < maxit; i++) { nconv = num_converged(tol); if(nconv >= nev) { break; } nev_adj = nev_adjusted(nconv); restart(nev_adj); } // Sorting results sort_ritzpair(); niter = i + 1; return (std::min)(nev, nconv); } template inline Col< std::complex > GenEigsSolver::eigenvalues() { arma_extra_debug_sigprint(); uword nconv = std::count(ritz_conv.begin(), ritz_conv.end(), true); Col< std::complex > res(nconv, arma_zeros_indicator()); if(nconv > 0) { uword j = 0; for(uword i = 0; i < nev; i++) { if(ritz_conv[i]) { res(j) = ritz_val(i); j++; } } } return res; } template inline Mat< std::complex > GenEigsSolver::eigenvectors(uword nvec) { arma_extra_debug_sigprint(); uword nconv = std::count(ritz_conv.begin(), ritz_conv.end(), true); nvec = (std::min)(nvec, nconv); Mat< std::complex > res(dim_n, nvec); if(nvec > 0) { Mat< std::complex > ritz_vec_conv(ncv, nvec, arma_zeros_indicator()); uword j = 0; for(uword i = 0; (i < nev) && (j < nvec); i++) { if(ritz_conv[i]) { ritz_vec_conv.col(j) = ritz_vec.col(i); j++; } } res = fac_V * ritz_vec_conv; } return res; } } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/op_range_bones.hpp0000644000176200001440000000231314124060717024062 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_range //! @{ class op_range : public traits_op_xvec { public: template inline static void apply(Mat& out, const Op& in); template inline static void apply_noalias(Mat& out, const Mat& X, const uword dim); template inline static typename T1::elem_type vector_range(const T1& expr); }; //! @} RcppArmadillo/inst/include/armadillo_bits/gmm_misc_bones.hpp0000644000176200001440000000711714124060717024072 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup gmm_misc //! @{ struct gmm_dist_mode { const uword id; inline explicit gmm_dist_mode(const uword in_id) : id(in_id) {} }; inline bool operator==(const gmm_dist_mode& a, const gmm_dist_mode& b) { return (a.id == b.id); } inline bool operator!=(const gmm_dist_mode& a, const gmm_dist_mode& b) { return (a.id != b.id); } struct gmm_dist_eucl : public gmm_dist_mode { inline gmm_dist_eucl() : gmm_dist_mode(1) {} }; struct gmm_dist_maha : public gmm_dist_mode { inline gmm_dist_maha() : gmm_dist_mode(2) {} }; struct gmm_dist_prob : public gmm_dist_mode { inline gmm_dist_prob() : gmm_dist_mode(3) {} }; static const gmm_dist_eucl eucl_dist; static const gmm_dist_maha maha_dist; static const gmm_dist_prob prob_dist; struct gmm_seed_mode { const uword id; inline explicit gmm_seed_mode(const uword in_id) : id(in_id) {} }; inline bool operator==(const gmm_seed_mode& a, const gmm_seed_mode& b) { return (a.id == b.id); } inline bool operator!=(const gmm_seed_mode& a, const gmm_seed_mode& b) { return (a.id != b.id); } struct gmm_seed_keep_existing : public gmm_seed_mode { inline gmm_seed_keep_existing() : gmm_seed_mode(1) {} }; struct gmm_seed_static_subset : public gmm_seed_mode { inline gmm_seed_static_subset() : gmm_seed_mode(2) {} }; struct gmm_seed_static_spread : public gmm_seed_mode { inline gmm_seed_static_spread() : gmm_seed_mode(3) {} }; struct gmm_seed_random_subset : public gmm_seed_mode { inline gmm_seed_random_subset() : gmm_seed_mode(4) {} }; struct gmm_seed_random_spread : public gmm_seed_mode { inline gmm_seed_random_spread() : gmm_seed_mode(5) {} }; static const gmm_seed_keep_existing keep_existing; static const gmm_seed_static_subset static_subset; static const gmm_seed_static_spread static_spread; static const gmm_seed_random_subset random_subset; static const gmm_seed_random_spread random_spread; namespace gmm_priv { template class gmm_diag; template class gmm_full; struct gmm_empty_arg {}; // running_mean_scalar template class running_mean_scalar { public: inline running_mean_scalar(); inline running_mean_scalar(const running_mean_scalar& in_rms); inline const running_mean_scalar& operator=(const running_mean_scalar& in_rms); arma_hot inline void operator() (const eT X); inline void reset(); inline uword count() const; inline eT mean() const; private: arma_aligned uword counter; arma_aligned eT r_mean; }; // distance template struct distance {}; template struct distance { arma_inline static eT eval(const uword N, const eT* A, const eT* B, const eT*); }; template struct distance { arma_inline static eT eval(const uword N, const eT* A, const eT* B, const eT* C); }; } //! @} RcppArmadillo/inst/include/armadillo_bits/MapMat_meat.hpp0000644000176200001440000010240014124060717023265 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup MapMat //! @{ template inline MapMat::~MapMat() { arma_extra_debug_sigprint_this(this); if(map_ptr) { (*map_ptr).clear(); delete map_ptr; } // try to expose buggy user code that accesses deleted objects if(arma_config::debug) { map_ptr = nullptr; } arma_type_check(( is_supported_elem_type::value == false )); } template inline MapMat::MapMat() : n_rows (0) , n_cols (0) , n_elem (0) , map_ptr(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); } template inline MapMat::MapMat(const uword in_n_rows, const uword in_n_cols) : n_rows (in_n_rows) , n_cols (in_n_cols) , n_elem (in_n_rows * in_n_cols) , map_ptr(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); } template inline MapMat::MapMat(const SizeMat& s) : n_rows (s.n_rows) , n_cols (s.n_cols) , n_elem (s.n_rows * s.n_cols) , map_ptr(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); } template inline MapMat::MapMat(const MapMat& x) : n_rows (0) , n_cols (0) , n_elem (0) , map_ptr(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); (*this).operator=(x); } template inline void MapMat::operator=(const MapMat& x) { arma_extra_debug_sigprint(); if(this == &x) { return; } access::rw(n_rows) = x.n_rows; access::rw(n_cols) = x.n_cols; access::rw(n_elem) = x.n_elem; (*map_ptr) = *(x.map_ptr); } template inline MapMat::MapMat(const SpMat& x) : n_rows (0) , n_cols (0) , n_elem (0) , map_ptr(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); (*this).operator=(x); } template inline void MapMat::operator=(const SpMat& x) { arma_extra_debug_sigprint(); const uword x_n_rows = x.n_rows; const uword x_n_cols = x.n_cols; (*this).zeros(x_n_rows, x_n_cols); if(x.n_nonzero == 0) { return; } const eT* x_values = x.values; const uword* x_row_indices = x.row_indices; const uword* x_col_ptrs = x.col_ptrs; map_type& map_ref = (*map_ptr); for(uword col = 0; col < x_n_cols; ++col) { const uword start = x_col_ptrs[col ]; const uword end = x_col_ptrs[col + 1]; for(uword i = start; i < end; ++i) { const uword row = x_row_indices[i]; const eT val = x_values[i]; const uword index = (x_n_rows * col) + row; map_ref.emplace_hint(map_ref.cend(), index, val); } } } template inline MapMat::MapMat(MapMat&& x) : n_rows (x.n_rows ) , n_cols (x.n_cols ) , n_elem (x.n_elem ) , map_ptr(x.map_ptr) { arma_extra_debug_sigprint_this(this); access::rw(x.n_rows) = 0; access::rw(x.n_cols) = 0; access::rw(x.n_elem) = 0; access::rw(x.map_ptr) = nullptr; } template inline void MapMat::operator=(MapMat&& x) { arma_extra_debug_sigprint(); reset(); if(map_ptr) { delete map_ptr; } access::rw(n_rows) = x.n_rows; access::rw(n_cols) = x.n_cols; access::rw(n_elem) = x.n_elem; access::rw(map_ptr) = x.map_ptr; access::rw(x.n_rows) = 0; access::rw(x.n_cols) = 0; access::rw(x.n_elem) = 0; access::rw(x.map_ptr) = nullptr; } template inline void MapMat::reset() { arma_extra_debug_sigprint(); access::rw(n_rows) = 0; access::rw(n_cols) = 0; access::rw(n_elem) = 0; if((*map_ptr).empty() == false) { (*map_ptr).clear(); } } template inline void MapMat::set_size(const uword in_n_rows) { arma_extra_debug_sigprint(); init_warm(in_n_rows, 1); } template inline void MapMat::set_size(const uword in_n_rows, const uword in_n_cols) { arma_extra_debug_sigprint(); init_warm(in_n_rows, in_n_cols); } template inline void MapMat::set_size(const SizeMat& s) { arma_extra_debug_sigprint(); init_warm(s.n_rows, s.n_cols); } template inline void MapMat::zeros() { arma_extra_debug_sigprint(); (*map_ptr).clear(); } template inline void MapMat::zeros(const uword in_n_rows) { arma_extra_debug_sigprint(); init_warm(in_n_rows, 1); (*map_ptr).clear(); } template inline void MapMat::zeros(const uword in_n_rows, const uword in_n_cols) { arma_extra_debug_sigprint(); init_warm(in_n_rows, in_n_cols); (*map_ptr).clear(); } template inline void MapMat::zeros(const SizeMat& s) { arma_extra_debug_sigprint(); init_warm(s.n_rows, s.n_cols); (*map_ptr).clear(); } template inline void MapMat::eye() { arma_extra_debug_sigprint(); (*this).eye(n_rows, n_cols); } template inline void MapMat::eye(const uword in_n_rows, const uword in_n_cols) { arma_extra_debug_sigprint(); zeros(in_n_rows, in_n_cols); const uword N = (std::min)(in_n_rows, in_n_cols); map_type& map_ref = (*map_ptr); for(uword i=0; i inline void MapMat::eye(const SizeMat& s) { arma_extra_debug_sigprint(); (*this).eye(s.n_rows, s.n_cols); } template inline void MapMat::speye() { arma_extra_debug_sigprint(); (*this).eye(); } template inline void MapMat::speye(const uword in_n_rows, const uword in_n_cols) { arma_extra_debug_sigprint(); (*this).eye(in_n_rows, in_n_cols); } template inline void MapMat::speye(const SizeMat& s) { arma_extra_debug_sigprint(); (*this).eye(s); } template arma_inline arma_warn_unused MapMat_val MapMat::operator[](const uword index) { return MapMat_val(*this, index); } template inline arma_warn_unused eT MapMat::operator[](const uword index) const { map_type& map_ref = (*map_ptr); typename map_type::const_iterator it = map_ref.find(index); typename map_type::const_iterator it_end = map_ref.end(); return (it != it_end) ? eT((*it).second) : eT(0); } template arma_inline arma_warn_unused MapMat_val MapMat::operator()(const uword index) { arma_debug_check_bounds( (index >= n_elem), "MapMat::operator(): index out of bounds" ); return MapMat_val(*this, index); } template inline arma_warn_unused eT MapMat::operator()(const uword index) const { arma_debug_check_bounds( (index >= n_elem), "MapMat::operator(): index out of bounds" ); map_type& map_ref = (*map_ptr); typename map_type::const_iterator it = map_ref.find(index); typename map_type::const_iterator it_end = map_ref.end(); return (it != it_end) ? eT((*it).second) : eT(0); } template arma_inline arma_warn_unused MapMat_val MapMat::at(const uword in_row, const uword in_col) { const uword index = (n_rows * in_col) + in_row; return MapMat_val(*this, index); } template inline arma_warn_unused eT MapMat::at(const uword in_row, const uword in_col) const { const uword index = (n_rows * in_col) + in_row; map_type& map_ref = (*map_ptr); typename map_type::const_iterator it = map_ref.find(index); typename map_type::const_iterator it_end = map_ref.end(); return (it != it_end) ? eT((*it).second) : eT(0); } template arma_inline arma_warn_unused MapMat_val MapMat::operator()(const uword in_row, const uword in_col) { arma_debug_check_bounds( ((in_row >= n_rows) || (in_col >= n_cols)), "MapMat::operator(): index out of bounds" ); const uword index = (n_rows * in_col) + in_row; return MapMat_val(*this, index); } template inline arma_warn_unused eT MapMat::operator()(const uword in_row, const uword in_col) const { arma_debug_check_bounds( ((in_row >= n_rows) || (in_col >= n_cols)), "MapMat::operator(): index out of bounds" ); const uword index = (n_rows * in_col) + in_row; map_type& map_ref = (*map_ptr); typename map_type::const_iterator it = map_ref.find(index); typename map_type::const_iterator it_end = map_ref.end(); return (it != it_end) ? eT((*it).second) : eT(0); } template inline arma_warn_unused bool MapMat::is_empty() const { return (n_elem == 0); } template inline arma_warn_unused bool MapMat::is_vec() const { return ( (n_rows == 1) || (n_cols == 1) ); } template inline arma_warn_unused bool MapMat::is_rowvec() const { return (n_rows == 1); } //! returns true if the object can be interpreted as a column vector template inline arma_warn_unused bool MapMat::is_colvec() const { return (n_cols == 1); } template inline arma_warn_unused bool MapMat::is_square() const { return (n_rows == n_cols); } // this function is for debugging purposes only template inline void MapMat::sprandu(const uword in_n_rows, const uword in_n_cols, const double density) { arma_extra_debug_sigprint(); zeros(in_n_rows, in_n_cols); const uword N = uword(density * double(n_elem)); const Col vals(N, fill::randu); const Col indx = linspace< Col >(0, ((n_elem > 0) ? uword(n_elem-1) : uword(0)) , N); const eT* vals_mem = vals.memptr(); const uword* indx_mem = indx.memptr(); map_type& map_ref = (*map_ptr); for(uword i=0; i < N; ++i) { const uword index = indx_mem[i]; const eT val = vals_mem[i]; map_ref.emplace_hint(map_ref.cend(), index, val); } } // this function is for debugging purposes only template inline void MapMat::print(const std::string& extra_text) const { arma_extra_debug_sigprint(); if(extra_text.length() != 0) { const std::streamsize orig_width = get_cout_stream().width(); get_cout_stream() << extra_text << '\n'; get_cout_stream().width(orig_width); } map_type& map_ref = (*map_ptr); const uword n_nonzero = uword(map_ref.size()); const double density = (n_elem > 0) ? ((double(n_nonzero) / double(n_elem))*double(100)) : double(0); get_cout_stream() << "[matrix size: " << n_rows << 'x' << n_cols << "; n_nonzero: " << n_nonzero << "; density: " << density << "%]\n\n"; if(n_nonzero > 0) { typename map_type::const_iterator it = map_ref.begin(); for(uword i=0; i < n_nonzero; ++i) { const std::pair& entry = (*it); const uword index = entry.first; const eT val = entry.second; const uword row = index % n_rows; const uword col = index / n_rows; get_cout_stream() << '(' << row << ", " << col << ") "; get_cout_stream() << val << '\n'; ++it; } } get_cout_stream().flush(); } template inline uword MapMat::get_n_nonzero() const { arma_extra_debug_sigprint(); return uword((*map_ptr).size()); } template inline void MapMat::get_locval_format(umat& locs, Col& vals) const { arma_extra_debug_sigprint(); map_type& map_ref = (*map_ptr); typename map_type::const_iterator it = map_ref.begin(); const uword N = uword(map_ref.size()); locs.set_size(2,N); vals.set_size(N); eT* vals_mem = vals.memptr(); for(uword i=0; i& entry = (*it); const uword index = entry.first; const eT val = entry.second; const uword row = index % n_rows; const uword col = index / n_rows; uword* locs_colptr = locs.colptr(i); locs_colptr[0] = row; locs_colptr[1] = col; vals_mem[i] = val; ++it; } } template inline void MapMat::init_cold() { arma_extra_debug_sigprint(); // ensure that n_elem can hold the result of (n_rows * n_cols) #if defined(ARMA_64BIT_WORD) const char* error_message = "MapMat(): requested size is too large"; #else const char* error_message = "MapMat(): requested size is too large; suggest to enable ARMA_64BIT_WORD"; #endif arma_debug_check ( ( ( (n_rows > ARMA_MAX_UHWORD) || (n_cols > ARMA_MAX_UHWORD) ) ? ( (double(n_rows) * double(n_cols)) > double(ARMA_MAX_UWORD) ) : false ), error_message ); map_ptr = new (std::nothrow) map_type; arma_check_bad_alloc( (map_ptr == nullptr), "MapMat(): out of memory" ); } template inline void MapMat::init_warm(const uword in_n_rows, const uword in_n_cols) { arma_extra_debug_sigprint(); if( (n_rows == in_n_rows) && (n_cols == in_n_cols)) { return; } // ensure that n_elem can hold the result of (n_rows * n_cols) #if defined(ARMA_64BIT_WORD) const char* error_message = "MapMat(): requested size is too large"; #else const char* error_message = "MapMat(): requested size is too large; suggest to enable ARMA_64BIT_WORD"; #endif arma_debug_check ( ( ( (in_n_rows > ARMA_MAX_UHWORD) || (in_n_cols > ARMA_MAX_UHWORD) ) ? ( (double(in_n_rows) * double(in_n_cols)) > double(ARMA_MAX_UWORD) ) : false ), error_message ); const uword new_n_elem = in_n_rows * in_n_cols; access::rw(n_rows) = in_n_rows; access::rw(n_cols) = in_n_cols; access::rw(n_elem) = new_n_elem; if(new_n_elem == 0) { (*map_ptr).clear(); } } template arma_inline void MapMat::set_val(const uword index, const eT& in_val) { arma_extra_debug_sigprint(); if(in_val != eT(0)) { map_type& map_ref = (*map_ptr); if( (map_ref.empty() == false) && (index > uword(map_ref.crbegin()->first)) ) { map_ref.emplace_hint(map_ref.cend(), index, in_val); } else { map_ref.operator[](index) = in_val; } } else { (*this).erase_val(index); } } template inline void MapMat::erase_val(const uword index) { arma_extra_debug_sigprint(); map_type& map_ref = (*map_ptr); typename map_type::iterator it = map_ref.find(index); typename map_type::iterator it_end = map_ref.end(); if(it != it_end) { map_ref.erase(it); } } // MapMat_val template arma_inline MapMat_val::MapMat_val(MapMat& in_parent, const uword in_index) : parent(in_parent) , index (in_index ) { arma_extra_debug_sigprint(); } template arma_inline MapMat_val::operator eT() const { arma_extra_debug_sigprint(); const MapMat& const_parent = parent; return const_parent.operator[](index); } template arma_inline typename get_pod_type::result MapMat_val::real() const { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const MapMat& const_parent = parent; return T( access::tmp_real( const_parent.operator[](index) ) ); } template arma_inline typename get_pod_type::result MapMat_val::imag() const { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const MapMat& const_parent = parent; return T( access::tmp_imag( const_parent.operator[](index) ) ); } template arma_inline void MapMat_val::operator=(const MapMat_val& x) { arma_extra_debug_sigprint(); const eT in_val = eT(x); parent.set_val(index, in_val); } template arma_inline void MapMat_val::operator=(const eT in_val) { arma_extra_debug_sigprint(); parent.set_val(index, in_val); } template arma_inline void MapMat_val::operator+=(const eT in_val) { arma_extra_debug_sigprint(); typename MapMat::map_type& map_ref = *(parent.map_ptr); if(in_val != eT(0)) { eT& val = map_ref.operator[](index); // creates the element if it doesn't exist val += in_val; if(val == eT(0)) { map_ref.erase(index); } } } template arma_inline void MapMat_val::operator-=(const eT in_val) { arma_extra_debug_sigprint(); typename MapMat::map_type& map_ref = *(parent.map_ptr); if(in_val != eT(0)) { eT& val = map_ref.operator[](index); // creates the element if it doesn't exist val -= in_val; if(val == eT(0)) { map_ref.erase(index); } } } template arma_inline void MapMat_val::operator*=(const eT in_val) { arma_extra_debug_sigprint(); typename MapMat::map_type& map_ref = *(parent.map_ptr); typename MapMat::map_type::iterator it = map_ref.find(index); typename MapMat::map_type::iterator it_end = map_ref.end(); if(it != it_end) { if(in_val != eT(0)) { eT& val = (*it).second; val *= in_val; if(val == eT(0)) { map_ref.erase(it); } } else { map_ref.erase(it); } } } template arma_inline void MapMat_val::operator/=(const eT in_val) { arma_extra_debug_sigprint(); typename MapMat::map_type& map_ref = *(parent.map_ptr); typename MapMat::map_type::iterator it = map_ref.find(index); typename MapMat::map_type::iterator it_end = map_ref.end(); if(it != it_end) { eT& val = (*it).second; val /= in_val; if(val == eT(0)) { map_ref.erase(it); } } else { // silly operation, but included for completness const eT val = eT(0) / in_val; if(val != eT(0)) { parent.set_val(index, val); } } } template arma_inline void MapMat_val::operator++() { arma_extra_debug_sigprint(); typename MapMat::map_type& map_ref = *(parent.map_ptr); eT& val = map_ref.operator[](index); // creates the element if it doesn't exist val += eT(1); // can't use ++, as eT can be std::complex if(val == eT(0)) { map_ref.erase(index); } } template arma_inline void MapMat_val::operator++(int) { arma_extra_debug_sigprint(); (*this).operator++(); } template arma_inline void MapMat_val::operator--() { arma_extra_debug_sigprint(); typename MapMat::map_type& map_ref = *(parent.map_ptr); eT& val = map_ref.operator[](index); // creates the element if it doesn't exist val -= eT(1); // can't use --, as eT can be std::complex if(val == eT(0)) { map_ref.erase(index); } } template arma_inline void MapMat_val::operator--(int) { arma_extra_debug_sigprint(); (*this).operator--(); } // SpMat_MapMat_val template arma_inline SpMat_MapMat_val::SpMat_MapMat_val(SpMat& in_s_parent, MapMat& in_m_parent, const uword in_row, const uword in_col) : s_parent(in_s_parent) , m_parent(in_m_parent) , row (in_row ) , col (in_col ) { arma_extra_debug_sigprint(); } template inline SpMat_MapMat_val::operator eT() const { arma_extra_debug_sigprint(); const SpMat& const_s_parent = s_parent; // declare as const for clarity of intent return const_s_parent.get_value(row,col); } template inline typename get_pod_type::result SpMat_MapMat_val::real() const { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const SpMat& const_s_parent = s_parent; // declare as const for clarity of intent return T( access::tmp_real( const_s_parent.get_value(row,col) ) ); } template inline typename get_pod_type::result SpMat_MapMat_val::imag() const { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const SpMat& const_s_parent = s_parent; // declare as const for clarity of intent return T( access::tmp_imag( const_s_parent.get_value(row,col) ) ); } template inline SpMat_MapMat_val& SpMat_MapMat_val::operator=(const SpMat_MapMat_val& x) { arma_extra_debug_sigprint(); const eT in_val = eT(x); return (*this).operator=(in_val); } template inline SpMat_MapMat_val& SpMat_MapMat_val::operator=(const eT in_val) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_OPENMP) { #pragma omp critical (arma_SpMat_cache) { (*this).set(in_val); } } #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) { s_parent.cache_mutex.lock(); (*this).set(in_val); s_parent.cache_mutex.unlock(); } #else { (*this).set(in_val); } #endif return *this; } template inline SpMat_MapMat_val& SpMat_MapMat_val::operator+=(const eT in_val) { arma_extra_debug_sigprint(); if(in_val == eT(0)) { return *this; } #if defined(ARMA_USE_OPENMP) { #pragma omp critical (arma_SpMat_cache) { (*this).add(in_val); } } #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) { s_parent.cache_mutex.lock(); (*this).add(in_val); s_parent.cache_mutex.unlock(); } #else { (*this).add(in_val); } #endif return *this; } template inline SpMat_MapMat_val& SpMat_MapMat_val::operator-=(const eT in_val) { arma_extra_debug_sigprint(); if(in_val == eT(0)) { return *this; } #if defined(ARMA_USE_OPENMP) { #pragma omp critical (arma_SpMat_cache) { (*this).sub(in_val); } } #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) { s_parent.cache_mutex.lock(); (*this).sub(in_val); s_parent.cache_mutex.unlock(); } #else { (*this).sub(in_val); } #endif return *this; } template inline SpMat_MapMat_val& SpMat_MapMat_val::operator*=(const eT in_val) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_OPENMP) { #pragma omp critical (arma_SpMat_cache) { (*this).mul(in_val); } } #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) { s_parent.cache_mutex.lock(); (*this).mul(in_val); s_parent.cache_mutex.unlock(); } #else { (*this).mul(in_val); } #endif return *this; } template inline SpMat_MapMat_val& SpMat_MapMat_val::operator/=(const eT in_val) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_OPENMP) { #pragma omp critical (arma_SpMat_cache) { (*this).div(in_val); } } #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) { s_parent.cache_mutex.lock(); (*this).div(in_val); s_parent.cache_mutex.unlock(); } #else { (*this).div(in_val); } #endif return *this; } template inline SpMat_MapMat_val& SpMat_MapMat_val::operator++() { arma_extra_debug_sigprint(); return (*this).operator+=( eT(1) ); } template inline arma_warn_unused eT SpMat_MapMat_val::operator++(int) { arma_extra_debug_sigprint(); const eT old_val = eT(*this); (*this).operator+=( eT(1) ); return old_val; } template inline SpMat_MapMat_val& SpMat_MapMat_val::operator--() { arma_extra_debug_sigprint(); return (*this).operator-=( eT(1) ); } template inline arma_warn_unused eT SpMat_MapMat_val::operator--(int) { arma_extra_debug_sigprint(); const eT old_val = eT(*this); (*this).operator-=( eT(1) ); return old_val; } template inline void SpMat_MapMat_val::set(const eT in_val) { arma_extra_debug_sigprint(); const bool done = (s_parent.sync_state == 0) ? s_parent.try_set_value_csc(row, col, in_val) : false; if(done == false) { s_parent.sync_cache_simple(); const uword index = (m_parent.n_rows * col) + row; m_parent.set_val(index, in_val); s_parent.sync_state = 1; access::rw(s_parent.n_nonzero) = m_parent.get_n_nonzero(); } } template inline void SpMat_MapMat_val::add(const eT in_val) { arma_extra_debug_sigprint(); const bool done = (s_parent.sync_state == 0) ? s_parent.try_add_value_csc(row, col, in_val) : false; if(done == false) { s_parent.sync_cache_simple(); const uword index = (m_parent.n_rows * col) + row; typename MapMat::map_type& map_ref = *(m_parent.map_ptr); eT& val = map_ref.operator[](index); // creates the element if it doesn't exist val += in_val; if(val == eT(0)) { map_ref.erase(index); } s_parent.sync_state = 1; access::rw(s_parent.n_nonzero) = m_parent.get_n_nonzero(); } } template inline void SpMat_MapMat_val::sub(const eT in_val) { arma_extra_debug_sigprint(); const bool done = (s_parent.sync_state == 0) ? s_parent.try_sub_value_csc(row, col, in_val) : false; if(done == false) { s_parent.sync_cache_simple(); const uword index = (m_parent.n_rows * col) + row; typename MapMat::map_type& map_ref = *(m_parent.map_ptr); eT& val = map_ref.operator[](index); // creates the element if it doesn't exist val -= in_val; if(val == eT(0)) { map_ref.erase(index); } s_parent.sync_state = 1; access::rw(s_parent.n_nonzero) = m_parent.get_n_nonzero(); } } template inline void SpMat_MapMat_val::mul(const eT in_val) { arma_extra_debug_sigprint(); const bool done = (s_parent.sync_state == 0) ? s_parent.try_mul_value_csc(row, col, in_val) : false; if(done == false) { s_parent.sync_cache_simple(); const uword index = (m_parent.n_rows * col) + row; typename MapMat::map_type& map_ref = *(m_parent.map_ptr); typename MapMat::map_type::iterator it = map_ref.find(index); typename MapMat::map_type::iterator it_end = map_ref.end(); if(it != it_end) { if(in_val != eT(0)) { eT& val = (*it).second; val *= in_val; if(val == eT(0)) { map_ref.erase(it); } } else { map_ref.erase(it); } s_parent.sync_state = 1; access::rw(s_parent.n_nonzero) = m_parent.get_n_nonzero(); } else { // element not found, ie. it's zero; zero multiplied by anything is zero, except for nan and inf if(arma_isfinite(in_val) == false) { const eT result = eT(0) * in_val; if(result != eT(0)) // paranoia, in case compiling with -ffast-math { m_parent.set_val(index, result); s_parent.sync_state = 1; access::rw(s_parent.n_nonzero) = m_parent.get_n_nonzero(); } } } } } template inline void SpMat_MapMat_val::div(const eT in_val) { arma_extra_debug_sigprint(); const bool done = (s_parent.sync_state == 0) ? s_parent.try_div_value_csc(row, col, in_val) : false; if(done == false) { s_parent.sync_cache_simple(); const uword index = (m_parent.n_rows * col) + row; typename MapMat::map_type& map_ref = *(m_parent.map_ptr); typename MapMat::map_type::iterator it = map_ref.find(index); typename MapMat::map_type::iterator it_end = map_ref.end(); if(it != it_end) { eT& val = (*it).second; val /= in_val; if(val == eT(0)) { map_ref.erase(it); } s_parent.sync_state = 1; access::rw(s_parent.n_nonzero) = m_parent.get_n_nonzero(); } else { // element not found, ie. it's zero; zero divided by anything is zero, except for zero and nan if( (in_val == eT(0)) || (arma_isnan(in_val)) ) { const eT result = eT(0) / in_val; if(result != eT(0)) // paranoia, in case compiling with -ffast-math { m_parent.set_val(index, result); s_parent.sync_state = 1; access::rw(s_parent.n_nonzero) = m_parent.get_n_nonzero(); } } } } } // SpSubview_MapMat_val template arma_inline SpSubview_MapMat_val::SpSubview_MapMat_val(SpSubview& in_sv_parent, MapMat& in_m_parent, const uword in_row, const uword in_col) : SpMat_MapMat_val(access::rw(in_sv_parent.m), in_m_parent, in_row, in_col) , sv_parent(in_sv_parent) { arma_extra_debug_sigprint(); } template inline SpSubview_MapMat_val& SpSubview_MapMat_val::operator=(const SpSubview_MapMat_val& x) { arma_extra_debug_sigprint(); const eT in_val = eT(x); return (*this).operator=(in_val); } template inline SpSubview_MapMat_val& SpSubview_MapMat_val::operator=(const eT in_val) { arma_extra_debug_sigprint(); const uword old_n_nonzero = sv_parent.m.n_nonzero; SpMat_MapMat_val::operator=(in_val); if(sv_parent.m.n_nonzero > old_n_nonzero) { access::rw(sv_parent.n_nonzero)++; } if(sv_parent.m.n_nonzero < old_n_nonzero) { access::rw(sv_parent.n_nonzero)--; } return *this; } template inline SpSubview_MapMat_val& SpSubview_MapMat_val::operator+=(const eT in_val) { arma_extra_debug_sigprint(); const uword old_n_nonzero = sv_parent.m.n_nonzero; SpMat_MapMat_val::operator+=(in_val); if(sv_parent.m.n_nonzero > old_n_nonzero) { access::rw(sv_parent.n_nonzero)++; } if(sv_parent.m.n_nonzero < old_n_nonzero) { access::rw(sv_parent.n_nonzero)--; } return *this; } template inline SpSubview_MapMat_val& SpSubview_MapMat_val::operator-=(const eT in_val) { arma_extra_debug_sigprint(); const uword old_n_nonzero = sv_parent.m.n_nonzero; SpMat_MapMat_val::operator-=(in_val); if(sv_parent.m.n_nonzero > old_n_nonzero) { access::rw(sv_parent.n_nonzero)++; } if(sv_parent.m.n_nonzero < old_n_nonzero) { access::rw(sv_parent.n_nonzero)--; } return *this; } template inline SpSubview_MapMat_val& SpSubview_MapMat_val::operator*=(const eT in_val) { arma_extra_debug_sigprint(); const uword old_n_nonzero = sv_parent.m.n_nonzero; SpMat_MapMat_val::operator*=(in_val); if(sv_parent.m.n_nonzero > old_n_nonzero) { access::rw(sv_parent.n_nonzero)++; } if(sv_parent.m.n_nonzero < old_n_nonzero) { access::rw(sv_parent.n_nonzero)--; } return *this; } template inline SpSubview_MapMat_val& SpSubview_MapMat_val::operator/=(const eT in_val) { arma_extra_debug_sigprint(); const uword old_n_nonzero = sv_parent.m.n_nonzero; SpMat_MapMat_val::operator/=(in_val); if(sv_parent.m.n_nonzero > old_n_nonzero) { access::rw(sv_parent.n_nonzero)++; } if(sv_parent.m.n_nonzero < old_n_nonzero) { access::rw(sv_parent.n_nonzero)--; } return *this; } template inline SpSubview_MapMat_val& SpSubview_MapMat_val::operator++() { arma_extra_debug_sigprint(); const uword old_n_nonzero = sv_parent.m.n_nonzero; SpMat_MapMat_val::operator++(); if(sv_parent.m.n_nonzero > old_n_nonzero) { access::rw(sv_parent.n_nonzero)++; } if(sv_parent.m.n_nonzero < old_n_nonzero) { access::rw(sv_parent.n_nonzero)--; } return *this; } template inline arma_warn_unused eT SpSubview_MapMat_val::operator++(int) { arma_extra_debug_sigprint(); const uword old_n_nonzero = sv_parent.m.n_nonzero; const eT old_val = SpMat_MapMat_val::operator++(int(0)); if(sv_parent.m.n_nonzero > old_n_nonzero) { access::rw(sv_parent.n_nonzero)++; } if(sv_parent.m.n_nonzero < old_n_nonzero) { access::rw(sv_parent.n_nonzero)--; } return old_val; } template inline SpSubview_MapMat_val& SpSubview_MapMat_val::operator--() { arma_extra_debug_sigprint(); const uword old_n_nonzero = sv_parent.m.n_nonzero; SpMat_MapMat_val::operator--(); if(sv_parent.m.n_nonzero > old_n_nonzero) { access::rw(sv_parent.n_nonzero)++; } if(sv_parent.m.n_nonzero < old_n_nonzero) { access::rw(sv_parent.n_nonzero)--; } return *this; } template inline arma_warn_unused eT SpSubview_MapMat_val::operator--(int) { arma_extra_debug_sigprint(); const uword old_n_nonzero = sv_parent.m.n_nonzero; const eT old_val = SpMat_MapMat_val::operator--(int(0)); if(sv_parent.m.n_nonzero > old_n_nonzero) { access::rw(sv_parent.n_nonzero)++; } if(sv_parent.m.n_nonzero < old_n_nonzero) { access::rw(sv_parent.n_nonzero)--; } return old_val; } //! @} RcppArmadillo/inst/include/armadillo_bits/wall_clock_meat.hpp0000644000176200001440000000306014124060717024222 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup wall_clock //! @{ inline wall_clock::wall_clock() { arma_extra_debug_sigprint(); } inline wall_clock::~wall_clock() { arma_extra_debug_sigprint(); } inline void wall_clock::tic() { arma_extra_debug_sigprint(); chrono_time1 = std::chrono::steady_clock::now(); valid = true; } inline double wall_clock::toc() { arma_extra_debug_sigprint(); if(valid) { const std::chrono::steady_clock::time_point chrono_time2 = std::chrono::steady_clock::now(); typedef std::chrono::duration duration_type; // TODO: check this const duration_type chrono_span = std::chrono::duration_cast< duration_type >(chrono_time2 - chrono_time1); return chrono_span.count(); } return 0.0; } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_cov_bones.hpp0000644000176200001440000000236714124060717024104 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_cov //! @{ class glue_cov { public: template struct traits { static constexpr bool is_row = false; // T1::is_col; // TODO: check static constexpr bool is_col = false; // T2::is_col; // TODO: check static constexpr bool is_xvec = false; }; template inline static void apply(Mat& out, const Glue& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_clamp.hpp0000644000176200001440000000670314124060717022670 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_clamp //! @{ template arma_warn_unused inline typename enable_if2 < is_arma_type::value && is_cx::no, const mtOp >::result clamp(const T1& X, const typename T1::elem_type min_val, const typename T1::elem_type max_val) { arma_extra_debug_sigprint(); return mtOp(mtOp_dual_aux_indicator(), X, min_val, max_val); } template arma_warn_unused inline typename enable_if2 < is_arma_type::value && is_cx::yes, const mtOp >::result clamp(const T1& X, const typename T1::elem_type min_val, const typename T1::elem_type max_val) { arma_extra_debug_sigprint(); return mtOp(mtOp_dual_aux_indicator(), X, min_val, max_val); } template arma_warn_unused inline const mtOpCube clamp(const BaseCube& X, const typename T1::elem_type min_val, const typename T1::elem_type max_val, typename arma_not_cx::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return mtOpCube(mtOpCube_dual_aux_indicator(), X.get_ref(), min_val, max_val); } template arma_warn_unused inline const mtOpCube clamp(const BaseCube& X, const typename T1::elem_type min_val, const typename T1::elem_type max_val, typename arma_cx_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return mtOpCube(mtOpCube_dual_aux_indicator(), X.get_ref(), min_val, max_val); } template arma_warn_unused inline SpMat clamp(const SpBase& X, const typename T1::elem_type min_val, const typename T1::elem_type max_val) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(is_cx::no) { arma_debug_check( (access::tmp_real(min_val) > access::tmp_real(max_val)), "clamp(): min_val must be less than max_val" ); } else { arma_debug_check( (access::tmp_real(min_val) > access::tmp_real(max_val)), "clamp(): real(min_val) must be less than real(max_val)" ); arma_debug_check( (access::tmp_imag(min_val) > access::tmp_imag(max_val)), "clamp(): imag(min_val) must be less than imag(max_val)" ); } SpMat out = X.get_ref(); out.clamp(min_val, max_val); return out; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_cor_meat.hpp0000644000176200001440000000600614124060717023374 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_cor //! @{ template inline void op_cor::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword norm_type = in.aux_uword_a; const unwrap U(in.m); const Mat& A = U.M; if(A.n_elem == 0) { out.reset(); return; } if(A.n_elem == 1) { out.set_size(1,1); out[0] = eT(1); return; } const Mat& AA = (A.n_rows == 1) ? Mat(const_cast(A.memptr()), A.n_cols, A.n_rows, false, false) : Mat(const_cast(A.memptr()), A.n_rows, A.n_cols, false, false); const uword N = AA.n_rows; const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N); const Mat tmp = AA.each_row() - mean(AA,0); out = tmp.t() * tmp; out /= norm_val; const Col s = sqrt(out.diag()); out /= (s * s.t()); // TODO: check for zeros in s? } template inline void op_cor::apply(Mat& out, const Op< Op, op_cor>& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword norm_type = in.aux_uword_a; if(is_cx::yes) { const Mat tmp = in.m; // force the evaluation of Op out = cor(tmp, norm_type); } else { const unwrap U(in.m.m); const Mat& A = U.M; if(A.n_elem == 0) { out.reset(); return; } if(A.n_elem == 1) { out.set_size(1,1); out[0] = eT(1); return; } const Mat& AA = (A.n_cols == 1) ? Mat(const_cast(A.memptr()), A.n_cols, A.n_rows, false, false) : Mat(const_cast(A.memptr()), A.n_rows, A.n_cols, false, false); const uword N = AA.n_cols; const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N); const Mat tmp = AA.each_col() - mean(AA,1); out = tmp * tmp.t(); out /= norm_val; const Col s = sqrt(out.diag()); out /= (s * s.t()); // TODO: check for zeros in s? } } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_unique.hpp0000644000176200001440000000252614124060717023101 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_unique //! @{ template arma_warn_unused inline typename enable_if2 < is_arma_type::value && resolves_to_vector::yes, const Op >::result unique(const T1& A) { arma_extra_debug_sigprint(); return Op(A); } template arma_warn_unused inline typename enable_if2 < is_arma_type::value && resolves_to_vector::no, const Op >::result unique(const T1& A) { arma_extra_debug_sigprint(); return Op(A); } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_sum_bones.hpp0000644000176200001440000000201014124060717024127 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_sum //! @{ class spop_sum : public traits_op_xvec { public: template arma_hot inline static void apply(SpMat& out, const SpOp& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/SpBase_meat.hpp0000644000176200001440000004335314124060717023276 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpBase //! @{ template arma_inline const derived& SpBase::get_ref() const { return static_cast(*this); } template arma_inline bool SpBase::is_alias(const SpMat& X) const { return (*this).get_ref().is_alias(X); } template inline arma_warn_unused const SpOp SpBase::t() const { return SpOp( (*this).get_ref() ); } template inline arma_warn_unused const SpOp SpBase::ht() const { return SpOp( (*this).get_ref() ); } template inline arma_warn_unused const SpOp SpBase::st() const { return SpOp( (*this).get_ref() ); } template arma_cold inline void SpBase::print(const std::string extra_text) const { arma_extra_debug_sigprint(); const unwrap_spmat tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = get_cout_stream().width(); get_cout_stream() << extra_text << '\n'; get_cout_stream().width(orig_width); } arma_ostream::print(get_cout_stream(), tmp.M, true); } template arma_cold inline void SpBase::print(std::ostream& user_stream, const std::string extra_text) const { arma_extra_debug_sigprint(); const unwrap_spmat tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = user_stream.width(); user_stream << extra_text << '\n'; user_stream.width(orig_width); } arma_ostream::print(user_stream, tmp.M, true); } template arma_cold inline void SpBase::raw_print(const std::string extra_text) const { arma_extra_debug_sigprint(); const unwrap_spmat tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = get_cout_stream().width(); get_cout_stream() << extra_text << '\n'; get_cout_stream().width(orig_width); } arma_ostream::print(get_cout_stream(), tmp.M, false); } template arma_cold inline void SpBase::raw_print(std::ostream& user_stream, const std::string extra_text) const { arma_extra_debug_sigprint(); const unwrap_spmat tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = user_stream.width(); user_stream << extra_text << '\n'; user_stream.width(orig_width); } arma_ostream::print(user_stream, tmp.M, false); } template arma_cold inline void SpBase::print_dense(const std::string extra_text) const { arma_extra_debug_sigprint(); const unwrap_spmat tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = get_cout_stream().width(); get_cout_stream() << extra_text << '\n'; get_cout_stream().width(orig_width); } arma_ostream::print_dense(get_cout_stream(), tmp.M, true); } template arma_cold inline void SpBase::print_dense(std::ostream& user_stream, const std::string extra_text) const { arma_extra_debug_sigprint(); const unwrap_spmat tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = user_stream.width(); user_stream << extra_text << '\n'; user_stream.width(orig_width); } arma_ostream::print_dense(user_stream, tmp.M, true); } template arma_cold inline void SpBase::raw_print_dense(const std::string extra_text) const { arma_extra_debug_sigprint(); const unwrap_spmat tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = get_cout_stream().width(); get_cout_stream() << extra_text << '\n'; get_cout_stream().width(orig_width); } arma_ostream::print_dense(get_cout_stream(), tmp.M, false); } template arma_cold inline void SpBase::raw_print_dense(std::ostream& user_stream, const std::string extra_text) const { arma_extra_debug_sigprint(); const unwrap_spmat tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = user_stream.width(); user_stream << extra_text << '\n'; user_stream.width(orig_width); } arma_ostream::print_dense(user_stream, tmp.M, false); } template arma_cold inline void SpBase::brief_print(const std::string extra_text) const { arma_extra_debug_sigprint(); const unwrap_spmat tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = get_cout_stream().width(); get_cout_stream() << extra_text << '\n'; get_cout_stream().width(orig_width); } arma_ostream::brief_print(get_cout_stream(), tmp.M); } template arma_cold inline void SpBase::brief_print(std::ostream& user_stream, const std::string extra_text) const { arma_extra_debug_sigprint(); const unwrap_spmat tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = user_stream.width(); user_stream << extra_text << '\n'; user_stream.width(orig_width); } arma_ostream::brief_print(user_stream, tmp.M); } // // extra functions defined in SpBase_eval_SpMat template inline arma_warn_unused const derived& SpBase_eval_SpMat::eval() const { arma_extra_debug_sigprint(); return static_cast(*this); } // // extra functions defined in SpBase_eval_expr template inline arma_warn_unused SpMat SpBase_eval_expr::eval() const { arma_extra_debug_sigprint(); return SpMat( static_cast(*this) ); } template inline arma_warn_unused elem_type SpBase::min() const { return spop_min::min( (*this).get_ref() ); } template inline arma_warn_unused elem_type SpBase::max() const { return spop_max::max( (*this).get_ref() ); } template inline elem_type SpBase::min(uword& index_of_min_val) const { const SpProxy P( (*this).get_ref() ); return spop_min::min_with_index(P, index_of_min_val); } template inline elem_type SpBase::max(uword& index_of_max_val) const { const SpProxy P( (*this).get_ref() ); return spop_max::max_with_index(P, index_of_max_val); } template inline elem_type SpBase::min(uword& row_of_min_val, uword& col_of_min_val) const { const SpProxy P( (*this).get_ref() ); uword index = 0; const elem_type val = spop_min::min_with_index(P, index); const uword local_n_rows = P.get_n_rows(); row_of_min_val = index % local_n_rows; col_of_min_val = index / local_n_rows; return val; } template inline elem_type SpBase::max(uword& row_of_max_val, uword& col_of_max_val) const { const SpProxy P( (*this).get_ref() ); uword index = 0; const elem_type val = spop_max::max_with_index(P, index); const uword local_n_rows = P.get_n_rows(); row_of_max_val = index % local_n_rows; col_of_max_val = index / local_n_rows; return val; } template inline arma_warn_unused uword SpBase::index_min() const { const SpProxy P( (*this).get_ref() ); uword index = 0; if(P.get_n_elem() == 0) { arma_debug_check(true, "index_min(): object has no elements"); } else { spop_min::min_with_index(P, index); } return index; } template inline arma_warn_unused uword SpBase::index_max() const { const SpProxy P( (*this).get_ref() ); uword index = 0; if(P.get_n_elem() == 0) { arma_debug_check(true, "index_max(): object has no elements"); } else { spop_max::max_with_index(P, index); } return index; } template inline arma_warn_unused bool SpBase::is_symmetric() const { arma_extra_debug_sigprint(); const unwrap_spmat tmp( (*this).get_ref() ); return tmp.M.is_symmetric(); } template inline arma_warn_unused bool SpBase::is_symmetric(const typename get_pod_type::result tol) const { arma_extra_debug_sigprint(); const unwrap_spmat tmp( (*this).get_ref() ); return tmp.M.is_symmetric(tol); } template inline arma_warn_unused bool SpBase::is_hermitian() const { arma_extra_debug_sigprint(); const unwrap_spmat tmp( (*this).get_ref() ); return tmp.M.is_hermitian(); } template inline arma_warn_unused bool SpBase::is_hermitian(const typename get_pod_type::result tol) const { arma_extra_debug_sigprint(); const unwrap_spmat tmp( (*this).get_ref() ); return tmp.M.is_hermitian(tol); } template inline arma_warn_unused bool SpBase::is_zero(const typename get_pod_type::result tol) const { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; arma_debug_check( (tol < T(0)), "is_zero(): parameter 'tol' must be >= 0" ); const SpProxy P( (*this).get_ref() ); if(P.get_n_elem() == 0) { return false; } if(P.get_n_nonzero() == 0) { return true; } if(is_SpMat::stored_type>::value) { const unwrap_spmat::stored_type> U(P.Q); return arrayops::is_zero(U.M.values, U.M.n_nonzero, tol); } typename SpProxy::const_iterator_type it = P.begin(); typename SpProxy::const_iterator_type it_end = P.end(); if(is_cx::yes) { while(it != it_end) { const elem_type val = (*it); const T val_real = access::tmp_real(val); const T val_imag = access::tmp_imag(val); if(eop_aux::arma_abs(val_real) > tol) { return false; } if(eop_aux::arma_abs(val_imag) > tol) { return false; } ++it; } } else // not complex { while(it != it_end) { if(eop_aux::arma_abs(*it) > tol) { return false; } ++it; } } return true; } template inline arma_warn_unused bool SpBase::is_trimatu() const { arma_extra_debug_sigprint(); const SpProxy P( (*this).get_ref() ); if(P.get_n_rows() != P.get_n_cols()) { return false; } typename SpProxy::const_iterator_type it = P.begin(); typename SpProxy::const_iterator_type it_end = P.end(); while(it != it_end) { if(it.row() > it.col()) { return false; } ++it; } return true; } template inline arma_warn_unused bool SpBase::is_trimatl() const { arma_extra_debug_sigprint(); const SpProxy P( (*this).get_ref() ); if(P.get_n_rows() != P.get_n_cols()) { return false; } typename SpProxy::const_iterator_type it = P.begin(); typename SpProxy::const_iterator_type it_end = P.end(); while(it != it_end) { if(it.row() < it.col()) { return false; } ++it; } return true; } template inline arma_warn_unused bool SpBase::is_diagmat() const { arma_extra_debug_sigprint(); const SpProxy P( (*this).get_ref() ); typename SpProxy::const_iterator_type it = P.begin(); typename SpProxy::const_iterator_type it_end = P.end(); while(it != it_end) { if(it.row() != it.col()) { return false; } ++it; } return true; } template inline arma_warn_unused bool SpBase::is_empty() const { arma_extra_debug_sigprint(); const SpProxy P( (*this).get_ref() ); return (P.get_n_elem() == uword(0)); } template inline arma_warn_unused bool SpBase::is_square() const { arma_extra_debug_sigprint(); const SpProxy P( (*this).get_ref() ); return (P.get_n_rows() == P.get_n_cols()); } template inline arma_warn_unused bool SpBase::is_vec() const { arma_extra_debug_sigprint(); if( (SpProxy::is_row) || (SpProxy::is_col) || (SpProxy::is_xvec) ) { return true; } const SpProxy P( (*this).get_ref() ); return ( (P.get_n_rows() == uword(1)) || (P.get_n_cols() == uword(1)) ); } template inline arma_warn_unused bool SpBase::is_colvec() const { arma_extra_debug_sigprint(); if(SpProxy::is_col) { return true; } const SpProxy P( (*this).get_ref() ); return (P.get_n_cols() == uword(1)); } template inline arma_warn_unused bool SpBase::is_rowvec() const { arma_extra_debug_sigprint(); if(SpProxy::is_row) { return true; } const SpProxy P( (*this).get_ref() ); return (P.get_n_rows() == uword(1)); } template inline arma_warn_unused bool SpBase::is_finite() const { arma_extra_debug_sigprint(); const SpProxy P( (*this).get_ref() ); if(is_SpMat::stored_type>::value) { const unwrap_spmat::stored_type> U(P.Q); return U.M.is_finite(); } else { typename SpProxy::const_iterator_type it = P.begin(); typename SpProxy::const_iterator_type it_end = P.end(); while(it != it_end) { if(arma_isfinite(*it) == false) { return false; } ++it; } } return true; } template inline arma_warn_unused bool SpBase::has_inf() const { arma_extra_debug_sigprint(); const SpProxy P( (*this).get_ref() ); if(is_SpMat::stored_type>::value) { const unwrap_spmat::stored_type> U(P.Q); return U.M.has_inf(); } else { typename SpProxy::const_iterator_type it = P.begin(); typename SpProxy::const_iterator_type it_end = P.end(); while(it != it_end) { if(arma_isinf(*it)) { return true; } ++it; } } return false; } template inline arma_warn_unused bool SpBase::has_nan() const { arma_extra_debug_sigprint(); const SpProxy P( (*this).get_ref() ); if(is_SpMat::stored_type>::value) { const unwrap_spmat::stored_type> U(P.Q); return U.M.has_nan(); } else { typename SpProxy::const_iterator_type it = P.begin(); typename SpProxy::const_iterator_type it_end = P.end(); while(it != it_end) { if(arma_isnan(*it)) { return true; } ++it; } } return false; } template inline arma_warn_unused const SpOp SpBase::as_col() const { return SpOp( (*this).get_ref() ); } template inline arma_warn_unused const SpOp SpBase::as_row() const { return SpOp( (*this).get_ref() ); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_dot_meat.hpp0000644000176200001440000003157614124060717023411 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_dot //! @{ //! for two arrays, generic version for non-complex values template arma_inline typename arma_not_cx::result op_dot::direct_dot_arma(const uword n_elem, const eT* const A, const eT* const B) { arma_extra_debug_sigprint(); #if defined(__FINITE_MATH_ONLY__) && (__FINITE_MATH_ONLY__ > 0) { eT val = eT(0); for(uword i=0; i arma_hot inline typename arma_cx_only::result op_dot::direct_dot_arma(const uword n_elem, const eT* const A, const eT* const B) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; T val_real = T(0); T val_imag = T(0); for(uword i=0; i& X = A[i]; const std::complex& Y = B[i]; const T a = X.real(); const T b = X.imag(); const T c = Y.real(); const T d = Y.imag(); val_real += (a*c) - (b*d); val_imag += (a*d) + (b*c); } return std::complex(val_real, val_imag); } //! for two arrays, float and double version template arma_hot inline typename arma_real_only::result op_dot::direct_dot(const uword n_elem, const eT* const A, const eT* const B) { arma_extra_debug_sigprint(); if( n_elem <= 32u ) { return op_dot::direct_dot_arma(n_elem, A, B); } else { #if defined(ARMA_USE_ATLAS) { arma_extra_debug_print("atlas::cblas_dot()"); return atlas::cblas_dot(n_elem, A, B); } #elif defined(ARMA_USE_BLAS) { arma_extra_debug_print("blas::dot()"); return blas::dot(n_elem, A, B); } #else { return op_dot::direct_dot_arma(n_elem, A, B); } #endif } } //! for two arrays, complex version template inline arma_hot typename arma_cx_only::result op_dot::direct_dot(const uword n_elem, const eT* const A, const eT* const B) { if( n_elem <= 16u ) { return op_dot::direct_dot_arma(n_elem, A, B); } else { #if defined(ARMA_USE_ATLAS) { arma_extra_debug_print("atlas::cblas_cx_dot()"); return atlas::cblas_cx_dot(n_elem, A, B); } #elif defined(ARMA_USE_BLAS) { arma_extra_debug_print("blas::dot()"); return blas::dot(n_elem, A, B); } #else { return op_dot::direct_dot_arma(n_elem, A, B); } #endif } } //! for two arrays, integral version template arma_hot inline typename arma_integral_only::result op_dot::direct_dot(const uword n_elem, const eT* const A, const eT* const B) { return op_dot::direct_dot_arma(n_elem, A, B); } //! for three arrays template arma_hot inline eT op_dot::direct_dot(const uword n_elem, const eT* const A, const eT* const B, const eT* C) { arma_extra_debug_sigprint(); eT val = eT(0); for(uword i=0; i arma_hot inline typename T1::elem_type op_dot::apply(const T1& X, const T2& Y) { arma_extra_debug_sigprint(); const bool use_at = (Proxy::use_at) || (Proxy::use_at); const bool have_direct_mem = (quasi_unwrap::has_orig_mem) && (quasi_unwrap::has_orig_mem); if(use_at || have_direct_mem) { const quasi_unwrap A(X); const quasi_unwrap B(Y); arma_debug_check( (A.M.n_elem != B.M.n_elem), "dot(): objects must have the same number of elements" ); return op_dot::direct_dot(A.M.n_elem, A.M.memptr(), B.M.memptr()); } else { if(is_subview_row::value && is_subview_row::value) { typedef typename T1::elem_type eT; const subview_row& A = reinterpret_cast< const subview_row& >(X); const subview_row& B = reinterpret_cast< const subview_row& >(Y); if( (A.m.n_rows == 1) && (B.m.n_rows == 1) ) { arma_debug_check( (A.n_elem != B.n_elem), "dot(): objects must have the same number of elements" ); const eT* A_mem = A.m.memptr(); const eT* B_mem = B.m.memptr(); return op_dot::direct_dot(A.n_elem, &A_mem[A.aux_col1], &B_mem[B.aux_col1]); } } const Proxy PA(X); const Proxy PB(Y); arma_debug_check( (PA.get_n_elem() != PB.get_n_elem()), "dot(): objects must have the same number of elements" ); if(is_Mat::stored_type>::value && is_Mat::stored_type>::value) { const quasi_unwrap::stored_type> A(PA.Q); const quasi_unwrap::stored_type> B(PB.Q); return op_dot::direct_dot(A.M.n_elem, A.M.memptr(), B.M.memptr()); } return op_dot::apply_proxy(PA,PB); } } template arma_hot inline typename arma_not_cx::result op_dot::apply_proxy(const Proxy& PA, const Proxy& PB) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename Proxy::ea_type ea_type1; typedef typename Proxy::ea_type ea_type2; const uword N = PA.get_n_elem(); ea_type1 A = PA.get_ea(); ea_type2 B = PB.get_ea(); eT val1 = eT(0); eT val2 = eT(0); uword i,j; for(i=0, j=1; j arma_hot inline typename arma_cx_only::result op_dot::apply_proxy(const Proxy& PA, const Proxy& PB) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; typedef typename Proxy::ea_type ea_type1; typedef typename Proxy::ea_type ea_type2; const uword N = PA.get_n_elem(); ea_type1 A = PA.get_ea(); ea_type2 B = PB.get_ea(); T val_real = T(0); T val_imag = T(0); for(uword i=0; i xx = A[i]; const std::complex yy = B[i]; const T a = xx.real(); const T b = xx.imag(); const T c = yy.real(); const T d = yy.imag(); val_real += (a*c) - (b*d); val_imag += (a*d) + (b*c); } return std::complex(val_real, val_imag); } // // op_norm_dot template arma_hot inline typename T1::elem_type op_norm_dot::apply(const T1& X, const T2& Y) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const quasi_unwrap tmp1(X); const quasi_unwrap tmp2(Y); const Col A( const_cast(tmp1.M.memptr()), tmp1.M.n_elem, false ); const Col B( const_cast(tmp2.M.memptr()), tmp2.M.n_elem, false ); arma_debug_check( (A.n_elem != B.n_elem), "norm_dot(): objects must have the same number of elements" ); const T denom = norm(A,2) * norm(B,2); return (denom != T(0)) ? ( op_dot::apply(A,B) / denom ) : eT(0); } // // op_cdot template arma_hot inline eT op_cdot::direct_cdot_arma(const uword n_elem, const eT* const A, const eT* const B) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; T val_real = T(0); T val_imag = T(0); for(uword i=0; i& X = A[i]; const std::complex& Y = B[i]; const T a = X.real(); const T b = X.imag(); const T c = Y.real(); const T d = Y.imag(); val_real += (a*c) + (b*d); val_imag += (a*d) - (b*c); } return std::complex(val_real, val_imag); } template arma_hot inline eT op_cdot::direct_cdot(const uword n_elem, const eT* const A, const eT* const B) { arma_extra_debug_sigprint(); if( n_elem <= 32u ) { return op_cdot::direct_cdot_arma(n_elem, A, B); } else { #if defined(ARMA_USE_BLAS) { arma_extra_debug_print("blas::gemv()"); // using gemv() workaround due to compatibility issues with cdotc() and zdotc() const char trans = 'C'; const blas_int m = blas_int(n_elem); const blas_int n = 1; //const blas_int lda = (n_elem > 0) ? blas_int(n_elem) : blas_int(1); const blas_int inc = 1; const eT alpha = eT(1); const eT beta = eT(0); eT result[2]; // paranoia: using two elements instead of one //blas::gemv(&trans, &m, &n, &alpha, A, &lda, B, &inc, &beta, &result[0], &inc); blas::gemv(&trans, &m, &n, &alpha, A, &m, B, &inc, &beta, &result[0], &inc); return result[0]; } #elif defined(ARMA_USE_ATLAS) { // TODO: use dedicated atlas functions cblas_cdotc_sub() and cblas_zdotc_sub() and retune threshold return op_cdot::direct_cdot_arma(n_elem, A, B); } #else { return op_cdot::direct_cdot_arma(n_elem, A, B); } #endif } } template arma_hot inline typename T1::elem_type op_cdot::apply(const T1& X, const T2& Y) { arma_extra_debug_sigprint(); if(is_Mat::value && is_Mat::value) { return op_cdot::apply_unwrap(X,Y); } else { return op_cdot::apply_proxy(X,Y); } } template arma_hot inline typename T1::elem_type op_cdot::apply_unwrap(const T1& X, const T2& Y) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap tmp1(X); const unwrap tmp2(Y); const Mat& A = tmp1.M; const Mat& B = tmp2.M; arma_debug_check( (A.n_elem != B.n_elem), "cdot(): objects must have the same number of elements" ); return op_cdot::direct_cdot( A.n_elem, A.mem, B.mem ); } template arma_hot inline typename T1::elem_type op_cdot::apply_proxy(const T1& X, const T2& Y) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; typedef typename Proxy::ea_type ea_type1; typedef typename Proxy::ea_type ea_type2; const bool use_at = (Proxy::use_at) || (Proxy::use_at); if(use_at == false) { const Proxy PA(X); const Proxy PB(Y); const uword N = PA.get_n_elem(); arma_debug_check( (N != PB.get_n_elem()), "cdot(): objects must have the same number of elements" ); ea_type1 A = PA.get_ea(); ea_type2 B = PB.get_ea(); T val_real = T(0); T val_imag = T(0); for(uword i=0; i AA = A[i]; const std::complex BB = B[i]; const T a = AA.real(); const T b = AA.imag(); const T c = BB.real(); const T d = BB.imag(); val_real += (a*c) + (b*d); val_imag += (a*d) - (b*c); } return std::complex(val_real, val_imag); } else { return op_cdot::apply_unwrap( X, Y ); } } template arma_hot inline typename promote_type::result op_dot_mixed::apply(const T1& A, const T2& B) { arma_extra_debug_sigprint(); typedef typename T1::elem_type in_eT1; typedef typename T2::elem_type in_eT2; typedef typename promote_type::result out_eT; const Proxy PA(A); const Proxy PB(B); const uword N = PA.get_n_elem(); arma_debug_check( (N != PB.get_n_elem()), "dot(): objects must have the same number of elements" ); out_eT acc = out_eT(0); for(uword i=0; i < N; ++i) { acc += upgrade_val::apply(PA[i]) * upgrade_val::apply(PB[i]); } return acc; } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_repmat_meat.hpp0000644000176200001440000001120714124060717024443 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_repmat //! @{ template inline void spop_repmat::apply(SpMat& out, const SpOp& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat U(X.m); if(U.is_alias(out)) { SpMat tmp; spop_repmat::apply_noalias(tmp, X.aux_uword_a, X.aux_uword_b, U.M); out.steal_mem(tmp); } else { spop_repmat::apply_noalias(out, X.aux_uword_a, X.aux_uword_b, U.M); } } template inline void spop_repmat::apply_noalias(SpMat& out, const uword A_n_rows, const uword A_n_cols, const SpMat& B) { arma_extra_debug_sigprint(); const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; const uword out_n_nonzero = A_n_rows * A_n_cols * B.n_nonzero; out.reserve(A_n_rows * B_n_rows, A_n_cols * B_n_cols, out_n_nonzero); if(out_n_nonzero == 0) { return; } access::rw(out.col_ptrs[0]) = 0; uword count = 0; for(uword A_col=0; A_col < A_n_cols; ++A_col) for(uword B_col=0; B_col < B_n_cols; ++B_col) { for(uword A_row=0; A_row < A_n_rows; ++A_row) { const uword out_row = A_row * B_n_rows; for(uword B_i = B.col_ptrs[B_col]; B_i < B.col_ptrs[B_col+1]; ++B_i) { access::rw(out.values[count]) = B.values[B_i]; access::rw(out.row_indices[count]) = out_row + B.row_indices[B_i]; count++; } } access::rw(out.col_ptrs[A_col * B_n_cols + B_col + 1]) = count; } } // template // inline // void // spop_repmat::apply(SpMat& out, const SpOp& in) // { // arma_extra_debug_sigprint(); // // typedef typename T1::elem_type eT; // // const unwrap_spmat U(in.m); // const SpMat& X = U.M; // // const uword X_n_rows = X.n_rows; // const uword X_n_cols = X.n_cols; // // const uword copies_per_row = in.aux_uword_a; // const uword copies_per_col = in.aux_uword_b; // // // out.set_size(X_n_rows * copies_per_row, X_n_cols * copies_per_col); // // // // const uword out_n_rows = out.n_rows; // // const uword out_n_cols = out.n_cols; // // // // if( (out_n_rows > 0) && (out_n_cols > 0) ) // // { // // for(uword col = 0; col < out_n_cols; col += X_n_cols) // // for(uword row = 0; row < out_n_rows; row += X_n_rows) // // { // // out.submat(row, col, row+X_n_rows-1, col+X_n_cols-1) = X; // // } // // } // // const uword out_n_rows = X_n_rows * copies_per_row; // const uword out_n_cols = X_n_cols * copies_per_col; // const uword out_nnz = X.n_nonzero * copies_per_row * copies_per_col; // // if( (out_n_rows > 0) && (out_n_cols > 0) && (out_nnz > 0) ) // { // umat locs(2, out_nnz, arma_nozeros_indicator()); // Col vals( out_nnz, arma_nozeros_indicator()); // // uword* locs_mem = locs.memptr(); // eT* vals_mem = vals.memptr(); // // typename SpMat::const_iterator X_begin = X.begin(); // typename SpMat::const_iterator X_end = X.end(); // typename SpMat::const_iterator X_it; // // for(uword col_offset = 0; col_offset < out_n_cols; col_offset += X_n_cols) // for(uword row_offset = 0; row_offset < out_n_rows; row_offset += X_n_rows) // { // for(X_it = X_begin; X_it != X_end; ++X_it) // { // const uword out_row = row_offset + X_it.row(); // const uword out_col = col_offset + X_it.col(); // // (*locs_mem) = out_row; ++locs_mem; // (*locs_mem) = out_col; ++locs_mem; // // (*vals_mem) = (*X_it); ++vals_mem; // } // } // // out = SpMat(locs, vals, out_n_rows, out_n_cols); // } // else // { // out.zeros(out_n_rows, out_n_cols); // } // } //! @} RcppArmadillo/inst/include/armadillo_bits/sympd_helper.hpp0000644000176200001440000002732514162345366023617 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup sympd_helper //! @{ namespace sympd_helper { // computationally inexpensive algorithm to guess whether a matrix is positive definite: // (1) ensure the matrix is symmetric/hermitian (within a tolerance) // (2) ensure the diagonal entries are real and greater than zero // (3) ensure that the value with largest modulus is on the main diagonal // (4) ensure rudimentary diagonal dominance: (real(A_ii) + real(A_jj)) > 2*abs(real(A_ij)) // the above conditions are necessary, but not sufficient; // doing it properly would be too computationally expensive for our purposes // more info: // http://mathworld.wolfram.com/PositiveDefiniteMatrix.html // http://mathworld.wolfram.com/DiagonallyDominantMatrix.html template inline typename enable_if2::no, bool>::result guess_sympd_worker(const Mat& A) { arma_extra_debug_sigprint(); // NOTE: assuming A is square-sized const eT tol = eT(100) * std::numeric_limits::epsilon(); // allow some leeway const uword N = A.n_rows; const eT* A_mem = A.memptr(); const eT* A_col = A_mem; eT max_diag = eT(0); for(uword j=0; j < N; ++j) { const eT A_jj = A_col[j]; if(A_jj <= eT(0)) { return false; } max_diag = (A_jj > max_diag) ? A_jj : max_diag; A_col += N; } A_col = A_mem; const uword Nm1 = N-1; const uword Np1 = N+1; for(uword j=0; j < Nm1; ++j) { const eT A_jj = A_col[j]; const uword jp1 = j+1; const eT* A_ji_ptr = &(A_mem[j + jp1*N]); // &(A.at(j,jp1)); const eT* A_ii_ptr = &(A_mem[jp1 + jp1*N]); for(uword i=jp1; i < N; ++i) { const eT A_ij = A_col[i]; const eT A_ji = (*A_ji_ptr); const eT A_ij_abs = (std::abs)(A_ij); const eT A_ji_abs = (std::abs)(A_ji); // if( (A_ij_abs >= max_diag) || (A_ji_abs >= max_diag) ) { return false; } if(A_ij_abs >= max_diag) { return false; } const eT A_delta = (std::abs)(A_ij - A_ji); const eT A_abs_max = (std::max)(A_ij_abs, A_ji_abs); if( (A_delta > tol) && (A_delta > (A_abs_max*tol)) ) { return false; } const eT A_ii = (*A_ii_ptr); if( (A_ij_abs + A_ij_abs) >= (A_ii + A_jj) ) { return false; } A_ji_ptr += N; A_ii_ptr += Np1; } A_col += N; } return true; } template inline typename enable_if2::yes, bool>::result guess_sympd_worker(const Mat& A) { arma_extra_debug_sigprint(); // NOTE: assuming A is square-sized typedef typename get_pod_type::result T; const T tol = T(100) * std::numeric_limits::epsilon(); // allow some leeway const uword N = A.n_rows; const eT* A_mem = A.memptr(); const eT* A_col = A_mem; T max_diag = T(0); for(uword j=0; j < N; ++j) { const eT& A_jj = A_col[j]; const T A_jj_real = std::real(A_jj); const T A_jj_imag = std::imag(A_jj); if( (A_jj_real <= T(0)) || (std::abs(A_jj_imag) > tol) ) { return false; } max_diag = (A_jj_real > max_diag) ? A_jj_real : max_diag; A_col += N; } const T square_max_diag = max_diag * max_diag; if(arma_isfinite(square_max_diag) == false) { return false; } A_col = A_mem; const uword Nm1 = N-1; const uword Np1 = N+1; for(uword j=0; j < Nm1; ++j) { const uword jp1 = j+1; const eT* A_ji_ptr = &(A_mem[j + jp1*N]); // &(A.at(j,jp1)); const eT* A_ii_ptr = &(A_mem[jp1 + jp1*N]); const T A_jj_real = std::real(A_col[j]); for(uword i=jp1; i < N; ++i) { const eT& A_ij = A_col[i]; const T A_ij_real = std::real(A_ij); const T A_ij_imag = std::imag(A_ij); // avoid using std::abs(), as that is time consuming due to division and std::sqrt() const T square_A_ij_abs = (A_ij_real * A_ij_real) + (A_ij_imag * A_ij_imag); if(arma_isfinite(square_A_ij_abs) == false) { return false; } if(square_A_ij_abs >= square_max_diag) { return false; } const T A_ij_real_abs = (std::abs)(A_ij_real); const T A_ij_imag_abs = (std::abs)(A_ij_imag); const eT& A_ji = (*A_ji_ptr); const T A_ji_real = std::real(A_ji); const T A_ji_imag = std::imag(A_ji); const T A_ji_real_abs = (std::abs)(A_ji_real); const T A_ji_imag_abs = (std::abs)(A_ji_imag); const T A_real_delta = (std::abs)(A_ij_real - A_ji_real); const T A_real_abs_max = (std::max)(A_ij_real_abs, A_ji_real_abs); if( (A_real_delta > tol) && (A_real_delta > (A_real_abs_max*tol)) ) { return false; } const T A_imag_delta = (std::abs)(A_ij_imag + A_ji_imag); // take into account complex conjugate const T A_imag_abs_max = (std::max)(A_ij_imag_abs, A_ji_imag_abs); if( (A_imag_delta > tol) && (A_imag_delta > (A_imag_abs_max*tol)) ) { return false; } const T A_ii_real = std::real(*A_ii_ptr); if( (A_ij_real_abs + A_ij_real_abs) >= (A_ii_real + A_jj_real) ) { return false; } A_ji_ptr += N; A_ii_ptr += Np1; } A_col += N; } return true; } template inline bool guess_sympd(const Mat& A) { // analyse matrices with size >= 4x4 if((A.n_rows != A.n_cols) || (A.n_rows < uword(4))) { return false; } return guess_sympd_worker(A); } template inline bool guess_sympd(const Mat& A, const uword min_n_rows) { if((A.n_rows != A.n_cols) || (A.n_rows < min_n_rows)) { return false; } return guess_sympd_worker(A); } // template inline typename enable_if2::no, void>::result analyse_matrix_worker(bool& is_approx_sym, bool& is_approx_sympd, const Mat& A) { arma_extra_debug_sigprint(); is_approx_sym = true; is_approx_sympd = true; const eT tol = eT(100) * std::numeric_limits::epsilon(); // allow some leeway const uword N = A.n_rows; const eT* A_mem = A.memptr(); const eT* A_col = A_mem; eT max_diag = eT(0); for(uword j=0; j < N; ++j) { const eT A_jj = A_col[j]; if(A_jj <= eT(0)) { is_approx_sympd = false; } max_diag = (A_jj > max_diag) ? A_jj : max_diag; A_col += N; } A_col = A_mem; const uword Nm1 = N-1; const uword Np1 = N+1; for(uword j=0; j < Nm1; ++j) { const eT A_jj = A_col[j]; const uword jp1 = j+1; const eT* A_ji_ptr = &(A_mem[j + jp1*N]); // &(A.at(j,jp1)); const eT* A_ii_ptr = &(A_mem[jp1 + jp1*N]); for(uword i=jp1; i < N; ++i) { const eT A_ij = A_col[i]; const eT A_ji = (*A_ji_ptr); const eT A_ij_abs = (std::abs)(A_ij); const eT A_ji_abs = (std::abs)(A_ji); const eT A_delta = (std::abs)(A_ij - A_ji); const eT A_abs_max = (std::max)(A_ij_abs, A_ji_abs); if( (A_delta > tol) && (A_delta > (A_abs_max*tol)) ) { is_approx_sym = false; return; } if(is_approx_sympd) { // if( (A_ij_abs >= max_diag) || (A_ji_abs >= max_diag) ) { is_approx_sympd = false; } if(A_ij_abs >= max_diag) { is_approx_sympd = false; } const eT A_ii = (*A_ii_ptr); if( (A_ij_abs + A_ij_abs) >= (A_ii + A_jj) ) { is_approx_sympd = false; } } A_ji_ptr += N; A_ii_ptr += Np1; } A_col += N; } } template inline typename enable_if2::yes, void>::result analyse_matrix_worker(bool& is_approx_sym, bool& is_approx_sympd, const Mat& A) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; is_approx_sym = true; is_approx_sympd = true; const T tol = T(100) * std::numeric_limits::epsilon(); // allow some leeway const uword N = A.n_rows; const eT* A_mem = A.memptr(); const eT* A_col = A_mem; T max_diag = T(0); for(uword j=0; j < N; ++j) { const eT& A_jj = A_col[j]; const T A_jj_real = std::real(A_jj); const T A_jj_imag = std::imag(A_jj); if( (A_jj_real <= T(0)) || (std::abs(A_jj_imag) > tol) ) { is_approx_sympd = false; } max_diag = (A_jj_real > max_diag) ? A_jj_real : max_diag; A_col += N; } const T square_max_diag = max_diag * max_diag; if(arma_isfinite(square_max_diag) == false) { is_approx_sympd = false; } A_col = A_mem; const uword Nm1 = N-1; const uword Np1 = N+1; for(uword j=0; j < Nm1; ++j) { const uword jp1 = j+1; const eT* A_ji_ptr = &(A_mem[j + jp1*N]); // &(A.at(j,jp1)); const eT* A_ii_ptr = &(A_mem[jp1 + jp1*N]); const T A_jj_real = std::real(A_col[j]); for(uword i=jp1; i < N; ++i) { const eT& A_ij = A_col[i]; const T A_ij_real = std::real(A_ij); const T A_ij_imag = std::imag(A_ij); const T A_ij_real_abs = (std::abs)(A_ij_real); const T A_ij_imag_abs = (std::abs)(A_ij_imag); const eT& A_ji = (*A_ji_ptr); const T A_ji_real = std::real(A_ji); const T A_ji_imag = std::imag(A_ji); const T A_ji_real_abs = (std::abs)(A_ji_real); const T A_ji_imag_abs = (std::abs)(A_ji_imag); const T A_real_delta = (std::abs)(A_ij_real - A_ji_real); const T A_real_abs_max = (std::max)(A_ij_real_abs, A_ji_real_abs); if( (A_real_delta > tol) && (A_real_delta > (A_real_abs_max*tol)) ) { is_approx_sym = false; return; } const T A_imag_delta = (std::abs)(A_ij_imag + A_ji_imag); // take into account complex conjugate const T A_imag_abs_max = (std::max)(A_ij_imag_abs, A_ji_imag_abs); if( (A_imag_delta > tol) && (A_imag_delta > (A_imag_abs_max*tol)) ) { is_approx_sym = false; return; } if(is_approx_sympd) { // avoid using std::abs(), as that is time consuming due to division and std::sqrt() const T square_A_ij_abs = (A_ij_real * A_ij_real) + (A_ij_imag * A_ij_imag); if(arma_isfinite(square_A_ij_abs) == false) { is_approx_sympd = false; } else { const T A_ii_real = std::real(*A_ii_ptr); if( (A_ij_real_abs + A_ij_real_abs) >= (A_ii_real + A_jj_real) ) { is_approx_sympd = false; } if(square_A_ij_abs >= square_max_diag) { is_approx_sympd = false; } } } A_ji_ptr += N; A_ii_ptr += Np1; } A_col += N; } } template inline void analyse_matrix(bool& is_approx_sym, bool& is_approx_sympd, const Mat& A) { arma_extra_debug_sigprint(); if((A.n_rows != A.n_cols) || (A.n_rows < uword(4))) { is_approx_sym = false; is_approx_sympd = false; return; } analyse_matrix_worker(is_approx_sym, is_approx_sympd, A); if(is_approx_sym == false) { is_approx_sympd = false; } } } // end of namespace sympd_helper //! @} RcppArmadillo/inst/include/armadillo_bits/fn_sum.hpp0000644000176200001440000000536614124060717022404 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_sum //! @{ template arma_warn_unused inline typename enable_if2< is_arma_type::value && resolves_to_vector::yes, typename T1::elem_type >::result sum(const T1& X) { arma_extra_debug_sigprint(); return accu(X); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value && resolves_to_vector::no, const Op >::result sum(const T1& X) { arma_extra_debug_sigprint(); return Op(X, 0, 0); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const Op >::result sum(const T1& X, const uword dim) { arma_extra_debug_sigprint(); return Op(X, dim, 0); } template arma_warn_unused arma_inline typename arma_scalar_only::result sum(const T& x) { return x; } //! sum of cube template arma_warn_unused arma_inline const OpCube sum ( const BaseCube& X, const uword dim = 0 ) { arma_extra_debug_sigprint(); return OpCube(X.get_ref(), dim, 0); } //! sum of sparse object template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value && resolves_to_sparse_vector::yes, typename T1::elem_type >::result sum(const T1& x) { arma_extra_debug_sigprint(); // sum elements return accu(x); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value && resolves_to_sparse_vector::no, const SpOp >::result sum(const T1& x) { arma_extra_debug_sigprint(); return SpOp(x, 0, 0); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value, const SpOp >::result sum(const T1& x, const uword dim) { arma_extra_debug_sigprint(); return SpOp(x, dim, 0); } //! @} RcppArmadillo/inst/include/armadillo_bits/SpValProxy_meat.hpp0000644000176200001440000001467614124060717024216 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpValProxy //! @{ //! SpValProxy implementation. template arma_inline SpValProxy::SpValProxy(uword in_row, uword in_col, T1& in_parent, eT* in_val_ptr) : row(in_row) , col(in_col) , val_ptr(in_val_ptr) , parent(in_parent) { // Nothing to do. } template arma_inline SpValProxy& SpValProxy::operator=(const SpValProxy& rhs) { return (*this).operator=(eT(rhs)); } template template arma_inline SpValProxy& SpValProxy::operator=(const SpValProxy& rhs) { return (*this).operator=(eT(rhs)); } template arma_inline SpValProxy& SpValProxy::operator=(const eT rhs) { if(rhs != eT(0)) // A nonzero element is being assigned. { if(val_ptr) { // The value exists and merely needs to be updated. *val_ptr = rhs; parent.invalidate_cache(); } else { // The value is nonzero and must be inserted. val_ptr = &parent.insert_element(row, col, rhs); } } else // A zero is being assigned.~ { if(val_ptr) { // The element exists, but we need to remove it, because it is being set to 0. parent.delete_element(row, col); val_ptr = nullptr; } // If the element does not exist, we do not need to do anything at all. } return *this; } template arma_inline SpValProxy& SpValProxy::operator+=(const eT rhs) { if(val_ptr) { // The value already exists and merely needs to be updated. *val_ptr += rhs; parent.invalidate_cache(); check_zero(); } else { if(rhs != eT(0)) { // The value does not exist and must be inserted. val_ptr = &parent.insert_element(row, col, rhs); } } return *this; } template arma_inline SpValProxy& SpValProxy::operator-=(const eT rhs) { if(val_ptr) { // The value already exists and merely needs to be updated. *val_ptr -= rhs; parent.invalidate_cache(); check_zero(); } else { if(rhs != eT(0)) { // The value does not exist and must be inserted. val_ptr = &parent.insert_element(row, col, -rhs); } } return *this; } template arma_inline SpValProxy& SpValProxy::operator*=(const eT rhs) { if(rhs != eT(0)) { if(val_ptr) { // The value already exists and merely needs to be updated. *val_ptr *= rhs; parent.invalidate_cache(); check_zero(); } } else { if(val_ptr) { // Since we are multiplying by zero, the value can be deleted. parent.delete_element(row, col); val_ptr = nullptr; } } return *this; } template arma_inline SpValProxy& SpValProxy::operator/=(const eT rhs) { if(rhs != eT(0)) // I hope this is true! { if(val_ptr) { *val_ptr /= rhs; parent.invalidate_cache(); check_zero(); } } else { if(val_ptr) { *val_ptr /= rhs; // That is where it gets ugly. // Now check if it's 0. if(*val_ptr == eT(0)) { parent.delete_element(row, col); val_ptr = nullptr; } } else { eT val = eT(0) / rhs; // This may vary depending on type and implementation. if(val != eT(0)) { // Ok, now we have to insert it. val_ptr = &parent.insert_element(row, col, val); } } } return *this; } template arma_inline SpValProxy& SpValProxy::operator++() { if(val_ptr) { (*val_ptr) += eT(1); parent.invalidate_cache(); check_zero(); } else { val_ptr = &parent.insert_element(row, col, eT(1)); } return *this; } template arma_inline SpValProxy& SpValProxy::operator--() { if(val_ptr) { (*val_ptr) -= eT(1); parent.invalidate_cache(); check_zero(); } else { val_ptr = &parent.insert_element(row, col, eT(-1)); } return *this; } template arma_inline typename T1::elem_type SpValProxy::operator++(const int) { if(val_ptr) { (*val_ptr) += eT(1); parent.invalidate_cache(); check_zero(); } else { val_ptr = &parent.insert_element(row, col, eT(1)); } if(val_ptr) // It may have changed to now be 0. { return *(val_ptr) - eT(1); } else { return eT(0); } } template arma_inline typename T1::elem_type SpValProxy::operator--(const int) { if(val_ptr) { (*val_ptr) -= eT(1); parent.invalidate_cache(); check_zero(); } else { val_ptr = &parent.insert_element(row, col, eT(-1)); } if(val_ptr) // It may have changed to now be 0. { return *(val_ptr) + eT(1); } else { return eT(0); } } template arma_inline SpValProxy::operator eT() const { return (val_ptr) ? eT(*val_ptr) : eT(0); } template arma_inline typename get_pod_type::eT>::result SpValProxy::real() const { typedef typename get_pod_type::result T; return T( access::tmp_real( (val_ptr) ? eT(*val_ptr) : eT(0) ) ); } template arma_inline typename get_pod_type::eT>::result SpValProxy::imag() const { typedef typename get_pod_type::result T; return T( access::tmp_imag( (val_ptr) ? eT(*val_ptr) : eT(0) ) ); } template arma_inline void SpValProxy::check_zero() { if(*val_ptr == eT(0)) { parent.delete_element(row, col); val_ptr = nullptr; } } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_eigs_sym.hpp0000644000176200001440000001723614124060717023416 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_eigs_sym //! @{ //! eigenvalues of symmetric real sparse matrix X template arma_warn_unused inline typename enable_if2< is_real::value, Col >::result eigs_sym ( const SpBase& X, const uword n_eigvals, const char* form = "lm", const eigs_opts opts = eigs_opts() ) { arma_extra_debug_sigprint(); Mat eigvec; Col eigval; sp_auxlib::form_type form_val = sp_auxlib::interpret_form_str(form); const bool status = sp_auxlib::eigs_sym(eigval, eigvec, X, n_eigvals, form_val, opts); if(status == false) { eigval.soft_reset(); arma_stop_runtime_error("eigs_sym(): decomposition failed"); } return eigval; } //! this form is deprecated; use eigs_sym(X, n_eigvals, form, opts) instead template arma_deprecated inline typename enable_if2< is_real::value, Col >::result eigs_sym ( const SpBase& X, const uword n_eigvals, const char* form, const typename T1::elem_type tol ) { arma_extra_debug_sigprint(); eigs_opts opts; opts.tol = tol; return eigs_sym(X, n_eigvals, form, opts); } template arma_warn_unused inline typename enable_if2< is_real::value, Col >::result eigs_sym ( const SpBase& X, const uword n_eigvals, const double sigma, const eigs_opts opts = eigs_opts() ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; Mat eigvec; Col eigval; const bool status = sp_auxlib::eigs_sym(eigval, eigvec, X, n_eigvals, T(sigma), opts); if(status == false) { eigval.soft_reset(); arma_stop_runtime_error("eigs_sym(): decomposition failed"); } return eigval; } //! eigenvalues of symmetric real sparse matrix X template inline typename enable_if2< is_real::value, bool >::result eigs_sym ( Col& eigval, const SpBase& X, const uword n_eigvals, const char* form = "lm", const eigs_opts opts = eigs_opts() ) { arma_extra_debug_sigprint(); Mat eigvec; sp_auxlib::form_type form_val = sp_auxlib::interpret_form_str(form); const bool status = sp_auxlib::eigs_sym(eigval, eigvec, X, n_eigvals, form_val, opts); if(status == false) { eigval.soft_reset(); arma_debug_warn_level(3, "eigs_sym(): decomposition failed"); } return status; } //! this form is deprecated; use eigs_sym(eigval, X, n_eigvals, form, opts) instead template arma_deprecated inline typename enable_if2< is_real::value, bool >::result eigs_sym ( Col& eigval, const SpBase& X, const uword n_eigvals, const char* form, const typename T1::elem_type tol ) { arma_extra_debug_sigprint(); eigs_opts opts; opts.tol = tol; return eigs_sym(eigval, X, n_eigvals, form, opts); } template inline typename enable_if2< is_real::value, bool >::result eigs_sym ( Col& eigval, const SpBase& X, const uword n_eigvals, const double sigma, const eigs_opts opts = eigs_opts() ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; Mat eigvec; const bool status = sp_auxlib::eigs_sym(eigval, eigvec, X, n_eigvals, T(sigma), opts); if(status == false) { eigval.soft_reset(); arma_debug_warn_level(3, "eigs_sym(): decomposition failed"); } return status; } //! eigenvalues and eigenvectors of symmetric real sparse matrix X template inline typename enable_if2< is_real::value, bool >::result eigs_sym ( Col& eigval, Mat& eigvec, const SpBase& X, const uword n_eigvals, const char* form = "lm", const eigs_opts opts = eigs_opts() ) { arma_extra_debug_sigprint(); arma_debug_check( void_ptr(&eigval) == void_ptr(&eigvec), "eigs_sym(): parameter 'eigval' is an alias of parameter 'eigvec'" ); sp_auxlib::form_type form_val = sp_auxlib::interpret_form_str(form); const bool status = sp_auxlib::eigs_sym(eigval, eigvec, X, n_eigvals, form_val, opts); if(status == false) { eigval.soft_reset(); eigvec.soft_reset(); arma_debug_warn_level(3, "eigs_sym(): decomposition failed"); } return status; } //! this form is deprecated; use eigs_sym(eigval, eigvec, X, n_eigvals, form, opts) instead template arma_deprecated inline typename enable_if2< is_real::value, bool >::result eigs_sym ( Col& eigval, Mat& eigvec, const SpBase& X, const uword n_eigvals, const char* form, const typename T1::elem_type tol ) { arma_extra_debug_sigprint(); eigs_opts opts; opts.tol = tol; return eigs_sym(eigval, eigvec, X, n_eigvals, form, opts); } template inline typename enable_if2< is_real::value, bool >::result eigs_sym ( Col& eigval, Mat& eigvec, const SpBase& X, const uword n_eigvals, const double sigma, const eigs_opts opts = eigs_opts() ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; arma_debug_check( void_ptr(&eigval) == void_ptr(&eigvec), "eigs_sym(): parameter 'eigval' is an alias of parameter 'eigvec'" ); const bool status = sp_auxlib::eigs_sym(eigval, eigvec, X, n_eigvals, T(sigma), opts); if(status == false) { eigval.soft_reset(); eigvec.soft_reset(); arma_debug_warn_level(3, "eigs_sym(): decomposition failed"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_trimat_ind.hpp0000644000176200001440000000673414124060717023732 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_trimat_ind //! @{ arma_warn_unused inline uvec trimatu_ind(const SizeMat& s, const sword k = 0) { arma_extra_debug_sigprint(); const uword n_rows = s.n_rows; const uword n_cols = s.n_cols; const uword row_offset = (k < 0) ? uword(-k) : uword(0); const uword col_offset = (k > 0) ? uword( k) : uword(0); arma_debug_check_bounds( ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)), "trimatu_ind(): requested diagonal is out of bounds" ); const uword N = (std::min)(n_rows - row_offset, n_cols - col_offset); uvec tmp(n_rows * n_cols, arma_nozeros_indicator()); // worst case scenario uword* tmp_mem = tmp.memptr(); uword count = 0; for(uword i=0; i < n_cols; ++i) { const uword col = i + col_offset; if(i < N) { const uword end_row = i + row_offset; const uword index_offset = (n_rows * col); for(uword row=0; row <= end_row; ++row) { tmp_mem[count] = index_offset + row; ++count; } } else { if(col < n_cols) { const uword index_offset = (n_rows * col); for(uword row=0; row < n_rows; ++row) { tmp_mem[count] = index_offset + row; ++count; } } } } uvec out; out.steal_mem_col(tmp, count); return out; } arma_warn_unused inline uvec trimatl_ind(const SizeMat& s, const sword k = 0) { arma_extra_debug_sigprint(); const uword n_rows = s.n_rows; const uword n_cols = s.n_cols; const uword row_offset = (k < 0) ? uword(-k) : uword(0); const uword col_offset = (k > 0) ? uword( k) : uword(0); arma_debug_check_bounds( ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)), "trimatl_ind(): requested diagonal is out of bounds" ); const uword N = (std::min)(n_rows - row_offset, n_cols - col_offset); uvec tmp(n_rows * n_cols, arma_nozeros_indicator()); // worst case scenario uword* tmp_mem = tmp.memptr(); uword count = 0; for(uword col=0; col < col_offset; ++col) { const uword index_offset = (n_rows * col); for(uword row=0; row < n_rows; ++row) { tmp_mem[count] = index_offset + row; ++count; } } for(uword i=0; i inline void op_normalise_vec::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const uword p = in.aux_uword_a; arma_debug_check( (p == 0), "normalise(): parameter 'p' must be greater than zero" ); const quasi_unwrap U(in.m); const T norm_val_a = norm(U.M, p); const T norm_val_b = (norm_val_a != T(0)) ? norm_val_a : T(1); if(quasi_unwrap::has_subview && U.is_alias(out)) { Mat tmp = U.M / norm_val_b; out.steal_mem(tmp); } else { out = U.M / norm_val_b; } } template inline void op_normalise_mat::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword p = in.aux_uword_a; const uword dim = in.aux_uword_b; arma_debug_check( (p == 0), "normalise(): parameter 'p' must be greater than zero" ); arma_debug_check( (dim > 1), "normalise(): parameter 'dim' must be 0 or 1" ); const quasi_unwrap U(in.m); if(quasi_unwrap::has_subview && U.is_alias(out)) { Mat out2; op_normalise_mat::apply(out2, U.M, p, dim); out.steal_mem(out2); } else { op_normalise_mat::apply(out, U.M, p, dim); } } template inline void op_normalise_mat::apply(Mat& out, const Mat& A, const uword p, const uword dim) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; out.copy_size(A); if(A.n_elem == 0) { return; } if(dim == 0) { const uword n_cols = A.n_cols; for(uword i=0; i norm_vals(n_rows); T* norm_vals_mem = norm_vals.memptr(); for(uword i=0; i inline void spglue_kron::apply(SpMat& out, const SpGlue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat UA(X.A); const unwrap_spmat UB(X.B); if(UA.is_alias(out) || UB.is_alias(out)) { SpMat tmp; spglue_kron::apply_noalias(tmp, UA.M, UB.M); out.steal_mem(tmp); } else { spglue_kron::apply_noalias(out, UA.M, UB.M); } } template inline void spglue_kron::apply_noalias(SpMat& out, const SpMat& A, const SpMat& B) { arma_extra_debug_sigprint(); const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; const uword out_n_nonzero = A.n_nonzero * B.n_nonzero; out.reserve(A_n_rows * B_n_rows, A_n_cols * B_n_cols, out_n_nonzero); if(out_n_nonzero == 0) { return; } access::rw(out.col_ptrs[0]) = 0; uword count = 0; for(uword A_col=0; A_col < A_n_cols; ++A_col) for(uword B_col=0; B_col < B_n_cols; ++B_col) { for(uword A_i = A.col_ptrs[A_col]; A_i < A.col_ptrs[A_col+1]; ++A_i) { const uword out_row = A.row_indices[A_i] * B_n_rows; const eT A_val = A.values[A_i]; for(uword B_i = B.col_ptrs[B_col]; B_i < B.col_ptrs[B_col+1]; ++B_i) { access::rw(out.values[count]) = A_val * B.values[B_i]; access::rw(out.row_indices[count]) = out_row + B.row_indices[B_i]; count++; } } access::rw(out.col_ptrs[A_col * B_n_cols + B_col + 1]) = count; } } // template // inline // void // spglue_kron::apply(SpMat& out, const SpGlue& X) // { // arma_extra_debug_sigprint(); // // typedef typename T1::elem_type eT; // // const unwrap_spmat UA(X.A); // const unwrap_spmat UB(X.B); // // const SpMat& A = UA.M; // const SpMat& B = UB.M; // // umat locs(2, A.n_nonzero * B.n_nonzero, arma_nozeros_indicator()); // Col vals( A.n_nonzero * B.n_nonzero, arma_nozeros_indicator()); // // uword* locs_mem = locs.memptr(); // eT* vals_mem = vals.memptr(); // // typename SpMat::const_iterator A_it = A.begin(); // typename SpMat::const_iterator A_it_end = A.end(); // // typename SpMat::const_iterator B_it_start = B.begin(); // typename SpMat::const_iterator B_it_end = B.end(); // // const uword B_n_rows = B.n_rows; // const uword B_n_cols = B.n_cols; // // uword i = 0; // // while(A_it != A_it_end) // { // typename SpMat::const_iterator B_it = B_it_start; // // const uword loc_row = A_it.row() * B_n_rows; // const uword loc_col = A_it.col() * B_n_cols; // // const eT A_val = (*A_it); // // while(B_it != B_it_end) // { // (*locs_mem) = loc_row + B_it.row(); locs_mem++; // (*locs_mem) = loc_col + B_it.col(); locs_mem++; // // vals_mem[i] = A_val * (*B_it); // // ++i; // ++B_it; // } // // ++A_it; // } // // out = SpMat(locs, vals, A.n_rows*B.n_rows, A.n_cols*B.n_cols); // } //! @} RcppArmadillo/inst/include/armadillo_bits/gmm_diag_meat.hpp0000644000176200001440000020065514164333462023671 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup gmm_diag //! @{ namespace gmm_priv { template inline gmm_diag::~gmm_diag() { arma_extra_debug_sigprint_this(this); arma_type_check(( (is_same_type::value == false) && (is_same_type::value == false) )); } template inline gmm_diag::gmm_diag() { arma_extra_debug_sigprint_this(this); } template inline gmm_diag::gmm_diag(const gmm_diag& x) { arma_extra_debug_sigprint_this(this); init(x); } template inline gmm_diag& gmm_diag::operator=(const gmm_diag& x) { arma_extra_debug_sigprint(); init(x); return *this; } template inline gmm_diag::gmm_diag(const gmm_full& x) { arma_extra_debug_sigprint_this(this); init(x); } template inline gmm_diag& gmm_diag::operator=(const gmm_full& x) { arma_extra_debug_sigprint(); init(x); return *this; } template inline gmm_diag::gmm_diag(const uword in_n_dims, const uword in_n_gaus) { arma_extra_debug_sigprint_this(this); init(in_n_dims, in_n_gaus); } template inline void gmm_diag::reset() { arma_extra_debug_sigprint(); init(0, 0); } template inline void gmm_diag::reset(const uword in_n_dims, const uword in_n_gaus) { arma_extra_debug_sigprint(); init(in_n_dims, in_n_gaus); } template template inline void gmm_diag::set_params(const Base& in_means_expr, const Base& in_dcovs_expr, const Base& in_hefts_expr) { arma_extra_debug_sigprint(); const unwrap tmp1(in_means_expr.get_ref()); const unwrap tmp2(in_dcovs_expr.get_ref()); const unwrap tmp3(in_hefts_expr.get_ref()); const Mat& in_means = tmp1.M; const Mat& in_dcovs = tmp2.M; const Mat& in_hefts = tmp3.M; arma_debug_check ( (arma::size(in_means) != arma::size(in_dcovs)) || (in_hefts.n_cols != in_means.n_cols) || (in_hefts.n_rows != 1), "gmm_diag::set_params(): given parameters have inconsistent and/or wrong sizes" ); arma_debug_check( (in_means.is_finite() == false), "gmm_diag::set_params(): given means have non-finite values" ); arma_debug_check( (in_dcovs.is_finite() == false), "gmm_diag::set_params(): given dcovs have non-finite values" ); arma_debug_check( (in_hefts.is_finite() == false), "gmm_diag::set_params(): given hefts have non-finite values" ); arma_debug_check( (any(vectorise(in_dcovs) <= eT(0))), "gmm_diag::set_params(): given dcovs have negative or zero values" ); arma_debug_check( (any(vectorise(in_hefts) < eT(0))), "gmm_diag::set_params(): given hefts have negative values" ); const eT s = accu(in_hefts); arma_debug_check( ((s < (eT(1) - eT(0.001))) || (s > (eT(1) + eT(0.001)))), "gmm_diag::set_params(): sum of given hefts is not 1" ); access::rw(means) = in_means; access::rw(dcovs) = in_dcovs; access::rw(hefts) = in_hefts; init_constants(); } template template inline void gmm_diag::set_means(const Base& in_means_expr) { arma_extra_debug_sigprint(); const unwrap tmp(in_means_expr.get_ref()); const Mat& in_means = tmp.M; arma_debug_check( (arma::size(in_means) != arma::size(means)), "gmm_diag::set_means(): given means have incompatible size" ); arma_debug_check( (in_means.is_finite() == false), "gmm_diag::set_means(): given means have non-finite values" ); access::rw(means) = in_means; } template template inline void gmm_diag::set_dcovs(const Base& in_dcovs_expr) { arma_extra_debug_sigprint(); const unwrap tmp(in_dcovs_expr.get_ref()); const Mat& in_dcovs = tmp.M; arma_debug_check( (arma::size(in_dcovs) != arma::size(dcovs)), "gmm_diag::set_dcovs(): given dcovs have incompatible size" ); arma_debug_check( (in_dcovs.is_finite() == false), "gmm_diag::set_dcovs(): given dcovs have non-finite values" ); arma_debug_check( (any(vectorise(in_dcovs) <= eT(0))), "gmm_diag::set_dcovs(): given dcovs have negative or zero values" ); access::rw(dcovs) = in_dcovs; init_constants(); } template template inline void gmm_diag::set_hefts(const Base& in_hefts_expr) { arma_extra_debug_sigprint(); const unwrap tmp(in_hefts_expr.get_ref()); const Mat& in_hefts = tmp.M; arma_debug_check( (arma::size(in_hefts) != arma::size(hefts)), "gmm_diag::set_hefts(): given hefts have incompatible size" ); arma_debug_check( (in_hefts.is_finite() == false), "gmm_diag::set_hefts(): given hefts have non-finite values" ); arma_debug_check( (any(vectorise(in_hefts) < eT(0))), "gmm_diag::set_hefts(): given hefts have negative values" ); const eT s = accu(in_hefts); arma_debug_check( ((s < (eT(1) - eT(0.001))) || (s > (eT(1) + eT(0.001)))), "gmm_diag::set_hefts(): sum of given hefts is not 1" ); // make sure all hefts are positive and non-zero const eT* in_hefts_mem = in_hefts.memptr(); eT* hefts_mem = access::rw(hefts).memptr(); for(uword i=0; i < hefts.n_elem; ++i) { hefts_mem[i] = (std::max)( in_hefts_mem[i], std::numeric_limits::min() ); } access::rw(hefts) /= accu(hefts); log_hefts = log(hefts); } template inline uword gmm_diag::n_dims() const { return means.n_rows; } template inline uword gmm_diag::n_gaus() const { return means.n_cols; } template inline bool gmm_diag::load(const std::string name) { arma_extra_debug_sigprint(); Cube Q; bool status = Q.load(name, arma_binary); if( (status == false) || (Q.n_slices != 2) ) { reset(); arma_debug_warn_level(3, "gmm_diag::load(): problem with loading or incompatible format"); return false; } if( (Q.n_rows < 2) || (Q.n_cols < 1) ) { reset(); return true; } access::rw(hefts) = Q.slice(0).row(0); access::rw(means) = Q.slice(0).submat(1, 0, Q.n_rows-1, Q.n_cols-1); access::rw(dcovs) = Q.slice(1).submat(1, 0, Q.n_rows-1, Q.n_cols-1); init_constants(); return true; } template inline bool gmm_diag::save(const std::string name) const { arma_extra_debug_sigprint(); Cube Q(means.n_rows + 1, means.n_cols, 2, arma_nozeros_indicator()); if(Q.n_elem > 0) { Q.slice(0).row(0) = hefts; Q.slice(1).row(0).zeros(); // reserved for future use Q.slice(0).submat(1, 0, arma::size(means)) = means; Q.slice(1).submat(1, 0, arma::size(dcovs)) = dcovs; } const bool status = Q.save(name, arma_binary); return status; } template inline Col gmm_diag::generate() const { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; Col out( ((N_gaus > 0) ? N_dims : uword(0)), fill::randn ); if(N_gaus > 0) { const double val = randu(); double csum = double(0); uword gaus_id = 0; for(uword j=0; j < N_gaus; ++j) { csum += hefts[j]; if(val <= csum) { gaus_id = j; break; } } out %= sqrt(dcovs.col(gaus_id)); out += means.col(gaus_id); } return out; } template inline Mat gmm_diag::generate(const uword N_vec) const { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; Mat out( ( (N_gaus > 0) ? N_dims : uword(0) ), N_vec, fill::randn ); if(N_gaus > 0) { const eT* hefts_mem = hefts.memptr(); const Mat sqrt_dcovs = sqrt(dcovs); for(uword i=0; i < N_vec; ++i) { const double val = randu(); double csum = double(0); uword gaus_id = 0; for(uword j=0; j < N_gaus; ++j) { csum += hefts_mem[j]; if(val <= csum) { gaus_id = j; break; } } subview_col out_col = out.col(i); out_col %= sqrt_dcovs.col(gaus_id); out_col += means.col(gaus_id); } } return out; } template template inline eT gmm_diag::log_p(const T1& expr, const gmm_empty_arg& junk1, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == true))>::result* junk2) const { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); const quasi_unwrap tmp(expr); arma_debug_check( (tmp.M.n_rows != means.n_rows), "gmm_diag::log_p(): incompatible dimensions" ); return internal_scalar_log_p( tmp.M.memptr() ); } template template inline eT gmm_diag::log_p(const T1& expr, const uword gaus_id, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == true))>::result* junk2) const { arma_extra_debug_sigprint(); arma_ignore(junk2); const quasi_unwrap tmp(expr); arma_debug_check( (tmp.M.n_rows != means.n_rows), "gmm_diag::log_p(): incompatible dimensions" ); arma_debug_check( (gaus_id >= means.n_cols), "gmm_diag::log_p(): specified gaussian is out of range" ); return internal_scalar_log_p( tmp.M.memptr(), gaus_id ); } template template inline Row gmm_diag::log_p(const T1& expr, const gmm_empty_arg& junk1, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == false))>::result* junk2) const { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); const quasi_unwrap tmp(expr); const Mat& X = tmp.M; return internal_vec_log_p(X); } template template inline Row gmm_diag::log_p(const T1& expr, const uword gaus_id, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == false))>::result* junk2) const { arma_extra_debug_sigprint(); arma_ignore(junk2); const quasi_unwrap tmp(expr); const Mat& X = tmp.M; return internal_vec_log_p(X, gaus_id); } template template inline eT gmm_diag::sum_log_p(const Base& expr) const { arma_extra_debug_sigprint(); const quasi_unwrap tmp(expr.get_ref()); const Mat& X = tmp.M; return internal_sum_log_p(X); } template template inline eT gmm_diag::sum_log_p(const Base& expr, const uword gaus_id) const { arma_extra_debug_sigprint(); const quasi_unwrap tmp(expr.get_ref()); const Mat& X = tmp.M; return internal_sum_log_p(X, gaus_id); } template template inline eT gmm_diag::avg_log_p(const Base& expr) const { arma_extra_debug_sigprint(); const quasi_unwrap tmp(expr.get_ref()); const Mat& X = tmp.M; return internal_avg_log_p(X); } template template inline eT gmm_diag::avg_log_p(const Base& expr, const uword gaus_id) const { arma_extra_debug_sigprint(); const quasi_unwrap tmp(expr.get_ref()); const Mat& X = tmp.M; return internal_avg_log_p(X, gaus_id); } template template inline uword gmm_diag::assign(const T1& expr, const gmm_dist_mode& dist, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == true))>::result* junk) const { arma_extra_debug_sigprint(); arma_ignore(junk); const quasi_unwrap tmp(expr); const Mat& X = tmp.M; return internal_scalar_assign(X, dist); } template template inline urowvec gmm_diag::assign(const T1& expr, const gmm_dist_mode& dist, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == false))>::result* junk) const { arma_extra_debug_sigprint(); arma_ignore(junk); urowvec out; const quasi_unwrap tmp(expr); const Mat& X = tmp.M; internal_vec_assign(out, X, dist); return out; } template template inline urowvec gmm_diag::raw_hist(const Base& expr, const gmm_dist_mode& dist_mode) const { arma_extra_debug_sigprint(); const unwrap tmp(expr.get_ref()); const Mat& X = tmp.M; arma_debug_check( (X.n_rows != means.n_rows), "gmm_diag::raw_hist(): incompatible dimensions" ); arma_debug_check( ((dist_mode != eucl_dist) && (dist_mode != prob_dist)), "gmm_diag::raw_hist(): unsupported distance mode" ); urowvec hist; internal_raw_hist(hist, X, dist_mode); return hist; } template template inline Row gmm_diag::norm_hist(const Base& expr, const gmm_dist_mode& dist_mode) const { arma_extra_debug_sigprint(); const unwrap tmp(expr.get_ref()); const Mat& X = tmp.M; arma_debug_check( (X.n_rows != means.n_rows), "gmm_diag::norm_hist(): incompatible dimensions" ); arma_debug_check( ((dist_mode != eucl_dist) && (dist_mode != prob_dist)), "gmm_diag::norm_hist(): unsupported distance mode" ); urowvec hist; internal_raw_hist(hist, X, dist_mode); const uword hist_n_elem = hist.n_elem; const uword* hist_mem = hist.memptr(); eT acc = eT(0); for(uword i=0; i out(hist_n_elem, arma_nozeros_indicator()); eT* out_mem = out.memptr(); for(uword i=0; i template inline bool gmm_diag::learn ( const Base& data, const uword N_gaus, const gmm_dist_mode& dist_mode, const gmm_seed_mode& seed_mode, const uword km_iter, const uword em_iter, const eT var_floor, const bool print_mode ) { arma_extra_debug_sigprint(); const bool dist_mode_ok = (dist_mode == eucl_dist) || (dist_mode == maha_dist); const bool seed_mode_ok = \ (seed_mode == keep_existing) || (seed_mode == static_subset) || (seed_mode == static_spread) || (seed_mode == random_subset) || (seed_mode == random_spread); arma_debug_check( (dist_mode_ok == false), "gmm_diag::learn(): dist_mode must be eucl_dist or maha_dist" ); arma_debug_check( (seed_mode_ok == false), "gmm_diag::learn(): unknown seed_mode" ); arma_debug_check( (var_floor < eT(0) ), "gmm_diag::learn(): variance floor is negative" ); const unwrap tmp_X(data.get_ref()); const Mat& X = tmp_X.M; if(X.is_empty() ) { arma_debug_warn_level(3, "gmm_diag::learn(): given matrix is empty" ); return false; } if(X.is_finite() == false) { arma_debug_warn_level(3, "gmm_diag::learn(): given matrix has non-finite values"); return false; } if(N_gaus == 0) { reset(); return true; } if(dist_mode == maha_dist) { mah_aux = var(X,1,1); const uword mah_aux_n_elem = mah_aux.n_elem; eT* mah_aux_mem = mah_aux.memptr(); for(uword i=0; i < mah_aux_n_elem; ++i) { const eT val = mah_aux_mem[i]; mah_aux_mem[i] = ((val != eT(0)) && arma_isfinite(val)) ? eT(1) / val : eT(1); } } // copy current model, in case of failure by k-means and/or EM const gmm_diag orig = (*this); // initial means if(seed_mode == keep_existing) { if(means.is_empty() ) { arma_debug_warn_level(3, "gmm_diag::learn(): no existing means" ); return false; } if(X.n_rows != means.n_rows) { arma_debug_warn_level(3, "gmm_diag::learn(): dimensionality mismatch"); return false; } // TODO: also check for number of vectors? } else { if(X.n_cols < N_gaus) { arma_debug_warn_level(3, "gmm_diag::learn(): number of vectors is less than number of gaussians"); return false; } reset(X.n_rows, N_gaus); if(print_mode) { get_cout_stream() << "gmm_diag::learn(): generating initial means\n"; get_cout_stream().flush(); } if(dist_mode == eucl_dist) { generate_initial_means<1>(X, seed_mode); } else if(dist_mode == maha_dist) { generate_initial_means<2>(X, seed_mode); } } // k-means if(km_iter > 0) { const arma_ostream_state stream_state(get_cout_stream()); bool status = false; if(dist_mode == eucl_dist) { status = km_iterate<1>(X, km_iter, print_mode, "gmm_diag::learn(): k-means"); } else if(dist_mode == maha_dist) { status = km_iterate<2>(X, km_iter, print_mode, "gmm_diag::learn(): k-means"); } stream_state.restore(get_cout_stream()); if(status == false) { arma_debug_warn_level(3, "gmm_diag::learn(): k-means algorithm failed; not enough data, or too many gaussians requested"); init(orig); return false; } } // initial dcovs const eT var_floor_actual = (eT(var_floor) > eT(0)) ? eT(var_floor) : std::numeric_limits::min(); if(seed_mode != keep_existing) { if(print_mode) { get_cout_stream() << "gmm_diag::learn(): generating initial covariances\n"; get_cout_stream().flush(); } if(dist_mode == eucl_dist) { generate_initial_params<1>(X, var_floor_actual); } else if(dist_mode == maha_dist) { generate_initial_params<2>(X, var_floor_actual); } } // EM algorithm if(em_iter > 0) { const arma_ostream_state stream_state(get_cout_stream()); const bool status = em_iterate(X, em_iter, var_floor_actual, print_mode); stream_state.restore(get_cout_stream()); if(status == false) { arma_debug_warn_level(3, "gmm_diag::learn(): EM algorithm failed"); init(orig); return false; } } mah_aux.reset(); init_constants(); return true; } template template inline bool gmm_diag::kmeans_wrapper ( Mat& user_means, const Base& data, const uword N_gaus, const gmm_seed_mode& seed_mode, const uword km_iter, const bool print_mode ) { arma_extra_debug_sigprint(); const bool seed_mode_ok = \ (seed_mode == keep_existing) || (seed_mode == static_subset) || (seed_mode == static_spread) || (seed_mode == random_subset) || (seed_mode == random_spread); arma_debug_check( (seed_mode_ok == false), "kmeans(): unknown seed_mode" ); const unwrap tmp_X(data.get_ref()); const Mat& X = tmp_X.M; if(X.is_empty() ) { arma_debug_warn_level(3, "kmeans(): given matrix is empty" ); return false; } if(X.is_finite() == false) { arma_debug_warn_level(3, "kmeans(): given matrix has non-finite values"); return false; } if(N_gaus == 0) { reset(); return true; } // initial means if(seed_mode == keep_existing) { access::rw(means) = user_means; if(means.is_empty() ) { arma_debug_warn_level(3, "kmeans(): no existing means" ); return false; } if(X.n_rows != means.n_rows) { arma_debug_warn_level(3, "kmeans(): dimensionality mismatch"); return false; } // TODO: also check for number of vectors? } else { if(X.n_cols < N_gaus) { arma_debug_warn_level(3, "kmeans(): number of vectors is less than number of means"); return false; } access::rw(means).zeros(X.n_rows, N_gaus); if(print_mode) { get_cout_stream() << "kmeans(): generating initial means\n"; } generate_initial_means<1>(X, seed_mode); } // k-means if(km_iter > 0) { const arma_ostream_state stream_state(get_cout_stream()); bool status = false; status = km_iterate<1>(X, km_iter, print_mode, "kmeans()"); stream_state.restore(get_cout_stream()); if(status == false) { arma_debug_warn_level(3, "kmeans(): clustering failed; not enough data, or too many means requested"); return false; } } return true; } // // // template inline void gmm_diag::init(const gmm_diag& x) { arma_extra_debug_sigprint(); gmm_diag& t = *this; if(&t != &x) { access::rw(t.means) = x.means; access::rw(t.dcovs) = x.dcovs; access::rw(t.hefts) = x.hefts; init_constants(); } } template inline void gmm_diag::init(const gmm_full& x) { arma_extra_debug_sigprint(); access::rw(hefts) = x.hefts; access::rw(means) = x.means; const uword N_dims = x.means.n_rows; const uword N_gaus = x.means.n_cols; access::rw(dcovs).zeros(N_dims,N_gaus); for(uword g=0; g < N_gaus; ++g) { const Mat& fcov = x.fcovs.slice(g); eT* dcov_mem = access::rw(dcovs).colptr(g); for(uword d=0; d < N_dims; ++d) { dcov_mem[d] = fcov.at(d,d); } } init_constants(); } template inline void gmm_diag::init(const uword in_n_dims, const uword in_n_gaus) { arma_extra_debug_sigprint(); access::rw(means).zeros(in_n_dims, in_n_gaus); access::rw(dcovs).ones(in_n_dims, in_n_gaus); access::rw(hefts).set_size(in_n_gaus); access::rw(hefts).fill(eT(1) / eT(in_n_gaus)); init_constants(); } template inline void gmm_diag::init_constants() { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; // inv_dcovs.copy_size(dcovs); const eT* dcovs_mem = dcovs.memptr(); eT* inv_dcovs_mem = inv_dcovs.memptr(); const uword dcovs_n_elem = dcovs.n_elem; for(uword i=0; i < dcovs_n_elem; ++i) { inv_dcovs_mem[i] = eT(1) / (std::max)( dcovs_mem[i], std::numeric_limits::min() ); } // const eT tmp = (eT(N_dims)/eT(2)) * std::log(Datum::tau); log_det_etc.set_size(N_gaus); for(uword g=0; g < N_gaus; ++g) { const eT* dcovs_colmem = dcovs.colptr(g); eT log_det_val = eT(0); for(uword d=0; d < N_dims; ++d) { log_det_val += std::log( (std::max)( dcovs_colmem[d], std::numeric_limits::min() ) ); } log_det_etc[g] = eT(-1) * ( tmp + eT(0.5) * log_det_val ); } // eT* hefts_mem = access::rw(hefts).memptr(); for(uword g=0; g < N_gaus; ++g) { hefts_mem[g] = (std::max)( hefts_mem[g], std::numeric_limits::min() ); } log_hefts = log(hefts); } template inline umat gmm_diag::internal_gen_boundaries(const uword N) const { arma_extra_debug_sigprint(); #if defined(ARMA_USE_OPENMP) const uword n_threads_avail = (omp_in_parallel()) ? uword(1) : uword(omp_get_max_threads()); const uword n_threads = (n_threads_avail > 0) ? ( (n_threads_avail <= N) ? n_threads_avail : 1 ) : 1; #else static constexpr uword n_threads = 1; #endif // get_cout_stream() << "gmm_diag::internal_gen_boundaries(): n_threads: " << n_threads << '\n'; umat boundaries(2, n_threads, arma_nozeros_indicator()); if(N > 0) { const uword chunk_size = N / n_threads; uword count = 0; for(uword t=0; t arma_hot inline eT gmm_diag::internal_scalar_log_p(const eT* x) const { arma_extra_debug_sigprint(); const eT* log_hefts_mem = log_hefts.mem; const uword N_gaus = means.n_cols; if(N_gaus > 0) { eT log_sum = internal_scalar_log_p(x, 0) + log_hefts_mem[0]; for(uword g=1; g < N_gaus; ++g) { const eT tmp = internal_scalar_log_p(x, g) + log_hefts_mem[g]; log_sum = log_add_exp(log_sum, tmp); } return log_sum; } else { return -Datum::inf; } } template arma_hot inline eT gmm_diag::internal_scalar_log_p(const eT* x, const uword g) const { arma_extra_debug_sigprint(); const eT* mean = means.colptr(g); const eT* inv_dcov = inv_dcovs.colptr(g); const uword N_dims = means.n_rows; eT val_i = eT(0); eT val_j = eT(0); uword i,j; for(i=0, j=1; j inline Row gmm_diag::internal_vec_log_p(const Mat& X) const { arma_extra_debug_sigprint(); arma_debug_check( (X.n_rows != means.n_rows), "gmm_diag::log_p(): incompatible dimensions" ); const uword N = X.n_cols; Row out(N, arma_nozeros_indicator()); if(N > 0) { #if defined(ARMA_USE_OPENMP) { const umat boundaries = internal_gen_boundaries(N); const uword n_threads = boundaries.n_cols; #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); eT* out_mem = out.memptr(); for(uword i=start_index; i <= end_index; ++i) { out_mem[i] = internal_scalar_log_p( X.colptr(i) ); } } } #else { eT* out_mem = out.memptr(); for(uword i=0; i < N; ++i) { out_mem[i] = internal_scalar_log_p( X.colptr(i) ); } } #endif } return out; } template inline Row gmm_diag::internal_vec_log_p(const Mat& X, const uword gaus_id) const { arma_extra_debug_sigprint(); arma_debug_check( (X.n_rows != means.n_rows), "gmm_diag::log_p(): incompatible dimensions" ); arma_debug_check( (gaus_id >= means.n_cols), "gmm_diag::log_p(): specified gaussian is out of range" ); const uword N = X.n_cols; Row out(N, arma_nozeros_indicator()); if(N > 0) { #if defined(ARMA_USE_OPENMP) { const umat boundaries = internal_gen_boundaries(N); const uword n_threads = boundaries.n_cols; #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); eT* out_mem = out.memptr(); for(uword i=start_index; i <= end_index; ++i) { out_mem[i] = internal_scalar_log_p( X.colptr(i), gaus_id ); } } } #else { eT* out_mem = out.memptr(); for(uword i=0; i < N; ++i) { out_mem[i] = internal_scalar_log_p( X.colptr(i), gaus_id ); } } #endif } return out; } template inline eT gmm_diag::internal_sum_log_p(const Mat& X) const { arma_extra_debug_sigprint(); arma_debug_check( (X.n_rows != means.n_rows), "gmm_diag::sum_log_p(): incompatible dimensions" ); const uword N = X.n_cols; if(N == 0) { return (-Datum::inf); } #if defined(ARMA_USE_OPENMP) { const umat boundaries = internal_gen_boundaries(N); const uword n_threads = boundaries.n_cols; Col t_accs(n_threads, arma_zeros_indicator()); #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); eT t_acc = eT(0); for(uword i=start_index; i <= end_index; ++i) { t_acc += internal_scalar_log_p( X.colptr(i) ); } t_accs[t] = t_acc; } return eT(accu(t_accs)); } #else { eT acc = eT(0); for(uword i=0; i inline eT gmm_diag::internal_sum_log_p(const Mat& X, const uword gaus_id) const { arma_extra_debug_sigprint(); arma_debug_check( (X.n_rows != means.n_rows), "gmm_diag::sum_log_p(): incompatible dimensions" ); arma_debug_check( (gaus_id >= means.n_cols), "gmm_diag::sum_log_p(): specified gaussian is out of range" ); const uword N = X.n_cols; if(N == 0) { return (-Datum::inf); } #if defined(ARMA_USE_OPENMP) { const umat boundaries = internal_gen_boundaries(N); const uword n_threads = boundaries.n_cols; Col t_accs(n_threads, arma_zeros_indicator()); #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); eT t_acc = eT(0); for(uword i=start_index; i <= end_index; ++i) { t_acc += internal_scalar_log_p( X.colptr(i), gaus_id ); } t_accs[t] = t_acc; } return eT(accu(t_accs)); } #else { eT acc = eT(0); for(uword i=0; i inline eT gmm_diag::internal_avg_log_p(const Mat& X) const { arma_extra_debug_sigprint(); arma_debug_check( (X.n_rows != means.n_rows), "gmm_diag::avg_log_p(): incompatible dimensions" ); const uword N = X.n_cols; if(N == 0) { return (-Datum::inf); } #if defined(ARMA_USE_OPENMP) { const umat boundaries = internal_gen_boundaries(N); const uword n_threads = boundaries.n_cols; field< running_mean_scalar > t_running_means(n_threads); #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); running_mean_scalar& current_running_mean = t_running_means[t]; for(uword i=start_index; i <= end_index; ++i) { current_running_mean( internal_scalar_log_p( X.colptr(i) ) ); } } eT avg = eT(0); for(uword t=0; t < n_threads; ++t) { running_mean_scalar& current_running_mean = t_running_means[t]; const eT w = eT(current_running_mean.count()) / eT(N); avg += w * current_running_mean.mean(); } return avg; } #else { running_mean_scalar running_mean; for(uword i=0; i inline eT gmm_diag::internal_avg_log_p(const Mat& X, const uword gaus_id) const { arma_extra_debug_sigprint(); arma_debug_check( (X.n_rows != means.n_rows), "gmm_diag::avg_log_p(): incompatible dimensions" ); arma_debug_check( (gaus_id >= means.n_cols), "gmm_diag::avg_log_p(): specified gaussian is out of range" ); const uword N = X.n_cols; if(N == 0) { return (-Datum::inf); } #if defined(ARMA_USE_OPENMP) { const umat boundaries = internal_gen_boundaries(N); const uword n_threads = boundaries.n_cols; field< running_mean_scalar > t_running_means(n_threads); #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); running_mean_scalar& current_running_mean = t_running_means[t]; for(uword i=start_index; i <= end_index; ++i) { current_running_mean( internal_scalar_log_p( X.colptr(i), gaus_id) ); } } eT avg = eT(0); for(uword t=0; t < n_threads; ++t) { running_mean_scalar& current_running_mean = t_running_means[t]; const eT w = eT(current_running_mean.count()) / eT(N); avg += w * current_running_mean.mean(); } return avg; } #else { running_mean_scalar running_mean; for(uword i=0; i inline uword gmm_diag::internal_scalar_assign(const Mat& X, const gmm_dist_mode& dist_mode) const { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; arma_debug_check( (X.n_rows != N_dims), "gmm_diag::assign(): incompatible dimensions" ); arma_debug_check( (N_gaus == 0), "gmm_diag::assign(): model has no means" ); const eT* X_mem = X.colptr(0); if(dist_mode == eucl_dist) { eT best_dist = Datum::inf; uword best_g = 0; for(uword g=0; g < N_gaus; ++g) { const eT tmp_dist = distance::eval(N_dims, X_mem, means.colptr(g), X_mem); if(tmp_dist <= best_dist) { best_dist = tmp_dist; best_g = g; } } return best_g; } else if(dist_mode == prob_dist) { const eT* log_hefts_mem = log_hefts.memptr(); eT best_p = -Datum::inf; uword best_g = 0; for(uword g=0; g < N_gaus; ++g) { const eT tmp_p = internal_scalar_log_p(X_mem, g) + log_hefts_mem[g]; if(tmp_p >= best_p) { best_p = tmp_p; best_g = g; } } return best_g; } else { arma_debug_check(true, "gmm_diag::assign(): unsupported distance mode"); } return uword(0); } template inline void gmm_diag::internal_vec_assign(urowvec& out, const Mat& X, const gmm_dist_mode& dist_mode) const { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; arma_debug_check( (X.n_rows != N_dims), "gmm_diag::assign(): incompatible dimensions" ); const uword X_n_cols = (N_gaus > 0) ? X.n_cols : 0; out.set_size(1,X_n_cols); uword* out_mem = out.memptr(); if(dist_mode == eucl_dist) { #if defined(ARMA_USE_OPENMP) { #pragma omp parallel for schedule(static) for(uword i=0; i::inf; uword best_g = 0; for(uword g=0; g::eval(N_dims, X_colptr, means.colptr(g), X_colptr); if(tmp_dist <= best_dist) { best_dist = tmp_dist; best_g = g; } } out_mem[i] = best_g; } } #else { for(uword i=0; i::inf; uword best_g = 0; for(uword g=0; g::eval(N_dims, X_colptr, means.colptr(g), X_colptr); if(tmp_dist <= best_dist) { best_dist = tmp_dist; best_g = g; } } out_mem[i] = best_g; } } #endif } else if(dist_mode == prob_dist) { #if defined(ARMA_USE_OPENMP) { const eT* log_hefts_mem = log_hefts.memptr(); #pragma omp parallel for schedule(static) for(uword i=0; i::inf; uword best_g = 0; for(uword g=0; g= best_p) { best_p = tmp_p; best_g = g; } } out_mem[i] = best_g; } } #else { const eT* log_hefts_mem = log_hefts.memptr(); for(uword i=0; i::inf; uword best_g = 0; for(uword g=0; g= best_p) { best_p = tmp_p; best_g = g; } } out_mem[i] = best_g; } } #endif } else { arma_debug_check(true, "gmm_diag::assign(): unsupported distance mode"); } } template inline void gmm_diag::internal_raw_hist(urowvec& hist, const Mat& X, const gmm_dist_mode& dist_mode) const { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; const uword X_n_cols = X.n_cols; hist.zeros(N_gaus); if(N_gaus == 0) { return; } #if defined(ARMA_USE_OPENMP) { const umat boundaries = internal_gen_boundaries(X_n_cols); const uword n_threads = boundaries.n_cols; field thread_hist(n_threads); for(uword t=0; t < n_threads; ++t) { thread_hist(t).zeros(N_gaus); } if(dist_mode == eucl_dist) { #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { uword* thread_hist_mem = thread_hist(t).memptr(); const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); for(uword i=start_index; i <= end_index; ++i) { const eT* X_colptr = X.colptr(i); eT best_dist = Datum::inf; uword best_g = 0; for(uword g=0; g < N_gaus; ++g) { const eT tmp_dist = distance::eval(N_dims, X_colptr, means.colptr(g), X_colptr); if(tmp_dist <= best_dist) { best_dist = tmp_dist; best_g = g; } } thread_hist_mem[best_g]++; } } } else if(dist_mode == prob_dist) { const eT* log_hefts_mem = log_hefts.memptr(); #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { uword* thread_hist_mem = thread_hist(t).memptr(); const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); for(uword i=start_index; i <= end_index; ++i) { const eT* X_colptr = X.colptr(i); eT best_p = -Datum::inf; uword best_g = 0; for(uword g=0; g < N_gaus; ++g) { const eT tmp_p = internal_scalar_log_p(X_colptr, g) + log_hefts_mem[g]; if(tmp_p >= best_p) { best_p = tmp_p; best_g = g; } } thread_hist_mem[best_g]++; } } } // reduction hist = thread_hist(0); for(uword t=1; t < n_threads; ++t) { hist += thread_hist(t); } } #else { uword* hist_mem = hist.memptr(); if(dist_mode == eucl_dist) { for(uword i=0; i::inf; uword best_g = 0; for(uword g=0; g < N_gaus; ++g) { const eT tmp_dist = distance::eval(N_dims, X_colptr, means.colptr(g), X_colptr); if(tmp_dist <= best_dist) { best_dist = tmp_dist; best_g = g; } } hist_mem[best_g]++; } } else if(dist_mode == prob_dist) { const eT* log_hefts_mem = log_hefts.memptr(); for(uword i=0; i::inf; uword best_g = 0; for(uword g=0; g < N_gaus; ++g) { const eT tmp_p = internal_scalar_log_p(X_colptr, g) + log_hefts_mem[g]; if(tmp_p >= best_p) { best_p = tmp_p; best_g = g; } } hist_mem[best_g]++; } } } #endif } template template inline void gmm_diag::generate_initial_means(const Mat& X, const gmm_seed_mode& seed_mode) { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; if( (seed_mode == static_subset) || (seed_mode == random_subset) ) { uvec initial_indices; if(seed_mode == static_subset) { initial_indices = linspace(0, X.n_cols-1, N_gaus); } else if(seed_mode == random_subset) { initial_indices = randperm(X.n_cols, N_gaus); } // initial_indices.print("initial_indices:"); access::rw(means) = X.cols(initial_indices); } else if( (seed_mode == static_spread) || (seed_mode == random_spread) ) { // going through all of the samples can be extremely time consuming; // instead, if there are enough samples, randomly choose samples with probability 0.1 const bool use_sampling = ((X.n_cols/uword(100)) > N_gaus); const uword step = (use_sampling) ? uword(10) : uword(1); uword start_index = 0; if(seed_mode == static_spread) { start_index = X.n_cols / 2; } else if(seed_mode == random_spread) { start_index = as_scalar(randi(1, distr_param(0,X.n_cols-1))); } access::rw(means).col(0) = X.unsafe_col(start_index); const eT* mah_aux_mem = mah_aux.memptr(); running_stat rs; for(uword g=1; g < N_gaus; ++g) { eT max_dist = eT(0); uword best_i = uword(0); uword start_i = uword(0); if(use_sampling) { uword start_i_proposed = uword(0); if(seed_mode == static_spread) { start_i_proposed = g % uword(10); } if(seed_mode == random_spread) { start_i_proposed = as_scalar(randi(1, distr_param(0,9))); } if(start_i_proposed < X.n_cols) { start_i = start_i_proposed; } } for(uword i=start_i; i < X.n_cols; i += step) { rs.reset(); const eT* X_colptr = X.colptr(i); bool ignore_i = false; // find the average distance between sample i and the means so far for(uword h = 0; h < g; ++h) { const eT dist = distance::eval(N_dims, X_colptr, means.colptr(h), mah_aux_mem); // ignore sample already selected as a mean if(dist == eT(0)) { ignore_i = true; break; } else { rs(dist); } } if( (rs.mean() >= max_dist) && (ignore_i == false)) { max_dist = eT(rs.mean()); best_i = i; } } // set the mean to the sample that is the furthest away from the means so far access::rw(means).col(g) = X.unsafe_col(best_i); } } // get_cout_stream() << "generate_initial_means():" << '\n'; // means.print(); } template template inline void gmm_diag::generate_initial_params(const Mat& X, const eT var_floor) { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; const eT* mah_aux_mem = mah_aux.memptr(); const uword X_n_cols = X.n_cols; if(X_n_cols == 0) { return; } // as the covariances are calculated via accumulators, // the means also need to be calculated via accumulators to ensure numerical consistency Mat acc_means(N_dims, N_gaus, arma_zeros_indicator()); Mat acc_dcovs(N_dims, N_gaus, arma_zeros_indicator()); Row acc_hefts(N_gaus, arma_zeros_indicator()); uword* acc_hefts_mem = acc_hefts.memptr(); #if defined(ARMA_USE_OPENMP) { const umat boundaries = internal_gen_boundaries(X_n_cols); const uword n_threads = boundaries.n_cols; field< Mat > t_acc_means(n_threads); field< Mat > t_acc_dcovs(n_threads); field< Row > t_acc_hefts(n_threads); for(uword t=0; t < n_threads; ++t) { t_acc_means(t).zeros(N_dims, N_gaus); t_acc_dcovs(t).zeros(N_dims, N_gaus); t_acc_hefts(t).zeros(N_gaus); } #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { uword* t_acc_hefts_mem = t_acc_hefts(t).memptr(); const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); for(uword i=start_index; i <= end_index; ++i) { const eT* X_colptr = X.colptr(i); eT min_dist = Datum::inf; uword best_g = 0; for(uword g=0; g::eval(N_dims, X_colptr, means.colptr(g), mah_aux_mem); if(dist < min_dist) { min_dist = dist; best_g = g; } } eT* t_acc_mean = t_acc_means(t).colptr(best_g); eT* t_acc_dcov = t_acc_dcovs(t).colptr(best_g); for(uword d=0; d::inf; uword best_g = 0; for(uword g=0; g::eval(N_dims, X_colptr, means.colptr(g), mah_aux_mem); if(dist < min_dist) { min_dist = dist; best_g = g; } } eT* acc_mean = acc_means.colptr(best_g); eT* acc_dcov = acc_dcovs.colptr(best_g); for(uword d=0; d= 1) ? tmp : eT(0); dcov[d] = (acc_heft >= 2) ? eT((acc_dcov[d] / eT(acc_heft)) - (tmp*tmp)) : eT(var_floor); } hefts_mem[g] = eT(acc_heft) / eT(X_n_cols); } em_fix_params(var_floor); } //! multi-threaded implementation of k-means, inspired by MapReduce template template inline bool gmm_diag::km_iterate(const Mat& X, const uword max_iter, const bool verbose, const char* signature) { arma_extra_debug_sigprint(); if(verbose) { get_cout_stream().unsetf(ios::showbase); get_cout_stream().unsetf(ios::uppercase); get_cout_stream().unsetf(ios::showpos); get_cout_stream().unsetf(ios::scientific); get_cout_stream().setf(ios::right); get_cout_stream().setf(ios::fixed); } const uword X_n_cols = X.n_cols; if(X_n_cols == 0) { return true; } const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; const eT* mah_aux_mem = mah_aux.memptr(); Mat acc_means(N_dims, N_gaus, arma_zeros_indicator()); Row acc_hefts( N_gaus, arma_zeros_indicator()); Row last_indx( N_gaus, arma_zeros_indicator()); Mat new_means = means; Mat old_means = means; running_mean_scalar rs_delta; #if defined(ARMA_USE_OPENMP) const umat boundaries = internal_gen_boundaries(X_n_cols); const uword n_threads = boundaries.n_cols; field< Mat > t_acc_means(n_threads); field< Row > t_acc_hefts(n_threads); field< Row > t_last_indx(n_threads); #else const uword n_threads = 1; #endif if(verbose) { get_cout_stream() << signature << ": n_threads: " << n_threads << '\n'; get_cout_stream().flush(); } for(uword iter=1; iter <= max_iter; ++iter) { #if defined(ARMA_USE_OPENMP) { for(uword t=0; t < n_threads; ++t) { t_acc_means(t).zeros(N_dims, N_gaus); t_acc_hefts(t).zeros(N_gaus); t_last_indx(t).zeros(N_gaus); } #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { Mat& t_acc_means_t = t_acc_means(t); uword* t_acc_hefts_mem = t_acc_hefts(t).memptr(); uword* t_last_indx_mem = t_last_indx(t).memptr(); const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); for(uword i=start_index; i <= end_index; ++i) { const eT* X_colptr = X.colptr(i); eT min_dist = Datum::inf; uword best_g = 0; for(uword g=0; g::eval(N_dims, X_colptr, old_means.colptr(g), mah_aux_mem); if(dist < min_dist) { min_dist = dist; best_g = g; } } eT* t_acc_mean = t_acc_means_t.colptr(best_g); for(uword d=0; d= 1 ) { last_indx(g) = t_last_indx(t)(g); } } } #else { uword* acc_hefts_mem = acc_hefts.memptr(); uword* last_indx_mem = last_indx.memptr(); for(uword i=0; i < X_n_cols; ++i) { const eT* X_colptr = X.colptr(i); eT min_dist = Datum::inf; uword best_g = 0; for(uword g=0; g::eval(N_dims, X_colptr, old_means.colptr(g), mah_aux_mem); if(dist < min_dist) { min_dist = dist; best_g = g; } } eT* acc_mean = acc_means.colptr(best_g); for(uword d=0; d= 1) ? (acc_mean[d] / eT(acc_heft)) : eT(0); } } // heuristics to resurrect dead means const uvec dead_gs = find(acc_hefts == uword(0)); if(dead_gs.n_elem > 0) { if(verbose) { get_cout_stream() << signature << ": recovering from dead means\n"; get_cout_stream().flush(); } uword* last_indx_mem = last_indx.memptr(); const uvec live_gs = sort( find(acc_hefts >= uword(2)), "descend" ); if(live_gs.n_elem == 0) { return false; } uword live_gs_count = 0; for(uword dead_gs_count = 0; dead_gs_count < dead_gs.n_elem; ++dead_gs_count) { const uword dead_g_id = dead_gs(dead_gs_count); uword proposed_i = 0; if(live_gs_count < live_gs.n_elem) { const uword live_g_id = live_gs(live_gs_count); ++live_gs_count; if(live_g_id == dead_g_id) { return false; } // recover by using a sample from a known good mean proposed_i = last_indx_mem[live_g_id]; } else { // recover by using a randomly seleced sample (last resort) proposed_i = as_scalar(randi(1, distr_param(0,X_n_cols-1))); } if(proposed_i >= X_n_cols) { return false; } new_means.col(dead_g_id) = X.col(proposed_i); } } rs_delta.reset(); for(uword g=0; g < N_gaus; ++g) { rs_delta( distance::eval(N_dims, old_means.colptr(g), new_means.colptr(g), mah_aux_mem) ); } if(verbose) { get_cout_stream() << signature << ": iteration: "; get_cout_stream().unsetf(ios::scientific); get_cout_stream().setf(ios::fixed); get_cout_stream().width(std::streamsize(4)); get_cout_stream() << iter; get_cout_stream() << " delta: "; get_cout_stream().unsetf(ios::fixed); //get_cout_stream().setf(ios::scientific); get_cout_stream() << rs_delta.mean() << '\n'; get_cout_stream().flush(); } arma::swap(old_means, new_means); if(rs_delta.mean() <= Datum::eps) { break; } } access::rw(means) = old_means; if(means.is_finite() == false) { return false; } return true; } //! multi-threaded implementation of Expectation-Maximisation, inspired by MapReduce template inline bool gmm_diag::em_iterate(const Mat& X, const uword max_iter, const eT var_floor, const bool verbose) { arma_extra_debug_sigprint(); if(X.n_cols == 0) { return true; } const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; if(verbose) { get_cout_stream().unsetf(ios::showbase); get_cout_stream().unsetf(ios::uppercase); get_cout_stream().unsetf(ios::showpos); get_cout_stream().unsetf(ios::scientific); get_cout_stream().setf(ios::right); get_cout_stream().setf(ios::fixed); } const umat boundaries = internal_gen_boundaries(X.n_cols); const uword n_threads = boundaries.n_cols; field< Mat > t_acc_means(n_threads); field< Mat > t_acc_dcovs(n_threads); field< Col > t_acc_norm_lhoods(n_threads); field< Col > t_gaus_log_lhoods(n_threads); Col t_progress_log_lhood(n_threads, arma_nozeros_indicator()); for(uword t=0; t::inf; for(uword iter=1; iter <= max_iter; ++iter) { init_constants(); em_update_params(X, boundaries, t_acc_means, t_acc_dcovs, t_acc_norm_lhoods, t_gaus_log_lhoods, t_progress_log_lhood); em_fix_params(var_floor); const eT new_avg_log_p = accu(t_progress_log_lhood) / eT(t_progress_log_lhood.n_elem); if(verbose) { get_cout_stream() << "gmm_diag::learn(): EM: iteration: "; get_cout_stream().unsetf(ios::scientific); get_cout_stream().setf(ios::fixed); get_cout_stream().width(std::streamsize(4)); get_cout_stream() << iter; get_cout_stream() << " avg_log_p: "; get_cout_stream().unsetf(ios::fixed); //get_cout_stream().setf(ios::scientific); get_cout_stream() << new_avg_log_p << '\n'; get_cout_stream().flush(); } if(arma_isfinite(new_avg_log_p) == false) { return false; } if(std::abs(old_avg_log_p - new_avg_log_p) <= Datum::eps) { break; } old_avg_log_p = new_avg_log_p; } if(any(vectorise(dcovs) <= eT(0))) { return false; } if(means.is_finite() == false ) { return false; } if(dcovs.is_finite() == false ) { return false; } if(hefts.is_finite() == false ) { return false; } return true; } template inline void gmm_diag::em_update_params ( const Mat& X, const umat& boundaries, field< Mat >& t_acc_means, field< Mat >& t_acc_dcovs, field< Col >& t_acc_norm_lhoods, field< Col >& t_gaus_log_lhoods, Col& t_progress_log_lhood ) { arma_extra_debug_sigprint(); const uword n_threads = boundaries.n_cols; // em_generate_acc() is the "map" operation, which produces partial accumulators for means, diagonal covariances and hefts #if defined(ARMA_USE_OPENMP) { #pragma omp parallel for schedule(static) for(uword t=0; t& acc_means = t_acc_means[t]; Mat& acc_dcovs = t_acc_dcovs[t]; Col& acc_norm_lhoods = t_acc_norm_lhoods[t]; Col& gaus_log_lhoods = t_gaus_log_lhoods[t]; eT& progress_log_lhood = t_progress_log_lhood[t]; em_generate_acc(X, boundaries.at(0,t), boundaries.at(1,t), acc_means, acc_dcovs, acc_norm_lhoods, gaus_log_lhoods, progress_log_lhood); } } #else { em_generate_acc(X, boundaries.at(0,0), boundaries.at(1,0), t_acc_means[0], t_acc_dcovs[0], t_acc_norm_lhoods[0], t_gaus_log_lhoods[0], t_progress_log_lhood[0]); } #endif const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; Mat& final_acc_means = t_acc_means[0]; Mat& final_acc_dcovs = t_acc_dcovs[0]; Col& final_acc_norm_lhoods = t_acc_norm_lhoods[0]; // the "reduce" operation, which combines the partial accumulators produced by the separate threads for(uword t=1; t::min() ); // // eT* mean_mem = access::rw(means).colptr(g); // eT* dcov_mem = access::rw(dcovs).colptr(g); // // eT* acc_mean_mem = final_acc_means.colptr(g); // eT* acc_dcov_mem = final_acc_dcovs.colptr(g); // // hefts_mem[g] = acc_norm_lhood / eT(X.n_cols); // // for(uword d=0; d < N_dims; ++d) // { // const eT tmp = acc_mean_mem[d] / acc_norm_lhood; // // mean_mem[d] = tmp; // dcov_mem[d] = acc_dcov_mem[d] / acc_norm_lhood - tmp*tmp; // } // } // conditionally update each component; if only a subset of the hefts was updated, em_fix_params() will sanitise them for(uword g=0; g < N_gaus; ++g) { const eT acc_norm_lhood = (std::max)( final_acc_norm_lhoods[g], std::numeric_limits::min() ); if(arma_isfinite(acc_norm_lhood) == false) { continue; } eT* acc_mean_mem = final_acc_means.colptr(g); eT* acc_dcov_mem = final_acc_dcovs.colptr(g); bool ok = true; for(uword d=0; d < N_dims; ++d) { const eT tmp1 = acc_mean_mem[d] / acc_norm_lhood; const eT tmp2 = acc_dcov_mem[d] / acc_norm_lhood - tmp1*tmp1; acc_mean_mem[d] = tmp1; acc_dcov_mem[d] = tmp2; if(arma_isfinite(tmp2) == false) { ok = false; } } if(ok) { hefts_mem[g] = acc_norm_lhood / eT(X.n_cols); eT* mean_mem = access::rw(means).colptr(g); eT* dcov_mem = access::rw(dcovs).colptr(g); for(uword d=0; d < N_dims; ++d) { mean_mem[d] = acc_mean_mem[d]; dcov_mem[d] = acc_dcov_mem[d]; } } } } template inline void gmm_diag::em_generate_acc ( const Mat& X, const uword start_index, const uword end_index, Mat& acc_means, Mat& acc_dcovs, Col& acc_norm_lhoods, Col& gaus_log_lhoods, eT& progress_log_lhood ) const { arma_extra_debug_sigprint(); progress_log_lhood = eT(0); acc_means.zeros(); acc_dcovs.zeros(); acc_norm_lhoods.zeros(); gaus_log_lhoods.zeros(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; const eT* log_hefts_mem = log_hefts.memptr(); eT* gaus_log_lhoods_mem = gaus_log_lhoods.memptr(); for(uword i=start_index; i <= end_index; i++) { const eT* x = X.colptr(i); for(uword g=0; g < N_gaus; ++g) { gaus_log_lhoods_mem[g] = internal_scalar_log_p(x, g) + log_hefts_mem[g]; } eT log_lhood_sum = gaus_log_lhoods_mem[0]; for(uword g=1; g < N_gaus; ++g) { log_lhood_sum = log_add_exp(log_lhood_sum, gaus_log_lhoods_mem[g]); } progress_log_lhood += log_lhood_sum; for(uword g=0; g < N_gaus; ++g) { const eT norm_lhood = std::exp(gaus_log_lhoods_mem[g] - log_lhood_sum); acc_norm_lhoods[g] += norm_lhood; eT* acc_mean_mem = acc_means.colptr(g); eT* acc_dcov_mem = acc_dcovs.colptr(g); for(uword d=0; d < N_dims; ++d) { const eT x_d = x[d]; const eT y_d = x_d * norm_lhood; acc_mean_mem[d] += y_d; acc_dcov_mem[d] += y_d * x_d; // equivalent to x_d * x_d * norm_lhood } } } progress_log_lhood /= eT((end_index - start_index) + 1); } template inline void gmm_diag::em_fix_params(const eT var_floor) { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; const eT var_ceiling = std::numeric_limits::max(); const uword dcovs_n_elem = dcovs.n_elem; eT* dcovs_mem = access::rw(dcovs).memptr(); for(uword i=0; i < dcovs_n_elem; ++i) { eT& var_val = dcovs_mem[i]; if(var_val < var_floor ) { var_val = var_floor; } else if(var_val > var_ceiling) { var_val = var_ceiling; } else if(arma_isnan(var_val) ) { var_val = eT(1); } } eT* hefts_mem = access::rw(hefts).memptr(); for(uword g1=0; g1 < N_gaus; ++g1) { if(hefts_mem[g1] > eT(0)) { const eT* means_colptr_g1 = means.colptr(g1); for(uword g2=(g1+1); g2 < N_gaus; ++g2) { if( (hefts_mem[g2] > eT(0)) && (std::abs(hefts_mem[g1] - hefts_mem[g2]) <= std::numeric_limits::epsilon()) ) { const eT dist = distance::eval(N_dims, means_colptr_g1, means.colptr(g2), means_colptr_g1); if(dist == eT(0)) { hefts_mem[g2] = eT(0); } } } } } const eT heft_floor = std::numeric_limits::min(); const eT heft_initial = eT(1) / eT(N_gaus); for(uword i=0; i < N_gaus; ++i) { eT& heft_val = hefts_mem[i]; if(heft_val < heft_floor) { heft_val = heft_floor; } else if(heft_val > eT(1) ) { heft_val = eT(1); } else if(arma_isnan(heft_val) ) { heft_val = heft_initial; } } const eT heft_sum = accu(hefts); if((heft_sum < (eT(1) - Datum::eps)) || (heft_sum > (eT(1) + Datum::eps))) { access::rw(hefts) /= heft_sum; } } } // namespace gmm_priv //! @} RcppArmadillo/inst/include/armadillo_bits/operator_relational.hpp0000644000176200001440000002260514124060717025155 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup operator_relational //! @{ // < : lt // > : gt // <= : lteq // >= : gteq // == : eq // != : noteq // && : and // || : or template inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && (is_cx::no) && (is_cx::no)), const mtGlue >::result operator< (const T1& X, const T2& Y) { arma_extra_debug_sigprint(); return mtGlue( X, Y ); } template inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && (is_cx::no) && (is_cx::no)), const mtGlue >::result operator> (const T1& X, const T2& Y) { arma_extra_debug_sigprint(); return mtGlue( X, Y ); } template inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && (is_cx::no) && (is_cx::no)), const mtGlue >::result operator<= (const T1& X, const T2& Y) { arma_extra_debug_sigprint(); return mtGlue( X, Y ); } template inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && (is_cx::no) && (is_cx::no)), const mtGlue >::result operator>= (const T1& X, const T2& Y) { arma_extra_debug_sigprint(); return mtGlue( X, Y ); } template inline typename enable_if2 < (is_arma_type::value && is_arma_type::value), const mtGlue >::result operator== (const T1& X, const T2& Y) { arma_extra_debug_sigprint(); return mtGlue( X, Y ); } template inline typename enable_if2 < (is_arma_type::value && is_arma_type::value), const mtGlue >::result operator!= (const T1& X, const T2& Y) { arma_extra_debug_sigprint(); return mtGlue( X, Y ); } template inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && (is_cx::no) && (is_cx::no)), const mtGlue >::result operator&& (const T1& X, const T2& Y) { arma_extra_debug_sigprint(); return mtGlue( X, Y ); } template inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && (is_cx::no) && (is_cx::no)), const mtGlue >::result operator|| (const T1& X, const T2& Y) { arma_extra_debug_sigprint(); return mtGlue( X, Y ); } // // // template inline typename enable_if2 < (is_arma_type::value && (is_cx::no)), const mtOp >::result operator< (const typename T1::elem_type val, const T1& X) { arma_extra_debug_sigprint(); return mtOp(X, val); } template inline typename enable_if2 < (is_arma_type::value && (is_cx::no)), const mtOp >::result operator< (const T1& X, const typename T1::elem_type val) { arma_extra_debug_sigprint(); return mtOp(X, val); } template inline typename enable_if2 < (is_arma_type::value && (is_cx::no)), const mtOp >::result operator> (const typename T1::elem_type val, const T1& X) { arma_extra_debug_sigprint(); return mtOp(X, val); } template inline typename enable_if2 < (is_arma_type::value && (is_cx::no)), const mtOp >::result operator> (const T1& X, const typename T1::elem_type val) { arma_extra_debug_sigprint(); return mtOp(X, val); } template inline typename enable_if2 < (is_arma_type::value && (is_cx::no)), const mtOp >::result operator<= (const typename T1::elem_type val, const T1& X) { arma_extra_debug_sigprint(); return mtOp(X, val); } template inline typename enable_if2 < (is_arma_type::value && (is_cx::no)), const mtOp >::result operator<= (const T1& X, const typename T1::elem_type val) { arma_extra_debug_sigprint(); return mtOp(X, val); } template inline typename enable_if2 < (is_arma_type::value && (is_cx::no)), const mtOp >::result operator>= (const typename T1::elem_type val, const T1& X) { arma_extra_debug_sigprint(); return mtOp(X, val); } template inline typename enable_if2 < (is_arma_type::value && (is_cx::no)), const mtOp >::result operator>= (const T1& X, const typename T1::elem_type val) { arma_extra_debug_sigprint(); return mtOp(X, val); } template inline typename enable_if2 < is_arma_type::value, const mtOp >::result operator== (const typename T1::elem_type val, const T1& X) { arma_extra_debug_sigprint(); return mtOp(X, val); } template inline typename enable_if2 < is_arma_type::value, const mtOp >::result operator== (const T1& X, const typename T1::elem_type val) { arma_extra_debug_sigprint(); return mtOp(X, val); } template inline typename enable_if2 < is_arma_type::value, const mtOp >::result operator!= (const typename T1::elem_type val, const T1& X) { arma_extra_debug_sigprint(); return mtOp(X, val); } template inline typename enable_if2 < is_arma_type::value, const mtOp >::result operator!= (const T1& X, const typename T1::elem_type val) { arma_extra_debug_sigprint(); return mtOp(X, val); } // template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_sparse_type::value && (is_cx::no) && (is_cx::no)), const mtSpGlue >::result operator< (const T1& X, const T2& Y) { arma_extra_debug_sigprint(); // TODO: ensure T1::elem_type and T2::elem_type are the same return mtSpGlue( X, Y ); } template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_sparse_type::value && (is_cx::no) && (is_cx::no)), const mtSpGlue >::result operator> (const T1& X, const T2& Y) { arma_extra_debug_sigprint(); // TODO: ensure T1::elem_type and T2::elem_type are the same return mtSpGlue( X, Y ); } template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_sparse_type::value && (is_cx::no) && (is_cx::no)), const mtSpGlue >::result operator&& (const T1& X, const T2& Y) { arma_extra_debug_sigprint(); // TODO: ensure T1::elem_type and T2::elem_type are the same return mtSpGlue( X, Y ); } template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_sparse_type::value && (is_cx::no) && (is_cx::no)), const mtSpGlue >::result operator|| (const T1& X, const T2& Y) { arma_extra_debug_sigprint(); // TODO: ensure T1::elem_type and T2::elem_type are the same return mtSpGlue( X, Y ); } //! @} RcppArmadillo/inst/include/armadillo_bits/GlueCube_meat.hpp0000644000176200001440000000236414124060717023611 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup GlueCube //! @{ template inline GlueCube::GlueCube(const BaseCube& in_A, const BaseCube& in_B) : A(in_A.get_ref()) , B(in_B.get_ref()) { arma_extra_debug_sigprint(); } template inline GlueCube::~GlueCube() { arma_extra_debug_sigprint(); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_cov_meat.hpp0000644000176200001440000000517014124060717023401 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_cov //! @{ template inline void op_cov::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword norm_type = in.aux_uword_a; const unwrap U(in.m); const Mat& A = U.M; if(A.n_elem == 0) { out.reset(); return; } const Mat& AA = (A.n_rows == 1) ? Mat(const_cast(A.memptr()), A.n_cols, A.n_rows, false, false) : Mat(const_cast(A.memptr()), A.n_rows, A.n_cols, false, false); const uword N = AA.n_rows; const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N); const Mat tmp = AA.each_row() - mean(AA,0); out = tmp.t() * tmp; out /= norm_val; } template inline void op_cov::apply(Mat& out, const Op< Op, op_cov>& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword norm_type = in.aux_uword_a; if(is_cx::yes) { const Mat tmp = in.m; // force the evaluation of Op out = cov(tmp, norm_type); } else { const unwrap U(in.m.m); const Mat& A = U.M; if(A.n_elem == 0) { out.reset(); return; } const Mat& AA = (A.n_cols == 1) ? Mat(const_cast(A.memptr()), A.n_cols, A.n_rows, false, false) : Mat(const_cast(A.memptr()), A.n_rows, A.n_cols, false, false); const uword N = AA.n_cols; const eT norm_val = (norm_type == 0) ? ( (N > 1) ? eT(N-1) : eT(1) ) : eT(N); const Mat tmp = AA.each_col() - mean(AA,1); out = tmp * tmp.t(); out /= norm_val; } } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_histc_meat.hpp0000644000176200001440000001077314124060717024247 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_histc //! @{ template inline void glue_histc::apply_noalias(Mat& C, const Mat& A, const Mat& B, const uword dim) { arma_extra_debug_sigprint(); arma_debug_check( ((B.is_vec() == false) && (B.is_empty() == false)), "histc(): parameter 'edges' must be a vector" ); const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_elem = B.n_elem; if( B_n_elem == uword(0) ) { C.reset(); return; } arma_debug_check ( ((Col(const_cast(B.memptr()), B_n_elem, false, false)).is_sorted("strictascend") == false), "hist(): given 'edges' vector does not contain monotonically increasing values" ); const eT* B_mem = B.memptr(); const uword B_n_elem_m1 = B_n_elem - 1; if(dim == uword(0)) { C.zeros(B_n_elem, A_n_cols); for(uword col=0; col < A_n_cols; ++col) { const eT* A_coldata = A.colptr(col); uword* C_coldata = C.colptr(col); for(uword row=0; row < A_n_rows; ++row) { const eT x = A_coldata[row]; for(uword i=0; i < B_n_elem_m1; ++i) { if( (B_mem[i] <= x) && (x < B_mem[i+1]) ) { C_coldata[i]++; break; } else if( B_mem[B_n_elem_m1] == x ) { C_coldata[B_n_elem_m1]++; break; } // for compatibility with Matlab } } } } else if(dim == uword(1)) { C.zeros(A_n_rows, B_n_elem); if(A.n_rows == 1) { const uword A_n_elem = A.n_elem; const eT* A_mem = A.memptr(); uword* C_mem = C.memptr(); for(uword j=0; j < A_n_elem; ++j) { const eT x = A_mem[j]; for(uword i=0; i < B_n_elem_m1; ++i) { if( (B_mem[i] <= x) && (x < B_mem[i+1]) ) { C_mem[i]++; break; } else if( B_mem[B_n_elem_m1] == x ) { C_mem[B_n_elem_m1]++; break; } // for compatibility with Matlab } } } else { for(uword row=0; row < A_n_rows; ++row) for(uword col=0; col < A_n_cols; ++col) { const eT x = A.at(row,col); for(uword i=0; i < B_n_elem_m1; ++i) { if( (B_mem[i] <= x) && (x < B_mem[i+1]) ) { C.at(row,i)++; break; } else if( B_mem[B_n_elem_m1] == x ) { C.at(row,B_n_elem_m1)++; break; } // for compatibility with Matlab } } } } } template inline void glue_histc::apply(Mat& C, const mtGlue& expr) { arma_extra_debug_sigprint(); const uword dim = expr.aux_uword; arma_debug_check( (dim > 1), "histc(): parameter 'dim' must be 0 or 1" ); const quasi_unwrap UA(expr.A); const quasi_unwrap UB(expr.B); if(UA.is_alias(C) || UB.is_alias(C)) { Mat tmp; glue_histc::apply_noalias(tmp, UA.M, UB.M, dim); C.steal_mem(tmp); } else { glue_histc::apply_noalias(C, UA.M, UB.M, dim); } } template inline void glue_histc_default::apply(Mat& C, const mtGlue& expr) { arma_extra_debug_sigprint(); const quasi_unwrap UA(expr.A); const quasi_unwrap UB(expr.B); const uword dim = (T1::is_xvec) ? uword(UA.M.is_rowvec() ? 1 : 0) : uword((T1::is_row) ? 1 : 0); if(UA.is_alias(C) || UB.is_alias(C)) { Mat tmp; glue_histc::apply_noalias(tmp, UA.M, UB.M, dim); C.steal_mem(tmp); } else { glue_histc::apply_noalias(C, UA.M, UB.M, dim); } } //! @} RcppArmadillo/inst/include/armadillo_bits/SizeMat_bones.hpp0000644000176200001440000000276214124060717023654 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SizeMat //! @{ class SizeMat { public: const uword n_rows; const uword n_cols; inline explicit SizeMat(const uword in_n_rows, const uword in_n_cols); inline uword operator[](const uword dim) const; inline uword operator()(const uword dim) const; inline bool operator==(const SizeMat& s) const; inline bool operator!=(const SizeMat& s) const; inline SizeMat operator+(const SizeMat& s) const; inline SizeMat operator-(const SizeMat& s) const; inline SizeMat operator+(const uword val) const; inline SizeMat operator-(const uword val) const; inline SizeMat operator*(const uword val) const; inline SizeMat operator/(const uword val) const; }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_sum_meat.hpp0000644000176200001440000001730614124060717023422 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_sum //! @{ template arma_hot inline void op_sum::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "sum(): parameter 'dim' must be 0 or 1" ); const Proxy P(in.m); if(P.is_alias(out) == false) { op_sum::apply_noalias(out, P, dim); } else { Mat tmp; op_sum::apply_noalias(tmp, P, dim); out.steal_mem(tmp); } } template arma_hot inline void op_sum::apply_noalias(Mat& out, const Proxy& P, const uword dim) { arma_extra_debug_sigprint(); if(is_Mat::stored_type>::value || (arma_config::openmp && Proxy::use_mp)) { op_sum::apply_noalias_unwrap(out, P, dim); } else { op_sum::apply_noalias_proxy(out, P, dim); } } template arma_hot inline void op_sum::apply_noalias_unwrap(Mat& out, const Proxy& P, const uword dim) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename Proxy::stored_type P_stored_type; const unwrap tmp(P.Q); const typename unwrap::stored_type& X = tmp.M; const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(dim == 0) { out.set_size(1, X_n_cols); eT* out_mem = out.memptr(); for(uword col=0; col < X_n_cols; ++col) { out_mem[col] = arrayops::accumulate( X.colptr(col), X_n_rows ); } } else { out.zeros(X_n_rows, 1); eT* out_mem = out.memptr(); for(uword col=0; col < X_n_cols; ++col) { arrayops::inplace_plus( out_mem, X.colptr(col), X_n_rows ); } } } template arma_hot inline void op_sum::apply_noalias_proxy(Mat& out, const Proxy& P, const uword dim) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword P_n_rows = P.get_n_rows(); const uword P_n_cols = P.get_n_cols(); if(dim == 0) { out.set_size(1, P_n_cols); eT* out_mem = out.memptr(); for(uword col=0; col < P_n_cols; ++col) { eT val1 = eT(0); eT val2 = eT(0); uword i,j; for(i=0, j=1; j < P_n_rows; i+=2, j+=2) { val1 += P.at(i,col); val2 += P.at(j,col); } if(i < P_n_rows) { val1 += P.at(i,col); } out_mem[col] = (val1 + val2); } } else { out.zeros(P_n_rows, 1); eT* out_mem = out.memptr(); for(uword col=0; col < P_n_cols; ++col) for(uword row=0; row < P_n_rows; ++row) { out_mem[row] += P.at(row,col); } } } // // cubes template arma_hot inline void op_sum::apply(Cube& out, const OpCube& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 2), "sum(): parameter 'dim' must be 0 or 1 or 2" ); const ProxyCube P(in.m); if(P.is_alias(out) == false) { op_sum::apply_noalias(out, P, dim); } else { Cube tmp; op_sum::apply_noalias(tmp, P, dim); out.steal_mem(tmp); } } template arma_hot inline void op_sum::apply_noalias(Cube& out, const ProxyCube& P, const uword dim) { arma_extra_debug_sigprint(); if(is_Cube::stored_type>::value || (arma_config::openmp && ProxyCube::use_mp)) { op_sum::apply_noalias_unwrap(out, P, dim); } else { op_sum::apply_noalias_proxy(out, P, dim); } } template arma_hot inline void op_sum::apply_noalias_unwrap(Cube& out, const ProxyCube& P, const uword dim) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename ProxyCube::stored_type P_stored_type; const unwrap_cube tmp(P.Q); const Cube& X = tmp.M; const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword X_n_slices = X.n_slices; if(dim == 0) { out.set_size(1, X_n_cols, X_n_slices); for(uword slice=0; slice < X_n_slices; ++slice) { eT* out_mem = out.slice_memptr(slice); for(uword col=0; col < X_n_cols; ++col) { out_mem[col] = arrayops::accumulate( X.slice_colptr(slice,col), X_n_rows ); } } } else if(dim == 1) { out.zeros(X_n_rows, 1, X_n_slices); for(uword slice=0; slice < X_n_slices; ++slice) { eT* out_mem = out.slice_memptr(slice); for(uword col=0; col < X_n_cols; ++col) { arrayops::inplace_plus( out_mem, X.slice_colptr(slice,col), X_n_rows ); } } } else if(dim == 2) { out.zeros(X_n_rows, X_n_cols, 1); eT* out_mem = out.memptr(); for(uword slice=0; slice < X_n_slices; ++slice) { arrayops::inplace_plus(out_mem, X.slice_memptr(slice), X.n_elem_slice ); } } } template arma_hot inline void op_sum::apply_noalias_proxy(Cube& out, const ProxyCube& P, const uword dim) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword P_n_rows = P.get_n_rows(); const uword P_n_cols = P.get_n_cols(); const uword P_n_slices = P.get_n_slices(); if(dim == 0) { out.set_size(1, P_n_cols, P_n_slices); for(uword slice=0; slice < P_n_slices; ++slice) { eT* out_mem = out.slice_memptr(slice); for(uword col=0; col < P_n_cols; ++col) { eT val1 = eT(0); eT val2 = eT(0); uword i,j; for(i=0, j=1; j < P_n_rows; i+=2, j+=2) { val1 += P.at(i,col,slice); val2 += P.at(j,col,slice); } if(i < P_n_rows) { val1 += P.at(i,col,slice); } out_mem[col] = (val1 + val2); } } } else if(dim == 1) { out.zeros(P_n_rows, 1, P_n_slices); for(uword slice=0; slice < P_n_slices; ++slice) { eT* out_mem = out.slice_memptr(slice); for(uword col=0; col < P_n_cols; ++col) for(uword row=0; row < P_n_rows; ++row) { out_mem[row] += P.at(row,col,slice); } } } else if(dim == 2) { out.zeros(P_n_rows, P_n_cols, 1); for(uword slice=0; slice < P_n_slices; ++slice) { for(uword col=0; col < P_n_cols; ++col) { eT* out_mem = out.slice_colptr(0,col); for(uword row=0; row < P_n_rows; ++row) { out_mem[row] += P.at(row,col,slice); } } } } } //! @} RcppArmadillo/inst/include/armadillo_bits/mp_misc.hpp0000644000176200001440000000362614124060717022541 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup mp_misc //! @{ template struct mp_gate { arma_inline static bool eval(const uword n_elem) { #if defined(ARMA_USE_OPENMP) { const bool length_ok = (is_cx::yes || use_smaller_thresh) ? (n_elem >= (arma_config::mp_threshold/uword(2))) : (n_elem >= arma_config::mp_threshold); if(length_ok) { if(omp_in_parallel()) { return false; } } return length_ok; } #else { arma_ignore(n_elem); return false; } #endif } }; struct mp_thread_limit { arma_inline static int get() { #if defined(ARMA_USE_OPENMP) int n_threads = (std::min)(int(arma_config::mp_threads), int((std::max)(int(1), int(omp_get_max_threads())))); #else int n_threads = int(1); #endif return n_threads; } arma_inline static bool in_parallel() { #if defined(ARMA_USE_OPENMP) { return bool(omp_in_parallel()); } #else { return false; } #endif } }; //! @} RcppArmadillo/inst/include/armadillo_bits/xtrans_mat_meat.hpp0000644000176200001440000000376014124060717024277 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup xtrans_mat //! @{ template inline xtrans_mat::xtrans_mat(const Mat& in_X) : X (in_X ) , n_rows(in_X.n_cols) // deliberately swapped , n_cols(in_X.n_rows) , n_elem(in_X.n_elem) { arma_extra_debug_sigprint(); } template inline void xtrans_mat::extract(Mat& out) const { arma_extra_debug_sigprint(); really_do_conj ? op_htrans::apply_mat(out, X) : op_strans::apply_mat(out, X); } template inline eT xtrans_mat::operator[](const uword ii) const { if(Y.n_elem > 0) { return Y[ii]; } else { really_do_conj ? op_htrans::apply_mat(Y, X) : op_strans::apply_mat(Y, X); return Y[ii]; } } template inline eT xtrans_mat::at_alt(const uword ii) const { return (*this).operator[](ii); } template arma_inline eT xtrans_mat::at(const uword in_row, const uword in_col) const { return really_do_conj ? eT(access::alt_conj(X.at(in_col, in_row))) : eT(X.at(in_col, in_row)); // in_row and in_col deliberately swapped above } //! @} RcppArmadillo/inst/include/armadillo_bits/op_min_meat.hpp0000644000176200001440000006517514124060717023410 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_min //! @{ template inline void op_min::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "min(): parameter 'dim' must be 0 or 1" ); const quasi_unwrap U(in.m); const Mat& X = U.M; if(U.is_alias(out) == false) { op_min::apply_noalias(out, X, dim); } else { Mat tmp; op_min::apply_noalias(tmp, X, dim); out.steal_mem(tmp); } } template inline void op_min::apply_noalias(Mat& out, const Mat& X, const uword dim, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(dim == 0) { arma_extra_debug_print("op_min::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols); if(X_n_rows == 0) { return; } eT* out_mem = out.memptr(); for(uword col=0; col 0) ? 1 : 0); if(X_n_cols == 0) { return; } eT* out_mem = out.memptr(); arrayops::copy(out_mem, X.colptr(0), X_n_rows); for(uword col=1; col inline void op_min::apply_noalias(Mat& out, const Mat& X, const uword dim, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(dim == 0) { arma_extra_debug_print("op_min::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols); if(X_n_rows == 0) { return; } eT* out_mem = out.memptr(); for(uword col=0; col 0) ? 1 : 0); if(X_n_cols == 0) { return; } eT* out_mem = out.memptr(); for(uword row=0; row inline void op_min::apply(Cube& out, const OpCube& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 2), "min(): parameter 'dim' must be 0 or 1 or 2" ); const unwrap_cube U(in.m); if(U.is_alias(out) == false) { op_min::apply_noalias(out, U.M, dim); } else { Cube tmp; op_min::apply_noalias(tmp, U.M, dim); out.steal_mem(tmp); } } template inline void op_min::apply_noalias(Cube& out, const Cube& X, const uword dim, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword X_n_slices = X.n_slices; if(dim == 0) { arma_extra_debug_print("op_min::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols, X_n_slices); if(X_n_rows == 0) { return; } for(uword slice=0; slice < X_n_slices; ++slice) { eT* out_mem = out.slice_memptr(slice); for(uword col=0; col < X_n_cols; ++col) { out_mem[col] = op_min::direct_min( X.slice_colptr(slice,col), X_n_rows ); } } } else if(dim == 1) { arma_extra_debug_print("op_min::apply(): dim = 1"); out.set_size(X_n_rows, (X_n_cols > 0) ? 1 : 0, X_n_slices); if(X_n_cols == 0) { return; } for(uword slice=0; slice < X_n_slices; ++slice) { eT* out_mem = out.slice_memptr(slice); arrayops::copy(out_mem, X.slice_colptr(slice,0), X_n_rows); for(uword col=1; col < X_n_cols; ++col) { const eT* col_mem = X.slice_colptr(slice,col); for(uword row=0; row < X_n_rows; ++row) { const eT col_val = col_mem[row]; if(col_val < out_mem[row]) { out_mem[row] = col_val; } } } } } else if(dim == 2) { arma_extra_debug_print("op_min::apply(): dim = 2"); out.set_size(X_n_rows, X_n_cols, (X_n_slices > 0) ? 1 : 0); if(X_n_slices == 0) { return; } const uword N = X.n_elem_slice; eT* out_mem = out.slice_memptr(0); arrayops::copy(out_mem, X.slice_memptr(0), N); for(uword slice=1; slice < X_n_slices; ++slice) { const eT* X_mem = X.slice_memptr(slice); for(uword i=0; i < N; ++i) { const eT val = X_mem[i]; if(val < out_mem[i]) { out_mem[i] = val; } } } } } template inline void op_min::apply_noalias(Cube& out, const Cube& X, const uword dim, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword X_n_slices = X.n_slices; if(dim == 0) { arma_extra_debug_print("op_min::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols, X_n_slices); if(X_n_rows == 0) { return; } for(uword slice=0; slice < X_n_slices; ++slice) { eT* out_mem = out.slice_memptr(slice); for(uword col=0; col < X_n_cols; ++col) { out_mem[col] = op_min::direct_min( X.slice_colptr(slice,col), X_n_rows ); } } } else if(dim == 1) { arma_extra_debug_print("op_min::apply(): dim = 1"); out.set_size(X_n_rows, (X_n_cols > 0) ? 1 : 0, X_n_slices); if(X_n_cols == 0) { return; } for(uword slice=0; slice < X_n_slices; ++slice) { eT* out_mem = out.slice_memptr(slice); const Mat tmp('j', X.slice_memptr(slice), X_n_rows, X_n_cols); for(uword row=0; row < X_n_rows; ++row) { out_mem[row] = op_min::direct_min(tmp, row); } } } else if(dim == 2) { arma_extra_debug_print("op_min::apply(): dim = 2"); out.set_size(X_n_rows, X_n_cols, (X_n_slices > 0) ? 1 : 0); if(X_n_slices == 0) { return; } const uword N = X.n_elem_slice; eT* out_mem = out.slice_memptr(0); arrayops::copy(out_mem, X.slice_memptr(0), N); for(uword slice=1; slice < X_n_slices; ++slice) { const eT* X_mem = X.slice_memptr(slice); for(uword i=0; i < N; ++i) { const eT& val = X_mem[i]; if(std::abs(val) < std::abs(out_mem[i])) { out_mem[i] = val; } } } } } template inline eT op_min::direct_min(const eT* const X, const uword n_elem) { arma_extra_debug_sigprint(); eT min_val = priv::most_pos(); uword i,j; for(i=0, j=1; j inline eT op_min::direct_min(const eT* const X, const uword n_elem, uword& index_of_min_val) { arma_extra_debug_sigprint(); eT min_val = priv::most_pos(); uword best_index = 0; uword i,j; for(i=0, j=1; j inline eT op_min::direct_min(const Mat& X, const uword row) { arma_extra_debug_sigprint(); const uword X_n_cols = X.n_cols; eT min_val = priv::most_pos(); uword i,j; for(i=0, j=1; j < X_n_cols; i+=2, j+=2) { const eT tmp_i = X.at(row,i); const eT tmp_j = X.at(row,j); if(tmp_i < min_val) { min_val = tmp_i; } if(tmp_j < min_val) { min_val = tmp_j; } } if(i < X_n_cols) { const eT tmp_i = X.at(row,i); if(tmp_i < min_val) { min_val = tmp_i; } } return min_val; } template inline eT op_min::min(const subview& X) { arma_extra_debug_sigprint(); if(X.n_elem == 0) { arma_debug_check(true, "min(): object has no elements"); return Datum::nan; } const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; eT min_val = priv::most_pos(); if(X_n_rows == 1) { const Mat& A = X.m; const uword start_row = X.aux_row1; const uword start_col = X.aux_col1; const uword end_col_p1 = start_col + X_n_cols; uword i,j; for(i=start_col, j=start_col+1; j < end_col_p1; i+=2, j+=2) { const eT tmp_i = A.at(start_row, i); const eT tmp_j = A.at(start_row, j); if(tmp_i < min_val) { min_val = tmp_i; } if(tmp_j < min_val) { min_val = tmp_j; } } if(i < end_col_p1) { const eT tmp_i = A.at(start_row, i); if(tmp_i < min_val) { min_val = tmp_i; } } } else { for(uword col=0; col < X_n_cols; ++col) { min_val = (std::min)(min_val, op_min::direct_min(X.colptr(col), X_n_rows)); } } return min_val; } template inline typename arma_not_cx::result op_min::min(const Base& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy P(X.get_ref()); const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "min(): object has no elements"); return Datum::nan; } eT min_val = priv::most_pos(); if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; ea_type A = P.get_ea(); uword i,j; for(i=0, j=1; j inline typename arma_not_cx::result op_min::min(const BaseCube& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const ProxyCube P(X.get_ref()); const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "min(): object has no elements"); return Datum::nan; } eT min_val = priv::most_pos(); if(ProxyCube::use_at == false) { typedef typename ProxyCube::ea_type ea_type; ea_type A = P.get_ea(); uword i,j; for(i=0, j=1; j inline typename arma_not_cx::result op_min::min_with_index(const Proxy& P, uword& index_of_min_val) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "min(): object has no elements"); return Datum::nan; } eT best_val = priv::most_pos(); uword best_index = 0; if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; ea_type A = P.get_ea(); for(uword i=0; i inline typename arma_not_cx::result op_min::min_with_index(const ProxyCube& P, uword& index_of_min_val) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "min(): object has no elements"); return Datum::nan; } eT best_val = priv::most_pos(); uword best_index = 0; if(ProxyCube::use_at == false) { typedef typename ProxyCube::ea_type ea_type; ea_type A = P.get_ea(); for(uword i=0; i < n_elem; ++i) { const eT tmp = A[i]; if(tmp < best_val) { best_val = tmp; best_index = i; } } } else { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_slices = P.get_n_slices(); uword count = 0; for(uword slice=0; slice < n_slices; ++slice) for(uword col=0; col < n_cols; ++col ) for(uword row=0; row < n_rows; ++row ) { const eT tmp = P.at(row,col,slice); if(tmp < best_val) { best_val = tmp; best_index = count; } ++count; } } index_of_min_val = best_index; return best_val; } template inline std::complex op_min::direct_min(const std::complex* const X, const uword n_elem) { arma_extra_debug_sigprint(); uword index = 0; T min_val = priv::most_pos(); for(uword i=0; i inline std::complex op_min::direct_min(const std::complex* const X, const uword n_elem, uword& index_of_min_val) { arma_extra_debug_sigprint(); uword index = 0; T min_val = priv::most_pos(); for(uword i=0; i inline std::complex op_min::direct_min(const Mat< std::complex >& X, const uword row) { arma_extra_debug_sigprint(); const uword X_n_cols = X.n_cols; uword index = 0; T min_val = priv::most_pos(); for(uword col=0; col inline std::complex op_min::min(const subview< std::complex >& X) { arma_extra_debug_sigprint(); typedef typename std::complex eT; if(X.n_elem == 0) { arma_debug_check(true, "min(): object has no elements"); return Datum::nan; } const Mat& A = X.m; const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword start_row = X.aux_row1; const uword start_col = X.aux_col1; const uword end_row_p1 = start_row + X_n_rows; const uword end_col_p1 = start_col + X_n_cols; T min_val = priv::most_pos(); uword best_row = 0; uword best_col = 0; if(X_n_rows == 1) { best_col = 0; for(uword col=start_col; col < end_col_p1; ++col) { const T tmp_val = std::abs( A.at(start_row, col) ); if(tmp_val < min_val) { min_val = tmp_val; best_col = col; } } best_row = start_row; } else { for(uword col=start_col; col < end_col_p1; ++col) for(uword row=start_row; row < end_row_p1; ++row) { const T tmp_val = std::abs( A.at(row, col) ); if(tmp_val < min_val) { min_val = tmp_val; best_row = row; best_col = col; } } } return A.at(best_row, best_col); } template inline typename arma_cx_only::result op_min::min(const Base& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; const Proxy P(X.get_ref()); const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "min(): object has no elements"); return Datum::nan; } T min_val = priv::most_pos(); if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; ea_type A = P.get_ea(); uword index = 0; for(uword i=0; i inline typename arma_cx_only::result op_min::min(const BaseCube& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; const ProxyCube P(X.get_ref()); const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "min(): object has no elements"); return Datum::nan; } T min_val = priv::most_pos(); if(ProxyCube::use_at == false) { typedef typename ProxyCube::ea_type ea_type; ea_type A = P.get_ea(); uword index = 0; for(uword i=0; i inline typename arma_cx_only::result op_min::min_with_index(const Proxy& P, uword& index_of_min_val) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "min(): object has no elements"); return Datum::nan; } T best_val = priv::most_pos(); if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; ea_type A = P.get_ea(); uword best_index = 0; for(uword i=0; i inline typename arma_cx_only::result op_min::min_with_index(const ProxyCube& P, uword& index_of_min_val) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename get_pod_type::result T; const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "min(): object has no elements"); return Datum::nan; } T best_val = priv::most_pos(); if(ProxyCube::use_at == false) { typedef typename ProxyCube::ea_type ea_type; ea_type A = P.get_ea(); uword best_index = 0; for(uword i=0; i < n_elem; ++i) { const T tmp = std::abs(A[i]); if(tmp < best_val) { best_val = tmp; best_index = i; } } index_of_min_val = best_index; return( A[best_index] ); } else { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_slices = P.get_n_slices(); eT best_val_orig = eT(0); uword best_index = 0; uword count = 0; for(uword slice=0; slice < n_slices; ++slice) for(uword col=0; col < n_cols; ++col ) for(uword row=0; row < n_rows; ++row ) { const eT tmp_orig = P.at(row,col,slice); const T tmp = std::abs(tmp_orig); if(tmp < best_val) { best_val = tmp; best_val_orig = tmp_orig; best_index = count; } ++count; } index_of_min_val = best_index; return best_val_orig; } } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_hypot_meat.hpp0000644000176200001440000001007414124060717024272 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_hypot //! @{ template inline void glue_hypot::apply(Mat& out, const Glue& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy P1(expr.A); const Proxy P2(expr.B); arma_assert_same_size(P1, P2, "hypot()"); const bool bad_alias = ( (Proxy::has_subview && P1.is_alias(out)) || (Proxy::has_subview && P2.is_alias(out)) ); if(bad_alias == false) { glue_hypot::apply_noalias(out, P1, P2); } else { Mat tmp; glue_hypot::apply_noalias(tmp, P1, P2); out.steal_mem(tmp); } } template inline void glue_hypot::apply_noalias(Mat& out, const Proxy& P1, const Proxy& P2) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = P1.get_n_rows(); const uword n_cols = P1.get_n_cols(); out.set_size(n_rows, n_cols); eT* out_mem = out.memptr(); if( (Proxy::use_at == false) && (Proxy::use_at == false) ) { typename Proxy::ea_type eaP1 = P1.get_ea(); typename Proxy::ea_type eaP2 = P2.get_ea(); const uword N = P1.get_n_elem(); for(uword i=0; i inline void glue_hypot::apply(Cube& out, const GlueCube& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const ProxyCube P1(expr.A); const ProxyCube P2(expr.B); arma_assert_same_size(P1, P2, "hypot()"); const bool bad_alias = ( (ProxyCube::has_subview && P1.is_alias(out)) || (ProxyCube::has_subview && P2.is_alias(out)) ); if(bad_alias == false) { glue_hypot::apply_noalias(out, P1, P2); } else { Cube tmp; glue_hypot::apply_noalias(tmp, P1, P2); out.steal_mem(tmp); } } template inline void glue_hypot::apply_noalias(Cube& out, const ProxyCube& P1, const ProxyCube& P2) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = P1.get_n_rows(); const uword n_cols = P1.get_n_cols(); const uword n_slices = P1.get_n_slices(); out.set_size(n_rows, n_cols, n_slices); eT* out_mem = out.memptr(); if( (ProxyCube::use_at == false) && (ProxyCube::use_at == false) ) { typename ProxyCube::ea_type eaP1 = P1.get_ea(); typename ProxyCube::ea_type eaP2 = P2.get_ea(); const uword N = P1.get_n_elem(); for(uword i=0; i inline static void randn_dual_val(eT& out1, eT& out2); template inline static void randi_fill(eT* mem, const uword N, const int a, const int b); inline static int randi_max_val(); }; inline void arma_rng_cxx98::set_seed(const arma_rng_cxx98::seed_type val) { std::srand(val); } arma_inline int arma_rng_cxx98::randi_val() { #if (RAND_MAX == 32767) { // NOTE: this is a better-than-nothing solution // NOTE: see also arma_rng_cxx98::randi_max_val() u32 val1 = u32(std::rand()); u32 val2 = u32(std::rand()); val1 <<= 15; return (val1 | val2); } #else { return std::rand(); } #endif } arma_inline double arma_rng_cxx98::randu_val() { return double( double(randi_val()) * ( double(1) / double(randi_max_val()) ) ); } inline double arma_rng_cxx98::randn_val() { // polar form of the Box-Muller transformation: // http://en.wikipedia.org/wiki/Box-Muller_transformation // http://en.wikipedia.org/wiki/Marsaglia_polar_method double tmp1 = double(0); double tmp2 = double(0); double w = double(0); do { tmp1 = double(2) * double(randi_val()) * (double(1) / double(randi_max_val())) - double(1); tmp2 = double(2) * double(randi_val()) * (double(1) / double(randi_max_val())) - double(1); w = tmp1*tmp1 + tmp2*tmp2; } while( w >= double(1) ); return double( tmp1 * std::sqrt( (double(-2) * std::log(w)) / w) ); } template inline void arma_rng_cxx98::randn_dual_val(eT& out1, eT& out2) { // make sure we are internally using at least floats typedef typename promote_type::result eTp; eTp tmp1 = eTp(0); eTp tmp2 = eTp(0); eTp w = eTp(0); do { tmp1 = eTp(2) * eTp(randi_val()) * (eTp(1) / eTp(randi_max_val())) - eTp(1); tmp2 = eTp(2) * eTp(randi_val()) * (eTp(1) / eTp(randi_max_val())) - eTp(1); w = tmp1*tmp1 + tmp2*tmp2; } while( w >= eTp(1) ); const eTp k = std::sqrt( (eTp(-2) * std::log(w)) / w); out1 = eT(tmp1*k); out2 = eT(tmp2*k); } template inline void arma_rng_cxx98::randi_fill(eT* mem, const uword N, const int a, const int b) { if( (a == 0) && (b == RAND_MAX) ) { for(uword i=0; i inline void DoubleShiftQR::compute_reflector(const eT& x1, const eT& x2, const eT& x3, uword ind) { arma_extra_debug_sigprint(); // In general case the reflector affects 3 rows ref_nr(ind) = 3; eT x2x3 = eT(0); // If x3 is zero, decrease nr by 1 if(std::abs(x3) < prec) { // If x2 is also zero, nr will be 1, and we can exit this function if(std::abs(x2) < prec) { ref_nr(ind) = 1; return; } else { ref_nr(ind) = 2; } x2x3 = std::abs(x2); } else { x2x3 = arma_hypot(x2, x3); } // x1' = x1 - rho * ||x|| // rho = -sign(x1), if x1 == 0, we choose rho = 1 eT x1_new = x1 - ((x1 <= 0) - (x1 > 0)) * arma_hypot(x1, x2x3); eT x_norm = arma_hypot(x1_new, x2x3); // Double check the norm of new x if(x_norm < prec) { ref_nr(ind) = 1; return; } ref_u(0, ind) = x1_new / x_norm; ref_u(1, ind) = x2 / x_norm; ref_u(2, ind) = x3 / x_norm; } template arma_inline void DoubleShiftQR::compute_reflector(const eT* x, uword ind) { arma_extra_debug_sigprint(); compute_reflector(x[0], x[1], x[2], ind); } template inline void DoubleShiftQR::update_block(uword il, uword iu) { arma_extra_debug_sigprint(); // Block size uword bsize = iu - il + 1; // If block size == 1, there is no need to apply reflectors if(bsize == 1) { ref_nr(il) = 1; return; } // For block size == 2, do a Givens rotation on M = X * X - s * X + t * I if(bsize == 2) { // m00 = x00 * (x00 - s) + x01 * x10 + t eT m00 = mat_H(il, il) * (mat_H(il, il) - shift_s) + mat_H(il, il + 1) * mat_H(il + 1, il) + shift_t; // m10 = x10 * (x00 + x11 - s) eT m10 = mat_H(il + 1, il) * (mat_H(il, il) + mat_H(il + 1, il + 1) - shift_s); // This causes nr=2 compute_reflector(m00, m10, 0, il); // Apply the reflector to X apply_PX(mat_H, il, il, 2, n - il, il); apply_XP(mat_H, 0, il, il + 2, 2, il); ref_nr(il + 1) = 1; return; } // For block size >=3, use the regular strategy eT m00 = mat_H(il, il) * (mat_H(il, il) - shift_s) + mat_H(il, il + 1) * mat_H(il + 1, il) + shift_t; eT m10 = mat_H(il + 1, il) * (mat_H(il, il) + mat_H(il + 1, il + 1) - shift_s); // m20 = x21 * x10 eT m20 = mat_H(il + 2, il + 1) * mat_H(il + 1, il); compute_reflector(m00, m10, m20, il); // Apply the first reflector apply_PX(mat_H, il, il, 3, n - il, il); apply_XP(mat_H, 0, il, il + (std::min)(bsize, uword(4)), 3, il); // Calculate the following reflectors // If entering this loop, block size is at least 4. for(uword i = 1; i < bsize - 2; i++) { compute_reflector(mat_H.colptr(il + i - 1) + il + i, il + i); // Apply the reflector to X apply_PX(mat_H, il + i, il + i - 1, 3, n + 1 - il - i, il + i); apply_XP(mat_H, 0, il + i, il + (std::min)(bsize, uword(i + 4)), 3, il + i); } // The last reflector // This causes nr=2 compute_reflector(mat_H(iu - 1, iu - 2), mat_H(iu, iu - 2), 0, iu - 1); // Apply the reflector to X apply_PX(mat_H, iu - 1, iu - 2, 2, n + 2 - iu, iu - 1); apply_XP(mat_H, 0, iu - 1, il + bsize, 2, iu - 1); ref_nr(iu) = 1; } template inline void DoubleShiftQR::apply_PX(Mat& X, uword oi, uword oj, uword nrow, uword ncol, uword u_ind) { arma_extra_debug_sigprint(); if(ref_nr(u_ind) == 1) { return; } // Householder reflectors at index u_ind Col u(ref_u.colptr(u_ind), 3, false); const uword stride = X.n_rows; const eT u0_2 = 2 * u(0); const eT u1_2 = 2 * u(1); eT* xptr = &X(oi, oj); if(ref_nr(u_ind) == 2 || nrow == 2) { for(uword i = 0; i < ncol; i++, xptr += stride) { eT tmp = u0_2 * xptr[0] + u1_2 * xptr[1]; xptr[0] -= tmp * u(0); xptr[1] -= tmp * u(1); } } else { const eT u2_2 = 2 * u(2); for(uword i = 0; i < ncol; i++, xptr += stride) { eT tmp = u0_2 * xptr[0] + u1_2 * xptr[1] + u2_2 * xptr[2]; xptr[0] -= tmp * u(0); xptr[1] -= tmp * u(1); xptr[2] -= tmp * u(2); } } } template inline void DoubleShiftQR::apply_PX(eT* x, uword u_ind) { arma_extra_debug_sigprint(); if(ref_nr(u_ind) == 1) { return; } eT u0 = ref_u(0, u_ind), u1 = ref_u(1, u_ind), u2 = ref_u(2, u_ind); // When the reflector only contains two elements, u2 has been set to zero bool nr_is_2 = (ref_nr(u_ind) == 2); eT dot2 = x[0] * u0 + x[1] * u1 + (nr_is_2 ? 0 : (x[2] * u2)); dot2 *= 2; x[0] -= dot2 * u0; x[1] -= dot2 * u1; if(!nr_is_2) { x[2] -= dot2 * u2; } } template inline void DoubleShiftQR::apply_XP(Mat& X, uword oi, uword oj, uword nrow, uword ncol, uword u_ind) { arma_extra_debug_sigprint(); if(ref_nr(u_ind) == 1) { return; } // Householder reflectors at index u_ind Col u(ref_u.colptr(u_ind), 3, false); uword stride = X.n_rows; const eT u0_2 = 2 * u(0); const eT u1_2 = 2 * u(1); eT* X0 = &X(oi, oj); eT* X1 = X0 + stride; // X0 => X(oi, oj), X1 => X(oi, oj + 1) if(ref_nr(u_ind) == 2 || ncol == 2) { // tmp = 2 * u0 * X0 + 2 * u1 * X1 // X0 => X0 - u0 * tmp // X1 => X1 - u1 * tmp for(uword i = 0; i < nrow; i++) { eT tmp = u0_2 * X0[i] + u1_2 * X1[i]; X0[i] -= tmp * u(0); X1[i] -= tmp * u(1); } } else { eT* X2 = X1 + stride; // X2 => X(oi, oj + 2) const eT u2_2 = 2 * u(2); for(uword i = 0; i < nrow; i++) { eT tmp = u0_2 * X0[i] + u1_2 * X1[i] + u2_2 * X2[i]; X0[i] -= tmp * u(0); X1[i] -= tmp * u(1); X2[i] -= tmp * u(2); } } } template inline DoubleShiftQR::DoubleShiftQR(uword size) : n(size) , prec(std::numeric_limits::epsilon()) , eps_rel(prec) , eps_abs(prec) , computed(false) { arma_extra_debug_sigprint(); } template inline DoubleShiftQR::DoubleShiftQR(const Mat& mat_obj, eT s, eT t) : n(mat_obj.n_rows) , mat_H(n, n) , shift_s(s) , shift_t(t) , ref_u(3, n) , ref_nr(n) , prec(std::numeric_limits::epsilon()) , eps_rel(prec) , eps_abs(prec) , computed(false) { arma_extra_debug_sigprint(); compute(mat_obj, s, t); } template void DoubleShiftQR::compute(const Mat& mat_obj, eT s, eT t) { arma_extra_debug_sigprint(); arma_debug_check( (mat_obj.is_square() == false), "newarp::DoubleShiftQR::compute(): matrix must be square" ); n = mat_obj.n_rows; mat_H.set_size(n, n); shift_s = s; shift_t = t; ref_u.set_size(3, n); ref_nr.set_size(n); // Make a copy of mat_obj mat_H = mat_obj; // 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(n - 1); zero_ind.push_back(0); eT* Hii = mat_H.memptr(); for(uword i = 0; i < n - 2; i++, Hii += (n + 1)) { // Hii[1] => mat_H(i + 1, i) const eT h = std::abs(Hii[1]); if(h <= eps_abs || h <= eps_rel * (std::abs(Hii[0]) + std::abs(Hii[n + 1]))) { Hii[1] = 0; zero_ind.push_back(i + 1); } // Make sure mat_H is upper Hessenberg // Zero the elements below mat_H(i + 1, i) std::fill(Hii + 2, Hii + n - i, eT(0)); } zero_ind.push_back(n); for(std::vector::size_type i = 0; i < zero_ind.size() - 1; i++) { uword start = zero_ind[i]; uword end = zero_ind[i + 1] - 1; // Compute refelctors from each block X update_block(start, end); } computed = true; } template Mat DoubleShiftQR::matrix_QtHQ() { arma_extra_debug_sigprint(); arma_debug_check( (computed == false), "newarp::DoubleShiftQR::matrix_QtHQ(): need to call compute() first" ); return mat_H; } template inline void DoubleShiftQR::apply_QtY(Col& y) { arma_extra_debug_sigprint(); arma_debug_check( (computed == false), "newarp::DoubleShiftQR::apply_QtY(): need to call compute() first" ); eT* y_ptr = y.memptr(); for(uword i = 0; i < n - 1; i++, y_ptr++) { apply_PX(y_ptr, i); } } template inline void DoubleShiftQR::apply_YQ(Mat& Y) { arma_extra_debug_sigprint(); arma_debug_check( (computed == false), "newarp::DoubleShiftQR::apply_YQ(): need to call compute() first" ); uword nrow = Y.n_rows; for(uword i = 0; i < n - 2; i++) { apply_XP(Y, 0, i, nrow, 3, i); } apply_XP(Y, 0, n - 2, nrow, 2, n - 2); } } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/spglue_merge_bones.hpp0000644000176200001440000000252414124060717024752 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_merge //! @{ class spglue_merge { public: template arma_hot inline static void subview_merge(SpSubview& sv, const SpMat& B); template arma_hot inline static void subview_merge(SpSubview& sv, const Mat& B); template arma_hot inline static void symmat_merge(SpMat& out, const SpMat& A, const SpMat& B); template arma_hot inline static void diagview_merge(SpMat& out, const SpMat& A, const SpMat& B); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_ones.hpp0000644000176200001440000000747714124060717022551 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_ones //! @{ arma_warn_unused arma_inline const Gen ones(const uword n_elem) { arma_extra_debug_sigprint(); return Gen(n_elem, 1); } template arma_warn_unused arma_inline const Gen ones(const uword n_elem, const arma_empty_class junk1 = arma_empty_class(), const typename arma_Mat_Col_Row_only::result* junk2 = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); if(is_Row::value) { return Gen(1, n_elem); } else { return Gen(n_elem, 1); } } arma_warn_unused arma_inline const Gen ones(const uword n_rows, const uword n_cols) { arma_extra_debug_sigprint(); return Gen(n_rows, n_cols); } arma_warn_unused arma_inline const Gen ones(const SizeMat& s) { arma_extra_debug_sigprint(); return Gen(s.n_rows, s.n_cols); } template arma_warn_unused inline const Gen ones(const uword n_rows, const uword n_cols, const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); if(is_Col::value) { arma_debug_check( (n_cols != 1), "ones(): incompatible size" ); } else if(is_Row::value) { arma_debug_check( (n_rows != 1), "ones(): incompatible size" ); } return Gen(n_rows, n_cols); } template arma_warn_unused inline const Gen ones(const SizeMat& s, const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return ones(s.n_rows, s.n_cols); } arma_warn_unused arma_inline const GenCube ones(const uword n_rows, const uword n_cols, const uword n_slices) { arma_extra_debug_sigprint(); return GenCube(n_rows, n_cols, n_slices); } arma_warn_unused arma_inline const GenCube ones(const SizeCube& s) { arma_extra_debug_sigprint(); return GenCube(s.n_rows, s.n_cols, s.n_slices); } template arma_warn_unused arma_inline const GenCube ones(const uword n_rows, const uword n_cols, const uword n_slices, const typename arma_Cube_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return GenCube(n_rows, n_cols, n_slices); } template arma_warn_unused arma_inline const GenCube ones(const SizeCube& s, const typename arma_Cube_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return GenCube(s.n_rows, s.n_cols, s.n_slices); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_expmat.hpp0000644000176200001440000000445514124060717023074 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_expmat //! @{ template arma_warn_unused inline typename enable_if2 < is_real::value, const Op >::result expmat(const Base& A) { arma_extra_debug_sigprint(); return Op(A.get_ref()); } template inline typename enable_if2 < is_real::value, bool >::result expmat(Mat& B, const Base& A) { arma_extra_debug_sigprint(); const bool status = op_expmat::apply_direct(B, A); if(status == false) { B.soft_reset(); arma_debug_warn_level(3, "expmat(): given matrix appears ill-conditioned"); } return status; } // template arma_warn_unused arma_inline typename enable_if2< is_supported_blas_type::value, const Op >::result expmat_sym(const Base& X) { arma_extra_debug_sigprint(); return Op(X.get_ref()); } template inline typename enable_if2< is_supported_blas_type::value, bool >::result expmat_sym(Mat& Y, const Base& X) { arma_extra_debug_sigprint(); const bool status = op_expmat_sym::apply_direct(Y, X.get_ref()); if(status == false) { Y.soft_reset(); arma_debug_warn_level(3, "expmat_sym(): transformation failed"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_det.hpp0000644000176200001440000000367614124060717022356 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_det //! @{ template arma_warn_unused inline typename enable_if2< is_supported_blas_type::value, typename T1::elem_type >::result det(const Base& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; eT out_val = eT(0); const bool status = op_det::apply_direct(out_val, X.get_ref()); if(status == false) { out_val = eT(0); arma_stop_runtime_error("det(): failed to find determinant"); } return out_val; } template inline typename enable_if2< is_supported_blas_type::value, bool >::result det(typename T1::elem_type& out_val, const Base& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const bool status = op_det::apply_direct(out_val, X.get_ref()); if(status == false) { out_val = eT(0); arma_debug_warn_level(3, "det(): failed to find determinant"); } return status; } template arma_warn_unused arma_inline typename arma_scalar_only::result det(const T& x) { return x; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_diff_meat.hpp0000644000176200001440000001165614124060717023530 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_diff //! @{ template inline void op_diff::apply_noalias(Mat& out, const Mat& X, const uword k, const uword dim) { arma_extra_debug_sigprint(); uword n_rows = X.n_rows; uword n_cols = X.n_cols; if(dim == 0) { if(n_rows <= k) { out.set_size(0,n_cols); return; } --n_rows; out.set_size(n_rows,n_cols); for(uword col=0; col < n_cols; ++col) { eT* out_colmem = out.colptr(col); const eT* X_colmem = X.colptr(col); for(uword row=0; row < n_rows; ++row) { const eT val0 = X_colmem[row ]; const eT val1 = X_colmem[row+1]; out_colmem[row] = val1 - val0; } } if(k >= 2) { for(uword iter=2; iter <= k; ++iter) { --n_rows; for(uword col=0; col < n_cols; ++col) { eT* colmem = out.colptr(col); for(uword row=0; row < n_rows; ++row) { const eT val0 = colmem[row ]; const eT val1 = colmem[row+1]; colmem[row] = val1 - val0; } } } out = out( span(0,n_rows-1), span::all ); } } else if(dim == 1) { if(n_cols <= k) { out.set_size(n_rows,0); return; } --n_cols; out.set_size(n_rows,n_cols); if(n_rows == 1) { const eT* X_mem = X.memptr(); eT* out_mem = out.memptr(); for(uword col=0; col < n_cols; ++col) { const eT val0 = X_mem[col ]; const eT val1 = X_mem[col+1]; out_mem[col] = val1 - val0; } } else { for(uword col=0; col < n_cols; ++col) { eT* out_col_mem = out.colptr(col); const eT* X_col0_mem = X.colptr(col ); const eT* X_col1_mem = X.colptr(col+1); for(uword row=0; row < n_rows; ++row) { out_col_mem[row] = X_col1_mem[row] - X_col0_mem[row]; } } } if(k >= 2) { for(uword iter=2; iter <= k; ++iter) { --n_cols; if(n_rows == 1) { eT* out_mem = out.memptr(); for(uword col=0; col < n_cols; ++col) { const eT val0 = out_mem[col ]; const eT val1 = out_mem[col+1]; out_mem[col] = val1 - val0; } } else { for(uword col=0; col < n_cols; ++col) { eT* col0_mem = out.colptr(col ); const eT* col1_mem = out.colptr(col+1); for(uword row=0; row < n_rows; ++row) { col0_mem[row] = col1_mem[row] - col0_mem[row]; } } } } out = out( span::all, span(0,n_cols-1) ); } } } template inline void op_diff::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword k = in.aux_uword_a; const uword dim = in.aux_uword_b; arma_debug_check( (dim > 1), "diff(): parameter 'dim' must be 0 or 1" ); if(k == 0) { out = in.m; return; } const quasi_unwrap U(in.m); if(U.is_alias(out)) { Mat tmp; op_diff::apply_noalias(tmp, U.M, k, dim); out.steal_mem(tmp); } else { op_diff::apply_noalias(out, U.M, k, dim); } } template inline void op_diff_vec::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword k = in.aux_uword_a; if(k == 0) { out = in.m; return; } const quasi_unwrap U(in.m); const uword dim = (T1::is_xvec) ? uword(U.M.is_rowvec() ? 1 : 0) : uword((T1::is_row) ? 1 : 0); if(U.is_alias(out)) { Mat tmp; op_diff::apply_noalias(tmp, U.M, k, dim); out.steal_mem(tmp); } else { op_diff::apply_noalias(out, U.M, k, dim); } } //! @} RcppArmadillo/inst/include/armadillo_bits/sp_auxlib_bones.hpp0000644000176200001440000002043514124060717024263 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup sp_auxlib //! @{ //! wrapper for accesing external functions in ARPACK and SuperLU class sp_auxlib { public: enum form_type { form_none, form_lm, form_sm, form_lr, form_la, form_sr, form_li, form_si, form_sa, form_sigma }; inline static form_type interpret_form_str(const char* form_str); // // eigs_sym() for real matrices template inline static bool eigs_sym(Col& eigval, Mat& eigvec, const SpBase& X, const uword n_eigvals, const form_type form_val, const eigs_opts& opts); template inline static bool eigs_sym(Col& eigval, Mat& eigvec, const SpBase& X, const uword n_eigvals, const eT sigma, const eigs_opts& opts); template inline static bool eigs_sym_newarp(Col& eigval, Mat& eigvec, const SpMat& X, const uword n_eigvals, const form_type form_val, const eigs_opts& opts); template inline static bool eigs_sym_newarp(Col& eigval, Mat& eigvec, const SpMat& X, const uword n_eigvals, const eT sigma, const eigs_opts& opts); template inline static bool eigs_sym_arpack(Col& eigval, Mat& eigvec, const SpMat& X, const uword n_eigvals, const form_type form_val, const eT sigma, const eigs_opts& opts); // // eigs_gen() for real matrices template inline static bool eigs_gen(Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpBase& X, const uword n_eigvals, const form_type form_val, const eigs_opts& opts); template inline static bool eigs_gen(Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpBase& X, const uword n_eigvals, const std::complex sigma, const eigs_opts& opts); template inline static bool eigs_gen_newarp(Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpMat& X, const uword n_eigvals, const form_type form_val, const eigs_opts& opts); template inline static bool eigs_gen_arpack(Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpMat& X, const uword n_eigvals, const form_type form_val, const std::complex sigma, const eigs_opts& opts); // // eigs_gen() for complex matrices template inline static bool eigs_gen(Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpBase< std::complex, T1>& X, const uword n_eigvals, const form_type form_val, const eigs_opts& opts); template inline static bool eigs_gen(Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpBase< std::complex, T1>& X, const uword n_eigvals, const std::complex sigma, const eigs_opts& opts); template inline static bool eigs_gen(Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpMat< std::complex >& X, const uword n_eigvals, const form_type form_val, const std::complex sigma, const eigs_opts& opts); // // spsolve() via SuperLU template inline static bool spsolve_simple(Mat& out, const SpBase& A, const Base& B, const superlu_opts& user_opts); template inline static bool spsolve_refine(Mat& out, typename T1::pod_type& out_rcond, const SpBase& A, const Base& B, const superlu_opts& user_opts); // // // // rcond() via SuperLU // // template // sinline static typename T1::pod_type rcond(const SpBase& A); // // support functions #if defined(ARMA_USE_SUPERLU) template inline static typename get_pod_type::result norm1(superlu::SuperMatrix* A); template inline static typename get_pod_type::result lu_rcond(superlu::SuperMatrix* L, superlu::SuperMatrix* U, typename get_pod_type::result norm_val); inline static void set_superlu_opts(superlu::superlu_options_t& options, const superlu_opts& user_opts); template inline static bool copy_to_supermatrix(superlu::SuperMatrix& out, const SpMat& A); template inline static bool copy_to_supermatrix_with_shift(superlu::SuperMatrix& out, const SpMat& A, const eT shift); // // for debugging only // template // inline static void copy_to_spmat(SpMat& out, const superlu::SuperMatrix& A); template inline static bool wrap_to_supermatrix(superlu::SuperMatrix& out, const Mat& A); inline static void destroy_supermatrix(superlu::SuperMatrix& out); #endif private: // calls arpack saupd()/naupd() because the code is so similar for each // all of the extra variables are later used by seupd()/neupd(), but those // functions are very different and we can't combine their code template inline static void run_aupd_plain ( const uword n_eigvals, char* which, const SpMat& X, const bool sym, blas_int& n, eT& tol, blas_int& maxiter, podarray& resid, blas_int& ncv, podarray& v, blas_int& ldv, podarray& iparam, podarray& ipntr, podarray& workd, podarray& workl, blas_int& lworkl, podarray& rwork, blas_int& info ); template inline static void run_aupd_shiftinvert ( const uword n_eigvals, const T sigma, const SpMat& X, const bool sym, blas_int& n, eT& tol, blas_int& maxiter, podarray& resid, blas_int& ncv, podarray& v, blas_int& ldv, podarray& iparam, podarray& ipntr, podarray& workd, podarray& workl, blas_int& lworkl, podarray& rwork, blas_int& info ); template inline static bool rudimentary_sym_check(const SpMat& X); template inline static bool rudimentary_sym_check(const SpMat< std::complex >& X); }; #if defined(ARMA_USE_SUPERLU) class superlu_supermatrix_wrangler { private: bool used = false; arma_aligned superlu::SuperMatrix m; public: inline ~superlu_supermatrix_wrangler(); inline superlu_supermatrix_wrangler(); inline superlu_supermatrix_wrangler(const superlu_supermatrix_wrangler&) = delete; inline void operator= (const superlu_supermatrix_wrangler&) = delete; inline superlu::SuperMatrix& get_ref(); inline superlu::SuperMatrix* get_ptr(); }; class superlu_stat_wrangler { private: arma_aligned superlu::SuperLUStat_t stat; public: inline ~superlu_stat_wrangler(); inline superlu_stat_wrangler(); inline superlu_stat_wrangler(const superlu_stat_wrangler&) = delete; inline void operator= (const superlu_stat_wrangler&) = delete; inline superlu::SuperLUStat_t* get_ptr(); }; template class superlu_array_wrangler { private: arma_aligned eT* mem = nullptr; public: inline ~superlu_array_wrangler(); inline superlu_array_wrangler(const uword n_elem); inline superlu_array_wrangler() = delete; inline superlu_array_wrangler(const superlu_array_wrangler&) = delete; inline void operator= (const superlu_array_wrangler&) = delete; inline eT* get_ptr(); }; #endif //! @} RcppArmadillo/inst/include/armadillo_bits/op_flip_bones.hpp0000644000176200001440000000315514124060717023725 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_flip //! @{ class op_flipud : public traits_op_passthru { public: template inline static void apply(Mat& out, const Op& in); template inline static void apply_direct(Mat& out, const Mat& X); template inline static void apply_proxy_noalias(Mat& out, const Proxy& P); }; class op_fliplr : public traits_op_passthru { public: template inline static void apply(Mat& out, const Op& in); template inline static void apply_direct(Mat& out, const Mat& X); template inline static void apply_proxy_noalias(Mat& out, const Proxy& P); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_all_meat.hpp0000644000176200001440000002632414124060717023366 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_all //! @{ template inline bool op_all::all_vec_helper(const Base& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy P(X.get_ref()); const uword n_elem = P.get_n_elem(); uword count = 0; if(Proxy::use_at == false) { typename Proxy::ea_type Pea = P.get_ea(); for(uword i=0; i inline bool op_all::all_vec_helper(const subview& X) { arma_extra_debug_sigprint(); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; uword count = 0; if(X_n_rows == 1) { for(uword col=0; col < X_n_cols; ++col) { count += (X.at(0,col) != eT(0)) ? uword(1) : uword(0); } } else { for(uword col=0; col < X_n_cols; ++col) { const eT* X_colmem = X.colptr(col); for(uword row=0; row < X_n_rows; ++row) { count += (X_colmem[row] != eT(0)) ? uword(1) : uword(0); } } } return (X.n_elem == count); } template inline bool op_all::all_vec_helper(const Op& X) { arma_extra_debug_sigprint(); return op_all::all_vec_helper(X.m); } template inline bool op_all::all_vec_helper ( const mtOp& X, const typename arma_op_rel_only::result* junk1, const typename arma_not_cx::result* junk2 ) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); typedef typename T1::elem_type eT; const eT val = X.aux; const Proxy P(X.m); const uword n_elem = P.get_n_elem(); uword count = 0; if(Proxy::use_at == false) { typename Proxy::ea_type Pea = P.get_ea(); for(uword i=0; i < n_elem; ++i) { const eT tmp = Pea[i]; if(is_same_type::yes) { count += (val < tmp) ? uword(1) : uword(0); } else if(is_same_type::yes) { count += (tmp < val) ? uword(1) : uword(0); } else if(is_same_type::yes) { count += (val > tmp) ? uword(1) : uword(0); } else if(is_same_type::yes) { count += (tmp > val) ? uword(1) : uword(0); } else if(is_same_type::yes) { count += (val <= tmp) ? uword(1) : uword(0); } else if(is_same_type::yes) { count += (tmp <= val) ? uword(1) : uword(0); } else if(is_same_type::yes) { count += (val >= tmp) ? uword(1) : uword(0); } else if(is_same_type::yes) { count += (tmp >= val) ? uword(1) : uword(0); } else if(is_same_type::yes) { count += (tmp == val) ? uword(1) : uword(0); } else if(is_same_type::yes) { count += (tmp != val) ? uword(1) : uword(0); } } } else { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { const eT tmp = P.at(row,col); if(is_same_type::yes) { if(val < tmp) { ++count; } } else if(is_same_type::yes) { if(tmp < val) { ++count; } } else if(is_same_type::yes) { if(val > tmp) { ++count; } } else if(is_same_type::yes) { if(tmp > val) { ++count; } } else if(is_same_type::yes) { if(val <= tmp) { ++count; } } else if(is_same_type::yes) { if(tmp <= val) { ++count; } } else if(is_same_type::yes) { if(val >= tmp) { ++count; } } else if(is_same_type::yes) { if(tmp >= val) { ++count; } } else if(is_same_type::yes) { if(tmp == val) { ++count; } } else if(is_same_type::yes) { if(tmp != val) { ++count; } } } } return (n_elem == count); } template inline bool op_all::all_vec_helper ( const mtGlue& X, const typename arma_glue_rel_only::result* junk1, const typename arma_not_cx::result* junk2, const typename arma_not_cx::result* junk3 ) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); arma_ignore(junk3); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename Proxy::ea_type ea_type1; typedef typename Proxy::ea_type ea_type2; const Proxy A(X.A); const Proxy B(X.B); arma_debug_assert_same_size(A, B, "relational operator"); const uword n_elem = A.get_n_elem(); uword count = 0; const bool use_at = (Proxy::use_at || Proxy::use_at); if(use_at == false) { ea_type1 PA = A.get_ea(); ea_type2 PB = B.get_ea(); for(uword i=0; i::yes) { count += (tmp1 < tmp2) ? uword(1) : uword(0); } else if(is_same_type::yes) { count += (tmp1 > tmp2) ? uword(1) : uword(0); } else if(is_same_type::yes) { count += (tmp1 <= tmp2) ? uword(1) : uword(0); } else if(is_same_type::yes) { count += (tmp1 >= tmp2) ? uword(1) : uword(0); } else if(is_same_type::yes) { count += (tmp1 == tmp2) ? uword(1) : uword(0); } else if(is_same_type::yes) { count += (tmp1 != tmp2) ? uword(1) : uword(0); } else if(is_same_type::yes) { count += (tmp1 && tmp2) ? uword(1) : uword(0); } else if(is_same_type::yes) { count += (tmp1 || tmp2) ? uword(1) : uword(0); } } } else { const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { const eT1 tmp1 = A.at(row,col); const eT2 tmp2 = B.at(row,col); if(is_same_type::yes) { if(tmp1 < tmp2) { ++count; } } else if(is_same_type::yes) { if(tmp1 > tmp2) { ++count; } } else if(is_same_type::yes) { if(tmp1 <= tmp2) { ++count; } } else if(is_same_type::yes) { if(tmp1 >= tmp2) { ++count; } } else if(is_same_type::yes) { if(tmp1 == tmp2) { ++count; } } else if(is_same_type::yes) { if(tmp1 != tmp2) { ++count; } } else if(is_same_type::yes) { if(tmp1 && tmp2) { ++count; } } else if(is_same_type::yes) { if(tmp1 || tmp2) { ++count; } } } } return (n_elem == count); } template inline bool op_all::all_vec(T1& X) { arma_extra_debug_sigprint(); return op_all::all_vec_helper(X); } template inline void op_all::apply_helper(Mat& out, const Proxy& P, const uword dim) { arma_extra_debug_sigprint(); const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); typedef typename Proxy::elem_type eT; if(dim == 0) // traverse rows (ie. process each column) { out.zeros(1, n_cols); if(out.n_elem == 0) { return; } uword* out_mem = out.memptr(); if(is_Mat::stored_type>::value) { const unwrap::stored_type> U(P.Q); for(uword col=0; col < n_cols; ++col) { const eT* colmem = U.M.colptr(col); uword count = 0; for(uword row=0; row < n_rows; ++row) { count += (colmem[row] != eT(0)) ? uword(1) : uword(0); } out_mem[col] = (n_rows == count) ? uword(1) : uword(0); } } else { for(uword col=0; col < n_cols; ++col) { uword count = 0; for(uword row=0; row < n_rows; ++row) { if(P.at(row,col) != eT(0)) { ++count; } } out_mem[col] = (n_rows == count) ? uword(1) : uword(0); } } } else { out.zeros(n_rows, 1); uword* out_mem = out.memptr(); // internal dual use of 'out': keep the counts for each row if(is_Mat::stored_type>::value) { const unwrap::stored_type> U(P.Q); for(uword col=0; col < n_cols; ++col) { const eT* colmem = U.M.colptr(col); for(uword row=0; row < n_rows; ++row) { out_mem[row] += (colmem[row] != eT(0)) ? uword(1) : uword(0); } } } else { for(uword col=0; col < n_cols; ++col) { for(uword row=0; row < n_rows; ++row) { if(P.at(row,col) != eT(0)) { ++out_mem[row]; } } } } // see what the counts tell us for(uword row=0; row < n_rows; ++row) { out_mem[row] = (n_cols == out_mem[row]) ? uword(1) : uword(0); } } } template inline void op_all::apply(Mat& out, const mtOp& X) { arma_extra_debug_sigprint(); const uword dim = X.aux_uword_a; const Proxy P(X.m); if(P.is_alias(out) == false) { op_all::apply_helper(out, P, dim); } else { Mat out2; op_all::apply_helper(out2, P, dim); out.steal_mem(out2); } } //! @} RcppArmadillo/inst/include/armadillo_bits/auxlib_bones.hpp0000644000176200001440000004727414160256234023574 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup auxlib //! @{ //! interface functions for accessing decompositions in LAPACK and ATLAS class auxlib { public: // // inv template inline static bool inv(Mat& A); template inline static bool inv(Mat& out, const Mat& X); template inline static bool inv_tr(Mat& A, const uword layout); template inline static bool inv_sympd(Mat& A); template inline static bool inv_sympd(Mat& out, const Mat& X); template inline static bool inv_sympd_rcond(Mat& A, const eT rcond_threshold); template inline static bool inv_sympd_rcond(Mat< std::complex >& A, const T rcond_threshold); // // det and log_det template inline static bool det(eT& out_val, Mat& A); template inline static bool log_det(eT& out_val, typename get_pod_type::result& out_sign, Mat& A); template inline static bool log_det_sympd(typename get_pod_type::result& out_val, Mat& A); // // lu template inline static bool lu(Mat& L, Mat& U, podarray& ipiv, const Base& X); template inline static bool lu(Mat& L, Mat& U, Mat& P, const Base& X); template inline static bool lu(Mat& L, Mat& U, const Base& X); // // eig_gen template inline static bool eig_gen(Mat< std::complex >& vals, Mat< std::complex >& vecs, const bool vecs_on, const Base& expr); template inline static bool eig_gen(Mat< std::complex >& vals, Mat< std::complex >& vecs, const bool vecs_on, const Base< std::complex, T1 >& expr); // // eig_gen_balance template inline static bool eig_gen_balance(Mat< std::complex >& vals, Mat< std::complex >& vecs, const bool vecs_on, const Base& expr); template inline static bool eig_gen_balance(Mat< std::complex >& vals, Mat< std::complex >& vecs, const bool vecs_on, const Base< std::complex, T1 >& expr); // // eig_gen_twosided template inline static bool eig_gen_twosided(Mat< std::complex >& vals, Mat< std::complex >& lvecs, Mat< std::complex >& rvecs, const Base& expr); template inline static bool eig_gen_twosided(Mat< std::complex >& vals, Mat< std::complex >& lvecs, Mat< std::complex >& rvecs, const Base< std::complex, T1 >& expr); // // eig_gen_twosided_balance template inline static bool eig_gen_twosided_balance(Mat< std::complex >& vals, Mat< std::complex >& lvecs, Mat< std::complex >& rvecs, const Base& expr); template inline static bool eig_gen_twosided_balance(Mat< std::complex >& vals, Mat< std::complex >& lvecs, Mat< std::complex >& rvecs, const Base< std::complex, T1 >& expr); // // eig_pair template inline static bool eig_pair(Mat< std::complex >& vals, Mat< std::complex >& vecs, const bool vecs_on, const Base& A_expr, const Base& B_expr); template inline static bool eig_pair(Mat< std::complex >& vals, Mat< std::complex >& vecs, const bool vecs_on, const Base< std::complex, T1 >& A_expr, const Base< std::complex, T2 >& B_expr); // // eig_pair_twosided template inline static bool eig_pair_twosided(Mat< std::complex >& vals, Mat< std::complex >& lvecs, Mat< std::complex >& rvecs, const Base& A_expr, const Base& B_expr); template inline static bool eig_pair_twosided(Mat< std::complex >& vals, Mat< std::complex >& lvecs, Mat< std::complex >& rvecs, const Base< std::complex, T1 >& A_expr, const Base< std::complex, T2 >& B_expr); // // eig_sym template inline static bool eig_sym(Col& eigval, Mat& A); template inline static bool eig_sym(Col& eigval, Mat< std::complex >& A); template inline static bool eig_sym(Col& eigval, Mat& eigvec, const Mat& X); template inline static bool eig_sym(Col& eigval, Mat< std::complex >& eigvec, const Mat< std::complex >& X); template inline static bool eig_sym_dc(Col& eigval, Mat& eigvec, const Mat& X); template inline static bool eig_sym_dc(Col& eigval, Mat< std::complex >& eigvec, const Mat< std::complex >& X); // // chol template inline static bool chol_simple(Mat& X); template inline static bool chol(Mat& X, const uword layout); template inline static bool chol_band(Mat& X, const uword KD, const uword layout); template inline static bool chol_band(Mat< std::complex >& X, const uword KD, const uword layout); template inline static bool chol_band_common(Mat& X, const uword KD, const uword layout); template inline static bool chol_pivot(Mat& X, Mat& P, const uword layout); // // hessenberg decomposition template inline static bool hess(Mat& H, const Base& X, Col& tao); // // qr template inline static bool qr(Mat& Q, Mat& R, const Base& X); template inline static bool qr_econ(Mat& Q, Mat& R, const Base& X); template inline static bool qr_pivot(Mat& Q, Mat& R, Mat& P, const Base& X); template inline static bool qr_pivot(Mat< std::complex >& Q, Mat< std::complex >& R, Mat& P, const Base,T1>& X); // // svd template inline static bool svd(Col& S, Mat& A); template inline static bool svd(Col& S, Mat< std::complex >& A); template inline static bool svd(Mat& U, Col& S, Mat& V, Mat& A); template inline static bool svd(Mat< std::complex >& U, Col& S, Mat< std::complex >& V, Mat< std::complex >& A); template inline static bool svd_econ(Mat& U, Col& S, Mat& V, Mat& A, const char mode); template inline static bool svd_econ(Mat< std::complex >& U, Col& S, Mat< std::complex >& V, Mat< std::complex >& A, const char mode); template inline static bool svd_dc(Col& S, Mat& A); template inline static bool svd_dc(Col& S, Mat< std::complex >& A); template inline static bool svd_dc(Mat& U, Col& S, Mat& V, Mat& A); template inline static bool svd_dc(Mat< std::complex >& U, Col& S, Mat< std::complex >& V, Mat< std::complex >& A); template inline static bool svd_dc_econ(Mat& U, Col& S, Mat& V, Mat& A); template inline static bool svd_dc_econ(Mat< std::complex >& U, Col& S, Mat< std::complex >& V, Mat< std::complex >& A); // // solve template arma_cold inline static bool solve_square_tiny(Mat& out, const Mat& A, const Base& B_expr); template inline static bool solve_square_fast(Mat& out, Mat& A, const Base& B_expr); template inline static bool solve_square_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool allow_ugly); template inline static bool solve_square_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool equilibrate, const bool allow_ugly); template inline static bool solve_square_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base,T1>& B_expr, const bool equilibrate, const bool allow_ugly); // template inline static bool solve_sympd_fast(Mat& out, Mat& A, const Base& B_expr); template inline static bool solve_sympd_fast_common(Mat& out, Mat& A, const Base& B_expr); template inline static bool solve_sympd_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool allow_ugly); template inline static bool solve_sympd_rcond(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base< std::complex,T1>& B_expr, const bool allow_ugly); template inline static bool solve_sympd_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool equilibrate, const bool allow_ugly); template inline static bool solve_sympd_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base,T1>& B_expr, const bool equilibrate, const bool allow_ugly); // template inline static bool solve_rect_fast(Mat& out, Mat& A, const Base& B_expr); template inline static bool solve_rect_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool allow_ugly); // template inline static bool solve_approx_svd(Mat& out, Mat& A, const Base& B_expr); template inline static bool solve_approx_svd(Mat< std::complex >& out, Mat< std::complex >& A, const Base,T1>& B_expr); // template inline static bool solve_trimat_fast(Mat& out, const Mat& A, const Base& B_expr, const uword layout); template inline static bool solve_trimat_rcond(Mat& out, typename T1::pod_type& out_rcond, const Mat& A, const Base& B_expr, const uword layout, const bool allow_ugly); // template inline static bool solve_band_fast(Mat& out, Mat& A, const uword KL, const uword KU, const Base& B_expr); template inline static bool solve_band_fast(Mat< std::complex >& out, Mat< std::complex >& A, const uword KL, const uword KU, const Base< std::complex,T1>& B_expr); template inline static bool solve_band_fast_common(Mat& out, const Mat& A, const uword KL, const uword KU, const Base& B_expr); template inline static bool solve_band_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const uword KL, const uword KU, const Base& B_expr, const bool allow_ugly); template inline static bool solve_band_rcond(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const uword KL, const uword KU, const Base< std::complex,T1>& B_expr, const bool allow_ugly); template inline static bool solve_band_rcond_common(Mat& out, typename T1::pod_type& out_rcond, const Mat& A, const uword KL, const uword KU, const Base& B_expr, const bool allow_ugly); template inline static bool solve_band_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const uword KL, const uword KU, const Base& B_expr, const bool equilibrate, const bool allow_ugly); template inline static bool solve_band_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const uword KL, const uword KU, const Base,T1>& B_expr, const bool equilibrate, const bool allow_ugly); // template inline static bool solve_tridiag_fast(Mat& out, Mat& A, const Base& B_expr); template inline static bool solve_tridiag_fast(Mat< std::complex >& out, Mat< std::complex >& A, const Base< std::complex,T1>& B_expr); template inline static bool solve_tridiag_fast_common(Mat& out, const Mat& A, const Base& B_expr); // // Schur decomposition template inline static bool schur(Mat& U, Mat& S, const Base& X, const bool calc_U = true); template inline static bool schur(Mat< std::complex >& U, Mat< std::complex >& S, const Base,T1>& X, const bool calc_U = true); template inline static bool schur(Mat< std::complex >& U, Mat< std::complex >& S, const bool calc_U = true); // // solve the Sylvester equation AX + XB = C template inline static bool syl(Mat& X, const Mat& A, const Mat& B, const Mat& C); // // QZ decomposition template inline static bool qz(Mat& A, Mat& B, Mat& vsl, Mat& vsr, const Base& X_expr, const Base& Y_expr, const char mode); template inline static bool qz(Mat< std::complex >& A, Mat< std::complex >& B, Mat< std::complex >& vsl, Mat< std::complex >& vsr, const Base< std::complex, T1 >& X_expr, const Base< std::complex, T2 >& Y_expr, const char mode); // // rcond template inline static eT rcond(Mat& A); template inline static T rcond(Mat< std::complex >& A); template inline static eT rcond_sympd(Mat& A, bool& calc_ok); template inline static T rcond_sympd(Mat< std::complex >& A, bool& calc_ok); template inline static eT rcond_trimat(const Mat& A, const uword layout); template inline static T rcond_trimat(const Mat< std::complex >& A, const uword layout); // // lu_rcond (rcond from pre-computed LU decomposition) template inline static eT lu_rcond(const Mat& A, const eT norm_val); template inline static T lu_rcond(const Mat< std::complex >& A, const T norm_val); template inline static eT lu_rcond_sympd(const Mat& A, const eT norm_val); template inline static T lu_rcond_sympd(const Mat< std::complex >& A, const T norm_val); template inline static eT lu_rcond_band(const Mat& AB, const uword KL, const uword KU, const podarray& ipiv, const eT norm_val); template inline static T lu_rcond_band(const Mat< std::complex >& AB, const uword KL, const uword KU, const podarray& ipiv, const T norm_val); // // misc template inline static bool crippled_lapack(const Base&); template inline static typename T1::pod_type epsilon_lapack(const Base&); template inline static bool rudimentary_sym_check(const Mat& X); template inline static bool rudimentary_sym_check(const Mat< std::complex >& X); }; namespace qz_helper { template inline blas_int select_lhp(const T* x_ptr, const T* y_ptr, const T* z_ptr); template inline blas_int select_rhp(const T* x_ptr, const T* y_ptr, const T* z_ptr); template inline blas_int select_iuc(const T* x_ptr, const T* y_ptr, const T* z_ptr); template inline blas_int select_ouc(const T* x_ptr, const T* y_ptr, const T* z_ptr); template inline blas_int cx_select_lhp(const std::complex* x_ptr, const std::complex* y_ptr); template inline blas_int cx_select_rhp(const std::complex* x_ptr, const std::complex* y_ptr); template inline blas_int cx_select_iuc(const std::complex* x_ptr, const std::complex* y_ptr); template inline blas_int cx_select_ouc(const std::complex* x_ptr, const std::complex* y_ptr); template inline void_ptr ptr_cast(blas_int (*function)(const T*, const T*, const T*)); template inline void_ptr ptr_cast(blas_int (*function)(const std::complex*, const std::complex*)); } //! @} RcppArmadillo/inst/include/armadillo_bits/CubeToMatOp_bones.hpp0000644000176200001440000000323114124060717024412 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup CubeToMatOp //! @{ template class CubeToMatOp : public Base< typename T1::elem_type, CubeToMatOp > { public: typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; inline explicit CubeToMatOp(const T1& in_m); inline CubeToMatOp(const T1& in_m, const elem_type in_aux); inline ~CubeToMatOp(); arma_aligned const T1& m; //!< the operand; must be derived from BaseCube arma_aligned elem_type aux; //!< auxiliary data, using the element type as used by T1 static constexpr bool is_row = op_type::template traits::is_row; static constexpr bool is_col = op_type::template traits::is_col; static constexpr bool is_xvec = op_type::template traits::is_xvec; }; //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_SparseGenMatProd_bones.hpp0000644000176200001440000000235614124060717027031 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { //! Define matrix operations on existing matrix objects template class SparseGenMatProd { private: const SpMat& op_mat; public: const uword n_rows; // number of rows of the underlying matrix const uword n_cols; // number of columns of the underlying matrix inline SparseGenMatProd(const SpMat& mat_obj); inline void perform_op(eT* x_in, eT* y_out) const; }; } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/SpToDOp_bones.hpp0000644000176200001440000000444314124060717023566 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpToDOp //! @{ //! Class for storing data required for delayed unary operations on a sparse //! matrix that produce a dense matrix; the data for storage may include //! the operand (eg. the matrix to which the operation is to be applied) and the unary operator (eg. inverse). //! The operand is stored as a reference (which can be optimised away), //! while the operator is "stored" through the template definition (op_type). //! The operands can be 'SpMat', 'SpRow', 'SpCol', 'SpOp', and 'SpGlue'. //! Note that as 'SpGlue' can be one of the operands, more than one matrix can be stored. //! //! For example, we could have: //! SpToDOp< SpGlue< SpMat, SpMat, sp_glue_times >, op_sp_plus > template class SpToDOp : public Base< typename T1::elem_type, SpToDOp > { public: typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; inline explicit SpToDOp(const T1& in_m); inline SpToDOp(const T1& in_m, const elem_type in_aux); inline ~SpToDOp(); arma_aligned const T1& m; //!< the operand; must be derived from SpBase arma_aligned elem_type aux; //!< auxiliary data, using the element type as used by T1 static constexpr bool is_row = op_type::template traits::is_row; static constexpr bool is_col = op_type::template traits::is_col; static constexpr bool is_xvec = op_type::template traits::is_xvec; }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_find_unique_meat.hpp0000644000176200001440000000603314124060717025117 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_find_unique //! @{ template inline bool op_find_unique::apply_helper(Mat& out, const Proxy& P, const bool ascending_indices) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_elem = P.get_n_elem(); if(n_elem == 0) { out.set_size(0,1); return true; } if(n_elem == 1) { out.set_size(1,1); out[0] = 0; return true; } uvec indices(n_elem, arma_nozeros_indicator()); std::vector< arma_find_unique_packet > packet_vec(n_elem); if(Proxy::use_at == false) { typename Proxy::ea_type Pea = P.get_ea(); for(uword i=0; i comparator; std::sort( packet_vec.begin(), packet_vec.end(), comparator ); uword* indices_mem = indices.memptr(); indices_mem[0] = packet_vec[0].index; uword count = 1; for(uword i=1; i < n_elem; ++i) { const eT diff = packet_vec[i-1].val - packet_vec[i].val; if(diff != eT(0)) { indices_mem[count] = packet_vec[i].index; ++count; } } out.steal_mem_col(indices,count); if(ascending_indices) { std::sort(out.begin(), out.end()); } return true; } template inline void op_find_unique::apply(Mat& out, const mtOp& in) { arma_extra_debug_sigprint(); const Proxy P(in.m); const bool ascending_indices = (in.aux_uword_a == uword(1)); const bool all_non_nan = op_find_unique::apply_helper(out, P, ascending_indices); if(all_non_nan == false) { arma_debug_check( true, "find_unique(): detected NaN" ); out.reset(); } } //! @} RcppArmadillo/inst/include/armadillo_bits/op_nonzeros_bones.hpp0000644000176200001440000000253614124060717024652 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_nonzeros //! @{ class op_nonzeros : public traits_op_col { public: // for dense matrices template static inline void apply_noalias(Mat& out, const Proxy& P); template static inline void apply(Mat& out, const Op& X); }; class op_nonzeros_spmat : public traits_op_col { public: template static inline void apply(Mat& out, const SpToDOp& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_princomp_meat.hpp0000644000176200001440000001776714124060717024460 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_princomp //! @{ //! \brief //! principal component analysis -- 4 arguments version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients //! score_out -> projected samples //! latent_out -> eigenvalues of principal vectors //! tsquared_out -> Hotelling's T^2 statistic template inline bool op_princomp::direct_princomp ( Mat& coeff_out, Mat& score_out, Col& latent_out, Col& tsquared_out, const Base& X ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const unwrap_check Y( X.get_ref(), score_out ); const Mat& in = Y.M; const uword n_rows = in.n_rows; const uword n_cols = in.n_cols; if(n_rows > 1) // more than one sample { // subtract the mean - use score_out as temporary matrix score_out = in; score_out.each_row() -= mean(in); // singular value decomposition Mat U; Col< T> s; const bool svd_ok = (n_rows >= n_cols) ? svd_econ(U, s, coeff_out, score_out) : svd(U, s, coeff_out, score_out); if(svd_ok == false) { return false; } // normalize the eigenvalues s /= std::sqrt( double(n_rows - 1) ); // project the samples to the principals score_out *= coeff_out; if(n_rows <= n_cols) // number of samples is less than their dimensionality { score_out.cols(n_rows-1,n_cols-1).zeros(); Col s_tmp(n_cols, arma_zeros_indicator()); s_tmp.rows(0,n_rows-2) = s.rows(0,n_rows-2); s = s_tmp; // compute the Hotelling's T-squared s_tmp.rows(0,n_rows-2) = T(1) / s_tmp.rows(0,n_rows-2); const Mat S = score_out * diagmat(Col(s_tmp)); tsquared_out = sum(S%S,1); } else { // compute the Hotelling's T-squared // TODO: replace with more robust approach const Mat S = score_out * diagmat(Col( T(1) / s)); tsquared_out = sum(S%S,1); } // compute the eigenvalues of the principal vectors latent_out = s%s; } else // 0 or 1 samples { coeff_out.eye(n_cols, n_cols); score_out.copy_size(in); score_out.zeros(); latent_out.set_size(n_cols); latent_out.zeros(); tsquared_out.set_size(n_rows); tsquared_out.zeros(); } return true; } //! \brief //! principal component analysis -- 3 arguments version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients //! score_out -> projected samples //! latent_out -> eigenvalues of principal vectors template inline bool op_princomp::direct_princomp ( Mat& coeff_out, Mat& score_out, Col& latent_out, const Base& X ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const unwrap_check Y( X.get_ref(), score_out ); const Mat& in = Y.M; const uword n_rows = in.n_rows; const uword n_cols = in.n_cols; if(n_rows > 1) // more than one sample { // subtract the mean - use score_out as temporary matrix score_out = in; score_out.each_row() -= mean(in); // singular value decomposition Mat U; Col< T> s; const bool svd_ok = (n_rows >= n_cols) ? svd_econ(U, s, coeff_out, score_out) : svd(U, s, coeff_out, score_out); if(svd_ok == false) { return false; } // normalize the eigenvalues s /= std::sqrt( double(n_rows - 1) ); // project the samples to the principals score_out *= coeff_out; if(n_rows <= n_cols) // number of samples is less than their dimensionality { score_out.cols(n_rows-1,n_cols-1).zeros(); Col s_tmp(n_cols, arma_zeros_indicator()); s_tmp.rows(0,n_rows-2) = s.rows(0,n_rows-2); s = s_tmp; } // compute the eigenvalues of the principal vectors latent_out = s%s; } else // 0 or 1 samples { coeff_out.eye(n_cols, n_cols); score_out.copy_size(in); score_out.zeros(); latent_out.set_size(n_cols); latent_out.zeros(); } return true; } //! \brief //! principal component analysis -- 2 arguments version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients //! score_out -> projected samples template inline bool op_princomp::direct_princomp ( Mat& coeff_out, Mat& score_out, const Base& X ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const unwrap_check Y( X.get_ref(), score_out ); const Mat& in = Y.M; const uword n_rows = in.n_rows; const uword n_cols = in.n_cols; if(n_rows > 1) // more than one sample { // subtract the mean - use score_out as temporary matrix score_out = in; score_out.each_row() -= mean(in); // singular value decomposition Mat U; Col< T> s; const bool svd_ok = (n_rows >= n_cols) ? svd_econ(U, s, coeff_out, score_out) : svd(U, s, coeff_out, score_out); if(svd_ok == false) { return false; } // project the samples to the principals score_out *= coeff_out; if(n_rows <= n_cols) // number of samples is less than their dimensionality { score_out.cols(n_rows-1,n_cols-1).zeros(); } } else // 0 or 1 samples { coeff_out.eye(n_cols, n_cols); score_out.copy_size(in); score_out.zeros(); } return true; } //! \brief //! principal component analysis -- 1 argument version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients template inline bool op_princomp::direct_princomp ( Mat& coeff_out, const Base& X ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const unwrap Y( X.get_ref() ); const Mat& in = Y.M; if(in.n_elem != 0) { Mat tmp = in; tmp.each_row() -= mean(in); // singular value decomposition Mat U; Col< T> s; const bool svd_ok = (in.n_rows >= in.n_cols) ? svd_econ(U, s, coeff_out, tmp) : svd(U, s, coeff_out, tmp); if(svd_ok == false) { return false; } } else { coeff_out.eye(in.n_cols, in.n_cols); } return true; } template inline void op_princomp::apply ( Mat& out, const Op& in ) { arma_extra_debug_sigprint(); const bool status = op_princomp::direct_princomp(out, in.m); if(status == false) { out.soft_reset(); arma_stop_runtime_error("princomp(): decomposition failed"); } } //! @} RcppArmadillo/inst/include/armadillo_bits/op_min_bones.hpp0000644000176200001440000000767214124060717023566 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_min //! @{ class op_min : public traits_op_xvec { public: // // dense matrices template inline static void apply(Mat& out, const Op& in); template inline static void apply_noalias(Mat& out, const Mat& X, const uword dim, const typename arma_not_cx::result* junk = nullptr); template inline static void apply_noalias(Mat& out, const Mat& X, const uword dim, const typename arma_cx_only::result* junk = nullptr); // // cubes template inline static void apply(Cube& out, const OpCube& in); template inline static void apply_noalias(Cube& out, const Cube& X, const uword dim, const typename arma_not_cx::result* junk = nullptr); template inline static void apply_noalias(Cube& out, const Cube& X, const uword dim, const typename arma_cx_only::result* junk = nullptr); // // for non-complex numbers template inline static eT direct_min(const eT* const X, const uword N); template inline static eT direct_min(const eT* const X, const uword N, uword& index_of_min_val); template inline static eT direct_min(const Mat& X, const uword row); template inline static eT min(const subview& X); template inline static typename arma_not_cx::result min(const Base& X); template inline static typename arma_not_cx::result min(const BaseCube& X); template inline static typename arma_not_cx::result min_with_index(const Proxy& P, uword& index_of_min_val); template inline static typename arma_not_cx::result min_with_index(const ProxyCube& P, uword& index_of_min_val); // // for complex numbers template inline static std::complex direct_min(const std::complex* const X, const uword n_elem); template inline static std::complex direct_min(const std::complex* const X, const uword n_elem, uword& index_of_min_val); template inline static std::complex direct_min(const Mat< std::complex >& X, const uword row); template inline static std::complex min(const subview< std::complex >& X); template inline static typename arma_cx_only::result min(const Base& X); template inline static typename arma_cx_only::result min(const BaseCube& X); template inline static typename arma_cx_only::result min_with_index(const Proxy& P, uword& index_of_min_val); template inline static typename arma_cx_only::result min_with_index(const ProxyCube& P, uword& index_of_min_val); }; //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_UpperHessenbergEigen_meat.hpp0000644000176200001440000001024214124060717027535 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { template inline UpperHessenbergEigen::UpperHessenbergEigen() : n(0) , computed(false) { arma_extra_debug_sigprint(); } template inline UpperHessenbergEigen::UpperHessenbergEigen(const Mat& mat_obj) : n(mat_obj.n_rows) , computed(false) { arma_extra_debug_sigprint(); compute(mat_obj); } template inline void UpperHessenbergEigen::compute(const Mat& mat_obj) { arma_extra_debug_sigprint(); arma_debug_check( (mat_obj.is_square() == false), "newarp::UpperHessenbergEigen::compute(): matrix must be square" ); n = blas_int(mat_obj.n_rows); mat_Z.set_size(n, n); mat_T.set_size(n, n); evals.set_size(n); mat_Z.eye(); mat_T = mat_obj; blas_int want_T = blas_int(1); blas_int want_Z = blas_int(1); blas_int ilo = blas_int(1); blas_int ihi = blas_int(n); blas_int iloz = blas_int(1); blas_int ihiz = blas_int(n); blas_int info = blas_int(0); podarray wr(static_cast(n)); podarray wi(static_cast(n)); lapack::lahqr(&want_T, &want_Z, &n, &ilo, &ihi, mat_T.memptr(), &n, wr.memptr(), wi.memptr(), &iloz, &ihiz, mat_Z.memptr(), &n, &info); for(blas_int i = 0; i < n; i++) { evals(i) = std::complex(wr[i], wi[i]); } if(info > 0) { arma_stop_runtime_error("lapack::lahqr(): failed to compute all eigenvalues"); return; } char side = 'R'; char howmny = 'B'; blas_int m = blas_int(0); podarray work(static_cast(3 * n)); lapack::trevc(&side, &howmny, (blas_int*) NULL, &n, mat_T.memptr(), &n, (eT*) NULL, &n, mat_Z.memptr(), &n, &n, &m, work.memptr(), &info); if(info < 0) { arma_stop_logic_error("lapack::trevc(): illegal value"); return; } computed = true; } template inline Col< std::complex > UpperHessenbergEigen::eigenvalues() { arma_extra_debug_sigprint(); arma_debug_check( (computed == false), "newarp::UpperHessenbergEigen::eigenvalues(): need to call compute() first" ); return evals; } template inline Mat< std::complex > UpperHessenbergEigen::eigenvectors() { arma_extra_debug_sigprint(); arma_debug_check( (computed == false), "newarp::UpperHessenbergEigen::eigenvectors(): need to call compute() first" ); // Lapack will set the imaginary parts of real eigenvalues to be exact zero Mat< std::complex > evecs(n, n, arma_zeros_indicator()); std::complex* col_ptr = evecs.memptr(); for(blas_int i = 0; i < n; i++) { if(cx_attrib::is_real(evals(i), eT(0))) { // for real eigenvector, normalise and copy eT z_norm = norm(mat_Z.col(i)); for(blas_int j = 0; j < n; j++) { col_ptr[j] = std::complex(mat_Z(j, i) / z_norm, eT(0)); } col_ptr += n; } else { // complex eigenvectors are stored in consecutive columns eT r2 = dot(mat_Z.col(i), mat_Z.col(i)); eT i2 = dot(mat_Z.col(i + 1), mat_Z.col(i + 1)); eT z_norm = std::sqrt(r2 + i2); eT* z_ptr = mat_Z.colptr(i); for(blas_int j = 0; j < n; j++) { col_ptr[j ] = std::complex(z_ptr[j] / z_norm, z_ptr[j + n] / z_norm); col_ptr[j + n] = std::conj(col_ptr[j]); } i++; col_ptr += 2 * n; } } return evecs; } } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/fn_eig_gen.hpp0000644000176200001440000001314014124060717023162 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_eig_gen //! @{ template arma_warn_unused inline typename enable_if2< is_supported_blas_type::value, Col< std::complex > >::result eig_gen ( const Base& expr, const char* option = "nobalance" ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; typedef typename std::complex eT; const char sig = (option != nullptr) ? option[0] : char(0); arma_debug_check( ((sig != 'n') && (sig != 'b')), "eig_gen(): unknown option" ); if( auxlib::crippled_lapack(expr) && (sig == 'b') ) { arma_debug_warn_level(1, "eig_gen(): 'balance' option ignored due to linking with crippled lapack"); } Col eigvals; Mat eigvecs; const bool status = (sig == 'b') ? auxlib::eig_gen_balance(eigvals, eigvecs, false, expr.get_ref()) : auxlib::eig_gen(eigvals, eigvecs, false, expr.get_ref()); if(status == false) { eigvals.soft_reset(); arma_stop_runtime_error("eig_gen(): decomposition failed"); } return eigvals; } template inline typename enable_if2< is_supported_blas_type::value, bool >::result eig_gen ( Col< std::complex >& eigvals, const Base< typename T1::elem_type, T1>& expr, const char* option = "nobalance" ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; typedef typename std::complex eT; const char sig = (option != nullptr) ? option[0] : char(0); arma_debug_check( ((sig != 'n') && (sig != 'b')), "eig_gen(): unknown option" ); if( auxlib::crippled_lapack(expr) && (sig == 'b') ) { arma_debug_warn_level(1, "eig_gen(): 'balance' option ignored due to linking with crippled lapack"); } Mat eigvecs; const bool status = (sig == 'b') ? auxlib::eig_gen_balance(eigvals, eigvecs, false, expr.get_ref()) : auxlib::eig_gen(eigvals, eigvecs, false, expr.get_ref()); if(status == false) { eigvals.soft_reset(); arma_debug_warn_level(3, "eig_gen(): decomposition failed"); } return status; } template inline typename enable_if2< is_supported_blas_type::value, bool >::result eig_gen ( Col< std::complex >& eigvals, Mat< std::complex >& eigvecs, const Base& expr, const char* option = "nobalance" ) { arma_extra_debug_sigprint(); arma_debug_check( (void_ptr(&eigvals) == void_ptr(&eigvecs)), "eig_gen(): parameter 'eigval' is an alias of parameter 'eigvec'" ); const char sig = (option != nullptr) ? option[0] : char(0); arma_debug_check( ((sig != 'n') && (sig != 'b')), "eig_gen(): unknown option" ); if( auxlib::crippled_lapack(expr) && (sig == 'b') ) { arma_debug_warn_level(1, "eig_gen(): 'balance' option ignored due to linking with crippled lapack"); } const bool status = (sig == 'b') ? auxlib::eig_gen_balance(eigvals, eigvecs, true, expr.get_ref()) : auxlib::eig_gen(eigvals, eigvecs, true, expr.get_ref()); if(status == false) { eigvals.soft_reset(); eigvecs.soft_reset(); arma_debug_warn_level(3, "eig_gen(): decomposition failed"); } return status; } template inline typename enable_if2< is_supported_blas_type::value, bool >::result eig_gen ( Col< std::complex >& eigvals, Mat< std::complex >& leigvecs, Mat< std::complex >& reigvecs, const Base& expr, const char* option = "nobalance" ) { arma_extra_debug_sigprint(); arma_debug_check( (void_ptr(&eigvals) == void_ptr(&leigvecs)), "eig_gen(): parameter 'eigval' is an alias of parameter 'leigvec'" ); arma_debug_check( (void_ptr(&eigvals) == void_ptr(&reigvecs)), "eig_gen(): parameter 'eigval' is an alias of parameter 'reigvec'" ); arma_debug_check( (void_ptr(&leigvecs) == void_ptr(&reigvecs)), "eig_gen(): parameter 'leigvec' is an alias of parameter 'reigvec'" ); const char sig = (option != nullptr) ? option[0] : char(0); arma_debug_check( ((sig != 'n') && (sig != 'b')), "eig_gen(): unknown option" ); if( auxlib::crippled_lapack(expr) && (sig == 'b') ) { arma_debug_warn_level(1, "eig_gen(): 'balance' option ignored due to linking with crippled lapack"); } const bool status = (sig == 'b') ? auxlib::eig_gen_twosided_balance(eigvals, leigvecs, reigvecs, expr.get_ref()) : auxlib::eig_gen_twosided(eigvals, leigvecs, reigvecs, expr.get_ref()); if(status == false) { eigvals.soft_reset(); leigvecs.soft_reset(); reigvecs.soft_reset(); arma_debug_warn_level(3, "eig_gen(): decomposition failed"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_as_scalar.hpp0000644000176200001440000002510014147163451023520 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_as_scalar //! @{ template struct as_scalar_redirect { template inline static typename T1::elem_type apply(const T1& X); }; template<> struct as_scalar_redirect<2> { template inline static typename T1::elem_type apply(const Glue& X); }; template<> struct as_scalar_redirect<3> { template inline static typename T1::elem_type apply(const Glue< Glue, T3, glue_times>& X); }; template template inline typename T1::elem_type as_scalar_redirect::apply(const T1& X) { arma_extra_debug_sigprint(); const Proxy P(X); arma_debug_check( (P.get_n_elem() != 1), "as_scalar(): expression must evaluate to exactly one element" ); return (Proxy::use_at) ? P.at(0,0) : P[0]; } template inline typename T1::elem_type as_scalar_redirect<2>::apply(const Glue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // T1 must result in a matrix with one row // T2 must result in a matrix with one column const bool has_all_mat = (is_Mat::value || is_Mat_trans::value) && (is_Mat::value || is_Mat_trans::value); const bool use_at = (Proxy::use_at || Proxy::use_at); const bool do_partial_unwrap = (has_all_mat || use_at); if(do_partial_unwrap) { const partial_unwrap tmp1(X.A); const partial_unwrap tmp2(X.B); typedef typename partial_unwrap::stored_type TA; typedef typename partial_unwrap::stored_type TB; const TA& A = tmp1.M; const TB& B = tmp2.M; const uword A_n_rows = (tmp1.do_trans == false) ? (TA::is_row ? 1 : A.n_rows) : (TA::is_col ? 1 : A.n_cols); const uword A_n_cols = (tmp1.do_trans == false) ? (TA::is_col ? 1 : A.n_cols) : (TA::is_row ? 1 : A.n_rows); const uword B_n_rows = (tmp2.do_trans == false) ? (TB::is_row ? 1 : B.n_rows) : (TB::is_col ? 1 : B.n_cols); const uword B_n_cols = (tmp2.do_trans == false) ? (TB::is_col ? 1 : B.n_cols) : (TB::is_row ? 1 : B.n_rows); arma_debug_check( (A_n_rows != 1) || (B_n_cols != 1) || (A_n_cols != B_n_rows), "as_scalar(): incompatible dimensions" ); const eT val = op_dot::direct_dot(A.n_elem, A.memptr(), B.memptr()); return (tmp1.do_times || tmp2.do_times) ? (val * tmp1.get_val() * tmp2.get_val()) : val; } else { const Proxy PA(X.A); const Proxy PB(X.B); arma_debug_check ( (PA.get_n_rows() != 1) || (PB.get_n_cols() != 1) || (PA.get_n_cols() != PB.get_n_rows()), "as_scalar(): incompatible dimensions" ); return op_dot::apply_proxy(PA,PB); } } template inline typename T1::elem_type as_scalar_redirect<3>::apply(const Glue< Glue, T3, glue_times >& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // T1 * T2 must result in a matrix with one row // T3 must result in a matrix with one column typedef typename strip_inv ::stored_type T2_stripped_1; typedef typename strip_diagmat::stored_type T2_stripped_2; const strip_inv strip1(X.A.B); const strip_diagmat strip2(strip1.M); const bool tmp2_do_inv = strip1.do_inv; const bool tmp2_do_diagmat = strip2.do_diagmat; if(tmp2_do_diagmat == false) { const Mat tmp(X); arma_debug_check( (tmp.n_elem != 1), "as_scalar(): expression must evaluate to exactly one element" ); return tmp[0]; } else { const partial_unwrap tmp1(X.A.A); const partial_unwrap tmp2(strip2.M); const partial_unwrap tmp3(X.B); const Mat& A = tmp1.M; const Mat& B = tmp2.M; const Mat& C = tmp3.M; const uword A_n_rows = (tmp1.do_trans == false) ? A.n_rows : A.n_cols; const uword A_n_cols = (tmp1.do_trans == false) ? A.n_cols : A.n_rows; const bool B_is_vec = B.is_vec(); const uword B_n_rows = (B_is_vec) ? B.n_elem : ( (tmp2.do_trans == false) ? B.n_rows : B.n_cols ); const uword B_n_cols = (B_is_vec) ? B.n_elem : ( (tmp2.do_trans == false) ? B.n_cols : B.n_rows ); const uword C_n_rows = (tmp3.do_trans == false) ? C.n_rows : C.n_cols; const uword C_n_cols = (tmp3.do_trans == false) ? C.n_cols : C.n_rows; const eT val = tmp1.get_val() * tmp2.get_val() * tmp3.get_val(); arma_debug_check ( (A_n_rows != 1) || (C_n_cols != 1) || (A_n_cols != B_n_rows) || (B_n_cols != C_n_rows) , "as_scalar(): incompatible dimensions" ); if(B_is_vec) { if(tmp2_do_inv) { return val * op_dotext::direct_rowvec_invdiagvec_colvec(A.mem, B, C.mem); } else { return val * op_dot::direct_dot(A.n_elem, A.mem, B.mem, C.mem); } } else { if(tmp2_do_inv) { return val * op_dotext::direct_rowvec_invdiagmat_colvec(A.mem, B, C.mem); } else { return val * op_dotext::direct_rowvec_diagmat_colvec(A.mem, B, C.mem); } } } } template inline typename T1::elem_type as_scalar_diag(const Base& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap tmp(X.get_ref()); const Mat& A = tmp.M; arma_debug_check( (A.n_elem != 1), "as_scalar(): expression must evaluate to exactly one element" ); return A.mem[0]; } template inline typename T1::elem_type as_scalar_diag(const Glue< Glue, T3, glue_times >& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // T1 * T2 must result in a matrix with one row // T3 must result in a matrix with one column typedef typename strip_diagmat::stored_type T2_stripped; const strip_diagmat strip(X.A.B); const partial_unwrap tmp1(X.A.A); const partial_unwrap tmp2(strip.M); const partial_unwrap tmp3(X.B); const Mat& A = tmp1.M; const Mat& B = tmp2.M; const Mat& C = tmp3.M; const uword A_n_rows = (tmp1.do_trans == false) ? A.n_rows : A.n_cols; const uword A_n_cols = (tmp1.do_trans == false) ? A.n_cols : A.n_rows; const bool B_is_vec = B.is_vec(); const uword B_n_rows = (B_is_vec) ? B.n_elem : ( (tmp2.do_trans == false) ? B.n_rows : B.n_cols ); const uword B_n_cols = (B_is_vec) ? B.n_elem : ( (tmp2.do_trans == false) ? B.n_cols : B.n_rows ); const uword C_n_rows = (tmp3.do_trans == false) ? C.n_rows : C.n_cols; const uword C_n_cols = (tmp3.do_trans == false) ? C.n_cols : C.n_rows; const eT val = tmp1.get_val() * tmp2.get_val() * tmp3.get_val(); arma_debug_check ( (A_n_rows != 1) || (C_n_cols != 1) || (A_n_cols != B_n_rows) || (B_n_cols != C_n_rows) , "as_scalar(): incompatible dimensions" ); if(B_is_vec) { return val * op_dot::direct_dot(A.n_elem, A.mem, B.mem, C.mem); } else { return val * op_dotext::direct_rowvec_diagmat_colvec(A.mem, B, C.mem); } } template arma_warn_unused inline typename T1::elem_type as_scalar(const Glue& X, const typename arma_not_cx::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); if(is_glue_times_diag::value) { return as_scalar_diag(X); } constexpr uword N_mat = 1 + depth_lhs< glue_times, Glue >::num; arma_extra_debug_print(arma_str::format("N_mat = %u") % N_mat); return as_scalar_redirect::apply(X); } template arma_warn_unused inline typename T1::elem_type as_scalar(const Base& X) { arma_extra_debug_sigprint(); const Proxy P(X.get_ref()); arma_debug_check( (P.get_n_elem() != 1), "as_scalar(): expression must evaluate to exactly one element" ); return (Proxy::use_at) ? P.at(0,0) : P[0]; } template arma_warn_unused inline typename T1::elem_type as_scalar(const Gen& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; arma_debug_check( ((X.n_rows != 1) || (X.n_cols != 1)), "as_scalar(): expression must evaluate to exactly one element" ); return eT(arma_rng::randu()); } template arma_warn_unused inline typename T1::elem_type as_scalar(const Gen& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; arma_debug_check( ((X.n_rows != 1) || (X.n_cols != 1)), "as_scalar(): expression must evaluate to exactly one element" ); return eT(arma_rng::randn()); } template arma_warn_unused inline typename T1::elem_type as_scalar(const BaseCube& X) { arma_extra_debug_sigprint(); const ProxyCube P(X.get_ref()); arma_debug_check( (P.get_n_elem() != 1), "as_scalar(): expression must evaluate to exactly one element" ); return (ProxyCube::use_at) ? P.at(0,0,0) : P[0]; } template arma_warn_unused arma_inline typename arma_scalar_only::result as_scalar(const T& x) { return x; } template arma_warn_unused inline typename T1::elem_type as_scalar(const SpBase& X) { typedef typename T1::elem_type eT; const unwrap_spmat tmp(X.get_ref()); const SpMat& A = tmp.M; arma_debug_check( (A.n_elem != 1), "as_scalar(): expression must evaluate to exactly one element" ); return A.at(0,0); } //! @} RcppArmadillo/inst/include/armadillo_bits/Base_meat.hpp0000644000176200001440000005060214124060717022766 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup Base //! @{ template arma_inline const derived& Base::get_ref() const { return static_cast(*this); } template arma_cold inline void Base::print(const std::string extra_text) const { arma_extra_debug_sigprint(); const quasi_unwrap tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = get_cout_stream().width(); get_cout_stream() << extra_text << '\n'; get_cout_stream().width(orig_width); } arma_ostream::print(get_cout_stream(), tmp.M, true); } template arma_cold inline void Base::print(std::ostream& user_stream, const std::string extra_text) const { arma_extra_debug_sigprint(); const quasi_unwrap tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = user_stream.width(); user_stream << extra_text << '\n'; user_stream.width(orig_width); } arma_ostream::print(user_stream, tmp.M, true); } template arma_cold inline void Base::raw_print(const std::string extra_text) const { arma_extra_debug_sigprint(); const quasi_unwrap tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = get_cout_stream().width(); get_cout_stream() << extra_text << '\n'; get_cout_stream().width(orig_width); } arma_ostream::print(get_cout_stream(), tmp.M, false); } template arma_cold inline void Base::raw_print(std::ostream& user_stream, const std::string extra_text) const { arma_extra_debug_sigprint(); const quasi_unwrap tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = user_stream.width(); user_stream << extra_text << '\n'; user_stream.width(orig_width); } arma_ostream::print(user_stream, tmp.M, false); } template arma_cold inline void Base::brief_print(const std::string extra_text) const { arma_extra_debug_sigprint(); const quasi_unwrap tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = get_cout_stream().width(); get_cout_stream() << extra_text << '\n'; get_cout_stream().width(orig_width); } arma_ostream::brief_print(get_cout_stream(), tmp.M); } template arma_cold inline void Base::brief_print(std::ostream& user_stream, const std::string extra_text) const { arma_extra_debug_sigprint(); const quasi_unwrap tmp( (*this).get_ref() ); if(extra_text.length() != 0) { const std::streamsize orig_width = user_stream.width(); user_stream << extra_text << '\n'; user_stream.width(orig_width); } arma_ostream::brief_print(user_stream, tmp.M); } template inline arma_warn_unused elem_type Base::min() const { return op_min::min( (*this).get_ref() ); } template inline arma_warn_unused elem_type Base::max() const { return op_max::max( (*this).get_ref() ); } template inline elem_type Base::min(uword& index_of_min_val) const { const Proxy P( (*this).get_ref() ); return op_min::min_with_index(P, index_of_min_val); } template inline elem_type Base::max(uword& index_of_max_val) const { const Proxy P( (*this).get_ref() ); return op_max::max_with_index(P, index_of_max_val); } template inline elem_type Base::min(uword& row_of_min_val, uword& col_of_min_val) const { const Proxy P( (*this).get_ref() ); uword index = 0; const elem_type val = op_min::min_with_index(P, index); const uword local_n_rows = P.get_n_rows(); row_of_min_val = index % local_n_rows; col_of_min_val = index / local_n_rows; return val; } template inline elem_type Base::max(uword& row_of_max_val, uword& col_of_max_val) const { const Proxy P( (*this).get_ref() ); uword index = 0; const elem_type val = op_max::max_with_index(P, index); const uword local_n_rows = P.get_n_rows(); row_of_max_val = index % local_n_rows; col_of_max_val = index / local_n_rows; return val; } template inline arma_warn_unused uword Base::index_min() const { const Proxy P( (*this).get_ref() ); uword index = 0; if(P.get_n_elem() == 0) { arma_debug_check(true, "index_min(): object has no elements"); } else { op_min::min_with_index(P, index); } return index; } template inline arma_warn_unused uword Base::index_max() const { const Proxy P( (*this).get_ref() ); uword index = 0; if(P.get_n_elem() == 0) { arma_debug_check(true, "index_max(): object has no elements"); } else { op_max::max_with_index(P, index); } return index; } template inline arma_warn_unused bool Base::is_symmetric() const { arma_extra_debug_sigprint(); const quasi_unwrap U( (*this).get_ref() ); const Mat& A = U.M; if(A.n_rows != A.n_cols) { return false; } if(A.n_elem <= 1 ) { return true; } const uword N = A.n_rows; const uword Nm1 = N-1; const elem_type* A_col = A.memptr(); for(uword j=0; j < Nm1; ++j) { const uword jp1 = j+1; const elem_type* A_row = &(A.at(j,jp1)); for(uword i=jp1; i < N; ++i) { if(A_col[i] != (*A_row)) { return false; } A_row += N; } A_col += N; } return true; } template inline arma_warn_unused bool Base::is_symmetric(const typename get_pod_type::result tol) const { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; if(tol == T(0)) { return (*this).is_symmetric(); } arma_debug_check( (tol < T(0)), "is_symmetric(): parameter 'tol' must be >= 0" ); const quasi_unwrap U( (*this).get_ref() ); const Mat& A = U.M; if(A.n_rows != A.n_cols) { return false; } if(A.n_elem <= 1 ) { return true; } const T norm_A = as_scalar( arma::max(sum(abs(A), 1), 0) ); if(norm_A == T(0)) { return true; } const T norm_A_Ast = as_scalar( arma::max(sum(abs(A - A.st()), 1), 0) ); return ( (norm_A_Ast / norm_A) <= tol ); } template inline arma_warn_unused bool Base::is_hermitian() const { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const quasi_unwrap U( (*this).get_ref() ); const Mat& A = U.M; if(A.n_rows != A.n_cols) { return false; } if(A.n_elem == 0 ) { return true; } const uword N = A.n_rows; const elem_type* A_col = A.memptr(); for(uword j=0; j < N; ++j) { if( access::tmp_imag(A_col[j]) != T(0) ) { return false; } A_col += N; } A_col = A.memptr(); const uword Nm1 = N-1; for(uword j=0; j < Nm1; ++j) { const uword jp1 = j+1; const elem_type* A_row = &(A.at(j,jp1)); for(uword i=jp1; i < N; ++i) { if(A_col[i] != access::alt_conj(*A_row)) { return false; } A_row += N; } A_col += N; } return true; } template inline arma_warn_unused bool Base::is_hermitian(const typename get_pod_type::result tol) const { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; if(tol == T(0)) { return (*this).is_hermitian(); } arma_debug_check( (tol < T(0)), "is_hermitian(): parameter 'tol' must be >= 0" ); const quasi_unwrap U( (*this).get_ref() ); const Mat& A = U.M; if(A.n_rows != A.n_cols) { return false; } if(A.n_elem == 0 ) { return true; } const T norm_A = as_scalar( arma::max(sum(abs(A), 1), 0) ); if(norm_A == T(0)) { return true; } const T norm_A_At = as_scalar( arma::max(sum(abs(A - A.t()), 1), 0) ); return ( (norm_A_At / norm_A) <= tol ); } template inline arma_warn_unused bool Base::is_zero(const typename get_pod_type::result tol) const { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; arma_debug_check( (tol < T(0)), "is_zero(): parameter 'tol' must be >= 0" ); if(Proxy::use_at || is_Mat::stored_type>::value) { const quasi_unwrap U( (*this).get_ref() ); return arrayops::is_zero( U.M.memptr(), U.M.n_elem, tol ); } const Proxy P( (*this).get_ref() ); const uword n_elem = P.get_n_elem(); if(n_elem == 0) { return false; } const typename Proxy::ea_type Pea = P.get_ea(); if(is_cx::yes) { for(uword i=0; i tol) { return false; } if(eop_aux::arma_abs(val_imag) > tol) { return false; } } } else // not complex { for(uword i=0; i tol) { return false; } } } return true; } template inline arma_warn_unused bool Base::is_trimatu() const { arma_extra_debug_sigprint(); const quasi_unwrap U( (*this).get_ref() ); if(U.M.n_rows != U.M.n_cols) { return false; } if(U.M.n_elem <= 1) { return true; } return trimat_helper::is_triu(U.M); } template inline arma_warn_unused bool Base::is_trimatl() const { arma_extra_debug_sigprint(); const quasi_unwrap U( (*this).get_ref() ); if(U.M.n_rows != U.M.n_cols) { return false; } if(U.M.n_elem <= 1) { return true; } return trimat_helper::is_tril(U.M); } template inline arma_warn_unused bool Base::is_diagmat() const { arma_extra_debug_sigprint(); const quasi_unwrap U( (*this).get_ref() ); const Mat& A = U.M; if(A.n_elem <= 1) { return true; } // NOTE: we're NOT assuming the matrix has a square size const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const elem_type* A_mem = A.memptr(); if(A_mem[1] != elem_type(0)) { return false; } // if we got to this point, do a thorough check for(uword A_col=0; A_col < A_n_cols; ++A_col) { for(uword A_row=0; A_row < A_n_rows; ++A_row) { if( (A_mem[A_row] != elem_type(0)) && (A_row != A_col) ) { return false; } } A_mem += A_n_rows; } return true; } template inline arma_warn_unused bool Base::is_empty() const { arma_extra_debug_sigprint(); const Proxy P( (*this).get_ref() ); return (P.get_n_elem() == uword(0)); } template inline arma_warn_unused bool Base::is_square() const { arma_extra_debug_sigprint(); const Proxy P( (*this).get_ref() ); return (P.get_n_rows() == P.get_n_cols()); } template inline arma_warn_unused bool Base::is_vec() const { arma_extra_debug_sigprint(); if( (Proxy::is_row) || (Proxy::is_col) || (Proxy::is_xvec) ) { return true; } const Proxy P( (*this).get_ref() ); return ( (P.get_n_rows() == uword(1)) || (P.get_n_cols() == uword(1)) ); } template inline arma_warn_unused bool Base::is_colvec() const { arma_extra_debug_sigprint(); if(Proxy::is_col) { return true; } const Proxy P( (*this).get_ref() ); return (P.get_n_cols() == uword(1)); } template inline arma_warn_unused bool Base::is_rowvec() const { arma_extra_debug_sigprint(); if(Proxy::is_row) { return true; } const Proxy P( (*this).get_ref() ); return (P.get_n_rows() == uword(1)); } template inline arma_warn_unused bool Base::is_finite() const { arma_extra_debug_sigprint(); const Proxy P( (*this).get_ref() ); if(is_Mat::stored_type>::value) { const quasi_unwrap::stored_type> U(P.Q); return arrayops::is_finite( U.M.memptr(), U.M.n_elem ); } if(Proxy::use_at == false) { const typename Proxy::ea_type Pea = P.get_ea(); const uword n_elem = P.get_n_elem(); for(uword i=0; i inline arma_warn_unused bool Base::has_inf() const { arma_extra_debug_sigprint(); const Proxy P( (*this).get_ref() ); if(is_Mat::stored_type>::value) { const quasi_unwrap::stored_type> U(P.Q); return arrayops::has_inf( U.M.memptr(), U.M.n_elem ); } if(Proxy::use_at == false) { const typename Proxy::ea_type Pea = P.get_ea(); const uword n_elem = P.get_n_elem(); for(uword i=0; i inline arma_warn_unused bool Base::has_nan() const { arma_extra_debug_sigprint(); const Proxy P( (*this).get_ref() ); if(is_Mat::stored_type>::value) { const quasi_unwrap::stored_type> U(P.Q); return arrayops::has_nan( U.M.memptr(), U.M.n_elem ); } if(Proxy::use_at == false) { const typename Proxy::ea_type Pea = P.get_ea(); const uword n_elem = P.get_n_elem(); for(uword i=0; i inline arma_warn_unused const Op Base::as_col() const { return Op( (*this).get_ref() ); } template inline arma_warn_unused const Op Base::as_row() const { return Op( (*this).get_ref() ); } // // extra functions defined in Base_extra_yes template inline arma_warn_unused const Op Base_extra_yes::i() const { return Op(static_cast(*this)); } template inline arma_warn_unused bool Base_extra_yes::is_sympd() const { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; Mat X = static_cast(*this); // default value for tol const T tol = T(100) * std::numeric_limits::epsilon() * norm(X, "fro"); if(X.is_hermitian(tol) == false) { return false; } if(X.is_empty()) { return false; } X.diag() -= elem_type(tol); return auxlib::chol_simple(X); } template inline arma_warn_unused bool Base_extra_yes::is_sympd(typename get_pod_type::result tol) const { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; arma_debug_check( (tol < T(0)), "is_sympd(): parameter 'tol' must be >= 0" ); Mat X = static_cast(*this); if(X.is_hermitian(tol) == false) { return false; } if(X.is_empty()) { return false; } X.diag() -= elem_type(tol); return auxlib::chol_simple(X); } // // extra functions defined in Base_eval_Mat template arma_inline arma_warn_unused const derived& Base_eval_Mat::eval() const { arma_extra_debug_sigprint(); return static_cast(*this); } // // extra functions defined in Base_eval_expr template inline arma_warn_unused Mat Base_eval_expr::eval() const { arma_extra_debug_sigprint(); return Mat( static_cast(*this) ); } // // extra functions defined in Base_trans_cx template arma_inline arma_warn_unused const Op Base_trans_cx::t() const { return Op( static_cast(*this) ); } template arma_inline arma_warn_unused const Op Base_trans_cx::ht() const { return Op( static_cast(*this) ); } template arma_inline arma_warn_unused const Op Base_trans_cx::st() const { return Op( static_cast(*this) ); } // // extra functions defined in Base_trans_default template arma_inline arma_warn_unused const Op Base_trans_default::t() const { return Op( static_cast(*this) ); } template arma_inline arma_warn_unused const Op Base_trans_default::ht() const { return Op( static_cast(*this) ); } template arma_inline arma_warn_unused const Op Base_trans_default::st() const { return Op( static_cast(*this) ); } //! @} RcppArmadillo/inst/include/armadillo_bits/unwrap_spmat.hpp0000644000176200001440000000763414124060717023635 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup unwrap_spmat //! @{ template struct unwrap_spmat { typedef typename T1::elem_type eT; typedef SpMat stored_type; inline unwrap_spmat(const T1& A) : M(A) { arma_extra_debug_sigprint(); } const SpMat M; template constexpr bool is_alias(const SpMat&) const { return false; } }; template struct unwrap_spmat< SpMat > { typedef SpMat stored_type; inline unwrap_spmat(const SpMat& A) : M(A) { arma_extra_debug_sigprint(); M.sync(); } const SpMat& M; template arma_inline bool is_alias(const SpMat& X) const { return (void_ptr(&M) == void_ptr(&X)); } }; template struct unwrap_spmat< SpRow > { typedef SpRow stored_type; inline unwrap_spmat(const SpRow& A) : M(A) { arma_extra_debug_sigprint(); M.sync(); } const SpRow& M; template arma_inline bool is_alias(const SpMat& X) const { return (void_ptr(&M) == void_ptr(&X)); } }; template struct unwrap_spmat< SpCol > { typedef SpCol stored_type; inline unwrap_spmat(const SpCol& A) : M(A) { arma_extra_debug_sigprint(); M.sync(); } const SpCol& M; template arma_inline bool is_alias(const SpMat& X) const { return (void_ptr(&M) == void_ptr(&X)); } }; template struct unwrap_spmat< SpOp > { typedef typename T1::elem_type eT; typedef SpMat stored_type; inline unwrap_spmat(const SpOp& A) : M(A) { arma_extra_debug_sigprint(); } const SpMat M; template constexpr bool is_alias(const SpMat&) const { return false; } }; template struct unwrap_spmat< SpGlue > { typedef typename T1::elem_type eT; typedef SpMat stored_type; inline unwrap_spmat(const SpGlue& A) : M(A) { arma_extra_debug_sigprint(); } const SpMat M; template constexpr bool is_alias(const SpMat&) const { return false; } }; template struct unwrap_spmat< mtSpOp > { typedef SpMat stored_type; inline unwrap_spmat(const mtSpOp& A) : M(A) { arma_extra_debug_sigprint(); } const SpMat M; template constexpr bool is_alias(const SpMat&) const { return false; } }; template struct unwrap_spmat< mtSpGlue > { typedef SpMat stored_type; inline unwrap_spmat(const mtSpGlue& A) : M(A) { arma_extra_debug_sigprint(); } const SpMat M; template constexpr bool is_alias(const SpMat&) const { return false; } }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_misc_meat.hpp0000644000176200001440000002143414124060717023546 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_misc //! @{ template inline void op_real::apply( Mat& out, const mtOp& X ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; const Proxy P(X.m); const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); out.set_size(n_rows, n_cols); T* out_mem = out.memptr(); if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; const uword n_elem = P.get_n_elem(); ea_type A = P.get_ea(); for(uword i=0; i < n_elem; ++i) { out_mem[i] = std::real( A[i] ); } } else { for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { *out_mem = std::real( P.at(row,col) ); out_mem++; } } } template inline void op_real::apply( Cube& out, const mtOpCube& X ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; const ProxyCube P(X.m); const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_slices = P.get_n_slices(); out.set_size(n_rows, n_cols, n_slices); T* out_mem = out.memptr(); if(ProxyCube::use_at == false) { typedef typename ProxyCube::ea_type ea_type; const uword n_elem = P.get_n_elem(); ea_type A = P.get_ea(); for(uword i=0; i < n_elem; ++i) { out_mem[i] = std::real( A[i] ); } } else { for(uword slice=0; slice < n_slices; ++slice) for(uword col=0; col < n_cols; ++col ) for(uword row=0; row < n_rows; ++row ) { *out_mem = std::real( P.at(row,col,slice) ); out_mem++; } } } template inline void op_imag::apply( Mat& out, const mtOp& X ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; const Proxy P(X.m); const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); out.set_size(n_rows, n_cols); T* out_mem = out.memptr(); if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; const uword n_elem = P.get_n_elem(); ea_type A = P.get_ea(); for(uword i=0; i < n_elem; ++i) { out_mem[i] = std::imag( A[i] ); } } else { for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { *out_mem = std::imag( P.at(row,col) ); out_mem++; } } } template inline void op_imag::apply( Cube& out, const mtOpCube& X ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; const ProxyCube P(X.m); const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_slices = P.get_n_slices(); out.set_size(n_rows, n_cols, n_slices); T* out_mem = out.memptr(); if(ProxyCube::use_at == false) { typedef typename ProxyCube::ea_type ea_type; const uword n_elem = P.get_n_elem(); ea_type A = P.get_ea(); for(uword i=0; i < n_elem; ++i) { out_mem[i] = std::imag( A[i] ); } } else { for(uword slice=0; slice < n_slices; ++slice) for(uword col=0; col < n_cols; ++col ) for(uword row=0; row < n_rows; ++row ) { *out_mem = std::imag( P.at(row,col,slice) ); out_mem++; } } } template inline void op_abs::apply( Mat& out, const mtOp& X ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; const Proxy P(X.m); const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); out.set_size(n_rows, n_cols); T* out_mem = out.memptr(); if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; const uword n_elem = P.get_n_elem(); ea_type A = P.get_ea(); #if defined(ARMA_USE_OPENMP) { const int n_threads = mp_thread_limit::get(); #pragma omp parallel for schedule(static) num_threads(n_threads) for(uword i=0; i < n_elem; ++i) { out_mem[i] = std::abs( A[i] ); } } #else { for(uword i=0; i < n_elem; ++i) { out_mem[i] = std::abs( A[i] ); } } #endif } else { for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { *out_mem = std::abs( P.at(row,col) ); out_mem++; } } } template inline void op_abs::apply( Cube& out, const mtOpCube& X ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; const ProxyCube P(X.m); const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_slices = P.get_n_slices(); out.set_size(n_rows, n_cols, n_slices); T* out_mem = out.memptr(); if(ProxyCube::use_at == false) { typedef typename ProxyCube::ea_type ea_type; const uword n_elem = P.get_n_elem(); ea_type A = P.get_ea(); #if defined(ARMA_USE_OPENMP) { const int n_threads = mp_thread_limit::get(); #pragma omp parallel for schedule(static) num_threads(n_threads) for(uword i=0; i < n_elem; ++i) { out_mem[i] = std::abs( A[i] ); } } #else { for(uword i=0; i < n_elem; ++i) { out_mem[i] = std::abs( A[i] ); } } #endif } else { for(uword slice=0; slice < n_slices; ++slice) for(uword col=0; col < n_cols; ++col ) for(uword row=0; row < n_rows; ++row ) { *out_mem = std::abs( P.at(row,col,slice) ); out_mem++; } } } template inline void op_arg::apply( Mat& out, const mtOp& X ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const Proxy P(X.m); const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); out.set_size(n_rows, n_cols); T* out_mem = out.memptr(); if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; const uword n_elem = P.get_n_elem(); ea_type A = P.get_ea(); for(uword i=0; i < n_elem; ++i) { out_mem[i] = arma_arg::eval( A[i] ); } } else { for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { *out_mem = arma_arg::eval( P.at(row,col) ); out_mem++; } } } template inline void op_arg::apply( Cube& out, const mtOpCube& X ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const ProxyCube P(X.m); const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_slices = P.get_n_slices(); out.set_size(n_rows, n_cols, n_slices); T* out_mem = out.memptr(); if(ProxyCube::use_at == false) { typedef typename ProxyCube::ea_type ea_type; const uword n_elem = P.get_n_elem(); ea_type A = P.get_ea(); for(uword i=0; i < n_elem; ++i) { out_mem[i] = arma_arg::eval( A[i] ); } } else { for(uword slice=0; slice < n_slices; ++slice) for(uword col=0; col < n_cols; ++col ) for(uword row=0; row < n_rows; ++row ) { *out_mem = arma_arg::eval( P.at(row,col,slice) ); out_mem++; } } } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_randn.hpp0000644000176200001440000001056314124060717022675 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_randn //! @{ arma_warn_unused inline double randn() { return double(arma_rng::randn()); } template arma_warn_unused inline typename arma_real_or_cx_only::result randn() { return eT(arma_rng::randn()); } //! Generate a vector with all elements set to random values with a gaussian distribution (zero mean, unit variance) arma_warn_unused arma_inline const Gen randn(const uword n_elem) { arma_extra_debug_sigprint(); return Gen(n_elem, 1); } template arma_warn_unused arma_inline const Gen randn(const uword n_elem, const arma_empty_class junk1 = arma_empty_class(), const typename arma_Mat_Col_Row_only::result* junk2 = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); const uword n_rows = (is_Row::value) ? uword(1) : n_elem; const uword n_cols = (is_Row::value) ? n_elem : uword(1); return Gen(n_rows, n_cols); } //! Generate a dense matrix with all elements set to random values with a gaussian distribution (zero mean, unit variance) arma_warn_unused arma_inline const Gen randn(const uword n_rows, const uword n_cols) { arma_extra_debug_sigprint(); return Gen(n_rows, n_cols); } arma_warn_unused arma_inline const Gen randn(const SizeMat& s) { arma_extra_debug_sigprint(); return Gen(s.n_rows, s.n_cols); } template arma_warn_unused arma_inline const Gen randn(const uword n_rows, const uword n_cols, const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); if(is_Col::value) { arma_debug_check( (n_cols != 1), "randn(): incompatible size" ); } else if(is_Row::value) { arma_debug_check( (n_rows != 1), "randn(): incompatible size" ); } return Gen(n_rows, n_cols); } template arma_warn_unused arma_inline const Gen randn(const SizeMat& s, const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return randn(s.n_rows, s.n_cols); } arma_warn_unused arma_inline const GenCube randn(const uword n_rows, const uword n_cols, const uword n_slices) { arma_extra_debug_sigprint(); return GenCube(n_rows, n_cols, n_slices); } arma_warn_unused arma_inline const GenCube randn(const SizeCube& s) { arma_extra_debug_sigprint(); return GenCube(s.n_rows, s.n_cols, s.n_slices); } template arma_warn_unused arma_inline const GenCube randn(const uword n_rows, const uword n_cols, const uword n_slices, const typename arma_Cube_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return GenCube(n_rows, n_cols, n_slices); } template arma_warn_unused arma_inline const GenCube randn(const SizeCube& s, const typename arma_Cube_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return GenCube(s.n_rows, s.n_cols, s.n_slices); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_toeplitz.hpp0000644000176200001440000000305014124060717023436 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_toeplitz //! @{ template arma_warn_unused inline const Op toeplitz(const Base& X) { arma_extra_debug_sigprint(); return Op( X.get_ref() ); } template arma_warn_unused inline const Op circ_toeplitz(const Base& X) { arma_extra_debug_sigprint(); return Op( X.get_ref() ); } template arma_warn_unused inline const Glue toeplitz(const Base& X, const Base& Y) { arma_extra_debug_sigprint(); return Glue( X.get_ref(), Y.get_ref() ); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_index_min.hpp0000644000176200001440000000617714124060717023553 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_index_min //! @{ template arma_warn_unused inline typename enable_if2< is_arma_type::value && resolves_to_vector::yes, uword>::result index_min(const T1& X) { arma_extra_debug_sigprint(); return X.index_min(); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value && resolves_to_vector::no, const mtOp >::result index_min(const T1& X) { arma_extra_debug_sigprint(); return mtOp(X, 0, 0); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const mtOp >::result index_min(const T1& X, const uword dim) { arma_extra_debug_sigprint(); return mtOp(X, dim, 0); } template arma_warn_unused arma_inline const mtOpCube index_min ( const BaseCube& X, const uword dim = 0 ) { arma_extra_debug_sigprint(); return mtOpCube(X.get_ref(), dim, 0, 0); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value && resolves_to_sparse_vector::yes, typename T1::elem_type >::result index_min(const T1& x) { arma_extra_debug_sigprint(); return x.index_min(); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value && resolves_to_sparse_vector::no, Mat >::result index_min(const T1& X) { arma_extra_debug_sigprint(); Mat out; op_index_min::apply(out, X, 0); return out; } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value, Mat >::result index_min(const T1& X, const uword dim) { arma_extra_debug_sigprint(); Mat out; op_index_min::apply(out, X, dim); return out; } arma_warn_unused inline uword index_min(const SizeMat& s) { return (s.n_rows <= s.n_cols) ? uword(0) : uword(1); } arma_warn_unused inline uword index_min(const SizeCube& s) { const uword tmp_val = (s.n_rows <= s.n_cols) ? s.n_rows : s.n_cols; const uword tmp_index = (s.n_rows <= s.n_cols) ? uword(0) : uword(1); return (tmp_val <= s.n_slices) ? tmp_index : uword(2); } //! @} RcppArmadillo/inst/include/armadillo_bits/typedef_mat.hpp0000644000176200001440000000756114124060717023415 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup typedef_mat //! @{ typedef Mat uchar_mat; typedef Col uchar_vec; typedef Col uchar_colvec; typedef Row uchar_rowvec; typedef Cube uchar_cube; typedef Mat u32_mat; typedef Col u32_vec; typedef Col u32_colvec; typedef Row u32_rowvec; typedef Cube u32_cube; typedef Mat s32_mat; typedef Col s32_vec; typedef Col s32_colvec; typedef Row s32_rowvec; typedef Cube s32_cube; typedef Mat u64_mat; typedef Col u64_vec; typedef Col u64_colvec; typedef Row u64_rowvec; typedef Cube u64_cube; typedef Mat s64_mat; typedef Col s64_vec; typedef Col s64_colvec; typedef Row s64_rowvec; typedef Cube s64_cube; typedef Mat umat; typedef Col uvec; typedef Col ucolvec; typedef Row urowvec; typedef Cube ucube; typedef Mat imat; typedef Col ivec; typedef Col icolvec; typedef Row irowvec; typedef Cube icube; typedef Mat fmat; typedef Col fvec; typedef Col fcolvec; typedef Row frowvec; typedef Cube fcube; typedef Mat dmat; typedef Col dvec; typedef Col dcolvec; typedef Row drowvec; typedef Cube dcube; typedef Mat mat; typedef Col vec; typedef Col colvec; typedef Row rowvec; typedef Cube cube; typedef Mat cx_fmat; typedef Col cx_fvec; typedef Col cx_fcolvec; typedef Row cx_frowvec; typedef Cube cx_fcube; typedef Mat cx_dmat; typedef Col cx_dvec; typedef Col cx_dcolvec; typedef Row cx_drowvec; typedef Cube cx_dcube; typedef Mat cx_mat; typedef Col cx_vec; typedef Col cx_colvec; typedef Row cx_rowvec; typedef Cube cx_cube; typedef SpMat sp_umat; typedef SpCol sp_uvec; typedef SpCol sp_ucolvec; typedef SpRow sp_urowvec; typedef SpMat sp_imat; typedef SpCol sp_ivec; typedef SpCol sp_icolvec; typedef SpRow sp_irowvec; typedef SpMat sp_fmat; typedef SpCol sp_fvec; typedef SpCol sp_fcolvec; typedef SpRow sp_frowvec; typedef SpMat sp_dmat; typedef SpCol sp_dvec; typedef SpCol sp_dcolvec; typedef SpRow sp_drowvec; typedef SpMat sp_mat; typedef SpCol sp_vec; typedef SpCol sp_colvec; typedef SpRow sp_rowvec; typedef SpMat sp_cx_fmat; typedef SpCol sp_cx_fvec; typedef SpCol sp_cx_fcolvec; typedef SpRow sp_cx_frowvec; typedef SpMat sp_cx_dmat; typedef SpCol sp_cx_dvec; typedef SpCol sp_cx_dcolvec; typedef SpRow sp_cx_drowvec; typedef SpMat sp_cx_mat; typedef SpCol sp_cx_vec; typedef SpCol sp_cx_colvec; typedef SpRow sp_cx_rowvec; //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_SymEigsShiftSolver_bones.hpp0000644000176200001440000000257014124060717027422 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { //! This class implements the eigen solver for real symmetric matrices in the shift-and-invert mode. template class SymEigsShiftSolver : public SymEigsSolver { private: const eT sigma; // Sort the first nev Ritz pairs in ascending algebraic order // This is used to return the final results void sort_ritzpair(); public: //! Constructor to create a solver object. inline SymEigsShiftSolver(const OpType& op_, uword nev_, uword ncv_, const eT sigma_); }; } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/fn_norm.hpp0000644000176200001440000001711214160256234022544 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_norm //! @{ template inline arma_warn_unused typename enable_if2< is_arma_type::value, typename T1::pod_type >::result norm ( const T1& X, const uword k = uword(2), const typename arma_real_or_cx_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::pod_type T; const Proxy P(X); if(P.get_n_elem() == 0) { return T(0); } const bool is_vec = (T1::is_xvec) || (T1::is_row) || (T1::is_col) || (P.get_n_rows() == 1) || (P.get_n_cols() == 1); if(is_vec) { if(k == uword(1)) { return op_norm::vec_norm_1(P); } if(k == uword(2)) { return op_norm::vec_norm_2(P); } arma_debug_check( (k == 0), "norm(): k must be greater than zero" ); return op_norm::vec_norm_k(P, int(k)); } else { const quasi_unwrap::stored_type> U(P.Q); if(k == uword(1)) { return op_norm::mat_norm_1(U.M); } if(k == uword(2)) { return op_norm::mat_norm_2(U.M); } arma_stop_logic_error("norm(): unsupported matrix norm type"); } return T(0); } template inline arma_warn_unused typename enable_if2< is_arma_type::value, typename T1::pod_type >::result norm ( const T1& X, const char* method, const typename arma_real_or_cx_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::pod_type T; const Proxy P(X); if(P.get_n_elem() == 0) { return T(0); } const char sig = (method != nullptr) ? method[0] : char(0); const bool is_vec = (T1::is_xvec) || (T1::is_row) || (T1::is_col) || (P.get_n_rows() == 1) || (P.get_n_cols() == 1); if(is_vec) { if( (sig == 'i') || (sig == 'I') || (sig == '+') ) { return op_norm::vec_norm_max(P); } if( (sig == '-') ) { return op_norm::vec_norm_min(P); } if( (sig == 'f') || (sig == 'F') ) { return op_norm::vec_norm_2(P); } arma_stop_logic_error("norm(): unsupported vector norm type"); } else { if( (sig == 'i') || (sig == 'I') || (sig == '+') ) // inf norm { const quasi_unwrap::stored_type> U(P.Q); return op_norm::mat_norm_inf(U.M); } else if( (sig == 'f') || (sig == 'F') ) { return op_norm::vec_norm_2(P); } arma_stop_logic_error("norm(): unsupported matrix norm type"); } return T(0); } template inline arma_warn_unused typename enable_if2< is_arma_type::value, double >::result norm ( const T1& X, const uword k = uword(2), const typename arma_integral_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); if(resolves_to_colvector::value) { return norm(conv_to< Col >::from(X), k); } if(resolves_to_rowvector::value) { return norm(conv_to< Row >::from(X), k); } return norm(conv_to< Mat >::from(X), k); } template inline arma_warn_unused typename enable_if2< is_arma_type::value, double >::result norm ( const T1& X, const char* method, const typename arma_integral_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); if(resolves_to_colvector::value) { return norm(conv_to< Col >::from(X), method); } if(resolves_to_rowvector::value) { return norm(conv_to< Row >::from(X), method); } return norm(conv_to< Mat >::from(X), method); } // // norms for sparse matrices template inline arma_warn_unused typename enable_if2< is_arma_sparse_type::value, typename T1::pod_type >::result norm ( const T1& expr, const uword k = uword(2), const typename arma_real_or_cx_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const unwrap_spmat U(expr); const SpMat& X = U.M; if(X.n_nonzero == 0) { return T(0); } const bool is_vec = (T1::is_xvec) || (T1::is_row) || (T1::is_col) || (X.n_rows == 1) || (X.n_cols == 1); if(is_vec) { // create a fake dense vector to allow reuse of code for dense vectors Col fake_vector( access::rwp(X.values), X.n_nonzero, false ); const Proxy< Col > P_fake_vector(fake_vector); if(k == uword(1)) { return op_norm::vec_norm_1(P_fake_vector); } if(k == uword(2)) { return op_norm::vec_norm_2(P_fake_vector); } arma_debug_check( (k == 0), "norm(): k must be greater than zero" ); return op_norm::vec_norm_k(P_fake_vector, int(k)); } else { if(k == uword(1)) { return spop_norm::mat_norm_1(X); } if(k == uword(2)) { return spop_norm::mat_norm_2(X); } arma_stop_logic_error("norm(): unsupported or unimplemented norm type for sparse matrices"); } return T(0); } template inline arma_warn_unused typename enable_if2< is_arma_sparse_type::value, typename T1::pod_type >::result norm ( const T1& expr, const char* method, const typename arma_real_or_cx_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const unwrap_spmat U(expr); const SpMat& X = U.M; if(X.n_nonzero == 0) { return T(0); } // create a fake dense vector to allow reuse of code for dense vectors Col fake_vector( access::rwp(X.values), X.n_nonzero, false ); const Proxy< Col > P_fake_vector(fake_vector); const char sig = (method != nullptr) ? method[0] : char(0); const bool is_vec = (T1::is_xvec) || (T1::is_row) || (T1::is_col) || (X.n_rows == 1) || (X.n_cols == 1); if(is_vec) { if( (sig == 'i') || (sig == 'I') || (sig == '+') ) // max norm { return op_norm::vec_norm_max(P_fake_vector); } else if(sig == '-') // min norm { const T val = op_norm::vec_norm_min(P_fake_vector); return (X.n_nonzero < X.n_elem) ? T((std::min)(T(0), val)) : T(val); } else if( (sig == 'f') || (sig == 'F') ) { return op_norm::vec_norm_2(P_fake_vector); } arma_stop_logic_error("norm(): unsupported vector norm type"); } else { if( (sig == 'i') || (sig == 'I') || (sig == '+') ) // inf norm { return spop_norm::mat_norm_inf(X); } else if( (sig == 'f') || (sig == 'F') ) { return op_norm::vec_norm_2(P_fake_vector); } arma_stop_logic_error("norm(): unsupported matrix norm type"); } return T(0); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_any.hpp0000644000176200001440000000357014124060717022362 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_any //! @{ template arma_warn_unused inline typename enable_if2 < is_arma_type::value && resolves_to_vector::yes, bool >::result any(const T1& X) { arma_extra_debug_sigprint(); return op_any::any_vec(X); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && resolves_to_vector::no, const mtOp >::result any(const T1& X) { arma_extra_debug_sigprint(); return mtOp(X, 0, 0); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value, const mtOp >::result any(const T1& X, const uword dim) { arma_extra_debug_sigprint(); return mtOp(X, dim, 0); } //! for compatibility purposes: allows compiling user code designed for earlier versions of Armadillo template arma_warn_unused arma_inline typename enable_if2 < is_supported_elem_type::value, bool >::result any(const T& val) { return (val != T(0)); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_strans.hpp0000644000176200001440000000513114124060717023100 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_strans //! @{ template arma_warn_unused arma_inline const Op strans ( const T1& X, const typename enable_if< is_arma_type::value >::result* junk1 = nullptr, const typename arma_cx_only::result* junk2 = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); return Op(X); } // NOTE: for non-complex objects, deliberately returning op_htrans instead of op_strans, // NOTE: due to currently more optimisations available when using op_htrans, especially by glue_times template arma_warn_unused arma_inline const Op strans ( const T1& X, const typename enable_if< is_arma_type::value >::result* junk1 = nullptr, const typename arma_not_cx::result* junk2 = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); return Op(X); } // // handling of sparse matrices template arma_warn_unused arma_inline const SpOp strans ( const T1& X, const typename enable_if< is_arma_sparse_type::value >::result* junk1 = nullptr, const typename arma_cx_only::result* junk2 = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); return SpOp(X); } template arma_warn_unused arma_inline const SpOp strans ( const T1& X, const typename enable_if< is_arma_sparse_type::value >::result* junk1 = nullptr, const typename arma_not_cx::result* junk2 = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); return SpOp(X); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_accu.hpp0000644000176200001440000005555314160256234022517 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_accu //! @{ template arma_hot inline typename T1::elem_type accu_proxy_linear(const Proxy& P) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; eT val = eT(0); typename Proxy::ea_type Pea = P.get_ea(); const uword n_elem = P.get_n_elem(); if( arma_config::openmp && Proxy::use_mp && mp_gate::eval(n_elem) ) { #if defined(ARMA_USE_OPENMP) { // NOTE: using parallelisation with manual reduction workaround to take into account complex numbers; // NOTE: OpenMP versions lower than 4.0 do not support user-defined reduction const int n_threads_max = mp_thread_limit::get(); const uword n_threads_use = (std::min)(uword(podarray_prealloc_n_elem::val), uword(n_threads_max)); const uword chunk_size = n_elem / n_threads_use; podarray partial_accs(n_threads_use); #pragma omp parallel for schedule(static) num_threads(int(n_threads_use)) for(uword thread_id=0; thread_id < n_threads_use; ++thread_id) { const uword start = (thread_id+0) * chunk_size; const uword endp1 = (thread_id+1) * chunk_size; eT acc = eT(0); for(uword i=start; i < endp1; ++i) { acc += Pea[i]; } partial_accs[thread_id] = acc; } for(uword thread_id=0; thread_id < n_threads_use; ++thread_id) { val += partial_accs[thread_id]; } for(uword i=(n_threads_use*chunk_size); i < n_elem; ++i) { val += Pea[i]; } } #endif } else { #if defined(__FINITE_MATH_ONLY__) && (__FINITE_MATH_ONLY__ > 0) { if(P.is_aligned()) { typename Proxy::aligned_ea_type Pea_aligned = P.get_aligned_ea(); for(uword i=0; i arma_hot inline typename T1::elem_type accu_proxy_at_mp(const Proxy& P) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; eT val = eT(0); #if defined(ARMA_USE_OPENMP) { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); if(n_cols == 1) { const int n_threads_max = mp_thread_limit::get(); const uword n_threads_use = (std::min)(uword(podarray_prealloc_n_elem::val), uword(n_threads_max)); const uword chunk_size = n_rows / n_threads_use; podarray partial_accs(n_threads_use); #pragma omp parallel for schedule(static) num_threads(int(n_threads_use)) for(uword thread_id=0; thread_id < n_threads_use; ++thread_id) { const uword start = (thread_id+0) * chunk_size; const uword endp1 = (thread_id+1) * chunk_size; eT acc = eT(0); for(uword i=start; i < endp1; ++i) { acc += P.at(i,0); } partial_accs[thread_id] = acc; } for(uword thread_id=0; thread_id < n_threads_use; ++thread_id) { val += partial_accs[thread_id]; } for(uword i=(n_threads_use*chunk_size); i < n_rows; ++i) { val += P.at(i,0); } } else if(n_rows == 1) { const int n_threads_max = mp_thread_limit::get(); const uword n_threads_use = (std::min)(uword(podarray_prealloc_n_elem::val), uword(n_threads_max)); const uword chunk_size = n_cols / n_threads_use; podarray partial_accs(n_threads_use); #pragma omp parallel for schedule(static) num_threads(int(n_threads_use)) for(uword thread_id=0; thread_id < n_threads_use; ++thread_id) { const uword start = (thread_id+0) * chunk_size; const uword endp1 = (thread_id+1) * chunk_size; eT acc = eT(0); for(uword i=start; i < endp1; ++i) { acc += P.at(0,i); } partial_accs[thread_id] = acc; } for(uword thread_id=0; thread_id < n_threads_use; ++thread_id) { val += partial_accs[thread_id]; } for(uword i=(n_threads_use*chunk_size); i < n_cols; ++i) { val += P.at(0,i); } } else { podarray col_accs(n_cols); const int n_threads = mp_thread_limit::get(); #pragma omp parallel for schedule(static) num_threads(n_threads) for(uword col=0; col < n_cols; ++col) { eT val1 = eT(0); eT val2 = eT(0); uword i,j; for(i=0, j=1; j < n_rows; i+=2, j+=2) { val1 += P.at(i,col); val2 += P.at(j,col); } if(i < n_rows) { val1 += P.at(i,col); } col_accs[col] = val1 + val2; } val = arrayops::accumulate(col_accs.memptr(), n_cols); } } #else { arma_ignore(P); } #endif return val; } template arma_hot inline typename T1::elem_type accu_proxy_at(const Proxy& P) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(arma_config::openmp && Proxy::use_mp && mp_gate::eval(P.get_n_elem())) { return accu_proxy_at_mp(P); } const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); eT val = eT(0); if(n_rows != 1) { eT val1 = eT(0); eT val2 = eT(0); for(uword col=0; col < n_cols; ++col) { uword i,j; for(i=0, j=1; j < n_rows; i+=2, j+=2) { val1 += P.at(i,col); val2 += P.at(j,col); } if(i < n_rows) { val1 += P.at(i,col); } } val = val1 + val2; } else { for(uword col=0; col < n_cols; ++col) { val += P.at(0,col); } } return val; } //! accumulate the elements of a matrix template arma_warn_unused arma_hot inline typename enable_if2< is_arma_type::value, typename T1::elem_type >::result accu(const T1& X) { arma_extra_debug_sigprint(); const Proxy P(X); if(is_Mat::stored_type>::value || is_subview_col::stored_type>::value) { const quasi_unwrap::stored_type> tmp(P.Q); return arrayops::accumulate(tmp.M.memptr(), tmp.M.n_elem); } return (Proxy::use_at) ? accu_proxy_at(P) : accu_proxy_linear(P); } //! explicit handling of multiply-and-accumulate template arma_warn_unused inline typename T1::elem_type accu(const eGlue& expr) { arma_extra_debug_sigprint(); typedef eGlue expr_type; typedef typename expr_type::proxy1_type::stored_type P1_stored_type; typedef typename expr_type::proxy2_type::stored_type P2_stored_type; const bool have_direct_mem_1 = (is_Mat::value) || (is_subview_col::value); const bool have_direct_mem_2 = (is_Mat::value) || (is_subview_col::value); if(have_direct_mem_1 && have_direct_mem_2) { const quasi_unwrap tmp1(expr.P1.Q); const quasi_unwrap tmp2(expr.P2.Q); return op_dot::direct_dot(tmp1.M.n_elem, tmp1.M.memptr(), tmp2.M.memptr()); } const Proxy P(expr); return (Proxy::use_at) ? accu_proxy_at(P) : accu_proxy_linear(P); } //! explicit handling of Hamming norm (also known as zero norm) template arma_warn_unused inline uword accu(const mtOp& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const eT val = X.aux; const Proxy P(X.m); uword n_nonzero = 0; if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; ea_type A = P.get_ea(); const uword n_elem = P.get_n_elem(); for(uword i=0; i arma_warn_unused inline uword accu(const mtOp& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const eT val = X.aux; const Proxy P(X.m); uword n_nonzero = 0; if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; ea_type A = P.get_ea(); const uword n_elem = P.get_n_elem(); for(uword i=0; i arma_warn_unused inline uword accu(const mtGlue& X) { arma_extra_debug_sigprint(); const Proxy PA(X.A); const Proxy PB(X.B); arma_debug_assert_same_size(PA, PB, "operator!="); uword n_nonzero = 0; if( (Proxy::use_at == false) && (Proxy::use_at == false) ) { typedef typename Proxy::ea_type PA_ea_type; typedef typename Proxy::ea_type PB_ea_type; PA_ea_type A = PA.get_ea(); PB_ea_type B = PB.get_ea(); const uword n_elem = PA.get_n_elem(); for(uword i=0; i < n_elem; ++i) { n_nonzero += (A[i] != B[i]) ? uword(1) : uword(0); } } else { const uword PA_n_cols = PA.get_n_cols(); const uword PA_n_rows = PA.get_n_rows(); if(PA_n_rows == 1) { for(uword col=0; col < PA_n_cols; ++col) { n_nonzero += (PA.at(0,col) != PB.at(0,col)) ? uword(1) : uword(0); } } else { for(uword col=0; col < PA_n_cols; ++col) for(uword row=0; row < PA_n_rows; ++row) { n_nonzero += (PA.at(row,col) != PB.at(row,col)) ? uword(1) : uword(0); } } } return n_nonzero; } template arma_warn_unused inline uword accu(const mtGlue& X) { arma_extra_debug_sigprint(); const Proxy PA(X.A); const Proxy PB(X.B); arma_debug_assert_same_size(PA, PB, "operator=="); uword n_nonzero = 0; if( (Proxy::use_at == false) && (Proxy::use_at == false) ) { typedef typename Proxy::ea_type PA_ea_type; typedef typename Proxy::ea_type PB_ea_type; PA_ea_type A = PA.get_ea(); PB_ea_type B = PB.get_ea(); const uword n_elem = PA.get_n_elem(); for(uword i=0; i < n_elem; ++i) { n_nonzero += (A[i] == B[i]) ? uword(1) : uword(0); } } else { const uword PA_n_cols = PA.get_n_cols(); const uword PA_n_rows = PA.get_n_rows(); if(PA_n_rows == 1) { for(uword col=0; col < PA_n_cols; ++col) { n_nonzero += (PA.at(0,col) == PB.at(0,col)) ? uword(1) : uword(0); } } else { for(uword col=0; col < PA_n_cols; ++col) for(uword row=0; row < PA_n_rows; ++row) { n_nonzero += (PA.at(row,col) == PB.at(row,col)) ? uword(1) : uword(0); } } } return n_nonzero; } //! accumulate the elements of a subview (submatrix) template arma_warn_unused arma_hot inline eT accu(const subview& X) { arma_extra_debug_sigprint(); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(X_n_rows == 1) { const Mat& m = X.m; const uword col_offset = X.aux_col1; const uword row_offset = X.aux_row1; eT val1 = eT(0); eT val2 = eT(0); uword i,j; for(i=0, j=1; j < X_n_cols; i+=2, j+=2) { val1 += m.at(row_offset, col_offset + i); val2 += m.at(row_offset, col_offset + j); } if(i < X_n_cols) { val1 += m.at(row_offset, col_offset + i); } return val1 + val2; } if(X_n_cols == 1) { return arrayops::accumulate( X.colptr(0), X_n_rows ); } eT val = eT(0); for(uword col=0; col < X_n_cols; ++col) { val += arrayops::accumulate( X.colptr(col), X_n_rows ); } return val; } template arma_warn_unused arma_hot inline eT accu(const subview_col& X) { arma_extra_debug_sigprint(); return arrayops::accumulate( X.colmem, X.n_rows ); } // template arma_hot inline typename T1::elem_type accu_cube_proxy_linear(const ProxyCube& P) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; eT val = eT(0); typename ProxyCube::ea_type Pea = P.get_ea(); const uword n_elem = P.get_n_elem(); if( arma_config::openmp && ProxyCube::use_mp && mp_gate::eval(n_elem) ) { #if defined(ARMA_USE_OPENMP) { // NOTE: using parallelisation with manual reduction workaround to take into account complex numbers; // NOTE: OpenMP versions lower than 4.0 do not support user-defined reduction const int n_threads_max = mp_thread_limit::get(); const uword n_threads_use = (std::min)(uword(podarray_prealloc_n_elem::val), uword(n_threads_max)); const uword chunk_size = n_elem / n_threads_use; podarray partial_accs(n_threads_use); #pragma omp parallel for schedule(static) num_threads(int(n_threads_use)) for(uword thread_id=0; thread_id < n_threads_use; ++thread_id) { const uword start = (thread_id+0) * chunk_size; const uword endp1 = (thread_id+1) * chunk_size; eT acc = eT(0); for(uword i=start; i < endp1; ++i) { acc += Pea[i]; } partial_accs[thread_id] = acc; } for(uword thread_id=0; thread_id < n_threads_use; ++thread_id) { val += partial_accs[thread_id]; } for(uword i=(n_threads_use*chunk_size); i < n_elem; ++i) { val += Pea[i]; } } #endif } else { #if defined(__FINITE_MATH_ONLY__) && (__FINITE_MATH_ONLY__ > 0) { if(P.is_aligned()) { typename ProxyCube::aligned_ea_type Pea_aligned = P.get_aligned_ea(); for(uword i=0; i arma_hot inline typename T1::elem_type accu_cube_proxy_at_mp(const ProxyCube& P) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; eT val = eT(0); #if defined(ARMA_USE_OPENMP) { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_slices = P.get_n_slices(); podarray slice_accs(n_slices); const int n_threads = mp_thread_limit::get(); #pragma omp parallel for schedule(static) num_threads(n_threads) for(uword slice = 0; slice < n_slices; ++slice) { eT val1 = eT(0); eT val2 = eT(0); for(uword col = 0; col < n_cols; ++col) { uword i,j; for(i=0, j=1; j arma_hot inline typename T1::elem_type accu_cube_proxy_at(const ProxyCube& P) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(arma_config::openmp && ProxyCube::use_mp && mp_gate::eval(P.get_n_elem())) { return accu_cube_proxy_at_mp(P); } const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_slices = P.get_n_slices(); eT val1 = eT(0); eT val2 = eT(0); for(uword slice = 0; slice < n_slices; ++slice) for(uword col = 0; col < n_cols; ++col ) { uword i,j; for(i=0, j=1; j arma_warn_unused arma_hot inline typename T1::elem_type accu(const BaseCube& X) { arma_extra_debug_sigprint(); const ProxyCube P(X.get_ref()); if(is_Cube::stored_type>::value) { unwrap_cube::stored_type> tmp(P.Q); return arrayops::accumulate(tmp.M.memptr(), tmp.M.n_elem); } return (ProxyCube::use_at) ? accu_cube_proxy_at(P) : accu_cube_proxy_linear(P); } //! explicit handling of multiply-and-accumulate (cube version) template arma_warn_unused inline typename T1::elem_type accu(const eGlueCube& expr) { arma_extra_debug_sigprint(); typedef eGlueCube expr_type; typedef typename ProxyCube::stored_type P1_stored_type; typedef typename ProxyCube::stored_type P2_stored_type; if(is_Cube::value && is_Cube::value) { const unwrap_cube tmp1(expr.P1.Q); const unwrap_cube tmp2(expr.P2.Q); return op_dot::direct_dot(tmp1.M.n_elem, tmp1.M.memptr(), tmp2.M.memptr()); } const ProxyCube P(expr); return (ProxyCube::use_at) ? accu_cube_proxy_at(P) : accu_cube_proxy_linear(P); } // template arma_warn_unused inline typename arma_scalar_only::result accu(const T& x) { return x; } //! accumulate values in a sparse object template arma_warn_unused inline typename T1::elem_type accu(const SpBase& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const SpProxy P(expr.get_ref()); if(SpProxy::use_iterator == false) { // direct counting return arrayops::accumulate(P.get_values(), P.get_n_nonzero()); } else { typename SpProxy::const_iterator_type it = P.begin(); const uword P_n_nz = P.get_n_nonzero(); eT val = eT(0); for(uword i=0; i < P_n_nz; ++i) { val += (*it); ++it; } return val; } } //! explicit handling of accu(A + B), where A and B are sparse matrices template arma_warn_unused inline typename T1::elem_type accu(const SpGlue& expr) { arma_extra_debug_sigprint(); const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); arma_debug_assert_same_size(UA.M.n_rows, UA.M.n_cols, UB.M.n_rows, UB.M.n_cols, "addition"); return (accu(UA.M) + accu(UB.M)); } //! explicit handling of accu(A - B), where A and B are sparse matrices template arma_warn_unused inline typename T1::elem_type accu(const SpGlue& expr) { arma_extra_debug_sigprint(); const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); arma_debug_assert_same_size(UA.M.n_rows, UA.M.n_cols, UB.M.n_rows, UB.M.n_cols, "subtraction"); return (accu(UA.M) - accu(UB.M)); } //! explicit handling of accu(A % B), where A and B are sparse matrices template arma_warn_unused inline typename T1::elem_type accu(const SpGlue& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const SpProxy px(expr.A); const SpProxy py(expr.B); typename SpProxy::const_iterator_type x_it = px.begin(); typename SpProxy::const_iterator_type x_it_end = px.end(); typename SpProxy::const_iterator_type y_it = py.begin(); typename SpProxy::const_iterator_type y_it_end = py.end(); eT acc = eT(0); while( (x_it != x_it_end) || (y_it != y_it_end) ) { if(x_it == y_it) { acc += ((*x_it) * (*y_it)); ++x_it; ++y_it; } else { const uword x_it_col = x_it.col(); const uword x_it_row = x_it.row(); const uword y_it_col = y_it.col(); const uword y_it_row = y_it.row(); if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end { ++x_it; } else // x is closer to the end { ++y_it; } } } return acc; } template arma_warn_unused inline typename T1::elem_type accu(const SpOp& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const bool is_vectorise = \ (is_same_type::yes) || (is_same_type::yes) || (is_same_type::yes); if(is_vectorise) { return accu(expr.m); } const SpMat tmp = expr; return accu(tmp); } //! @} RcppArmadillo/inst/include/armadillo_bits/SpCol_bones.hpp0000644000176200001440000000570514124060717023320 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpCol //! @{ //! Class for sparse column vectors (matrices with only one column) template class SpCol : public SpMat { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; inline SpCol(); inline explicit SpCol(const uword n_elem); inline explicit SpCol(const uword in_rows, const uword in_cols); inline explicit SpCol(const SizeMat& s); inline SpCol(const char* text); inline SpCol& operator=(const char* text); inline SpCol(const std::string& text); inline SpCol& operator=(const std::string& text); inline SpCol& operator=(const eT val); template inline SpCol(const Base& X); template inline SpCol& operator=(const Base& X); template inline SpCol(const SpBase& X); template inline SpCol& operator=(const SpBase& X); template inline explicit SpCol(const SpBase& A, const SpBase& B); inline arma_warn_unused const SpOp,spop_htrans> t() const; inline arma_warn_unused const SpOp,spop_htrans> ht() const; inline arma_warn_unused const SpOp,spop_strans> st() const; inline void shed_row (const uword row_num); inline void shed_rows(const uword in_row1, const uword in_row2); // inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero = true); typedef typename SpMat::iterator row_iterator; typedef typename SpMat::const_iterator const_row_iterator; inline row_iterator begin_row(const uword row_num = 0); inline const_row_iterator begin_row(const uword row_num = 0) const; inline row_iterator end_row (const uword row_num = 0); inline const_row_iterator end_row (const uword row_num = 0) const; #ifdef ARMA_EXTRA_SPCOL_PROTO #include ARMA_INCFILE_WRAP(ARMA_EXTRA_SPCOL_PROTO) #endif }; RcppArmadillo/inst/include/armadillo_bits/spop_misc_meat.hpp0000644000176200001440000002647514124060717024123 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_misc //! @{ namespace priv { template struct functor_scalar_times { const eT k; functor_scalar_times(const eT in_k) : k(in_k) {} arma_inline eT operator()(const eT val) const { return val * k; } }; } template inline void spop_scalar_times::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(in.aux != eT(0)) { out.init_xform(in.m, priv::functor_scalar_times(in.aux)); } else { const SpProxy P(in.m); out.zeros( P.get_n_rows(), P.get_n_cols() ); } } namespace priv { template struct functor_cx_scalar_times { typedef std::complex out_eT; const out_eT k; functor_cx_scalar_times(const out_eT in_k) : k(in_k) {} arma_inline out_eT operator()(const T val) const { return val * k; } }; } template inline void spop_cx_scalar_times::apply(SpMat< std::complex >& out, const mtSpOp< std::complex, T1, spop_cx_scalar_times >& in) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; typedef typename std::complex out_eT; if(in.aux_out_eT != out_eT(0)) { out.init_xform_mt(in.m, priv::functor_cx_scalar_times(in.aux_out_eT)); } else { const SpProxy P(in.m); out.zeros( P.get_n_rows(), P.get_n_cols() ); } } namespace priv { struct functor_square { template arma_inline eT operator()(const eT val) const { return val*val; } }; } template inline void spop_square::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); out.init_xform(in.m, priv::functor_square()); } namespace priv { struct functor_sqrt { template arma_inline eT operator()(const eT val) const { return eop_aux::sqrt(val); } }; } template inline void spop_sqrt::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); out.init_xform(in.m, priv::functor_sqrt()); } namespace priv { struct functor_abs { template arma_inline eT operator()(const eT val) const { return eop_aux::arma_abs(val); } }; } template inline void spop_abs::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); out.init_xform(in.m, priv::functor_abs()); } namespace priv { struct functor_cx_abs { template arma_inline T operator()(const std::complex& val) const { return std::abs(val); } }; } template inline void spop_cx_abs::apply(SpMat& out, const mtSpOp& in) { arma_extra_debug_sigprint(); out.init_xform_mt(in.m, priv::functor_cx_abs()); } namespace priv { struct functor_arg { template arma_inline eT operator()(const eT val) const { return arma_arg::eval(val); } }; } template inline void spop_arg::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); out.init_xform(in.m, priv::functor_arg()); } namespace priv { struct functor_cx_arg { template arma_inline T operator()(const std::complex& val) const { return std::arg(val); } }; } template inline void spop_cx_arg::apply(SpMat& out, const mtSpOp& in) { arma_extra_debug_sigprint(); out.init_xform_mt(in.m, priv::functor_cx_arg()); } namespace priv { struct functor_real { template arma_inline T operator()(const std::complex& val) const { return val.real(); } }; } template inline void spop_real::apply(SpMat& out, const mtSpOp& in) { arma_extra_debug_sigprint(); out.init_xform_mt(in.m, priv::functor_real()); } namespace priv { struct functor_imag { template arma_inline T operator()(const std::complex& val) const { return val.imag(); } }; } template inline void spop_imag::apply(SpMat& out, const mtSpOp& in) { arma_extra_debug_sigprint(); out.init_xform_mt(in.m, priv::functor_imag()); } namespace priv { struct functor_conj { template arma_inline eT operator()(const eT val) const { return eop_aux::conj(val); } }; } template inline void spop_conj::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); out.init_xform(in.m, priv::functor_conj()); } template inline void spop_repelem::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat U(in.m); const SpMat& X = U.M; const uword copies_per_row = in.aux_uword_a; const uword copies_per_col = in.aux_uword_b; const uword out_n_rows = X.n_rows * copies_per_row; const uword out_n_cols = X.n_cols * copies_per_col; const uword out_nnz = X.n_nonzero * copies_per_row * copies_per_col; if( (out_n_rows > 0) && (out_n_cols > 0) && (out_nnz > 0) ) { umat locs(2, out_nnz, arma_nozeros_indicator()); Col vals( out_nnz, arma_nozeros_indicator()); uword* locs_mem = locs.memptr(); eT* vals_mem = vals.memptr(); typename SpMat::const_iterator X_it = X.begin(); typename SpMat::const_iterator X_end = X.end(); for(; X_it != X_end; ++X_it) { const uword col_base = copies_per_col * X_it.col(); const uword row_base = copies_per_row * X_it.row(); const eT X_val = (*X_it); for(uword cols = 0; cols < copies_per_col; cols++) for(uword rows = 0; rows < copies_per_row; rows++) { (*locs_mem) = row_base + rows; ++locs_mem; (*locs_mem) = col_base + cols; ++locs_mem; (*vals_mem) = X_val; ++vals_mem; } } out = SpMat(locs, vals, out_n_rows, out_n_cols); } else { out.zeros(out_n_rows, out_n_cols); } } template inline void spop_reshape::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); out = in.m; out.reshape(in.aux_uword_a, in.aux_uword_b); } template inline void spop_resize::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); out = in.m; out.resize(in.aux_uword_a, in.aux_uword_b); } namespace priv { struct functor_floor { template arma_inline eT operator()(const eT val) const { return eop_aux::floor(val); } }; } template inline void spop_floor::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); out.init_xform(in.m, priv::functor_floor()); } namespace priv { struct functor_ceil { template arma_inline eT operator()(const eT val) const { return eop_aux::ceil(val); } }; } template inline void spop_ceil::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); out.init_xform(in.m, priv::functor_ceil()); } namespace priv { struct functor_round { template arma_inline eT operator()(const eT val) const { return eop_aux::round(val); } }; } template inline void spop_round::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); out.init_xform(in.m, priv::functor_round()); } namespace priv { struct functor_trunc { template arma_inline eT operator()(const eT val) const { return eop_aux::trunc(val); } }; } template inline void spop_trunc::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); out.init_xform(in.m, priv::functor_trunc()); } namespace priv { struct functor_sign { template arma_inline eT operator()(const eT val) const { return arma_sign(val); } }; } template inline void spop_sign::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); out.init_xform(in.m, priv::functor_sign()); } template inline void spop_diagvec::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat U(in.m); const SpMat& X = U.M; const uword a = in.aux_uword_a; const uword b = in.aux_uword_b; const uword row_offset = (b > 0) ? a : 0; const uword col_offset = (b == 0) ? a : 0; arma_debug_check_bounds ( ((row_offset > 0) && (row_offset >= X.n_rows)) || ((col_offset > 0) && (col_offset >= X.n_cols)), "diagvec(): requested diagonal out of bounds" ); const uword len = (std::min)(X.n_rows - row_offset, X.n_cols - col_offset); Col cache(len, arma_nozeros_indicator()); eT* cache_mem = cache.memptr(); uword n_nonzero = 0; for(uword i=0; i < len; ++i) { const eT val = X.at(i + row_offset, i + col_offset); cache_mem[i] = val; n_nonzero += (val != eT(0)) ? uword(1) : uword(0); } out.reserve(len, 1, n_nonzero); uword count = 0; for(uword i=0; i < len; ++i) { const eT val = cache_mem[i]; if(val != eT(0)) { access::rw(out.row_indices[count]) = i; access::rw(out.values[count]) = val; ++count; } } access::rw(out.col_ptrs[0]) = 0; access::rw(out.col_ptrs[1]) = n_nonzero; } template inline void spop_flipud::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); out = reverse(in.m, 0); } template inline void spop_fliplr::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); out = reverse(in.m, 1); } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_misc_bones.hpp0000644000176200001440000001217614124060717024274 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_misc //! @{ class spop_scalar_times : public traits_op_passthru { public: template inline static void apply(SpMat& out, const SpOp& in); }; class spop_cx_scalar_times : public traits_op_passthru { public: template inline static void apply(SpMat< std::complex >& out, const mtSpOp< std::complex, T1, spop_cx_scalar_times>& in); }; class spop_square : public traits_op_passthru { public: template inline static void apply(SpMat& out, const SpOp& in); }; class spop_sqrt : public traits_op_passthru { public: template inline static void apply(SpMat& out, const SpOp& in); }; class spop_abs : public traits_op_passthru { public: template inline static void apply(SpMat& out, const SpOp& in); }; class spop_cx_abs : public traits_op_passthru { public: template inline static void apply(SpMat& out, const mtSpOp& in); }; class spop_arg : public traits_op_passthru { public: template inline static void apply(SpMat& out, const SpOp& in); }; class spop_cx_arg : public traits_op_passthru { public: template inline static void apply(SpMat& out, const mtSpOp& in); }; class spop_real : public traits_op_passthru { public: template inline static void apply(SpMat& out, const mtSpOp& in); }; class spop_imag : public traits_op_passthru { public: template inline static void apply(SpMat& out, const mtSpOp& in); }; class spop_conj : public traits_op_passthru { public: template inline static void apply(SpMat& out, const SpOp& in); }; class spop_repelem : public traits_op_default { public: template inline static void apply(SpMat& out, const SpOp& in); }; class spop_reshape : public traits_op_default { public: template inline static void apply(SpMat& out, const SpOp& in); }; class spop_resize : public traits_op_default { public: template inline static void apply(SpMat& out, const SpOp& in); }; class spop_floor : public traits_op_passthru { public: template inline static void apply(SpMat& out, const SpOp& in); }; class spop_ceil : public traits_op_passthru { public: template inline static void apply(SpMat& out, const SpOp& in); }; class spop_round : public traits_op_passthru { public: template inline static void apply(SpMat& out, const SpOp& in); }; class spop_trunc : public traits_op_passthru { public: template inline static void apply(SpMat& out, const SpOp& in); }; class spop_sign : public traits_op_passthru { public: template inline static void apply(SpMat& out, const SpOp& in); }; class spop_diagvec : public traits_op_col { public: template inline static void apply(SpMat& out, const SpOp& in); }; class spop_flipud : public traits_op_passthru { public: template inline static void apply(SpMat& out, const SpOp& in); }; class spop_fliplr : public traits_op_passthru { public: template inline static void apply(SpMat& out, const SpOp& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_cov_bones.hpp0000644000176200001440000000220514124060717023555 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_cov //! @{ class op_cov : public traits_op_default { public: template inline static void apply(Mat& out, const Op< T1, op_cov>& in); template inline static void apply(Mat& out, const Op< Op, op_cov>& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/running_stat_vec_meat.hpp0000644000176200001440000003422114124060717025463 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup running_stat_vec //! @{ template inline running_stat_vec::~running_stat_vec() { arma_extra_debug_sigprint_this(this); } template inline running_stat_vec::running_stat_vec(const bool in_calc_cov) : calc_cov(in_calc_cov) { arma_extra_debug_sigprint_this(this); } template inline running_stat_vec::running_stat_vec(const running_stat_vec& in_rsv) : calc_cov (in_rsv.calc_cov) , counter (in_rsv.counter) , r_mean (in_rsv.r_mean) , r_var (in_rsv.r_var) , r_cov (in_rsv.r_cov) , min_val (in_rsv.min_val) , max_val (in_rsv.max_val) , min_val_norm(in_rsv.min_val_norm) , max_val_norm(in_rsv.max_val_norm) { arma_extra_debug_sigprint_this(this); } template inline running_stat_vec& running_stat_vec::operator=(const running_stat_vec& in_rsv) { arma_extra_debug_sigprint(); access::rw(calc_cov) = in_rsv.calc_cov; counter = in_rsv.counter; r_mean = in_rsv.r_mean; r_var = in_rsv.r_var; r_cov = in_rsv.r_cov; min_val = in_rsv.min_val; max_val = in_rsv.max_val; min_val_norm = in_rsv.min_val_norm; max_val_norm = in_rsv.max_val_norm; return *this; } //! update statistics to reflect new sample template template arma_hot inline void running_stat_vec::operator() (const Base::T, T1>& X) { arma_extra_debug_sigprint(); const quasi_unwrap tmp(X.get_ref()); const Mat& sample = tmp.M; if( sample.is_empty() ) { return; } if( sample.is_finite() == false ) { arma_debug_warn_level(3, "running_stat_vec: sample ignored as it has non-finite elements"); return; } running_stat_vec_aux::update_stats(*this, sample); } template template arma_hot inline void running_stat_vec::operator() (const Base< std::complex::T>, T1>& X) { arma_extra_debug_sigprint(); const quasi_unwrap tmp(X.get_ref()); const Mat< std::complex >& sample = tmp.M; if( sample.is_empty() ) { return; } if( sample.is_finite() == false ) { arma_debug_warn_level(3, "running_stat_vec: sample ignored as it has non-finite elements"); return; } running_stat_vec_aux::update_stats(*this, sample); } //! set all statistics to zero template inline void running_stat_vec::reset() { arma_extra_debug_sigprint(); counter.reset(); r_mean.reset(); r_var.reset(); r_cov.reset(); min_val.reset(); max_val.reset(); min_val_norm.reset(); max_val_norm.reset(); r_var_dummy.reset(); r_cov_dummy.reset(); tmp1.reset(); tmp2.reset(); } //! mean or average value template inline const typename running_stat_vec::return_type1& running_stat_vec::mean() const { arma_extra_debug_sigprint(); return r_mean; } //! variance template inline const typename running_stat_vec::return_type2& running_stat_vec::var(const uword norm_type) { arma_extra_debug_sigprint(); const T N = counter.value(); if(N > T(1)) { if(norm_type == 0) { return r_var; } else { const T N_minus_1 = counter.value_minus_1(); r_var_dummy = (N_minus_1/N) * r_var; return r_var_dummy; } } else { r_var_dummy.zeros(r_mean.n_rows, r_mean.n_cols); return r_var_dummy; } } //! standard deviation template inline typename running_stat_vec::return_type2 running_stat_vec::stddev(const uword norm_type) const { arma_extra_debug_sigprint(); const T N = counter.value(); if(N > T(1)) { if(norm_type == 0) { return sqrt(r_var); } else { const T N_minus_1 = counter.value_minus_1(); return sqrt( (N_minus_1/N) * r_var ); } } else { typedef typename running_stat_vec::return_type2 out_type; return out_type(); } } //! covariance template inline const Mat< typename running_stat_vec::eT >& running_stat_vec::cov(const uword norm_type) { arma_extra_debug_sigprint(); if(calc_cov) { const T N = counter.value(); if(N > T(1)) { if(norm_type == 0) { return r_cov; } else { const T N_minus_1 = counter.value_minus_1(); r_cov_dummy = (N_minus_1/N) * r_cov; return r_cov_dummy; } } else { const uword out_size = (std::max)(r_mean.n_rows, r_mean.n_cols); r_cov_dummy.zeros(out_size, out_size); return r_cov_dummy; } } else { r_cov_dummy.reset(); return r_cov_dummy; } } //! vector with minimum values template inline const typename running_stat_vec::return_type1& running_stat_vec::min() const { arma_extra_debug_sigprint(); return min_val; } //! vector with maximum values template inline const typename running_stat_vec::return_type1& running_stat_vec::max() const { arma_extra_debug_sigprint(); return max_val; } template inline typename running_stat_vec::return_type1 running_stat_vec::range() const { arma_extra_debug_sigprint(); return (max_val - min_val); } //! number of samples so far template inline typename running_stat_vec::T running_stat_vec::count() const { arma_extra_debug_sigprint(); return counter.value(); } // //! update statistics to reflect new sample (version for non-complex numbers) template inline void running_stat_vec_aux::update_stats ( running_stat_vec& x, const Mat::eT>& sample, const typename arma_not_cx::eT>::result* junk ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename running_stat_vec::eT eT; typedef typename running_stat_vec::T T; const T N = x.counter.value(); if(N > T(0)) { arma_debug_assert_same_size(x.r_mean, sample, "running_stat_vec(): dimensionality mismatch"); const uword n_elem = sample.n_elem; const eT* sample_mem = sample.memptr(); eT* r_mean_mem = x.r_mean.memptr(); T* r_var_mem = x.r_var.memptr(); eT* min_val_mem = x.min_val.memptr(); eT* max_val_mem = x.max_val.memptr(); const T N_plus_1 = x.counter.value_plus_1(); const T N_minus_1 = x.counter.value_minus_1(); if(x.calc_cov) { Mat& tmp1 = x.tmp1; Mat& tmp2 = x.tmp2; tmp1 = sample - x.r_mean; if(sample.n_cols == 1) { tmp2 = tmp1*trans(tmp1); } else { tmp2 = trans(tmp1)*tmp1; } x.r_cov *= (N_minus_1/N); x.r_cov += tmp2 / N_plus_1; } for(uword i=0; i max_val_mem[i]) { max_val_mem[i] = val; } const eT r_mean_val = r_mean_mem[i]; const eT tmp = val - r_mean_val; r_var_mem[i] = N_minus_1/N * r_var_mem[i] + (tmp*tmp)/N_plus_1; r_mean_mem[i] = r_mean_val + (val - r_mean_val)/N_plus_1; } } else { arma_debug_check( (sample.is_vec() == false), "running_stat_vec(): given sample must be a vector" ); x.r_mean.set_size(sample.n_rows, sample.n_cols); x.r_var.zeros(sample.n_rows, sample.n_cols); if(x.calc_cov) { x.r_cov.zeros(sample.n_elem, sample.n_elem); } x.min_val.set_size(sample.n_rows, sample.n_cols); x.max_val.set_size(sample.n_rows, sample.n_cols); const uword n_elem = sample.n_elem; const eT* sample_mem = sample.memptr(); eT* r_mean_mem = x.r_mean.memptr(); eT* min_val_mem = x.min_val.memptr(); eT* max_val_mem = x.max_val.memptr(); for(uword i=0; i inline void running_stat_vec_aux::update_stats ( running_stat_vec& x, const Mat::T > >& sample, const typename arma_not_cx::eT>::result* junk ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename running_stat_vec::eT eT; running_stat_vec_aux::update_stats(x, conv_to< Mat >::from(sample)); } //! update statistics to reflect new sample (version for complex numbers, non-complex sample) template inline void running_stat_vec_aux::update_stats ( running_stat_vec& x, const Mat::T >& sample, const typename arma_cx_only::eT>::result* junk ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename running_stat_vec::eT eT; running_stat_vec_aux::update_stats(x, conv_to< Mat >::from(sample)); } //! alter statistics to reflect new sample (version for complex numbers, complex sample) template inline void running_stat_vec_aux::update_stats ( running_stat_vec& x, const Mat::eT>& sample, const typename arma_cx_only::eT>::result* junk ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename running_stat_vec::eT eT; typedef typename running_stat_vec::T T; const T N = x.counter.value(); if(N > T(0)) { arma_debug_assert_same_size(x.r_mean, sample, "running_stat_vec(): dimensionality mismatch"); const uword n_elem = sample.n_elem; const eT* sample_mem = sample.memptr(); eT* r_mean_mem = x.r_mean.memptr(); T* r_var_mem = x.r_var.memptr(); eT* min_val_mem = x.min_val.memptr(); eT* max_val_mem = x.max_val.memptr(); T* min_val_norm_mem = x.min_val_norm.memptr(); T* max_val_norm_mem = x.max_val_norm.memptr(); const T N_plus_1 = x.counter.value_plus_1(); const T N_minus_1 = x.counter.value_minus_1(); if(x.calc_cov) { Mat& tmp1 = x.tmp1; Mat& tmp2 = x.tmp2; tmp1 = sample - x.r_mean; if(sample.n_cols == 1) { tmp2 = arma::conj(tmp1)*strans(tmp1); } else { tmp2 = trans(tmp1)*tmp1; //tmp2 = strans(conj(tmp1))*tmp1; } x.r_cov *= (N_minus_1/N); x.r_cov += tmp2 / N_plus_1; } for(uword i=0; i max_val_norm_mem[i]) { max_val_norm_mem[i] = val_norm; max_val_mem[i] = val; } const eT& r_mean_val = r_mean_mem[i]; r_var_mem[i] = N_minus_1/N * r_var_mem[i] + std::norm(val - r_mean_val)/N_plus_1; r_mean_mem[i] = r_mean_val + (val - r_mean_val)/N_plus_1; } } else { arma_debug_check( (sample.is_vec() == false), "running_stat_vec(): given sample must be a vector" ); x.r_mean.set_size(sample.n_rows, sample.n_cols); x.r_var.zeros(sample.n_rows, sample.n_cols); if(x.calc_cov) { x.r_cov.zeros(sample.n_elem, sample.n_elem); } x.min_val.set_size(sample.n_rows, sample.n_cols); x.max_val.set_size(sample.n_rows, sample.n_cols); x.min_val_norm.set_size(sample.n_rows, sample.n_cols); x.max_val_norm.set_size(sample.n_rows, sample.n_cols); const uword n_elem = sample.n_elem; const eT* sample_mem = sample.memptr(); eT* r_mean_mem = x.r_mean.memptr(); eT* min_val_mem = x.min_val.memptr(); eT* max_val_mem = x.max_val.memptr(); T* min_val_norm_mem = x.min_val_norm.memptr(); T* max_val_norm_mem = x.max_val_norm.memptr(); for(uword i=0; i inline static void apply(Mat& out, const Glue& expr); template inline static void apply_noalias(Mat& out, const Proxy& P1, const Proxy& P2); // cubes template inline static void apply(Cube& out, const GlueCube& expr); template inline static void apply_noalias(Cube& out, const ProxyCube& P1, const ProxyCube& P2); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_join.hpp0000644000176200001440000002562714124060717022541 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_join //! @{ template arma_warn_unused inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && is_same_type::value), const Glue >::result join_cols(const T1& A, const T2& B) { arma_extra_debug_sigprint(); return Glue(A, B); } template arma_warn_unused inline Mat join_cols(const Base& A, const Base& B, const Base& C) { arma_extra_debug_sigprint(); Mat out; glue_join_cols::apply(out, A.get_ref(), B.get_ref(), C.get_ref()); return out; } template arma_warn_unused inline Mat join_cols(const Base& A, const Base& B, const Base& C, const Base& D) { arma_extra_debug_sigprint(); Mat out; glue_join_cols::apply(out, A.get_ref(), B.get_ref(), C.get_ref(), D.get_ref()); return out; } template arma_warn_unused inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && is_same_type::value), const Glue >::result join_vert(const T1& A, const T2& B) { arma_extra_debug_sigprint(); return Glue(A, B); } template arma_warn_unused inline Mat join_vert(const Base& A, const Base& B, const Base& C) { arma_extra_debug_sigprint(); Mat out; glue_join_cols::apply(out, A.get_ref(), B.get_ref(), C.get_ref()); return out; } template arma_warn_unused inline Mat join_vert(const Base& A, const Base& B, const Base& C, const Base& D) { arma_extra_debug_sigprint(); Mat out; glue_join_cols::apply(out, A.get_ref(), B.get_ref(), C.get_ref(), D.get_ref()); return out; } template arma_warn_unused inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && is_same_type::value), const Glue >::result join_rows(const T1& A, const T2& B) { arma_extra_debug_sigprint(); return Glue(A, B); } template arma_warn_unused inline Mat join_rows(const Base& A, const Base& B, const Base& C) { arma_extra_debug_sigprint(); Mat out; glue_join_rows::apply(out, A.get_ref(), B.get_ref(), C.get_ref()); return out; } template arma_warn_unused inline Mat join_rows(const Base& A, const Base& B, const Base& C, const Base& D) { arma_extra_debug_sigprint(); Mat out; glue_join_rows::apply(out, A.get_ref(), B.get_ref(), C.get_ref(), D.get_ref()); return out; } template arma_warn_unused inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && is_same_type::value), const Glue >::result join_horiz(const T1& A, const T2& B) { arma_extra_debug_sigprint(); return Glue(A, B); } template arma_warn_unused inline Mat join_horiz(const Base& A, const Base& B, const Base& C) { arma_extra_debug_sigprint(); Mat out; glue_join_rows::apply(out, A.get_ref(), B.get_ref(), C.get_ref()); return out; } template arma_warn_unused inline Mat join_horiz(const Base& A, const Base& B, const Base& C, const Base& D) { arma_extra_debug_sigprint(); Mat out; glue_join_rows::apply(out, A.get_ref(), B.get_ref(), C.get_ref(), D.get_ref()); return out; } // // for cubes template arma_warn_unused inline const GlueCube join_slices(const BaseCube& A, const BaseCube& B) { arma_extra_debug_sigprint(); return GlueCube(A.get_ref(), B.get_ref()); } template arma_warn_unused inline Cube join_slices(const Base& A, const Base& B) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap UA(A.get_ref()); const quasi_unwrap UB(B.get_ref()); arma_debug_assert_same_size(UA.M.n_rows, UA.M.n_cols, UB.M.n_rows, UB.M.n_cols, "join_slices(): incompatible dimensions"); Cube out(UA.M.n_rows, UA.M.n_cols, 2, arma_nozeros_indicator()); arrayops::copy(out.slice_memptr(0), UA.M.memptr(), UA.M.n_elem); arrayops::copy(out.slice_memptr(1), UB.M.memptr(), UB.M.n_elem); return out; } template arma_warn_unused inline Cube join_slices(const Base& A, const BaseCube& B) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap U(A.get_ref()); const Cube M(const_cast(U.M.memptr()), U.M.n_rows, U.M.n_cols, 1, false); return join_slices(M,B); } template arma_warn_unused inline Cube join_slices(const BaseCube& A, const Base& B) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap U(B.get_ref()); const Cube M(const_cast(U.M.memptr()), U.M.n_rows, U.M.n_cols, 1, false); return join_slices(A,M); } // // for sparse matrices template arma_warn_unused inline const SpGlue join_cols(const SpBase& A, const SpBase& B) { arma_extra_debug_sigprint(); return SpGlue(A.get_ref(), B.get_ref()); } template arma_warn_unused inline SpMat join_cols(const SpBase& A, const SpBase& B, const SpBase& C) { arma_extra_debug_sigprint(); SpMat out; spglue_join_cols::apply(out, A.get_ref(), B.get_ref(), C.get_ref()); return out; } template arma_warn_unused inline SpMat join_cols(const SpBase& A, const SpBase& B, const SpBase& C, const SpBase& D) { arma_extra_debug_sigprint(); SpMat out; spglue_join_cols::apply(out, A.get_ref(), B.get_ref(), C.get_ref(), D.get_ref()); return out; } template arma_warn_unused inline const SpGlue join_vert(const SpBase& A, const SpBase& B) { arma_extra_debug_sigprint(); return SpGlue(A.get_ref(), B.get_ref()); } template arma_warn_unused inline SpMat join_vert(const SpBase& A, const SpBase& B, const SpBase& C) { arma_extra_debug_sigprint(); SpMat out; spglue_join_cols::apply(out, A.get_ref(), B.get_ref(), C.get_ref()); return out; } template arma_warn_unused inline SpMat join_vert(const SpBase& A, const SpBase& B, const SpBase& C, const SpBase& D) { arma_extra_debug_sigprint(); SpMat out; spglue_join_cols::apply(out, A.get_ref(), B.get_ref(), C.get_ref(), D.get_ref()); return out; } template arma_warn_unused inline const SpGlue join_rows(const SpBase& A, const SpBase& B) { arma_extra_debug_sigprint(); return SpGlue(A.get_ref(), B.get_ref()); } template arma_warn_unused inline SpMat join_rows(const SpBase& A, const SpBase& B, const SpBase& C) { arma_extra_debug_sigprint(); SpMat out; spglue_join_rows::apply(out, A.get_ref(), B.get_ref(), C.get_ref()); return out; } template arma_warn_unused inline SpMat join_rows(const SpBase& A, const SpBase& B, const SpBase& C, const SpBase& D) { arma_extra_debug_sigprint(); SpMat out; spglue_join_rows::apply(out, A.get_ref(), B.get_ref(), C.get_ref(), D.get_ref()); return out; } template arma_warn_unused inline const SpGlue join_horiz(const SpBase& A, const SpBase& B) { arma_extra_debug_sigprint(); return SpGlue(A.get_ref(), B.get_ref()); } template arma_warn_unused inline SpMat join_horiz(const SpBase& A, const SpBase& B, const SpBase& C) { arma_extra_debug_sigprint(); SpMat out; spglue_join_rows::apply(out, A.get_ref(), B.get_ref(), C.get_ref()); return out; } template arma_warn_unused inline SpMat join_horiz(const SpBase& A, const SpBase& B, const SpBase& C, const SpBase& D) { arma_extra_debug_sigprint(); SpMat out; spglue_join_rows::apply(out, A.get_ref(), B.get_ref(), C.get_ref(), D.get_ref()); return out; } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_eig_sym.hpp0000644000176200001440000001100514160256234023220 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_eig_sym //! @{ //! Eigenvalues of real/complex symmetric/hermitian matrix X template inline typename enable_if2< is_supported_blas_type::value, bool >::result eig_sym ( Col& eigval, const Base& X ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; Mat A(X.get_ref()); const bool status = auxlib::eig_sym(eigval, A); if(status == false) { eigval.soft_reset(); arma_debug_warn_level(3, "eig_sym(): decomposition failed"); } return status; } //! Eigenvalues of real/complex symmetric/hermitian matrix X template arma_warn_unused inline typename enable_if2< is_supported_blas_type::value, Col >::result eig_sym ( const Base& X ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; Col< T> eigval; Mat A(X.get_ref()); const bool status = auxlib::eig_sym(eigval, A); if(status == false) { eigval.reset(); arma_stop_runtime_error("eig_sym(): decomposition failed"); } return eigval; } //! internal helper function template inline bool eig_sym_helper ( Col::result>& eigval, Mat& eigvec, const Mat& X, const char method_sig, const char* caller_sig ) { arma_extra_debug_sigprint(); // if(auxlib::rudimentary_sym_check(X) == false) // { // if(is_cx::no ) { arma_debug_warn_level(1, caller_sig, ": given matrix is not symmetric"); } // if(is_cx::yes) { arma_debug_warn_level(1, caller_sig, ": given matrix is not hermitian"); } // return false; // } if((arma_config::debug) && (auxlib::rudimentary_sym_check(X) == false)) { if(is_cx::no ) { arma_debug_warn_level(1, caller_sig, ": given matrix is not symmetric"); } if(is_cx::yes) { arma_debug_warn_level(1, caller_sig, ": given matrix is not hermitian"); } } bool status = false; if(method_sig == 'd') { status = auxlib::eig_sym_dc(eigval, eigvec, X); } if(status == false) { status = auxlib::eig_sym(eigval, eigvec, X); } return status; } //! Eigenvalues and eigenvectors of real/complex symmetric/hermitian matrix X template inline typename enable_if2< is_supported_blas_type::value, bool >::result eig_sym ( Col& eigval, Mat& eigvec, const Base& expr, const char* method = "dc" ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const char sig = (method != nullptr) ? method[0] : char(0); arma_debug_check( ((sig != 's') && (sig != 'd')), "eig_sym(): unknown method specified" ); arma_debug_check( void_ptr(&eigval) == void_ptr(&eigvec), "eig_sym(): parameter 'eigval' is an alias of parameter 'eigvec'" ); const quasi_unwrap U(expr.get_ref()); const bool is_alias = U.is_alias(eigvec); Mat eigvec_tmp; Mat& eigvec_out = (is_alias == false) ? eigvec : eigvec_tmp; const bool status = eig_sym_helper(eigval, eigvec_out, U.M, sig, "eig_sym()"); if(status == false) { eigval.soft_reset(); eigvec.soft_reset(); arma_debug_warn_level(3, "eig_sym(): decomposition failed"); } else { if(is_alias) { eigvec.steal_mem(eigvec_tmp); } } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/subview_field_meat.hpp0000644000176200001440000003023714124060717024745 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup subview_field //! @{ template inline subview_field::~subview_field() { arma_extra_debug_sigprint(); } template arma_inline subview_field::subview_field ( const field& in_f, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols ) : f(in_f) , aux_row1(in_row1) , aux_col1(in_col1) , aux_slice1(0) , n_rows(in_n_rows) , n_cols(in_n_cols) , n_slices( (in_f.n_slices > 0) ? uword(1) : uword(0) ) , n_elem(in_n_rows*in_n_cols*n_slices) { arma_extra_debug_sigprint(); } template arma_inline subview_field::subview_field ( const field& in_f, const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_n_rows, const uword in_n_cols, const uword in_n_slices ) : f(in_f) , aux_row1(in_row1) , aux_col1(in_col1) , aux_slice1(in_slice1) , n_rows(in_n_rows) , n_cols(in_n_cols) , n_slices(in_n_slices) , n_elem(in_n_rows*in_n_cols*in_n_slices) { arma_extra_debug_sigprint(); } template inline void subview_field::operator= (const field& x) { arma_extra_debug_sigprint(); subview_field& t = *this; arma_debug_check( (t.n_rows != x.n_rows) || (t.n_cols != x.n_cols) || (t.n_slices != x.n_slices), "incompatible field dimensions" ); if(t.n_slices == 1) { for(uword col=0; col < t.n_cols; ++col) for(uword row=0; row < t.n_rows; ++row) { t.at(row,col) = x.at(row,col); } } else { for(uword slice=0; slice < t.n_slices; ++slice) for(uword col=0; col < t.n_cols; ++col ) for(uword row=0; row < t.n_rows; ++row ) { t.at(row,col,slice) = x.at(row,col,slice); } } } //! x.subfield(...) = y.subfield(...) template inline void subview_field::operator= (const subview_field& x) { arma_extra_debug_sigprint(); if(check_overlap(x)) { const field tmp(x); (*this).operator=(tmp); return; } subview_field& t = *this; arma_debug_check( (t.n_rows != x.n_rows) || (t.n_cols != x.n_cols) || (t.n_slices != x.n_slices), "incompatible field dimensions" ); if(t.n_slices == 1) { for(uword col=0; col < t.n_cols; ++col) for(uword row=0; row < t.n_rows; ++row) { t.at(row,col) = x.at(row,col); } } else { for(uword slice=0; slice < t.n_slices; ++slice) for(uword col=0; col < t.n_cols; ++col ) for(uword row=0; row < t.n_rows; ++row ) { t.at(row,col,slice) = x.at(row,col,slice); } } } template arma_inline oT& subview_field::operator[](const uword i) { const uword n_elem_slice = n_rows*n_cols; const uword in_slice = i / n_elem_slice; const uword offset = in_slice * n_elem_slice; const uword j = i - offset; const uword in_col = j / n_rows; const uword in_row = j % n_rows; const uword index = (in_slice + aux_slice1)*(f.n_rows*f.n_cols) + (in_col + aux_col1)*f.n_rows + aux_row1 + in_row; return *((const_cast< field& >(f)).mem[index]); } template arma_inline const oT& subview_field::operator[](const uword i) const { const uword n_elem_slice = n_rows*n_cols; const uword in_slice = i / n_elem_slice; const uword offset = in_slice * n_elem_slice; const uword j = i - offset; const uword in_col = j / n_rows; const uword in_row = j % n_rows; const uword index = (in_slice + aux_slice1)*(f.n_rows*f.n_cols) + (in_col + aux_col1)*f.n_rows + aux_row1 + in_row; return *(f.mem[index]); } template arma_inline oT& subview_field::operator()(const uword i) { arma_debug_check_bounds( (i >= n_elem), "subview_field::operator(): index out of bounds" ); return operator[](i); } template arma_inline const oT& subview_field::operator()(const uword i) const { arma_debug_check_bounds( (i >= n_elem), "subview_field::operator(): index out of bounds" ); return operator[](i); } template arma_inline oT& subview_field::operator()(const uword in_row, const uword in_col) { return operator()(in_row, in_col, 0); } template arma_inline const oT& subview_field::operator()(const uword in_row, const uword in_col) const { return operator()(in_row, in_col, 0); } template arma_inline oT& subview_field::operator()(const uword in_row, const uword in_col, const uword in_slice) { arma_debug_check_bounds( ((in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices)), "subview_field::operator(): index out of bounds" ); const uword index = (in_slice + aux_slice1)*(f.n_rows*f.n_cols) + (in_col + aux_col1)*f.n_rows + aux_row1 + in_row; return *((const_cast< field& >(f)).mem[index]); } template arma_inline const oT& subview_field::operator()(const uword in_row, const uword in_col, const uword in_slice) const { arma_debug_check_bounds( ((in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices)), "subview_field::operator(): index out of bounds" ); const uword index = (in_slice + aux_slice1)*(f.n_rows*f.n_cols) + (in_col + aux_col1)*f.n_rows + aux_row1 + in_row; return *(f.mem[index]); } template arma_inline oT& subview_field::at(const uword in_row, const uword in_col) { return at(in_row, in_col, 0); } template arma_inline const oT& subview_field::at(const uword in_row, const uword in_col) const { return at(in_row, in_col, 0); } template arma_inline oT& subview_field::at(const uword in_row, const uword in_col, const uword in_slice) { const uword index = (in_slice + aux_slice1)*(f.n_rows*f.n_cols) + (in_col + aux_col1)*f.n_rows + aux_row1 + in_row; return *((const_cast< field& >(f)).mem[index]); } template arma_inline const oT& subview_field::at(const uword in_row, const uword in_col, const uword in_slice) const { const uword index = (in_slice + aux_slice1)*(f.n_rows*f.n_cols) + (in_col + aux_col1)*f.n_rows + aux_row1 + in_row; return *(f.mem[index]); } template arma_inline bool subview_field::is_empty() const { return (n_elem == 0); } template inline bool subview_field::check_overlap(const subview_field& x) const { const subview_field& t = *this; if(&t.f != &x.f) { return false; } else { if( (t.n_elem == 0) || (x.n_elem == 0) ) { return false; } else { const uword t_row_start = t.aux_row1; const uword t_row_end_p1 = t_row_start + t.n_rows; const uword t_col_start = t.aux_col1; const uword t_col_end_p1 = t_col_start + t.n_cols; const uword t_slice_start = t.aux_slice1; const uword t_slice_end_p1 = t_slice_start + t.n_slices; const uword x_row_start = x.aux_row1; const uword x_row_end_p1 = x_row_start + x.n_rows; const uword x_col_start = x.aux_col1; const uword x_col_end_p1 = x_col_start + x.n_cols; const uword x_slice_start = x.aux_slice1; const uword x_slice_end_p1 = x_slice_start + x.n_slices; const bool outside_rows = ( (x_row_start >= t_row_end_p1 ) || (t_row_start >= x_row_end_p1 ) ); const bool outside_cols = ( (x_col_start >= t_col_end_p1 ) || (t_col_start >= x_col_end_p1 ) ); const bool outside_slices = ( (x_slice_start >= t_slice_end_p1) || (t_slice_start >= x_slice_end_p1) ); return ( (outside_rows == false) && (outside_cols == false) && (outside_slices == false) ); } } } template inline void subview_field::print(const std::string extra_text) const { arma_extra_debug_sigprint(); if(extra_text.length() != 0) { const std::streamsize orig_width = get_cout_stream().width(); get_cout_stream() << extra_text << '\n'; get_cout_stream().width(orig_width); } arma_ostream::print(get_cout_stream(), *this); } template inline void subview_field::print(std::ostream& user_stream, const std::string extra_text) const { arma_extra_debug_sigprint(); if(extra_text.length() != 0) { const std::streamsize orig_width = user_stream.width(); user_stream << extra_text << '\n'; user_stream.width(orig_width); } arma_ostream::print(user_stream, *this); } template template inline void subview_field::for_each(functor F) { arma_extra_debug_sigprint(); subview_field& t = *this; if(t.n_slices == 1) { for(uword col=0; col < t.n_cols; ++col) for(uword row=0; row < t.n_rows; ++row) { F( t.at(row,col) ); } } else { for(uword slice=0; slice < t.n_slices; ++slice) for(uword col=0; col < t.n_cols; ++col ) for(uword row=0; row < t.n_rows; ++row ) { F( t.at(row,col,slice) ); } } } template template inline void subview_field::for_each(functor F) const { arma_extra_debug_sigprint(); const subview_field& t = *this; if(t.n_slices == 1) { for(uword col=0; col < t.n_cols; ++col) for(uword row=0; row < t.n_rows; ++row) { F( t.at(row,col) ); } } else { for(uword slice=0; slice < t.n_slices; ++slice) for(uword col=0; col < t.n_cols; ++col ) for(uword row=0; row < t.n_rows; ++row ) { F( t.at(row,col,slice) ); } } } template inline void subview_field::fill(const oT& x) { arma_extra_debug_sigprint(); subview_field& t = *this; if(t.n_slices == 1) { for(uword col=0; col < t.n_cols; ++col) for(uword row=0; row < t.n_rows; ++row) { t.at(row,col) = x; } } else { for(uword slice=0; slice < t.n_slices; ++slice) for(uword col=0; col < t.n_cols; ++col ) for(uword row=0; row < t.n_rows; ++row ) { t.at(row,col,slice) = x; } } } //! X = Y.subfield(...) template inline void subview_field::extract(field& actual_out, const subview_field& in) { arma_extra_debug_sigprint(); // const bool alias = (&actual_out == &in.f); field* tmp = (alias) ? new field : 0; field& out = (alias) ? (*tmp) : actual_out; // const uword n_rows = in.n_rows; const uword n_cols = in.n_cols; const uword n_slices = in.n_slices; out.set_size(n_rows, n_cols, n_slices); arma_extra_debug_print(arma_str::format("out.n_rows = %d out.n_cols = %d out.n_slices = %d in.m.n_rows = %d in.m.n_cols = %d in.m.n_slices = %d") % out.n_rows % out.n_cols % out.n_slices % in.f.n_rows % in.f.n_cols % in.f.n_slices); if(n_slices == 1) { for(uword col = 0; col < n_cols; ++col) for(uword row = 0; row < n_rows; ++row) { out.at(row,col) = in.at(row,col); } } else { for(uword slice = 0; slice < n_slices; ++slice) for(uword col = 0; col < n_cols; ++col ) for(uword row = 0; row < n_rows; ++row ) { out.at(row,col,slice) = in.at(row,col,slice); } } if(alias) { actual_out = out; delete tmp; } } //! @} RcppArmadillo/inst/include/armadillo_bits/spdiagview_meat.hpp0000644000176200001440000005512614124060717024264 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spdiagview //! @{ template inline spdiagview::~spdiagview() { arma_extra_debug_sigprint(); } template arma_inline spdiagview::spdiagview(const SpMat& in_m, const uword in_row_offset, const uword in_col_offset, const uword in_len) : m(in_m) , row_offset(in_row_offset) , col_offset(in_col_offset) , n_rows(in_len) , n_elem(in_len) { arma_extra_debug_sigprint(); } //! set a diagonal of our matrix using a diagonal from a foreign matrix template inline void spdiagview::operator= (const spdiagview& x) { arma_extra_debug_sigprint(); spdiagview& d = *this; arma_debug_check( (d.n_elem != x.n_elem), "spdiagview: diagonals have incompatible lengths" ); SpMat& d_m = const_cast< SpMat& >(d.m); const SpMat& x_m = x.m; if( (&d_m == &x_m) || ((d.row_offset == 0) && (d.col_offset == 0)) ) { const Mat tmp(x); (*this).operator=(tmp); } else { const uword d_n_elem = d.n_elem; const uword d_row_offset = d.row_offset; const uword d_col_offset = d.col_offset; const uword x_row_offset = x.row_offset; const uword x_col_offset = x.col_offset; for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) = x_m.at(i + x_row_offset, i + x_col_offset); } } } template inline void spdiagview::operator+=(const eT val) { arma_extra_debug_sigprint(); if(val == eT(0)) { return; } SpMat& t_m = const_cast< SpMat& >(m); const uword t_n_elem = n_elem; const uword t_row_offset = row_offset; const uword t_col_offset = col_offset; for(uword i=0; i < t_n_elem; ++i) { t_m.at(i + t_row_offset, i + t_col_offset) += val; } } template inline void spdiagview::operator-=(const eT val) { arma_extra_debug_sigprint(); if(val == eT(0)) { return; } SpMat& t_m = const_cast< SpMat& >(m); const uword t_n_elem = n_elem; const uword t_row_offset = row_offset; const uword t_col_offset = col_offset; for(uword i=0; i < t_n_elem; ++i) { t_m.at(i + t_row_offset, i + t_col_offset) -= val; } } template inline void spdiagview::operator*=(const eT val) { arma_extra_debug_sigprint(); if(val == eT(0)) { (*this).zeros(); return; } SpMat& t_m = const_cast< SpMat& >(m); const uword t_n_elem = n_elem; const uword t_row_offset = row_offset; const uword t_col_offset = col_offset; for(uword i=0; i < t_n_elem; ++i) { t_m.at(i + t_row_offset, i + t_col_offset) *= val; } } template inline void spdiagview::operator/=(const eT val) { arma_extra_debug_sigprint(); SpMat& t_m = const_cast< SpMat& >(m); const uword t_n_elem = n_elem; const uword t_row_offset = row_offset; const uword t_col_offset = col_offset; for(uword i=0; i < t_n_elem; ++i) { t_m.at(i + t_row_offset, i + t_col_offset) /= val; } } //! set a diagonal of our matrix using data from a foreign object template template inline void spdiagview::operator= (const Base& o) { arma_extra_debug_sigprint(); spdiagview& d = *this; SpMat& d_m = const_cast< SpMat& >(d.m); const uword d_n_elem = d.n_elem; const uword d_row_offset = d.row_offset; const uword d_col_offset = d.col_offset; if(is_same_type< T1, Gen, gen_zeros> >::yes) { const Proxy P(o.get_ref()); arma_debug_check( (d_n_elem != P.get_n_elem()), "spdiagview: given object has incompatible size" ); (*this).zeros(); return; } if(is_same_type< T1, Gen, gen_ones> >::yes) { const Proxy P(o.get_ref()); arma_debug_check( (d_n_elem != P.get_n_elem()), "spdiagview: given object has incompatible size" ); (*this).ones(); return; } const quasi_unwrap U(o.get_ref()); const Mat& x = U.M; const eT* x_mem = x.memptr(); arma_debug_check ( ( (d_n_elem != x.n_elem) || ((x.n_rows != 1) && (x.n_cols != 1)) ), "spdiagview: given object has incompatible size" ); if( (d_row_offset == 0) && (d_col_offset == 0) ) { SpMat tmp1; tmp1.eye(d_m.n_rows, d_m.n_cols); bool has_zero = false; for(uword i=0; i < d_n_elem; ++i) { const eT val = x_mem[i]; access::rw(tmp1.values[i]) = val; if(val == eT(0)) { has_zero = true; } } if(has_zero) { tmp1.remove_zeros(); } if(tmp1.n_nonzero == 0) { (*this).zeros(); return; } SpMat tmp2; spglue_merge::diagview_merge(tmp2, d_m, tmp1); d_m.steal_mem(tmp2); } else { for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) = x_mem[i]; } } } template template inline void spdiagview::operator+=(const Base& o) { arma_extra_debug_sigprint(); spdiagview& d = *this; SpMat& d_m = const_cast< SpMat& >(d.m); const uword d_n_elem = d.n_elem; const uword d_row_offset = d.row_offset; const uword d_col_offset = d.col_offset; const Proxy P( o.get_ref() ); arma_debug_check ( ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ), "spdiagview: given object has incompatible size" ); if( (is_Mat::stored_type>::value) || (Proxy::use_at) ) { const unwrap::stored_type> tmp(P.Q); const Mat& x = tmp.M; const eT* x_mem = x.memptr(); for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) += x_mem[i]; } } else { typename Proxy::ea_type Pea = P.get_ea(); for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) += Pea[i]; } } } template template inline void spdiagview::operator-=(const Base& o) { arma_extra_debug_sigprint(); spdiagview& d = *this; SpMat& d_m = const_cast< SpMat& >(d.m); const uword d_n_elem = d.n_elem; const uword d_row_offset = d.row_offset; const uword d_col_offset = d.col_offset; const Proxy P( o.get_ref() ); arma_debug_check ( ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ), "spdiagview: given object has incompatible size" ); if( (is_Mat::stored_type>::value) || (Proxy::use_at) ) { const unwrap::stored_type> tmp(P.Q); const Mat& x = tmp.M; const eT* x_mem = x.memptr(); for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) -= x_mem[i]; } } else { typename Proxy::ea_type Pea = P.get_ea(); for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) -= Pea[i]; } } } template template inline void spdiagview::operator%=(const Base& o) { arma_extra_debug_sigprint(); spdiagview& d = *this; SpMat& d_m = const_cast< SpMat& >(d.m); const uword d_n_elem = d.n_elem; const uword d_row_offset = d.row_offset; const uword d_col_offset = d.col_offset; const Proxy P( o.get_ref() ); arma_debug_check ( ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ), "spdiagview: given object has incompatible size" ); if( (is_Mat::stored_type>::value) || (Proxy::use_at) ) { const unwrap::stored_type> tmp(P.Q); const Mat& x = tmp.M; const eT* x_mem = x.memptr(); for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) *= x_mem[i]; } } else { typename Proxy::ea_type Pea = P.get_ea(); for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) *= Pea[i]; } } } template template inline void spdiagview::operator/=(const Base& o) { arma_extra_debug_sigprint(); spdiagview& d = *this; SpMat& d_m = const_cast< SpMat& >(d.m); const uword d_n_elem = d.n_elem; const uword d_row_offset = d.row_offset; const uword d_col_offset = d.col_offset; const Proxy P( o.get_ref() ); arma_debug_check ( ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ), "spdiagview: given object has incompatible size" ); if( (is_Mat::stored_type>::value) || (Proxy::use_at) ) { const unwrap::stored_type> tmp(P.Q); const Mat& x = tmp.M; const eT* x_mem = x.memptr(); for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) /= x_mem[i]; } } else { typename Proxy::ea_type Pea = P.get_ea(); for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) /= Pea[i]; } } } //! set a diagonal of our matrix using data from a foreign object template template inline void spdiagview::operator= (const SpBase& o) { arma_extra_debug_sigprint(); const unwrap_spmat U( o.get_ref() ); const SpMat& x = U.M; arma_debug_check ( ( (n_elem != x.n_elem) || ((x.n_rows != 1) && (x.n_cols != 1)) ), "spdiagview: given object has incompatible size" ); const Mat tmp(x); (*this).operator=(tmp); } template template inline void spdiagview::operator+=(const SpBase& o) { arma_extra_debug_sigprint(); spdiagview& d = *this; SpMat& d_m = const_cast< SpMat& >(d.m); const uword d_n_elem = d.n_elem; const uword d_row_offset = d.row_offset; const uword d_col_offset = d.col_offset; const SpProxy P( o.get_ref() ); arma_debug_check ( ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ), "spdiagview: given object has incompatible size" ); if( SpProxy::use_iterator || P.is_alias(d_m) ) { const SpMat tmp(P.Q); if(tmp.n_cols == 1) { for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) += tmp.at(i,0); } } else if(tmp.n_rows == 1) { for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) += tmp.at(0,i); } } } else { if(P.get_n_cols() == 1) { for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) += P.at(i,0); } } else if(P.get_n_rows() == 1) { for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) += P.at(0,i); } } } } template template inline void spdiagview::operator-=(const SpBase& o) { arma_extra_debug_sigprint(); spdiagview& d = *this; SpMat& d_m = const_cast< SpMat& >(d.m); const uword d_n_elem = d.n_elem; const uword d_row_offset = d.row_offset; const uword d_col_offset = d.col_offset; const SpProxy P( o.get_ref() ); arma_debug_check ( ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ), "spdiagview: given object has incompatible size" ); if( SpProxy::use_iterator || P.is_alias(d_m) ) { const SpMat tmp(P.Q); if(tmp.n_cols == 1) { for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) -= tmp.at(i,0); } } else if(tmp.n_rows == 1) { for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) -= tmp.at(0,i); } } } else { if(P.get_n_cols() == 1) { for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) -= P.at(i,0); } } else if(P.get_n_rows() == 1) { for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) -= P.at(0,i); } } } } template template inline void spdiagview::operator%=(const SpBase& o) { arma_extra_debug_sigprint(); spdiagview& d = *this; SpMat& d_m = const_cast< SpMat& >(d.m); const uword d_n_elem = d.n_elem; const uword d_row_offset = d.row_offset; const uword d_col_offset = d.col_offset; const SpProxy P( o.get_ref() ); arma_debug_check ( ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ), "spdiagview: given object has incompatible size" ); if( SpProxy::use_iterator || P.is_alias(d_m) ) { const SpMat tmp(P.Q); if(tmp.n_cols == 1) { for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) *= tmp.at(i,0); } } else if(tmp.n_rows == 1) { for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) *= tmp.at(0,i); } } } else { if(P.get_n_cols() == 1) { for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) *= P.at(i,0); } } else if(P.get_n_rows() == 1) { for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) *= P.at(0,i); } } } } template template inline void spdiagview::operator/=(const SpBase& o) { arma_extra_debug_sigprint(); spdiagview& d = *this; SpMat& d_m = const_cast< SpMat& >(d.m); const uword d_n_elem = d.n_elem; const uword d_row_offset = d.row_offset; const uword d_col_offset = d.col_offset; const SpProxy P( o.get_ref() ); arma_debug_check ( ( (d_n_elem != P.get_n_elem()) || ((P.get_n_rows() != 1) && (P.get_n_cols() != 1)) ), "spdiagview: given object has incompatible size" ); if( SpProxy::use_iterator || P.is_alias(d_m) ) { const SpMat tmp(P.Q); if(tmp.n_cols == 1) { for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) /= tmp.at(i,0); } } else if(tmp.n_rows == 1) { for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) /= tmp.at(0,i); } } } else { if(P.get_n_cols() == 1) { for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) /= P.at(i,0); } } else if(P.get_n_rows() == 1) { for(uword i=0; i < d_n_elem; ++i) { d_m.at(i + d_row_offset, i + d_col_offset) /= P.at(0,i); } } } } template inline void spdiagview::extract(SpMat& out, const spdiagview& d) { arma_extra_debug_sigprint(); const SpMat& d_m = d.m; const uword d_n_elem = d.n_elem; const uword d_row_offset = d.row_offset; const uword d_col_offset = d.col_offset; Col cache(d_n_elem, arma_nozeros_indicator()); eT* cache_mem = cache.memptr(); uword d_n_nonzero = 0; for(uword i=0; i < d_n_elem; ++i) { const eT val = d_m.at(i + d_row_offset, i + d_col_offset); cache_mem[i] = val; d_n_nonzero += (val != eT(0)) ? uword(1) : uword(0); } out.reserve(d_n_elem, 1, d_n_nonzero); uword count = 0; for(uword i=0; i < d_n_elem; ++i) { const eT val = cache_mem[i]; if(val != eT(0)) { access::rw(out.row_indices[count]) = i; access::rw(out.values[count]) = val; ++count; } } access::rw(out.col_ptrs[0]) = 0; access::rw(out.col_ptrs[1]) = d_n_nonzero; } //! extract a diagonal and store it as a dense column vector template inline void spdiagview::extract(Mat& out, const spdiagview& in) { arma_extra_debug_sigprint(); // NOTE: we're assuming that the 'out' matrix has already been set to the correct size; // size setting is done by either the Mat contructor or Mat::operator=() const SpMat& in_m = in.m; const uword in_n_elem = in.n_elem; const uword in_row_offset = in.row_offset; const uword in_col_offset = in.col_offset; eT* out_mem = out.memptr(); for(uword i=0; i < in_n_elem; ++i) { out_mem[i] = in_m.at(i + in_row_offset, i + in_col_offset); } } template inline SpMat_MapMat_val spdiagview::operator[](const uword i) { return (const_cast< SpMat& >(m)).at(i+row_offset, i+col_offset); } template inline eT spdiagview::operator[](const uword i) const { return m.at(i+row_offset, i+col_offset); } template inline SpMat_MapMat_val spdiagview::at(const uword i) { return (const_cast< SpMat& >(m)).at(i+row_offset, i+col_offset); } template inline eT spdiagview::at(const uword i) const { return m.at(i+row_offset, i+col_offset); } template inline SpMat_MapMat_val spdiagview::operator()(const uword i) { arma_debug_check_bounds( (i >= n_elem), "spdiagview::operator(): out of bounds" ); return (const_cast< SpMat& >(m)).at(i+row_offset, i+col_offset); } template inline eT spdiagview::operator()(const uword i) const { arma_debug_check_bounds( (i >= n_elem), "spdiagview::operator(): out of bounds" ); return m.at(i+row_offset, i+col_offset); } template inline SpMat_MapMat_val spdiagview::at(const uword row, const uword) { return (const_cast< SpMat& >(m)).at(row+row_offset, row+col_offset); } template inline eT spdiagview::at(const uword row, const uword) const { return m.at(row+row_offset, row+col_offset); } template inline SpMat_MapMat_val spdiagview::operator()(const uword row, const uword col) { arma_debug_check_bounds( ((row >= n_elem) || (col > 0)), "spdiagview::operator(): out of bounds" ); return (const_cast< SpMat& >(m)).at(row+row_offset, row+col_offset); } template inline eT spdiagview::operator()(const uword row, const uword col) const { arma_debug_check_bounds( ((row >= n_elem) || (col > 0)), "spdiagview::operator(): out of bounds" ); return m.at(row+row_offset, row+col_offset); } template inline void spdiagview::replace(const eT old_val, const eT new_val) { arma_extra_debug_sigprint(); if(old_val == eT(0)) { arma_debug_warn_level(1, "spdiagview::replace(): replacement not done, as old_val = 0"); } else { Mat tmp(*this); tmp.replace(old_val, new_val); (*this).operator=(tmp); } } template inline void spdiagview::clean(const typename get_pod_type::result threshold) { arma_extra_debug_sigprint(); Mat tmp(*this); tmp.clean(threshold); (*this).operator=(tmp); } template inline void spdiagview::clamp(const eT min_val, const eT max_val) { arma_extra_debug_sigprint(); SpMat tmp(*this); tmp.clamp(min_val, max_val); (*this).operator=(tmp); } template inline void spdiagview::fill(const eT val) { arma_extra_debug_sigprint(); if( (row_offset == 0) && (col_offset == 0) && (m.sync_state != 1) ) { if(val == eT(0)) { SpMat tmp(arma_reserve_indicator(), m.n_rows, m.n_cols, m.n_nonzero); // worst case scenario typename SpMat::const_iterator it = m.begin(); typename SpMat::const_iterator it_end = m.end(); uword count = 0; for(; it != it_end; ++it) { const uword row = it.row(); const uword col = it.col(); if(row != col) { access::rw(tmp.values[count]) = (*it); access::rw(tmp.row_indices[count]) = row; access::rw(tmp.col_ptrs[col + 1])++; ++count; } } for(uword i=0; i < tmp.n_cols; ++i) { access::rw(tmp.col_ptrs[i + 1]) += tmp.col_ptrs[i]; } // quick resize without reallocating memory and copying data access::rw( tmp.n_nonzero) = count; access::rw( tmp.values[count]) = eT(0); access::rw(tmp.row_indices[count]) = uword(0); access::rw(m).steal_mem(tmp); } else // val != eT(0) { SpMat tmp1; tmp1.eye(m.n_rows, m.n_cols); if(val != eT(1)) { tmp1 *= val; } SpMat tmp2; spglue_merge::diagview_merge(tmp2, m, tmp1); access::rw(m).steal_mem(tmp2); } } else { SpMat& x = const_cast< SpMat& >(m); const uword local_n_elem = n_elem; for(uword i=0; i < local_n_elem; ++i) { x.at(i+row_offset, i+col_offset) = val; } } } template inline void spdiagview::zeros() { arma_extra_debug_sigprint(); (*this).fill(eT(0)); } template inline void spdiagview::ones() { arma_extra_debug_sigprint(); (*this).fill(eT(1)); } template inline void spdiagview::randu() { arma_extra_debug_sigprint(); SpMat& x = const_cast< SpMat& >(m); const uword local_n_elem = n_elem; for(uword i=0; i < local_n_elem; ++i) { x.at(i+row_offset, i+col_offset) = eT(arma_rng::randu()); } } template inline void spdiagview::randn() { arma_extra_debug_sigprint(); SpMat& x = const_cast< SpMat& >(m); const uword local_n_elem = n_elem; for(uword i=0; i < local_n_elem; ++i) { x.at(i+row_offset, i+col_offset) = eT(arma_rng::randn()); } } //! @} RcppArmadillo/inst/include/armadillo_bits/mtGlueCube_bones.hpp0000644000176200001440000000305514124060717024330 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup mtGlueCube //! @{ template class mtGlueCube : public BaseCube< out_eT, mtGlueCube > { public: typedef out_eT elem_type; typedef typename get_pod_type::result pod_type; arma_inline mtGlueCube(const T1& in_A, const T2& in_B); arma_inline mtGlueCube(const T1& in_A, const T2& in_B, const uword in_aux_uword); arma_inline ~mtGlueCube(); arma_aligned const T1& A; //!< first operand; must be derived from BaseCube arma_aligned const T2& B; //!< second operand; must be derived from BaseCube arma_aligned uword aux_uword; //!< storage of auxiliary data, uword format }; //! @} RcppArmadillo/inst/include/armadillo_bits/Glue_meat.hpp0000644000176200001440000000257214124060717023013 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup Glue //! @{ template inline Glue::Glue(const T1& in_A, const T2& in_B) : A(in_A) , B(in_B) { arma_extra_debug_sigprint(); } template inline Glue::Glue(const T1& in_A, const T2& in_B, const uword in_aux_uword) : A(in_A) , B(in_B) , aux_uword(in_aux_uword) { arma_extra_debug_sigprint(); } template inline Glue::~Glue() { arma_extra_debug_sigprint(); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_kmeans.hpp0000644000176200001440000000306514124060717023050 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_kmeans //! @{ template inline typename enable_if2::value, bool>::result kmeans ( Mat& means, const Base& data, const uword k, const gmm_seed_mode& seed_mode, const uword n_iter, const bool print_mode ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; gmm_priv::gmm_diag model; const bool status = model.kmeans_wrapper(means, data.get_ref(), k, seed_mode, n_iter, print_mode); if(status) { means = model.means; } else { means.soft_reset(); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_fft2.hpp0000644000176200001440000000617714124060717022442 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_fft2 //! @{ // 2D FFT & 2D IFFT template arma_warn_unused inline typename enable_if2 < is_arma_type::value, Mat< std::complex > >::result fft2(const T1& A) { arma_extra_debug_sigprint(); // not exactly efficient, but "better-than-nothing" implementation typedef typename T1::pod_type T; Mat< std::complex > B = fft(A); // for square matrices, strans() will work out that an inplace transpose can be done, // hence we can potentially avoid creating a temporary matrix B = strans(B); return strans( fft(B) ); } template arma_warn_unused inline typename enable_if2 < is_arma_type::value, Mat< std::complex > >::result fft2(const T1& A, const uword n_rows, const uword n_cols) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap tmp(A); const Mat& B = tmp.M; const bool do_resize = (B.n_rows != n_rows) || (B.n_cols != n_cols); return (do_resize) ? fft2(resize(B,n_rows,n_cols)) : fft2(B); } template arma_warn_unused inline typename enable_if2 < (is_arma_type::value && (is_cx_float::yes || is_cx_double::yes)), Mat< std::complex > >::result ifft2(const T1& A) { arma_extra_debug_sigprint(); // not exactly efficient, but "better-than-nothing" implementation typedef typename T1::pod_type T; Mat< std::complex > B = ifft(A); // for square matrices, strans() will work out that an inplace transpose can be done, // hence we can potentially avoid creating a temporary matrix B = strans(B); return strans( ifft(B) ); } template arma_warn_unused inline typename enable_if2 < (is_arma_type::value && (is_cx_float::yes || is_cx_double::yes)), Mat< std::complex > >::result ifft2(const T1& A, const uword n_rows, const uword n_cols) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap tmp(A); const Mat& B = tmp.M; const bool do_resize = (B.n_rows != n_rows) || (B.n_cols != n_cols); return (do_resize) ? ifft2(resize(B,n_rows,n_cols)) : ifft2(B); } //! @} RcppArmadillo/inst/include/armadillo_bits/translate_arpack.hpp0000644000176200001440000002301714124060717024424 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #ifdef ARMA_USE_ARPACK //! \namespace arpack namespace for ARPACK functions namespace arpack { // If real, then eT == eeT; otherwise, eT == std::complex. // For real calls, rwork is ignored; it's only necessary in the complex case. template inline void naupd(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, eeT* tol, eT* resid, blas_int* ncv, eT* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, eT* workd, eT* workl, blas_int* lworkl, eeT* rwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_ignore(rwork); arma_fortran(arma_snaupd)(ido, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info, 1, 1); } else if( is_double::value) { typedef double T; arma_ignore(rwork); arma_fortran(arma_dnaupd)(ido, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info, 1, 1); } else if( is_cx_float::value) { typedef cx_float T; typedef float xT; arma_fortran(arma_cnaupd)(ido, bmat, n, which, nev, (xT*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, (xT*) rwork, info, 1, 1); } else if(is_cx_double::value) { typedef cx_double T; typedef double xT; arma_fortran(arma_znaupd)(ido, bmat, n, which, nev, (xT*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, (xT*) rwork, info, 1, 1); } #else if( is_float::value) { typedef float T; arma_ignore(rwork); arma_fortran(arma_snaupd)(ido, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info); } else if( is_double::value) { typedef double T; arma_ignore(rwork); arma_fortran(arma_dnaupd)(ido, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info); } else if( is_cx_float::value) { typedef cx_float T; typedef float xT; arma_fortran(arma_cnaupd)(ido, bmat, n, which, nev, (xT*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, (xT*) rwork, info); } else if(is_cx_double::value) { typedef cx_double T; typedef double xT; arma_fortran(arma_znaupd)(ido, bmat, n, which, nev, (xT*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, (xT*) rwork, info); } #endif } //! The use of two template types is necessary here because the compiler will //! instantiate this method for complex types (where eT != eeT) but that in //! practice that is never actually used. template inline void saupd(blas_int* ido, char* bmat, blas_int* n, char* which, blas_int* nev, eeT* tol, eT* resid, blas_int* ncv, eT* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, eT* workd, eT* workl, blas_int* lworkl, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_ssaupd)(ido, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info, 1, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dsaupd)(ido, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_ssaupd)(ido, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dsaupd)(ido, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info); } #endif } template inline void seupd(blas_int* rvec, char* howmny, blas_int* select, eT* d, eT* z, blas_int* ldz, eT* sigma, char* bmat, blas_int* n, char* which, blas_int* nev, eT* tol, eT* resid, blas_int* ncv, eT* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, eT* workd, eT* workl, blas_int* lworkl, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sseupd)(rvec, howmny, select, (T*) d, (T*) z, ldz, (T*) sigma, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info, 1, 1, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dseupd)(rvec, howmny, select, (T*) d, (T*) z, ldz, (T*) sigma, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info, 1, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sseupd)(rvec, howmny, select, (T*) d, (T*) z, ldz, (T*) sigma, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dseupd)(rvec, howmny, select, (T*) d, (T*) z, ldz, (T*) sigma, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info); } #endif } // for complex versions, pass d for dr, and null for di; pass sigma for // sigmar, and null for sigmai; rwork isn't used for non-complex versions template inline void neupd(blas_int* rvec, char* howmny, blas_int* select, eT* dr, eT* di, eT* z, blas_int* ldz, eT* sigmar, eT* sigmai, eT* workev, char* bmat, blas_int* n, char* which, blas_int* nev, eeT* tol, eT* resid, blas_int* ncv, eT* v, blas_int* ldv, blas_int* iparam, blas_int* ipntr, eT* workd, eT* workl, blas_int* lworkl, eeT* rwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_ignore(rwork); arma_fortran(arma_sneupd)(rvec, howmny, select, (T*) dr, (T*) di, (T*) z, ldz, (T*) sigmar, (T*) sigmai, (T*) workev, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info, 1, 1, 1); } else if( is_double::value) { typedef double T; arma_ignore(rwork); arma_fortran(arma_dneupd)(rvec, howmny, select, (T*) dr, (T*) di, (T*) z, ldz, (T*) sigmar, (T*) sigmai, (T*) workev, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info, 1, 1, 1); } else if( is_cx_float::value) { typedef cx_float T; typedef float xT; arma_fortran(arma_cneupd)(rvec, howmny, select, (T*) dr, (T*) z, ldz, (T*) sigmar, (T*) workev, bmat, n, which, nev, (xT*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, (xT*) rwork, info, 1, 1, 1); } else if(is_cx_double::value) { typedef cx_double T; typedef double xT; arma_fortran(arma_zneupd)(rvec, howmny, select, (T*) dr, (T*) z, ldz, (T*) sigmar, (T*) workev, bmat, n, which, nev, (xT*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, (xT*) rwork, info, 1, 1, 1); } #else if( is_float::value) { typedef float T; arma_ignore(rwork); arma_fortran(arma_sneupd)(rvec, howmny, select, (T*) dr, (T*) di, (T*) z, ldz, (T*) sigmar, (T*) sigmai, (T*) workev, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info); } else if( is_double::value) { typedef double T; arma_ignore(rwork); arma_fortran(arma_dneupd)(rvec, howmny, select, (T*) dr, (T*) di, (T*) z, ldz, (T*) sigmar, (T*) sigmai, (T*) workev, bmat, n, which, nev, (T*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, info); } else if( is_cx_float::value) { typedef cx_float T; typedef float xT; arma_fortran(arma_cneupd)(rvec, howmny, select, (T*) dr, (T*) z, ldz, (T*) sigmar, (T*) workev, bmat, n, which, nev, (xT*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, (xT*) rwork, info); } else if(is_cx_double::value) { typedef cx_double T; typedef double xT; arma_fortran(arma_zneupd)(rvec, howmny, select, (T*) dr, (T*) z, ldz, (T*) sigmar, (T*) workev, bmat, n, which, nev, (xT*) tol, (T*) resid, ncv, (T*) v, ldv, iparam, ipntr, (T*) workd, (T*) workl, lworkl, (xT*) rwork, info); } #endif } } // namespace arpack #endif RcppArmadillo/inst/include/armadillo_bits/SpOp_meat.hpp0000644000176200001440000000326514124060717023000 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpOp //! @{ template inline SpOp::SpOp(const T1& in_m) : m(in_m) { arma_extra_debug_sigprint(); } template inline SpOp::SpOp(const T1& in_m, const typename T1::elem_type in_aux) : m(in_m) , aux(in_aux) { arma_extra_debug_sigprint(); } template inline SpOp::SpOp(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b) : m(in_m) , aux_uword_a(in_aux_uword_a) , aux_uword_b(in_aux_uword_b) { arma_extra_debug_sigprint(); } template inline SpOp::~SpOp() { arma_extra_debug_sigprint(); } template arma_inline bool SpOp::is_alias(const SpMat& X) const { return m.is_alias(X); } //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_TridiagEigen_bones.hpp0000644000176200001440000000346214124060717026205 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { //! Calculate the eigenvalues and eigenvectors of a symmetric tridiagonal matrix. //! This class is a wrapper of the Lapack functions `_steqr`. template class TridiagEigen { private: blas_int n; Col main_diag; // Main diagonal elements of the matrix Col sub_diag; // Sub-diagonal elements of the matrix Mat evecs; // To store eigenvectors bool computed; public: //! Default constructor. Computation can //! be performed later by calling the compute() method. inline TridiagEigen(); //! Constructor to create an object that calculates the eigenvalues //! and eigenvectors of a symmetric tridiagonal matrix `mat_obj`. inline TridiagEigen(const Mat& mat_obj); //! Compute the eigenvalue decomposition of a symmetric tridiagonal matrix. inline void compute(const Mat& mat_obj); //! Retrieve the eigenvalues. inline Col eigenvalues(); //! Retrieve the eigenvectors. inline Mat eigenvectors(); }; } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/fn_approx_equal.hpp0000644000176200001440000003362214124060717024274 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_approx_equal //! @{ template arma_inline bool internal_approx_equal_abs_diff(const eT& x, const eT& y, const typename get_pod_type::result tol) { typedef typename get_pod_type::result T; if(x != y) { if(is_real::value) // also true for eT = std::complex or eT = std::complex { if( arma_isnan(x) || arma_isnan(y) || (eop_aux::arma_abs(x - y) > tol) ) { return false; } } else { if( eop_aux::arma_abs( ( cond_rel< is_cx::no >::gt(x, y) ) ? (x-y) : (y-x) ) > tol ) { return false; } } } return true; } template arma_inline bool internal_approx_equal_rel_diff(const eT& a, const eT& b, const typename get_pod_type::result tol) { typedef typename get_pod_type::result T; if(a != b) { if(is_real::value) // also true for eT = std::complex or eT = std::complex { if( arma_isnan(a) || arma_isnan(b) ) { return false; } const T abs_a = eop_aux::arma_abs(a); const T abs_b = eop_aux::arma_abs(b); const T max_c = (std::max)(abs_a,abs_b); const T abs_d = eop_aux::arma_abs(a - b); if(max_c >= T(1)) { if( abs_d > (tol * max_c) ) { return false; } } else { if( (abs_d / max_c) > tol ) { return false; } } } else { const T abs_a = eop_aux::arma_abs(a); const T abs_b = eop_aux::arma_abs(b); const T max_c = (std::max)(abs_a,abs_b); const T abs_d = eop_aux::arma_abs( ( cond_rel< is_cx::no >::gt(a, b) ) ? (a-b) : (b-a) ); if( abs_d > (tol * max_c) ) { return false; } } } return true; } template inline bool internal_approx_equal_worker ( const Base& A, const Base& B, const typename T1::pod_type abs_tol, const typename T1::pod_type rel_tol ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; arma_debug_check( ((use_abs_diff == false) && (use_rel_diff == false)), "internal_approx_equal_worker(): both 'use_abs_diff' and 'use_rel_diff' are false" ); if(use_abs_diff) { arma_debug_check( cond_rel< is_signed::value >::lt(abs_tol, T(0)), "approx_equal(): argument 'abs_tol' must be >= 0" ); } if(use_rel_diff) { arma_debug_check( cond_rel< is_signed::value >::lt(rel_tol, T(0)), "approx_equal(): argument 'rel_tol' must be >= 0" ); } const Proxy PA(A.get_ref()); const Proxy PB(B.get_ref()); if( (PA.get_n_rows() != PB.get_n_rows()) || (PA.get_n_cols() != PB.get_n_cols()) ) { return false; } if( (Proxy::use_at == false) && (Proxy::use_at == false) ) { const uword N = PA.get_n_elem(); const typename Proxy::ea_type PA_ea = PA.get_ea(); const typename Proxy::ea_type PB_ea = PB.get_ea(); for(uword i=0; i inline bool internal_approx_equal_worker ( const BaseCube& A, const BaseCube& B, const typename T1::pod_type abs_tol, const typename T1::pod_type rel_tol ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; arma_debug_check( ((use_abs_diff == false) && (use_rel_diff == false)), "internal_approx_equal_worker(): both 'use_abs_diff' and 'use_rel_diff' are false" ); if(use_abs_diff) { arma_debug_check( cond_rel< is_signed::value >::lt(abs_tol, T(0)), "approx_equal(): argument 'abs_tol' must be >= 0" ); } if(use_rel_diff) { arma_debug_check( cond_rel< is_signed::value >::lt(rel_tol, T(0)), "approx_equal(): argument 'rel_tol' must be >= 0" ); } const ProxyCube PA(A.get_ref()); const ProxyCube PB(B.get_ref()); if( (PA.get_n_rows() != PB.get_n_rows()) || (PA.get_n_cols() != PB.get_n_cols()) || (PA.get_n_slices() != PB.get_n_slices()) ) { return false; } if( (ProxyCube::use_at == false) && (ProxyCube::use_at == false) ) { const uword N = PA.get_n_elem(); const typename ProxyCube::ea_type PA_ea = PA.get_ea(); const typename ProxyCube::ea_type PB_ea = PB.get_ea(); for(uword i=0; i inline bool internal_approx_equal_handler(const T1& A, const T2& B, const char* method, const typename T1::pod_type abs_tol, const typename T1::pod_type rel_tol) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; const char sig = (method != nullptr) ? method[0] : char(0); arma_debug_check( ((sig != 'a') && (sig != 'r') && (sig != 'b')), "approx_equal(): argument 'method' must be \"absdiff\" or \"reldiff\" or \"both\"" ); bool status = false; if(sig == 'a') { status = internal_approx_equal_worker(A, B, abs_tol, T(0)); } else if(sig == 'r') { status = internal_approx_equal_worker(A, B, T(0), rel_tol); } else if(sig == 'b') { status = internal_approx_equal_worker(A, B, abs_tol, rel_tol); } return status; } template inline bool internal_approx_equal_handler(const T1& A, const T2& B, const char* method, const typename T1::pod_type tol) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; const char sig = (method != nullptr) ? method[0] : char(0); arma_debug_check( ((sig != 'a') && (sig != 'r') && (sig != 'b')), "approx_equal(): argument 'method' must be \"absdiff\" or \"reldiff\" or \"both\"" ); arma_debug_check( (sig == 'b'), "approx_equal(): argument 'method' is \"both\", but only one 'tol' argument has been given" ); bool status = false; if(sig == 'a') { status = internal_approx_equal_worker(A, B, tol, T(0)); } else if(sig == 'r') { status = internal_approx_equal_worker(A, B, T(0), tol); } return status; } template arma_warn_unused inline bool approx_equal(const Base& A, const Base& B, const char* method, const typename T1::pod_type tol) { arma_extra_debug_sigprint(); return internal_approx_equal_handler(A.get_ref(), B.get_ref(), method, tol); } template arma_warn_unused inline bool approx_equal(const BaseCube& A, const BaseCube& B, const char* method, const typename T1::pod_type tol) { arma_extra_debug_sigprint(); return internal_approx_equal_handler(A.get_ref(), B.get_ref(), method, tol); } template arma_warn_unused inline bool approx_equal(const Base& A, const Base& B, const char* method, const typename T1::pod_type abs_tol, const typename T1::pod_type rel_tol) { arma_extra_debug_sigprint(); return internal_approx_equal_handler(A.get_ref(), B.get_ref(), method, abs_tol, rel_tol); } template arma_warn_unused inline bool approx_equal(const BaseCube& A, const BaseCube& B, const char* method, const typename T1::pod_type abs_tol, const typename T1::pod_type rel_tol) { arma_extra_debug_sigprint(); return internal_approx_equal_handler(A.get_ref(), B.get_ref(), method, abs_tol, rel_tol); } template arma_warn_unused inline bool approx_equal(const SpBase& A, const SpBase& B, const char* method, const typename T1::pod_type tol) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const char sig = (method != nullptr) ? method[0] : char(0); arma_debug_check( ((sig != 'a') && (sig != 'r') && (sig != 'b')), "approx_equal(): argument 'method' must be \"absdiff\" or \"reldiff\" or \"both\"" ); arma_debug_check( (sig == 'b'), "approx_equal(): argument 'method' is \"both\", but only one 'tol' argument has been given" ); arma_debug_check( (sig == 'r'), "approx_equal(): only the \"absdiff\" method is currently implemented for sparse matrices" ); arma_debug_check( cond_rel< is_signed::value >::lt(tol, T(0)), "approx_equal(): argument 'tol' must be >= 0" ); const unwrap_spmat UA(A.get_ref()); const unwrap_spmat UB(B.get_ref()); if( (UA.M.n_rows != UB.M.n_rows) || (UA.M.n_cols != UB.M.n_cols) ) { return false; } const SpMat C = UA.M - UB.M; typename SpMat::const_iterator it = C.begin(); typename SpMat::const_iterator it_end = C.end(); while(it != it_end) { const eT val = (*it); if( arma_isnan(val) || (eop_aux::arma_abs(val) > tol) ) { return false; } ++it; } return true; } template arma_warn_unused inline bool approx_equal(const SpBase& A, const SpBase& B, const char* method, const typename T1::pod_type abs_tol, const typename T1::pod_type rel_tol) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; const char sig = (method != nullptr) ? method[0] : char(0); arma_debug_check( ((sig != 'a') && (sig != 'r') && (sig != 'b')), "approx_equal(): argument 'method' must be \"absdiff\" or \"reldiff\" or \"both\"" ); arma_debug_check( ((sig == 'r') || (sig == 'b')), "approx_equal(): only the \"absdiff\" method is currently implemented for sparse matrices" ); arma_debug_check( cond_rel< is_signed::value >::lt(abs_tol, T(0)), "approx_equal(): argument 'abs_tol' must be >= 0" ); arma_debug_check( cond_rel< is_signed::value >::lt(rel_tol, T(0)), "approx_equal(): argument 'rel_tol' must be >= 0" ); return approx_equal(A.get_ref(), B.get_ref(), "abs", abs_tol); } //! @} RcppArmadillo/inst/include/armadillo_bits/Gen_meat.hpp0000644000176200001440000001607414124060717022632 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup Gen //! @{ template arma_inline Gen::Gen(const uword in_n_rows, const uword in_n_cols) : n_rows(in_n_rows) , n_cols(in_n_cols) { arma_extra_debug_sigprint(); } template arma_inline Gen::~Gen() { arma_extra_debug_sigprint(); } template arma_inline typename T1::elem_type Gen::operator[](const uword ii) const { typedef typename T1::elem_type eT; if(is_same_type::yes) { return ((ii % n_rows) == (ii / n_rows)) ? eT(1) : eT(0); } else { return (*this).generate(); } } template arma_inline typename T1::elem_type Gen::at(const uword row, const uword col) const { typedef typename T1::elem_type eT; if(is_same_type::yes) { return (row == col) ? eT(1) : eT(0); } else { return (*this).generate(); } } template arma_inline typename T1::elem_type Gen::at_alt(const uword ii) const { return operator[](ii); } template inline void Gen::apply(Mat& out) const { arma_extra_debug_sigprint(); // NOTE: we're assuming that the matrix has already been set to the correct size; // this is done by either the Mat contructor or operator=() if(is_same_type::yes) { out.eye(); } else if(is_same_type::yes) { out.ones(); } else if(is_same_type::yes) { out.zeros(); } else if(is_same_type::yes) { out.randu(); } else if(is_same_type::yes) { out.randn(); } } template inline void Gen::apply_inplace_plus(Mat& out) const { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "addition"); typedef typename T1::elem_type eT; if(is_same_type::yes) { const uword N = (std::min)(n_rows, n_cols); for(uword iq=0; iq < N; ++iq) { out.at(iq,iq) += eT(1); } } else { eT* out_mem = out.memptr(); const uword n_elem = out.n_elem; uword iq,jq; for(iq=0, jq=1; jq < n_elem; iq+=2, jq+=2) { const eT tmp_i = (*this).generate(); const eT tmp_j = (*this).generate(); out_mem[iq] += tmp_i; out_mem[jq] += tmp_j; } if(iq < n_elem) { out_mem[iq] += (*this).generate(); } } } template inline void Gen::apply_inplace_minus(Mat& out) const { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "subtraction"); typedef typename T1::elem_type eT; if(is_same_type::yes) { const uword N = (std::min)(n_rows, n_cols); for(uword iq=0; iq < N; ++iq) { out.at(iq,iq) -= eT(1); } } else { eT* out_mem = out.memptr(); const uword n_elem = out.n_elem; uword iq,jq; for(iq=0, jq=1; jq < n_elem; iq+=2, jq+=2) { const eT tmp_i = (*this).generate(); const eT tmp_j = (*this).generate(); out_mem[iq] -= tmp_i; out_mem[jq] -= tmp_j; } if(iq < n_elem) { out_mem[iq] -= (*this).generate(); } } } template inline void Gen::apply_inplace_schur(Mat& out) const { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "element-wise multiplication"); typedef typename T1::elem_type eT; if(is_same_type::yes) { const uword N = (std::min)(n_rows, n_cols); for(uword iq=0; iq < N; ++iq) { for(uword row=0; row < iq; ++row) { out.at(row,iq) = eT(0); } for(uword row=iq+1; row < n_rows; ++row) { out.at(row,iq) = eT(0); } } } else { eT* out_mem = out.memptr(); const uword n_elem = out.n_elem; uword iq,jq; for(iq=0, jq=1; jq < n_elem; iq+=2, jq+=2) { const eT tmp_i = (*this).generate(); const eT tmp_j = (*this).generate(); out_mem[iq] *= tmp_i; out_mem[jq] *= tmp_j; } if(iq < n_elem) { out_mem[iq] *= (*this).generate(); } } } template inline void Gen::apply_inplace_div(Mat& out) const { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "element-wise division"); typedef typename T1::elem_type eT; if(is_same_type::yes) { const uword N = (std::min)(n_rows, n_cols); for(uword iq=0; iq < N; ++iq) { const eT zero = eT(0); for(uword row=0; row < iq; ++row) { out.at(row,iq) /= zero; } for(uword row=iq+1; row < n_rows; ++row) { out.at(row,iq) /= zero; } } } else { eT* out_mem = out.memptr(); const uword n_elem = out.n_elem; uword iq,jq; for(iq=0, jq=1; jq < n_elem; iq+=2, jq+=2) { const eT tmp_i = (*this).generate(); const eT tmp_j = (*this).generate(); out_mem[iq] /= tmp_i; out_mem[jq] /= tmp_j; } if(iq < n_elem) { out_mem[iq] /= (*this).generate(); } } } template inline void Gen::apply(subview& out) const { arma_extra_debug_sigprint(); // NOTE: we're assuming that the submatrix has the same dimensions as the Gen object // this is checked by subview::operator=() if(is_same_type::yes) { out.eye(); } else if(is_same_type::yes) { out.ones(); } else if(is_same_type::yes) { out.zeros(); } else if(is_same_type::yes) { out.randu(); } else if(is_same_type::yes) { out.randn(); } } //! @} RcppArmadillo/inst/include/armadillo_bits/subview_meat.hpp0000644000176200001440000032661614130024454023606 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup subview //! @{ template inline subview::~subview() { arma_extra_debug_sigprint_this(this); } template inline subview::subview(const Mat& in_m, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols) : m (in_m ) , aux_row1(in_row1 ) , aux_col1(in_col1 ) , n_rows (in_n_rows) , n_cols (in_n_cols) , n_elem (in_n_rows*in_n_cols) { arma_extra_debug_sigprint_this(this); } template inline subview::subview(const subview& in) : m (in.m ) , aux_row1(in.aux_row1) , aux_col1(in.aux_col1) , n_rows (in.n_rows ) , n_cols (in.n_cols ) , n_elem (in.n_elem ) { arma_extra_debug_sigprint(arma_str::format("this = %x in = %x") % this % &in); } template inline subview::subview(subview&& in) : m (in.m ) , aux_row1(in.aux_row1) , aux_col1(in.aux_col1) , n_rows (in.n_rows ) , n_cols (in.n_cols ) , n_elem (in.n_elem ) { arma_extra_debug_sigprint(arma_str::format("this = %x in = %x") % this % &in); // for paranoia access::rw(in.aux_row1) = 0; access::rw(in.aux_col1) = 0; access::rw(in.n_rows ) = 0; access::rw(in.n_cols ) = 0; access::rw(in.n_elem ) = 0; } template template inline void subview::inplace_op(const eT val) { arma_extra_debug_sigprint(); subview& s = *this; const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; if(s_n_rows == 1) { Mat& A = const_cast< Mat& >(s.m); const uword A_n_rows = A.n_rows; eT* Aptr = &(A.at(s.aux_row1,s.aux_col1)); uword jj; for(jj=1; jj < s_n_cols; jj+=2) { if(is_same_type::yes) { (*Aptr) += val; Aptr += A_n_rows; (*Aptr) += val; Aptr += A_n_rows; } if(is_same_type::yes) { (*Aptr) -= val; Aptr += A_n_rows; (*Aptr) -= val; Aptr += A_n_rows; } if(is_same_type::yes) { (*Aptr) *= val; Aptr += A_n_rows; (*Aptr) *= val; Aptr += A_n_rows; } if(is_same_type::yes) { (*Aptr) /= val; Aptr += A_n_rows; (*Aptr) /= val; Aptr += A_n_rows; } } if((jj-1) < s_n_cols) { if(is_same_type::yes) { (*Aptr) += val; } if(is_same_type::yes) { (*Aptr) -= val; } if(is_same_type::yes) { (*Aptr) *= val; } if(is_same_type::yes) { (*Aptr) /= val; } } } else { for(uword ucol=0; ucol < s_n_cols; ++ucol) { if(is_same_type::yes) { arrayops::inplace_plus ( colptr(ucol), val, s_n_rows ); } if(is_same_type::yes) { arrayops::inplace_minus( colptr(ucol), val, s_n_rows ); } if(is_same_type::yes) { arrayops::inplace_mul ( colptr(ucol), val, s_n_rows ); } if(is_same_type::yes) { arrayops::inplace_div ( colptr(ucol), val, s_n_rows ); } } } } template template inline void subview::inplace_op(const Base& in, const char* identifier) { arma_extra_debug_sigprint(); const Proxy P(in.get_ref()); subview& s = *this; const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; arma_debug_assert_same_size(s, P, identifier); const bool use_mp = arma_config::openmp && Proxy::use_mp && mp_gate::eval(s.n_elem); const bool has_overlap = P.has_overlap(s); if(has_overlap) { arma_extra_debug_print("aliasing or overlap detected"); } if( (is_Mat::stored_type>::value) || (use_mp) || (has_overlap) ) { const unwrap_check::stored_type> tmp(P.Q, has_overlap); const Mat& B = tmp.M; if(s_n_rows == 1) { Mat& A = const_cast< Mat& >(m); const uword A_n_rows = A.n_rows; eT* Aptr = &(A.at(aux_row1,aux_col1)); const eT* Bptr = B.memptr(); uword jj; for(jj=1; jj < s_n_cols; jj+=2) { const eT tmp1 = (*Bptr); Bptr++; const eT tmp2 = (*Bptr); Bptr++; if(is_same_type::yes) { (*Aptr) = tmp1; Aptr += A_n_rows; (*Aptr) = tmp2; Aptr += A_n_rows; } if(is_same_type::yes) { (*Aptr) += tmp1; Aptr += A_n_rows; (*Aptr) += tmp2; Aptr += A_n_rows; } if(is_same_type::yes) { (*Aptr) -= tmp1; Aptr += A_n_rows; (*Aptr) -= tmp2; Aptr += A_n_rows; } if(is_same_type::yes) { (*Aptr) *= tmp1; Aptr += A_n_rows; (*Aptr) *= tmp2; Aptr += A_n_rows; } if(is_same_type::yes) { (*Aptr) /= tmp1; Aptr += A_n_rows; (*Aptr) /= tmp2; Aptr += A_n_rows; } } if((jj-1) < s_n_cols) { if(is_same_type::yes) { (*Aptr) = (*Bptr); } if(is_same_type::yes) { (*Aptr) += (*Bptr); } if(is_same_type::yes) { (*Aptr) -= (*Bptr); } if(is_same_type::yes) { (*Aptr) *= (*Bptr); } if(is_same_type::yes) { (*Aptr) /= (*Bptr); } } } else // not a row vector { if((s.aux_row1 == 0) && (s_n_rows == s.m.n_rows)) { if(is_same_type::yes) { arrayops::copy ( s.colptr(0), B.memptr(), s.n_elem ); } if(is_same_type::yes) { arrayops::inplace_plus ( s.colptr(0), B.memptr(), s.n_elem ); } if(is_same_type::yes) { arrayops::inplace_minus( s.colptr(0), B.memptr(), s.n_elem ); } if(is_same_type::yes) { arrayops::inplace_mul ( s.colptr(0), B.memptr(), s.n_elem ); } if(is_same_type::yes) { arrayops::inplace_div ( s.colptr(0), B.memptr(), s.n_elem ); } } else { for(uword ucol=0; ucol < s_n_cols; ++ucol) { if(is_same_type::yes) { arrayops::copy ( s.colptr(ucol), B.colptr(ucol), s_n_rows ); } if(is_same_type::yes) { arrayops::inplace_plus ( s.colptr(ucol), B.colptr(ucol), s_n_rows ); } if(is_same_type::yes) { arrayops::inplace_minus( s.colptr(ucol), B.colptr(ucol), s_n_rows ); } if(is_same_type::yes) { arrayops::inplace_mul ( s.colptr(ucol), B.colptr(ucol), s_n_rows ); } if(is_same_type::yes) { arrayops::inplace_div ( s.colptr(ucol), B.colptr(ucol), s_n_rows ); } } } } } else // use the Proxy { if(s_n_rows == 1) { Mat& A = const_cast< Mat& >(m); const uword A_n_rows = A.n_rows; eT* Aptr = &(A.at(aux_row1,aux_col1)); uword jj; for(jj=1; jj < s_n_cols; jj+=2) { const uword ii = (jj-1); const eT tmp1 = (Proxy::use_at) ? P.at(0,ii) : P[ii]; const eT tmp2 = (Proxy::use_at) ? P.at(0,jj) : P[jj]; if(is_same_type::yes) { (*Aptr) = tmp1; Aptr += A_n_rows; (*Aptr) = tmp2; Aptr += A_n_rows; } if(is_same_type::yes) { (*Aptr) += tmp1; Aptr += A_n_rows; (*Aptr) += tmp2; Aptr += A_n_rows; } if(is_same_type::yes) { (*Aptr) -= tmp1; Aptr += A_n_rows; (*Aptr) -= tmp2; Aptr += A_n_rows; } if(is_same_type::yes) { (*Aptr) *= tmp1; Aptr += A_n_rows; (*Aptr) *= tmp2; Aptr += A_n_rows; } if(is_same_type::yes) { (*Aptr) /= tmp1; Aptr += A_n_rows; (*Aptr) /= tmp2; Aptr += A_n_rows; } } const uword ii = (jj-1); if(ii < s_n_cols) { if(is_same_type::yes) { (*Aptr) = (Proxy::use_at) ? P.at(0,ii) : P[ii]; } if(is_same_type::yes) { (*Aptr) += (Proxy::use_at) ? P.at(0,ii) : P[ii]; } if(is_same_type::yes) { (*Aptr) -= (Proxy::use_at) ? P.at(0,ii) : P[ii]; } if(is_same_type::yes) { (*Aptr) *= (Proxy::use_at) ? P.at(0,ii) : P[ii]; } if(is_same_type::yes) { (*Aptr) /= (Proxy::use_at) ? P.at(0,ii) : P[ii]; } } } else // not a row vector { if(Proxy::use_at) { for(uword ucol=0; ucol < s_n_cols; ++ucol) { eT* s_col_data = s.colptr(ucol); uword jj; for(jj=1; jj < s_n_rows; jj+=2) { const uword ii = (jj-1); const eT tmp1 = P.at(ii,ucol); const eT tmp2 = P.at(jj,ucol); if(is_same_type::yes) { (*s_col_data) = tmp1; s_col_data++; (*s_col_data) = tmp2; s_col_data++; } if(is_same_type::yes) { (*s_col_data) += tmp1; s_col_data++; (*s_col_data) += tmp2; s_col_data++; } if(is_same_type::yes) { (*s_col_data) -= tmp1; s_col_data++; (*s_col_data) -= tmp2; s_col_data++; } if(is_same_type::yes) { (*s_col_data) *= tmp1; s_col_data++; (*s_col_data) *= tmp2; s_col_data++; } if(is_same_type::yes) { (*s_col_data) /= tmp1; s_col_data++; (*s_col_data) /= tmp2; s_col_data++; } } const uword ii = (jj-1); if(ii < s_n_rows) { if(is_same_type::yes) { (*s_col_data) = P.at(ii,ucol); } if(is_same_type::yes) { (*s_col_data) += P.at(ii,ucol); } if(is_same_type::yes) { (*s_col_data) -= P.at(ii,ucol); } if(is_same_type::yes) { (*s_col_data) *= P.at(ii,ucol); } if(is_same_type::yes) { (*s_col_data) /= P.at(ii,ucol); } } } } else { typename Proxy::ea_type Pea = P.get_ea(); uword count = 0; for(uword ucol=0; ucol < s_n_cols; ++ucol) { eT* s_col_data = s.colptr(ucol); uword jj; for(jj=1; jj < s_n_rows; jj+=2) { const eT tmp1 = Pea[count]; count++; const eT tmp2 = Pea[count]; count++; if(is_same_type::yes) { (*s_col_data) = tmp1; s_col_data++; (*s_col_data) = tmp2; s_col_data++; } if(is_same_type::yes) { (*s_col_data) += tmp1; s_col_data++; (*s_col_data) += tmp2; s_col_data++; } if(is_same_type::yes) { (*s_col_data) -= tmp1; s_col_data++; (*s_col_data) -= tmp2; s_col_data++; } if(is_same_type::yes) { (*s_col_data) *= tmp1; s_col_data++; (*s_col_data) *= tmp2; s_col_data++; } if(is_same_type::yes) { (*s_col_data) /= tmp1; s_col_data++; (*s_col_data) /= tmp2; s_col_data++; } } if((jj-1) < s_n_rows) { if(is_same_type::yes) { (*s_col_data) = Pea[count]; count++; } if(is_same_type::yes) { (*s_col_data) += Pea[count]; count++; } if(is_same_type::yes) { (*s_col_data) -= Pea[count]; count++; } if(is_same_type::yes) { (*s_col_data) *= Pea[count]; count++; } if(is_same_type::yes) { (*s_col_data) /= Pea[count]; count++; } } } } } } } template template inline void subview::inplace_op(const subview& x, const char* identifier) { arma_extra_debug_sigprint(); if(check_overlap(x)) { const Mat tmp(x); if(is_same_type::yes) { (*this).operator= (tmp); } if(is_same_type::yes) { (*this).operator+=(tmp); } if(is_same_type::yes) { (*this).operator-=(tmp); } if(is_same_type::yes) { (*this).operator%=(tmp); } if(is_same_type::yes) { (*this).operator/=(tmp); } return; } subview& s = *this; arma_debug_assert_same_size(s, x, identifier); const uword s_n_cols = s.n_cols; const uword s_n_rows = s.n_rows; if(s_n_rows == 1) { Mat& A = const_cast< Mat& >(s.m); const Mat& B = x.m; const uword A_n_rows = A.n_rows; const uword B_n_rows = B.n_rows; eT* Aptr = &(A.at(s.aux_row1,s.aux_col1)); const eT* Bptr = &(B.at(x.aux_row1,x.aux_col1)); uword jj; for(jj=1; jj < s_n_cols; jj+=2) { const eT tmp1 = (*Bptr); Bptr += B_n_rows; const eT tmp2 = (*Bptr); Bptr += B_n_rows; if(is_same_type::yes) { (*Aptr) = tmp1; Aptr += A_n_rows; (*Aptr) = tmp2; Aptr += A_n_rows; } if(is_same_type::yes) { (*Aptr) += tmp1; Aptr += A_n_rows; (*Aptr) += tmp2; Aptr += A_n_rows; } if(is_same_type::yes) { (*Aptr) -= tmp1; Aptr += A_n_rows; (*Aptr) -= tmp2; Aptr += A_n_rows; } if(is_same_type::yes) { (*Aptr) *= tmp1; Aptr += A_n_rows; (*Aptr) *= tmp2; Aptr += A_n_rows; } if(is_same_type::yes) { (*Aptr) /= tmp1; Aptr += A_n_rows; (*Aptr) /= tmp2; Aptr += A_n_rows; } } if((jj-1) < s_n_cols) { if(is_same_type::yes) { (*Aptr) = (*Bptr); } if(is_same_type::yes) { (*Aptr) += (*Bptr); } if(is_same_type::yes) { (*Aptr) -= (*Bptr); } if(is_same_type::yes) { (*Aptr) *= (*Bptr); } if(is_same_type::yes) { (*Aptr) /= (*Bptr); } } } else { for(uword ucol=0; ucol < s_n_cols; ++ucol) { if(is_same_type::yes) { arrayops::copy ( s.colptr(ucol), x.colptr(ucol), s_n_rows ); } if(is_same_type::yes) { arrayops::inplace_plus ( s.colptr(ucol), x.colptr(ucol), s_n_rows ); } if(is_same_type::yes) { arrayops::inplace_minus( s.colptr(ucol), x.colptr(ucol), s_n_rows ); } if(is_same_type::yes) { arrayops::inplace_mul ( s.colptr(ucol), x.colptr(ucol), s_n_rows ); } if(is_same_type::yes) { arrayops::inplace_div ( s.colptr(ucol), x.colptr(ucol), s_n_rows ); } } } } template inline void subview::operator= (const eT val) { arma_extra_debug_sigprint(); if(n_elem != 1) { arma_debug_assert_same_size(n_rows, n_cols, 1, 1, "copy into submatrix"); } Mat& X = const_cast< Mat& >(m); X.at(aux_row1, aux_col1) = val; } template inline void subview::operator+= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview::operator-= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview::operator*= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview::operator/= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview::operator= (const subview& x) { arma_extra_debug_sigprint(); inplace_op(x, "copy into submatrix"); } template inline void subview::operator+= (const subview& x) { arma_extra_debug_sigprint(); inplace_op(x, "addition"); } template inline void subview::operator-= (const subview& x) { arma_extra_debug_sigprint(); inplace_op(x, "subtraction"); } template inline void subview::operator%= (const subview& x) { arma_extra_debug_sigprint(); inplace_op(x, "element-wise multiplication"); } template inline void subview::operator/= (const subview& x) { arma_extra_debug_sigprint(); inplace_op(x, "element-wise division"); } template template inline void subview::operator= (const Base& in) { arma_extra_debug_sigprint(); inplace_op(in, "copy into submatrix"); } template template inline void subview::operator+= (const Base& in) { arma_extra_debug_sigprint(); inplace_op(in, "addition"); } template template inline void subview::operator-= (const Base& in) { arma_extra_debug_sigprint(); inplace_op(in, "subtraction"); } template template inline void subview::operator%= (const Base& in) { arma_extra_debug_sigprint(); inplace_op(in, "element-wise multiplication"); } template template inline void subview::operator/= (const Base& in) { arma_extra_debug_sigprint(); inplace_op(in, "element-wise division"); } template template inline void subview::operator=(const SpBase& x) { arma_extra_debug_sigprint(); const SpProxy p(x.get_ref()); arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "copy into submatrix"); // Clear the subview. zeros(); // Iterate through the sparse subview and set the nonzero values appropriately. typename SpProxy::const_iterator_type cit = p.begin(); typename SpProxy::const_iterator_type cit_end = p.end(); while(cit != cit_end) { at(cit.row(), cit.col()) = *cit; ++cit; } } template template inline void subview::operator+=(const SpBase& x) { arma_extra_debug_sigprint(); const SpProxy p(x.get_ref()); arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "addition"); // Iterate through the sparse subview and add its values. typename SpProxy::const_iterator_type cit = p.begin(); typename SpProxy::const_iterator_type cit_end = p.end(); while(cit != cit_end) { at(cit.row(), cit.col()) += *cit; ++cit; } } template template inline void subview::operator-=(const SpBase& x) { arma_extra_debug_sigprint(); const SpProxy p(x.get_ref()); arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "subtraction"); // Iterate through the sparse subview and subtract its values. typename SpProxy::const_iterator_type cit = p.begin(); typename SpProxy::const_iterator_type cit_end = p.end(); while(cit != cit_end) { at(cit.row(), cit.col()) -= *cit; ++cit; } } template template inline void subview::operator%=(const SpBase& x) { arma_extra_debug_sigprint(); const uword s_n_rows = (*this).n_rows; const uword s_n_cols = (*this).n_cols; const SpProxy p(x.get_ref()); arma_debug_assert_same_size(s_n_rows, s_n_cols, p.get_n_rows(), p.get_n_cols(), "element-wise multiplication"); if(n_elem == 0) { return; } if(p.get_n_nonzero() == 0) { (*this).zeros(); return; } // Iterate over nonzero values. // Any zero values in the sparse expression will result in a zero in our subview. typename SpProxy::const_iterator_type cit = p.begin(); typename SpProxy::const_iterator_type cit_end = p.end(); uword r = 0; uword c = 0; while(cit != cit_end) { const uword cit_row = cit.row(); const uword cit_col = cit.col(); while( ((r == cit_row) && (c == cit_col)) == false ) { at(r,c) = eT(0); r++; if(r >= s_n_rows) { r = 0; c++; } } at(r, c) *= (*cit); ++cit; r++; if(r >= s_n_rows) { r = 0; c++; } } } template template inline void subview::operator/=(const SpBase& x) { arma_extra_debug_sigprint(); const SpProxy p(x.get_ref()); arma_debug_assert_same_size(n_rows, n_cols, p.get_n_rows(), p.get_n_cols(), "element-wise division"); // This is probably going to fill your subview with a bunch of NaNs, // so I'm not going to bother to implement it fast. // You can have slow NaNs. They're fine too. for(uword c = 0; c < n_cols; ++c) for(uword r = 0; r < n_rows; ++r) { at(r, c) /= p.at(r, c); } } template template inline typename enable_if2< is_same_type::value, void>::result subview::operator= (const Gen& in) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(n_rows, n_cols, in.n_rows, in.n_cols, "copy into submatrix"); in.apply(*this); } template inline void subview::operator=(const std::initializer_list& list) { arma_extra_debug_sigprint(); arma_debug_check( (is_vec() == false), "copy into submatrix: size mismatch" ); const uword N = uword(list.size()); if(n_rows == 1) { arma_debug_assert_same_size(1, n_cols, 1, N, "copy into submatrix"); auto it = list.begin(); for(uword ii=0; ii < N; ++ii) { (*this).at(0,ii) = (*it); ++it; } } else if(n_cols == 1) { arma_debug_assert_same_size(n_rows, 1, N, 1, "copy into submatrix"); arrayops::copy( (*this).colptr(0), list.begin(), N ); } } template inline void subview::operator=(const std::initializer_list< std::initializer_list >& list) { arma_extra_debug_sigprint(); const Mat tmp(list); (*this).operator=(tmp); } //! apply a functor to each element template template inline void subview::for_each(functor F) { arma_extra_debug_sigprint(); Mat& X = const_cast< Mat& >(m); if(n_rows == 1) { const uword urow = aux_row1; const uword start_col = aux_col1; const uword end_col_plus1 = start_col + n_cols; for(uword ucol = start_col; ucol < end_col_plus1; ++ucol) { F( X.at(urow, ucol) ); } } else { const uword start_col = aux_col1; const uword start_row = aux_row1; const uword end_col_plus1 = start_col + n_cols; const uword end_row_plus1 = start_row + n_rows; for(uword ucol = start_col; ucol < end_col_plus1; ++ucol) for(uword urow = start_row; urow < end_row_plus1; ++urow) { F( X.at(urow, ucol) ); } } } template template inline void subview::for_each(functor F) const { arma_extra_debug_sigprint(); const Mat& X = m; if(n_rows == 1) { const uword urow = aux_row1; const uword start_col = aux_col1; const uword end_col_plus1 = start_col + n_cols; for(uword ucol = start_col; ucol < end_col_plus1; ++ucol) { F( X.at(urow, ucol) ); } } else { const uword start_col = aux_col1; const uword start_row = aux_row1; const uword end_col_plus1 = start_col + n_cols; const uword end_row_plus1 = start_row + n_rows; for(uword ucol = start_col; ucol < end_col_plus1; ++ucol) for(uword urow = start_row; urow < end_row_plus1; ++urow) { F( X.at(urow, ucol) ); } } } //! transform each element in the subview using a functor template template inline void subview::transform(functor F) { arma_extra_debug_sigprint(); Mat& X = const_cast< Mat& >(m); if(n_rows == 1) { const uword urow = aux_row1; const uword start_col = aux_col1; const uword end_col_plus1 = start_col + n_cols; for(uword ucol = start_col; ucol < end_col_plus1; ++ucol) { X.at(urow, ucol) = eT( F( X.at(urow, ucol) ) ); } } else { const uword start_col = aux_col1; const uword start_row = aux_row1; const uword end_col_plus1 = start_col + n_cols; const uword end_row_plus1 = start_row + n_rows; for(uword ucol = start_col; ucol < end_col_plus1; ++ucol) for(uword urow = start_row; urow < end_row_plus1; ++urow) { X.at(urow, ucol) = eT( F( X.at(urow, ucol) ) ); } } } //! imbue (fill) the subview with values provided by a functor template template inline void subview::imbue(functor F) { arma_extra_debug_sigprint(); Mat& X = const_cast< Mat& >(m); if(n_rows == 1) { const uword urow = aux_row1; const uword start_col = aux_col1; const uword end_col_plus1 = start_col + n_cols; for(uword ucol = start_col; ucol < end_col_plus1; ++ucol) { X.at(urow, ucol) = eT( F() ); } } else { const uword start_col = aux_col1; const uword start_row = aux_row1; const uword end_col_plus1 = start_col + n_cols; const uword end_row_plus1 = start_row + n_rows; for(uword ucol = start_col; ucol < end_col_plus1; ++ucol) for(uword urow = start_row; urow < end_row_plus1; ++urow) { X.at(urow, ucol) = eT( F() ); } } } template inline void subview::replace(const eT old_val, const eT new_val) { arma_extra_debug_sigprint(); subview& s = *this; const uword s_n_cols = s.n_cols; const uword s_n_rows = s.n_rows; if(s_n_rows == 1) { Mat& A = const_cast< Mat& >(s.m); const uword A_n_rows = A.n_rows; eT* Aptr = &(A.at(s.aux_row1,s.aux_col1)); if(arma_isnan(old_val)) { for(uword ucol=0; ucol < s_n_cols; ++ucol) { (*Aptr) = (arma_isnan(*Aptr)) ? new_val : (*Aptr); Aptr += A_n_rows; } } else { for(uword ucol=0; ucol < s_n_cols; ++ucol) { (*Aptr) = ((*Aptr) == old_val) ? new_val : (*Aptr); Aptr += A_n_rows; } } } else { for(uword ucol=0; ucol < s_n_cols; ++ucol) { arrayops::replace(s.colptr(ucol), s_n_rows, old_val, new_val); } } } template inline void subview::clean(const typename get_pod_type::result threshold) { arma_extra_debug_sigprint(); subview& s = *this; const uword s_n_cols = s.n_cols; const uword s_n_rows = s.n_rows; for(uword ucol=0; ucol < s_n_cols; ++ucol) { arrayops::clean( s.colptr(ucol), s_n_rows, threshold ); } } template inline void subview::clamp(const eT min_val, const eT max_val) { arma_extra_debug_sigprint(); if(is_cx::no) { arma_debug_check( (access::tmp_real(min_val) > access::tmp_real(max_val)), "subview::clamp(): min_val must be less than max_val" ); } else { arma_debug_check( (access::tmp_real(min_val) > access::tmp_real(max_val)), "subview::clamp(): real(min_val) must be less than real(max_val)" ); arma_debug_check( (access::tmp_imag(min_val) > access::tmp_imag(max_val)), "subview::clamp(): imag(min_val) must be less than imag(max_val)" ); } subview& s = *this; const uword s_n_cols = s.n_cols; const uword s_n_rows = s.n_rows; for(uword ucol=0; ucol < s_n_cols; ++ucol) { arrayops::clamp( s.colptr(ucol), s_n_rows, min_val, max_val ); } } template inline void subview::fill(const eT val) { arma_extra_debug_sigprint(); subview& s = *this; const uword s_n_cols = s.n_cols; const uword s_n_rows = s.n_rows; if(s_n_rows == 1) { Mat& A = const_cast< Mat& >(s.m); const uword A_n_rows = A.n_rows; eT* Aptr = &(A.at(s.aux_row1,s.aux_col1)); uword jj; for(jj=1; jj < s_n_cols; jj+=2) { (*Aptr) = val; Aptr += A_n_rows; (*Aptr) = val; Aptr += A_n_rows; } if((jj-1) < s_n_cols) { (*Aptr) = val; } } else { if( (s.aux_row1 == 0) && (s_n_rows == s.m.n_rows) ) { arrayops::inplace_set( s.colptr(0), val, s.n_elem ); } else { for(uword ucol=0; ucol < s_n_cols; ++ucol) { arrayops::inplace_set( s.colptr(ucol), val, s_n_rows ); } } } } template inline void subview::zeros() { arma_extra_debug_sigprint(); (*this).fill(eT(0)); } template inline void subview::ones() { arma_extra_debug_sigprint(); (*this).fill(eT(1)); } template inline void subview::eye() { arma_extra_debug_sigprint(); (*this).zeros(); const uword N = (std::min)(n_rows, n_cols); for(uword ii=0; ii < N; ++ii) { at(ii,ii) = eT(1); } } template inline void subview::randu() { arma_extra_debug_sigprint(); subview& s = (*this); const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; if(s_n_rows == 1) { podarray tmp(s_n_cols); eT* tmp_mem = tmp.memptr(); arma_rng::randu::fill( tmp_mem, s_n_cols ); for(uword ii=0; ii < s_n_cols; ++ii) { at(0,ii) = tmp_mem[ii]; } } else { if( (s.aux_row1 == 0) && (s_n_rows == s.m.n_rows) ) { arma_rng::randu::fill( s.colptr(0), s.n_elem ); } else { for(uword ii=0; ii < s_n_cols; ++ii) { arma_rng::randu::fill( s.colptr(ii), s_n_rows ); } } } } template inline void subview::randn() { arma_extra_debug_sigprint(); subview& s = (*this); const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; if(s_n_rows == 1) { podarray tmp(s_n_cols); eT* tmp_mem = tmp.memptr(); arma_rng::randn::fill( tmp_mem, s_n_cols ); for(uword ii=0; ii < s_n_cols; ++ii) { at(0,ii) = tmp_mem[ii]; } } else { if( (s.aux_row1 == 0) && (s_n_rows == s.m.n_rows) ) { arma_rng::randn::fill( s.colptr(0), s.n_elem ); } else { for(uword ii=0; ii < s_n_cols; ++ii) { arma_rng::randn::fill( s.colptr(ii), s_n_rows ); } } } } template inline arma_warn_unused eT subview::at_alt(const uword ii) const { return operator[](ii); } template inline arma_warn_unused eT& subview::operator[](const uword ii) { const uword in_col = ii / n_rows; const uword in_row = ii % n_rows; const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return access::rw( (const_cast< Mat& >(m)).mem[index] ); } template inline arma_warn_unused eT subview::operator[](const uword ii) const { const uword in_col = ii / n_rows; const uword in_row = ii % n_rows; const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return m.mem[index]; } template inline arma_warn_unused eT& subview::operator()(const uword ii) { arma_debug_check_bounds( (ii >= n_elem), "subview::operator(): index out of bounds" ); const uword in_col = ii / n_rows; const uword in_row = ii % n_rows; const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return access::rw( (const_cast< Mat& >(m)).mem[index] ); } template inline arma_warn_unused eT subview::operator()(const uword ii) const { arma_debug_check_bounds( (ii >= n_elem), "subview::operator(): index out of bounds" ); const uword in_col = ii / n_rows; const uword in_row = ii % n_rows; const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return m.mem[index]; } template inline arma_warn_unused eT& subview::operator()(const uword in_row, const uword in_col) { arma_debug_check_bounds( ((in_row >= n_rows) || (in_col >= n_cols)), "subview::operator(): index out of bounds" ); const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return access::rw( (const_cast< Mat& >(m)).mem[index] ); } template inline arma_warn_unused eT subview::operator()(const uword in_row, const uword in_col) const { arma_debug_check_bounds( ((in_row >= n_rows) || (in_col >= n_cols)), "subview::operator(): index out of bounds" ); const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return m.mem[index]; } template inline arma_warn_unused eT& subview::at(const uword in_row, const uword in_col) { const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return access::rw( (const_cast< Mat& >(m)).mem[index] ); } template inline arma_warn_unused eT subview::at(const uword in_row, const uword in_col) const { const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return m.mem[index]; } template inline arma_warn_unused eT& subview::front() { const uword index = aux_col1*m.n_rows + aux_row1; return access::rw( (const_cast< Mat& >(m)).mem[index] ); } template inline arma_warn_unused eT subview::front() const { const uword index = aux_col1*m.n_rows + aux_row1; return m.mem[index]; } template inline arma_warn_unused eT& subview::back() { const uword in_row = n_rows - 1; const uword in_col = n_cols - 1; const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return access::rw( (const_cast< Mat& >(m)).mem[index] ); } template inline arma_warn_unused eT subview::back() const { const uword in_row = n_rows - 1; const uword in_col = n_cols - 1; const uword index = (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return m.mem[index]; } template arma_inline eT* subview::colptr(const uword in_col) { return & access::rw((const_cast< Mat& >(m)).mem[ (in_col + aux_col1)*m.n_rows + aux_row1 ]); } template arma_inline const eT* subview::colptr(const uword in_col) const { return & m.mem[ (in_col + aux_col1)*m.n_rows + aux_row1 ]; } template template inline bool subview::check_overlap(const subview& x) const { if(is_same_type::value == false) { return false; } const subview& s = (*this); if(void_ptr(&(s.m)) != void_ptr(&(x.m))) { return false; } if( (s.n_elem == 0) || (x.n_elem == 0) ) { return false; } const uword s_row_start = s.aux_row1; const uword s_row_end_p1 = s_row_start + s.n_rows; const uword s_col_start = s.aux_col1; const uword s_col_end_p1 = s_col_start + s.n_cols; const uword x_row_start = x.aux_row1; const uword x_row_end_p1 = x_row_start + x.n_rows; const uword x_col_start = x.aux_col1; const uword x_col_end_p1 = x_col_start + x.n_cols; const bool outside_rows = ( (x_row_start >= s_row_end_p1) || (s_row_start >= x_row_end_p1) ); const bool outside_cols = ( (x_col_start >= s_col_end_p1) || (s_col_start >= x_col_end_p1) ); return ( (outside_rows == false) && (outside_cols == false) ); } template inline arma_warn_unused bool subview::is_vec() const { return ( (n_rows == 1) || (n_cols == 1) ); } template inline arma_warn_unused bool subview::is_finite() const { arma_extra_debug_sigprint(); const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; for(uword ii=0; ii inline arma_warn_unused bool subview::is_zero(const typename get_pod_type::result tol) const { arma_extra_debug_sigprint(); const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; for(uword ii=0; ii inline arma_warn_unused bool subview::has_inf() const { arma_extra_debug_sigprint(); const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; for(uword ii=0; ii inline arma_warn_unused bool subview::has_nan() const { arma_extra_debug_sigprint(); const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; for(uword ii=0; ii inline void subview::extract(Mat& out, const subview& in) { arma_extra_debug_sigprint(); // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing; // size setting and alias checking is done by either the Mat contructor or operator=() const uword n_rows = in.n_rows; // number of rows in the subview const uword n_cols = in.n_cols; // number of columns in the subview arma_extra_debug_print(arma_str::format("out.n_rows = %d out.n_cols = %d in.m.n_rows = %d in.m.n_cols = %d") % out.n_rows % out.n_cols % in.m.n_rows % in.m.n_cols ); if(in.is_vec()) { if(n_cols == 1) // a column vector { arma_extra_debug_print("subview::extract(): copying col (going across rows)"); // in.colptr(0) the first column of the subview, taking into account any row offset arrayops::copy( out.memptr(), in.colptr(0), n_rows ); } else // a row vector (possibly empty) { arma_extra_debug_print("subview::extract(): copying row (going across columns)"); eT* out_mem = out.memptr(); const uword X_n_rows = in.m.n_rows; const eT* Xptr = &(in.m.at(in.aux_row1,in.aux_col1)); uword j; for(j=1; j < n_cols; j+=2) { const eT tmp1 = (*Xptr); Xptr += X_n_rows; const eT tmp2 = (*Xptr); Xptr += X_n_rows; (*out_mem) = tmp1; out_mem++; (*out_mem) = tmp2; out_mem++; } if((j-1) < n_cols) { (*out_mem) = (*Xptr); } } } else // general submatrix { arma_extra_debug_print("subview::extract(): general submatrix"); if( (in.aux_row1 == 0) && (n_rows == in.m.n_rows) ) { arrayops::copy( out.memptr(), in.colptr(0), in.n_elem ); } else { for(uword col=0; col < n_cols; ++col) { arrayops::copy( out.colptr(col), in.colptr(col), n_rows ); } } } } //! X += Y.submat(...) template inline void subview::plus_inplace(Mat& out, const subview& in) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out, in, "addition"); const uword n_rows = in.n_rows; const uword n_cols = in.n_cols; if(n_rows == 1) { eT* out_mem = out.memptr(); const Mat& X = in.m; const uword row = in.aux_row1; const uword start_col = in.aux_col1; uword i,j; for(i=0, j=1; j < n_cols; i+=2, j+=2) { const eT tmp1 = X.at(row, start_col+i); const eT tmp2 = X.at(row, start_col+j); out_mem[i] += tmp1; out_mem[j] += tmp2; } if(i < n_cols) { out_mem[i] += X.at(row, start_col+i); } } else { for(uword col=0; col < n_cols; ++col) { arrayops::inplace_plus(out.colptr(col), in.colptr(col), n_rows); } } } //! X -= Y.submat(...) template inline void subview::minus_inplace(Mat& out, const subview& in) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out, in, "subtraction"); const uword n_rows = in.n_rows; const uword n_cols = in.n_cols; if(n_rows == 1) { eT* out_mem = out.memptr(); const Mat& X = in.m; const uword row = in.aux_row1; const uword start_col = in.aux_col1; uword i,j; for(i=0, j=1; j < n_cols; i+=2, j+=2) { const eT tmp1 = X.at(row, start_col+i); const eT tmp2 = X.at(row, start_col+j); out_mem[i] -= tmp1; out_mem[j] -= tmp2; } if(i < n_cols) { out_mem[i] -= X.at(row, start_col+i); } } else { for(uword col=0; col < n_cols; ++col) { arrayops::inplace_minus(out.colptr(col), in.colptr(col), n_rows); } } } //! X %= Y.submat(...) template inline void subview::schur_inplace(Mat& out, const subview& in) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out, in, "element-wise multiplication"); const uword n_rows = in.n_rows; const uword n_cols = in.n_cols; if(n_rows == 1) { eT* out_mem = out.memptr(); const Mat& X = in.m; const uword row = in.aux_row1; const uword start_col = in.aux_col1; uword i,j; for(i=0, j=1; j < n_cols; i+=2, j+=2) { const eT tmp1 = X.at(row, start_col+i); const eT tmp2 = X.at(row, start_col+j); out_mem[i] *= tmp1; out_mem[j] *= tmp2; } if(i < n_cols) { out_mem[i] *= X.at(row, start_col+i); } } else { for(uword col=0; col < n_cols; ++col) { arrayops::inplace_mul(out.colptr(col), in.colptr(col), n_rows); } } } //! X /= Y.submat(...) template inline void subview::div_inplace(Mat& out, const subview& in) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out, in, "element-wise division"); const uword n_rows = in.n_rows; const uword n_cols = in.n_cols; if(n_rows == 1) { eT* out_mem = out.memptr(); const Mat& X = in.m; const uword row = in.aux_row1; const uword start_col = in.aux_col1; uword i,j; for(i=0, j=1; j < n_cols; i+=2, j+=2) { const eT tmp1 = X.at(row, start_col+i); const eT tmp2 = X.at(row, start_col+j); out_mem[i] /= tmp1; out_mem[j] /= tmp2; } if(i < n_cols) { out_mem[i] /= X.at(row, start_col+i); } } else { for(uword col=0; col < n_cols; ++col) { arrayops::inplace_div(out.colptr(col), in.colptr(col), n_rows); } } } //! creation of subview (row vector) template inline subview_row subview::row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( row_num >= n_rows, "subview::row(): out of bounds" ); const uword base_row = aux_row1 + row_num; return subview_row(m, base_row, aux_col1, n_cols); } //! creation of subview (row vector) template inline const subview_row subview::row(const uword row_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( row_num >= n_rows, "subview::row(): out of bounds" ); const uword base_row = aux_row1 + row_num; return subview_row(m, base_row, aux_col1, n_cols); } template inline subview_row subview::operator()(const uword row_num, const span& col_span) { arma_extra_debug_sigprint(); const bool col_all = col_span.whole; const uword local_n_cols = n_cols; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; const uword base_col1 = aux_col1 + in_col1; const uword base_row = aux_row1 + row_num; arma_debug_check_bounds ( (row_num >= n_rows) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "subview::operator(): indices out of bounds or incorrectly used" ); return subview_row(m, base_row, base_col1, submat_n_cols); } template inline const subview_row subview::operator()(const uword row_num, const span& col_span) const { arma_extra_debug_sigprint(); const bool col_all = col_span.whole; const uword local_n_cols = n_cols; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; const uword base_col1 = aux_col1 + in_col1; const uword base_row = aux_row1 + row_num; arma_debug_check_bounds ( (row_num >= n_rows) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "subview::operator(): indices out of bounds or incorrectly used" ); return subview_row(m, base_row, base_col1, submat_n_cols); } //! creation of subview (column vector) template inline subview_col subview::col(const uword col_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( col_num >= n_cols, "subview::col(): out of bounds" ); const uword base_col = aux_col1 + col_num; return subview_col(m, base_col, aux_row1, n_rows); } //! creation of subview (column vector) template inline const subview_col subview::col(const uword col_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( col_num >= n_cols, "subview::col(): out of bounds" ); const uword base_col = aux_col1 + col_num; return subview_col(m, base_col, aux_row1, n_rows); } template inline subview_col subview::operator()(const span& row_span, const uword col_num) { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const uword local_n_rows = n_rows; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword base_row1 = aux_row1 + in_row1; const uword base_col = aux_col1 + col_num; arma_debug_check_bounds ( (col_num >= n_cols) || ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) , "subview::operator(): indices out of bounds or incorrectly used" ); return subview_col(m, base_col, base_row1, submat_n_rows); } template inline const subview_col subview::operator()(const span& row_span, const uword col_num) const { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const uword local_n_rows = n_rows; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword base_row1 = aux_row1 + in_row1; const uword base_col = aux_col1 + col_num; arma_debug_check_bounds ( (col_num >= n_cols) || ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) , "subview::operator(): indices out of bounds or incorrectly used" ); return subview_col(m, base_col, base_row1, submat_n_rows); } //! create a Col object which uses memory from an existing matrix object. //! this approach is currently not alias safe //! and does not take into account that the parent matrix object could be deleted. //! if deleted memory is accessed by the created Col object, //! it will cause memory corruption and/or a crash template inline Col subview::unsafe_col(const uword col_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( col_num >= n_cols, "subview::unsafe_col(): out of bounds" ); return Col(colptr(col_num), n_rows, false, true); } //! create a Col object which uses memory from an existing matrix object. //! this approach is currently not alias safe //! and does not take into account that the parent matrix object could be deleted. //! if deleted memory is accessed by the created Col object, //! it will cause memory corruption and/or a crash template inline const Col subview::unsafe_col(const uword col_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( col_num >= n_cols, "subview::unsafe_col(): out of bounds" ); return Col(const_cast(colptr(col_num)), n_rows, false, true); } //! creation of subview (submatrix comprised of specified row vectors) template inline subview subview::rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_row2 >= n_rows), "subview::rows(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; const uword base_row1 = aux_row1 + in_row1; return subview(m, base_row1, aux_col1, subview_n_rows, n_cols ); } //! creation of subview (submatrix comprised of specified row vectors) template inline const subview subview::rows(const uword in_row1, const uword in_row2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_row2 >= n_rows), "subview::rows(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; const uword base_row1 = aux_row1 + in_row1; return subview(m, base_row1, aux_col1, subview_n_rows, n_cols ); } //! creation of subview (submatrix comprised of specified column vectors) template inline subview subview::cols(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_col1 > in_col2) || (in_col2 >= n_cols), "subview::cols(): indices out of bounds or incorrectly used" ); const uword subview_n_cols = in_col2 - in_col1 + 1; const uword base_col1 = aux_col1 + in_col1; return subview(m, aux_row1, base_col1, n_rows, subview_n_cols); } //! creation of subview (submatrix comprised of specified column vectors) template inline const subview subview::cols(const uword in_col1, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_col1 > in_col2) || (in_col2 >= n_cols), "subview::cols(): indices out of bounds or incorrectly used" ); const uword subview_n_cols = in_col2 - in_col1 + 1; const uword base_col1 = aux_col1 + in_col1; return subview(m, aux_row1, base_col1, n_rows, subview_n_cols); } //! creation of subview (submatrix) template inline subview subview::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols), "subview::submat(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; const uword subview_n_cols = in_col2 - in_col1 + 1; const uword base_row1 = aux_row1 + in_row1; const uword base_col1 = aux_col1 + in_col1; return subview(m, base_row1, base_col1, subview_n_rows, subview_n_cols); } //! creation of subview (generic submatrix) template inline const subview subview::submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols), "subview::submat(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; const uword subview_n_cols = in_col2 - in_col1 + 1; const uword base_row1 = aux_row1 + in_row1; const uword base_col1 = aux_col1 + in_col1; return subview(m, base_row1, base_col1, subview_n_rows, subview_n_cols); } //! creation of subview (submatrix) template inline subview subview::submat(const span& row_span, const span& col_span) { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const bool col_all = col_span.whole; const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "subview::submat(): indices out of bounds or incorrectly used" ); const uword base_row1 = aux_row1 + in_row1; const uword base_col1 = aux_col1 + in_col1; return subview(m, base_row1, base_col1, submat_n_rows, submat_n_cols); } //! creation of subview (generic submatrix) template inline const subview subview::submat(const span& row_span, const span& col_span) const { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const bool col_all = col_span.whole; const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "subview::submat(): indices out of bounds or incorrectly used" ); const uword base_row1 = aux_row1 + in_row1; const uword base_col1 = aux_col1 + in_col1; return subview(m, base_row1, base_col1, submat_n_rows, submat_n_cols); } template inline subview subview::operator()(const span& row_span, const span& col_span) { arma_extra_debug_sigprint(); return (*this).submat(row_span, col_span); } template inline const subview subview::operator()(const span& row_span, const span& col_span) const { arma_extra_debug_sigprint(); return (*this).submat(row_span, col_span); } template inline subview_each1< subview, 0 > subview::each_col() { arma_extra_debug_sigprint(); return subview_each1< subview, 0 >(*this); } template inline subview_each1< subview, 1 > subview::each_row() { arma_extra_debug_sigprint(); return subview_each1< subview, 1 >(*this); } template template inline subview_each2< subview, 0, T1 > subview::each_col(const Base& indices) { arma_extra_debug_sigprint(); return subview_each2< subview, 0, T1 >(*this, indices); } template template inline subview_each2< subview, 1, T1 > subview::each_row(const Base& indices) { arma_extra_debug_sigprint(); return subview_each2< subview, 1, T1 >(*this, indices); } //! apply a lambda function to each column, where each column is interpreted as a column vector template inline void subview::each_col(const std::function< void(Col&) >& F) { arma_extra_debug_sigprint(); for(uword ii=0; ii < n_cols; ++ii) { Col tmp(colptr(ii), n_rows, false, true); F(tmp); } } template inline void subview::each_col(const std::function< void(const Col&) >& F) const { arma_extra_debug_sigprint(); for(uword ii=0; ii < n_cols; ++ii) { const Col tmp(colptr(ii), n_rows, false, true); F(tmp); } } //! apply a lambda function to each row, where each row is interpreted as a row vector template inline void subview::each_row(const std::function< void(Row&) >& F) { arma_extra_debug_sigprint(); podarray array1(n_cols); podarray array2(n_cols); Row tmp1( array1.memptr(), n_cols, false, true ); Row tmp2( array2.memptr(), n_cols, false, true ); eT* tmp1_mem = tmp1.memptr(); eT* tmp2_mem = tmp2.memptr(); uword ii, jj; for(ii=0, jj=1; jj < n_rows; ii+=2, jj+=2) { for(uword col_id = 0; col_id < n_cols; ++col_id) { const eT* col_mem = colptr(col_id); tmp1_mem[col_id] = col_mem[ii]; tmp2_mem[col_id] = col_mem[jj]; } F(tmp1); F(tmp2); for(uword col_id = 0; col_id < n_cols; ++col_id) { eT* col_mem = colptr(col_id); col_mem[ii] = tmp1_mem[col_id]; col_mem[jj] = tmp2_mem[col_id]; } } if(ii < n_rows) { tmp1 = (*this).row(ii); F(tmp1); (*this).row(ii) = tmp1; } } template inline void subview::each_row(const std::function< void(const Row&) >& F) const { arma_extra_debug_sigprint(); podarray array1(n_cols); podarray array2(n_cols); Row tmp1( array1.memptr(), n_cols, false, true ); Row tmp2( array2.memptr(), n_cols, false, true ); eT* tmp1_mem = tmp1.memptr(); eT* tmp2_mem = tmp2.memptr(); uword ii, jj; for(ii=0, jj=1; jj < n_rows; ii+=2, jj+=2) { for(uword col_id = 0; col_id < n_cols; ++col_id) { const eT* col_mem = colptr(col_id); tmp1_mem[col_id] = col_mem[ii]; tmp2_mem[col_id] = col_mem[jj]; } F(tmp1); F(tmp2); } if(ii < n_rows) { tmp1 = (*this).row(ii); F(tmp1); } } //! creation of diagview (diagonal) template inline diagview subview::diag(const sword in_id) { arma_extra_debug_sigprint(); const uword row_offset = (in_id < 0) ? uword(-in_id) : 0; const uword col_offset = (in_id > 0) ? uword( in_id) : 0; arma_debug_check_bounds ( ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)), "subview::diag(): requested diagonal out of bounds" ); const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset); const uword base_row_offset = aux_row1 + row_offset; const uword base_col_offset = aux_col1 + col_offset; return diagview(m, base_row_offset, base_col_offset, len); } //! creation of diagview (diagonal) template inline const diagview subview::diag(const sword in_id) const { arma_extra_debug_sigprint(); const uword row_offset = uword( (in_id < 0) ? -in_id : 0 ); const uword col_offset = uword( (in_id > 0) ? in_id : 0 ); arma_debug_check_bounds ( ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)), "subview::diag(): requested diagonal out of bounds" ); const uword len = (std::min)(n_rows - row_offset, n_cols - col_offset); const uword base_row_offset = aux_row1 + row_offset; const uword base_col_offset = aux_col1 + col_offset; return diagview(m, base_row_offset, base_col_offset, len); } template inline void subview::swap_rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 >= n_rows) || (in_row2 >= n_rows), "subview::swap_rows(): out of bounds" ); eT* mem = (const_cast< Mat& >(m)).memptr(); if(n_elem > 0) { const uword m_n_rows = m.n_rows; for(uword ucol=0; ucol < n_cols; ++ucol) { const uword offset = (aux_col1 + ucol) * m_n_rows; const uword pos1 = aux_row1 + in_row1 + offset; const uword pos2 = aux_row1 + in_row2 + offset; std::swap( access::rw(mem[pos1]), access::rw(mem[pos2]) ); } } } template inline void subview::swap_cols(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_col1 >= n_cols) || (in_col2 >= n_cols), "subview::swap_cols(): out of bounds" ); if(n_elem > 0) { eT* ptr1 = colptr(in_col1); eT* ptr2 = colptr(in_col2); for(uword urow=0; urow < n_rows; ++urow) { std::swap( ptr1[urow], ptr2[urow] ); } } } template inline typename subview::iterator subview::begin() { return iterator(*this, aux_row1, aux_col1); } template inline typename subview::const_iterator subview::begin() const { return const_iterator(*this, aux_row1, aux_col1); } template inline typename subview::const_iterator subview::cbegin() const { return const_iterator(*this, aux_row1, aux_col1); } template inline typename subview::iterator subview::end() { return iterator(*this, aux_row1, aux_col1 + n_cols); } template inline typename subview::const_iterator subview::end() const { return const_iterator(*this, aux_row1, aux_col1 + n_cols); } template inline typename subview::const_iterator subview::cend() const { return const_iterator(*this, aux_row1, aux_col1 + n_cols); } // // // template inline subview::iterator::iterator() : M (nullptr) , current_ptr(nullptr) , current_row(0 ) , current_col(0 ) , aux_row1 (0 ) , aux_row2_p1(0 ) { arma_extra_debug_sigprint(); // Technically this iterator is invalid (it does not point to a valid element) } template inline subview::iterator::iterator(const iterator& X) : M (X.M ) , current_ptr(X.current_ptr) , current_row(X.current_row) , current_col(X.current_col) , aux_row1 (X.aux_row1 ) , aux_row2_p1(X.aux_row2_p1) { arma_extra_debug_sigprint(); } template inline subview::iterator::iterator(subview& in_sv, const uword in_row, const uword in_col) : M (&(const_cast< Mat& >(in_sv.m))) , current_ptr(&(M->at(in_row,in_col)) ) , current_row(in_row ) , current_col(in_col ) , aux_row1 (in_sv.aux_row1 ) , aux_row2_p1(in_sv.aux_row1 + in_sv.n_rows ) { arma_extra_debug_sigprint(); } template inline arma_warn_unused eT& subview::iterator::operator*() { return (*current_ptr); } template inline typename subview::iterator& subview::iterator::operator++() { current_row++; if(current_row == aux_row2_p1) { current_row = aux_row1; current_col++; current_ptr = &( (*M).at(current_row,current_col) ); } else { current_ptr++; } return *this; } template inline arma_warn_unused typename subview::iterator subview::iterator::operator++(int) { typename subview::iterator temp(*this); ++(*this); return temp; } template inline arma_warn_unused bool subview::iterator::operator==(const iterator& rhs) const { return (current_ptr == rhs.current_ptr); } template inline arma_warn_unused bool subview::iterator::operator!=(const iterator& rhs) const { return (current_ptr != rhs.current_ptr); } template inline arma_warn_unused bool subview::iterator::operator==(const const_iterator& rhs) const { return (current_ptr == rhs.current_ptr); } template inline arma_warn_unused bool subview::iterator::operator!=(const const_iterator& rhs) const { return (current_ptr != rhs.current_ptr); } // // // template inline subview::const_iterator::const_iterator() : M (nullptr) , current_ptr(nullptr) , current_row(0 ) , current_col(0 ) , aux_row1 (0 ) , aux_row2_p1(0 ) { arma_extra_debug_sigprint(); // Technically this iterator is invalid (it does not point to a valid element) } template inline subview::const_iterator::const_iterator(const iterator& X) : M (X.M ) , current_ptr(X.current_ptr) , current_row(X.current_row) , current_col(X.current_col) , aux_row1 (X.aux_row1 ) , aux_row2_p1(X.aux_row2_p1) { arma_extra_debug_sigprint(); } template inline subview::const_iterator::const_iterator(const const_iterator& X) : M (X.M ) , current_ptr(X.current_ptr) , current_row(X.current_row) , current_col(X.current_col) , aux_row1 (X.aux_row1 ) , aux_row2_p1(X.aux_row2_p1) { arma_extra_debug_sigprint(); } template inline subview::const_iterator::const_iterator(const subview& in_sv, const uword in_row, const uword in_col) : M (&(in_sv.m) ) , current_ptr(&(M->at(in_row,in_col)) ) , current_row(in_row ) , current_col(in_col ) , aux_row1 (in_sv.aux_row1 ) , aux_row2_p1(in_sv.aux_row1 + in_sv.n_rows) { arma_extra_debug_sigprint(); } template inline arma_warn_unused const eT& subview::const_iterator::operator*() { return (*current_ptr); } template inline typename subview::const_iterator& subview::const_iterator::operator++() { current_row++; if(current_row == aux_row2_p1) { current_row = aux_row1; current_col++; current_ptr = &( (*M).at(current_row,current_col) ); } else { current_ptr++; } return *this; } template inline arma_warn_unused typename subview::const_iterator subview::const_iterator::operator++(int) { typename subview::const_iterator temp(*this); ++(*this); return temp; } template inline arma_warn_unused bool subview::const_iterator::operator==(const iterator& rhs) const { return (current_ptr == rhs.current_ptr); } template inline arma_warn_unused bool subview::const_iterator::operator!=(const iterator& rhs) const { return (current_ptr != rhs.current_ptr); } template inline arma_warn_unused bool subview::const_iterator::operator==(const const_iterator& rhs) const { return (current_ptr == rhs.current_ptr); } template inline arma_warn_unused bool subview::const_iterator::operator!=(const const_iterator& rhs) const { return (current_ptr != rhs.current_ptr); } // // // template inline subview::row_iterator::row_iterator() : M (nullptr) , current_row(0 ) , current_col(0 ) , aux_col1 (0 ) , aux_col2_p1(0 ) { arma_extra_debug_sigprint(); // Technically this iterator is invalid (it does not point to a valid element) } template inline subview::row_iterator::row_iterator(const row_iterator& X) : M (X.M ) , current_row(X.current_row) , current_col(X.current_col) , aux_col1 (X.aux_col1 ) , aux_col2_p1(X.aux_col2_p1) { arma_extra_debug_sigprint(); } template inline subview::row_iterator::row_iterator(subview& in_sv, const uword in_row, const uword in_col) : M (&(const_cast< Mat& >(in_sv.m))) , current_row(in_row ) , current_col(in_col ) , aux_col1 (in_sv.aux_col1 ) , aux_col2_p1(in_sv.aux_col1 + in_sv.n_cols ) { arma_extra_debug_sigprint(); } template inline arma_warn_unused eT& subview::row_iterator::operator*() { return M->at(current_row,current_col); } template inline typename subview::row_iterator& subview::row_iterator::operator++() { current_col++; if(current_col == aux_col2_p1) { current_col = aux_col1; current_row++; } return *this; } template inline arma_warn_unused typename subview::row_iterator subview::row_iterator::operator++(int) { typename subview::row_iterator temp(*this); ++(*this); return temp; } template inline arma_warn_unused bool subview::row_iterator::operator==(const row_iterator& rhs) const { return ( (current_row == rhs.current_row) && (current_col == rhs.current_col) ); } template inline arma_warn_unused bool subview::row_iterator::operator!=(const row_iterator& rhs) const { return ( (current_row != rhs.current_row) || (current_col != rhs.current_col) ); } template inline arma_warn_unused bool subview::row_iterator::operator==(const const_row_iterator& rhs) const { return ( (current_row == rhs.current_row) && (current_col == rhs.current_col) ); } template inline arma_warn_unused bool subview::row_iterator::operator!=(const const_row_iterator& rhs) const { return ( (current_row != rhs.current_row) || (current_col != rhs.current_col) ); } // // // template inline subview::const_row_iterator::const_row_iterator() : M (nullptr) , current_row(0 ) , current_col(0 ) , aux_col1 (0 ) , aux_col2_p1(0 ) { arma_extra_debug_sigprint(); // Technically this iterator is invalid (it does not point to a valid element) } template inline subview::const_row_iterator::const_row_iterator(const row_iterator& X) : M (X.M ) , current_row(X.current_row) , current_col(X.current_col) , aux_col1 (X.aux_col1 ) , aux_col2_p1(X.aux_col2_p1) { arma_extra_debug_sigprint(); } template inline subview::const_row_iterator::const_row_iterator(const const_row_iterator& X) : M (X.M ) , current_row(X.current_row) , current_col(X.current_col) , aux_col1 (X.aux_col1 ) , aux_col2_p1(X.aux_col2_p1) { arma_extra_debug_sigprint(); } template inline subview::const_row_iterator::const_row_iterator(const subview& in_sv, const uword in_row, const uword in_col) : M (&(in_sv.m) ) , current_row(in_row ) , current_col(in_col ) , aux_col1 (in_sv.aux_col1 ) , aux_col2_p1(in_sv.aux_col1 + in_sv.n_cols) { arma_extra_debug_sigprint(); } template inline arma_warn_unused const eT& subview::const_row_iterator::operator*() const { return M->at(current_row,current_col); } template inline typename subview::const_row_iterator& subview::const_row_iterator::operator++() { current_col++; if(current_col == aux_col2_p1) { current_col = aux_col1; current_row++; } return *this; } template inline arma_warn_unused typename subview::const_row_iterator subview::const_row_iterator::operator++(int) { typename subview::const_row_iterator temp(*this); ++(*this); return temp; } template inline arma_warn_unused bool subview::const_row_iterator::operator==(const row_iterator& rhs) const { return ( (current_row == rhs.current_row) && (current_col == rhs.current_col) ); } template inline arma_warn_unused bool subview::const_row_iterator::operator!=(const row_iterator& rhs) const { return ( (current_row != rhs.current_row) || (current_col != rhs.current_col) ); } template inline arma_warn_unused bool subview::const_row_iterator::operator==(const const_row_iterator& rhs) const { return ( (current_row == rhs.current_row) && (current_col == rhs.current_col) ); } template inline arma_warn_unused bool subview::const_row_iterator::operator!=(const const_row_iterator& rhs) const { return ( (current_row != rhs.current_row) || (current_col != rhs.current_col) ); } // // // template inline subview_col::subview_col(const Mat& in_m, const uword in_col) : subview(in_m, 0, in_col, in_m.n_rows, 1) , colmem(subview::colptr(0)) { arma_extra_debug_sigprint(); } template inline subview_col::subview_col(const Mat& in_m, const uword in_col, const uword in_row1, const uword in_n_rows) : subview(in_m, in_row1, in_col, in_n_rows, 1) , colmem(subview::colptr(0)) { arma_extra_debug_sigprint(); } template inline subview_col::subview_col(const subview_col& in) : subview(in) // interprets 'subview_col' as 'subview' , colmem(in.colmem) { arma_extra_debug_sigprint(); } template inline subview_col::subview_col(subview_col&& in) : subview(std::move(in)) // interprets 'subview_col' as 'subview' , colmem(in.colmem) { arma_extra_debug_sigprint(); access::rw(in.colmem) = nullptr; } template inline void subview_col::operator=(const subview& X) { arma_extra_debug_sigprint(); subview::operator=(X); } template inline void subview_col::operator=(const subview_col& X) { arma_extra_debug_sigprint(); subview::operator=(X); // interprets 'subview_col' as 'subview' } template inline void subview_col::operator=(const std::initializer_list& list) { arma_extra_debug_sigprint(); const uword N = uword(list.size()); arma_debug_assert_same_size(subview::n_rows, subview::n_cols, N, 1, "copy into submatrix"); arrayops::copy( access::rwp(colmem), list.begin(), N ); } template inline void subview_col::operator=(const eT val) { arma_extra_debug_sigprint(); if(subview::n_elem != 1) { arma_debug_assert_same_size(subview::n_rows, subview::n_cols, 1, 1, "copy into submatrix"); } access::rw( colmem[0] ) = val; } template template inline void subview_col::operator=(const Base& X) { arma_extra_debug_sigprint(); subview::operator=(X); } template template inline void subview_col::operator=(const SpBase& X) { arma_extra_debug_sigprint(); subview::operator=(X.get_ref()); } template template inline typename enable_if2< is_same_type::value, void>::result subview_col::operator= (const Gen& in) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(subview::n_rows, uword(1), in.n_rows, (in.is_col ? uword(1) : in.n_cols), "copy into submatrix"); in.apply(*this); } template arma_inline arma_warn_unused const Op,op_htrans> subview_col::t() const { return Op,op_htrans>(*this); } template arma_inline arma_warn_unused const Op,op_htrans> subview_col::ht() const { return Op,op_htrans>(*this); } template arma_inline arma_warn_unused const Op,op_strans> subview_col::st() const { return Op,op_strans>(*this); } template arma_inline arma_warn_unused const Op,op_strans> subview_col::as_row() const { return Op,op_strans>(*this); } template inline void subview_col::fill(const eT val) { arma_extra_debug_sigprint(); arrayops::inplace_set( access::rwp(colmem), val, subview::n_rows ); } template inline void subview_col::zeros() { arma_extra_debug_sigprint(); arrayops::fill_zeros( access::rwp(colmem), subview::n_rows ); } template inline void subview_col::ones() { arma_extra_debug_sigprint(); arrayops::inplace_set( access::rwp(colmem), eT(1), subview::n_rows ); } template arma_inline eT subview_col::at_alt(const uword ii) const { const eT* colmem_aligned = colmem; memory::mark_as_aligned(colmem_aligned); return colmem_aligned[ii]; } template arma_inline eT& subview_col::operator[](const uword ii) { return access::rw( colmem[ii] ); } template arma_inline eT subview_col::operator[](const uword ii) const { return colmem[ii]; } template inline eT& subview_col::operator()(const uword ii) { arma_debug_check_bounds( (ii >= subview::n_elem), "subview::operator(): index out of bounds" ); return access::rw( colmem[ii] ); } template inline eT subview_col::operator()(const uword ii) const { arma_debug_check_bounds( (ii >= subview::n_elem), "subview::operator(): index out of bounds" ); return colmem[ii]; } template inline eT& subview_col::operator()(const uword in_row, const uword in_col) { arma_debug_check_bounds( ((in_row >= subview::n_rows) || (in_col > 0)), "subview::operator(): index out of bounds" ); return access::rw( colmem[in_row] ); } template inline eT subview_col::operator()(const uword in_row, const uword in_col) const { arma_debug_check_bounds( ((in_row >= subview::n_rows) || (in_col > 0)), "subview::operator(): index out of bounds" ); return colmem[in_row]; } template inline eT& subview_col::at(const uword in_row, const uword) { return access::rw( colmem[in_row] ); } template inline eT subview_col::at(const uword in_row, const uword) const { return colmem[in_row]; } template arma_inline eT* subview_col::colptr(const uword) { return const_cast(colmem); } template arma_inline const eT* subview_col::colptr(const uword) const { return colmem; } template inline subview_col subview_col::rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check_bounds( ( (in_row1 > in_row2) || (in_row2 >= subview::n_rows) ), "subview_col::rows(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; const uword base_row1 = this->aux_row1 + in_row1; return subview_col(this->m, this->aux_col1, base_row1, subview_n_rows); } template inline const subview_col subview_col::rows(const uword in_row1, const uword in_row2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( ( (in_row1 > in_row2) || (in_row2 >= subview::n_rows) ), "subview_col::rows(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; const uword base_row1 = this->aux_row1 + in_row1; return subview_col(this->m, this->aux_col1, base_row1, subview_n_rows); } template inline subview_col subview_col::subvec(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check_bounds( ( (in_row1 > in_row2) || (in_row2 >= subview::n_rows) ), "subview_col::subvec(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; const uword base_row1 = this->aux_row1 + in_row1; return subview_col(this->m, this->aux_col1, base_row1, subview_n_rows); } template inline const subview_col subview_col::subvec(const uword in_row1, const uword in_row2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( ( (in_row1 > in_row2) || (in_row2 >= subview::n_rows) ), "subview_col::subvec(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; const uword base_row1 = this->aux_row1 + in_row1; return subview_col(this->m, this->aux_col1, base_row1, subview_n_rows); } template inline subview_col subview_col::subvec(const uword start_row, const SizeMat& s) { arma_extra_debug_sigprint(); arma_debug_check( (s.n_cols != 1), "subview_col::subvec(): given size does not specify a column vector" ); arma_debug_check_bounds( ( (start_row >= subview::n_rows) || ((start_row + s.n_rows) > subview::n_rows) ), "subview_col::subvec(): size out of bounds" ); const uword base_row1 = this->aux_row1 + start_row; return subview_col(this->m, this->aux_col1, base_row1, s.n_rows); } template inline const subview_col subview_col::subvec(const uword start_row, const SizeMat& s) const { arma_extra_debug_sigprint(); arma_debug_check( (s.n_cols != 1), "subview_col::subvec(): given size does not specify a column vector" ); arma_debug_check_bounds( ( (start_row >= subview::n_rows) || ((start_row + s.n_rows) > subview::n_rows) ), "subview_col::subvec(): size out of bounds" ); const uword base_row1 = this->aux_row1 + start_row; return subview_col(this->m, this->aux_col1, base_row1, s.n_rows); } template inline subview_col subview_col::head(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > subview::n_rows), "subview_col::head(): size out of bounds" ); return subview_col(this->m, this->aux_col1, this->aux_row1, N); } template inline const subview_col subview_col::head(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > subview::n_rows), "subview_col::head(): size out of bounds" ); return subview_col(this->m, this->aux_col1, this->aux_row1, N); } template inline subview_col subview_col::tail(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > subview::n_rows), "subview_col::tail(): size out of bounds" ); const uword start_row = subview::aux_row1 + subview::n_rows - N; return subview_col(this->m, this->aux_col1, start_row, N); } template inline const subview_col subview_col::tail(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > subview::n_rows), "subview_col::tail(): size out of bounds" ); const uword start_row = subview::aux_row1 + subview::n_rows - N; return subview_col(this->m, this->aux_col1, start_row, N); } template inline arma_warn_unused eT subview_col::min() const { arma_extra_debug_sigprint(); if(subview::n_elem == 0) { arma_debug_check(true, "min(): object has no elements"); return Datum::nan; } return op_min::direct_min(colmem, subview::n_elem); } template inline arma_warn_unused eT subview_col::max() const { arma_extra_debug_sigprint(); if(subview::n_elem == 0) { arma_debug_check(true, "max(): object has no elements"); return Datum::nan; } return op_max::direct_max(colmem, subview::n_elem); } template inline eT subview_col::min(uword& index_of_min_val) const { arma_extra_debug_sigprint(); if(subview::n_elem == 0) { arma_debug_check(true, "min(): object has no elements"); index_of_min_val = uword(0); return Datum::nan; } else { return op_min::direct_min(colmem, subview::n_elem, index_of_min_val); } } template inline eT subview_col::max(uword& index_of_max_val) const { arma_extra_debug_sigprint(); if(subview::n_elem == 0) { arma_debug_check(true, "max(): object has no elements"); index_of_max_val = uword(0); return Datum::nan; } else { return op_max::direct_max(colmem, subview::n_elem, index_of_max_val); } } template inline arma_warn_unused uword subview_col::index_min() const { arma_extra_debug_sigprint(); uword index = 0; if(subview::n_elem == 0) { arma_debug_check(true, "index_min(): object has no elements"); } else { op_min::direct_min(colmem, subview::n_elem, index); } return index; } template inline arma_warn_unused uword subview_col::index_max() const { arma_extra_debug_sigprint(); uword index = 0; if(subview::n_elem == 0) { arma_debug_check(true, "index_max(): object has no elements"); } else { op_max::direct_max(colmem, subview::n_elem, index); } return index; } // // // template inline subview_cols::subview_cols(const Mat& in_m, const uword in_col1, const uword in_n_cols) : subview(in_m, 0, in_col1, in_m.n_rows, in_n_cols) { arma_extra_debug_sigprint(); } template inline subview_cols::subview_cols(const subview_cols& in) : subview(in) // interprets 'subview_cols' as 'subview' { arma_extra_debug_sigprint(); } template inline subview_cols::subview_cols(subview_cols&& in) : subview(std::move(in)) // interprets 'subview_cols' as 'subview' { arma_extra_debug_sigprint(); } template inline void subview_cols::operator=(const subview& X) { arma_extra_debug_sigprint(); subview::operator=(X); } template inline void subview_cols::operator=(const subview_cols& X) { arma_extra_debug_sigprint(); subview::operator=(X); // interprets 'subview_cols' as 'subview' } template inline void subview_cols::operator=(const std::initializer_list& list) { arma_extra_debug_sigprint(); subview::operator=(list); } template inline void subview_cols::operator=(const std::initializer_list< std::initializer_list >& list) { arma_extra_debug_sigprint(); subview::operator=(list); } template inline void subview_cols::operator=(const eT val) { arma_extra_debug_sigprint(); subview::operator=(val); } template template inline void subview_cols::operator=(const Base& X) { arma_extra_debug_sigprint(); subview::operator=(X.get_ref()); } template template inline void subview_cols::operator=(const SpBase& X) { arma_extra_debug_sigprint(); subview::operator=(X.get_ref()); } template template inline typename enable_if2< is_same_type::value, void>::result subview_cols::operator= (const Gen& in) { arma_extra_debug_sigprint(); subview::operator=(in); } template arma_inline arma_warn_unused const Op,op_htrans> subview_cols::t() const { return Op,op_htrans>(*this); } template arma_inline arma_warn_unused const Op,op_htrans> subview_cols::ht() const { return Op,op_htrans>(*this); } template arma_inline arma_warn_unused const Op,op_strans> subview_cols::st() const { return Op,op_strans>(*this); } template arma_inline arma_warn_unused const Op,op_vectorise_col> subview_cols::as_col() const { return Op,op_vectorise_col>(*this); } template inline arma_warn_unused eT subview_cols::at_alt(const uword ii) const { return operator[](ii); } template inline arma_warn_unused eT& subview_cols::operator[](const uword ii) { const uword index = subview::aux_col1 * subview::m.n_rows + ii; return access::rw( (const_cast< Mat& >(subview::m)).mem[index] ); } template inline arma_warn_unused eT subview_cols::operator[](const uword ii) const { const uword index = subview::aux_col1 * subview::m.n_rows + ii; return subview::m.mem[index]; } template inline arma_warn_unused eT& subview_cols::operator()(const uword ii) { arma_debug_check_bounds( (ii >= subview::n_elem), "subview::operator(): index out of bounds" ); const uword index = subview::aux_col1 * subview::m.n_rows + ii; return access::rw( (const_cast< Mat& >(subview::m)).mem[index] ); } template inline arma_warn_unused eT subview_cols::operator()(const uword ii) const { arma_debug_check_bounds( (ii >= subview::n_elem), "subview::operator(): index out of bounds" ); const uword index = subview::aux_col1 * subview::m.n_rows + ii; return subview::m.mem[index]; } template inline arma_warn_unused eT& subview_cols::operator()(const uword in_row, const uword in_col) { arma_debug_check_bounds( ((in_row >= subview::n_rows) || (in_col >= subview::n_cols)), "subview::operator(): index out of bounds" ); const uword index = (in_col + subview::aux_col1) * subview::m.n_rows + in_row; return access::rw( (const_cast< Mat& >(subview::m)).mem[index] ); } template inline arma_warn_unused eT subview_cols::operator()(const uword in_row, const uword in_col) const { arma_debug_check_bounds( ((in_row >= subview::n_rows) || (in_col >= subview::n_cols)), "subview::operator(): index out of bounds" ); const uword index = (in_col + subview::aux_col1) * subview::m.n_rows + in_row; return subview::m.mem[index]; } template inline arma_warn_unused eT& subview_cols::at(const uword in_row, const uword in_col) { const uword index = (in_col + subview::aux_col1) * subview::m.n_rows + in_row; return access::rw( (const_cast< Mat& >(subview::m)).mem[index] ); } template inline arma_warn_unused eT subview_cols::at(const uword in_row, const uword in_col) const { const uword index = (in_col + subview::aux_col1) * subview::m.n_rows + in_row; return subview::m.mem[index]; } template arma_inline eT* subview_cols::colptr(const uword in_col) { return & access::rw((const_cast< Mat& >(subview::m)).mem[ (in_col + subview::aux_col1) * subview::m.n_rows ]); } template arma_inline const eT* subview_cols::colptr(const uword in_col) const { return & subview::m.mem[ (in_col + subview::aux_col1) * subview::m.n_rows ]; } // // // template inline subview_row::subview_row(const Mat& in_m, const uword in_row) : subview(in_m, in_row, 0, 1, in_m.n_cols) { arma_extra_debug_sigprint(); } template inline subview_row::subview_row(const Mat& in_m, const uword in_row, const uword in_col1, const uword in_n_cols) : subview(in_m, in_row, in_col1, 1, in_n_cols) { arma_extra_debug_sigprint(); } template inline subview_row::subview_row(const subview_row& in) : subview(in) // interprets 'subview_row' as 'subview' { arma_extra_debug_sigprint(); } template inline subview_row::subview_row(subview_row&& in) : subview(std::move(in)) // interprets 'subview_row' as 'subview' { arma_extra_debug_sigprint(); } template inline void subview_row::operator=(const subview& X) { arma_extra_debug_sigprint(); subview::operator=(X); } template inline void subview_row::operator=(const subview_row& X) { arma_extra_debug_sigprint(); subview::operator=(X); // interprets 'subview_row' as 'subview' } template inline void subview_row::operator=(const eT val) { arma_extra_debug_sigprint(); subview::operator=(val); // interprets 'subview_row' as 'subview' } template inline void subview_row::operator=(const std::initializer_list& list) { arma_extra_debug_sigprint(); const uword N = uword(list.size()); arma_debug_assert_same_size(subview::n_rows, subview::n_cols, 1, N, "copy into submatrix"); auto it = list.begin(); for(uword ii=0; ii < N; ++ii) { (*this).operator[](ii) = (*it); ++it; } } template template inline void subview_row::operator=(const Base& X) { arma_extra_debug_sigprint(); subview::operator=(X); } template template inline void subview_row::operator=(const SpBase& X) { arma_extra_debug_sigprint(); subview::operator=(X.get_ref()); } template template inline typename enable_if2< is_same_type::value, void>::result subview_row::operator= (const Gen& in) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(uword(1), subview::n_cols, (in.is_row ? uword(1) : in.n_rows), in.n_cols, "copy into submatrix"); in.apply(*this); } template arma_inline arma_warn_unused const Op,op_htrans> subview_row::t() const { return Op,op_htrans>(*this); } template arma_inline arma_warn_unused const Op,op_htrans> subview_row::ht() const { return Op,op_htrans>(*this); } template arma_inline arma_warn_unused const Op,op_strans> subview_row::st() const { return Op,op_strans>(*this); } template arma_inline arma_warn_unused const Op,op_strans> subview_row::as_col() const { return Op,op_strans>(*this); } template inline eT subview_row::at_alt(const uword ii) const { const uword index = (ii + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); return subview::m.mem[index]; } template inline eT& subview_row::operator[](const uword ii) { const uword index = (ii + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); return access::rw( (const_cast< Mat& >(subview::m)).mem[index] ); } template inline eT subview_row::operator[](const uword ii) const { const uword index = (ii + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); return subview::m.mem[index]; } template inline eT& subview_row::operator()(const uword ii) { arma_debug_check_bounds( (ii >= subview::n_elem), "subview::operator(): index out of bounds" ); const uword index = (ii + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); return access::rw( (const_cast< Mat& >(subview::m)).mem[index] ); } template inline eT subview_row::operator()(const uword ii) const { arma_debug_check_bounds( (ii >= subview::n_elem), "subview::operator(): index out of bounds" ); const uword index = (ii + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); return subview::m.mem[index]; } template inline eT& subview_row::operator()(const uword in_row, const uword in_col) { arma_debug_check_bounds( ((in_row > 0) || (in_col >= subview::n_cols)), "subview::operator(): index out of bounds" ); const uword index = (in_col + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); return access::rw( (const_cast< Mat& >(subview::m)).mem[index] ); } template inline eT subview_row::operator()(const uword in_row, const uword in_col) const { arma_debug_check_bounds( ((in_row > 0) || (in_col >= subview::n_cols)), "subview::operator(): index out of bounds" ); const uword index = (in_col + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); return subview::m.mem[index]; } template inline eT& subview_row::at(const uword, const uword in_col) { const uword index = (in_col + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); return access::rw( (const_cast< Mat& >(subview::m)).mem[index] ); } template inline eT subview_row::at(const uword, const uword in_col) const { const uword index = (in_col + (subview::aux_col1))*(subview::m).n_rows + (subview::aux_row1); return subview::m.mem[index]; } template inline subview_row subview_row::cols(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds( ( (in_col1 > in_col2) || (in_col2 >= subview::n_cols) ), "subview_row::cols(): indices out of bounds or incorrectly used" ); const uword subview_n_cols = in_col2 - in_col1 + 1; const uword base_col1 = this->aux_col1 + in_col1; return subview_row(this->m, this->aux_row1, base_col1, subview_n_cols); } template inline const subview_row subview_row::cols(const uword in_col1, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( ( (in_col1 > in_col2) || (in_col2 >= subview::n_cols) ), "subview_row::cols(): indices out of bounds or incorrectly used" ); const uword subview_n_cols = in_col2 - in_col1 + 1; const uword base_col1 = this->aux_col1 + in_col1; return subview_row(this->m, this->aux_row1, base_col1, subview_n_cols); } template inline subview_row subview_row::subvec(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds( ( (in_col1 > in_col2) || (in_col2 >= subview::n_cols) ), "subview_row::subvec(): indices out of bounds or incorrectly used" ); const uword subview_n_cols = in_col2 - in_col1 + 1; const uword base_col1 = this->aux_col1 + in_col1; return subview_row(this->m, this->aux_row1, base_col1, subview_n_cols); } template inline const subview_row subview_row::subvec(const uword in_col1, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( ( (in_col1 > in_col2) || (in_col2 >= subview::n_cols) ), "subview_row::subvec(): indices out of bounds or incorrectly used" ); const uword subview_n_cols = in_col2 - in_col1 + 1; const uword base_col1 = this->aux_col1 + in_col1; return subview_row(this->m, this->aux_row1, base_col1, subview_n_cols); } template inline subview_row subview_row::subvec(const uword start_col, const SizeMat& s) { arma_extra_debug_sigprint(); arma_debug_check( (s.n_rows != 1), "subview_row::subvec(): given size does not specify a row vector" ); arma_debug_check_bounds( ( (start_col >= subview::n_cols) || ((start_col + s.n_cols) > subview::n_cols) ), "subview_row::subvec(): size out of bounds" ); const uword base_col1 = this->aux_col1 + start_col; return subview_row(this->m, this->aux_row1, base_col1, s.n_cols); } template inline const subview_row subview_row::subvec(const uword start_col, const SizeMat& s) const { arma_extra_debug_sigprint(); arma_debug_check( (s.n_rows != 1), "subview_row::subvec(): given size does not specify a row vector" ); arma_debug_check_bounds( ( (start_col >= subview::n_cols) || ((start_col + s.n_cols) > subview::n_cols) ), "subview_row::subvec(): size out of bounds" ); const uword base_col1 = this->aux_col1 + start_col; return subview_row(this->m, this->aux_row1, base_col1, s.n_cols); } template inline subview_row subview_row::head(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > subview::n_cols), "subview_row::head(): size out of bounds" ); return subview_row(this->m, this->aux_row1, this->aux_col1, N); } template inline const subview_row subview_row::head(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > subview::n_cols), "subview_row::head(): size out of bounds" ); return subview_row(this->m, this->aux_row1, this->aux_col1, N); } template inline subview_row subview_row::tail(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > subview::n_cols), "subview_row::tail(): size out of bounds" ); const uword start_col = subview::aux_col1 + subview::n_cols - N; return subview_row(this->m, this->aux_row1, start_col, N); } template inline const subview_row subview_row::tail(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > subview::n_cols), "subview_row::tail(): size out of bounds" ); const uword start_col = subview::aux_col1 + subview::n_cols - N; return subview_row(this->m, this->aux_row1, start_col, N); } template inline arma_warn_unused uword subview_row::index_min() const { const Proxy< subview_row > P(*this); uword index = 0; if(P.get_n_elem() == 0) { arma_debug_check(true, "index_min(): object has no elements"); } else { op_min::min_with_index(P, index); } return index; } template inline arma_warn_unused uword subview_row::index_max() const { const Proxy< subview_row > P(*this); uword index = 0; if(P.get_n_elem() == 0) { arma_debug_check(true, "index_max(): object has no elements"); } else { op_max::max_with_index(P, index); } return index; } template inline typename subview::row_iterator subview_row::begin() { return typename subview::row_iterator(*this, subview::aux_row1, subview::aux_col1); } template inline typename subview::const_row_iterator subview_row::begin() const { return typename subview::const_row_iterator(*this, subview::aux_row1, subview::aux_col1); } template inline typename subview::const_row_iterator subview_row::cbegin() const { return typename subview::const_row_iterator(*this, subview::aux_row1, subview::aux_col1); } template inline typename subview::row_iterator subview_row::end() { return typename subview::row_iterator(*this, subview::aux_row1 + subview::n_rows, subview::aux_col1); } template inline typename subview::const_row_iterator subview_row::end() const { return typename subview::const_row_iterator(*this, subview::aux_row1 + subview::n_rows, subview::aux_col1); } template inline typename subview::const_row_iterator subview_row::cend() const { return typename subview::const_row_iterator(*this, subview::aux_row1 + subview::n_rows, subview::aux_col1); } // // // template inline subview_row_strans::subview_row_strans(const subview_row& in_sv_row) : sv_row(in_sv_row ) , n_rows(in_sv_row.n_cols) , n_elem(in_sv_row.n_elem) { arma_extra_debug_sigprint(); } template inline void subview_row_strans::extract(Mat& out) const { arma_extra_debug_sigprint(); // NOTE: this function assumes that matrix 'out' has already been set to the correct size const Mat& X = sv_row.m; eT* out_mem = out.memptr(); const uword row = sv_row.aux_row1; const uword start_col = sv_row.aux_col1; const uword sv_row_n_cols = sv_row.n_cols; uword ii,jj; for(ii=0, jj=1; jj < sv_row_n_cols; ii+=2, jj+=2) { const eT tmp1 = X.at(row, start_col+ii); const eT tmp2 = X.at(row, start_col+jj); out_mem[ii] = tmp1; out_mem[jj] = tmp2; } if(ii < sv_row_n_cols) { out_mem[ii] = X.at(row, start_col+ii); } } template inline eT subview_row_strans::at_alt(const uword ii) const { return sv_row[ii]; } template inline eT subview_row_strans::operator[](const uword ii) const { return sv_row[ii]; } template inline eT subview_row_strans::operator()(const uword ii) const { return sv_row(ii); } template inline eT subview_row_strans::operator()(const uword in_row, const uword in_col) const { return sv_row(in_col, in_row); // deliberately swapped } template inline eT subview_row_strans::at(const uword in_row, const uword) const { return sv_row.at(0, in_row); // deliberately swapped } // // // template inline subview_row_htrans::subview_row_htrans(const subview_row& in_sv_row) : sv_row(in_sv_row ) , n_rows(in_sv_row.n_cols) , n_elem(in_sv_row.n_elem) { arma_extra_debug_sigprint(); } template inline void subview_row_htrans::extract(Mat& out) const { arma_extra_debug_sigprint(); // NOTE: this function assumes that matrix 'out' has already been set to the correct size const Mat& X = sv_row.m; eT* out_mem = out.memptr(); const uword row = sv_row.aux_row1; const uword start_col = sv_row.aux_col1; const uword sv_row_n_cols = sv_row.n_cols; for(uword ii=0; ii < sv_row_n_cols; ++ii) { out_mem[ii] = access::alt_conj( X.at(row, start_col+ii) ); } } template inline eT subview_row_htrans::at_alt(const uword ii) const { return access::alt_conj( sv_row[ii] ); } template inline eT subview_row_htrans::operator[](const uword ii) const { return access::alt_conj( sv_row[ii] ); } template inline eT subview_row_htrans::operator()(const uword ii) const { return access::alt_conj( sv_row(ii) ); } template inline eT subview_row_htrans::operator()(const uword in_row, const uword in_col) const { return access::alt_conj( sv_row(in_col, in_row) ); // deliberately swapped } template inline eT subview_row_htrans::at(const uword in_row, const uword) const { return access::alt_conj( sv_row.at(0, in_row) ); // deliberately swapped } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_schur.hpp0000644000176200001440000000502314124060717022712 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_schur //! @{ template inline bool schur ( Mat& S, const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; Mat U; const bool status = auxlib::schur(U, S, X.get_ref(), false); if(status == false) { S.soft_reset(); arma_debug_warn_level(3, "schur(): decomposition failed"); } return status; } template arma_warn_unused inline Mat schur ( const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; Mat S; Mat U; const bool status = auxlib::schur(U, S, X.get_ref(), false); if(status == false) { S.soft_reset(); arma_stop_runtime_error("schur(): decomposition failed"); } return S; } template inline bool schur ( Mat& U, Mat& S, const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); arma_debug_check( void_ptr(&U) == void_ptr(&S), "schur(): 'U' is an alias of 'S'" ); const bool status = auxlib::schur(U, S, X.get_ref(), true); if(status == false) { U.soft_reset(); S.soft_reset(); arma_debug_warn_level(3, "schur(): decomposition failed"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/xvec_htrans_meat.hpp0000644000176200001440000000415514124060717024442 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup xvec_htrans //! @{ template inline xvec_htrans::xvec_htrans(const eT* const in_mem, const uword in_n_rows, const uword in_n_cols) : mem (in_mem ) , n_rows(in_n_cols ) // deliberately swapped , n_cols(in_n_rows ) , n_elem(in_n_rows*in_n_cols) { arma_extra_debug_sigprint(); } template inline void xvec_htrans::extract(Mat& out) const { arma_extra_debug_sigprint(); // NOTE: this function assumes that matrix 'out' has already been set to the correct size const eT* in_mem = mem; eT* out_mem = out.memptr(); const uword N = n_elem; for(uword ii=0; ii < N; ++ii) { out_mem[ii] = access::alt_conj( in_mem[ii] ); } } template inline eT xvec_htrans::operator[](const uword ii) const { return access::alt_conj( mem[ii] ); } template inline eT xvec_htrans::at_alt(const uword ii) const { return access::alt_conj( mem[ii] ); } template inline eT xvec_htrans::at(const uword in_row, const uword in_col) const { //return (n_rows == 1) ? access::alt_conj( mem[in_col] ) : access::alt_conj( mem[in_row] ); return access::alt_conj( mem[in_row + in_col] ); // either in_row or in_col must be zero, as we're storing a vector } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_intersect_bones.hpp0000644000176200001440000000274414124060717025314 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_intersect //! @{ class glue_intersect { public: template struct traits { static constexpr bool is_row = (T1::is_row && T2::is_row); static constexpr bool is_col = (T1::is_col || T2::is_col); static constexpr bool is_xvec = false; }; template inline static void apply(Mat& out, const Glue& X); template inline static void apply(Mat& out, uvec& iA, uvec& iB, const Base& A_expr, const Base& B_expr, const bool calc_indx); }; //! @} RcppArmadillo/inst/include/armadillo_bits/spop_reverse_bones.hpp0000644000176200001440000000240014124060717025001 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_reverse //! @{ class spop_reverse : public traits_op_passthru { public: template inline static void apply_spmat(SpMat& out, const SpMat& X, const uword dim); template inline static void apply_proxy(SpMat& out, const T1& X, const uword dim); template inline static void apply(SpMat& out, const SpOp& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_sum_bones.hpp0000644000176200001440000000405214124060717023574 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_sum //! @{ class op_sum : public traits_op_xvec { public: // dense matrices template arma_hot inline static void apply(Mat& out, const Op& in); template arma_hot inline static void apply_noalias(Mat& out, const Proxy& P, const uword dim); template arma_hot inline static void apply_noalias_unwrap(Mat& out, const Proxy& P, const uword dim); template arma_hot inline static void apply_noalias_proxy(Mat& out, const Proxy& P, const uword dim); // cubes template arma_hot inline static void apply(Cube& out, const OpCube& in); template arma_hot inline static void apply_noalias(Cube& out, const ProxyCube& P, const uword dim); template arma_hot inline static void apply_noalias_unwrap(Cube& out, const ProxyCube& P, const uword dim); template arma_hot inline static void apply_noalias_proxy(Cube& out, const ProxyCube& P, const uword dim); }; //! @} RcppArmadillo/inst/include/armadillo_bits/arrayops_bones.hpp0000644000176200001440000001436614124060717024143 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup arrayops //! @{ class arrayops { public: template arma_inline static void copy(eT* dest, const eT* src, const uword n_elem); template arma_cold inline static void copy_small(eT* dest, const eT* src, const uword n_elem); template inline static void fill_zeros(eT* dest, const uword n_elem); template arma_hot inline static void replace(eT* mem, const uword n_elem, const eT old_val, const eT new_val); template arma_hot inline static void clean(eT* mem, const uword n_elem, const eT abs_limit, const typename arma_not_cx::result* junk = nullptr); template arma_hot inline static void clean(std::complex* mem, const uword n_elem, const T abs_limit); template inline static void clamp(eT* mem, const uword n_elem, const eT min_val, const eT max_val, const typename arma_not_cx::result* junk = nullptr); template inline static void clamp(std::complex* mem, const uword n_elem, const std::complex& min_val, const std::complex& max_val); // // array = convert(array) template arma_inline static void convert_cx_scalar(out_eT& out, const in_eT& in, const typename arma_not_cx::result* junk1 = nullptr, const typename arma_not_cx< in_eT>::result* junk2 = nullptr); template arma_inline static void convert_cx_scalar(out_eT& out, const std::complex& in, const typename arma_not_cx::result* junk = nullptr); template arma_inline static void convert_cx_scalar(std::complex& out, const std::complex< in_T>& in); template arma_hot inline static void convert(out_eT* dest, const in_eT* src, const uword n_elem); template arma_hot inline static void convert_cx(out_eT* dest, const in_eT* src, const uword n_elem); // // array op= array template arma_hot inline static void inplace_plus(eT* dest, const eT* src, const uword n_elem); template arma_hot inline static void inplace_minus(eT* dest, const eT* src, const uword n_elem); template arma_hot inline static void inplace_mul(eT* dest, const eT* src, const uword n_elem); template arma_hot inline static void inplace_div(eT* dest, const eT* src, const uword n_elem); template arma_hot inline static void inplace_plus_base(eT* dest, const eT* src, const uword n_elem); template arma_hot inline static void inplace_minus_base(eT* dest, const eT* src, const uword n_elem); template arma_hot inline static void inplace_mul_base(eT* dest, const eT* src, const uword n_elem); template arma_hot inline static void inplace_div_base(eT* dest, const eT* src, const uword n_elem); // // array op= scalar template arma_hot inline static void inplace_set(eT* dest, const eT val, const uword n_elem); template arma_hot inline static void inplace_set_simple(eT* dest, const eT val, const uword n_elem); template arma_hot inline static void inplace_set_base(eT* dest, const eT val, const uword n_elem); template arma_cold inline static void inplace_set_small(eT* dest, const eT val, const uword n_elem); template arma_hot inline static void inplace_set_fixed(eT* dest, const eT val); template arma_hot inline static void inplace_plus(eT* dest, const eT val, const uword n_elem); template arma_hot inline static void inplace_minus(eT* dest, const eT val, const uword n_elem); template arma_hot inline static void inplace_mul(eT* dest, const eT val, const uword n_elem); template arma_hot inline static void inplace_div(eT* dest, const eT val, const uword n_elem); template arma_hot inline static void inplace_plus_base(eT* dest, const eT val, const uword n_elem); template arma_hot inline static void inplace_minus_base(eT* dest, const eT val, const uword n_elem); template arma_hot inline static void inplace_mul_base(eT* dest, const eT val, const uword n_elem); template arma_hot inline static void inplace_div_base(eT* dest, const eT val, const uword n_elem); // // scalar = op(array) template arma_hot inline static eT accumulate(const eT* src, const uword n_elem); template arma_hot inline static eT product(const eT* src, const uword n_elem); template arma_hot inline static bool is_zero(const eT* mem, const uword n_elem, const eT abs_limit, const typename arma_not_cx::result* junk = nullptr); template arma_hot inline static bool is_zero(const std::complex* mem, const uword n_elem, const T abs_limit); template arma_hot inline static bool is_finite(const eT* src, const uword n_elem); template arma_hot inline static bool has_inf(const eT* src, const uword n_elem); template arma_hot inline static bool has_nan(const eT* src, const uword n_elem); }; //! @} RcppArmadillo/inst/include/armadillo_bits/spop_htrans_meat.hpp0000644000176200001440000000311014124060717024444 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_htrans //! @{ template inline void spop_htrans::apply(SpMat& out, const SpOp& in, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); spop_strans::apply(out, in); } template inline void spop_htrans::apply(SpMat& out, const SpOp& in, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; spop_strans::apply(out, in); const uword N = out.n_nonzero; for(uword i=0; i inline static void apply(Mat& out, const Op& X); template inline static void apply(Mat& out, const Proxy& P); template inline static void apply(Mat& out, const Op< Glue, op_diagmat>& X); template inline static void apply_times(Mat& out, const T1& X, const T2& Y, const typename arma_not_cx::result* junk = nullptr); template inline static void apply_times(Mat& out, const T1& X, const T2& Y, const typename arma_cx_only::result* junk = nullptr); }; class op_diagmat2 : public traits_op_default { public: template inline static void apply(Mat& out, const Op& X); template inline static void apply(Mat& out, const Proxy& P, const uword row_offset, const uword col_offset); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_fft.hpp0000644000176200001440000000567414124060717022361 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_fft //! @{ // 1D FFT & 1D IFFT template arma_warn_unused inline typename enable_if2 < (is_arma_type::value && is_real::value), const mtOp, T1, op_fft_real> >::result fft(const T1& A) { arma_extra_debug_sigprint(); return mtOp, T1, op_fft_real>(A, uword(0), uword(1)); } template arma_warn_unused inline typename enable_if2 < (is_arma_type::value && is_real::value), const mtOp, T1, op_fft_real> >::result fft(const T1& A, const uword N) { arma_extra_debug_sigprint(); return mtOp, T1, op_fft_real>(A, N, uword(0)); } template arma_warn_unused inline typename enable_if2 < (is_arma_type::value && (is_cx_float::yes || is_cx_double::yes)), const Op >::result fft(const T1& A) { arma_extra_debug_sigprint(); return Op(A, uword(0), uword(1)); } template arma_warn_unused inline typename enable_if2 < (is_arma_type::value && (is_cx_float::yes || is_cx_double::yes)), const Op >::result fft(const T1& A, const uword N) { arma_extra_debug_sigprint(); return Op(A, N, uword(0)); } template arma_warn_unused inline typename enable_if2 < (is_arma_type::value && (is_cx_float::yes || is_cx_double::yes)), const Op >::result ifft(const T1& A) { arma_extra_debug_sigprint(); return Op(A, uword(0), uword(1)); } template arma_warn_unused inline typename enable_if2 < (is_arma_type::value && (is_cx_float::yes || is_cx_double::yes)), const Op >::result ifft(const T1& A, const uword N) { arma_extra_debug_sigprint(); return Op(A, N, uword(0)); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_clamp_meat.hpp0000644000176200001440000003377414124060717023721 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_clamp //! @{ template inline void op_clamp::apply(Mat& out, const mtOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const eT min_val = in.aux; const eT max_val = in.aux_out_eT; arma_debug_check( (min_val > max_val), "clamp(): min_val must be less than max_val" ); if(is_Mat::value) { const unwrap U(in.m); op_clamp::apply_direct(out, U.M, min_val, max_val); } else { const Proxy P(in.m); if(P.is_alias(out)) { Mat tmp; op_clamp::apply_proxy_noalias(tmp, P, min_val, max_val); out.steal_mem(tmp); } else { op_clamp::apply_proxy_noalias(out, P, min_val, max_val); } } } template inline void op_clamp::apply_direct(Mat& out, const Mat& X, const eT min_val, const eT max_val) { arma_extra_debug_sigprint(); if(&out != &X) { out.set_size(X.n_rows, X.n_cols); const uword N = out.n_elem; const eT* X_mem = X.memptr(); eT* out_mem = out.memptr(); for(uword i=0; i max_val) ? max_val : val); } } else { arma_extra_debug_print("op_clamp::apply_direct(): inplace operation"); arrayops::clamp(out.memptr(), out.n_elem, min_val, max_val); } } template inline void op_clamp::apply_proxy_noalias(Mat& out, const Proxy& P, const typename T1::elem_type min_val, const typename T1::elem_type max_val) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); out.set_size(n_rows, n_cols); eT* out_mem = out.memptr(); if(Proxy::use_at == false) { const uword N = P.get_n_elem(); typename Proxy::ea_type A = P.get_ea(); for(uword i=0; i max_val) ? max_val : val); } } else { for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { const eT val = P.at(row,col); (*out_mem) = (val < min_val) ? min_val : ((val > max_val) ? max_val : val); out_mem++; } } } // template inline void op_clamp::apply(Cube& out, const mtOpCube& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const eT min_val = in.aux; const eT max_val = in.aux_out_eT; arma_debug_check( (min_val > max_val), "clamp(): min_val must be less than max_val" ); if(is_Cube::value) { const unwrap_cube U(in.m); op_clamp::apply_direct(out, U.M, min_val, max_val); } else { const ProxyCube P(in.m); if(P.is_alias(out)) { Cube tmp; op_clamp::apply_proxy_noalias(tmp, P, min_val, max_val); out.steal_mem(tmp); } else { op_clamp::apply_proxy_noalias(out, P, min_val, max_val); } } } template inline void op_clamp::apply_direct(Cube& out, const Cube& X, const eT min_val, const eT max_val) { arma_extra_debug_sigprint(); if(&out != &X) { out.set_size(X.n_rows, X.n_cols, X.n_slices); const uword N = out.n_elem; const eT* X_mem = X.memptr(); eT* out_mem = out.memptr(); for(uword i=0; i max_val) ? max_val : val); } } else { arma_extra_debug_print("op_clamp::apply_direct(): inplace operation"); arrayops::clamp(out.memptr(), out.n_elem, min_val, max_val); } } template inline void op_clamp::apply_proxy_noalias(Cube& out, const ProxyCube& P, const typename T1::elem_type min_val, const typename T1::elem_type max_val) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_slices = P.get_n_slices(); out.set_size(n_rows, n_cols, n_slices); eT* out_mem = out.memptr(); if(ProxyCube::use_at == false) { const uword N = P.get_n_elem(); typename ProxyCube::ea_type A = P.get_ea(); for(uword i=0; i max_val) ? max_val : val); } } else { for(uword s=0; s < n_slices; ++s) for(uword c=0; c < n_cols; ++c) for(uword r=0; r < n_rows; ++r) { const eT val = P.at(r,c,s); (*out_mem) = (val < min_val) ? min_val : ((val > max_val) ? max_val : val); out_mem++; } } } // template inline void op_clamp_cx::apply(Mat& out, const mtOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(is_Mat::value) { const unwrap U(in.m); op_clamp_cx::apply_direct(out, U.M, in.aux, in.aux_out_eT); } else { const Proxy P(in.m); if(P.is_alias(out)) { Mat tmp; op_clamp_cx::apply_proxy_noalias(tmp, P, in.aux, in.aux_out_eT); out.steal_mem(tmp); } else { op_clamp_cx::apply_proxy_noalias(out, P, in.aux, in.aux_out_eT); } } } template inline void op_clamp_cx::apply_direct(Mat& out, const Mat& X, const eT min_val, const eT max_val) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const T min_val_real = std::real(min_val); const T min_val_imag = std::imag(min_val); const T max_val_real = std::real(max_val); const T max_val_imag = std::imag(max_val); arma_debug_check( (min_val_real > max_val_real), "clamp(): real(min_val) must be less than real(max_val)" ); arma_debug_check( (min_val_imag > max_val_imag), "clamp(): imag(min_val) must be less than imag(max_val)" ); if(&out != &X) { out.set_size(X.n_rows, X.n_cols); const uword N = out.n_elem; const eT* X_mem = X.memptr(); eT* out_mem = out.memptr(); for(uword i=0; i max_val_real) ? max_val_real : val_real); val_imag = (val_imag < min_val_imag) ? min_val_imag : ((val_imag > max_val_imag) ? max_val_imag : val_imag); out_mem[i] = std::complex(val_real,val_imag); } } else { arma_extra_debug_print("op_clamp_cx::apply_direct(): inplace operation"); arrayops::clamp(out.memptr(), out.n_elem, min_val, max_val); } } template inline void op_clamp_cx::apply_proxy_noalias(Mat& out, const Proxy& P, const typename T1::elem_type min_val, const typename T1::elem_type max_val) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const T min_val_real = std::real(min_val); const T min_val_imag = std::imag(min_val); const T max_val_real = std::real(max_val); const T max_val_imag = std::imag(max_val); arma_debug_check( (min_val_real > max_val_real), "clamp(): real(min_val) must be less than real(max_val)" ); arma_debug_check( (min_val_imag > max_val_imag), "clamp(): imag(min_val) must be less than imag(max_val)" ); const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); out.set_size(n_rows, n_cols); eT* out_mem = out.memptr(); if(Proxy::use_at == false) { const uword N = P.get_n_elem(); typename Proxy::ea_type A = P.get_ea(); for(uword i=0; i max_val_real) ? max_val_real : val_real); val_imag = (val_imag < min_val_imag) ? min_val_imag : ((val_imag > max_val_imag) ? max_val_imag : val_imag); out_mem[i] = std::complex(val_real,val_imag); } } else { for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { const eT val = P.at(row,col); T val_real = std::real(val); T val_imag = std::imag(val); val_real = (val_real < min_val_real) ? min_val_real : ((val_real > max_val_real) ? max_val_real : val_real); val_imag = (val_imag < min_val_imag) ? min_val_imag : ((val_imag > max_val_imag) ? max_val_imag : val_imag); (*out_mem) = std::complex(val_real,val_imag); out_mem++; } } } // template inline void op_clamp_cx::apply(Cube& out, const mtOpCube& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(is_Cube::value) { const unwrap_cube U(in.m); op_clamp_cx::apply_direct(out, U.M, in.aux, in.aux_out_eT); } else { const ProxyCube P(in.m); if(P.is_alias(out)) { Cube tmp; op_clamp_cx::apply_proxy_noalias(tmp, P, in.aux, in.aux_out_eT); out.steal_mem(tmp); } else { op_clamp_cx::apply_proxy_noalias(out, P, in.aux, in.aux_out_eT); } } } template inline void op_clamp_cx::apply_direct(Cube& out, const Cube& X, const eT min_val, const eT max_val) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const T min_val_real = std::real(min_val); const T min_val_imag = std::imag(min_val); const T max_val_real = std::real(max_val); const T max_val_imag = std::imag(max_val); arma_debug_check( (min_val_real > max_val_real), "clamp(): real(min_val) must be less than real(max_val)" ); arma_debug_check( (min_val_imag > max_val_imag), "clamp(): imag(min_val) must be less than imag(max_val)" ); if(&out != &X) { out.set_size(X.n_rows, X.n_cols, X.n_slices); const uword N = out.n_elem; const eT* X_mem = X.memptr(); eT* out_mem = out.memptr(); for(uword i=0; i max_val_real) ? max_val_real : val_real); val_imag = (val_imag < min_val_imag) ? min_val_imag : ((val_imag > max_val_imag) ? max_val_imag : val_imag); out_mem[i] = std::complex(val_real,val_imag); } } else { arma_extra_debug_print("op_clamp_cx::apply_direct(): inplace operation"); arrayops::clamp(out.memptr(), out.n_elem, min_val, max_val); } } template inline void op_clamp_cx::apply_proxy_noalias(Cube& out, const ProxyCube& P, const typename T1::elem_type min_val, const typename T1::elem_type max_val) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const T min_val_real = std::real(min_val); const T min_val_imag = std::imag(min_val); const T max_val_real = std::real(max_val); const T max_val_imag = std::imag(max_val); arma_debug_check( (min_val_real > max_val_real), "clamp(): real(min_val) must be less than real(max_val)" ); arma_debug_check( (min_val_imag > max_val_imag), "clamp(): imag(min_val) must be less than imag(max_val)" ); const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_slices = P.get_n_slices(); out.set_size(n_rows, n_cols, n_slices); eT* out_mem = out.memptr(); if(ProxyCube::use_at == false) { const uword N = P.get_n_elem(); typename ProxyCube::ea_type A = P.get_ea(); for(uword i=0; i max_val_real) ? max_val_real : val_real); val_imag = (val_imag < min_val_imag) ? min_val_imag : ((val_imag > max_val_imag) ? max_val_imag : val_imag); out_mem[i] = std::complex(val_real,val_imag); } } else { for(uword s=0; s < n_slices; ++s) for(uword c=0; c < n_cols; ++c) for(uword r=0; r < n_rows; ++r) { const eT val = P.at(r,c,s); T val_real = std::real(val); T val_imag = std::imag(val); val_real = (val_real < min_val_real) ? min_val_real : ((val_real > max_val_real) ? max_val_real : val_real); val_imag = (val_imag < min_val_imag) ? min_val_imag : ((val_imag > max_val_imag) ? max_val_imag : val_imag); (*out_mem) = std::complex(val_real,val_imag); out_mem++; } } } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_cor_bones.hpp0000644000176200001440000000236714124060717024100 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_cor //! @{ class glue_cor { public: template struct traits { static constexpr bool is_row = false; // T1::is_col; // TODO: check static constexpr bool is_col = false; // T2::is_col; // TODO: check static constexpr bool is_xvec = false; }; template inline static void apply(Mat& out, const Glue& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/gmm_full_meat.hpp0000644000176200001440000020551714164333462023731 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup gmm_full //! @{ namespace gmm_priv { template inline gmm_full::~gmm_full() { arma_extra_debug_sigprint_this(this); arma_type_check(( (is_same_type::value == false) && (is_same_type::value == false) )); } template inline gmm_full::gmm_full() { arma_extra_debug_sigprint_this(this); } template inline gmm_full::gmm_full(const gmm_full& x) { arma_extra_debug_sigprint_this(this); init(x); } template inline gmm_full& gmm_full::operator=(const gmm_full& x) { arma_extra_debug_sigprint(); init(x); return *this; } template inline gmm_full::gmm_full(const gmm_diag& x) { arma_extra_debug_sigprint_this(this); init(x); } template inline gmm_full& gmm_full::operator=(const gmm_diag& x) { arma_extra_debug_sigprint(); init(x); return *this; } template inline gmm_full::gmm_full(const uword in_n_dims, const uword in_n_gaus) { arma_extra_debug_sigprint_this(this); init(in_n_dims, in_n_gaus); } template inline void gmm_full::reset() { arma_extra_debug_sigprint(); init(0, 0); } template inline void gmm_full::reset(const uword in_n_dims, const uword in_n_gaus) { arma_extra_debug_sigprint(); init(in_n_dims, in_n_gaus); } template template inline void gmm_full::set_params(const Base& in_means_expr, const BaseCube& in_fcovs_expr, const Base& in_hefts_expr) { arma_extra_debug_sigprint(); const unwrap tmp1(in_means_expr.get_ref()); const unwrap_cube tmp2(in_fcovs_expr.get_ref()); const unwrap tmp3(in_hefts_expr.get_ref()); const Mat & in_means = tmp1.M; const Cube& in_fcovs = tmp2.M; const Mat & in_hefts = tmp3.M; arma_debug_check ( (in_means.n_cols != in_fcovs.n_slices) || (in_means.n_rows != in_fcovs.n_rows) || (in_fcovs.n_rows != in_fcovs.n_cols) || (in_hefts.n_cols != in_means.n_cols) || (in_hefts.n_rows != 1), "gmm_full::set_params(): given parameters have inconsistent and/or wrong sizes" ); arma_debug_check( (in_means.is_finite() == false), "gmm_full::set_params(): given means have non-finite values" ); arma_debug_check( (in_fcovs.is_finite() == false), "gmm_full::set_params(): given fcovs have non-finite values" ); arma_debug_check( (in_hefts.is_finite() == false), "gmm_full::set_params(): given hefts have non-finite values" ); for(uword g=0; g < in_fcovs.n_slices; ++g) { arma_debug_check( (any(diagvec(in_fcovs.slice(g)) <= eT(0))), "gmm_full::set_params(): given fcovs have negative or zero values on diagonals" ); } arma_debug_check( (any(vectorise(in_hefts) < eT(0))), "gmm_full::set_params(): given hefts have negative values" ); const eT s = accu(in_hefts); arma_debug_check( ((s < (eT(1) - eT(0.001))) || (s > (eT(1) + eT(0.001)))), "gmm_full::set_params(): sum of given hefts is not 1" ); access::rw(means) = in_means; access::rw(fcovs) = in_fcovs; access::rw(hefts) = in_hefts; init_constants(); } template template inline void gmm_full::set_means(const Base& in_means_expr) { arma_extra_debug_sigprint(); const unwrap tmp(in_means_expr.get_ref()); const Mat& in_means = tmp.M; arma_debug_check( (arma::size(in_means) != arma::size(means)), "gmm_full::set_means(): given means have incompatible size" ); arma_debug_check( (in_means.is_finite() == false), "gmm_full::set_means(): given means have non-finite values" ); access::rw(means) = in_means; } template template inline void gmm_full::set_fcovs(const BaseCube& in_fcovs_expr) { arma_extra_debug_sigprint(); const unwrap_cube tmp(in_fcovs_expr.get_ref()); const Cube& in_fcovs = tmp.M; arma_debug_check( (arma::size(in_fcovs) != arma::size(fcovs)), "gmm_full::set_fcovs(): given fcovs have incompatible size" ); arma_debug_check( (in_fcovs.is_finite() == false), "gmm_full::set_fcovs(): given fcovs have non-finite values" ); for(uword i=0; i < in_fcovs.n_slices; ++i) { arma_debug_check( (any(diagvec(in_fcovs.slice(i)) <= eT(0))), "gmm_full::set_fcovs(): given fcovs have negative or zero values on diagonals" ); } access::rw(fcovs) = in_fcovs; init_constants(); } template template inline void gmm_full::set_hefts(const Base& in_hefts_expr) { arma_extra_debug_sigprint(); const unwrap tmp(in_hefts_expr.get_ref()); const Mat& in_hefts = tmp.M; arma_debug_check( (arma::size(in_hefts) != arma::size(hefts)), "gmm_full::set_hefts(): given hefts have incompatible size" ); arma_debug_check( (in_hefts.is_finite() == false), "gmm_full::set_hefts(): given hefts have non-finite values" ); arma_debug_check( (any(vectorise(in_hefts) < eT(0))), "gmm_full::set_hefts(): given hefts have negative values" ); const eT s = accu(in_hefts); arma_debug_check( ((s < (eT(1) - eT(0.001))) || (s > (eT(1) + eT(0.001)))), "gmm_full::set_hefts(): sum of given hefts is not 1" ); // make sure all hefts are positive and non-zero const eT* in_hefts_mem = in_hefts.memptr(); eT* hefts_mem = access::rw(hefts).memptr(); for(uword i=0; i < hefts.n_elem; ++i) { hefts_mem[i] = (std::max)( in_hefts_mem[i], std::numeric_limits::min() ); } access::rw(hefts) /= accu(hefts); log_hefts = log(hefts); } template inline uword gmm_full::n_dims() const { return means.n_rows; } template inline uword gmm_full::n_gaus() const { return means.n_cols; } template inline bool gmm_full::load(const std::string name) { arma_extra_debug_sigprint(); field< Mat > storage; bool status = storage.load(name, arma_binary); if( (status == false) || (storage.n_elem < 2) ) { reset(); arma_debug_warn_level(3, "gmm_full::load(): problem with loading or incompatible format"); return false; } uword count = 0; const Mat& storage_means = storage(count); ++count; const Mat& storage_hefts = storage(count); ++count; const uword N_dims = storage_means.n_rows; const uword N_gaus = storage_means.n_cols; if( (storage.n_elem != (N_gaus + 2)) || (storage_hefts.n_rows != 1) || (storage_hefts.n_cols != N_gaus) ) { reset(); arma_debug_warn_level(3, "gmm_full::load(): incompatible format"); return false; } reset(N_dims, N_gaus); access::rw(means) = storage_means; access::rw(hefts) = storage_hefts; for(uword g=0; g < N_gaus; ++g) { const Mat& storage_fcov = storage(count); ++count; if( (storage_fcov.n_rows != N_dims) || (storage_fcov.n_cols != N_dims) ) { reset(); arma_debug_warn_level(3, "gmm_full::load(): incompatible format"); return false; } access::rw(fcovs).slice(g) = storage_fcov; } init_constants(); return true; } template inline bool gmm_full::save(const std::string name) const { arma_extra_debug_sigprint(); const uword N_gaus = means.n_cols; field< Mat > storage(2 + N_gaus); uword count = 0; storage(count) = means; ++count; storage(count) = hefts; ++count; for(uword g=0; g < N_gaus; ++g) { storage(count) = fcovs.slice(g); ++count; } const bool status = storage.save(name, arma_binary); return status; } template inline Col gmm_full::generate() const { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; Col out( (N_gaus > 0) ? N_dims : uword(0), arma_nozeros_indicator() ); Col tmp( (N_gaus > 0) ? N_dims : uword(0), fill::randn ); if(N_gaus > 0) { const double val = randu(); double csum = double(0); uword gaus_id = 0; for(uword j=0; j < N_gaus; ++j) { csum += hefts[j]; if(val <= csum) { gaus_id = j; break; } } out = chol_fcovs.slice(gaus_id) * tmp; out += means.col(gaus_id); } return out; } template inline Mat gmm_full::generate(const uword N_vec) const { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; Mat out( ( (N_gaus > 0) ? N_dims : uword(0) ), N_vec, arma_nozeros_indicator() ); Mat tmp( ( (N_gaus > 0) ? N_dims : uword(0) ), N_vec, fill::randn ); if(N_gaus > 0) { const eT* hefts_mem = hefts.memptr(); for(uword i=0; i < N_vec; ++i) { const double val = randu(); double csum = double(0); uword gaus_id = 0; for(uword j=0; j < N_gaus; ++j) { csum += hefts_mem[j]; if(val <= csum) { gaus_id = j; break; } } Col out_vec(out.colptr(i), N_dims, false, true); Col tmp_vec(tmp.colptr(i), N_dims, false, true); out_vec = chol_fcovs.slice(gaus_id) * tmp_vec; out_vec += means.col(gaus_id); } } return out; } template template inline eT gmm_full::log_p(const T1& expr, const gmm_empty_arg& junk1, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == true))>::result* junk2) const { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); const uword N_dims = means.n_rows; const quasi_unwrap U(expr); arma_debug_check( (U.M.n_rows != N_dims), "gmm_full::log_p(): incompatible dimensions" ); return internal_scalar_log_p( U.M.memptr() ); } template template inline eT gmm_full::log_p(const T1& expr, const uword gaus_id, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == true))>::result* junk2) const { arma_extra_debug_sigprint(); arma_ignore(junk2); const uword N_dims = means.n_rows; const quasi_unwrap U(expr); arma_debug_check( (U.M.n_rows != N_dims), "gmm_full::log_p(): incompatible dimensions" ); arma_debug_check( (gaus_id >= means.n_cols), "gmm_full::log_p(): specified gaussian is out of range" ); return internal_scalar_log_p( U.M.memptr(), gaus_id ); } template template inline Row gmm_full::log_p(const T1& expr, const gmm_empty_arg& junk1, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == false))>::result* junk2) const { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); const quasi_unwrap tmp(expr); const Mat& X = tmp.M; return internal_vec_log_p(X); } template template inline Row gmm_full::log_p(const T1& expr, const uword gaus_id, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == false))>::result* junk2) const { arma_extra_debug_sigprint(); arma_ignore(junk2); const quasi_unwrap tmp(expr); const Mat& X = tmp.M; return internal_vec_log_p(X, gaus_id); } template template inline eT gmm_full::sum_log_p(const Base& expr) const { arma_extra_debug_sigprint(); const quasi_unwrap tmp(expr.get_ref()); const Mat& X = tmp.M; return internal_sum_log_p(X); } template template inline eT gmm_full::sum_log_p(const Base& expr, const uword gaus_id) const { arma_extra_debug_sigprint(); const quasi_unwrap tmp(expr.get_ref()); const Mat& X = tmp.M; return internal_sum_log_p(X, gaus_id); } template template inline eT gmm_full::avg_log_p(const Base& expr) const { arma_extra_debug_sigprint(); const quasi_unwrap tmp(expr.get_ref()); const Mat& X = tmp.M; return internal_avg_log_p(X); } template template inline eT gmm_full::avg_log_p(const Base& expr, const uword gaus_id) const { arma_extra_debug_sigprint(); const quasi_unwrap tmp(expr.get_ref()); const Mat& X = tmp.M; return internal_avg_log_p(X, gaus_id); } template template inline uword gmm_full::assign(const T1& expr, const gmm_dist_mode& dist, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == true))>::result* junk) const { arma_extra_debug_sigprint(); arma_ignore(junk); const quasi_unwrap tmp(expr); const Mat& X = tmp.M; return internal_scalar_assign(X, dist); } template template inline urowvec gmm_full::assign(const T1& expr, const gmm_dist_mode& dist, typename enable_if<((is_arma_type::value) && (resolves_to_colvector::value == false))>::result* junk) const { arma_extra_debug_sigprint(); arma_ignore(junk); urowvec out; const quasi_unwrap tmp(expr); const Mat& X = tmp.M; internal_vec_assign(out, X, dist); return out; } template template inline urowvec gmm_full::raw_hist(const Base& expr, const gmm_dist_mode& dist_mode) const { arma_extra_debug_sigprint(); const unwrap tmp(expr.get_ref()); const Mat& X = tmp.M; arma_debug_check( (X.n_rows != means.n_rows), "gmm_full::raw_hist(): incompatible dimensions" ); arma_debug_check( ((dist_mode != eucl_dist) && (dist_mode != prob_dist)), "gmm_full::raw_hist(): unsupported distance mode" ); urowvec hist; internal_raw_hist(hist, X, dist_mode); return hist; } template template inline Row gmm_full::norm_hist(const Base& expr, const gmm_dist_mode& dist_mode) const { arma_extra_debug_sigprint(); const unwrap tmp(expr.get_ref()); const Mat& X = tmp.M; arma_debug_check( (X.n_rows != means.n_rows), "gmm_full::norm_hist(): incompatible dimensions" ); arma_debug_check( ((dist_mode != eucl_dist) && (dist_mode != prob_dist)), "gmm_full::norm_hist(): unsupported distance mode" ); urowvec hist; internal_raw_hist(hist, X, dist_mode); const uword hist_n_elem = hist.n_elem; const uword* hist_mem = hist.memptr(); eT acc = eT(0); for(uword i=0; i out(hist_n_elem, arma_nozeros_indicator()); eT* out_mem = out.memptr(); for(uword i=0; i template inline bool gmm_full::learn ( const Base& data, const uword N_gaus, const gmm_dist_mode& dist_mode, const gmm_seed_mode& seed_mode, const uword km_iter, const uword em_iter, const eT var_floor, const bool print_mode ) { arma_extra_debug_sigprint(); const bool dist_mode_ok = (dist_mode == eucl_dist) || (dist_mode == maha_dist); const bool seed_mode_ok = \ (seed_mode == keep_existing) || (seed_mode == static_subset) || (seed_mode == static_spread) || (seed_mode == random_subset) || (seed_mode == random_spread); arma_debug_check( (dist_mode_ok == false), "gmm_full::learn(): dist_mode must be eucl_dist or maha_dist" ); arma_debug_check( (seed_mode_ok == false), "gmm_full::learn(): unknown seed_mode" ); arma_debug_check( (var_floor < eT(0) ), "gmm_full::learn(): variance floor is negative" ); const unwrap tmp_X(data.get_ref()); const Mat& X = tmp_X.M; if(X.is_empty() ) { arma_debug_warn_level(3, "gmm_full::learn(): given matrix is empty" ); return false; } if(X.is_finite() == false) { arma_debug_warn_level(3, "gmm_full::learn(): given matrix has non-finite values"); return false; } if(N_gaus == 0) { reset(); return true; } if(dist_mode == maha_dist) { mah_aux = var(X,1,1); const uword mah_aux_n_elem = mah_aux.n_elem; eT* mah_aux_mem = mah_aux.memptr(); for(uword i=0; i < mah_aux_n_elem; ++i) { const eT val = mah_aux_mem[i]; mah_aux_mem[i] = ((val != eT(0)) && arma_isfinite(val)) ? eT(1) / val : eT(1); } } // copy current model, in case of failure by k-means and/or EM const gmm_full orig = (*this); // initial means if(seed_mode == keep_existing) { if(means.is_empty() ) { arma_debug_warn_level(3, "gmm_full::learn(): no existing means" ); return false; } if(X.n_rows != means.n_rows) { arma_debug_warn_level(3, "gmm_full::learn(): dimensionality mismatch"); return false; } // TODO: also check for number of vectors? } else { if(X.n_cols < N_gaus) { arma_debug_warn_level(3, "gmm_full::learn(): number of vectors is less than number of gaussians"); return false; } reset(X.n_rows, N_gaus); if(print_mode) { get_cout_stream() << "gmm_full::learn(): generating initial means\n"; get_cout_stream().flush(); } if(dist_mode == eucl_dist) { generate_initial_means<1>(X, seed_mode); } else if(dist_mode == maha_dist) { generate_initial_means<2>(X, seed_mode); } } // k-means if(km_iter > 0) { const arma_ostream_state stream_state(get_cout_stream()); bool status = false; if(dist_mode == eucl_dist) { status = km_iterate<1>(X, km_iter, print_mode); } else if(dist_mode == maha_dist) { status = km_iterate<2>(X, km_iter, print_mode); } stream_state.restore(get_cout_stream()); if(status == false) { arma_debug_warn_level(3, "gmm_full::learn(): k-means algorithm failed; not enough data, or too many gaussians requested"); init(orig); return false; } } // initial fcovs const eT var_floor_actual = (eT(var_floor) > eT(0)) ? eT(var_floor) : std::numeric_limits::min(); if(seed_mode != keep_existing) { if(print_mode) { get_cout_stream() << "gmm_full::learn(): generating initial covariances\n"; get_cout_stream().flush(); } if(dist_mode == eucl_dist) { generate_initial_params<1>(X, var_floor_actual); } else if(dist_mode == maha_dist) { generate_initial_params<2>(X, var_floor_actual); } } // EM algorithm if(em_iter > 0) { const arma_ostream_state stream_state(get_cout_stream()); const bool status = em_iterate(X, em_iter, var_floor_actual, print_mode); stream_state.restore(get_cout_stream()); if(status == false) { arma_debug_warn_level(3, "gmm_full::learn(): EM algorithm failed"); init(orig); return false; } } mah_aux.reset(); init_constants(); return true; } // // // template inline void gmm_full::init(const gmm_full& x) { arma_extra_debug_sigprint(); gmm_full& t = *this; if(&t != &x) { access::rw(t.means) = x.means; access::rw(t.fcovs) = x.fcovs; access::rw(t.hefts) = x.hefts; init_constants(); } } template inline void gmm_full::init(const gmm_diag& x) { arma_extra_debug_sigprint(); access::rw(hefts) = x.hefts; access::rw(means) = x.means; const uword N_dims = x.means.n_rows; const uword N_gaus = x.means.n_cols; access::rw(fcovs).zeros(N_dims,N_dims,N_gaus); for(uword g=0; g < N_gaus; ++g) { Mat& fcov = access::rw(fcovs).slice(g); const eT* dcov_mem = x.dcovs.colptr(g); for(uword d=0; d < N_dims; ++d) { fcov.at(d,d) = dcov_mem[d]; } } init_constants(); } template inline void gmm_full::init(const uword in_n_dims, const uword in_n_gaus) { arma_extra_debug_sigprint(); access::rw(means).zeros(in_n_dims, in_n_gaus); access::rw(fcovs).zeros(in_n_dims, in_n_dims, in_n_gaus); for(uword g=0; g < in_n_gaus; ++g) { access::rw(fcovs).slice(g).diag().ones(); } access::rw(hefts).set_size(in_n_gaus); access::rw(hefts).fill(eT(1) / eT(in_n_gaus)); init_constants(); } template inline void gmm_full::init_constants(const bool calc_chol) { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; const eT tmp = (eT(N_dims)/eT(2)) * std::log(Datum::tau); // inv_fcovs.copy_size(fcovs); log_det_etc.set_size(N_gaus); Mat tmp_inv; for(uword g=0; g < N_gaus; ++g) { const Mat& fcov = fcovs.slice(g); Mat& inv_fcov = inv_fcovs.slice(g); //const bool inv_ok = auxlib::inv(tmp_inv, fcov); const bool inv_ok = auxlib::inv_sympd(tmp_inv, fcov); eT log_det_val = eT(0); eT log_det_sign = eT(0); const bool log_det_status = log_det(log_det_val, log_det_sign, fcov); const bool log_det_ok = ( log_det_status && (arma_isfinite(log_det_val)) && (log_det_sign > eT(0)) ); if(inv_ok && log_det_ok) { inv_fcov = tmp_inv; } else { // last resort: treat the covariance matrix as diagonal inv_fcov.zeros(); log_det_val = eT(0); for(uword d=0; d < N_dims; ++d) { const eT sanitised_val = (std::max)( eT(fcov.at(d,d)), eT(std::numeric_limits::min()) ); inv_fcov.at(d,d) = eT(1) / sanitised_val; log_det_val += std::log(sanitised_val); } } log_det_etc[g] = eT(-1) * ( tmp + eT(0.5) * log_det_val ); } // eT* hefts_mem = access::rw(hefts).memptr(); for(uword g=0; g < N_gaus; ++g) { hefts_mem[g] = (std::max)( hefts_mem[g], std::numeric_limits::min() ); } log_hefts = log(hefts); if(calc_chol) { chol_fcovs.copy_size(fcovs); Mat tmp_chol; for(uword g=0; g < N_gaus; ++g) { const Mat& fcov = fcovs.slice(g); Mat& chol_fcov = chol_fcovs.slice(g); const uword chol_layout = 1; // indicates "lower" const bool chol_ok = op_chol::apply_direct(tmp_chol, fcov, chol_layout); if(chol_ok) { chol_fcov = tmp_chol; } else { // last resort: treat the covariance matrix as diagonal chol_fcov.zeros(); for(uword d=0; d < N_dims; ++d) { const eT sanitised_val = (std::max)( eT(fcov.at(d,d)), eT(std::numeric_limits::min()) ); chol_fcov.at(d,d) = std::sqrt(sanitised_val); } } } } } template inline umat gmm_full::internal_gen_boundaries(const uword N) const { arma_extra_debug_sigprint(); #if defined(ARMA_USE_OPENMP) const uword n_threads_avail = uword(omp_get_max_threads()); const uword n_threads = (n_threads_avail > 0) ? ( (n_threads_avail <= N) ? n_threads_avail : 1 ) : 1; #else static constexpr uword n_threads = 1; #endif // get_cout_stream() << "gmm_full::internal_gen_boundaries(): n_threads: " << n_threads << '\n'; umat boundaries(2, n_threads, arma_nozeros_indicator()); if(N > 0) { const uword chunk_size = N / n_threads; uword count = 0; for(uword t=0; t inline eT gmm_full::internal_scalar_log_p(const eT* x) const { arma_extra_debug_sigprint(); const eT* log_hefts_mem = log_hefts.mem; const uword N_gaus = means.n_cols; if(N_gaus > 0) { eT log_sum = internal_scalar_log_p(x, 0) + log_hefts_mem[0]; for(uword g=1; g < N_gaus; ++g) { const eT log_val = internal_scalar_log_p(x, g) + log_hefts_mem[g]; log_sum = log_add_exp(log_sum, log_val); } return log_sum; } else { return -Datum::inf; } } template inline eT gmm_full::internal_scalar_log_p(const eT* x, const uword g) const { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const eT* mean_mem = means.colptr(g); eT outer_acc = eT(0); const eT* inv_fcov_coldata = inv_fcovs.slice(g).memptr(); for(uword i=0; i < N_dims; ++i) { eT inner_acc = eT(0); for(uword j=0; j < N_dims; ++j) { inner_acc += (x[j] - mean_mem[j]) * inv_fcov_coldata[j]; } inv_fcov_coldata += N_dims; outer_acc += inner_acc * (x[i] - mean_mem[i]); } return eT(-0.5)*outer_acc + log_det_etc.mem[g]; } template inline Row gmm_full::internal_vec_log_p(const Mat& X) const { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_samples = X.n_cols; arma_debug_check( (X.n_rows != N_dims), "gmm_full::log_p(): incompatible dimensions" ); Row out(N_samples, arma_nozeros_indicator()); if(N_samples > 0) { #if defined(ARMA_USE_OPENMP) { const umat boundaries = internal_gen_boundaries(N_samples); const uword n_threads = boundaries.n_cols; #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); eT* out_mem = out.memptr(); for(uword i=start_index; i <= end_index; ++i) { out_mem[i] = internal_scalar_log_p( X.colptr(i) ); } } } #else { eT* out_mem = out.memptr(); for(uword i=0; i < N_samples; ++i) { out_mem[i] = internal_scalar_log_p( X.colptr(i) ); } } #endif } return out; } template inline Row gmm_full::internal_vec_log_p(const Mat& X, const uword gaus_id) const { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_samples = X.n_cols; arma_debug_check( (X.n_rows != N_dims), "gmm_full::log_p(): incompatible dimensions" ); arma_debug_check( (gaus_id >= means.n_cols), "gmm_full::log_p(): specified gaussian is out of range" ); Row out(N_samples, arma_nozeros_indicator()); if(N_samples > 0) { #if defined(ARMA_USE_OPENMP) { const umat boundaries = internal_gen_boundaries(N_samples); const uword n_threads = boundaries.n_cols; #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); eT* out_mem = out.memptr(); for(uword i=start_index; i <= end_index; ++i) { out_mem[i] = internal_scalar_log_p( X.colptr(i), gaus_id ); } } } #else { eT* out_mem = out.memptr(); for(uword i=0; i < N_samples; ++i) { out_mem[i] = internal_scalar_log_p( X.colptr(i), gaus_id ); } } #endif } return out; } template inline eT gmm_full::internal_sum_log_p(const Mat& X) const { arma_extra_debug_sigprint(); arma_debug_check( (X.n_rows != means.n_rows), "gmm_full::sum_log_p(): incompatible dimensions" ); const uword N = X.n_cols; if(N == 0) { return (-Datum::inf); } #if defined(ARMA_USE_OPENMP) { const umat boundaries = internal_gen_boundaries(N); const uword n_threads = boundaries.n_cols; Col t_accs(n_threads, arma_zeros_indicator()); #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); eT t_acc = eT(0); for(uword i=start_index; i <= end_index; ++i) { t_acc += internal_scalar_log_p( X.colptr(i) ); } t_accs[t] = t_acc; } return eT(accu(t_accs)); } #else { eT acc = eT(0); for(uword i=0; i inline eT gmm_full::internal_sum_log_p(const Mat& X, const uword gaus_id) const { arma_extra_debug_sigprint(); arma_debug_check( (X.n_rows != means.n_rows), "gmm_full::sum_log_p(): incompatible dimensions" ); arma_debug_check( (gaus_id >= means.n_cols), "gmm_full::sum_log_p(): specified gaussian is out of range" ); const uword N = X.n_cols; if(N == 0) { return (-Datum::inf); } #if defined(ARMA_USE_OPENMP) { const umat boundaries = internal_gen_boundaries(N); const uword n_threads = boundaries.n_cols; Col t_accs(n_threads, arma_zeros_indicator()); #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); eT t_acc = eT(0); for(uword i=start_index; i <= end_index; ++i) { t_acc += internal_scalar_log_p( X.colptr(i), gaus_id ); } t_accs[t] = t_acc; } return eT(accu(t_accs)); } #else { eT acc = eT(0); for(uword i=0; i inline eT gmm_full::internal_avg_log_p(const Mat& X) const { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_samples = X.n_cols; arma_debug_check( (X.n_rows != N_dims), "gmm_full::avg_log_p(): incompatible dimensions" ); if(N_samples == 0) { return (-Datum::inf); } #if defined(ARMA_USE_OPENMP) { const umat boundaries = internal_gen_boundaries(N_samples); const uword n_threads = boundaries.n_cols; field< running_mean_scalar > t_running_means(n_threads); #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); running_mean_scalar& current_running_mean = t_running_means[t]; for(uword i=start_index; i <= end_index; ++i) { current_running_mean( internal_scalar_log_p( X.colptr(i) ) ); } } eT avg = eT(0); for(uword t=0; t < n_threads; ++t) { running_mean_scalar& current_running_mean = t_running_means[t]; const eT w = eT(current_running_mean.count()) / eT(N_samples); avg += w * current_running_mean.mean(); } return avg; } #else { running_mean_scalar running_mean; for(uword i=0; i < N_samples; ++i) { running_mean( internal_scalar_log_p( X.colptr(i) ) ); } return running_mean.mean(); } #endif } template inline eT gmm_full::internal_avg_log_p(const Mat& X, const uword gaus_id) const { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_samples = X.n_cols; arma_debug_check( (X.n_rows != N_dims), "gmm_full::avg_log_p(): incompatible dimensions" ); arma_debug_check( (gaus_id >= means.n_cols), "gmm_full::avg_log_p(): specified gaussian is out of range" ); if(N_samples == 0) { return (-Datum::inf); } #if defined(ARMA_USE_OPENMP) { const umat boundaries = internal_gen_boundaries(N_samples); const uword n_threads = boundaries.n_cols; field< running_mean_scalar > t_running_means(n_threads); #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); running_mean_scalar& current_running_mean = t_running_means[t]; for(uword i=start_index; i <= end_index; ++i) { current_running_mean( internal_scalar_log_p( X.colptr(i), gaus_id) ); } } eT avg = eT(0); for(uword t=0; t < n_threads; ++t) { running_mean_scalar& current_running_mean = t_running_means[t]; const eT w = eT(current_running_mean.count()) / eT(N_samples); avg += w * current_running_mean.mean(); } return avg; } #else { running_mean_scalar running_mean; for(uword i=0; i inline uword gmm_full::internal_scalar_assign(const Mat& X, const gmm_dist_mode& dist_mode) const { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; arma_debug_check( (X.n_rows != N_dims), "gmm_full::assign(): incompatible dimensions" ); arma_debug_check( (N_gaus == 0), "gmm_full::assign(): model has no means" ); const eT* X_mem = X.colptr(0); if(dist_mode == eucl_dist) { eT best_dist = Datum::inf; uword best_g = 0; for(uword g=0; g < N_gaus; ++g) { const eT tmp_dist = distance::eval(N_dims, X_mem, means.colptr(g), X_mem); if(tmp_dist <= best_dist) { best_dist = tmp_dist; best_g = g; } } return best_g; } else if(dist_mode == prob_dist) { const eT* log_hefts_mem = log_hefts.memptr(); eT best_p = -Datum::inf; uword best_g = 0; for(uword g=0; g < N_gaus; ++g) { const eT tmp_p = internal_scalar_log_p(X_mem, g) + log_hefts_mem[g]; if(tmp_p >= best_p) { best_p = tmp_p; best_g = g; } } return best_g; } else { arma_debug_check(true, "gmm_full::assign(): unsupported distance mode"); } return uword(0); } template inline void gmm_full::internal_vec_assign(urowvec& out, const Mat& X, const gmm_dist_mode& dist_mode) const { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; arma_debug_check( (X.n_rows != N_dims), "gmm_full::assign(): incompatible dimensions" ); const uword X_n_cols = (N_gaus > 0) ? X.n_cols : 0; out.set_size(1,X_n_cols); uword* out_mem = out.memptr(); if(dist_mode == eucl_dist) { #if defined(ARMA_USE_OPENMP) { #pragma omp parallel for schedule(static) for(uword i=0; i::inf; uword best_g = 0; for(uword g=0; g::eval(N_dims, X_colptr, means.colptr(g), X_colptr); if(tmp_dist <= best_dist) { best_dist = tmp_dist; best_g = g; } } out_mem[i] = best_g; } } #else { for(uword i=0; i::inf; uword best_g = 0; for(uword g=0; g::eval(N_dims, X_colptr, means.colptr(g), X_colptr); if(tmp_dist <= best_dist) { best_dist = tmp_dist; best_g = g; } } out_mem[i] = best_g; } } #endif } else if(dist_mode == prob_dist) { #if defined(ARMA_USE_OPENMP) { const umat boundaries = internal_gen_boundaries(X_n_cols); const uword n_threads = boundaries.n_cols; const eT* log_hefts_mem = log_hefts.memptr(); #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); for(uword i=start_index; i <= end_index; ++i) { const eT* X_colptr = X.colptr(i); eT best_p = -Datum::inf; uword best_g = 0; for(uword g=0; g= best_p) { best_p = tmp_p; best_g = g; } } out_mem[i] = best_g; } } } #else { const eT* log_hefts_mem = log_hefts.memptr(); for(uword i=0; i::inf; uword best_g = 0; for(uword g=0; g= best_p) { best_p = tmp_p; best_g = g; } } out_mem[i] = best_g; } } #endif } else { arma_debug_check(true, "gmm_full::assign(): unsupported distance mode"); } } template inline void gmm_full::internal_raw_hist(urowvec& hist, const Mat& X, const gmm_dist_mode& dist_mode) const { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; const uword X_n_cols = X.n_cols; hist.zeros(N_gaus); if(N_gaus == 0) { return; } #if defined(ARMA_USE_OPENMP) { const umat boundaries = internal_gen_boundaries(X_n_cols); const uword n_threads = boundaries.n_cols; field thread_hist(n_threads); for(uword t=0; t < n_threads; ++t) { thread_hist(t).zeros(N_gaus); } if(dist_mode == eucl_dist) { #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { uword* thread_hist_mem = thread_hist(t).memptr(); const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); for(uword i=start_index; i <= end_index; ++i) { const eT* X_colptr = X.colptr(i); eT best_dist = Datum::inf; uword best_g = 0; for(uword g=0; g < N_gaus; ++g) { const eT tmp_dist = distance::eval(N_dims, X_colptr, means.colptr(g), X_colptr); if(tmp_dist <= best_dist) { best_dist = tmp_dist; best_g = g; } } thread_hist_mem[best_g]++; } } } else if(dist_mode == prob_dist) { const eT* log_hefts_mem = log_hefts.memptr(); #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { uword* thread_hist_mem = thread_hist(t).memptr(); const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); for(uword i=start_index; i <= end_index; ++i) { const eT* X_colptr = X.colptr(i); eT best_p = -Datum::inf; uword best_g = 0; for(uword g=0; g < N_gaus; ++g) { const eT tmp_p = internal_scalar_log_p(X_colptr, g) + log_hefts_mem[g]; if(tmp_p >= best_p) { best_p = tmp_p; best_g = g; } } thread_hist_mem[best_g]++; } } } // reduction for(uword t=0; t < n_threads; ++t) { hist += thread_hist(t); } } #else { uword* hist_mem = hist.memptr(); if(dist_mode == eucl_dist) { for(uword i=0; i::inf; uword best_g = 0; for(uword g=0; g < N_gaus; ++g) { const eT tmp_dist = distance::eval(N_dims, X_colptr, means.colptr(g), X_colptr); if(tmp_dist <= best_dist) { best_dist = tmp_dist; best_g = g; } } hist_mem[best_g]++; } } else if(dist_mode == prob_dist) { const eT* log_hefts_mem = log_hefts.memptr(); for(uword i=0; i::inf; uword best_g = 0; for(uword g=0; g < N_gaus; ++g) { const eT tmp_p = internal_scalar_log_p(X_colptr, g) + log_hefts_mem[g]; if(tmp_p >= best_p) { best_p = tmp_p; best_g = g; } } hist_mem[best_g]++; } } } #endif } template template inline void gmm_full::generate_initial_means(const Mat& X, const gmm_seed_mode& seed_mode) { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; if( (seed_mode == static_subset) || (seed_mode == random_subset) ) { uvec initial_indices; if(seed_mode == static_subset) { initial_indices = linspace(0, X.n_cols-1, N_gaus); } else if(seed_mode == random_subset) { initial_indices = randperm(X.n_cols, N_gaus); } // initial_indices.print("initial_indices:"); access::rw(means) = X.cols(initial_indices); } else if( (seed_mode == static_spread) || (seed_mode == random_spread) ) { // going through all of the samples can be extremely time consuming; // instead, if there are enough samples, randomly choose samples with probability 0.1 const bool use_sampling = ((X.n_cols/uword(100)) > N_gaus); const uword step = (use_sampling) ? uword(10) : uword(1); uword start_index = 0; if(seed_mode == static_spread) { start_index = X.n_cols / 2; } else if(seed_mode == random_spread) { start_index = as_scalar(randi(1, distr_param(0,X.n_cols-1))); } access::rw(means).col(0) = X.unsafe_col(start_index); const eT* mah_aux_mem = mah_aux.memptr(); running_stat rs; for(uword g=1; g < N_gaus; ++g) { eT max_dist = eT(0); uword best_i = uword(0); uword start_i = uword(0); if(use_sampling) { uword start_i_proposed = uword(0); if(seed_mode == static_spread) { start_i_proposed = g % uword(10); } if(seed_mode == random_spread) { start_i_proposed = as_scalar(randi(1, distr_param(0,9))); } if(start_i_proposed < X.n_cols) { start_i = start_i_proposed; } } for(uword i=start_i; i < X.n_cols; i += step) { rs.reset(); const eT* X_colptr = X.colptr(i); bool ignore_i = false; // find the average distance between sample i and the means so far for(uword h = 0; h < g; ++h) { const eT dist = distance::eval(N_dims, X_colptr, means.colptr(h), mah_aux_mem); // ignore sample already selected as a mean if(dist == eT(0)) { ignore_i = true; break; } else { rs(dist); } } if( (rs.mean() >= max_dist) && (ignore_i == false)) { max_dist = eT(rs.mean()); best_i = i; } } // set the mean to the sample that is the furthest away from the means so far access::rw(means).col(g) = X.unsafe_col(best_i); } } // get_cout_stream() << "generate_initial_means():" << '\n'; // means.print(); } template template inline void gmm_full::generate_initial_params(const Mat& X, const eT var_floor) { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; const eT* mah_aux_mem = mah_aux.memptr(); const uword X_n_cols = X.n_cols; if(X_n_cols == 0) { return; } // as the covariances are calculated via accumulators, // the means also need to be calculated via accumulators to ensure numerical consistency Mat acc_means(N_dims, N_gaus); Mat acc_dcovs(N_dims, N_gaus); Row acc_hefts(N_gaus, arma_zeros_indicator()); uword* acc_hefts_mem = acc_hefts.memptr(); #if defined(ARMA_USE_OPENMP) { const umat boundaries = internal_gen_boundaries(X_n_cols); const uword n_threads = boundaries.n_cols; field< Mat > t_acc_means(n_threads); field< Mat > t_acc_dcovs(n_threads); field< Row > t_acc_hefts(n_threads); for(uword t=0; t < n_threads; ++t) { t_acc_means(t).zeros(N_dims, N_gaus); t_acc_dcovs(t).zeros(N_dims, N_gaus); t_acc_hefts(t).zeros(N_gaus); } #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { uword* t_acc_hefts_mem = t_acc_hefts(t).memptr(); const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); for(uword i=start_index; i <= end_index; ++i) { const eT* X_colptr = X.colptr(i); eT min_dist = Datum::inf; uword best_g = 0; for(uword g=0; g::eval(N_dims, X_colptr, means.colptr(g), mah_aux_mem); if(dist < min_dist) { min_dist = dist; best_g = g; } } eT* t_acc_mean = t_acc_means(t).colptr(best_g); eT* t_acc_dcov = t_acc_dcovs(t).colptr(best_g); for(uword d=0; d::inf; uword best_g = 0; for(uword g=0; g::eval(N_dims, X_colptr, means.colptr(g), mah_aux_mem); if(dist < min_dist) { min_dist = dist; best_g = g; } } eT* acc_mean = acc_means.colptr(best_g); eT* acc_dcov = acc_dcovs.colptr(best_g); for(uword d=0; d& fcov = access::rw(fcovs).slice(g); fcov.zeros(); for(uword d=0; d= 1) ? tmp : eT(0); fcov.at(d,d) = (acc_heft >= 2) ? eT((acc_dcov[d] / eT(acc_heft)) - (tmp*tmp)) : eT(var_floor); } hefts_mem[g] = eT(acc_heft) / eT(X_n_cols); } em_fix_params(var_floor); } //! multi-threaded implementation of k-means, inspired by MapReduce template template inline bool gmm_full::km_iterate(const Mat& X, const uword max_iter, const bool verbose) { arma_extra_debug_sigprint(); if(verbose) { get_cout_stream().unsetf(ios::showbase); get_cout_stream().unsetf(ios::uppercase); get_cout_stream().unsetf(ios::showpos); get_cout_stream().unsetf(ios::scientific); get_cout_stream().setf(ios::right); get_cout_stream().setf(ios::fixed); } const uword X_n_cols = X.n_cols; if(X_n_cols == 0) { return true; } const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; const eT* mah_aux_mem = mah_aux.memptr(); Mat acc_means(N_dims, N_gaus, arma_zeros_indicator()); Row acc_hefts( N_gaus, arma_zeros_indicator()); Row last_indx( N_gaus, arma_zeros_indicator()); Mat new_means = means; Mat old_means = means; running_mean_scalar rs_delta; #if defined(ARMA_USE_OPENMP) const umat boundaries = internal_gen_boundaries(X_n_cols); const uword n_threads = boundaries.n_cols; field< Mat > t_acc_means(n_threads); field< Row > t_acc_hefts(n_threads); field< Row > t_last_indx(n_threads); #else const uword n_threads = 1; #endif if(verbose) { get_cout_stream() << "gmm_full::learn(): k-means: n_threads: " << n_threads << '\n'; get_cout_stream().flush(); } for(uword iter=1; iter <= max_iter; ++iter) { #if defined(ARMA_USE_OPENMP) { for(uword t=0; t < n_threads; ++t) { t_acc_means(t).zeros(N_dims, N_gaus); t_acc_hefts(t).zeros(N_gaus); t_last_indx(t).zeros(N_gaus); } #pragma omp parallel for schedule(static) for(uword t=0; t < n_threads; ++t) { Mat& t_acc_means_t = t_acc_means(t); uword* t_acc_hefts_mem = t_acc_hefts(t).memptr(); uword* t_last_indx_mem = t_last_indx(t).memptr(); const uword start_index = boundaries.at(0,t); const uword end_index = boundaries.at(1,t); for(uword i=start_index; i <= end_index; ++i) { const eT* X_colptr = X.colptr(i); eT min_dist = Datum::inf; uword best_g = 0; for(uword g=0; g::eval(N_dims, X_colptr, old_means.colptr(g), mah_aux_mem); if(dist < min_dist) { min_dist = dist; best_g = g; } } eT* t_acc_mean = t_acc_means_t.colptr(best_g); for(uword d=0; d= 1 ) { last_indx(g) = t_last_indx(t)(g); } } } #else { uword* acc_hefts_mem = acc_hefts.memptr(); uword* last_indx_mem = last_indx.memptr(); for(uword i=0; i < X_n_cols; ++i) { const eT* X_colptr = X.colptr(i); eT min_dist = Datum::inf; uword best_g = 0; for(uword g=0; g::eval(N_dims, X_colptr, old_means.colptr(g), mah_aux_mem); if(dist < min_dist) { min_dist = dist; best_g = g; } } eT* acc_mean = acc_means.colptr(best_g); for(uword d=0; d= 1) ? (acc_mean[d] / eT(acc_heft)) : eT(0); } } // heuristics to resurrect dead means const uvec dead_gs = find(acc_hefts == uword(0)); if(dead_gs.n_elem > 0) { if(verbose) { get_cout_stream() << "gmm_full::learn(): k-means: recovering from dead means\n"; get_cout_stream().flush(); } uword* last_indx_mem = last_indx.memptr(); const uvec live_gs = sort( find(acc_hefts >= uword(2)), "descend" ); if(live_gs.n_elem == 0) { return false; } uword live_gs_count = 0; for(uword dead_gs_count = 0; dead_gs_count < dead_gs.n_elem; ++dead_gs_count) { const uword dead_g_id = dead_gs(dead_gs_count); uword proposed_i = 0; if(live_gs_count < live_gs.n_elem) { const uword live_g_id = live_gs(live_gs_count); ++live_gs_count; if(live_g_id == dead_g_id) { return false; } // recover by using a sample from a known good mean proposed_i = last_indx_mem[live_g_id]; } else { // recover by using a randomly seleced sample (last resort) proposed_i = as_scalar(randi(1, distr_param(0,X_n_cols-1))); } if(proposed_i >= X_n_cols) { return false; } new_means.col(dead_g_id) = X.col(proposed_i); } } rs_delta.reset(); for(uword g=0; g < N_gaus; ++g) { rs_delta( distance::eval(N_dims, old_means.colptr(g), new_means.colptr(g), mah_aux_mem) ); } if(verbose) { get_cout_stream() << "gmm_full::learn(): k-means: iteration: "; get_cout_stream().unsetf(ios::scientific); get_cout_stream().setf(ios::fixed); get_cout_stream().width(std::streamsize(4)); get_cout_stream() << iter; get_cout_stream() << " delta: "; get_cout_stream().unsetf(ios::fixed); //get_cout_stream().setf(ios::scientific); get_cout_stream() << rs_delta.mean() << '\n'; get_cout_stream().flush(); } arma::swap(old_means, new_means); if(rs_delta.mean() <= Datum::eps) { break; } } access::rw(means) = old_means; if(means.is_finite() == false) { return false; } return true; } //! multi-threaded implementation of Expectation-Maximisation, inspired by MapReduce template inline bool gmm_full::em_iterate(const Mat& X, const uword max_iter, const eT var_floor, const bool verbose) { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; if(verbose) { get_cout_stream().unsetf(ios::showbase); get_cout_stream().unsetf(ios::uppercase); get_cout_stream().unsetf(ios::showpos); get_cout_stream().unsetf(ios::scientific); get_cout_stream().setf(ios::right); get_cout_stream().setf(ios::fixed); } const umat boundaries = internal_gen_boundaries(X.n_cols); const uword n_threads = boundaries.n_cols; field< Mat > t_acc_means(n_threads); field< Cube > t_acc_fcovs(n_threads); field< Col > t_acc_norm_lhoods(n_threads); field< Col > t_gaus_log_lhoods(n_threads); Col t_progress_log_lhood(n_threads, arma_nozeros_indicator()); for(uword t=0; t::inf; const bool calc_chol = false; for(uword iter=1; iter <= max_iter; ++iter) { init_constants(calc_chol); em_update_params(X, boundaries, t_acc_means, t_acc_fcovs, t_acc_norm_lhoods, t_gaus_log_lhoods, t_progress_log_lhood, var_floor); em_fix_params(var_floor); const eT new_avg_log_p = accu(t_progress_log_lhood) / eT(t_progress_log_lhood.n_elem); if(verbose) { get_cout_stream() << "gmm_full::learn(): EM: iteration: "; get_cout_stream().unsetf(ios::scientific); get_cout_stream().setf(ios::fixed); get_cout_stream().width(std::streamsize(4)); get_cout_stream() << iter; get_cout_stream() << " avg_log_p: "; get_cout_stream().unsetf(ios::fixed); //get_cout_stream().setf(ios::scientific); get_cout_stream() << new_avg_log_p << '\n'; get_cout_stream().flush(); } if(arma_isfinite(new_avg_log_p) == false) { return false; } if(std::abs(old_avg_log_p - new_avg_log_p) <= Datum::eps) { break; } old_avg_log_p = new_avg_log_p; } for(uword g=0; g < N_gaus; ++g) { const Mat& fcov = fcovs.slice(g); if(any(vectorise(fcov.diag()) <= eT(0))) { return false; } } if(means.is_finite() == false) { return false; } if(fcovs.is_finite() == false) { return false; } if(hefts.is_finite() == false) { return false; } return true; } template inline void gmm_full::em_update_params ( const Mat& X, const umat& boundaries, field< Mat >& t_acc_means, field< Cube >& t_acc_fcovs, field< Col >& t_acc_norm_lhoods, field< Col >& t_gaus_log_lhoods, Col& t_progress_log_lhood, const eT var_floor ) { arma_extra_debug_sigprint(); const uword n_threads = boundaries.n_cols; // em_generate_acc() is the "map" operation, which produces partial accumulators for means, diagonal covariances and hefts #if defined(ARMA_USE_OPENMP) { #pragma omp parallel for schedule(static) for(uword t=0; t& acc_means = t_acc_means[t]; Cube& acc_fcovs = t_acc_fcovs[t]; Col& acc_norm_lhoods = t_acc_norm_lhoods[t]; Col& gaus_log_lhoods = t_gaus_log_lhoods[t]; eT& progress_log_lhood = t_progress_log_lhood[t]; em_generate_acc(X, boundaries.at(0,t), boundaries.at(1,t), acc_means, acc_fcovs, acc_norm_lhoods, gaus_log_lhoods, progress_log_lhood); } } #else { em_generate_acc(X, boundaries.at(0,0), boundaries.at(1,0), t_acc_means[0], t_acc_fcovs[0], t_acc_norm_lhoods[0], t_gaus_log_lhoods[0], t_progress_log_lhood[0]); } #endif const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; Mat& final_acc_means = t_acc_means[0]; Cube& final_acc_fcovs = t_acc_fcovs[0]; Col& final_acc_norm_lhoods = t_acc_norm_lhoods[0]; // the "reduce" operation, which combines the partial accumulators produced by the separate threads for(uword t=1; t mean_outer(N_dims, N_dims, arma_nozeros_indicator()); //// update each component without sanity checking //for(uword g=0; g < N_gaus; ++g) // { // const eT acc_norm_lhood = (std::max)( final_acc_norm_lhoods[g], std::numeric_limits::min() ); // // hefts_mem[g] = acc_norm_lhood / eT(X.n_cols); // // eT* mean_mem = access::rw(means).colptr(g); // eT* acc_mean_mem = final_acc_means.colptr(g); // // for(uword d=0; d < N_dims; ++d) // { // mean_mem[d] = acc_mean_mem[d] / acc_norm_lhood; // } // // const Col mean(mean_mem, N_dims, false, true); // // mean_outer = mean * mean.t(); // // Mat& fcov = access::rw(fcovs).slice(g); // Mat& acc_fcov = final_acc_fcovs.slice(g); // // fcov = acc_fcov / acc_norm_lhood - mean_outer; // } // conditionally update each component; if only a subset of the hefts was updated, em_fix_params() will sanitise them for(uword g=0; g < N_gaus; ++g) { const eT acc_norm_lhood = (std::max)( final_acc_norm_lhoods[g], std::numeric_limits::min() ); if(arma_isfinite(acc_norm_lhood) == false) { continue; } eT* acc_mean_mem = final_acc_means.colptr(g); for(uword d=0; d < N_dims; ++d) { acc_mean_mem[d] /= acc_norm_lhood; } const Col new_mean(acc_mean_mem, N_dims, false, true); mean_outer = new_mean * new_mean.t(); Mat& acc_fcov = final_acc_fcovs.slice(g); acc_fcov /= acc_norm_lhood; acc_fcov -= mean_outer; for(uword d=0; d < N_dims; ++d) { eT& val = acc_fcov.at(d,d); if(val < var_floor) { val = var_floor; } } if(acc_fcov.is_finite() == false) { continue; } eT log_det_val = eT(0); eT log_det_sign = eT(0); const bool log_det_status = log_det(log_det_val, log_det_sign, acc_fcov); const bool log_det_ok = ( log_det_status && (arma_isfinite(log_det_val)) && (log_det_sign > eT(0)) ); const bool inv_ok = (log_det_ok) ? bool(auxlib::inv_sympd(mean_outer, acc_fcov)) : bool(false); // mean_outer is used as a junk matrix if(log_det_ok && inv_ok) { hefts_mem[g] = acc_norm_lhood / eT(X.n_cols); eT* mean_mem = access::rw(means).colptr(g); for(uword d=0; d < N_dims; ++d) { mean_mem[d] = acc_mean_mem[d]; } Mat& fcov = access::rw(fcovs).slice(g); fcov = acc_fcov; } } } template inline void gmm_full::em_generate_acc ( const Mat& X, const uword start_index, const uword end_index, Mat& acc_means, Cube& acc_fcovs, Col& acc_norm_lhoods, Col& gaus_log_lhoods, eT& progress_log_lhood ) const { arma_extra_debug_sigprint(); progress_log_lhood = eT(0); acc_means.zeros(); acc_fcovs.zeros(); acc_norm_lhoods.zeros(); gaus_log_lhoods.zeros(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; const eT* log_hefts_mem = log_hefts.memptr(); eT* gaus_log_lhoods_mem = gaus_log_lhoods.memptr(); for(uword i=start_index; i <= end_index; i++) { const eT* x = X.colptr(i); for(uword g=0; g < N_gaus; ++g) { gaus_log_lhoods_mem[g] = internal_scalar_log_p(x, g) + log_hefts_mem[g]; } eT log_lhood_sum = gaus_log_lhoods_mem[0]; for(uword g=1; g < N_gaus; ++g) { log_lhood_sum = log_add_exp(log_lhood_sum, gaus_log_lhoods_mem[g]); } progress_log_lhood += log_lhood_sum; for(uword g=0; g < N_gaus; ++g) { const eT norm_lhood = std::exp(gaus_log_lhoods_mem[g] - log_lhood_sum); acc_norm_lhoods[g] += norm_lhood; eT* acc_mean_mem = acc_means.colptr(g); for(uword d=0; d < N_dims; ++d) { acc_mean_mem[d] += x[d] * norm_lhood; } Mat& acc_fcov = access::rw(acc_fcovs).slice(g); // specialised version of acc_fcov += norm_lhood * (xx * xx.t()); for(uword d=0; d < N_dims; ++d) { const uword dp1 = d+1; const eT xd = x[d]; eT* acc_fcov_col_d = acc_fcov.colptr(d) + d; eT* acc_fcov_row_d = &(acc_fcov.at(d,dp1)); (*acc_fcov_col_d) += norm_lhood * (xd * xd); acc_fcov_col_d++; for(uword e=dp1; e < N_dims; ++e) { const eT val = norm_lhood * (xd * x[e]); (*acc_fcov_col_d) += val; acc_fcov_col_d++; (*acc_fcov_row_d) += val; acc_fcov_row_d += N_dims; } } } } progress_log_lhood /= eT((end_index - start_index) + 1); } template inline void gmm_full::em_fix_params(const eT var_floor) { arma_extra_debug_sigprint(); const uword N_dims = means.n_rows; const uword N_gaus = means.n_cols; const eT var_ceiling = std::numeric_limits::max(); for(uword g=0; g < N_gaus; ++g) { Mat& fcov = access::rw(fcovs).slice(g); for(uword d=0; d < N_dims; ++d) { eT& var_val = fcov.at(d,d); if(var_val < var_floor ) { var_val = var_floor; } else if(var_val > var_ceiling) { var_val = var_ceiling; } else if(arma_isnan(var_val) ) { var_val = eT(1); } } } eT* hefts_mem = access::rw(hefts).memptr(); for(uword g1=0; g1 < N_gaus; ++g1) { if(hefts_mem[g1] > eT(0)) { const eT* means_colptr_g1 = means.colptr(g1); for(uword g2=(g1+1); g2 < N_gaus; ++g2) { if( (hefts_mem[g2] > eT(0)) && (std::abs(hefts_mem[g1] - hefts_mem[g2]) <= std::numeric_limits::epsilon()) ) { const eT dist = distance::eval(N_dims, means_colptr_g1, means.colptr(g2), means_colptr_g1); if(dist == eT(0)) { hefts_mem[g2] = eT(0); } } } } } const eT heft_floor = std::numeric_limits::min(); const eT heft_initial = eT(1) / eT(N_gaus); for(uword i=0; i < N_gaus; ++i) { eT& heft_val = hefts_mem[i]; if(heft_val < heft_floor) { heft_val = heft_floor; } else if(heft_val > eT(1) ) { heft_val = eT(1); } else if(arma_isnan(heft_val) ) { heft_val = heft_initial; } } const eT heft_sum = accu(hefts); if((heft_sum < (eT(1) - Datum::eps)) || (heft_sum > (eT(1) + Datum::eps))) { access::rw(hefts) /= heft_sum; } } } // namespace gmm_priv //! @} RcppArmadillo/inst/include/armadillo_bits/fn_range.hpp0000644000176200001440000000310514124060717022661 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_range //! @{ template arma_warn_unused inline typename enable_if2< is_arma_type::value && resolves_to_vector::yes, typename T1::elem_type >::result range(const T1& X) { arma_extra_debug_sigprint(); return op_range::vector_range(X); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value && resolves_to_vector::no, const Op >::result range(const T1& X) { arma_extra_debug_sigprint(); return Op(X, 0, 0); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const Op >::result range(const T1& X, const uword dim) { arma_extra_debug_sigprint(); return Op(X, dim, 0); } //! @} RcppArmadillo/inst/include/armadillo_bits/Gen_bones.hpp0000644000176200001440000000467414124060717023015 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup Gen //! @{ //! support class for generator functions (eg. zeros, randu, randn, ...) template class Gen : public Base< typename T1::elem_type, Gen > , public GenSpecialiser::yes, is_same_type::yes, is_same_type::yes, is_same_type::yes> { public: typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool use_at = (is_same_type::value); static constexpr bool is_simple = (is_same_type::value) || (is_same_type::value); static constexpr bool is_row = T1::is_row; static constexpr bool is_col = T1::is_col; static constexpr bool is_xvec = T1::is_xvec; arma_aligned const uword n_rows; arma_aligned const uword n_cols; arma_inline Gen(const uword in_n_rows, const uword in_n_cols); arma_inline ~Gen(); arma_inline elem_type operator[] (const uword ii) const; arma_inline elem_type at (const uword row, const uword col) const; arma_inline elem_type at_alt (const uword ii) const; inline void apply (Mat& out) const; inline void apply_inplace_plus (Mat& out) const; inline void apply_inplace_minus(Mat& out) const; inline void apply_inplace_schur(Mat& out) const; inline void apply_inplace_div (Mat& out) const; inline void apply(subview& out) const; }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_mvnrnd.hpp0000644000176200001440000000532014124060717023072 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_mvnrnd //! @{ template arma_warn_unused inline typename enable_if2 < is_real::value, const Glue >::result mvnrnd(const Base& M, const Base& C) { arma_extra_debug_sigprint(); return Glue(M.get_ref(), C.get_ref()); } template arma_warn_unused inline typename enable_if2 < is_real::value, const Glue >::result mvnrnd(const Base& M, const Base& C, const uword N) { arma_extra_debug_sigprint(); return Glue(M.get_ref(), C.get_ref(), N); } template inline typename enable_if2 < is_real::value, bool >::result mvnrnd(Mat& out, const Base& M, const Base& C) { arma_extra_debug_sigprint(); const bool status = glue_mvnrnd::apply_direct(out, M.get_ref(), C.get_ref(), uword(1)); if(status == false) { out.soft_reset(); arma_debug_warn_level(3, "mvnrnd(): given covariance matrix is not symmetric positive semi-definite"); } return status; } template inline typename enable_if2 < is_real::value, bool >::result mvnrnd(Mat& out, const Base& M, const Base& C, const uword N) { arma_extra_debug_sigprint(); const bool status = glue_mvnrnd::apply_direct(out, M.get_ref(), C.get_ref(), N); if(status == false) { out.soft_reset(); arma_debug_warn_level(3, "mvnrnd(): given covariance matrix is not symmetric positive semi-definite"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/mul_syrk.hpp0000644000176200001440000003071214124060717022753 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup syrk //! @{ class syrk_helper { public: template inline static void inplace_copy_upper_tri_to_lower_tri(Mat& C) { // under the assumption that C is a square matrix const uword N = C.n_rows; for(uword k=0; k < N; ++k) { eT* colmem = C.colptr(k); uword i, j; for(i=(k+1), j=(k+2); j < N; i+=2, j+=2) { const eT tmp_i = C.at(k,i); const eT tmp_j = C.at(k,j); colmem[i] = tmp_i; colmem[j] = tmp_j; } if(i < N) { colmem[i] = C.at(k,i); } } } }; //! partial emulation of BLAS function syrk(), specialised for A being a vector template class syrk_vec { public: template arma_hot inline static void apply ( Mat& C, const TA& A, const eT alpha = eT(1), const eT beta = eT(0) ) { arma_extra_debug_sigprint(); const uword A_n1 = (do_trans_A == false) ? A.n_rows : A.n_cols; const uword A_n2 = (do_trans_A == false) ? A.n_cols : A.n_rows; const eT* A_mem = A.memptr(); if(A_n1 == 1) { const eT acc1 = op_dot::direct_dot(A_n2, A_mem, A_mem); if( (use_alpha == false) && (use_beta == false) ) { C[0] = acc1; } else if( (use_alpha == true ) && (use_beta == false) ) { C[0] = alpha*acc1; } else if( (use_alpha == false) && (use_beta == true ) ) { C[0] = acc1 + beta*C[0]; } else if( (use_alpha == true ) && (use_beta == true ) ) { C[0] = alpha*acc1 + beta*C[0]; } } else for(uword k=0; k < A_n1; ++k) { const eT A_k = A_mem[k]; uword i,j; for(i=(k), j=(k+1); j < A_n1; i+=2, j+=2) { const eT acc1 = A_k * A_mem[i]; const eT acc2 = A_k * A_mem[j]; if( (use_alpha == false) && (use_beta == false) ) { C.at(k, i) = acc1; C.at(k, j) = acc2; C.at(i, k) = acc1; C.at(j, k) = acc2; } else if( (use_alpha == true ) && (use_beta == false) ) { const eT val1 = alpha*acc1; const eT val2 = alpha*acc2; C.at(k, i) = val1; C.at(k, j) = val2; C.at(i, k) = val1; C.at(j, k) = val2; } else if( (use_alpha == false) && (use_beta == true) ) { C.at(k, i) = acc1 + beta*C.at(k, i); C.at(k, j) = acc2 + beta*C.at(k, j); if(i != k) { C.at(i, k) = acc1 + beta*C.at(i, k); } C.at(j, k) = acc2 + beta*C.at(j, k); } else if( (use_alpha == true ) && (use_beta == true) ) { const eT val1 = alpha*acc1; const eT val2 = alpha*acc2; C.at(k, i) = val1 + beta*C.at(k, i); C.at(k, j) = val2 + beta*C.at(k, j); if(i != k) { C.at(i, k) = val1 + beta*C.at(i, k); } C.at(j, k) = val2 + beta*C.at(j, k); } } if(i < A_n1) { const eT acc1 = A_k * A_mem[i]; if( (use_alpha == false) && (use_beta == false) ) { C.at(k, i) = acc1; C.at(i, k) = acc1; } else if( (use_alpha == true) && (use_beta == false) ) { const eT val1 = alpha*acc1; C.at(k, i) = val1; C.at(i, k) = val1; } else if( (use_alpha == false) && (use_beta == true) ) { C.at(k, i) = acc1 + beta*C.at(k, i); if(i != k) { C.at(i, k) = acc1 + beta*C.at(i, k); } } else if( (use_alpha == true) && (use_beta == true) ) { const eT val1 = alpha*acc1; C.at(k, i) = val1 + beta*C.at(k, i); if(i != k) { C.at(i, k) = val1 + beta*C.at(i, k); } } } } } }; //! partial emulation of BLAS function syrk() template class syrk_emul { public: template arma_hot inline static void apply ( Mat& C, const TA& A, const eT alpha = eT(1), const eT beta = eT(0) ) { arma_extra_debug_sigprint(); // do_trans_A == false -> C = alpha * A * A^T + beta*C // do_trans_A == true -> C = alpha * A^T * A + beta*C if(do_trans_A == false) { Mat AA; op_strans::apply_mat_noalias(AA, A); syrk_emul::apply(C, AA, alpha, beta); } else if(do_trans_A == true) { const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; for(uword col_A=0; col_A < A_n_cols; ++col_A) { // col_A is interpreted as row_A when storing the results in matrix C const eT* A_coldata = A.colptr(col_A); for(uword k=col_A; k < A_n_cols; ++k) { const eT acc = op_dot::direct_dot_arma(A_n_rows, A_coldata, A.colptr(k)); if( (use_alpha == false) && (use_beta == false) ) { C.at(col_A, k) = acc; C.at(k, col_A) = acc; } else if( (use_alpha == true ) && (use_beta == false) ) { const eT val = alpha*acc; C.at(col_A, k) = val; C.at(k, col_A) = val; } else if( (use_alpha == false) && (use_beta == true ) ) { C.at(col_A, k) = acc + beta*C.at(col_A, k); if(col_A != k) { C.at(k, col_A) = acc + beta*C.at(k, col_A); } } else if( (use_alpha == true ) && (use_beta == true ) ) { const eT val = alpha*acc; C.at(col_A, k) = val + beta*C.at(col_A, k); if(col_A != k) { C.at(k, col_A) = val + beta*C.at(k, col_A); } } } } } } }; template class syrk { public: template inline static void apply_blas_type( Mat& C, const TA& A, const eT alpha = eT(1), const eT beta = eT(0) ) { arma_extra_debug_sigprint(); if(A.is_vec()) { // work around poor handling of vectors by syrk() in ATLAS 3.8.4 and standard BLAS syrk_vec::apply(C,A,alpha,beta); return; } const uword threshold = (is_cx::yes ? 16u : 48u); if( A.n_elem <= threshold ) { syrk_emul::apply(C,A,alpha,beta); } else { #if defined(ARMA_USE_ATLAS) { if(use_beta == true) { // use a temporary matrix, as we can't assume that matrix C is already symmetric Mat D(C.n_rows, C.n_cols, arma_nozeros_indicator()); syrk::apply_blas_type(D,A,alpha); // NOTE: assuming beta=1; this is okay for now, as currently glue_times only uses beta=1 arrayops::inplace_plus(C.memptr(), D.memptr(), C.n_elem); return; } atlas::cblas_syrk ( atlas::CblasColMajor, atlas::CblasUpper, (do_trans_A) ? atlas::CblasTrans : atlas::CblasNoTrans, C.n_cols, (do_trans_A) ? A.n_rows : A.n_cols, (use_alpha) ? alpha : eT(1), A.mem, (do_trans_A) ? A.n_rows : C.n_cols, (use_beta) ? beta : eT(0), C.memptr(), C.n_cols ); syrk_helper::inplace_copy_upper_tri_to_lower_tri(C); } #elif defined(ARMA_USE_BLAS) { if(use_beta == true) { // use a temporary matrix, as we can't assume that matrix C is already symmetric Mat D(C.n_rows, C.n_cols, arma_nozeros_indicator()); syrk::apply_blas_type(D,A,alpha); // NOTE: assuming beta=1; this is okay for now, as currently glue_times only uses beta=1 arrayops::inplace_plus(C.memptr(), D.memptr(), C.n_elem); return; } arma_extra_debug_print("blas::syrk()"); const char uplo = 'U'; const char trans_A = (do_trans_A) ? 'T' : 'N'; const blas_int n = blas_int(C.n_cols); const blas_int k = (do_trans_A) ? blas_int(A.n_rows) : blas_int(A.n_cols); const eT local_alpha = (use_alpha) ? alpha : eT(1); const eT local_beta = (use_beta) ? beta : eT(0); const blas_int lda = (do_trans_A) ? k : n; arma_extra_debug_print( arma_str::format("blas::syrk(): trans_A = %c") % trans_A ); blas::syrk ( &uplo, &trans_A, &n, &k, &local_alpha, A.mem, &lda, &local_beta, C.memptr(), &n // &ldc ); syrk_helper::inplace_copy_upper_tri_to_lower_tri(C); } #else { syrk_emul::apply(C,A,alpha,beta); } #endif } } template inline static void apply( Mat& C, const TA& A, const eT alpha = eT(1), const eT beta = eT(0) ) { if(is_cx::no) { if(A.is_vec()) { syrk_vec::apply(C,A,alpha,beta); } else { syrk_emul::apply(C,A,alpha,beta); } } else { // handling of complex matrix by syrk_emul() is not yet implemented return; } } template arma_inline static void apply ( Mat& C, const TA& A, const float alpha = float(1), const float beta = float(0) ) { syrk::apply_blas_type(C,A,alpha,beta); } template arma_inline static void apply ( Mat& C, const TA& A, const double alpha = double(1), const double beta = double(0) ) { syrk::apply_blas_type(C,A,alpha,beta); } template arma_inline static void apply ( Mat< std::complex >& C, const TA& A, const std::complex alpha = std::complex(1), const std::complex beta = std::complex(0) ) { arma_ignore(C); arma_ignore(A); arma_ignore(alpha); arma_ignore(beta); // handling of complex matrix by syrk() is not yet implemented return; } template arma_inline static void apply ( Mat< std::complex >& C, const TA& A, const std::complex alpha = std::complex(1), const std::complex beta = std::complex(0) ) { arma_ignore(C); arma_ignore(A); arma_ignore(alpha); arma_ignore(beta); // handling of complex matrix by syrk() is not yet implemented return; } }; //! @} RcppArmadillo/inst/include/armadillo_bits/cond_rel_bones.hpp0000644000176200001440000000247214124060717024063 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup cond_rel //! @{ // // for preventing pedantic compiler warnings template class cond_rel { public: template arma_inline static bool lt(const eT A, const eT B); template arma_inline static bool gt(const eT A, const eT B); template arma_inline static bool leq(const eT A, const eT B); template arma_inline static bool geq(const eT A, const eT B); template arma_inline static eT make_neg(const eT val); }; //! @} RcppArmadillo/inst/include/armadillo_bits/newarp_SymEigsSolver_bones.hpp0000644000176200001440000000732014124060717026422 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ namespace newarp { //! This class implements the eigen solver for real symmetric matrices. template class SymEigsSolver { protected: const OpType& op; // object to conduct matrix operation, eg. matrix-vector product const uword nev; // number of eigenvalues requested Col ritz_val; // ritz values // Sort the first nev Ritz pairs in ascending algebraic order // This is used to return the final results virtual void sort_ritzpair(); private: const uword dim_n; // dimension of matrix A const uword ncv; // number of ritz values uword nmatop; // number of matrix operations called uword niter; // number of restarting iterations Mat fac_V; // V matrix in the Arnoldi factorisation Mat fac_H; // H matrix in the Arnoldi factorisation Col fac_f; // residual in the Arnoldi factorisation Mat ritz_vec; // ritz vectors Col ritz_est; // last row of ritz_vec std::vector ritz_conv; // indicator of the convergence of ritz values const eT eps; // the machine precision // eg. ~= 1e-16 for double type const eT eps23; // eps^(2/3), used in convergence test // tol*eps23 is the absolute tolerance const eT near0; // a very small value, but 1/near0 does not overflow // Arnoldi factorisation starting from step-k inline void factorise_from(uword from_k, uword to_m, const Col& fk); // Implicitly restarted Arnoldi factorisation inline void restart(uword k); // Calculate the number of converged Ritz values inline uword num_converged(eT tol); // Return the adjusted nev for restarting inline uword nev_adjusted(uword nconv); // Retrieve and sort ritz values and ritz vectors inline void retrieve_ritzpair(); public: //! Constructor to create a solver object. inline SymEigsSolver(const OpType& op_, uword nev_, uword ncv_); //! Providing the initial residual vector for the algorithm. inline void init(eT* init_resid); //! Providing a random initial residual vector. inline void init(); //! Conducting the major computation procedure. inline uword compute(uword maxit = 1000, eT tol = 1e-10); //! Returning the number of iterations used in the computation. inline uword num_iterations() { return niter; } //! Returning the number of matrix operations used in the computation. inline uword num_operations() { return nmatop; } //! Returning the converged eigenvalues. inline Col eigenvalues(); //! Returning the eigenvectors associated with the converged eigenvalues. inline Mat eigenvectors(uword nvec); //! Returning all converged eigenvectors. inline Mat eigenvectors() { return eigenvectors(nev); } }; } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/fn_regspace.hpp0000644000176200001440000001316414124060717023364 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_regspace //! @{ template inline void internal_regspace_default_delta ( Mat& x, const typename Mat::pod_type start, const typename Mat::pod_type end ) { arma_extra_debug_sigprint(); typedef typename Mat::pod_type T; const bool ascend = (start <= end); const uword N = uword(1) + uword((ascend) ? (end-start) : (start-end)); x.set_size(N); eT* x_mem = x.memptr(); if(ascend) { for(uword i=0; i < N; ++i) { x_mem[i] = eT(start + T(i)); } } else { for(uword i=0; i < N; ++i) { x_mem[i] = eT(start - T(i)); } } } template inline typename enable_if2< (is_signed::value == true), void >::result internal_regspace_var_delta ( Mat& x, const typename Mat::pod_type start, const sT delta, const typename Mat::pod_type end ) { arma_extra_debug_sigprint(); arma_extra_debug_print("internal_regspace_var_delta(): signed version"); typedef typename Mat::pod_type T; if( ((start < end) && (delta < sT(0))) || ((start > end) && (delta > sT(0))) || (delta == sT(0)) ) { return; } const bool ascend = (start <= end); const T inc = (delta < sT(0)) ? T(-delta) : T(delta); const T M = ((ascend) ? T(end-start) : T(start-end)) / T(inc); const uword N = uword(1) + ( (is_non_integral::value) ? uword(std::floor(double(M))) : uword(M) ); x.set_size(N); eT* x_mem = x.memptr(); if(ascend) { for(uword i=0; i < N; ++i) { x_mem[i] = eT( start + T(i*inc) ); } } else { for(uword i=0; i < N; ++i) { x_mem[i] = eT( start - T(i*inc) ); } } } template inline typename enable_if2< (is_signed::value == false), void >::result internal_regspace_var_delta ( Mat& x, const typename Mat::pod_type start, const uT delta, const typename Mat::pod_type end ) { arma_extra_debug_sigprint(); arma_extra_debug_print("internal_regspace_var_delta(): unsigned version"); typedef typename Mat::pod_type T; if( ((start > end) && (delta > uT(0))) || (delta == uT(0)) ) { return; } const bool ascend = (start <= end); const T inc = T(delta); const T M = ((ascend) ? T(end-start) : T(start-end)) / T(inc); const uword N = uword(1) + ( (is_non_integral::value) ? uword(std::floor(double(M))) : uword(M) ); x.set_size(N); eT* x_mem = x.memptr(); if(ascend) { for(uword i=0; i < N; ++i) { x_mem[i] = eT( start + T(i*inc) ); } } else { for(uword i=0; i < N; ++i) { x_mem[i] = eT( start - T(i*inc) ); } } } template inline typename enable_if2< is_Mat::value && (is_signed::value == true), vec_type >::result regspace ( const typename vec_type::pod_type start, const sT delta, const typename vec_type::pod_type end ) { arma_extra_debug_sigprint(); arma_extra_debug_print("regspace(): signed version"); vec_type x; if( ((delta == sT(+1)) && (start <= end)) || ((delta == sT(-1)) && (start > end)) ) { internal_regspace_default_delta(x, start, end); } else { internal_regspace_var_delta(x, start, delta, end); } if(x.n_elem == 0) { if(is_Mat_only::value) { x.set_size(1,0); } } return x; } template inline typename enable_if2< is_Mat::value && (is_signed::value == false), vec_type >::result regspace ( const typename vec_type::pod_type start, const uT delta, const typename vec_type::pod_type end ) { arma_extra_debug_sigprint(); arma_extra_debug_print("regspace(): unsigned version"); vec_type x; if( (delta == uT(+1)) && (start <= end) ) { internal_regspace_default_delta(x, start, end); } else { internal_regspace_var_delta(x, start, delta, end); } if(x.n_elem == 0) { if(is_Mat_only::value) { x.set_size(1,0); } } return x; } template arma_warn_unused inline typename enable_if2 < is_Mat::value, vec_type >::result regspace ( const typename vec_type::pod_type start, const typename vec_type::pod_type end ) { arma_extra_debug_sigprint(); vec_type x; internal_regspace_default_delta(x, start, end); if(x.n_elem == 0) { if(is_Mat_only::value) { x.set_size(1,0); } } return x; } arma_warn_unused inline vec regspace(const double start, const double delta, const double end) { arma_extra_debug_sigprint(); return regspace(start, delta, end); } arma_warn_unused inline vec regspace(const double start, const double end) { arma_extra_debug_sigprint(); return regspace(start, end); } //! @} RcppArmadillo/inst/include/armadillo_bits/Cube_meat.hpp0000644000176200001440000036302314160256234022777 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup Cube //! @{ template inline Cube::~Cube() { arma_extra_debug_sigprint_this(this); delete_mat(); if( (mem_state == 0) && (n_alloc > 0) ) { arma_extra_debug_print("Cube::destructor: releasing memory"); memory::release( access::rw(mem) ); } // try to expose buggy user code that accesses deleted objects if(arma_config::debug) { access::rw(mem) = nullptr; access::rw(mat_ptrs) = nullptr; } arma_type_check(( is_supported_elem_type::value == false )); } template inline Cube::Cube() : n_rows(0) , n_cols(0) , n_elem_slice(0) , n_slices(0) , n_elem(0) , n_alloc(0) , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); } //! construct the cube to have user specified dimensions template inline Cube::Cube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices) : n_rows(in_n_rows) , n_cols(in_n_cols) , n_elem_slice(in_n_rows*in_n_cols) , n_slices(in_n_slices) , n_elem(in_n_rows*in_n_cols*in_n_slices) , n_alloc() , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); #if (!defined(ARMA_DONT_ZERO_INIT)) { arma_extra_debug_print("Cube::constructor: zeroing memory"); arrayops::fill_zeros(memptr(), n_elem); } #endif } template inline Cube::Cube(const SizeCube& s) : n_rows(s.n_rows) , n_cols(s.n_cols) , n_elem_slice(s.n_rows*s.n_cols) , n_slices(s.n_slices) , n_elem(s.n_rows*s.n_cols*s.n_slices) , n_alloc() , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); #if (!defined(ARMA_DONT_ZERO_INIT)) { arma_extra_debug_print("Cube::constructor: zeroing memory"); arrayops::fill_zeros(memptr(), n_elem); } #endif } //! internal use only template template inline Cube::Cube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices, const arma_initmode_indicator&) : n_rows(in_n_rows) , n_cols(in_n_cols) , n_elem_slice(in_n_rows*in_n_cols) , n_slices(in_n_slices) , n_elem(in_n_rows*in_n_cols*in_n_slices) , n_alloc() , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); if(do_zeros) { arma_extra_debug_print("Cube::constructor: zeroing memory"); arrayops::fill_zeros(memptr(), n_elem); } } //! internal use only template template inline Cube::Cube(const SizeCube& s, const arma_initmode_indicator&) : n_rows(s.n_rows) , n_cols(s.n_cols) , n_elem_slice(s.n_rows*s.n_cols) , n_slices(s.n_slices) , n_elem(s.n_rows*s.n_cols*s.n_slices) , n_alloc() , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); if(do_zeros) { arma_extra_debug_print("Cube::constructor: zeroing memory"); arrayops::fill_zeros(memptr(), n_elem); } } //! construct the cube to have user specified dimensions and fill with specified pattern template template inline Cube::Cube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices, const fill::fill_class&) : n_rows(in_n_rows) , n_cols(in_n_cols) , n_elem_slice(in_n_rows*in_n_cols) , n_slices(in_n_slices) , n_elem(in_n_rows*in_n_cols*in_n_slices) , n_alloc() , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); if(is_same_type::yes) { (*this).zeros(); } if(is_same_type::yes) { (*this).ones(); } if(is_same_type::yes) { (*this).randu(); } if(is_same_type::yes) { (*this).randn(); } arma_static_check( (is_same_type::yes), "Cube::Cube(): unsupported fill type" ); } template template inline Cube::Cube(const SizeCube& s, const fill::fill_class&) : n_rows(s.n_rows) , n_cols(s.n_cols) , n_elem_slice(s.n_rows*s.n_cols) , n_slices(s.n_slices) , n_elem(s.n_rows*s.n_cols*s.n_slices) , n_alloc() , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); if(is_same_type::yes) { (*this).zeros(); } if(is_same_type::yes) { (*this).ones(); } if(is_same_type::yes) { (*this).randu(); } if(is_same_type::yes) { (*this).randn(); } arma_static_check( (is_same_type::yes), "Cube::Cube(): unsupported fill type" ); } //! construct the cube to have user specified dimensions and fill with specified value template inline Cube::Cube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices, const fill::scalar_holder f) : n_rows(in_n_rows) , n_cols(in_n_cols) , n_elem_slice(in_n_rows*in_n_cols) , n_slices(in_n_slices) , n_elem(in_n_rows*in_n_cols*in_n_slices) , n_alloc() , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); (*this).fill(f.scalar); } template inline Cube::Cube(const SizeCube& s, const fill::scalar_holder f) : n_rows(s.n_rows) , n_cols(s.n_cols) , n_elem_slice(s.n_rows*s.n_cols) , n_slices(s.n_slices) , n_elem(s.n_rows*s.n_cols*s.n_slices) , n_alloc() , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); (*this).fill(f.scalar); } template inline Cube::Cube(Cube&& in_cube) : n_rows(0) , n_cols(0) , n_elem_slice(0) , n_slices(0) , n_elem(0) , n_alloc(0) , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); arma_extra_debug_sigprint(arma_str::format("this = %x in_cube = %x") % this % &in_cube); (*this).steal_mem(in_cube); } template inline Cube& Cube::operator=(Cube&& in_cube) { arma_extra_debug_sigprint(arma_str::format("this = %x in_cube = %x") % this % &in_cube); (*this).steal_mem(in_cube); return *this; } template inline void Cube::init_cold() { arma_extra_debug_sigprint( arma_str::format("n_rows = %d, n_cols = %d, n_slices = %d") % n_rows % n_cols % n_slices ); #if defined(ARMA_64BIT_WORD) const char* error_message = "Cube::init(): requested size is too large"; #else const char* error_message = "Cube::init(): requested size is too large; suggest to enable ARMA_64BIT_WORD"; #endif arma_debug_check ( ( ( (n_rows > 0x0FFF) || (n_cols > 0x0FFF) || (n_slices > 0xFF) ) ? ( (double(n_rows) * double(n_cols) * double(n_slices)) > double(ARMA_MAX_UWORD) ) : false ), error_message ); if(n_elem <= Cube_prealloc::mem_n_elem) { if(n_elem > 0) { arma_extra_debug_print("Cube::init(): using local memory"); } access::rw(mem) = (n_elem == 0) ? nullptr : mem_local; access::rw(n_alloc) = 0; } else { arma_extra_debug_print("Cube::init(): acquiring memory"); access::rw(mem) = memory::acquire(n_elem); access::rw(n_alloc) = n_elem; } create_mat(); } template inline void Cube::init_warm(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices) { arma_extra_debug_sigprint( arma_str::format("in_n_rows = %d, in_n_cols = %d, in_n_slices = %d") % in_n_rows % in_n_cols % in_n_slices ); if( (n_rows == in_n_rows) && (n_cols == in_n_cols) && (n_slices == in_n_slices) ) { return; } const uword t_mem_state = mem_state; bool err_state = false; char* err_msg = nullptr; arma_debug_set_error( err_state, err_msg, (t_mem_state == 3), "Cube::init(): size is fixed and hence cannot be changed" ); #if defined(ARMA_64BIT_WORD) const char* error_message = "Cube::init(): requested size is too large"; #else const char* error_message = "Cube::init(): requested size is too large; suggest to enable ARMA_64BIT_WORD"; #endif arma_debug_set_error ( err_state, err_msg, ( ( (in_n_rows > 0x0FFF) || (in_n_cols > 0x0FFF) || (in_n_slices > 0xFF) ) ? ( (double(in_n_rows) * double(in_n_cols) * double(in_n_slices)) > double(ARMA_MAX_UWORD) ) : false ), error_message ); arma_debug_check(err_state, err_msg); const uword old_n_elem = n_elem; const uword new_n_elem = in_n_rows * in_n_cols * in_n_slices; if(old_n_elem == new_n_elem) { arma_extra_debug_print("Cube::init(): reusing memory"); delete_mat(); access::rw(n_rows) = in_n_rows; access::rw(n_cols) = in_n_cols; access::rw(n_elem_slice) = in_n_rows*in_n_cols; access::rw(n_slices) = in_n_slices; create_mat(); return; } arma_debug_check( (t_mem_state == 2), "Cube::init(): mismatch between size of auxiliary memory and requested size" ); delete_mat(); if(new_n_elem <= Cube_prealloc::mem_n_elem) { if(n_alloc > 0) { arma_extra_debug_print("Cube::init(): releasing memory"); memory::release( access::rw(mem) ); } if(new_n_elem > 0) { arma_extra_debug_print("Cube::init(): using local memory"); } access::rw(mem) = (new_n_elem == 0) ? nullptr : mem_local; access::rw(n_alloc) = 0; } else // condition: new_n_elem > Cube_prealloc::mem_n_elem { if(new_n_elem > n_alloc) { if(n_alloc > 0) { arma_extra_debug_print("Cube::init(): releasing memory"); memory::release( access::rw(mem) ); // in case memory::acquire() throws an exception access::rw(mem) = nullptr; access::rw(n_rows) = 0; access::rw(n_cols) = 0; access::rw(n_elem_slice) = 0; access::rw(n_slices) = 0; access::rw(n_elem) = 0; access::rw(n_alloc) = 0; } arma_extra_debug_print("Cube::init(): acquiring memory"); access::rw(mem) = memory::acquire(new_n_elem); access::rw(n_alloc) = new_n_elem; } else // condition: new_n_elem <= n_alloc { arma_extra_debug_print("Cube::init(): reusing memory"); } } access::rw(n_rows) = in_n_rows; access::rw(n_cols) = in_n_cols; access::rw(n_elem_slice) = in_n_rows*in_n_cols; access::rw(n_slices) = in_n_slices; access::rw(n_elem) = new_n_elem; access::rw(mem_state) = 0; create_mat(); } //! for constructing a complex cube out of two non-complex cubes template template inline void Cube::init ( const BaseCube::pod_type,T1>& X, const BaseCube::pod_type,T2>& Y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type T; arma_type_check(( is_cx::no )); //!< compile-time abort if eT is not std::complex arma_type_check(( is_cx< T>::yes )); //!< compile-time abort if T is std::complex arma_type_check(( is_same_type< std::complex, eT >::no )); //!< compile-time abort if types are not compatible const ProxyCube PX(X.get_ref()); const ProxyCube PY(Y.get_ref()); arma_debug_assert_same_size(PX, PY, "Cube()"); const uword local_n_rows = PX.get_n_rows(); const uword local_n_cols = PX.get_n_cols(); const uword local_n_slices = PX.get_n_slices(); init_warm(local_n_rows, local_n_cols, local_n_slices); eT* out_mem = (*this).memptr(); const bool use_at = ( ProxyCube::use_at || ProxyCube::use_at ); if(use_at == false) { typedef typename ProxyCube::ea_type ea_type1; typedef typename ProxyCube::ea_type ea_type2; const uword N = n_elem; ea_type1 A = PX.get_ea(); ea_type2 B = PY.get_ea(); for(uword i=0; i(A[i], B[i]); } } else { for(uword uslice = 0; uslice < local_n_slices; ++uslice) for(uword ucol = 0; ucol < local_n_cols; ++ucol ) for(uword urow = 0; urow < local_n_rows; ++urow ) { *out_mem = std::complex( PX.at(urow,ucol,uslice), PY.at(urow,ucol,uslice) ); out_mem++; } } } template inline void Cube::delete_mat() { arma_extra_debug_sigprint(); if((n_slices > 0) && (mat_ptrs != nullptr)) { for(uword uslice = 0; uslice < n_slices; ++uslice) { if(mat_ptrs[uslice] != nullptr) { delete access::rw(mat_ptrs[uslice]); } } if( (mem_state <= 2) && (n_slices > Cube_prealloc::mat_ptrs_size) ) { delete [] mat_ptrs; } } } template inline void Cube::create_mat() { arma_extra_debug_sigprint(); if(n_slices == 0) { access::rw(mat_ptrs) = nullptr; } else { if(mem_state <= 2) { if(n_slices <= Cube_prealloc::mat_ptrs_size) { access::rw(mat_ptrs) = const_cast< const Mat** >(mat_ptrs_local); } else { access::rw(mat_ptrs) = new(std::nothrow) const Mat*[n_slices]; arma_check_bad_alloc( (mat_ptrs == nullptr), "Cube::create_mat(): out of memory" ); } } for(uword uslice = 0; uslice < n_slices; ++uslice) { mat_ptrs[uslice] = nullptr; } } } //! Set the cube to be equal to the specified scalar. //! NOTE: the size of the cube will be 1x1x1 template inline Cube& Cube::operator=(const eT val) { arma_extra_debug_sigprint(); init_warm(1,1,1); access::rw(mem[0]) = val; return *this; } //! In-place addition of a scalar to all elements of the cube template inline Cube& Cube::operator+=(const eT val) { arma_extra_debug_sigprint(); arrayops::inplace_plus( memptr(), val, n_elem ); return *this; } //! In-place subtraction of a scalar from all elements of the cube template inline Cube& Cube::operator-=(const eT val) { arma_extra_debug_sigprint(); arrayops::inplace_minus( memptr(), val, n_elem ); return *this; } //! In-place multiplication of all elements of the cube with a scalar template inline Cube& Cube::operator*=(const eT val) { arma_extra_debug_sigprint(); arrayops::inplace_mul( memptr(), val, n_elem ); return *this; } //! In-place division of all elements of the cube with a scalar template inline Cube& Cube::operator/=(const eT val) { arma_extra_debug_sigprint(); arrayops::inplace_div( memptr(), val, n_elem ); return *this; } //! construct a cube from a given cube template inline Cube::Cube(const Cube& x) : n_rows(x.n_rows) , n_cols(x.n_cols) , n_elem_slice(x.n_elem_slice) , n_slices(x.n_slices) , n_elem(x.n_elem) , n_alloc() , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); arma_extra_debug_sigprint(arma_str::format("this = %x in_cube = %x") % this % &x); init_cold(); arrayops::copy( memptr(), x.mem, n_elem ); } //! construct a cube from a given cube template inline Cube& Cube::operator=(const Cube& x) { arma_extra_debug_sigprint(arma_str::format("this = %x in_cube = %x") % this % &x); if(this != &x) { init_warm(x.n_rows, x.n_cols, x.n_slices); arrayops::copy( memptr(), x.mem, n_elem ); } return *this; } //! construct a cube from a given auxiliary array of eTs. //! if copy_aux_mem is true, new memory is allocated and the array is copied. //! if copy_aux_mem is false, the auxiliary array is used directly (without allocating memory and copying). template inline Cube::Cube(eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const uword aux_n_slices, const bool copy_aux_mem, const bool strict, const bool prealloc_mat) : n_rows ( aux_n_rows ) , n_cols ( aux_n_cols ) , n_elem_slice( aux_n_rows*aux_n_cols ) , n_slices ( aux_n_slices ) , n_elem ( aux_n_rows*aux_n_cols*aux_n_slices ) , n_alloc ( 0 ) , mem_state ( copy_aux_mem ? 0 : (strict ? 2 : 1) ) , mem ( copy_aux_mem ? nullptr : aux_mem ) , mat_ptrs ( nullptr ) { arma_extra_debug_sigprint_this(this); if(prealloc_mat) { arma_debug_warn_level(3, "Cube::Cube(): parameter 'prealloc_mat' ignored as it's no longer used"); } if(copy_aux_mem) { init_cold(); arrayops::copy( memptr(), aux_mem, n_elem ); } else { create_mat(); } } //! construct a cube from a given auxiliary read-only array of eTs. //! the array is copied. template inline Cube::Cube(const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const uword aux_n_slices) : n_rows(aux_n_rows) , n_cols(aux_n_cols) , n_elem_slice(aux_n_rows*aux_n_cols) , n_slices(aux_n_slices) , n_elem(aux_n_rows*aux_n_cols*aux_n_slices) , n_alloc() , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); arrayops::copy( memptr(), aux_mem, n_elem ); } //! in-place cube addition template inline Cube& Cube::operator+=(const Cube& m) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(*this, m, "addition"); arrayops::inplace_plus( memptr(), m.memptr(), n_elem ); return *this; } //! in-place cube subtraction template inline Cube& Cube::operator-=(const Cube& m) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(*this, m, "subtraction"); arrayops::inplace_minus( memptr(), m.memptr(), n_elem ); return *this; } //! in-place element-wise cube multiplication template inline Cube& Cube::operator%=(const Cube& m) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(*this, m, "element-wise multiplication"); arrayops::inplace_mul( memptr(), m.memptr(), n_elem ); return *this; } //! in-place element-wise cube division template inline Cube& Cube::operator/=(const Cube& m) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(*this, m, "element-wise division"); arrayops::inplace_div( memptr(), m.memptr(), n_elem ); return *this; } //! for constructing a complex cube out of two non-complex cubes template template inline Cube::Cube ( const BaseCube::pod_type,T1>& A, const BaseCube::pod_type,T2>& B ) : n_rows(0) , n_cols(0) , n_elem_slice(0) , n_slices(0) , n_elem(0) , n_alloc(0) , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init(A,B); } //! construct a cube from a subview_cube instance (eg. construct a cube from a delayed subcube operation) template inline Cube::Cube(const subview_cube& X) : n_rows(X.n_rows) , n_cols(X.n_cols) , n_elem_slice(X.n_elem_slice) , n_slices(X.n_slices) , n_elem(X.n_elem) , n_alloc() , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); subview_cube::extract(*this, X); } //! construct a cube from a subview_cube instance (eg. construct a cube from a delayed subcube operation) template inline Cube& Cube::operator=(const subview_cube& X) { arma_extra_debug_sigprint(); const bool alias = (this == &(X.m)); if(alias == false) { init_warm(X.n_rows, X.n_cols, X.n_slices); subview_cube::extract(*this, X); } else { Cube tmp(X); steal_mem(tmp); } return *this; } //! in-place cube addition (using a subcube on the right-hand-side) template inline Cube& Cube::operator+=(const subview_cube& X) { arma_extra_debug_sigprint(); subview_cube::plus_inplace(*this, X); return *this; } //! in-place cube subtraction (using a subcube on the right-hand-side) template inline Cube& Cube::operator-=(const subview_cube& X) { arma_extra_debug_sigprint(); subview_cube::minus_inplace(*this, X); return *this; } //! in-place element-wise cube mutiplication (using a subcube on the right-hand-side) template inline Cube& Cube::operator%=(const subview_cube& X) { arma_extra_debug_sigprint(); subview_cube::schur_inplace(*this, X); return *this; } //! in-place element-wise cube division (using a subcube on the right-hand-side) template inline Cube& Cube::operator/=(const subview_cube& X) { arma_extra_debug_sigprint(); subview_cube::div_inplace(*this, X); return *this; } template template inline Cube::Cube(const subview_cube_slices& X) : n_rows(0) , n_cols(0) , n_elem_slice(0) , n_slices(0) , n_elem(0) , n_alloc(0) , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); subview_cube_slices::extract(*this, X); } template template inline Cube& Cube::operator=(const subview_cube_slices& X) { arma_extra_debug_sigprint(); const bool alias = (this == &(X.m)); if(alias == false) { subview_cube_slices::extract(*this, X); } else { Cube tmp(X); steal_mem(tmp); } return *this; } template template inline Cube& Cube::operator+=(const subview_cube_slices& X) { arma_extra_debug_sigprint(); subview_cube_slices::plus_inplace(*this, X); return *this; } template template inline Cube& Cube::operator-=(const subview_cube_slices& X) { arma_extra_debug_sigprint(); subview_cube_slices::minus_inplace(*this, X); return *this; } template template inline Cube& Cube::operator%=(const subview_cube_slices& X) { arma_extra_debug_sigprint(); subview_cube_slices::schur_inplace(*this, X); return *this; } template template inline Cube& Cube::operator/=(const subview_cube_slices& X) { arma_extra_debug_sigprint(); subview_cube_slices::div_inplace(*this, X); return *this; } //! creation of subview_cube (subcube comprised of specified row) template arma_inline subview_cube Cube::row(const uword in_row) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (in_row >= n_rows), "Cube::row(): index out of bounds" ); return (*this).rows(in_row, in_row); } //! creation of subview_cube (subcube comprised of specified row) template arma_inline const subview_cube Cube::row(const uword in_row) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (in_row >= n_rows), "Cube::row(): index out of bounds" ); return (*this).rows(in_row, in_row); } //! creation of subview_cube (subcube comprised of specified column) template arma_inline subview_cube Cube::col(const uword in_col) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (in_col >= n_cols), "Cube::col(): index out of bounds" ); return (*this).cols(in_col, in_col); } //! creation of subview_cube (subcube comprised of specified column) template arma_inline const subview_cube Cube::col(const uword in_col) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (in_col >= n_cols), "Cube::col(): index out of bounds" ); return (*this).cols(in_col, in_col); } //! provide the reference to the matrix representing a single slice template inline Mat& Cube::slice(const uword in_slice) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (in_slice >= n_slices), "Cube::slice(): index out of bounds" ); if(mat_ptrs[in_slice] == nullptr) { const eT* ptr = (n_elem_slice > 0) ? slice_memptr(in_slice) : nullptr; mat_ptrs[in_slice] = new Mat('j', ptr, n_rows, n_cols); } return const_cast< Mat& >( *(mat_ptrs[in_slice]) ); } //! provide the reference to the matrix representing a single slice template inline const Mat& Cube::slice(const uword in_slice) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (in_slice >= n_slices), "Cube::slice(): index out of bounds" ); if(mat_ptrs[in_slice] == nullptr) { const eT* ptr = (n_elem_slice > 0) ? slice_memptr(in_slice) : nullptr; mat_ptrs[in_slice] = new Mat('j', ptr, n_rows, n_cols); } return *(mat_ptrs[in_slice]); } //! creation of subview_cube (subcube comprised of specified rows) template arma_inline subview_cube Cube::rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_row2 >= n_rows), "Cube::rows(): indices out of bounds or incorrectly used" ); const uword subcube_n_rows = in_row2 - in_row1 + 1; return subview_cube(*this, in_row1, 0, 0, subcube_n_rows, n_cols, n_slices); } //! creation of subview_cube (subcube comprised of specified rows) template arma_inline const subview_cube Cube::rows(const uword in_row1, const uword in_row2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_row2 >= n_rows), "Cube::rows(): indices out of bounds or incorrectly used" ); const uword subcube_n_rows = in_row2 - in_row1 + 1; return subview_cube(*this, in_row1, 0, 0, subcube_n_rows, n_cols, n_slices); } //! creation of subview_cube (subcube comprised of specified columns) template arma_inline subview_cube Cube::cols(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_col1 > in_col2) || (in_col2 >= n_cols), "Cube::cols(): indices out of bounds or incorrectly used" ); const uword subcube_n_cols = in_col2 - in_col1 + 1; return subview_cube(*this, 0, in_col1, 0, n_rows, subcube_n_cols, n_slices); } //! creation of subview_cube (subcube comprised of specified columns) template arma_inline const subview_cube Cube::cols(const uword in_col1, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_col1 > in_col2) || (in_col2 >= n_cols), "Cube::cols(): indices out of bounds or incorrectly used" ); const uword subcube_n_cols = in_col2 - in_col1 + 1; return subview_cube(*this, 0, in_col1, 0, n_rows, subcube_n_cols, n_slices); } //! creation of subview_cube (subcube comprised of specified slices) template arma_inline subview_cube Cube::slices(const uword in_slice1, const uword in_slice2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_slice1 > in_slice2) || (in_slice2 >= n_slices), "Cube::slices(): indices out of bounds or incorrectly used" ); const uword subcube_n_slices = in_slice2 - in_slice1 + 1; return subview_cube(*this, 0, 0, in_slice1, n_rows, n_cols, subcube_n_slices); } //! creation of subview_cube (subcube comprised of specified slices) template arma_inline const subview_cube Cube::slices(const uword in_slice1, const uword in_slice2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_slice1 > in_slice2) || (in_slice2 >= n_slices), "Cube::slices(): indices out of bounds or incorrectly used" ); const uword subcube_n_slices = in_slice2 - in_slice1 + 1; return subview_cube(*this, 0, 0, in_slice1, n_rows, n_cols, subcube_n_slices); } //! creation of subview_cube (generic subcube) template arma_inline subview_cube Cube::subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_slice1 > in_slice2) || (in_row2 >= n_rows) || (in_col2 >= n_cols) || (in_slice2 >= n_slices), "Cube::subcube(): indices out of bounds or incorrectly used" ); const uword subcube_n_rows = in_row2 - in_row1 + 1; const uword subcube_n_cols = in_col2 - in_col1 + 1; const uword subcube_n_slices = in_slice2 - in_slice1 + 1; return subview_cube(*this, in_row1, in_col1, in_slice1, subcube_n_rows, subcube_n_cols, subcube_n_slices); } //! creation of subview_cube (generic subcube) template arma_inline const subview_cube Cube::subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_slice1 > in_slice2) || (in_row2 >= n_rows) || (in_col2 >= n_cols) || (in_slice2 >= n_slices), "Cube::subcube(): indices out of bounds or incorrectly used" ); const uword subcube_n_rows = in_row2 - in_row1 + 1; const uword subcube_n_cols = in_col2 - in_col1 + 1; const uword subcube_n_slices = in_slice2 - in_slice1 + 1; return subview_cube(*this, in_row1, in_col1, in_slice1, subcube_n_rows, subcube_n_cols, subcube_n_slices); } //! creation of subview_cube (generic subcube) template inline subview_cube Cube::subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) { arma_extra_debug_sigprint(); const uword l_n_rows = n_rows; const uword l_n_cols = n_cols; const uword l_n_slices = n_slices; const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; const uword s_n_slices = s.n_slices; arma_debug_check_bounds ( ( in_row1 >= l_n_rows) || ( in_col1 >= l_n_cols) || ( in_slice1 >= l_n_slices) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols) || ((in_slice1 + s_n_slices) > l_n_slices), "Cube::subcube(): indices or size out of bounds" ); return subview_cube(*this, in_row1, in_col1, in_slice1, s_n_rows, s_n_cols, s_n_slices); } //! creation of subview_cube (generic subcube) template inline const subview_cube Cube::subcube(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const { arma_extra_debug_sigprint(); const uword l_n_rows = n_rows; const uword l_n_cols = n_cols; const uword l_n_slices = n_slices; const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; const uword s_n_slices = s.n_slices; arma_debug_check_bounds ( ( in_row1 >= l_n_rows) || ( in_col1 >= l_n_cols) || ( in_slice1 >= l_n_slices) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols) || ((in_slice1 + s_n_slices) > l_n_slices), "Cube::subcube(): indices or size out of bounds" ); return subview_cube(*this, in_row1, in_col1, in_slice1, s_n_rows, s_n_cols, s_n_slices); } //! creation of subview_cube (generic subcube) template inline subview_cube Cube::subcube(const span& row_span, const span& col_span, const span& slice_span) { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const bool col_all = col_span.whole; const bool slice_all = slice_span.whole; const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword local_n_slices = n_slices; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword subcube_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword subcube_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; const uword in_slice1 = slice_all ? 0 : slice_span.a; const uword in_slice2 = slice_span.b; const uword subcube_n_slices = slice_all ? local_n_slices : in_slice2 - in_slice1 + 1; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) || ( slice_all ? false : ((in_slice1 > in_slice2) || (in_slice2 >= local_n_slices)) ) , "Cube::subcube(): indices out of bounds or incorrectly used" ); return subview_cube(*this, in_row1, in_col1, in_slice1, subcube_n_rows, subcube_n_cols, subcube_n_slices); } //! creation of subview_cube (generic subcube) template inline const subview_cube Cube::subcube(const span& row_span, const span& col_span, const span& slice_span) const { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const bool col_all = col_span.whole; const bool slice_all = slice_span.whole; const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword local_n_slices = n_slices; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword subcube_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword subcube_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; const uword in_slice1 = slice_all ? 0 : slice_span.a; const uword in_slice2 = slice_span.b; const uword subcube_n_slices = slice_all ? local_n_slices : in_slice2 - in_slice1 + 1; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) || ( slice_all ? false : ((in_slice1 > in_slice2) || (in_slice2 >= local_n_slices)) ) , "Cube::subcube(): indices out of bounds or incorrectly used" ); return subview_cube(*this, in_row1, in_col1, in_slice1, subcube_n_rows, subcube_n_cols, subcube_n_slices); } template inline subview_cube Cube::operator()(const span& row_span, const span& col_span, const span& slice_span) { arma_extra_debug_sigprint(); return (*this).subcube(row_span, col_span, slice_span); } template inline const subview_cube Cube::operator()(const span& row_span, const span& col_span, const span& slice_span) const { arma_extra_debug_sigprint(); return (*this).subcube(row_span, col_span, slice_span); } template inline subview_cube Cube::operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) { arma_extra_debug_sigprint(); return (*this).subcube(in_row1, in_col1, in_slice1, s); } template inline const subview_cube Cube::operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const { arma_extra_debug_sigprint(); return (*this).subcube(in_row1, in_col1, in_slice1, s); } template arma_inline subview_cube Cube::tube(const uword in_row1, const uword in_col1) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( ((in_row1 >= n_rows) || (in_col1 >= n_cols)), "Cube::tube(): indices out of bounds" ); return subview_cube(*this, in_row1, in_col1, 0, 1, 1, n_slices); } template arma_inline const subview_cube Cube::tube(const uword in_row1, const uword in_col1) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( ((in_row1 >= n_rows) || (in_col1 >= n_cols)), "Cube::tube(): indices out of bounds" ); return subview_cube(*this, in_row1, in_col1, 0, 1, 1, n_slices); } template arma_inline subview_cube Cube::tube(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols), "Cube::tube(): indices out of bounds or incorrectly used" ); const uword subcube_n_rows = in_row2 - in_row1 + 1; const uword subcube_n_cols = in_col2 - in_col1 + 1; return subview_cube(*this, in_row1, in_col1, 0, subcube_n_rows, subcube_n_cols, n_slices); } template arma_inline const subview_cube Cube::tube(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols), "Cube::tube(): indices out of bounds or incorrectly used" ); const uword subcube_n_rows = in_row2 - in_row1 + 1; const uword subcube_n_cols = in_col2 - in_col1 + 1; return subview_cube(*this, in_row1, in_col1, 0, subcube_n_rows, subcube_n_cols, n_slices); } template arma_inline subview_cube Cube::tube(const uword in_row1, const uword in_col1, const SizeMat& s) { arma_extra_debug_sigprint(); const uword l_n_rows = n_rows; const uword l_n_cols = n_cols; const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; arma_debug_check_bounds ( ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols)), "Cube::tube(): indices or size out of bounds" ); return subview_cube(*this, in_row1, in_col1, 0, s_n_rows, s_n_cols, n_slices); } template arma_inline const subview_cube Cube::tube(const uword in_row1, const uword in_col1, const SizeMat& s) const { arma_extra_debug_sigprint(); const uword l_n_rows = n_rows; const uword l_n_cols = n_cols; const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; arma_debug_check_bounds ( ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols)), "Cube::tube(): indices or size out of bounds" ); return subview_cube(*this, in_row1, in_col1, 0, s_n_rows, s_n_cols, n_slices); } template inline subview_cube Cube::tube(const span& row_span, const span& col_span) { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const bool col_all = col_span.whole; const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword subcube_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword subcube_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "Cube::tube(): indices out of bounds or incorrectly used" ); return subview_cube(*this, in_row1, in_col1, 0, subcube_n_rows, subcube_n_cols, n_slices); } template inline const subview_cube Cube::tube(const span& row_span, const span& col_span) const { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const bool col_all = col_span.whole; const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword subcube_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword subcube_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "Cube::tube(): indices out of bounds or incorrectly used" ); return subview_cube(*this, in_row1, in_col1, 0, subcube_n_rows, subcube_n_cols, n_slices); } template inline subview_cube Cube::head_slices(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_slices), "Cube::head_slices(): size out of bounds" ); return subview_cube(*this, 0, 0, 0, n_rows, n_cols, N); } template inline const subview_cube Cube::head_slices(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_slices), "Cube::head_slices(): size out of bounds" ); return subview_cube(*this, 0, 0, 0, n_rows, n_cols, N); } template inline subview_cube Cube::tail_slices(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_slices), "Cube::tail_slices(): size out of bounds" ); const uword start_slice = n_slices - N; return subview_cube(*this, 0, 0, start_slice, n_rows, n_cols, N); } template inline const subview_cube Cube::tail_slices(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > n_slices), "Cube::tail_slices(): size out of bounds" ); const uword start_slice = n_slices - N; return subview_cube(*this, 0, 0, start_slice, n_rows, n_cols, N); } template template arma_inline subview_elem1 Cube::elem(const Base& a) { arma_extra_debug_sigprint(); return subview_elem1(*this, a); } template template arma_inline const subview_elem1 Cube::elem(const Base& a) const { arma_extra_debug_sigprint(); return subview_elem1(*this, a); } template template arma_inline subview_elem1 Cube::operator()(const Base& a) { arma_extra_debug_sigprint(); return subview_elem1(*this, a); } template template arma_inline const subview_elem1 Cube::operator()(const Base& a) const { arma_extra_debug_sigprint(); return subview_elem1(*this, a); } template arma_inline subview_cube_each1 Cube::each_slice() { arma_extra_debug_sigprint(); return subview_cube_each1(*this); } template arma_inline const subview_cube_each1 Cube::each_slice() const { arma_extra_debug_sigprint(); return subview_cube_each1(*this); } template template inline subview_cube_each2 Cube::each_slice(const Base& indices) { arma_extra_debug_sigprint(); return subview_cube_each2(*this, indices); } template template inline const subview_cube_each2 Cube::each_slice(const Base& indices) const { arma_extra_debug_sigprint(); return subview_cube_each2(*this, indices); } //! apply a lambda function to each slice, where each slice is interpreted as a matrix template inline const Cube& Cube::each_slice(const std::function< void(Mat&) >& F) { arma_extra_debug_sigprint(); for(uword slice_id=0; slice_id < n_slices; ++slice_id) { Mat tmp('j', slice_memptr(slice_id), n_rows, n_cols); F(tmp); } return *this; } template inline const Cube& Cube::each_slice(const std::function< void(const Mat&) >& F) const { arma_extra_debug_sigprint(); for(uword slice_id=0; slice_id < n_slices; ++slice_id) { const Mat tmp('j', slice_memptr(slice_id), n_rows, n_cols); F(tmp); } return *this; } template inline const Cube& Cube::each_slice(const std::function< void(Mat&) >& F, const bool use_mp) { arma_extra_debug_sigprint(); if((use_mp == false) || (arma_config::openmp == false)) { return (*this).each_slice(F); } #if defined(ARMA_USE_OPENMP) { const uword local_n_slices = n_slices; const int n_threads = mp_thread_limit::get(); #pragma omp parallel for schedule(static) num_threads(n_threads) for(uword slice_id=0; slice_id < local_n_slices; ++slice_id) { Mat tmp('j', slice_memptr(slice_id), n_rows, n_cols); F(tmp); } } #endif return *this; } template inline const Cube& Cube::each_slice(const std::function< void(const Mat&) >& F, const bool use_mp) const { arma_extra_debug_sigprint(); if((use_mp == false) || (arma_config::openmp == false)) { return (*this).each_slice(F); } #if defined(ARMA_USE_OPENMP) { const uword local_n_slices = n_slices; const int n_threads = mp_thread_limit::get(); #pragma omp parallel for schedule(static) num_threads(n_threads) for(uword slice_id=0; slice_id < local_n_slices; ++slice_id) { Mat tmp('j', slice_memptr(slice_id), n_rows, n_cols); F(tmp); } } #endif return *this; } template template inline subview_cube_slices Cube::slices(const Base& indices) { arma_extra_debug_sigprint(); return subview_cube_slices(*this, indices); } template template inline const subview_cube_slices Cube::slices(const Base& indices) const { arma_extra_debug_sigprint(); return subview_cube_slices(*this, indices); } //! remove specified row template inline void Cube::shed_row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( row_num >= n_rows, "Cube::shed_row(): index out of bounds" ); shed_rows(row_num, row_num); } //! remove specified column template inline void Cube::shed_col(const uword col_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( col_num >= n_cols, "Cube::shed_col(): index out of bounds" ); shed_cols(col_num, col_num); } //! remove specified slice template inline void Cube::shed_slice(const uword slice_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( slice_num >= n_slices, "Cube::shed_slice(): index out of bounds" ); shed_slices(slice_num, slice_num); } //! remove specified rows template inline void Cube::shed_rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_row2 >= n_rows), "Cube::shed_rows(): indices out of bounds or incorrectly used" ); const uword n_keep_front = in_row1; const uword n_keep_back = n_rows - (in_row2 + 1); Cube X(n_keep_front + n_keep_back, n_cols, n_slices, arma_nozeros_indicator()); if(n_keep_front > 0) { X.rows( 0, (n_keep_front-1) ) = rows( 0, (in_row1-1) ); } if(n_keep_back > 0) { X.rows( n_keep_front, (n_keep_front+n_keep_back-1) ) = rows( (in_row2+1), (n_rows-1) ); } steal_mem(X); } //! remove specified columns template inline void Cube::shed_cols(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_col1 > in_col2) || (in_col2 >= n_cols), "Cube::shed_cols(): indices out of bounds or incorrectly used" ); const uword n_keep_front = in_col1; const uword n_keep_back = n_cols - (in_col2 + 1); Cube X(n_rows, n_keep_front + n_keep_back, n_slices, arma_nozeros_indicator()); if(n_keep_front > 0) { X.cols( 0, (n_keep_front-1) ) = cols( 0, (in_col1-1) ); } if(n_keep_back > 0) { X.cols( n_keep_front, (n_keep_front+n_keep_back-1) ) = cols( (in_col2+1), (n_cols-1) ); } steal_mem(X); } //! remove specified slices template inline void Cube::shed_slices(const uword in_slice1, const uword in_slice2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_slice1 > in_slice2) || (in_slice2 >= n_slices), "Cube::shed_slices(): indices out of bounds or incorrectly used" ); const uword n_keep_front = in_slice1; const uword n_keep_back = n_slices - (in_slice2 + 1); Cube X(n_rows, n_cols, n_keep_front + n_keep_back, arma_nozeros_indicator()); if(n_keep_front > 0) { X.slices( 0, (n_keep_front-1) ) = slices( 0, (in_slice1-1) ); } if(n_keep_back > 0) { X.slices( n_keep_front, (n_keep_front+n_keep_back-1) ) = slices( (in_slice2+1), (n_slices-1) ); } steal_mem(X); } //! remove specified slices template template inline void Cube::shed_slices(const Base& indices) { arma_extra_debug_sigprint(); const quasi_unwrap U(indices.get_ref()); const Mat& tmp1 = U.M; arma_debug_check( ((tmp1.is_vec() == false) && (tmp1.is_empty() == false)), "Cube::shed_slices(): list of indices must be a vector" ); if(tmp1.is_empty()) { return; } const Col tmp2(const_cast(tmp1.memptr()), tmp1.n_elem, false, false); const Col& slices_to_shed = (tmp2.is_sorted("strictascend") == false) ? Col(unique(tmp2)) : Col(const_cast(tmp2.memptr()), tmp2.n_elem, false, false); const uword* slices_to_shed_mem = slices_to_shed.memptr(); const uword N = slices_to_shed.n_elem; if(arma_config::debug) { for(uword i=0; i= n_slices), "Cube::shed_slices(): indices out of bounds" ); } } Col tmp3(n_slices, arma_nozeros_indicator()); uword* tmp3_mem = tmp3.memptr(); uword i = 0; uword count = 0; for(uword j=0; j < n_slices; ++j) { if(i < N) { if( j != slices_to_shed_mem[i] ) { tmp3_mem[count] = j; ++count; } else { ++i; } } else { tmp3_mem[count] = j; ++count; } } const Col slices_to_keep(tmp3.memptr(), count, false, false); Cube X = (*this).slices(slices_to_keep); steal_mem(X); } template inline void Cube::insert_rows(const uword row_num, const uword N, const bool set_to_zero) { arma_extra_debug_sigprint(); const uword t_n_rows = n_rows; const uword A_n_rows = row_num; const uword B_n_rows = t_n_rows - row_num; // insertion at row_num == n_rows is in effect an append operation arma_debug_check_bounds( (row_num > t_n_rows), "Cube::insert_rows(): index out of bounds" ); if(N > 0) { Cube out(t_n_rows + N, n_cols, n_slices, arma_nozeros_indicator()); if(A_n_rows > 0) { out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1); } if(B_n_rows > 0) { out.rows(row_num + N, t_n_rows + N - 1) = rows(row_num, t_n_rows-1); } if(set_to_zero) { out.rows(row_num, row_num + N - 1).zeros(); } steal_mem(out); } } template inline void Cube::insert_cols(const uword col_num, const uword N, const bool set_to_zero) { arma_extra_debug_sigprint(); const uword t_n_cols = n_cols; const uword A_n_cols = col_num; const uword B_n_cols = t_n_cols - col_num; // insertion at col_num == n_cols is in effect an append operation arma_debug_check_bounds( (col_num > t_n_cols), "Cube::insert_cols(): index out of bounds" ); if(N > 0) { Cube out(n_rows, t_n_cols + N, n_slices, arma_nozeros_indicator()); if(A_n_cols > 0) { out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1); } if(B_n_cols > 0) { out.cols(col_num + N, t_n_cols + N - 1) = cols(col_num, t_n_cols-1); } if(set_to_zero) { out.cols(col_num, col_num + N - 1).zeros(); } steal_mem(out); } } //! insert N slices at the specified slice position, //! optionally setting the elements of the inserted slices to zero template inline void Cube::insert_slices(const uword slice_num, const uword N, const bool set_to_zero) { arma_extra_debug_sigprint(); const uword t_n_slices = n_slices; const uword A_n_slices = slice_num; const uword B_n_slices = t_n_slices - slice_num; // insertion at slice_num == n_slices is in effect an append operation arma_debug_check_bounds( (slice_num > t_n_slices), "Cube::insert_slices(): index out of bounds" ); if(N > 0) { Cube out(n_rows, n_cols, t_n_slices + N, arma_nozeros_indicator()); if(A_n_slices > 0) { out.slices(0, A_n_slices-1) = slices(0, A_n_slices-1); } if(B_n_slices > 0) { out.slices(slice_num + N, t_n_slices + N - 1) = slices(slice_num, t_n_slices-1); } if(set_to_zero) { //out.slices(slice_num, slice_num + N - 1).zeros(); for(uword i=slice_num; i < (slice_num + N); ++i) { arrayops::fill_zeros(out.slice_memptr(i), out.n_elem_slice); } } steal_mem(out); } } template template inline void Cube::insert_rows(const uword row_num, const BaseCube& X) { arma_extra_debug_sigprint(); const unwrap_cube tmp(X.get_ref()); const Cube& C = tmp.M; const uword N = C.n_rows; const uword t_n_rows = n_rows; const uword A_n_rows = row_num; const uword B_n_rows = t_n_rows - row_num; // insertion at row_num == n_rows is in effect an append operation arma_debug_check_bounds( (row_num > t_n_rows), "Cube::insert_rows(): index out of bounds" ); arma_debug_check ( ( (C.n_cols != n_cols) || (C.n_slices != n_slices) ), "Cube::insert_rows(): given object has incompatible dimensions" ); if(N > 0) { Cube out(t_n_rows + N, n_cols, n_slices, arma_nozeros_indicator()); if(A_n_rows > 0) { out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1); } if(B_n_rows > 0) { out.rows(row_num + N, t_n_rows + N - 1) = rows(row_num, t_n_rows - 1); } out.rows(row_num, row_num + N - 1) = C; steal_mem(out); } } template template inline void Cube::insert_cols(const uword col_num, const BaseCube& X) { arma_extra_debug_sigprint(); const unwrap_cube tmp(X.get_ref()); const Cube& C = tmp.M; const uword N = C.n_cols; const uword t_n_cols = n_cols; const uword A_n_cols = col_num; const uword B_n_cols = t_n_cols - col_num; // insertion at col_num == n_cols is in effect an append operation arma_debug_check_bounds( (col_num > t_n_cols), "Cube::insert_cols(): index out of bounds" ); arma_debug_check ( ( (C.n_rows != n_rows) || (C.n_slices != n_slices) ), "Cube::insert_cols(): given object has incompatible dimensions" ); if(N > 0) { Cube out(n_rows, t_n_cols + N, n_slices, arma_nozeros_indicator()); if(A_n_cols > 0) { out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1); } if(B_n_cols > 0) { out.cols(col_num + N, t_n_cols + N - 1) = cols(col_num, t_n_cols - 1); } out.cols(col_num, col_num + N - 1) = C; steal_mem(out); } } //! insert the given object at the specified slice position; //! the given object must have the same number of rows and columns as the cube template template inline void Cube::insert_slices(const uword slice_num, const BaseCube& X) { arma_extra_debug_sigprint(); const unwrap_cube tmp(X.get_ref()); const Cube& C = tmp.M; const uword N = C.n_slices; const uword t_n_slices = n_slices; const uword A_n_slices = slice_num; const uword B_n_slices = t_n_slices - slice_num; // insertion at slice_num == n_slices is in effect an append operation arma_debug_check_bounds( (slice_num > t_n_slices), "Cube::insert_slices(): index out of bounds" ); arma_debug_check ( ( (C.n_rows != n_rows) || (C.n_cols != n_cols) ), "Cube::insert_slices(): given object has incompatible dimensions" ); if(N > 0) { Cube out(n_rows, n_cols, t_n_slices + N, arma_nozeros_indicator()); if(A_n_slices > 0) { out.slices(0, A_n_slices-1) = slices(0, A_n_slices-1); } if(B_n_slices > 0) { out.slices(slice_num + N, t_n_slices + N - 1) = slices(slice_num, t_n_slices - 1); } out.slices(slice_num, slice_num + N - 1) = C; steal_mem(out); } } //! create a cube from GenCube, ie. run the previously delayed element generation operations template template inline Cube::Cube(const GenCube& X) : n_rows(X.n_rows) , n_cols(X.n_cols) , n_elem_slice(X.n_rows*X.n_cols) , n_slices(X.n_slices) , n_elem(X.n_rows*X.n_cols*X.n_slices) , n_alloc() , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); X.apply(*this); } template template inline Cube& Cube::operator=(const GenCube& X) { arma_extra_debug_sigprint(); init_warm(X.n_rows, X.n_cols, X.n_slices); X.apply(*this); return *this; } template template inline Cube& Cube::operator+=(const GenCube& X) { arma_extra_debug_sigprint(); X.apply_inplace_plus(*this); return *this; } template template inline Cube& Cube::operator-=(const GenCube& X) { arma_extra_debug_sigprint(); X.apply_inplace_minus(*this); return *this; } template template inline Cube& Cube::operator%=(const GenCube& X) { arma_extra_debug_sigprint(); X.apply_inplace_schur(*this); return *this; } template template inline Cube& Cube::operator/=(const GenCube& X) { arma_extra_debug_sigprint(); X.apply_inplace_div(*this); return *this; } //! create a cube from OpCube, ie. run the previously delayed unary operations template template inline Cube::Cube(const OpCube& X) : n_rows(0) , n_cols(0) , n_elem_slice(0) , n_slices(0) , n_elem(0) , n_alloc(0) , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); op_type::apply(*this, X); } //! create a cube from OpCube, ie. run the previously delayed unary operations template template inline Cube& Cube::operator=(const OpCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); op_type::apply(*this, X); return *this; } //! in-place cube addition, with the right-hand-side operand having delayed operations template template inline Cube& Cube::operator+=(const OpCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const Cube m(X); return (*this).operator+=(m); } //! in-place cube subtraction, with the right-hand-side operand having delayed operations template template inline Cube& Cube::operator-=(const OpCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const Cube m(X); return (*this).operator-=(m); } //! in-place cube element-wise multiplication, with the right-hand-side operand having delayed operations template template inline Cube& Cube::operator%=(const OpCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const Cube m(X); return (*this).operator%=(m); } //! in-place cube element-wise division, with the right-hand-side operand having delayed operations template template inline Cube& Cube::operator/=(const OpCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const Cube m(X); return (*this).operator/=(m); } //! create a cube from eOpCube, ie. run the previously delayed unary operations template template inline Cube::Cube(const eOpCube& X) : n_rows(X.get_n_rows()) , n_cols(X.get_n_cols()) , n_elem_slice(X.get_n_elem_slice()) , n_slices(X.get_n_slices()) , n_elem(X.get_n_elem()) , n_alloc() , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); init_cold(); eop_type::apply(*this, X); } //! create a cube from eOpCube, ie. run the previously delayed unary operations template template inline Cube& Cube::operator=(const eOpCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const bool bad_alias = ( X.P.has_subview && X.P.is_alias(*this) ); if(bad_alias == false) { init_warm(X.get_n_rows(), X.get_n_cols(), X.get_n_slices()); eop_type::apply(*this, X); } else { Cube tmp(X); steal_mem(tmp); } return *this; } //! in-place cube addition, with the right-hand-side operand having delayed operations template template inline Cube& Cube::operator+=(const eOpCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); eop_type::apply_inplace_plus(*this, X); return *this; } //! in-place cube subtraction, with the right-hand-side operand having delayed operations template template inline Cube& Cube::operator-=(const eOpCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); eop_type::apply_inplace_minus(*this, X); return *this; } //! in-place cube element-wise multiplication, with the right-hand-side operand having delayed operations template template inline Cube& Cube::operator%=(const eOpCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); eop_type::apply_inplace_schur(*this, X); return *this; } //! in-place cube element-wise division, with the right-hand-side operand having delayed operations template template inline Cube& Cube::operator/=(const eOpCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); eop_type::apply_inplace_div(*this, X); return *this; } template template inline Cube::Cube(const mtOpCube& X) : n_rows(0) , n_cols(0) , n_elem_slice(0) , n_slices(0) , n_elem(0) , n_alloc(0) , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); op_type::apply(*this, X); } template template inline Cube& Cube::operator=(const mtOpCube& X) { arma_extra_debug_sigprint(); op_type::apply(*this, X); return *this; } template template inline Cube& Cube::operator+=(const mtOpCube& X) { arma_extra_debug_sigprint(); const Cube m(X); return (*this).operator+=(m); } template template inline Cube& Cube::operator-=(const mtOpCube& X) { arma_extra_debug_sigprint(); const Cube m(X); return (*this).operator-=(m); } template template inline Cube& Cube::operator%=(const mtOpCube& X) { arma_extra_debug_sigprint(); const Cube m(X); return (*this).operator%=(m); } template template inline Cube& Cube::operator/=(const mtOpCube& X) { arma_extra_debug_sigprint(); const Cube m(X); return (*this).operator/=(m); } //! create a cube from GlueCube, ie. run the previously delayed binary operations template template inline Cube::Cube(const GlueCube& X) : n_rows(0) , n_cols(0) , n_elem_slice(0) , n_slices(0) , n_elem(0) , n_alloc(0) , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); this->operator=(X); } //! create a cube from GlueCube, ie. run the previously delayed binary operations template template inline Cube& Cube::operator=(const GlueCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); glue_type::apply(*this, X); return *this; } //! in-place cube addition, with the right-hand-side operands having delayed operations template template inline Cube& Cube::operator+=(const GlueCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); const Cube m(X); return (*this).operator+=(m); } //! in-place cube subtraction, with the right-hand-side operands having delayed operations template template inline Cube& Cube::operator-=(const GlueCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); const Cube m(X); return (*this).operator-=(m); } //! in-place cube element-wise multiplication, with the right-hand-side operands having delayed operations template template inline Cube& Cube::operator%=(const GlueCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); const Cube m(X); return (*this).operator%=(m); } //! in-place cube element-wise division, with the right-hand-side operands having delayed operations template template inline Cube& Cube::operator/=(const GlueCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); const Cube m(X); return (*this).operator/=(m); } //! create a cube from eGlueCube, ie. run the previously delayed binary operations template template inline Cube::Cube(const eGlueCube& X) : n_rows(X.get_n_rows()) , n_cols(X.get_n_cols()) , n_elem_slice(X.get_n_elem_slice()) , n_slices(X.get_n_slices()) , n_elem(X.get_n_elem()) , n_alloc() , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); init_cold(); eglue_type::apply(*this, X); } //! create a cube from eGlueCube, ie. run the previously delayed binary operations template template inline Cube& Cube::operator=(const eGlueCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); const bool bad_alias = ( (X.P1.has_subview && X.P1.is_alias(*this)) || (X.P2.has_subview && X.P2.is_alias(*this)) ); if(bad_alias == false) { init_warm(X.get_n_rows(), X.get_n_cols(), X.get_n_slices()); eglue_type::apply(*this, X); } else { Cube tmp(X); steal_mem(tmp); } return *this; } //! in-place cube addition, with the right-hand-side operands having delayed operations template template inline Cube& Cube::operator+=(const eGlueCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); eglue_type::apply_inplace_plus(*this, X); return *this; } //! in-place cube subtraction, with the right-hand-side operands having delayed operations template template inline Cube& Cube::operator-=(const eGlueCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); eglue_type::apply_inplace_minus(*this, X); return *this; } //! in-place cube element-wise multiplication, with the right-hand-side operands having delayed operations template template inline Cube& Cube::operator%=(const eGlueCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); eglue_type::apply_inplace_schur(*this, X); return *this; } //! in-place cube element-wise division, with the right-hand-side operands having delayed operations template template inline Cube& Cube::operator/=(const eGlueCube& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); eglue_type::apply_inplace_div(*this, X); return *this; } template template inline Cube::Cube(const mtGlueCube& X) : n_rows(0) , n_cols(0) , n_elem_slice(0) , n_slices(0) , n_elem(0) , n_alloc(0) , mem_state(0) , mem() , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); glue_type::apply(*this, X); } template template inline Cube& Cube::operator=(const mtGlueCube& X) { arma_extra_debug_sigprint(); glue_type::apply(*this, X); return *this; } template template inline Cube& Cube::operator+=(const mtGlueCube& X) { arma_extra_debug_sigprint(); const Cube m(X); return (*this).operator+=(m); } template template inline Cube& Cube::operator-=(const mtGlueCube& X) { arma_extra_debug_sigprint(); const Cube m(X); return (*this).operator-=(m); } template template inline Cube& Cube::operator%=(const mtGlueCube& X) { arma_extra_debug_sigprint(); const Cube m(X); return (*this).operator%=(m); } template template inline Cube& Cube::operator/=(const mtGlueCube& X) { arma_extra_debug_sigprint(); const Cube m(X); return (*this).operator/=(m); } //! linear element accessor (treats the cube as a vector); no bounds check; assumes memory is aligned template arma_inline arma_warn_unused const eT& Cube::at_alt(const uword i) const { const eT* mem_aligned = mem; memory::mark_as_aligned(mem_aligned); return mem_aligned[i]; } //! linear element accessor (treats the cube as a vector); bounds checking not done when ARMA_NO_DEBUG is defined template arma_inline arma_warn_unused eT& Cube::operator() (const uword i) { arma_debug_check_bounds( (i >= n_elem), "Cube::operator(): index out of bounds" ); return access::rw(mem[i]); } //! linear element accessor (treats the cube as a vector); bounds checking not done when ARMA_NO_DEBUG is defined template arma_inline arma_warn_unused const eT& Cube::operator() (const uword i) const { arma_debug_check_bounds( (i >= n_elem), "Cube::operator(): index out of bounds" ); return mem[i]; } //! linear element accessor (treats the cube as a vector); no bounds check. template arma_inline arma_warn_unused eT& Cube::operator[] (const uword i) { return access::rw(mem[i]); } //! linear element accessor (treats the cube as a vector); no bounds check template arma_inline arma_warn_unused const eT& Cube::operator[] (const uword i) const { return mem[i]; } //! linear element accessor (treats the cube as a vector); no bounds check. template arma_inline arma_warn_unused eT& Cube::at(const uword i) { return access::rw(mem[i]); } //! linear element accessor (treats the cube as a vector); no bounds check template arma_inline arma_warn_unused const eT& Cube::at(const uword i) const { return mem[i]; } //! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined template arma_inline arma_warn_unused eT& Cube::operator() (const uword in_row, const uword in_col, const uword in_slice) { arma_debug_check_bounds ( (in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices) , "Cube::operator(): index out of bounds" ); return access::rw(mem[in_slice*n_elem_slice + in_col*n_rows + in_row]); } //! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined template arma_inline arma_warn_unused const eT& Cube::operator() (const uword in_row, const uword in_col, const uword in_slice) const { arma_debug_check_bounds ( (in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices) , "Cube::operator(): index out of bounds" ); return mem[in_slice*n_elem_slice + in_col*n_rows + in_row]; } //! element accessor; no bounds check template arma_inline arma_warn_unused eT& Cube::at(const uword in_row, const uword in_col, const uword in_slice) { return access::rw( mem[in_slice*n_elem_slice + in_col*n_rows + in_row] ); } //! element accessor; no bounds check template arma_inline arma_warn_unused const eT& Cube::at(const uword in_row, const uword in_col, const uword in_slice) const { return mem[in_slice*n_elem_slice + in_col*n_rows + in_row]; } //! prefix ++ template arma_inline const Cube& Cube::operator++() { Cube_aux::prefix_pp(*this); return *this; } //! postfix ++ (must not return the object by reference) template arma_inline void Cube::operator++(int) { Cube_aux::postfix_pp(*this); } //! prefix -- template arma_inline const Cube& Cube::operator--() { Cube_aux::prefix_mm(*this); return *this; } //! postfix -- (must not return the object by reference) template arma_inline void Cube::operator--(int) { Cube_aux::postfix_mm(*this); } //! returns true if all of the elements are finite template inline arma_warn_unused bool Cube::is_finite() const { arma_extra_debug_sigprint(); return arrayops::is_finite( memptr(), n_elem ); } //! returns true if the cube has no elements template arma_inline arma_warn_unused bool Cube::is_empty() const { return (n_elem == 0); } template inline arma_warn_unused bool Cube::has_inf() const { arma_extra_debug_sigprint(); return arrayops::has_inf( memptr(), n_elem ); } template inline arma_warn_unused bool Cube::has_nan() const { arma_extra_debug_sigprint(); return arrayops::has_nan( memptr(), n_elem ); } //! returns true if the given index is currently in range template arma_inline arma_warn_unused bool Cube::in_range(const uword i) const { return (i < n_elem); } //! returns true if the given start and end indices are currently in range template arma_inline arma_warn_unused bool Cube::in_range(const span& x) const { arma_extra_debug_sigprint(); if(x.whole) { return true; } else { const uword a = x.a; const uword b = x.b; return ( (a <= b) && (b < n_elem) ); } } //! returns true if the given location is currently in range template arma_inline arma_warn_unused bool Cube::in_range(const uword in_row, const uword in_col, const uword in_slice) const { return ( (in_row < n_rows) && (in_col < n_cols) && (in_slice < n_slices) ); } template inline arma_warn_unused bool Cube::in_range(const span& row_span, const span& col_span, const span& slice_span) const { arma_extra_debug_sigprint(); const uword in_row1 = row_span.a; const uword in_row2 = row_span.b; const uword in_col1 = col_span.a; const uword in_col2 = col_span.b; const uword in_slice1 = slice_span.a; const uword in_slice2 = slice_span.b; const bool rows_ok = row_span.whole ? true : ( (in_row1 <= in_row2) && (in_row2 < n_rows) ); const bool cols_ok = col_span.whole ? true : ( (in_col1 <= in_col2) && (in_col2 < n_cols) ); const bool slices_ok = slice_span.whole ? true : ( (in_slice1 <= in_slice2) && (in_slice2 < n_slices) ); return ( rows_ok && cols_ok && slices_ok ); } template inline arma_warn_unused bool Cube::in_range(const uword in_row, const uword in_col, const uword in_slice, const SizeCube& s) const { const uword l_n_rows = n_rows; const uword l_n_cols = n_cols; const uword l_n_slices = n_slices; if( ( in_row >= l_n_rows) || ( in_col >= l_n_cols) || ( in_slice >= l_n_slices) || ((in_row + s.n_rows) > l_n_rows) || ((in_col + s.n_cols) > l_n_cols) || ((in_slice + s.n_slices) > l_n_slices) ) { return false; } else { return true; } } //! returns a pointer to array of eTs used by the cube template arma_inline arma_warn_unused eT* Cube::memptr() { return const_cast(mem); } //! returns a pointer to array of eTs used by the cube template arma_inline arma_warn_unused const eT* Cube::memptr() const { return mem; } //! returns a pointer to array of eTs used by the specified slice in the cube template arma_inline arma_warn_unused eT* Cube::slice_memptr(const uword uslice) { return const_cast( &mem[ uslice*n_elem_slice ] ); } //! returns a pointer to array of eTs used by the specified slice in the cube template arma_inline arma_warn_unused const eT* Cube::slice_memptr(const uword uslice) const { return &mem[ uslice*n_elem_slice ]; } //! returns a pointer to array of eTs used by the specified slice in the cube template arma_inline arma_warn_unused eT* Cube::slice_colptr(const uword uslice, const uword col) { return const_cast( &mem[ uslice*n_elem_slice + col*n_rows] ); } //! returns a pointer to array of eTs used by the specified slice in the cube template arma_inline arma_warn_unused const eT* Cube::slice_colptr(const uword uslice, const uword col) const { return &mem[ uslice*n_elem_slice + col*n_rows ]; } //! change the cube to have user specified dimensions (data is not preserved) template inline void Cube::set_size(const uword new_n_rows, const uword new_n_cols, const uword new_n_slices) { arma_extra_debug_sigprint(); init_warm(new_n_rows, new_n_cols, new_n_slices); } //! change the cube to have user specified dimensions (data is preserved) template inline void Cube::reshape(const uword new_n_rows, const uword new_n_cols, const uword new_n_slices) { arma_extra_debug_sigprint(); op_reshape::apply_cube_inplace((*this), new_n_rows, new_n_cols, new_n_slices); } //! change the cube to have user specified dimensions (data is preserved) template inline void Cube::resize(const uword new_n_rows, const uword new_n_cols, const uword new_n_slices) { arma_extra_debug_sigprint(); op_resize::apply_cube_inplace((*this), new_n_rows, new_n_cols, new_n_slices); } template inline void Cube::set_size(const SizeCube& s) { arma_extra_debug_sigprint(); init_warm(s.n_rows, s.n_cols, s.n_slices); } template inline void Cube::reshape(const SizeCube& s) { arma_extra_debug_sigprint(); op_reshape::apply_cube_inplace((*this), s.n_rows, s.n_cols, s.n_slices); } template inline void Cube::resize(const SizeCube& s) { arma_extra_debug_sigprint(); op_resize::apply_cube_inplace((*this), s.n_rows, s.n_cols, s.n_slices); } //! change the cube (without preserving data) to have the same dimensions as the given cube template template inline void Cube::copy_size(const Cube& m) { arma_extra_debug_sigprint(); init_warm(m.n_rows, m.n_cols, m.n_slices); } //! apply a functor to each element template template inline const Cube& Cube::for_each(functor F) { arma_extra_debug_sigprint(); eT* data = memptr(); const uword N = n_elem; uword ii, jj; for(ii=0, jj=1; jj < N; ii+=2, jj+=2) { F(data[ii]); F(data[jj]); } if(ii < N) { F(data[ii]); } return *this; } template template inline const Cube& Cube::for_each(functor F) const { arma_extra_debug_sigprint(); const eT* data = memptr(); const uword N = n_elem; uword ii, jj; for(ii=0, jj=1; jj < N; ii+=2, jj+=2) { F(data[ii]); F(data[jj]); } if(ii < N) { F(data[ii]); } return *this; } //! transform each element in the cube using a functor template template inline const Cube& Cube::transform(functor F) { arma_extra_debug_sigprint(); eT* out_mem = memptr(); const uword N = n_elem; uword ii, jj; for(ii=0, jj=1; jj < N; ii+=2, jj+=2) { eT tmp_ii = out_mem[ii]; eT tmp_jj = out_mem[jj]; tmp_ii = eT( F(tmp_ii) ); tmp_jj = eT( F(tmp_jj) ); out_mem[ii] = tmp_ii; out_mem[jj] = tmp_jj; } if(ii < N) { out_mem[ii] = eT( F(out_mem[ii]) ); } return *this; } //! imbue (fill) the cube with values provided by a functor template template inline const Cube& Cube::imbue(functor F) { arma_extra_debug_sigprint(); eT* out_mem = memptr(); const uword N = n_elem; uword ii, jj; for(ii=0, jj=1; jj < N; ii+=2, jj+=2) { const eT tmp_ii = eT( F() ); const eT tmp_jj = eT( F() ); out_mem[ii] = tmp_ii; out_mem[jj] = tmp_jj; } if(ii < N) { out_mem[ii] = eT( F() ); } return *this; } template inline const Cube& Cube::replace(const eT old_val, const eT new_val) { arma_extra_debug_sigprint(); arrayops::replace(memptr(), n_elem, old_val, new_val); return *this; } template inline const Cube& Cube::clean(const typename get_pod_type::result threshold) { arma_extra_debug_sigprint(); arrayops::clean(memptr(), n_elem, threshold); return *this; } template inline const Cube& Cube::clamp(const eT min_val, const eT max_val) { arma_extra_debug_sigprint(); if(is_cx::no) { arma_debug_check( (access::tmp_real(min_val) > access::tmp_real(max_val)), "Cube::clamp(): min_val must be less than max_val" ); } else { arma_debug_check( (access::tmp_real(min_val) > access::tmp_real(max_val)), "Cube::clamp(): real(min_val) must be less than real(max_val)" ); arma_debug_check( (access::tmp_imag(min_val) > access::tmp_imag(max_val)), "Cube::clamp(): imag(min_val) must be less than imag(max_val)" ); } arrayops::clamp(memptr(), n_elem, min_val, max_val); return *this; } //! fill the cube with the specified value template inline const Cube& Cube::fill(const eT val) { arma_extra_debug_sigprint(); arrayops::inplace_set( memptr(), val, n_elem ); return *this; } template inline const Cube& Cube::zeros() { arma_extra_debug_sigprint(); arrayops::fill_zeros(memptr(), n_elem); return *this; } template inline const Cube& Cube::zeros(const uword new_n_rows, const uword new_n_cols, const uword new_n_slices) { arma_extra_debug_sigprint(); set_size(new_n_rows, new_n_cols, new_n_slices); return (*this).zeros(); } template inline const Cube& Cube::zeros(const SizeCube& s) { arma_extra_debug_sigprint(); return (*this).zeros(s.n_rows, s.n_cols, s.n_slices); } template inline const Cube& Cube::ones() { arma_extra_debug_sigprint(); return (*this).fill(eT(1)); } template inline const Cube& Cube::ones(const uword new_n_rows, const uword new_n_cols, const uword new_n_slices) { arma_extra_debug_sigprint(); set_size(new_n_rows, new_n_cols, new_n_slices); return (*this).fill(eT(1)); } template inline const Cube& Cube::ones(const SizeCube& s) { arma_extra_debug_sigprint(); return (*this).ones(s.n_rows, s.n_cols, s.n_slices); } template inline const Cube& Cube::randu() { arma_extra_debug_sigprint(); arma_rng::randu::fill( memptr(), n_elem ); return *this; } template inline const Cube& Cube::randu(const uword new_n_rows, const uword new_n_cols, const uword new_n_slices) { arma_extra_debug_sigprint(); set_size(new_n_rows, new_n_cols, new_n_slices); return (*this).randu(); } template inline const Cube& Cube::randu(const SizeCube& s) { arma_extra_debug_sigprint(); return (*this).randu(s.n_rows, s.n_cols, s.n_slices); } template inline const Cube& Cube::randn() { arma_extra_debug_sigprint(); arma_rng::randn::fill( memptr(), n_elem ); return *this; } template inline const Cube& Cube::randn(const uword new_n_rows, const uword new_n_cols, const uword new_n_slices) { arma_extra_debug_sigprint(); set_size(new_n_rows, new_n_cols, new_n_slices); return (*this).randn(); } template inline const Cube& Cube::randn(const SizeCube& s) { arma_extra_debug_sigprint(); return (*this).randn(s.n_rows, s.n_cols, s.n_slices); } template inline void Cube::reset() { arma_extra_debug_sigprint(); init_warm(0,0,0); } template inline void Cube::soft_reset() { arma_extra_debug_sigprint(); // don't change the size if the cube has a fixed size if(mem_state <= 1) { reset(); } else { zeros(); } } template template inline void Cube::set_real(const BaseCube::pod_type,T1>& X) { arma_extra_debug_sigprint(); Cube_aux::set_real(*this, X); } template template inline void Cube::set_imag(const BaseCube::pod_type,T1>& X) { arma_extra_debug_sigprint(); Cube_aux::set_imag(*this, X); } template inline arma_warn_unused eT Cube::min() const { arma_extra_debug_sigprint(); if(n_elem == 0) { arma_debug_check(true, "Cube::min(): object has no elements"); return Datum::nan; } return op_min::direct_min(memptr(), n_elem); } template inline arma_warn_unused eT Cube::max() const { arma_extra_debug_sigprint(); if(n_elem == 0) { arma_debug_check(true, "Cube::max(): object has no elements"); return Datum::nan; } return op_max::direct_max(memptr(), n_elem); } template inline eT Cube::min(uword& index_of_min_val) const { arma_extra_debug_sigprint(); if(n_elem == 0) { arma_debug_check(true, "Cube::min(): object has no elements"); index_of_min_val = uword(0); return Datum::nan; } return op_min::direct_min(memptr(), n_elem, index_of_min_val); } template inline eT Cube::max(uword& index_of_max_val) const { arma_extra_debug_sigprint(); if(n_elem == 0) { arma_debug_check(true, "Cube::max(): object has no elements"); index_of_max_val = uword(0); return Datum::nan; } return op_max::direct_max(memptr(), n_elem, index_of_max_val); } template inline eT Cube::min(uword& row_of_min_val, uword& col_of_min_val, uword& slice_of_min_val) const { arma_extra_debug_sigprint(); if(n_elem == 0) { arma_debug_check(true, "Cube::min(): object has no elements"); row_of_min_val = uword(0); col_of_min_val = uword(0); slice_of_min_val = uword(0); return Datum::nan; } uword i; eT val = op_min::direct_min(memptr(), n_elem, i); const uword in_slice = i / n_elem_slice; const uword offset = in_slice * n_elem_slice; const uword j = i - offset; row_of_min_val = j % n_rows; col_of_min_val = j / n_rows; slice_of_min_val = in_slice; return val; } template inline eT Cube::max(uword& row_of_max_val, uword& col_of_max_val, uword& slice_of_max_val) const { arma_extra_debug_sigprint(); if(n_elem == 0) { arma_debug_check(true, "Cube::max(): object has no elements"); row_of_max_val = uword(0); col_of_max_val = uword(0); slice_of_max_val = uword(0); return Datum::nan; } uword i; eT val = op_max::direct_max(memptr(), n_elem, i); const uword in_slice = i / n_elem_slice; const uword offset = in_slice * n_elem_slice; const uword j = i - offset; row_of_max_val = j % n_rows; col_of_max_val = j / n_rows; slice_of_max_val = in_slice; return val; } //! save the cube to a file template inline arma_cold bool Cube::save(const std::string name, const file_type type) const { arma_extra_debug_sigprint(); bool save_okay = false; switch(type) { case raw_ascii: save_okay = diskio::save_raw_ascii(*this, name); break; case arma_ascii: save_okay = diskio::save_arma_ascii(*this, name); break; case raw_binary: save_okay = diskio::save_raw_binary(*this, name); break; case arma_binary: save_okay = diskio::save_arma_binary(*this, name); break; case ppm_binary: save_okay = diskio::save_ppm_binary(*this, name); break; case hdf5_binary: return (*this).save(hdf5_name(name)); break; case hdf5_binary_trans: // kept for compatibility with earlier versions of Armadillo return (*this).save(hdf5_name(name, std::string(), hdf5_opts::trans)); break; default: arma_debug_warn_level(1, "Cube::save(): unsupported file type"); save_okay = false; } if(save_okay == false) { arma_debug_warn_level(3, "Cube::save(): couldn't write; file: ", name); } return save_okay; } template inline arma_cold bool Cube::save(const hdf5_name& spec, const file_type type) const { arma_extra_debug_sigprint(); // handling of hdf5_binary_trans kept for compatibility with earlier versions of Armadillo if( (type != hdf5_binary) && (type != hdf5_binary_trans) ) { arma_stop_runtime_error("Cube::save(): unsupported file type for hdf5_name()"); return false; } const bool do_trans = bool(spec.opts.flags & hdf5_opts::flag_trans ) || (type == hdf5_binary_trans); const bool append = bool(spec.opts.flags & hdf5_opts::flag_append ); const bool replace = bool(spec.opts.flags & hdf5_opts::flag_replace); if(append && replace) { arma_stop_runtime_error("Cube::save(): only one of 'append' or 'replace' options can be used"); return false; } bool save_okay = false; std::string err_msg; if(do_trans) { Cube tmp; op_strans_cube::apply_noalias(tmp, (*this)); save_okay = diskio::save_hdf5_binary(tmp, spec, err_msg); } else { save_okay = diskio::save_hdf5_binary(*this, spec, err_msg); } if(save_okay == false) { if(err_msg.length() > 0) { arma_debug_warn_level(3, "Cube::save(): ", err_msg, "; file: ", spec.filename); } else { arma_debug_warn_level(3, "Cube::save(): couldn't write; file: ", spec.filename); } } return save_okay; } //! save the cube to a stream template inline arma_cold bool Cube::save(std::ostream& os, const file_type type) const { arma_extra_debug_sigprint(); bool save_okay = false; switch(type) { case raw_ascii: save_okay = diskio::save_raw_ascii(*this, os); break; case arma_ascii: save_okay = diskio::save_arma_ascii(*this, os); break; case raw_binary: save_okay = diskio::save_raw_binary(*this, os); break; case arma_binary: save_okay = diskio::save_arma_binary(*this, os); break; case ppm_binary: save_okay = diskio::save_ppm_binary(*this, os); break; default: arma_debug_warn_level(1, "Cube::save(): unsupported file type"); save_okay = false; } if(save_okay == false) { arma_debug_warn_level(3, "Cube::save(): couldn't write to stream"); } return save_okay; } //! load a cube from a file template inline arma_cold bool Cube::load(const std::string name, const file_type type) { arma_extra_debug_sigprint(); bool load_okay = false; std::string err_msg; switch(type) { case auto_detect: load_okay = diskio::load_auto_detect(*this, name, err_msg); break; case raw_ascii: load_okay = diskio::load_raw_ascii(*this, name, err_msg); break; case arma_ascii: load_okay = diskio::load_arma_ascii(*this, name, err_msg); break; case raw_binary: load_okay = diskio::load_raw_binary(*this, name, err_msg); break; case arma_binary: load_okay = diskio::load_arma_binary(*this, name, err_msg); break; case ppm_binary: load_okay = diskio::load_ppm_binary(*this, name, err_msg); break; case hdf5_binary: return (*this).load(hdf5_name(name)); break; case hdf5_binary_trans: // kept for compatibility with earlier versions of Armadillo return (*this).load(hdf5_name(name, std::string(), hdf5_opts::trans)); break; default: arma_debug_warn_level(1, "Cube::load(): unsupported file type"); load_okay = false; } if(load_okay == false) { (*this).soft_reset(); if(err_msg.length() > 0) { arma_debug_warn_level(3, "Cube::load(): ", err_msg, "; file: ", name); } else { arma_debug_warn_level(3, "Cube::load(): couldn't read; file: ", name); } } return load_okay; } template inline arma_cold bool Cube::load(const hdf5_name& spec, const file_type type) { arma_extra_debug_sigprint(); if( (type != hdf5_binary) && (type != hdf5_binary_trans) ) { arma_stop_runtime_error("Cube::load(): unsupported file type for hdf5_name()"); return false; } bool load_okay = false; std::string err_msg; const bool do_trans = bool(spec.opts.flags & hdf5_opts::flag_trans) || (type == hdf5_binary_trans); if(do_trans) { Cube tmp; load_okay = diskio::load_hdf5_binary(tmp, spec, err_msg); if(load_okay) { op_strans_cube::apply_noalias((*this), tmp); } } else { load_okay = diskio::load_hdf5_binary(*this, spec, err_msg); } if(load_okay == false) { (*this).soft_reset(); if(err_msg.length() > 0) { arma_debug_warn_level(3, "Cube::load(): ", err_msg, "; file: ", spec.filename); } else { arma_debug_warn_level(3, "Cube::load(): couldn't read; file: ", spec.filename); } } return load_okay; } //! load a cube from a stream template inline arma_cold bool Cube::load(std::istream& is, const file_type type) { arma_extra_debug_sigprint(); bool load_okay = false; std::string err_msg; switch(type) { case auto_detect: load_okay = diskio::load_auto_detect(*this, is, err_msg); break; case raw_ascii: load_okay = diskio::load_raw_ascii(*this, is, err_msg); break; case arma_ascii: load_okay = diskio::load_arma_ascii(*this, is, err_msg); break; case raw_binary: load_okay = diskio::load_raw_binary(*this, is, err_msg); break; case arma_binary: load_okay = diskio::load_arma_binary(*this, is, err_msg); break; case ppm_binary: load_okay = diskio::load_ppm_binary(*this, is, err_msg); break; default: arma_debug_warn_level(1, "Cube::load(): unsupported file type"); load_okay = false; } if(load_okay == false) { (*this).soft_reset(); if(err_msg.length() > 0) { arma_debug_warn_level(3, "Cube::load(): ", err_msg); } else { arma_debug_warn_level(3, "Cube::load(): couldn't load from stream"); } } return load_okay; } template inline arma_cold bool Cube::quiet_save(const std::string name, const file_type type) const { arma_extra_debug_sigprint(); return (*this).save(name, type); } template inline arma_cold bool Cube::quiet_save(const hdf5_name& spec, const file_type type) const { arma_extra_debug_sigprint(); return (*this).save(spec, type); } template inline arma_cold bool Cube::quiet_save(std::ostream& os, const file_type type) const { arma_extra_debug_sigprint(); return (*this).save(os, type); } template inline arma_cold bool Cube::quiet_load(const std::string name, const file_type type) { arma_extra_debug_sigprint(); return (*this).load(name, type); } template inline arma_cold bool Cube::quiet_load(const hdf5_name& spec, const file_type type) { arma_extra_debug_sigprint(); return (*this).load(spec, type); } template inline arma_cold bool Cube::quiet_load(std::istream& is, const file_type type) { arma_extra_debug_sigprint(); return (*this).load(is, type); } template inline typename Cube::iterator Cube::begin() { arma_extra_debug_sigprint(); return memptr(); } template inline typename Cube::const_iterator Cube::begin() const { arma_extra_debug_sigprint(); return memptr(); } template inline typename Cube::const_iterator Cube::cbegin() const { arma_extra_debug_sigprint(); return memptr(); } template inline typename Cube::iterator Cube::end() { arma_extra_debug_sigprint(); return memptr() + n_elem; } template inline typename Cube::const_iterator Cube::end() const { arma_extra_debug_sigprint(); return memptr() + n_elem; } template inline typename Cube::const_iterator Cube::cend() const { arma_extra_debug_sigprint(); return memptr() + n_elem; } template inline typename Cube::slice_iterator Cube::begin_slice(const uword slice_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (slice_num >= n_slices), "begin_slice(): index out of bounds" ); return slice_memptr(slice_num); } template inline typename Cube::const_slice_iterator Cube::begin_slice(const uword slice_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (slice_num >= n_slices), "begin_slice(): index out of bounds" ); return slice_memptr(slice_num); } template inline typename Cube::slice_iterator Cube::end_slice(const uword slice_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (slice_num >= n_slices), "end_slice(): index out of bounds" ); return slice_memptr(slice_num) + n_elem_slice; } template inline typename Cube::const_slice_iterator Cube::end_slice(const uword slice_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (slice_num >= n_slices), "end_slice(): index out of bounds" ); return slice_memptr(slice_num) + n_elem_slice; } //! resets this cube to an empty matrix template inline void Cube::clear() { reset(); } //! returns true if the cube has no elements template inline bool Cube::empty() const { return (n_elem == 0); } //! returns the number of elements in this cube template inline uword Cube::size() const { return n_elem; } template inline arma_warn_unused eT& Cube::front() { arma_debug_check( (n_elem == 0), "Cube::front(): cube is empty" ); return access::rw(mem[0]); } template inline arma_warn_unused const eT& Cube::front() const { arma_debug_check( (n_elem == 0), "Cube::front(): cube is empty" ); return mem[0]; } template inline arma_warn_unused eT& Cube::back() { arma_debug_check( (n_elem == 0), "Cube::back(): cube is empty" ); return access::rw(mem[n_elem-1]); } template inline arma_warn_unused const eT& Cube::back() const { arma_debug_check( (n_elem == 0), "Cube::back(): cube is empty" ); return mem[n_elem-1]; } template inline void Cube::swap(Cube& B) { Cube& A = (*this); arma_extra_debug_sigprint(arma_str::format("A = %x B = %x") % &A % &B); if( (A.mem_state == 0) && (B.mem_state == 0) && (A.n_elem > Cube_prealloc::mem_n_elem) && (B.n_elem > Cube_prealloc::mem_n_elem) ) { A.delete_mat(); B.delete_mat(); std::swap( access::rw(A.n_rows), access::rw(B.n_rows) ); std::swap( access::rw(A.n_cols), access::rw(B.n_cols) ); std::swap( access::rw(A.n_elem_slice), access::rw(B.n_elem_slice) ); std::swap( access::rw(A.n_slices), access::rw(B.n_slices) ); std::swap( access::rw(A.n_elem), access::rw(B.n_elem) ); std::swap( access::rw(A.mem), access::rw(B.mem) ); A.create_mat(); B.create_mat(); } else if( (A.mem_state == 0) && (B.mem_state == 0) && (A.n_elem <= Cube_prealloc::mem_n_elem) && (B.n_elem <= Cube_prealloc::mem_n_elem) ) { A.delete_mat(); B.delete_mat(); std::swap( access::rw(A.n_rows), access::rw(B.n_rows) ); std::swap( access::rw(A.n_cols), access::rw(B.n_cols) ); std::swap( access::rw(A.n_elem_slice), access::rw(B.n_elem_slice) ); std::swap( access::rw(A.n_slices), access::rw(B.n_slices) ); std::swap( access::rw(A.n_elem), access::rw(B.n_elem) ); const uword N = (std::max)(A.n_elem, B.n_elem); eT* A_mem = A.memptr(); eT* B_mem = B.memptr(); for(uword i=0; i C = A; A.steal_mem(B); B.steal_mem(C); } else { Cube C = B; B.steal_mem(A); A.steal_mem(C); } } } //! try to steal the memory from a given cube; //! if memory can't be stolen, copy the given cube template inline void Cube::steal_mem(Cube& x) { arma_extra_debug_sigprint(); if(this == &x) { return; } if( (mem_state <= 1) && ( (x.n_alloc > Cube_prealloc::mem_n_elem) || (x.mem_state == 1) ) ) { reset(); const uword x_n_slices = x.n_slices; access::rw(n_rows) = x.n_rows; access::rw(n_cols) = x.n_cols; access::rw(n_elem_slice) = x.n_elem_slice; access::rw(n_slices) = x_n_slices; access::rw(n_elem) = x.n_elem; access::rw(n_alloc) = x.n_alloc; access::rw(mem_state) = x.mem_state; access::rw(mem) = x.mem; if(x_n_slices > Cube_prealloc::mat_ptrs_size) { access::rw( mat_ptrs) = x.mat_ptrs; access::rw(x.mat_ptrs) = nullptr; } else { access::rw(mat_ptrs) = const_cast< const Mat** >(mat_ptrs_local); for(uword i=0; i < x_n_slices; ++i) { mat_ptrs[i] = x.mat_ptrs[i]; x.mat_ptrs[i] = nullptr; } } access::rw(x.n_rows) = 0; access::rw(x.n_cols) = 0; access::rw(x.n_elem_slice) = 0; access::rw(x.n_slices) = 0; access::rw(x.n_elem) = 0; access::rw(x.n_alloc) = 0; access::rw(x.mem_state) = 0; access::rw(x.mem) = nullptr; } else { (*this).operator=(x); } } // // Cube::fixed template template arma_inline void Cube::fixed::mem_setup() { arma_extra_debug_sigprint(); if(fixed_n_elem > 0) { access::rw(Cube::n_rows) = fixed_n_rows; access::rw(Cube::n_cols) = fixed_n_cols; access::rw(Cube::n_elem_slice) = fixed_n_rows * fixed_n_cols; access::rw(Cube::n_slices) = fixed_n_slices; access::rw(Cube::n_elem) = fixed_n_elem; access::rw(Cube::n_alloc) = 0; access::rw(Cube::mem_state) = 3; access::rw(Cube::mem) = (fixed_n_elem > Cube_prealloc::mem_n_elem) ? mem_local_extra : mem_local; access::rw(Cube::mat_ptrs) = const_cast< const Mat** >( \ (fixed_n_slices > Cube_prealloc::mat_ptrs_size) ? mat_ptrs_local_extra : mat_ptrs_local ); create_mat(); } else { access::rw(Cube::n_rows) = 0; access::rw(Cube::n_cols) = 0; access::rw(Cube::n_elem_slice) = 0; access::rw(Cube::n_slices) = 0; access::rw(Cube::n_elem) = 0; access::rw(Cube::n_alloc) = 0; access::rw(Cube::mem_state) = 3; access::rw(Cube::mem) = nullptr; access::rw(Cube::mat_ptrs) = nullptr; } } template template inline Cube::fixed::fixed() { arma_extra_debug_sigprint_this(this); mem_setup(); #if (!defined(ARMA_DONT_ZERO_INIT)) { arma_extra_debug_print("Cube::fixed::constructor: zeroing memory"); eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(mem_local[0]); arrayops::fill_zeros(mem_use, fixed_n_elem); } #endif } template template inline Cube::fixed::fixed(const fixed& X) { arma_extra_debug_sigprint_this(this); mem_setup(); eT* dest = (use_extra) ? mem_local_extra : mem_local; const eT* src = (use_extra) ? X.mem_local_extra : X.mem_local; arrayops::copy( dest, src, fixed_n_elem ); } template template inline Cube::fixed::fixed(const fill::scalar_holder f) { arma_extra_debug_sigprint_this(this); mem_setup(); (*this).fill(f.scalar); } template template template inline Cube::fixed::fixed(const fill::fill_class&) { arma_extra_debug_sigprint_this(this); mem_setup(); if(is_same_type::yes) { (*this).zeros(); } if(is_same_type::yes) { (*this).ones(); } if(is_same_type::yes) { (*this).randu(); } if(is_same_type::yes) { (*this).randn(); } arma_static_check( (is_same_type::yes), "Cube::fixed::fixed(): unsupported fill type" ); } template template template inline Cube::fixed::fixed(const BaseCube& A) { arma_extra_debug_sigprint_this(this); mem_setup(); Cube::operator=(A.get_ref()); } template template template inline Cube::fixed::fixed(const BaseCube& A, const BaseCube& B) { arma_extra_debug_sigprint_this(this); mem_setup(); Cube::init(A,B); } template template inline Cube& Cube::fixed::operator=(const fixed& X) { arma_extra_debug_sigprint(); eT* dest = (use_extra) ? mem_local_extra : mem_local; const eT* src = (use_extra) ? X.mem_local_extra : X.mem_local; arrayops::copy( dest, src, fixed_n_elem ); return *this; } template template arma_inline arma_warn_unused eT& Cube::fixed::operator[] (const uword i) { return (use_extra) ? mem_local_extra[i] : mem_local[i]; } template template arma_inline arma_warn_unused const eT& Cube::fixed::operator[] (const uword i) const { return (use_extra) ? mem_local_extra[i] : mem_local[i]; } template template arma_inline arma_warn_unused eT& Cube::fixed::at(const uword i) { return (use_extra) ? mem_local_extra[i] : mem_local[i]; } template template arma_inline arma_warn_unused const eT& Cube::fixed::at(const uword i) const { return (use_extra) ? mem_local_extra[i] : mem_local[i]; } template template arma_inline arma_warn_unused eT& Cube::fixed::operator() (const uword i) { arma_debug_check_bounds( (i >= fixed_n_elem), "Cube::operator(): index out of bounds" ); return (use_extra) ? mem_local_extra[i] : mem_local[i]; } template template arma_inline arma_warn_unused const eT& Cube::fixed::operator() (const uword i) const { arma_debug_check_bounds( (i >= fixed_n_elem), "Cube::operator(): index out of bounds" ); return (use_extra) ? mem_local_extra[i] : mem_local[i]; } template template arma_inline arma_warn_unused eT& Cube::fixed::at(const uword in_row, const uword in_col, const uword in_slice) { const uword i = in_slice*fixed_n_elem_slice + in_col*fixed_n_rows + in_row; return (use_extra) ? mem_local_extra[i] : mem_local[i]; } template template arma_inline arma_warn_unused const eT& Cube::fixed::at(const uword in_row, const uword in_col, const uword in_slice) const { const uword i = in_slice*fixed_n_elem_slice + in_col*fixed_n_rows + in_row; return (use_extra) ? mem_local_extra[i] : mem_local[i]; } template template arma_inline arma_warn_unused eT& Cube::fixed::operator() (const uword in_row, const uword in_col, const uword in_slice) { arma_debug_check_bounds ( (in_row >= fixed_n_rows ) || (in_col >= fixed_n_cols ) || (in_slice >= fixed_n_slices) , "operator(): index out of bounds" ); const uword i = in_slice*fixed_n_elem_slice + in_col*fixed_n_rows + in_row; return (use_extra) ? mem_local_extra[i] : mem_local[i]; } template template arma_inline arma_warn_unused const eT& Cube::fixed::operator() (const uword in_row, const uword in_col, const uword in_slice) const { arma_debug_check_bounds ( (in_row >= fixed_n_rows ) || (in_col >= fixed_n_cols ) || (in_slice >= fixed_n_slices) , "Cube::operator(): index out of bounds" ); const uword i = in_slice*fixed_n_elem_slice + in_col*fixed_n_rows + in_row; return (use_extra) ? mem_local_extra[i] : mem_local[i]; } // // Cube_aux //! prefix ++ template arma_inline void Cube_aux::prefix_pp(Cube& x) { eT* memptr = x.memptr(); const uword n_elem = x.n_elem; uword i,j; for(i=0, j=1; j arma_inline void Cube_aux::prefix_pp(Cube< std::complex >& x) { x += T(1); } //! postfix ++ template arma_inline void Cube_aux::postfix_pp(Cube& x) { eT* memptr = x.memptr(); const uword n_elem = x.n_elem; uword i,j; for(i=0, j=1; j arma_inline void Cube_aux::postfix_pp(Cube< std::complex >& x) { x += T(1); } //! prefix -- template arma_inline void Cube_aux::prefix_mm(Cube& x) { eT* memptr = x.memptr(); const uword n_elem = x.n_elem; uword i,j; for(i=0, j=1; j arma_inline void Cube_aux::prefix_mm(Cube< std::complex >& x) { x -= T(1); } //! postfix -- template arma_inline void Cube_aux::postfix_mm(Cube& x) { eT* memptr = x.memptr(); const uword n_elem = x.n_elem; uword i,j; for(i=0, j=1; j arma_inline void Cube_aux::postfix_mm(Cube< std::complex >& x) { x -= T(1); } template inline void Cube_aux::set_real(Cube& out, const BaseCube& X) { arma_extra_debug_sigprint(); const unwrap_cube tmp(X.get_ref()); const Cube& A = tmp.M; arma_debug_assert_same_size( out, A, "Cube::set_real()" ); out = A; } template inline void Cube_aux::set_imag(Cube&, const BaseCube&) { arma_extra_debug_sigprint(); } template inline void Cube_aux::set_real(Cube< std::complex >& out, const BaseCube& X) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const ProxyCube P(X.get_ref()); const uword local_n_rows = P.get_n_rows(); const uword local_n_cols = P.get_n_cols(); const uword local_n_slices = P.get_n_slices(); arma_debug_assert_same_size ( out.n_rows, out.n_cols, out.n_slices, local_n_rows, local_n_cols, local_n_slices, "Cube::set_real()" ); eT* out_mem = out.memptr(); if(ProxyCube::use_at == false) { typedef typename ProxyCube::ea_type ea_type; ea_type A = P.get_ea(); const uword N = out.n_elem; for(uword i=0; i( A[i], out_mem[i].imag() ); } } else { for(uword slice = 0; slice < local_n_slices; ++slice) for(uword col = 0; col < local_n_cols; ++col ) for(uword row = 0; row < local_n_rows; ++row ) { (*out_mem) = std::complex( P.at(row,col,slice), (*out_mem).imag() ); out_mem++; } } } template inline void Cube_aux::set_imag(Cube< std::complex >& out, const BaseCube& X) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const ProxyCube P(X.get_ref()); const uword local_n_rows = P.get_n_rows(); const uword local_n_cols = P.get_n_cols(); const uword local_n_slices = P.get_n_slices(); arma_debug_assert_same_size ( out.n_rows, out.n_cols, out.n_slices, local_n_rows, local_n_cols, local_n_slices, "Cube::set_imag()" ); eT* out_mem = out.memptr(); if(ProxyCube::use_at == false) { typedef typename ProxyCube::ea_type ea_type; ea_type A = P.get_ea(); const uword N = out.n_elem; for(uword i=0; i( out_mem[i].real(), A[i] ); } } else { for(uword slice = 0; slice < local_n_slices; ++slice) for(uword col = 0; col < local_n_cols; ++col ) for(uword row = 0; row < local_n_rows; ++row ) { (*out_mem) = std::complex( (*out_mem).real(), P.at(row,col,slice) ); out_mem++; } } } #ifdef ARMA_EXTRA_CUBE_MEAT #include ARMA_INCFILE_WRAP(ARMA_EXTRA_CUBE_MEAT) #endif //! @} RcppArmadillo/inst/include/armadillo_bits/op_inv_bones.hpp0000644000176200001440000000365614124060717023575 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_inv //! @{ class op_inv : public traits_op_default { public: template struct pos { static constexpr uword n2 = row + col*2; static constexpr uword n3 = row + col*3; static constexpr uword n4 = row + col*4; }; template inline static void apply(Mat& out, const Op& in); template inline static bool apply_direct(Mat& out, const Base& expr, const char* caller_sig); template inline static bool apply_diagmat(Mat& out, const T1& X, const char* caller_sig); template arma_cold inline static bool apply_tiny_noalias(Mat& out, const Mat& X); }; class op_inv_sympd : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); template inline static bool apply_direct(Mat& out, const Base& expr); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_min.hpp0000644000176200001440000001231214124060717022350 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_min //! @{ template arma_warn_unused inline typename enable_if2< is_arma_type::value && resolves_to_vector::yes, typename T1::elem_type >::result min(const T1& X) { arma_extra_debug_sigprint(); return op_min::min(X); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value && resolves_to_vector::no, const Op >::result min(const T1& X) { arma_extra_debug_sigprint(); return Op(X, 0, 0); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const Op >::result min(const T1& X, const uword dim) { arma_extra_debug_sigprint(); return Op(X, dim, 0); } template arma_warn_unused arma_inline typename arma_scalar_only::result min(const T& x) { return x; } //! element-wise minimum template arma_warn_unused arma_inline typename enable_if2 < ( is_arma_type::value && is_arma_type::value && is_same_type::value ), const Glue >::result min ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); return Glue(X, Y); } template arma_warn_unused arma_inline const OpCube min ( const BaseCube& X, const uword dim = 0 ) { arma_extra_debug_sigprint(); return OpCube(X.get_ref(), dim, 0); } template arma_warn_unused arma_inline const GlueCube min ( const BaseCube& X, const BaseCube& Y ) { arma_extra_debug_sigprint(); return GlueCube(X.get_ref(), Y.get_ref()); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value && resolves_to_sparse_vector::yes, typename T1::elem_type >::result min(const T1& x) { arma_extra_debug_sigprint(); return spop_min::vector_min(x); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value && resolves_to_sparse_vector::no, const SpOp >::result min(const T1& X) { arma_extra_debug_sigprint(); return SpOp(X, 0, 0); } template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value, const SpOp >::result min(const T1& X, const uword dim) { arma_extra_debug_sigprint(); return SpOp(X, dim, 0); } // elementwise sparse min template arma_warn_unused inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_sparse_type::value && is_same_type::value), const SpGlue >::result min(const T1& x, const T2& y) { arma_extra_debug_sigprint(); return SpGlue(x, y); } //! elementwise min of dense and sparse objects with the same element type template inline typename enable_if2 < (is_arma_type::value && is_arma_sparse_type::value && is_same_type::value), Mat >::result min ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); Mat out; spglue_min::dense_sparse_min(out, x, y); return out; } //! elementwise min of sparse and dense objects with the same element type template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_type::value && is_same_type::value), Mat >::result min ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); Mat out; // Just call the other order (these operations are commutative) // TODO: if there is a matrix size mismatch, the debug assert will print the matrix sizes in wrong order spglue_min::dense_sparse_min(out, y, x); return out; } arma_warn_unused inline uword min(const SizeMat& s) { return (std::min)(s.n_rows, s.n_cols); } arma_warn_unused inline uword min(const SizeCube& s) { return (std::min)( (std::min)(s.n_rows, s.n_cols), s.n_slices ); } //! @} RcppArmadillo/inst/include/armadillo_bits/operator_cube_plus.hpp0000644000176200001440000001141514124060717025001 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup operator_cube_plus //! @{ //! unary plus operation (does nothing, but is required for completeness) template arma_inline const BaseCube& operator+ ( const BaseCube& X ) { arma_extra_debug_sigprint(); return X; } //! BaseCube + scalar template arma_inline const eOpCube operator+ ( const BaseCube& X, const typename T1::elem_type k ) { arma_extra_debug_sigprint(); return eOpCube(X.get_ref(), k); } //! scalar + BaseCube template arma_inline const eOpCube operator+ ( const typename T1::elem_type k, const BaseCube& X ) { arma_extra_debug_sigprint(); return eOpCube(X.get_ref(), k); } //! non-complex BaseCube + complex scalar (experimental) template arma_inline const mtOpCube, T1, op_cx_scalar_plus> operator+ ( const BaseCube& X, const std::complex& k ) { arma_extra_debug_sigprint(); return mtOpCube, T1, op_cx_scalar_plus>('j', X.get_ref(), k); } //! complex scalar + non-complex BaseCube (experimental) template arma_inline const mtOpCube, T1, op_cx_scalar_plus> operator+ ( const std::complex& k, const BaseCube& X ) { arma_extra_debug_sigprint(); return mtOpCube, T1, op_cx_scalar_plus>('j', X.get_ref(), k); // NOTE: order is swapped } //! addition of BaseCube objects with same element type template arma_inline const eGlueCube operator+ ( const BaseCube& X, const BaseCube& Y ) { arma_extra_debug_sigprint(); return eGlueCube(X.get_ref(), Y.get_ref()); } //! addition of BaseCube objects with different element types template inline const mtGlueCube::result, T1, T2, glue_mixed_plus> operator+ ( const BaseCube< typename force_different_type::T1_result, T1>& X, const BaseCube< typename force_different_type::T2_result, T2>& Y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); return mtGlueCube( X.get_ref(), Y.get_ref() ); } template arma_inline Cube operator+ ( const subview_cube_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); return subview_cube_each1_aux::operator_plus(X, Y.get_ref()); } template arma_inline Cube operator+ ( const Base& X, const subview_cube_each1& Y ) { arma_extra_debug_sigprint(); return subview_cube_each1_aux::operator_plus(Y, X.get_ref()); // NOTE: swapped order } template arma_inline Cube operator+ ( const subview_cube_each2& X, const Base& Y ) { arma_extra_debug_sigprint(); return subview_cube_each2_aux::operator_plus(X, Y.get_ref()); } template arma_inline Cube operator+ ( const Base& X, const subview_cube_each2& Y ) { arma_extra_debug_sigprint(); return subview_cube_each2_aux::operator_plus(Y, X.get_ref()); // NOTE: swapped order } //! @} RcppArmadillo/inst/include/armadillo_bits/op_prod_meat.hpp0000644000176200001440000001040514124060717023553 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_prod //! @{ template inline void op_prod::apply_noalias(Mat& out, const Mat& X, const uword dim) { arma_extra_debug_sigprint(); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(dim == 0) // traverse across rows (ie. find the product in each column) { out.set_size(1, X_n_cols); eT* out_mem = out.memptr(); for(uword col=0; col < X_n_cols; ++col) { out_mem[col] = arrayops::product(X.colptr(col), X_n_rows); } } else // traverse across columns (ie. find the product in each row) { out.ones(X_n_rows, 1); eT* out_mem = out.memptr(); for(uword col=0; col < X_n_cols; ++col) { const eT* X_col_mem = X.colptr(col); for(uword row=0; row < X_n_rows; ++row) { out_mem[row] *= X_col_mem[row]; } } } } template inline void op_prod::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "prod(): parameter 'dim' must be 0 or 1" ); const quasi_unwrap U(in.m); if(U.is_alias(out)) { Mat tmp; op_prod::apply_noalias(tmp, U.M, dim); out.steal_mem(tmp); } else { op_prod::apply_noalias(out, U.M, dim); } } template inline eT op_prod::prod(const subview& X) { arma_extra_debug_sigprint(); eT val = eT(1); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(X_n_rows == 1) { const Mat& A = X.m; const uword start_row = X.aux_row1; const uword start_col = X.aux_col1; const uword end_col_p1 = start_col + X_n_cols; uword i,j; for(i=start_col, j=start_col+1; j < end_col_p1; i+=2, j+=2) { val *= A.at(start_row, i); val *= A.at(start_row, j); } if(i < end_col_p1) { val *= A.at(start_row, i); } } else { for(uword col=0; col < X_n_cols; ++col) { val *= arrayops::product( X.colptr(col), X_n_rows ); } } return val; } template inline typename T1::elem_type op_prod::prod(const Base& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy P(X.get_ref()); eT val = eT(1); if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; const ea_type A = P.get_ea(); const uword n_elem = P.get_n_elem(); uword i,j; for(i=0, j=1; j < n_elem; i+=2, j+=2) { val *= A[i]; val *= A[j]; } if(i < n_elem) { val *= A[i]; } } else { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); if(n_rows == 1) { uword i,j; for(i=0, j=1; j < n_cols; i+=2, j+=2) { val *= P.at(0,i); val *= P.at(0,j); } if(i < n_cols) { val *= P.at(0,i); } } else { for(uword col=0; col < n_cols; ++col) { uword i,j; for(i=0, j=1; j < n_rows; i+=2, j+=2) { val *= P.at(i,col); val *= P.at(j,col); } if(i < n_rows) { val *= P.at(i,col); } } } } return val; } //! @} RcppArmadillo/inst/include/armadillo_bits/Glue_bones.hpp0000644000176200001440000000427614147163451023202 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup Glue //! @{ template struct Glue_traits {}; template struct Glue_traits { static constexpr bool is_row = glue_type::template traits::is_row; static constexpr bool is_col = glue_type::template traits::is_col; static constexpr bool is_xvec = glue_type::template traits::is_xvec; }; template struct Glue_traits { static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; }; template class Glue : public Base< typename T1::elem_type, Glue > , public Glue_traits::value> { public: typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; inline Glue(const T1& in_A, const T2& in_B); inline Glue(const T1& in_A, const T2& in_B, const uword in_aux_uword); inline ~Glue(); const T1& A; //!< first operand; must be derived from Base const T2& B; //!< second operand; must be derived from Base uword aux_uword; //!< storage of auxiliary data, uword format }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_eigs_gen.hpp0000644000176200001440000002753214124060717023357 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_eigs_gen //! @{ //! eigenvalues of general sparse matrix X template arma_warn_unused inline typename enable_if2< is_real::value, Col< std::complex > >::result eigs_gen ( const SpBase& X, const uword n_eigvals, const char* form = "lm", const eigs_opts opts = eigs_opts() ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; Mat< std::complex > eigvec; Col< std::complex > eigval; sp_auxlib::form_type form_val = sp_auxlib::interpret_form_str(form); const bool status = sp_auxlib::eigs_gen(eigval, eigvec, X, n_eigvals, form_val, opts); if(status == false) { eigval.soft_reset(); arma_stop_runtime_error("eigs_gen(): decomposition failed"); } return eigval; } //! this form is deprecated; use eigs_gen(X, n_eigvals, form, opts) instead template arma_deprecated inline typename enable_if2< is_real::value, Col< std::complex > >::result eigs_gen ( const SpBase& X, const uword n_eigvals, const char* form, const typename T1::pod_type tol ) { arma_extra_debug_sigprint(); eigs_opts opts; opts.tol = tol; return eigs_gen(X, n_eigvals, form, opts); } template arma_warn_unused inline typename enable_if2< is_real::value, Col< std::complex > >::result eigs_gen ( const SpBase& X, const uword n_eigvals, const std::complex sigma, const eigs_opts opts = eigs_opts() ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; Mat< std::complex > eigvec; Col< std::complex > eigval; bool status = false; // If X is real and sigma is truly complex, treat X as complex. // The reason is that we are still not able to apply truly complex shifts to real matrices if( (is_real::yes) && (std::imag(sigma) != T(0)) ) { status = sp_auxlib::eigs_gen(eigval, eigvec, conv_to< SpMat< std::complex > >::from(X), n_eigvals, sigma, opts); } else { status = sp_auxlib::eigs_gen(eigval, eigvec, X, n_eigvals, sigma, opts); } if(status == false) { eigval.soft_reset(); arma_stop_runtime_error("eigs_gen(): decomposition failed"); } return eigval; } template arma_warn_unused inline typename enable_if2< is_real::value, Col< std::complex > >::result eigs_gen ( const SpBase& X, const uword n_eigvals, const double sigma, const eigs_opts opts = eigs_opts() ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; Mat< std::complex > eigvec; Col< std::complex > eigval; const bool status = sp_auxlib::eigs_gen(eigval, eigvec, X, n_eigvals, std::complex(T(sigma)), opts); if(status == false) { eigval.soft_reset(); arma_stop_runtime_error("eigs_gen(): decomposition failed"); } return eigval; } //! eigenvalues of general sparse matrix X template inline typename enable_if2< is_real::value, bool >::result eigs_gen ( Col< std::complex >& eigval, const SpBase& X, const uword n_eigvals, const char* form = "lm", const eigs_opts opts = eigs_opts() ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; Mat< std::complex > eigvec; sp_auxlib::form_type form_val = sp_auxlib::interpret_form_str(form); const bool status = sp_auxlib::eigs_gen(eigval, eigvec, X, n_eigvals, form_val, opts); if(status == false) { eigval.soft_reset(); arma_debug_warn_level(3, "eigs_gen(): decomposition failed"); } return status; } //! this form is deprecated; use eigs_gen(eigval, X, n_eigvals, form, opts) instead template arma_deprecated inline typename enable_if2< is_real::value, bool >::result eigs_gen ( Col< std::complex >& eigval, const SpBase& X, const uword n_eigvals, const char* form, const typename T1::pod_type tol ) { arma_extra_debug_sigprint(); eigs_opts opts; opts.tol = tol; return eigs_gen(eigval, X, n_eigvals, form, opts); } template inline typename enable_if2< is_real::value, bool >::result eigs_gen ( Col< std::complex >& eigval, const SpBase& X, const uword n_eigvals, const std::complex sigma, const eigs_opts opts = eigs_opts() ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; Mat< std::complex > eigvec; bool status = false; // If X is real and sigma is truly complex, treat X as complex. // The reason is that we are still not able to apply truly complex shifts to real matrices if( (is_real::yes) && (std::imag(sigma) != T(0)) ) { status = sp_auxlib::eigs_gen(eigval, eigvec, conv_to< SpMat< std::complex > >::from(X), n_eigvals, sigma, opts); } else { status = sp_auxlib::eigs_gen(eigval, eigvec, X, n_eigvals, sigma, opts); } if(status == false) { eigval.soft_reset(); arma_debug_warn_level(3, "eigs_gen(): decomposition failed"); } return status; } template inline typename enable_if2< is_real::value, bool >::result eigs_gen ( Col< std::complex >& eigval, const SpBase& X, const uword n_eigvals, const double sigma, const eigs_opts opts = eigs_opts() ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; Mat< std::complex > eigvec; const bool status = sp_auxlib::eigs_gen(eigval, eigvec, X, n_eigvals, std::complex(T(sigma)), opts); if(status == false) { eigval.soft_reset(); arma_debug_warn_level(3, "eigs_gen(): decomposition failed"); } return status; } //! eigenvalues and eigenvectors of general sparse matrix X template inline typename enable_if2< is_real::value, bool >::result eigs_gen ( Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpBase& X, const uword n_eigvals, const char* form = "lm", const eigs_opts opts = eigs_opts() ) { arma_extra_debug_sigprint(); // typedef typename T1::pod_type T; arma_debug_check( void_ptr(&eigval) == void_ptr(&eigvec), "eigs_gen(): parameter 'eigval' is an alias of parameter 'eigvec'" ); sp_auxlib::form_type form_val = sp_auxlib::interpret_form_str(form); const bool status = sp_auxlib::eigs_gen(eigval, eigvec, X, n_eigvals, form_val, opts); if(status == false) { eigval.soft_reset(); eigvec.soft_reset(); arma_debug_warn_level(3, "eigs_gen(): decomposition failed"); } return status; } //! this form is deprecated; use eigs_gen(eigval, eigvec, X, n_eigvals, form, opts) instead template arma_deprecated inline typename enable_if2< is_real::value, bool >::result eigs_gen ( Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpBase& X, const uword n_eigvals, const char* form, const typename T1::pod_type tol ) { arma_extra_debug_sigprint(); eigs_opts opts; opts.tol = tol; return eigs_gen(eigval, eigvec, X, n_eigvals, form, opts); } template inline typename enable_if2< is_real::value, bool >::result eigs_gen ( Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpBase& X, const uword n_eigvals, const std::complex sigma, const eigs_opts opts = eigs_opts() ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; arma_debug_check( void_ptr(&eigval) == void_ptr(&eigvec), "eigs_gen(): parameter 'eigval' is an alias of parameter 'eigvec'" ); bool status = false; // If X is real and sigma is truly complex, treat X as complex. // The reason is that we are still not able to apply truly complex shifts to real matrices if( (is_real::yes) && (std::imag(sigma) != T(0)) ) { status = sp_auxlib::eigs_gen(eigval, eigvec, conv_to< SpMat< std::complex > >::from(X), n_eigvals, sigma, opts); } else { status = sp_auxlib::eigs_gen(eigval, eigvec, X, n_eigvals, sigma, opts); } if(status == false) { eigval.soft_reset(); eigvec.soft_reset(); arma_debug_warn_level(3, "eigs_gen(): decomposition failed"); } return status; } template inline typename enable_if2< is_real::value, bool >::result eigs_gen ( Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpBase& X, const uword n_eigvals, const double sigma, const eigs_opts opts = eigs_opts() ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; arma_debug_check( void_ptr(&eigval) == void_ptr(&eigvec), "eigs_gen(): parameter 'eigval' is an alias of parameter 'eigvec'" ); const bool status = sp_auxlib::eigs_gen(eigval, eigvec, X, n_eigvals, std::complex(T(sigma)), opts); if(status == false) { eigval.soft_reset(); eigvec.soft_reset(); arma_debug_warn_level(3, "eigs_gen(): decomposition failed"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/SpValProxy_bones.hpp0000644000176200001440000000526514124060717024370 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpValProxy //! @{ // Sparse value proxy class, to prevent inserting 0s into sparse matrices. // T1 must be either SpMat or SpSubview. // This class uses T1::insert_element(), T1::delete_element(), T1::invalidate_cache() template class SpValProxy { public: typedef typename T1::elem_type eT; // Convenience typedef friend class SpMat; friend class SpSubview; /** * Create the sparse value proxy. * Otherwise, pass a pointer to a reference of the value. */ arma_inline SpValProxy(uword row, uword col, T1& in_parent, eT* in_val_ptr = nullptr); inline SpValProxy() = delete; //! For swapping operations. arma_inline SpValProxy& operator=(const SpValProxy& rhs); template arma_inline SpValProxy& operator=(const SpValProxy& rhs); //! Overload all of the potential operators. //! First, the ones that could modify a value. arma_inline SpValProxy& operator=(const eT rhs); arma_inline SpValProxy& operator+=(const eT rhs); arma_inline SpValProxy& operator-=(const eT rhs); arma_inline SpValProxy& operator*=(const eT rhs); arma_inline SpValProxy& operator/=(const eT rhs); arma_inline SpValProxy& operator++(); arma_inline SpValProxy& operator--(); arma_inline eT operator++(const int); arma_inline eT operator--(const int); //! This will work for any other operations that do not modify a value. arma_inline operator eT() const; arma_inline typename get_pod_type::result real() const; arma_inline typename get_pod_type::result imag() const; private: // Deletes the element if it is zero; NOTE: does not check if val_ptr == nullptr arma_inline void check_zero(); arma_aligned const uword row; arma_aligned const uword col; arma_aligned eT* val_ptr; arma_aligned T1& parent; // We will call this object if we need to insert or delete an element. }; //! @} RcppArmadillo/inst/include/armadillo_bits/operator_cube_div.hpp0000644000176200001440000001074014124060717024600 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup operator_cube_div //! @{ //! BaseCube / scalar template arma_inline const eOpCube operator/ ( const BaseCube& X, const typename T1::elem_type k ) { arma_extra_debug_sigprint(); return eOpCube(X.get_ref(), k); } //! scalar / BaseCube template arma_inline const eOpCube operator/ ( const typename T1::elem_type k, const BaseCube& X ) { arma_extra_debug_sigprint(); return eOpCube(X.get_ref(), k); } //! complex scalar / non-complex BaseCube (experimental) template arma_inline const mtOpCube, T1, op_cx_scalar_div_pre> operator/ ( const std::complex& k, const BaseCube& X ) { arma_extra_debug_sigprint(); return mtOpCube, T1, op_cx_scalar_div_pre>('j', X.get_ref(), k); } //! non-complex BaseCube / complex scalar (experimental) template arma_inline const mtOpCube, T1, op_cx_scalar_div_post> operator/ ( const BaseCube& X, const std::complex& k ) { arma_extra_debug_sigprint(); return mtOpCube, T1, op_cx_scalar_div_post>('j', X.get_ref(), k); } //! element-wise division of BaseCube objects with same element type template arma_inline const eGlueCube operator/ ( const BaseCube& X, const BaseCube& Y ) { arma_extra_debug_sigprint(); return eGlueCube(X.get_ref(), Y.get_ref()); } //! element-wise division of BaseCube objects with different element types template inline const mtGlueCube::result, T1, T2, glue_mixed_div> operator/ ( const BaseCube< typename force_different_type::T1_result, T1>& X, const BaseCube< typename force_different_type::T2_result, T2>& Y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); return mtGlueCube( X.get_ref(), Y.get_ref() ); } template arma_inline Cube operator/ ( const subview_cube_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); return subview_cube_each1_aux::operator_div(X, Y.get_ref()); } template arma_inline Cube operator/ ( const Base& X, const subview_cube_each1& Y ) { arma_extra_debug_sigprint(); return subview_cube_each1_aux::operator_div(X.get_ref(), Y); } template arma_inline Cube operator/ ( const subview_cube_each2& X, const Base& Y ) { arma_extra_debug_sigprint(); return subview_cube_each2_aux::operator_div(X, Y.get_ref()); } template arma_inline Cube operator/ ( const Base& X, const subview_cube_each2& Y ) { arma_extra_debug_sigprint(); return subview_cube_each2_aux::operator_div(X.get_ref(), Y); } //! @} RcppArmadillo/inst/include/armadillo_bits/mtGlue_bones.hpp0000644000176200001440000000336414124060717023534 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup mtGlue //! @{ template class mtGlue : public Base< out_eT, mtGlue > { public: typedef out_eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = glue_type::template traits::is_row; static constexpr bool is_col = glue_type::template traits::is_col; static constexpr bool is_xvec = glue_type::template traits::is_xvec; arma_inline mtGlue(const T1& in_A, const T2& in_B); arma_inline mtGlue(const T1& in_A, const T2& in_B, const uword in_aux_uword); arma_inline ~mtGlue(); arma_aligned const T1& A; //!< first operand; must be derived from Base arma_aligned const T2& B; //!< second operand; must be derived from Base arma_aligned uword aux_uword; //!< storage of auxiliary data, uword format }; //! @} RcppArmadillo/inst/include/armadillo_bits/Op_meat.hpp0000644000176200001440000000420014124060717022463 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup Op //! @{ template inline Op::Op(const T1& in_m) : m(in_m) { arma_extra_debug_sigprint(); } template inline Op::Op(const T1& in_m, const typename T1::elem_type in_aux) : m(in_m) , aux(in_aux) { arma_extra_debug_sigprint(); } template inline Op::Op(const T1& in_m, const typename T1::elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b) : m(in_m) , aux(in_aux) , aux_uword_a(in_aux_uword_a) , aux_uword_b(in_aux_uword_b) { arma_extra_debug_sigprint(); } template inline Op::Op(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b) : m(in_m) , aux_uword_a(in_aux_uword_a) , aux_uword_b(in_aux_uword_b) { arma_extra_debug_sigprint(); } template inline Op::Op(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c, const char) : m(in_m) , aux_uword_a(in_aux_uword_a) , aux_uword_b(in_aux_uword_b) , aux_uword_c(in_aux_uword_c) { arma_extra_debug_sigprint(); } template inline Op::~Op() { arma_extra_debug_sigprint(); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_randg.hpp0000644000176200001440000001245014124060717022663 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_randg //! @{ template arma_warn_unused inline obj_type randg(const uword n_rows, const uword n_cols, const distr_param& param = distr_param(), const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename obj_type::elem_type eT; if(is_Col::value) { arma_debug_check( (n_cols != 1), "randg(): incompatible size" ); } else if(is_Row::value) { arma_debug_check( (n_rows != 1), "randg(): incompatible size" ); } obj_type out(n_rows, n_cols, arma_nozeros_indicator()); double a; double b; if(param.state == 0) { a = double(1); b = double(1); } else if(param.state == 1) { a = double(param.a_int); b = double(param.b_int); } else { a = param.a_double; b = param.b_double; } arma_debug_check( ((a <= double(0)) || (b <= double(0))), "randg(): a and b must be greater than zero" ); arma_rng::randg::fill(out.memptr(), out.n_elem, a, b); return out; } template arma_warn_unused inline obj_type randg(const SizeMat& s, const distr_param& param = distr_param(), const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return randg(s.n_rows, s.n_cols, param); } template arma_warn_unused inline obj_type randg(const uword n_elem, const distr_param& param = distr_param(), const arma_empty_class junk1 = arma_empty_class(), const typename arma_Mat_Col_Row_only::result* junk2 = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); const uword n_rows = (is_Row::value) ? uword(1) : n_elem; const uword n_cols = (is_Row::value) ? n_elem : uword(1); return randg(n_rows, n_cols, param); } arma_warn_unused inline mat randg(const uword n_rows, const uword n_cols, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); return randg(n_rows, n_cols, param); } arma_warn_unused inline mat randg(const SizeMat& s, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); return randg(s.n_rows, s.n_cols, param); } arma_warn_unused inline vec randg(const uword n_elem, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); return randg(n_elem, uword(1), param); } arma_warn_unused inline double randg(const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); return as_scalar( randg(uword(1), uword(1), param) ); } template arma_warn_unused inline typename arma_real_or_cx_only::result randg(const distr_param& param = distr_param()) { return eT( as_scalar( randg< Col >(uword(1), uword(1), param) ) ); } template arma_warn_unused inline cube_type randg(const uword n_rows, const uword n_cols, const uword n_slices, const distr_param& param = distr_param(), const typename arma_Cube_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename cube_type::elem_type eT; cube_type out(n_rows, n_cols, n_slices, arma_nozeros_indicator()); double a; double b; if(param.state == 0) { a = double(1); b = double(1); } else if(param.state == 1) { a = double(param.a_int); b = double(param.b_int); } else { a = param.a_double; b = param.b_double; } arma_debug_check( ((a <= double(0)) || (b <= double(0))), "randg(): a and b must be greater than zero" ); arma_rng::randg::fill(out.memptr(), out.n_elem, a, b); return out; } template arma_warn_unused inline cube_type randg(const SizeCube& s, const distr_param& param = distr_param(), const typename arma_Cube_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return randg(s.n_rows, s.n_cols, s.n_slices, param); } arma_warn_unused inline cube randg(const uword n_rows, const uword n_cols, const uword n_slices, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); return randg(n_rows, n_cols, n_slices, param); } arma_warn_unused inline cube randg(const SizeCube& s, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); return randg(s.n_rows, s.n_cols, s.n_slices, param); } //! @} RcppArmadillo/inst/include/armadillo_bits/subview_each_bones.hpp0000644000176200001440000001360014124060717024735 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup subview_each //! @{ template class subview_each_common { public: typedef typename parent::elem_type eT; const parent& P; inline void check_size(const Mat& A) const; protected: arma_inline subview_each_common(const parent& in_P); inline subview_each_common() = delete; arma_inline const Mat& get_mat_ref_helper(const Mat & X) const; arma_inline const Mat& get_mat_ref_helper(const subview& X) const; arma_inline const Mat& get_mat_ref() const; arma_cold inline const std::string incompat_size_string(const Mat& A) const; }; template class subview_each1 : public subview_each_common { protected: arma_inline subview_each1(const parent& in_P); public: typedef typename parent::elem_type eT; inline ~subview_each1(); inline subview_each1() = delete; // deliberately returning void template inline void operator= (const Base& x); template inline void operator+= (const Base& x); template inline void operator-= (const Base& x); template inline void operator%= (const Base& x); template inline void operator/= (const Base& x); friend class Mat; friend class subview; }; template class subview_each2 : public subview_each_common { protected: inline subview_each2(const parent& in_P, const Base& in_indices); public: const Base& base_indices; typedef typename parent::elem_type eT; inline void check_indices(const Mat& indices) const; inline ~subview_each2(); inline subview_each2() = delete; // deliberately returning void template inline void operator= (const Base& x); template inline void operator+= (const Base& x); template inline void operator-= (const Base& x); template inline void operator%= (const Base& x); template inline void operator/= (const Base& x); friend class Mat; friend class subview; }; class subview_each1_aux { public: template static inline Mat operator_plus(const subview_each1& X, const Base& Y); template static inline Mat operator_minus(const subview_each1& X, const Base& Y); template static inline Mat operator_minus(const Base& X, const subview_each1& Y); template static inline Mat operator_schur(const subview_each1& X, const Base& Y); template static inline Mat operator_div(const subview_each1& X,const Base& Y); template static inline Mat operator_div(const Base& X, const subview_each1& Y); }; class subview_each2_aux { public: template static inline Mat operator_plus(const subview_each2& X, const Base& Y); template static inline Mat operator_minus(const subview_each2& X, const Base& Y); template static inline Mat operator_minus(const Base& X, const subview_each2& Y); template static inline Mat operator_schur(const subview_each2& X, const Base& Y); template static inline Mat operator_div(const subview_each2& X, const Base& Y); template static inline Mat operator_div(const Base& X, const subview_each2& Y); }; //! @} RcppArmadillo/inst/include/armadillo_bits/glue_mvnrnd_bones.hpp0000644000176200001440000000335514124060717024617 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_mvnrnd //! @{ class glue_mvnrnd_vec { public: template struct traits { static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; }; template inline static void apply(Mat& out, const Glue& expr); }; class glue_mvnrnd : public traits_glue_default { public: template inline static void apply(Mat& out, const Glue& expr); template inline static bool apply_direct(Mat& out, const Base& M, const Base& C, const uword N); template inline static bool apply_noalias(Mat& out, const Mat& M, const Mat& C, const uword N); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_princomp_bones.hpp0000644000176200001440000000405214124060717024617 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_princomp //! @{ class op_princomp : public traits_op_default { public: template inline static bool direct_princomp ( Mat& coeff_out, Mat& score_out, Col& latent_out, Col& tsquared_out, const Base& X ); template inline static bool direct_princomp ( Mat& coeff_out, Mat& score_out, Col& latent_out, const Base& X ); template inline static bool direct_princomp ( Mat& coeff_out, Mat& score_out, const Base& X ); template inline static bool direct_princomp ( Mat& coeff_out, const Base& X ); template inline static void apply(Mat& out, const Op& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/arma_rng.hpp0000644000176200001440000004756514124060717022712 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup arma_rng //! @{ #if defined(ARMA_RNG_ALT) #undef ARMA_USE_EXTERN_RNG #endif // NOTE: mt19937_64_instance_warmup is used as a workaround // NOTE: for thread_local issue on macOS 11 and/or AppleClang 12.0 // NOTE: see https://gitlab.com/conradsnicta/armadillo-code/-/issues/173 // NOTE: if this workaround causes problems, please report it and // NOTE: disable the workaround by uncommenting the code block below: // #if defined(__APPLE__) || defined(__apple_build_version__) // #if !defined(ARMA_DONT_DISABLE_EXTERN_RNG) // #undef ARMA_USE_EXTERN_RNG // #endif // #endif // NOTE: workaround for another thread_local issue on macOS // NOTE: where GCC (not Clang) may not have support for thread_local #if (defined(__APPLE__) && defined(__GNUG__) && !defined(__clang__)) #if !defined(ARMA_DONT_DISABLE_EXTERN_RNG) #undef ARMA_USE_EXTERN_RNG #endif #endif #if defined(ARMA_USE_EXTERN_RNG) extern thread_local std::mt19937_64 mt19937_64_instance; #if defined(__APPLE__) || defined(__apple_build_version__) namespace { struct mt19937_64_instance_warmup { inline mt19937_64_instance_warmup() { typename std::mt19937_64::result_type junk = mt19937_64_instance(); arma_ignore(junk); } }; static mt19937_64_instance_warmup mt19937_64_instance_warmup_run; } #endif #endif class arma_rng { public: #if defined(ARMA_RNG_ALT) typedef arma_rng_alt::seed_type seed_type; #elif defined(ARMA_USE_EXTERN_RNG) typedef std::mt19937_64::result_type seed_type; #else typedef arma_rng_cxx98::seed_type seed_type; #endif #if defined(ARMA_RNG_ALT) static constexpr int rng_method = 2; #elif defined(ARMA_USE_EXTERN_RNG) static constexpr int rng_method = 1; #else static constexpr int rng_method = 0; #endif inline static void set_seed(const seed_type val); inline static void set_seed_random(); template struct randi; template struct randu; template struct randn; template struct randg; }; inline void arma_rng::set_seed(const arma_rng::seed_type val) { #if defined(ARMA_RNG_ALT) { arma_rng_alt::set_seed(val); } #elif defined(ARMA_USE_EXTERN_RNG) { mt19937_64_instance.seed(val); } #else { arma_rng_cxx98::set_seed(val); } #endif } arma_cold inline void arma_rng::set_seed_random() { seed_type seed1 = seed_type(0); seed_type seed2 = seed_type(0); seed_type seed3 = seed_type(0); seed_type seed4 = seed_type(0); bool have_seed = false; try { std::random_device rd; if(rd.entropy() > double(0)) { seed1 = static_cast( rd() ); } if(seed1 != seed_type(0)) { have_seed = true; } } catch(...) {} if(have_seed == false) { try { union { seed_type a; unsigned char b[sizeof(seed_type)]; } tmp; tmp.a = seed_type(0); std::ifstream f("/dev/urandom", std::ifstream::binary); if(f.good()) { f.read((char*)(&(tmp.b[0])), sizeof(seed_type)); } if(f.good()) { seed2 = tmp.a; if(seed2 != seed_type(0)) { have_seed = true; } } } catch(...) {} } if(have_seed == false) { // get better-than-nothing seeds in case reading /dev/urandom failed const std::chrono::system_clock::time_point tp_now = std::chrono::system_clock::now(); auto since_epoch_usec = std::chrono::duration_cast(tp_now.time_since_epoch()).count(); seed3 = static_cast( since_epoch_usec & 0xFFFF ); union { uword* a; unsigned char b[sizeof(uword*)]; } tmp; tmp.a = (uword*)malloc(sizeof(uword)); if(tmp.a != nullptr) { for(size_t i=0; i struct arma_rng::randi { inline operator eT () { #if defined(ARMA_RNG_ALT) { return eT( arma_rng_alt::randi_val() ); } #elif defined(ARMA_USE_EXTERN_RNG) { constexpr double scale = double(std::numeric_limits::max()) / double(std::mt19937_64::max()); return eT( double(mt19937_64_instance()) * scale ); } #else { return eT( arma_rng_cxx98::randi_val() ); } #endif } inline static int max_val() { #if defined(ARMA_RNG_ALT) { return arma_rng_alt::randi_max_val(); } #elif defined(ARMA_USE_EXTERN_RNG) { return std::numeric_limits::max(); } #else { return arma_rng_cxx98::randi_max_val(); } #endif } inline static void fill(eT* mem, const uword N, const int a, const int b) { #if defined(ARMA_RNG_ALT) { arma_rng_alt::randi_fill(mem, N, a, b); } #elif defined(ARMA_USE_EXTERN_RNG) { std::uniform_int_distribution local_i_distr(a, b); for(uword i=0; i local_i_distr(a, b); local_engine.seed( local_seed_type(std::rand()) ); for(uword i=0; i struct arma_rng::randu { inline operator eT () { #if defined(ARMA_RNG_ALT) { return eT( arma_rng_alt::randu_val() ); } #elif defined(ARMA_USE_EXTERN_RNG) { constexpr double scale = double(1.0) / double(std::mt19937_64::max()); return eT( double(mt19937_64_instance()) * scale ); } #else { return eT( arma_rng_cxx98::randu_val() ); } #endif } inline static void fill(eT* mem, const uword N) { #if defined(ARMA_RNG_ALT) { for(uword i=0; i < N; ++i) { mem[i] = eT( arma_rng_alt::randu_val() ); } } #elif defined(ARMA_USE_EXTERN_RNG) { std::uniform_real_distribution local_u_distr; for(uword i=0; i < N; ++i) { mem[i] = eT( local_u_distr(mt19937_64_instance) ); } } #else { if(N == uword(1)) { mem[0] = eT( arma_rng_cxx98::randu_val() ); return; } typedef typename std::mt19937_64::result_type local_seed_type; std::mt19937_64 local_engine; std::uniform_real_distribution local_u_distr; local_engine.seed( local_seed_type(std::rand()) ); for(uword i=0; i < N; ++i) { mem[i] = eT( local_u_distr(local_engine) ); } } #endif } }; template struct arma_rng::randu< std::complex > { arma_inline operator std::complex () { #if defined(ARMA_RNG_ALT) { const T a = T( arma_rng_alt::randu_val() ); const T b = T( arma_rng_alt::randu_val() ); return std::complex(a, b); } #elif defined(ARMA_USE_EXTERN_RNG) { std::uniform_real_distribution local_u_distr; const T a = T( local_u_distr(mt19937_64_instance) ); const T b = T( local_u_distr(mt19937_64_instance) ); return std::complex(a, b); } #else { const T a = T( arma_rng_cxx98::randu_val() ); const T b = T( arma_rng_cxx98::randu_val() ); return std::complex(a, b); } #endif } inline static void fill(std::complex* mem, const uword N) { #if defined(ARMA_RNG_ALT) { for(uword i=0; i < N; ++i) { const T a = T( arma_rng_alt::randu_val() ); const T b = T( arma_rng_alt::randu_val() ); mem[i] = std::complex(a, b); } } #elif defined(ARMA_USE_EXTERN_RNG) { std::uniform_real_distribution local_u_distr; for(uword i=0; i < N; ++i) { const T a = T( local_u_distr(mt19937_64_instance) ); const T b = T( local_u_distr(mt19937_64_instance) ); mem[i] = std::complex(a, b); } } #else { if(N == uword(1)) { const T a = T( arma_rng_cxx98::randu_val() ); const T b = T( arma_rng_cxx98::randu_val() ); mem[0] = std::complex(a, b); return; } typedef typename std::mt19937_64::result_type local_seed_type; std::mt19937_64 local_engine; std::uniform_real_distribution local_u_distr; local_engine.seed( local_seed_type(std::rand()) ); for(uword i=0; i < N; ++i) { const T a = T( local_u_distr(local_engine) ); const T b = T( local_u_distr(local_engine) ); mem[i] = std::complex(a, b); } } #endif } }; // template struct arma_rng::randn { inline operator eT () const { #if defined(ARMA_RNG_ALT) { return eT( arma_rng_alt::randn_val() ); } #elif defined(ARMA_USE_EXTERN_RNG) { std::normal_distribution local_n_distr; return eT( local_n_distr(mt19937_64_instance) ); } #else { return eT( arma_rng_cxx98::randn_val() ); } #endif } inline static void dual_val(eT& out1, eT& out2) { #if defined(ARMA_RNG_ALT) { arma_rng_alt::randn_dual_val(out1, out2); } #elif defined(ARMA_USE_EXTERN_RNG) { std::normal_distribution local_n_distr; out1 = eT( local_n_distr(mt19937_64_instance) ); out2 = eT( local_n_distr(mt19937_64_instance) ); } #else { arma_rng_cxx98::randn_dual_val(out1, out2); } #endif } inline static void fill_simple(eT* mem, const uword N) { #if defined(ARMA_RNG_ALT) { // NOTE: old method to avoid regressions in user code that assumes specific sequence uword i, j; for(i=0, j=1; j < N; i+=2, j+=2) { arma_rng_alt::randn_dual_val( mem[i], mem[j] ); } if(i < N) { mem[i] = eT( arma_rng_alt::randn_val() ); } } #elif defined(ARMA_USE_EXTERN_RNG) { std::normal_distribution local_n_distr; for(uword i=0; i < N; ++i) { mem[i] = eT( local_n_distr(mt19937_64_instance) ); } } #else { if(N == uword(1)) { mem[0] = eT( arma_rng_cxx98::randn_val() ); return; } typedef typename std::mt19937_64::result_type local_seed_type; std::mt19937_64 local_engine; std::normal_distribution local_n_distr; local_engine.seed( local_seed_type(std::rand()) ); for(uword i=0; i < N; ++i) { mem[i] = eT( local_n_distr(local_engine) ); } } #endif } inline static void fill(eT* mem, const uword N) { #if defined(ARMA_USE_OPENMP) { if((N < 1024) || omp_in_parallel()) { arma_rng::randn::fill_simple(mem, N); return; } typedef typename std::mt19937_64::result_type local_seed_type; const uword n_threads = uword( mp_thread_limit::get() ); std::vector< std::mt19937_64 > engine(n_threads); std::vector< std::normal_distribution > distr(n_threads); for(uword t=0; t < n_threads; ++t) { std::mt19937_64& t_engine = engine[t]; t_engine.seed( local_seed_type(t) + local_seed_type(arma_rng::randi()) ); } const uword chunk_size = N / n_threads; #pragma omp parallel for schedule(static) num_threads(int(n_threads)) for(uword t=0; t < n_threads; ++t) { const uword start = (t+0) * chunk_size; const uword endp1 = (t+1) * chunk_size; std::mt19937_64& t_engine = engine[t]; std::normal_distribution& t_distr = distr[t]; for(uword i=start; i < endp1; ++i) { mem[i] = eT( t_distr(t_engine)); } } std::mt19937_64& t0_engine = engine[0]; std::normal_distribution& t0_distr = distr[0]; for(uword i=(n_threads*chunk_size); i < N; ++i) { mem[i] = eT( t0_distr(t0_engine)); } } #else { arma_rng::randn::fill_simple(mem, N); } #endif } }; template struct arma_rng::randn< std::complex > { inline operator std::complex () const { #if defined(_MSC_VER) // attempt at workaround for MSVC bug // does MS even test their so-called compilers before release? T a; T b; #else T a(0); T b(0); #endif arma_rng::randn::dual_val(a, b); return std::complex(a, b); } inline static void dual_val(std::complex& out1, std::complex& out2) { #if defined(_MSC_VER) T a; T b; #else T a(0); T b(0); #endif arma_rng::randn::dual_val(a,b); out1 = std::complex(a,b); arma_rng::randn::dual_val(a,b); out2 = std::complex(a,b); } inline static void fill_simple(std::complex* mem, const uword N) { #if defined(ARMA_RNG_ALT) { for(uword i=0; i < N; ++i) { mem[i] = std::complex( arma_rng::randn< std::complex >() ); } } #elif defined(ARMA_USE_EXTERN_RNG) { std::normal_distribution local_n_distr; for(uword i=0; i < N; ++i) { const T a = T( local_n_distr(mt19937_64_instance) ); const T b = T( local_n_distr(mt19937_64_instance) ); mem[i] = std::complex(a,b); } } #else { if(N == uword(1)) { T a = T(0); T b = T(0); arma_rng_cxx98::randn_dual_val(a,b); mem[0] = std::complex(a,b); return; } typedef typename std::mt19937_64::result_type local_seed_type; std::mt19937_64 local_engine; std::normal_distribution local_n_distr; local_engine.seed( local_seed_type(std::rand()) ); for(uword i=0; i < N; ++i) { const T a = T( local_n_distr(local_engine) ); const T b = T( local_n_distr(local_engine) ); mem[i] = std::complex(a,b); } } #endif } inline static void fill(std::complex* mem, const uword N) { #if defined(ARMA_USE_OPENMP) { if((N < 512) || omp_in_parallel()) { arma_rng::randn< std::complex >::fill_simple(mem, N); return; } typedef typename std::mt19937_64::result_type local_seed_type; const uword n_threads = uword( mp_thread_limit::get() ); std::vector< std::mt19937_64 > engine(n_threads); std::vector< std::normal_distribution > distr(n_threads); for(uword t=0; t < n_threads; ++t) { std::mt19937_64& t_engine = engine[t]; t_engine.seed( local_seed_type(t) + local_seed_type(arma_rng::randi()) ); } const uword chunk_size = N / n_threads; #pragma omp parallel for schedule(static) num_threads(int(n_threads)) for(uword t=0; t < n_threads; ++t) { const uword start = (t+0) * chunk_size; const uword endp1 = (t+1) * chunk_size; std::mt19937_64& t_engine = engine[t]; std::normal_distribution& t_distr = distr[t]; for(uword i=start; i < endp1; ++i) { const T val1 = T( t_distr(t_engine) ); const T val2 = T( t_distr(t_engine) ); mem[i] = std::complex(val1, val2); } } std::mt19937_64& t0_engine = engine[0]; std::normal_distribution& t0_distr = distr[0]; for(uword i=(n_threads*chunk_size); i < N; ++i) { const T val1 = T( t0_distr(t0_engine) ); const T val2 = T( t0_distr(t0_engine) ); mem[i] = std::complex(val1, val2); } } #else { arma_rng::randn< std::complex >::fill_simple(mem, N); } #endif } }; // template struct arma_rng::randg { inline static void fill_simple(eT* mem, const uword N, const double a, const double b) { #if defined(ARMA_USE_EXTERN_RNG) { std::gamma_distribution local_g_distr(a,b); for(uword i=0; i local_g_distr(a,b); local_engine.seed( local_seed_type(arma_rng::randi()) ); for(uword i=0; i::fill_simple(mem, N, a, b); return; } typedef std::mt19937_64 motor_type; typedef std::mt19937_64::result_type ovum_type; typedef std::gamma_distribution distr_type; const uword n_threads = uword( mp_thread_limit::get() ); std::vector g_motor(n_threads); std::vector g_distr(n_threads); const distr_type g_distr_base(a,b); for(uword t=0; t < n_threads; ++t) { motor_type& g_motor_t = g_motor[t]; distr_type& g_distr_t = g_distr[t]; g_motor_t.seed( ovum_type(t) + ovum_type(arma_rng::randi()) ); g_distr_t.param( g_distr_base.param() ); } const uword chunk_size = N / n_threads; #pragma omp parallel for schedule(static) num_threads(int(n_threads)) for(uword t=0; t < n_threads; ++t) { const uword start = (t+0) * chunk_size; const uword endp1 = (t+1) * chunk_size; motor_type& g_motor_t = g_motor[t]; distr_type& g_distr_t = g_distr[t]; for(uword i=start; i < endp1; ++i) { mem[i] = eT( g_distr_t(g_motor_t)); } } motor_type& g_motor_0 = g_motor[0]; distr_type& g_distr_0 = g_distr[0]; for(uword i=(n_threads*chunk_size); i < N; ++i) { mem[i] = eT( g_distr_0(g_motor_0)); } } #else { arma_rng::randg::fill_simple(mem, N, a, b); } #endif } }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_rank_meat.hpp0000644000176200001440000001112014162345366023545 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_rank //! @{ template inline bool op_rank::apply(uword& out, const Base& expr, const typename T1::pod_type tol) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; Mat A(expr.get_ref()); if(A.is_empty()) { out = uword(0); return true; } if(is_op_diagmat::value || A.is_diagmat()) { arma_extra_debug_print("op_rank::apply(): detected diagonal matrix"); return op_rank::apply_diag(out, A, tol); } #if defined(ARMA_OPTIMISE_SYMPD) bool do_sym = false; if(auxlib::crippled_lapack(A) == false) { bool is_approx_sym = false; bool is_approx_sympd = false; sympd_helper::analyse_matrix(is_approx_sym, is_approx_sympd, A); do_sym = (is_cx::no) ? (is_approx_sym) : (is_approx_sym && is_approx_sympd); } #else const bool do_sym = false; #endif if(do_sym) { arma_extra_debug_print("op_rank::apply(): symmetric/hermitian optimisation"); return op_rank::apply_sym(out, A, tol); } return op_rank::apply_gen(out, A, tol); } template inline bool op_rank::apply_diag(uword& out, Mat& A, typename get_pod_type::result tol) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; const uword N = (std::min)(A.n_rows, A.n_cols); podarray diag_abs_vals(N); T max_abs_Aii = T(0); for(uword i=0; i max_abs_Aii) ? abs_Aii : max_abs_Aii; } // set tolerance to default if it hasn't been specified if(tol == T(0)) { tol = (std::max)(A.n_rows, A.n_cols) * max_abs_Aii * std::numeric_limits::epsilon(); } uword count = 0; for(uword i=0; i tol) ? uword(1) : uword(0); } out = count; return true; } template inline bool op_rank::apply_sym(uword& out, Mat& A, typename get_pod_type::result tol) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; if(A.is_square() == false) { out = uword(0); return false; } Col v; const bool status = auxlib::eig_sym(v, A); if(status == false) { out = uword(0); return false; } const uword v_n_elem = v.n_elem; T* v_mem = v.memptr(); if(v_n_elem == 0) { out = uword(0); return true; } T max_abs_v = T(0); for(uword i=0; i < v_n_elem; ++i) { const T val = std::abs(v_mem[i]); v_mem[i] = val; if(val > max_abs_v) { max_abs_v = val; } } // set tolerance to default if it hasn't been specified if(tol == T(0)) { tol = (std::max)(A.n_rows, A.n_cols) * max_abs_v * std::numeric_limits::epsilon(); } uword count = 0; for(uword i=0; i < v_n_elem; ++i) { count += (v_mem[i] > tol) ? uword(1) : uword(0); } out = count; return true; } template inline bool op_rank::apply_gen(uword& out, Mat& A, typename get_pod_type::result tol) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; Col s; const bool status = auxlib::svd_dc(s, A); if(status == false) { out = uword(0); return false; } const uword s_n_elem = s.n_elem; const T* s_mem = s.memptr(); if(s_n_elem == 0) { out = uword(0); return true; } // set tolerance to default if it hasn't been specified if(tol == T(0)) { tol = (std::max)(A.n_rows, A.n_cols) * s_mem[0] * std::numeric_limits::epsilon(); } uword count = 0; for(uword i=0; i < s_n_elem; ++i) { count += (s_mem[i] > tol) ? uword(1) : uword(0); } out = count; return true; } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_join_meat.hpp0000644000176200001440000002671614124060717024100 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_join //! @{ template inline void glue_join_cols::apply_noalias(Mat& out, const Proxy& A, const Proxy& B) { arma_extra_debug_sigprint(); const uword A_n_rows = A.get_n_rows(); const uword A_n_cols = A.get_n_cols(); const uword B_n_rows = B.get_n_rows(); const uword B_n_cols = B.get_n_cols(); arma_debug_check ( ( (A_n_cols != B_n_cols) && ( (A_n_rows > 0) || (A_n_cols > 0) ) && ( (B_n_rows > 0) || (B_n_cols > 0) ) ), "join_cols() / join_vert(): number of columns must be the same" ); out.set_size( A_n_rows + B_n_rows, (std::max)(A_n_cols, B_n_cols) ); if( out.n_elem > 0 ) { if(A.get_n_elem() > 0) { out.submat(0, 0, A_n_rows-1, out.n_cols-1) = A.Q; } if(B.get_n_elem() > 0) { out.submat(A_n_rows, 0, out.n_rows-1, out.n_cols-1) = B.Q; } } } template inline void glue_join_cols::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy A(X.A); const Proxy B(X.B); if( (A.is_alias(out) == false) && (B.is_alias(out) == false) ) { glue_join_cols::apply_noalias(out, A, B); } else { Mat tmp; glue_join_cols::apply_noalias(tmp, A, B); out.steal_mem(tmp); } } template inline void glue_join_cols::apply(Mat& out, const Base& A_expr, const Base& B_expr, const Base& C_expr) { arma_extra_debug_sigprint(); const quasi_unwrap UA(A_expr.get_ref()); const quasi_unwrap UB(B_expr.get_ref()); const quasi_unwrap UC(C_expr.get_ref()); const Mat& A = UA.M; const Mat& B = UB.M; const Mat& C = UC.M; const uword out_n_rows = A.n_rows + B.n_rows + C.n_rows; const uword out_n_cols = (std::max)((std::max)(A.n_cols, B.n_cols), C.n_cols); arma_debug_check( ((A.n_cols != out_n_cols) && ((A.n_rows > 0) || (A.n_cols > 0))), "join_cols() / join_vert(): number of columns must be the same" ); arma_debug_check( ((B.n_cols != out_n_cols) && ((B.n_rows > 0) || (B.n_cols > 0))), "join_cols() / join_vert(): number of columns must be the same" ); arma_debug_check( ((C.n_cols != out_n_cols) && ((C.n_rows > 0) || (C.n_cols > 0))), "join_cols() / join_vert(): number of columns must be the same" ); out.set_size(out_n_rows, out_n_cols); if(out.n_elem == 0) { return; } uword row_start = 0; uword row_end_p1 = 0; if(A.n_elem > 0) { row_end_p1 += A.n_rows; out.rows(row_start, row_end_p1 - 1) = A; } row_start = row_end_p1; if(B.n_elem > 0) { row_end_p1 += B.n_rows; out.rows(row_start, row_end_p1 - 1) = B; } row_start = row_end_p1; if(C.n_elem > 0) { row_end_p1 += C.n_rows; out.rows(row_start, row_end_p1 - 1) = C; } } template inline void glue_join_cols::apply(Mat& out, const Base& A_expr, const Base& B_expr, const Base& C_expr, const Base& D_expr) { arma_extra_debug_sigprint(); const quasi_unwrap UA(A_expr.get_ref()); const quasi_unwrap UB(B_expr.get_ref()); const quasi_unwrap UC(C_expr.get_ref()); const quasi_unwrap UD(D_expr.get_ref()); const Mat& A = UA.M; const Mat& B = UB.M; const Mat& C = UC.M; const Mat& D = UD.M; const uword out_n_rows = A.n_rows + B.n_rows + C.n_rows + D.n_rows; const uword out_n_cols = (std::max)(((std::max)((std::max)(A.n_cols, B.n_cols), C.n_cols)), D.n_cols); arma_debug_check( ((A.n_cols != out_n_cols) && ((A.n_rows > 0) || (A.n_cols > 0))), "join_cols() / join_vert(): number of columns must be the same" ); arma_debug_check( ((B.n_cols != out_n_cols) && ((B.n_rows > 0) || (B.n_cols > 0))), "join_cols() / join_vert(): number of columns must be the same" ); arma_debug_check( ((C.n_cols != out_n_cols) && ((C.n_rows > 0) || (C.n_cols > 0))), "join_cols() / join_vert(): number of columns must be the same" ); arma_debug_check( ((D.n_cols != out_n_cols) && ((D.n_rows > 0) || (D.n_cols > 0))), "join_cols() / join_vert(): number of columns must be the same" ); out.set_size(out_n_rows, out_n_cols); if(out.n_elem == 0) { return; } uword row_start = 0; uword row_end_p1 = 0; if(A.n_elem > 0) { row_end_p1 += A.n_rows; out.rows(row_start, row_end_p1 - 1) = A; } row_start = row_end_p1; if(B.n_elem > 0) { row_end_p1 += B.n_rows; out.rows(row_start, row_end_p1 - 1) = B; } row_start = row_end_p1; if(C.n_elem > 0) { row_end_p1 += C.n_rows; out.rows(row_start, row_end_p1 - 1) = C; } row_start = row_end_p1; if(D.n_elem > 0) { row_end_p1 += D.n_rows; out.rows(row_start, row_end_p1 - 1) = D; } } template inline void glue_join_rows::apply_noalias(Mat& out, const Proxy& A, const Proxy& B) { arma_extra_debug_sigprint(); const uword A_n_rows = A.get_n_rows(); const uword A_n_cols = A.get_n_cols(); const uword B_n_rows = B.get_n_rows(); const uword B_n_cols = B.get_n_cols(); arma_debug_check ( ( (A_n_rows != B_n_rows) && ( (A_n_rows > 0) || (A_n_cols > 0) ) && ( (B_n_rows > 0) || (B_n_cols > 0) ) ), "join_rows() / join_horiz(): number of rows must be the same" ); out.set_size( (std::max)(A_n_rows, B_n_rows), A_n_cols + B_n_cols ); if( out.n_elem > 0 ) { if(A.get_n_elem() > 0) { out.submat(0, 0, out.n_rows-1, A_n_cols-1) = A.Q; } if(B.get_n_elem() > 0) { out.submat(0, A_n_cols, out.n_rows-1, out.n_cols-1) = B.Q; } } } template inline void glue_join_rows::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy A(X.A); const Proxy B(X.B); if( (A.is_alias(out) == false) && (B.is_alias(out) == false) ) { glue_join_rows::apply_noalias(out, A, B); } else { Mat tmp; glue_join_rows::apply_noalias(tmp, A, B); out.steal_mem(tmp); } } template inline void glue_join_rows::apply(Mat& out, const Base& A_expr, const Base& B_expr, const Base& C_expr) { arma_extra_debug_sigprint(); const quasi_unwrap UA(A_expr.get_ref()); const quasi_unwrap UB(B_expr.get_ref()); const quasi_unwrap UC(C_expr.get_ref()); const Mat& A = UA.M; const Mat& B = UB.M; const Mat& C = UC.M; const uword out_n_rows = (std::max)((std::max)(A.n_rows, B.n_rows), C.n_rows); const uword out_n_cols = A.n_cols + B.n_cols + C.n_cols; arma_debug_check( ((A.n_rows != out_n_rows) && ((A.n_rows > 0) || (A.n_cols > 0))), "join_rows() / join_horiz(): number of rows must be the same" ); arma_debug_check( ((B.n_rows != out_n_rows) && ((B.n_rows > 0) || (B.n_cols > 0))), "join_rows() / join_horiz(): number of rows must be the same" ); arma_debug_check( ((C.n_rows != out_n_rows) && ((C.n_rows > 0) || (C.n_cols > 0))), "join_rows() / join_horiz(): number of rows must be the same" ); out.set_size(out_n_rows, out_n_cols); if(out.n_elem == 0) { return; } uword col_start = 0; uword col_end_p1 = 0; if(A.n_elem > 0) { col_end_p1 += A.n_cols; out.cols(col_start, col_end_p1 - 1) = A; } col_start = col_end_p1; if(B.n_elem > 0) { col_end_p1 += B.n_cols; out.cols(col_start, col_end_p1 - 1) = B; } col_start = col_end_p1; if(C.n_elem > 0) { col_end_p1 += C.n_cols; out.cols(col_start, col_end_p1 - 1) = C; } } template inline void glue_join_rows::apply(Mat& out, const Base& A_expr, const Base& B_expr, const Base& C_expr, const Base& D_expr) { arma_extra_debug_sigprint(); const quasi_unwrap UA(A_expr.get_ref()); const quasi_unwrap UB(B_expr.get_ref()); const quasi_unwrap UC(C_expr.get_ref()); const quasi_unwrap UD(D_expr.get_ref()); const Mat& A = UA.M; const Mat& B = UB.M; const Mat& C = UC.M; const Mat& D = UD.M; const uword out_n_rows = (std::max)(((std::max)((std::max)(A.n_rows, B.n_rows), C.n_rows)), D.n_rows); const uword out_n_cols = A.n_cols + B.n_cols + C.n_cols + D.n_cols; arma_debug_check( ((A.n_rows != out_n_rows) && ((A.n_rows > 0) || (A.n_cols > 0))), "join_rows() / join_horiz(): number of rows must be the same" ); arma_debug_check( ((B.n_rows != out_n_rows) && ((B.n_rows > 0) || (B.n_cols > 0))), "join_rows() / join_horiz(): number of rows must be the same" ); arma_debug_check( ((C.n_rows != out_n_rows) && ((C.n_rows > 0) || (C.n_cols > 0))), "join_rows() / join_horiz(): number of rows must be the same" ); arma_debug_check( ((D.n_rows != out_n_rows) && ((D.n_rows > 0) || (D.n_cols > 0))), "join_rows() / join_horiz(): number of rows must be the same" ); out.set_size(out_n_rows, out_n_cols); if(out.n_elem == 0) { return; } uword col_start = 0; uword col_end_p1 = 0; if(A.n_elem > 0) { col_end_p1 += A.n_cols; out.cols(col_start, col_end_p1 - 1) = A; } col_start = col_end_p1; if(B.n_elem > 0) { col_end_p1 += B.n_cols; out.cols(col_start, col_end_p1 - 1) = B; } col_start = col_end_p1; if(C.n_elem > 0) { col_end_p1 += C.n_cols; out.cols(col_start, col_end_p1 - 1) = C; } col_start = col_end_p1; if(D.n_elem > 0) { col_end_p1 += D.n_cols; out.cols(col_start, col_end_p1 - 1) = D; } } template inline void glue_join_slices::apply(Cube& out, const GlueCube& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_cube A_tmp(X.A); const unwrap_cube B_tmp(X.B); const Cube& A = A_tmp.M; const Cube& B = B_tmp.M; if(A.n_elem == 0) { out = B; return; } if(B.n_elem == 0) { out = A; return; } arma_debug_check( ( (A.n_rows != B.n_rows) || (A.n_cols != B.n_cols) ), "join_slices(): size of slices must be the same" ); if( (&out != &A) && (&out != &B) ) { out.set_size(A.n_rows, A.n_cols, A.n_slices + B.n_slices); out.slices(0, A.n_slices-1 ) = A; out.slices(A.n_slices, out.n_slices-1) = B; } else // we have aliasing { Cube C(A.n_rows, A.n_cols, A.n_slices + B.n_slices, arma_nozeros_indicator()); C.slices(0, A.n_slices-1) = A; C.slices(A.n_slices, C.n_slices-1) = B; out.steal_mem(C); } } //! @} RcppArmadillo/inst/include/armadillo_bits/xtrans_mat_bones.hpp0000644000176200001440000000330514124060717024452 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup xtrans_mat //! @{ template class xtrans_mat : public Base< eT, xtrans_mat > { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; static constexpr bool really_do_conj = (do_conj && is_cx::yes); arma_aligned const Mat& X; arma_aligned mutable Mat Y; arma_aligned const uword n_rows; arma_aligned const uword n_cols; arma_aligned const uword n_elem; inline explicit xtrans_mat(const Mat& in_X); inline void extract(Mat& out) const; inline eT operator[](const uword ii) const; inline eT at_alt (const uword ii) const; arma_inline eT at(const uword in_row, const uword in_col) const; }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_histc.hpp0000644000176200001440000000327714124060717022711 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_histc //! @{ template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && is_arma_type::value && is_cx::no && is_same_type::value, const mtGlue >::result histc(const T1& X, const T2& Y) { arma_extra_debug_sigprint(); return mtGlue(X, Y); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && is_arma_type::value && is_cx::no && is_same_type::value, const mtGlue >::result histc(const T1& X, const T2& Y, const uword dim) { arma_extra_debug_sigprint(); return mtGlue(X, Y, dim); } //! @} RcppArmadillo/inst/include/armadillo_bits/injector_bones.hpp0000644000176200001440000000527214124060717024114 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup injector //! @{ template class mat_injector_row { public: arma_cold inline mat_injector_row(); arma_cold inline void insert(const eT val) const; mutable uword n_cols; mutable podarray A; mutable podarray B; }; template class mat_injector { public: typedef typename T1::elem_type elem_type; arma_cold inline void insert(const elem_type val) const; arma_cold inline void end_of_row() const; arma_cold inline ~mat_injector(); private: arma_cold inline mat_injector(T1& in_X, const elem_type val); arma_cold inline mat_injector(T1& in_X, const injector_end_of_row<>& x); T1& X; mutable uword n_rows; mutable podarray< mat_injector_row* >* AA; mutable podarray< mat_injector_row* >* BB; friend class Mat; friend class Row; friend class Col; }; // template class field_injector_row { public: arma_cold inline field_injector_row(); arma_cold inline ~field_injector_row(); arma_cold inline void insert(const oT& val) const; mutable uword n_cols; mutable field* AA; mutable field* BB; }; template class field_injector { public: typedef typename T1::object_type object_type; arma_cold inline void insert(const object_type& val) const; arma_cold inline void end_of_row() const; arma_cold inline ~field_injector(); private: arma_cold inline field_injector(T1& in_X, const object_type& val); arma_cold inline field_injector(T1& in_X, const injector_end_of_row<>& x); T1& X; mutable uword n_rows; mutable podarray< field_injector_row* >* AA; mutable podarray< field_injector_row* >* BB; friend class field; }; //! @} RcppArmadillo/inst/include/armadillo_bits/SpSubview_col_list_meat.hpp0000644000176200001440000003363214124060717025737 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpSubview_col_list //! @{ template inline SpSubview_col_list::~SpSubview_col_list() { arma_extra_debug_sigprint(); } template arma_inline SpSubview_col_list::SpSubview_col_list ( const SpMat& in_m, const Base& in_ci ) : m (in_m ) , U_ci(in_ci.get_ref()) { arma_extra_debug_sigprint(); const umat& ci = U_ci.M; const uword* ci_mem = ci.memptr(); const uword ci_n_elem = ci.n_elem; arma_debug_check ( ( (ci.is_vec() == false) && (ci.is_empty() == false) ), "SpMat::cols(): given object must be a vector" ); for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) { const uword i = ci_mem[ci_count]; arma_debug_check_bounds( (i >= in_m.n_cols), "SpMat::cols(): index out of bounds" ); } } //! apply a functor to each element template template inline void SpSubview_col_list::for_each(functor F) { arma_extra_debug_sigprint(); SpMat tmp(*this); tmp.for_each(F); (*this).operator=(tmp); } template template inline void SpSubview_col_list::for_each(functor F) const { arma_extra_debug_sigprint(); const SpMat tmp(*this); tmp.for_each(F); } //! transform each element using a functor template template inline void SpSubview_col_list::transform(functor F) { arma_extra_debug_sigprint(); SpMat tmp(*this); tmp.transform(F); (*this).operator=(tmp); } template inline void SpSubview_col_list::replace(const eT old_val, const eT new_val) { arma_extra_debug_sigprint(); SpMat tmp(*this); tmp.replace(old_val, new_val); (*this).operator=(tmp); } template inline void SpSubview_col_list::clean(const typename get_pod_type::result threshold) { arma_extra_debug_sigprint(); SpMat tmp(*this); tmp.clean(threshold); (*this).operator=(tmp); } template inline void SpSubview_col_list::fill(const eT val) { arma_extra_debug_sigprint(); Mat tmp(m.n_rows, U_ci.M.n_elem, arma_nozeros_indicator()); tmp.fill(val); (*this).operator=(tmp); } template inline void SpSubview_col_list::zeros() { arma_extra_debug_sigprint(); SpMat& m_local = const_cast< SpMat& >(m); const umat& ci = U_ci.M; const uword* ci_mem = ci.memptr(); const uword ci_n_elem = ci.n_elem; m_local.sync_csc(); m_local.invalidate_cache(); for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) { const uword i = ci_mem[ci_count]; const uword col_n_nonzero = m_local.col_ptrs[i+1] - m_local.col_ptrs[i]; uword offset = m_local.col_ptrs[i]; for(uword j=0; j < col_n_nonzero; ++j) { access::rw(m_local.values[offset]) = eT(0); ++offset; } } m_local.remove_zeros(); } template inline void SpSubview_col_list::ones() { arma_extra_debug_sigprint(); const Mat tmp(m.n_rows, U_ci.M.n_elem, fill::ones); (*this).operator=(tmp); } template inline void SpSubview_col_list::operator+= (const eT val) { arma_extra_debug_sigprint(); const SpMat tmp1(*this); Mat tmp2(tmp1.n_rows, tmp1.n_cols, arma_nozeros_indicator()); tmp2.fill(val); const Mat tmp3 = tmp1 + tmp2; (*this).operator=(tmp3); } template inline void SpSubview_col_list::operator-= (const eT val) { arma_extra_debug_sigprint(); const SpMat tmp1(*this); Mat tmp2(tmp1.n_rows, tmp1.n_cols, arma_nozeros_indicator()); tmp2.fill(val); const Mat tmp3 = tmp1 - tmp2; (*this).operator=(tmp3); } template inline void SpSubview_col_list::operator*= (const eT val) { arma_extra_debug_sigprint(); if(val == eT(0)) { (*this).zeros(); return; } SpMat& m_local = const_cast< SpMat& >(m); const umat& ci = U_ci.M; const uword* ci_mem = ci.memptr(); const uword ci_n_elem = ci.n_elem; m_local.sync_csc(); m_local.invalidate_cache(); bool has_zero = false; for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) { const uword i = ci_mem[ci_count]; const uword col_n_nonzero = m_local.col_ptrs[i+1] - m_local.col_ptrs[i]; uword offset = m_local.col_ptrs[i]; for(uword j=0; j < col_n_nonzero; ++j) { eT& m_local_val = access::rw(m_local.values[offset]); m_local_val *= val; if(m_local_val == eT(0)) { has_zero = true; } ++offset; } } if(has_zero) { m_local.remove_zeros(); } } template inline void SpSubview_col_list::operator/= (const eT val) { arma_extra_debug_sigprint(); const SpMat tmp1(*this); Mat tmp2(tmp1.n_rows, tmp1.n_cols, arma_nozeros_indicator()); tmp2.fill(val); const SpMat tmp3 = tmp1 / tmp2; (*this).operator=(tmp3); } template template inline void SpSubview_col_list::operator= (const Base& x) { arma_extra_debug_sigprint(); const quasi_unwrap U(x.get_ref()); const Mat& X = U.M; SpMat& m_local = const_cast< SpMat& >(m); const umat& ci = U_ci.M; const uword* ci_mem = ci.memptr(); const uword ci_n_elem = ci.n_elem; arma_debug_assert_same_size( m_local.n_rows, ci_n_elem, X.n_rows, X.n_cols, "SpMat::cols()" ); const uword X_n_elem = X.n_elem; const eT* X_mem = X.memptr(); uword X_n_nonzero = 0; for(uword i=0; i < X_n_elem; ++i) { X_n_nonzero += (X_mem[i] != eT(0)) ? uword(1) : uword(0); } SpMat Y(arma_reserve_indicator(), X.n_rows, m_local.n_cols, X_n_nonzero); uword count = 0; for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) { const uword i = ci_mem[ci_count]; for(uword row=0; row < X.n_rows; ++row) { const eT X_val = (*X_mem); ++X_mem; if(X_val != eT(0)) { access::rw(Y.row_indices[count]) = row; access::rw(Y.values [count]) = X_val; ++count; ++access::rw(Y.col_ptrs[i + 1]); } } } // fix the column pointers for(uword i = 0; i < Y.n_cols; ++i) { access::rw(Y.col_ptrs[i+1]) += Y.col_ptrs[i]; } (*this).zeros(); SpMat tmp = m_local + Y; m_local.steal_mem(tmp); } template template inline void SpSubview_col_list::operator+= (const Base& x) { arma_extra_debug_sigprint(); const Mat tmp = SpMat(*this) + x.get_ref(); (*this).operator=(tmp); } template template inline void SpSubview_col_list::operator-= (const Base& x) { arma_extra_debug_sigprint(); const Mat tmp = SpMat(*this) - x.get_ref(); (*this).operator=(tmp); } template template inline void SpSubview_col_list::operator%= (const Base& x) { arma_extra_debug_sigprint(); const SpMat tmp = SpMat(*this) % x.get_ref(); (*this).operator=(tmp); } template template inline void SpSubview_col_list::operator/= (const Base& x) { arma_extra_debug_sigprint(); const SpMat tmp = SpMat(*this) / x.get_ref(); (*this).operator=(tmp); } template inline void SpSubview_col_list::operator= (const SpSubview_col_list& x) { arma_extra_debug_sigprint(); const SpMat tmp(x); (*this).operator=(tmp); } template template inline void SpSubview_col_list::operator= (const SpSubview_col_list& x) { arma_extra_debug_sigprint(); const SpMat tmp(x); (*this).operator=(tmp); } template template inline void SpSubview_col_list::operator= (const SpBase& x) { arma_extra_debug_sigprint(); const unwrap_spmat U(x.get_ref()); const SpMat& X = U.M; if(U.is_alias(m)) { const SpMat tmp(X); (*this).operator=(tmp); return; } SpMat& m_local = const_cast< SpMat& >(m); const umat& ci = U_ci.M; const uword* ci_mem = ci.memptr(); const uword ci_n_elem = ci.n_elem; arma_debug_assert_same_size( m_local.n_rows, ci_n_elem, X.n_rows, X.n_cols, "SpMat::cols()" ); SpMat Y(arma_reserve_indicator(), X.n_rows, m_local.n_cols, X.n_nonzero); uword count = 0; for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) { const uword i = ci_mem[ci_count]; typename SpMat::const_col_iterator X_col_it = X.begin_col(ci_count); typename SpMat::const_col_iterator X_col_it_end = X.end_col(ci_count); while(X_col_it != X_col_it_end) { access::rw(Y.row_indices[count]) = X_col_it.row(); access::rw(Y.values [count]) = (*X_col_it); ++count; ++access::rw(Y.col_ptrs[i + 1]); ++X_col_it; } } // fix the column pointers for(uword i = 0; i < Y.n_cols; ++i) { access::rw(Y.col_ptrs[i+1]) += Y.col_ptrs[i]; } (*this).zeros(); SpMat tmp = m_local + Y; m_local.steal_mem(tmp); } template template inline void SpSubview_col_list::operator+= (const SpBase& x) { arma_extra_debug_sigprint(); const SpMat tmp = SpMat(*this) + x.get_ref(); (*this).operator=(tmp); } template template inline void SpSubview_col_list::operator-= (const SpBase& x) { arma_extra_debug_sigprint(); const SpMat tmp = SpMat(*this) - x.get_ref(); (*this).operator=(tmp); } template template inline void SpSubview_col_list::operator%= (const SpBase& x) { arma_extra_debug_sigprint(); const SpMat tmp = SpMat(*this) % x.get_ref(); (*this).operator=(tmp); } template template inline void SpSubview_col_list::operator/= (const SpBase& x) { arma_extra_debug_sigprint(); SpMat tmp(*this); tmp /= x.get_ref(); (*this).operator=(tmp); } // // template inline void SpSubview_col_list::extract(SpMat& out, const SpSubview_col_list& in) { arma_extra_debug_sigprint(); // NOTE: aliasing is handled by SpMat::operator=(const SpSubview_col_list& in) const umat& ci = in.U_ci.M; const uword* ci_mem = ci.memptr(); const uword ci_n_elem = ci.n_elem; const SpMat& in_m = in.m; in_m.sync_csc(); uword total_n_nonzero = 0; for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) { const uword i = ci_mem[ci_count]; const uword col_n_nonzero = in_m.col_ptrs[i+1] - in_m.col_ptrs[i]; total_n_nonzero += col_n_nonzero; } out.reserve(in.m.n_rows, ci_n_elem, total_n_nonzero); uword out_n_nonzero = 0; uword out_col_count = 0; for(uword ci_count=0; ci_count < ci_n_elem; ++ci_count) { const uword i = ci_mem[ci_count]; const uword col_n_nonzero = in_m.col_ptrs[i+1] - in_m.col_ptrs[i]; uword offset = in_m.col_ptrs[i]; for(uword j=0; j < col_n_nonzero; ++j) { const eT val = in_m.values [ offset ]; const uword row = in_m.row_indices[ offset ]; ++offset; access::rw(out.values [out_n_nonzero]) = val; access::rw(out.row_indices[out_n_nonzero]) = row; access::rw(out.col_ptrs[out_col_count+1])++; ++out_n_nonzero; } ++out_col_count; } // fix the column pointers for(uword i = 0; i < out.n_cols; ++i) { access::rw(out.col_ptrs[i+1]) += out.col_ptrs[i]; } } template inline void SpSubview_col_list::plus_inplace(SpMat& out, const SpSubview_col_list& in) { arma_extra_debug_sigprint(); const SpMat tmp(in); out += tmp; } template inline void SpSubview_col_list::minus_inplace(SpMat& out, const SpSubview_col_list& in) { arma_extra_debug_sigprint(); const SpMat tmp(in); out -= tmp; } template inline void SpSubview_col_list::schur_inplace(SpMat& out, const SpSubview_col_list& in) { arma_extra_debug_sigprint(); const SpMat tmp(in); out %= tmp; } template inline void SpSubview_col_list::div_inplace(SpMat& out, const SpSubview_col_list& in) { arma_extra_debug_sigprint(); const SpMat tmp(in); out /= tmp; } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_powmat.hpp0000644000176200001440000000560314124060717023101 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_powmat //! @{ template arma_warn_unused inline typename enable_if2< is_supported_blas_type::value, const Op >::result powmat(const Base& X, const int y) { arma_extra_debug_sigprint(); const uword aux_a = (y < int(0)) ? uword(-y) : uword(y); const uword aux_b = (y < int(0)) ? uword(1) : uword(0); return Op(X.get_ref(), aux_a, aux_b); } template inline typename enable_if2< is_supported_blas_type::value, bool >::result powmat ( Mat& out, const Base& X, const int y ) { arma_extra_debug_sigprint(); const uword y_val = (y < int(0)) ? uword(-y) : uword(y); const bool y_neg = (y < int(0)); const bool status = op_powmat::apply_direct(out, X.get_ref(), y_val, y_neg); if(status == false) { out.soft_reset(); arma_debug_warn_level(3, "powmat(): transformation failed"); } return status; } template arma_warn_unused inline typename enable_if2< is_supported_blas_type::value, const mtOp,T1,op_powmat_cx> >::result powmat(const Base& X, const double y) { arma_extra_debug_sigprint(); typedef std::complex out_eT; return mtOp('j', X.get_ref(), out_eT(y)); } template inline typename enable_if2< is_supported_blas_type::value, bool >::result powmat ( Mat< std::complex >& out, const Base& X, const double y ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; const bool status = op_powmat_cx::apply_direct(out, X.get_ref(), T(y)); if(status == false) { out.soft_reset(); arma_debug_warn_level(3, "powmat(): transformation failed"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/mtOpCube_meat.hpp0000644000176200001440000000527314124060717023636 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup mtOpCube //! @{ template inline mtOpCube::mtOpCube(const T1& in_m) : m(in_m) { arma_extra_debug_sigprint(); } template inline mtOpCube::mtOpCube(const T1& in_m, const typename T1::elem_type in_aux) : m(in_m) , aux(in_aux) { arma_extra_debug_sigprint(); } template inline mtOpCube::mtOpCube(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c) : m(in_m) , aux_uword_a(in_aux_uword_a) , aux_uword_b(in_aux_uword_b) , aux_uword_c(in_aux_uword_c) { arma_extra_debug_sigprint(); } template inline mtOpCube::mtOpCube(const T1& in_m, const typename T1::elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c) : m(in_m) , aux(in_aux) , aux_uword_a(in_aux_uword_a) , aux_uword_b(in_aux_uword_b) , aux_uword_c(in_aux_uword_c) { arma_extra_debug_sigprint(); } template inline mtOpCube::mtOpCube(const char junk, const T1& in_m, const out_eT in_aux) : m(in_m) , aux_out_eT(in_aux) { arma_extra_debug_sigprint(); arma_ignore(junk); } template inline mtOpCube::mtOpCube(const mtOpCube_dual_aux_indicator&, const T1& in_m, const typename T1::elem_type in_aux_a, const out_eT in_aux_b) : m (in_m ) , aux (in_aux_a) , aux_out_eT(in_aux_b) { arma_extra_debug_sigprint(); } template inline mtOpCube::~mtOpCube() { arma_extra_debug_sigprint(); } //! @} RcppArmadillo/inst/include/armadillo_bits/spglue_minus_meat.hpp0000644000176200001440000002056414124060717024632 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_minus //! @{ template arma_hot inline void spglue_minus::apply(SpMat& out, const SpGlue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const SpProxy pa(X.A); const SpProxy pb(X.B); const bool is_alias = pa.is_alias(out) || pb.is_alias(out); if(is_alias == false) { spglue_minus::apply_noalias(out, pa, pb); } else { SpMat tmp; spglue_minus::apply_noalias(tmp, pa, pb); out.steal_mem(tmp); } } template arma_hot inline void spglue_minus::apply_noalias(SpMat& out, const SpProxy& pa, const SpProxy& pb) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(pa.get_n_rows(), pa.get_n_cols(), pb.get_n_rows(), pb.get_n_cols(), "subtraction"); if(pa.get_n_nonzero() == 0) { out = pb.Q; out *= eT(-1); return; } if(pb.get_n_nonzero() == 0) { out = pa.Q; return; } const uword max_n_nonzero = pa.get_n_nonzero() + pb.get_n_nonzero(); // Resize memory to upper bound out.reserve(pa.get_n_rows(), pa.get_n_cols(), max_n_nonzero); // Now iterate across both matrices. typename SpProxy::const_iterator_type x_it = pa.begin(); typename SpProxy::const_iterator_type x_end = pa.end(); typename SpProxy::const_iterator_type y_it = pb.begin(); typename SpProxy::const_iterator_type y_end = pb.end(); uword count = 0; while( (x_it != x_end) || (y_it != y_end) ) { eT out_val; const uword x_it_row = x_it.row(); const uword x_it_col = x_it.col(); const uword y_it_row = y_it.row(); const uword y_it_col = y_it.col(); bool use_y_loc = false; if(x_it == y_it) { out_val = (*x_it) - (*y_it); ++x_it; ++y_it; } else { if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end { out_val = (*x_it); ++x_it; } else { out_val = -(*y_it); // take the negative ++y_it; use_y_loc = true; } } if(out_val != eT(0)) { access::rw(out.values[count]) = out_val; const uword out_row = (use_y_loc == false) ? x_it_row : y_it_row; const uword out_col = (use_y_loc == false) ? x_it_col : y_it_col; access::rw(out.row_indices[count]) = out_row; access::rw(out.col_ptrs[out_col + 1])++; ++count; } arma_check( (count > max_n_nonzero), "internal error: spglue_minus::apply_noalias(): count > max_n_nonzero" ); } const uword out_n_cols = out.n_cols; uword* col_ptrs = access::rwp(out.col_ptrs); // Fix column pointers to be cumulative. for(uword c = 1; c <= out_n_cols; ++c) { col_ptrs[c] += col_ptrs[c - 1]; } if(count < max_n_nonzero) { if(count <= (max_n_nonzero/2)) { out.mem_resize(count); } else { // quick resize without reallocating memory and copying data access::rw( out.n_nonzero) = count; access::rw( out.values[count]) = eT(0); access::rw(out.row_indices[count]) = uword(0); } } } template arma_hot inline void spglue_minus::apply_noalias(SpMat& out, const SpMat& A, const SpMat& B) { arma_extra_debug_sigprint(); const SpProxy< SpMat > pa(A); const SpProxy< SpMat > pb(B); spglue_minus::apply_noalias(out, pa, pb); } // template inline void spglue_minus_mixed::apply(SpMat::eT>& out, const mtSpGlue::eT, T1, T2, spglue_minus_mixed>& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); if( (is_same_type::no) && (is_same_type::yes) ) { // upgrade T1 const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; SpMat AA(arma_layout_indicator(), A); for(uword i=0; i < A.n_nonzero; ++i) { access::rw(AA.values[i]) = out_eT(A.values[i]); } const SpMat& BB = reinterpret_cast< const SpMat& >(B); out = AA - BB; } else if( (is_same_type::yes) && (is_same_type::no) ) { // upgrade T2 const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; const SpMat& AA = reinterpret_cast< const SpMat& >(A); SpMat BB(arma_layout_indicator(), B); for(uword i=0; i < B.n_nonzero; ++i) { access::rw(BB.values[i]) = out_eT(B.values[i]); } out = AA - BB; } else { // upgrade T1 and T2 const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; SpMat AA(arma_layout_indicator(), A); SpMat BB(arma_layout_indicator(), B); for(uword i=0; i < A.n_nonzero; ++i) { access::rw(AA.values[i]) = out_eT(A.values[i]); } for(uword i=0; i < B.n_nonzero; ++i) { access::rw(BB.values[i]) = out_eT(B.values[i]); } out = AA - BB; } } template inline void spglue_minus_mixed::sparse_minus_dense(Mat< typename promote_type::result>& out, const T1& X, const T2& Y) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); const quasi_unwrap UB(Y); const Mat& B = UB.M; const uword B_n_elem = B.n_elem; const eT2* B_mem = B.memptr(); out.set_size(B.n_rows, B.n_cols); out_eT* out_mem = out.memptr(); for(uword i=0; i pa(X); arma_debug_assert_same_size( pa.get_n_rows(), pa.get_n_cols(), out.n_rows, out.n_cols, "subtraction" ); typename SpProxy::const_iterator_type it = pa.begin(); typename SpProxy::const_iterator_type it_end = pa.end(); while(it != it_end) { out.at(it.row(), it.col()) += out_eT(*it); ++it; } } template inline void spglue_minus_mixed::dense_minus_sparse(Mat< typename promote_type::result>& out, const T1& X, const T2& Y) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); if(is_same_type::no) { out = conv_to< Mat >::from(X); } else { const quasi_unwrap UA(X); const Mat& A = UA.M; out = reinterpret_cast< const Mat& >(A); } const SpProxy pb(Y); arma_debug_assert_same_size( out.n_rows, out.n_cols, pb.get_n_rows(), pb.get_n_cols(), "subtraction" ); typename SpProxy::const_iterator_type it = pb.begin(); typename SpProxy::const_iterator_type it_end = pb.end(); while(it != it_end) { out.at(it.row(), it.col()) -= out_eT(*it); ++it; } } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_solve_bones.hpp0000644000176200001440000001315414124060717024441 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_solve //! @{ class glue_solve_gen { public: template struct traits { static constexpr bool is_row = false; static constexpr bool is_col = T2::is_col; static constexpr bool is_xvec = false; }; template inline static void apply(Mat& out, const Glue& X); template inline static bool apply(Mat& out, const Base& A_expr, const Base& B_expr, const uword flags); }; class glue_solve_tri_default { public: template struct traits { static constexpr bool is_row = false; static constexpr bool is_col = T2::is_col; static constexpr bool is_xvec = false; }; template inline static void apply(Mat& out, const Glue& X); template inline static bool apply(Mat& out, const Base& A_expr, const Base& B_expr, const uword flags); }; class glue_solve_tri { public: template struct traits { static constexpr bool is_row = false; static constexpr bool is_col = T2::is_col; static constexpr bool is_xvec = false; }; template inline static void apply(Mat& out, const Glue& X); template inline static bool apply(Mat& out, const Base& A_expr, const Base& B_expr, const uword flags); }; namespace solve_opts { struct opts { const uword flags; inline explicit opts(const uword in_flags); inline const opts operator+(const opts& rhs) const; }; inline opts::opts(const uword in_flags) : flags(in_flags) {} inline const opts opts::operator+(const opts& rhs) const { const opts result( flags | rhs.flags ); return result; } // The values below (eg. 1u << 1) are for internal Armadillo use only. // The values can change without notice. static constexpr uword flag_none = uword(0 ); static constexpr uword flag_fast = uword(1u << 0); static constexpr uword flag_equilibrate = uword(1u << 1); static constexpr uword flag_no_approx = uword(1u << 2); static constexpr uword flag_triu = uword(1u << 3); static constexpr uword flag_tril = uword(1u << 4); static constexpr uword flag_no_band = uword(1u << 5); static constexpr uword flag_no_sympd = uword(1u << 6); static constexpr uword flag_allow_ugly = uword(1u << 7); static constexpr uword flag_likely_sympd = uword(1u << 8); static constexpr uword flag_refine = uword(1u << 9); static constexpr uword flag_no_trimat = uword(1u << 10); static constexpr uword flag_force_approx = uword(1u << 11); struct opts_none : public opts { inline opts_none() : opts(flag_none ) {} }; struct opts_fast : public opts { inline opts_fast() : opts(flag_fast ) {} }; struct opts_equilibrate : public opts { inline opts_equilibrate() : opts(flag_equilibrate ) {} }; struct opts_no_approx : public opts { inline opts_no_approx() : opts(flag_no_approx ) {} }; struct opts_triu : public opts { inline opts_triu() : opts(flag_triu ) {} }; struct opts_tril : public opts { inline opts_tril() : opts(flag_tril ) {} }; struct opts_no_band : public opts { inline opts_no_band() : opts(flag_no_band ) {} }; struct opts_no_sympd : public opts { inline opts_no_sympd() : opts(flag_no_sympd ) {} }; struct opts_allow_ugly : public opts { inline opts_allow_ugly() : opts(flag_allow_ugly ) {} }; struct opts_likely_sympd : public opts { inline opts_likely_sympd() : opts(flag_likely_sympd) {} }; struct opts_refine : public opts { inline opts_refine() : opts(flag_refine ) {} }; struct opts_no_trimat : public opts { inline opts_no_trimat() : opts(flag_no_trimat ) {} }; struct opts_force_approx : public opts { inline opts_force_approx() : opts(flag_force_approx) {} }; static const opts_none none; static const opts_fast fast; static const opts_equilibrate equilibrate; static const opts_no_approx no_approx; static const opts_triu triu; static const opts_tril tril; static const opts_no_band no_band; static const opts_no_sympd no_sympd; static const opts_allow_ugly allow_ugly; static const opts_likely_sympd likely_sympd; static const opts_refine refine; static const opts_no_trimat no_trimat; static const opts_force_approx force_approx; } //! @} RcppArmadillo/inst/include/armadillo_bits/typedef_elem_check.hpp0000644000176200001440000000377214124060717024713 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup typedef_elem //! @{ namespace junk { struct arma_elem_size_test { arma_static_check( (sizeof(u8) != 1), "error: type 'u8' has unsupported size" ); arma_static_check( (sizeof(s8) != 1), "error: type 's8' has unsupported size" ); arma_static_check( (sizeof(u16) != 2), "error: type 'u16' has unsupported size" ); arma_static_check( (sizeof(s16) != 2), "error: type 's16' has unsupported size" ); arma_static_check( (sizeof(u32) != 4), "error: type 'u32' has unsupported size" ); arma_static_check( (sizeof(s32) != 4), "error: type 's32' has unsupported size" ); arma_static_check( (sizeof(u64) != 8), "error: type 'u64' has unsupported size" ); arma_static_check( (sizeof(s64) != 8), "error: type 's64' has unsupported size" ); arma_static_check( (sizeof(float) != 4), "error: type 'float' has unsupported size" ); arma_static_check( (sizeof(double) != 8), "error: type 'double' has unsupported size" ); arma_static_check( (sizeof(std::complex) != 8), "type 'std::complex' has unsupported size" ); arma_static_check( (sizeof(std::complex) != 16), "type 'std::complex' has unsupported size" ); }; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_reverse_bones.hpp0000644000176200001440000000231014124060717024436 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_reverse //! @{ class op_reverse : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); }; class op_reverse_vec : public traits_op_passthru { public: template inline static void apply(Mat& out, const Op& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_stddev.hpp0000644000176200001440000000365114147163451023070 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_stddev //! @{ template arma_warn_unused inline typename enable_if2 < is_arma_type::value && resolves_to_vector::yes, typename T1::pod_type >::result stddev(const T1& X, const uword norm_type = 0) { arma_extra_debug_sigprint(); return std::sqrt( op_var::var_vec(X, norm_type) ); } template arma_warn_unused inline typename enable_if2 < is_arma_type::value && resolves_to_vector::no, const mtOp >::result stddev(const T1& X, const uword norm_type = 0) { arma_extra_debug_sigprint(); return mtOp(X, norm_type, 0); } template arma_warn_unused inline typename enable_if2 < is_arma_type::value, const mtOp >::result stddev(const T1& X, const uword norm_type, const uword dim) { arma_extra_debug_sigprint(); return mtOp(X, norm_type, dim); } template arma_warn_unused inline typename arma_scalar_only::result stddev(const T&) { return T(0); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_resize_bones.hpp0000644000176200001440000000332614160256234024275 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_resize //! @{ class op_resize : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); template inline static void apply_mat_inplace(Mat& A, const uword new_n_rows, const uword new_n_cols); template inline static void apply_mat_noalias(Mat& out, const Mat& A, const uword new_n_rows, const uword new_n_cols); // template inline static void apply(Cube& out, const OpCube& in); template inline static void apply_cube_inplace(Cube& A, const uword new_n_rows, const uword new_n_cols, const uword new_n_slices); template inline static void apply_cube_noalias(Cube& out, const Cube& A, const uword new_n_rows, const uword new_n_cols, const uword new_n_slices); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_sprandu.hpp0000644000176200001440000000546714124060717023256 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_sprandu //! @{ //! Generate a sparse matrix with a randomly selected subset of the elements //! set to random values in the [0,1] interval (uniform distribution) template arma_warn_unused inline obj_type sprandu ( const uword n_rows, const uword n_cols, const double density, const typename arma_SpMat_SpCol_SpRow_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); if(is_SpCol::value) { arma_debug_check( (n_cols != 1), "sprandu(): incompatible size" ); } else if(is_SpRow::value) { arma_debug_check( (n_rows != 1), "sprandu(): incompatible size" ); } obj_type out; out.sprandu(n_rows, n_cols, density); return out; } template arma_warn_unused inline obj_type sprandu(const SizeMat& s, const double density, const typename arma_SpMat_SpCol_SpRow_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return sprandu(s.n_rows, s.n_cols, density); } arma_warn_unused inline sp_mat sprandu(const uword n_rows, const uword n_cols, const double density) { arma_extra_debug_sigprint(); sp_mat out; out.sprandu(n_rows, n_cols, density); return out; } arma_warn_unused inline sp_mat sprandu(const SizeMat& s, const double density) { arma_extra_debug_sigprint(); sp_mat out; out.sprandu(s.n_rows, s.n_cols, density); return out; } //! Generate a sparse matrix with the non-zero values in the same locations as in the given sparse matrix X, //! with the non-zero values set to random values in the [0,1] interval (uniform distribution) template arma_warn_unused inline SpMat sprandu(const SpBase& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; SpMat out( X.get_ref() ); arma_rng::randu::fill( access::rwp(out.values), out.n_nonzero ); return out; } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_interp2.hpp0000644000176200001440000002006314124060717023152 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_interp2 //! @{ template inline void interp2_helper_nearest(const Mat& XG, const Mat& ZG, const Mat& XI, Mat& ZI, const eT extrap_val, const uword mode) { arma_extra_debug_sigprint(); const eT XG_min = XG.min(); const eT XG_max = XG.max(); // mode = 0: interpolate across rows (eg. expand in vertical direction) // mode = 1: interpolate across columns (eg. expand in horizontal direction) if(mode == 0) { ZI.set_size(XI.n_elem, ZG.n_cols); } if(mode == 1) { ZI.set_size(ZG.n_rows, XI.n_elem); } const eT* XG_mem = XG.memptr(); const eT* XI_mem = XI.memptr(); const uword NG = XG.n_elem; const uword NI = XI.n_elem; uword best_j = 0; for(uword i=0; i::inf; const eT XI_val = XI_mem[i]; if((XI_val < XG_min) || (XI_val > XG_max)) { if(mode == 0) { ZI.row(i).fill(extrap_val); } if(mode == 1) { ZI.col(i).fill(extrap_val); } } else { // XG and XI are guaranteed to be sorted in ascending manner, // so start searching XG from last known optimum position for(uword j=best_j; j= eT(0)) ? tmp : -tmp; if(err >= best_err) { // error is going up, so we have found the optimum position break; } else { best_err = err; best_j = j; // remember the optimum position } } if(mode == 0) { ZI.row(i) = ZG.row(best_j); } if(mode == 1) { ZI.col(i) = ZG.col(best_j); } } } } template inline void interp2_helper_linear(const Mat& XG, const Mat& ZG, const Mat& XI, Mat& ZI, const eT extrap_val, const uword mode) { arma_extra_debug_sigprint(); const eT XG_min = XG.min(); const eT XG_max = XG.max(); // mode = 0: interpolate across rows (eg. expand in vertical direction) // mode = 1: interpolate across columns (eg. expand in horizontal direction) if(mode == 0) { ZI.set_size(XI.n_elem, ZG.n_cols); } if(mode == 1) { ZI.set_size(ZG.n_rows, XI.n_elem); } const eT* XG_mem = XG.memptr(); const eT* XI_mem = XI.memptr(); const uword NG = XG.n_elem; const uword NI = XI.n_elem; uword a_best_j = 0; uword b_best_j = 0; for(uword i=0; i XG_max)) { if(mode == 0) { ZI.row(i).fill(extrap_val); } if(mode == 1) { ZI.col(i).fill(extrap_val); } } else { // XG and XI are guaranteed to be sorted in ascending manner, // so start searching XG from last known optimum position eT a_best_err = Datum::inf; eT b_best_err = Datum::inf; for(uword j=a_best_j; j= eT(0)) ? tmp : -tmp; if(err >= a_best_err) { break; } else { a_best_err = err; a_best_j = j; } } if( (XG_mem[a_best_j] - XI_val) <= eT(0) ) { // a_best_j is to the left of the interpolated position b_best_j = ( (a_best_j+1) < NG) ? (a_best_j+1) : a_best_j; } else { // a_best_j is to the right of the interpolated position b_best_j = (a_best_j >= 1) ? (a_best_j-1) : a_best_j; } b_best_err = std::abs( XG_mem[b_best_j] - XI_val ); if(a_best_j > b_best_j) { std::swap(a_best_j, b_best_j ); std::swap(a_best_err, b_best_err); } const eT weight = (a_best_err > eT(0)) ? (a_best_err / (a_best_err + b_best_err)) : eT(0); if(mode == 0) { ZI.row(i) = (eT(1) - weight)*ZG.row(a_best_j) + (weight)*ZG.row(b_best_j); } if(mode == 1) { ZI.col(i) = (eT(1) - weight)*ZG.col(a_best_j) + (weight)*ZG.col(b_best_j); } } } } template inline typename enable_if2< is_real::value, void >::result interp2 ( const Base& X, const Base& Y, const Base& Z, const Base& XI, const Base& YI, Mat& ZI, const char* method = "linear", const typename T1::elem_type extrap_val = Datum::nan ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const char sig = (method != nullptr) ? method[0] : char(0); arma_debug_check( ((sig != 'n') && (sig != 'l')), "interp2(): unsupported interpolation type" ); const quasi_unwrap UXG( X.get_ref() ); const quasi_unwrap UYG( Y.get_ref() ); const quasi_unwrap UZG( Z.get_ref() ); const quasi_unwrap UXI( XI.get_ref() ); const quasi_unwrap UYI( YI.get_ref() ); arma_debug_check( (UXG.M.is_vec() == false), "interp2(): X must resolve to a vector" ); arma_debug_check( (UYG.M.is_vec() == false), "interp2(): Y must resolve to a vector" ); arma_debug_check( (UXI.M.is_vec() == false), "interp2(): XI must resolve to a vector" ); arma_debug_check( (UYI.M.is_vec() == false), "interp2(): YI must resolve to a vector" ); arma_debug_check( (UXG.M.n_elem < 2), "interp2(): X must have at least two unique elements" ); arma_debug_check( (UYG.M.n_elem < 2), "interp2(): Y must have at least two unique elements" ); arma_debug_check( (UXG.M.n_elem != UZG.M.n_cols), "interp2(): number of elements in X must equal the number of columns in Z" ); arma_debug_check( (UYG.M.n_elem != UZG.M.n_rows), "interp2(): number of elements in Y must equal the number of rows in Z" ); arma_debug_check( (UXG.M.is_sorted("strictascend") == false), "interp2(): X must be monotonically increasing" ); arma_debug_check( (UYG.M.is_sorted("strictascend") == false), "interp2(): Y must be monotonically increasing" ); arma_debug_check( (UXI.M.is_sorted("strictascend") == false), "interp2(): XI must be monotonically increasing" ); arma_debug_check( (UYI.M.is_sorted("strictascend") == false), "interp2(): YI must be monotonically increasing" ); Mat tmp; if( UXG.is_alias(ZI) || UXI.is_alias(ZI) ) { Mat out; if(sig == 'n') { interp2_helper_nearest(UYG.M, UZG.M, UYI.M, tmp, extrap_val, 0); interp2_helper_nearest(UXG.M, tmp, UXI.M, out, extrap_val, 1); } else if(sig == 'l') { interp2_helper_linear(UYG.M, UZG.M, UYI.M, tmp, extrap_val, 0); interp2_helper_linear(UXG.M, tmp, UXI.M, out, extrap_val, 1); } ZI.steal_mem(out); } else { if(sig == 'n') { interp2_helper_nearest(UYG.M, UZG.M, UYI.M, tmp, extrap_val, 0); interp2_helper_nearest(UXG.M, tmp, UXI.M, ZI, extrap_val, 1); } else if(sig == 'l') { interp2_helper_linear(UYG.M, UZG.M, UYI.M, tmp, extrap_val, 0); interp2_helper_linear(UXG.M, tmp, UXI.M, ZI, extrap_val, 1); } } } //! @} RcppArmadillo/inst/include/armadillo_bits/subview_cube_meat.hpp0000644000176200001440000020354414124060717024603 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup subview_cube //! @{ template inline subview_cube::~subview_cube() { arma_extra_debug_sigprint_this(this); } template arma_inline subview_cube::subview_cube ( const Cube& in_m, const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_n_rows, const uword in_n_cols, const uword in_n_slices ) : m (in_m) , aux_row1 (in_row1) , aux_col1 (in_col1) , aux_slice1 (in_slice1) , n_rows (in_n_rows) , n_cols (in_n_cols) , n_elem_slice(in_n_rows * in_n_cols) , n_slices (in_n_slices) , n_elem (n_elem_slice * in_n_slices) { arma_extra_debug_sigprint_this(this); } template inline subview_cube::subview_cube(const subview_cube& in) : m (in.m ) , aux_row1 (in.aux_row1 ) , aux_col1 (in.aux_col1 ) , aux_slice1 (in.aux_slice1 ) , n_rows (in.n_rows ) , n_cols (in.n_cols ) , n_elem_slice(in.n_elem_slice) , n_slices (in.n_slices ) , n_elem (in.n_elem ) { arma_extra_debug_sigprint(arma_str::format("this = %x in = %x") % this % &in); } template inline subview_cube::subview_cube(subview_cube&& in) : m (in.m ) , aux_row1 (in.aux_row1 ) , aux_col1 (in.aux_col1 ) , aux_slice1 (in.aux_slice1 ) , n_rows (in.n_rows ) , n_cols (in.n_cols ) , n_elem_slice(in.n_elem_slice) , n_slices (in.n_slices ) , n_elem (in.n_elem ) { arma_extra_debug_sigprint(arma_str::format("this = %x in = %x") % this % &in); // for paranoia access::rw(in.aux_row1 ) = 0; access::rw(in.aux_col1 ) = 0; access::rw(in.aux_slice1 ) = 0; access::rw(in.n_rows ) = 0; access::rw(in.n_cols ) = 0; access::rw(in.n_elem_slice) = 0; access::rw(in.n_slices ) = 0; access::rw(in.n_elem ) = 0; } template template inline void subview_cube::inplace_op(const eT val) { arma_extra_debug_sigprint(); subview_cube& t = *this; const uword t_n_rows = t.n_rows; const uword t_n_cols = t.n_cols; const uword t_n_slices = t.n_slices; for(uword s=0; s < t_n_slices; ++s) for(uword c=0; c < t_n_cols; ++c) { if(is_same_type::yes) { arrayops::inplace_plus ( slice_colptr(s,c), val, t_n_rows ); } if(is_same_type::yes) { arrayops::inplace_minus( slice_colptr(s,c), val, t_n_rows ); } if(is_same_type::yes) { arrayops::inplace_mul ( slice_colptr(s,c), val, t_n_rows ); } if(is_same_type::yes) { arrayops::inplace_div ( slice_colptr(s,c), val, t_n_rows ); } } } template template inline void subview_cube::inplace_op(const BaseCube& in, const char* identifier) { arma_extra_debug_sigprint(); const ProxyCube P(in.get_ref()); subview_cube& t = *this; const uword t_n_rows = t.n_rows; const uword t_n_cols = t.n_cols; const uword t_n_slices = t.n_slices; arma_debug_assert_same_size(t, P, identifier); const bool use_mp = arma_config::openmp && ProxyCube::use_mp && mp_gate::eval(t.n_elem); const bool has_overlap = P.has_overlap(t); if(has_overlap) { arma_extra_debug_print("aliasing or overlap detected"); } if( (is_Cube::stored_type>::value) || (use_mp) || (has_overlap) ) { const unwrap_cube_check::stored_type> tmp(P.Q, has_overlap); const Cube& B = tmp.M; if( (is_same_type::yes) && (t.aux_row1 == 0) && (t_n_rows == t.m.n_rows) ) { for(uword s=0; s < t_n_slices; ++s) { arrayops::copy( t.slice_colptr(s,0), B.slice_colptr(s,0), t.n_elem_slice ); } } else { for(uword s=0; s < t_n_slices; ++s) for(uword c=0; c < t_n_cols; ++c) { if(is_same_type::yes) { arrayops::copy ( t.slice_colptr(s,c), B.slice_colptr(s,c), t_n_rows ); } if(is_same_type::yes) { arrayops::inplace_plus ( t.slice_colptr(s,c), B.slice_colptr(s,c), t_n_rows ); } if(is_same_type::yes) { arrayops::inplace_minus( t.slice_colptr(s,c), B.slice_colptr(s,c), t_n_rows ); } if(is_same_type::yes) { arrayops::inplace_mul ( t.slice_colptr(s,c), B.slice_colptr(s,c), t_n_rows ); } if(is_same_type::yes) { arrayops::inplace_div ( t.slice_colptr(s,c), B.slice_colptr(s,c), t_n_rows ); } } } } else // use the Proxy { if(ProxyCube::use_at) { for(uword s=0; s < t_n_slices; ++s) for(uword c=0; c < t_n_cols; ++c) { eT* t_col_data = t.slice_colptr(s,c); for(uword r=0; r < t_n_rows; ++r) { const eT tmp = P.at(r,c,s); if(is_same_type::yes) { (*t_col_data) = tmp; t_col_data++; } if(is_same_type::yes) { (*t_col_data) += tmp; t_col_data++; } if(is_same_type::yes) { (*t_col_data) -= tmp; t_col_data++; } if(is_same_type::yes) { (*t_col_data) *= tmp; t_col_data++; } if(is_same_type::yes) { (*t_col_data) /= tmp; t_col_data++; } } } } else { typename ProxyCube::ea_type Pea = P.get_ea(); uword count = 0; for(uword s=0; s < t_n_slices; ++s) for(uword c=0; c < t_n_cols; ++c) { eT* t_col_data = t.slice_colptr(s,c); for(uword r=0; r < t_n_rows; ++r) { const eT tmp = Pea[count]; count++; if(is_same_type::yes) { (*t_col_data) = tmp; t_col_data++; } if(is_same_type::yes) { (*t_col_data) += tmp; t_col_data++; } if(is_same_type::yes) { (*t_col_data) -= tmp; t_col_data++; } if(is_same_type::yes) { (*t_col_data) *= tmp; t_col_data++; } if(is_same_type::yes) { (*t_col_data) /= tmp; t_col_data++; } } } } } } template template inline void subview_cube::inplace_op(const subview_cube& x, const char* identifier) { arma_extra_debug_sigprint(); if(check_overlap(x)) { const Cube tmp(x); if(is_same_type::yes) { (*this).operator= (tmp); } if(is_same_type::yes) { (*this).operator+=(tmp); } if(is_same_type::yes) { (*this).operator-=(tmp); } if(is_same_type::yes) { (*this).operator%=(tmp); } if(is_same_type::yes) { (*this).operator/=(tmp); } return; } subview_cube& t = *this; arma_debug_assert_same_size(t, x, identifier); const uword t_n_rows = t.n_rows; const uword t_n_cols = t.n_cols; const uword t_n_slices = t.n_slices; for(uword s=0; s < t_n_slices; ++s) for(uword c=0; c < t_n_cols; ++c) { if(is_same_type::yes) { arrayops::copy ( t.slice_colptr(s,c), x.slice_colptr(s,c), t_n_rows ); } if(is_same_type::yes) { arrayops::inplace_plus ( t.slice_colptr(s,c), x.slice_colptr(s,c), t_n_rows ); } if(is_same_type::yes) { arrayops::inplace_minus( t.slice_colptr(s,c), x.slice_colptr(s,c), t_n_rows ); } if(is_same_type::yes) { arrayops::inplace_mul ( t.slice_colptr(s,c), x.slice_colptr(s,c), t_n_rows ); } if(is_same_type::yes) { arrayops::inplace_div ( t.slice_colptr(s,c), x.slice_colptr(s,c), t_n_rows ); } } } template inline void subview_cube::operator= (const eT val) { arma_extra_debug_sigprint(); if(n_elem != 1) { arma_debug_assert_same_size(n_rows, n_cols, n_slices, 1, 1, 1, "copy into subcube"); } Cube& Q = const_cast< Cube& >(m); Q.at(aux_row1, aux_col1, aux_slice1) = val; } template inline void subview_cube::operator+= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview_cube::operator-= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview_cube::operator*= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template inline void subview_cube::operator/= (const eT val) { arma_extra_debug_sigprint(); inplace_op(val); } template template inline void subview_cube::operator= (const BaseCube& in) { arma_extra_debug_sigprint(); inplace_op(in, "copy into subcube"); } template template inline void subview_cube::operator+= (const BaseCube& in) { arma_extra_debug_sigprint(); inplace_op(in, "addition"); } template template inline void subview_cube::operator-= (const BaseCube& in) { arma_extra_debug_sigprint(); inplace_op(in, "subtraction"); } template template inline void subview_cube::operator%= (const BaseCube& in) { arma_extra_debug_sigprint(); inplace_op(in, "element-wise multiplication"); } template template inline void subview_cube::operator/= (const BaseCube& in) { arma_extra_debug_sigprint(); inplace_op(in, "element-wise division"); } //! x.subcube(...) = y.subcube(...) template inline void subview_cube::operator= (const subview_cube& x) { arma_extra_debug_sigprint(); inplace_op(x, "copy into subcube"); } template inline void subview_cube::operator+= (const subview_cube& x) { arma_extra_debug_sigprint(); inplace_op(x, "addition"); } template inline void subview_cube::operator-= (const subview_cube& x) { arma_extra_debug_sigprint(); inplace_op(x, "subtraction"); } template inline void subview_cube::operator%= (const subview_cube& x) { arma_extra_debug_sigprint(); inplace_op(x, "element-wise multiplication"); } template inline void subview_cube::operator/= (const subview_cube& x) { arma_extra_debug_sigprint(); inplace_op(x, "element-wise division"); } template template inline void subview_cube::operator= (const Base& in) { arma_extra_debug_sigprint(); const quasi_unwrap tmp(in.get_ref()); const Mat& x = tmp.M; subview_cube& t = *this; const uword t_n_rows = t.n_rows; const uword t_n_cols = t.n_cols; const uword t_n_slices = t.n_slices; const uword x_n_rows = x.n_rows; const uword x_n_cols = x.n_cols; if( ((x_n_rows == 1) || (x_n_cols == 1)) && (t_n_rows == 1) && (t_n_cols == 1) && (x.n_elem == t_n_slices) ) { Cube& Q = const_cast< Cube& >(t.m); const uword t_aux_row1 = t.aux_row1; const uword t_aux_col1 = t.aux_col1; const uword t_aux_slice1 = t.aux_slice1; const eT* x_mem = x.memptr(); uword i,j; for(i=0, j=1; j < t_n_slices; i+=2, j+=2) { const eT tmp_i = x_mem[i]; const eT tmp_j = x_mem[j]; Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) = tmp_i; Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + j) = tmp_j; } if(i < t_n_slices) { Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) = x_mem[i]; } } else if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) ) { // interpret the matrix as a cube with one slice for(uword col = 0; col < t_n_cols; ++col) { arrayops::copy( t.slice_colptr(0, col), x.colptr(col), t_n_rows ); } } else if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) ) { for(uword i=0; i < t_n_slices; ++i) { arrayops::copy( t.slice_colptr(i, 0), x.colptr(i), t_n_rows ); } } else if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) ) { Cube& Q = const_cast< Cube& >(t.m); const uword t_aux_row1 = t.aux_row1; const uword t_aux_col1 = t.aux_col1; const uword t_aux_slice1 = t.aux_slice1; for(uword slice=0; slice < t_n_slices; ++slice) { const uword mod_slice = t_aux_slice1 + slice; const eT* x_colptr = x.colptr(slice); uword i,j; for(i=0, j=1; j < t_n_cols; i+=2, j+=2) { const eT tmp_i = x_colptr[i]; const eT tmp_j = x_colptr[j]; Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) = tmp_i; Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) = tmp_j; } if(i < t_n_cols) { Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) = x_colptr[i]; } } } else { if(arma_config::debug) { arma_stop_logic_error( arma_incompat_size_string(t, x, "copy into subcube") ); } } } template template inline void subview_cube::operator+= (const Base& in) { arma_extra_debug_sigprint(); const quasi_unwrap tmp(in.get_ref()); const Mat& x = tmp.M; subview_cube& t = *this; const uword t_n_rows = t.n_rows; const uword t_n_cols = t.n_cols; const uword t_n_slices = t.n_slices; const uword x_n_rows = x.n_rows; const uword x_n_cols = x.n_cols; if( ((x_n_rows == 1) || (x_n_cols == 1)) && (t_n_rows == 1) && (t_n_cols == 1) && (x.n_elem == t_n_slices) ) { Cube& Q = const_cast< Cube& >(t.m); const uword t_aux_row1 = t.aux_row1; const uword t_aux_col1 = t.aux_col1; const uword t_aux_slice1 = t.aux_slice1; const eT* x_mem = x.memptr(); uword i,j; for(i=0, j=1; j < t_n_slices; i+=2, j+=2) { const eT tmp_i = x_mem[i]; const eT tmp_j = x_mem[j]; Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) += tmp_i; Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + j) += tmp_j; } if(i < t_n_slices) { Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) += x_mem[i]; } } else if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) ) { for(uword col = 0; col < t_n_cols; ++col) { arrayops::inplace_plus( t.slice_colptr(0, col), x.colptr(col), t_n_rows ); } } else if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) ) { for(uword i=0; i < t_n_slices; ++i) { arrayops::inplace_plus( t.slice_colptr(i, 0), x.colptr(i), t_n_rows ); } } else if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) ) { Cube& Q = const_cast< Cube& >(t.m); const uword t_aux_row1 = t.aux_row1; const uword t_aux_col1 = t.aux_col1; const uword t_aux_slice1 = t.aux_slice1; for(uword slice=0; slice < t_n_slices; ++slice) { const uword mod_slice = t_aux_slice1 + slice; const eT* x_colptr = x.colptr(slice); uword i,j; for(i=0, j=1; j < t_n_cols; i+=2, j+=2) { const eT tmp_i = x_colptr[i]; const eT tmp_j = x_colptr[j]; Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) += tmp_i; Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) += tmp_j; } if(i < t_n_cols) { Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) += x_colptr[i]; } } } else { if(arma_config::debug) { arma_stop_logic_error( arma_incompat_size_string(t, x, "addition") ); } } } template template inline void subview_cube::operator-= (const Base& in) { arma_extra_debug_sigprint(); const quasi_unwrap tmp(in.get_ref()); const Mat& x = tmp.M; subview_cube& t = *this; const uword t_n_rows = t.n_rows; const uword t_n_cols = t.n_cols; const uword t_n_slices = t.n_slices; const uword x_n_rows = x.n_rows; const uword x_n_cols = x.n_cols; if( ((x_n_rows == 1) || (x_n_cols == 1)) && (t_n_rows == 1) && (t_n_cols == 1) && (x.n_elem == t_n_slices) ) { Cube& Q = const_cast< Cube& >(t.m); const uword t_aux_row1 = t.aux_row1; const uword t_aux_col1 = t.aux_col1; const uword t_aux_slice1 = t.aux_slice1; const eT* x_mem = x.memptr(); uword i,j; for(i=0, j=1; j < t_n_slices; i+=2, j+=2) { const eT tmp_i = x_mem[i]; const eT tmp_j = x_mem[j]; Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) -= tmp_i; Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + j) -= tmp_j; } if(i < t_n_slices) { Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) -= x_mem[i]; } } else if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) ) { for(uword col = 0; col < t_n_cols; ++col) { arrayops::inplace_minus( t.slice_colptr(0, col), x.colptr(col), t_n_rows ); } } else if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) ) { for(uword i=0; i < t_n_slices; ++i) { arrayops::inplace_minus( t.slice_colptr(i, 0), x.colptr(i), t_n_rows ); } } else if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) ) { Cube& Q = const_cast< Cube& >(t.m); const uword t_aux_row1 = t.aux_row1; const uword t_aux_col1 = t.aux_col1; const uword t_aux_slice1 = t.aux_slice1; for(uword slice=0; slice < t_n_slices; ++slice) { const uword mod_slice = t_aux_slice1 + slice; const eT* x_colptr = x.colptr(slice); uword i,j; for(i=0, j=1; j < t_n_cols; i+=2, j+=2) { const eT tmp_i = x_colptr[i]; const eT tmp_j = x_colptr[j]; Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) -= tmp_i; Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) -= tmp_j; } if(i < t_n_cols) { Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) -= x_colptr[i]; } } } else { if(arma_config::debug) { arma_stop_logic_error( arma_incompat_size_string(t, x, "subtraction") ); } } } template template inline void subview_cube::operator%= (const Base& in) { arma_extra_debug_sigprint(); const quasi_unwrap tmp(in.get_ref()); const Mat& x = tmp.M; subview_cube& t = *this; const uword t_n_rows = t.n_rows; const uword t_n_cols = t.n_cols; const uword t_n_slices = t.n_slices; const uword x_n_rows = x.n_rows; const uword x_n_cols = x.n_cols; if( ((x_n_rows == 1) || (x_n_cols == 1)) && (t_n_rows == 1) && (t_n_cols == 1) && (x.n_elem == t_n_slices) ) { Cube& Q = const_cast< Cube& >(t.m); const uword t_aux_row1 = t.aux_row1; const uword t_aux_col1 = t.aux_col1; const uword t_aux_slice1 = t.aux_slice1; const eT* x_mem = x.memptr(); uword i,j; for(i=0, j=1; j < t_n_slices; i+=2, j+=2) { const eT tmp_i = x_mem[i]; const eT tmp_j = x_mem[j]; Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) *= tmp_i; Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + j) *= tmp_j; } if(i < t_n_slices) { Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) *= x_mem[i]; } } else if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) ) { for(uword col = 0; col < t_n_cols; ++col) { arrayops::inplace_mul( t.slice_colptr(0, col), x.colptr(col), t_n_rows ); } } else if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) ) { for(uword i=0; i < t_n_slices; ++i) { arrayops::inplace_mul( t.slice_colptr(i, 0), x.colptr(i), t_n_rows ); } } else if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) ) { Cube& Q = const_cast< Cube& >(t.m); const uword t_aux_row1 = t.aux_row1; const uword t_aux_col1 = t.aux_col1; const uword t_aux_slice1 = t.aux_slice1; for(uword slice=0; slice < t_n_slices; ++slice) { const uword mod_slice = t_aux_slice1 + slice; const eT* x_colptr = x.colptr(slice); uword i,j; for(i=0, j=1; j < t_n_cols; i+=2, j+=2) { const eT tmp_i = x_colptr[i]; const eT tmp_j = x_colptr[j]; Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) *= tmp_i; Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) *= tmp_j; } if(i < t_n_cols) { Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) *= x_colptr[i]; } } } else { if(arma_config::debug) { arma_stop_logic_error( arma_incompat_size_string(t, x, "element-wise multiplication") ); } } } template template inline void subview_cube::operator/= (const Base& in) { arma_extra_debug_sigprint(); const quasi_unwrap tmp(in.get_ref()); const Mat& x = tmp.M; subview_cube& t = *this; const uword t_n_rows = t.n_rows; const uword t_n_cols = t.n_cols; const uword t_n_slices = t.n_slices; const uword x_n_rows = x.n_rows; const uword x_n_cols = x.n_cols; if( ((x_n_rows == 1) || (x_n_cols == 1)) && (t_n_rows == 1) && (t_n_cols == 1) && (x.n_elem == t_n_slices) ) { Cube& Q = const_cast< Cube& >(t.m); const uword t_aux_row1 = t.aux_row1; const uword t_aux_col1 = t.aux_col1; const uword t_aux_slice1 = t.aux_slice1; const eT* x_mem = x.memptr(); uword i,j; for(i=0, j=1; j < t_n_slices; i+=2, j+=2) { const eT tmp_i = x_mem[i]; const eT tmp_j = x_mem[j]; Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) /= tmp_i; Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + j) /= tmp_j; } if(i < t_n_slices) { Q.at(t_aux_row1, t_aux_col1, t_aux_slice1 + i) /= x_mem[i]; } } else if( (t_n_rows == x_n_rows) && (t_n_cols == x_n_cols) && (t_n_slices == 1) ) { for(uword col = 0; col < t_n_cols; ++col) { arrayops::inplace_div( t.slice_colptr(0, col), x.colptr(col), t_n_rows ); } } else if( (t_n_rows == x_n_rows) && (t_n_cols == 1) && (t_n_slices == x_n_cols) ) { for(uword i=0; i < t_n_slices; ++i) { arrayops::inplace_div( t.slice_colptr(i, 0), x.colptr(i), t_n_rows ); } } else if( (t_n_rows == 1) && (t_n_cols == x_n_rows) && (t_n_slices == x_n_cols) ) { Cube& Q = const_cast< Cube& >(t.m); const uword t_aux_row1 = t.aux_row1; const uword t_aux_col1 = t.aux_col1; const uword t_aux_slice1 = t.aux_slice1; for(uword slice=0; slice < t_n_slices; ++slice) { const uword mod_slice = t_aux_slice1 + slice; const eT* x_colptr = x.colptr(slice); uword i,j; for(i=0, j=1; j < t_n_cols; i+=2, j+=2) { const eT tmp_i = x_colptr[i]; const eT tmp_j = x_colptr[j]; Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) /= tmp_i; Q.at(t_aux_row1, t_aux_col1 + j, mod_slice) /= tmp_j; } if(i < t_n_cols) { Q.at(t_aux_row1, t_aux_col1 + i, mod_slice) /= x_colptr[i]; } } } else { if(arma_config::debug) { arma_stop_logic_error( arma_incompat_size_string(t, x, "element-wise division") ); } } } template template inline void subview_cube::operator= (const GenCube& in) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(n_rows, n_cols, n_slices, in.n_rows, in.n_cols, in.n_slices, "copy into subcube"); in.apply(*this); } //! apply a functor to each element template template inline void subview_cube::for_each(functor F) { arma_extra_debug_sigprint(); Cube& Q = const_cast< Cube& >(m); const uword start_col = aux_col1; const uword start_row = aux_row1; const uword start_slice = aux_slice1; const uword end_col_plus1 = start_col + n_cols; const uword end_row_plus1 = start_row + n_rows; const uword end_slice_plus1 = start_slice + n_slices; for(uword uslice = start_slice; uslice < end_slice_plus1; ++uslice) for(uword ucol = start_col; ucol < end_col_plus1; ++ucol ) for(uword urow = start_row; urow < end_row_plus1; ++urow ) { F( Q.at(urow, ucol, uslice) ); } } template template inline void subview_cube::for_each(functor F) const { arma_extra_debug_sigprint(); const Cube& Q = m; const uword start_col = aux_col1; const uword start_row = aux_row1; const uword start_slice = aux_slice1; const uword end_col_plus1 = start_col + n_cols; const uword end_row_plus1 = start_row + n_rows; const uword end_slice_plus1 = start_slice + n_slices; for(uword uslice = start_slice; uslice < end_slice_plus1; ++uslice) for(uword ucol = start_col; ucol < end_col_plus1; ++ucol ) for(uword urow = start_row; urow < end_row_plus1; ++urow ) { F( Q.at(urow, ucol, uslice) ); } } //! transform each element in the subview using a functor template template inline void subview_cube::transform(functor F) { arma_extra_debug_sigprint(); Cube& Q = const_cast< Cube& >(m); const uword start_col = aux_col1; const uword start_row = aux_row1; const uword start_slice = aux_slice1; const uword end_col_plus1 = start_col + n_cols; const uword end_row_plus1 = start_row + n_rows; const uword end_slice_plus1 = start_slice + n_slices; for(uword uslice = start_slice; uslice < end_slice_plus1; ++uslice) for(uword ucol = start_col; ucol < end_col_plus1; ++ucol ) for(uword urow = start_row; urow < end_row_plus1; ++urow ) { Q.at(urow, ucol, uslice) = eT( F( Q.at(urow, ucol, uslice) ) ); } } //! imbue (fill) the subview with values provided by a functor template template inline void subview_cube::imbue(functor F) { arma_extra_debug_sigprint(); Cube& Q = const_cast< Cube& >(m); const uword start_col = aux_col1; const uword start_row = aux_row1; const uword start_slice = aux_slice1; const uword end_col_plus1 = start_col + n_cols; const uword end_row_plus1 = start_row + n_rows; const uword end_slice_plus1 = start_slice + n_slices; for(uword uslice = start_slice; uslice < end_slice_plus1; ++uslice) for(uword ucol = start_col; ucol < end_col_plus1; ++ucol ) for(uword urow = start_row; urow < end_row_plus1; ++urow ) { Q.at(urow, ucol, uslice) = eT( F() ); } } //! apply a lambda function to each slice, where each slice is interpreted as a matrix template inline void subview_cube::each_slice(const std::function< void(Mat&) >& F) { arma_extra_debug_sigprint(); Mat tmp1(n_rows, n_cols, arma_nozeros_indicator()); Mat tmp2('j', tmp1.memptr(), n_rows, n_cols); for(uword slice_id=0; slice_id < n_slices; ++slice_id) { for(uword col_id=0; col_id < n_cols; ++col_id) { arrayops::copy( tmp1.colptr(col_id), slice_colptr(slice_id, col_id), n_rows ); } F(tmp2); for(uword col_id=0; col_id < n_cols; ++col_id) { arrayops::copy( slice_colptr(slice_id, col_id), tmp1.colptr(col_id), n_rows ); } } } template inline void subview_cube::each_slice(const std::function< void(const Mat&) >& F) const { arma_extra_debug_sigprint(); Mat tmp1(n_rows, n_cols, arma_nozeros_indicator()); const Mat tmp2('j', tmp1.memptr(), n_rows, n_cols); for(uword slice_id=0; slice_id < n_slices; ++slice_id) { for(uword col_id=0; col_id < n_cols; ++col_id) { arrayops::copy( tmp1.colptr(col_id), slice_colptr(slice_id, col_id), n_rows ); } F(tmp2); } } template inline void subview_cube::replace(const eT old_val, const eT new_val) { arma_extra_debug_sigprint(); const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword local_n_slices = n_slices; for(uword slice = 0; slice < local_n_slices; ++slice) { for(uword col = 0; col < local_n_cols; ++col) { arrayops::replace(slice_colptr(slice,col), local_n_rows, old_val, new_val); } } } template inline void subview_cube::clean(const typename get_pod_type::result threshold) { arma_extra_debug_sigprint(); const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword local_n_slices = n_slices; for(uword slice = 0; slice < local_n_slices; ++slice) { for(uword col = 0; col < local_n_cols; ++col) { arrayops::clean( slice_colptr(slice,col), local_n_rows, threshold ); } } } template inline void subview_cube::clamp(const eT min_val, const eT max_val) { arma_extra_debug_sigprint(); if(is_cx::no) { arma_debug_check( (access::tmp_real(min_val) > access::tmp_real(max_val)), "subview_cube::clamp(): min_val must be less than max_val" ); } else { arma_debug_check( (access::tmp_real(min_val) > access::tmp_real(max_val)), "subview_cube::clamp(): real(min_val) must be less than real(max_val)" ); arma_debug_check( (access::tmp_imag(min_val) > access::tmp_imag(max_val)), "subview_cube::clamp(): imag(min_val) must be less than imag(max_val)" ); } const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword local_n_slices = n_slices; for(uword slice = 0; slice < local_n_slices; ++slice) { for(uword col = 0; col < local_n_cols; ++col) { arrayops::clamp( slice_colptr(slice,col), local_n_rows, min_val, max_val ); } } } template inline void subview_cube::fill(const eT val) { arma_extra_debug_sigprint(); const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword local_n_slices = n_slices; for(uword slice = 0; slice < local_n_slices; ++slice) { for(uword col = 0; col < local_n_cols; ++col) { arrayops::inplace_set( slice_colptr(slice,col), val, local_n_rows ); } } } template inline void subview_cube::zeros() { arma_extra_debug_sigprint(); const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword local_n_slices = n_slices; for(uword slice = 0; slice < local_n_slices; ++slice) { for(uword col = 0; col < local_n_cols; ++col) { arrayops::fill_zeros( slice_colptr(slice,col), local_n_rows ); } } } template inline void subview_cube::ones() { arma_extra_debug_sigprint(); fill(eT(1)); } template inline void subview_cube::randu() { arma_extra_debug_sigprint(); const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword local_n_slices = n_slices; for(uword slice = 0; slice < local_n_slices; ++slice) { for(uword col = 0; col < local_n_cols; ++col) { arma_rng::randu::fill( slice_colptr(slice,col), local_n_rows ); } } } template inline void subview_cube::randn() { arma_extra_debug_sigprint(); const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword local_n_slices = n_slices; for(uword slice = 0; slice < local_n_slices; ++slice) { for(uword col = 0; col < local_n_cols; ++col) { arma_rng::randn::fill( slice_colptr(slice,col), local_n_rows ); } } } template inline arma_warn_unused bool subview_cube::is_finite() const { arma_extra_debug_sigprint(); const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword local_n_slices = n_slices; for(uword slice = 0; slice < local_n_slices; ++slice) { for(uword col = 0; col < local_n_cols; ++col) { if(arrayops::is_finite(slice_colptr(slice,col), local_n_rows) == false) { return false; } } } return true; } template inline arma_warn_unused bool subview_cube::is_zero(const typename get_pod_type::result tol) const { arma_extra_debug_sigprint(); const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword local_n_slices = n_slices; for(uword slice = 0; slice < local_n_slices; ++slice) { for(uword col = 0; col < local_n_cols; ++col) { if(arrayops::is_zero(slice_colptr(slice,col), local_n_rows, tol) == false) { return false; } } } return true; } template inline arma_warn_unused bool subview_cube::has_inf() const { arma_extra_debug_sigprint(); const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword local_n_slices = n_slices; for(uword slice = 0; slice < local_n_slices; ++slice) { for(uword col = 0; col < local_n_cols; ++col) { if(arrayops::has_inf(slice_colptr(slice,col), local_n_rows)) { return true; } } } return false; } template inline arma_warn_unused bool subview_cube::has_nan() const { arma_extra_debug_sigprint(); const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword local_n_slices = n_slices; for(uword slice = 0; slice < local_n_slices; ++slice) { for(uword col = 0; col < local_n_cols; ++col) { if(arrayops::has_nan(slice_colptr(slice,col), local_n_rows)) { return true; } } } return false; } template inline eT subview_cube::at_alt(const uword i) const { return operator[](i); } template inline eT& subview_cube::operator[](const uword i) { const uword in_slice = i / n_elem_slice; const uword offset = in_slice * n_elem_slice; const uword j = i - offset; const uword in_col = j / n_rows; const uword in_row = j % n_rows; const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return access::rw( (const_cast< Cube& >(m)).mem[index] ); } template inline eT subview_cube::operator[](const uword i) const { const uword in_slice = i / n_elem_slice; const uword offset = in_slice * n_elem_slice; const uword j = i - offset; const uword in_col = j / n_rows; const uword in_row = j % n_rows; const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return m.mem[index]; } template inline eT& subview_cube::operator()(const uword i) { arma_debug_check_bounds( (i >= n_elem), "subview_cube::operator(): index out of bounds" ); const uword in_slice = i / n_elem_slice; const uword offset = in_slice * n_elem_slice; const uword j = i - offset; const uword in_col = j / n_rows; const uword in_row = j % n_rows; const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return access::rw( (const_cast< Cube& >(m)).mem[index] ); } template inline eT subview_cube::operator()(const uword i) const { arma_debug_check_bounds( (i >= n_elem), "subview_cube::operator(): index out of bounds" ); const uword in_slice = i / n_elem_slice; const uword offset = in_slice * n_elem_slice; const uword j = i - offset; const uword in_col = j / n_rows; const uword in_row = j % n_rows; const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return m.mem[index]; } template arma_inline eT& subview_cube::operator()(const uword in_row, const uword in_col, const uword in_slice) { arma_debug_check_bounds( ( (in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices) ), "subview_cube::operator(): location out of bounds" ); const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return access::rw( (const_cast< Cube& >(m)).mem[index] ); } template arma_inline eT subview_cube::operator()(const uword in_row, const uword in_col, const uword in_slice) const { arma_debug_check_bounds( ( (in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices) ), "subview_cube::operator(): location out of bounds" ); const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return m.mem[index]; } template arma_inline eT& subview_cube::at(const uword in_row, const uword in_col, const uword in_slice) { const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return access::rw( (const_cast< Cube& >(m)).mem[index] ); } template arma_inline eT subview_cube::at(const uword in_row, const uword in_col, const uword in_slice) const { const uword index = (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 + in_row; return m.mem[index]; } template arma_inline eT* subview_cube::slice_colptr(const uword in_slice, const uword in_col) { return & access::rw((const_cast< Cube& >(m)).mem[ (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 ]); } template arma_inline const eT* subview_cube::slice_colptr(const uword in_slice, const uword in_col) const { return & m.mem[ (in_slice + aux_slice1)*m.n_elem_slice + (in_col + aux_col1)*m.n_rows + aux_row1 ]; } template template inline bool subview_cube::check_overlap(const subview_cube& x) const { if(is_same_type::value == false) { return false; } const subview_cube& t = (*this); if(void_ptr(&(t.m)) != void_ptr(&(x.m))) { return false; } if( (t.n_elem == 0) || (x.n_elem == 0) ) { return false; } const uword t_row_start = t.aux_row1; const uword t_row_end_p1 = t_row_start + t.n_rows; const uword t_col_start = t.aux_col1; const uword t_col_end_p1 = t_col_start + t.n_cols; const uword t_slice_start = t.aux_slice1; const uword t_slice_end_p1 = t_slice_start + t.n_slices; const uword x_row_start = x.aux_row1; const uword x_row_end_p1 = x_row_start + x.n_rows; const uword x_col_start = x.aux_col1; const uword x_col_end_p1 = x_col_start + x.n_cols; const uword x_slice_start = x.aux_slice1; const uword x_slice_end_p1 = x_slice_start + x.n_slices; const bool outside_rows = ( (x_row_start >= t_row_end_p1 ) || (t_row_start >= x_row_end_p1 ) ); const bool outside_cols = ( (x_col_start >= t_col_end_p1 ) || (t_col_start >= x_col_end_p1 ) ); const bool outside_slices = ( (x_slice_start >= t_slice_end_p1) || (t_slice_start >= x_slice_end_p1) ); return ( (outside_rows == false) && (outside_cols == false) && (outside_slices == false) ); } template inline bool subview_cube::check_overlap(const Mat& x) const { const subview_cube& t = *this; const uword t_aux_slice1 = t.aux_slice1; const uword t_aux_slice2_plus_1 = t_aux_slice1 + t.n_slices; for(uword slice = t_aux_slice1; slice < t_aux_slice2_plus_1; ++slice) { if(t.m.mat_ptrs[slice] != nullptr) { const Mat& y = *(t.m.mat_ptrs[slice]); if( x.memptr() == y.memptr() ) { return true; } } } return false; } //! cube X = Y.subcube(...) template inline void subview_cube::extract(Cube& out, const subview_cube& in) { arma_extra_debug_sigprint(); // NOTE: we're assuming that the cube has already been set to the correct size and there is no aliasing; // size setting and alias checking is done by either the Cube contructor or operator=() const uword n_rows = in.n_rows; const uword n_cols = in.n_cols; const uword n_slices = in.n_slices; arma_extra_debug_print(arma_str::format("out.n_rows = %d out.n_cols = %d out.n_slices = %d in.m.n_rows = %d in.m.n_cols = %d in.m.n_slices = %d") % out.n_rows % out.n_cols % out.n_slices % in.m.n_rows % in.m.n_cols % in.m.n_slices); if( (in.aux_row1 == 0) && (n_rows == in.m.n_rows) ) { for(uword s=0; s < n_slices; ++s) { arrayops::copy( out.slice_colptr(s,0), in.slice_colptr(s,0), in.n_elem_slice ); } return; } for(uword s=0; s < n_slices; ++s) for(uword c=0; c < n_cols; ++c) { arrayops::copy( out.slice_colptr(s,c), in.slice_colptr(s,c), n_rows ); } } //! cube X += Y.subcube(...) template inline void subview_cube::plus_inplace(Cube& out, const subview_cube& in) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out, in, "addition"); const uword n_rows = out.n_rows; const uword n_cols = out.n_cols; const uword n_slices = out.n_slices; for(uword slice = 0; slice inline void subview_cube::minus_inplace(Cube& out, const subview_cube& in) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out, in, "subtraction"); const uword n_rows = out.n_rows; const uword n_cols = out.n_cols; const uword n_slices = out.n_slices; for(uword slice = 0; slice inline void subview_cube::schur_inplace(Cube& out, const subview_cube& in) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out, in, "element-wise multiplication"); const uword n_rows = out.n_rows; const uword n_cols = out.n_cols; const uword n_slices = out.n_slices; for(uword slice = 0; slice inline void subview_cube::div_inplace(Cube& out, const subview_cube& in) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out, in, "element-wise division"); const uword n_rows = out.n_rows; const uword n_cols = out.n_cols; const uword n_slices = out.n_slices; for(uword slice = 0; slice inline void subview_cube::extract(Mat& out, const subview_cube& in) { arma_extra_debug_sigprint(); arma_debug_assert_cube_as_mat(out, in, "copy into matrix", false); const uword in_n_rows = in.n_rows; const uword in_n_cols = in.n_cols; const uword in_n_slices = in.n_slices; const uword out_vec_state = out.vec_state; if(in_n_slices == 1) { out.set_size(in_n_rows, in_n_cols); for(uword col=0; col < in_n_cols; ++col) { arrayops::copy( out.colptr(col), in.slice_colptr(0, col), in_n_rows ); } } else { if(out_vec_state == 0) { if(in_n_cols == 1) { out.set_size(in_n_rows, in_n_slices); for(uword i=0; i < in_n_slices; ++i) { arrayops::copy( out.colptr(i), in.slice_colptr(i, 0), in_n_rows ); } } else if(in_n_rows == 1) { const Cube& Q = in.m; const uword in_aux_row1 = in.aux_row1; const uword in_aux_col1 = in.aux_col1; const uword in_aux_slice1 = in.aux_slice1; out.set_size(in_n_cols, in_n_slices); for(uword slice=0; slice < in_n_slices; ++slice) { const uword mod_slice = in_aux_slice1 + slice; eT* out_colptr = out.colptr(slice); uword i,j; for(i=0, j=1; j < in_n_cols; i+=2, j+=2) { const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice); const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice); out_colptr[i] = tmp_i; out_colptr[j] = tmp_j; } if(i < in_n_cols) { out_colptr[i] = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice); } } } } else { out.set_size(in_n_slices); eT* out_mem = out.memptr(); const Cube& Q = in.m; const uword in_aux_row1 = in.aux_row1; const uword in_aux_col1 = in.aux_col1; const uword in_aux_slice1 = in.aux_slice1; for(uword i=0; i inline void subview_cube::plus_inplace(Mat& out, const subview_cube& in) { arma_extra_debug_sigprint(); arma_debug_assert_cube_as_mat(out, in, "addition", true); const uword in_n_rows = in.n_rows; const uword in_n_cols = in.n_cols; const uword in_n_slices = in.n_slices; const uword out_n_rows = out.n_rows; const uword out_n_cols = out.n_cols; const uword out_vec_state = out.vec_state; if(in_n_slices == 1) { if( (arma_config::debug) && ((out_n_rows != in_n_rows) || (out_n_cols != in_n_cols)) ) { std::ostringstream tmp; tmp << "in-place addition: " << out_n_rows << 'x' << out_n_cols << " output matrix is incompatible with " << in_n_rows << 'x' << in_n_cols << 'x' << in_n_slices << " cube interpreted as " << in_n_rows << 'x' << in_n_cols << " matrix"; arma_stop_logic_error(tmp.str()); } for(uword col=0; col < in_n_cols; ++col) { arrayops::inplace_plus( out.colptr(col), in.slice_colptr(0, col), in_n_rows ); } } else { if(out_vec_state == 0) { if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) ) { for(uword i=0; i < in_n_slices; ++i) { arrayops::inplace_plus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows ); } } else if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) ) { const Cube& Q = in.m; const uword in_aux_row1 = in.aux_row1; const uword in_aux_col1 = in.aux_col1; const uword in_aux_slice1 = in.aux_slice1; for(uword slice=0; slice < in_n_slices; ++slice) { const uword mod_slice = in_aux_slice1 + slice; eT* out_colptr = out.colptr(slice); uword i,j; for(i=0, j=1; j < in_n_cols; i+=2, j+=2) { const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice); const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice); out_colptr[i] += tmp_i; out_colptr[j] += tmp_j; } if(i < in_n_cols) { out_colptr[i] += Q.at(in_aux_row1, in_aux_col1 + i, mod_slice); } } } } else { eT* out_mem = out.memptr(); const Cube& Q = in.m; const uword in_aux_row1 = in.aux_row1; const uword in_aux_col1 = in.aux_col1; const uword in_aux_slice1 = in.aux_slice1; for(uword i=0; i inline void subview_cube::minus_inplace(Mat& out, const subview_cube& in) { arma_extra_debug_sigprint(); arma_debug_assert_cube_as_mat(out, in, "subtraction", true); const uword in_n_rows = in.n_rows; const uword in_n_cols = in.n_cols; const uword in_n_slices = in.n_slices; const uword out_n_rows = out.n_rows; const uword out_n_cols = out.n_cols; const uword out_vec_state = out.vec_state; if(in_n_slices == 1) { if( (arma_config::debug) && ((out_n_rows != in_n_rows) || (out_n_cols != in_n_cols)) ) { std::ostringstream tmp; tmp << "in-place subtraction: " << out_n_rows << 'x' << out_n_cols << " output matrix is incompatible with " << in_n_rows << 'x' << in_n_cols << 'x' << in_n_slices << " cube interpreted as " << in_n_rows << 'x' << in_n_cols << " matrix"; arma_stop_logic_error(tmp.str()); } for(uword col=0; col < in_n_cols; ++col) { arrayops::inplace_minus( out.colptr(col), in.slice_colptr(0, col), in_n_rows ); } } else { if(out_vec_state == 0) { if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) ) { for(uword i=0; i < in_n_slices; ++i) { arrayops::inplace_minus( out.colptr(i), in.slice_colptr(i, 0), in_n_rows ); } } else if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) ) { const Cube& Q = in.m; const uword in_aux_row1 = in.aux_row1; const uword in_aux_col1 = in.aux_col1; const uword in_aux_slice1 = in.aux_slice1; for(uword slice=0; slice < in_n_slices; ++slice) { const uword mod_slice = in_aux_slice1 + slice; eT* out_colptr = out.colptr(slice); uword i,j; for(i=0, j=1; j < in_n_cols; i+=2, j+=2) { const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice); const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice); out_colptr[i] -= tmp_i; out_colptr[j] -= tmp_j; } if(i < in_n_cols) { out_colptr[i] -= Q.at(in_aux_row1, in_aux_col1 + i, mod_slice); } } } } else { eT* out_mem = out.memptr(); const Cube& Q = in.m; const uword in_aux_row1 = in.aux_row1; const uword in_aux_col1 = in.aux_col1; const uword in_aux_slice1 = in.aux_slice1; for(uword i=0; i inline void subview_cube::schur_inplace(Mat& out, const subview_cube& in) { arma_extra_debug_sigprint(); arma_debug_assert_cube_as_mat(out, in, "element-wise multiplication", true); const uword in_n_rows = in.n_rows; const uword in_n_cols = in.n_cols; const uword in_n_slices = in.n_slices; const uword out_n_rows = out.n_rows; const uword out_n_cols = out.n_cols; const uword out_vec_state = out.vec_state; if(in_n_slices == 1) { if( (arma_config::debug) && ((out_n_rows != in_n_rows) || (out_n_cols != in_n_cols)) ) { std::ostringstream tmp; tmp << "in-place element-wise multiplication: " << out_n_rows << 'x' << out_n_cols << " output matrix is incompatible with " << in_n_rows << 'x' << in_n_cols << 'x' << in_n_slices << " cube interpreted as " << in_n_rows << 'x' << in_n_cols << " matrix"; arma_stop_logic_error(tmp.str()); } for(uword col=0; col < in_n_cols; ++col) { arrayops::inplace_mul( out.colptr(col), in.slice_colptr(0, col), in_n_rows ); } } else { if(out_vec_state == 0) { if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) ) { for(uword i=0; i < in_n_slices; ++i) { arrayops::inplace_mul( out.colptr(i), in.slice_colptr(i, 0), in_n_rows ); } } else if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) ) { const Cube& Q = in.m; const uword in_aux_row1 = in.aux_row1; const uword in_aux_col1 = in.aux_col1; const uword in_aux_slice1 = in.aux_slice1; for(uword slice=0; slice < in_n_slices; ++slice) { const uword mod_slice = in_aux_slice1 + slice; eT* out_colptr = out.colptr(slice); uword i,j; for(i=0, j=1; j < in_n_cols; i+=2, j+=2) { const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice); const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice); out_colptr[i] *= tmp_i; out_colptr[j] *= tmp_j; } if(i < in_n_cols) { out_colptr[i] *= Q.at(in_aux_row1, in_aux_col1 + i, mod_slice); } } } } else { eT* out_mem = out.memptr(); const Cube& Q = in.m; const uword in_aux_row1 = in.aux_row1; const uword in_aux_col1 = in.aux_col1; const uword in_aux_slice1 = in.aux_slice1; for(uword i=0; i inline void subview_cube::div_inplace(Mat& out, const subview_cube& in) { arma_extra_debug_sigprint(); arma_debug_assert_cube_as_mat(out, in, "element-wise division", true); const uword in_n_rows = in.n_rows; const uword in_n_cols = in.n_cols; const uword in_n_slices = in.n_slices; const uword out_n_rows = out.n_rows; const uword out_n_cols = out.n_cols; const uword out_vec_state = out.vec_state; if(in_n_slices == 1) { if( (arma_config::debug) && ((out_n_rows != in_n_rows) || (out_n_cols != in_n_cols)) ) { std::ostringstream tmp; tmp << "in-place element-wise division: " << out_n_rows << 'x' << out_n_cols << " output matrix is incompatible with " << in_n_rows << 'x' << in_n_cols << 'x' << in_n_slices << " cube interpreted as " << in_n_rows << 'x' << in_n_cols << " matrix"; arma_stop_logic_error(tmp.str()); } for(uword col=0; col < in_n_cols; ++col) { arrayops::inplace_div( out.colptr(col), in.slice_colptr(0, col), in_n_rows ); } } else { if(out_vec_state == 0) { if( (in_n_rows == out_n_rows) && (in_n_cols == 1) && (in_n_slices == out_n_cols) ) { for(uword i=0; i < in_n_slices; ++i) { arrayops::inplace_div( out.colptr(i), in.slice_colptr(i, 0), in_n_rows ); } } else if( (in_n_rows == 1) && (in_n_cols == out_n_rows) && (in_n_slices == out_n_cols) ) { const Cube& Q = in.m; const uword in_aux_row1 = in.aux_row1; const uword in_aux_col1 = in.aux_col1; const uword in_aux_slice1 = in.aux_slice1; for(uword slice=0; slice < in_n_slices; ++slice) { const uword mod_slice = in_aux_slice1 + slice; eT* out_colptr = out.colptr(slice); uword i,j; for(i=0, j=1; j < in_n_cols; i+=2, j+=2) { const eT tmp_i = Q.at(in_aux_row1, in_aux_col1 + i, mod_slice); const eT tmp_j = Q.at(in_aux_row1, in_aux_col1 + j, mod_slice); out_colptr[i] /= tmp_i; out_colptr[j] /= tmp_j; } if(i < in_n_cols) { out_colptr[i] /= Q.at(in_aux_row1, in_aux_col1 + i, mod_slice); } } } } else { eT* out_mem = out.memptr(); const Cube& Q = in.m; const uword in_aux_row1 = in.aux_row1; const uword in_aux_col1 = in.aux_col1; const uword in_aux_slice1 = in.aux_slice1; for(uword i=0; i inline typename subview_cube::iterator subview_cube::begin() { return iterator(*this, aux_row1, aux_col1, aux_slice1); } template inline typename subview_cube::const_iterator subview_cube::begin() const { return const_iterator(*this, aux_row1, aux_col1, aux_slice1); } template inline typename subview_cube::const_iterator subview_cube::cbegin() const { return const_iterator(*this, aux_row1, aux_col1, aux_slice1); } template inline typename subview_cube::iterator subview_cube::end() { return iterator(*this, aux_row1, aux_col1, aux_slice1 + n_slices); } template inline typename subview_cube::const_iterator subview_cube::end() const { return const_iterator(*this, aux_row1, aux_col1, aux_slice1 + n_slices); } template inline typename subview_cube::const_iterator subview_cube::cend() const { return const_iterator(*this, aux_row1, aux_col1, aux_slice1 + n_slices); } // // // template inline subview_cube::iterator::iterator() : M (nullptr) , current_ptr (nullptr) , current_row (0 ) , current_col (0 ) , current_slice(0 ) , aux_row1 (0 ) , aux_col1 (0 ) , aux_row2_p1 (0 ) , aux_col2_p1 (0 ) { arma_extra_debug_sigprint(); // Technically this iterator is invalid (it does not point to a valid element) } template inline subview_cube::iterator::iterator(const iterator& X) : M (X.M ) , current_ptr (X.current_ptr ) , current_row (X.current_row ) , current_col (X.current_col ) , current_slice(X.current_slice) , aux_row1 (X.aux_row1 ) , aux_col1 (X.aux_col1 ) , aux_row2_p1 (X.aux_row2_p1 ) , aux_col2_p1 (X.aux_col2_p1 ) { arma_extra_debug_sigprint(); } template inline subview_cube::iterator::iterator(subview_cube& in_sv, const uword in_row, const uword in_col, const uword in_slice) : M (&(const_cast< Cube& >(in_sv.m))) , current_ptr (&(M->at(in_row,in_col,in_slice)) ) , current_row (in_row ) , current_col (in_col ) , current_slice(in_slice ) , aux_row1 (in_sv.aux_row1 ) , aux_col1 (in_sv.aux_col1 ) , aux_row2_p1 (in_sv.aux_row1 + in_sv.n_rows ) , aux_col2_p1 (in_sv.aux_col1 + in_sv.n_cols ) { arma_extra_debug_sigprint(); } template inline arma_warn_unused eT& subview_cube::iterator::operator*() { return (*current_ptr); } template inline typename subview_cube::iterator& subview_cube::iterator::operator++() { current_row++; if(current_row == aux_row2_p1) { current_row = aux_row1; current_col++; if(current_col == aux_col2_p1) { current_col = aux_col1; current_slice++; } current_ptr = &( (*M).at(current_row,current_col,current_slice) ); } else { current_ptr++; } return *this; } template inline arma_warn_unused typename subview_cube::iterator subview_cube::iterator::operator++(int) { typename subview_cube::iterator temp(*this); ++(*this); return temp; } template inline arma_warn_unused bool subview_cube::iterator::operator==(const iterator& rhs) const { return (current_ptr == rhs.current_ptr); } template inline arma_warn_unused bool subview_cube::iterator::operator!=(const iterator& rhs) const { return (current_ptr != rhs.current_ptr); } template inline arma_warn_unused bool subview_cube::iterator::operator==(const const_iterator& rhs) const { return (current_ptr == rhs.current_ptr); } template inline arma_warn_unused bool subview_cube::iterator::operator!=(const const_iterator& rhs) const { return (current_ptr != rhs.current_ptr); } // // // template inline subview_cube::const_iterator::const_iterator() : M (nullptr) , current_ptr (nullptr) , current_row (0 ) , current_col (0 ) , current_slice(0 ) , aux_row1 (0 ) , aux_col1 (0 ) , aux_row2_p1 (0 ) , aux_col2_p1 (0 ) { arma_extra_debug_sigprint(); // Technically this iterator is invalid (it does not point to a valid element) } template inline subview_cube::const_iterator::const_iterator(const iterator& X) : M (X.M ) , current_ptr (X.current_ptr ) , current_row (X.current_row ) , current_col (X.current_col ) , current_slice(X.current_slice) , aux_row1 (X.aux_row1 ) , aux_col1 (X.aux_col1 ) , aux_row2_p1 (X.aux_row2_p1 ) , aux_col2_p1 (X.aux_col2_p1 ) { arma_extra_debug_sigprint(); } template inline subview_cube::const_iterator::const_iterator(const const_iterator& X) : M (X.M ) , current_ptr (X.current_ptr ) , current_row (X.current_row ) , current_col (X.current_col ) , current_slice(X.current_slice) , aux_row1 (X.aux_row1 ) , aux_col1 (X.aux_col1 ) , aux_row2_p1 (X.aux_row2_p1 ) , aux_col2_p1 (X.aux_col2_p1 ) { arma_extra_debug_sigprint(); } template inline subview_cube::const_iterator::const_iterator(const subview_cube& in_sv, const uword in_row, const uword in_col, const uword in_slice) : M (&(in_sv.m) ) , current_ptr (&(M->at(in_row,in_col,in_slice))) , current_row (in_row ) , current_col (in_col ) , current_slice(in_slice ) , aux_row1 (in_sv.aux_row1 ) , aux_col1 (in_sv.aux_col1 ) , aux_row2_p1 (in_sv.aux_row1 + in_sv.n_rows ) , aux_col2_p1 (in_sv.aux_col1 + in_sv.n_cols ) { arma_extra_debug_sigprint(); } template inline arma_warn_unused const eT& subview_cube::const_iterator::operator*() { return (*current_ptr); } template inline typename subview_cube::const_iterator& subview_cube::const_iterator::operator++() { current_row++; if(current_row == aux_row2_p1) { current_row = aux_row1; current_col++; if(current_col == aux_col2_p1) { current_col = aux_col1; current_slice++; } current_ptr = &( (*M).at(current_row,current_col,current_slice) ); } else { current_ptr++; } return *this; } template inline arma_warn_unused typename subview_cube::const_iterator subview_cube::const_iterator::operator++(int) { typename subview_cube::const_iterator temp(*this); ++(*this); return temp; } template inline arma_warn_unused bool subview_cube::const_iterator::operator==(const iterator& rhs) const { return (current_ptr == rhs.current_ptr); } template inline arma_warn_unused bool subview_cube::const_iterator::operator!=(const iterator& rhs) const { return (current_ptr != rhs.current_ptr); } template inline arma_warn_unused bool subview_cube::const_iterator::operator==(const const_iterator& rhs) const { return (current_ptr == rhs.current_ptr); } template inline arma_warn_unused bool subview_cube::const_iterator::operator!=(const const_iterator& rhs) const { return (current_ptr != rhs.current_ptr); } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_htrans_bones.hpp0000644000176200001440000000303314124060717024630 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_htrans //! @{ //! hermitian transpose operation for sparse matrices class spop_htrans { public: template struct traits { static constexpr bool is_row = T1::is_col; // deliberately swapped static constexpr bool is_col = T1::is_row; static constexpr bool is_xvec = T1::is_xvec; }; template inline static void apply(SpMat& out, const SpOp& in, const typename arma_not_cx::result* junk = nullptr); template inline static void apply(SpMat& out, const SpOp& in, const typename arma_cx_only::result* junk = nullptr); }; //! @} RcppArmadillo/inst/include/armadillo_bits/SpSubview_col_list_bones.hpp0000644000176200001440000000655514124060717026123 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpSubview_col_list //! @{ template class SpSubview_col_list : public SpBase< eT, SpSubview_col_list > { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; const SpMat& m; const quasi_unwrap U_ci; protected: arma_inline SpSubview_col_list(const SpMat& in_m, const Base& in_ci); public: inline ~SpSubview_col_list(); inline SpSubview_col_list() = delete; template inline void for_each(functor F); template inline void for_each(functor F) const; template inline void transform(functor F); inline void replace(const eT old_val, const eT new_val); inline void clean(const pod_type threshold); inline void fill(const eT val); inline void zeros(); inline void ones(); inline void operator+= (const eT val); inline void operator-= (const eT val); inline void operator*= (const eT val); inline void operator/= (const eT val); template inline void operator= (const Base& x); template inline void operator+=(const Base& x); template inline void operator-=(const Base& x); template inline void operator%=(const Base& x); template inline void operator/=(const Base& x); inline void operator= (const SpSubview_col_list& x); template inline void operator= (const SpSubview_col_list& x); template inline void operator= (const SpBase& x); template inline void operator+= (const SpBase& x); template inline void operator-= (const SpBase& x); template inline void operator%= (const SpBase& x); template inline void operator/= (const SpBase& x); inline static void extract(SpMat& out, const SpSubview_col_list& in); inline static void plus_inplace(SpMat& out, const SpSubview_col_list& in); inline static void minus_inplace(SpMat& out, const SpSubview_col_list& in); inline static void schur_inplace(SpMat& out, const SpSubview_col_list& in); inline static void div_inplace(SpMat& out, const SpSubview_col_list& in); friend class SpMat; }; //! @} RcppArmadillo/inst/include/armadillo_bits/config.hpp0000644000176200001440000003054314124060717022355 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #if !defined(ARMA_WARN_LEVEL) #define ARMA_WARN_LEVEL 2 #endif //// The level of warning messages printed to ARMA_CERR_STREAM. //// Must be an integer >= 0. The default value is 2. //// 0 = no warnings //// 1 = only critical warnings about arguments and/or data which are likely to lead to incorrect results //// 2 = as per level 1, and warnings about poorly conditioned systems (low rcond) detected by solve(), spsolve(), etc //// 3 = as per level 2, and warnings about failed decompositions, failed saving/loading, etc #if !defined(ARMA_USE_LAPACK) #define ARMA_USE_LAPACK //// Comment out the above line if you don't have LAPACK or a high-speed replacement for LAPACK, //// such as OpenBLAS, Intel MKL, or the Accelerate framework. //// LAPACK is required for matrix decompositions (eg. SVD) and matrix inverse. #endif #if !defined(ARMA_USE_BLAS) #define ARMA_USE_BLAS //// Comment out the above line if you don't have BLAS or a high-speed replacement for BLAS, //// such as OpenBLAS, Intel MKL, or the Accelerate framework. //// BLAS is used for matrix multiplication. //// Without BLAS, matrix multiplication will still work, but might be slower. #endif #if !defined(ARMA_USE_NEWARP) #define ARMA_USE_NEWARP //// Uncomment the above line to enable the built-in partial emulation of ARPACK. //// This is used for eigen decompositions of real (non-complex) sparse matrices, eg. eigs_sym(), svds() #endif #if !defined(ARMA_USE_ARPACK) // #define ARMA_USE_ARPACK //// Uncomment the above line if you have ARPACK or a high-speed replacement for ARPACK. //// ARPACK is required for eigen decompositions of complex sparse matrices #endif #if !defined(ARMA_USE_SUPERLU) // #define ARMA_USE_SUPERLU //// Uncomment the above line if you have SuperLU. //// SuperLU is used for solving sparse linear systems via spsolve() //// Caveat: only SuperLU version 5.2 can be used! #endif #if !defined(ARMA_SUPERLU_INCLUDE_DIR) // #define ARMA_SUPERLU_INCLUDE_DIR /usr/include/ //// If you're using SuperLU and want to explicitly include the SuperLU headers, //// uncomment the above define and specify the appropriate include directory. //// Make sure the directory has a trailing / #endif // #define ARMA_USE_WRAPPER //// Comment out the above line if you're getting linking errors when compiling your programs, //// or if you prefer to directly link with LAPACK, BLAS + etc instead of the Armadillo runtime library. //// You will then need to link your programs directly with -llapack -lblas instead of -larmadillo // #define ARMA_BLAS_CAPITALS //// Uncomment the above line if your BLAS and LAPACK libraries have capitalised function names #define ARMA_BLAS_UNDERSCORE //// Uncomment the above line if your BLAS and LAPACK libraries have function names with a trailing underscore. //// Conversely, comment it out if the function names don't have a trailing underscore. // #define ARMA_BLAS_LONG //// Uncomment the above line if your BLAS and LAPACK libraries use "long" instead of "int" // #define ARMA_BLAS_LONG_LONG //// Uncomment the above line if your BLAS and LAPACK libraries use "long long" instead of "int" // #define ARMA_BLAS_NOEXCEPT //// Uncomment the above line if you require BLAS functions to have the 'noexcept' specification // #define ARMA_LAPACK_NOEXCEPT //// Uncomment the above line if you require LAPACK functions to have the 'noexcept' specification #define ARMA_USE_FORTRAN_HIDDEN_ARGS //// Comment out the above line to call BLAS and LAPACK functions without using so-called "hidden" arguments. //// Fortran functions (compiled without a BIND(C) declaration) that have char arguments //// (like many BLAS and LAPACK functions) also have associated "hidden" arguments. //// For each char argument, the corresponding "hidden" argument specifies the number of characters. //// These "hidden" arguments are typically tacked onto the end of function definitions. // #define ARMA_USE_TBB_ALLOC //// Uncomment the above line if you want to use Intel TBB scalable_malloc() and scalable_free() instead of standard malloc() and free() // #define ARMA_USE_MKL_ALLOC //// Uncomment the above line if you want to use Intel MKL mkl_malloc() and mkl_free() instead of standard malloc() and free() // #define ARMA_USE_MKL_TYPES //// Uncomment the above line if you want to use Intel MKL types for complex numbers. //// You will need to include appropriate MKL headers before the Armadillo header. //// You may also need to enable or disable the following options: //// ARMA_BLAS_LONG, ARMA_BLAS_LONG_LONG, ARMA_USE_FORTRAN_HIDDEN_ARGS // #define ARMA_USE_ATLAS // #define ARMA_ATLAS_INCLUDE_DIR /usr/include/ //// If you're using ATLAS and the compiler can't find cblas.h and/or clapack.h //// uncomment the above define and specify the appropriate include directory. //// Make sure the directory has a trailing / #if !defined(ARMA_USE_OPENMP) // #define ARMA_USE_OPENMP //// Uncomment the above line to forcefully enable use of OpenMP for parallelisation. //// Note that ARMA_USE_OPENMP is automatically enabled when a compiler supporting OpenMP 3.1 is detected. #endif #if !defined(ARMA_64BIT_WORD) // #define ARMA_64BIT_WORD //// Uncomment the above line if you require matrices/vectors capable of holding more than 4 billion elements. //// Note that ARMA_64BIT_WORD is automatically enabled when std::size_t has 64 bits and ARMA_32BIT_WORD is not defined. #endif #if !defined(ARMA_USE_HDF5) // #define ARMA_USE_HDF5 //// Uncomment the above line to allow the ability to save and load matrices stored in HDF5 format; //// the hdf5.h header file must be available on your system, //// and you will need to link with the hdf5 library (eg. -lhdf5) #endif #if !defined(ARMA_OPTIMISE_BAND) #define ARMA_OPTIMISE_BAND //// Comment out the above line if you don't want automatically optimised handling //// of band matrices by solve() and chol() #endif #if !defined(ARMA_OPTIMISE_SYMPD) #define ARMA_OPTIMISE_SYMPD //// Comment out the above line if you don't want automatically optimised handling //// of symmetric/hermitian positive definite matrices by various functions: //// solve(), inv(), pinv(), expmat(), logmat(), sqrtmat(), rcond() #endif // #define ARMA_USE_HDF5_ALT #if defined(ARMA_USE_HDF5_ALT) && defined(ARMA_USE_WRAPPER) #undef ARMA_USE_HDF5 #define ARMA_USE_HDF5 // #define ARMA_HDF5_INCLUDE_DIR /usr/include/ #endif #if !defined(ARMA_MAT_PREALLOC) #define ARMA_MAT_PREALLOC 16 #endif //// This is the number of preallocated elements used by matrices and vectors; //// it must be an integer that is at least 1. //// If you mainly use lots of very small vectors (eg. <= 4 elements), //// change the number to the size of your vectors. #if !defined(ARMA_OPENMP_THRESHOLD) #define ARMA_OPENMP_THRESHOLD 320 #endif //// The minimum number of elements in a matrix to allow OpenMP based parallelisation; //// it must be an integer that is at least 1. #if !defined(ARMA_OPENMP_THREADS) #define ARMA_OPENMP_THREADS 8 #endif //// The maximum number of threads to use for OpenMP based parallelisation; //// it must be an integer that is at least 1. // #define ARMA_NO_DEBUG //// Uncomment the above line if you want to disable all run-time checks. //// This will result in faster code, but you first need to make sure that your code runs correctly! //// We strongly recommend to have the run-time checks enabled during development, //// as this greatly aids in finding mistakes in your code, and hence speeds up development. //// We recommend that run-time checks be disabled _only_ for the shipped version of your program. // #define ARMA_EXTRA_DEBUG //// Uncomment the above line if you want to see the function traces of how Armadillo evaluates expressions. //// This is mainly useful for debugging of the library. #if defined(ARMA_DEFAULT_OSTREAM) #pragma message ("WARNING: support for ARMA_DEFAULT_OSTREAM is deprecated and will be removed;") #pragma message ("WARNING: use ARMA_COUT_STREAM and ARMA_CERR_STREAM instead") #endif #if !defined(ARMA_COUT_STREAM) #if defined(ARMA_DEFAULT_OSTREAM) // for compatibility with earlier versions of Armadillo #define ARMA_COUT_STREAM ARMA_DEFAULT_OSTREAM #else #define ARMA_COUT_STREAM std::cout #endif #endif #if !defined(ARMA_CERR_STREAM) #if defined(ARMA_DEFAULT_OSTREAM) // for compatibility with earlier versions of Armadillo #define ARMA_CERR_STREAM ARMA_DEFAULT_OSTREAM #else #define ARMA_CERR_STREAM std::cerr #endif #endif #if !defined(ARMA_PRINT_ERRORS) #define ARMA_PRINT_ERRORS //// Comment out the above line if you don't want errors and warnings printed (eg. failed decompositions) #endif #if !defined(ARMA_PRINT_EXCEPTIONS) // #define ARMA_PRINT_EXCEPTIONS //// see also compiler_setup.hpp #endif #if !defined(ARMA_PRINT_HDF5_ERRORS) // #define ARMA_PRINT_HDF5_ERRORS #endif #if defined(ARMA_DONT_USE_LAPACK) #undef ARMA_USE_LAPACK #endif #if defined(ARMA_DONT_USE_BLAS) #undef ARMA_USE_BLAS #endif #if defined(ARMA_DONT_USE_NEWARP) || !defined(ARMA_USE_LAPACK) #undef ARMA_USE_NEWARP #endif #if defined(ARMA_DONT_USE_ARPACK) #undef ARMA_USE_ARPACK #endif #if defined(ARMA_DONT_USE_SUPERLU) #undef ARMA_USE_SUPERLU #undef ARMA_SUPERLU_INCLUDE_DIR #endif #if defined(ARMA_DONT_USE_ATLAS) #undef ARMA_USE_ATLAS #undef ARMA_ATLAS_INCLUDE_DIR #endif #if defined(ARMA_DONT_USE_WRAPPER) #undef ARMA_USE_WRAPPER #undef ARMA_USE_HDF5_ALT #endif #if defined(ARMA_DONT_USE_FORTRAN_HIDDEN_ARGS) #undef ARMA_USE_FORTRAN_HIDDEN_ARGS #endif #if !defined(ARMA_DONT_USE_STD_MUTEX) // #define ARMA_DONT_USE_STD_MUTEX //// Uncomment the above line to disable use of std::mutex #endif // for compatibility with earlier versions of Armadillo #if defined(ARMA_DONT_USE_CXX11_MUTEX) #pragma message ("WARNING: support for ARMA_DONT_USE_CXX11_MUTEX is deprecated and will be removed;") #pragma message ("WARNING: use ARMA_DONT_USE_STD_MUTEX instead") #undef ARMA_DONT_USE_STD_MUTEX #define ARMA_DONT_USE_STD_MUTEX #endif #if defined(ARMA_DONT_USE_OPENMP) #undef ARMA_USE_OPENMP #endif #if defined(ARMA_USE_WRAPPER) #if !defined(ARMA_USE_EXTERN_RNG) // #define ARMA_USE_EXTERN_RNG #endif #endif #if defined(ARMA_DONT_USE_EXTERN_RNG) #undef ARMA_USE_EXTERN_RNG #endif // for compatibility with earlier versions of Armadillo #if defined(ARMA_DONT_USE_EXTERN_CXX11_RNG) #pragma message ("WARNING: support for ARMA_DONT_USE_EXTERN_CXX11_RNG is deprecated and will be removed;") #pragma message ("WARNING: use ARMA_DONT_USE_EXTERN_RNG instead") #undef ARMA_USE_EXTERN_RNG #endif #if defined(ARMA_32BIT_WORD) #undef ARMA_64BIT_WORD #endif #if defined(ARMA_DONT_USE_HDF5) #undef ARMA_USE_HDF5 #undef ARMA_USE_HDF5_ALT #endif #if defined(ARMA_DONT_OPTIMISE_BAND) || defined(ARMA_DONT_OPTIMISE_SOLVE_BAND) #undef ARMA_OPTIMISE_BAND #endif #if defined(ARMA_DONT_OPTIMISE_SYMPD) || defined(ARMA_DONT_OPTIMISE_SOLVE_SYMPD) #undef ARMA_OPTIMISE_SYMPD #endif #if defined(ARMA_DONT_PRINT_ERRORS) #undef ARMA_PRINT_ERRORS #endif #if defined(ARMA_DONT_PRINT_EXCEPTIONS) #undef ARMA_PRINT_EXCEPTIONS #endif #if !defined(ARMA_DONT_ZERO_INIT) // #define ARMA_DONT_ZERO_INIT //// Uncomment the above line to disable initialising elements to zero during construction of dense matrices and cubes #endif #if defined(ARMA_DONT_PRINT_HDF5_ERRORS) #undef ARMA_PRINT_HDF5_ERRORS #endif #if defined(ARMA_NO_CRIPPLED_LAPACK) #undef ARMA_CRIPPLED_LAPACK #endif // if Armadillo was installed on this system via CMake and ARMA_USE_WRAPPER is not defined, // ARMA_AUX_LIBS lists the libraries required by Armadillo on this system, and // ARMA_AUX_INCDIRS lists the include directories required by Armadillo on this system. // Do not use these unless you know what you are doing. #define ARMA_AUX_LIBS #define ARMA_AUX_INCDIRS RcppArmadillo/inst/include/armadillo_bits/op_hist_meat.hpp0000644000176200001440000000607214124060717023563 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_hist //! @{ template inline void op_hist::apply_noalias(Mat& out, const Mat& A, const uword n_bins, const uword dim) { arma_extra_debug_sigprint(); arma_debug_check( ((A.is_vec() == false) && (A.is_empty() == false)), "hist(): only vectors are supported when automatically determining bin centers" ); if(n_bins == 0) { out.reset(); return; } uword A_n_elem = A.n_elem; const eT* A_mem = A.memptr(); eT min_val = priv::most_pos(); eT max_val = priv::most_neg(); uword i,j; for(i=0, j=1; j < A_n_elem; i+=2, j+=2) { const eT val_i = A_mem[i]; const eT val_j = A_mem[j]; if(min_val > val_i) { min_val = val_i; } if(min_val > val_j) { min_val = val_j; } if(max_val < val_i) { max_val = val_i; } if(max_val < val_j) { max_val = val_j; } } if(i < A_n_elem) { const eT val_i = A_mem[i]; if(min_val > val_i) { min_val = val_i; } if(max_val < val_i) { max_val = val_i; } } if(min_val == max_val) { min_val -= (n_bins/2); max_val += (n_bins/2); } if(arma_isfinite(min_val) == false) { min_val = priv::most_neg(); } if(arma_isfinite(max_val) == false) { max_val = priv::most_pos(); } Col c(n_bins, arma_nozeros_indicator()); eT* c_mem = c.memptr(); for(uword ii=0; ii < n_bins; ++ii) { c_mem[ii] = (0.5 + ii) / double(n_bins); } c = ((max_val - min_val) * c) + min_val; glue_hist::apply_noalias(out, A, c, dim); } template inline void op_hist::apply(Mat& out, const mtOp& X) { arma_extra_debug_sigprint(); const uword n_bins = X.aux_uword_a; const quasi_unwrap U(X.m); const uword dim = (T1::is_xvec) ? uword(U.M.is_rowvec() ? 1 : 0) : uword((T1::is_row) ? 1 : 0); if(is_non_integral::value) { if(U.is_alias(out)) { Mat tmp; op_hist::apply_noalias(tmp, U.M, n_bins, dim); out.steal_mem(tmp); } else { op_hist::apply_noalias(out, U.M, n_bins, dim); } } else { Mat converted = conv_to< Mat >::from(U.M); op_hist::apply_noalias(out, converted, n_bins, dim); } } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_mvnrnd_meat.hpp0000644000176200001440000001145314124060717024435 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_mvnrnd //! @{ // implementation based on: // James E. Gentle. // Generation of Random Numbers. // Computational Statistics, pp. 305-331, 2009. // http://dx.doi.org/10.1007/978-0-387-98144-4_7 template inline void glue_mvnrnd_vec::apply(Mat& out, const Glue& expr) { arma_extra_debug_sigprint(); const bool status = glue_mvnrnd::apply_direct(out, expr.A, expr.B, uword(1)); if(status == false) { out.soft_reset(); arma_stop_runtime_error("mvnrnd(): given covariance matrix is not symmetric positive semi-definite"); } } template inline void glue_mvnrnd::apply(Mat& out, const Glue& expr) { arma_extra_debug_sigprint(); const bool status = glue_mvnrnd::apply_direct(out, expr.A, expr.B, expr.aux_uword); if(status == false) { out.soft_reset(); arma_stop_runtime_error("mvnrnd(): given covariance matrix is not symmetric positive semi-definite"); } } template inline bool glue_mvnrnd::apply_direct(Mat& out, const Base& M, const Base& C, const uword N) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap UM(M.get_ref()); const quasi_unwrap UC(C.get_ref()); arma_debug_check( (UM.M.is_colvec() == false) && (UM.M.is_empty() == false), "mvnrnd(): given mean must be a column vector" ); arma_debug_check( (UC.M.is_square() == false), "mvnrnd(): given covariance matrix must be square sized" ); arma_debug_check( (UM.M.n_rows != UC.M.n_rows), "mvnrnd(): number of rows in given mean vector and covariance matrix must match" ); if( UM.M.is_empty() || UC.M.is_empty() ) { out.set_size(0,N); return true; } // if(auxlib::rudimentary_sym_check(UC.M) == false) // { // arma_debug_warn_level(1, "mvnrnd(): given matrix is not symmetric"); // return false; // } if((arma_config::debug) && (auxlib::rudimentary_sym_check(UC.M) == false)) { arma_debug_warn_level(1, "mvnrnd(): given matrix is not symmetric"); } bool status = false; if(UM.is_alias(out) || UC.is_alias(out)) { Mat tmp; status = glue_mvnrnd::apply_noalias(tmp, UM.M, UC.M, N); out.steal_mem(tmp); } else { status = glue_mvnrnd::apply_noalias(out, UM.M, UC.M, N); } return status; } template inline bool glue_mvnrnd::apply_noalias(Mat& out, const Mat& M, const Mat& C, const uword N) { arma_extra_debug_sigprint(); Mat D; const bool chol_status = op_chol::apply_direct(D, C, 1); // '1' means "lower triangular" if(chol_status == false) { // C is not symmetric positive definite, so find approximate square root of C Col eigval; // NOTE: eT is constrained to be real (ie. float or double) in fn_mvnrnd.hpp Mat eigvec; const bool eig_status = eig_sym_helper(eigval, eigvec, C, 'd', "mvnrnd()"); if(eig_status == false) { return false; } eT* eigval_mem = eigval.memptr(); const uword eigval_n_elem = eigval.n_elem; // since we're doing an approximation, tolerate tiny negative eigenvalues const eT tol = eT(-100) * Datum::eps * norm(C, "fro"); if(arma_isfinite(tol) == false) { return false; } for(uword i=0; i DD = eigvec * diagmat(sqrt(eigval)); D.steal_mem(DD); } out = D * randn< Mat >(M.n_rows, N); if(N == 1) { out += M; } else if(N > 1) { out.each_col() += M; } return true; } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_chol.hpp0000644000176200001440000000772514124060717022526 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_chol //! @{ template arma_warn_unused inline typename enable_if2< is_supported_blas_type::value, const Op >::result chol ( const Base& X, const char* layout = "upper" ) { arma_extra_debug_sigprint(); const char sig = (layout != nullptr) ? layout[0] : char(0); arma_debug_check( ((sig != 'u') && (sig != 'l')), "chol(): layout must be \"upper\" or \"lower\"" ); return Op(X.get_ref(), ((sig == 'u') ? 0 : 1), 0 ); } template inline typename enable_if2< is_supported_blas_type::value, bool >::result chol ( Mat& out, const Base& X, const char* layout = "upper" ) { arma_extra_debug_sigprint(); const char sig = (layout != nullptr) ? layout[0] : char(0); arma_debug_check( ((sig != 'u') && (sig != 'l')), "chol(): layout must be \"upper\" or \"lower\"" ); const bool status = op_chol::apply_direct(out, X.get_ref(), ((sig == 'u') ? 0 : 1)); if(status == false) { out.soft_reset(); arma_debug_warn_level(3, "chol(): decomposition failed"); } return status; } template inline typename enable_if2< is_supported_blas_type::value, bool >::result chol ( Mat& out, Mat& P, const Base& X, const char* layout = "upper", const char* P_mode = "matrix" ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const char sig_layout = (layout != nullptr) ? layout[0] : char(0); const char sig_P_mode = (P_mode != nullptr) ? P_mode[0] : char(0); arma_debug_check( ((sig_layout != 'u') && (sig_layout != 'l')), "chol(): argument 'layout' must be \"upper\" or \"lower\"" ); arma_debug_check( ((sig_P_mode != 'm') && (sig_P_mode != 'v')), "chol(): argument 'P_mode' must be \"vector\" or \"matrix\"" ); out = X.get_ref(); arma_debug_check( (out.is_square() == false), "chol(): given matrix must be square sized" ); if(out.is_empty()) { P.reset(); return true; } if((arma_config::debug) && (auxlib::rudimentary_sym_check(out) == false)) { if(is_cx::no ) { arma_debug_warn_level(1, "chol(): given matrix is not symmetric"); } if(is_cx::yes) { arma_debug_warn_level(1, "chol(): given matrix is not hermitian"); } } bool status = false; if(sig_P_mode == 'v') { status = auxlib::chol_pivot(out, P, ((sig_layout == 'u') ? 0 : 1)); } else if(sig_P_mode == 'm') { Mat P_vec; status = auxlib::chol_pivot(out, P_vec, ((sig_layout == 'u') ? 0 : 1)); if(status) { // construct P const uword N = P_vec.n_rows; P.zeros(N,N); for(uword i=0; i < N; ++i) { P.at(P_vec[i], i) = uword(1); } } } if(status == false) { out.soft_reset(); P.soft_reset(); arma_debug_warn_level(3, "chol(): decomposition failed"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_orth_null_bones.hpp0000644000176200001440000000301414124060717024773 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_orth_null //! @{ class op_orth : public traits_op_default { public: template inline static void apply(Mat& out, const Op& expr); template inline static bool apply_direct(Mat& out, const Base& expr, typename T1::pod_type tol); }; class op_null : public traits_op_default { public: template inline static void apply(Mat& out, const Op& expr); template inline static bool apply_direct(Mat& out, const Base& expr, typename T1::pod_type tol); }; //! @} RcppArmadillo/inst/include/armadillo_bits/MapMat_bones.hpp0000644000176200001440000001720114124060717023451 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup MapMat //! @{ // this class is for internal use only; subject to change and/or removal without notice template class MapMat { public: typedef eT elem_type; //!< the type of elements stored in the matrix typedef typename get_pod_type::result pod_type; //!< if eT is std::complex, pod_type is T; otherwise pod_type is eT static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; const uword n_rows; //!< number of rows (read-only) const uword n_cols; //!< number of columns (read-only) const uword n_elem; //!< number of elements (read-only) private: typedef typename std::map map_type; arma_aligned map_type* map_ptr; public: inline ~MapMat(); inline MapMat(); inline explicit MapMat(const uword in_n_rows, const uword in_n_cols); inline explicit MapMat(const SizeMat& s); inline MapMat(const MapMat& x); inline void operator=(const MapMat& x); inline explicit MapMat(const SpMat& x); inline void operator=(const SpMat& x); inline MapMat(MapMat&& x); inline void operator=(MapMat&& x); inline void reset(); inline void set_size(const uword in_n_rows); inline void set_size(const uword in_n_rows, const uword in_n_cols); inline void set_size(const SizeMat& s); inline void zeros(); inline void zeros(const uword in_n_rows); inline void zeros(const uword in_n_rows, const uword in_n_cols); inline void zeros(const SizeMat& s); inline void eye(); inline void eye(const uword in_n_rows, const uword in_n_cols); inline void eye(const SizeMat& s); inline void speye(); inline void speye(const uword in_n_rows, const uword in_n_cols); inline void speye(const SizeMat& s); arma_inline arma_warn_unused MapMat_val operator[](const uword index); inline arma_warn_unused eT operator[](const uword index) const; arma_inline arma_warn_unused MapMat_val operator()(const uword index); inline arma_warn_unused eT operator()(const uword index) const; arma_inline arma_warn_unused MapMat_val at(const uword in_row, const uword in_col); inline arma_warn_unused eT at(const uword in_row, const uword in_col) const; arma_inline arma_warn_unused MapMat_val operator()(const uword in_row, const uword in_col); inline arma_warn_unused eT operator()(const uword in_row, const uword in_col) const; inline arma_warn_unused bool is_empty() const; inline arma_warn_unused bool is_vec() const; inline arma_warn_unused bool is_rowvec() const; inline arma_warn_unused bool is_colvec() const; inline arma_warn_unused bool is_square() const; inline void sprandu(const uword in_n_rows, const uword in_n_cols, const double density); inline void print(const std::string& extra_text) const; inline uword get_n_nonzero() const; inline void get_locval_format(umat& locs, Col& vals) const; private: inline void init_cold(); inline void init_warm(const uword in_n_rows, const uword in_n_cols); arma_inline void set_val(const uword index, const eT& in_val); inline void erase_val(const uword index); friend class SpMat; friend class MapMat_val; friend class SpMat_MapMat_val; friend class SpSubview_MapMat_val; }; template class MapMat_val { private: arma_aligned MapMat& parent; arma_aligned const uword index; inline MapMat_val(MapMat& in_parent, const uword in_index); friend class MapMat; public: arma_inline operator eT() const; arma_inline typename get_pod_type::result real() const; arma_inline typename get_pod_type::result imag() const; arma_inline void operator= (const MapMat_val& x); arma_inline void operator= (const eT in_val); arma_inline void operator+=(const eT in_val); arma_inline void operator-=(const eT in_val); arma_inline void operator*=(const eT in_val); arma_inline void operator/=(const eT in_val); arma_inline void operator++(); arma_inline void operator++(int); arma_inline void operator--(); arma_inline void operator--(int); }; template class SpMat_MapMat_val { private: arma_aligned SpMat& s_parent; arma_aligned MapMat& m_parent; arma_aligned const uword row; arma_aligned const uword col; inline SpMat_MapMat_val(SpMat& in_s_parent, MapMat& in_m_parent, const uword in_row, const uword in_col); friend class SpMat; friend class MapMat; friend class SpSubview_MapMat_val; public: inline operator eT() const; inline typename get_pod_type::result real() const; inline typename get_pod_type::result imag() const; inline SpMat_MapMat_val& operator= (const SpMat_MapMat_val& x); inline SpMat_MapMat_val& operator= (const eT in_val); inline SpMat_MapMat_val& operator+=(const eT in_val); inline SpMat_MapMat_val& operator-=(const eT in_val); inline SpMat_MapMat_val& operator*=(const eT in_val); inline SpMat_MapMat_val& operator/=(const eT in_val); inline SpMat_MapMat_val& operator++(); inline arma_warn_unused eT operator++(int); inline SpMat_MapMat_val& operator--(); inline arma_warn_unused eT operator--(int); inline void set(const eT in_val); inline void add(const eT in_val); inline void sub(const eT in_val); inline void mul(const eT in_val); inline void div(const eT in_val); }; template class SpSubview_MapMat_val : public SpMat_MapMat_val { private: arma_inline SpSubview_MapMat_val(SpSubview& in_sv_parent, MapMat& in_m_parent, const uword in_row, const uword in_col); arma_aligned SpSubview& sv_parent; friend class SpMat; friend class MapMat; friend class SpSubview; friend class SpMat_MapMat_val; public: inline SpSubview_MapMat_val& operator= (const SpSubview_MapMat_val& x); inline SpSubview_MapMat_val& operator= (const eT in_val); inline SpSubview_MapMat_val& operator+=(const eT in_val); inline SpSubview_MapMat_val& operator-=(const eT in_val); inline SpSubview_MapMat_val& operator*=(const eT in_val); inline SpSubview_MapMat_val& operator/=(const eT in_val); inline SpSubview_MapMat_val& operator++(); inline arma_warn_unused eT operator++(int); inline SpSubview_MapMat_val& operator--(); inline arma_warn_unused eT operator--(int); }; //! @} RcppArmadillo/inst/include/armadillo_bits/diskio_bones.hpp0000644000176200001440000003433314124060717023561 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup diskio //! @{ //! class for saving and loading matrices and fields - INTERNAL USE ONLY! class diskio { public: inline arma_deprecated static file_type guess_file_type(std::istream& f); private: template friend class Mat; template friend class Cube; template friend class SpMat; template friend class field; friend class Mat_aux; friend class Cube_aux; friend class SpMat_aux; friend class field_aux; template inline arma_cold static std::string gen_txt_header(const Mat&); template inline arma_cold static std::string gen_bin_header(const Mat&); template inline arma_cold static std::string gen_bin_header(const SpMat&); template inline arma_cold static std::string gen_txt_header(const Cube&); template inline arma_cold static std::string gen_bin_header(const Cube&); inline arma_cold static file_type guess_file_type_internal(std::istream& f); inline arma_cold static std::string gen_tmp_name(const std::string& x); inline arma_cold static bool safe_rename(const std::string& old_name, const std::string& new_name); template inline static bool convert_token(eT& val, const std::string& token); template inline static bool convert_token(std::complex& val, const std::string& token); template inline static std::streamsize prepare_stream(std::ostream& f); // // matrix saving template inline static bool save_raw_ascii (const Mat& x, const std::string& final_name); template inline static bool save_raw_binary (const Mat& x, const std::string& final_name); template inline static bool save_arma_ascii (const Mat& x, const std::string& final_name); template inline static bool save_csv_ascii (const Mat& x, const std::string& final_name, const field& header, const bool with_header, const char separator); template inline static bool save_coord_ascii(const Mat& x, const std::string& final_name); template inline static bool save_arma_binary(const Mat& x, const std::string& final_name); template inline static bool save_pgm_binary (const Mat& x, const std::string& final_name); template inline static bool save_pgm_binary (const Mat< std::complex >& x, const std::string& final_name); template inline static bool save_hdf5_binary(const Mat& x, const hdf5_name& spec, std::string& err_msg); template inline static bool save_raw_ascii (const Mat& x, std::ostream& f); template inline static bool save_raw_binary (const Mat& x, std::ostream& f); template inline static bool save_arma_ascii (const Mat& x, std::ostream& f); template inline static bool save_csv_ascii (const Mat& x, std::ostream& f, const char separator); template inline static bool save_csv_ascii (const Mat< std::complex >& x, std::ostream& f, const char separator); template inline static bool save_coord_ascii(const Mat& x, std::ostream& f); template inline static bool save_coord_ascii(const Mat< std::complex >& x, std::ostream& f); template inline static bool save_arma_binary(const Mat& x, std::ostream& f); template inline static bool save_pgm_binary (const Mat& x, std::ostream& f); template inline static bool save_pgm_binary (const Mat< std::complex >& x, std::ostream& f); // // matrix loading template inline static bool load_raw_ascii (Mat& x, const std::string& name, std::string& err_msg); template inline static bool load_raw_binary (Mat& x, const std::string& name, std::string& err_msg); template inline static bool load_arma_ascii (Mat& x, const std::string& name, std::string& err_msg); template inline static bool load_csv_ascii (Mat& x, const std::string& name, std::string& err_msg, field& header, const bool with_header, const char separator); template inline static bool load_coord_ascii(Mat& x, const std::string& name, std::string& err_msg); template inline static bool load_arma_binary(Mat& x, const std::string& name, std::string& err_msg); template inline static bool load_pgm_binary (Mat& x, const std::string& name, std::string& err_msg); template inline static bool load_pgm_binary (Mat< std::complex >& x, const std::string& name, std::string& err_msg); template inline static bool load_hdf5_binary(Mat& x, const hdf5_name& spec, std::string& err_msg); template inline static bool load_auto_detect(Mat& x, const std::string& name, std::string& err_msg); template inline static bool load_raw_ascii (Mat& x, std::istream& f, std::string& err_msg); template inline static bool load_raw_binary (Mat& x, std::istream& f, std::string& err_msg); template inline static bool load_arma_ascii (Mat& x, std::istream& f, std::string& err_msg); template inline static bool load_csv_ascii (Mat& x, std::istream& f, std::string& err_msg, const char separator); template inline static bool load_csv_ascii (Mat< std::complex >& x, std::istream& f, std::string& err_msg, const char separator); template inline static bool load_coord_ascii(Mat& x, std::istream& f, std::string& err_msg); template inline static bool load_coord_ascii(Mat< std::complex >& x, std::istream& f, std::string& err_msg); template inline static bool load_arma_binary(Mat& x, std::istream& f, std::string& err_msg); template inline static bool load_pgm_binary (Mat& x, std::istream& is, std::string& err_msg); template inline static bool load_pgm_binary (Mat< std::complex >& x, std::istream& is, std::string& err_msg); template inline static bool load_auto_detect(Mat& x, std::istream& f, std::string& err_msg); inline static void pnm_skip_comments(std::istream& f); // // sparse matrix saving template inline static bool save_csv_ascii (const SpMat& x, const std::string& final_name, const field& header, const bool with_header, const char separator); template inline static bool save_coord_ascii(const SpMat& x, const std::string& final_name); template inline static bool save_arma_binary(const SpMat& x, const std::string& final_name); template inline static bool save_csv_ascii (const SpMat& x, std::ostream& f, const char separator); template inline static bool save_csv_ascii (const SpMat< std::complex >& x, std::ostream& f, const char separator); template inline static bool save_coord_ascii(const SpMat& x, std::ostream& f); template inline static bool save_coord_ascii(const SpMat< std::complex >& x, std::ostream& f); template inline static bool save_arma_binary(const SpMat& x, std::ostream& f); // // sparse matrix loading template inline static bool load_csv_ascii (SpMat& x, const std::string& name, std::string& err_msg, field& header, const bool with_header, const char separator); template inline static bool load_coord_ascii(SpMat& x, const std::string& name, std::string& err_msg); template inline static bool load_arma_binary(SpMat& x, const std::string& name, std::string& err_msg); template inline static bool load_csv_ascii (SpMat& x, std::istream& f, std::string& err_msg, const char separator); template inline static bool load_csv_ascii (SpMat< std::complex >& x, std::istream& f, std::string& err_msg, const char separator); template inline static bool load_coord_ascii(SpMat& x, std::istream& f, std::string& err_msg); template inline static bool load_coord_ascii(SpMat< std::complex >& x, std::istream& f, std::string& err_msg); template inline static bool load_arma_binary(SpMat& x, std::istream& f, std::string& err_msg); // // cube saving template inline static bool save_raw_ascii (const Cube& x, const std::string& name); template inline static bool save_raw_binary (const Cube& x, const std::string& name); template inline static bool save_arma_ascii (const Cube& x, const std::string& name); template inline static bool save_arma_binary(const Cube& x, const std::string& name); template inline static bool save_hdf5_binary(const Cube& x, const hdf5_name& spec, std::string& err_msg); template inline static bool save_raw_ascii (const Cube& x, std::ostream& f); template inline static bool save_raw_binary (const Cube& x, std::ostream& f); template inline static bool save_arma_ascii (const Cube& x, std::ostream& f); template inline static bool save_arma_binary(const Cube& x, std::ostream& f); // // cube loading template inline static bool load_raw_ascii (Cube& x, const std::string& name, std::string& err_msg); template inline static bool load_raw_binary (Cube& x, const std::string& name, std::string& err_msg); template inline static bool load_arma_ascii (Cube& x, const std::string& name, std::string& err_msg); template inline static bool load_arma_binary(Cube& x, const std::string& name, std::string& err_msg); template inline static bool load_hdf5_binary(Cube& x, const hdf5_name& spec, std::string& err_msg); template inline static bool load_auto_detect(Cube& x, const std::string& name, std::string& err_msg); template inline static bool load_raw_ascii (Cube& x, std::istream& f, std::string& err_msg); template inline static bool load_raw_binary (Cube& x, std::istream& f, std::string& err_msg); template inline static bool load_arma_ascii (Cube& x, std::istream& f, std::string& err_msg); template inline static bool load_arma_binary(Cube& x, std::istream& f, std::string& err_msg); template inline static bool load_auto_detect(Cube& x, std::istream& f, std::string& err_msg); // // field saving and loading template inline static bool save_arma_binary(const field& x, const std::string& name); template inline static bool save_arma_binary(const field& x, std::ostream& f); template inline static bool load_arma_binary( field& x, const std::string& name, std::string& err_msg); template inline static bool load_arma_binary( field& x, std::istream& f, std::string& err_msg); template inline static bool load_auto_detect( field& x, const std::string& name, std::string& err_msg); template inline static bool load_auto_detect( field& x, std::istream& f, std::string& err_msg); inline static bool save_std_string(const field& x, const std::string& name); inline static bool save_std_string(const field& x, std::ostream& f); inline static bool load_std_string( field& x, const std::string& name, std::string& err_msg); inline static bool load_std_string( field& x, std::istream& f, std::string& err_msg); // // handling of PPM images by cubes template inline static bool save_ppm_binary(const Cube& x, const std::string& final_name); template inline static bool save_ppm_binary(const Cube& x, std::ostream& f); template inline static bool load_ppm_binary( Cube& x, const std::string& final_name, std::string& err_msg); template inline static bool load_ppm_binary( Cube& x, std::istream& f, std::string& err_msg); // // handling of PPM images by fields template inline static bool save_ppm_binary(const field& x, const std::string& final_name); template inline static bool save_ppm_binary(const field& x, std::ostream& f); template inline static bool load_ppm_binary( field& x, const std::string& final_name, std::string& err_msg); template inline static bool load_ppm_binary( field& x, std::istream& f, std::string& err_msg); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_polyval.hpp0000644000176200001440000000241314124060717023254 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_polyval //! @{ template arma_warn_unused inline typename enable_if2 < (is_supported_blas_type::value && is_arma_type::value && is_same_type::value), const Glue >::result polyval(const Base& P, const T2& X) { arma_extra_debug_sigprint(); return Glue(P.get_ref(), X); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_stddev_meat.hpp0000644000176200001440000000520314124060717024100 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_stddev //! @{ //! \brief //! For each row or for each column, find the standard deviation. //! The result is stored in a dense matrix that has either one column or one row. //! The dimension for which the standard deviations are found is set via the stddev() function. template inline void op_stddev::apply(Mat& out, const mtOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type in_eT; typedef typename T1::pod_type out_eT; const unwrap_check_mixed tmp(in.m, out); const Mat& X = tmp.M; const uword norm_type = in.aux_uword_a; const uword dim = in.aux_uword_b; arma_debug_check( (norm_type > 1), "stddev(): parameter 'norm_type' must be 0 or 1" ); arma_debug_check( (dim > 1), "stddev(): parameter 'dim' must be 0 or 1" ); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(dim == 0) { arma_extra_debug_print("op_stddev::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols); if(X_n_rows > 0) { out_eT* out_mem = out.memptr(); for(uword col=0; col 0) ? 1 : 0); if(X_n_cols > 0) { podarray dat(X_n_cols); in_eT* dat_mem = dat.memptr(); out_eT* out_mem = out.memptr(); for(uword row=0; row inline static void apply(SpMat& out, const SpOp& X); template inline static void apply_noalias(SpMat& out, const uword A_n_rows, const uword A_n_cols, const SpMat& B); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_diff.hpp0000644000176200001440000000330214124060717022474 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_diff //! @{ template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && resolves_to_vector::yes, const Op >::result diff ( const T1& X, const uword k = 1 ) { arma_extra_debug_sigprint(); return Op(X, k, 0); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && resolves_to_vector::no, const Op >::result diff ( const T1& X, const uword k = 1 ) { arma_extra_debug_sigprint(); return Op(X, k, 0); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value, const Op >::result diff ( const T1& X, const uword k, const uword dim ) { arma_extra_debug_sigprint(); return Op(X, k, dim); } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_symmat_meat.hpp0000644000176200001440000000457114124060717024473 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_symmat //! @{ template inline void spop_symmat::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat U(in.m); const SpMat& X = U.M; arma_debug_check( (X.n_rows != X.n_cols), "symmatu()/symmatl(): given matrix must be square sized" ); if(X.n_nonzero == uword(0)) { out.zeros(X.n_rows, X.n_cols); return; } const bool upper = (in.aux_uword_a == 0); const SpMat A = (upper) ? trimatu(X) : trimatl(X); // in this case trimatu() and trimatl() return the same type const SpMat B = A.st(); spglue_merge::symmat_merge(out, A, B); } template inline void spop_symmat_cx::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat U(in.m); const SpMat& X = U.M; arma_debug_check( (X.n_rows != X.n_cols), "symmatu()/symmatl(): given matrix must be square sized" ); if(X.n_nonzero == uword(0)) { out.zeros(X.n_rows, X.n_cols); return; } const bool upper = (in.aux_uword_a == 0); const bool do_conj = (in.aux_uword_b == 1); const SpMat A = (upper) ? trimatu(X) : trimatl(X); // in this case trimatu() and trimatl() return the same type if(do_conj) { const SpMat B = A.t(); spglue_merge::symmat_merge(out, A, B); } else { const SpMat B = A.st(); spglue_merge::symmat_merge(out, A, B); } } //! @} RcppArmadillo/inst/include/armadillo_bits/translate_atlas.hpp0000644000176200001440000003156014124060717024271 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #ifdef ARMA_USE_ATLAS //! \namespace atlas namespace for ATLAS functions (imported from the global namespace) namespace atlas { template inline static const eT& tmp_real(const eT& X) { return X; } template inline static const T tmp_real(const std::complex& X) { return X.real(); } template arma_inline eT cblas_asum(const int N, const eT* X) { arma_type_check((is_supported_blas_type::value == false)); if(is_float::value) { typedef float T; return eT( arma_wrapper(cblas_sasum)(N, (const T*)X, 1) ); } else if(is_double::value) { typedef double T; return eT( arma_wrapper(cblas_dasum)(N, (const T*)X, 1) ); } return eT(0); } template arma_inline eT cblas_nrm2(const int N, const eT* X) { arma_type_check((is_supported_blas_type::value == false)); if(is_float::value) { typedef float T; return eT( arma_wrapper(cblas_snrm2)(N, (const T*)X, 1) ); } else if(is_double::value) { typedef double T; return eT( arma_wrapper(cblas_dnrm2)(N, (const T*)X, 1) ); } return eT(0); } template arma_inline eT cblas_dot(const int N, const eT* X, const eT* Y) { arma_type_check((is_supported_blas_type::value == false)); if(is_float::value) { typedef float T; return eT( arma_wrapper(cblas_sdot)(N, (const T*)X, 1, (const T*)Y, 1) ); } else if(is_double::value) { typedef double T; return eT( arma_wrapper(cblas_ddot)(N, (const T*)X, 1, (const T*)Y, 1) ); } return eT(0); } template arma_inline eT cblas_cx_dot(const int N, const eT* X, const eT* Y) { arma_type_check((is_supported_blas_type::value == false)); if(is_cx_float::value) { typedef typename std::complex T; T out; arma_wrapper(cblas_cdotu_sub)(N, (const T*)X, 1, (const T*)Y, 1, &out); return eT(out); } else if(is_cx_double::value) { typedef typename std::complex T; T out; arma_wrapper(cblas_zdotu_sub)(N, (const T*)X, 1, (const T*)Y, 1, &out); return eT(out); } return eT(0); } template inline void cblas_gemv ( const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const eT alpha, const eT *A, const int lda, const eT *X, const int incX, const eT beta, eT *Y, const int incY ) { arma_type_check((is_supported_blas_type::value == false)); if(is_float::value) { typedef float T; arma_wrapper(cblas_sgemv)(Order, TransA, M, N, (const T)tmp_real(alpha), (const T*)A, lda, (const T*)X, incX, (const T)tmp_real(beta), (T*)Y, incY); } else if(is_double::value) { typedef double T; arma_wrapper(cblas_dgemv)(Order, TransA, M, N, (const T)tmp_real(alpha), (const T*)A, lda, (const T*)X, incX, (const T)tmp_real(beta), (T*)Y, incY); } else if(is_cx_float::value) { typedef std::complex T; arma_wrapper(cblas_cgemv)(Order, TransA, M, N, (const T*)&alpha, (const T*)A, lda, (const T*)X, incX, (const T*)&beta, (T*)Y, incY); } else if(is_cx_double::value) { typedef std::complex T; arma_wrapper(cblas_zgemv)(Order, TransA, M, N, (const T*)&alpha, (const T*)A, lda, (const T*)X, incX, (const T*)&beta, (T*)Y, incY); } } template inline void cblas_gemm ( const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const eT alpha, const eT *A, const int lda, const eT *B, const int ldb, const eT beta, eT *C, const int ldc ) { arma_type_check((is_supported_blas_type::value == false)); if(is_float::value) { typedef float T; arma_wrapper(cblas_sgemm)(Order, TransA, TransB, M, N, K, (const T)tmp_real(alpha), (const T*)A, lda, (const T*)B, ldb, (const T)tmp_real(beta), (T*)C, ldc); } else if(is_double::value) { typedef double T; arma_wrapper(cblas_dgemm)(Order, TransA, TransB, M, N, K, (const T)tmp_real(alpha), (const T*)A, lda, (const T*)B, ldb, (const T)tmp_real(beta), (T*)C, ldc); } else if(is_cx_float::value) { typedef std::complex T; arma_wrapper(cblas_cgemm)(Order, TransA, TransB, M, N, K, (const T*)&alpha, (const T*)A, lda, (const T*)B, ldb, (const T*)&beta, (T*)C, ldc); } else if(is_cx_double::value) { typedef std::complex T; arma_wrapper(cblas_zgemm)(Order, TransA, TransB, M, N, K, (const T*)&alpha, (const T*)A, lda, (const T*)B, ldb, (const T*)&beta, (T*)C, ldc); } } template inline void cblas_syrk ( const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const int N, const int K, const eT alpha, const eT* A, const int lda, const eT beta, eT* C, const int ldc ) { arma_type_check((is_supported_blas_type::value == false)); if(is_float::value) { typedef float T; arma_wrapper(cblas_ssyrk)(Order, Uplo, Trans, N, K, (const T)alpha, (const T*)A, lda, (const T)beta, (T*)C, ldc); } else if(is_double::value) { typedef double T; arma_wrapper(cblas_dsyrk)(Order, Uplo, Trans, N, K, (const T)alpha, (const T*)A, lda, (const T)beta, (T*)C, ldc); } } template inline void cblas_herk ( const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const int N, const int K, const T alpha, const std::complex* A, const int lda, const T beta, std::complex* C, const int ldc ) { arma_type_check((is_supported_blas_type::value == false)); if(is_float::value) { typedef float TT; typedef std::complex cx_TT; arma_wrapper(cblas_cherk)(Order, Uplo, Trans, N, K, (const TT)alpha, (const cx_TT*)A, lda, (const TT)beta, (cx_TT*)C, ldc); } else if(is_double::value) { typedef double TT; typedef std::complex cx_TT; arma_wrapper(cblas_zherk)(Order, Uplo, Trans, N, K, (const TT)alpha, (const cx_TT*)A, lda, (const TT)beta, (cx_TT*)C, ldc); } } template inline int clapack_getrf ( const enum CBLAS_ORDER Order, const int M, const int N, eT *A, const int lda, int *ipiv ) { arma_type_check((is_supported_blas_type::value == false)); if(is_float::value) { typedef float T; return arma_wrapper(clapack_sgetrf)(Order, M, N, (T*)A, lda, ipiv); } else if(is_double::value) { typedef double T; return arma_wrapper(clapack_dgetrf)(Order, M, N, (T*)A, lda, ipiv); } else if(is_cx_float::value) { typedef std::complex T; return arma_wrapper(clapack_cgetrf)(Order, M, N, (T*)A, lda, ipiv); } else if(is_cx_double::value) { typedef std::complex T; return arma_wrapper(clapack_zgetrf)(Order, M, N, (T*)A, lda, ipiv); } return -1; } template inline int clapack_getri ( const enum CBLAS_ORDER Order, const int N, eT *A, const int lda, const int *ipiv ) { arma_type_check((is_supported_blas_type::value == false)); if(is_float::value) { typedef float T; return arma_wrapper(clapack_sgetri)(Order, N, (T*)A, lda, ipiv); } else if(is_double::value) { typedef double T; return arma_wrapper(clapack_dgetri)(Order, N, (T*)A, lda, ipiv); } else if(is_cx_float::value) { typedef std::complex T; return arma_wrapper(clapack_cgetri)(Order, N, (T*)A, lda, ipiv); } else if(is_cx_double::value) { typedef std::complex T; return arma_wrapper(clapack_zgetri)(Order, N, (T*)A, lda, ipiv); } return -1; } template inline int clapack_gesv ( const enum CBLAS_ORDER Order, const int N, const int NRHS, eT* A, const int lda, int* ipiv, eT* B, const int ldb ) { arma_type_check((is_supported_blas_type::value == false)); if(is_float::value) { typedef float T; return arma_wrapper(clapack_sgesv)(Order, N, NRHS, (T*)A, lda, ipiv, (T*)B, ldb); } else if(is_double::value) { typedef double T; return arma_wrapper(clapack_dgesv)(Order, N, NRHS, (T*)A, lda, ipiv, (T*)B, ldb); } else if(is_cx_float::value) { typedef std::complex T; return arma_wrapper(clapack_cgesv)(Order, N, NRHS, (T*)A, lda, ipiv, (T*)B, ldb); } else if(is_cx_double::value) { typedef std::complex T; return arma_wrapper(clapack_zgesv)(Order, N, NRHS, (T*)A, lda, ipiv, (T*)B, ldb); } return -1; } template inline int clapack_potrf(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, eT *A, const int lda) { arma_type_check((is_supported_blas_type::value == false)); if(is_float::value) { typedef float T; return arma_wrapper(clapack_spotrf)(Order, Uplo, N, (T*)A, lda); } else if(is_double::value) { typedef double T; return arma_wrapper(clapack_dpotrf)(Order, Uplo, N, (T*)A, lda); } else if(is_cx_float::value) { typedef std::complex T; return arma_wrapper(clapack_cpotrf)(Order, Uplo, N, (T*)A, lda); } else if(is_cx_double::value) { typedef std::complex T; return arma_wrapper(clapack_zpotrf)(Order, Uplo, N, (T*)A, lda); } return -1; } template inline int clapack_potri(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, eT *A, const int lda) { arma_type_check((is_supported_blas_type::value == false)); if(is_float::value) { typedef float T; return arma_wrapper(clapack_spotri)(Order, Uplo, N, (T*)A, lda); } else if(is_double::value) { typedef double T; return arma_wrapper(clapack_dpotri)(Order, Uplo, N, (T*)A, lda); } else if(is_cx_float::value) { typedef std::complex T; return arma_wrapper(clapack_cpotri)(Order, Uplo, N, (T*)A, lda); } else if(is_cx_double::value) { typedef std::complex T; return arma_wrapper(clapack_zpotri)(Order, Uplo, N, (T*)A, lda); } return -1; } template inline int clapack_posv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const int NRHS, eT *A, const int lda, eT *B, const int ldb) { arma_type_check((is_supported_blas_type::value == false)); if(is_float::value) { typedef float T; return arma_wrapper(clapack_sposv)(Order, Uplo, N, NRHS, (T*)A, lda, (T*)B, ldb); } else if(is_double::value) { typedef double T; return arma_wrapper(clapack_dposv)(Order, Uplo, N, NRHS, (T*)A, lda, (T*)B, ldb); } else if(is_cx_float::value) { typedef std::complex T; return arma_wrapper(clapack_cposv)(Order, Uplo, N, NRHS, (T*)A, lda, (T*)B, ldb); } else if(is_cx_double::value) { typedef std::complex T; return arma_wrapper(clapack_zposv)(Order, Uplo, N, NRHS, (T*)A, lda, (T*)B, ldb); } return -1; } } #endif RcppArmadillo/inst/include/armadillo_bits/fn_reshape.hpp0000644000176200001440000000611114160256234023215 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_reshape //! @{ template arma_warn_unused inline typename enable_if2< is_arma_type::value, const Op >::result reshape(const T1& X, const uword new_n_rows, const uword new_n_cols) { arma_extra_debug_sigprint(); return Op(X, new_n_rows, new_n_cols); } template arma_warn_unused inline typename enable_if2< is_arma_type::value, const Op >::result reshape(const T1& X, const SizeMat& s) { arma_extra_debug_sigprint(); return Op(X, s.n_rows, s.n_cols); } //! NOTE: don't use this form: it will be removed template arma_deprecated inline const Op reshape(const Base& X, const uword new_n_rows, const uword new_n_cols, const uword dim) //!< NOTE: don't use this form: it will be removed { arma_extra_debug_sigprint(); // arma_debug_warn_level(1, "this form of reshape() is deprecated and will be removed"); arma_debug_check( (dim > 1), "reshape(): parameter 'dim' must be 0 or 1" ); return Op(X.get_ref(), new_n_rows, new_n_cols, dim, 'j'); } template arma_warn_unused inline const OpCube reshape(const BaseCube& X, const uword new_n_rows, const uword new_n_cols, const uword new_n_slices) { arma_extra_debug_sigprint(); return OpCube(X.get_ref(), new_n_rows, new_n_cols, new_n_slices); } template arma_warn_unused inline const OpCube reshape(const BaseCube& X, const SizeCube& s) { arma_extra_debug_sigprint(); return OpCube(X.get_ref(), s.n_rows, s.n_cols, s.n_slices); } template arma_warn_unused inline const SpOp reshape(const SpBase& X, const uword new_n_rows, const uword new_n_cols) { arma_extra_debug_sigprint(); return SpOp(X.get_ref(), new_n_rows, new_n_cols); } template arma_warn_unused inline const SpOp reshape(const SpBase& X, const SizeMat& s) { arma_extra_debug_sigprint(); return SpOp(X.get_ref(), s.n_rows, s.n_cols); } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_toeplitz_bones.hpp0000644000176200001440000000204314124060717025156 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_toeplitz //! @{ class glue_toeplitz : public traits_glue_default { public: template inline static void apply(Mat& out, const Glue& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_size.hpp0000644000176200001440000001403614124060717022544 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_size //! @{ arma_warn_unused inline const SizeMat size(const uword n_rows, const uword n_cols) { arma_extra_debug_sigprint(); return SizeMat(n_rows, n_cols); } template arma_warn_unused inline const SizeMat size(const Base& X) { arma_extra_debug_sigprint(); const Proxy P(X.get_ref()); return SizeMat( P.get_n_rows(), P.get_n_cols() ); } // explicit overload to workround ADL issues with C++17 std::size() template arma_warn_unused inline const SizeMat size(const Mat& X) { arma_extra_debug_sigprint(); return SizeMat( X.n_rows, X.n_cols ); } // explicit overload to workround ADL issues with C++17 std::size() template arma_warn_unused inline const SizeMat size(const Row& X) { arma_extra_debug_sigprint(); return SizeMat( X.n_rows, X.n_cols ); } // explicit overload to workround ADL issues with C++17 std::size() template arma_warn_unused inline const SizeMat size(const Col& X) { arma_extra_debug_sigprint(); return SizeMat( X.n_rows, X.n_cols ); } arma_warn_unused inline const SizeMat size(const arma::span& row_span, const arma::span& col_span) { arma_extra_debug_sigprint(); uword n_rows = 0; uword n_cols = 0; if(row_span.whole || col_span.whole) { arma_debug_check(true, "size(): span::all not supported"); } else { if((row_span.a > row_span.b) || (col_span.a > col_span.b)) { arma_debug_check_bounds(true, "size(): span indices incorrectly used"); } else { n_rows = row_span.b - row_span.a + 1; n_cols = col_span.b - col_span.a + 1; } } return SizeMat(n_rows, n_cols); } template arma_warn_unused inline uword size(const Base& X, const uword dim) { arma_extra_debug_sigprint(); const Proxy P(X.get_ref()); return SizeMat( P.get_n_rows(), P.get_n_cols() )( dim ); } arma_warn_unused inline const SizeCube size(const uword n_rows, const uword n_cols, const uword n_slices) { arma_extra_debug_sigprint(); return SizeCube(n_rows, n_cols, n_slices); } template arma_warn_unused inline const SizeCube size(const BaseCube& X) { arma_extra_debug_sigprint(); const ProxyCube P(X.get_ref()); return SizeCube( P.get_n_rows(), P.get_n_cols(), P.get_n_slices() ); } // explicit overload to workround ADL issues with C++17 std::size() template arma_warn_unused inline const SizeCube size(const Cube& X) { arma_extra_debug_sigprint(); return SizeCube( X.n_rows, X.n_cols, X.n_slices ); } template arma_warn_unused inline uword size(const BaseCube& X, const uword dim) { arma_extra_debug_sigprint(); const ProxyCube P(X.get_ref()); return SizeCube( P.get_n_rows(), P.get_n_cols(), P.get_n_slices() )( dim ); } arma_warn_unused inline const SizeCube size(const arma::span& row_span, const arma::span& col_span, const arma::span& slice_span) { arma_extra_debug_sigprint(); uword n_rows = 0; uword n_cols = 0; uword n_slices = 0; if(row_span.whole || col_span.whole || slice_span.whole) { arma_debug_check(true, "size(): span::all not supported"); } else { if((row_span.a > row_span.b) || (col_span.a > col_span.b) || (slice_span.a > slice_span.b)) { arma_debug_check_bounds(true, "size(): span indices incorrectly used"); } else { n_rows = row_span.b - row_span.a + 1; n_cols = col_span.b - col_span.a + 1; n_slices = slice_span.b - slice_span.a + 1; } } return SizeCube(n_rows, n_cols, n_slices); } template arma_warn_unused inline const SizeMat size(const SpBase& X) { arma_extra_debug_sigprint(); const SpProxy P(X.get_ref()); return SizeMat( P.get_n_rows(), P.get_n_cols() ); } // explicit overload to workround ADL issues with C++17 std::size() template arma_warn_unused inline const SizeMat size(const SpMat& X) { arma_extra_debug_sigprint(); return SizeMat( X.n_rows, X.n_cols ); } template arma_warn_unused inline uword size(const SpBase& X, const uword dim) { arma_extra_debug_sigprint(); const SpProxy P(X.get_ref()); return SizeMat( P.get_n_rows(), P.get_n_cols() )( dim ); } template arma_warn_unused inline const SizeCube size(const field& X) { arma_extra_debug_sigprint(); return SizeCube( X.n_rows, X.n_cols, X.n_slices ); } template arma_warn_unused inline uword size(const field& X, const uword dim) { arma_extra_debug_sigprint(); return SizeCube( X.n_rows, X.n_cols, X.n_slices )( dim ); } template arma_warn_unused inline const SizeCube size(const subview_field& X) { arma_extra_debug_sigprint(); return SizeCube( X.n_rows, X.n_cols, X.n_slices ); } template arma_warn_unused inline uword size(const subview_field& X, const uword dim) { arma_extra_debug_sigprint(); return SizeCube( X.n_rows, X.n_cols, X.n_slices )( dim ); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_any_bones.hpp0000644000176200001440000000423514124060717023562 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_any //! @{ class op_any : public traits_op_xvec { public: template static inline bool any_vec_helper(const Base& X); template static inline bool any_vec_helper(const subview& X); template static inline bool any_vec_helper(const Op& X); template static inline bool any_vec_helper ( const mtOp& X, const typename arma_op_rel_only::result* junk1 = nullptr, const typename arma_not_cx::result* junk2 = nullptr ); template static inline bool any_vec_helper ( const mtGlue& X, const typename arma_glue_rel_only::result* junk1 = nullptr, const typename arma_not_cx::result* junk2 = nullptr, const typename arma_not_cx::result* junk3 = nullptr ); template static inline bool any_vec(T1& X); template static inline void apply_helper(Mat& out, const Proxy& P, const uword dim); template static inline void apply(Mat& out, const mtOp& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/diagmat_proxy.hpp0000644000176200001440000002261614160256234023762 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup diagmat_proxy //! @{ template class diagmat_proxy_default { public: typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; inline diagmat_proxy_default(const T1& X) : P ( X ) , P_is_vec( (resolves_to_vector::yes) || (P.get_n_rows() == 1) || (P.get_n_cols() == 1) ) , P_is_col( T1::is_col || (P.get_n_cols() == 1) ) , n_rows ( P_is_vec ? P.get_n_elem() : P.get_n_rows() ) , n_cols ( P_is_vec ? P.get_n_elem() : P.get_n_cols() ) { arma_extra_debug_sigprint(); } arma_inline elem_type operator[](const uword i) const { if(Proxy::use_at == false) { return P_is_vec ? P[i] : P.at(i,i); } else { if(P_is_vec) { return (P_is_col) ? P.at(i,0) : P.at(0,i); } else { return P.at(i,i); } } } arma_inline elem_type at(const uword row, const uword col) const { if(row == col) { if(Proxy::use_at == false) { return (P_is_vec) ? P[row] : P.at(row,row); } else { if(P_is_vec) { return (P_is_col) ? P.at(row,0) : P.at(0,row); } else { return P.at(row,row); } } } else { return elem_type(0); } } inline bool is_alias(const Mat& X) const { return P.is_alias(X); } const Proxy P; const bool P_is_vec; const bool P_is_col; const uword n_rows; const uword n_cols; }; template class diagmat_proxy_fixed { public: typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; inline diagmat_proxy_fixed(const T1& X) : P(X) { arma_extra_debug_sigprint(); } arma_inline elem_type operator[](const uword i) const { return (P_is_vec) ? P[i] : P.at(i,i); } arma_inline elem_type at(const uword row, const uword col) const { if(row == col) { return (P_is_vec) ? P[row] : P.at(row,row); } else { return elem_type(0); } } arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&P)); } const T1& P; //// this may require T1::n_elem etc to be declared as static constexpr inline variables (C++17) //// see also the notes in Mat::fixed // static constexpr bool P_is_vec = (T1::n_rows == 1) || (T1::n_cols == 1); // static constexpr uword n_rows = P_is_vec ? T1::n_elem : T1::n_rows; // static constexpr uword n_cols = P_is_vec ? T1::n_elem : T1::n_cols; static const bool P_is_vec = (T1::n_rows == 1) || (T1::n_cols == 1); static const uword n_rows = P_is_vec ? T1::n_elem : T1::n_rows; static const uword n_cols = P_is_vec ? T1::n_elem : T1::n_cols; }; template struct diagmat_proxy_redirect {}; template struct diagmat_proxy_redirect { typedef diagmat_proxy_default result; }; template struct diagmat_proxy_redirect { typedef diagmat_proxy_fixed result; }; template class diagmat_proxy : public diagmat_proxy_redirect::value>::result { public: inline diagmat_proxy(const T1& X) : diagmat_proxy_redirect::value>::result(X) { } }; template class diagmat_proxy< Mat > { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; inline diagmat_proxy(const Mat& X) : P ( X ) , P_is_vec( (X.n_rows == 1) || (X.n_cols == 1) ) , n_rows ( P_is_vec ? X.n_elem : X.n_rows ) , n_cols ( P_is_vec ? X.n_elem : X.n_cols ) { arma_extra_debug_sigprint(); } arma_inline elem_type operator[] (const uword i) const { return P_is_vec ? P[i] : P.at(i,i); } arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? ( P_is_vec ? P[row] : P.at(row,row) ) : elem_type(0); } arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&P)); } const Mat& P; const bool P_is_vec; const uword n_rows; const uword n_cols; }; template class diagmat_proxy< Row > { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; inline diagmat_proxy(const Row& X) : P(X) , n_rows(X.n_elem) , n_cols(X.n_elem) { arma_extra_debug_sigprint(); } arma_inline elem_type operator[] (const uword i) const { return P[i]; } arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); } arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&P)); } static constexpr bool P_is_vec = true; const Row& P; const uword n_rows; const uword n_cols; }; template class diagmat_proxy< Col > { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; inline diagmat_proxy(const Col& X) : P(X) , n_rows(X.n_elem) , n_cols(X.n_elem) { arma_extra_debug_sigprint(); } arma_inline elem_type operator[] (const uword i) const { return P[i]; } arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); } arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&P)); } static constexpr bool P_is_vec = true; const Col& P; const uword n_rows; const uword n_cols; }; template class diagmat_proxy< subview_row > { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; inline diagmat_proxy(const subview_row& X) : P(X) , n_rows(X.n_elem) , n_cols(X.n_elem) { arma_extra_debug_sigprint(); } arma_inline elem_type operator[] (const uword i) const { return P[i]; } arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); } arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&(P.m))); } static constexpr bool P_is_vec = true; const subview_row& P; const uword n_rows; const uword n_cols; }; template class diagmat_proxy< subview_col > { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; inline diagmat_proxy(const subview_col& X) : P(X) , n_rows(X.n_elem) , n_cols(X.n_elem) { arma_extra_debug_sigprint(); } arma_inline elem_type operator[] (const uword i) const { return P[i]; } arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P[row] : elem_type(0); } arma_inline bool is_alias(const Mat& X) const { return (void_ptr(&X) == void_ptr(&(P.m))); } static constexpr bool P_is_vec = true; const subview_col& P; const uword n_rows; const uword n_cols; }; template class diagmat_proxy< Glue > { public: typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; inline diagmat_proxy(const Glue& X) { op_diagmat::apply_times(P, X.A, X.B); n_rows = P.n_rows; n_cols = P.n_cols; arma_extra_debug_sigprint(); } arma_inline elem_type operator[] (const uword i) const { return P.at(i,i); } arma_inline elem_type at (const uword row, const uword col) const { return (row == col) ? P.at(row,row) : elem_type(0); } constexpr bool is_alias(const Mat&) const { return false; } static constexpr bool P_is_vec = false; Mat P; uword n_rows; uword n_cols; }; //! @} RcppArmadillo/inst/include/armadillo_bits/eglue_core_meat.hpp0000644000176200001440000013352314124060717024231 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup eglue_core //! @{ #undef arma_applier_1u #undef arma_applier_1a #undef arma_applier_2 #undef arma_applier_3 #undef operatorA #undef operatorB #undef arma_applier_1_mp #undef arma_applier_2_mp #undef arma_applier_3_mp #if defined(ARMA_SIMPLE_LOOPS) #define arma_applier_1u(operatorA, operatorB) \ {\ for(uword i=0; i template arma_hot inline void eglue_core::apply(outT& out, const eGlue& x) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const bool use_at = (Proxy::use_at || Proxy::use_at); const bool use_mp = (Proxy::use_mp || Proxy::use_mp) && (arma_config::openmp); // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing; // size setting and alias checking is done by either the Mat contructor or operator=() eT* out_mem = out.memptr(); if(use_at == false) { const uword n_elem = x.get_n_elem(); if(use_mp && mp_gate::use_mp && Proxy::use_mp)>::eval(n_elem)) { typename Proxy::ea_type P1 = x.P1.get_ea(); typename Proxy::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1_mp(=, +); } else if(is_same_type::yes) { arma_applier_1_mp(=, -); } else if(is_same_type::yes) { arma_applier_1_mp(=, /); } else if(is_same_type::yes) { arma_applier_1_mp(=, *); } } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P1.is_aligned() && x.P2.is_aligned()) { typename Proxy::aligned_ea_type P1 = x.P1.get_aligned_ea(); typename Proxy::aligned_ea_type P2 = x.P2.get_aligned_ea(); if(is_same_type::yes) { arma_applier_1a(=, +); } else if(is_same_type::yes) { arma_applier_1a(=, -); } else if(is_same_type::yes) { arma_applier_1a(=, /); } else if(is_same_type::yes) { arma_applier_1a(=, *); } } else { typename Proxy::ea_type P1 = x.P1.get_ea(); typename Proxy::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(=, +); } else if(is_same_type::yes) { arma_applier_1u(=, -); } else if(is_same_type::yes) { arma_applier_1u(=, /); } else if(is_same_type::yes) { arma_applier_1u(=, *); } } } else { typename Proxy::ea_type P1 = x.P1.get_ea(); typename Proxy::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(=, +); } else if(is_same_type::yes) { arma_applier_1u(=, -); } else if(is_same_type::yes) { arma_applier_1u(=, /); } else if(is_same_type::yes) { arma_applier_1u(=, *); } } } } else { const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); const Proxy& P1 = x.P1; const Proxy& P2 = x.P2; if(use_mp && mp_gate::use_mp && Proxy::use_mp)>::eval(x.get_n_elem())) { if(is_same_type::yes) { arma_applier_2_mp(=, +); } else if(is_same_type::yes) { arma_applier_2_mp(=, -); } else if(is_same_type::yes) { arma_applier_2_mp(=, /); } else if(is_same_type::yes) { arma_applier_2_mp(=, *); } } else { if(is_same_type::yes) { arma_applier_2(=, +); } else if(is_same_type::yes) { arma_applier_2(=, -); } else if(is_same_type::yes) { arma_applier_2(=, /); } else if(is_same_type::yes) { arma_applier_2(=, *); } } } } template template arma_hot inline void eglue_core::apply_inplace_plus(Mat& out, const eGlue& x) { arma_extra_debug_sigprint(); const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "addition"); typedef typename T1::elem_type eT; eT* out_mem = out.memptr(); const bool use_at = (Proxy::use_at || Proxy::use_at); const bool use_mp = (Proxy::use_mp || Proxy::use_mp) && (arma_config::openmp); if(use_at == false) { const uword n_elem = x.get_n_elem(); if(use_mp && mp_gate::use_mp && Proxy::use_mp)>::eval(n_elem)) { typename Proxy::ea_type P1 = x.P1.get_ea(); typename Proxy::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1_mp(+=, +); } else if(is_same_type::yes) { arma_applier_1_mp(+=, -); } else if(is_same_type::yes) { arma_applier_1_mp(+=, /); } else if(is_same_type::yes) { arma_applier_1_mp(+=, *); } } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P1.is_aligned() && x.P2.is_aligned()) { typename Proxy::aligned_ea_type P1 = x.P1.get_aligned_ea(); typename Proxy::aligned_ea_type P2 = x.P2.get_aligned_ea(); if(is_same_type::yes) { arma_applier_1a(+=, +); } else if(is_same_type::yes) { arma_applier_1a(+=, -); } else if(is_same_type::yes) { arma_applier_1a(+=, /); } else if(is_same_type::yes) { arma_applier_1a(+=, *); } } else { typename Proxy::ea_type P1 = x.P1.get_ea(); typename Proxy::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(+=, +); } else if(is_same_type::yes) { arma_applier_1u(+=, -); } else if(is_same_type::yes) { arma_applier_1u(+=, /); } else if(is_same_type::yes) { arma_applier_1u(+=, *); } } } else { typename Proxy::ea_type P1 = x.P1.get_ea(); typename Proxy::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(+=, +); } else if(is_same_type::yes) { arma_applier_1u(+=, -); } else if(is_same_type::yes) { arma_applier_1u(+=, /); } else if(is_same_type::yes) { arma_applier_1u(+=, *); } } } } else { const Proxy& P1 = x.P1; const Proxy& P2 = x.P2; if(use_mp && mp_gate::use_mp && Proxy::use_mp)>::eval(x.get_n_elem())) { if(is_same_type::yes) { arma_applier_2_mp(+=, +); } else if(is_same_type::yes) { arma_applier_2_mp(+=, -); } else if(is_same_type::yes) { arma_applier_2_mp(+=, /); } else if(is_same_type::yes) { arma_applier_2_mp(+=, *); } } else { if(is_same_type::yes) { arma_applier_2(+=, +); } else if(is_same_type::yes) { arma_applier_2(+=, -); } else if(is_same_type::yes) { arma_applier_2(+=, /); } else if(is_same_type::yes) { arma_applier_2(+=, *); } } } } template template arma_hot inline void eglue_core::apply_inplace_minus(Mat& out, const eGlue& x) { arma_extra_debug_sigprint(); const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "subtraction"); typedef typename T1::elem_type eT; eT* out_mem = out.memptr(); const bool use_at = (Proxy::use_at || Proxy::use_at); const bool use_mp = (Proxy::use_mp || Proxy::use_mp) && (arma_config::openmp); if(use_at == false) { const uword n_elem = x.get_n_elem(); if(use_mp && mp_gate::use_mp && Proxy::use_mp)>::eval(n_elem)) { typename Proxy::ea_type P1 = x.P1.get_ea(); typename Proxy::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1_mp(-=, +); } else if(is_same_type::yes) { arma_applier_1_mp(-=, -); } else if(is_same_type::yes) { arma_applier_1_mp(-=, /); } else if(is_same_type::yes) { arma_applier_1_mp(-=, *); } } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P1.is_aligned() && x.P2.is_aligned()) { typename Proxy::aligned_ea_type P1 = x.P1.get_aligned_ea(); typename Proxy::aligned_ea_type P2 = x.P2.get_aligned_ea(); if(is_same_type::yes) { arma_applier_1a(-=, +); } else if(is_same_type::yes) { arma_applier_1a(-=, -); } else if(is_same_type::yes) { arma_applier_1a(-=, /); } else if(is_same_type::yes) { arma_applier_1a(-=, *); } } else { typename Proxy::ea_type P1 = x.P1.get_ea(); typename Proxy::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(-=, +); } else if(is_same_type::yes) { arma_applier_1u(-=, -); } else if(is_same_type::yes) { arma_applier_1u(-=, /); } else if(is_same_type::yes) { arma_applier_1u(-=, *); } } } else { typename Proxy::ea_type P1 = x.P1.get_ea(); typename Proxy::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(-=, +); } else if(is_same_type::yes) { arma_applier_1u(-=, -); } else if(is_same_type::yes) { arma_applier_1u(-=, /); } else if(is_same_type::yes) { arma_applier_1u(-=, *); } } } } else { const Proxy& P1 = x.P1; const Proxy& P2 = x.P2; if(use_mp && mp_gate::use_mp && Proxy::use_mp)>::eval(x.get_n_elem())) { if(is_same_type::yes) { arma_applier_2_mp(-=, +); } else if(is_same_type::yes) { arma_applier_2_mp(-=, -); } else if(is_same_type::yes) { arma_applier_2_mp(-=, /); } else if(is_same_type::yes) { arma_applier_2_mp(-=, *); } } else { if(is_same_type::yes) { arma_applier_2(-=, +); } else if(is_same_type::yes) { arma_applier_2(-=, -); } else if(is_same_type::yes) { arma_applier_2(-=, /); } else if(is_same_type::yes) { arma_applier_2(-=, *); } } } } template template arma_hot inline void eglue_core::apply_inplace_schur(Mat& out, const eGlue& x) { arma_extra_debug_sigprint(); const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "element-wise multiplication"); typedef typename T1::elem_type eT; eT* out_mem = out.memptr(); const bool use_at = (Proxy::use_at || Proxy::use_at); const bool use_mp = (Proxy::use_mp || Proxy::use_mp) && (arma_config::openmp); if(use_at == false) { const uword n_elem = x.get_n_elem(); if(use_mp && mp_gate::use_mp && Proxy::use_mp)>::eval(n_elem)) { typename Proxy::ea_type P1 = x.P1.get_ea(); typename Proxy::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1_mp(*=, +); } else if(is_same_type::yes) { arma_applier_1_mp(*=, -); } else if(is_same_type::yes) { arma_applier_1_mp(*=, /); } else if(is_same_type::yes) { arma_applier_1_mp(*=, *); } } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P1.is_aligned() && x.P2.is_aligned()) { typename Proxy::aligned_ea_type P1 = x.P1.get_aligned_ea(); typename Proxy::aligned_ea_type P2 = x.P2.get_aligned_ea(); if(is_same_type::yes) { arma_applier_1a(*=, +); } else if(is_same_type::yes) { arma_applier_1a(*=, -); } else if(is_same_type::yes) { arma_applier_1a(*=, /); } else if(is_same_type::yes) { arma_applier_1a(*=, *); } } else { typename Proxy::ea_type P1 = x.P1.get_ea(); typename Proxy::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(*=, +); } else if(is_same_type::yes) { arma_applier_1u(*=, -); } else if(is_same_type::yes) { arma_applier_1u(*=, /); } else if(is_same_type::yes) { arma_applier_1u(*=, *); } } } else { typename Proxy::ea_type P1 = x.P1.get_ea(); typename Proxy::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(*=, +); } else if(is_same_type::yes) { arma_applier_1u(*=, -); } else if(is_same_type::yes) { arma_applier_1u(*=, /); } else if(is_same_type::yes) { arma_applier_1u(*=, *); } } } } else { const Proxy& P1 = x.P1; const Proxy& P2 = x.P2; if(use_mp && mp_gate::use_mp && Proxy::use_mp)>::eval(x.get_n_elem())) { if(is_same_type::yes) { arma_applier_2_mp(*=, +); } else if(is_same_type::yes) { arma_applier_2_mp(*=, -); } else if(is_same_type::yes) { arma_applier_2_mp(*=, /); } else if(is_same_type::yes) { arma_applier_2_mp(*=, *); } } else { if(is_same_type::yes) { arma_applier_2(*=, +); } else if(is_same_type::yes) { arma_applier_2(*=, -); } else if(is_same_type::yes) { arma_applier_2(*=, /); } else if(is_same_type::yes) { arma_applier_2(*=, *); } } } } template template arma_hot inline void eglue_core::apply_inplace_div(Mat& out, const eGlue& x) { arma_extra_debug_sigprint(); const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); arma_debug_assert_same_size(out.n_rows, out.n_cols, n_rows, n_cols, "element-wise division"); typedef typename T1::elem_type eT; eT* out_mem = out.memptr(); const bool use_at = (Proxy::use_at || Proxy::use_at); const bool use_mp = (Proxy::use_mp || Proxy::use_mp) && (arma_config::openmp); if(use_at == false) { const uword n_elem = x.get_n_elem(); if(use_mp && mp_gate::use_mp && Proxy::use_mp)>::eval(n_elem)) { typename Proxy::ea_type P1 = x.P1.get_ea(); typename Proxy::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1_mp(/=, +); } else if(is_same_type::yes) { arma_applier_1_mp(/=, -); } else if(is_same_type::yes) { arma_applier_1_mp(/=, /); } else if(is_same_type::yes) { arma_applier_1_mp(/=, *); } } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P1.is_aligned() && x.P2.is_aligned()) { typename Proxy::aligned_ea_type P1 = x.P1.get_aligned_ea(); typename Proxy::aligned_ea_type P2 = x.P2.get_aligned_ea(); if(is_same_type::yes) { arma_applier_1a(/=, +); } else if(is_same_type::yes) { arma_applier_1a(/=, -); } else if(is_same_type::yes) { arma_applier_1a(/=, /); } else if(is_same_type::yes) { arma_applier_1a(/=, *); } } else { typename Proxy::ea_type P1 = x.P1.get_ea(); typename Proxy::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(/=, +); } else if(is_same_type::yes) { arma_applier_1u(/=, -); } else if(is_same_type::yes) { arma_applier_1u(/=, /); } else if(is_same_type::yes) { arma_applier_1u(/=, *); } } } else { typename Proxy::ea_type P1 = x.P1.get_ea(); typename Proxy::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(/=, +); } else if(is_same_type::yes) { arma_applier_1u(/=, -); } else if(is_same_type::yes) { arma_applier_1u(/=, /); } else if(is_same_type::yes) { arma_applier_1u(/=, *); } } } } else { const Proxy& P1 = x.P1; const Proxy& P2 = x.P2; if(use_mp && mp_gate::use_mp && Proxy::use_mp)>::eval(x.get_n_elem())) { if(is_same_type::yes) { arma_applier_2_mp(/=, +); } else if(is_same_type::yes) { arma_applier_2_mp(/=, -); } else if(is_same_type::yes) { arma_applier_2_mp(/=, /); } else if(is_same_type::yes) { arma_applier_2_mp(/=, *); } } else { if(is_same_type::yes) { arma_applier_2(/=, +); } else if(is_same_type::yes) { arma_applier_2(/=, -); } else if(is_same_type::yes) { arma_applier_2(/=, /); } else if(is_same_type::yes) { arma_applier_2(/=, *); } } } } // // cubes template template arma_hot inline void eglue_core::apply(Cube& out, const eGlueCube& x) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const bool use_at = (ProxyCube::use_at || ProxyCube::use_at); const bool use_mp = (ProxyCube::use_mp || ProxyCube::use_mp) && (arma_config::openmp); // NOTE: we're assuming that the cube has already been set to the correct size and there is no aliasing; // size setting and alias checking is done by either the Cube contructor or operator=() eT* out_mem = out.memptr(); if(use_at == false) { const uword n_elem = out.n_elem; if(use_mp && mp_gate::use_mp && ProxyCube::use_mp)>::eval(n_elem)) { typename ProxyCube::ea_type P1 = x.P1.get_ea(); typename ProxyCube::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1_mp(=, +); } else if(is_same_type::yes) { arma_applier_1_mp(=, -); } else if(is_same_type::yes) { arma_applier_1_mp(=, /); } else if(is_same_type::yes) { arma_applier_1_mp(=, *); } } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P1.is_aligned() && x.P2.is_aligned()) { typename ProxyCube::aligned_ea_type P1 = x.P1.get_aligned_ea(); typename ProxyCube::aligned_ea_type P2 = x.P2.get_aligned_ea(); if(is_same_type::yes) { arma_applier_1a(=, +); } else if(is_same_type::yes) { arma_applier_1a(=, -); } else if(is_same_type::yes) { arma_applier_1a(=, /); } else if(is_same_type::yes) { arma_applier_1a(=, *); } } else { typename ProxyCube::ea_type P1 = x.P1.get_ea(); typename ProxyCube::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(=, +); } else if(is_same_type::yes) { arma_applier_1u(=, -); } else if(is_same_type::yes) { arma_applier_1u(=, /); } else if(is_same_type::yes) { arma_applier_1u(=, *); } } } else { typename ProxyCube::ea_type P1 = x.P1.get_ea(); typename ProxyCube::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(=, +); } else if(is_same_type::yes) { arma_applier_1u(=, -); } else if(is_same_type::yes) { arma_applier_1u(=, /); } else if(is_same_type::yes) { arma_applier_1u(=, *); } } } } else { const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); const uword n_slices = x.get_n_slices(); const ProxyCube& P1 = x.P1; const ProxyCube& P2 = x.P2; if(use_mp && mp_gate::use_mp && ProxyCube::use_mp)>::eval(x.get_n_elem())) { if(is_same_type::yes) { arma_applier_3_mp(=, +); } else if(is_same_type::yes) { arma_applier_3_mp(=, -); } else if(is_same_type::yes) { arma_applier_3_mp(=, /); } else if(is_same_type::yes) { arma_applier_3_mp(=, *); } } else { if(is_same_type::yes) { arma_applier_3(=, +); } else if(is_same_type::yes) { arma_applier_3(=, -); } else if(is_same_type::yes) { arma_applier_3(=, /); } else if(is_same_type::yes) { arma_applier_3(=, *); } } } } template template arma_hot inline void eglue_core::apply_inplace_plus(Cube& out, const eGlueCube& x) { arma_extra_debug_sigprint(); const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); const uword n_slices = x.get_n_slices(); arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "addition"); typedef typename T1::elem_type eT; eT* out_mem = out.memptr(); const bool use_at = (ProxyCube::use_at || ProxyCube::use_at); const bool use_mp = (ProxyCube::use_mp || ProxyCube::use_mp) && (arma_config::openmp); if(use_at == false) { const uword n_elem = out.n_elem; if(use_mp && mp_gate::use_mp && ProxyCube::use_mp)>::eval(n_elem)) { typename ProxyCube::ea_type P1 = x.P1.get_ea(); typename ProxyCube::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1_mp(+=, +); } else if(is_same_type::yes) { arma_applier_1_mp(+=, -); } else if(is_same_type::yes) { arma_applier_1_mp(+=, /); } else if(is_same_type::yes) { arma_applier_1_mp(+=, *); } } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P1.is_aligned() && x.P2.is_aligned()) { typename ProxyCube::aligned_ea_type P1 = x.P1.get_aligned_ea(); typename ProxyCube::aligned_ea_type P2 = x.P2.get_aligned_ea(); if(is_same_type::yes) { arma_applier_1a(+=, +); } else if(is_same_type::yes) { arma_applier_1a(+=, -); } else if(is_same_type::yes) { arma_applier_1a(+=, /); } else if(is_same_type::yes) { arma_applier_1a(+=, *); } } else { typename ProxyCube::ea_type P1 = x.P1.get_ea(); typename ProxyCube::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(+=, +); } else if(is_same_type::yes) { arma_applier_1u(+=, -); } else if(is_same_type::yes) { arma_applier_1u(+=, /); } else if(is_same_type::yes) { arma_applier_1u(+=, *); } } } else { typename ProxyCube::ea_type P1 = x.P1.get_ea(); typename ProxyCube::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(+=, +); } else if(is_same_type::yes) { arma_applier_1u(+=, -); } else if(is_same_type::yes) { arma_applier_1u(+=, /); } else if(is_same_type::yes) { arma_applier_1u(+=, *); } } } } else { const ProxyCube& P1 = x.P1; const ProxyCube& P2 = x.P2; if(use_mp && mp_gate::use_mp && ProxyCube::use_mp)>::eval(x.get_n_elem())) { if(is_same_type::yes) { arma_applier_3_mp(+=, +); } else if(is_same_type::yes) { arma_applier_3_mp(+=, -); } else if(is_same_type::yes) { arma_applier_3_mp(+=, /); } else if(is_same_type::yes) { arma_applier_3_mp(+=, *); } } else { if(is_same_type::yes) { arma_applier_3(+=, +); } else if(is_same_type::yes) { arma_applier_3(+=, -); } else if(is_same_type::yes) { arma_applier_3(+=, /); } else if(is_same_type::yes) { arma_applier_3(+=, *); } } } } template template arma_hot inline void eglue_core::apply_inplace_minus(Cube& out, const eGlueCube& x) { arma_extra_debug_sigprint(); const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); const uword n_slices = x.get_n_slices(); arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "subtraction"); typedef typename T1::elem_type eT; eT* out_mem = out.memptr(); const bool use_at = (ProxyCube::use_at || ProxyCube::use_at); const bool use_mp = (ProxyCube::use_mp || ProxyCube::use_mp) && (arma_config::openmp); if(use_at == false) { const uword n_elem = out.n_elem; if(use_mp && mp_gate::use_mp && ProxyCube::use_mp)>::eval(n_elem)) { typename ProxyCube::ea_type P1 = x.P1.get_ea(); typename ProxyCube::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1_mp(-=, +); } else if(is_same_type::yes) { arma_applier_1_mp(-=, -); } else if(is_same_type::yes) { arma_applier_1_mp(-=, /); } else if(is_same_type::yes) { arma_applier_1_mp(-=, *); } } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P1.is_aligned() && x.P2.is_aligned()) { typename ProxyCube::aligned_ea_type P1 = x.P1.get_aligned_ea(); typename ProxyCube::aligned_ea_type P2 = x.P2.get_aligned_ea(); if(is_same_type::yes) { arma_applier_1a(-=, +); } else if(is_same_type::yes) { arma_applier_1a(-=, -); } else if(is_same_type::yes) { arma_applier_1a(-=, /); } else if(is_same_type::yes) { arma_applier_1a(-=, *); } } else { typename ProxyCube::ea_type P1 = x.P1.get_ea(); typename ProxyCube::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(-=, +); } else if(is_same_type::yes) { arma_applier_1u(-=, -); } else if(is_same_type::yes) { arma_applier_1u(-=, /); } else if(is_same_type::yes) { arma_applier_1u(-=, *); } } } else { typename ProxyCube::ea_type P1 = x.P1.get_ea(); typename ProxyCube::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(-=, +); } else if(is_same_type::yes) { arma_applier_1u(-=, -); } else if(is_same_type::yes) { arma_applier_1u(-=, /); } else if(is_same_type::yes) { arma_applier_1u(-=, *); } } } } else { const ProxyCube& P1 = x.P1; const ProxyCube& P2 = x.P2; if(use_mp && mp_gate::use_mp && ProxyCube::use_mp)>::eval(x.get_n_elem())) { if(is_same_type::yes) { arma_applier_3_mp(-=, +); } else if(is_same_type::yes) { arma_applier_3_mp(-=, -); } else if(is_same_type::yes) { arma_applier_3_mp(-=, /); } else if(is_same_type::yes) { arma_applier_3_mp(-=, *); } } else { if(is_same_type::yes) { arma_applier_3(-=, +); } else if(is_same_type::yes) { arma_applier_3(-=, -); } else if(is_same_type::yes) { arma_applier_3(-=, /); } else if(is_same_type::yes) { arma_applier_3(-=, *); } } } } template template arma_hot inline void eglue_core::apply_inplace_schur(Cube& out, const eGlueCube& x) { arma_extra_debug_sigprint(); const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); const uword n_slices = x.get_n_slices(); arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "element-wise multiplication"); typedef typename T1::elem_type eT; eT* out_mem = out.memptr(); const bool use_at = (ProxyCube::use_at || ProxyCube::use_at); const bool use_mp = (ProxyCube::use_mp || ProxyCube::use_mp) && (arma_config::openmp); if(use_at == false) { const uword n_elem = out.n_elem; if(use_mp && mp_gate::use_mp && ProxyCube::use_mp)>::eval(n_elem)) { typename ProxyCube::ea_type P1 = x.P1.get_ea(); typename ProxyCube::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1_mp(*=, +); } else if(is_same_type::yes) { arma_applier_1_mp(*=, -); } else if(is_same_type::yes) { arma_applier_1_mp(*=, /); } else if(is_same_type::yes) { arma_applier_1_mp(*=, *); } } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P1.is_aligned() && x.P2.is_aligned()) { typename ProxyCube::aligned_ea_type P1 = x.P1.get_aligned_ea(); typename ProxyCube::aligned_ea_type P2 = x.P2.get_aligned_ea(); if(is_same_type::yes) { arma_applier_1a(*=, +); } else if(is_same_type::yes) { arma_applier_1a(*=, -); } else if(is_same_type::yes) { arma_applier_1a(*=, /); } else if(is_same_type::yes) { arma_applier_1a(*=, *); } } else { typename ProxyCube::ea_type P1 = x.P1.get_ea(); typename ProxyCube::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(*=, +); } else if(is_same_type::yes) { arma_applier_1u(*=, -); } else if(is_same_type::yes) { arma_applier_1u(*=, /); } else if(is_same_type::yes) { arma_applier_1u(*=, *); } } } else { typename ProxyCube::ea_type P1 = x.P1.get_ea(); typename ProxyCube::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(*=, +); } else if(is_same_type::yes) { arma_applier_1u(*=, -); } else if(is_same_type::yes) { arma_applier_1u(*=, /); } else if(is_same_type::yes) { arma_applier_1u(*=, *); } } } } else { const ProxyCube& P1 = x.P1; const ProxyCube& P2 = x.P2; if(use_mp && mp_gate::use_mp && ProxyCube::use_mp)>::eval(x.get_n_elem())) { if(is_same_type::yes) { arma_applier_3_mp(*=, +); } else if(is_same_type::yes) { arma_applier_3_mp(*=, -); } else if(is_same_type::yes) { arma_applier_3_mp(*=, /); } else if(is_same_type::yes) { arma_applier_3_mp(*=, *); } } else { if(is_same_type::yes) { arma_applier_3(*=, +); } else if(is_same_type::yes) { arma_applier_3(*=, -); } else if(is_same_type::yes) { arma_applier_3(*=, /); } else if(is_same_type::yes) { arma_applier_3(*=, *); } } } } template template arma_hot inline void eglue_core::apply_inplace_div(Cube& out, const eGlueCube& x) { arma_extra_debug_sigprint(); const uword n_rows = x.get_n_rows(); const uword n_cols = x.get_n_cols(); const uword n_slices = x.get_n_slices(); arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "element-wise division"); typedef typename T1::elem_type eT; eT* out_mem = out.memptr(); const bool use_at = (ProxyCube::use_at || ProxyCube::use_at); const bool use_mp = (ProxyCube::use_mp || ProxyCube::use_mp) && (arma_config::openmp); if(use_at == false) { const uword n_elem = out.n_elem; if(use_mp && mp_gate::use_mp && ProxyCube::use_mp)>::eval(n_elem)) { typename ProxyCube::ea_type P1 = x.P1.get_ea(); typename ProxyCube::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1_mp(/=, +); } else if(is_same_type::yes) { arma_applier_1_mp(/=, -); } else if(is_same_type::yes) { arma_applier_1_mp(/=, /); } else if(is_same_type::yes) { arma_applier_1_mp(/=, *); } } else { if(memory::is_aligned(out_mem)) { memory::mark_as_aligned(out_mem); if(x.P1.is_aligned() && x.P2.is_aligned()) { typename ProxyCube::aligned_ea_type P1 = x.P1.get_aligned_ea(); typename ProxyCube::aligned_ea_type P2 = x.P2.get_aligned_ea(); if(is_same_type::yes) { arma_applier_1a(/=, +); } else if(is_same_type::yes) { arma_applier_1a(/=, -); } else if(is_same_type::yes) { arma_applier_1a(/=, /); } else if(is_same_type::yes) { arma_applier_1a(/=, *); } } else { typename ProxyCube::ea_type P1 = x.P1.get_ea(); typename ProxyCube::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(/=, +); } else if(is_same_type::yes) { arma_applier_1u(/=, -); } else if(is_same_type::yes) { arma_applier_1u(/=, /); } else if(is_same_type::yes) { arma_applier_1u(/=, *); } } } else { typename ProxyCube::ea_type P1 = x.P1.get_ea(); typename ProxyCube::ea_type P2 = x.P2.get_ea(); if(is_same_type::yes) { arma_applier_1u(/=, +); } else if(is_same_type::yes) { arma_applier_1u(/=, -); } else if(is_same_type::yes) { arma_applier_1u(/=, /); } else if(is_same_type::yes) { arma_applier_1u(/=, *); } } } } else { const ProxyCube& P1 = x.P1; const ProxyCube& P2 = x.P2; if(use_mp && mp_gate::use_mp && ProxyCube::use_mp)>::eval(x.get_n_elem())) { if(is_same_type::yes) { arma_applier_3_mp(/=, +); } else if(is_same_type::yes) { arma_applier_3_mp(/=, -); } else if(is_same_type::yes) { arma_applier_3_mp(/=, /); } else if(is_same_type::yes) { arma_applier_3_mp(/=, *); } } else { if(is_same_type::yes) { arma_applier_3(/=, +); } else if(is_same_type::yes) { arma_applier_3(/=, -); } else if(is_same_type::yes) { arma_applier_3(/=, /); } else if(is_same_type::yes) { arma_applier_3(/=, *); } } } } #undef arma_applier_1u #undef arma_applier_1a #undef arma_applier_2 #undef arma_applier_3 #undef arma_applier_1_mp #undef arma_applier_2_mp #undef arma_applier_3_mp //! @} RcppArmadillo/inst/include/armadillo_bits/spglue_join_meat.hpp0000644000176200001440000002422714124060717024436 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_join //! @{ template inline void spglue_join_cols::apply(SpMat& out, const SpGlue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat UA(X.A); const unwrap_spmat UB(X.B); if(UA.is_alias(out) || UB.is_alias(out)) { SpMat tmp; spglue_join_cols::apply_noalias(tmp, UA.M, UB.M); out.steal_mem(tmp); } else { spglue_join_cols::apply_noalias(out, UA.M, UB.M); } } template inline void spglue_join_cols::apply_noalias(SpMat& out, const SpMat& A, const SpMat& B) { arma_extra_debug_sigprint(); const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; arma_debug_check ( ( (A_n_cols != B_n_cols) && ( (A_n_rows > 0) || (A_n_cols > 0) ) && ( (B_n_rows > 0) || (B_n_cols > 0) ) ), "join_cols() / join_vert(): number of columns must be the same" ); out.set_size( A_n_rows + B_n_rows, (std::max)(A_n_cols, B_n_cols) ); if( out.n_elem > 0 ) { if(A.is_empty() == false) { out.submat(0, 0, A_n_rows-1, out.n_cols-1) = A; } if(B.is_empty() == false) { out.submat(A_n_rows, 0, out.n_rows-1, out.n_cols-1) = B; } } } template inline void spglue_join_cols::apply(SpMat& out, const SpBase& A_expr, const SpBase& B_expr, const SpBase& C_expr) { arma_extra_debug_sigprint(); const unwrap_spmat UA(A_expr.get_ref()); const unwrap_spmat UB(B_expr.get_ref()); const unwrap_spmat UC(C_expr.get_ref()); const SpMat& A = UA.M; const SpMat& B = UB.M; const SpMat& C = UC.M; const uword out_n_rows = A.n_rows + B.n_rows + C.n_rows; const uword out_n_cols = (std::max)((std::max)(A.n_cols, B.n_cols), C.n_cols); arma_debug_check( ((A.n_cols != out_n_cols) && ((A.n_rows > 0) || (A.n_cols > 0))), "join_cols() / join_vert(): number of columns must be the same" ); arma_debug_check( ((B.n_cols != out_n_cols) && ((B.n_rows > 0) || (B.n_cols > 0))), "join_cols() / join_vert(): number of columns must be the same" ); arma_debug_check( ((C.n_cols != out_n_cols) && ((C.n_rows > 0) || (C.n_cols > 0))), "join_cols() / join_vert(): number of columns must be the same" ); out.set_size(out_n_rows, out_n_cols); if(out.n_elem == 0) { return; } uword row_start = 0; uword row_end_p1 = 0; if(A.n_elem > 0) { row_end_p1 += A.n_rows; out.rows(row_start, row_end_p1 - 1) = A; } row_start = row_end_p1; if(B.n_elem > 0) { row_end_p1 += B.n_rows; out.rows(row_start, row_end_p1 - 1) = B; } row_start = row_end_p1; if(C.n_elem > 0) { row_end_p1 += C.n_rows; out.rows(row_start, row_end_p1 - 1) = C; } } template inline void spglue_join_cols::apply(SpMat& out, const SpBase& A_expr, const SpBase& B_expr, const SpBase& C_expr, const SpBase& D_expr) { arma_extra_debug_sigprint(); const unwrap_spmat UA(A_expr.get_ref()); const unwrap_spmat UB(B_expr.get_ref()); const unwrap_spmat UC(C_expr.get_ref()); const unwrap_spmat UD(D_expr.get_ref()); const SpMat& A = UA.M; const SpMat& B = UB.M; const SpMat& C = UC.M; const SpMat& D = UD.M; const uword out_n_rows = A.n_rows + B.n_rows + C.n_rows + D.n_rows; const uword out_n_cols = (std::max)(((std::max)((std::max)(A.n_cols, B.n_cols), C.n_cols)), D.n_cols); arma_debug_check( ((A.n_cols != out_n_cols) && ((A.n_rows > 0) || (A.n_cols > 0))), "join_cols() / join_vert(): number of columns must be the same" ); arma_debug_check( ((B.n_cols != out_n_cols) && ((B.n_rows > 0) || (B.n_cols > 0))), "join_cols() / join_vert(): number of columns must be the same" ); arma_debug_check( ((C.n_cols != out_n_cols) && ((C.n_rows > 0) || (C.n_cols > 0))), "join_cols() / join_vert(): number of columns must be the same" ); arma_debug_check( ((D.n_cols != out_n_cols) && ((D.n_rows > 0) || (D.n_cols > 0))), "join_cols() / join_vert(): number of columns must be the same" ); out.set_size(out_n_rows, out_n_cols); if(out.n_elem == 0) { return; } uword row_start = 0; uword row_end_p1 = 0; if(A.n_elem > 0) { row_end_p1 += A.n_rows; out.rows(row_start, row_end_p1 - 1) = A; } row_start = row_end_p1; if(B.n_elem > 0) { row_end_p1 += B.n_rows; out.rows(row_start, row_end_p1 - 1) = B; } row_start = row_end_p1; if(C.n_elem > 0) { row_end_p1 += C.n_rows; out.rows(row_start, row_end_p1 - 1) = C; } row_start = row_end_p1; if(D.n_elem > 0) { row_end_p1 += D.n_rows; out.rows(row_start, row_end_p1 - 1) = D; } } template inline void spglue_join_rows::apply(SpMat& out, const SpGlue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat UA(X.A); const unwrap_spmat UB(X.B); if(UA.is_alias(out) || UB.is_alias(out)) { SpMat tmp; spglue_join_rows::apply_noalias(tmp, UA.M, UB.M); out.steal_mem(tmp); } else { spglue_join_rows::apply_noalias(out, UA.M, UB.M); } } template inline void spglue_join_rows::apply_noalias(SpMat& out, const SpMat& A, const SpMat& B) { arma_extra_debug_sigprint(); const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword A_n_nz = A.n_nonzero; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; const uword B_n_nz = B.n_nonzero; arma_debug_check ( ( (A_n_rows != B.n_rows) && ( (A_n_rows > 0) || (A_n_cols > 0) ) && ( (B_n_rows > 0) || (B_n_cols > 0) ) ), "join_rows() / join_horiz(): number of rows must be the same" ); const uword C_n_rows = (std::max)(A_n_rows, B_n_rows); const uword C_n_cols = A_n_cols + B_n_cols; const uword C_n_nz = A_n_nz + B_n_nz; if( ((C_n_rows * C_n_cols) == 0) || (C_n_nz == 0) ) { out.zeros(C_n_rows, C_n_cols); return; } out.reserve(C_n_rows, C_n_cols, C_n_nz); arrayops::copy( access::rwp(out.values), A.values, A_n_nz ); arrayops::copy( access::rwp(out.values) + A_n_nz, B.values, B_n_nz+1 ); arrayops::copy( access::rwp(out.row_indices), A.row_indices, A_n_nz ); arrayops::copy( access::rwp(out.row_indices) + A_n_nz, B.row_indices, B_n_nz+1 ); arrayops::copy( access::rwp(out.col_ptrs), A.col_ptrs, A_n_cols ); arrayops::copy( access::rwp(out.col_ptrs) + A_n_cols, B.col_ptrs, B_n_cols+2 ); arrayops::inplace_plus( access::rwp(out.col_ptrs) + A_n_cols, A_n_nz, B_n_cols+1 ); // // OLD METHOD // // umat locs(2, C_n_nz, arma_nozeros_indicator()); // Col vals( C_n_nz, arma_nozeros_indicator()); // // uword* locs_mem = locs.memptr(); // eT* vals_mem = vals.memptr(); // // typename SpMat::const_iterator A_it = A.begin(); // // for(uword i=0; i < A_n_nz; ++i) // { // const uword row = A_it.row(); // const uword col = A_it.col(); // // (*locs_mem) = row; locs_mem++; // (*locs_mem) = col; locs_mem++; // // (*vals_mem) = (*A_it); vals_mem++; // // ++A_it; // } // // typename SpMat::const_iterator B_it = B.begin(); // // for(uword i=0; i < B_n_nz; ++i) // { // const uword row = B_it.row(); // const uword col = A_n_cols + B_it.col(); // // (*locs_mem) = row; locs_mem++; // (*locs_mem) = col; locs_mem++; // // (*vals_mem) = (*B_it); vals_mem++; // // ++B_it; // } // // // TODO: the first element of B within C will always have a larger index than the last element of A in C; // // TODO: so, is sorting really necessary here? // SpMat tmp(locs, vals, C_n_rows, C_n_cols, true, false); // // out.steal_mem(tmp); } template inline void spglue_join_rows::apply(SpMat& out, const SpBase& A_expr, const SpBase& B_expr, const SpBase& C_expr) { arma_extra_debug_sigprint(); const unwrap_spmat UA(A_expr.get_ref()); const unwrap_spmat UB(B_expr.get_ref()); const unwrap_spmat UC(C_expr.get_ref()); const SpMat& A = UA.M; const SpMat& B = UB.M; const SpMat& C = UC.M; SpMat tmp; spglue_join_rows::apply_noalias(tmp, A, B); spglue_join_rows::apply_noalias(out, tmp, C); } template inline void spglue_join_rows::apply(SpMat& out, const SpBase& A_expr, const SpBase& B_expr, const SpBase& C_expr, const SpBase& D_expr) { arma_extra_debug_sigprint(); const unwrap_spmat UA(A_expr.get_ref()); const unwrap_spmat UB(B_expr.get_ref()); const unwrap_spmat UC(C_expr.get_ref()); const unwrap_spmat UD(D_expr.get_ref()); const SpMat& A = UA.M; const SpMat& B = UB.M; const SpMat& C = UC.M; const SpMat& D = UD.M; SpMat AB; SpMat ABC; spglue_join_rows::apply_noalias(AB, A, B); spglue_join_rows::apply_noalias(ABC, AB, C); spglue_join_rows::apply_noalias(out, ABC, D); } //! @} RcppArmadillo/inst/include/armadillo_bits/mtOp_bones.hpp0000644000176200001440000000461614124060717023217 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup mtOp //! @{ struct mtOp_dual_aux_indicator {}; template class mtOp : public Base< out_eT, mtOp > { public: typedef out_eT elem_type; typedef typename get_pod_type::result pod_type; typedef typename T1::elem_type in_eT; static constexpr bool is_row = op_type::template traits::is_row; static constexpr bool is_col = op_type::template traits::is_col; static constexpr bool is_xvec = op_type::template traits::is_xvec; inline explicit mtOp(const T1& in_m); inline mtOp(const T1& in_m, const in_eT in_aux); inline mtOp(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b); inline mtOp(const T1& in_m, const in_eT in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b); inline mtOp(const char junk, const T1& in_m, const out_eT in_aux); inline mtOp(const mtOp_dual_aux_indicator&, const T1& in_m, const in_eT in_aux_a, const out_eT in_aux_b); inline ~mtOp(); arma_aligned const T1& m; //!< the operand; must be derived from Base arma_aligned in_eT aux; //!< auxiliary data, using the element type as used by T1 arma_aligned out_eT aux_out_eT; //!< auxiliary data, using the element type as specified by the out_eT template parameter arma_aligned uword aux_uword_a; //!< auxiliary data, uword format arma_aligned uword aux_uword_b; //!< auxiliary data, uword format }; //! @} RcppArmadillo/inst/include/armadillo_bits/arma_str.hpp0000644000176200001440000002447414124060717022726 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup arma_str //! @{ namespace arma_str { class format { public: format(const char* in_fmt) : A(in_fmt) { } format(const std::string& in_fmt) : A(in_fmt) { } // TODO: constructor to handle std::string&& ? const std::string A; private: format(); }; template class basic_format { public: basic_format(const T1& in_A, const T2& in_B) : A(in_A) , B(in_B) { } const T1& A; const T2& B; private: basic_format(); }; template inline basic_format< format, T2 > operator% (const format& X, const T2& arg) { return basic_format< format, T2 >(X, arg); } template inline basic_format< basic_format, T3 > operator% (const basic_format& X, const T3& arg) { return basic_format< basic_format, T3 >(X, arg); } template inline std::string str(const basic_format< format, T2>& X) { char local_buffer[1024]; char* buffer = local_buffer; int buffer_size = 1024; int required_size = buffer_size; bool using_local_buffer = true; std::string out; do { if(using_local_buffer == false) { buffer = new char[size_t(buffer_size)]; } required_size = std::snprintf(buffer, size_t(buffer_size), X.A.A.c_str(), X.B); if(required_size < 0) { break; } if(required_size < buffer_size) { if(required_size > 0) { out = buffer; } } else { buffer_size *= 2; } if(using_local_buffer) { using_local_buffer = false; } else { delete[] buffer; } } while( (required_size >= buffer_size) ); return out; } template inline std::string str(const basic_format< basic_format< format, T2>, T3>& X) { char local_buffer[1024]; char* buffer = local_buffer; int buffer_size = 1024; int required_size = buffer_size; bool using_local_buffer = true; std::string out; do { if(using_local_buffer == false) { buffer = new char[size_t(buffer_size)]; } required_size = std::snprintf(buffer, size_t(buffer_size), X.A.A.A.c_str(), X.A.B, X.B); if(required_size < 0) { break; } if(required_size < buffer_size) { if(required_size > 0) { out = buffer; } } else { buffer_size *= 2; } if(using_local_buffer) { using_local_buffer = false; } else { delete[] buffer; } } while( (required_size >= buffer_size) ); return out; } template inline std::string str(const basic_format< basic_format< basic_format< format, T2>, T3>, T4>& X) { char local_buffer[1024]; char* buffer = local_buffer; int buffer_size = 1024; int required_size = buffer_size; bool using_local_buffer = true; std::string out; do { if(using_local_buffer == false) { buffer = new char[size_t(buffer_size)]; } required_size = std::snprintf(buffer, size_t(buffer_size), X.A.A.A.A.c_str(), X.A.A.B, X.A.B, X.B); if(required_size < 0) { break; } if(required_size < buffer_size) { if(required_size > 0) { out = buffer; } } else { buffer_size *= 2; } if(using_local_buffer) { using_local_buffer = false; } else { delete[] buffer; } } while( (required_size >= buffer_size) ); return out; } template inline std::string str(const basic_format< basic_format< basic_format< basic_format< format, T2>, T3>, T4>, T5>& X) { char local_buffer[1024]; char* buffer = local_buffer; int buffer_size = 1024; int required_size = buffer_size; bool using_local_buffer = true; std::string out; do { if(using_local_buffer == false) { buffer = new char[size_t(buffer_size)]; } required_size = std::snprintf(buffer, size_t(buffer_size), X.A.A.A.A.A.c_str(), X.A.A.A.B, X.A.A.B, X.A.B, X.B); if(required_size < 0) { break; } if(required_size < buffer_size) { if(required_size > 0) { out = buffer; } } else { buffer_size *= 2; } if(using_local_buffer) { using_local_buffer = false; } else { delete[] buffer; } } while( (required_size >= buffer_size) ); return out; } template inline std::string str(const basic_format< basic_format< basic_format< basic_format< basic_format< format, T2>, T3>, T4>, T5>, T6>& X) { char local_buffer[1024]; char* buffer = local_buffer; int buffer_size = 1024; int required_size = buffer_size; bool using_local_buffer = true; std::string out; do { if(using_local_buffer == false) { buffer = new char[size_t(buffer_size)]; } required_size = std::snprintf(buffer, size_t(buffer_size), X.A.A.A.A.A.A.c_str(), X.A.A.A.A.B, X.A.A.A.B, X.A.A.B, X.A.B, X.B); if(required_size < 0) { break; } if(required_size < buffer_size) { if(required_size > 0) { out = buffer; } } else { buffer_size *= 2; } if(using_local_buffer) { using_local_buffer = false; } else { delete[] buffer; } } while( (required_size >= buffer_size) ); return out; } template inline std::string str(const basic_format< basic_format< basic_format< basic_format< basic_format< basic_format< format, T2>, T3>, T4>, T5>, T6>, T7>& X) { char local_buffer[1024]; char* buffer = local_buffer; int buffer_size = 1024; int required_size = buffer_size; bool using_local_buffer = true; std::string out; do { if(using_local_buffer == false) { buffer = new char[size_t(buffer_size)]; } required_size = std::snprintf(buffer, size_t(buffer_size), X.A.A.A.A.A.A.A.c_str(), X.A.A.A.A.A.B, X.A.A.A.A.B, X.A.A.A.B, X.A.A.B, X.A.B, X.B); if(required_size < 0) { break; } if(required_size < buffer_size) { if(required_size > 0) { out = buffer; } } else { buffer_size *= 2; } if(using_local_buffer) { using_local_buffer = false; } else { delete[] buffer; } } while( (required_size >= buffer_size) ); return out; } template struct format_metaprog { static constexpr uword depth = 0; inline static const std::string& get_fmt(const T1& X) { return X.A; } }; //template<> template struct format_metaprog< basic_format > { static constexpr uword depth = 1 + format_metaprog::depth; inline static const std::string& get_fmt(const T1& X) { return format_metaprog::get_fmt(X.A); } }; template inline std::string str(const basic_format& X) { return format_metaprog< basic_format >::get_fmt(X.A); } template inline std::ostream& operator<< (std::ostream& o, const basic_format& X) { o << str(X); return o; } template struct string_only { }; template<> struct string_only { typedef std::string result; }; template struct char_only { }; template<> struct char_only { typedef char result; }; template struct basic_format_only { }; template struct basic_format_only< basic_format > { typedef basic_format result; }; template inline static const T1& str_wrapper(const T1& x, const typename string_only::result* junk = nullptr) { arma_ignore(junk); return x; } template inline static const T1* str_wrapper(const T1* x, const typename char_only::result* junk = nullptr) { arma_ignore(junk); return x; } template inline static std::string str_wrapper(const T1& x, const typename basic_format_only::result* junk = nullptr) { arma_ignore(junk); return str(x); } } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_diagmat.hpp0000644000176200001440000000427714124060717023206 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_diagmat //! @{ //! interpret a matrix or a vector as a diagonal matrix (ie. off-diagonal entries are zero) template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value, const Op >::result diagmat(const T1& X) { arma_extra_debug_sigprint(); return Op(X); } //! create a matrix with the k-th diagonal set to the given vector template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value, const Op >::result diagmat(const T1& X, const sword k) { arma_extra_debug_sigprint(); const uword row_offset = (k < 0) ? uword(-k) : uword(0); const uword col_offset = (k > 0) ? uword( k) : uword(0); return Op(X, row_offset, col_offset); } template arma_warn_unused inline const SpOp diagmat(const SpBase& X) { arma_extra_debug_sigprint(); return SpOp(X.get_ref()); } template arma_warn_unused inline const SpOp diagmat(const SpBase& X, const sword k) { arma_extra_debug_sigprint(); const uword row_offset = (k < 0) ? uword(-k) : uword(0); const uword col_offset = (k > 0) ? uword( k) : uword(0); return SpOp(X.get_ref(), row_offset, col_offset); } //! @} RcppArmadillo/inst/include/armadillo_bits/SpRow_bones.hpp0000644000176200001440000000570214124060717023347 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpRow //! @{ //! Class for sparse row vectors (sparse matrices with only one row) template class SpRow : public SpMat { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = true; static constexpr bool is_col = false; static constexpr bool is_xvec = false; inline SpRow(); inline explicit SpRow(const uword N); inline explicit SpRow(const uword in_rows, const uword in_cols); inline explicit SpRow(const SizeMat& s); inline SpRow(const char* text); inline SpRow& operator=(const char* text); inline SpRow(const std::string& text); inline SpRow& operator=(const std::string& text); inline SpRow& operator=(const eT val); template inline SpRow(const Base& X); template inline SpRow& operator=(const Base& X); template inline SpRow(const SpBase& X); template inline SpRow& operator=(const SpBase& X); template inline explicit SpRow(const SpBase& A, const SpBase& B); inline arma_warn_unused const SpOp,spop_htrans> t() const; inline arma_warn_unused const SpOp,spop_htrans> ht() const; inline arma_warn_unused const SpOp,spop_strans> st() const; inline void shed_col (const uword col_num); inline void shed_cols(const uword in_col1, const uword in_col2); // inline void insert_cols(const uword col_num, const uword N, const bool set_to_zero = true); typedef typename SpMat::iterator row_iterator; typedef typename SpMat::const_iterator const_row_iterator; inline row_iterator begin_row(const uword row_num = 0); inline const_row_iterator begin_row(const uword row_num = 0) const; inline row_iterator end_row(const uword row_num = 0); inline const_row_iterator end_row(const uword row_num = 0) const; #ifdef ARMA_EXTRA_SPROW_PROTO #include ARMA_INCFILE_WRAP(ARMA_EXTRA_SPROW_PROTO) #endif }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_var_bones.hpp0000644000176200001440000000401014124060717023552 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_var //! @{ //! Class for finding variance values of a matrix class op_var : public traits_op_xvec { public: template inline static void apply(Mat& out, const mtOp& in); // template inline static typename get_pod_type::result var_vec(const subview_col& X, const uword norm_type = 0); template inline static typename get_pod_type::result var_vec(const subview_row& X, const uword norm_type = 0); template inline static typename T1::pod_type var_vec(const Base& X, const uword norm_type = 0); // template inline static eT direct_var(const eT* const X, const uword N, const uword norm_type = 0); template inline static eT direct_var_robust(const eT* const X, const uword N, const uword norm_type = 0); // template inline static T direct_var(const std::complex* const X, const uword N, const uword norm_type = 0); template inline static T direct_var_robust(const std::complex* const X, const uword N, const uword norm_type = 0); }; //! @} RcppArmadillo/inst/include/armadillo_bits/spglue_join_bones.hpp0000644000176200001440000000521614124060717024613 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_join //! @{ class spglue_join_cols { public: template struct traits { static constexpr bool is_row = false; static constexpr bool is_col = (T1::is_col && T2::is_col); static constexpr bool is_xvec = false; }; template inline static void apply(SpMat& out, const SpGlue& X); template inline static void apply_noalias(SpMat& out, const SpMat& A, const SpMat& B); template inline static void apply(SpMat& out, const SpBase& A, const SpBase& B, const SpBase& C); template inline static void apply(SpMat& out, const SpBase& A, const SpBase& B, const SpBase& C, const SpBase& D); }; class spglue_join_rows { public: template struct traits { static constexpr bool is_row = (T1::is_row && T2::is_row); static constexpr bool is_col = false; static constexpr bool is_xvec = false; }; template inline static void apply(SpMat& out, const SpGlue& X); template inline static void apply_noalias(SpMat& out, const SpMat& A, const SpMat& B); template inline static void apply(SpMat& out, const SpBase& A, const SpBase& B, const SpBase& C); template inline static void apply(SpMat& out, const SpBase& A, const SpBase& B, const SpBase& C, const SpBase& D); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_misc.hpp0000644000176200001440000003007014124060717022521 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_misc //! @{ template arma_warn_unused inline typename enable_if2 < is_Mat::value, out_type >::result linspace ( const typename out_type::pod_type start, const typename out_type::pod_type end, const uword num = 100u ) { arma_extra_debug_sigprint(); typedef typename out_type::elem_type eT; typedef typename out_type::pod_type T; out_type x; if(num == 1) { x.set_size(1); x[0] = eT(end); } else if(num >= 2) { x.set_size(num); eT* x_mem = x.memptr(); const uword num_m1 = num - 1; if(is_non_integral::value) { const T delta = (end-start)/T(num_m1); for(uword i=0; i= start) ? double(end-start)/double(num_m1) : -double(start-end)/double(num_m1); for(uword i=0; i(start, end, num); } template arma_warn_unused inline typename enable_if2 < (is_Mat::value && is_real::value), out_type >::result logspace ( const typename out_type::pod_type A, const typename out_type::pod_type B, const uword N = 50u ) { arma_extra_debug_sigprint(); typedef typename out_type::elem_type eT; typedef typename out_type::pod_type T; out_type x = linspace(A,B,N); const uword n_elem = x.n_elem; eT* x_mem = x.memptr(); for(uword i=0; i < n_elem; ++i) { x_mem[i] = std::pow(T(10), x_mem[i]); } return x; } arma_warn_unused inline vec logspace(const double A, const double B, const uword N = 50u) { arma_extra_debug_sigprint(); return logspace(A, B, N); } // // log_exp_add template arma_warn_unused inline typename arma_real_only::result log_add_exp(eT log_a, eT log_b) { if(log_a < log_b) { std::swap(log_a, log_b); } const eT negdelta = log_b - log_a; if( (negdelta < Datum::log_min) || (arma_isfinite(negdelta) == false) ) { return log_a; } else { return (log_a + std::log1p(std::exp(negdelta))); } } // for compatibility with earlier versions template arma_warn_unused inline typename arma_real_only::result log_add(eT log_a, eT log_b) { return log_add_exp(log_a, log_b); } //! kept for compatibility with old user code template arma_warn_unused arma_inline bool is_finite(const eT x, const typename arma_scalar_only::result* junk = nullptr) { arma_ignore(junk); return arma_isfinite(x); } //! kept for compatibility with old user code template arma_warn_unused inline bool is_finite(const Base& X) { arma_extra_debug_sigprint(); return X.is_finite(); } //! kept for compatibility with old user code template arma_warn_unused inline bool is_finite(const SpBase& X) { arma_extra_debug_sigprint(); return X.is_finite(); } //! kept for compatibility with old user code template arma_warn_unused inline bool is_finite(const BaseCube& X) { arma_extra_debug_sigprint(); return X.is_finite(); } template inline void swap(Mat& A, Mat& B) { arma_extra_debug_sigprint(); A.swap(B); } template inline void swap(Cube& A, Cube& B) { arma_extra_debug_sigprint(); A.swap(B); } arma_warn_unused inline uvec ind2sub(const SizeMat& s, const uword i) { arma_extra_debug_sigprint(); const uword s_n_rows = s.n_rows; arma_debug_check( (i >= (s_n_rows * s.n_cols) ), "ind2sub(): index out of range" ); const uword row = i % s_n_rows; const uword col = i / s_n_rows; uvec out(2, arma_nozeros_indicator()); uword* out_mem = out.memptr(); out_mem[0] = row; out_mem[1] = col; return out; } template arma_warn_unused inline typename enable_if2< (is_arma_type::value && is_same_type::yes), umat >::result ind2sub(const SizeMat& s, const T1& indices) { arma_extra_debug_sigprint(); const uword s_n_rows = s.n_rows; const uword s_n_elem = s_n_rows * s.n_cols; const Proxy P(indices); const uword P_n_rows = P.get_n_rows(); const uword P_n_cols = P.get_n_cols(); const uword P_n_elem = P.get_n_elem(); const bool P_is_empty = (P_n_elem == 0); const bool P_is_vec = ((P_n_rows == 1) || (P_n_cols == 1)); arma_debug_check( ((P_is_empty == false) && (P_is_vec == false)), "ind2sub(): parameter 'indices' must be a vector" ); umat out(2, P_n_elem, arma_nozeros_indicator()); if(Proxy::use_at == false) { typename Proxy::ea_type Pea = P.get_ea(); for(uword count=0; count < P_n_elem; ++count) { const uword i = Pea[count]; arma_debug_check( (i >= s_n_elem), "ind2sub(): index out of range" ); const uword row = i % s_n_rows; const uword col = i / s_n_rows; uword* out_colptr = out.colptr(count); out_colptr[0] = row; out_colptr[1] = col; } } else { if(P_n_rows == 1) { for(uword count=0; count < P_n_cols; ++count) { const uword i = P.at(0,count); arma_debug_check( (i >= s_n_elem), "ind2sub(): index out of range" ); const uword row = i % s_n_rows; const uword col = i / s_n_rows; uword* out_colptr = out.colptr(count); out_colptr[0] = row; out_colptr[1] = col; } } else if(P_n_cols == 1) { for(uword count=0; count < P_n_rows; ++count) { const uword i = P.at(count,0); arma_debug_check( (i >= s_n_elem), "ind2sub(): index out of range" ); const uword row = i % s_n_rows; const uword col = i / s_n_rows; uword* out_colptr = out.colptr(count); out_colptr[0] = row; out_colptr[1] = col; } } } return out; } arma_warn_unused inline uvec ind2sub(const SizeCube& s, const uword i) { arma_extra_debug_sigprint(); const uword s_n_rows = s.n_rows; const uword s_n_elem_slice = s_n_rows * s.n_cols; arma_debug_check( (i >= (s_n_elem_slice * s.n_slices) ), "ind2sub(): index out of range" ); const uword slice = i / s_n_elem_slice; const uword j = i - (slice * s_n_elem_slice); const uword row = j % s_n_rows; const uword col = j / s_n_rows; uvec out(3, arma_nozeros_indicator()); uword* out_mem = out.memptr(); out_mem[0] = row; out_mem[1] = col; out_mem[2] = slice; return out; } template arma_warn_unused inline typename enable_if2< (is_arma_type::value && is_same_type::yes), umat >::result ind2sub(const SizeCube& s, const T1& indices) { arma_extra_debug_sigprint(); const uword s_n_rows = s.n_rows; const uword s_n_elem_slice = s_n_rows * s.n_cols; const uword s_n_elem = s.n_slices * s_n_elem_slice; const quasi_unwrap U(indices); arma_debug_check( ((U.M.is_empty() == false) && (U.M.is_vec() == false)), "ind2sub(): parameter 'indices' must be a vector" ); const uword U_n_elem = U.M.n_elem; const uword* U_mem = U.M.memptr(); umat out(3, U_n_elem, arma_nozeros_indicator()); for(uword count=0; count < U_n_elem; ++count) { const uword i = U_mem[count]; arma_debug_check( (i >= s_n_elem), "ind2sub(): index out of range" ); const uword slice = i / s_n_elem_slice; const uword j = i - (slice * s_n_elem_slice); const uword row = j % s_n_rows; const uword col = j / s_n_rows; uword* out_colptr = out.colptr(count); out_colptr[0] = row; out_colptr[1] = col; out_colptr[2] = slice; } return out; } arma_warn_unused arma_inline uword sub2ind(const SizeMat& s, const uword row, const uword col) { arma_extra_debug_sigprint(); const uword s_n_rows = s.n_rows; arma_debug_check( ((row >= s_n_rows) || (col >= s.n_cols)), "sub2ind(): subscript out of range" ); return uword(row + col*s_n_rows); } template arma_warn_unused inline uvec sub2ind(const SizeMat& s, const Base& subscripts) { arma_extra_debug_sigprint(); const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; const quasi_unwrap U(subscripts.get_ref()); arma_debug_check( (U.M.n_rows != 2), "sub2ind(): matrix of subscripts must have 2 rows" ); const uword U_M_n_cols = U.M.n_cols; uvec out(U_M_n_cols, arma_nozeros_indicator()); uword* out_mem = out.memptr(); const uword* U_M_mem = U.M.memptr(); for(uword count=0; count < U_M_n_cols; ++count) { const uword row = U_M_mem[0]; const uword col = U_M_mem[1]; U_M_mem += 2; // next column arma_debug_check( ((row >= s_n_rows) || (col >= s_n_cols)), "sub2ind(): subscript out of range" ); out_mem[count] = uword(row + col*s_n_rows); } return out; } arma_warn_unused arma_inline uword sub2ind(const SizeCube& s, const uword row, const uword col, const uword slice) { arma_extra_debug_sigprint(); const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; arma_debug_check( ((row >= s_n_rows) || (col >= s_n_cols) || (slice >= s.n_slices)), "sub2ind(): subscript out of range" ); return uword( (slice * s_n_rows * s_n_cols) + (col * s_n_rows) + row ); } template arma_warn_unused inline uvec sub2ind(const SizeCube& s, const Base& subscripts) { arma_extra_debug_sigprint(); const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; const uword s_n_slices = s.n_slices; const quasi_unwrap U(subscripts.get_ref()); arma_debug_check( (U.M.n_rows != 3), "sub2ind(): matrix of subscripts must have 3 rows" ); const uword U_M_n_cols = U.M.n_cols; uvec out(U_M_n_cols, arma_nozeros_indicator()); uword* out_mem = out.memptr(); const uword* U_M_mem = U.M.memptr(); for(uword count=0; count < U_M_n_cols; ++count) { const uword row = U_M_mem[0]; const uword col = U_M_mem[1]; const uword slice = U_M_mem[2]; U_M_mem += 3; // next column arma_debug_check( ((row >= s_n_rows) || (col >= s_n_cols) || (slice >= s_n_slices)), "sub2ind(): subscript out of range" ); out_mem[count] = uword( (slice * s_n_rows * s_n_cols) + (col * s_n_rows) + row ); } return out; } template arma_inline typename enable_if2 < (is_arma_type::value && is_same_type::value), const Glue >::result affmul(const T1& A, const T2& B) { arma_extra_debug_sigprint(); return Glue(A,B); } //! @} RcppArmadillo/inst/include/armadillo_bits/xvec_htrans_bones.hpp0000644000176200001440000000312614124060717024617 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup xvec_htrans //! @{ template class xvec_htrans : public Base< eT, xvec_htrans > { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = true; arma_aligned const eT* const mem; const uword n_rows; const uword n_cols; const uword n_elem; inline explicit xvec_htrans(const eT* const in_mem, const uword in_n_rows, const uword in_n_cols); inline void extract(Mat& out) const; inline eT operator[](const uword ii) const; inline eT at_alt (const uword ii) const; inline eT at (const uword in_row, const uword in_col) const; }; //! @} RcppArmadillo/inst/include/armadillo_bits/glue_cross_bones.hpp0000644000176200001440000000230714124060717024440 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_cross //! @{ class glue_cross { public: template struct traits { static constexpr bool is_row = T1::is_row; static constexpr bool is_col = T1::is_col; static constexpr bool is_xvec = true; }; template inline static void apply(Mat& out, const Glue& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/include_atlas.hpp0000644000176200001440000000261414124060717023715 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #if defined(ARMA_USE_ATLAS) #if !defined(ARMA_ATLAS_INCLUDE_DIR) extern "C" { #include #include } #else #define ARMA_STR1(x) x #define ARMA_STR2(x) ARMA_STR1(x) #define ARMA_CBLAS ARMA_STR2(ARMA_ATLAS_INCLUDE_DIR)ARMA_STR2(cblas.h) #define ARMA_CLAPACK ARMA_STR2(ARMA_ATLAS_INCLUDE_DIR)ARMA_STR2(clapack.h) extern "C" { #include ARMA_INCFILE_WRAP(ARMA_CBLAS) #include ARMA_INCFILE_WRAP(ARMA_CLAPACK) } #undef ARMA_STR1 #undef ARMA_STR2 #undef ARMA_CBLAS #undef ARMA_CLAPACK #endif #endif RcppArmadillo/inst/include/armadillo_bits/op_fft_meat.hpp0000644000176200001440000002065414124060717023375 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_fft //! @{ // // op_fft_real template inline void op_fft_real::apply( Mat< std::complex >& out, const mtOp,T1,op_fft_real>& in ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type in_eT; typedef typename std::complex out_eT; const Proxy P(in.m); const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_elem = P.get_n_elem(); const bool is_vec = ( (n_rows == 1) || (n_cols == 1) ); const uword N_orig = (is_vec) ? n_elem : n_rows; const uword N_user = (in.aux_uword_b == 0) ? in.aux_uword_a : N_orig; fft_engine worker(N_user); // no need to worry about aliasing, as we're going from a real object to complex complex, which by definition cannot alias if(is_vec) { (n_cols == 1) ? out.set_size(N_user, 1) : out.set_size(1, N_user); if( (out.n_elem == 0) || (N_orig == 0) ) { out.zeros(); return; } if( (N_user == 1) && (N_orig >= 1) ) { out[0] = out_eT( P[0] ); return; } podarray data(N_user); out_eT* data_mem = data.memptr(); if(N_user > N_orig) { arrayops::fill_zeros( &data_mem[N_orig], (N_user - N_orig) ); } const uword N = (std::min)(N_user, N_orig); if(Proxy::use_at == false) { typename Proxy::ea_type X = P.get_ea(); for(uword i=0; i < N; ++i) { data_mem[i] = out_eT( X[i], in_eT(0) ); } } else { if(n_cols == 1) { for(uword i=0; i < N; ++i) { data_mem[i] = out_eT( P.at(i,0), in_eT(0) ); } } else { for(uword i=0; i < N; ++i) { data_mem[i] = out_eT( P.at(0,i), in_eT(0) ); } } } worker.run( out.memptr(), data_mem ); } else { // process each column seperately out.set_size(N_user, n_cols); if( (out.n_elem == 0) || (N_orig == 0) ) { out.zeros(); return; } if( (N_user == 1) && (N_orig >= 1) ) { for(uword col=0; col < n_cols; ++col) { out.at(0,col) = out_eT( P.at(0,col) ); } return; } podarray data(N_user); out_eT* data_mem = data.memptr(); if(N_user > N_orig) { arrayops::fill_zeros( &data_mem[N_orig], (N_user - N_orig) ); } const uword N = (std::min)(N_user, N_orig); for(uword col=0; col < n_cols; ++col) { for(uword i=0; i < N; ++i) { data_mem[i] = P.at(i, col); } worker.run( out.colptr(col), data_mem ); } } } // // op_fft_cx template inline void op_fft_cx::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy P(in.m); if(P.is_alias(out) == false) { op_fft_cx::apply_noalias(out, P, in.aux_uword_a, in.aux_uword_b); } else { Mat tmp; op_fft_cx::apply_noalias(tmp, P, in.aux_uword_a, in.aux_uword_b); out.steal_mem(tmp); } } template inline void op_fft_cx::apply_noalias(Mat& out, const Proxy& P, const uword a, const uword b) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_elem = P.get_n_elem(); const bool is_vec = ( (n_rows == 1) || (n_cols == 1) ); const uword N_orig = (is_vec) ? n_elem : n_rows; const uword N_user = (b == 0) ? a : N_orig; fft_engine worker(N_user); if(is_vec) { (n_cols == 1) ? out.set_size(N_user, 1) : out.set_size(1, N_user); if( (out.n_elem == 0) || (N_orig == 0) ) { out.zeros(); return; } if( (N_user == 1) && (N_orig >= 1) ) { out[0] = P[0]; return; } if( (N_user > N_orig) || (is_Mat::stored_type>::value == false) ) { podarray data(N_user); eT* data_mem = data.memptr(); if(N_user > N_orig) { arrayops::fill_zeros( &data_mem[N_orig], (N_user - N_orig) ); } op_fft_cx::copy_vec( data_mem, P, (std::min)(N_user, N_orig) ); worker.run( out.memptr(), data_mem ); } else { const unwrap< typename Proxy::stored_type > tmp(P.Q); worker.run( out.memptr(), tmp.M.memptr() ); } } else { // process each column seperately out.set_size(N_user, n_cols); if( (out.n_elem == 0) || (N_orig == 0) ) { out.zeros(); return; } if( (N_user == 1) && (N_orig >= 1) ) { for(uword col=0; col < n_cols; ++col) { out.at(0,col) = P.at(0,col); } return; } if( (N_user > N_orig) || (is_Mat::stored_type>::value == false) ) { podarray data(N_user); eT* data_mem = data.memptr(); if(N_user > N_orig) { arrayops::fill_zeros( &data_mem[N_orig], (N_user - N_orig) ); } const uword N = (std::min)(N_user, N_orig); for(uword col=0; col < n_cols; ++col) { for(uword i=0; i < N; ++i) { data_mem[i] = P.at(i, col); } worker.run( out.colptr(col), data_mem ); } } else { const unwrap< typename Proxy::stored_type > tmp(P.Q); for(uword col=0; col < n_cols; ++col) { worker.run( out.colptr(col), tmp.M.colptr(col) ); } } } // correct the scaling for the inverse transform if(inverse) { typedef typename get_pod_type::result T; const T k = T(1) / T(N_user); eT* out_mem = out.memptr(); const uword out_n_elem = out.n_elem; for(uword i=0; i < out_n_elem; ++i) { out_mem[i] *= k; } } } template arma_hot inline void op_fft_cx::copy_vec(typename Proxy::elem_type* dest, const Proxy& P, const uword N) { arma_extra_debug_sigprint(); if(is_Mat< typename Proxy::stored_type >::value) { op_fft_cx::copy_vec_unwrap(dest, P, N); } else { op_fft_cx::copy_vec_proxy(dest, P, N); } } template arma_hot inline void op_fft_cx::copy_vec_unwrap(typename Proxy::elem_type* dest, const Proxy& P, const uword N) { arma_extra_debug_sigprint(); const unwrap< typename Proxy::stored_type > tmp(P.Q); arrayops::copy(dest, tmp.M.memptr(), N); } template arma_hot inline void op_fft_cx::copy_vec_proxy(typename Proxy::elem_type* dest, const Proxy& P, const uword N) { arma_extra_debug_sigprint(); if(Proxy::use_at == false) { typename Proxy::ea_type X = P.get_ea(); for(uword i=0; i < N; ++i) { dest[i] = X[i]; } } else { if(P.get_n_cols() == 1) { for(uword i=0; i < N; ++i) { dest[i] = P.at(i,0); } } else { for(uword i=0; i < N; ++i) { dest[i] = P.at(0,i); } } } } // // op_ifft_cx template inline void op_ifft_cx::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy P(in.m); if(P.is_alias(out) == false) { op_fft_cx::apply_noalias(out, P, in.aux_uword_a, in.aux_uword_b); } else { Mat tmp; op_fft_cx::apply_noalias(tmp, P, in.aux_uword_a, in.aux_uword_b); out.steal_mem(tmp); } } //! @} RcppArmadillo/inst/include/armadillo_bits/op_cond_meat.hpp0000644000176200001440000000564414162345366023553 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_cond //! @{ template inline typename T1::pod_type op_cond::cond(const Base& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; Mat A(X.get_ref()); Col S; const bool status = auxlib::svd_dc(S, A); if(status == false) { arma_debug_warn_level(3, "cond(): svd failed"); return T(0); } return (S.n_elem > 0) ? T( max(S) / min(S) ) : T(0); } template inline typename T1::pod_type op_cond::rcond(const Base& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; if(strip_trimat::do_trimat) { const strip_trimat S(X.get_ref()); const quasi_unwrap::stored_type> U(S.M); arma_debug_check( (U.M.is_square() == false), "rcond(): matrix must be square sized" ); const uword layout = (S.do_triu) ? uword(0) : uword(1); return auxlib::rcond_trimat(U.M, layout); } Mat A = X.get_ref(); arma_debug_check( (A.is_square() == false), "rcond(): matrix must be square sized" ); if(A.is_empty()) { return Datum::inf; } const bool is_triu = trimat_helper::is_triu(A); const bool is_tril = (is_triu) ? false : trimat_helper::is_tril(A); if(is_triu || is_tril) { const uword layout = (is_triu) ? uword(0) : uword(1); return auxlib::rcond_trimat(A, layout); } #if defined(ARMA_OPTIMISE_SYMPD) const bool try_sympd = auxlib::crippled_lapack(A) ? false : sympd_helper::guess_sympd(A); #else const bool try_sympd = false; #endif if(try_sympd) { bool calc_ok = false; const T out_val = auxlib::rcond_sympd(A, calc_ok); if(calc_ok) { return out_val; } // auxlib::rcond_sympd() may have failed because A isn't really sympd // restore A, as auxlib::rcond_sympd() may have destroyed it A = X.get_ref(); // fallthrough to the next return statement } return auxlib::rcond(A); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_sylvester.hpp0000644000176200001440000000664614124060717023642 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_syl_lyap //! @{ //! find the solution of the Sylvester equation AX + XB = C template inline bool syl ( Mat & out, const Base& in_A, const Base& in_B, const Base& in_C, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; const unwrap_check tmp_A(in_A.get_ref(), out); const unwrap_check tmp_B(in_B.get_ref(), out); const unwrap_check tmp_C(in_C.get_ref(), out); const Mat& A = tmp_A.M; const Mat& B = tmp_B.M; const Mat& C = tmp_C.M; const bool status = auxlib::syl(out, A, B, C); if(status == false) { out.soft_reset(); arma_debug_warn_level(3, "syl(): solution not found"); } return status; } template inline bool sylvester ( Mat & out, const Base& in_A, const Base& in_B, const Base& in_C, const typename arma_blas_type_only::result* junk = nullptr ) { arma_ignore(junk); return syl(out, in_A, in_B, in_C); } template arma_warn_unused inline Mat syl ( const Base& in_A, const Base& in_B, const Base& in_C, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; const unwrap tmp_A( in_A.get_ref() ); const unwrap tmp_B( in_B.get_ref() ); const unwrap tmp_C( in_C.get_ref() ); const Mat& A = tmp_A.M; const Mat& B = tmp_B.M; const Mat& C = tmp_C.M; Mat out; const bool status = auxlib::syl(out, A, B, C); if(status == false) { out.soft_reset(); arma_stop_runtime_error("syl(): solution not found"); } return out; } template arma_warn_unused inline Mat sylvester ( const Base& in_A, const Base& in_B, const Base& in_C, const typename arma_blas_type_only::result* junk = nullptr ) { arma_ignore(junk); return syl(in_A, in_B, in_C); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_nonzeros_meat.hpp0000644000176200001440000000566214124060717024475 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_nonzeros //! @{ template inline void op_nonzeros::apply_noalias(Mat& out, const Proxy& P) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword N_max = P.get_n_elem(); Mat tmp(N_max, 1, arma_nozeros_indicator()); eT* tmp_mem = tmp.memptr(); uword N_nz = 0; if(Proxy::use_at == false) { typename Proxy::ea_type Pea = P.get_ea(); for(uword i=0; i inline void op_nonzeros::apply(Mat& out, const Op& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy P(X.m); if(P.get_n_elem() == 0) { out.set_size(0,1); return; } if(P.is_alias(out)) { Mat out2; op_nonzeros::apply_noalias(out2, P); out.steal_mem(out2); } else { op_nonzeros::apply_noalias(out, P); } } template inline void op_nonzeros_spmat::apply(Mat& out, const SpToDOp& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const SpProxy P(X.m); const uword N = P.get_n_nonzero(); out.set_size(N,1); if(N > 0) { if(is_SpMat::stored_type>::value) { const unwrap_spmat::stored_type> U(P.Q); arrayops::copy(out.memptr(), U.M.values, N); } else { eT* out_mem = out.memptr(); typename SpProxy::const_iterator_type it = P.begin(); for(uword i=0; i inline static void apply(Mat< std::complex >& out, const mtOp,T1,op_sqrtmat>& in); template inline static bool apply_direct(Mat< std::complex >& out, const Op& expr); template inline static bool apply_direct(Mat< std::complex >& out, const Base& expr); }; class op_sqrtmat_cx : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); template inline static bool apply_direct(Mat& out, const Op& expr); template inline static bool apply_direct_noalias(Mat& out, const diagmat_proxy& P); template inline static bool apply_direct(Mat& out, const Base& expr); template inline static bool helper(Mat< std::complex >& S); }; class op_sqrtmat_sympd : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); template inline static bool apply_direct(Mat& out, const Base& expr); }; //! @} RcppArmadillo/inst/include/armadillo_bits/diskio_meat.hpp0000644000176200001440000037137514147163451023417 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup diskio //! @{ //! Generate the first line of the header used for saving matrices in text format. //! Format: "ARMA_MAT_TXT_ABXYZ". //! A is one of: I (for integral types) or F (for floating point types). //! B is one of: U (for unsigned types), S (for signed types), N (for not applicable) or C (for complex types). //! XYZ specifies the width of each element in terms of bytes, eg. "008" indicates eight bytes. template inline arma_cold std::string diskio::gen_txt_header(const Mat&) { arma_type_check(( is_supported_elem_type::value == false )); const char* ARMA_MAT_TXT_IU001 = "ARMA_MAT_TXT_IU001"; const char* ARMA_MAT_TXT_IS001 = "ARMA_MAT_TXT_IS001"; const char* ARMA_MAT_TXT_IU002 = "ARMA_MAT_TXT_IU002"; const char* ARMA_MAT_TXT_IS002 = "ARMA_MAT_TXT_IS002"; const char* ARMA_MAT_TXT_IU004 = "ARMA_MAT_TXT_IU004"; const char* ARMA_MAT_TXT_IS004 = "ARMA_MAT_TXT_IS004"; const char* ARMA_MAT_TXT_IU008 = "ARMA_MAT_TXT_IU008"; const char* ARMA_MAT_TXT_IS008 = "ARMA_MAT_TXT_IS008"; const char* ARMA_MAT_TXT_FN004 = "ARMA_MAT_TXT_FN004"; const char* ARMA_MAT_TXT_FN008 = "ARMA_MAT_TXT_FN008"; const char* ARMA_MAT_TXT_FC008 = "ARMA_MAT_TXT_FC008"; const char* ARMA_MAT_TXT_FC016 = "ARMA_MAT_TXT_FC016"; char* header = nullptr; if( is_u8::value) { header = const_cast(ARMA_MAT_TXT_IU001); } else if( is_s8::value) { header = const_cast(ARMA_MAT_TXT_IS001); } else if( is_u16::value) { header = const_cast(ARMA_MAT_TXT_IU002); } else if( is_s16::value) { header = const_cast(ARMA_MAT_TXT_IS002); } else if( is_u32::value) { header = const_cast(ARMA_MAT_TXT_IU004); } else if( is_s32::value) { header = const_cast(ARMA_MAT_TXT_IS004); } else if( is_u64::value) { header = const_cast(ARMA_MAT_TXT_IU008); } else if( is_s64::value) { header = const_cast(ARMA_MAT_TXT_IS008); } else if(is_ulng_t_32::value) { header = const_cast(ARMA_MAT_TXT_IU004); } else if(is_slng_t_32::value) { header = const_cast(ARMA_MAT_TXT_IS004); } else if(is_ulng_t_64::value) { header = const_cast(ARMA_MAT_TXT_IU008); } else if(is_slng_t_64::value) { header = const_cast(ARMA_MAT_TXT_IS008); } else if( is_float::value) { header = const_cast(ARMA_MAT_TXT_FN004); } else if( is_double::value) { header = const_cast(ARMA_MAT_TXT_FN008); } else if( is_cx_float::value) { header = const_cast(ARMA_MAT_TXT_FC008); } else if(is_cx_double::value) { header = const_cast(ARMA_MAT_TXT_FC016); } return std::string(header); } //! Generate the first line of the header used for saving matrices in binary format. //! Format: "ARMA_MAT_BIN_ABXYZ". //! A is one of: I (for integral types) or F (for floating point types). //! B is one of: U (for unsigned types), S (for signed types), N (for not applicable) or C (for complex types). //! XYZ specifies the width of each element in terms of bytes, eg. "008" indicates eight bytes. template inline arma_cold std::string diskio::gen_bin_header(const Mat&) { arma_type_check(( is_supported_elem_type::value == false )); const char* ARMA_MAT_BIN_IU001 = "ARMA_MAT_BIN_IU001"; const char* ARMA_MAT_BIN_IS001 = "ARMA_MAT_BIN_IS001"; const char* ARMA_MAT_BIN_IU002 = "ARMA_MAT_BIN_IU002"; const char* ARMA_MAT_BIN_IS002 = "ARMA_MAT_BIN_IS002"; const char* ARMA_MAT_BIN_IU004 = "ARMA_MAT_BIN_IU004"; const char* ARMA_MAT_BIN_IS004 = "ARMA_MAT_BIN_IS004"; const char* ARMA_MAT_BIN_IU008 = "ARMA_MAT_BIN_IU008"; const char* ARMA_MAT_BIN_IS008 = "ARMA_MAT_BIN_IS008"; const char* ARMA_MAT_BIN_FN004 = "ARMA_MAT_BIN_FN004"; const char* ARMA_MAT_BIN_FN008 = "ARMA_MAT_BIN_FN008"; const char* ARMA_MAT_BIN_FC008 = "ARMA_MAT_BIN_FC008"; const char* ARMA_MAT_BIN_FC016 = "ARMA_MAT_BIN_FC016"; char* header = nullptr; if( is_u8::value) { header = const_cast(ARMA_MAT_BIN_IU001); } else if( is_s8::value) { header = const_cast(ARMA_MAT_BIN_IS001); } else if( is_u16::value) { header = const_cast(ARMA_MAT_BIN_IU002); } else if( is_s16::value) { header = const_cast(ARMA_MAT_BIN_IS002); } else if( is_u32::value) { header = const_cast(ARMA_MAT_BIN_IU004); } else if( is_s32::value) { header = const_cast(ARMA_MAT_BIN_IS004); } else if( is_u64::value) { header = const_cast(ARMA_MAT_BIN_IU008); } else if( is_s64::value) { header = const_cast(ARMA_MAT_BIN_IS008); } else if(is_ulng_t_32::value) { header = const_cast(ARMA_MAT_BIN_IU004); } else if(is_slng_t_32::value) { header = const_cast(ARMA_MAT_BIN_IS004); } else if(is_ulng_t_64::value) { header = const_cast(ARMA_MAT_BIN_IU008); } else if(is_slng_t_64::value) { header = const_cast(ARMA_MAT_BIN_IS008); } else if( is_float::value) { header = const_cast(ARMA_MAT_BIN_FN004); } else if( is_double::value) { header = const_cast(ARMA_MAT_BIN_FN008); } else if( is_cx_float::value) { header = const_cast(ARMA_MAT_BIN_FC008); } else if(is_cx_double::value) { header = const_cast(ARMA_MAT_BIN_FC016); } return std::string(header); } //! Generate the first line of the header used for saving matrices in binary format. //! Format: "ARMA_SPM_BIN_ABXYZ". //! A is one of: I (for integral types) or F (for floating point types). //! B is one of: U (for unsigned types), S (for signed types), N (for not applicable) or C (for complex types). //! XYZ specifies the width of each element in terms of bytes, eg. "008" indicates eight bytes. template inline arma_cold std::string diskio::gen_bin_header(const SpMat&) { arma_type_check(( is_supported_elem_type::value == false )); const char* ARMA_SPM_BIN_IU001 = "ARMA_SPM_BIN_IU001"; const char* ARMA_SPM_BIN_IS001 = "ARMA_SPM_BIN_IS001"; const char* ARMA_SPM_BIN_IU002 = "ARMA_SPM_BIN_IU002"; const char* ARMA_SPM_BIN_IS002 = "ARMA_SPM_BIN_IS002"; const char* ARMA_SPM_BIN_IU004 = "ARMA_SPM_BIN_IU004"; const char* ARMA_SPM_BIN_IS004 = "ARMA_SPM_BIN_IS004"; const char* ARMA_SPM_BIN_IU008 = "ARMA_SPM_BIN_IU008"; const char* ARMA_SPM_BIN_IS008 = "ARMA_SPM_BIN_IS008"; const char* ARMA_SPM_BIN_FN004 = "ARMA_SPM_BIN_FN004"; const char* ARMA_SPM_BIN_FN008 = "ARMA_SPM_BIN_FN008"; const char* ARMA_SPM_BIN_FC008 = "ARMA_SPM_BIN_FC008"; const char* ARMA_SPM_BIN_FC016 = "ARMA_SPM_BIN_FC016"; char* header = nullptr; if( is_u8::value) { header = const_cast(ARMA_SPM_BIN_IU001); } else if( is_s8::value) { header = const_cast(ARMA_SPM_BIN_IS001); } else if( is_u16::value) { header = const_cast(ARMA_SPM_BIN_IU002); } else if( is_s16::value) { header = const_cast(ARMA_SPM_BIN_IS002); } else if( is_u32::value) { header = const_cast(ARMA_SPM_BIN_IU004); } else if( is_s32::value) { header = const_cast(ARMA_SPM_BIN_IS004); } else if( is_u64::value) { header = const_cast(ARMA_SPM_BIN_IU008); } else if( is_s64::value) { header = const_cast(ARMA_SPM_BIN_IS008); } else if(is_ulng_t_32::value) { header = const_cast(ARMA_SPM_BIN_IU004); } else if(is_slng_t_32::value) { header = const_cast(ARMA_SPM_BIN_IS004); } else if(is_ulng_t_64::value) { header = const_cast(ARMA_SPM_BIN_IU008); } else if(is_slng_t_64::value) { header = const_cast(ARMA_SPM_BIN_IS008); } else if( is_float::value) { header = const_cast(ARMA_SPM_BIN_FN004); } else if( is_double::value) { header = const_cast(ARMA_SPM_BIN_FN008); } else if( is_cx_float::value) { header = const_cast(ARMA_SPM_BIN_FC008); } else if(is_cx_double::value) { header = const_cast(ARMA_SPM_BIN_FC016); } return std::string(header); } //! Generate the first line of the header used for saving cubes in text format. //! Format: "ARMA_CUB_TXT_ABXYZ". //! A is one of: I (for integral types) or F (for floating point types). //! B is one of: U (for unsigned types), S (for signed types), N (for not applicable) or C (for complex types). //! XYZ specifies the width of each element in terms of bytes, eg. "008" indicates eight bytes. template inline arma_cold std::string diskio::gen_txt_header(const Cube&) { arma_type_check(( is_supported_elem_type::value == false )); const char* ARMA_CUB_TXT_IU001 = "ARMA_CUB_TXT_IU001"; const char* ARMA_CUB_TXT_IS001 = "ARMA_CUB_TXT_IS001"; const char* ARMA_CUB_TXT_IU002 = "ARMA_CUB_TXT_IU002"; const char* ARMA_CUB_TXT_IS002 = "ARMA_CUB_TXT_IS002"; const char* ARMA_CUB_TXT_IU004 = "ARMA_CUB_TXT_IU004"; const char* ARMA_CUB_TXT_IS004 = "ARMA_CUB_TXT_IS004"; const char* ARMA_CUB_TXT_IU008 = "ARMA_CUB_TXT_IU008"; const char* ARMA_CUB_TXT_IS008 = "ARMA_CUB_TXT_IS008"; const char* ARMA_CUB_TXT_FN004 = "ARMA_CUB_TXT_FN004"; const char* ARMA_CUB_TXT_FN008 = "ARMA_CUB_TXT_FN008"; const char* ARMA_CUB_TXT_FC008 = "ARMA_CUB_TXT_FC008"; const char* ARMA_CUB_TXT_FC016 = "ARMA_CUB_TXT_FC016"; char* header = nullptr; if( is_u8::value) { header = const_cast(ARMA_CUB_TXT_IU001); } else if( is_s8::value) { header = const_cast(ARMA_CUB_TXT_IS001); } else if( is_u16::value) { header = const_cast(ARMA_CUB_TXT_IU002); } else if( is_s16::value) { header = const_cast(ARMA_CUB_TXT_IS002); } else if( is_u32::value) { header = const_cast(ARMA_CUB_TXT_IU004); } else if( is_s32::value) { header = const_cast(ARMA_CUB_TXT_IS004); } else if( is_u64::value) { header = const_cast(ARMA_CUB_TXT_IU008); } else if( is_s64::value) { header = const_cast(ARMA_CUB_TXT_IS008); } else if(is_ulng_t_32::value) { header = const_cast(ARMA_CUB_TXT_IU004); } else if(is_slng_t_32::value) { header = const_cast(ARMA_CUB_TXT_IS004); } else if(is_ulng_t_64::value) { header = const_cast(ARMA_CUB_TXT_IU008); } else if(is_slng_t_64::value) { header = const_cast(ARMA_CUB_TXT_IS008); } else if( is_float::value) { header = const_cast(ARMA_CUB_TXT_FN004); } else if( is_double::value) { header = const_cast(ARMA_CUB_TXT_FN008); } else if( is_cx_float::value) { header = const_cast(ARMA_CUB_TXT_FC008); } else if(is_cx_double::value) { header = const_cast(ARMA_CUB_TXT_FC016); } return std::string(header); } //! Generate the first line of the header used for saving cubes in binary format. //! Format: "ARMA_CUB_BIN_ABXYZ". //! A is one of: I (for integral types) or F (for floating point types). //! B is one of: U (for unsigned types), S (for signed types), N (for not applicable) or C (for complex types). //! XYZ specifies the width of each element in terms of bytes, eg. "008" indicates eight bytes. template inline arma_cold std::string diskio::gen_bin_header(const Cube&) { arma_type_check(( is_supported_elem_type::value == false )); const char* ARMA_CUB_BIN_IU001 = "ARMA_CUB_BIN_IU001"; const char* ARMA_CUB_BIN_IS001 = "ARMA_CUB_BIN_IS001"; const char* ARMA_CUB_BIN_IU002 = "ARMA_CUB_BIN_IU002"; const char* ARMA_CUB_BIN_IS002 = "ARMA_CUB_BIN_IS002"; const char* ARMA_CUB_BIN_IU004 = "ARMA_CUB_BIN_IU004"; const char* ARMA_CUB_BIN_IS004 = "ARMA_CUB_BIN_IS004"; const char* ARMA_CUB_BIN_IU008 = "ARMA_CUB_BIN_IU008"; const char* ARMA_CUB_BIN_IS008 = "ARMA_CUB_BIN_IS008"; const char* ARMA_CUB_BIN_FN004 = "ARMA_CUB_BIN_FN004"; const char* ARMA_CUB_BIN_FN008 = "ARMA_CUB_BIN_FN008"; const char* ARMA_CUB_BIN_FC008 = "ARMA_CUB_BIN_FC008"; const char* ARMA_CUB_BIN_FC016 = "ARMA_CUB_BIN_FC016"; char* header = nullptr; if( is_u8::value) { header = const_cast(ARMA_CUB_BIN_IU001); } else if( is_s8::value) { header = const_cast(ARMA_CUB_BIN_IS001); } else if( is_u16::value) { header = const_cast(ARMA_CUB_BIN_IU002); } else if( is_s16::value) { header = const_cast(ARMA_CUB_BIN_IS002); } else if( is_u32::value) { header = const_cast(ARMA_CUB_BIN_IU004); } else if( is_s32::value) { header = const_cast(ARMA_CUB_BIN_IS004); } else if( is_u64::value) { header = const_cast(ARMA_CUB_BIN_IU008); } else if( is_s64::value) { header = const_cast(ARMA_CUB_BIN_IS008); } else if(is_ulng_t_32::value) { header = const_cast(ARMA_CUB_BIN_IU004); } else if(is_slng_t_32::value) { header = const_cast(ARMA_CUB_BIN_IS004); } else if(is_ulng_t_64::value) { header = const_cast(ARMA_CUB_BIN_IU008); } else if(is_slng_t_64::value) { header = const_cast(ARMA_CUB_BIN_IS008); } else if( is_float::value) { header = const_cast(ARMA_CUB_BIN_FN004); } else if( is_double::value) { header = const_cast(ARMA_CUB_BIN_FN008); } else if( is_cx_float::value) { header = const_cast(ARMA_CUB_BIN_FC008); } else if(is_cx_double::value) { header = const_cast(ARMA_CUB_BIN_FC016); } return std::string(header); } inline arma_deprecated file_type diskio::guess_file_type(std::istream& f) { arma_extra_debug_sigprint(); return diskio::guess_file_type_internal(f); } inline arma_cold file_type diskio::guess_file_type_internal(std::istream& f) { arma_extra_debug_sigprint(); f.clear(); const std::fstream::pos_type pos1 = f.tellg(); f.clear(); f.seekg(0, ios::end); f.clear(); const std::fstream::pos_type pos2 = f.tellg(); const uword N_max = ( (pos1 >= 0) && (pos2 >= 0) && (pos2 > pos1) ) ? uword(pos2 - pos1) : uword(0); f.clear(); f.seekg(pos1); if(N_max == 0) { return file_type_unknown; } const uword N_use = (std::min)(N_max, uword(4096)); podarray data(N_use); data.zeros(); unsigned char* data_mem = data.memptr(); f.clear(); f.read( reinterpret_cast(data_mem), std::streamsize(N_use) ); const bool load_okay = f.good(); f.clear(); f.seekg(pos1); if(load_okay == false) { return file_type_unknown; } bool has_binary = false; bool has_bracket = false; bool has_comma = false; bool has_semicolon = false; for(uword i=0; i= 123) ) { has_binary = true; break; } // the range checking can be made more elaborate if( (val == '(') || (val == ')') ) { has_bracket = true; } if( (val == ';') ) { has_semicolon = true; } if( (val == ',') ) { has_comma = true; } } if(has_binary) { return raw_binary; } // ssv_ascii has to be before csv_ascii; // if the data has semicolons, it suggests a CSV file with semicolon as the separating character; // the semicolon may be used to allow the comma character to represent the decimal point (eg. 1,2345 vs 1.2345) if(has_semicolon && (has_bracket == false)) { return ssv_ascii; } if(has_comma && (has_bracket == false)) { return csv_ascii; } return raw_ascii; } //! Append a quasi-random string to the given filename. //! Avoiding use of rand() to preserve its state. inline arma_cold std::string diskio::gen_tmp_name(const std::string& x) { union { uword val; void* ptr; } u; u.val = uword(0); u.ptr = const_cast(&x); const u16 a = u16( (u.val >> 8) & 0xFFFF ); const u16 b = u16( (std::clock()) & 0xFFFF ); std::ostringstream ss; ss << x << ".tmp_"; ss.setf(std::ios_base::hex, std::ios_base::basefield); ss.width(4); ss.fill('0'); ss << a; ss.width(4); ss.fill('0'); ss << b; return ss.str(); } //! Safely rename a file. //! Before renaming, test if we can write to the final file. //! This should prevent: //! (i) overwriting files that are write protected, //! (ii) overwriting directories. inline arma_cold bool diskio::safe_rename(const std::string& old_name, const std::string& new_name) { const char* new_name_c_str = new_name.c_str(); std::fstream f(new_name_c_str, std::fstream::out | std::fstream::app); f.put(' '); if(f.good()) { f.close(); } else { return false; } if(std::remove( new_name_c_str) != 0) { return false; } if(std::rename(old_name.c_str(), new_name_c_str) != 0) { return false; } return true; } template inline bool diskio::convert_token(eT& val, const std::string& token) { const size_t N = size_t(token.length()); if(N == 0) { val = eT(0); return true; } const char* str = token.c_str(); if( (N == 3) || (N == 4) ) { const bool neg = (str[0] == '-'); const bool pos = (str[0] == '+'); const size_t offset = ( (neg || pos) && (N == 4) ) ? 1 : 0; const char sig_a = str[offset ]; const char sig_b = str[offset+1]; const char sig_c = str[offset+2]; if( ((sig_a == 'i') || (sig_a == 'I')) && ((sig_b == 'n') || (sig_b == 'N')) && ((sig_c == 'f') || (sig_c == 'F')) ) { val = neg ? cond_rel< is_signed::value >::make_neg(Datum::inf) : Datum::inf; return true; } else if( ((sig_a == 'n') || (sig_a == 'N')) && ((sig_b == 'a') || (sig_b == 'A')) && ((sig_c == 'n') || (sig_c == 'N')) ) { val = Datum::nan; return true; } } char* endptr = nullptr; if(is_real::value) { val = eT( std::strtod(str, &endptr) ); } else { if(is_signed::value) { // signed integer val = eT( std::strtoll(str, &endptr, 10) ); } else { // unsigned integer if((str[0] == '-') && (N >= 2)) { val = eT(0); if((str[1] == '-') || (str[1] == '+')) { return false; } const char* str_offset1 = &(str[1]); std::strtoull(str_offset1, &endptr, 10); if(str_offset1 == endptr) { return false; } return true; } val = eT( std::strtoull(str, &endptr, 10) ); } } if(str == endptr) { return false; } return true; } template inline bool diskio::convert_token(std::complex& val, const std::string& token) { const size_t N = size_t(token.length()); const size_t Nm1 = N-1; if(N == 0) { val = std::complex(0); return true; } const char* str = token.c_str(); // valid complex number formats: // (real,imag) // (real) // () if( (token[0] != '(') || (token[Nm1] != ')') ) { // no brackets, so treat the token as a non-complex number T val_real; const bool state = diskio::convert_token(val_real, token); // use the non-complex version of this function val = std::complex(val_real); return state; } // does the token contain only the () brackets? if(N <= 2) { val = std::complex(0); return true; } size_t comma_loc = 0; bool comma_found = false; for(size_t i=0; i(val_real); } else { const std::string token_real( &(str[1]), (comma_loc - 1 ) ); const std::string token_imag( &(str[comma_loc+1]), (Nm1 - 1 - comma_loc) ); T val_real; T val_imag; const bool state_real = diskio::convert_token(val_real, token_real); const bool state_imag = diskio::convert_token(val_imag, token_imag); state = (state_real && state_imag); val = std::complex(val_real, val_imag); } return state; } template inline std::streamsize diskio::prepare_stream(std::ostream& f) { std::streamsize cell_width = f.width(); if(is_real::value) { f.unsetf(ios::fixed); f.setf(ios::scientific); f.fill(' '); f.precision(16); cell_width = 24; // NOTE: for 'float' the optimum settings are f.precision(8) and cell_width = 15 // NOTE: however, to avoid introducing errors in case single precision data is loaded as double precision, // NOTE: the same settings must be used for both 'float' and 'double' } else if(is_cx::value) { f.unsetf(ios::fixed); f.setf(ios::scientific); f.precision(16); } return cell_width; } //! Save a matrix as raw text (no header, human readable). //! Matrices can be loaded in Matlab and Octave, as long as they don't have complex elements. template inline bool diskio::save_raw_ascii(const Mat& x, const std::string& final_name) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::fstream f(tmp_name.c_str(), std::fstream::out); bool save_okay = f.is_open(); if(save_okay) { save_okay = diskio::save_raw_ascii(x, f); f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } } return save_okay; } //! Save a matrix as raw text (no header, human readable). //! Matrices can be loaded in Matlab and Octave, as long as they don't have complex elements. template inline bool diskio::save_raw_ascii(const Mat& x, std::ostream& f) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(f); const std::streamsize cell_width = diskio::prepare_stream(f); for(uword row=0; row < x.n_rows; ++row) { for(uword col=0; col < x.n_cols; ++col) { f.put(' '); if(is_real::value) { f.width(cell_width); } arma_ostream::raw_print_elem(f, x.at(row,col)); } f.put('\n'); } const bool save_okay = f.good(); stream_state.restore(f); return save_okay; } //! Save a matrix as raw binary (no header) template inline bool diskio::save_raw_binary(const Mat& x, const std::string& final_name) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::ofstream f(tmp_name.c_str(), std::fstream::binary); bool save_okay = f.is_open(); if(save_okay) { save_okay = diskio::save_raw_binary(x, f); f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } } return save_okay; } template inline bool diskio::save_raw_binary(const Mat& x, std::ostream& f) { arma_extra_debug_sigprint(); f.write( reinterpret_cast(x.mem), std::streamsize(x.n_elem*sizeof(eT)) ); return f.good(); } //! Save a matrix in text format (human readable), //! with a header that indicates the matrix type as well as its dimensions template inline bool diskio::save_arma_ascii(const Mat& x, const std::string& final_name) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::ofstream f(tmp_name.c_str()); bool save_okay = f.is_open(); if(save_okay) { save_okay = diskio::save_arma_ascii(x, f); f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } } return save_okay; } //! Save a matrix in text format (human readable), //! with a header that indicates the matrix type as well as its dimensions template inline bool diskio::save_arma_ascii(const Mat& x, std::ostream& f) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(f); f << diskio::gen_txt_header(x) << '\n'; f << x.n_rows << ' ' << x.n_cols << '\n'; const std::streamsize cell_width = diskio::prepare_stream(f); for(uword row=0; row < x.n_rows; ++row) { for(uword col=0; col < x.n_cols; ++col) { f.put(' '); if(is_real::value) { f.width(cell_width); } arma_ostream::raw_print_elem(f, x.at(row,col)); } f.put('\n'); } const bool save_okay = f.good(); stream_state.restore(f); return save_okay; } //! Save a matrix in CSV text format (human readable) template inline bool diskio::save_csv_ascii(const Mat& x, const std::string& final_name, const field& header, const bool with_header, const char separator) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::ofstream f(tmp_name.c_str()); bool save_okay = f.is_open(); if(save_okay == false) { return false; } if(with_header) { arma_extra_debug_print("diskio::save_csv_ascii(): writing header"); for(uword i=0; i < header.n_elem; ++i) { f << header.at(i); if(i != (header.n_elem-1)) { f.put(separator); } } f.put('\n'); save_okay = f.good(); } if(save_okay) { save_okay = diskio::save_csv_ascii(x, f, separator); } f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } return save_okay; } //! Save a matrix in CSV text format (human readable) template inline bool diskio::save_csv_ascii(const Mat& x, std::ostream& f, const char separator) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(f); diskio::prepare_stream(f); uword x_n_rows = x.n_rows; uword x_n_cols = x.n_cols; for(uword row=0; row < x_n_rows; ++row) { for(uword col=0; col < x_n_cols; ++col) { arma_ostream::raw_print_elem(f, x.at(row,col)); if( col < (x_n_cols-1) ) { f.put(separator); } } f.put('\n'); } const bool save_okay = f.good(); stream_state.restore(f); return save_okay; } //! Save a matrix in CSV text format (human readable); complex numbers stored in "a+bi" format template inline bool diskio::save_csv_ascii(const Mat< std::complex >& x, std::ostream& f, const char separator) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const arma_ostream_state stream_state(f); diskio::prepare_stream(f); uword x_n_rows = x.n_rows; uword x_n_cols = x.n_cols; for(uword row=0; row < x_n_rows; ++row) { for(uword col=0; col < x_n_cols; ++col) { const eT& val = x.at(row,col); const T tmp_r = std::real(val); const T tmp_i = std::imag(val); const T tmp_i_abs = (tmp_i < T(0)) ? T(-tmp_i) : T(tmp_i); const char tmp_sign = (tmp_i < T(0)) ? char('-') : char('+'); arma_ostream::raw_print_elem(f, tmp_r ); f.put(tmp_sign); arma_ostream::raw_print_elem(f, tmp_i_abs); f.put('i'); if( col < (x_n_cols-1) ) { f.put(separator); } } f.put('\n'); } const bool save_okay = f.good(); stream_state.restore(f); return save_okay; } template inline bool diskio::save_coord_ascii(const Mat& x, const std::string& final_name) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::ofstream f(tmp_name.c_str()); bool save_okay = f.is_open(); if(save_okay) { save_okay = diskio::save_coord_ascii(x, f); f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } } return save_okay; } template inline bool diskio::save_coord_ascii(const Mat& x, std::ostream& f) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(f); diskio::prepare_stream(f); for(uword col=0; col < x.n_cols; ++col) for(uword row=0; row < x.n_rows; ++row) { const eT val = x.at(row,col); if(val != eT(0)) { f << row << ' ' << col << ' ' << val << '\n'; } } // make sure it's possible to figure out the matrix size later if( (x.n_rows > 0) && (x.n_cols > 0) ) { const uword max_row = (x.n_rows > 0) ? x.n_rows-1 : 0; const uword max_col = (x.n_cols > 0) ? x.n_cols-1 : 0; if( x.at(max_row, max_col) == eT(0) ) { f << max_row << ' ' << max_col << " 0\n"; } } const bool save_okay = f.good(); stream_state.restore(f); return save_okay; } template inline bool diskio::save_coord_ascii(const Mat< std::complex >& x, std::ostream& f) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const arma_ostream_state stream_state(f); diskio::prepare_stream(f); const eT eT_zero = eT(0); for(uword col=0; col < x.n_cols; ++col) for(uword row=0; row < x.n_rows; ++row) { const eT val = x.at(row,col); if(val != eT_zero) { f << row << ' ' << col << ' ' << val.real() << ' ' << val.imag() << '\n'; } } // make sure it's possible to figure out the matrix size later if( (x.n_rows > 0) && (x.n_cols > 0) ) { const uword max_row = (x.n_rows > 0) ? x.n_rows-1 : 0; const uword max_col = (x.n_cols > 0) ? x.n_cols-1 : 0; if( x.at(max_row, max_col) == eT_zero ) { f << max_row << ' ' << max_col << " 0 0\n"; } } const bool save_okay = f.good(); stream_state.restore(f); return save_okay; } //! Save a matrix in binary format, //! with a header that stores the matrix type as well as its dimensions template inline bool diskio::save_arma_binary(const Mat& x, const std::string& final_name) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::ofstream f(tmp_name.c_str(), std::fstream::binary); bool save_okay = f.is_open(); if(save_okay) { save_okay = diskio::save_arma_binary(x, f); f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } } return save_okay; } //! Save a matrix in binary format, //! with a header that stores the matrix type as well as its dimensions template inline bool diskio::save_arma_binary(const Mat& x, std::ostream& f) { arma_extra_debug_sigprint(); f << diskio::gen_bin_header(x) << '\n'; f << x.n_rows << ' ' << x.n_cols << '\n'; f.write( reinterpret_cast(x.mem), std::streamsize(x.n_elem*sizeof(eT)) ); return f.good(); } //! Save a matrix as a PGM greyscale image template inline bool diskio::save_pgm_binary(const Mat& x, const std::string& final_name) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::fstream f(tmp_name.c_str(), std::fstream::out | std::fstream::binary); bool save_okay = f.is_open(); if(save_okay) { save_okay = diskio::save_pgm_binary(x, f); f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } } return save_okay; } // // TODO: // add functionality to save the image in a normalised format, // ie. scaled so that every value falls in the [0,255] range. //! Save a matrix as a PGM greyscale image template inline bool diskio::save_pgm_binary(const Mat& x, std::ostream& f) { arma_extra_debug_sigprint(); f << "P5" << '\n'; f << x.n_cols << ' ' << x.n_rows << '\n'; f << 255 << '\n'; const uword n_elem = x.n_rows * x.n_cols; podarray tmp(n_elem); uword i = 0; for(uword row=0; row < x.n_rows; ++row) for(uword col=0; col < x.n_cols; ++col) { tmp[i] = u8( x.at(row,col) ); // TODO: add round() ? ++i; } f.write(reinterpret_cast(tmp.mem), std::streamsize(n_elem) ); return f.good(); } //! Save a matrix as a PGM greyscale image template inline bool diskio::save_pgm_binary(const Mat< std::complex >& x, const std::string& final_name) { arma_extra_debug_sigprint(); const uchar_mat tmp = conv_to::from(x); return diskio::save_pgm_binary(tmp, final_name); } //! Save a matrix as a PGM greyscale image template inline bool diskio::save_pgm_binary(const Mat< std::complex >& x, std::ostream& f) { arma_extra_debug_sigprint(); const uchar_mat tmp = conv_to::from(x); return diskio::save_pgm_binary(tmp, f); } //! Save a matrix as part of a HDF5 file template inline bool diskio::save_hdf5_binary(const Mat& x, const hdf5_name& spec, std::string& err_msg) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_HDF5) { hdf5_misc::hdf5_suspend_printing_errors hdf5_print_suspender; bool save_okay = false; const bool append = bool(spec.opts.flags & hdf5_opts::flag_append); const bool replace = bool(spec.opts.flags & hdf5_opts::flag_replace); const bool use_existing_file = ((append || replace) && (arma_H5Fis_hdf5(spec.filename.c_str()) > 0)); const std::string tmp_name = (use_existing_file) ? std::string() : diskio::gen_tmp_name(spec.filename); // Set up the file according to HDF5's preferences hid_t file = (use_existing_file) ? arma_H5Fopen(spec.filename.c_str(), H5F_ACC_RDWR, H5P_DEFAULT) : arma_H5Fcreate(tmp_name.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if(file < 0) { return false; } // We need to create a dataset, datatype, and dataspace hsize_t dims[2]; dims[1] = x.n_rows; dims[0] = x.n_cols; hid_t dataspace = arma_H5Screate_simple(2, dims, NULL); // treat the matrix as a 2d array dataspace hid_t datatype = hdf5_misc::get_hdf5_type(); // If this returned something invalid, well, it's time to crash. arma_check(datatype == -1, "Mat::save(): unknown datatype for HDF5"); // MATLAB forces the users to specify a name at save time for HDF5; // Octave will use the default of 'dataset' unless otherwise specified. // If the user hasn't specified a dataset name, we will use 'dataset' // We may have to split out the group name from the dataset name. std::vector groups; std::string full_name = spec.dsname; size_t loc; while((loc = full_name.find("/")) != std::string::npos) { // Create another group... if(loc != 0) // Ignore the first /, if there is a leading /. { hid_t gid = arma_H5Gcreate((groups.size() == 0) ? file : groups[groups.size() - 1], full_name.substr(0, loc).c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if((gid < 0) && use_existing_file) { gid = arma_H5Gopen((groups.size() == 0) ? file : groups[groups.size() - 1], full_name.substr(0, loc).c_str(), H5P_DEFAULT); } groups.push_back(gid); } full_name = full_name.substr(loc + 1); } const std::string dataset_name = full_name.empty() ? std::string("dataset") : full_name; const hid_t last_group = (groups.size() == 0) ? file : groups[groups.size() - 1]; if(use_existing_file && replace) { arma_H5Ldelete(last_group, dataset_name.c_str(), H5P_DEFAULT); // NOTE: H5Ldelete() in HDF5 v1.8 doesn't reclaim the deleted space; use h5repack to reclaim space: h5repack oldfile.h5 newfile.h5 // NOTE: has this behaviour changed in HDF5 1.10 ? // NOTE: https://lists.hdfgroup.org/pipermail/hdf-forum_lists.hdfgroup.org/2017-August/010482.html // NOTE: https://lists.hdfgroup.org/pipermail/hdf-forum_lists.hdfgroup.org/2017-August/010486.html } hid_t dataset = arma_H5Dcreate(last_group, dataset_name.c_str(), datatype, dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if(dataset < 0) { save_okay = false; err_msg = "couldn't create dataset"; } else { save_okay = (arma_H5Dwrite(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, x.mem) >= 0); arma_H5Dclose(dataset); } arma_H5Tclose(datatype); arma_H5Sclose(dataspace); for(size_t i = 0; i < groups.size(); ++i) { arma_H5Gclose(groups[i]); } arma_H5Fclose(file); if((use_existing_file == false) && (save_okay == true)) { save_okay = diskio::safe_rename(tmp_name, spec.filename); } return save_okay; } #else { arma_ignore(x); arma_ignore(spec); arma_ignore(err_msg); arma_stop_logic_error("Mat::save(): use of HDF5 must be enabled"); return false; } #endif } //! Load a matrix as raw text (no header, human readable). //! Can read matrices saved as text in Matlab and Octave. //! NOTE: this is much slower than reading a file with a header. template inline bool diskio::load_raw_ascii(Mat& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); std::fstream f; f.open(name.c_str(), std::fstream::in); bool load_okay = f.is_open(); if(load_okay) { load_okay = diskio::load_raw_ascii(x, f, err_msg); f.close(); } return load_okay; } //! Load a matrix as raw text (no header, human readable). //! Can read matrices saved as text in Matlab and Octave. //! NOTE: this is much slower than reading a file with a header. template inline bool diskio::load_raw_ascii(Mat& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); bool load_okay = f.good(); f.clear(); const std::fstream::pos_type pos1 = f.tellg(); // // work out the size uword f_n_rows = 0; uword f_n_cols = 0; bool f_n_cols_found = false; std::string line_string; std::stringstream line_stream; std::string token; while( f.good() && load_okay ) { std::getline(f, line_string); // TODO: does it make sense to stop processing the file if an empty line is found ? if(line_string.size() == 0) { break; } line_stream.clear(); line_stream.str(line_string); uword line_n_cols = 0; while(line_stream >> token) { ++line_n_cols; } if(f_n_cols_found == false) { f_n_cols = line_n_cols; f_n_cols_found = true; } else { if(line_n_cols != f_n_cols) { load_okay = false; err_msg = "inconsistent number of columns"; } } ++f_n_rows; } if(load_okay) { f.clear(); f.seekg(pos1); try { x.set_size(f_n_rows, f_n_cols); } catch(...) { err_msg = "not enough memory"; return false; } for(uword row=0; ((row < x.n_rows) && load_okay); ++row) for(uword col=0; ((col < x.n_cols) && load_okay); ++col) { f >> token; if(diskio::convert_token(x.at(row,col), token) == false) { load_okay = false; err_msg = "couldn't interpret data"; } } } // an empty file indicates an empty matrix if( (f_n_cols_found == false) && (load_okay == true) ) { x.reset(); } return load_okay; } //! Load a matrix in binary format (no header); //! the matrix is assumed to have one column template inline bool diskio::load_raw_binary(Mat& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); std::ifstream f; f.open(name.c_str(), std::fstream::binary); bool load_okay = f.is_open(); if(load_okay) { load_okay = diskio::load_raw_binary(x, f, err_msg); f.close(); } return load_okay; } template inline bool diskio::load_raw_binary(Mat& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); f.clear(); const std::streampos pos1 = f.tellg(); f.clear(); f.seekg(0, ios::end); f.clear(); const std::streampos pos2 = f.tellg(); const uword N = ( (pos1 >= 0) && (pos2 >= 0) ) ? uword(pos2 - pos1) : 0; f.clear(); //f.seekg(0, ios::beg); f.seekg(pos1); try { x.set_size(N / uword(sizeof(eT)), 1); } catch(...) { err_msg = "not enough memory"; return false; } f.clear(); f.read( reinterpret_cast(x.memptr()), std::streamsize(x.n_elem * uword(sizeof(eT))) ); return f.good(); } //! Load a matrix in text format (human readable), //! with a header that indicates the matrix type as well as its dimensions template inline bool diskio::load_arma_ascii(Mat& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); std::ifstream f(name.c_str()); bool load_okay = f.is_open(); if(load_okay) { load_okay = diskio::load_arma_ascii(x, f, err_msg); f.close(); } return load_okay; } //! Load a matrix in text format (human readable), //! with a header that indicates the matrix type as well as its dimensions template inline bool diskio::load_arma_ascii(Mat& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); std::streampos pos = f.tellg(); bool load_okay = true; std::string f_header; uword f_n_rows; uword f_n_cols; f >> f_header; f >> f_n_rows; f >> f_n_cols; if(f_header == diskio::gen_txt_header(x)) { try { x.zeros(f_n_rows, f_n_cols); } catch(...) { err_msg = "not enough memory"; return false; } std::string token; for(uword row=0; row < x.n_rows; ++row) for(uword col=0; col < x.n_cols; ++col) { f >> token; diskio::convert_token( x.at(row,col), token ); } load_okay = f.good(); } else { load_okay = false; err_msg = "incorrect header"; } // allow automatic conversion of u32/s32 matrices into u64/s64 matrices if(load_okay == false) { if( (sizeof(eT) == 8) && is_same_type::yes ) { Mat tmp; std::string junk; f.clear(); f.seekg(pos); load_okay = diskio::load_arma_ascii(tmp, f, junk); if(load_okay) { x = conv_to< Mat >::from(tmp); } } else if( (sizeof(eT) == 8) && is_same_type::yes ) { Mat tmp; std::string junk; f.clear(); f.seekg(pos); load_okay = diskio::load_arma_ascii(tmp, f, junk); if(load_okay) { x = conv_to< Mat >::from(tmp); } } } return load_okay; } //! Load a matrix in CSV text format (human readable) template inline bool diskio::load_csv_ascii(Mat& x, const std::string& name, std::string& err_msg, field& header, const bool with_header, const char separator) { arma_extra_debug_sigprint(); std::fstream f; f.open(name.c_str(), std::fstream::in); bool load_okay = f.is_open(); if(load_okay == false) { return false; } if(with_header) { arma_extra_debug_print("diskio::load_csv_ascii(): reading header"); std::string header_line; std::stringstream header_stream; std::vector header_tokens; std::getline(f, header_line); load_okay = f.good(); if(load_okay) { std::string token; header_stream.clear(); header_stream.str(header_line); uword header_n_tokens = 0; while(header_stream.good()) { std::getline(header_stream, token, separator); ++header_n_tokens; header_tokens.push_back(token); } if(header_n_tokens == uword(0)) { header.reset(); } else { header.set_size(1,header_n_tokens); for(uword i=0; i < header_n_tokens; ++i) { header.at(i) = header_tokens[i]; } } } } if(load_okay) { load_okay = diskio::load_csv_ascii(x, f, err_msg, separator); } f.close(); return load_okay; } //! Load a matrix in CSV text format (human readable) template inline bool diskio::load_csv_ascii(Mat& x, std::istream& f, std::string& err_msg, const char separator) { arma_extra_debug_sigprint(); // TODO: replace with more efficient implementation if(f.good() == false) { return false; } f.clear(); const std::fstream::pos_type pos1 = f.tellg(); // // work out the size uword f_n_rows = 0; uword f_n_cols = 0; std::string line_string; std::stringstream line_stream; std::string token; while(f.good()) { std::getline(f, line_string); if(line_string.size() == 0) { break; } line_stream.clear(); line_stream.str(line_string); uword line_n_cols = 0; while(line_stream.good()) { std::getline(line_stream, token, separator); ++line_n_cols; } if(f_n_cols < line_n_cols) { f_n_cols = line_n_cols; } ++f_n_rows; } f.clear(); f.seekg(pos1); try { x.zeros(f_n_rows, f_n_cols); } catch(...) { err_msg = "not enough memory"; return false; } const bool use_mp = (arma_config::openmp) && (f_n_rows >= 2) && (f_n_cols >= 64); field token_array; bool token_array_ok = false; if(use_mp) { try { token_array.set_size(f_n_cols); for(uword i=0; i < f_n_cols; ++i) { token_array(i).reserve(32); } token_array_ok = true; } catch(...) { token_array.reset(); } } if(use_mp && token_array_ok) { #if defined(ARMA_USE_OPENMP) { uword row = 0; while(f.good()) { std::getline(f, line_string); if(line_string.size() == 0) { break; } line_stream.clear(); line_stream.str(line_string); for(uword i=0; i < f_n_cols; ++i) { token_array(i).clear(); } uword line_stream_col = 0; while(line_stream.good()) { std::getline(line_stream, token_array(line_stream_col), separator); ++line_stream_col; } const int n_threads = mp_thread_limit::get(); #pragma omp parallel for schedule(static) num_threads(n_threads) for(uword col=0; col < line_stream_col; ++col) { diskio::convert_token( x.at(row,col), token_array(col) ); } ++row; } } #endif } else // serial implementation { uword row = 0; while(f.good()) { std::getline(f, line_string); if(line_string.size() == 0) { break; } line_stream.clear(); line_stream.str(line_string); uword col = 0; while(line_stream.good()) { std::getline(line_stream, token, separator); diskio::convert_token( x.at(row,col), token ); ++col; } ++row; } } return true; } //! Load a matrix in CSV text format (human readable); complex numbers stored in "a+bi" format template inline bool diskio::load_csv_ascii(Mat< std::complex >& x, std::istream& f, std::string& err_msg, const char separator) { arma_extra_debug_sigprint(); // TODO: replace with more efficient implementation if(f.good() == false) { return false; } f.clear(); const std::fstream::pos_type pos1 = f.tellg(); // // work out the size uword f_n_rows = 0; uword f_n_cols = 0; std::string line_string; std::stringstream line_stream; std::string token; while(f.good()) { std::getline(f, line_string); if(line_string.size() == 0) { break; } line_stream.clear(); line_stream.str(line_string); uword line_n_cols = 0; while(line_stream.good()) { std::getline(line_stream, token, separator); ++line_n_cols; } if(f_n_cols < line_n_cols) { f_n_cols = line_n_cols; } ++f_n_rows; } f.clear(); f.seekg(pos1); try { x.zeros(f_n_rows, f_n_cols); } catch(...) { err_msg = "not enough memory"; return false; } uword row = 0; std::string str_real; std::string str_imag; while(f.good()) { std::getline(f, line_string); if(line_string.size() == 0) { break; } line_stream.clear(); line_stream.str(line_string); uword col = 0; while(line_stream.good()) { std::getline(line_stream, token, separator); // remove spaces and tabs if(token.length() > 0) { const char c_front = token.front(); const char c_back = token.back(); if( (c_front == ' ') || (c_front == '\t') || (c_back == ' ') || (c_back == '\t') ) { token.erase(std::remove_if(token.begin(), token.end(), [](char c) { return ((c == ' ') || (c == '\t')); }), token.end()); } } const size_t token_len = size_t( token.length() ); if(token_len == 0) { col++; continue; } // handle special cases: inf and nan, without the imaginary part if( (token_len == 3) || (token_len == 4) ) { const char* str = token.c_str(); const bool neg = (str[0] == '-'); const bool pos = (str[0] == '+'); const size_t offset = ( (neg || pos) && (token_len == 4) ) ? 1 : 0; const char sig_a = str[offset ]; const char sig_b = str[offset+1]; const char sig_c = str[offset+2]; bool found_val_real = false; T val_real = T(0); if( ((sig_a == 'i') || (sig_a == 'I')) && ((sig_b == 'n') || (sig_b == 'N')) && ((sig_c == 'f') || (sig_c == 'F')) ) { val_real = (neg) ? -(Datum::inf) : Datum::inf; found_val_real = true; } else if( ((sig_a == 'n') || (sig_a == 'N')) && ((sig_b == 'a') || (sig_b == 'A')) && ((sig_c == 'n') || (sig_c == 'N')) ) { val_real = Datum::nan; found_val_real = true; } if(found_val_real) { x.at(row,col) = std::complex(val_real, T(0)); col++; continue; // get next token } } bool found_x = false; std::string::size_type loc_x = 0; // location of the separator (+ or -) between the real and imaginary part std::string::size_type loc_i = token.find_last_of('i'); // location of the imaginary part indicator if(loc_i == std::string::npos) { str_real = token; str_imag.clear(); } else { bool found_plus = false; bool found_minus = false; std::string::size_type loc_plus = token.find_last_of('+'); if(loc_plus != std::string::npos) { if(loc_plus >= 1) { const char prev_char = token.at(loc_plus-1); // make sure we're not looking at the sign of the exponent if( (prev_char != 'e') && (prev_char != 'E') ) { found_plus = true; } else { // search again, omitting the exponent loc_plus = token.find_last_of('+', loc_plus-1); if(loc_plus != std::string::npos) { found_plus = true; } } } else { // loc_plus == 0, meaning we're at the start of the string found_plus = true; } } std::string::size_type loc_minus = token.find_last_of('-'); if(loc_minus != std::string::npos) { if(loc_minus >= 1) { const char prev_char = token.at(loc_minus-1); // make sure we're not looking at the sign of the exponent if( (prev_char != 'e') && (prev_char != 'E') ) { found_minus = true; } else { // search again, omitting the exponent loc_minus = token.find_last_of('-', loc_minus-1); if(loc_minus != std::string::npos) { found_minus = true; } } } else { // loc_minus == 0, meaning we're at the start of the string found_minus = true; } } if(found_plus && found_minus) { if( (loc_i > loc_plus) && (loc_i > loc_minus) ) { // choose the sign closest to the "i" to be the separator between the real and imaginary part loc_x = ( (loc_i - loc_plus) < (loc_i - loc_minus) ) ? loc_plus : loc_minus; found_x = true; } } else if(found_plus ) { loc_x = loc_plus; found_x = true; } else if(found_minus) { loc_x = loc_minus; found_x = true; } if(found_x) { if( loc_x > 0 ) { str_real = token.substr(0,loc_x); } else { str_real.clear(); } if((loc_x+1) < token.size()) { str_imag = token.substr(loc_x, token.size()-loc_x-1); } else { str_imag.clear(); } } else { str_real.clear(); str_imag.clear(); } } T val_real = T(0); T val_imag = T(0); diskio::convert_token(val_real, str_real); diskio::convert_token(val_imag, str_imag); x.at(row,col) = std::complex(val_real, val_imag); ++col; } ++row; } return true; } template inline bool diskio::load_coord_ascii(Mat& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); std::fstream f; f.open(name.c_str(), std::fstream::in); bool load_okay = f.is_open(); if(load_okay == false) { return false; } if(load_okay) { load_okay = diskio::load_coord_ascii(x, f, err_msg); } f.close(); return load_okay; } //! Load a matrix in CSV text format (human readable) template inline bool diskio::load_coord_ascii(Mat& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); if(f.good() == false) { return false; } f.clear(); const std::fstream::pos_type pos1 = f.tellg(); // work out the size uword f_n_rows = 0; uword f_n_cols = 0; bool size_found = false; std::string line_string; std::stringstream line_stream; std::string token; while(f.good()) { std::getline(f, line_string); if(line_string.size() == 0) { break; } line_stream.clear(); line_stream.str(line_string); uword line_row = 0; uword line_col = 0; // a valid line in co-ord format has at least 2 entries line_stream >> line_row; if(line_stream.good() == false) { err_msg = "incorrect format"; return false; } line_stream >> line_col; size_found = true; if(f_n_rows < line_row) { f_n_rows = line_row; } if(f_n_cols < line_col) { f_n_cols = line_col; } } // take into account that indices start at 0 if(size_found) { ++f_n_rows; ++f_n_cols; } f.clear(); f.seekg(pos1); try { Mat tmp(f_n_rows, f_n_cols, arma_zeros_indicator()); while(f.good()) { std::getline(f, line_string); if(line_string.size() == 0) { break; } line_stream.clear(); line_stream.str(line_string); uword line_row = 0; uword line_col = 0; line_stream >> line_row; line_stream >> line_col; eT val = eT(0); line_stream >> token; if(line_stream.fail() == false) { diskio::convert_token( val, token ); } if(val != eT(0)) { tmp(line_row,line_col) = val; } } x.steal_mem(tmp); } catch(...) { err_msg = "not enough memory"; return false; } return true; } template inline bool diskio::load_coord_ascii(Mat< std::complex >& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); if(f.good() == false) { return false; } f.clear(); const std::fstream::pos_type pos1 = f.tellg(); // work out the size uword f_n_rows = 0; uword f_n_cols = 0; bool size_found = false; std::string line_string; std::stringstream line_stream; std::string token_real; std::string token_imag; while(f.good()) { std::getline(f, line_string); if(line_string.size() == 0) { break; } line_stream.clear(); line_stream.str(line_string); uword line_row = 0; uword line_col = 0; // a valid line in co-ord format has at least 2 entries line_stream >> line_row; if(line_stream.good() == false) { err_msg = "incorrect format"; return false; } line_stream >> line_col; size_found = true; if(f_n_rows < line_row) f_n_rows = line_row; if(f_n_cols < line_col) f_n_cols = line_col; } // take into account that indices start at 0 if(size_found) { ++f_n_rows; ++f_n_cols; } f.clear(); f.seekg(pos1); try { Mat< std::complex > tmp(f_n_rows, f_n_cols, arma_zeros_indicator()); while(f.good()) { std::getline(f, line_string); if(line_string.size() == 0) { break; } line_stream.clear(); line_stream.str(line_string); uword line_row = 0; uword line_col = 0; line_stream >> line_row; line_stream >> line_col; T val_real = T(0); T val_imag = T(0); line_stream >> token_real; if(line_stream.fail() == false) { diskio::convert_token( val_real, token_real ); } line_stream >> token_imag; if(line_stream.fail() == false) { diskio::convert_token( val_imag, token_imag ); } if( (val_real != T(0)) || (val_imag != T(0)) ) { tmp(line_row,line_col) = std::complex(val_real, val_imag); } } x.steal_mem(tmp); } catch(...) { err_msg = "not enough memory"; return false; } return true; } //! Load a matrix in binary format, //! with a header that indicates the matrix type as well as its dimensions template inline bool diskio::load_arma_binary(Mat& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); std::ifstream f; f.open(name.c_str(), std::fstream::binary); bool load_okay = f.is_open(); if(load_okay) { load_okay = diskio::load_arma_binary(x, f, err_msg); f.close(); } return load_okay; } template inline bool diskio::load_arma_binary(Mat& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); std::streampos pos = f.tellg(); bool load_okay = true; std::string f_header; uword f_n_rows; uword f_n_cols; f >> f_header; f >> f_n_rows; f >> f_n_cols; if(f_header == diskio::gen_bin_header(x)) { //f.seekg(1, ios::cur); // NOTE: this may not be portable, as on a Windows machine a newline could be two characters f.get(); try { x.set_size(f_n_rows,f_n_cols); } catch(...) { err_msg = "not enough memory"; return false; } f.read( reinterpret_cast(x.memptr()), std::streamsize(x.n_elem*sizeof(eT)) ); load_okay = f.good(); } else { load_okay = false; err_msg = "incorrect header"; } // allow automatic conversion of u32/s32 matrices into u64/s64 matrices if(load_okay == false) { if( (sizeof(eT) == 8) && is_same_type::yes ) { Mat tmp; std::string junk; f.clear(); f.seekg(pos); load_okay = diskio::load_arma_binary(tmp, f, junk); if(load_okay) { x = conv_to< Mat >::from(tmp); } } else if( (sizeof(eT) == 8) && is_same_type::yes ) { Mat tmp; std::string junk; f.clear(); f.seekg(pos); load_okay = diskio::load_arma_binary(tmp, f, junk); if(load_okay) { x = conv_to< Mat >::from(tmp); } } } return load_okay; } inline void diskio::pnm_skip_comments(std::istream& f) { while( isspace(f.peek()) ) { while( isspace(f.peek()) ) { f.get(); } if(f.peek() == '#') { while( (f.peek() != '\r') && (f.peek() != '\n') ) { f.get(); } } } } //! Load a PGM greyscale image as a matrix template inline bool diskio::load_pgm_binary(Mat& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); std::fstream f; f.open(name.c_str(), std::fstream::in | std::fstream::binary); bool load_okay = f.is_open(); if(load_okay) { load_okay = diskio::load_pgm_binary(x, f, err_msg); f.close(); } return load_okay; } //! Load a PGM greyscale image as a matrix template inline bool diskio::load_pgm_binary(Mat& x, std::istream& f, std::string& err_msg) { bool load_okay = true; std::string f_header; f >> f_header; if(f_header == "P5") { uword f_n_rows = 0; uword f_n_cols = 0; int f_maxval = 0; diskio::pnm_skip_comments(f); f >> f_n_cols; diskio::pnm_skip_comments(f); f >> f_n_rows; diskio::pnm_skip_comments(f); f >> f_maxval; f.get(); if( (f_maxval > 0) && (f_maxval <= 65535) ) { try { x.set_size(f_n_rows,f_n_cols); } catch(...) { err_msg = "not enough memory"; return false; } if(f_maxval <= 255) { const uword n_elem = f_n_cols*f_n_rows; podarray tmp(n_elem); f.read( reinterpret_cast(tmp.memptr()), std::streamsize(n_elem) ); uword i = 0; //cout << "f_n_cols = " << f_n_cols << endl; //cout << "f_n_rows = " << f_n_rows << endl; for(uword row=0; row < f_n_rows; ++row) for(uword col=0; col < f_n_cols; ++col) { x.at(row,col) = eT(tmp[i]); ++i; } } else { const uword n_elem = f_n_cols*f_n_rows; podarray tmp(n_elem); f.read( reinterpret_cast(tmp.memptr()), std::streamsize(n_elem*2) ); uword i = 0; for(uword row=0; row < f_n_rows; ++row) for(uword col=0; col < f_n_cols; ++col) { x.at(row,col) = eT(tmp[i]); ++i; } } } else { load_okay = false; err_msg = "functionality unimplemented"; } if(f.good() == false) { load_okay = false; } } else { load_okay = false; err_msg = "unsupported header"; } return load_okay; } //! Load a PGM greyscale image as a matrix template inline bool diskio::load_pgm_binary(Mat< std::complex >& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); uchar_mat tmp; const bool load_okay = diskio::load_pgm_binary(tmp, name, err_msg); x = conv_to< Mat< std::complex > >::from(tmp); return load_okay; } //! Load a PGM greyscale image as a matrix template inline bool diskio::load_pgm_binary(Mat< std::complex >& x, std::istream& is, std::string& err_msg) { arma_extra_debug_sigprint(); uchar_mat tmp; const bool load_okay = diskio::load_pgm_binary(tmp, is, err_msg); x = conv_to< Mat< std::complex > >::from(tmp); return load_okay; } //! Load a HDF5 file as a matrix template inline bool diskio::load_hdf5_binary(Mat& x, const hdf5_name& spec, std::string& err_msg) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_HDF5) { hdf5_misc::hdf5_suspend_printing_errors hdf5_print_suspender; bool load_okay = false; hid_t fid = arma_H5Fopen(spec.filename.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT); if(fid >= 0) { // MATLAB HDF5 dataset names are user-specified; // Octave tends to store the datasets in a group, with the actual dataset being referred to as "value". // If the user hasn't specified a dataset, we will search for "dataset" and "value", // and if those are not found we will take the first dataset we do find. std::vector searchNames; const bool exact = (spec.dsname.empty() == false); if(exact) { searchNames.push_back(spec.dsname); } else { searchNames.push_back("dataset"); searchNames.push_back("value" ); } hid_t dataset = hdf5_misc::search_hdf5_file(searchNames, fid, 2, exact); if(dataset >= 0) { hid_t filespace = arma_H5Dget_space(dataset); // This must be <= 2 due to our search rules. const int ndims = arma_H5Sget_simple_extent_ndims(filespace); hsize_t dims[2]; const herr_t query_status = arma_H5Sget_simple_extent_dims(filespace, dims, NULL); // arma_check(query_status < 0, "Mat::load(): cannot get size of HDF5 dataset"); if(query_status < 0) { err_msg = "cannot get size of HDF5 dataset"; arma_H5Sclose(filespace); arma_H5Dclose(dataset); arma_H5Fclose(fid); return false; } if(ndims == 1) { dims[1] = 1; } // Vector case; fake second dimension (one column). try { x.set_size(dims[1], dims[0]); } catch(...) { err_msg = "not enough memory"; return false; } // Now we have to see what type is stored to figure out how to load it. hid_t datatype = arma_H5Dget_type(dataset); hid_t mat_type = hdf5_misc::get_hdf5_type(); // If these are the same type, it is simple. if(arma_H5Tequal(datatype, mat_type) > 0) { // Load directly; H5S_ALL used so that we load the entire dataset. hid_t read_status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(x.memptr())); if(read_status >= 0) { load_okay = true; } } else { // Load into another array and convert its type accordingly. hid_t read_status = hdf5_misc::load_and_convert_hdf5(x.memptr(), dataset, datatype, x.n_elem); if(read_status >= 0) { load_okay = true; } } // Now clean up. arma_H5Tclose(datatype); arma_H5Tclose(mat_type); arma_H5Sclose(filespace); } arma_H5Dclose(dataset); arma_H5Fclose(fid); if(load_okay == false) { err_msg = "unsupported or missing HDF5 data"; } } else { err_msg = "cannot open"; } return load_okay; } #else { arma_ignore(x); arma_ignore(spec); arma_ignore(err_msg); arma_stop_logic_error("Mat::load(): use of HDF5 must be enabled"); return false; } #endif } //! Try to load a matrix by automatically determining its type template inline bool diskio::load_auto_detect(Mat& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_HDF5) // We're currently using the C bindings for the HDF5 library, which don't support C++ streams if( arma_H5Fis_hdf5(name.c_str()) ) { return load_hdf5_binary(x, name, err_msg); } #endif std::fstream f; f.open(name.c_str(), std::fstream::in | std::fstream::binary); bool load_okay = f.is_open(); if(load_okay) { load_okay = diskio::load_auto_detect(x, f, err_msg); f.close(); } return load_okay; } //! Try to load a matrix by automatically determining its type template inline bool diskio::load_auto_detect(Mat& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); const char* ARMA_MAT_TXT_str = "ARMA_MAT_TXT"; const char* ARMA_MAT_BIN_str = "ARMA_MAT_BIN"; const char* P5_str = "P5"; const uword ARMA_MAT_TXT_len = uword(12); const uword ARMA_MAT_BIN_len = uword(12); const uword P5_len = uword(2); podarray header(ARMA_MAT_TXT_len + 1); char* header_mem = header.memptr(); std::streampos pos = f.tellg(); f.read( header_mem, std::streamsize(ARMA_MAT_TXT_len) ); f.clear(); f.seekg(pos); header_mem[ARMA_MAT_TXT_len] = '\0'; if( std::strncmp(ARMA_MAT_TXT_str, header_mem, size_t(ARMA_MAT_TXT_len)) == 0 ) { return load_arma_ascii(x, f, err_msg); } else if( std::strncmp(ARMA_MAT_BIN_str, header_mem, size_t(ARMA_MAT_BIN_len)) == 0 ) { return load_arma_binary(x, f, err_msg); } else if( std::strncmp(P5_str, header_mem, size_t(P5_len)) == 0 ) { return load_pgm_binary(x, f, err_msg); } else { const file_type ft = guess_file_type_internal(f); switch(ft) { case csv_ascii: return load_csv_ascii(x, f, err_msg, char(',')); break; case ssv_ascii: return load_csv_ascii(x, f, err_msg, char(';')); break; case raw_binary: return load_raw_binary(x, f, err_msg); break; case raw_ascii: return load_raw_ascii(x, f, err_msg); break; default: err_msg = "unknown data"; return false; } } return false; } // // sparse matrices // //! Save a sparse matrix in CSV format template inline bool diskio::save_csv_ascii(const SpMat& x, const std::string& final_name, const field& header, const bool with_header, const char separator) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::ofstream f(tmp_name.c_str()); bool save_okay = f.is_open(); if(save_okay == false) { return false; } if(with_header) { arma_extra_debug_print("diskio::save_csv_ascii(): writing header"); for(uword i=0; i < header.n_elem; ++i) { f << header(i); if(i != (header.n_elem-1)) { f.put(separator); } } f.put('\n'); save_okay = f.good(); } if(save_okay) { save_okay = diskio::save_csv_ascii(x, f, separator); } f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } return save_okay; } //! Save a sparse matrix in CSV format template inline bool diskio::save_csv_ascii(const SpMat& x, std::ostream& f, const char separator) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(f); diskio::prepare_stream(f); x.sync(); uword x_n_rows = x.n_rows; uword x_n_cols = x.n_cols; for(uword row=0; row < x_n_rows; ++row) { for(uword col=0; col < x_n_cols; ++col) { const eT val = x.at(row,col); if(val != eT(0)) { arma_ostream::raw_print_elem(f, val); } if( col < (x_n_cols-1) ) { f.put(separator); } } f.put('\n'); } const bool save_okay = f.good(); stream_state.restore(f); return save_okay; } //! Save a sparse matrix in CSV format (complex numbers) template inline bool diskio::save_csv_ascii(const SpMat< std::complex >& x, std::ostream& f, const char separator) { arma_extra_debug_sigprint(); arma_ignore(x); arma_ignore(f); arma_ignore(separator); arma_debug_warn_level(1, "saving complex sparse matrices as csv_ascii not yet implemented"); return false; } //! Save a matrix in ASCII coord format template inline bool diskio::save_coord_ascii(const SpMat& x, const std::string& final_name) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::ofstream f(tmp_name.c_str()); bool save_okay = f.is_open(); if(save_okay) { save_okay = diskio::save_coord_ascii(x, f); f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } } return save_okay; } //! Save a matrix in ASCII coord format template inline bool diskio::save_coord_ascii(const SpMat& x, std::ostream& f) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(f); diskio::prepare_stream(f); typename SpMat::const_iterator iter = x.begin(); typename SpMat::const_iterator iter_end = x.end(); for(; iter != iter_end; ++iter) { const eT val = (*iter); f << iter.row() << ' ' << iter.col() << ' ' << val << '\n'; } // make sure it's possible to figure out the matrix size later if( (x.n_rows > 0) && (x.n_cols > 0) ) { const uword max_row = (x.n_rows > 0) ? x.n_rows-1 : 0; const uword max_col = (x.n_cols > 0) ? x.n_cols-1 : 0; if( x.at(max_row, max_col) == eT(0) ) { f << max_row << ' ' << max_col << " 0\n"; } } const bool save_okay = f.good(); stream_state.restore(f); return save_okay; } //! Save a matrix in ASCII coord format (complex numbers) template inline bool diskio::save_coord_ascii(const SpMat< std::complex >& x, std::ostream& f) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const arma_ostream_state stream_state(f); diskio::prepare_stream(f); typename SpMat::const_iterator iter = x.begin(); typename SpMat::const_iterator iter_end = x.end(); for(; iter != iter_end; ++iter) { const eT val = (*iter); f << iter.row() << ' ' << iter.col() << ' ' << val.real() << ' ' << val.imag() << '\n'; } // make sure it's possible to figure out the matrix size later if( (x.n_rows > 0) && (x.n_cols > 0) ) { const uword max_row = (x.n_rows > 0) ? x.n_rows-1 : 0; const uword max_col = (x.n_cols > 0) ? x.n_cols-1 : 0; if( x.at(max_row, max_col) == eT(0) ) { f << max_row << ' ' << max_col << " 0 0\n"; } } const bool save_okay = f.good(); stream_state.restore(f); return save_okay; } //! Save a matrix in binary format, //! with a header that stores the matrix type as well as its dimensions template inline bool diskio::save_arma_binary(const SpMat& x, const std::string& final_name) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::ofstream f(tmp_name.c_str(), std::fstream::binary); bool save_okay = f.is_open(); if(save_okay) { save_okay = diskio::save_arma_binary(x, f); f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } } return save_okay; } //! Save a matrix in binary format, //! with a header that stores the matrix type as well as its dimensions template inline bool diskio::save_arma_binary(const SpMat& x, std::ostream& f) { arma_extra_debug_sigprint(); f << diskio::gen_bin_header(x) << '\n'; f << x.n_rows << ' ' << x.n_cols << ' ' << x.n_nonzero << '\n'; f.write( reinterpret_cast(x.values), std::streamsize(x.n_nonzero*sizeof(eT)) ); f.write( reinterpret_cast(x.row_indices), std::streamsize(x.n_nonzero*sizeof(uword)) ); f.write( reinterpret_cast(x.col_ptrs), std::streamsize((x.n_cols+1)*sizeof(uword)) ); return f.good(); } template inline bool diskio::load_csv_ascii(SpMat& x, const std::string& name, std::string& err_msg, field& header, const bool with_header, const char separator) { arma_extra_debug_sigprint(); std::fstream f; f.open(name.c_str(), std::fstream::in); bool load_okay = f.is_open(); if(load_okay == false) { return false; } if(with_header) { arma_extra_debug_print("diskio::load_csv_ascii(): reading header"); std::string header_line; std::stringstream header_stream; std::vector header_tokens; std::getline(f, header_line); load_okay = f.good(); if(load_okay) { std::string token; header_stream.clear(); header_stream.str(header_line); uword header_n_tokens = 0; while(header_stream.good()) { std::getline(header_stream, token, separator); ++header_n_tokens; header_tokens.push_back(token); } if(header_n_tokens == uword(0)) { header.reset(); } else { header.set_size(1,header_n_tokens); for(uword i=0; i < header_n_tokens; ++i) { header.at(i) = header_tokens[i]; } } } } if(load_okay) { load_okay = diskio::load_csv_ascii(x, f, err_msg, separator); } f.close(); return load_okay; } template inline bool diskio::load_csv_ascii(SpMat& x, std::istream& f, std::string& err_msg, const char separator) { arma_extra_debug_sigprint(); // TODO: replace with more efficient implementation if(f.good() == false) { return false; } f.clear(); const std::fstream::pos_type pos1 = f.tellg(); // // work out the size uword f_n_rows = 0; uword f_n_cols = 0; std::string line_string; std::stringstream line_stream; std::string token; while(f.good()) { std::getline(f, line_string); if(line_string.size() == 0) { break; } line_stream.clear(); line_stream.str(line_string); uword line_n_cols = 0; while(line_stream.good()) { std::getline(line_stream, token, separator); ++line_n_cols; } if(f_n_cols < line_n_cols) { f_n_cols = line_n_cols; } ++f_n_rows; } f.clear(); f.seekg(pos1); try { MapMat tmp(f_n_rows, f_n_cols); uword row = 0; while(f.good()) { std::getline(f, line_string); if(line_string.size() == 0) { break; } line_stream.clear(); line_stream.str(line_string); uword col = 0; while(line_stream.good()) { std::getline(line_stream, token, separator); eT val = eT(0); diskio::convert_token( val, token ); if(val != eT(0)) { tmp(row,col) = val; } ++col; } ++row; } x = tmp; } catch(...) { err_msg = "not enough memory"; return false; } return true; } template inline bool diskio::load_csv_ascii(SpMat< std::complex >& x, std::istream& f, std::string& err_msg, const char separator) { arma_extra_debug_sigprint(); arma_ignore(x); arma_ignore(f); arma_ignore(err_msg); arma_ignore(separator); arma_debug_warn_level(1, "loading complex sparse matrices as csv_ascii not yet implemented"); return false; } template inline bool diskio::load_coord_ascii(SpMat& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); std::fstream f; f.open(name.c_str(), std::fstream::in | std::fstream::binary); bool load_okay = f.is_open(); if(load_okay) { load_okay = diskio::load_coord_ascii(x, f, err_msg); f.close(); } return load_okay; } template inline bool diskio::load_coord_ascii(SpMat& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); if(f.good() == false) { return false; } f.clear(); const std::fstream::pos_type pos1 = f.tellg(); // work out the size uword f_n_rows = 0; uword f_n_cols = 0; bool size_found = false; std::string line_string; std::stringstream line_stream; std::string token; while(f.good()) { std::getline(f, line_string); if(line_string.size() == 0) { break; } line_stream.clear(); line_stream.str(line_string); uword line_row = 0; uword line_col = 0; // a valid line in co-ord format has at least 2 entries line_stream >> line_row; if(line_stream.good() == false) { err_msg = "incorrect format"; return false; } line_stream >> line_col; size_found = true; if(f_n_rows < line_row) { f_n_rows = line_row; } if(f_n_cols < line_col) { f_n_cols = line_col; } } // take into account that indices start at 0 if(size_found) { ++f_n_rows; ++f_n_cols; } f.clear(); f.seekg(pos1); try { MapMat tmp(f_n_rows, f_n_cols); while(f.good()) { std::getline(f, line_string); if(line_string.size() == 0) { break; } line_stream.clear(); line_stream.str(line_string); uword line_row = 0; uword line_col = 0; line_stream >> line_row; line_stream >> line_col; eT val = eT(0); line_stream >> token; if(line_stream.fail() == false) { diskio::convert_token( val, token ); } if(val != eT(0)) { tmp(line_row,line_col) = val; } } x = tmp; } catch(...) { err_msg = "not enough memory"; return false; } return true; } template inline bool diskio::load_coord_ascii(SpMat< std::complex >& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); if(f.good() == false) { return false; } f.clear(); const std::fstream::pos_type pos1 = f.tellg(); // work out the size uword f_n_rows = 0; uword f_n_cols = 0; bool size_found = false; std::string line_string; std::stringstream line_stream; std::string token_real; std::string token_imag; while(f.good()) { std::getline(f, line_string); if(line_string.size() == 0) { break; } line_stream.clear(); line_stream.str(line_string); uword line_row = 0; uword line_col = 0; // a valid line in co-ord format has at least 2 entries line_stream >> line_row; if(line_stream.good() == false) { err_msg = "incorrect format"; return false; } line_stream >> line_col; size_found = true; if(f_n_rows < line_row) f_n_rows = line_row; if(f_n_cols < line_col) f_n_cols = line_col; } // take into account that indices start at 0 if(size_found) { ++f_n_rows; ++f_n_cols; } f.clear(); f.seekg(pos1); try { MapMat< std::complex > tmp(f_n_rows, f_n_cols); while(f.good()) { std::getline(f, line_string); if(line_string.size() == 0) { break; } line_stream.clear(); line_stream.str(line_string); uword line_row = 0; uword line_col = 0; line_stream >> line_row; line_stream >> line_col; T val_real = T(0); T val_imag = T(0); line_stream >> token_real; if(line_stream.fail() == false) { diskio::convert_token( val_real, token_real ); } line_stream >> token_imag; if(line_stream.fail() == false) { diskio::convert_token( val_imag, token_imag ); } if( (val_real != T(0)) || (val_imag != T(0)) ) { tmp(line_row,line_col) = std::complex(val_real, val_imag); } } x = tmp; } catch(...) { err_msg = "not enough memory"; return false; } return true; } //! Load a matrix in binary format, //! with a header that indicates the matrix type as well as its dimensions template inline bool diskio::load_arma_binary(SpMat& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); std::ifstream f; f.open(name.c_str(), std::fstream::binary); bool load_okay = f.is_open(); if(load_okay) { load_okay = diskio::load_arma_binary(x, f, err_msg); f.close(); } return load_okay; } template inline bool diskio::load_arma_binary(SpMat& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); bool load_okay = true; std::string f_header; f >> f_header; if(f_header == diskio::gen_bin_header(x)) { uword f_n_rows; uword f_n_cols; uword f_n_nz; f >> f_n_rows; f >> f_n_cols; f >> f_n_nz; //f.seekg(1, ios::cur); // NOTE: this may not be portable, as on a Windows machine a newline could be two characters f.get(); try { x.reserve(f_n_rows, f_n_cols, f_n_nz); } catch(...) { err_msg = "not enough memory"; return false; } f.read( reinterpret_cast(access::rwp(x.values)), std::streamsize(x.n_nonzero*sizeof(eT)) ); std::streampos pos = f.tellg(); f.read( reinterpret_cast(access::rwp(x.row_indices)), std::streamsize(x.n_nonzero*sizeof(uword)) ); f.read( reinterpret_cast(access::rwp(x.col_ptrs)), std::streamsize((x.n_cols+1)*sizeof(uword)) ); bool check1 = true; for(uword i=0; i < x.n_nonzero; ++i) { if(x.values[i] == eT(0)) { check1 = false; break; } } bool check2 = true; for(uword i=0; i < x.n_cols; ++i) { if(x.col_ptrs[i+1] < x.col_ptrs[i]) { check2 = false; break; } } bool check3 = (x.col_ptrs[x.n_cols] == x.n_nonzero); if((check1 == true) && ((check2 == false) || (check3 == false))) { if(sizeof(uword) == 8) { arma_extra_debug_print("detected inconsistent data while loading; re-reading integer parts as u32"); // inconstency could be due to a different uword size used during saving, // so try loading the row_indices and col_ptrs under the assumption of 32 bit unsigned integers f.clear(); f.seekg(pos); podarray tmp_a(x.n_nonzero ); tmp_a.zeros(); podarray tmp_b(x.n_cols + 1); tmp_b.zeros(); f.read( reinterpret_cast(tmp_a.memptr()), std::streamsize( x.n_nonzero * sizeof(u32)) ); f.read( reinterpret_cast(tmp_b.memptr()), std::streamsize((x.n_cols + 1) * sizeof(u32)) ); check2 = true; for(uword i=0; i < x.n_cols; ++i) { if(tmp_b[i+1] < tmp_b[i]) { check2 = false; break; } } check3 = (tmp_b[x.n_cols] == x.n_nonzero); load_okay = f.good(); if( load_okay && (check2 == true) && (check3 == true) ) { arma_extra_debug_print("reading integer parts as u32 succeeded"); arrayops::convert(access::rwp(x.row_indices), tmp_a.memptr(), x.n_nonzero ); arrayops::convert(access::rwp(x.col_ptrs), tmp_b.memptr(), x.n_cols + 1); } else { arma_extra_debug_print("reading integer parts as u32 failed"); } } } if((check1 == false) || (check2 == false) || (check3 == false)) { load_okay = false; err_msg = "inconsistent data"; } else { load_okay = f.good(); } } else { load_okay = false; err_msg = "incorrect header"; } return load_okay; } // cubes //! Save a cube as raw text (no header, human readable). template inline bool diskio::save_raw_ascii(const Cube& x, const std::string& final_name) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::fstream f(tmp_name.c_str(), std::fstream::out); bool save_okay = f.is_open(); if(save_okay) { save_okay = save_raw_ascii(x, f); f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } } return save_okay; } //! Save a cube as raw text (no header, human readable). template inline bool diskio::save_raw_ascii(const Cube& x, std::ostream& f) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(f); const std::streamsize cell_width = diskio::prepare_stream(f); for(uword slice=0; slice < x.n_slices; ++slice) { for(uword row=0; row < x.n_rows; ++row) { for(uword col=0; col < x.n_cols; ++col) { f.put(' '); if(is_real::value) { f.width(cell_width); } arma_ostream::raw_print_elem(f, x.at(row,col,slice)); } f.put('\n'); } } const bool save_okay = f.good(); stream_state.restore(f); return save_okay; } //! Save a cube as raw binary (no header) template inline bool diskio::save_raw_binary(const Cube& x, const std::string& final_name) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::ofstream f(tmp_name.c_str(), std::fstream::binary); bool save_okay = f.is_open(); if(save_okay) { save_okay = diskio::save_raw_binary(x, f); f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } } return save_okay; } template inline bool diskio::save_raw_binary(const Cube& x, std::ostream& f) { arma_extra_debug_sigprint(); f.write( reinterpret_cast(x.mem), std::streamsize(x.n_elem*sizeof(eT)) ); return f.good(); } //! Save a cube in text format (human readable), //! with a header that indicates the cube type as well as its dimensions template inline bool diskio::save_arma_ascii(const Cube& x, const std::string& final_name) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::ofstream f(tmp_name.c_str()); bool save_okay = f.is_open(); if(save_okay) { save_okay = diskio::save_arma_ascii(x, f); f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } } return save_okay; } //! Save a cube in text format (human readable), //! with a header that indicates the cube type as well as its dimensions template inline bool diskio::save_arma_ascii(const Cube& x, std::ostream& f) { arma_extra_debug_sigprint(); const arma_ostream_state stream_state(f); f << diskio::gen_txt_header(x) << '\n'; f << x.n_rows << ' ' << x.n_cols << ' ' << x.n_slices << '\n'; const std::streamsize cell_width = diskio::prepare_stream(f); for(uword slice=0; slice < x.n_slices; ++slice) { for(uword row=0; row < x.n_rows; ++row) { for(uword col=0; col < x.n_cols; ++col) { f.put(' '); if(is_real::value) { f.width(cell_width); } arma_ostream::raw_print_elem(f, x.at(row,col,slice)); } f.put('\n'); } } const bool save_okay = f.good(); stream_state.restore(f); return save_okay; } //! Save a cube in binary format, //! with a header that stores the cube type as well as its dimensions template inline bool diskio::save_arma_binary(const Cube& x, const std::string& final_name) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::ofstream f(tmp_name.c_str(), std::fstream::binary); bool save_okay = f.is_open(); if(save_okay) { save_okay = diskio::save_arma_binary(x, f); f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } } return save_okay; } //! Save a cube in binary format, //! with a header that stores the cube type as well as its dimensions template inline bool diskio::save_arma_binary(const Cube& x, std::ostream& f) { arma_extra_debug_sigprint(); f << diskio::gen_bin_header(x) << '\n'; f << x.n_rows << ' ' << x.n_cols << ' ' << x.n_slices << '\n'; f.write( reinterpret_cast(x.mem), std::streamsize(x.n_elem*sizeof(eT)) ); return f.good(); } //! Save a cube as part of a HDF5 file template inline bool diskio::save_hdf5_binary(const Cube& x, const hdf5_name& spec, std::string& err_msg) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_HDF5) { hdf5_misc::hdf5_suspend_printing_errors hdf5_print_suspender; bool save_okay = false; const bool append = bool(spec.opts.flags & hdf5_opts::flag_append); const bool replace = bool(spec.opts.flags & hdf5_opts::flag_replace); const bool use_existing_file = ((append || replace) && (arma_H5Fis_hdf5(spec.filename.c_str()) > 0)); const std::string tmp_name = (use_existing_file) ? std::string() : diskio::gen_tmp_name(spec.filename); // Set up the file according to HDF5's preferences hid_t file = (use_existing_file) ? arma_H5Fopen(spec.filename.c_str(), H5F_ACC_RDWR, H5P_DEFAULT) : arma_H5Fcreate(tmp_name.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if(file < 0) { return false; } // We need to create a dataset, datatype, and dataspace hsize_t dims[3]; dims[2] = x.n_rows; dims[1] = x.n_cols; dims[0] = x.n_slices; hid_t dataspace = arma_H5Screate_simple(3, dims, NULL); // treat the cube as a 3d array dataspace hid_t datatype = hdf5_misc::get_hdf5_type(); // If this returned something invalid, well, it's time to crash. arma_check(datatype == -1, "Cube::save(): unknown datatype for HDF5"); // MATLAB forces the users to specify a name at save time for HDF5; // Octave will use the default of 'dataset' unless otherwise specified. // If the user hasn't specified a dataset name, we will use 'dataset' // We may have to split out the group name from the dataset name. std::vector groups; std::string full_name = spec.dsname; size_t loc; while((loc = full_name.find("/")) != std::string::npos) { // Create another group... if(loc != 0) // Ignore the first /, if there is a leading /. { hid_t gid = arma_H5Gcreate((groups.size() == 0) ? file : groups[groups.size() - 1], full_name.substr(0, loc).c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if((gid < 0) && use_existing_file) { gid = arma_H5Gopen((groups.size() == 0) ? file : groups[groups.size() - 1], full_name.substr(0, loc).c_str(), H5P_DEFAULT); } groups.push_back(gid); } full_name = full_name.substr(loc + 1); } const std::string dataset_name = full_name.empty() ? std::string("dataset") : full_name; const hid_t last_group = (groups.size() == 0) ? file : groups[groups.size() - 1]; if(use_existing_file && replace) { arma_H5Ldelete(last_group, dataset_name.c_str(), H5P_DEFAULT); // NOTE: H5Ldelete() in HDF5 v1.8 doesn't reclaim the deleted space; use h5repack to reclaim space: h5repack oldfile.h5 newfile.h5 // NOTE: has this behaviour changed in HDF5 1.10 ? // NOTE: https://lists.hdfgroup.org/pipermail/hdf-forum_lists.hdfgroup.org/2017-August/010482.html // NOTE: https://lists.hdfgroup.org/pipermail/hdf-forum_lists.hdfgroup.org/2017-August/010486.html } hid_t dataset = arma_H5Dcreate(last_group, dataset_name.c_str(), datatype, dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if(dataset < 0) { save_okay = false; err_msg = "couldn't create dataset"; } else { save_okay = (arma_H5Dwrite(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, x.mem) >= 0); arma_H5Dclose(dataset); } arma_H5Tclose(datatype); arma_H5Sclose(dataspace); for(size_t i = 0; i < groups.size(); ++i) { arma_H5Gclose(groups[i]); } arma_H5Fclose(file); if((use_existing_file == false) && (save_okay == true)) { save_okay = diskio::safe_rename(tmp_name, spec.filename); } return save_okay; } #else { arma_ignore(x); arma_ignore(spec); arma_ignore(err_msg); arma_stop_logic_error("Cube::save(): use of HDF5 must be enabled"); return false; } #endif } //! Load a cube as raw text (no header, human readable). //! NOTE: this is much slower than reading a file with a header. template inline bool diskio::load_raw_ascii(Cube& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); Mat tmp; const bool load_okay = diskio::load_raw_ascii(tmp, name, err_msg); if(load_okay) { if(tmp.is_empty() == false) { try { x.set_size(tmp.n_rows, tmp.n_cols, 1); } catch(...) { err_msg = "not enough memory"; return false; } x.slice(0) = tmp; } else { x.reset(); } } return load_okay; } //! Load a cube as raw text (no header, human readable). //! NOTE: this is much slower than reading a file with a header. template inline bool diskio::load_raw_ascii(Cube& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); Mat tmp; const bool load_okay = diskio::load_raw_ascii(tmp, f, err_msg); if(load_okay) { if(tmp.is_empty() == false) { try { x.set_size(tmp.n_rows, tmp.n_cols, 1); } catch(...) { err_msg = "not enough memory"; return false; } x.slice(0) = tmp; } else { x.reset(); } } return load_okay; } //! Load a cube in binary format (no header); //! the cube is assumed to have one slice with one column template inline bool diskio::load_raw_binary(Cube& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); std::ifstream f; f.open(name.c_str(), std::fstream::binary); bool load_okay = f.is_open(); if(load_okay) { load_okay = diskio::load_raw_binary(x, f, err_msg); f.close(); } return load_okay; } template inline bool diskio::load_raw_binary(Cube& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); f.clear(); const std::streampos pos1 = f.tellg(); f.clear(); f.seekg(0, ios::end); f.clear(); const std::streampos pos2 = f.tellg(); const uword N = ( (pos1 >= 0) && (pos2 >= 0) ) ? uword(pos2 - pos1) : 0; f.clear(); //f.seekg(0, ios::beg); f.seekg(pos1); try { x.set_size(N / uword(sizeof(eT)), 1, 1); } catch(...) { err_msg = "not enough memory"; return false; } f.clear(); f.read( reinterpret_cast(x.memptr()), std::streamsize(x.n_elem * uword(sizeof(eT))) ); return f.good(); } //! Load a cube in text format (human readable), //! with a header that indicates the cube type as well as its dimensions template inline bool diskio::load_arma_ascii(Cube& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); std::ifstream f(name.c_str()); bool load_okay = f.is_open(); if(load_okay) { load_okay = diskio::load_arma_ascii(x, f, err_msg); f.close(); } return load_okay; } //! Load a cube in text format (human readable), //! with a header that indicates the cube type as well as its dimensions template inline bool diskio::load_arma_ascii(Cube& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); std::streampos pos = f.tellg(); bool load_okay = true; std::string f_header; uword f_n_rows; uword f_n_cols; uword f_n_slices; f >> f_header; f >> f_n_rows; f >> f_n_cols; f >> f_n_slices; if(f_header == diskio::gen_txt_header(x)) { try { x.set_size(f_n_rows, f_n_cols, f_n_slices); } catch(...) { err_msg = "not enough memory"; return false; } for(uword slice = 0; slice < x.n_slices; ++slice) for(uword row = 0; row < x.n_rows; ++row ) for(uword col = 0; col < x.n_cols; ++col ) { f >> x.at(row,col,slice); } load_okay = f.good(); } else { load_okay = false; err_msg = "incorrect header"; } // allow automatic conversion of u32/s32 cubes into u64/s64 cubes if(load_okay == false) { if( (sizeof(eT) == 8) && is_same_type::yes ) { Cube tmp; std::string junk; f.clear(); f.seekg(pos); load_okay = diskio::load_arma_ascii(tmp, f, junk); if(load_okay) { x = conv_to< Cube >::from(tmp); } } else if( (sizeof(eT) == 8) && is_same_type::yes ) { Cube tmp; std::string junk; f.clear(); f.seekg(pos); load_okay = diskio::load_arma_ascii(tmp, f, junk); if(load_okay) { x = conv_to< Cube >::from(tmp); } } } return load_okay; } //! Load a cube in binary format, //! with a header that indicates the cube type as well as its dimensions template inline bool diskio::load_arma_binary(Cube& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); std::ifstream f; f.open(name.c_str(), std::fstream::binary); bool load_okay = f.is_open(); if(load_okay) { load_okay = diskio::load_arma_binary(x, f, err_msg); f.close(); } return load_okay; } template inline bool diskio::load_arma_binary(Cube& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); std::streampos pos = f.tellg(); bool load_okay = true; std::string f_header; uword f_n_rows; uword f_n_cols; uword f_n_slices; f >> f_header; f >> f_n_rows; f >> f_n_cols; f >> f_n_slices; if(f_header == diskio::gen_bin_header(x)) { //f.seekg(1, ios::cur); // NOTE: this may not be portable, as on a Windows machine a newline could be two characters f.get(); try { x.set_size(f_n_rows, f_n_cols, f_n_slices); } catch(...) { err_msg = "not enough memory"; return false; } f.read( reinterpret_cast(x.memptr()), std::streamsize(x.n_elem*sizeof(eT)) ); load_okay = f.good(); } else { load_okay = false; err_msg = "incorrect header"; } // allow automatic conversion of u32/s32 cubes into u64/s64 cubes if(load_okay == false) { if( (sizeof(eT) == 8) && is_same_type::yes ) { Cube tmp; std::string junk; f.clear(); f.seekg(pos); load_okay = diskio::load_arma_binary(tmp, f, junk); if(load_okay) { x = conv_to< Cube >::from(tmp); } } else if( (sizeof(eT) == 8) && is_same_type::yes ) { Cube tmp; std::string junk; f.clear(); f.seekg(pos); load_okay = diskio::load_arma_binary(tmp, f, junk); if(load_okay) { x = conv_to< Cube >::from(tmp); } } } return load_okay; } //! Load a HDF5 file as a cube template inline bool diskio::load_hdf5_binary(Cube& x, const hdf5_name& spec, std::string& err_msg) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_HDF5) { hdf5_misc::hdf5_suspend_printing_errors hdf5_print_suspender; bool load_okay = false; hid_t fid = arma_H5Fopen(spec.filename.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT); if(fid >= 0) { // MATLAB HDF5 dataset names are user-specified; // Octave tends to store the datasets in a group, with the actual dataset being referred to as "value". // If the user hasn't specified a dataset, we will search for "dataset" and "value", // and if those are not found we will take the first dataset we do find. std::vector searchNames; const bool exact = (spec.dsname.empty() == false); if(exact) { searchNames.push_back(spec.dsname); } else { searchNames.push_back("dataset"); searchNames.push_back("value" ); } hid_t dataset = hdf5_misc::search_hdf5_file(searchNames, fid, 3, exact); if(dataset >= 0) { hid_t filespace = arma_H5Dget_space(dataset); // This must be <= 3 due to our search rules. const int ndims = arma_H5Sget_simple_extent_ndims(filespace); hsize_t dims[3]; const herr_t query_status = arma_H5Sget_simple_extent_dims(filespace, dims, NULL); // arma_check(query_status < 0, "Cube::load(): cannot get size of HDF5 dataset"); if(query_status < 0) { err_msg = "cannot get size of HDF5 dataset"; arma_H5Sclose(filespace); arma_H5Dclose(dataset); arma_H5Fclose(fid); return false; } if(ndims == 1) { dims[1] = 1; dims[2] = 1; } // Vector case; one row/colum, several slices if(ndims == 2) { dims[2] = 1; } // Matrix case; one column, several rows/slices try { x.set_size(dims[2], dims[1], dims[0]); } catch(...) { err_msg = "not enough memory"; return false; } // Now we have to see what type is stored to figure out how to load it. hid_t datatype = arma_H5Dget_type(dataset); hid_t mat_type = hdf5_misc::get_hdf5_type(); // If these are the same type, it is simple. if(arma_H5Tequal(datatype, mat_type) > 0) { // Load directly; H5S_ALL used so that we load the entire dataset. hid_t read_status = arma_H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, void_ptr(x.memptr())); if(read_status >= 0) { load_okay = true; } } else { // Load into another array and convert its type accordingly. hid_t read_status = hdf5_misc::load_and_convert_hdf5(x.memptr(), dataset, datatype, x.n_elem); if(read_status >= 0) { load_okay = true; } } // Now clean up. arma_H5Tclose(datatype); arma_H5Tclose(mat_type); arma_H5Sclose(filespace); } arma_H5Dclose(dataset); arma_H5Fclose(fid); if(load_okay == false) { err_msg = "unsupported or missing HDF5 data"; } } else { err_msg = "cannot open"; } return load_okay; } #else { arma_ignore(x); arma_ignore(spec); arma_ignore(err_msg); arma_stop_logic_error("Cube::load(): use of HDF5 must be enabled"); return false; } #endif } //! Try to load a cube by automatically determining its type template inline bool diskio::load_auto_detect(Cube& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_HDF5) // We're currently using the C bindings for the HDF5 library, which don't support C++ streams if( arma_H5Fis_hdf5(name.c_str()) ) { return load_hdf5_binary(x, name, err_msg); } #endif std::fstream f; f.open(name.c_str(), std::fstream::in | std::fstream::binary); bool load_okay = f.is_open(); if(load_okay) { load_okay = diskio::load_auto_detect(x, f, err_msg); f.close(); } return load_okay; } //! Try to load a cube by automatically determining its type template inline bool diskio::load_auto_detect(Cube& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); const char* ARMA_CUB_TXT_str = "ARMA_CUB_TXT"; const char* ARMA_CUB_BIN_str = "ARMA_CUB_BIN"; const char* P6_str = "P6"; const uword ARMA_CUB_TXT_len = uword(12); const uword ARMA_CUB_BIN_len = uword(12); const uword P6_len = uword(2); podarray header(ARMA_CUB_TXT_len + 1); char* header_mem = header.memptr(); std::streampos pos = f.tellg(); f.read( header_mem, std::streamsize(ARMA_CUB_TXT_len) ); f.clear(); f.seekg(pos); header_mem[ARMA_CUB_TXT_len] = '\0'; if( std::strncmp(ARMA_CUB_TXT_str, header_mem, size_t(ARMA_CUB_TXT_len)) == 0 ) { return load_arma_ascii(x, f, err_msg); } else if( std::strncmp(ARMA_CUB_BIN_str, header_mem, size_t(ARMA_CUB_BIN_len)) == 0 ) { return load_arma_binary(x, f, err_msg); } else if( std::strncmp(P6_str, header_mem, size_t(P6_len)) == 0 ) { return load_ppm_binary(x, f, err_msg); } else { const file_type ft = guess_file_type_internal(f); switch(ft) { // case csv_ascii: // return load_csv_ascii(x, f, err_msg); // break; case raw_binary: return load_raw_binary(x, f, err_msg); break; case raw_ascii: return load_raw_ascii(x, f, err_msg); break; default: err_msg = "unknown data"; return false; } } return false; } // fields template inline bool diskio::save_arma_binary(const field& x, const std::string& final_name) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::ofstream f( tmp_name.c_str(), std::fstream::binary ); bool save_okay = f.is_open(); if(save_okay) { save_okay = diskio::save_arma_binary(x, f); f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } } return save_okay; } template inline bool diskio::save_arma_binary(const field& x, std::ostream& f) { arma_extra_debug_sigprint(); arma_type_check(( (is_Mat::value == false) && (is_Cube::value == false) )); if(x.n_slices <= 1) { f << "ARMA_FLD_BIN" << '\n'; f << x.n_rows << '\n'; f << x.n_cols << '\n'; } else { f << "ARMA_FL3_BIN" << '\n'; f << x.n_rows << '\n'; f << x.n_cols << '\n'; f << x.n_slices << '\n'; } bool save_okay = true; for(uword i=0; i inline bool diskio::load_arma_binary(field& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); std::ifstream f( name.c_str(), std::fstream::binary ); bool load_okay = f.is_open(); if(load_okay) { load_okay = diskio::load_arma_binary(x, f, err_msg); f.close(); } return load_okay; } template inline bool diskio::load_arma_binary(field& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); arma_type_check(( (is_Mat::value == false) && (is_Cube::value == false) )); bool load_okay = true; std::string f_type; f >> f_type; if(f_type == "ARMA_FLD_BIN") { uword f_n_rows; uword f_n_cols; f >> f_n_rows; f >> f_n_cols; try { x.set_size(f_n_rows, f_n_cols); } catch(...) { err_msg = "not enough memory"; return false; } f.get(); for(uword i=0; i> f_n_rows; f >> f_n_cols; f >> f_n_slices; try { x.set_size(f_n_rows, f_n_cols, f_n_slices); } catch(...) { err_msg = "not enough memory"; return false; } f.get(); for(uword i=0; i& x, const std::string& final_name) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::ofstream f( tmp_name.c_str(), std::fstream::binary ); bool save_okay = f.is_open(); if(save_okay) { save_okay = diskio::save_std_string(x, f); f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } } return save_okay; } inline bool diskio::save_std_string(const field& x, std::ostream& f) { arma_extra_debug_sigprint(); for(uword row=0; row& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); std::ifstream f( name.c_str() ); bool load_okay = f.is_open(); if(load_okay) { load_okay = diskio::load_std_string(x, f, err_msg); f.close(); } return load_okay; } inline bool diskio::load_std_string(field& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); bool load_okay = true; // // work out the size uword f_n_rows = 0; uword f_n_cols = 0; bool f_n_cols_found = false; std::string line_string; std::string token; while( f.good() && load_okay ) { std::getline(f, line_string); if(line_string.size() == 0) { break; } std::stringstream line_stream(line_string); uword line_n_cols = 0; while(line_stream >> token) { line_n_cols++; } if(f_n_cols_found == false) { f_n_cols = line_n_cols; f_n_cols_found = true; } else { if(line_n_cols != f_n_cols) { load_okay = false; err_msg = "inconsistent number of columns"; } } ++f_n_rows; } if(load_okay) { f.clear(); f.seekg(0, ios::beg); //f.seekg(start); try { x.set_size(f_n_rows, f_n_cols); } catch(...) { err_msg = "not enough memory"; return false; } for(uword row=0; row < x.n_rows; ++row) for(uword col=0; col < x.n_cols; ++col) { f >> x.at(row,col); } } if(f.good() == false) { load_okay = false; } return load_okay; } //! Try to load a field by automatically determining its type template inline bool diskio::load_auto_detect(field& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); std::fstream f; f.open(name.c_str(), std::fstream::in | std::fstream::binary); bool load_okay = f.is_open(); if(load_okay) { load_okay = diskio::load_auto_detect(x, f, err_msg); f.close(); } return load_okay; } //! Try to load a field by automatically determining its type template inline bool diskio::load_auto_detect(field& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); arma_type_check(( is_Mat::value == false )); static const std::string ARMA_FLD_BIN = "ARMA_FLD_BIN"; static const std::string ARMA_FL3_BIN = "ARMA_FL3_BIN"; static const std::string P6 = "P6"; podarray raw_header(uword(ARMA_FLD_BIN.length()) + 1); std::streampos pos = f.tellg(); f.read( raw_header.memptr(), std::streamsize(ARMA_FLD_BIN.length()) ); f.clear(); f.seekg(pos); raw_header[uword(ARMA_FLD_BIN.length())] = '\0'; const std::string header = raw_header.mem; if(ARMA_FLD_BIN == header.substr(0, ARMA_FLD_BIN.length())) { return load_arma_binary(x, f, err_msg); } else if(ARMA_FL3_BIN == header.substr(0, ARMA_FL3_BIN.length())) { return load_arma_binary(x, f, err_msg); } else if(P6 == header.substr(0, P6.length())) { return load_ppm_binary(x, f, err_msg); } else { err_msg = "unsupported header"; return false; } } // // handling of PPM images by cubes template inline bool diskio::load_ppm_binary(Cube& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); std::fstream f; f.open(name.c_str(), std::fstream::in | std::fstream::binary); bool load_okay = f.is_open(); if(load_okay) { load_okay = diskio::load_ppm_binary(x, f, err_msg); f.close(); } return load_okay; } template inline bool diskio::load_ppm_binary(Cube& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); bool load_okay = true; std::string f_header; f >> f_header; if(f_header == "P6") { uword f_n_rows = 0; uword f_n_cols = 0; int f_maxval = 0; diskio::pnm_skip_comments(f); f >> f_n_cols; diskio::pnm_skip_comments(f); f >> f_n_rows; diskio::pnm_skip_comments(f); f >> f_maxval; f.get(); if( (f_maxval > 0) && (f_maxval <= 65535) ) { try { x.set_size(f_n_rows, f_n_cols, 3); } catch(...) { err_msg = "not enough memory"; return false; } if(f_maxval <= 255) { const uword n_elem = 3*f_n_cols*f_n_rows; podarray tmp(n_elem); f.read( reinterpret_cast(tmp.memptr()), std::streamsize(n_elem) ); uword i = 0; //cout << "f_n_cols = " << f_n_cols << endl; //cout << "f_n_rows = " << f_n_rows << endl; for(uword row=0; row < f_n_rows; ++row) for(uword col=0; col < f_n_cols; ++col) { x.at(row,col,0) = eT(tmp[i+0]); x.at(row,col,1) = eT(tmp[i+1]); x.at(row,col,2) = eT(tmp[i+2]); i+=3; } } else { const uword n_elem = 3*f_n_cols*f_n_rows; podarray tmp(n_elem); f.read( reinterpret_cast(tmp.memptr()), std::streamsize(2*n_elem) ); uword i = 0; for(uword row=0; row < f_n_rows; ++row) for(uword col=0; col < f_n_cols; ++col) { x.at(row,col,0) = eT(tmp[i+0]); x.at(row,col,1) = eT(tmp[i+1]); x.at(row,col,2) = eT(tmp[i+2]); i+=3; } } } else { load_okay = false; err_msg = "functionality unimplemented"; } if(f.good() == false) { load_okay = false; } } else { load_okay = false; err_msg = "unsupported header"; } return load_okay; } template inline bool diskio::save_ppm_binary(const Cube& x, const std::string& final_name) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::ofstream f( tmp_name.c_str(), std::fstream::binary ); bool save_okay = f.is_open(); if(save_okay) { save_okay = diskio::save_ppm_binary(x, f); f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } } return save_okay; } template inline bool diskio::save_ppm_binary(const Cube& x, std::ostream& f) { arma_extra_debug_sigprint(); arma_debug_check( (x.n_slices != 3), "diskio::save_ppm_binary(): given cube must have exactly 3 slices" ); const uword n_elem = 3 * x.n_rows * x.n_cols; podarray tmp(n_elem); uword i = 0; for(uword row=0; row < x.n_rows; ++row) { for(uword col=0; col < x.n_cols; ++col) { tmp[i+0] = u8( access::tmp_real( x.at(row,col,0) ) ); tmp[i+1] = u8( access::tmp_real( x.at(row,col,1) ) ); tmp[i+2] = u8( access::tmp_real( x.at(row,col,2) ) ); i+=3; } } f << "P6" << '\n'; f << x.n_cols << '\n'; f << x.n_rows << '\n'; f << 255 << '\n'; f.write( reinterpret_cast(tmp.mem), std::streamsize(n_elem) ); return f.good(); } // // handling of PPM images by fields template inline bool diskio::load_ppm_binary(field& x, const std::string& name, std::string& err_msg) { arma_extra_debug_sigprint(); std::fstream f; f.open(name.c_str(), std::fstream::in | std::fstream::binary); bool load_okay = f.is_open(); if(load_okay) { load_okay = diskio::load_ppm_binary(x, f, err_msg); f.close(); } return load_okay; } template inline bool diskio::load_ppm_binary(field& x, std::istream& f, std::string& err_msg) { arma_extra_debug_sigprint(); arma_type_check(( is_Mat::value == false )); typedef typename T1::elem_type eT; bool load_okay = true; std::string f_header; f >> f_header; if(f_header == "P6") { uword f_n_rows = 0; uword f_n_cols = 0; int f_maxval = 0; diskio::pnm_skip_comments(f); f >> f_n_cols; diskio::pnm_skip_comments(f); f >> f_n_rows; diskio::pnm_skip_comments(f); f >> f_maxval; f.get(); if( (f_maxval > 0) && (f_maxval <= 65535) ) { x.set_size(3); Mat& R = x(0); Mat& G = x(1); Mat& B = x(2); try { R.set_size(f_n_rows,f_n_cols); } catch(...) { err_msg = "not enough memory"; return false; } try { G.set_size(f_n_rows,f_n_cols); } catch(...) { err_msg = "not enough memory"; return false; } try { B.set_size(f_n_rows,f_n_cols); } catch(...) { err_msg = "not enough memory"; return false; } if(f_maxval <= 255) { const uword n_elem = 3*f_n_cols*f_n_rows; podarray tmp(n_elem); f.read( reinterpret_cast(tmp.memptr()), std::streamsize(n_elem) ); uword i = 0; //cout << "f_n_cols = " << f_n_cols << endl; //cout << "f_n_rows = " << f_n_rows << endl; for(uword row=0; row < f_n_rows; ++row) { for(uword col=0; col < f_n_cols; ++col) { R.at(row,col) = eT(tmp[i+0]); G.at(row,col) = eT(tmp[i+1]); B.at(row,col) = eT(tmp[i+2]); i+=3; } } } else { const uword n_elem = 3*f_n_cols*f_n_rows; podarray tmp(n_elem); f.read( reinterpret_cast(tmp.memptr()), std::streamsize(2*n_elem) ); uword i = 0; for(uword row=0; row < f_n_rows; ++row) for(uword col=0; col < f_n_cols; ++col) { R.at(row,col) = eT(tmp[i+0]); G.at(row,col) = eT(tmp[i+1]); B.at(row,col) = eT(tmp[i+2]); i+=3; } } } else { load_okay = false; err_msg = "functionality unimplemented"; } if(f.good() == false) { load_okay = false; } } else { load_okay = false; err_msg = "unsupported header"; } return load_okay; } template inline bool diskio::save_ppm_binary(const field& x, const std::string& final_name) { arma_extra_debug_sigprint(); const std::string tmp_name = diskio::gen_tmp_name(final_name); std::ofstream f( tmp_name.c_str(), std::fstream::binary ); bool save_okay = f.is_open(); if(save_okay) { save_okay = diskio::save_ppm_binary(x, f); f.flush(); f.close(); if(save_okay) { save_okay = diskio::safe_rename(tmp_name, final_name); } } return save_okay; } template inline bool diskio::save_ppm_binary(const field& x, std::ostream& f) { arma_extra_debug_sigprint(); arma_type_check(( is_Mat::value == false )); typedef typename T1::elem_type eT; arma_debug_check( (x.n_elem != 3), "diskio::save_ppm_binary(): given field must have exactly 3 matrices of equal size" ); bool same_size = true; for(uword i=1; i<3; ++i) { if( (x(0).n_rows != x(i).n_rows) || (x(0).n_cols != x(i).n_cols) ) { same_size = false; break; } } arma_debug_check( (same_size != true), "diskio::save_ppm_binary(): given field must have exactly 3 matrices of equal size" ); const Mat& R = x(0); const Mat& G = x(1); const Mat& B = x(2); f << "P6" << '\n'; f << R.n_cols << '\n'; f << R.n_rows << '\n'; f << 255 << '\n'; const uword n_elem = 3 * R.n_rows * R.n_cols; podarray tmp(n_elem); uword i = 0; for(uword row=0; row < R.n_rows; ++row) for(uword col=0; col < R.n_cols; ++col) { tmp[i+0] = u8( access::tmp_real( R.at(row,col) ) ); tmp[i+1] = u8( access::tmp_real( G.at(row,col) ) ); tmp[i+2] = u8( access::tmp_real( B.at(row,col) ) ); i+=3; } f.write( reinterpret_cast(tmp.mem), std::streamsize(n_elem) ); return f.good(); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_powmat_meat.hpp0000644000176200001440000001456014171172616024130 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_powmat //! @{ template inline void op_powmat::apply(Mat& out, const Op& expr) { arma_extra_debug_sigprint(); const uword y = expr.aux_uword_a; const bool y_neg = (expr.aux_uword_b == uword(1)); const bool status = op_powmat::apply_direct(out, expr.m, y, y_neg); if(status == false) { out.soft_reset(); arma_stop_runtime_error("powmat(): transformation failed"); } } template inline bool op_powmat::apply_direct(Mat& out, const Base& X, const uword y, const bool y_neg) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(y_neg) { if(y == uword(1)) { return op_inv::apply_direct(out, X.get_ref(), "powmat()"); } else { Mat X_inv; const bool inv_status = op_inv::apply_direct(X_inv, X.get_ref(), "powmat()"); if(inv_status == false) { return false; } op_powmat::apply_direct_positive(out, X_inv, y); } } else { const quasi_unwrap U(X.get_ref()); arma_debug_check( (U.M.is_square() == false), "powmat(): given matrix must be square sized" ); op_powmat::apply_direct_positive(out, U.M, y); } return true; } template inline void op_powmat::apply_direct_positive(Mat& out, const Mat& X, const uword y) { arma_extra_debug_sigprint(); const uword N = X.n_rows; if(y == uword(0)) { out.eye(N,N); return; } if(y == uword(1)) { out = X; return; } if(X.is_diagmat()) { arma_extra_debug_print("op_powmat: detected diagonal matrix"); podarray tmp(N); // use temporary array in case we have aliasing for(uword i=0; i tmp = X*X; out = X*tmp; } else if(y == uword(4)) { const Mat tmp = X*X; out = tmp*tmp; } else if(y == uword(5)) { const Mat tmp = X*X; out = X*tmp*tmp; } else { Mat tmp = X; out = X; uword z = y-1; while(z > 0) { if(z & 1) { out = tmp * out; } z /= uword(2); if(z > 0) { tmp = tmp * tmp; } } } } } template inline void op_powmat_cx::apply(Mat< std::complex >& out, const mtOp,T1,op_powmat_cx>& expr) { arma_extra_debug_sigprint(); typedef typename T1::pod_type in_T; const in_T y = std::real(expr.aux_out_eT); const bool status = op_powmat_cx::apply_direct(out, expr.m, y); if(status == false) { out.soft_reset(); arma_stop_runtime_error("powmat(): transformation failed"); } } template inline bool op_powmat_cx::apply_direct(Mat< std::complex >& out, const Base& X, const typename T1::pod_type y) { arma_extra_debug_sigprint(); typedef typename T1::elem_type in_eT; typedef typename T1::pod_type in_T; typedef std::complex out_eT; if( y == in_T(int(y)) ) { arma_extra_debug_print("op_powmat_cx::apply_direct(): integer exponent detected; redirecting to op_powmat"); const uword y_val = (y < int(0)) ? uword(-y) : uword(y); const bool y_neg = (y < int(0)); Mat tmp; const bool status = op_powmat::apply_direct(tmp, X.get_ref(), y_val, y_neg); if(status == false) { return false; } out = conv_to< Mat >::from(tmp); return true; } const quasi_unwrap U(X.get_ref()); const Mat& A = U.M; arma_debug_check( (A.is_square() == false), "powmat(): given matrix must be square sized" ); const uword N = A.n_rows; if(A.is_diagmat()) { arma_extra_debug_print("op_powmat_cx: detected diagonal matrix"); podarray tmp(N); // use temporary array in case we have aliasing for(uword i=0; i(A.at(i,i)), y) ; } out.zeros(N,N); for(uword i=0; i eigval; Mat eigvec; const bool eig_status = eig_sym(eigval, eigvec, A); if(eig_status) { eigval = pow(eigval, y); const Mat tmp = diagmat(eigval) * eigvec.t(); out = conv_to< Mat >::from(eigvec * tmp); return true; } arma_extra_debug_print("op_powmat_cx: sympd optimisation failed"); // fallthrough if optimisation failed } bool powmat_status = false; Col eigval; Mat eigvec; const bool eig_status = eig_gen(eigval, eigvec, A); if(eig_status) { eigval = pow(eigval, y); Mat eigvec_t = trans(eigvec); Mat tmp = diagmat(conj(eigval)) * eigvec_t; const bool solve_status = auxlib::solve_square_fast(out, eigvec_t, tmp); if(solve_status) { out = trans(out); powmat_status = true; } } return powmat_status; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_find_meat.hpp0000644000176200001440000004207514171172616023543 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_find //! @{ template inline uword op_find::helper ( Mat& indices, const Base& X ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy A(X.get_ref()); const uword n_elem = A.get_n_elem(); indices.set_size(n_elem, 1); uword* indices_mem = indices.memptr(); uword n_nz = 0; if(Proxy::use_at == false) { typename Proxy::ea_type PA = A.get_ea(); for(uword i=0; i inline uword op_find::helper ( Mat& indices, const mtOp& X, const typename arma_op_rel_only::result* junk1, const typename arma_not_cx::result* junk2 ) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); typedef typename T1::elem_type eT; const eT val = X.aux; if((is_same_type::yes || is_same_type::yes) && arma_config::debug && arma_isnan(val)) { arma_debug_warn_level(1, "find(): NaN is not equal to anything; suggest to use find_nonfinite() instead"); } const Proxy A(X.m); const uword n_elem = A.get_n_elem(); indices.set_size(n_elem, 1); uword* indices_mem = indices.memptr(); uword n_nz = 0; if(Proxy::use_at == false) { typename Proxy::ea_type PA = A.get_ea(); uword i,j; for(i=0, j=1; j < n_elem; i+=2, j+=2) { const eT tpi = PA[i]; const eT tpj = PA[j]; bool not_zero_i; bool not_zero_j; if(is_same_type::yes) { not_zero_i = (val < tpi); } else if(is_same_type::yes) { not_zero_i = (tpi < val); } else if(is_same_type::yes) { not_zero_i = (val > tpi); } else if(is_same_type::yes) { not_zero_i = (tpi > val); } else if(is_same_type::yes) { not_zero_i = (val <= tpi); } else if(is_same_type::yes) { not_zero_i = (tpi <= val); } else if(is_same_type::yes) { not_zero_i = (val >= tpi); } else if(is_same_type::yes) { not_zero_i = (tpi >= val); } else if(is_same_type::yes) { not_zero_i = (tpi == val); } else if(is_same_type::yes) { not_zero_i = (tpi != val); } else { not_zero_i = false; } if(is_same_type::yes) { not_zero_j = (val < tpj); } else if(is_same_type::yes) { not_zero_j = (tpj < val); } else if(is_same_type::yes) { not_zero_j = (val > tpj); } else if(is_same_type::yes) { not_zero_j = (tpj > val); } else if(is_same_type::yes) { not_zero_j = (val <= tpj); } else if(is_same_type::yes) { not_zero_j = (tpj <= val); } else if(is_same_type::yes) { not_zero_j = (val >= tpj); } else if(is_same_type::yes) { not_zero_j = (tpj >= val); } else if(is_same_type::yes) { not_zero_j = (tpj == val); } else if(is_same_type::yes) { not_zero_j = (tpj != val); } else { not_zero_j = false; } if(not_zero_i) { indices_mem[n_nz] = i; ++n_nz; } if(not_zero_j) { indices_mem[n_nz] = j; ++n_nz; } } if(i < n_elem) { bool not_zero; const eT tmp = PA[i]; if(is_same_type::yes) { not_zero = (val < tmp); } else if(is_same_type::yes) { not_zero = (tmp < val); } else if(is_same_type::yes) { not_zero = (val > tmp); } else if(is_same_type::yes) { not_zero = (tmp > val); } else if(is_same_type::yes) { not_zero = (val <= tmp); } else if(is_same_type::yes) { not_zero = (tmp <= val); } else if(is_same_type::yes) { not_zero = (val >= tmp); } else if(is_same_type::yes) { not_zero = (tmp >= val); } else if(is_same_type::yes) { not_zero = (tmp == val); } else if(is_same_type::yes) { not_zero = (tmp != val); } else { not_zero = false; } if(not_zero) { indices_mem[n_nz] = i; ++n_nz; } } } else { const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); uword i = 0; for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { const eT tmp = A.at(row,col); bool not_zero; if(is_same_type::yes) { not_zero = (val < tmp); } else if(is_same_type::yes) { not_zero = (tmp < val); } else if(is_same_type::yes) { not_zero = (val > tmp); } else if(is_same_type::yes) { not_zero = (tmp > val); } else if(is_same_type::yes) { not_zero = (val <= tmp); } else if(is_same_type::yes) { not_zero = (tmp <= val); } else if(is_same_type::yes) { not_zero = (val >= tmp); } else if(is_same_type::yes) { not_zero = (tmp >= val); } else if(is_same_type::yes) { not_zero = (tmp == val); } else if(is_same_type::yes) { not_zero = (tmp != val); } else { not_zero = false; } if(not_zero) { indices_mem[n_nz] = i; ++n_nz; } ++i; } } return n_nz; } template inline uword op_find::helper ( Mat& indices, const mtOp& X, const typename arma_op_rel_only::result* junk1, const typename arma_cx_only::result* junk2 ) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); typedef typename T1::elem_type eT; typedef typename Proxy::ea_type ea_type; const eT val = X.aux; if((is_same_type::yes || is_same_type::yes) && arma_config::debug && arma_isnan(val)) { arma_debug_warn_level(1, "find(): NaN is not equal to anything; suggest to use find_nonfinite() instead"); } const Proxy A(X.m); const uword n_elem = A.get_n_elem(); indices.set_size(n_elem, 1); uword* indices_mem = indices.memptr(); uword n_nz = 0; if(Proxy::use_at == false) { ea_type PA = A.get_ea(); for(uword i=0; i::yes) { not_zero = (tmp == val); } else if(is_same_type::yes) { not_zero = (tmp != val); } else { not_zero = false; } if(not_zero) { indices_mem[n_nz] = i; ++n_nz; } } } else { const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); uword i = 0; for(uword col=0; col::yes) { not_zero = (tmp == val); } else if(is_same_type::yes) { not_zero = (tmp != val); } else { not_zero = false; } if(not_zero) { indices_mem[n_nz] = i; ++n_nz; } i++; } } return n_nz; } template inline uword op_find::helper ( Mat& indices, const mtGlue& X, const typename arma_glue_rel_only::result* junk1, const typename arma_not_cx::result* junk2, const typename arma_not_cx::result* junk3 ) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); arma_ignore(junk3); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename Proxy::ea_type ea_type1; typedef typename Proxy::ea_type ea_type2; const Proxy A(X.A); const Proxy B(X.B); arma_debug_assert_same_size(A, B, "relational operator"); const uword n_elem = A.get_n_elem(); indices.set_size(n_elem, 1); uword* indices_mem = indices.memptr(); uword n_nz = 0; if((Proxy::use_at == false) && (Proxy::use_at == false)) { ea_type1 PA = A.get_ea(); ea_type2 PB = B.get_ea(); for(uword i=0; i::yes) { not_zero = (tmp1 < tmp2); } else if(is_same_type::yes) { not_zero = (tmp1 > tmp2); } else if(is_same_type::yes) { not_zero = (tmp1 <= tmp2); } else if(is_same_type::yes) { not_zero = (tmp1 >= tmp2); } else if(is_same_type::yes) { not_zero = (tmp1 == tmp2); } else if(is_same_type::yes) { not_zero = (tmp1 != tmp2); } else if(is_same_type::yes) { not_zero = (tmp1 && tmp2); } else if(is_same_type::yes) { not_zero = (tmp1 || tmp2); } else { not_zero = false; } if(not_zero) { indices_mem[n_nz] = i; ++n_nz; } } } else { const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); uword i = 0; for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { const eT1 tmp1 = A.at(row,col); const eT2 tmp2 = B.at(row,col); bool not_zero; if(is_same_type::yes) { not_zero = (tmp1 < tmp2); } else if(is_same_type::yes) { not_zero = (tmp1 > tmp2); } else if(is_same_type::yes) { not_zero = (tmp1 <= tmp2); } else if(is_same_type::yes) { not_zero = (tmp1 >= tmp2); } else if(is_same_type::yes) { not_zero = (tmp1 == tmp2); } else if(is_same_type::yes) { not_zero = (tmp1 != tmp2); } else if(is_same_type::yes) { not_zero = (tmp1 && tmp2); } else if(is_same_type::yes) { not_zero = (tmp1 || tmp2); } else { not_zero = false; } if(not_zero) { indices_mem[n_nz] = i; ++n_nz; } i++; } } return n_nz; } template inline uword op_find::helper ( Mat& indices, const mtGlue& X, const typename arma_glue_rel_only::result* junk1, const typename arma_cx_only::result* junk2, const typename arma_cx_only::result* junk3 ) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); arma_ignore(junk3); typedef typename Proxy::ea_type ea_type1; typedef typename Proxy::ea_type ea_type2; const Proxy A(X.A); const Proxy B(X.B); arma_debug_assert_same_size(A, B, "relational operator"); const uword n_elem = A.get_n_elem(); indices.set_size(n_elem, 1); uword* indices_mem = indices.memptr(); uword n_nz = 0; if((Proxy::use_at == false) && (Proxy::use_at == false)) { ea_type1 PA = A.get_ea(); ea_type2 PB = B.get_ea(); for(uword i=0; i::yes) { not_zero = (PA[i] == PB[i]); } else if(is_same_type::yes) { not_zero = (PA[i] != PB[i]); } else { not_zero = false; } if(not_zero) { indices_mem[n_nz] = i; ++n_nz; } } } else { const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); uword i = 0; for(uword col=0; col::yes) { not_zero = (A.at(row,col) == B.at(row,col)); } else if(is_same_type::yes) { not_zero = (A.at(row,col) != B.at(row,col)); } else { not_zero = false; } if(not_zero) { indices_mem[n_nz] = i; ++n_nz; } i++; } } return n_nz; } template inline void op_find::apply(Mat& out, const mtOp& X) { arma_extra_debug_sigprint(); const uword k = X.aux_uword_a; const uword type = X.aux_uword_b; Mat indices; const uword n_nz = op_find::helper(indices, X.m); if(n_nz > 0) { if(type == 0) // "first" { out = (k > 0 && k <= n_nz) ? indices.rows(0, k-1 ) : indices.rows(0, n_nz-1); } else // "last" { out = (k > 0 && k <= n_nz) ? indices.rows(n_nz-k, n_nz-1) : indices.rows(0, n_nz-1); } } else { out.set_size(0,1); // empty column vector } } // template inline void op_find_simple::apply(Mat& out, const mtOp& X) { arma_extra_debug_sigprint(); Mat indices; const uword n_nz = op_find::helper(indices, X.m); out.steal_mem_col(indices, n_nz); } // template inline void op_find_finite::apply(Mat& out, const mtOp& X) { arma_extra_debug_sigprint(); const Proxy P(X.m); const uword n_elem = P.get_n_elem(); Mat indices(n_elem, 1, arma_nozeros_indicator()); uword* indices_mem = indices.memptr(); uword count = 0; if(Proxy::use_at == false) { const typename Proxy::ea_type Pea = P.get_ea(); for(uword i=0; i inline void op_find_nonfinite::apply(Mat& out, const mtOp& X) { arma_extra_debug_sigprint(); const Proxy P(X.m); const uword n_elem = P.get_n_elem(); Mat indices(n_elem, 1, arma_nozeros_indicator()); uword* indices_mem = indices.memptr(); uword count = 0; if(Proxy::use_at == false) { const typename Proxy::ea_type Pea = P.get_ea(); for(uword i=0; i inline bool svds_helper ( Mat& U, Col& S, Mat& V, const SpBase& X, const uword k, const typename T1::pod_type tol, const bool calc_UV, const typename arma_real_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; arma_debug_check ( ( ((void*)(&U) == (void*)(&S)) || (&U == &V) || ((void*)(&S) == (void*)(&V)) ), "svds(): two or more output objects are the same object" ); arma_debug_check( (tol < T(0)), "svds(): tol must be >= 0" ); const unwrap_spmat tmp(X.get_ref()); const SpMat& A = tmp.M; const uword kk = (std::min)( (std::min)(A.n_rows, A.n_cols), k ); const T A_max = (A.n_nonzero > 0) ? T(max(abs(Col(const_cast(A.values), A.n_nonzero, false)))) : T(0); if(A_max == T(0)) { // TODO: use reset instead ? S.zeros(kk); if(calc_UV) { U.eye(A.n_rows, kk); V.eye(A.n_cols, kk); } } else { SpMat C( (A.n_rows + A.n_cols), (A.n_rows + A.n_cols) ); SpMat B = A / A_max; SpMat Bt = B.t(); C(0, A.n_rows, arma::size(B) ) = B; C(A.n_rows, 0, arma::size(Bt)) = Bt; Bt.reset(); B.reset(); Col eigval; Mat eigvec; eigs_opts opts; opts.tol = (tol / Datum::sqrt2); const bool status = eigs_sym(eigval, eigvec, C, kk, "la", opts); if(status == false) { U.soft_reset(); S.soft_reset(); V.soft_reset(); return false; } const T A_norm = max(eigval); const T tol2 = tol / Datum::sqrt2 * A_norm; uvec indices = find(eigval > tol2); if(indices.n_elem > kk) { indices = indices.subvec(0,kk-1); } else if(indices.n_elem < kk) { const uvec indices2 = find(abs(eigval) <= tol2); const uword N_extra = (std::min)( indices2.n_elem, (kk - indices.n_elem) ); if(N_extra > 0) { indices = join_cols(indices, indices2.subvec(0,N_extra-1)); } } const uvec sorted_indices = sort_index(eigval, "descend"); S = eigval.elem(sorted_indices); S *= A_max; if(calc_UV) { uvec U_row_indices(A.n_rows, arma_nozeros_indicator()); for(uword i=0; i < A.n_rows; ++i) { U_row_indices[i] = i; } uvec V_row_indices(A.n_cols, arma_nozeros_indicator()); for(uword i=0; i < A.n_cols; ++i) { V_row_indices[i] = i + A.n_rows; } U = Datum::sqrt2 * eigvec(U_row_indices, sorted_indices); V = Datum::sqrt2 * eigvec(V_row_indices, sorted_indices); } } if(S.n_elem < k) { arma_debug_warn_level(1, "svds(): found fewer singular values than specified"); } return true; } template inline bool svds_helper ( Mat& U, Col& S, Mat& V, const SpBase& X, const uword k, const typename T1::pod_type tol, const bool calc_UV, const typename arma_cx_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; if(arma_config::arpack == false) { arma_stop_logic_error("svds(): use of ARPACK must be enabled for decomposition of complex matrices"); return false; } arma_debug_check ( ( ((void*)(&U) == (void*)(&S)) || (&U == &V) || ((void*)(&S) == (void*)(&V)) ), "svds(): two or more output objects are the same object" ); arma_debug_check( (tol < T(0)), "svds(): tol must be >= 0" ); const unwrap_spmat tmp(X.get_ref()); const SpMat& A = tmp.M; const uword kk = (std::min)( (std::min)(A.n_rows, A.n_cols), k ); const T A_max = (A.n_nonzero > 0) ? T(max(abs(Col(const_cast(A.values), A.n_nonzero, false)))) : T(0); if(A_max == T(0)) { // TODO: use reset instead ? S.zeros(kk); if(calc_UV) { U.eye(A.n_rows, kk); V.eye(A.n_cols, kk); } } else { SpMat C( (A.n_rows + A.n_cols), (A.n_rows + A.n_cols) ); SpMat B = A / A_max; SpMat Bt = B.t(); C(0, A.n_rows, arma::size(B) ) = B; C(A.n_rows, 0, arma::size(Bt)) = Bt; Bt.reset(); B.reset(); Col eigval_tmp; Mat eigvec; eigs_opts opts; opts.tol = (tol / Datum::sqrt2); const bool status = eigs_gen(eigval_tmp, eigvec, C, kk, "lr", opts); if(status == false) { U.soft_reset(); S.soft_reset(); V.soft_reset(); return false; } const Col eigval = real(eigval_tmp); const T A_norm = max(eigval); const T tol2 = tol / Datum::sqrt2 * A_norm; uvec indices = find(eigval > tol2); if(indices.n_elem > kk) { indices = indices.subvec(0,kk-1); } else if(indices.n_elem < kk) { const uvec indices2 = find(abs(eigval) <= tol2); const uword N_extra = (std::min)( indices2.n_elem, (kk - indices.n_elem) ); if(N_extra > 0) { indices = join_cols(indices, indices2.subvec(0,N_extra-1)); } } const uvec sorted_indices = sort_index(eigval, "descend"); S = eigval.elem(sorted_indices); S *= A_max; if(calc_UV) { uvec U_row_indices(A.n_rows, arma_nozeros_indicator()); for(uword i=0; i < A.n_rows; ++i) { U_row_indices[i] = i; } uvec V_row_indices(A.n_cols, arma_nozeros_indicator()); for(uword i=0; i < A.n_cols; ++i) { V_row_indices[i] = i + A.n_rows; } U = Datum::sqrt2 * eigvec(U_row_indices, sorted_indices); V = Datum::sqrt2 * eigvec(V_row_indices, sorted_indices); } } if(S.n_elem < k) { arma_debug_warn_level(1, "svds(): found fewer singular values than specified"); } return true; } //! find the k largest singular values and corresponding singular vectors of sparse matrix X template inline bool svds ( Mat& U, Col& S, Mat& V, const SpBase& X, const uword k, const typename T1::pod_type tol = 0.0, const typename arma_real_or_cx_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); const bool status = svds_helper(U, S, V, X.get_ref(), k, tol, true); if(status == false) { arma_debug_warn_level(3, "svds(): decomposition failed"); } return status; } //! find the k largest singular values of sparse matrix X template inline bool svds ( Col& S, const SpBase& X, const uword k, const typename T1::pod_type tol = 0.0, const typename arma_real_or_cx_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); Mat U; Mat V; const bool status = svds_helper(U, S, V, X.get_ref(), k, tol, false); if(status == false) { arma_debug_warn_level(3, "svds(): decomposition failed"); } return status; } //! find the k largest singular values of sparse matrix X template arma_warn_unused inline Col svds ( const SpBase& X, const uword k, const typename T1::pod_type tol = 0.0, const typename arma_real_or_cx_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); Col S; Mat U; Mat V; const bool status = svds_helper(U, S, V, X.get_ref(), k, tol, false); if(status == false) { arma_stop_runtime_error("svds(): decomposition failed"); } return S; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_find_unique_bones.hpp0000644000176200001440000000355714124060717025307 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_find_unique //! @{ class op_find_unique : public traits_op_col { public: template static inline bool apply_helper(Mat& out, const Proxy& P, const bool ascending_indices); template static inline void apply(Mat& out, const mtOp& in); }; template struct arma_find_unique_packet { eT val; uword index; }; template struct arma_find_unique_comparator { arma_inline bool operator() (const arma_find_unique_packet& A, const arma_find_unique_packet& B) const { return (A.val < B.val); } }; template struct arma_find_unique_comparator< std::complex > { arma_inline bool operator() (const arma_find_unique_packet< std::complex >& A, const arma_find_unique_packet< std::complex >& B) const { const T A_real = A.val.real(); const T B_real = B.val.real(); return ( (A_real < B_real) ? true : ((A_real == B_real) ? (A.val.imag() < B.val.imag()) : false) ); } }; //! @} RcppArmadillo/inst/include/armadillo_bits/spglue_min_bones.hpp0000644000176200001440000000330614124060717024435 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_min //! @{ class spglue_min : public traits_glue_or { public: template inline static void apply(SpMat& out, const SpGlue& X); template inline static void apply_noalias(SpMat& out, const SpProxy& pa, const SpProxy& pb); template inline static void apply_noalias(SpMat& out, const SpMat& A, const SpMat& B); template inline static void dense_sparse_min(Mat& out, const Base& X, const SpBase& Y); template inline static typename enable_if2::no, eT>::result elem_min(const eT& a, const eT& b); template inline static typename enable_if2::yes, eT>::result elem_min(const eT& a, const eT& b); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_shift_meat.hpp0000644000176200001440000001274714124060717023737 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_shift //! @{ template inline void op_shift_vec::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); const unwrap U(in.m); const uword len = in.aux_uword_a; const uword neg = in.aux_uword_b; const uword dim = (T1::is_xvec) ? uword(U.M.is_rowvec() ? 1 : 0) : uword((T1::is_row) ? 1 : 0); op_shift::apply_direct(out, U.M, len, neg, dim); } template inline void op_shift::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); const unwrap U(in.m); const uword len = in.aux_uword_a; const uword neg = in.aux_uword_b; const uword dim = in.aux_uword_c; arma_debug_check( (dim > 1), "shift(): parameter 'dim' must be 0 or 1" ); op_shift::apply_direct(out, U.M, len, neg, dim); } template inline void op_shift::apply_direct(Mat& out, const Mat& X, const uword len, const uword neg, const uword dim) { arma_extra_debug_sigprint(); arma_debug_check_bounds( ((dim == 0) && (len >= X.n_rows)), "shift(): shift amount out of bounds" ); arma_debug_check_bounds( ((dim == 1) && (len >= X.n_cols)), "shift(): shift amount out of bounds" ); if(&out == &X) { op_shift::apply_alias(out, len, neg, dim); } else { op_shift::apply_noalias(out, X, len, neg, dim); } } template inline void op_shift::apply_noalias(Mat& out, const Mat& X, const uword len, const uword neg, const uword dim) { arma_extra_debug_sigprint(); out.copy_size(X); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(dim == 0) { if(neg == 0) { for(uword col=0; col < X_n_cols; ++col) { eT* out_ptr = out.colptr(col); const eT* X_ptr = X.colptr(col); for(uword out_row=len, row=0; row < (X_n_rows - len); ++row, ++out_row) { out_ptr[out_row] = X_ptr[row]; } for(uword out_row=0, row=(X_n_rows - len); row < X_n_rows; ++row, ++out_row) { out_ptr[out_row] = X_ptr[row]; } } } else if(neg == 1) { for(uword col=0; col < X_n_cols; ++col) { eT* out_ptr = out.colptr(col); const eT* X_ptr = X.colptr(col); for(uword out_row=0, row=len; row < X_n_rows; ++row, ++out_row) { out_ptr[out_row] = X_ptr[row]; } for(uword out_row=(X_n_rows-len), row=0; row < len; ++row, ++out_row) { out_ptr[out_row] = X_ptr[row]; } } } } else if(dim == 1) { if(neg == 0) { if(X_n_rows == 1) { eT* out_ptr = out.memptr(); const eT* X_ptr = X.memptr(); for(uword out_col=len, col=0; col < (X_n_cols - len); ++col, ++out_col) { out_ptr[out_col] = X_ptr[col]; } for(uword out_col=0, col=(X_n_cols - len); col < X_n_cols; ++col, ++out_col) { out_ptr[out_col] = X_ptr[col]; } } else { for(uword out_col=len, col=0; col < (X_n_cols - len); ++col, ++out_col) { arrayops::copy( out.colptr(out_col), X.colptr(col), X_n_rows ); } for(uword out_col=0, col=(X_n_cols - len); col < X_n_cols; ++col, ++out_col) { arrayops::copy( out.colptr(out_col), X.colptr(col), X_n_rows ); } } } else if(neg == 1) { if(X_n_rows == 1) { eT* out_ptr = out.memptr(); const eT* X_ptr = X.memptr(); for(uword out_col=0, col=len; col < X_n_cols; ++col, ++out_col) { out_ptr[out_col] = X_ptr[col]; } for(uword out_col=(X_n_cols-len), col=0; col < len; ++col, ++out_col) { out_ptr[out_col] = X_ptr[col]; } } else { for(uword out_col=0, col=len; col < X_n_cols; ++col, ++out_col) { arrayops::copy( out.colptr(out_col), X.colptr(col), X_n_rows ); } for(uword out_col=(X_n_cols-len), col=0; col < len; ++col, ++out_col) { arrayops::copy( out.colptr(out_col), X.colptr(col), X_n_rows ); } } } } } template inline void op_shift::apply_alias(Mat& X, const uword len, const uword neg, const uword dim) { arma_extra_debug_sigprint(); // TODO: replace with better implementation Mat tmp; op_shift::apply_noalias(tmp, X, len, neg, dim); X.steal_mem(tmp); } //! @} RcppArmadillo/inst/include/armadillo_bits/auxlib_meat.hpp0000644000176200001440000061327214160256234023411 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup auxlib //! @{ template inline bool auxlib::inv(Mat& A) { arma_extra_debug_sigprint(); if(A.is_empty()) { return true; } #if defined(ARMA_USE_ATLAS) { arma_debug_assert_atlas_size(A); podarray ipiv(A.n_rows); int info = 0; arma_extra_debug_print("atlas::clapack_getrf()"); info = atlas::clapack_getrf(atlas::CblasColMajor, A.n_rows, A.n_cols, A.memptr(), A.n_rows, ipiv.memptr()); if(info != 0) { return false; } arma_extra_debug_print("atlas::clapack_getri()"); info = atlas::clapack_getri(atlas::CblasColMajor, A.n_rows, A.memptr(), A.n_rows, ipiv.memptr()); return (info == 0); } #elif defined(ARMA_USE_LAPACK) { arma_debug_assert_blas_size(A); blas_int n = blas_int(A.n_rows); blas_int lda = blas_int(A.n_rows); blas_int lwork = (std::max)(blas_int(podarray_prealloc_n_elem::val), n); blas_int info = 0; podarray ipiv(A.n_rows); if(n > 16) { eT work_query[2]; blas_int lwork_query = -1; arma_extra_debug_print("lapack::getri()"); lapack::getri(&n, A.memptr(), &lda, ipiv.memptr(), &work_query[0], &lwork_query, &info); if(info != 0) { return false; } blas_int lwork_proposed = static_cast( access::tmp_real(work_query[0]) ); lwork = (std::max)(lwork_proposed, lwork); } podarray work( static_cast(lwork) ); arma_extra_debug_print("lapack::getrf()"); lapack::getrf(&n, &n, A.memptr(), &lda, ipiv.memptr(), &info); if(info != 0) { return false; } arma_extra_debug_print("lapack::getri()"); lapack::getri(&n, A.memptr(), &lda, ipiv.memptr(), work.memptr(), &lwork, &info); return (info == 0); } #else { arma_ignore(A); arma_stop_logic_error("inv(): use of ATLAS or LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::inv(Mat& out, const Mat& X) { arma_extra_debug_sigprint(); out = X; return auxlib::inv(out); } template inline bool auxlib::inv_tr(Mat& A, const uword layout) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { if(A.is_empty()) { return true; } arma_debug_assert_blas_size(A); char uplo = (layout == 0) ? 'U' : 'L'; char diag = 'N'; blas_int n = blas_int(A.n_rows); blas_int info = 0; arma_extra_debug_print("lapack::trtri()"); lapack::trtri(&uplo, &diag, &n, A.memptr(), &n, &info); if(info != 0) { return false; } if(layout == 0) { A = trimatu(A); // upper triangular } else { A = trimatl(A); // lower triangular } return true; } #else { arma_ignore(A); arma_ignore(layout); arma_stop_logic_error("inv(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::inv_sympd(Mat& A) { arma_extra_debug_sigprint(); if(A.is_empty()) { return true; } #if defined(ARMA_USE_ATLAS) { arma_debug_assert_atlas_size(A); int info = 0; arma_extra_debug_print("atlas::clapack_potrf()"); info = atlas::clapack_potrf(atlas::CblasColMajor, atlas::CblasLower, A.n_rows, A.memptr(), A.n_rows); if(info != 0) { return false; } arma_extra_debug_print("atlas::clapack_potri()"); info = atlas::clapack_potri(atlas::CblasColMajor, atlas::CblasLower, A.n_rows, A.memptr(), A.n_rows); if(info != 0) { return false; } A = symmatl(A); return true; } #elif defined(ARMA_USE_LAPACK) { arma_debug_assert_blas_size(A); char uplo = 'L'; blas_int n = blas_int(A.n_rows); blas_int info = 0; // NOTE: for complex matrices, zpotrf() assumes the matrix is hermitian (not simply symmetric) arma_extra_debug_print("lapack::potrf()"); lapack::potrf(&uplo, &n, A.memptr(), &n, &info); if(info != 0) { return false; } arma_extra_debug_print("lapack::potri()"); lapack::potri(&uplo, &n, A.memptr(), &n, &info); if(info != 0) { return false; } A = symmatl(A); return true; } #else { arma_ignore(A); arma_stop_logic_error("inv_sympd(): use of ATLAS or LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::inv_sympd(Mat& out, const Mat& X) { arma_extra_debug_sigprint(); out = X; return auxlib::inv_sympd(out); } template inline bool auxlib::inv_sympd_rcond(Mat& A, const eT rcond_threshold) { arma_extra_debug_sigprint(); if(A.is_empty()) { return true; } #if defined(ARMA_USE_LAPACK) { typedef typename get_pod_type::result T; arma_debug_assert_blas_size(A); char norm_id = '1'; char uplo = 'L'; blas_int n = blas_int(A.n_rows); blas_int info = 0; T norm_val = T(0); podarray work(A.n_rows); arma_extra_debug_print("lapack::lansy()"); norm_val = lapack::lansy(&norm_id, &uplo, &n, A.memptr(), &n, work.memptr()); arma_extra_debug_print("lapack::potrf()"); lapack::potrf(&uplo, &n, A.memptr(), &n, &info); if(info != 0) { return false; } const T rcond = auxlib::lu_rcond_sympd(A, norm_val); if(rcond < rcond_threshold) { return false; } arma_extra_debug_print("lapack::potri()"); lapack::potri(&uplo, &n, A.memptr(), &n, &info); if(info != 0) { return false; } A = symmatl(A); return true; } #else { arma_ignore(A); arma_ignore(rcond_threshold); arma_stop_logic_error("inv_sympd_rcond(): use LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::inv_sympd_rcond(Mat< std::complex >& A, const T rcond_threshold) { arma_extra_debug_sigprint(); if(A.is_empty()) { return true; } #if defined(ARMA_CRIPPLED_LAPACK) { arma_ignore(A); arma_ignore(rcond_threshold); return false; } #elif defined(ARMA_USE_LAPACK) { arma_debug_assert_blas_size(A); char norm_id = '1'; char uplo = 'L'; blas_int n = blas_int(A.n_rows); blas_int info = 0; T norm_val = T(0); podarray work(A.n_rows); arma_extra_debug_print("lapack::lanhe()"); norm_val = lapack::lanhe(&norm_id, &uplo, &n, A.memptr(), &n, work.memptr()); arma_extra_debug_print("lapack::potrf()"); lapack::potrf(&uplo, &n, A.memptr(), &n, &info); if(info != 0) { return false; } const T rcond = auxlib::lu_rcond_sympd(A, norm_val); if(rcond < rcond_threshold) { return false; } arma_extra_debug_print("lapack::potri()"); lapack::potri(&uplo, &n, A.memptr(), &n, &info); if(info != 0) { return false; } A = symmatl(A); return true; } #else { arma_ignore(A); arma_ignore(rcond_threshold); arma_stop_logic_error("inv_sympd_rcond(): use LAPACK must be enabled"); return false; } #endif } //! determinant of a matrix template inline bool auxlib::det(eT& out_val, Mat& A) { arma_extra_debug_sigprint(); if(A.is_empty()) { out_val = eT(1); return true; } #if defined(ARMA_USE_ATLAS) { arma_debug_assert_atlas_size(A); podarray ipiv(A.n_rows); arma_extra_debug_print("atlas::clapack_getrf()"); const int info = atlas::clapack_getrf(atlas::CblasColMajor, A.n_rows, A.n_cols, A.memptr(), A.n_rows, ipiv.memptr()); if(info < 0) { return false; } // on output A appears to be L+U_alt, where U_alt is U with the main diagonal set to zero eT val = A.at(0,0); for(uword i=1; i < A.n_rows; ++i) { val *= A.at(i,i); } int sign = +1; for(uword i=0; i < A.n_rows; ++i) { // NOTE: no adjustment required, as the clapack version of getrf() assumes counting from 0 if( int(i) != ipiv.mem[i] ) { sign *= -1; } } out_val = (sign < 0) ? eT(-val) : eT(val); return true; } #elif defined(ARMA_USE_LAPACK) { arma_debug_assert_blas_size(A); podarray ipiv(A.n_rows); blas_int info = 0; blas_int n_rows = blas_int(A.n_rows); blas_int n_cols = blas_int(A.n_cols); arma_extra_debug_print("lapack::getrf()"); lapack::getrf(&n_rows, &n_cols, A.memptr(), &n_rows, ipiv.memptr(), &info); if(info < 0) { return false; } // on output A appears to be L+U_alt, where U_alt is U with the main diagonal set to zero eT val = A.at(0,0); for(uword i=1; i < A.n_rows; ++i) { val *= A.at(i,i); } blas_int sign = +1; for(uword i=0; i < A.n_rows; ++i) { // NOTE: adjustment of -1 is required as Fortran counts from 1 if( blas_int(i) != (ipiv.mem[i] - 1) ) { sign *= -1; } } out_val = (sign < 0) ? eT(-val) : eT(val); return true; } #else { arma_ignore(out_val); arma_ignore(A); arma_stop_logic_error("det(): use of ATLAS or LAPACK must be enabled"); return false; } #endif } //! log determinant of a matrix template inline bool auxlib::log_det(eT& out_val, typename get_pod_type::result& out_sign, Mat& A) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; if(A.is_empty()) { out_val = eT(0); out_sign = T(1); return true; } #if defined(ARMA_USE_ATLAS) { arma_debug_assert_atlas_size(A); podarray ipiv(A.n_rows); arma_extra_debug_print("atlas::clapack_getrf()"); const int info = atlas::clapack_getrf(atlas::CblasColMajor, A.n_rows, A.n_cols, A.memptr(), A.n_rows, ipiv.memptr()); if(info < 0) { return false; } // on output A appears to be L+U_alt, where U_alt is U with the main diagonal set to zero sword sign = (is_cx::no) ? ( (access::tmp_real( A.at(0,0) ) < T(0)) ? -1 : +1 ) : +1; eT val = (is_cx::no) ? std::log( (access::tmp_real( A.at(0,0) ) < T(0)) ? A.at(0,0)*T(-1) : A.at(0,0) ) : std::log( A.at(0,0) ); for(uword i=1; i < A.n_rows; ++i) { const eT x = A.at(i,i); sign *= (is_cx::no) ? ( (access::tmp_real(x) < T(0)) ? -1 : +1 ) : +1; val += (is_cx::no) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x); } for(uword i=0; i < A.n_rows; ++i) { if( int(i) != ipiv.mem[i] ) // NOTE: no adjustment required, as the clapack version of getrf() assumes counting from 0 { sign *= -1; } } out_val = val; out_sign = T(sign); return true; } #elif defined(ARMA_USE_LAPACK) { arma_debug_assert_blas_size(A); podarray ipiv(A.n_rows); blas_int info = 0; blas_int n_rows = blas_int(A.n_rows); blas_int n_cols = blas_int(A.n_cols); arma_extra_debug_print("lapack::getrf()"); lapack::getrf(&n_rows, &n_cols, A.memptr(), &n_rows, ipiv.memptr(), &info); if(info < 0) { return false; } // on output A appears to be L+U_alt, where U_alt is U with the main diagonal set to zero sword sign = (is_cx::no) ? ( (access::tmp_real( A.at(0,0) ) < T(0)) ? -1 : +1 ) : +1; eT val = (is_cx::no) ? std::log( (access::tmp_real( A.at(0,0) ) < T(0)) ? A.at(0,0)*T(-1) : A.at(0,0) ) : std::log( A.at(0,0) ); for(uword i=1; i < A.n_rows; ++i) { const eT x = A.at(i,i); sign *= (is_cx::no) ? ( (access::tmp_real(x) < T(0)) ? -1 : +1 ) : +1; val += (is_cx::no) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x); } for(uword i=0; i < A.n_rows; ++i) { if( blas_int(i) != (ipiv.mem[i] - 1) ) // NOTE: adjustment of -1 is required as Fortran counts from 1 { sign *= -1; } } out_val = val; out_sign = T(sign); return true; } #else { arma_ignore(A); arma_ignore(out_val); arma_ignore(out_sign); arma_stop_logic_error("log_det(): use of ATLAS or LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::log_det_sympd(typename get_pod_type::result& out_val, Mat& A) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; if(A.is_empty()) { out_val = T(0); return true; } #if defined(ARMA_USE_ATLAS) { arma_debug_assert_atlas_size(A); int info = 0; arma_extra_debug_print("atlas::clapack_potrf()"); info = atlas::clapack_potrf(atlas::CblasColMajor, atlas::CblasLower, A.n_rows, A.memptr(), A.n_rows); if(info != 0) { return false; } T val = std::log( access::tmp_real(A.at(0,0)) ); for(uword i=1; i < A.n_rows; ++i) { val += std::log( access::tmp_real(A.at(i,i)) ); } out_val = T(2) * val; return true; } #elif defined(ARMA_USE_LAPACK) { arma_debug_assert_blas_size(A); char uplo = 'L'; blas_int n = blas_int(A.n_rows); blas_int info = 0; arma_extra_debug_print("lapack::potrf()"); lapack::potrf(&uplo, &n, A.memptr(), &n, &info); if(info != 0) { return false; } T val = std::log( access::tmp_real(A.at(0,0)) ); for(uword i=1; i < A.n_rows; ++i) { val += std::log( access::tmp_real(A.at(i,i)) ); } out_val = T(2) * val; return true; } #else { arma_ignore(out_val); arma_ignore(A); arma_stop_logic_error("det(): use of ATLAS or LAPACK must be enabled"); return false; } #endif } //! LU decomposition of a matrix template inline bool auxlib::lu(Mat& L, Mat& U, podarray& ipiv, const Base& X) { arma_extra_debug_sigprint(); U = X.get_ref(); const uword U_n_rows = U.n_rows; const uword U_n_cols = U.n_cols; if(U.is_empty()) { L.set_size(U_n_rows, 0); U.set_size(0, U_n_cols); ipiv.reset(); return true; } #if defined(ARMA_USE_ATLAS) || defined(ARMA_USE_LAPACK) { #if defined(ARMA_USE_ATLAS) { arma_debug_assert_atlas_size(U); ipiv.set_size( (std::min)(U_n_rows, U_n_cols) ); arma_extra_debug_print("atlas::clapack_getrf()"); int info = atlas::clapack_getrf(atlas::CblasColMajor, U_n_rows, U_n_cols, U.memptr(), U_n_rows, ipiv.memptr()); if(info < 0) { return false; } } #elif defined(ARMA_USE_LAPACK) { arma_debug_assert_blas_size(U); ipiv.set_size( (std::min)(U_n_rows, U_n_cols) ); blas_int info = 0; blas_int n_rows = blas_int(U_n_rows); blas_int n_cols = blas_int(U_n_cols); arma_extra_debug_print("lapack::getrf()"); lapack::getrf(&n_rows, &n_cols, U.memptr(), &n_rows, ipiv.memptr(), &info); if(info < 0) { return false; } // take into account that Fortran counts from 1 arrayops::inplace_minus(ipiv.memptr(), blas_int(1), ipiv.n_elem); } #endif L.copy_size(U); for(uword col=0; col < U_n_cols; ++col) { for(uword row=0; (row < col) && (row < U_n_rows); ++row) { L.at(row,col) = eT(0); } if( L.in_range(col,col) ) { L.at(col,col) = eT(1); } for(uword row = (col+1); row < U_n_rows; ++row) { L.at(row,col) = U.at(row,col); U.at(row,col) = eT(0); } } return true; } #else { arma_stop_logic_error("lu(): use of ATLAS or LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::lu(Mat& L, Mat& U, Mat& P, const Base& X) { arma_extra_debug_sigprint(); podarray ipiv1; const bool status = auxlib::lu(L, U, ipiv1, X); if(status == false) { return false; } if(U.is_empty()) { // L and U have been already set to the correct empty matrices P.eye(L.n_rows, L.n_rows); return true; } const uword n = ipiv1.n_elem; const uword P_rows = U.n_rows; podarray ipiv2(P_rows); const blas_int* ipiv1_mem = ipiv1.memptr(); blas_int* ipiv2_mem = ipiv2.memptr(); for(uword i=0; i(ipiv1_mem[i]); if( ipiv2_mem[i] != ipiv2_mem[k] ) { std::swap( ipiv2_mem[i], ipiv2_mem[k] ); } } P.zeros(P_rows, P_rows); for(uword row=0; row(ipiv2_mem[row])) = eT(1); } if(L.n_cols > U.n_rows) { L.shed_cols(U.n_rows, L.n_cols-1); } if(U.n_rows > L.n_cols) { U.shed_rows(L.n_cols, U.n_rows-1); } return true; } template inline bool auxlib::lu(Mat& L, Mat& U, const Base& X) { arma_extra_debug_sigprint(); podarray ipiv1; const bool status = auxlib::lu(L, U, ipiv1, X); if(status == false) { return false; } if(U.is_empty()) { // L and U have been already set to the correct empty matrices return true; } const uword n = ipiv1.n_elem; const uword P_rows = U.n_rows; podarray ipiv2(P_rows); const blas_int* ipiv1_mem = ipiv1.memptr(); blas_int* ipiv2_mem = ipiv2.memptr(); for(uword i=0; i(ipiv1_mem[i]); if( ipiv2_mem[i] != ipiv2_mem[k] ) { std::swap( ipiv2_mem[i], ipiv2_mem[k] ); L.swap_rows( static_cast(ipiv2_mem[i]), static_cast(ipiv2_mem[k]) ); } } if(L.n_cols > U.n_rows) { L.shed_cols(U.n_rows, L.n_cols-1); } if(U.n_rows > L.n_cols) { U.shed_rows(L.n_cols, U.n_rows-1); } return true; } //! eigen decomposition of general square matrix (real) template inline bool auxlib::eig_gen ( Mat< std::complex >& vals, Mat< std::complex >& vecs, const bool vecs_on, const Base& expr ) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; Mat X = expr.get_ref(); arma_debug_check( (X.is_square() == false), "eig_gen(): given matrix must be square sized" ); arma_debug_assert_blas_size(X); if(X.is_empty()) { vals.reset(); vecs.reset(); return true; } if(X.is_finite() == false) { return false; } vals.set_size(X.n_rows, 1); Mat tmp(1, 1, arma_nozeros_indicator()); if(vecs_on) { vecs.set_size(X.n_rows, X.n_rows); tmp.set_size(X.n_rows, X.n_rows); } podarray junk(1); char jobvl = 'N'; char jobvr = (vecs_on) ? 'V' : 'N'; blas_int N = blas_int(X.n_rows); T* vl = junk.memptr(); T* vr = (vecs_on) ? tmp.memptr() : junk.memptr(); blas_int ldvl = blas_int(1); blas_int ldvr = (vecs_on) ? blas_int(tmp.n_rows) : blas_int(1); blas_int lwork = 64*N; // lwork_min = (vecs_on) ? (std::max)(blas_int(1), 4*N) : (std::max)(blas_int(1), 3*N) blas_int info = 0; podarray work( static_cast(lwork) ); podarray vals_real(X.n_rows); podarray vals_imag(X.n_rows); arma_extra_debug_print("lapack::geev() -- START"); lapack::geev(&jobvl, &jobvr, &N, X.memptr(), &N, vals_real.memptr(), vals_imag.memptr(), vl, &ldvl, vr, &ldvr, work.memptr(), &lwork, &info); arma_extra_debug_print("lapack::geev() -- END"); if(info != 0) { return false; } arma_extra_debug_print("reformatting eigenvalues and eigenvectors"); std::complex* vals_mem = vals.memptr(); for(uword i=0; i < X.n_rows; ++i) { vals_mem[i] = std::complex(vals_real[i], vals_imag[i]); } if(vecs_on) { for(uword j=0; j < X.n_rows; ++j) { if( (j < (X.n_rows-1)) && (vals_mem[j] == std::conj(vals_mem[j+1])) ) { for(uword i=0; i < X.n_rows; ++i) { vecs.at(i,j) = std::complex( tmp.at(i,j), tmp.at(i,j+1) ); vecs.at(i,j+1) = std::complex( tmp.at(i,j), -tmp.at(i,j+1) ); } ++j; } else { for(uword i=0; i(tmp.at(i,j), T(0)); } } } } return true; } #else { arma_ignore(vals); arma_ignore(vecs); arma_ignore(vecs_on); arma_ignore(expr); arma_stop_logic_error("eig_gen(): use of LAPACK must be enabled"); return false; } #endif } //! eigen decomposition of general square matrix (complex) template inline bool auxlib::eig_gen ( Mat< std::complex >& vals, Mat< std::complex >& vecs, const bool vecs_on, const Base< std::complex, T1 >& expr ) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; typedef typename std::complex eT; Mat X = expr.get_ref(); arma_debug_check( (X.is_square() == false), "eig_gen(): given matrix must be square sized" ); arma_debug_assert_blas_size(X); if(X.is_empty()) { vals.reset(); vecs.reset(); return true; } if(X.is_finite() == false) { return false; } vals.set_size(X.n_rows, 1); if(vecs_on) { vecs.set_size(X.n_rows, X.n_rows); } podarray junk(1); char jobvl = 'N'; char jobvr = (vecs_on) ? 'V' : 'N'; blas_int N = blas_int(X.n_rows); eT* vl = junk.memptr(); eT* vr = (vecs_on) ? vecs.memptr() : junk.memptr(); blas_int ldvl = blas_int(1); blas_int ldvr = (vecs_on) ? blas_int(vecs.n_rows) : blas_int(1); blas_int lwork = 64*N; // lwork_min = (std::max)(blas_int(1), 2*N) blas_int info = 0; podarray work( static_cast(lwork) ); podarray< T> rwork( static_cast(2*N) ); arma_extra_debug_print("lapack::cx_geev() -- START"); lapack::cx_geev(&jobvl, &jobvr, &N, X.memptr(), &N, vals.memptr(), vl, &ldvl, vr, &ldvr, work.memptr(), &lwork, rwork.memptr(), &info); arma_extra_debug_print("lapack::cx_geev() -- END"); return (info == 0); } #else { arma_ignore(vals); arma_ignore(vecs); arma_ignore(vecs_on); arma_ignore(expr); arma_stop_logic_error("eig_gen(): use of LAPACK must be enabled"); return false; } #endif } //! eigen decomposition of general square matrix (real, balance given matrix) template inline bool auxlib::eig_gen_balance ( Mat< std::complex >& vals, Mat< std::complex >& vecs, const bool vecs_on, const Base& expr ) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; Mat X = expr.get_ref(); arma_debug_check( (X.is_square() == false), "eig_gen(): given matrix must be square sized" ); arma_debug_assert_blas_size(X); if(X.is_empty()) { vals.reset(); vecs.reset(); return true; } if(X.is_finite() == false) { return false; } vals.set_size(X.n_rows, 1); Mat tmp(1, 1, arma_nozeros_indicator()); if(vecs_on) { vecs.set_size(X.n_rows, X.n_rows); tmp.set_size(X.n_rows, X.n_rows); } podarray junk(1); char bal = 'B'; char jobvl = 'N'; char jobvr = (vecs_on) ? 'V' : 'N'; char sense = 'N'; blas_int N = blas_int(X.n_rows); T* vl = junk.memptr(); T* vr = (vecs_on) ? tmp.memptr() : junk.memptr(); blas_int ldvl = blas_int(1); blas_int ldvr = (vecs_on) ? blas_int(tmp.n_rows) : blas_int(1); blas_int ilo = blas_int(0); blas_int ihi = blas_int(0); T abnrm = T(0); blas_int lwork = 64*N; // lwork_min = (vecs_on) ? (std::max)(blas_int(1), 2*N) : (std::max)(blas_int(1), 3*N) blas_int info = blas_int(0); podarray scale(X.n_rows); podarray rconde(X.n_rows); podarray rcondv(X.n_rows); podarray work( static_cast(lwork) ); podarray iwork( uword(1) ); // iwork not used by lapack::geevx() as sense = 'N' podarray vals_real(X.n_rows); podarray vals_imag(X.n_rows); arma_extra_debug_print("lapack::geevx() -- START"); lapack::geevx(&bal, &jobvl, &jobvr, &sense, &N, X.memptr(), &N, vals_real.memptr(), vals_imag.memptr(), vl, &ldvl, vr, &ldvr, &ilo, &ihi, scale.memptr(), &abnrm, rconde.memptr(), rcondv.memptr(), work.memptr(), &lwork, iwork.memptr(), &info); arma_extra_debug_print("lapack::geevx() -- END"); if(info != 0) { return false; } arma_extra_debug_print("reformatting eigenvalues and eigenvectors"); std::complex* vals_mem = vals.memptr(); for(uword i=0; i < X.n_rows; ++i) { vals_mem[i] = std::complex(vals_real[i], vals_imag[i]); } if(vecs_on) { for(uword j=0; j < X.n_rows; ++j) { if( (j < (X.n_rows-1)) && (vals_mem[j] == std::conj(vals_mem[j+1])) ) { for(uword i=0; i < X.n_rows; ++i) { vecs.at(i,j) = std::complex( tmp.at(i,j), tmp.at(i,j+1) ); vecs.at(i,j+1) = std::complex( tmp.at(i,j), -tmp.at(i,j+1) ); } ++j; } else { for(uword i=0; i(tmp.at(i,j), T(0)); } } } } return true; } #else { arma_ignore(vals); arma_ignore(vecs); arma_ignore(vecs_on); arma_ignore(expr); arma_stop_logic_error("eig_gen(): use of LAPACK must be enabled"); return false; } #endif } //! eigen decomposition of general square matrix (complex, balance given matrix) template inline bool auxlib::eig_gen_balance ( Mat< std::complex >& vals, Mat< std::complex >& vecs, const bool vecs_on, const Base< std::complex, T1 >& expr ) { arma_extra_debug_sigprint(); #if defined(ARMA_CRIPPLED_LAPACK) { arma_extra_debug_print("auxlib::eig_gen_balance(): redirecting to auxlib::eig_gen() due to crippled LAPACK"); return auxlib::eig_gen(vals, vecs, vecs_on, expr); } #elif defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; typedef typename std::complex eT; Mat X = expr.get_ref(); arma_debug_check( (X.is_square() == false), "eig_gen(): given matrix must be square sized" ); arma_debug_assert_blas_size(X); if(X.is_empty()) { vals.reset(); vecs.reset(); return true; } if(X.is_finite() == false) { return false; } vals.set_size(X.n_rows, 1); if(vecs_on) { vecs.set_size(X.n_rows, X.n_rows); } podarray junk(1); char bal = 'B'; char jobvl = 'N'; char jobvr = (vecs_on) ? 'V' : 'N'; char sense = 'N'; blas_int N = blas_int(X.n_rows); eT* vl = junk.memptr(); eT* vr = (vecs_on) ? vecs.memptr() : junk.memptr(); blas_int ldvl = blas_int(1); blas_int ldvr = (vecs_on) ? blas_int(vecs.n_rows) : blas_int(1); blas_int ilo = blas_int(0); blas_int ihi = blas_int(0); T abnrm = T(0); blas_int lwork = 64*N; // lwork_min = (std::max)(blas_int(1), blas_int(2*N)) blas_int info = blas_int(0); podarray scale(X.n_rows); podarray rconde(X.n_rows); podarray rcondv(X.n_rows); podarray work( static_cast(lwork) ); podarray< T> rwork( static_cast(2*N) ); arma_extra_debug_print("lapack::cx_geevx() -- START"); lapack::cx_geevx(&bal, &jobvl, &jobvr, &sense, &N, X.memptr(), &N, vals.memptr(), vl, &ldvl, vr, &ldvr, &ilo, &ihi, scale.memptr(), &abnrm, rconde.memptr(), rcondv.memptr(), work.memptr(), &lwork, rwork.memptr(), &info); arma_extra_debug_print("lapack::cx_geevx() -- END"); return (info == 0); } #else { arma_ignore(vals); arma_ignore(vecs); arma_ignore(vecs_on); arma_ignore(expr); arma_stop_logic_error("eig_gen(): use of LAPACK must be enabled"); return false; } #endif } //! two-sided eigen decomposition of general square matrix (real) template inline bool auxlib::eig_gen_twosided ( Mat< std::complex >& vals, Mat< std::complex >& lvecs, Mat< std::complex >& rvecs, const Base& expr ) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; Mat X = expr.get_ref(); arma_debug_check( (X.is_square() == false), "eig_gen(): given matrix must be square sized" ); arma_debug_assert_blas_size(X); if(X.is_empty()) { vals.reset(); lvecs.reset(); rvecs.reset(); return true; } if(X.is_finite() == false) { return false; } vals.set_size(X.n_rows, 1); lvecs.set_size(X.n_rows, X.n_rows); rvecs.set_size(X.n_rows, X.n_rows); Mat ltmp(X.n_rows, X.n_rows, arma_nozeros_indicator()); Mat rtmp(X.n_rows, X.n_rows, arma_nozeros_indicator()); char jobvl = 'V'; char jobvr = 'V'; blas_int N = blas_int(X.n_rows); blas_int ldvl = blas_int(ltmp.n_rows); blas_int ldvr = blas_int(rtmp.n_rows); blas_int lwork = 64*N; // lwork_min = (std::max)(blas_int(1), 4*N) blas_int info = 0; podarray work( static_cast(lwork) ); podarray vals_real(X.n_rows); podarray vals_imag(X.n_rows); arma_extra_debug_print("lapack::geev() -- START"); lapack::geev(&jobvl, &jobvr, &N, X.memptr(), &N, vals_real.memptr(), vals_imag.memptr(), ltmp.memptr(), &ldvl, rtmp.memptr(), &ldvr, work.memptr(), &lwork, &info); arma_extra_debug_print("lapack::geev() -- END"); if(info != 0) { return false; } arma_extra_debug_print("reformatting eigenvalues and eigenvectors"); std::complex* vals_mem = vals.memptr(); for(uword i=0; i < X.n_rows; ++i) { vals_mem[i] = std::complex(vals_real[i], vals_imag[i]); } for(uword j=0; j < X.n_rows; ++j) { if( (j < (X.n_rows-1)) && (vals_mem[j] == std::conj(vals_mem[j+1])) ) { for(uword i=0; i < X.n_rows; ++i) { lvecs.at(i,j) = std::complex( ltmp.at(i,j), ltmp.at(i,j+1) ); lvecs.at(i,j+1) = std::complex( ltmp.at(i,j), -ltmp.at(i,j+1) ); rvecs.at(i,j) = std::complex( rtmp.at(i,j), rtmp.at(i,j+1) ); rvecs.at(i,j+1) = std::complex( rtmp.at(i,j), -rtmp.at(i,j+1) ); } ++j; } else { for(uword i=0; i(ltmp.at(i,j), T(0)); rvecs.at(i,j) = std::complex(rtmp.at(i,j), T(0)); } } } return true; } #else { arma_ignore(vals); arma_ignore(lvecs); arma_ignore(rvecs); arma_ignore(expr); arma_stop_logic_error("eig_gen(): use of LAPACK must be enabled"); return false; } #endif } //! two-sided eigen decomposition of general square matrix (complex) template inline bool auxlib::eig_gen_twosided ( Mat< std::complex >& vals, Mat< std::complex >& lvecs, Mat< std::complex >& rvecs, const Base< std::complex, T1 >& expr ) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; typedef typename std::complex eT; Mat X = expr.get_ref(); arma_debug_check( (X.is_square() == false), "eig_gen(): given matrix must be square sized" ); arma_debug_assert_blas_size(X); if(X.is_empty()) { vals.reset(); lvecs.reset(); rvecs.reset(); return true; } if(X.is_finite() == false) { return false; } vals.set_size(X.n_rows, 1); lvecs.set_size(X.n_rows, X.n_rows); rvecs.set_size(X.n_rows, X.n_rows); char jobvl = 'V'; char jobvr = 'V'; blas_int N = blas_int(X.n_rows); blas_int ldvl = blas_int(lvecs.n_rows); blas_int ldvr = blas_int(rvecs.n_rows); blas_int lwork = 64*N; // lwork_min = (std::max)(blas_int(1), 2*N) blas_int info = 0; podarray work( static_cast(lwork) ); podarray< T> rwork( static_cast(2*N) ); arma_extra_debug_print("lapack::cx_geev() -- START"); lapack::cx_geev(&jobvl, &jobvr, &N, X.memptr(), &N, vals.memptr(), lvecs.memptr(), &ldvl, rvecs.memptr(), &ldvr, work.memptr(), &lwork, rwork.memptr(), &info); arma_extra_debug_print("lapack::cx_geev() -- END"); return (info == 0); } #else { arma_ignore(vals); arma_ignore(lvecs); arma_ignore(rvecs); arma_ignore(expr); arma_stop_logic_error("eig_gen(): use of LAPACK must be enabled"); return false; } #endif } //! two-sided eigen decomposition of general square matrix (real, balance given matrix) template inline bool auxlib::eig_gen_twosided_balance ( Mat< std::complex >& vals, Mat< std::complex >& lvecs, Mat< std::complex >& rvecs, const Base& expr ) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; Mat X = expr.get_ref(); arma_debug_check( (X.is_square() == false), "eig_gen(): given matrix must be square sized" ); arma_debug_assert_blas_size(X); if(X.is_empty()) { vals.reset(); lvecs.reset(); rvecs.reset(); return true; } if(X.is_finite() == false) { return false; } vals.set_size(X.n_rows, 1); lvecs.set_size(X.n_rows, X.n_rows); rvecs.set_size(X.n_rows, X.n_rows); Mat ltmp(X.n_rows, X.n_rows, arma_nozeros_indicator()); Mat rtmp(X.n_rows, X.n_rows, arma_nozeros_indicator()); char bal = 'B'; char jobvl = 'V'; char jobvr = 'V'; char sense = 'N'; blas_int N = blas_int(X.n_rows); blas_int ldvl = blas_int(ltmp.n_rows); blas_int ldvr = blas_int(rtmp.n_rows); blas_int ilo = blas_int(0); blas_int ihi = blas_int(0); T abnrm = T(0); blas_int lwork = 64*N; // lwork_min = (std::max)(blas_int(1), blas_int(3*N)) blas_int info = blas_int(0); podarray scale(X.n_rows); podarray rconde(X.n_rows); podarray rcondv(X.n_rows); podarray work( static_cast(lwork) ); podarray iwork( uword(1) ); // iwork not used by lapack::geevx() as sense = 'N' podarray vals_real(X.n_rows); podarray vals_imag(X.n_rows); arma_extra_debug_print("lapack::geevx() -- START"); lapack::geevx(&bal, &jobvl, &jobvr, &sense, &N, X.memptr(), &N, vals_real.memptr(), vals_imag.memptr(), ltmp.memptr(), &ldvl, rtmp.memptr(), &ldvr, &ilo, &ihi, scale.memptr(), &abnrm, rconde.memptr(), rcondv.memptr(), work.memptr(), &lwork, iwork.memptr(), &info); arma_extra_debug_print("lapack::geevx() -- END"); if(info != 0) { return false; } arma_extra_debug_print("reformatting eigenvalues and eigenvectors"); std::complex* vals_mem = vals.memptr(); for(uword i=0; i < X.n_rows; ++i) { vals_mem[i] = std::complex(vals_real[i], vals_imag[i]); } for(uword j=0; j < X.n_rows; ++j) { if( (j < (X.n_rows-1)) && (vals_mem[j] == std::conj(vals_mem[j+1])) ) { for(uword i=0; i < X.n_rows; ++i) { lvecs.at(i,j) = std::complex( ltmp.at(i,j), ltmp.at(i,j+1) ); lvecs.at(i,j+1) = std::complex( ltmp.at(i,j), -ltmp.at(i,j+1) ); rvecs.at(i,j) = std::complex( rtmp.at(i,j), rtmp.at(i,j+1) ); rvecs.at(i,j+1) = std::complex( rtmp.at(i,j), -rtmp.at(i,j+1) ); } ++j; } else { for(uword i=0; i(ltmp.at(i,j), T(0)); rvecs.at(i,j) = std::complex(rtmp.at(i,j), T(0)); } } } return true; } #else { arma_ignore(vals); arma_ignore(lvecs); arma_ignore(rvecs); arma_ignore(expr); arma_stop_logic_error("eig_gen(): use of LAPACK must be enabled"); return false; } #endif } //! two-sided eigen decomposition of general square matrix (complex, balance given matrix) template inline bool auxlib::eig_gen_twosided_balance ( Mat< std::complex >& vals, Mat< std::complex >& lvecs, Mat< std::complex >& rvecs, const Base< std::complex, T1 >& expr ) { arma_extra_debug_sigprint(); #if defined(ARMA_CRIPPLED_LAPACK) { arma_extra_debug_print("auxlib::eig_gen_twosided_balance(): redirecting to auxlib::eig_gen() due to crippled LAPACK"); return auxlib::eig_gen(vals, lvecs, rvecs, expr); } #elif defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; typedef typename std::complex eT; Mat X = expr.get_ref(); arma_debug_check( (X.is_square() == false), "eig_gen(): given matrix must be square sized" ); arma_debug_assert_blas_size(X); if(X.is_empty()) { vals.reset(); lvecs.reset(); rvecs.reset(); return true; } if(X.is_finite() == false) { return false; } vals.set_size(X.n_rows, 1); lvecs.set_size(X.n_rows, X.n_rows); rvecs.set_size(X.n_rows, X.n_rows); char bal = 'B'; char jobvl = 'V'; char jobvr = 'V'; char sense = 'N'; blas_int N = blas_int(X.n_rows); blas_int ldvl = blas_int(lvecs.n_rows); blas_int ldvr = blas_int(rvecs.n_rows); blas_int ilo = blas_int(0); blas_int ihi = blas_int(0); T abnrm = T(0); blas_int lwork = 64*N; // lwork_min = (std::max)(blas_int(1), blas_int(2*N)) blas_int info = blas_int(0); podarray scale(X.n_rows); podarray rconde(X.n_rows); podarray rcondv(X.n_rows); podarray work( static_cast(lwork) ); podarray< T> rwork( static_cast(2*N) ); arma_extra_debug_print("lapack::cx_geevx() -- START"); lapack::cx_geevx(&bal, &jobvl, &jobvr, &sense, &N, X.memptr(), &N, vals.memptr(), lvecs.memptr(), &ldvl, rvecs.memptr(), &ldvr, &ilo, &ihi, scale.memptr(), &abnrm, rconde.memptr(), rcondv.memptr(), work.memptr(), &lwork, rwork.memptr(), &info); arma_extra_debug_print("lapack::cx_geevx() -- END"); return (info == 0); } #else { arma_ignore(vals); arma_ignore(lvecs); arma_ignore(rvecs); arma_ignore(expr); arma_stop_logic_error("eig_gen(): use of LAPACK must be enabled"); return false; } #endif } //! eigendecomposition of general square matrix pair (real) template inline bool auxlib::eig_pair ( Mat< std::complex >& vals, Mat< std::complex >& vecs, const bool vecs_on, const Base& A_expr, const Base& B_expr ) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; typedef std::complex eT; Mat A(A_expr.get_ref()); Mat B(B_expr.get_ref()); arma_debug_check( ((A.is_square() == false) || (B.is_square() == false)), "eig_pair(): given matrices must be square sized" ); arma_debug_check( (A.n_rows != B.n_rows), "eig_pair(): given matrices must have the same size" ); arma_debug_assert_blas_size(A); if(A.is_empty()) { vals.reset(); vecs.reset(); return true; } if(A.is_finite() == false) { return false; } if(B.is_finite() == false) { return false; } vals.set_size(A.n_rows, 1); Mat tmp(1, 1, arma_nozeros_indicator()); if(vecs_on) { vecs.set_size(A.n_rows, A.n_rows); tmp.set_size(A.n_rows, A.n_rows); } podarray junk(1); char jobvl = 'N'; char jobvr = (vecs_on) ? 'V' : 'N'; blas_int N = blas_int(A.n_rows); T* vl = junk.memptr(); T* vr = (vecs_on) ? tmp.memptr() : junk.memptr(); blas_int ldvl = blas_int(1); blas_int ldvr = (vecs_on) ? blas_int(tmp.n_rows) : blas_int(1); blas_int lwork = 64*N; // lwork_min = (std::max)(blas_int(1), 8*N) blas_int info = 0; podarray alphar(A.n_rows); podarray alphai(A.n_rows); podarray beta(A.n_rows); podarray work( static_cast(lwork) ); arma_extra_debug_print("lapack::ggev()"); lapack::ggev(&jobvl, &jobvr, &N, A.memptr(), &N, B.memptr(), &N, alphar.memptr(), alphai.memptr(), beta.memptr(), vl, &ldvl, vr, &ldvr, work.memptr(), &lwork, &info); if(info != 0) { return false; } arma_extra_debug_print("reformatting eigenvalues and eigenvectors"); eT* vals_mem = vals.memptr(); const T* alphar_mem = alphar.memptr(); const T* alphai_mem = alphai.memptr(); const T* beta_mem = beta.memptr(); bool beta_has_zero = false; for(uword j=0; j(re, im); if( (alphai_val > T(0)) && (j < (A.n_rows-1)) ) { ++j; vals_mem[j] = std::complex(re,-im); // force exact conjugate } } if(beta_has_zero) { arma_debug_warn_level(1, "eig_pair(): given matrices appear ill-conditioned"); } if(vecs_on) { for(uword j=0; j( tmp.at(i,j), tmp.at(i,j+1) ); vecs.at(i,j+1) = std::complex( tmp.at(i,j), -tmp.at(i,j+1) ); } ++j; } else { for(uword i=0; i(tmp.at(i,j), T(0)); } } } } return true; } #else { arma_ignore(vals); arma_ignore(vecs); arma_ignore(vecs_on); arma_ignore(A_expr); arma_ignore(B_expr); arma_stop_logic_error("eig_pair(): use of LAPACK must be enabled"); return false; } #endif } //! eigendecomposition of general square matrix pair (complex) template inline bool auxlib::eig_pair ( Mat< std::complex >& vals, Mat< std::complex >& vecs, const bool vecs_on, const Base< std::complex, T1 >& A_expr, const Base< std::complex, T2 >& B_expr ) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; typedef typename std::complex eT; Mat A(A_expr.get_ref()); Mat B(B_expr.get_ref()); arma_debug_check( ((A.is_square() == false) || (B.is_square() == false)), "eig_pair(): given matrices must be square sized" ); arma_debug_check( (A.n_rows != B.n_rows), "eig_pair(): given matrices must have the same size" ); arma_debug_assert_blas_size(A); if(A.is_empty()) { vals.reset(); vecs.reset(); return true; } if(A.is_finite() == false) { return false; } if(B.is_finite() == false) { return false; } vals.set_size(A.n_rows, 1); if(vecs_on) { vecs.set_size(A.n_rows, A.n_rows); } podarray junk(1); char jobvl = 'N'; char jobvr = (vecs_on) ? 'V' : 'N'; blas_int N = blas_int(A.n_rows); eT* vl = junk.memptr(); eT* vr = (vecs_on) ? vecs.memptr() : junk.memptr(); blas_int ldvl = blas_int(1); blas_int ldvr = (vecs_on) ? blas_int(vecs.n_rows) : blas_int(1); blas_int lwork = 64*N; // lwork_min = (std::max)(blas_int(1),2*N) blas_int info = 0; podarray alpha(A.n_rows); podarray beta(A.n_rows); podarray work( static_cast(lwork) ); podarray rwork( static_cast(8*N) ); arma_extra_debug_print("lapack::cx_ggev()"); lapack::cx_ggev(&jobvl, &jobvr, &N, A.memptr(), &N, B.memptr(), &N, alpha.memptr(), beta.memptr(), vl, &ldvl, vr, &ldvr, work.memptr(), &lwork, rwork.memptr(), &info); if(info != 0) { return false; } eT* vals_mem = vals.memptr(); const eT* alpha_mem = alpha.memptr(); const eT* beta_mem = beta.memptr(); const std::complex zero(T(0), T(0)); bool beta_has_zero = false; for(uword i=0; i inline bool auxlib::eig_pair_twosided ( Mat< std::complex >& vals, Mat< std::complex >& lvecs, Mat< std::complex >& rvecs, const Base& A_expr, const Base& B_expr ) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; typedef std::complex eT; Mat A(A_expr.get_ref()); Mat B(B_expr.get_ref()); arma_debug_check( ((A.is_square() == false) || (B.is_square() == false)), "eig_pair(): given matrices must be square sized" ); arma_debug_check( (A.n_rows != B.n_rows), "eig_pair(): given matrices must have the same size" ); arma_debug_assert_blas_size(A); if(A.is_empty()) { vals.reset(); lvecs.reset(); rvecs.reset(); return true; } if(A.is_finite() == false) { return false; } if(B.is_finite() == false) { return false; } vals.set_size(A.n_rows, 1); lvecs.set_size(A.n_rows, A.n_rows); rvecs.set_size(A.n_rows, A.n_rows); Mat ltmp(A.n_rows, A.n_rows, arma_nozeros_indicator()); Mat rtmp(A.n_rows, A.n_rows, arma_nozeros_indicator()); char jobvl = 'V'; char jobvr = 'V'; blas_int N = blas_int(A.n_rows); blas_int ldvl = blas_int(ltmp.n_rows); blas_int ldvr = blas_int(rtmp.n_rows); blas_int lwork = 64*N; // lwork_min = (std::max)(blas_int(1), 8*N) blas_int info = 0; podarray alphar(A.n_rows); podarray alphai(A.n_rows); podarray beta(A.n_rows); podarray work( static_cast(lwork) ); arma_extra_debug_print("lapack::ggev()"); lapack::ggev(&jobvl, &jobvr, &N, A.memptr(), &N, B.memptr(), &N, alphar.memptr(), alphai.memptr(), beta.memptr(), ltmp.memptr(), &ldvl, rtmp.memptr(), &ldvr, work.memptr(), &lwork, &info); if(info != 0) { return false; } arma_extra_debug_print("reformatting eigenvalues and eigenvectors"); eT* vals_mem = vals.memptr(); const T* alphar_mem = alphar.memptr(); const T* alphai_mem = alphai.memptr(); const T* beta_mem = beta.memptr(); bool beta_has_zero = false; for(uword j=0; j(re, im); if( (alphai_val > T(0)) && (j < (A.n_rows-1)) ) { ++j; vals_mem[j] = std::complex(re,-im); // force exact conjugate } } if(beta_has_zero) { arma_debug_warn_level(1, "eig_pair(): given matrices appear ill-conditioned"); } for(uword j=0; j < A.n_rows; ++j) { if( (j < (A.n_rows-1)) && (vals_mem[j] == std::conj(vals_mem[j+1])) ) { for(uword i=0; i < A.n_rows; ++i) { lvecs.at(i,j) = std::complex( ltmp.at(i,j), ltmp.at(i,j+1) ); lvecs.at(i,j+1) = std::complex( ltmp.at(i,j), -ltmp.at(i,j+1) ); rvecs.at(i,j) = std::complex( rtmp.at(i,j), rtmp.at(i,j+1) ); rvecs.at(i,j+1) = std::complex( rtmp.at(i,j), -rtmp.at(i,j+1) ); } ++j; } else { for(uword i=0; i(ltmp.at(i,j), T(0)); rvecs.at(i,j) = std::complex(rtmp.at(i,j), T(0)); } } } return true; } #else { arma_ignore(vals); arma_ignore(lvecs); arma_ignore(rvecs); arma_ignore(A_expr); arma_ignore(B_expr); arma_stop_logic_error("eig_pair(): use of LAPACK must be enabled"); return false; } #endif } //! two-sided eigendecomposition of general square matrix pair (complex) template inline bool auxlib::eig_pair_twosided ( Mat< std::complex >& vals, Mat< std::complex >& lvecs, Mat< std::complex >& rvecs, const Base< std::complex, T1 >& A_expr, const Base< std::complex, T2 >& B_expr ) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; typedef typename std::complex eT; Mat A(A_expr.get_ref()); Mat B(B_expr.get_ref()); arma_debug_check( ((A.is_square() == false) || (B.is_square() == false)), "eig_pair(): given matrices must be square sized" ); arma_debug_check( (A.n_rows != B.n_rows), "eig_pair(): given matrices must have the same size" ); arma_debug_assert_blas_size(A); if(A.is_empty()) { vals.reset(); lvecs.reset(); rvecs.reset(); return true; } if(A.is_finite() == false) { return false; } if(B.is_finite() == false) { return false; } vals.set_size(A.n_rows, 1); lvecs.set_size(A.n_rows, A.n_rows); rvecs.set_size(A.n_rows, A.n_rows); char jobvl = 'V'; char jobvr = 'V'; blas_int N = blas_int(A.n_rows); blas_int ldvl = blas_int(lvecs.n_rows); blas_int ldvr = blas_int(rvecs.n_rows); blas_int lwork = 64*N; // lwork_min = (std::max)(blas_int(1),2*N) blas_int info = 0; podarray alpha(A.n_rows); podarray beta(A.n_rows); podarray work( static_cast(lwork) ); podarray rwork( static_cast(8*N) ); arma_extra_debug_print("lapack::cx_ggev()"); lapack::cx_ggev(&jobvl, &jobvr, &N, A.memptr(), &N, B.memptr(), &N, alpha.memptr(), beta.memptr(), lvecs.memptr(), &ldvl, rvecs.memptr(), &ldvr, work.memptr(), &lwork, rwork.memptr(), &info); if(info != 0) { return false; } eT* vals_mem = vals.memptr(); const eT* alpha_mem = alpha.memptr(); const eT* beta_mem = beta.memptr(); const std::complex zero(T(0), T(0)); bool beta_has_zero = false; for(uword i=0; i inline bool auxlib::eig_sym(Col& eigval, Mat& A) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { arma_debug_check( (A.is_square() == false), "eig_sym(): given matrix must be square sized" ); if(A.is_empty()) { eigval.reset(); return true; } // if(auxlib::rudimentary_sym_check(A) == false) // { // arma_debug_warn_level(1, "eig_sym(): given matrix is not symmetric"); // return false; // } if((arma_config::debug) && (auxlib::rudimentary_sym_check(A) == false)) { arma_debug_warn_level(1, "eig_sym(): given matrix is not symmetric"); } arma_debug_assert_blas_size(A); eigval.set_size(A.n_rows); char jobz = 'N'; char uplo = 'U'; blas_int N = blas_int(A.n_rows); blas_int lwork = (64+2)*N; // lwork_min = (std::max)(blas_int(1), 3*N-1) blas_int info = 0; podarray work( static_cast(lwork) ); arma_extra_debug_print("lapack::syev()"); lapack::syev(&jobz, &uplo, &N, A.memptr(), &N, eigval.memptr(), work.memptr(), &lwork, &info); return (info == 0); } #else { arma_ignore(eigval); arma_ignore(A); arma_stop_logic_error("eig_sym(): use of LAPACK must be enabled"); return false; } #endif } //! eigenvalues of a hermitian complex matrix template inline bool auxlib::eig_sym(Col& eigval, Mat< std::complex >& A) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename std::complex eT; arma_debug_check( (A.is_square() == false), "eig_sym(): given matrix must be square sized" ); if(A.is_empty()) { eigval.reset(); return true; } // if(auxlib::rudimentary_sym_check(A) == false) // { // arma_debug_warn_level(1, "eig_sym(): given matrix is not hermitian"); // return false; // } if((arma_config::debug) && (auxlib::rudimentary_sym_check(A) == false)) { arma_debug_warn_level(1, "eig_sym(): given matrix is not hermitian"); } arma_debug_assert_blas_size(A); eigval.set_size(A.n_rows); char jobz = 'N'; char uplo = 'U'; blas_int N = blas_int(A.n_rows); blas_int lwork = (64+1)*N; // lwork_min = (std::max)(blas_int(1), 2*N-1) blas_int info = 0; podarray work( static_cast(lwork) ); podarray rwork( static_cast( (std::max)(blas_int(1), 3*N) ) ); arma_extra_debug_print("lapack::heev()"); lapack::heev(&jobz, &uplo, &N, A.memptr(), &N, eigval.memptr(), work.memptr(), &lwork, rwork.memptr(), &info); return (info == 0); } #else { arma_ignore(eigval); arma_ignore(A); arma_stop_logic_error("eig_sym(): use of LAPACK must be enabled"); return false; } #endif } //! eigenvalues and eigenvectors of a symmetric real matrix template inline bool auxlib::eig_sym(Col& eigval, Mat& eigvec, const Mat& X) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { arma_debug_check( (X.is_square() == false), "eig_sym(): given matrix must be square sized" ); eigvec = X; if(eigvec.is_empty()) { eigval.reset(); eigvec.reset(); return true; } arma_debug_assert_blas_size(eigvec); eigval.set_size(eigvec.n_rows); char jobz = 'V'; char uplo = 'U'; blas_int N = blas_int(eigvec.n_rows); blas_int lwork = (64+2)*N; // lwork_min = (std::max)(blas_int(1), 3*N-1) blas_int info = 0; podarray work( static_cast(lwork) ); arma_extra_debug_print("lapack::syev()"); lapack::syev(&jobz, &uplo, &N, eigvec.memptr(), &N, eigval.memptr(), work.memptr(), &lwork, &info); return (info == 0); } #else { arma_ignore(eigval); arma_ignore(eigvec); arma_ignore(X); arma_stop_logic_error("eig_sym(): use of LAPACK must be enabled"); return false; } #endif } //! eigenvalues and eigenvectors of a hermitian complex matrix template inline bool auxlib::eig_sym(Col& eigval, Mat< std::complex >& eigvec, const Mat< std::complex >& X) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename std::complex eT; arma_debug_check( (X.is_square() == false), "eig_sym(): given matrix must be square sized" ); eigvec = X; if(eigvec.is_empty()) { eigval.reset(); eigvec.reset(); return true; } arma_debug_assert_blas_size(eigvec); eigval.set_size(eigvec.n_rows); char jobz = 'V'; char uplo = 'U'; blas_int N = blas_int(eigvec.n_rows); blas_int lwork = (64+1)*N; // lwork_min = (std::max)(blas_int(1), 2*N-1) blas_int info = 0; podarray work( static_cast(lwork) ); podarray rwork( static_cast((std::max)(blas_int(1), 3*N)) ); arma_extra_debug_print("lapack::heev()"); lapack::heev(&jobz, &uplo, &N, eigvec.memptr(), &N, eigval.memptr(), work.memptr(), &lwork, rwork.memptr(), &info); return (info == 0); } #else { arma_ignore(eigval); arma_ignore(eigvec); arma_ignore(X); arma_stop_logic_error("eig_sym(): use of LAPACK must be enabled"); return false; } #endif } //! eigenvalues and eigenvectors of a symmetric real matrix (divide and conquer algorithm) template inline bool auxlib::eig_sym_dc(Col& eigval, Mat& eigvec, const Mat& X) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { arma_debug_check( (X.is_square() == false), "eig_sym(): given matrix must be square sized" ); eigvec = X; if(eigvec.is_empty()) { eigval.reset(); eigvec.reset(); return true; } arma_debug_assert_blas_size(eigvec); eigval.set_size(eigvec.n_rows); char jobz = 'V'; char uplo = 'U'; blas_int N = blas_int(eigvec.n_rows); blas_int lwork_min = 1 + 6*N + 2*(N*N); blas_int liwork_min = 3 + 5*N; blas_int info = 0; blas_int lwork_proposed = 0; blas_int liwork_proposed = 0; if(N >= 32) { eT work_query[2]; blas_int iwork_query[2]; blas_int lwork_query = -1; blas_int liwork_query = -1; arma_extra_debug_print("lapack::syevd()"); lapack::syevd(&jobz, &uplo, &N, eigvec.memptr(), &N, eigval.memptr(), &work_query[0], &lwork_query, &iwork_query[0], &liwork_query, &info); if(info != 0) { return false; } lwork_proposed = static_cast( work_query[0] ); liwork_proposed = iwork_query[0]; } blas_int lwork_final = (std::max)( lwork_proposed, lwork_min); blas_int liwork_final = (std::max)(liwork_proposed, liwork_min); podarray work( static_cast( lwork_final) ); podarray iwork( static_cast(liwork_final) ); arma_extra_debug_print("lapack::syevd()"); lapack::syevd(&jobz, &uplo, &N, eigvec.memptr(), &N, eigval.memptr(), work.memptr(), &lwork_final, iwork.memptr(), &liwork_final, &info); return (info == 0); } #else { arma_ignore(eigval); arma_ignore(eigvec); arma_ignore(X); arma_stop_logic_error("eig_sym(): use of LAPACK must be enabled"); return false; } #endif } //! eigenvalues and eigenvectors of a hermitian complex matrix (divide and conquer algorithm) template inline bool auxlib::eig_sym_dc(Col& eigval, Mat< std::complex >& eigvec, const Mat< std::complex >& X) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename std::complex eT; arma_debug_check( (X.is_square() == false), "eig_sym(): given matrix must be square sized" ); eigvec = X; if(eigvec.is_empty()) { eigval.reset(); eigvec.reset(); return true; } arma_debug_assert_blas_size(eigvec); eigval.set_size(eigvec.n_rows); char jobz = 'V'; char uplo = 'U'; blas_int N = blas_int(eigvec.n_rows); blas_int lwork_min = 2*N + N*N; blas_int lrwork_min = 1 + 5*N + 2*(N*N); blas_int liwork_min = 3 + 5*N; blas_int info = 0; blas_int lwork_proposed = 0; blas_int lrwork_proposed = 0; blas_int liwork_proposed = 0; if(N >= 32) { eT work_query[2]; T rwork_query[2]; blas_int iwork_query[2]; blas_int lwork_query = -1; blas_int lrwork_query = -1; blas_int liwork_query = -1; arma_extra_debug_print("lapack::heevd()"); lapack::heevd(&jobz, &uplo, &N, eigvec.memptr(), &N, eigval.memptr(), &work_query[0], &lwork_query, &rwork_query[0], &lrwork_query, &iwork_query[0], &liwork_query, &info); if(info != 0) { return false; } lwork_proposed = static_cast( access::tmp_real(work_query[0]) ); lrwork_proposed = static_cast( rwork_query[0] ); liwork_proposed = iwork_query[0]; } blas_int lwork_final = (std::max)( lwork_proposed, lwork_min); blas_int lrwork_final = (std::max)(lrwork_proposed, lrwork_min); blas_int liwork_final = (std::max)(liwork_proposed, liwork_min); podarray work( static_cast( lwork_final) ); podarray< T> rwork( static_cast(lrwork_final) ); podarray iwork( static_cast(liwork_final) ); arma_extra_debug_print("lapack::heevd()"); lapack::heevd(&jobz, &uplo, &N, eigvec.memptr(), &N, eigval.memptr(), work.memptr(), &lwork_final, rwork.memptr(), &lrwork_final, iwork.memptr(), &liwork_final, &info); return (info == 0); } #else { arma_ignore(eigval); arma_ignore(eigvec); arma_ignore(X); arma_stop_logic_error("eig_sym(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::chol_simple(Mat& X) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_ATLAS) { arma_debug_assert_atlas_size(X); int info = 0; arma_extra_debug_print("atlas::clapack_potrf()"); info = atlas::clapack_potrf(atlas::CblasColMajor, atlas::CblasUpper, X.n_rows, X.memptr(), X.n_rows); return (info == 0); } #elif defined(ARMA_USE_LAPACK) { arma_debug_assert_blas_size(X); char uplo = 'U'; blas_int n = blas_int(X.n_rows); blas_int info = 0; arma_extra_debug_print("lapack::potrf()"); lapack::potrf(&uplo, &n, X.memptr(), &n, &info); return (info == 0); } #else { arma_ignore(X); arma_stop_logic_error("chol(): use of ATLAS or LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::chol(Mat& X, const uword layout) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_ATLAS) { arma_debug_assert_atlas_size(X); int info = 0; arma_extra_debug_print("atlas::clapack_potrf()"); info = atlas::clapack_potrf(atlas::CblasColMajor, ((layout == 0) ? atlas::CblasUpper : atlas::CblasLower), X.n_rows, X.memptr(), X.n_rows); if(info != 0) { return false; } X = (layout == 0) ? trimatu(X) : trimatl(X); // trimatu() and trimatl() return the same type return true; } #elif defined(ARMA_USE_LAPACK) { arma_debug_assert_blas_size(X); char uplo = (layout == 0) ? 'U' : 'L'; blas_int n = blas_int(X.n_rows); blas_int info = 0; arma_extra_debug_print("lapack::potrf()"); lapack::potrf(&uplo, &n, X.memptr(), &n, &info); if(info != 0) { return false; } X = (layout == 0) ? trimatu(X) : trimatl(X); // trimatu() and trimatl() return the same type return true; } #else { arma_ignore(X); arma_ignore(layout); arma_stop_logic_error("chol(): use of ATLAS or LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::chol_band(Mat& X, const uword KD, const uword layout) { arma_extra_debug_sigprint(); return auxlib::chol_band_common(X, KD, layout); } template inline bool auxlib::chol_band(Mat< std::complex >& X, const uword KD, const uword layout) { arma_extra_debug_sigprint(); #if defined(ARMA_CRIPPLED_LAPACK) { arma_extra_debug_print("auxlib::chol_band(): redirecting to auxlib::chol() due to crippled LAPACK"); arma_ignore(KD); return auxlib::chol(X, layout); } #else { return auxlib::chol_band_common(X, KD, layout); } #endif } template inline bool auxlib::chol_band_common(Mat& X, const uword KD, const uword layout) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { const uword N = X.n_rows; const uword KL = (layout == 0) ? uword(0) : KD; const uword KU = (layout == 0) ? KD : uword(0); Mat AB; band_helper::compress(AB, X, KL, KU, false); arma_debug_assert_blas_size(AB); char uplo = (layout == 0) ? 'U' : 'L'; blas_int n = blas_int(N); blas_int kd = blas_int(KD); blas_int ldab = blas_int(AB.n_rows); blas_int info = 0; arma_extra_debug_print("lapack::pbtrf()"); lapack::pbtrf(&uplo, &n, &kd, AB.memptr(), &ldab, &info); if(info != 0) { return false; } band_helper::uncompress(X, AB, KL, KU, false); return true; } #else { arma_ignore(X); arma_ignore(KD); arma_ignore(layout); arma_stop_logic_error("chol(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::chol_pivot(Mat& X, Mat& P, const uword layout) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename get_pod_type::result T; arma_debug_assert_blas_size(X); char uplo = (layout == 0) ? 'U' : 'L'; blas_int n = blas_int(X.n_rows); blas_int rank = 0; T tol = T(-1); blas_int info = 0; podarray ipiv( X.n_rows); podarray work(2*X.n_rows); ipiv.zeros(); arma_extra_debug_print("lapack::pstrf()"); lapack::pstrf(&uplo, &n, X.memptr(), &n, ipiv.memptr(), &rank, &tol, work.memptr(), &info); if(info != 0) { return false; } X = (layout == 0) ? trimatu(X) : trimatl(X); // trimatu() and trimatl() return the same type P.set_size(X.n_rows, 1); for(uword i=0; i < X.n_rows; ++i) { P[i] = uword(ipiv[i] - 1); // take into account that Fortran counts from 1 } return true; } #else { arma_ignore(X); arma_ignore(P); arma_ignore(layout); arma_stop_logic_error("chol(): use of LAPACK must be enabled"); return false; } #endif } // // hessenberg decomposition template inline bool auxlib::hess(Mat& H, const Base& X, Col& tao) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { H = X.get_ref(); arma_debug_check( (H.is_square() == false), "hess(): given matrix must be square sized" ); if(H.is_empty()) { return true; } arma_debug_assert_blas_size(H); if(H.n_rows > 2) { tao.set_size(H.n_rows-1); blas_int n = blas_int(H.n_rows); blas_int ilo = 1; blas_int ihi = blas_int(H.n_rows); blas_int lda = blas_int(H.n_rows); blas_int lwork = blas_int(H.n_rows) * 64; blas_int info = 0; podarray work(static_cast(lwork)); arma_extra_debug_print("lapack::gehrd()"); lapack::gehrd(&n, &ilo, &ihi, H.memptr(), &lda, tao.memptr(), work.memptr(), &lwork, &info); return (info == 0); } return true; } #else { arma_ignore(H); arma_ignore(X); arma_ignore(tao); arma_stop_logic_error("hess(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::qr(Mat& Q, Mat& R, const Base& X) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { R = X.get_ref(); const uword R_n_rows = R.n_rows; const uword R_n_cols = R.n_cols; if(R.is_empty()) { Q.eye(R_n_rows, R_n_rows); return true; } arma_debug_assert_blas_size(R); blas_int m = static_cast(R_n_rows); blas_int n = static_cast(R_n_cols); blas_int lwork_min = (std::max)(blas_int(1), (std::max)(m,n)); // take into account requirements of geqrf() _and_ orgqr()/ungqr() blas_int k = (std::min)(m,n); blas_int info = 0; podarray tau( static_cast(k) ); eT work_query[2]; blas_int lwork_query = -1; arma_extra_debug_print("lapack::geqrf()"); lapack::geqrf(&m, &n, R.memptr(), &m, tau.memptr(), &work_query[0], &lwork_query, &info); if(info != 0) { return false; } blas_int lwork_proposed = static_cast( access::tmp_real(work_query[0]) ); blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::geqrf()"); lapack::geqrf(&m, &n, R.memptr(), &m, tau.memptr(), work.memptr(), &lwork_final, &info); if(info != 0) { return false; } Q.set_size(R_n_rows, R_n_rows); arrayops::copy( Q.memptr(), R.memptr(), (std::min)(Q.n_elem, R.n_elem) ); // // construct R for(uword col=0; col < R_n_cols; ++col) { for(uword row=(col+1); row < R_n_rows; ++row) { R.at(row,col) = eT(0); } } if( (is_float::value) || (is_double::value) ) { arma_extra_debug_print("lapack::orgqr()"); lapack::orgqr(&m, &m, &k, Q.memptr(), &m, tau.memptr(), work.memptr(), &lwork_final, &info); } else if( (is_cx_float::value) || (is_cx_double::value) ) { arma_extra_debug_print("lapack::ungqr()"); lapack::ungqr(&m, &m, &k, Q.memptr(), &m, tau.memptr(), work.memptr(), &lwork_final, &info); } return (info == 0); } #else { arma_ignore(Q); arma_ignore(R); arma_ignore(X); arma_stop_logic_error("qr(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::qr_econ(Mat& Q, Mat& R, const Base& X) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { if(is_Mat::value) { const unwrap tmp(X.get_ref()); const Mat& M = tmp.M; if(M.n_rows < M.n_cols) { return auxlib::qr(Q, R, X); } } Q = X.get_ref(); const uword Q_n_rows = Q.n_rows; const uword Q_n_cols = Q.n_cols; if( Q_n_rows <= Q_n_cols ) { return auxlib::qr(Q, R, Q); } if(Q.is_empty()) { Q.set_size(Q_n_rows, 0 ); R.set_size(0, Q_n_cols); return true; } arma_debug_assert_blas_size(Q); blas_int m = static_cast(Q_n_rows); blas_int n = static_cast(Q_n_cols); blas_int lwork_min = (std::max)(blas_int(1), (std::max)(m,n)); // take into account requirements of geqrf() _and_ orgqr()/ungqr() blas_int k = (std::min)(m,n); blas_int info = 0; podarray tau( static_cast(k) ); eT work_query[2]; blas_int lwork_query = -1; arma_extra_debug_print("lapack::geqrf()"); lapack::geqrf(&m, &n, Q.memptr(), &m, tau.memptr(), &work_query[0], &lwork_query, &info); if(info != 0) { return false; } blas_int lwork_proposed = static_cast( access::tmp_real(work_query[0]) ); blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::geqrf()"); lapack::geqrf(&m, &n, Q.memptr(), &m, tau.memptr(), work.memptr(), &lwork_final, &info); if(info != 0) { return false; } R.zeros(Q_n_cols, Q_n_cols); // // construct R for(uword col=0; col < Q_n_cols; ++col) { for(uword row=0; row <= col; ++row) { R.at(row,col) = Q.at(row,col); } } if( (is_float::value) || (is_double::value) ) { arma_extra_debug_print("lapack::orgqr()"); lapack::orgqr(&m, &n, &k, Q.memptr(), &m, tau.memptr(), work.memptr(), &lwork_final, &info); } else if( (is_cx_float::value) || (is_cx_double::value) ) { arma_extra_debug_print("lapack::ungqr()"); lapack::ungqr(&m, &n, &k, Q.memptr(), &m, tau.memptr(), work.memptr(), &lwork_final, &info); } return (info == 0); } #else { arma_ignore(Q); arma_ignore(R); arma_ignore(X); arma_stop_logic_error("qr_econ(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::qr_pivot(Mat& Q, Mat& R, Mat& P, const Base& X) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { R = X.get_ref(); const uword R_n_rows = R.n_rows; const uword R_n_cols = R.n_cols; if(R.is_empty()) { Q.eye(R_n_rows, R_n_rows); P.set_size(R_n_cols, 1); for(uword col=0; col < R_n_cols; ++col) { P.at(col) = col; } return true; } arma_debug_assert_blas_size(R); blas_int m = static_cast(R_n_rows); blas_int n = static_cast(R_n_cols); blas_int lwork_min = (std::max)(blas_int(3*n + 1), (std::max)(m,n)); // take into account requirements of geqp3() and orgqr() blas_int k = (std::min)(m,n); blas_int info = 0; podarray tau( static_cast(k) ); podarray jpvt( R_n_cols ); jpvt.zeros(); eT work_query[2]; blas_int lwork_query = -1; arma_extra_debug_print("lapack::geqp3()"); lapack::geqp3(&m, &n, R.memptr(), &m, jpvt.memptr(), tau.memptr(), &work_query[0], &lwork_query, &info); if(info != 0) { return false; } blas_int lwork_proposed = static_cast( access::tmp_real(work_query[0]) ); blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::geqp3()"); lapack::geqp3(&m, &n, R.memptr(), &m, jpvt.memptr(), tau.memptr(), work.memptr(), &lwork_final, &info); if(info != 0) { return false; } Q.set_size(R_n_rows, R_n_rows); arrayops::copy( Q.memptr(), R.memptr(), (std::min)(Q.n_elem, R.n_elem) ); // // construct R and P P.set_size(R_n_cols, 1); for(uword col=0; col < R_n_cols; ++col) { for(uword row=(col+1); row < R_n_rows; ++row) { R.at(row,col) = eT(0); } P.at(col) = jpvt[col] - 1; // take into account that Fortran counts from 1 } arma_extra_debug_print("lapack::orgqr()"); lapack::orgqr(&m, &m, &k, Q.memptr(), &m, tau.memptr(), work.memptr(), &lwork_final, &info); return (info == 0); } #else { arma_ignore(Q); arma_ignore(R); arma_ignore(P); arma_ignore(X); arma_stop_logic_error("qr(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::qr_pivot(Mat< std::complex >& Q, Mat< std::complex >& R, Mat& P, const Base,T1>& X) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename std::complex eT; R = X.get_ref(); const uword R_n_rows = R.n_rows; const uword R_n_cols = R.n_cols; if(R.is_empty()) { Q.eye(R_n_rows, R_n_rows); P.set_size(R_n_cols, 1); for(uword col=0; col < R_n_cols; ++col) { P.at(col) = col; } return true; } arma_debug_assert_blas_size(R); blas_int m = static_cast(R_n_rows); blas_int n = static_cast(R_n_cols); blas_int lwork_min = (std::max)(blas_int(3*n + 1), (std::max)(m,n)); // take into account requirements of geqp3() and ungqr() blas_int k = (std::min)(m,n); blas_int info = 0; podarray tau( static_cast(k) ); podarray< T> rwork( 2*R_n_cols ); podarray jpvt( R_n_cols ); jpvt.zeros(); eT work_query[2]; blas_int lwork_query = -1; arma_extra_debug_print("lapack::geqp3()"); lapack::cx_geqp3(&m, &n, R.memptr(), &m, jpvt.memptr(), tau.memptr(), &work_query[0], &lwork_query, rwork.memptr(), &info); if(info != 0) { return false; } blas_int lwork_proposed = static_cast( access::tmp_real(work_query[0]) ); blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::geqp3()"); lapack::cx_geqp3(&m, &n, R.memptr(), &m, jpvt.memptr(), tau.memptr(), work.memptr(), &lwork_final, rwork.memptr(), &info); if(info != 0) { return false; } Q.set_size(R_n_rows, R_n_rows); arrayops::copy( Q.memptr(), R.memptr(), (std::min)(Q.n_elem, R.n_elem) ); // // construct R and P P.set_size(R_n_cols, 1); for(uword col=0; col < R_n_cols; ++col) { for(uword row=(col+1); row < R_n_rows; ++row) { R.at(row,col) = eT(0); } P.at(col) = jpvt[col] - 1; // take into account that Fortran counts from 1 } arma_extra_debug_print("lapack::ungqr()"); lapack::ungqr(&m, &m, &k, Q.memptr(), &m, tau.memptr(), work.memptr(), &lwork_final, &info); return (info == 0); } #else { arma_ignore(Q); arma_ignore(R); arma_ignore(P); arma_ignore(X); arma_stop_logic_error("qr(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::svd(Col& S, Mat& A) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { if(A.is_empty()) { S.reset(); return true; } arma_debug_assert_blas_size(A); Mat U(1, 1, arma_nozeros_indicator()); Mat V(1, A.n_cols, arma_nozeros_indicator()); char jobu = 'N'; char jobvt = 'N'; blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_cols); blas_int min_mn = (std::min)(m,n); blas_int lda = blas_int(A.n_rows); blas_int ldu = blas_int(U.n_rows); blas_int ldvt = blas_int(V.n_rows); blas_int lwork_min = (std::max)( blas_int(1), (std::max)( (3*min_mn + (std::max)(m,n)), 5*min_mn ) ); blas_int info = 0; S.set_size( static_cast(min_mn) ); blas_int lwork_proposed = 0; if((m*n) >= 1024) { eT work_query[2]; blas_int lwork_query = -1; arma_extra_debug_print("lapack::gesvd()"); lapack::gesvd(&jobu, &jobvt, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, &work_query[0], &lwork_query, &info); if(info != 0) { return false; } lwork_proposed = static_cast( work_query[0] ); } blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::gesvd()"); lapack::gesvd(&jobu, &jobvt, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, work.memptr(), &lwork_final, &info); return (info == 0); } #else { arma_ignore(S); arma_ignore(A); arma_stop_logic_error("svd(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::svd(Col& S, Mat< std::complex >& A) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef std::complex eT; if(A.is_empty()) { S.reset(); return true; } arma_debug_assert_blas_size(A); Mat U(1, 1, arma_nozeros_indicator()); Mat V(1, A.n_cols, arma_nozeros_indicator()); char jobu = 'N'; char jobvt = 'N'; blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_cols); blas_int min_mn = (std::min)(m,n); blas_int lda = blas_int(A.n_rows); blas_int ldu = blas_int(U.n_rows); blas_int ldvt = blas_int(V.n_rows); blas_int lwork_min = (std::max)( blas_int(1), 2*min_mn+(std::max)(m,n) ); blas_int info = 0; S.set_size( static_cast(min_mn) ); podarray rwork( static_cast(5*min_mn) ); blas_int lwork_proposed = 0; if((m*n) >= 1024) { eT work_query[2]; blas_int lwork_query = -1; // query to find optimum size of workspace arma_extra_debug_print("lapack::cx_gesvd()"); lapack::cx_gesvd(&jobu, &jobvt, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, &work_query[0], &lwork_query, rwork.memptr(), &info); if(info != 0) { return false; } lwork_proposed = static_cast( access::tmp_real(work_query[0]) ); } blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::cx_gesvd()"); lapack::cx_gesvd(&jobu, &jobvt, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, work.memptr(), &lwork_final, rwork.memptr(), &info); return (info == 0); } #else { arma_ignore(S); arma_ignore(A); arma_stop_logic_error("svd(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::svd(Mat& U, Col& S, Mat& V, Mat& A) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { if(A.is_empty()) { U.eye(A.n_rows, A.n_rows); S.reset(); V.eye(A.n_cols, A.n_cols); return true; } arma_debug_assert_blas_size(A); U.set_size(A.n_rows, A.n_rows); V.set_size(A.n_cols, A.n_cols); char jobu = 'A'; char jobvt = 'A'; blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_cols); blas_int min_mn = (std::min)(m,n); blas_int lda = blas_int(A.n_rows); blas_int ldu = blas_int(U.n_rows); blas_int ldvt = blas_int(V.n_rows); blas_int lwork_min = (std::max)( blas_int(1), (std::max)( (3*min_mn + (std::max)(m,n)), 5*min_mn ) ); blas_int info = 0; S.set_size( static_cast(min_mn) ); blas_int lwork_proposed = 0; if((m*n) >= 1024) { // query to find optimum size of workspace eT work_query[2]; blas_int lwork_query = -1; arma_extra_debug_print("lapack::gesvd()"); lapack::gesvd(&jobu, &jobvt, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, &work_query[0], &lwork_query, &info); if(info != 0) { return false; } lwork_proposed = static_cast( work_query[0] ); } blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::gesvd()"); lapack::gesvd(&jobu, &jobvt, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, work.memptr(), &lwork_final, &info); if(info != 0) { return false; } op_strans::apply_mat_inplace(V); return true; } #else { arma_ignore(U); arma_ignore(S); arma_ignore(V); arma_ignore(A); arma_stop_logic_error("svd(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::svd(Mat< std::complex >& U, Col& S, Mat< std::complex >& V, Mat< std::complex >& A) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef std::complex eT; if(A.is_empty()) { U.eye(A.n_rows, A.n_rows); S.reset(); V.eye(A.n_cols, A.n_cols); return true; } arma_debug_assert_blas_size(A); U.set_size(A.n_rows, A.n_rows); V.set_size(A.n_cols, A.n_cols); char jobu = 'A'; char jobvt = 'A'; blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_cols); blas_int min_mn = (std::min)(m,n); blas_int lda = blas_int(A.n_rows); blas_int ldu = blas_int(U.n_rows); blas_int ldvt = blas_int(V.n_rows); blas_int lwork_min = (std::max)( blas_int(1), 2*min_mn + (std::max)(m,n) ); blas_int info = 0; S.set_size( static_cast(min_mn) ); podarray rwork( static_cast(5*min_mn) ); blas_int lwork_proposed = 0; if((m*n) >= 1024) { eT work_query[2]; blas_int lwork_query = -1; // query to find optimum size of workspace arma_extra_debug_print("lapack::cx_gesvd()"); lapack::cx_gesvd(&jobu, &jobvt, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, &work_query[0], &lwork_query, rwork.memptr(), &info); if(info != 0) { return false; } lwork_proposed = static_cast( access::tmp_real(work_query[0]) ); } blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::cx_gesvd()"); lapack::cx_gesvd(&jobu, &jobvt, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, work.memptr(), &lwork_final, rwork.memptr(), &info); if(info != 0) { return false; } op_htrans::apply_mat_inplace(V); return true; } #else { arma_ignore(U); arma_ignore(S); arma_ignore(V); arma_ignore(A); arma_stop_logic_error("svd(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::svd_econ(Mat& U, Col& S, Mat& V, Mat& A, const char mode) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { if(A.is_empty()) { U.eye(); S.reset(); V.eye(); return true; } arma_debug_assert_blas_size(A); blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_cols); blas_int min_mn = (std::min)(m,n); blas_int lda = blas_int(A.n_rows); S.set_size( static_cast(min_mn) ); blas_int ldu = 0; blas_int ldvt = 0; char jobu = char(0); char jobvt = char(0); if(mode == 'l') { jobu = 'S'; jobvt = 'N'; ldu = m; ldvt = 1; U.set_size( static_cast(ldu), static_cast(min_mn) ); V.reset(); } if(mode == 'r') { jobu = 'N'; jobvt = 'S'; ldu = 1; ldvt = (std::min)(m,n); U.reset(); V.set_size( static_cast(ldvt), static_cast(n) ); } if(mode == 'b') { jobu = 'S'; jobvt = 'S'; ldu = m; ldvt = (std::min)(m,n); U.set_size( static_cast(ldu), static_cast(min_mn) ); V.set_size( static_cast(ldvt), static_cast(n ) ); } blas_int lwork_min = (std::max)( blas_int(1), (std::max)( (3*min_mn + (std::max)(m,n)), 5*min_mn ) ); blas_int info = 0; blas_int lwork_proposed = 0; if((m*n) >= 1024) { eT work_query[2]; blas_int lwork_query = -1; // query to find optimum size of workspace arma_extra_debug_print("lapack::gesvd()"); lapack::gesvd(&jobu, &jobvt, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, &work_query[0], &lwork_query, &info); if(info != 0) { return false; } lwork_proposed = static_cast(work_query[0]); } blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::gesvd()"); lapack::gesvd(&jobu, &jobvt, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, work.memptr(), &lwork_final, &info); if(info != 0) { return false; } op_strans::apply_mat_inplace(V); return true; } #else { arma_ignore(U); arma_ignore(S); arma_ignore(V); arma_ignore(A); arma_ignore(mode); arma_stop_logic_error("svd(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::svd_econ(Mat< std::complex >& U, Col& S, Mat< std::complex >& V, Mat< std::complex >& A, const char mode) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef std::complex eT; if(A.is_empty()) { U.eye(); S.reset(); V.eye(); return true; } arma_debug_assert_blas_size(A); blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_cols); blas_int min_mn = (std::min)(m,n); blas_int lda = blas_int(A.n_rows); S.set_size( static_cast(min_mn) ); blas_int ldu = 0; blas_int ldvt = 0; char jobu = char(0); char jobvt = char(0); if(mode == 'l') { jobu = 'S'; jobvt = 'N'; ldu = m; ldvt = 1; U.set_size( static_cast(ldu), static_cast(min_mn) ); V.reset(); } if(mode == 'r') { jobu = 'N'; jobvt = 'S'; ldu = 1; ldvt = (std::min)(m,n); U.reset(); V.set_size( static_cast(ldvt), static_cast(n) ); } if(mode == 'b') { jobu = 'S'; jobvt = 'S'; ldu = m; ldvt = (std::min)(m,n); U.set_size( static_cast(ldu), static_cast(min_mn) ); V.set_size( static_cast(ldvt), static_cast(n) ); } blas_int lwork_min = (std::max)( blas_int(1), (std::max)( (3*min_mn + (std::max)(m,n)), 5*min_mn ) ); blas_int info = 0; podarray rwork( static_cast(5*min_mn) ); blas_int lwork_proposed = 0; if((m*n) >= 1024) { eT work_query[2]; blas_int lwork_query = -1; // query to find optimum size of workspace arma_extra_debug_print("lapack::cx_gesvd()"); lapack::cx_gesvd(&jobu, &jobvt, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, &work_query[0], &lwork_query, rwork.memptr(), &info); if(info != 0) { return false; } lwork_proposed = static_cast( access::tmp_real(work_query[0]) ); } blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::cx_gesvd()"); lapack::cx_gesvd(&jobu, &jobvt, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, work.memptr(), &lwork_final, rwork.memptr(), &info); if(info != 0) { return false; } op_htrans::apply_mat_inplace(V); return true; } #else { arma_ignore(U); arma_ignore(S); arma_ignore(V); arma_ignore(A); arma_ignore(mode); arma_stop_logic_error("svd(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::svd_dc(Col& S, Mat& A) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { if(A.is_empty()) { S.reset(); return true; } arma_debug_assert_blas_size(A); Mat U(1, 1, arma_nozeros_indicator()); Mat V(1, 1, arma_nozeros_indicator()); char jobz = 'N'; blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_cols); blas_int min_mn = (std::min)(m,n); blas_int max_mn = (std::max)(m,n); blas_int lda = blas_int(A.n_rows); blas_int ldu = blas_int(U.n_rows); blas_int ldvt = blas_int(V.n_rows); blas_int lwork_min = 3*min_mn + (std::max)( max_mn, 7*min_mn ); blas_int info = 0; S.set_size( static_cast(min_mn) ); podarray iwork( static_cast(8*min_mn) ); blas_int lwork_proposed = 0; if((m*n) >= 1024) { eT work_query[2]; blas_int lwork_query = blas_int(-1); arma_extra_debug_print("lapack::gesdd()"); lapack::gesdd(&jobz, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, &work_query[0], &lwork_query, iwork.memptr(), &info); if(info != 0) { return false; } lwork_proposed = static_cast( work_query[0] ); } blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::gesdd()"); lapack::gesdd(&jobz, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, work.memptr(), &lwork_final, iwork.memptr(), &info); return (info == 0); } #else { arma_ignore(S); arma_ignore(A); arma_stop_logic_error("svd(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::svd_dc(Col& S, Mat< std::complex >& A) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef std::complex eT; if(A.is_empty()) { S.reset(); return true; } arma_debug_assert_blas_size(A); Mat U(1, 1, arma_nozeros_indicator()); Mat V(1, 1, arma_nozeros_indicator()); char jobz = 'N'; blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_cols); blas_int min_mn = (std::min)(m,n); blas_int max_mn = (std::max)(m,n); blas_int lda = blas_int(A.n_rows); blas_int ldu = blas_int(U.n_rows); blas_int ldvt = blas_int(V.n_rows); blas_int lwork_min = 2*min_mn + max_mn; blas_int info = 0; S.set_size( static_cast(min_mn) ); podarray rwork( static_cast(7*min_mn) ); // from LAPACK 3.8 docs: LAPACK <= v3.6 needs 7*mn podarray iwork( static_cast(8*min_mn) ); blas_int lwork_proposed = 0; if((m*n) >= 1024) { eT work_query[2]; blas_int lwork_query = blas_int(-1); arma_extra_debug_print("lapack::cx_gesdd()"); lapack::cx_gesdd(&jobz, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, &work_query[0], &lwork_query, rwork.memptr(), iwork.memptr(), &info); if(info != 0) { return false; } lwork_proposed = static_cast( access::tmp_real(work_query[0]) ); } blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::cx_gesdd()"); lapack::cx_gesdd(&jobz, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, work.memptr(), &lwork_final, rwork.memptr(), iwork.memptr(), &info); return (info == 0); } #else { arma_ignore(S); arma_ignore(A); arma_stop_logic_error("svd(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::svd_dc(Mat& U, Col& S, Mat& V, Mat& A) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { if(A.is_empty()) { U.eye(A.n_rows, A.n_rows); S.reset(); V.eye(A.n_cols, A.n_cols); return true; } arma_debug_assert_blas_size(A); U.set_size(A.n_rows, A.n_rows); V.set_size(A.n_cols, A.n_cols); char jobz = 'A'; blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_cols); blas_int min_mn = (std::min)(m,n); blas_int max_mn = (std::max)(m,n); blas_int lda = blas_int(A.n_rows); blas_int ldu = blas_int(U.n_rows); blas_int ldvt = blas_int(V.n_rows); blas_int lwork1 = 3*min_mn*min_mn + (std::max)(max_mn, 4*min_mn*min_mn + 4*min_mn); // as per LAPACK 3.2 docs blas_int lwork2 = 4*min_mn*min_mn + 6*min_mn + max_mn; // as per LAPACK 3.8 docs; consistent with LAPACK 3.4 docs blas_int lwork_min = (std::max)(lwork1, lwork2); // due to differences between LAPACK 3.2 and 3.8 blas_int info = 0; S.set_size( static_cast(min_mn) ); podarray iwork( static_cast(8*min_mn) ); blas_int lwork_proposed = 0; if((m*n) >= 1024) { eT work_query[2]; blas_int lwork_query = blas_int(-1); arma_extra_debug_print("lapack::gesdd()"); lapack::gesdd(&jobz, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, &work_query[0], &lwork_query, iwork.memptr(), &info); if(info != 0) { return false; } lwork_proposed = static_cast(work_query[0]); } blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::gesdd()"); lapack::gesdd(&jobz, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, work.memptr(), &lwork_final, iwork.memptr(), &info); if(info != 0) { return false; } op_strans::apply_mat_inplace(V); return true; } #else { arma_ignore(U); arma_ignore(S); arma_ignore(V); arma_ignore(A); arma_stop_logic_error("svd(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::svd_dc(Mat< std::complex >& U, Col& S, Mat< std::complex >& V, Mat< std::complex >& A) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef std::complex eT; if(A.is_empty()) { U.eye(A.n_rows, A.n_rows); S.reset(); V.eye(A.n_cols, A.n_cols); return true; } arma_debug_assert_blas_size(A); U.set_size(A.n_rows, A.n_rows); V.set_size(A.n_cols, A.n_cols); char jobz = 'A'; blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_cols); blas_int min_mn = (std::min)(m,n); blas_int max_mn = (std::max)(m,n); blas_int lda = blas_int(A.n_rows); blas_int ldu = blas_int(U.n_rows); blas_int ldvt = blas_int(V.n_rows); blas_int lwork_min = min_mn*min_mn + 2*min_mn + max_mn; // as per LAPACK 3.2, 3.4, 3.8 docs blas_int lrwork = min_mn * ((std::max)(5*min_mn+7, 2*max_mn + 2*min_mn+1)); // as per LAPACK 3.4 docs; LAPACK 3.8 uses 5*min_mn+5 instead of 5*min_mn+7 blas_int info = 0; S.set_size( static_cast(min_mn) ); podarray rwork( static_cast(lrwork ) ); podarray iwork( static_cast(8*min_mn) ); blas_int lwork_proposed = 0; if((m*n) >= 1024) { eT work_query[2]; blas_int lwork_query = blas_int(-1); arma_extra_debug_print("lapack::cx_gesdd()"); lapack::cx_gesdd(&jobz, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, &work_query[0], &lwork_query, rwork.memptr(), iwork.memptr(), &info); if(info != 0) { return false; } lwork_proposed = static_cast( access::tmp_real(work_query[0]) ); } blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::cx_gesdd()"); lapack::cx_gesdd(&jobz, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, work.memptr(), &lwork_final, rwork.memptr(), iwork.memptr(), &info); if(info != 0) { return false; } op_htrans::apply_mat_inplace(V); return true; } #else { arma_ignore(U); arma_ignore(S); arma_ignore(V); arma_ignore(A); arma_stop_logic_error("svd(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::svd_dc_econ(Mat& U, Col& S, Mat& V, Mat& A) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { arma_debug_assert_blas_size(A); char jobz = 'S'; blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_cols); blas_int min_mn = (std::min)(m,n); blas_int max_mn = (std::max)(m,n); blas_int lda = blas_int(A.n_rows); blas_int ldu = m; blas_int ldvt = min_mn; blas_int lwork1 = 3*min_mn*min_mn + (std::max)( max_mn, 4*min_mn*min_mn + 4*min_mn ); // as per LAPACK 3.2 docs blas_int lwork2 = 4*min_mn*min_mn + 6*min_mn + max_mn; // as per LAPACK 3.4 docs; LAPACK 3.8 requires 4*min_mn*min_mn + 7*min_mn blas_int lwork_min = (std::max)(lwork1, lwork2); // due to differences between LAPACK 3.2 and 3.4 blas_int info = 0; if(A.is_empty()) { U.eye(); S.reset(); V.eye( static_cast(n), static_cast(min_mn) ); return true; } S.set_size( static_cast(min_mn) ); U.set_size( static_cast(m), static_cast(min_mn) ); V.set_size( static_cast(min_mn), static_cast(n) ); podarray iwork( static_cast(8*min_mn) ); blas_int lwork_proposed = 0; if((m*n) >= 1024) { eT work_query[2]; blas_int lwork_query = blas_int(-1); arma_extra_debug_print("lapack::gesdd()"); lapack::gesdd(&jobz, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, &work_query[0], &lwork_query, iwork.memptr(), &info); if(info != 0) { return false; } lwork_proposed = static_cast(work_query[0]); } blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::gesdd()"); lapack::gesdd(&jobz, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, work.memptr(), &lwork_final, iwork.memptr(), &info); if(info != 0) { return false; } op_strans::apply_mat_inplace(V); return true; } #else { arma_ignore(U); arma_ignore(S); arma_ignore(V); arma_ignore(A); arma_stop_logic_error("svd(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::svd_dc_econ(Mat< std::complex >& U, Col& S, Mat< std::complex >& V, Mat< std::complex >& A) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef std::complex eT; arma_debug_assert_blas_size(A); char jobz = 'S'; blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_cols); blas_int min_mn = (std::min)(m,n); blas_int max_mn = (std::max)(m,n); blas_int lda = blas_int(A.n_rows); blas_int ldu = m; blas_int ldvt = min_mn; blas_int lwork_min = min_mn*min_mn + 2*min_mn + max_mn; // as per LAPACK 3.2 docs blas_int lrwork = min_mn * ((std::max)(5*min_mn+7, 2*max_mn + 2*min_mn+1)); // LAPACK 3.8 uses 5*min_mn+5 instead of 5*min_mn+7 blas_int info = 0; if(A.is_empty()) { U.eye(); S.reset(); V.eye( static_cast(n), static_cast(min_mn) ); return true; } S.set_size( static_cast(min_mn) ); U.set_size( static_cast(m), static_cast(min_mn) ); V.set_size( static_cast(min_mn), static_cast(n) ); podarray rwork( static_cast(lrwork ) ); podarray iwork( static_cast(8*min_mn) ); blas_int lwork_proposed = 0; if((m*n) >= 1024) { eT work_query[2]; blas_int lwork_query = blas_int(-1); arma_extra_debug_print("lapack::cx_gesdd()"); lapack::cx_gesdd(&jobz, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, &work_query[0], &lwork_query, rwork.memptr(), iwork.memptr(), &info); if(info != 0) { return false; } lwork_proposed = static_cast( access::tmp_real(work_query[0]) ); } blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::cx_gesdd()"); lapack::cx_gesdd(&jobz, &m, &n, A.memptr(), &lda, S.memptr(), U.memptr(), &ldu, V.memptr(), &ldvt, work.memptr(), &lwork_final, rwork.memptr(), iwork.memptr(), &info); if(info != 0) { return false; } op_htrans::apply_mat_inplace(V); return true; } #else { arma_ignore(U); arma_ignore(S); arma_ignore(V); arma_ignore(A); arma_stop_logic_error("svd(): use of LAPACK must be enabled"); return false; } #endif } //! solve a system of linear equations via explicit inverse (tiny matrices) template arma_cold inline bool auxlib::solve_square_tiny(Mat& out, const Mat& A, const Base& B_expr) { arma_extra_debug_sigprint(); // NOTE: assuming A has size <= 4x4 typedef typename T1::elem_type eT; const uword A_n_rows = A.n_rows; Mat A_inv(A_n_rows, A_n_rows, arma_nozeros_indicator()); const bool status = op_inv::apply_tiny_noalias(A_inv, A); if(status == false) { return false; } const quasi_unwrap UB(B_expr.get_ref()); const Mat& B = UB.M; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; arma_debug_check( (A_n_rows != B_n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_cols, B_n_cols); return true; } if(UB.is_alias(out)) { Mat tmp(A_n_rows, B_n_cols, arma_nozeros_indicator()); gemm_emul::apply(tmp, A_inv, B); out.steal_mem(tmp); } else { out.set_size(A_n_rows, B_n_cols); gemm_emul::apply(out, A_inv, B); } return true; } //! solve a system of linear equations via LU decomposition template inline bool auxlib::solve_square_fast(Mat& out, Mat& A, const Base& B_expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword A_n_rows = A.n_rows; if((A_n_rows <= 4) && is_cx::no) { const bool status = auxlib::solve_square_tiny(out, A, B_expr.get_ref()); if(status) { return true; } } out = B_expr.get_ref(); const uword B_n_rows = out.n_rows; const uword B_n_cols = out.n_cols; arma_debug_check( (A_n_rows != B_n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || out.is_empty()) { out.zeros(A.n_cols, B_n_cols); return true; } #if defined(ARMA_USE_ATLAS) { arma_debug_assert_atlas_size(A); podarray ipiv(A_n_rows + 2); // +2 for paranoia: old versions of Atlas might be trashing memory arma_extra_debug_print("atlas::clapack_gesv()"); int info = atlas::clapack_gesv(atlas::CblasColMajor, A_n_rows, B_n_cols, A.memptr(), A_n_rows, ipiv.memptr(), out.memptr(), A_n_rows); return (info == 0); } #elif defined(ARMA_USE_LAPACK) { arma_debug_assert_blas_size(A); blas_int n = blas_int(A_n_rows); // assuming A is square blas_int lda = blas_int(A_n_rows); blas_int ldb = blas_int(B_n_rows); blas_int nrhs = blas_int(B_n_cols); blas_int info = blas_int(0); podarray ipiv(A_n_rows + 2); // +2 for paranoia: some versions of Lapack might be trashing memory arma_extra_debug_print("lapack::gesv()"); lapack::gesv(&n, &nrhs, A.memptr(), &lda, ipiv.memptr(), out.memptr(), &ldb, &info); return (info == 0); } #else { arma_stop_logic_error("solve(): use of ATLAS or LAPACK must be enabled"); return false; } #endif } //! solve a system of linear equations via LU decomposition with rcond estimate template inline bool auxlib::solve_square_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool allow_ugly) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::elem_type eT; typedef typename T1::pod_type T; out_rcond = T(0); out = B_expr.get_ref(); const uword B_n_rows = out.n_rows; const uword B_n_cols = out.n_cols; arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || out.is_empty()) { out.zeros(A.n_cols, B_n_cols); return true; } arma_debug_assert_blas_size(A); char norm_id = '1'; char trans = 'N'; blas_int n = blas_int(A.n_rows); // assuming A is square blas_int lda = blas_int(A.n_rows); blas_int ldb = blas_int(B_n_rows); blas_int nrhs = blas_int(B_n_cols); blas_int info = blas_int(0); T norm_val = T(0); podarray junk(1); podarray ipiv(A.n_rows + 2); // +2 for paranoia arma_extra_debug_print("lapack::lange()"); norm_val = lapack::lange(&norm_id, &n, &n, A.memptr(), &lda, junk.memptr()); arma_extra_debug_print("lapack::getrf()"); lapack::getrf(&n, &n, A.memptr(), &n, ipiv.memptr(), &info); if(info != blas_int(0)) { return false; } arma_extra_debug_print("lapack::getrs()"); lapack::getrs(&trans, &n, &nrhs, A.memptr(), &lda, ipiv.memptr(), out.memptr(), &ldb, &info); if(info != blas_int(0)) { return false; } out_rcond = auxlib::lu_rcond(A, norm_val); if( (allow_ugly == false) && (out_rcond < auxlib::epsilon_lapack(A)) ) { return false; } return true; } #else { arma_ignore(out); arma_ignore(out_rcond); arma_ignore(A); arma_ignore(B_expr); arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } //! solve a system of linear equations via LU decomposition with refinement (real matrices) template inline bool auxlib::solve_square_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool equilibrate, const bool allow_ugly) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type eT; // Mat B = B_expr.get_ref(); // B is overwritten by lapack::gesvx() if equilibrate is enabled quasi_unwrap UB(B_expr.get_ref()); // deliberately not declaring as const const Mat& UB_M_as_Mat = UB.M; // so we don't confuse the ?: operator below const bool use_copy = ((equilibrate && UB.is_const) || UB.is_alias(out)); Mat B_tmp; if(use_copy) { B_tmp = UB_M_as_Mat; } const Mat& B = (use_copy) ? B_tmp : UB_M_as_Mat; arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_rows, B.n_cols); return true; } arma_debug_assert_blas_size(A,B); out.set_size(A.n_rows, B.n_cols); char fact = (equilibrate) ? 'E' : 'N'; char trans = 'N'; char equed = char(0); blas_int n = blas_int(A.n_rows); blas_int nrhs = blas_int(B.n_cols); blas_int lda = blas_int(A.n_rows); blas_int ldaf = blas_int(A.n_rows); blas_int ldb = blas_int(A.n_rows); blas_int ldx = blas_int(A.n_rows); blas_int info = blas_int(0); eT rcond = eT(0); Mat AF(A.n_rows, A.n_rows, arma_nozeros_indicator()); podarray IPIV( A.n_rows); podarray R( A.n_rows); podarray C( A.n_rows); podarray FERR( B.n_cols); podarray BERR( B.n_cols); podarray WORK(4*A.n_rows); podarray IWORK( A.n_rows); arma_extra_debug_print("lapack::gesvx()"); lapack::gesvx ( &fact, &trans, &n, &nrhs, A.memptr(), &lda, AF.memptr(), &ldaf, IPIV.memptr(), &equed, R.memptr(), C.memptr(), const_cast(B.memptr()), &ldb, out.memptr(), &ldx, &rcond, FERR.memptr(), BERR.memptr(), WORK.memptr(), IWORK.memptr(), &info ); // NOTE: using const_cast(B.memptr()) to allow B to be overwritten for equilibration; // NOTE: B is created as a copy of B_expr if equilibration is enabled; otherwise B is a reference to B_expr out_rcond = rcond; return (allow_ugly) ? ((info == 0) || (info == (n+1))) : (info == 0); } #else { arma_ignore(out); arma_ignore(out_rcond); arma_ignore(A); arma_ignore(B_expr); arma_ignore(equilibrate); arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } //! solve a system of linear equations via LU decomposition with refinement (complex matrices) template inline bool auxlib::solve_square_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base,T1>& B_expr, const bool equilibrate, const bool allow_ugly) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; typedef typename std::complex eT; // Mat B = B_expr.get_ref(); // B is overwritten by lapack::cx_gesvx() if equilibrate is enabled quasi_unwrap UB(B_expr.get_ref()); // deliberately not declaring as const const Mat& UB_M_as_Mat = UB.M; // so we don't confuse the ?: operator below const bool use_copy = ((equilibrate && UB.is_const) || UB.is_alias(out)); Mat B_tmp; if(use_copy) { B_tmp = UB_M_as_Mat; } const Mat& B = (use_copy) ? B_tmp : UB_M_as_Mat; arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_rows, B.n_cols); return true; } arma_debug_assert_blas_size(A,B); out.set_size(A.n_rows, B.n_cols); char fact = (equilibrate) ? 'E' : 'N'; char trans = 'N'; char equed = char(0); blas_int n = blas_int(A.n_rows); blas_int nrhs = blas_int(B.n_cols); blas_int lda = blas_int(A.n_rows); blas_int ldaf = blas_int(A.n_rows); blas_int ldb = blas_int(A.n_rows); blas_int ldx = blas_int(A.n_rows); blas_int info = blas_int(0); T rcond = T(0); Mat AF(A.n_rows, A.n_rows, arma_nozeros_indicator()); podarray IPIV( A.n_rows); podarray< T> R( A.n_rows); podarray< T> C( A.n_rows); podarray< T> FERR( B.n_cols); podarray< T> BERR( B.n_cols); podarray WORK(2*A.n_rows); podarray< T> RWORK(2*A.n_rows); arma_extra_debug_print("lapack::cx_gesvx()"); lapack::cx_gesvx ( &fact, &trans, &n, &nrhs, A.memptr(), &lda, AF.memptr(), &ldaf, IPIV.memptr(), &equed, R.memptr(), C.memptr(), const_cast(B.memptr()), &ldb, out.memptr(), &ldx, &rcond, FERR.memptr(), BERR.memptr(), WORK.memptr(), RWORK.memptr(), &info ); // NOTE: using const_cast(B.memptr()) to allow B to be overwritten for equilibration; // NOTE: B is created as a copy of B_expr if equilibration is enabled; otherwise B is a reference to B_expr out_rcond = rcond; return (allow_ugly) ? ((info == 0) || (info == (n+1))) : (info == 0); } #else { arma_ignore(out); arma_ignore(out_rcond); arma_ignore(A); arma_ignore(B_expr); arma_ignore(equilibrate); arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::solve_sympd_fast(Mat& out, Mat& A, const Base& B_expr) { arma_extra_debug_sigprint(); #if defined(ARMA_CRIPPLED_LAPACK) { arma_extra_debug_print("auxlib::solve_sympd_fast(): redirecting to auxlib::solve_square_fast() due to crippled LAPACK"); return auxlib::solve_square_fast(out, A, B_expr); } #else { return auxlib::solve_sympd_fast_common(out, A, B_expr); } #endif } template inline bool auxlib::solve_sympd_fast_common(Mat& out, Mat& A, const Base& B_expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword A_n_rows = A.n_rows; if((A_n_rows <= 4) && is_cx::no) { const bool status = auxlib::solve_square_tiny(out, A, B_expr.get_ref()); if(status) { return true; } } out = B_expr.get_ref(); const uword B_n_rows = out.n_rows; const uword B_n_cols = out.n_cols; arma_debug_check( (A_n_rows != B_n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || out.is_empty()) { out.zeros(A.n_cols, B_n_cols); return true; } #if defined(ARMA_USE_ATLAS) { arma_debug_assert_atlas_size(A, out); int info = 0; arma_extra_debug_print("atlas::clapack_posv()"); info = atlas::clapack_posv(atlas::CblasColMajor, atlas::CblasLower, A_n_rows, B_n_cols, A.memptr(), A_n_rows, out.memptr(), B_n_rows); return (info == 0); } #elif defined(ARMA_USE_LAPACK) { arma_debug_assert_blas_size(A, out); char uplo = 'L'; blas_int n = blas_int(A_n_rows); // assuming A is square blas_int nrhs = blas_int(B_n_cols); blas_int lda = blas_int(A_n_rows); blas_int ldb = blas_int(B_n_rows); blas_int info = blas_int(0); arma_extra_debug_print("lapack::posv()"); lapack::posv(&uplo, &n, &nrhs, A.memptr(), &lda, out.memptr(), &ldb, &info); return (info == 0); } #else { arma_ignore(out); arma_ignore(A); arma_ignore(B_expr); arma_stop_logic_error("solve(): use of ATLAS or LAPACK must be enabled"); return false; } #endif } //! solve a system of linear equations via Cholesky decomposition with rcond estimate (real matrices) template inline bool auxlib::solve_sympd_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool allow_ugly) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::elem_type eT; typedef typename T1::pod_type T; out_rcond = T(0); out = B_expr.get_ref(); const uword B_n_rows = out.n_rows; const uword B_n_cols = out.n_cols; arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || out.is_empty()) { out.zeros(A.n_cols, B_n_cols); return true; } arma_debug_assert_blas_size(A, out); char norm_id = '1'; char uplo = 'L'; blas_int n = blas_int(A.n_rows); // assuming A is square blas_int nrhs = blas_int(B_n_cols); blas_int info = blas_int(0); T norm_val = T(0); podarray work(A.n_rows); arma_extra_debug_print("lapack::lansy()"); norm_val = lapack::lansy(&norm_id, &uplo, &n, A.memptr(), &n, work.memptr()); arma_extra_debug_print("lapack::potrf()"); lapack::potrf(&uplo, &n, A.memptr(), &n, &info); if(info != 0) { return false; } arma_extra_debug_print("lapack::potrs()"); lapack::potrs(&uplo, &n, &nrhs, A.memptr(), &n, out.memptr(), &n, &info); if(info != 0) { return false; } out_rcond = auxlib::lu_rcond_sympd(A, norm_val); if( (allow_ugly == false) && (out_rcond < auxlib::epsilon_lapack(A)) ) { return false; } return true; } #else { arma_ignore(out); arma_ignore(out_rcond); arma_ignore(A); arma_ignore(B_expr); arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } //! solve a system of linear equations via Cholesky decomposition with rcond estimate (complex matrices) template inline bool auxlib::solve_sympd_rcond(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base< std::complex,T1>& B_expr, const bool allow_ugly) { arma_extra_debug_sigprint(); #if defined(ARMA_CRIPPLED_LAPACK) { arma_extra_debug_print("auxlib::solve_sympd_rcond(): redirecting to auxlib::solve_square_rcond() due to crippled LAPACK"); return auxlib::solve_square_rcond(out, out_rcond, A, B_expr, allow_ugly); } #elif defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; typedef typename std::complex eT; out_rcond = T(0); out = B_expr.get_ref(); const uword B_n_rows = out.n_rows; const uword B_n_cols = out.n_cols; arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || out.is_empty()) { out.zeros(A.n_cols, B_n_cols); return true; } arma_debug_assert_blas_size(A, out); char norm_id = '1'; char uplo = 'L'; blas_int n = blas_int(A.n_rows); // assuming A is square blas_int nrhs = blas_int(B_n_cols); blas_int info = blas_int(0); T norm_val = T(0); podarray work(A.n_rows); arma_extra_debug_print("lapack::lanhe()"); norm_val = lapack::lanhe(&norm_id, &uplo, &n, A.memptr(), &n, work.memptr()); arma_extra_debug_print("lapack::potrf()"); lapack::potrf(&uplo, &n, A.memptr(), &n, &info); if(info != 0) { return false; } arma_extra_debug_print("lapack::potrs()"); lapack::potrs(&uplo, &n, &nrhs, A.memptr(), &n, out.memptr(), &n, &info); if(info != 0) { return false; } out_rcond = auxlib::lu_rcond_sympd(A, norm_val); if( (allow_ugly == false) && (out_rcond < auxlib::epsilon_lapack(A)) ) { return false; } return true; } #else { arma_ignore(out); arma_ignore(out_rcond); arma_ignore(A); arma_ignore(B_expr); arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } //! solve a system of linear equations via Cholesky decomposition with refinement (real matrices) template inline bool auxlib::solve_sympd_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool equilibrate, const bool allow_ugly) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type eT; // Mat B = B_expr.get_ref(); // B is overwritten by lapack::posvx() if equilibrate is enabled quasi_unwrap UB(B_expr.get_ref()); // deliberately not declaring as const const Mat& UB_M_as_Mat = UB.M; // so we don't confuse the ?: operator below const bool use_copy = ((equilibrate && UB.is_const) || UB.is_alias(out)); Mat B_tmp; if(use_copy) { B_tmp = UB_M_as_Mat; } const Mat& B = (use_copy) ? B_tmp : UB_M_as_Mat; arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_rows, B.n_cols); return true; } arma_debug_assert_blas_size(A,B); out.set_size(A.n_rows, B.n_cols); char fact = (equilibrate) ? 'E' : 'N'; char uplo = 'L'; char equed = char(0); blas_int n = blas_int(A.n_rows); blas_int nrhs = blas_int(B.n_cols); blas_int lda = blas_int(A.n_rows); blas_int ldaf = blas_int(A.n_rows); blas_int ldb = blas_int(A.n_rows); blas_int ldx = blas_int(A.n_rows); blas_int info = blas_int(0); eT rcond = eT(0); Mat AF(A.n_rows, A.n_rows, arma_nozeros_indicator()); podarray S( A.n_rows); podarray FERR( B.n_cols); podarray BERR( B.n_cols); podarray WORK(3*A.n_rows); podarray IWORK( A.n_rows); arma_extra_debug_print("lapack::posvx()"); lapack::posvx(&fact, &uplo, &n, &nrhs, A.memptr(), &lda, AF.memptr(), &ldaf, &equed, S.memptr(), const_cast(B.memptr()), &ldb, out.memptr(), &ldx, &rcond, FERR.memptr(), BERR.memptr(), WORK.memptr(), IWORK.memptr(), &info); // NOTE: using const_cast(B.memptr()) to allow B to be overwritten for equilibration; // NOTE: B is created as a copy of B_expr if equilibration is enabled; otherwise B is a reference to B_expr out_rcond = rcond; return (allow_ugly) ? ((info == 0) || (info == (n+1))) : (info == 0); } #else { arma_ignore(out); arma_ignore(out_rcond); arma_ignore(A); arma_ignore(B_expr); arma_ignore(equilibrate); arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } //! solve a system of linear equations via Cholesky decomposition with refinement (complex matrices) template inline bool auxlib::solve_sympd_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base,T1>& B_expr, const bool equilibrate, const bool allow_ugly) { arma_extra_debug_sigprint(); #if defined(ARMA_CRIPPLED_LAPACK) { arma_extra_debug_print("auxlib::solve_sympd_refine(): redirecting to auxlib::solve_square_refine() due to crippled LAPACK"); return auxlib::solve_square_refine(out, out_rcond, A, B_expr, equilibrate, allow_ugly); } #elif defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; typedef typename std::complex eT; // Mat B = B_expr.get_ref(); // B is overwritten by lapack::cx_posvx() if equilibrate is enabled quasi_unwrap UB(B_expr.get_ref()); // deliberately not declaring as const const Mat& UB_M_as_Mat = UB.M; // so we don't confuse the ?: operator below const bool use_copy = ((equilibrate && UB.is_const) || UB.is_alias(out)); Mat B_tmp; if(use_copy) { B_tmp = UB_M_as_Mat; } const Mat& B = (use_copy) ? B_tmp : UB_M_as_Mat; arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_rows, B.n_cols); return true; } arma_debug_assert_blas_size(A,B); out.set_size(A.n_rows, B.n_cols); char fact = (equilibrate) ? 'E' : 'N'; char uplo = 'L'; char equed = char(0); blas_int n = blas_int(A.n_rows); blas_int nrhs = blas_int(B.n_cols); blas_int lda = blas_int(A.n_rows); blas_int ldaf = blas_int(A.n_rows); blas_int ldb = blas_int(A.n_rows); blas_int ldx = blas_int(A.n_rows); blas_int info = blas_int(0); T rcond = T(0); Mat AF(A.n_rows, A.n_rows, arma_nozeros_indicator()); podarray< T> S( A.n_rows); podarray< T> FERR( B.n_cols); podarray< T> BERR( B.n_cols); podarray WORK(2*A.n_rows); podarray< T> RWORK( A.n_rows); arma_extra_debug_print("lapack::cx_posvx()"); lapack::cx_posvx(&fact, &uplo, &n, &nrhs, A.memptr(), &lda, AF.memptr(), &ldaf, &equed, S.memptr(), const_cast(B.memptr()), &ldb, out.memptr(), &ldx, &rcond, FERR.memptr(), BERR.memptr(), WORK.memptr(), RWORK.memptr(), &info); // NOTE: using const_cast(B.memptr()) to allow B to be overwritten for equilibration; // NOTE: B is created as a copy of B_expr if equilibration is enabled; otherwise B is a reference to B_expr out_rcond = rcond; return (allow_ugly) ? ((info == 0) || (info == (n+1))) : (info == 0); } #else { arma_ignore(out); arma_ignore(out_rcond); arma_ignore(A); arma_ignore(B_expr); arma_ignore(equilibrate); arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } //! solve a non-square full-rank system via QR or LQ decomposition template inline bool auxlib::solve_rect_fast(Mat& out, Mat& A, const Base& B_expr) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::elem_type eT; const unwrap U(B_expr.get_ref()); const Mat& B = U.M; arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_cols, B.n_cols); return true; } arma_debug_assert_blas_size(A,B); Mat tmp( (std::max)(A.n_rows, A.n_cols), B.n_cols, arma_nozeros_indicator() ); if(arma::size(tmp) == arma::size(B)) { tmp = B; } else { tmp.zeros(); tmp(0,0, arma::size(B)) = B; } char trans = 'N'; blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_cols); blas_int lda = blas_int(A.n_rows); blas_int ldb = blas_int(tmp.n_rows); blas_int nrhs = blas_int(B.n_cols); blas_int min_mn = (std::min)(m,n); blas_int lwork_min = (std::max)(blas_int(1), min_mn + (std::max)(min_mn, nrhs)); blas_int info = 0; blas_int lwork_proposed = 0; if((m*n) >= 1024) { eT work_query[2]; blas_int lwork_query = -1; arma_extra_debug_print("lapack::gels()"); lapack::gels( &trans, &m, &n, &nrhs, A.memptr(), &lda, tmp.memptr(), &ldb, &work_query[0], &lwork_query, &info ); if(info != 0) { return false; } lwork_proposed = static_cast( access::tmp_real(work_query[0]) ); } blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::gels()"); lapack::gels( &trans, &m, &n, &nrhs, A.memptr(), &lda, tmp.memptr(), &ldb, work.memptr(), &lwork_final, &info ); if(info != 0) { return false; } if(tmp.n_rows == A.n_cols) { out.steal_mem(tmp); } else { out = tmp.head_rows(A.n_cols); } return true; } #else { arma_ignore(out); arma_ignore(A); arma_ignore(B_expr); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } //! solve a non-square full-rank system via QR or LQ decomposition with rcond estimate (experimental) template inline bool auxlib::solve_rect_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool allow_ugly) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::elem_type eT; typedef typename T1::pod_type T; out_rcond = T(0); const unwrap U(B_expr.get_ref()); const Mat& B = U.M; arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_cols, B.n_cols); return true; } arma_debug_assert_blas_size(A,B); Mat tmp( (std::max)(A.n_rows, A.n_cols), B.n_cols, arma_nozeros_indicator() ); if(arma::size(tmp) == arma::size(B)) { tmp = B; } else { tmp.zeros(); tmp(0,0, arma::size(B)) = B; } char trans = 'N'; blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_cols); blas_int lda = blas_int(A.n_rows); blas_int ldb = blas_int(tmp.n_rows); blas_int nrhs = blas_int(B.n_cols); blas_int min_mn = (std::min)(m,n); blas_int lwork_min = (std::max)(blas_int(1), min_mn + (std::max)(min_mn, nrhs)); blas_int info = 0; blas_int lwork_proposed = 0; if((m*n) >= 1024) { eT work_query[2]; blas_int lwork_query = -1; arma_extra_debug_print("lapack::gels()"); lapack::gels( &trans, &m, &n, &nrhs, A.memptr(), &lda, tmp.memptr(), &ldb, &work_query[0], &lwork_query, &info ); if(info != 0) { return false; } lwork_proposed = static_cast( access::tmp_real(work_query[0]) ); } blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::gels()"); lapack::gels( &trans, &m, &n, &nrhs, A.memptr(), &lda, tmp.memptr(), &ldb, work.memptr(), &lwork_final, &info ); if(info != 0) { return false; } if(A.n_rows >= A.n_cols) { arma_extra_debug_print("estimating rcond via R"); // xGELS docs: for M >= N, A contains details of its QR decomposition as returned by xGEQRF // xGEQRF docs: elements on and above the diagonal contain the min(M,N)-by-N upper trapezoidal matrix R Mat R(A.n_cols, A.n_cols, arma_zeros_indicator()); for(uword col=0; col < A.n_cols; ++col) { for(uword row=0; row <= col; ++row) { R.at(row,col) = A.at(row,col); } } // determine quality of solution out_rcond = auxlib::rcond_trimat(R, 0); // 0: upper triangular; 1: lower triangular if( (allow_ugly == false) && (out_rcond < auxlib::epsilon_lapack(A)) ) { return false; } } else if(A.n_rows < A.n_cols) { arma_extra_debug_print("estimating rcond via L"); // xGELS docs: for M < N, A contains details of its LQ decomposition as returned by xGELQF // xGELQF docs: elements on and below the diagonal contain the M-by-min(M,N) lower trapezoidal matrix L Mat L(A.n_rows, A.n_rows, arma_zeros_indicator()); for(uword col=0; col < A.n_rows; ++col) { for(uword row=col; row < A.n_rows; ++row) { L.at(row,col) = A.at(row,col); } } // determine quality of solution out_rcond = auxlib::rcond_trimat(L, 1); // 0: upper triangular; 1: lower triangular if( (allow_ugly == false) && (out_rcond < auxlib::epsilon_lapack(A)) ) { return false; } } if(tmp.n_rows == A.n_cols) { out.steal_mem(tmp); } else { out = tmp.head_rows(A.n_cols); } return true; } #else { arma_ignore(out); arma_ignore(out_rcond); arma_ignore(A); arma_ignore(B_expr); arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::solve_approx_svd(Mat& out, Mat& A, const Base& B_expr) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type eT; const unwrap U(B_expr.get_ref()); const Mat& B = U.M; arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_cols, B.n_cols); return true; } arma_debug_assert_blas_size(A,B); Mat tmp( (std::max)(A.n_rows, A.n_cols), B.n_cols, arma_nozeros_indicator() ); if(arma::size(tmp) == arma::size(B)) { tmp = B; } else { tmp.zeros(); tmp(0,0, arma::size(B)) = B; } blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_cols); blas_int min_mn = (std::min)(m, n); blas_int nrhs = blas_int(B.n_cols); blas_int lda = blas_int(A.n_rows); blas_int ldb = blas_int(tmp.n_rows); eT rcond = eT(-1); // -1 means "use machine precision" blas_int rank = blas_int(0); blas_int info = blas_int(0); podarray S( static_cast(min_mn) ); // NOTE: with LAPACK 3.8, can use the workspace query to also obtain liwork, // NOTE: which makes the call to lapack::laenv() redundant blas_int ispec = blas_int(9); const char* const_name = (is_float::value) ? "SGELSD" : "DGELSD"; const char* const_opts = " "; char* name = const_cast(const_name); char* opts = const_cast(const_opts); blas_int n1 = m; blas_int n2 = n; blas_int n3 = nrhs; blas_int n4 = lda; blas_int laenv_result = (arma_config::hidden_args) ? blas_int(lapack::laenv(&ispec, name, opts, &n1, &n2, &n3, &n4, 6, 1)) : blas_int(0); blas_int smlsiz = (std::max)( blas_int(25), laenv_result ); blas_int smlsiz_p1 = blas_int(1) + smlsiz; blas_int nlvl = (std::max)( blas_int(0), blas_int(1) + blas_int( std::log(double(min_mn) / double(smlsiz_p1))/double(0.69314718055994530942) ) ); blas_int liwork = (std::max)( blas_int(1), (blas_int(3)*min_mn*nlvl + blas_int(11)*min_mn) ); podarray iwork( static_cast(liwork) ); blas_int lwork_min = blas_int(12)*min_mn + blas_int(2)*min_mn*smlsiz + blas_int(8)*min_mn*nlvl + min_mn*nrhs + smlsiz_p1*smlsiz_p1; eT work_query[2]; blas_int lwork_query = blas_int(-1); arma_extra_debug_print("lapack::gelsd()"); lapack::gelsd(&m, &n, &nrhs, A.memptr(), &lda, tmp.memptr(), &ldb, S.memptr(), &rcond, &rank, &work_query[0], &lwork_query, iwork.memptr(), &info); if(info != 0) { return false; } // NOTE: in LAPACK 3.8, iwork[0] returns the minimum liwork blas_int lwork_proposed = static_cast( access::tmp_real(work_query[0]) ); blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::gelsd()"); lapack::gelsd(&m, &n, &nrhs, A.memptr(), &lda, tmp.memptr(), &ldb, S.memptr(), &rcond, &rank, work.memptr(), &lwork_final, iwork.memptr(), &info); if(info != 0) { return false; } if(tmp.n_rows == A.n_cols) { out.steal_mem(tmp); } else { out = tmp.head_rows(A.n_cols); } return true; } #else { arma_ignore(out); arma_ignore(A); arma_ignore(B_expr); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::solve_approx_svd(Mat< std::complex >& out, Mat< std::complex >& A, const Base,T1>& B_expr) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; typedef typename std::complex eT; const unwrap U(B_expr.get_ref()); const Mat& B = U.M; arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_cols, B.n_cols); return true; } arma_debug_assert_blas_size(A,B); Mat tmp( (std::max)(A.n_rows, A.n_cols), B.n_cols, arma_nozeros_indicator() ); if(arma::size(tmp) == arma::size(B)) { tmp = B; } else { tmp.zeros(); tmp(0,0, arma::size(B)) = B; } blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_cols); blas_int min_mn = (std::min)(m, n); blas_int nrhs = blas_int(B.n_cols); blas_int lda = blas_int(A.n_rows); blas_int ldb = blas_int(tmp.n_rows); T rcond = T(-1); // -1 means "use machine precision" blas_int rank = blas_int(0); blas_int info = blas_int(0); podarray S( static_cast(min_mn) ); blas_int ispec = blas_int(9); const char* const_name = (is_float::value) ? "CGELSD" : "ZGELSD"; const char* const_opts = " "; char* name = const_cast(const_name); char* opts = const_cast(const_opts); blas_int n1 = m; blas_int n2 = n; blas_int n3 = nrhs; blas_int n4 = lda; blas_int laenv_result = (arma_config::hidden_args) ? blas_int(lapack::laenv(&ispec, name, opts, &n1, &n2, &n3, &n4, 6, 1)) : blas_int(0); blas_int smlsiz = (std::max)( blas_int(25), laenv_result ); blas_int smlsiz_p1 = blas_int(1) + smlsiz; blas_int nlvl = (std::max)( blas_int(0), blas_int(1) + blas_int( std::log(double(min_mn) / double(smlsiz_p1))/double(0.69314718055994530942) ) ); blas_int lrwork = (m >= n) ? blas_int(10)*n + blas_int(2)*n*smlsiz + blas_int(8)*n*nlvl + blas_int(3)*smlsiz*nrhs + (std::max)( (smlsiz_p1)*(smlsiz_p1), n*(blas_int(1)+nrhs) + blas_int(2)*nrhs ) : blas_int(10)*m + blas_int(2)*m*smlsiz + blas_int(8)*m*nlvl + blas_int(3)*smlsiz*nrhs + (std::max)( (smlsiz_p1)*(smlsiz_p1), n*(blas_int(1)+nrhs) + blas_int(2)*nrhs ); blas_int liwork = (std::max)( blas_int(1), (blas_int(3)*blas_int(min_mn)*nlvl + blas_int(11)*blas_int(min_mn)) ); podarray rwork( static_cast(lrwork) ); podarray iwork( static_cast(liwork) ); blas_int lwork_min = 2*min_mn + min_mn*nrhs; eT work_query[2]; blas_int lwork_query = blas_int(-1); arma_extra_debug_print("lapack::cx_gelsd()"); lapack::cx_gelsd(&m, &n, &nrhs, A.memptr(), &lda, tmp.memptr(), &ldb, S.memptr(), &rcond, &rank, &work_query[0], &lwork_query, rwork.memptr(), iwork.memptr(), &info); if(info != 0) { return false; } blas_int lwork_proposed = static_cast( access::tmp_real( work_query[0]) ); blas_int lwork_final = (std::max)(lwork_proposed, lwork_min); podarray work( static_cast(lwork_final) ); arma_extra_debug_print("lapack::cx_gelsd()"); lapack::cx_gelsd(&m, &n, &nrhs, A.memptr(), &lda, tmp.memptr(), &ldb, S.memptr(), &rcond, &rank, work.memptr(), &lwork_final, rwork.memptr(), iwork.memptr(), &info); if(info != 0) { return false; } if(tmp.n_rows == A.n_cols) { out.steal_mem(tmp); } else { out = tmp.head_rows(A.n_cols); } return true; } #else { arma_ignore(out); arma_ignore(A); arma_ignore(B_expr); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::solve_trimat_fast(Mat& out, const Mat& A, const Base& B_expr, const uword layout) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { out = B_expr.get_ref(); const uword B_n_rows = out.n_rows; const uword B_n_cols = out.n_cols; arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || out.is_empty()) { out.zeros(A.n_cols, B_n_cols); return true; } arma_debug_assert_blas_size(A,out); char uplo = (layout == 0) ? 'U' : 'L'; char trans = 'N'; char diag = 'N'; blas_int n = blas_int(A.n_rows); blas_int nrhs = blas_int(B_n_cols); blas_int info = 0; arma_extra_debug_print("lapack::trtrs()"); lapack::trtrs(&uplo, &trans, &diag, &n, &nrhs, A.memptr(), &n, out.memptr(), &n, &info); return (info == 0); } #else { arma_ignore(out); arma_ignore(A); arma_ignore(B_expr); arma_ignore(layout); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::solve_trimat_rcond(Mat& out, typename T1::pod_type& out_rcond, const Mat& A, const Base& B_expr, const uword layout, const bool allow_ugly) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; out_rcond = T(0); out = B_expr.get_ref(); const uword B_n_rows = out.n_rows; const uword B_n_cols = out.n_cols; arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || out.is_empty()) { out.zeros(A.n_cols, B_n_cols); return true; } arma_debug_assert_blas_size(A,out); char uplo = (layout == 0) ? 'U' : 'L'; char trans = 'N'; char diag = 'N'; blas_int n = blas_int(A.n_rows); blas_int nrhs = blas_int(B_n_cols); blas_int info = 0; arma_extra_debug_print("lapack::trtrs()"); lapack::trtrs(&uplo, &trans, &diag, &n, &nrhs, A.memptr(), &n, out.memptr(), &n, &info); if(info != 0) { return false; } // determine quality of solution out_rcond = auxlib::rcond_trimat(A, layout); if( (allow_ugly == false) && (out_rcond < auxlib::epsilon_lapack(A)) ) { return false; } return true; } #else { arma_ignore(out); arma_ignore(out_rcond); arma_ignore(A); arma_ignore(B_expr); arma_ignore(layout); arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } //! solve a system of linear equations via LU decomposition (real band matrix) template inline bool auxlib::solve_band_fast(Mat& out, Mat& A, const uword KL, const uword KU, const Base& B_expr) { arma_extra_debug_sigprint(); return auxlib::solve_band_fast_common(out, A, KL, KU, B_expr); } //! solve a system of linear equations via LU decomposition (complex band matrix) template inline bool auxlib::solve_band_fast(Mat< std::complex >& out, Mat< std::complex >& A, const uword KL, const uword KU, const Base< std::complex,T1>& B_expr) { arma_extra_debug_sigprint(); #if defined(ARMA_CRIPPLED_LAPACK) { arma_extra_debug_print("auxlib::solve_band_fast(): redirecting to auxlib::solve_square_fast() due to crippled LAPACK"); arma_ignore(KL); arma_ignore(KU); return auxlib::solve_square_fast(out, A, B_expr); } #else { return auxlib::solve_band_fast_common(out, A, KL, KU, B_expr); } #endif } //! solve a system of linear equations via LU decomposition (band matrix) template inline bool auxlib::solve_band_fast_common(Mat& out, const Mat& A, const uword KL, const uword KU, const Base& B_expr) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::elem_type eT; out = B_expr.get_ref(); const uword B_n_rows = out.n_rows; const uword B_n_cols = out.n_cols; arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || out.is_empty()) { out.zeros(A.n_rows, B_n_cols); return true; } // for gbsv, matrix AB size: 2*KL+KU+1 x N; band representation of A stored in rows KL+1 to 2*KL+KU+1 (note: fortran counts from 1) Mat AB; band_helper::compress(AB, A, KL, KU, true); const uword N = AB.n_cols; // order of the original square matrix A arma_debug_assert_blas_size(AB,out); blas_int n = blas_int(N); blas_int kl = blas_int(KL); blas_int ku = blas_int(KU); blas_int nrhs = blas_int(B_n_cols); blas_int ldab = blas_int(AB.n_rows); blas_int ldb = blas_int(B_n_rows); blas_int info = blas_int(0); podarray ipiv(N + 2); // +2 for paranoia // NOTE: AB is overwritten arma_extra_debug_print("lapack::gbsv()"); lapack::gbsv(&n, &kl, &ku, &nrhs, AB.memptr(), &ldab, ipiv.memptr(), out.memptr(), &ldb, &info); return (info == 0); } #else { arma_ignore(out); arma_ignore(A); arma_ignore(KL); arma_ignore(KU); arma_ignore(B_expr); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } //! solve a system of linear equations via LU decomposition (real band matrix) template inline bool auxlib::solve_band_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const uword KL, const uword KU, const Base& B_expr, const bool allow_ugly) { arma_extra_debug_sigprint(); return auxlib::solve_band_rcond_common(out, out_rcond, A, KL, KU, B_expr, allow_ugly); } //! solve a system of linear equations via LU decomposition (complex band matrix) template inline bool auxlib::solve_band_rcond(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const uword KL, const uword KU, const Base< std::complex,T1>& B_expr, const bool allow_ugly) { arma_extra_debug_sigprint(); #if defined(ARMA_CRIPPLED_LAPACK) { arma_extra_debug_print("auxlib::solve_band_rcond(): redirecting to auxlib::solve_square_rcond() due to crippled LAPACK"); arma_ignore(KL); arma_ignore(KU); return auxlib::solve_square_rcond(out, out_rcond, A, B_expr, allow_ugly); } #else { return auxlib::solve_band_rcond_common(out, out_rcond, A, KL, KU, B_expr, allow_ugly); } #endif } //! solve a system of linear equations via LU decomposition (band matrix) template inline bool auxlib::solve_band_rcond_common(Mat& out, typename T1::pod_type& out_rcond, const Mat& A, const uword KL, const uword KU, const Base& B_expr, const bool allow_ugly) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::elem_type eT; typedef typename T1::pod_type T; out_rcond = T(0); out = B_expr.get_ref(); const uword B_n_rows = out.n_rows; const uword B_n_cols = out.n_cols; arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || out.is_empty()) { out.zeros(A.n_rows, B_n_cols); return true; } // for gbtrf, matrix AB size: 2*KL+KU+1 x N; band representation of A stored in rows KL+1 to 2*KL+KU+1 (note: fortran counts from 1) Mat AB; band_helper::compress(AB, A, KL, KU, true); const uword N = AB.n_cols; // order of the original square matrix A arma_debug_assert_blas_size(AB,out); char norm_id = '1'; char trans = 'N'; blas_int n = blas_int(N); // assuming square matrix blas_int kl = blas_int(KL); blas_int ku = blas_int(KU); blas_int nrhs = blas_int(B_n_cols); blas_int ldab = blas_int(AB.n_rows); blas_int ldb = blas_int(B_n_rows); blas_int info = blas_int(0); T norm_val = T(0); podarray junk(1); podarray ipiv(N + 2); // +2 for paranoia arma_extra_debug_print("lapack::langb()"); norm_val = lapack::langb(&norm_id, &n, &kl, &ku, AB.memptr(), &ldab, junk.memptr()); arma_extra_debug_print("lapack::gbtrf()"); lapack::gbtrf(&n, &n, &kl, &ku, AB.memptr(), &ldab, ipiv.memptr(), &info); if(info != 0) { return false; } arma_extra_debug_print("lapack::gbtrs()"); lapack::gbtrs(&trans, &n, &kl, &ku, &nrhs, AB.memptr(), &ldab, ipiv.memptr(), out.memptr(), &ldb, &info); if(info != 0) { return false; } out_rcond = auxlib::lu_rcond_band(AB, KL, KU, ipiv, norm_val); if( (allow_ugly == false) && (out_rcond < auxlib::epsilon_lapack(AB)) ) { return false; } return true; } #else { arma_ignore(out); arma_ignore(out_rcond); arma_ignore(A); arma_ignore(KL); arma_ignore(KU); arma_ignore(B_expr); arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } //! solve a system of linear equations via LU decomposition with refinement (real band matrices) template inline bool auxlib::solve_band_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const uword KL, const uword KU, const Base& B_expr, const bool equilibrate, const bool allow_ugly) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type eT; Mat B = B_expr.get_ref(); // B is overwritten arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_rows, B.n_cols); return true; } // for gbsvx, matrix AB size: KL+KU+1 x N; band representation of A stored in rows 1 to KL+KU+1 (note: fortran counts from 1) Mat AB; band_helper::compress(AB, A, KL, KU, false); const uword N = AB.n_cols; arma_debug_assert_blas_size(AB,B); out.set_size(N, B.n_cols); Mat AFB(2*KL+KU+1, N, arma_nozeros_indicator()); char fact = (equilibrate) ? 'E' : 'N'; char trans = 'N'; char equed = char(0); blas_int n = blas_int(N); blas_int kl = blas_int(KL); blas_int ku = blas_int(KU); blas_int nrhs = blas_int(B.n_cols); blas_int ldab = blas_int(AB.n_rows); blas_int ldafb = blas_int(AFB.n_rows); blas_int ldb = blas_int(B.n_rows); blas_int ldx = blas_int(N); blas_int info = blas_int(0); eT rcond = eT(0); podarray IPIV( N); podarray R( N); podarray C( N); podarray FERR( B.n_cols); podarray BERR( B.n_cols); podarray WORK(3*N); podarray IWORK( N); arma_extra_debug_print("lapack::gbsvx()"); lapack::gbsvx ( &fact, &trans, &n, &kl, &ku, &nrhs, AB.memptr(), &ldab, AFB.memptr(), &ldafb, IPIV.memptr(), &equed, R.memptr(), C.memptr(), B.memptr(), &ldb, out.memptr(), &ldx, &rcond, FERR.memptr(), BERR.memptr(), WORK.memptr(), IWORK.memptr(), &info ); out_rcond = rcond; return (allow_ugly) ? ((info == 0) || (info == (n+1))) : (info == 0); } #else { arma_ignore(out); arma_ignore(out_rcond); arma_ignore(A); arma_ignore(KL); arma_ignore(KU); arma_ignore(B_expr); arma_ignore(equilibrate); arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } //! solve a system of linear equations via LU decomposition with refinement (complex band matrices) template inline bool auxlib::solve_band_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const uword KL, const uword KU, const Base,T1>& B_expr, const bool equilibrate, const bool allow_ugly) { arma_extra_debug_sigprint(); #if defined(ARMA_CRIPPLED_LAPACK) { arma_extra_debug_print("auxlib::solve_band_refine(): redirecting to auxlib::solve_square_refine() due to crippled LAPACK"); arma_ignore(KL); arma_ignore(KU); return auxlib::solve_square_refine(out, out_rcond, A, B_expr, equilibrate, allow_ugly); } #elif defined(ARMA_USE_LAPACK) { typedef typename T1::pod_type T; typedef typename std::complex eT; Mat B = B_expr.get_ref(); // B is overwritten arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_rows, B.n_cols); return true; } // for gbsvx, matrix AB size: KL+KU+1 x N; band representation of A stored in rows 1 to KL+KU+1 (note: fortran counts from 1) Mat AB; band_helper::compress(AB, A, KL, KU, false); const uword N = AB.n_cols; arma_debug_assert_blas_size(AB,B); out.set_size(N, B.n_cols); Mat AFB(2*KL+KU+1, N, arma_nozeros_indicator()); char fact = (equilibrate) ? 'E' : 'N'; char trans = 'N'; char equed = char(0); blas_int n = blas_int(N); blas_int kl = blas_int(KL); blas_int ku = blas_int(KU); blas_int nrhs = blas_int(B.n_cols); blas_int ldab = blas_int(AB.n_rows); blas_int ldafb = blas_int(AFB.n_rows); blas_int ldb = blas_int(B.n_rows); blas_int ldx = blas_int(N); blas_int info = blas_int(0); T rcond = T(0); podarray IPIV( N); podarray< T> R( N); podarray< T> C( N); podarray< T> FERR( B.n_cols); podarray< T> BERR( B.n_cols); podarray WORK(2*N); podarray< T> RWORK( N); // NOTE: according to lapack 3.6.1 docs, the size of RWORK in zgbsvx is different to RWORK in dgesvx arma_extra_debug_print("lapack::cx_gbsvx()"); lapack::cx_gbsvx ( &fact, &trans, &n, &kl, &ku, &nrhs, AB.memptr(), &ldab, AFB.memptr(), &ldafb, IPIV.memptr(), &equed, R.memptr(), C.memptr(), B.memptr(), &ldb, out.memptr(), &ldx, &rcond, FERR.memptr(), BERR.memptr(), WORK.memptr(), RWORK.memptr(), &info ); out_rcond = rcond; return (allow_ugly) ? ((info == 0) || (info == (n+1))) : (info == 0); } #else { arma_ignore(out); arma_ignore(out_rcond); arma_ignore(A); arma_ignore(KL); arma_ignore(KU); arma_ignore(B_expr); arma_ignore(equilibrate); arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } //! solve a system of linear equations via Gaussian elimination with partial pivoting (real tridiagonal band matrix) template inline bool auxlib::solve_tridiag_fast(Mat& out, Mat& A, const Base& B_expr) { arma_extra_debug_sigprint(); return auxlib::solve_tridiag_fast_common(out, A, B_expr); } //! solve a system of linear equations via Gaussian elimination with partial pivoting (complex tridiagonal band matrix) template inline bool auxlib::solve_tridiag_fast(Mat< std::complex >& out, Mat< std::complex >& A, const Base< std::complex,T1>& B_expr) { arma_extra_debug_sigprint(); #if defined(ARMA_CRIPPLED_LAPACK) { arma_extra_debug_print("auxlib::solve_tridiag_fast(): redirecting to auxlib::solve_square_fast() due to crippled LAPACK"); return auxlib::solve_square_fast(out, A, B_expr); } #else { return auxlib::solve_tridiag_fast_common(out, A, B_expr); } #endif } //! solve a system of linear equations via Gaussian elimination with partial pivoting (tridiagonal band matrix) template inline bool auxlib::solve_tridiag_fast_common(Mat& out, const Mat& A, const Base& B_expr) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename T1::elem_type eT; out = B_expr.get_ref(); const uword B_n_rows = out.n_rows; const uword B_n_cols = out.n_cols; arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in the given matrices must be the same" ); if(A.is_empty() || out.is_empty()) { out.zeros(A.n_rows, B_n_cols); return true; } Mat tridiag; band_helper::extract_tridiag(tridiag, A); arma_debug_assert_blas_size(tridiag, out); blas_int n = blas_int(A.n_rows); blas_int nrhs = blas_int(B_n_cols); blas_int ldb = blas_int(B_n_rows); blas_int info = blas_int(0); arma_extra_debug_print("lapack::gtsv()"); lapack::gtsv(&n, &nrhs, tridiag.colptr(0), tridiag.colptr(1), tridiag.colptr(2), out.memptr(), &ldb, &info); return (info == 0); } #else { arma_ignore(out); arma_ignore(A); arma_ignore(B_expr); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } #endif } // // Schur decomposition template inline bool auxlib::schur(Mat& U, Mat& S, const Base& X, const bool calc_U) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { S = X.get_ref(); arma_debug_check( (S.is_square() == false), "schur(): given matrix must be square sized" ); if(S.is_empty()) { U.reset(); S.reset(); return true; } arma_debug_assert_blas_size(S); const uword S_n_rows = S.n_rows; if(calc_U) { U.set_size(S_n_rows, S_n_rows); } else { U.set_size(1,1); } char jobvs = calc_U ? 'V' : 'N'; char sort = 'N'; void* select = 0; blas_int n = blas_int(S_n_rows); blas_int sdim = 0; blas_int ldvs = calc_U ? n : blas_int(1); blas_int lwork = 64*n; // lwork_min = (std::max)(blas_int(1), 3*n) blas_int info = 0; podarray wr(S_n_rows); podarray wi(S_n_rows); podarray work( static_cast(lwork) ); podarray bwork(S_n_rows); arma_extra_debug_print("lapack::gees()"); lapack::gees(&jobvs, &sort, select, &n, S.memptr(), &n, &sdim, wr.memptr(), wi.memptr(), U.memptr(), &ldvs, work.memptr(), &lwork, bwork.memptr(), &info); return (info == 0); } #else { arma_ignore(U); arma_ignore(S); arma_ignore(X); arma_ignore(calc_U); arma_stop_logic_error("schur(): use of LAPACK must be enabled"); return false; } #endif } template inline bool auxlib::schur(Mat< std::complex >& U, Mat< std::complex >& S, const Base,T1>& X, const bool calc_U) { arma_extra_debug_sigprint(); S = X.get_ref(); arma_debug_check( (S.is_square() == false), "schur(): given matrix must be square sized" ); return auxlib::schur(U,S,calc_U); } template inline bool auxlib::schur(Mat< std::complex >& U, Mat< std::complex >& S, const bool calc_U) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef std::complex eT; if(S.is_empty()) { U.reset(); S.reset(); return true; } arma_debug_assert_blas_size(S); const uword S_n_rows = S.n_rows; if(calc_U) { U.set_size(S_n_rows, S_n_rows); } else { U.set_size(1,1); } char jobvs = calc_U ? 'V' : 'N'; char sort = 'N'; void* select = 0; blas_int n = blas_int(S_n_rows); blas_int sdim = 0; blas_int ldvs = calc_U ? n : blas_int(1); blas_int lwork = 64*n; // lwork_min = (std::max)(blas_int(1), 2*n) blas_int info = 0; podarray w(S_n_rows); podarray work( static_cast(lwork) ); podarray< T> rwork(S_n_rows); podarray bwork(S_n_rows); arma_extra_debug_print("lapack::cx_gees()"); lapack::cx_gees(&jobvs, &sort, select, &n, S.memptr(), &n, &sdim, w.memptr(), U.memptr(), &ldvs, work.memptr(), &lwork, rwork.memptr(), bwork.memptr(), &info); return (info == 0); } #else { arma_ignore(U); arma_ignore(S); arma_ignore(calc_U); arma_stop_logic_error("schur(): use of LAPACK must be enabled"); return false; } #endif } // // solve the Sylvester equation AX + XB = C template inline bool auxlib::syl(Mat& X, const Mat& A, const Mat& B, const Mat& C) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { arma_debug_check( (A.is_square() == false) || (B.is_square() == false), "syl(): given matrices must be square sized" ); arma_debug_check( (C.n_rows != A.n_rows) || (C.n_cols != B.n_cols), "syl(): matrices are not conformant" ); if(A.is_empty() || B.is_empty() || C.is_empty()) { X.reset(); return true; } Mat Z1, Z2, T1, T2; const bool status_sd1 = auxlib::schur(Z1, T1, A); const bool status_sd2 = auxlib::schur(Z2, T2, B); if( (status_sd1 == false) || (status_sd2 == false) ) { return false; } char trana = 'N'; char tranb = 'N'; blas_int isgn = +1; blas_int m = blas_int(T1.n_rows); blas_int n = blas_int(T2.n_cols); eT scale = eT(0); blas_int info = 0; Mat Y = trans(Z1) * C * Z2; arma_extra_debug_print("lapack::trsyl()"); lapack::trsyl(&trana, &tranb, &isgn, &m, &n, T1.memptr(), &m, T2.memptr(), &n, Y.memptr(), &m, &scale, &info); if(info < 0) { return false; } //Y /= scale; Y /= (-scale); X = Z1 * Y * trans(Z2); return true; } #else { arma_ignore(X); arma_ignore(A); arma_ignore(B); arma_ignore(C); arma_stop_logic_error("syl(): use of LAPACK must be enabled"); return false; } #endif } // // QZ decomposition of general square real matrix pair template inline bool auxlib::qz(Mat& A, Mat& B, Mat& vsl, Mat& vsr, const Base& X_expr, const Base& Y_expr, const char mode) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { A = X_expr.get_ref(); B = Y_expr.get_ref(); arma_debug_check( ((A.is_square() == false) || (B.is_square() == false)), "qz(): given matrices must be square sized" ); arma_debug_check( (A.n_rows != B.n_rows), "qz(): given matrices must have the same size" ); if(A.is_empty()) { A.reset(); B.reset(); vsl.reset(); vsr.reset(); return true; } arma_debug_assert_blas_size(A); vsl.set_size(A.n_rows, A.n_rows); vsr.set_size(A.n_rows, A.n_rows); char jobvsl = 'V'; char jobvsr = 'V'; char eigsort = 'N'; void* selctg = 0; blas_int N = blas_int(A.n_rows); blas_int sdim = 0; blas_int lwork = 64*N+16; // lwork_min = (std::max)(blas_int(1),8*N+16) blas_int info = 0; if(mode == 'l') { eigsort = 'S'; selctg = qz_helper::ptr_cast(&(qz_helper::select_lhp)); } else if(mode == 'r') { eigsort = 'S'; selctg = qz_helper::ptr_cast(&(qz_helper::select_rhp)); } else if(mode == 'i') { eigsort = 'S'; selctg = qz_helper::ptr_cast(&(qz_helper::select_iuc)); } else if(mode == 'o') { eigsort = 'S'; selctg = qz_helper::ptr_cast(&(qz_helper::select_ouc)); } podarray alphar(A.n_rows); podarray alphai(A.n_rows); podarray beta(A.n_rows); podarray work( static_cast(lwork) ); podarray bwork( static_cast(N) ); arma_extra_debug_print("lapack::gges()"); lapack::gges ( &jobvsl, &jobvsr, &eigsort, selctg, &N, A.memptr(), &N, B.memptr(), &N, &sdim, alphar.memptr(), alphai.memptr(), beta.memptr(), vsl.memptr(), &N, vsr.memptr(), &N, work.memptr(), &lwork, bwork.memptr(), &info ); if(info != 0) { return false; } op_strans::apply_mat_inplace(vsl); return true; } #else { arma_ignore(A); arma_ignore(B); arma_ignore(vsl); arma_ignore(vsr); arma_ignore(X_expr); arma_ignore(Y_expr); arma_ignore(mode); arma_stop_logic_error("qz(): use of LAPACK must be enabled"); return false; } #endif } // // QZ decomposition of general square complex matrix pair template inline bool auxlib::qz(Mat< std::complex >& A, Mat< std::complex >& B, Mat< std::complex >& vsl, Mat< std::complex >& vsr, const Base< std::complex, T1 >& X_expr, const Base< std::complex, T2 >& Y_expr, const char mode) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_LAPACK) { typedef typename std::complex eT; A = X_expr.get_ref(); B = Y_expr.get_ref(); arma_debug_check( ((A.is_square() == false) || (B.is_square() == false)), "qz(): given matrices must be square sized" ); arma_debug_check( (A.n_rows != B.n_rows), "qz(): given matrices must have the same size" ); if(A.is_empty()) { A.reset(); B.reset(); vsl.reset(); vsr.reset(); return true; } arma_debug_assert_blas_size(A); vsl.set_size(A.n_rows, A.n_rows); vsr.set_size(A.n_rows, A.n_rows); char jobvsl = 'V'; char jobvsr = 'V'; char eigsort = 'N'; void* selctg = 0; blas_int N = blas_int(A.n_rows); blas_int sdim = 0; blas_int lwork = 64*N; // lwork_min = (std::max)(blas_int(1),2*N) blas_int info = 0; if(mode == 'l') { eigsort = 'S'; selctg = qz_helper::ptr_cast(&(qz_helper::cx_select_lhp)); } else if(mode == 'r') { eigsort = 'S'; selctg = qz_helper::ptr_cast(&(qz_helper::cx_select_rhp)); } else if(mode == 'i') { eigsort = 'S'; selctg = qz_helper::ptr_cast(&(qz_helper::cx_select_iuc)); } else if(mode == 'o') { eigsort = 'S'; selctg = qz_helper::ptr_cast(&(qz_helper::cx_select_ouc)); } podarray alpha(A.n_rows); podarray beta(A.n_rows); podarray work( static_cast(lwork) ); podarray< T> rwork( static_cast(8*N) ); podarray bwork( static_cast(N) ); arma_extra_debug_print("lapack::cx_gges()"); lapack::cx_gges ( &jobvsl, &jobvsr, &eigsort, selctg, &N, A.memptr(), &N, B.memptr(), &N, &sdim, alpha.memptr(), beta.memptr(), vsl.memptr(), &N, vsr.memptr(), &N, work.memptr(), &lwork, rwork.memptr(), bwork.memptr(), &info ); if(info != 0) { return false; } op_htrans::apply_mat_inplace(vsl); return true; } #else { arma_ignore(A); arma_ignore(B); arma_ignore(vsl); arma_ignore(vsr); arma_ignore(X_expr); arma_ignore(Y_expr); arma_ignore(mode); arma_stop_logic_error("qz(): use of LAPACK must be enabled"); return false; } #endif } template inline eT auxlib::rcond(Mat& A) { #if defined(ARMA_USE_LAPACK) { arma_debug_assert_blas_size(A); char norm_id = '1'; blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_rows); // assuming square matrix blas_int lda = blas_int(A.n_rows); eT norm_val = eT(0); eT rcond = eT(0); blas_int info = blas_int(0); podarray work(4*A.n_rows); podarray iwork( A.n_rows); podarray ipiv( (std::min)(A.n_rows, A.n_cols) ); arma_extra_debug_print("lapack::lange()"); norm_val = lapack::lange(&norm_id, &m, &n, A.memptr(), &lda, work.memptr()); arma_extra_debug_print("lapack::getrf()"); lapack::getrf(&m, &n, A.memptr(), &lda, ipiv.memptr(), &info); if(info != blas_int(0)) { return eT(0); } arma_extra_debug_print("lapack::gecon()"); lapack::gecon(&norm_id, &n, A.memptr(), &lda, &norm_val, &rcond, work.memptr(), iwork.memptr(), &info); if(info != blas_int(0)) { return eT(0); } return rcond; } #else { arma_ignore(A); arma_stop_logic_error("rcond(): use of LAPACK must be enabled"); return eT(0); } #endif } template inline T auxlib::rcond(Mat< std::complex >& A) { #if defined(ARMA_USE_LAPACK) { typedef typename std::complex eT; arma_debug_assert_blas_size(A); char norm_id = '1'; blas_int m = blas_int(A.n_rows); blas_int n = blas_int(A.n_rows); // assuming square matrix blas_int lda = blas_int(A.n_rows); T norm_val = T(0); T rcond = T(0); blas_int info = blas_int(0); podarray< T> junk(1); podarray work(2*A.n_rows); podarray< T> rwork(2*A.n_rows); podarray ipiv( (std::min)(A.n_rows, A.n_cols) ); arma_extra_debug_print("lapack::lange()"); norm_val = lapack::lange(&norm_id, &m, &n, A.memptr(), &lda, junk.memptr()); arma_extra_debug_print("lapack::getrf()"); lapack::getrf(&m, &n, A.memptr(), &lda, ipiv.memptr(), &info); if(info != blas_int(0)) { return T(0); } arma_extra_debug_print("lapack::cx_gecon()"); lapack::cx_gecon(&norm_id, &n, A.memptr(), &lda, &norm_val, &rcond, work.memptr(), rwork.memptr(), &info); if(info != blas_int(0)) { return T(0); } return rcond; } #else { arma_ignore(A); arma_stop_logic_error("rcond(): use of LAPACK must be enabled"); return T(0); } #endif } template inline eT auxlib::rcond_sympd(Mat& A, bool& calc_ok) { #if defined(ARMA_USE_LAPACK) { arma_debug_assert_blas_size(A); calc_ok = false; char norm_id = '1'; char uplo = 'L'; blas_int n = blas_int(A.n_rows); // assuming square matrix blas_int lda = blas_int(A.n_rows); eT norm_val = eT(0); eT rcond = eT(0); blas_int info = blas_int(0); podarray work(3*A.n_rows); podarray iwork( A.n_rows); arma_extra_debug_print("lapack::lansy()"); norm_val = lapack::lansy(&norm_id, &uplo, &n, A.memptr(), &lda, work.memptr()); arma_extra_debug_print("lapack::potrf()"); lapack::potrf(&uplo, &n, A.memptr(), &lda, &info); if(info != blas_int(0)) { return eT(0); } arma_extra_debug_print("lapack::pocon()"); lapack::pocon(&uplo, &n, A.memptr(), &lda, &norm_val, &rcond, work.memptr(), iwork.memptr(), &info); if(info != blas_int(0)) { return eT(0); } calc_ok = true; return rcond; } #else { arma_ignore(A); calc_ok = false; arma_stop_logic_error("rcond(): use of LAPACK must be enabled"); return eT(0); } #endif } template inline T auxlib::rcond_sympd(Mat< std::complex >& A, bool& calc_ok) { #if defined(ARMA_CRIPPLED_LAPACK) { arma_extra_debug_print("auxlib::rcond_sympd(): redirecting to auxlib::rcond() due to crippled LAPACK"); calc_ok = true; return auxlib::rcond(A); } #elif defined(ARMA_USE_LAPACK) { typedef typename std::complex eT; arma_debug_assert_blas_size(A); calc_ok = false; char norm_id = '1'; char uplo = 'L'; blas_int n = blas_int(A.n_rows); // assuming square matrix blas_int lda = blas_int(A.n_rows); T norm_val = T(0); T rcond = T(0); blas_int info = blas_int(0); podarray work(2*A.n_rows); podarray< T> rwork( A.n_rows); arma_extra_debug_print("lapack::lanhe()"); norm_val = lapack::lanhe(&norm_id, &uplo, &n, A.memptr(), &lda, rwork.memptr()); arma_extra_debug_print("lapack::potrf()"); lapack::potrf(&uplo, &n, A.memptr(), &lda, &info); if(info != blas_int(0)) { return T(0); } arma_extra_debug_print("lapack::cx_pocon()"); lapack::cx_pocon(&uplo, &n, A.memptr(), &lda, &norm_val, &rcond, work.memptr(), rwork.memptr(), &info); if(info != blas_int(0)) { return T(0); } calc_ok = true; return rcond; } #else { arma_ignore(A); calc_ok = false; arma_stop_logic_error("rcond(): use of LAPACK must be enabled"); return T(0); } #endif } template inline eT auxlib::rcond_trimat(const Mat& A, const uword layout) { #if defined(ARMA_USE_LAPACK) { arma_debug_assert_blas_size(A); char norm_id = '1'; char uplo = (layout == 0) ? 'U' : 'L'; char diag = 'N'; blas_int n = blas_int(A.n_rows); // assuming square matrix eT rcond = eT(0); blas_int info = blas_int(0); podarray work(3*A.n_rows); podarray iwork( A.n_rows); arma_extra_debug_print("lapack::trcon()"); lapack::trcon(&norm_id, &uplo, &diag, &n, A.memptr(), &n, &rcond, work.memptr(), iwork.memptr(), &info); if(info != blas_int(0)) { return eT(0); } return rcond; } #else { arma_ignore(A); arma_ignore(layout); arma_stop_logic_error("rcond(): use of LAPACK must be enabled"); return eT(0); } #endif } template inline T auxlib::rcond_trimat(const Mat< std::complex >& A, const uword layout) { #if defined(ARMA_USE_LAPACK) { typedef typename std::complex eT; arma_debug_assert_blas_size(A); char norm_id = '1'; char uplo = (layout == 0) ? 'U' : 'L'; char diag = 'N'; blas_int n = blas_int(A.n_rows); // assuming square matrix T rcond = T(0); blas_int info = blas_int(0); podarray work(2*A.n_rows); podarray< T> rwork( A.n_rows); arma_extra_debug_print("lapack::cx_trcon()"); lapack::cx_trcon(&norm_id, &uplo, &diag, &n, A.memptr(), &n, &rcond, work.memptr(), rwork.memptr(), &info); if(info != blas_int(0)) { return T(0); } return rcond; } #else { arma_ignore(A); arma_ignore(layout); arma_stop_logic_error("rcond(): use of LAPACK must be enabled"); return T(0); } #endif } template inline eT auxlib::lu_rcond(const Mat& A, const eT norm_val) { #if defined(ARMA_USE_LAPACK) { char norm_id = '1'; blas_int n = blas_int(A.n_rows); // assuming square matrix blas_int lda = blas_int(A.n_rows); eT rcond = eT(0); blas_int info = blas_int(0); podarray work(4*A.n_rows); podarray iwork( A.n_rows); arma_extra_debug_print("lapack::gecon()"); lapack::gecon(&norm_id, &n, A.memptr(), &lda, &norm_val, &rcond, work.memptr(), iwork.memptr(), &info); if(info != blas_int(0)) { return eT(0); } return rcond; } #else { arma_ignore(A); arma_ignore(norm_val); return eT(0); } #endif } template inline T auxlib::lu_rcond(const Mat< std::complex >& A, const T norm_val) { #if defined(ARMA_USE_LAPACK) { typedef typename std::complex eT; char norm_id = '1'; blas_int n = blas_int(A.n_rows); // assuming square matrix blas_int lda = blas_int(A.n_rows); T rcond = T(0); blas_int info = blas_int(0); podarray work(2*A.n_rows); podarray< T> rwork(2*A.n_rows); arma_extra_debug_print("lapack::cx_gecon()"); lapack::cx_gecon(&norm_id, &n, A.memptr(), &lda, &norm_val, &rcond, work.memptr(), rwork.memptr(), &info); if(info != blas_int(0)) { return T(0); } return rcond; } #else { arma_ignore(A); arma_ignore(norm_val); return T(0); } #endif } template inline eT auxlib::lu_rcond_sympd(const Mat& A, const eT norm_val) { #if defined(ARMA_USE_LAPACK) { char uplo = 'L'; blas_int n = blas_int(A.n_rows); // assuming square matrix eT rcond = eT(0); blas_int info = blas_int(0); podarray work(3*A.n_rows); podarray iwork( A.n_rows); arma_extra_debug_print("lapack::pocon()"); lapack::pocon(&uplo, &n, A.memptr(), &n, &norm_val, &rcond, work.memptr(), iwork.memptr(), &info); if(info != blas_int(0)) { return eT(0); } return rcond; } #else { arma_ignore(A); arma_ignore(norm_val); return eT(0); } #endif } template inline T auxlib::lu_rcond_sympd(const Mat< std::complex >& A, const T norm_val) { #if defined(ARMA_CRIPPLED_LAPACK) { arma_ignore(A); arma_ignore(norm_val); return T(0); } #elif defined(ARMA_USE_LAPACK) { typedef typename std::complex eT; char uplo = 'L'; blas_int n = blas_int(A.n_rows); // assuming square matrix T rcond = T(0); blas_int info = blas_int(0); podarray work(2*A.n_rows); podarray< T> rwork( A.n_rows); arma_extra_debug_print("lapack::cx_pocon()"); lapack::cx_pocon(&uplo, &n, A.memptr(), &n, &norm_val, &rcond, work.memptr(), rwork.memptr(), &info); if(info != blas_int(0)) { return T(0); } return rcond; } #else { arma_ignore(A); arma_ignore(norm_val); return T(0); } #endif } template inline eT auxlib::lu_rcond_band(const Mat& AB, const uword KL, const uword KU, const podarray& ipiv, const eT norm_val) { #if defined(ARMA_USE_LAPACK) { const uword N = AB.n_cols; // order of the original square matrix A char norm_id = '1'; blas_int n = blas_int(N); blas_int kl = blas_int(KL); blas_int ku = blas_int(KU); blas_int ldab = blas_int(AB.n_rows); eT rcond = eT(0); blas_int info = blas_int(0); podarray work(3*N); podarray iwork( N); arma_extra_debug_print("lapack::gbcon()"); lapack::gbcon(&norm_id, &n, &kl, &ku, AB.memptr(), &ldab, ipiv.memptr(), &norm_val, &rcond, work.memptr(), iwork.memptr(), &info); if(info != blas_int(0)) { return eT(0); } return rcond; } #else { arma_ignore(AB); arma_ignore(KL); arma_ignore(KU); arma_ignore(ipiv); arma_ignore(norm_val); return eT(0); } #endif } template inline T auxlib::lu_rcond_band(const Mat< std::complex >& AB, const uword KL, const uword KU, const podarray& ipiv, const T norm_val) { #if defined(ARMA_CRIPPLED_LAPACK) { arma_ignore(AB); arma_ignore(KL); arma_ignore(KU); arma_ignore(ipiv); arma_ignore(norm_val); return T(0); } #elif defined(ARMA_USE_LAPACK) { typedef typename std::complex eT; const uword N = AB.n_cols; // order of the original square matrix A char norm_id = '1'; blas_int n = blas_int(N); blas_int kl = blas_int(KL); blas_int ku = blas_int(KU); blas_int ldab = blas_int(AB.n_rows); T rcond = T(0); blas_int info = blas_int(0); podarray work(2*N); podarray< T> rwork( N); arma_extra_debug_print("lapack::cx_gbcon()"); lapack::cx_gbcon(&norm_id, &n, &kl, &ku, AB.memptr(), &ldab, ipiv.memptr(), &norm_val, &rcond, work.memptr(), rwork.memptr(), &info); if(info != blas_int(0)) { return T(0); } return rcond; } #else { arma_ignore(AB); arma_ignore(KL); arma_ignore(KU); arma_ignore(ipiv); arma_ignore(norm_val); return T(0); } #endif } template inline bool auxlib::crippled_lapack(const Base&) { #if defined(ARMA_CRIPPLED_LAPACK) { arma_extra_debug_print("auxlib::crippled_lapack(): true"); return (is_cx::yes); } #else { return false; } #endif } template inline typename T1::pod_type auxlib::epsilon_lapack(const Base&) { typedef typename T1::pod_type T; return T(0.5)*std::numeric_limits::epsilon(); // value reverse engineered from dgesvx.f and dlamch.f // http://www.netlib.org/lapack/explore-html/da/d21/dgesvx_8f.html // http://www.netlib.org/lapack/explore-html/d5/dd4/dlamch_8f.html // // Fortran epsilon(X) function: // https://gcc.gnu.org/onlinedocs/gfortran/EPSILON.html // "EPSILON(X) returns the smallest number E of the same kind as X such that 1 + E > 1" // // C++ std::numeric_limits::epsilon() function: // https://en.cppreference.com/w/cpp/types/numeric_limits/epsilon // "the difference between 1.0 and the next value representable by the floating-point type T" // // extract from dgesvx.f: // // IF( rcond.LT.dlamch( 'Epsilon' ) ) // info = n + 1 // RETURN // // extract from dlamch.f: // // * rnd = 1.0 when rounding occurs in addition, 0.0 otherwise // ... // * Assume rounding, not chopping. Always // // rnd = one // // IF( one.EQ.rnd ) THEN // eps = epsilon(zero) * 0.5 // ELSE // eps = epsilon(zero) // END IF // ... // IF( lsame( cmach, 'E' ) ) THEN // rmach = eps // ... // END IF // ... // dlamch = rmach // RETURN } template inline bool auxlib::rudimentary_sym_check(const Mat& X) { arma_extra_debug_sigprint(); const uword N = X.n_rows; const uword Nm2 = N-2; if(N != X.n_cols) { return false; } if(N <= uword(1)) { return true; } const eT* X_mem = X.memptr(); const eT* X_offsetA = &(X_mem[Nm2 ]); const eT* X_offsetB = &(X_mem[Nm2*N]); const eT A1 = *(X_offsetA ); const eT A2 = *(X_offsetA+1); // bottom-left corner (ie. last value in first column) const eT B1 = *(X_offsetB ); const eT B2 = *(X_offsetB+N); // top-right corner (ie. first value in last column) const eT C1 = (std::max)(std::abs(A1), std::abs(B1)); const eT C2 = (std::max)(std::abs(A2), std::abs(B2)); const eT delta1 = std::abs(A1 - B1); const eT delta2 = std::abs(A2 - B2); const eT tol = eT(10000)*std::numeric_limits::epsilon(); // allow some leeway const bool okay1 = ( (delta1 <= tol) || (delta1 <= (C1 * tol)) ); const bool okay2 = ( (delta2 <= tol) || (delta2 <= (C2 * tol)) ); return (okay1 && okay2); } template inline bool auxlib::rudimentary_sym_check(const Mat< std::complex >& X) { arma_extra_debug_sigprint(); // NOTE: the function name is a misnomer, as it checks for hermitian complex matrices; // NOTE: for simplicity of use, the function name is the same as for real matrices typedef typename std::complex eT; const uword N = X.n_rows; const uword Nm1 = N-1; if(N != X.n_cols) { return false; } if(N == uword(0)) { return true; } const eT* X_mem = X.memptr(); const T tol = T(10000)*std::numeric_limits::epsilon(); // allow some leeway if(std::abs(X_mem[0 ].imag()) > tol) { return false; } // check top-left if(std::abs(X_mem[X.n_elem-1].imag()) > tol) { return false; } // check bottom-right const eT& A = X_mem[Nm1 ]; // bottom-left corner (ie. last value in first column) const eT& B = X_mem[Nm1*N]; // top-right corner (ie. first value in last column) const T C_real = (std::max)(std::abs(A.real()), std::abs(B.real())); const T C_imag = (std::max)(std::abs(A.imag()), std::abs(B.imag())); const T delta_real = std::abs(A.real() - B.real()); const T delta_imag = std::abs(A.imag() + B.imag()); // take into account the conjugate const bool okay_real = ( (delta_real <= tol) || (delta_real <= (C_real * tol)) ); const bool okay_imag = ( (delta_imag <= tol) || (delta_imag <= (C_imag * tol)) ); return (okay_real && okay_imag); } // namespace qz_helper { // sgges() and dgges() require an external function with three arguments: // select(alpha_real, alpha_imag, beta) // where the eigenvalue is defined as complex(alpha_real, alpha_imag) / beta template inline blas_int select_lhp(const T* x_ptr, const T* y_ptr, const T* z_ptr) { arma_extra_debug_sigprint(); // cout << "select_lhp(): (*x_ptr) = " << (*x_ptr) << endl; // cout << "select_lhp(): (*y_ptr) = " << (*y_ptr) << endl; // cout << "select_lhp(): (*z_ptr) = " << (*z_ptr) << endl; arma_ignore(y_ptr); // ignore imaginary part const T x = (*x_ptr); const T z = (*z_ptr); if(z == T(0)) { return blas_int(0); } // consider an infinite eig value not to lie in either lhp or rhp return ((x/z) < T(0)) ? blas_int(1) : blas_int(0); } template inline blas_int select_rhp(const T* x_ptr, const T* y_ptr, const T* z_ptr) { arma_extra_debug_sigprint(); // cout << "select_rhp(): (*x_ptr) = " << (*x_ptr) << endl; // cout << "select_rhp(): (*y_ptr) = " << (*y_ptr) << endl; // cout << "select_rhp(): (*z_ptr) = " << (*z_ptr) << endl; arma_ignore(y_ptr); // ignore imaginary part const T x = (*x_ptr); const T z = (*z_ptr); if(z == T(0)) { return blas_int(0); } // consider an infinite eig value not to lie in either lhp or rhp return ((x/z) > T(0)) ? blas_int(1) : blas_int(0); } template inline blas_int select_iuc(const T* x_ptr, const T* y_ptr, const T* z_ptr) { arma_extra_debug_sigprint(); // cout << "select_iuc(): (*x_ptr) = " << (*x_ptr) << endl; // cout << "select_iuc(): (*y_ptr) = " << (*y_ptr) << endl; // cout << "select_iuc(): (*z_ptr) = " << (*z_ptr) << endl; const T x = (*x_ptr); const T y = (*y_ptr); const T z = (*z_ptr); if(z == T(0)) { return blas_int(0); } // consider an infinite eig value to be outside of the unit circle //return (std::abs(std::complex(x,y) / z) < T(1)) ? blas_int(1) : blas_int(0); return (std::sqrt(x*x + y*y) < std::abs(z)) ? blas_int(1) : blas_int(0); } template inline blas_int select_ouc(const T* x_ptr, const T* y_ptr, const T* z_ptr) { arma_extra_debug_sigprint(); // cout << "select_ouc(): (*x_ptr) = " << (*x_ptr) << endl; // cout << "select_ouc(): (*y_ptr) = " << (*y_ptr) << endl; // cout << "select_ouc(): (*z_ptr) = " << (*z_ptr) << endl; const T x = (*x_ptr); const T y = (*y_ptr); const T z = (*z_ptr); if(z == T(0)) { return (x == T(0)) ? blas_int(0) : blas_int(1); // consider an infinite eig value to be outside of the unit circle } //return (std::abs(std::complex(x,y) / z) > T(1)) ? blas_int(1) : blas_int(0); return (std::sqrt(x*x + y*y) > std::abs(z)) ? blas_int(1) : blas_int(0); } // cgges() and zgges() require an external function with two arguments: // select(alpha, beta) // where the complex eigenvalue is defined as (alpha / beta) template inline blas_int cx_select_lhp(const std::complex* x_ptr, const std::complex* y_ptr) { arma_extra_debug_sigprint(); // cout << "cx_select_lhp(): (*x_ptr) = " << (*x_ptr) << endl; // cout << "cx_select_lhp(): (*y_ptr) = " << (*y_ptr) << endl; const std::complex& x = (*x_ptr); const std::complex& y = (*y_ptr); if( (y.real() == T(0)) && (y.imag() == T(0)) ) { return blas_int(0); } // consider an infinite eig value not to lie in either lhp or rhp return (std::real(x / y) < T(0)) ? blas_int(1) : blas_int(0); } template inline blas_int cx_select_rhp(const std::complex* x_ptr, const std::complex* y_ptr) { arma_extra_debug_sigprint(); // cout << "cx_select_rhp(): (*x_ptr) = " << (*x_ptr) << endl; // cout << "cx_select_rhp(): (*y_ptr) = " << (*y_ptr) << endl; const std::complex& x = (*x_ptr); const std::complex& y = (*y_ptr); if( (y.real() == T(0)) && (y.imag() == T(0)) ) { return blas_int(0); } // consider an infinite eig value not to lie in either lhp or rhp return (std::real(x / y) > T(0)) ? blas_int(1) : blas_int(0); } template inline blas_int cx_select_iuc(const std::complex* x_ptr, const std::complex* y_ptr) { arma_extra_debug_sigprint(); // cout << "cx_select_iuc(): (*x_ptr) = " << (*x_ptr) << endl; // cout << "cx_select_iuc(): (*y_ptr) = " << (*y_ptr) << endl; const std::complex& x = (*x_ptr); const std::complex& y = (*y_ptr); if( (y.real() == T(0)) && (y.imag() == T(0)) ) { return blas_int(0); } // consider an infinite eig value to be outside of the unit circle return (std::abs(x / y) < T(1)) ? blas_int(1) : blas_int(0); } template inline blas_int cx_select_ouc(const std::complex* x_ptr, const std::complex* y_ptr) { arma_extra_debug_sigprint(); // cout << "cx_select_ouc(): (*x_ptr) = " << (*x_ptr) << endl; // cout << "cx_select_ouc(): (*y_ptr) = " << (*y_ptr) << endl; const std::complex& x = (*x_ptr); const std::complex& y = (*y_ptr); if( (y.real() == T(0)) && (y.imag() == T(0)) ) { return ((x.real() == T(0)) && (x.imag() == T(0))) ? blas_int(0) : blas_int(1); // consider an infinite eig value to be outside of the unit circle } return (std::abs(x / y) > T(1)) ? blas_int(1) : blas_int(0); } // need to do shenanigans with pointers due to: // - we're using LAPACK ?gges() defined to expect pointer-to-function to be passed as pointer-to-object // - explicit casting between pointer-to-function and pointer-to-object is a non-standard extension in C // - the extension is essentially mandatory on POSIX systems // - some compilers will complain about the extension in pedantic mode template inline void_ptr ptr_cast(blas_int (*function)(const T*, const T*, const T*)) { union converter { blas_int (*fn)(const T*, const T*, const T*); void_ptr obj; }; converter tmp; tmp.obj = 0; tmp.fn = function; return tmp.obj; } template inline void_ptr ptr_cast(blas_int (*function)(const std::complex*, const std::complex*)) { union converter { blas_int (*fn)(const std::complex*, const std::complex*); void_ptr obj; }; converter tmp; tmp.obj = 0; tmp.fn = function; return tmp.obj; } } // end of namespace qz_helper //! @} RcppArmadillo/inst/include/armadillo_bits/GenCube_meat.hpp0000644000176200001440000001237214124060717023426 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup GenCube //! @{ template arma_inline GenCube::GenCube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices) : n_rows (in_n_rows ) , n_cols (in_n_cols ) , n_slices(in_n_slices) { arma_extra_debug_sigprint(); } template arma_inline GenCube::~GenCube() { arma_extra_debug_sigprint(); } template arma_inline eT GenCube::operator[](const uword) const { return (*this).generate(); } template arma_inline eT GenCube::at(const uword, const uword, const uword) const { return (*this).generate(); } template arma_inline eT GenCube::at_alt(const uword) const { return (*this).generate(); } template inline void GenCube::apply(Cube& out) const { arma_extra_debug_sigprint(); // NOTE: we're assuming that the cube has already been set to the correct size; // this is done by either the Cube contructor or operator=() if(is_same_type::yes) { out.ones(); } else if(is_same_type::yes) { out.zeros(); } else if(is_same_type::yes) { out.randu(); } else if(is_same_type::yes) { out.randn(); } } template inline void GenCube::apply_inplace_plus(Cube& out) const { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "addition"); eT* out_mem = out.memptr(); const uword n_elem = out.n_elem; uword i,j; for(i=0, j=1; j inline void GenCube::apply_inplace_minus(Cube& out) const { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "subtraction"); eT* out_mem = out.memptr(); const uword n_elem = out.n_elem; uword i,j; for(i=0, j=1; j inline void GenCube::apply_inplace_schur(Cube& out) const { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "element-wise multiplication"); eT* out_mem = out.memptr(); const uword n_elem = out.n_elem; uword i,j; for(i=0, j=1; j inline void GenCube::apply_inplace_div(Cube& out) const { arma_extra_debug_sigprint(); arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "element-wise division"); eT* out_mem = out.memptr(); const uword n_elem = out.n_elem; uword i,j; for(i=0, j=1; j inline void GenCube::apply(subview_cube& out) const { arma_extra_debug_sigprint(); // NOTE: we're assuming that the subcube has the same dimensions as the GenCube object // this is checked by subview_cube::operator=() if(is_same_type::yes) { out.ones(); } else if(is_same_type::yes) { out.zeros(); } else if(is_same_type::yes) { out.randu(); } else if(is_same_type::yes) { out.randn(); } } //! @} RcppArmadillo/inst/include/armadillo_bits/OpCube_meat.hpp0000644000176200001440000000550414124060717023272 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup OpCube //! @{ template OpCube::OpCube(const BaseCube& in_m) : m(in_m.get_ref()) { arma_extra_debug_sigprint(); } template OpCube::OpCube(const BaseCube& in_m, const typename T1::elem_type in_aux) : m(in_m.get_ref()) , aux(in_aux) { arma_extra_debug_sigprint(); } template OpCube::OpCube(const BaseCube& in_m, const typename T1::elem_type in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c) : m(in_m.get_ref()) , aux(in_aux) , aux_uword_a(in_aux_uword_a) , aux_uword_b(in_aux_uword_b) , aux_uword_c(in_aux_uword_c) { arma_extra_debug_sigprint(); } template OpCube::OpCube(const BaseCube& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b) : m(in_m.get_ref()) , aux_uword_a(in_aux_uword_a) , aux_uword_b(in_aux_uword_b) { arma_extra_debug_sigprint(); } template OpCube::OpCube(const BaseCube& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c) : m(in_m.get_ref()) , aux_uword_a(in_aux_uword_a) , aux_uword_b(in_aux_uword_b) , aux_uword_c(in_aux_uword_c) { arma_extra_debug_sigprint(); } template OpCube::OpCube(const BaseCube& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c, const uword in_aux_uword_d, const char) : m(in_m.get_ref()) , aux_uword_a(in_aux_uword_a) , aux_uword_b(in_aux_uword_b) , aux_uword_c(in_aux_uword_c) , aux_uword_d(in_aux_uword_d) { arma_extra_debug_sigprint(); } template OpCube::~OpCube() { arma_extra_debug_sigprint(); } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_hypot_bones.hpp0000644000176200001440000000300014124060717024441 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_hypot //! @{ class glue_hypot : public traits_glue_or { public: // matrices template inline static void apply(Mat& out, const Glue& expr); template inline static void apply_noalias(Mat& out, const Proxy& P1, const Proxy& P2); // cubes template inline static void apply(Cube& out, const GlueCube& expr); template inline static void apply_noalias(Cube& out, const ProxyCube& P1, const ProxyCube& P2); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_hist_bones.hpp0000644000176200001440000000217514124060717023743 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_hist //! @{ class op_hist : public traits_op_passthru { public: template inline static void apply_noalias(Mat& out, const Mat& A, const uword n_bins, const uword dim); template inline static void apply(Mat& out, const mtOp& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/mul_gemm_mixed.hpp0000644000176200001440000002502214124060717024074 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup gemm_mixed //! @{ //! \brief //! Matrix multplication where the matrices have differing element types. //! Uses caching for speedup. //! Matrix 'C' is assumed to have been set to the correct size (ie. taking into account transposes) template class gemm_mixed_large { public: template arma_hot inline static void apply ( Mat& C, const Mat& A, const Mat& B, const out_eT alpha = out_eT(1), const out_eT beta = out_eT(0) ) { arma_extra_debug_sigprint(); const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; if( (do_trans_A == false) && (do_trans_B == false) ) { podarray tmp(A_n_cols); in_eT1* A_rowdata = tmp.memptr(); #if defined(ARMA_USE_OPENMP) const bool use_mp = (B_n_cols >= 2) && (B.n_elem >= 8192) && (mp_thread_limit::in_parallel() == false); #else const bool use_mp = false; #endif if(use_mp) { #if defined(ARMA_USE_OPENMP) { const int n_threads = int( (std::min)( uword(mp_thread_limit::get()), uword(B_n_cols) ) ); for(uword row_A=0; row_A < A_n_rows; ++row_A) { tmp.copy_row(A, row_A); #pragma omp parallel for schedule(static) num_threads(n_threads) for(uword col_B=0; col_B < B_n_cols; ++col_B) { const in_eT2* B_coldata = B.colptr(col_B); out_eT acc = out_eT(0); for(uword i=0; i < B_n_rows; ++i) { acc += upgrade_val::apply(A_rowdata[i]) * upgrade_val::apply(B_coldata[i]); } if( (use_alpha == false) && (use_beta == false) ) { C.at(row_A,col_B) = acc; } else if( (use_alpha == true ) && (use_beta == false) ) { C.at(row_A,col_B) = alpha*acc; } else if( (use_alpha == false) && (use_beta == true ) ) { C.at(row_A,col_B) = acc + beta*C.at(row_A,col_B); } else if( (use_alpha == true ) && (use_beta == true ) ) { C.at(row_A,col_B) = alpha*acc + beta*C.at(row_A,col_B); } } } } #endif } else { for(uword row_A=0; row_A < A_n_rows; ++row_A) { tmp.copy_row(A, row_A); for(uword col_B=0; col_B < B_n_cols; ++col_B) { const in_eT2* B_coldata = B.colptr(col_B); out_eT acc = out_eT(0); for(uword i=0; i < B_n_rows; ++i) { acc += upgrade_val::apply(A_rowdata[i]) * upgrade_val::apply(B_coldata[i]); } if( (use_alpha == false) && (use_beta == false) ) { C.at(row_A,col_B) = acc; } else if( (use_alpha == true ) && (use_beta == false) ) { C.at(row_A,col_B) = alpha*acc; } else if( (use_alpha == false) && (use_beta == true ) ) { C.at(row_A,col_B) = acc + beta*C.at(row_A,col_B); } else if( (use_alpha == true ) && (use_beta == true ) ) { C.at(row_A,col_B) = alpha*acc + beta*C.at(row_A,col_B); } } } } } else if( (do_trans_A == true) && (do_trans_B == false) ) { #if defined(ARMA_USE_OPENMP) const bool use_mp = (B_n_cols >= 2) && (B.n_elem >= 8192) && (mp_thread_limit::in_parallel() == false); #else const bool use_mp = false; #endif if(use_mp) { #if defined(ARMA_USE_OPENMP) { const int n_threads = int( (std::min)( uword(mp_thread_limit::get()), uword(B_n_cols) ) ); for(uword col_A=0; col_A < A_n_cols; ++col_A) { // col_A is interpreted as row_A when storing the results in matrix C const in_eT1* A_coldata = A.colptr(col_A); #pragma omp parallel for schedule(static) num_threads(n_threads) for(uword col_B=0; col_B < B_n_cols; ++col_B) { const in_eT2* B_coldata = B.colptr(col_B); out_eT acc = out_eT(0); for(uword i=0; i < B_n_rows; ++i) { acc += upgrade_val::apply(A_coldata[i]) * upgrade_val::apply(B_coldata[i]); } if( (use_alpha == false) && (use_beta == false) ) { C.at(col_A,col_B) = acc; } else if( (use_alpha == true ) && (use_beta == false) ) { C.at(col_A,col_B) = alpha*acc; } else if( (use_alpha == false) && (use_beta == true ) ) { C.at(col_A,col_B) = acc + beta*C.at(col_A,col_B); } else if( (use_alpha == true ) && (use_beta == true ) ) { C.at(col_A,col_B) = alpha*acc + beta*C.at(col_A,col_B); } } } } #endif } else { for(uword col_A=0; col_A < A_n_cols; ++col_A) { // col_A is interpreted as row_A when storing the results in matrix C const in_eT1* A_coldata = A.colptr(col_A); for(uword col_B=0; col_B < B_n_cols; ++col_B) { const in_eT2* B_coldata = B.colptr(col_B); out_eT acc = out_eT(0); for(uword i=0; i < B_n_rows; ++i) { acc += upgrade_val::apply(A_coldata[i]) * upgrade_val::apply(B_coldata[i]); } if( (use_alpha == false) && (use_beta == false) ) { C.at(col_A,col_B) = acc; } else if( (use_alpha == true ) && (use_beta == false) ) { C.at(col_A,col_B) = alpha*acc; } else if( (use_alpha == false) && (use_beta == true ) ) { C.at(col_A,col_B) = acc + beta*C.at(col_A,col_B); } else if( (use_alpha == true ) && (use_beta == true ) ) { C.at(col_A,col_B) = alpha*acc + beta*C.at(col_A,col_B); } } } } } else if( (do_trans_A == false) && (do_trans_B == true) ) { Mat B_tmp; op_strans::apply_mat_noalias(B_tmp, B); gemm_mixed_large::apply(C, A, B_tmp, alpha, beta); } else if( (do_trans_A == true) && (do_trans_B == true) ) { // mat B_tmp = trans(B); // dgemm_arma::apply(C, A, B_tmp, alpha, beta); // By using the trans(A)*trans(B) = trans(B*A) equivalency, // transpose operations are not needed podarray tmp(B_n_cols); in_eT2* B_rowdata = tmp.memptr(); for(uword row_B=0; row_B < B_n_rows; ++row_B) { tmp.copy_row(B, row_B); for(uword col_A=0; col_A < A_n_cols; ++col_A) { const in_eT1* A_coldata = A.colptr(col_A); out_eT acc = out_eT(0); for(uword i=0; i < A_n_rows; ++i) { acc += upgrade_val::apply(B_rowdata[i]) * upgrade_val::apply(A_coldata[i]); } if( (use_alpha == false) && (use_beta == false) ) { C.at(col_A,row_B) = acc; } else if( (use_alpha == true ) && (use_beta == false) ) { C.at(col_A,row_B) = alpha*acc; } else if( (use_alpha == false) && (use_beta == true ) ) { C.at(col_A,row_B) = acc + beta*C.at(col_A,row_B); } else if( (use_alpha == true ) && (use_beta == true ) ) { C.at(col_A,row_B) = alpha*acc + beta*C.at(col_A,row_B); } } } } } }; //! \brief //! Matrix multplication where the matrices have differing element types. template class gemm_mixed { public: //! immediate multiplication of matrices A and B, storing the result in C template inline static void apply ( Mat& C, const Mat& A, const Mat& B, const out_eT alpha = out_eT(1), const out_eT beta = out_eT(0) ) { arma_extra_debug_sigprint(); if((is_cx::yes && do_trans_A) || (is_cx::yes && do_trans_B)) { // better-than-nothing handling of hermitian transpose Mat tmp_A; Mat tmp_B; const bool predo_trans_A = ( (do_trans_A == true) && (is_cx::yes) ); const bool predo_trans_B = ( (do_trans_B == true) && (is_cx::yes) ); if(predo_trans_A) { op_htrans::apply_mat_noalias(tmp_A, A); } if(predo_trans_B) { op_htrans::apply_mat_noalias(tmp_B, B); } const Mat& AA = (predo_trans_A == false) ? A : tmp_A; const Mat& BB = (predo_trans_B == false) ? B : tmp_B; gemm_mixed_large<((predo_trans_A) ? false : do_trans_A), ((predo_trans_B) ? false : do_trans_B), use_alpha, use_beta>::apply(C, AA, BB, alpha, beta); } else { gemm_mixed_large::apply(C, A, B, alpha, beta); } } }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_repelem_bones.hpp0000644000176200001440000000225314124060717024422 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_repelem //! @{ class op_repelem : public traits_op_default { public: template inline static void apply_noalias(Mat& out, const obj& X, const uword copies_per_row, const uword copies_per_col); template inline static void apply(Mat& out, const Op& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_repmat_meat.hpp0000644000176200001440000000646114124060717024106 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_repmat //! @{ template inline void op_repmat::apply_noalias(Mat& out, const obj& X, const uword copies_per_row, const uword copies_per_col) { arma_extra_debug_sigprint(); typedef typename obj::elem_type eT; const uword X_n_rows = obj::is_row ? uword(1) : X.n_rows; const uword X_n_cols = obj::is_col ? uword(1) : X.n_cols; out.set_size(X_n_rows * copies_per_row, X_n_cols * copies_per_col); const uword out_n_rows = out.n_rows; const uword out_n_cols = out.n_cols; // if( (out_n_rows > 0) && (out_n_cols > 0) ) // { // for(uword col = 0; col < out_n_cols; col += X_n_cols) // for(uword row = 0; row < out_n_rows; row += X_n_rows) // { // out.submat(row, col, row+X_n_rows-1, col+X_n_cols-1) = X; // } // } if( (out_n_rows > 0) && (out_n_cols > 0) ) { if(copies_per_row != 1) { for(uword col_copy=0; col_copy < copies_per_col; ++col_copy) { const uword out_col_offset = X_n_cols * col_copy; for(uword col=0; col < X_n_cols; ++col) { eT* out_colptr = out.colptr(col + out_col_offset); const eT* X_colptr = X.colptr(col); for(uword row_copy=0; row_copy < copies_per_row; ++row_copy) { const uword out_row_offset = X_n_rows * row_copy; arrayops::copy( &out_colptr[out_row_offset], X_colptr, X_n_rows ); } } } } else { for(uword col_copy=0; col_copy < copies_per_col; ++col_copy) { const uword out_col_offset = X_n_cols * col_copy; for(uword col=0; col < X_n_cols; ++col) { eT* out_colptr = out.colptr(col + out_col_offset); const eT* X_colptr = X.colptr(col); arrayops::copy( out_colptr, X_colptr, X_n_rows ); } } } } } template inline void op_repmat::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword copies_per_row = in.aux_uword_a; const uword copies_per_col = in.aux_uword_b; const quasi_unwrap U(in.m); if(U.is_alias(out)) { Mat tmp; op_repmat::apply_noalias(tmp, U.M, copies_per_row, copies_per_col); out.steal_mem(tmp); } else { op_repmat::apply_noalias(out, U.M, copies_per_row, copies_per_col); } } //! @} RcppArmadillo/inst/include/armadillo_bits/op_fft_bones.hpp0000644000176200001440000000377514124060717023562 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_fft //! @{ class op_fft_real : public traits_op_passthru { public: template inline static void apply( Mat< std::complex >& out, const mtOp,T1,op_fft_real>& in ); }; class op_fft_cx : public traits_op_passthru { public: template inline static void apply( Mat& out, const Op& in ); template inline static void apply_noalias(Mat& out, const Proxy& P, const uword a, const uword b); template arma_hot inline static void copy_vec (typename Proxy::elem_type* dest, const Proxy& P, const uword N); template arma_hot inline static void copy_vec_proxy (typename Proxy::elem_type* dest, const Proxy& P, const uword N); template arma_hot inline static void copy_vec_unwrap(typename Proxy::elem_type* dest, const Proxy& P, const uword N); }; class op_ifft_cx : public traits_op_passthru { public: template inline static void apply( Mat& out, const Op& in ); }; //! @} RcppArmadillo/inst/include/armadillo_bits/subview_field_bones.hpp0000644000176200001440000000630614124060717025125 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup subview_field //! @{ //! Class for storing data required to construct or apply operations to a subfield //! (ie. where the subfield starts and ends as well as a reference/pointer to the original field), template class subview_field { public: typedef oT object_type; const field& f; const uword aux_row1; const uword aux_col1; const uword aux_slice1; const uword n_rows; const uword n_cols; const uword n_slices; const uword n_elem; protected: arma_inline subview_field(const field& in_f, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols); arma_inline subview_field(const field& in_f, const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_n_rows, const uword in_n_cols, const uword in_n_slices); public: inline ~subview_field(); inline subview_field() = delete; inline void operator= (const field& x); inline void operator= (const subview_field& x); arma_inline oT& operator[](const uword i); arma_inline const oT& operator[](const uword i) const; arma_inline oT& operator()(const uword i); arma_inline const oT& operator()(const uword i) const; arma_inline oT& at(const uword row, const uword col); arma_inline const oT& at(const uword row, const uword col) const; arma_inline oT& at(const uword row, const uword col, const uword slice); arma_inline const oT& at(const uword row, const uword col, const uword slice) const; arma_inline oT& operator()(const uword row, const uword col); arma_inline const oT& operator()(const uword row, const uword col) const; arma_inline oT& operator()(const uword row, const uword col, const uword slice); arma_inline const oT& operator()(const uword row, const uword col, const uword slice) const; arma_inline bool is_empty() const; inline bool check_overlap(const subview_field& x) const; inline void print(const std::string extra_text = "") const; inline void print(std::ostream& user_stream, const std::string extra_text = "") const; template inline void for_each(functor F); template inline void for_each(functor F) const; inline void fill(const oT& x); inline static void extract(field& out, const subview_field& in); friend class field; }; //! @} RcppArmadillo/inst/include/armadillo_bits/arma_cmath.hpp0000644000176200001440000001126714124060717023206 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup arma_cmath //! @{ // // wrappers for isfinite template inline bool arma_isfinite(eT) { return true; } template<> inline bool arma_isfinite(float x) { return std::isfinite(x); } template<> inline bool arma_isfinite(double x) { return std::isfinite(x); } template inline bool arma_isfinite(const std::complex& x) { return ( arma_isfinite(x.real()) && arma_isfinite(x.imag()) ); } // // wrappers for isinf template inline bool arma_isinf(eT) { return false; } template<> inline bool arma_isinf(float x) { return std::isinf(x); } template<> inline bool arma_isinf(double x) { return std::isinf(x); } template inline bool arma_isinf(const std::complex& x) { return ( arma_isinf(x.real()) || arma_isinf(x.imag()) ); } // // wrappers for isnan template inline bool arma_isnan(eT val) { arma_ignore(val); return false; } template<> inline bool arma_isnan(float x) { return std::isnan(x); } template<> inline bool arma_isnan(double x) { return std::isnan(x); } template inline bool arma_isnan(const std::complex& x) { return ( arma_isnan(x.real()) || arma_isnan(x.imag()) ); } // // implementation of arma_sign() template constexpr typename arma_unsigned_integral_only::result arma_sign(const eT x) { return (x > eT(0)) ? eT(+1) : eT(0); } template constexpr typename arma_signed_integral_only::result arma_sign(const eT x) { return (x > eT(0)) ? eT(+1) : ( (x < eT(0)) ? eT(-1) : eT(0) ); } template constexpr typename arma_real_only::result arma_sign(const eT x) { return (x > eT(0)) ? eT(+1) : ( (x < eT(0)) ? eT(-1) : ((x == eT(0)) ? eT(0) : x) ); } template inline typename arma_cx_only::result arma_sign(const eT& x) { typedef typename eT::value_type T; const T abs_x = std::abs(x); return (abs_x != T(0)) ? (x / abs_x) : x; } // // wrappers for hypot(x, y) = sqrt(x^2 + y^2) template inline eT arma_hypot(const eT x, const eT y) { arma_ignore(x); arma_ignore(y); arma_stop_runtime_error("arma_hypot(): not implemented for integer or complex element types"); return eT(0); } template<> inline float arma_hypot(const float x, const float y) { return std::hypot(x, y); } template<> inline double arma_hypot(const double x, const double y) { return std::hypot(x, y); } // // implementation of arma_sinc() template inline eT arma_sinc_generic(const eT x) { typedef typename get_pod_type::result T; const eT tmp = Datum::pi * x; return (tmp == eT(0)) ? eT(1) : eT( std::sin(tmp) / tmp ); } template inline eT arma_sinc(const eT x) { return eT( arma_sinc_generic( double(x) ) ); } template<> inline float arma_sinc(const float x) { return arma_sinc_generic(x); } template<> inline double arma_sinc(const double x) { return arma_sinc_generic(x); } template inline std::complex arma_sinc(const std::complex& x) { return arma_sinc_generic(x); } // // wrappers for arg() template struct arma_arg { static inline eT eval(const eT x) { return eT( std::arg(x) ); } }; template<> struct arma_arg { static inline float eval(const float x) { return std::arg(x); } }; template<> struct arma_arg { static inline double eval(const double x) { return std::arg(x); } }; template<> struct arma_arg< std::complex > { static inline float eval(const std::complex& x) { return std::arg(x); } }; template<> struct arma_arg< std::complex > { static inline double eval(const std::complex& x) { return std::arg(x); } }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_cumsum.hpp0000644000176200001440000000336314124060717023104 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_cumsum //! @{ template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && resolves_to_vector::yes, const Op >::result cumsum(const T1& X) { arma_extra_debug_sigprint(); return Op(X); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value && resolves_to_vector::no, const Op >::result cumsum(const T1& X) { arma_extra_debug_sigprint(); return Op(X, 0, 0); } template arma_warn_unused arma_inline typename enable_if2 < is_arma_type::value, const Op >::result cumsum(const T1& X, const uword dim) { arma_extra_debug_sigprint(); return Op(X, dim, 0); } template arma_warn_unused arma_inline typename arma_scalar_only::result cumsum(const T& x) { return x; } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_trig.hpp0000644000176200001440000002113314124060717022533 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_trig //! @{ // single argument trigonometric functions: // cos family: cos, acos, cosh, acosh // sin family: sin, asin, sinh, asinh // tan family: tan, atan, tanh, atanh // // misc functions: // sinc // // dual argument trigonometric functions: // atan2 // hypot // // cos template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result cos(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube cos(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // acos template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result acos(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube acos(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // cosh template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result cosh(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube cosh(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // acosh template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result acosh(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube acosh(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // sin template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result sin(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube sin(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // asin template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result asin(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube asin(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // sinh template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result sinh(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube sinh(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // asinh template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result asinh(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube asinh(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // tan template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result tan(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube tan(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // atan template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result atan(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube atan(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // tanh template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result tanh(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube tanh(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // atanh template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result atanh(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube atanh(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // sinc template arma_warn_unused arma_inline typename arma_scalar_only::result sinc(const T x) { return arma_sinc(x); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result sinc(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube sinc(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } // // atan2 template arma_warn_unused arma_inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && is_real::value && is_same_type::value), const Glue >::result atan2(const T1& Y, const T2& X) { arma_extra_debug_sigprint(); return Glue(Y, X); } template arma_warn_unused arma_inline typename enable_if2< is_real::value, const GlueCube >::result atan2(const BaseCube& Y, const BaseCube& X) { arma_extra_debug_sigprint(); return GlueCube(Y.get_ref(), X.get_ref()); } // // hypot template arma_warn_unused arma_inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && is_real::value && is_same_type::value), const Glue >::result hypot(const T1& X, const T2& Y) { arma_extra_debug_sigprint(); return Glue(X, Y); } template arma_warn_unused arma_inline typename enable_if2< is_real::value, const GlueCube >::result hypot(const BaseCube& X, const BaseCube& Y) { arma_extra_debug_sigprint(); return GlueCube(X.get_ref(), Y.get_ref()); } //! @} RcppArmadillo/inst/include/armadillo_bits/GlueCube_bones.hpp0000644000176200001440000000267614147163451024003 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup GlueCube //! @{ //! analog of the Glue class, intended for Cube objects template class GlueCube : public BaseCube< typename T1::elem_type, GlueCube > { public: typedef typename T1::elem_type elem_type; typedef typename get_pod_type::result pod_type; inline GlueCube(const BaseCube& in_A, const BaseCube& in_B); inline ~GlueCube(); const T1& A; //!< first operand; must be derived from BaseCube const T2& B; //!< second operand; must be derived from BaseCube }; //! @} RcppArmadillo/inst/include/armadillo_bits/spop_var_bones.hpp0000644000176200001440000000504214124060717024123 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_var //! @{ //! Class for finding variance values of a sparse matrix class spop_var : public traits_op_xvec { public: template inline static void apply(SpMat& out, const mtSpOp& in); template inline static void apply_noalias(SpMat& out, const SpProxy& p, const uword norm_type, const uword dim); // Calculate variance of a sparse vector, where we can directly use the memory. template inline static typename T1::pod_type var_vec(const T1& X, const uword norm_type = 0); // Calculate the variance directly. Because this is for sparse matrices, we // specify both the number of elements in the array (the length of the array) // as well as the actual number of elements when zeros are included. template inline static eT direct_var(const eT* const X, const uword length, const uword N, const uword norm_type = 0); // For complex numbers. template inline static T direct_var(const std::complex* const X, const uword length, const uword N, const uword norm_type = 0); // Calculate the variance using iterators, for non-complex numbers. template inline static eT iterator_var(T1& it, const T1& end, const uword n_zero, const uword norm_type, const eT junk1, const typename arma_not_cx::result* junk2 = nullptr); // Calculate the variance using iterators, for complex numbers. template inline static typename get_pod_type::result iterator_var(T1& it, const T1& end, const uword n_zero, const uword norm_type, const eT junk1, const typename arma_cx_only::result* junk2 = nullptr); }; //! @} RcppArmadillo/inst/include/armadillo_bits/mul_gemv.hpp0000644000176200001440000003141314124060717022720 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup gemv //! @{ //! for tiny square matrices, size <= 4x4 template class gemv_emul_tinysq { public: template struct pos { static constexpr uword n2 = (do_trans_A == false) ? (row + col*2) : (col + row*2); static constexpr uword n3 = (do_trans_A == false) ? (row + col*3) : (col + row*3); static constexpr uword n4 = (do_trans_A == false) ? (row + col*4) : (col + row*4); }; template arma_inline static void assign(eT* y, const eT acc, const eT alpha, const eT beta) { if(use_beta == false) { y[i] = (use_alpha == false) ? acc : alpha*acc; } else { const eT tmp = y[i]; y[i] = beta*tmp + ( (use_alpha == false) ? acc : alpha*acc ); } } template arma_cold inline static void apply( eT* y, const TA& A, const eT* x, const eT alpha = eT(1), const eT beta = eT(0) ) { arma_extra_debug_sigprint(); const eT* Am = A.memptr(); switch(A.n_rows) { case 1: { const eT acc = Am[0] * x[0]; assign(y, acc, alpha, beta); } break; case 2: { const eT x0 = x[0]; const eT x1 = x[1]; const eT acc0 = Am[pos<0,0>::n2]*x0 + Am[pos<0,1>::n2]*x1; const eT acc1 = Am[pos<1,0>::n2]*x0 + Am[pos<1,1>::n2]*x1; assign(y, acc0, alpha, beta); assign(y, acc1, alpha, beta); } break; case 3: { const eT x0 = x[0]; const eT x1 = x[1]; const eT x2 = x[2]; const eT acc0 = Am[pos<0,0>::n3]*x0 + Am[pos<0,1>::n3]*x1 + Am[pos<0,2>::n3]*x2; const eT acc1 = Am[pos<1,0>::n3]*x0 + Am[pos<1,1>::n3]*x1 + Am[pos<1,2>::n3]*x2; const eT acc2 = Am[pos<2,0>::n3]*x0 + Am[pos<2,1>::n3]*x1 + Am[pos<2,2>::n3]*x2; assign(y, acc0, alpha, beta); assign(y, acc1, alpha, beta); assign(y, acc2, alpha, beta); } break; case 4: { const eT x0 = x[0]; const eT x1 = x[1]; const eT x2 = x[2]; const eT x3 = x[3]; const eT acc0 = Am[pos<0,0>::n4]*x0 + Am[pos<0,1>::n4]*x1 + Am[pos<0,2>::n4]*x2 + Am[pos<0,3>::n4]*x3; const eT acc1 = Am[pos<1,0>::n4]*x0 + Am[pos<1,1>::n4]*x1 + Am[pos<1,2>::n4]*x2 + Am[pos<1,3>::n4]*x3; const eT acc2 = Am[pos<2,0>::n4]*x0 + Am[pos<2,1>::n4]*x1 + Am[pos<2,2>::n4]*x2 + Am[pos<2,3>::n4]*x3; const eT acc3 = Am[pos<3,0>::n4]*x0 + Am[pos<3,1>::n4]*x1 + Am[pos<3,2>::n4]*x2 + Am[pos<3,3>::n4]*x3; assign(y, acc0, alpha, beta); assign(y, acc1, alpha, beta); assign(y, acc2, alpha, beta); assign(y, acc3, alpha, beta); } break; default: ; } } }; class gemv_emul_helper { public: template arma_hot inline static typename arma_not_cx::result dot_row_col( const TA& A, const eT* x, const uword row, const uword N ) { eT acc1 = eT(0); eT acc2 = eT(0); uword i,j; for(i=0, j=1; j < N; i+=2, j+=2) { const eT xi = x[i]; const eT xj = x[j]; acc1 += A.at(row,i) * xi; acc2 += A.at(row,j) * xj; } if(i < N) { acc1 += A.at(row,i) * x[i]; } return (acc1 + acc2); } template arma_hot inline static typename arma_cx_only::result dot_row_col( const TA& A, const eT* x, const uword row, const uword N ) { typedef typename get_pod_type::result T; T val_real = T(0); T val_imag = T(0); for(uword i=0; i& Ai = A.at(row,i); const std::complex& xi = x[i]; const T a = Ai.real(); const T b = Ai.imag(); const T c = xi.real(); const T d = xi.imag(); val_real += (a*c) - (b*d); val_imag += (a*d) + (b*c); } return std::complex(val_real, val_imag); } }; //! \brief //! Partial emulation of ATLAS/BLAS gemv(). //! 'y' is assumed to have been set to the correct size (ie. taking into account the transpose) template class gemv_emul { public: template arma_hot inline static void apply( eT* y, const TA& A, const eT* x, const eT alpha = eT(1), const eT beta = eT(0) ) { arma_extra_debug_sigprint(); const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; if(do_trans_A == false) { if(A_n_rows == 1) { const eT acc = op_dot::direct_dot_arma(A_n_cols, A.memptr(), x); if( (use_alpha == false) && (use_beta == false) ) { y[0] = acc; } else if( (use_alpha == true ) && (use_beta == false) ) { y[0] = alpha*acc; } else if( (use_alpha == false) && (use_beta == true ) ) { y[0] = acc + beta*y[0]; } else if( (use_alpha == true ) && (use_beta == true ) ) { y[0] = alpha*acc + beta*y[0]; } } else for(uword row=0; row < A_n_rows; ++row) { const eT acc = gemv_emul_helper::dot_row_col(A, x, row, A_n_cols); if( (use_alpha == false) && (use_beta == false) ) { y[row] = acc; } else if( (use_alpha == true ) && (use_beta == false) ) { y[row] = alpha*acc; } else if( (use_alpha == false) && (use_beta == true ) ) { y[row] = acc + beta*y[row]; } else if( (use_alpha == true ) && (use_beta == true ) ) { y[row] = alpha*acc + beta*y[row]; } } } else if(do_trans_A == true) { if(is_cx::no) { for(uword col=0; col < A_n_cols; ++col) { // col is interpreted as row when storing the results in 'y' // const eT* A_coldata = A.colptr(col); // // eT acc = eT(0); // for(uword row=0; row < A_n_rows; ++row) // { // acc += A_coldata[row] * x[row]; // } const eT acc = op_dot::direct_dot_arma(A_n_rows, A.colptr(col), x); if( (use_alpha == false) && (use_beta == false) ) { y[col] = acc; } else if( (use_alpha == true ) && (use_beta == false) ) { y[col] = alpha*acc; } else if( (use_alpha == false) && (use_beta == true ) ) { y[col] = acc + beta*y[col]; } else if( (use_alpha == true ) && (use_beta == true ) ) { y[col] = alpha*acc + beta*y[col]; } } } else { Mat AA; op_htrans::apply_mat_noalias(AA, A); gemv_emul::apply(y, AA, x, alpha, beta); } } } }; //! \brief //! Wrapper for ATLAS/BLAS gemv function, using template arguments to control the arguments passed to gemv. //! 'y' is assumed to have been set to the correct size (ie. taking into account the transpose) template class gemv { public: template inline static void apply_blas_type( eT* y, const TA& A, const eT* x, const eT alpha = eT(1), const eT beta = eT(0) ) { arma_extra_debug_sigprint(); if( (A.n_rows <= 4) && (A.n_rows == A.n_cols) && (is_cx::no) ) { gemv_emul_tinysq::apply(y, A, x, alpha, beta); } else { #if defined(ARMA_USE_ATLAS) { arma_debug_assert_atlas_size(A); if(is_cx::no) { // use gemm() instead of gemv() to work around a speed issue in Atlas 3.8.4 arma_extra_debug_print("atlas::cblas_gemm()"); atlas::cblas_gemm ( atlas::CblasColMajor, (do_trans_A) ? ( is_cx::yes ? CblasConjTrans : atlas::CblasTrans ) : atlas::CblasNoTrans, atlas::CblasNoTrans, (do_trans_A) ? A.n_cols : A.n_rows, 1, (do_trans_A) ? A.n_rows : A.n_cols, (use_alpha) ? alpha : eT(1), A.mem, A.n_rows, x, (do_trans_A) ? A.n_rows : A.n_cols, (use_beta) ? beta : eT(0), y, (do_trans_A) ? A.n_cols : A.n_rows ); } else { arma_extra_debug_print("atlas::cblas_gemv()"); atlas::cblas_gemv ( atlas::CblasColMajor, (do_trans_A) ? ( is_cx::yes ? CblasConjTrans : atlas::CblasTrans ) : atlas::CblasNoTrans, A.n_rows, A.n_cols, (use_alpha) ? alpha : eT(1), A.mem, A.n_rows, x, 1, (use_beta) ? beta : eT(0), y, 1 ); } } #elif defined(ARMA_USE_BLAS) { arma_extra_debug_print("blas::gemv()"); arma_debug_assert_blas_size(A); const char trans_A = (do_trans_A) ? ( is_cx::yes ? 'C' : 'T' ) : 'N'; const blas_int m = blas_int(A.n_rows); const blas_int n = blas_int(A.n_cols); const eT local_alpha = (use_alpha) ? alpha : eT(1); //const blas_int lda = A.n_rows; const blas_int inc = blas_int(1); const eT local_beta = (use_beta) ? beta : eT(0); arma_extra_debug_print( arma_str::format("blas::gemv(): trans_A = %c") % trans_A ); blas::gemv ( &trans_A, &m, &n, &local_alpha, A.mem, &m, // lda x, &inc, &local_beta, y, &inc ); } #else { gemv_emul::apply(y,A,x,alpha,beta); } #endif } } template arma_inline static void apply( eT* y, const TA& A, const eT* x, const eT alpha = eT(1), const eT beta = eT(0) ) { gemv_emul::apply(y,A,x,alpha,beta); } template arma_inline static void apply ( float* y, const TA& A, const float* x, const float alpha = float(1), const float beta = float(0) ) { gemv::apply_blas_type(y,A,x,alpha,beta); } template arma_inline static void apply ( double* y, const TA& A, const double* x, const double alpha = double(1), const double beta = double(0) ) { gemv::apply_blas_type(y,A,x,alpha,beta); } template arma_inline static void apply ( std::complex* y, const TA& A, const std::complex* x, const std::complex alpha = std::complex(1), const std::complex beta = std::complex(0) ) { gemv::apply_blas_type(y,A,x,alpha,beta); } template arma_inline static void apply ( std::complex* y, const TA& A, const std::complex* x, const std::complex alpha = std::complex(1), const std::complex beta = std::complex(0) ) { gemv::apply_blas_type(y,A,x,alpha,beta); } }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_flip_meat.hpp0000644000176200001440000001537314140733015023546 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_flip //! @{ template inline void op_flipud::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(is_Mat::value) { // allow detection of in-place operation const unwrap U(in.m); op_flipud::apply_direct(out, U.M); } else { const Proxy P(in.m); if(P.is_alias(out)) { Mat tmp; op_flipud::apply_proxy_noalias(tmp, P); out.steal_mem(tmp); } else { op_flipud::apply_proxy_noalias(out, P); } } } template inline void op_flipud::apply_direct(Mat& out, const Mat& X) { arma_extra_debug_sigprint(); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword X_n_rows_m1 = X_n_rows - 1; if(&out != &X) { out.set_size(X_n_rows, X_n_cols); if(X_n_cols == 1) { const eT* X_mem = X.memptr(); eT* out_mem = out.memptr(); for(uword row=0; row < X_n_rows; ++row) { out_mem[X_n_rows_m1 - row] = X_mem[row]; } } else { for(uword col=0; col < X_n_cols; ++col) { const eT* X_colmem = X.colptr(col); eT* out_colmem = out.colptr(col); for(uword row=0; row < X_n_rows; ++row) { out_colmem[X_n_rows_m1 - row] = X_colmem[row]; } } } } else // in-place operation { const uword N = X_n_rows / 2; if(X_n_cols == 1) { eT* out_mem = out.memptr(); for(uword row=0; row < N; ++row) { std::swap(out_mem[X_n_rows_m1 - row], out_mem[row]); } } else { for(uword col=0; col < X_n_cols; ++col) { eT* out_colmem = out.colptr(col); for(uword row=0; row < N; ++row) { std::swap(out_colmem[X_n_rows_m1 - row], out_colmem[row]); } } } } } template inline void op_flipud::apply_proxy_noalias(Mat& out, const Proxy& P) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename Proxy::stored_type P_stored_type; if(is_Mat::value) { const unwrap U(P.Q); op_flipud::apply_direct(out, U.M); return; } const uword P_n_rows = P.get_n_rows(); const uword P_n_cols = P.get_n_cols(); const uword P_n_rows_m1 = P_n_rows - 1; out.set_size(P_n_rows, P_n_cols); if( ((T1::is_col) || (P_n_cols == 1)) && (Proxy::use_at == false) ) { eT* out_mem = out.memptr(); const typename Proxy::ea_type P_ea = P.get_ea(); for(uword row=0; row < P_n_rows; ++row) { out_mem[P_n_rows_m1 - row] = P_ea[row]; } } else { for(uword col=0; col < P_n_cols; ++col) { eT* out_colmem = out.colptr(col); for(uword row=0; row < P_n_rows; ++row) { out_colmem[P_n_rows_m1 - row] = P.at(row, col); } } } } // template inline void op_fliplr::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(is_Mat::value) { // allow detection of in-place operation const unwrap U(in.m); op_fliplr::apply_direct(out, U.M); } else { const Proxy P(in.m); if(P.is_alias(out)) { Mat tmp; op_fliplr::apply_proxy_noalias(tmp, P); out.steal_mem(tmp); } else { op_fliplr::apply_proxy_noalias(out, P); } } } template inline void op_fliplr::apply_direct(Mat& out, const Mat& X) { arma_extra_debug_sigprint(); const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword X_n_cols_m1 = X_n_cols - 1; if(&out != &X) { out.set_size(X_n_rows, X_n_cols); if(X_n_rows == 1) { const eT* X_mem = X.memptr(); eT* out_mem = out.memptr(); for(uword col=0; col < X_n_cols; ++col) { out_mem[X_n_cols_m1 - col] = X_mem[col]; } } else { for(uword col=0; col < X_n_cols; ++col) { out.col(X_n_cols_m1 - col) = X.col(col); } } } else // in-place operation { const uword N = X_n_cols / 2; if(X_n_rows == 1) { eT* out_mem = out.memptr(); for(uword col=0; col < N; ++col) { std::swap(out_mem[X_n_cols_m1 - col], out_mem[col]); } } else { for(uword col=0; col < N; ++col) { out.swap_cols(X_n_cols_m1 - col, col); } } } } template inline void op_fliplr::apply_proxy_noalias(Mat& out, const Proxy& P) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename Proxy::stored_type P_stored_type; if(is_Mat::value) { const unwrap U(P.Q); op_fliplr::apply_direct(out, U.M); return; } const uword P_n_rows = P.get_n_rows(); const uword P_n_cols = P.get_n_cols(); const uword P_n_cols_m1 = P_n_cols - 1; out.set_size(P_n_rows, P_n_cols); if( ((T1::is_row) || (P_n_rows == 1)) && (Proxy::use_at == false) ) { eT* out_mem = out.memptr(); const typename Proxy::ea_type P_ea = P.get_ea(); for(uword col=0; col < P_n_cols; ++col) { out_mem[P_n_cols_m1 - col] = P_ea[col]; } } else { for(uword col=0; col < P_n_cols; ++col) { eT* out_colmem = out.colptr(P_n_cols_m1 - col); for(uword row=0; row < P_n_rows; ++row) { out_colmem[row] = P.at(row,col); } } } } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_vectorise_meat.hpp0000644000176200001440000000504514124060717025161 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_vectorise //! @{ template inline void spop_vectorise_col::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); spop_vectorise_col::apply_direct(out, in.m); } template inline void spop_vectorise_col::apply_direct(SpMat& out, const T1& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(out.vec_state == 0) { out = expr; out.reshape(out.n_elem, 1); } else { SpMat tmp = expr; tmp.reshape(tmp.n_elem, 1); out.steal_mem(tmp); } } template inline void spop_vectorise_row::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); spop_vectorise_row::apply_direct(out, in.m); } template inline void spop_vectorise_row::apply_direct(SpMat& out, const T1& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // NOTE: row-wise vectorisation of sparse matrices is not recommended due to the CSC storage format if(out.vec_state == 0) { out = strans(expr); out.reshape(1, out.n_elem); } else { SpMat tmp = strans(expr); tmp.reshape(1, tmp.n_elem); out.steal_mem(tmp); } } template inline void spop_vectorise_all::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); const uword dim = in.aux_uword_a; if(dim == 0) { spop_vectorise_col::apply_direct(out, in.m); } else { spop_vectorise_row::apply_direct(out, in.m); } } //! @} RcppArmadillo/inst/include/armadillo_bits/cond_rel_meat.hpp0000644000176200001440000000377514124060717023712 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup cond_rel //! @{ template<> template arma_inline bool cond_rel::lt(const eT A, const eT B) { return (A < B); } template<> template arma_inline bool cond_rel::lt(const eT, const eT) { return false; } template<> template arma_inline bool cond_rel::gt(const eT A, const eT B) { return (A > B); } template<> template arma_inline bool cond_rel::gt(const eT, const eT) { return false; } template<> template arma_inline bool cond_rel::leq(const eT A, const eT B) { return (A <= B); } template<> template arma_inline bool cond_rel::leq(const eT, const eT) { return false; } template<> template arma_inline bool cond_rel::geq(const eT A, const eT B) { return (A >= B); } template<> template arma_inline bool cond_rel::geq(const eT, const eT) { return false; } template<> template arma_inline eT cond_rel::make_neg(const eT val) { return -val; } template<> template arma_inline eT cond_rel::make_neg(const eT) { return eT(0); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_cumsum_bones.hpp0000644000176200001440000000246314124060717024305 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_cumsum //! @{ class op_cumsum : public traits_op_default { public: template inline static void apply_noalias(Mat& out, const Mat& X, const uword dim); template inline static void apply(Mat& out, const Op& in); }; class op_cumsum_vec : public traits_op_passthru { public: template inline static void apply(Mat& out, const Op& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_sprandn.hpp0000644000176200001440000000553114124060717023237 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_sprandn //! @{ //! Generate a sparse matrix with a randomly selected subset of the elements //! set to random values from a Gaussian distribution with zero mean and unit variance template arma_warn_unused inline obj_type sprandn ( const uword n_rows, const uword n_cols, const double density, const typename arma_SpMat_SpCol_SpRow_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); if(is_SpCol::value) { arma_debug_check( (n_cols != 1), "sprandn(): incompatible size" ); } else if(is_SpRow::value) { arma_debug_check( (n_rows != 1), "sprandn(): incompatible size" ); } obj_type out; out.sprandn(n_rows, n_cols, density); return out; } template arma_warn_unused inline obj_type sprandn(const SizeMat& s, const double density, const typename arma_SpMat_SpCol_SpRow_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return sprandn(s.n_rows, s.n_cols, density); } arma_warn_unused inline sp_mat sprandn(const uword n_rows, const uword n_cols, const double density) { arma_extra_debug_sigprint(); sp_mat out; out.sprandn(n_rows, n_cols, density); return out; } arma_warn_unused inline sp_mat sprandn(const SizeMat& s, const double density) { arma_extra_debug_sigprint(); sp_mat out; out.sprandn(s.n_rows, s.n_cols, density); return out; } //! Generate a sparse matrix with the non-zero values in the same locations as in the given sparse matrix X, //! with the non-zero values set to random values from a Gaussian distribution with zero mean and unit variance template arma_warn_unused inline SpMat sprandn(const SpBase& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; SpMat out( X.get_ref() ); arma_rng::randn::fill( access::rwp(out.values), out.n_nonzero ); return out; } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_atan2_meat.hpp0000644000176200001440000001306014124060717024132 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_atan2 //! @{ template inline void glue_atan2::apply(Mat& out, const Glue& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy P1(expr.A); const Proxy P2(expr.B); arma_assert_same_size(P1, P2, "atan2()"); const bool bad_alias = ( (Proxy::has_subview && P1.is_alias(out)) || (Proxy::has_subview && P2.is_alias(out)) ); if(bad_alias == false) { glue_atan2::apply_noalias(out, P1, P2); } else { Mat tmp; glue_atan2::apply_noalias(tmp, P1, P2); out.steal_mem(tmp); } } template inline void glue_atan2::apply_noalias(Mat& out, const Proxy& P1, const Proxy& P2) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = P1.get_n_rows(); const uword n_cols = P1.get_n_cols(); const uword n_elem = P1.get_n_elem(); out.set_size(n_rows, n_cols); eT* out_mem = out.memptr(); const bool use_mp = arma_config::openmp && mp_gate::use_mp || Proxy::use_mp)>::eval(n_elem); const bool use_at = Proxy::use_at || Proxy::use_at; if(use_at == false) { typename Proxy::ea_type eaP1 = P1.get_ea(); typename Proxy::ea_type eaP2 = P2.get_ea(); if(use_mp) { #if defined(ARMA_USE_OPENMP) { const int n_threads = mp_thread_limit::get(); #pragma omp parallel for schedule(static) num_threads(n_threads) for(uword i=0; i::stored_type> U1(P1.Q); const unwrap::stored_type> U2(P2.Q); out = arma::atan2(U1.M, U2.M); } else { for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { *out_mem = std::atan2( P1.at(row,col), P2.at(row,col) ); out_mem++; } } } } template inline void glue_atan2::apply(Cube& out, const GlueCube& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const ProxyCube P1(expr.A); const ProxyCube P2(expr.B); arma_assert_same_size(P1, P2, "atan2()"); const bool bad_alias = ( (ProxyCube::has_subview && P1.is_alias(out)) || (ProxyCube::has_subview && P2.is_alias(out)) ); if(bad_alias == false) { glue_atan2::apply_noalias(out, P1, P2); } else { Cube tmp; glue_atan2::apply_noalias(tmp, P1, P2); out.steal_mem(tmp); } } template inline void glue_atan2::apply_noalias(Cube& out, const ProxyCube& P1, const ProxyCube& P2) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = P1.get_n_rows(); const uword n_cols = P1.get_n_cols(); const uword n_slices = P1.get_n_slices(); const uword n_elem = P1.get_n_elem(); out.set_size(n_rows, n_cols, n_slices); eT* out_mem = out.memptr(); const bool use_mp = arma_config::openmp && mp_gate::use_mp || ProxyCube::use_mp)>::eval(n_elem); const bool use_at = ProxyCube::use_at || ProxyCube::use_at; if(use_at == false) { typename ProxyCube::ea_type eaP1 = P1.get_ea(); typename ProxyCube::ea_type eaP2 = P2.get_ea(); if(use_mp) { #if defined(ARMA_USE_OPENMP) { const int n_threads = mp_thread_limit::get(); #pragma omp parallel for schedule(static) num_threads(n_threads) for(uword i=0; i::stored_type> U1(P1.Q); const unwrap_cube::stored_type> U2(P2.Q); out = arma::atan2(U1.M, U2.M); } else { for(uword slice=0; slice < n_slices; ++slice) for(uword col=0; col < n_cols; ++col ) for(uword row=0; row < n_rows; ++row ) { *out_mem = std::atan2( P1.at(row,col,slice), P2.at(row,col,slice) ); out_mem++; } } } } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_eig_pair.hpp0000644000176200001440000001036414124060717023351 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_eig_pair //! @{ template arma_warn_unused inline typename enable_if2< is_supported_blas_type::value, Col< std::complex > >::result eig_pair ( const Base& A_expr, const Base& B_expr ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; Col< std::complex > eigvals; Mat< std::complex > eigvecs; const bool status = auxlib::eig_pair(eigvals, eigvecs, false, A_expr.get_ref(), B_expr.get_ref()); if(status == false) { eigvals.soft_reset(); arma_stop_runtime_error("eig_pair(): decomposition failed"); } return eigvals; } template inline typename enable_if2< is_supported_blas_type::value, bool >::result eig_pair ( Col< std::complex >& eigvals, const Base< typename T1::elem_type, T1 >& A_expr, const Base< typename T1::elem_type, T2 >& B_expr ) { arma_extra_debug_sigprint(); typedef typename T1::pod_type T; Mat< std::complex > eigvecs; const bool status = auxlib::eig_pair(eigvals, eigvecs, false, A_expr.get_ref(), B_expr.get_ref()); if(status == false) { eigvals.soft_reset(); arma_debug_warn_level(3, "eig_pair(): decomposition failed"); } return status; } template inline typename enable_if2< is_supported_blas_type::value, bool >::result eig_pair ( Col< std::complex >& eigvals, Mat< std::complex >& eigvecs, const Base< typename T1::elem_type, T1 >& A_expr, const Base< typename T1::elem_type, T2 >& B_expr ) { arma_extra_debug_sigprint(); arma_debug_check( (void_ptr(&eigvals) == void_ptr(&eigvecs)), "eig_pair(): parameter 'eigval' is an alias of parameter 'eigvec'" ); const bool status = auxlib::eig_pair(eigvals, eigvecs, true, A_expr.get_ref(), B_expr.get_ref()); if(status == false) { eigvals.soft_reset(); eigvecs.soft_reset(); arma_debug_warn_level(3, "eig_pair(): decomposition failed"); } return status; } template inline typename enable_if2< is_supported_blas_type::value, bool >::result eig_pair ( Col< std::complex >& eigvals, Mat< std::complex >& leigvecs, Mat< std::complex >& reigvecs, const Base< typename T1::elem_type, T1 >& A_expr, const Base< typename T1::elem_type, T2 >& B_expr ) { arma_extra_debug_sigprint(); arma_debug_check( (void_ptr(&eigvals) == void_ptr(&leigvecs)), "eig_pair(): parameter 'eigval' is an alias of parameter 'leigvec'" ); arma_debug_check( (void_ptr(&eigvals) == void_ptr(&reigvecs)), "eig_pair(): parameter 'eigval' is an alias of parameter 'reigvec'" ); arma_debug_check( (void_ptr(&leigvecs) == void_ptr(&reigvecs)), "eig_pair(): parameter 'leigvec' is an alias of parameter 'reigvec'" ); const bool status = auxlib::eig_pair_twosided(eigvals, leigvecs, reigvecs, A_expr.get_ref(), B_expr.get_ref()); if(status == false) { eigvals.soft_reset(); leigvecs.soft_reset(); reigvecs.soft_reset(); arma_debug_warn_level(3, "eig_pair(): decomposition failed"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/def_atlas.hpp0000644000176200001440000002157414124060717023036 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #ifdef ARMA_USE_ATLAS //! \namespace atlas namespace for ATLAS functions (imported from the global namespace) namespace atlas { using ::CblasColMajor; using ::CblasNoTrans; using ::CblasTrans; using ::CblasConjTrans; using ::CblasLower; using ::CblasUpper; #if defined(ARMA_USE_WRAPPER) extern "C" { float wrapper_cblas_sasum(const int N, const float *X, const int incX); double wrapper_cblas_dasum(const int N, const double *X, const int incX); float wrapper_cblas_snrm2(const int N, const float *X, const int incX); double wrapper_cblas_dnrm2(const int N, const double *X, const int incX); float wrapper_cblas_sdot(const int N, const float *X, const int incX, const float *Y, const int incY); double wrapper_cblas_ddot(const int N, const double *X, const int incX, const double *Y, const int incY); void wrapper_cblas_cdotu_sub(const int N, const void *X, const int incX, const void *Y, const int incY, void *dotu); void wrapper_cblas_zdotu_sub(const int N, const void *X, const int incX, const void *Y, const int incY, void *dotu); void wrapper_cblas_sgemv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const float alpha, const float *A, const int lda, const float *X, const int incX, const float beta, float *Y, const int incY); void wrapper_cblas_dgemv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const double alpha, const double *A, const int lda, const double *X, const int incX, const double beta, double *Y, const int incY); void wrapper_cblas_cgemv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const void *alpha, const void *A, const int lda, const void *X, const int incX, const void *beta, void *Y, const int incY); void wrapper_cblas_zgemv(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const int M, const int N, const void *alpha, const void *A, const int lda, const void *X, const int incX, const void *beta, void *Y, const int incY); void wrapper_cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const float alpha, const float *A, const int lda, const float *B, const int ldb, const float beta, float *C, const int ldc); void wrapper_cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const double alpha, const double *A, const int lda, const double *B, const int ldb, const double beta, double *C, const int ldc); void wrapper_cblas_cgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const void *alpha, const void *A, const int lda, const void *B, const int ldb, const void *beta, void *C, const int ldc); void wrapper_cblas_zgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const void *alpha, const void *A, const int lda, const void *B, const int ldb, const void *beta, void *C, const int ldc); void wrapper_cblas_ssyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const int N, const int K, const float alpha, const float *A, const int lda, const float beta, float *C, const int ldc); void wrapper_cblas_dsyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const int N, const int K, const double alpha, const double *A, const int lda, const double beta, double *C, const int ldc); void wrapper_cblas_cherk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const int N, const int K, const float alpha, const void *A, const int lda, const float beta, void *C, const int ldc); void wrapper_cblas_zherk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const int N, const int K, const double alpha, const void *A, const int lda, const double beta, void *C, const int ldc); int wrapper_clapack_sgetrf(const enum CBLAS_ORDER Order, const int M, const int N, float *A, const int lda, int *ipiv); int wrapper_clapack_dgetrf(const enum CBLAS_ORDER Order, const int M, const int N, double *A, const int lda, int *ipiv); int wrapper_clapack_cgetrf(const enum CBLAS_ORDER Order, const int M, const int N, void *A, const int lda, int *ipiv); int wrapper_clapack_zgetrf(const enum CBLAS_ORDER Order, const int M, const int N, void *A, const int lda, int *ipiv); int wrapper_clapack_sgetri(const enum CBLAS_ORDER Order, const int N, float *A, const int lda, const int *ipiv); int wrapper_clapack_dgetri(const enum CBLAS_ORDER Order, const int N, double *A, const int lda, const int *ipiv); int wrapper_clapack_cgetri(const enum CBLAS_ORDER Order, const int N, void *A, const int lda, const int *ipiv); int wrapper_clapack_zgetri(const enum CBLAS_ORDER Order, const int N, void *A, const int lda, const int *ipiv); int wrapper_clapack_sgesv(const enum CBLAS_ORDER Order, const int N, const int NRHS, float *A, const int lda, int *ipiv, float *B, const int ldb); int wrapper_clapack_dgesv(const enum CBLAS_ORDER Order, const int N, const int NRHS, double *A, const int lda, int *ipiv, double *B, const int ldb); int wrapper_clapack_cgesv(const enum CBLAS_ORDER Order, const int N, const int NRHS, void *A, const int lda, int *ipiv, void *B, const int ldb); int wrapper_clapack_zgesv(const enum CBLAS_ORDER Order, const int N, const int NRHS, void *A, const int lda, int *ipiv, void *B, const int ldb); int wrapper_clapack_spotrf(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, float *A, const int lda); int wrapper_clapack_dpotrf(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, double *A, const int lda); int wrapper_clapack_cpotrf(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, void *A, const int lda); int wrapper_clapack_zpotrf(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, void *A, const int lda); int wrapper_clapack_spotri(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, float *A, const int lda); int wrapper_clapack_dpotri(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, double *A, const int lda); int wrapper_clapack_cpotri(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, void *A, const int lda); int wrapper_clapack_zpotri(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, void *A, const int lda); int wrapper_clapack_sposv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const int NRHS, float *A, const int lda, float *B, const int ldb); int wrapper_clapack_dposv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const int NRHS, double *A, const int lda, double *B, const int ldb); int wrapper_clapack_cposv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const int NRHS, void *A, const int lda, void *B, const int ldb); int wrapper_clapack_zposv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N, const int NRHS, void *A, const int lda, void *B, const int ldb); } #endif } #endif RcppArmadillo/inst/include/armadillo_bits/spop_min_bones.hpp0000644000176200001440000000455314124060717024124 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_min //! @{ class spop_min : public traits_op_xvec { public: template inline static void apply(SpMat& out, const SpOp& in); // template inline static void apply_proxy(SpMat& out, const SpProxy& p, const uword dim, const typename arma_not_cx::result* junk = nullptr); template inline static typename T1::elem_type vector_min(const T1& X, const typename arma_not_cx::result* junk = nullptr); template inline static typename arma_not_cx::result min(const SpBase& X); template inline static typename arma_not_cx::result min_with_index(const SpProxy& P, uword& index_of_min_val); // template inline static void apply_proxy(SpMat& out, const SpProxy& p, const uword dim, const typename arma_cx_only::result* junk = nullptr); template inline static typename T1::elem_type vector_min(const T1& X, const typename arma_cx_only::result* junk = nullptr); template inline static typename arma_cx_only::result min(const SpBase& X); template inline static typename arma_cx_only::result min_with_index(const SpProxy& P, uword& index_of_min_val); }; //! @} RcppArmadillo/inst/include/armadillo_bits/SpSubview_iterators_meat.hpp0000644000176200001440000007707714124060717026156 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpSubview //! @{ /////////////////////////////////////////////////////////////////////////////// // SpSubview::iterator_base implementation // /////////////////////////////////////////////////////////////////////////////// template inline SpSubview::iterator_base::iterator_base(const SpSubview& in_M) : M(&in_M) , internal_col(0) , internal_pos(0) { // Technically this iterator is invalid (it may not point to a valid element) } template inline SpSubview::iterator_base::iterator_base(const SpSubview& in_M, const uword in_col, const uword in_pos) : M(&in_M) , internal_col(in_col) , internal_pos(in_pos) { // Nothing to do. } /////////////////////////////////////////////////////////////////////////////// // SpSubview::const_iterator implementation // /////////////////////////////////////////////////////////////////////////////// template inline SpSubview::const_iterator::const_iterator(const SpSubview& in_M, const uword initial_pos) : iterator_base(in_M, 0, initial_pos) { // Corner case for empty subviews. if(in_M.n_nonzero == 0) { iterator_base::internal_col = in_M.n_cols; skip_pos = in_M.m.n_nonzero; return; } // Figure out the row and column of the position. // lskip_pos holds the number of values which aren't part of this subview. const uword aux_col = iterator_base::M->aux_col1; const uword aux_row = iterator_base::M->aux_row1; const uword ln_rows = iterator_base::M->n_rows; const uword ln_cols = iterator_base::M->n_cols; uword cur_pos = 0; // off by one because we might be searching for pos 0 uword lskip_pos = iterator_base::M->m.col_ptrs[aux_col]; uword cur_col = 0; while(cur_pos < (iterator_base::internal_pos + 1)) { // Have we stepped forward a column (or multiple columns)? while(((lskip_pos + cur_pos) >= iterator_base::M->m.col_ptrs[cur_col + aux_col + 1]) && (cur_col < ln_cols)) { ++cur_col; } // See if the current position is in the subview. const uword row_index = iterator_base::M->m.row_indices[cur_pos + lskip_pos]; if(row_index < aux_row) { ++lskip_pos; // not valid } else if(row_index < (aux_row + ln_rows)) { ++cur_pos; // valid, in the subview } else { // skip to end of column const uword next_colptr = iterator_base::M->m.col_ptrs[cur_col + aux_col + 1]; lskip_pos += (next_colptr - (cur_pos + lskip_pos)); } } iterator_base::internal_col = cur_col; skip_pos = lskip_pos; } template inline SpSubview::const_iterator::const_iterator(const SpSubview& in_M, const uword in_row, const uword in_col) : iterator_base(in_M, in_col, 0) { // Corner case for empty subviews. if(in_M.n_nonzero == 0) { // We must be at the last position. iterator_base::internal_col = in_M.n_cols; skip_pos = in_M.m.n_nonzero; return; } // We have a destination we want to be just after, but don't know what position that is. // Because we have to count the points in this subview and not in this subview, this becomes a little difficult and slow. const uword aux_col = iterator_base::M->aux_col1; const uword aux_row = iterator_base::M->aux_row1; const uword ln_rows = iterator_base::M->n_rows; const uword ln_cols = iterator_base::M->n_cols; uword cur_pos = 0; skip_pos = iterator_base::M->m.col_ptrs[aux_col]; uword cur_col = 0; // Skip any empty columns. while(((skip_pos + cur_pos) >= iterator_base::M->m.col_ptrs[cur_col + aux_col + 1]) && (cur_col < ln_cols)) { ++cur_col; } while(cur_col < in_col) { // See if the current position is in the subview. const uword row_index = iterator_base::M->m.row_indices[cur_pos + skip_pos]; if(row_index < aux_row) { ++skip_pos; } else if(row_index < (aux_row + ln_rows)) { ++cur_pos; } else { // skip to end of column const uword next_colptr = iterator_base::M->m.col_ptrs[cur_col + aux_col + 1]; skip_pos += (next_colptr - (cur_pos + skip_pos)); } // Have we stepped forward a column (or multiple columns)? while(((skip_pos + cur_pos) >= iterator_base::M->m.col_ptrs[cur_col + aux_col + 1]) && (cur_col < ln_cols)) { ++cur_col; } } // Now we are either on the right column or ahead of it. if(cur_col == in_col) { // We have to find the right row index. uword row_index = iterator_base::M->m.row_indices[cur_pos + skip_pos]; while((row_index < (in_row + aux_row))) { if(row_index < aux_row) { ++skip_pos; } else { ++cur_pos; } // Ensure we didn't step forward a column; if we did, we need to stop. while(((skip_pos + cur_pos) >= iterator_base::M->m.col_ptrs[cur_col + aux_col + 1]) && (cur_col < ln_cols)) { ++cur_col; } if(cur_col != in_col) { break; } row_index = iterator_base::M->m.row_indices[cur_pos + skip_pos]; } } // Now we need to find the next valid position in the subview. uword row_index; while(true) { const uword next_colptr = iterator_base::M->m.col_ptrs[cur_col + aux_col + 1]; row_index = iterator_base::M->m.row_indices[cur_pos + skip_pos]; // Are we at the last position? if(cur_col >= ln_cols) { cur_col = ln_cols; // Make sure we will be pointing at the last element in the parent matrix. skip_pos = iterator_base::M->m.n_nonzero - iterator_base::M->n_nonzero; break; } if(row_index < aux_row) { ++skip_pos; } else if(row_index < (aux_row + ln_rows)) { break; // found } else { skip_pos += (next_colptr - (cur_pos + skip_pos)); } // Did we move any columns? while(((skip_pos + cur_pos) >= iterator_base::M->m.col_ptrs[cur_col + aux_col + 1]) && (cur_col < ln_cols)) { ++cur_col; } } // It is possible we have moved another column. while(((skip_pos + cur_pos) >= iterator_base::M->m.col_ptrs[cur_col + aux_col + 1]) && (cur_col < ln_cols)) { ++cur_col; } iterator_base::internal_pos = cur_pos; iterator_base::internal_col = cur_col; } template inline SpSubview::const_iterator::const_iterator(const SpSubview& in_M, uword in_row, uword in_col, uword in_pos, uword in_skip_pos) : iterator_base(in_M, in_col, in_pos) , skip_pos(in_skip_pos) { arma_ignore(in_row); // Nothing to do. } template inline SpSubview::const_iterator::const_iterator(const const_iterator& other) : iterator_base(*other.M, other.internal_col, other.internal_pos) , skip_pos(other.skip_pos) { // Nothing to do. } template arma_inline eT SpSubview::const_iterator::operator*() const { return iterator_base::M->m.values[iterator_base::internal_pos + skip_pos]; } template inline arma_hot typename SpSubview::const_iterator& SpSubview::const_iterator::operator++() { const uword aux_col = iterator_base::M->aux_col1; const uword aux_row = iterator_base::M->aux_row1; const uword ln_rows = iterator_base::M->n_rows; const uword ln_cols = iterator_base::M->n_cols; uword cur_col = iterator_base::internal_col; uword cur_pos = iterator_base::internal_pos + 1; uword lskip_pos = skip_pos; uword row_index; while(true) { const uword next_colptr = iterator_base::M->m.col_ptrs[cur_col + aux_col + 1]; row_index = iterator_base::M->m.row_indices[cur_pos + lskip_pos]; // Did we move any columns? while((cur_col < ln_cols) && ((lskip_pos + cur_pos) >= iterator_base::M->m.col_ptrs[cur_col + aux_col + 1])) { ++cur_col; } // Are we at the last position? if(cur_col >= ln_cols) { cur_col = ln_cols; // Make sure we will be pointing at the last element in the parent matrix. lskip_pos = iterator_base::M->m.n_nonzero - iterator_base::M->n_nonzero; break; } if(row_index < aux_row) { ++lskip_pos; } else if(row_index < (aux_row + ln_rows)) { break; // found } else { lskip_pos += (next_colptr - (cur_pos + lskip_pos)); } } iterator_base::internal_pos = cur_pos; iterator_base::internal_col = cur_col; skip_pos = lskip_pos; return *this; } template inline arma_warn_unused typename SpSubview::const_iterator SpSubview::const_iterator::operator++(int) { typename SpSubview::const_iterator tmp(*this); ++(*this); return tmp; } template inline arma_hot typename SpSubview::const_iterator& SpSubview::const_iterator::operator--() { const uword aux_col = iterator_base::M->aux_col1; const uword aux_row = iterator_base::M->aux_row1; const uword ln_rows = iterator_base::M->n_rows; uword cur_col = iterator_base::internal_col; uword cur_pos = iterator_base::internal_pos - 1; // Special condition for end of iterator. if((skip_pos + cur_pos + 1) == iterator_base::M->m.n_nonzero) { // We are at the last element. So we need to set skip_pos back to what it // would be if we didn't manually modify it back in operator++(). skip_pos = iterator_base::M->m.col_ptrs[cur_col + aux_col] - iterator_base::internal_pos; } uword row_index; while(true) { const uword colptr = iterator_base::M->m.col_ptrs[cur_col + aux_col]; row_index = iterator_base::M->m.row_indices[cur_pos + skip_pos]; // Did we move back any columns? while((skip_pos + cur_pos) < iterator_base::M->m.col_ptrs[cur_col + aux_col]) { --cur_col; } if(row_index < aux_row) { skip_pos -= (colptr - (cur_pos + skip_pos) + 1); } else if(row_index < (aux_row + ln_rows)) { break; // found } else { --skip_pos; } } iterator_base::internal_pos = cur_pos; iterator_base::internal_col = cur_col; return *this; } template inline arma_warn_unused typename SpSubview::const_iterator SpSubview::const_iterator::operator--(int) { typename SpSubview::const_iterator tmp(*this); --(*this); return tmp; } template inline arma_hot bool SpSubview::const_iterator::operator==(const const_iterator& rhs) const { return (rhs.row() == (*this).row()) && (rhs.col() == iterator_base::internal_col); } template inline arma_hot bool SpSubview::const_iterator::operator!=(const const_iterator& rhs) const { return (rhs.row() != (*this).row()) || (rhs.col() != iterator_base::internal_col); } template inline arma_hot bool SpSubview::const_iterator::operator==(const typename SpMat::const_iterator& rhs) const { return (rhs.row() == (*this).row()) && (rhs.col() == iterator_base::internal_col); } template inline arma_hot bool SpSubview::const_iterator::operator!=(const typename SpMat::const_iterator& rhs) const { return (rhs.row() != (*this).row()) || (rhs.col() != iterator_base::internal_col); } template inline arma_hot bool SpSubview::const_iterator::operator==(const const_row_iterator& rhs) const { return (rhs.row() == (*this).row()) && (rhs.col() == iterator_base::internal_col); } template inline arma_hot bool SpSubview::const_iterator::operator!=(const const_row_iterator& rhs) const { return (rhs.row() != (*this).row()) || (rhs.col() != iterator_base::internal_col); } template inline arma_hot bool SpSubview::const_iterator::operator==(const typename SpMat::const_row_iterator& rhs) const { return (rhs.row() == (*this).row()) && (rhs.col() == iterator_base::internal_col); } template inline arma_hot bool SpSubview::const_iterator::operator!=(const typename SpMat::const_row_iterator& rhs) const { return (rhs.row() != (*this).row()) || (rhs.col() != iterator_base::internal_col); } /////////////////////////////////////////////////////////////////////////////// // SpSubview::iterator implementation // /////////////////////////////////////////////////////////////////////////////// template inline arma_hot SpValProxy< SpSubview > SpSubview::iterator::operator*() { return SpValProxy< SpSubview >( const_iterator::row(), iterator_base::col(), access::rw(*iterator_base::M), &(access::rw(iterator_base::M->m.values[iterator_base::internal_pos + const_iterator::skip_pos]))); } template inline arma_hot typename SpSubview::iterator& SpSubview::iterator::operator++() { const_iterator::operator++(); return *this; } template inline arma_warn_unused typename SpSubview::iterator SpSubview::iterator::operator++(int) { typename SpSubview::iterator tmp(*this); const_iterator::operator++(); return tmp; } template inline arma_hot typename SpSubview::iterator& SpSubview::iterator::operator--() { const_iterator::operator--(); return *this; } template inline arma_warn_unused typename SpSubview::iterator SpSubview::iterator::operator--(int) { typename SpSubview::iterator tmp(*this); const_iterator::operator--(); return tmp; } /////////////////////////////////////////////////////////////////////////////// // SpSubview::const_row_iterator implementation // /////////////////////////////////////////////////////////////////////////////// template inline SpSubview::const_row_iterator::const_row_iterator() : iterator_base() , internal_row(0) , actual_pos(0) { } template inline SpSubview::const_row_iterator::const_row_iterator(const SpSubview& in_M, uword initial_pos) : iterator_base(in_M, 0, initial_pos) , internal_row(0) , actual_pos(0) { // Corner case for the end of a subview. if(initial_pos == in_M.n_nonzero) { iterator_base::internal_col = 0; internal_row = in_M.n_rows; return; } const uword aux_col = iterator_base::M->aux_col1; const uword aux_row = iterator_base::M->aux_row1; // We don't count zeros in our position count, so we have to find the nonzero // value corresponding to the given initial position, and we also have to skip // any nonzero elements that aren't a part of the subview. uword cur_pos = std::numeric_limits::max(); uword cur_actual_pos = 0; // Since we don't know where the elements are in each row, we have to loop // across all columns looking for elements in row 0 and add to our sum, then // in row 1, and so forth, until we get to the desired position. for(uword row = 0; row < iterator_base::M->n_rows; ++row) { for(uword col = 0; col < iterator_base::M->n_cols; ++col) { // Find the first element with row greater than or equal to row + aux_row. const uword col_offset = iterator_base::M->m.col_ptrs[col + aux_col ]; const uword next_col_offset = iterator_base::M->m.col_ptrs[col + aux_col + 1]; const uword* start_ptr = &iterator_base::M->m.row_indices[ col_offset]; const uword* end_ptr = &iterator_base::M->m.row_indices[next_col_offset]; if(start_ptr != end_ptr) { const uword* pos_ptr = std::lower_bound(start_ptr, end_ptr, row + aux_row); const uword offset = uword(pos_ptr - start_ptr); if(iterator_base::M->m.row_indices[col_offset + offset] == row + aux_row) { cur_actual_pos = col_offset + offset; // Increment position portably. if(cur_pos == std::numeric_limits::max()) cur_pos = 0; else ++cur_pos; // Do we terminate? if(cur_pos == initial_pos) { internal_row = row; iterator_base::internal_col = col; iterator_base::internal_pos = cur_pos; actual_pos = cur_actual_pos; return; } } } } } // This shouldn't happen. iterator_base::internal_pos = iterator_base::M->n_nonzero; iterator_base::internal_col = 0; internal_row = iterator_base::M->n_rows; actual_pos = iterator_base::M->n_nonzero; } template inline SpSubview::const_row_iterator::const_row_iterator(const SpSubview& in_M, uword in_row, uword in_col) : iterator_base(in_M, in_col, 0) , internal_row(0) , actual_pos(0) { // Start our search in the given row. We need to find two things: // // 1. The first nonzero element (iterating by rows) after (in_row, in_col). // 2. The number of nonzero elements (iterating by rows) that come before // (in_row, in_col). // // We'll find these simultaneously, though we will have to loop over all // columns. const uword aux_col = iterator_base::M->aux_col1; const uword aux_row = iterator_base::M->aux_row1; // This will hold the total number of points in the subview with rows less // than in_row. uword cur_pos = 0; uword cur_min_row = iterator_base::M->n_rows; uword cur_min_col = 0; uword cur_actual_pos = 0; for(uword col = 0; col < iterator_base::M->n_cols; ++col) { // Find the first element with row greater than or equal to in_row. const uword col_offset = iterator_base::M->m.col_ptrs[col + aux_col ]; const uword next_col_offset = iterator_base::M->m.col_ptrs[col + aux_col + 1]; const uword* start_ptr = &iterator_base::M->m.row_indices[ col_offset]; const uword* end_ptr = &iterator_base::M->m.row_indices[next_col_offset]; if(start_ptr != end_ptr) { // First let us find the first element that is in the subview. const uword* first_subview_ptr = std::lower_bound(start_ptr, end_ptr, aux_row); if(first_subview_ptr != end_ptr && (*first_subview_ptr) < aux_row + iterator_base::M->n_rows) { // There exists at least one element in the subview. const uword* pos_ptr = std::lower_bound(first_subview_ptr, end_ptr, aux_row + in_row); // This is the number of elements in the subview with row index less // than in_row. cur_pos += uword(pos_ptr - first_subview_ptr); if(pos_ptr != end_ptr && (*pos_ptr) < aux_row + iterator_base::M->n_rows) { // This is the row index of the first element in the column with row // index greater than or equal to in_row + aux_row. if((*pos_ptr) - aux_row < cur_min_row) { // If we are in the desired row but before the desired column, we // can't take this. if(col >= in_col) { cur_min_row = (*pos_ptr) - aux_row; cur_min_col = col; cur_actual_pos = col_offset + (pos_ptr - start_ptr); } } } } } } // Now we know what the minimum row is. internal_row = cur_min_row; iterator_base::internal_col = cur_min_col; iterator_base::internal_pos = cur_pos; actual_pos = cur_actual_pos; } template inline SpSubview::const_row_iterator::const_row_iterator(const const_row_iterator& other) : iterator_base(*other.M, other.internal_col, other.internal_pos) , internal_row(other.internal_row) , actual_pos(other.actual_pos) { // Nothing to do. } template inline arma_hot typename SpSubview::const_row_iterator& SpSubview::const_row_iterator::operator++() { // We just need to find the next nonzero element. ++iterator_base::internal_pos; // If we have exceeded the bounds, update accordingly. if(iterator_base::internal_pos >= iterator_base::M->n_nonzero) { internal_row = iterator_base::M->n_rows; iterator_base::internal_col = 0; actual_pos = iterator_base::M->n_nonzero; return *this; } const uword aux_col = iterator_base::M->aux_col1; const uword aux_row = iterator_base::M->aux_row1; const uword M_n_cols = iterator_base::M->n_cols; // Otherwise, we need to search. We have to loop over all of the columns in // the subview. uword next_min_row = iterator_base::M->n_rows; uword next_min_col = 0; uword next_actual_pos = 0; for(uword col = iterator_base::internal_col + 1; col < M_n_cols; ++col) { // Find the first element with row greater than or equal to row. const uword col_offset = iterator_base::M->m.col_ptrs[col + aux_col ]; const uword next_col_offset = iterator_base::M->m.col_ptrs[col + aux_col + 1]; const uword* start_ptr = &iterator_base::M->m.row_indices[ col_offset]; const uword* end_ptr = &iterator_base::M->m.row_indices[next_col_offset]; if(start_ptr != end_ptr) { // Find the first element in the column with row greater than or equal to // the current row. Since this is a subview, it's possible that we may // find rows past the end of the subview. const uword* pos_ptr = std::lower_bound(start_ptr, end_ptr, internal_row + aux_row); if(pos_ptr != end_ptr) { // We found something; is the row index correct? if((*pos_ptr) == internal_row + aux_row && (*pos_ptr) < aux_row + iterator_base::M->n_rows) { // Exact match---so we are done. iterator_base::internal_col = col; actual_pos = col_offset + (pos_ptr - start_ptr); return *this; } else if((*pos_ptr) < next_min_row + aux_row && (*pos_ptr) < aux_row + iterator_base::M->n_rows) { // The first element in this column is in a subsequent row, but it's // the minimum row we've seen so far. next_min_row = (*pos_ptr) - aux_row; next_min_col = col; next_actual_pos = col_offset + (pos_ptr - start_ptr); } else if((*pos_ptr) == next_min_row + aux_row && col < next_min_col && (*pos_ptr) < aux_row + iterator_base::M->n_rows) { // The first element in this column is in a subsequent row that we // already have another elemnt for, but the column index is less so // this element will come first. next_min_col = col; next_actual_pos = col_offset + (pos_ptr - start_ptr); } } } } // Restart the search in the next row. for(uword col = 0; col <= iterator_base::internal_col; ++col) { // Find the first element with row greater than or equal to row + 1. const uword col_offset = iterator_base::M->m.col_ptrs[col + aux_col ]; const uword next_col_offset = iterator_base::M->m.col_ptrs[col + aux_col + 1]; const uword* start_ptr = &iterator_base::M->m.row_indices[ col_offset]; const uword* end_ptr = &iterator_base::M->m.row_indices[next_col_offset]; if(start_ptr != end_ptr) { const uword* pos_ptr = std::lower_bound(start_ptr, end_ptr, internal_row + aux_row + 1); if(pos_ptr != end_ptr) { // We found something in the column, but is the row index correct? if((*pos_ptr) == internal_row + aux_row + 1 && (*pos_ptr) < aux_row + iterator_base::M->n_rows) { // Exact match---so we are done. iterator_base::internal_col = col; internal_row++; actual_pos = col_offset + (pos_ptr - start_ptr); return *this; } else if((*pos_ptr) < next_min_row + aux_row && (*pos_ptr) < aux_row + iterator_base::M->n_rows) { // The first element in this column is in a subsequent row, but it's // the minimum row we've seen so far. next_min_row = (*pos_ptr) - aux_row; next_min_col = col; next_actual_pos = col_offset + (pos_ptr - start_ptr); } else if((*pos_ptr) == next_min_row + aux_row && col < next_min_col && (*pos_ptr) < aux_row + iterator_base::M->n_rows) { // We've found a better column. next_min_col = col; next_actual_pos = col_offset + (pos_ptr - start_ptr); } } } } iterator_base::internal_col = next_min_col; internal_row = next_min_row; actual_pos = next_actual_pos; return *this; } template inline arma_warn_unused typename SpSubview::const_row_iterator SpSubview::const_row_iterator::operator++(int) { typename SpSubview::const_row_iterator tmp(*this); ++(*this); return tmp; } template inline arma_hot typename SpSubview::const_row_iterator& SpSubview::const_row_iterator::operator--() { if(iterator_base::internal_pos == 0) { // We are already at the beginning. return *this; } iterator_base::internal_pos--; const uword aux_col = iterator_base::M->aux_col1; const uword aux_row = iterator_base::M->aux_row1; // We have to search backwards. uword max_row = 0; uword max_col = 0; uword next_actual_pos = 0; for(uword col = iterator_base::internal_col; col >= 1; --col) { // Find the first element with row greater than or equal to in_row + 1. const uword col_offset = iterator_base::M->m.col_ptrs[col + aux_col - 1]; const uword next_col_offset = iterator_base::M->m.col_ptrs[col + aux_col ]; const uword* start_ptr = &iterator_base::M->m.row_indices[ col_offset]; const uword* end_ptr = &iterator_base::M->m.row_indices[next_col_offset]; if(start_ptr != end_ptr) { // There are elements in this column. const uword* pos_ptr = std::lower_bound(start_ptr, end_ptr, internal_row + aux_row + 1); if(pos_ptr != start_ptr) { if(*(pos_ptr - 1) > max_row + aux_row) { // There are elements in this column with row index < internal_row. max_row = *(pos_ptr - 1) - aux_row; max_col = col - 1; next_actual_pos = col_offset + (pos_ptr - 1 - start_ptr); } else if(*(pos_ptr - 1) == max_row + aux_row && (col - 1) >= max_col) { max_col = col - 1; next_actual_pos = col_offset + (pos_ptr - 1 - start_ptr); } } } } for(uword col = iterator_base::M->n_cols - 1; col >= iterator_base::internal_col; --col) { // Find the first element with row greater than or equal to row + 1. const uword col_offset = iterator_base::M->m.col_ptrs[col + aux_col ]; const uword next_col_offset = iterator_base::M->m.col_ptrs[col + aux_col + 1]; const uword* start_ptr = &iterator_base::M->m.row_indices[ col_offset]; const uword* end_ptr = &iterator_base::M->m.row_indices[next_col_offset]; if(start_ptr != end_ptr) { // There are elements in this column. const uword* pos_ptr = std::lower_bound(start_ptr, end_ptr, internal_row + aux_row); if(pos_ptr != start_ptr) { // There are elements in this column with row index < internal_row. if(*(pos_ptr - 1) > max_row + aux_row) { max_row = *(pos_ptr - 1) - aux_row; max_col = col; next_actual_pos = col_offset + (pos_ptr - 1 - start_ptr); } else if(*(pos_ptr - 1) == max_row + aux_row && col >= max_col) { max_col = col; next_actual_pos = col_offset + (pos_ptr - 1 - start_ptr); } } } if(col == 0) // Catch edge case that the loop termination condition won't. { break; } } iterator_base::internal_col = max_col; internal_row = max_row; actual_pos = next_actual_pos; return *this; } template inline arma_warn_unused typename SpSubview::const_row_iterator SpSubview::const_row_iterator::operator--(int) { typename SpSubview::const_row_iterator tmp(*this); --(*this); return tmp; } template inline arma_hot bool SpSubview::const_row_iterator::operator==(const const_iterator& rhs) const { return (rhs.row() == row()) && (rhs.col() == iterator_base::internal_col); } template inline arma_hot bool SpSubview::const_row_iterator::operator!=(const const_iterator& rhs) const { return (rhs.row() != row()) || (rhs.col() != iterator_base::internal_col); } template inline arma_hot bool SpSubview::const_row_iterator::operator==(const typename SpMat::const_iterator& rhs) const { return (rhs.row() == row()) && (rhs.col() == iterator_base::internal_col); } template inline arma_hot bool SpSubview::const_row_iterator::operator!=(const typename SpMat::const_iterator& rhs) const { return (rhs.row() != row()) || (rhs.col() != iterator_base::internal_col); } template inline arma_hot bool SpSubview::const_row_iterator::operator==(const const_row_iterator& rhs) const { return (rhs.row() == row()) && (rhs.col() == iterator_base::internal_col); } template inline arma_hot bool SpSubview::const_row_iterator::operator!=(const const_row_iterator& rhs) const { return (rhs.row() != row()) || (rhs.col() != iterator_base::internal_col); } template inline arma_hot bool SpSubview::const_row_iterator::operator==(const typename SpMat::const_row_iterator& rhs) const { return (rhs.row() == row()) && (rhs.col() == iterator_base::internal_col); } template inline arma_hot bool SpSubview::const_row_iterator::operator!=(const typename SpMat::const_row_iterator& rhs) const { return (rhs.row() != row()) || (rhs.col() != iterator_base::internal_col); } /////////////////////////////////////////////////////////////////////////////// // SpSubview::row_iterator implementation // /////////////////////////////////////////////////////////////////////////////// template inline arma_hot SpValProxy< SpSubview > SpSubview::row_iterator::operator*() { return SpValProxy< SpSubview >( const_row_iterator::internal_row, iterator_base::internal_col, access::rw(*iterator_base::M), &access::rw(iterator_base::M->m.values[const_row_iterator::actual_pos])); } template inline arma_hot typename SpSubview::row_iterator& SpSubview::row_iterator::operator++() { const_row_iterator::operator++(); return *this; } template inline arma_warn_unused typename SpSubview::row_iterator SpSubview::row_iterator::operator++(int) { typename SpSubview::row_iterator tmp(*this); ++(*this); return tmp; } template inline arma_hot typename SpSubview::row_iterator& SpSubview::row_iterator::operator--() { const_row_iterator::operator--(); return *this; } template inline arma_warn_unused typename SpSubview::row_iterator SpSubview::row_iterator::operator--(int) { typename SpSubview::row_iterator tmp(*this); --(*this); return tmp; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_det_bones.hpp0000644000176200001440000000306514124060717023547 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_det //! @{ class op_det : public traits_op_default { public: template struct pos { static constexpr uword n2 = row + col*2; static constexpr uword n3 = row + col*3; static constexpr uword n4 = row + col*4; }; template inline static bool apply_direct(typename T1::elem_type& out_val, const Base& expr); template inline static typename T1::elem_type apply_diagmat(const Base& expr); template inline static typename T1::elem_type apply_trimat(const Base& expr); template arma_cold inline static eT apply_tiny(const Mat& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_vectorise.hpp0000644000176200001440000000454114124060717023575 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_vectorise //! @{ template arma_warn_unused inline typename enable_if2 < is_arma_type::value, const Op >::result vectorise(const T1& X) { arma_extra_debug_sigprint(); return Op(X); } template arma_warn_unused inline typename enable_if2 < is_arma_type::value, const Op >::result vectorise(const T1& X, const uword dim) { arma_extra_debug_sigprint(); arma_debug_check( (dim > 1), "vectorise(): parameter 'dim' must be 0 or 1" ); return Op(X, dim, 0); } template arma_warn_unused inline CubeToMatOp vectorise(const BaseCube& X) { arma_extra_debug_sigprint(); return CubeToMatOp(X.get_ref()); } //! Vectorization for sparse objects. template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value, const SpOp >::result vectorise(const T1& X) { arma_extra_debug_sigprint(); return SpOp(X); } //! Vectorization for sparse objects. template arma_warn_unused inline typename enable_if2 < is_arma_sparse_type::value, const SpOp >::result vectorise(const T1& X, const uword dim) { arma_extra_debug_sigprint(); arma_debug_check( (dim > 1), "vectorise(): parameter 'dim' must be 0 or 1" ); return SpOp(X, dim, 0); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_shuffle_meat.hpp0000644000176200001440000001253514124060717024251 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_shuffle //! @{ template inline void op_shuffle::apply_direct(Mat& out, const Mat& X, const uword dim) { arma_extra_debug_sigprint(); if(X.is_empty()) { out.copy_size(X); return; } const uword N = (dim == 0) ? X.n_rows : X.n_cols; // see op_sort_index_bones.hpp for the definition of arma_sort_index_packet // and the associated comparison functor std::vector< arma_sort_index_packet > packet_vec(N); for(uword i=0; i()); packet_vec[i].index = i; } arma_sort_index_helper_ascend comparator; std::sort( packet_vec.begin(), packet_vec.end(), comparator ); const bool is_alias = (&out == &X); if(X.is_vec() == false) { if(is_alias == false) { arma_extra_debug_print("op_shuffle::apply(): matrix"); out.copy_size(X); if(dim == 0) { for(uword i=0; i 1) // ie. column vector { for(uword i=0; i 1) // ie. row vector { for(uword i=0; i 1) // ie. column vector { for(uword i=0; i 1) // ie. row vector { for(uword i=0; i inline void op_shuffle::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); const unwrap U(in.m); const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "shuffle(): parameter 'dim' must be 0 or 1" ); op_shuffle::apply_direct(out, U.M, dim); } template inline void op_shuffle_vec::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); const unwrap U(in.m); const uword dim = (T1::is_xvec) ? uword(U.M.is_rowvec() ? 1 : 0) : uword((T1::is_row) ? 1 : 0); op_shuffle::apply_direct(out, U.M, dim); } //! @} RcppArmadillo/inst/include/armadillo_bits/fill.hpp0000644000176200001440000001216214124060717022033 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fill //! @{ namespace fill { struct fill_none {}; struct fill_zeros {}; struct fill_ones {}; struct fill_eye {}; struct fill_randu {}; struct fill_randn {}; template struct fill_class { inline fill_class() {} }; static const fill_class none; static const fill_class zeros; static const fill_class ones; static const fill_class eye; static const fill_class randu; static const fill_class randn; // template struct allow_conversion { static constexpr bool value = true; }; template<> struct allow_conversion, double> { static constexpr bool value = false; }; template<> struct allow_conversion, float > { static constexpr bool value = false; }; template<> struct allow_conversion, u64 > { static constexpr bool value = false; }; template<> struct allow_conversion, s64 > { static constexpr bool value = false; }; template<> struct allow_conversion, u32 > { static constexpr bool value = false; }; template<> struct allow_conversion, s32 > { static constexpr bool value = false; }; template<> struct allow_conversion, u16 > { static constexpr bool value = false; }; template<> struct allow_conversion, s16 > { static constexpr bool value = false; }; template<> struct allow_conversion, u8 > { static constexpr bool value = false; }; template<> struct allow_conversion, s8 > { static constexpr bool value = false; }; template<> struct allow_conversion, double> { static constexpr bool value = false; }; template<> struct allow_conversion, float > { static constexpr bool value = false; }; template<> struct allow_conversion, u64 > { static constexpr bool value = false; }; template<> struct allow_conversion, s64 > { static constexpr bool value = false; }; template<> struct allow_conversion, u32 > { static constexpr bool value = false; }; template<> struct allow_conversion, s32 > { static constexpr bool value = false; }; template<> struct allow_conversion, u16 > { static constexpr bool value = false; }; template<> struct allow_conversion, s16 > { static constexpr bool value = false; }; template<> struct allow_conversion, u8 > { static constexpr bool value = false; }; template<> struct allow_conversion, s8 > { static constexpr bool value = false; }; // template inline bool isfinite_wrapper(eT ) { return true; } template<> inline bool isfinite_wrapper(float x) { return std::isfinite(x); } template<> inline bool isfinite_wrapper(double x) { return std::isfinite(x); } template inline bool isfinite_wrapper(std::complex& x) { return std::isfinite(x.real()) && std::isfinite(x.imag()); } // template struct scalar_holder { const scalar_type1 scalar; inline explicit scalar_holder(const scalar_type1& in_scalar) : scalar(in_scalar) {} inline scalar_holder() = delete; template < typename scalar_type2, typename arma::enable_if2::value, int>::result = 0 > inline operator scalar_holder() const { const bool ok_conversion = (std::is_integral::value && std::is_floating_point::value) ? isfinite_wrapper(scalar) : true; return scalar_holder( ok_conversion ? scalar_type2(scalar) : scalar_type2(0) ); } }; // template inline typename enable_if2< is_supported_elem_type::value, scalar_holder >::result value(const scalar_type& in_scalar) { return scalar_holder(in_scalar); } } //! @} RcppArmadillo/inst/include/armadillo_bits/mtOpCube_bones.hpp0000644000176200001440000000455514124060717024020 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup mtOpCube //! @{ struct mtOpCube_dual_aux_indicator {}; template class mtOpCube : public BaseCube< out_eT, mtOpCube > { public: typedef out_eT elem_type; typedef typename get_pod_type::result pod_type; typedef typename T1::elem_type in_eT; inline explicit mtOpCube(const T1& in_m); inline mtOpCube(const T1& in_m, const in_eT in_aux); inline mtOpCube(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c); inline mtOpCube(const T1& in_m, const in_eT in_aux, const uword in_aux_uword_a, const uword in_aux_uword_b, const uword in_aux_uword_c); inline mtOpCube(const char junk, const T1& in_m, const out_eT in_aux); inline mtOpCube(const mtOpCube_dual_aux_indicator&, const T1& in_m, const in_eT in_aux_a, const out_eT in_aux_b); inline ~mtOpCube(); arma_aligned const T1& m; //!< the operand; must be derived from BaseCube arma_aligned in_eT aux; //!< auxiliary data, using the element type as used by T1 arma_aligned out_eT aux_out_eT; //!< auxiliary data, using the element type as specified by the out_eT template parameter arma_aligned uword aux_uword_a; //!< auxiliary data, uword format arma_aligned uword aux_uword_b; //!< auxiliary data, uword format arma_aligned uword aux_uword_c; //!< auxiliary data, uword format }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_nonzeros.hpp0000644000176200001440000000240714124060717023446 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_nonzeros //! @{ template arma_warn_unused inline const Op nonzeros(const Base& X) { arma_extra_debug_sigprint(); return Op(X.get_ref()); } template arma_warn_unused inline const SpToDOp nonzeros(const SpBase& X) { arma_extra_debug_sigprint(); return SpToDOp(X.get_ref()); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_htrans_meat.hpp0000644000176200001440000002202414125053103024076 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_htrans //! @{ template arma_hot inline void op_htrans::apply_mat_noalias(Mat& out, const Mat& A, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); op_strans::apply_mat_noalias(out, A); } template arma_hot inline void op_htrans::apply_mat_noalias(Mat& out, const Mat& A, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; out.set_size(A_n_cols, A_n_rows); if( (A_n_cols == 1) || (A_n_rows == 1) ) { const uword n_elem = A.n_elem; const eT* A_mem = A.memptr(); eT* out_mem = out.memptr(); for(uword i=0; i < n_elem; ++i) { out_mem[i] = std::conj(A_mem[i]); } } else if( (A_n_rows >= 512) && (A_n_cols >= 512) ) { op_htrans::apply_mat_noalias_large(out, A); } else { eT* outptr = out.memptr(); for(uword k=0; k < A_n_rows; ++k) { const eT* Aptr = &(A.at(k,0)); for(uword j=0; j < A_n_cols; ++j) { (*outptr) = std::conj(*Aptr); Aptr += A_n_rows; outptr++; } } } } template arma_hot inline void op_htrans::block_worker(std::complex* Y, const std::complex* X, const uword X_n_rows, const uword Y_n_rows, const uword n_rows, const uword n_cols) { for(uword row = 0; row < n_rows; ++row) { const uword Y_offset = row * Y_n_rows; for(uword col = 0; col < n_cols; ++col) { const uword X_offset = col * X_n_rows; Y[col + Y_offset] = std::conj(X[row + X_offset]); } } } template arma_hot inline void op_htrans::apply_mat_noalias_large(Mat< std::complex >& out, const Mat< std::complex >& A) { arma_extra_debug_sigprint(); const uword n_rows = A.n_rows; const uword n_cols = A.n_cols; const uword block_size = 64; const uword n_rows_base = block_size * (n_rows / block_size); const uword n_cols_base = block_size * (n_cols / block_size); const uword n_rows_extra = n_rows - n_rows_base; const uword n_cols_extra = n_cols - n_cols_base; const std::complex* X = A.memptr(); std::complex* Y = out.memptr(); for(uword row = 0; row < n_rows_base; row += block_size) { const uword Y_offset = row * n_cols; for(uword col = 0; col < n_cols_base; col += block_size) { const uword X_offset = col * n_rows; op_htrans::block_worker(&Y[col + Y_offset], &X[row + X_offset], n_rows, n_cols, block_size, block_size); } const uword X_offset = n_cols_base * n_rows; op_htrans::block_worker(&Y[n_cols_base + Y_offset], &X[row + X_offset], n_rows, n_cols, block_size, n_cols_extra); } if(n_rows_extra == 0) { return; } const uword Y_offset = n_rows_base * n_cols; for(uword col = 0; col < n_cols_base; col += block_size) { const uword X_offset = col * n_rows; op_htrans::block_worker(&Y[col + Y_offset], &X[n_rows_base + X_offset], n_rows, n_cols, n_rows_extra, block_size); } const uword X_offset = n_cols_base * n_rows; op_htrans::block_worker(&Y[n_cols_base + Y_offset], &X[n_rows_base + X_offset], n_rows, n_cols, n_rows_extra, n_cols_extra); } template arma_hot inline void op_htrans::apply_mat_inplace(Mat& out, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); op_strans::apply_mat_inplace(out); } template arma_hot inline void op_htrans::apply_mat_inplace(Mat& out, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); const uword n_rows = out.n_rows; const uword n_cols = out.n_cols; if(n_rows == n_cols) { arma_extra_debug_print("doing in-place hermitian transpose of a square matrix"); for(uword col=0; col < n_cols; ++col) { eT* coldata = out.colptr(col); out.at(col,col) = std::conj( out.at(col,col) ); for(uword row=(col+1); row < n_rows; ++row) { const eT val1 = std::conj(coldata[row]); const eT val2 = std::conj(out.at(col,row)); out.at(col,row) = val1; coldata[row] = val2; } } } else { Mat tmp; op_htrans::apply_mat_noalias(tmp, out); out.steal_mem(tmp); } } template inline void op_htrans::apply_mat(Mat& out, const Mat& A, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); op_strans::apply_mat(out, A); } template inline void op_htrans::apply_mat(Mat& out, const Mat& A, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); if(&out != &A) { op_htrans::apply_mat_noalias(out, A); } else { op_htrans::apply_mat_inplace(out); } } template inline void op_htrans::apply_proxy(Mat& out, const Proxy& P) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); if( (resolves_to_vector::yes) && (Proxy::use_at == false) ) { out.set_size(n_cols, n_rows); eT* out_mem = out.memptr(); const uword n_elem = P.get_n_elem(); typename Proxy::ea_type Pea = P.get_ea(); for(uword i=0; i < n_elem; ++i) { out_mem[i] = std::conj(Pea[i]); } } else { out.set_size(n_cols, n_rows); eT* outptr = out.memptr(); for(uword k=0; k < n_rows; ++k) { for(uword j=0; j < n_cols; ++j) { (*outptr) = std::conj(P.at(k,j)); outptr++; } } } } template inline void op_htrans::apply_direct(Mat& out, const T1& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // allow detection of in-place transpose if(is_Mat::value || (arma_config::openmp && Proxy::use_mp)) { const unwrap U(X); op_htrans::apply_mat(out, U.M); } else { const Proxy P(X); const bool is_alias = P.is_alias(out); if(is_Mat::stored_type>::value) { const quasi_unwrap::stored_type> U(P.Q); if(is_alias) { Mat tmp; op_htrans::apply_mat_noalias(tmp, U.M); out.steal_mem(tmp); } else { op_htrans::apply_mat_noalias(out, U.M); } } else { if(is_alias) { Mat tmp; op_htrans::apply_proxy(tmp, P); out.steal_mem(tmp); } else { op_htrans::apply_proxy(out, P); } } } } template inline void op_htrans::apply(Mat& out, const Op& in, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); op_strans::apply_direct(out, in.m); } template inline void op_htrans::apply(Mat& out, const Op& in, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); op_htrans::apply_direct(out, in.m); } // // op_htrans2 template inline void op_htrans2::apply(Mat& out, const Op& in, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); op_strans::apply_direct(out, in.m); arrayops::inplace_mul(out.memptr(), in.aux, out.n_elem); } template inline void op_htrans2::apply(Mat& out, const Op& in, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); op_htrans::apply_direct(out, in.m); arrayops::inplace_mul(out.memptr(), in.aux, out.n_elem); } //! @} RcppArmadillo/inst/include/armadillo_bits/arma_static_check.hpp0000644000176200001440000000212514124060717024527 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup arma_static_check //! @{ #undef arma_static_check #define arma_static_check(condition, message) static_assert( !(condition), message ) #undef arma_type_check #define arma_type_check(condition) static_assert( !(condition), "error: type mismatch or unsupported type" ) //! @} RcppArmadillo/inst/include/armadillo_bits/fn_sort_index.hpp0000644000176200001440000000502314124060717023744 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_sort_index //! @{ template arma_warn_unused arma_inline const mtOp sort_index ( const Base& X ) { arma_extra_debug_sigprint(); return mtOp(X.get_ref(), uword(0), uword(0)); } template arma_warn_unused inline typename enable_if2 < ( (is_arma_type::value) && (is_same_type::value) ), const mtOp >::result sort_index ( const T1& X, const T2* sort_direction ) { arma_extra_debug_sigprint(); const char sig = (sort_direction != nullptr) ? sort_direction[0] : char(0); arma_debug_check( ((sig != 'a') && (sig != 'd')), "sort_index(): unknown sort direction" ); return mtOp(X, ((sig == 'a') ? uword(0) : uword(1)), uword(0)); } // template arma_warn_unused arma_inline const mtOp stable_sort_index ( const Base& X ) { arma_extra_debug_sigprint(); return mtOp(X.get_ref(), uword(0), uword(0)); } template arma_warn_unused inline typename enable_if2 < ( (is_arma_type::value) && (is_same_type::value) ), const mtOp >::result stable_sort_index ( const T1& X, const T2* sort_direction ) { arma_extra_debug_sigprint(); const char sig = (sort_direction != nullptr) ? sort_direction[0] : char(0); arma_debug_check( ((sig != 'a') && (sig != 'd')), "stable_sort_index(): unknown sort direction" ); return mtOp(X, ((sig == 'a') ? uword(0) : uword(1)), uword(0)); } //! @} RcppArmadillo/inst/include/armadillo_bits/constants_old.hpp0000644000176200001440000001450014124060717023755 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup constants_old //! @{ // DO NOT USE IN NEW CODE !!! // the Math and Phy classes are kept for compatibility with old code; // for new code, use the Datum class instead // eg. instead of math::pi(), use datum::pi template class Math { public: // the long lengths of the constants are for future support of "long double" // and any smart compiler that does high-precision computation at compile-time //! ratio of any circle's circumference to its diameter arma_deprecated static eT pi() { return eT(Datum::pi); } // use datum::pi instead //! base of the natural logarithm arma_deprecated static eT e() { return eT(Datum::e); } // use datum::e instead //! Euler's constant, aka Euler-Mascheroni constant arma_deprecated static eT euler() { return eT(Datum::euler); } // use datum::euler instead //! golden ratio arma_deprecated static eT gratio() { return eT(Datum::gratio); } // use datum::gratio instead //! square root of 2 arma_deprecated static eT sqrt2() { return eT(Datum::sqrt2); } // use datum::sqrt2 instead //! the difference between 1 and the least value greater than 1 that is representable arma_deprecated static eT eps() { return eT(Datum::eps); } // use datum::eps instead //! log of the minimum representable value arma_deprecated static eT log_min() { return eT(Datum::log_min); } // use datum::log_min instead //! log of the maximum representable value arma_deprecated static eT log_max() { return eT(Datum::log_max); } // use datum::log_max instead //! "not a number" arma_deprecated static eT nan() { return eT(Datum::nan); } // use datum::nan instead //! infinity arma_deprecated static eT inf() { return eT(Datum::inf); } // use datum::inf instead }; //! Physical constants taken from NIST 2010 CODATA values, and some from WolframAlpha (values provided as of 2009-06-23) //! http://physics.nist.gov/cuu/Constants //! http://www.wolframalpha.com //! See also http://en.wikipedia.org/wiki/Physical_constant template class Phy { public: //! atomic mass constant (in kg) arma_deprecated static eT m_u() { return eT(Datum::m_u); } //! Avogadro constant arma_deprecated static eT N_A() { return eT(Datum::N_A); } //! Boltzmann constant (in joules per kelvin) arma_deprecated static eT k() { return eT(Datum::k); } //! Boltzmann constant (in eV/K) arma_deprecated static eT k_evk() { return eT(Datum::k_evk); } //! Bohr radius (in meters) arma_deprecated static eT a_0() { return eT(Datum::a_0); } //! Bohr magneton arma_deprecated static eT mu_B() { return eT(Datum::mu_B); } //! characteristic impedance of vacuum (in ohms) arma_deprecated static eT Z_0() { return eT(Datum::Z_0); } //! conductance quantum (in siemens) arma_deprecated static eT G_0() { return eT(Datum::G_0); } //! Coulomb's constant (in meters per farad) arma_deprecated static eT k_e() { return eT(Datum::k_e); } //! electric constant (in farads per meter) arma_deprecated static eT eps_0() { return eT(Datum::eps_0); } //! electron mass (in kg) arma_deprecated static eT m_e() { return eT(Datum::m_e); } //! electron volt (in joules) arma_deprecated static eT eV() { return eT(Datum::eV); } //! elementary charge (in coulombs) arma_deprecated static eT e() { return eT(Datum::ec); } //! Faraday constant (in coulombs) arma_deprecated static eT F() { return eT(Datum::F); } //! fine-structure constant arma_deprecated static eT alpha() { return eT(Datum::alpha); } //! inverse fine-structure constant arma_deprecated static eT alpha_inv() { return eT(Datum::alpha_inv); } //! Josephson constant arma_deprecated static eT K_J() { return eT(Datum::K_J); } //! magnetic constant (in henries per meter) arma_deprecated static eT mu_0() { return eT(Datum::mu_0); } //! magnetic flux quantum (in webers) arma_deprecated static eT phi_0() { return eT(Datum::phi_0); } //! molar gas constant (in joules per mole kelvin) arma_deprecated static eT R() { return eT(Datum::R); } //! Newtonian constant of gravitation (in newton square meters per kilogram squared) arma_deprecated static eT G() { return eT(Datum::G); } //! Planck constant (in joule seconds) arma_deprecated static eT h() { return eT(Datum::h); } //! Planck constant over 2 pi, aka reduced Planck constant (in joule seconds) arma_deprecated static eT h_bar() { return eT(Datum::h_bar); } //! proton mass (in kg) arma_deprecated static eT m_p() { return eT(Datum::m_p); } //! Rydberg constant (in reciprocal meters) arma_deprecated static eT R_inf() { return eT(Datum::R_inf); } //! speed of light in vacuum (in meters per second) arma_deprecated static eT c_0() { return eT(Datum::c_0); } //! Stefan-Boltzmann constant arma_deprecated static eT sigma() { return eT(Datum::sigma); } //! von Klitzing constant (in ohms) arma_deprecated static eT R_k() { return eT(Datum::R_k); } //! Wien wavelength displacement law constant arma_deprecated static eT b() { return eT(Datum::b); } }; typedef Math fmath; typedef Math math; typedef Phy fphy; typedef Phy phy; //! @} RcppArmadillo/inst/include/armadillo_bits/op_vectorise_meat.hpp0000644000176200001440000002160314125053103024604 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_vectorise //! @{ template inline void op_vectorise_col::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); op_vectorise_col::apply_direct(out, in.m); } template inline void op_vectorise_col::apply_direct(Mat& out, const T1& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // allow detection of in-place operation if(is_Mat::value || (arma_config::openmp && Proxy::use_mp)) { const unwrap U(expr); if(&out == &(U.M)) { // output matrix is the same as the input matrix out.set_size(out.n_elem, 1); // set_size() doesn't destroy data as long as the number of elements in the matrix remains the same } else { out.set_size(U.M.n_elem, 1); arrayops::copy(out.memptr(), U.M.memptr(), U.M.n_elem); } } else if(is_subview::value) { const subview& sv = reinterpret_cast< const subview& >(expr); if(&out == &(sv.m)) { Mat tmp; op_vectorise_col::apply_subview(tmp, sv); out.steal_mem(tmp); } else { op_vectorise_col::apply_subview(out, sv); } } else { const Proxy P(expr); const bool is_alias = P.is_alias(out); if(is_Mat::stored_type>::value) { const quasi_unwrap::stored_type> U(P.Q); if(is_alias) { Mat tmp(U.M.memptr(), U.M.n_elem, 1); out.steal_mem(tmp); } else { out.set_size(U.M.n_elem, 1); arrayops::copy(out.memptr(), U.M.memptr(), U.M.n_elem); } } else { if(is_alias) { Mat tmp; op_vectorise_col::apply_proxy(tmp, P); out.steal_mem(tmp); } else { op_vectorise_col::apply_proxy(out, P); } } } } template inline void op_vectorise_col::apply_subview(Mat& out, const subview& sv) { arma_extra_debug_sigprint(); const uword sv_n_rows = sv.n_rows; const uword sv_n_cols = sv.n_cols; out.set_size(sv.n_elem, 1); eT* out_mem = out.memptr(); for(uword col=0; col < sv_n_cols; ++col) { arrayops::copy(out_mem, sv.colptr(col), sv_n_rows); out_mem += sv_n_rows; } } template inline void op_vectorise_col::apply_proxy(Mat& out, const Proxy& P) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword N = P.get_n_elem(); out.set_size(N, 1); eT* outmem = out.memptr(); if(Proxy::use_at == false) { // TODO: add handling of aligned access ? typename Proxy::ea_type A = P.get_ea(); uword i,j; for(i=0, j=1; j < N; i+=2, j+=2) { const eT tmp_i = A[i]; const eT tmp_j = A[j]; outmem[i] = tmp_i; outmem[j] = tmp_j; } if(i < N) { outmem[i] = A[i]; } } else { const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); if(n_rows == 1) { for(uword i=0; i < n_cols; ++i) { outmem[i] = P.at(0,i); } } else { for(uword col=0; col < n_cols; ++col) for(uword row=0; row < n_rows; ++row) { *outmem = P.at(row,col); outmem++; } } } } template inline void op_vectorise_row::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); op_vectorise_row::apply_direct(out, in.m); } template inline void op_vectorise_row::apply_direct(Mat& out, const T1& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const Proxy P(expr); if(P.is_alias(out)) { Mat tmp; op_vectorise_row::apply_proxy(tmp, P); out.steal_mem(tmp); } else { op_vectorise_row::apply_proxy(out, P); } } template inline void op_vectorise_row::apply_proxy(Mat& out, const Proxy& P) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); const uword n_elem = P.get_n_elem(); out.set_size(1, n_elem); eT* outmem = out.memptr(); if(n_cols == 1) { if(is_Mat::stored_type>::value) { const unwrap::stored_type> tmp(P.Q); arrayops::copy(out.memptr(), tmp.M.memptr(), n_elem); } else { for(uword i=0; i < n_elem; ++i) { outmem[i] = P.at(i,0); } } } else { for(uword row=0; row < n_rows; ++row) { uword i,j; for(i=0, j=1; j < n_cols; i+=2, j+=2) { const eT tmp_i = P.at(row,i); const eT tmp_j = P.at(row,j); *outmem = tmp_i; outmem++; *outmem = tmp_j; outmem++; } if(i < n_cols) { *outmem = P.at(row,i); outmem++; } } } } template inline void op_vectorise_all::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); const uword dim = in.aux_uword_a; if(dim == 0) { op_vectorise_col::apply_direct(out, in.m); } else { op_vectorise_row::apply_direct(out, in.m); } } // template inline void op_vectorise_cube_col::apply(Mat& out, const CubeToMatOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(is_same_type< T1, subview_cube >::yes) { op_vectorise_cube_col::apply_subview(out, reinterpret_cast< const subview_cube& >(in.m)); } else { if(is_Cube::value || (arma_config::openmp && ProxyCube::use_mp)) { op_vectorise_cube_col::apply_unwrap(out, in.m); } else { op_vectorise_cube_col::apply_proxy(out, in.m); } } } template inline void op_vectorise_cube_col::apply_subview(Mat& out, const subview_cube& sv) { arma_extra_debug_sigprint(); const uword sv_nr = sv.n_rows; const uword sv_nc = sv.n_cols; const uword sv_ns = sv.n_slices; out.set_size(sv.n_elem, 1); eT* out_mem = out.memptr(); for(uword s=0; s < sv_ns; ++s) for(uword c=0; c < sv_nc; ++c) { arrayops::copy(out_mem, sv.slice_colptr(s,c), sv_nr); out_mem += sv_nr; } } template inline void op_vectorise_cube_col::apply_unwrap(Mat& out, const T1& expr) { arma_extra_debug_sigprint(); const unwrap_cube U(expr); out.set_size(U.M.n_elem, 1); arrayops::copy(out.memptr(), U.M.memptr(), U.M.n_elem); } template inline void op_vectorise_cube_col::apply_proxy(Mat& out, const T1& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const ProxyCube P(expr); if(is_Cube::stored_type>::value) { op_vectorise_cube_col::apply_unwrap(out, P.Q); return; } const uword N = P.get_n_elem(); out.set_size(N, 1); eT* outmem = out.memptr(); if(ProxyCube::use_at == false) { typename ProxyCube::ea_type A = P.get_ea(); uword i,j; for(i=0, j=1; j < N; i+=2, j+=2) { const eT tmp_i = A[i]; const eT tmp_j = A[j]; outmem[i] = tmp_i; outmem[j] = tmp_j; } if(i < N) { outmem[i] = A[i]; } } else { const uword nr = P.get_n_rows(); const uword nc = P.get_n_cols(); const uword ns = P.get_n_slices(); for(uword s=0; s < ns; ++s) for(uword c=0; c < nc; ++c) for(uword r=0; r < nr; ++r) { *outmem = P.at(r,c,s); outmem++; } } } //! @} RcppArmadillo/inst/include/armadillo_bits/arma_forward.hpp0000644000176200001440000003050614124060717023553 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ using std::cout; using std::cerr; using std::endl; using std::ios; using std::size_t; template struct Base; template struct BaseCube; template class Mat; template class Col; template class Row; template class Cube; template class xvec_htrans; template class field; template class xtrans_mat; template class subview; template class subview_col; template class subview_cols; template class subview_row; template class subview_row_strans; template class subview_row_htrans; template class subview_cube; template class subview_field; template class SpValProxy; template class SpMat; template class SpCol; template class SpRow; template class SpSubview; template class SpSubview_col; template class SpSubview_row; template class diagview; template class spdiagview; template class MapMat; template class MapMat_val; template class SpMat_MapMat_val; template class SpSubview_MapMat_val; template class subview_elem1; template class subview_elem2; template class subview_each1; template class subview_each2; template class subview_cube_each1; template class subview_cube_each2; template class subview_cube_slices; template class SpSubview_col_list; class SizeMat; class SizeCube; class arma_empty_class {}; class diskio; class op_strans; class op_htrans; class op_htrans2; class op_inv; class op_inv_sympd; class op_diagmat; class op_trimat; class op_vectorise_row; class op_vectorise_col; class glue_times; class glue_times_diag; class glue_rel_lt; class glue_rel_gt; class glue_rel_lteq; class glue_rel_gteq; class glue_rel_eq; class glue_rel_noteq; class glue_rel_and; class glue_rel_or; class op_rel_lt_pre; class op_rel_lt_post; class op_rel_gt_pre; class op_rel_gt_post; class op_rel_lteq_pre; class op_rel_lteq_post; class op_rel_gteq_pre; class op_rel_gteq_post; class op_rel_eq; class op_rel_noteq; class gen_eye; class gen_ones; class gen_zeros; class gen_randu; class gen_randn; class spop_strans; class spop_htrans; class spop_vectorise_row; class spop_vectorise_col; class spglue_plus; class spglue_minus; class spglue_schur; class spglue_times; class spglue_max; class spglue_min; class spglue_rel_lt; class spglue_rel_gt; class op_internal_equ; class op_internal_plus; class op_internal_minus; class op_internal_schur; class op_internal_div; struct traits_op_default { template struct traits { static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; }; }; struct traits_op_xvec { template struct traits { static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = true; }; }; struct traits_op_col { template struct traits { static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; }; }; struct traits_op_row { template struct traits { static constexpr bool is_row = true; static constexpr bool is_col = false; static constexpr bool is_xvec = false; }; }; struct traits_op_passthru { template struct traits { static constexpr bool is_row = T1::is_row; static constexpr bool is_col = T1::is_col; static constexpr bool is_xvec = T1::is_xvec; }; }; struct traits_glue_default { template struct traits { static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; }; }; struct traits_glue_or { template struct traits { static constexpr bool is_row = (T1::is_row || T2::is_row ); static constexpr bool is_col = (T1::is_col || T2::is_col ); static constexpr bool is_xvec = (T1::is_xvec || T2::is_xvec); }; }; template class gemm; template class gemv; template< typename eT, typename gen_type> class Gen; template< typename T1, typename op_type> class Op; template< typename T1, typename eop_type> class eOp; template< typename T1, typename op_type> class SpToDOp; template< typename T1, typename op_type> class CubeToMatOp; template class mtOp; template< typename T1, typename T2, typename glue_type> class Glue; template< typename T1, typename T2, typename eglue_type> class eGlue; template class mtGlue; template< typename eT, typename gen_type> class GenCube; template< typename T1, typename op_type> class OpCube; template< typename T1, typename eop_type> class eOpCube; template class mtOpCube; template< typename T1, typename T2, typename glue_type> class GlueCube; template< typename T1, typename T2, typename eglue_type> class eGlueCube; template class mtGlueCube; template struct Proxy; template struct ProxyCube; template class diagmat_proxy; template struct unwrap; template struct quasi_unwrap; template struct unwrap_cube; template struct unwrap_spmat; struct state_type { #if defined(ARMA_USE_OPENMP) int state; #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) std::atomic state; #else int state; #endif arma_inline state_type() : state(int(0)) {} // openmp: "omp atomic" does an implicit flush on the affected variable // C++11: std::atomic<>::load() and std::atomic<>::store() use std::memory_order_seq_cst by default, which has an implied fence arma_inline operator int () const { int out; #if defined(ARMA_USE_OPENMP) #pragma omp atomic read out = state; #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) out = state.load(); #else out = state; #endif return out; } arma_inline void operator= (const int in_state) { #if defined(ARMA_USE_OPENMP) #pragma omp atomic write state = in_state; #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) state.store(in_state); #else state = in_state; #endif } }; template< typename T1, typename spop_type> class SpOp; template class mtSpOp; template< typename T1, typename T2, typename spglue_type> class SpGlue; template class mtSpGlue; template struct SpProxy; struct arma_vec_indicator {}; struct arma_fixed_indicator {}; struct arma_reserve_indicator {}; struct arma_layout_indicator {}; template struct arma_initmode_indicator {}; struct arma_zeros_indicator : public arma_initmode_indicator {}; struct arma_nozeros_indicator : public arma_initmode_indicator {}; //! \addtogroup injector //! @{ template struct injector_end_of_row {}; static const injector_end_of_row<> endr = injector_end_of_row<>(); //!< endr indicates "end of row" when using the << operator; //!< similar conceptual meaning to std::endl //! @} //! \addtogroup diskio //! @{ enum struct file_type : unsigned int { file_type_unknown, auto_detect, //!< attempt to automatically detect the file type raw_ascii, //!< raw text (ASCII), without a header arma_ascii, //!< Armadillo text format, with a header specifying matrix type and size csv_ascii, //!< comma separated values (CSV), without a header raw_binary, //!< raw binary format (machine dependent), without a header arma_binary, //!< Armadillo binary format (machine dependent), with a header specifying matrix type and size pgm_binary, //!< Portable Grey Map (greyscale image) ppm_binary, //!< Portable Pixel Map (colour image), used by the field and cube classes hdf5_binary, //!< HDF5: open binary format, not specific to Armadillo, which can store arbitrary data hdf5_binary_trans, //!< [NOTE: DO NOT USE - deprecated] as per hdf5_binary, but save/load the data with columns transposed to rows coord_ascii, //!< simple co-ordinate format for sparse matrices (indices start at zero) ssv_ascii, //!< similar to csv_ascii; uses semicolon (;) instead of comma (,) as the separator }; static constexpr file_type file_type_unknown = file_type::file_type_unknown; static constexpr file_type auto_detect = file_type::auto_detect; static constexpr file_type raw_ascii = file_type::raw_ascii; static constexpr file_type arma_ascii = file_type::arma_ascii; static constexpr file_type csv_ascii = file_type::csv_ascii; static constexpr file_type raw_binary = file_type::raw_binary; static constexpr file_type arma_binary = file_type::arma_binary; static constexpr file_type pgm_binary = file_type::pgm_binary; static constexpr file_type ppm_binary = file_type::ppm_binary; static constexpr file_type hdf5_binary = file_type::hdf5_binary; static constexpr file_type hdf5_binary_trans = file_type::hdf5_binary_trans; static constexpr file_type coord_ascii = file_type::coord_ascii; static constexpr file_type ssv_ascii = file_type::ssv_ascii; struct hdf5_name; struct csv_name; //! @} //! \addtogroup fn_spsolve //! @{ struct spsolve_opts_base { const unsigned int id; inline spsolve_opts_base(const unsigned int in_id) : id(in_id) {} }; struct spsolve_opts_none : public spsolve_opts_base { inline spsolve_opts_none() : spsolve_opts_base(0) {} }; struct superlu_opts : public spsolve_opts_base { typedef enum {NATURAL, MMD_ATA, MMD_AT_PLUS_A, COLAMD} permutation_type; typedef enum {REF_NONE, REF_SINGLE, REF_DOUBLE, REF_EXTRA} refine_type; bool allow_ugly; bool equilibrate; bool symmetric; double pivot_thresh; permutation_type permutation; refine_type refine; inline superlu_opts() : spsolve_opts_base(1) { allow_ugly = false; equilibrate = false; symmetric = false; pivot_thresh = 1.0; permutation = COLAMD; refine = REF_NONE; } }; //! @} //! \ingroup fn_eigs_sym fs_eigs_gen //! @{ struct eigs_opts { double tol; // tolerance unsigned int maxiter; // max iterations unsigned int subdim; // subspace dimension inline eigs_opts() { tol = 0.0; maxiter = 1000; subdim = 0; } }; //! @} RcppArmadillo/inst/include/armadillo_bits/traits.hpp0000644000176200001440000007013314124060717022415 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup traits //! @{ template struct get_pod_type { typedef T1 result; }; template struct get_pod_type< std::complex > { typedef T2 result; }; template struct is_Mat_fixed_only { typedef char yes[1]; typedef char no[2]; template static yes& check(typename X::Mat_fixed_type*); template static no& check(...); static constexpr bool value = ( sizeof(check(0)) == sizeof(yes) ); }; template struct is_Row_fixed_only { typedef char yes[1]; typedef char no[2]; template static yes& check(typename X::Row_fixed_type*); template static no& check(...); static constexpr bool value = ( sizeof(check(0)) == sizeof(yes) ); }; template struct is_Col_fixed_only { typedef char yes[1]; typedef char no[2]; template static yes& check(typename X::Col_fixed_type*); template static no& check(...); static constexpr bool value = ( sizeof(check(0)) == sizeof(yes) ); }; template struct is_Mat_fixed { static constexpr bool value = ( is_Mat_fixed_only::value || is_Row_fixed_only::value || is_Col_fixed_only::value ); }; template struct is_Mat_only { static constexpr bool value = is_Mat_fixed_only::value; }; template struct is_Mat_only< Mat > { static constexpr bool value = true; }; template struct is_Mat_only< const Mat > { static constexpr bool value = true; }; template struct is_Mat { static constexpr bool value = ( is_Mat_fixed_only::value || is_Row_fixed_only::value || is_Col_fixed_only::value ); }; template struct is_Mat< Mat > { static constexpr bool value = true; }; template struct is_Mat< const Mat > { static constexpr bool value = true; }; template struct is_Mat< Row > { static constexpr bool value = true; }; template struct is_Mat< const Row > { static constexpr bool value = true; }; template struct is_Mat< Col > { static constexpr bool value = true; }; template struct is_Mat< const Col > { static constexpr bool value = true; }; template struct is_Row { static constexpr bool value = is_Row_fixed_only::value; }; template struct is_Row< Row > { static constexpr bool value = true; }; template struct is_Row< const Row > { static constexpr bool value = true; }; template struct is_Col { static constexpr bool value = is_Col_fixed_only::value; }; template struct is_Col< Col > { static constexpr bool value = true; }; template struct is_Col< const Col > { static constexpr bool value = true; }; template struct is_diagview { static constexpr bool value = false; }; template struct is_diagview< diagview > { static constexpr bool value = true; }; template struct is_diagview< const diagview > { static constexpr bool value = true; }; template struct is_subview { static constexpr bool value = false; }; template struct is_subview< subview > { static constexpr bool value = true; }; template struct is_subview< const subview > { static constexpr bool value = true; }; template struct is_subview_row { static constexpr bool value = false; }; template struct is_subview_row< subview_row > { static constexpr bool value = true; }; template struct is_subview_row< const subview_row > { static constexpr bool value = true; }; template struct is_subview_col { static constexpr bool value = false; }; template struct is_subview_col< subview_col > { static constexpr bool value = true; }; template struct is_subview_col< const subview_col > { static constexpr bool value = true; }; template struct is_subview_cols { static constexpr bool value = false; }; template struct is_subview_cols< subview_cols > { static constexpr bool value = true; }; template struct is_subview_cols< const subview_cols > { static constexpr bool value = true; }; template struct is_subview_elem1 { static constexpr bool value = false; }; template struct is_subview_elem1< subview_elem1 > { static constexpr bool value = true; }; template struct is_subview_elem1< const subview_elem1 > { static constexpr bool value = true; }; template struct is_subview_elem2 { static constexpr bool value = false; }; template struct is_subview_elem2< subview_elem2 > { static constexpr bool value = true; }; template struct is_subview_elem2< const subview_elem2 > { static constexpr bool value = true; }; // // // template struct is_Cube { static constexpr bool value = false; }; template struct is_Cube< Cube > { static constexpr bool value = true; }; template struct is_Cube< const Cube > { static constexpr bool value = true; }; template struct is_subview_cube { static constexpr bool value = false; }; template struct is_subview_cube< subview_cube > { static constexpr bool value = true; }; template struct is_subview_cube< const subview_cube > { static constexpr bool value = true; }; template struct is_subview_cube_slices { static constexpr bool value = false; }; template struct is_subview_cube_slices< subview_cube_slices > { static constexpr bool value = true; }; template struct is_subview_cube_slices< const subview_cube_slices > { static constexpr bool value = true; }; // // // template struct is_Gen { static constexpr bool value = false; }; template struct is_Gen< Gen > { static constexpr bool value = true; }; template struct is_Gen< const Gen > { static constexpr bool value = true; }; template struct is_Op { static constexpr bool value = false; }; template struct is_Op< Op > { static constexpr bool value = true; }; template struct is_Op< const Op > { static constexpr bool value = true; }; template struct is_CubeToMatOp { static constexpr bool value = false; }; template struct is_CubeToMatOp< CubeToMatOp > { static constexpr bool value = true; }; template struct is_CubeToMatOp< const CubeToMatOp > { static constexpr bool value = true; }; template struct is_SpToDOp { static constexpr bool value = false; }; template struct is_SpToDOp< SpToDOp > { static constexpr bool value = true; }; template struct is_SpToDOp< const SpToDOp > { static constexpr bool value = true; }; template struct is_eOp { static constexpr bool value = false; }; template struct is_eOp< eOp > { static constexpr bool value = true; }; template struct is_eOp< const eOp > { static constexpr bool value = true; }; template struct is_mtOp { static constexpr bool value = false; }; template struct is_mtOp< mtOp > { static constexpr bool value = true; }; template struct is_mtOp< const mtOp > { static constexpr bool value = true; }; template struct is_Glue { static constexpr bool value = false; }; template struct is_Glue< Glue > { static constexpr bool value = true; }; template struct is_Glue< const Glue > { static constexpr bool value = true; }; template struct is_eGlue { static constexpr bool value = false; }; template struct is_eGlue< eGlue > { static constexpr bool value = true; }; template struct is_eGlue< const eGlue > { static constexpr bool value = true; }; template struct is_mtGlue { static constexpr bool value = false; }; template struct is_mtGlue< mtGlue > { static constexpr bool value = true; }; template struct is_mtGlue< const mtGlue > { static constexpr bool value = true; }; // // template struct is_glue_times { static constexpr bool value = false; }; template struct is_glue_times< Glue > { static constexpr bool value = true; }; template struct is_glue_times< const Glue > { static constexpr bool value = true; }; template struct is_glue_times_diag { static constexpr bool value = false; }; template struct is_glue_times_diag< Glue > { static constexpr bool value = true; }; template struct is_glue_times_diag< const Glue > { static constexpr bool value = true; }; template struct is_op_diagmat { static constexpr bool value = false; }; template struct is_op_diagmat< Op > { static constexpr bool value = true; }; template struct is_op_diagmat< const Op > { static constexpr bool value = true; }; // // template struct is_Mat_trans { static constexpr bool value = false; }; template struct is_Mat_trans< Op > { static constexpr bool value = is_Mat::value; }; template struct is_Mat_trans< Op > { static constexpr bool value = is_Mat::value; }; // // template struct is_GenCube { static constexpr bool value = false; }; template struct is_GenCube< GenCube > { static constexpr bool value = true; }; template struct is_OpCube { static constexpr bool value = false; }; template struct is_OpCube< OpCube > { static constexpr bool value = true; }; template struct is_eOpCube { static constexpr bool value = false; }; template struct is_eOpCube< eOpCube > { static constexpr bool value = true; }; template struct is_mtOpCube { static constexpr bool value = false; }; template struct is_mtOpCube< mtOpCube > { static constexpr bool value = true; }; template struct is_GlueCube { static constexpr bool value = false; }; template struct is_GlueCube< GlueCube > { static constexpr bool value = true; }; template struct is_eGlueCube { static constexpr bool value = false; }; template struct is_eGlueCube< eGlueCube > { static constexpr bool value = true; }; template struct is_mtGlueCube { static constexpr bool value = false; }; template struct is_mtGlueCube< mtGlueCube > { static constexpr bool value = true; }; // // // template struct is_arma_type2 { static constexpr bool value = is_Mat::value || is_Gen::value || is_Op::value || is_CubeToMatOp::value || is_SpToDOp::value || is_Glue::value || is_eOp::value || is_eGlue::value || is_mtOp::value || is_mtGlue::value || is_diagview::value || is_subview::value || is_subview_row::value || is_subview_col::value || is_subview_cols::value || is_subview_elem1::value || is_subview_elem2::value ; }; // due to rather baroque C++ rules for proving constant expressions, // certain compilers may get confused with the combination of conditional inheritance, nested classes and the shenanigans in is_Mat_fixed_only. // below we explicitly ensure the type is forced to be const, which seems to eliminate the confusion. template struct is_arma_type { static constexpr bool value = is_arma_type2::value; }; template struct is_arma_cube_type { static constexpr bool value = is_Cube::value || is_GenCube::value || is_OpCube::value || is_eOpCube::value || is_mtOpCube::value || is_GlueCube::value || is_eGlueCube::value || is_mtGlueCube::value || is_subview_cube::value || is_subview_cube_slices::value ; }; // // // template struct is_SpMat { static constexpr bool value = false; }; template struct is_SpMat< SpMat > { static constexpr bool value = true; }; template struct is_SpMat< SpCol > { static constexpr bool value = true; }; template struct is_SpMat< SpRow > { static constexpr bool value = true; }; template struct is_SpRow { static constexpr bool value = false; }; template struct is_SpRow< SpRow > { static constexpr bool value = true; }; template struct is_SpCol { static constexpr bool value = false; }; template struct is_SpCol< SpCol > { static constexpr bool value = true; }; template struct is_SpSubview { static constexpr bool value = false; }; template struct is_SpSubview< SpSubview > { static constexpr bool value = true; }; template struct is_SpSubview_col { static constexpr bool value = false; }; template struct is_SpSubview_col< SpSubview_col > { static constexpr bool value = true; }; template struct is_SpSubview_col_list { static constexpr bool value = false; }; template struct is_SpSubview_col_list< SpSubview_col_list > { static constexpr bool value = true; }; template struct is_SpSubview_row { static constexpr bool value = false; }; template struct is_SpSubview_row< SpSubview_row > { static constexpr bool value = true; }; template struct is_spdiagview { static constexpr bool value = false; }; template struct is_spdiagview< spdiagview > { static constexpr bool value = true; }; template struct is_SpOp { static constexpr bool value = false; }; template struct is_SpOp< SpOp > { static constexpr bool value = true; }; template struct is_SpGlue { static constexpr bool value = false; }; template struct is_SpGlue< SpGlue > { static constexpr bool value = true; }; template struct is_mtSpOp { static constexpr bool value = false; }; template struct is_mtSpOp< mtSpOp > { static constexpr bool value = true; }; template struct is_mtSpGlue { static constexpr bool value = false; }; template struct is_mtSpGlue< mtSpGlue > { static constexpr bool value = true; }; template struct is_arma_sparse_type { static constexpr bool value = is_SpMat::value || is_SpSubview::value || is_SpSubview_col::value || is_SpSubview_col_list::value || is_SpSubview_row::value || is_spdiagview::value || is_SpOp::value || is_SpGlue::value || is_mtSpOp::value || is_mtSpGlue::value ; }; // // // template struct is_same_type { static constexpr bool value = false; static constexpr bool yes = false; static constexpr bool no = true; }; template struct is_same_type { static constexpr bool value = true; static constexpr bool yes = true; static constexpr bool no = false; }; // // // template struct is_u8 { static constexpr bool value = false; }; template<> struct is_u8 { static constexpr bool value = true; }; template struct is_s8 { static constexpr bool value = false; }; template<> struct is_s8 { static constexpr bool value = true; }; template struct is_u16 { static constexpr bool value = false; }; template<> struct is_u16 { static constexpr bool value = true; }; template struct is_s16 { static constexpr bool value = false; }; template<> struct is_s16 { static constexpr bool value = true; }; template struct is_u32 { static constexpr bool value = false; }; template<> struct is_u32 { static constexpr bool value = true; }; template struct is_s32 { static constexpr bool value = false; }; template<> struct is_s32 { static constexpr bool value = true; }; template struct is_u64 { static constexpr bool value = false; }; template<> struct is_u64 { static constexpr bool value = true; }; template struct is_s64 { static constexpr bool value = false; }; template<> struct is_s64 { static constexpr bool value = true; }; template struct is_ulng_t { static constexpr bool value = false; }; template<> struct is_ulng_t { static constexpr bool value = true; }; template struct is_slng_t { static constexpr bool value = false; }; template<> struct is_slng_t { static constexpr bool value = true; }; template struct is_ulng_t_32 { static constexpr bool value = false; }; template<> struct is_ulng_t_32 { static constexpr bool value = (sizeof(ulng_t) == 4); }; template struct is_slng_t_32 { static constexpr bool value = false; }; template<> struct is_slng_t_32 { static constexpr bool value = (sizeof(slng_t) == 4); }; template struct is_ulng_t_64 { static constexpr bool value = false; }; template<> struct is_ulng_t_64 { static constexpr bool value = (sizeof(ulng_t) == 8); }; template struct is_slng_t_64 { static constexpr bool value = false; }; template<> struct is_slng_t_64 { static constexpr bool value = (sizeof(slng_t) == 8); }; template struct is_uword { static constexpr bool value = false; }; template<> struct is_uword { static constexpr bool value = true; }; template struct is_sword { static constexpr bool value = false; }; template<> struct is_sword { static constexpr bool value = true; }; template struct is_float { static constexpr bool value = false; }; template<> struct is_float { static constexpr bool value = true; }; template struct is_double { static constexpr bool value = false; }; template<> struct is_double { static constexpr bool value = true; }; template struct is_real { static constexpr bool value = false; static constexpr bool yes = false; static constexpr bool no = true; }; template<> struct is_real { static constexpr bool value = true; static constexpr bool yes = true; static constexpr bool no = false; }; template<> struct is_real { static constexpr bool value = true; static constexpr bool yes = true; static constexpr bool no = false; }; template struct is_cx { static constexpr bool value = false; static constexpr bool yes = false; static constexpr bool no = true; }; // template<> template struct is_cx< std::complex > { static constexpr bool value = true; static constexpr bool yes = true; static constexpr bool no = false; }; template struct is_cx_float { static constexpr bool value = false; static constexpr bool yes = false; static constexpr bool no = true; }; template<> struct is_cx_float< std::complex > { static constexpr bool value = true; static constexpr bool yes = true; static constexpr bool no = false; }; template struct is_cx_double { static constexpr bool value = false; static constexpr bool yes = false; static constexpr bool no = true; }; template<> struct is_cx_double< std::complex > { static constexpr bool value = true; static constexpr bool yes = true; static constexpr bool no = false; }; template struct is_supported_elem_type { static constexpr bool value = \ is_u8::value || is_s8::value || is_u16::value || is_s16::value || is_u32::value || is_s32::value || is_u64::value || is_s64::value || is_ulng_t::value || is_slng_t::value || is_float::value || is_double::value || is_cx_float::value || is_cx_double::value; }; template struct is_supported_blas_type { static constexpr bool value = \ is_float::value || is_double::value || is_cx_float::value || is_cx_double::value; }; template struct is_signed { static constexpr bool value = true; }; template<> struct is_signed { static constexpr bool value = false; }; template<> struct is_signed { static constexpr bool value = false; }; template<> struct is_signed { static constexpr bool value = false; }; template<> struct is_signed { static constexpr bool value = false; }; template<> struct is_signed { static constexpr bool value = false; }; template struct is_non_integral { static constexpr bool value = false; }; template<> struct is_non_integral< float > { static constexpr bool value = true; }; template<> struct is_non_integral< double > { static constexpr bool value = true; }; template<> struct is_non_integral< std::complex > { static constexpr bool value = true; }; template<> struct is_non_integral< std::complex > { static constexpr bool value = true; }; // class arma_junk_class; template struct force_different_type { typedef T1 T1_result; typedef T2 T2_result; }; template struct force_different_type { typedef T1 T1_result; typedef arma_junk_class T2_result; }; // template struct resolves_to_vector_default { static constexpr bool value = false; static constexpr bool yes = false; static constexpr bool no = true; }; template struct resolves_to_vector_test { static constexpr bool value = (T1::is_col || T1::is_row || T1::is_xvec); static constexpr bool yes = (T1::is_col || T1::is_row || T1::is_xvec); static constexpr bool no = ((T1::is_col || T1::is_row || T1::is_xvec) == false); }; template struct resolves_to_vector_redirect {}; template struct resolves_to_vector_redirect { typedef resolves_to_vector_default result; }; template struct resolves_to_vector_redirect { typedef resolves_to_vector_test result; }; template struct resolves_to_vector : public resolves_to_vector_redirect::value>::result {}; template struct resolves_to_sparse_vector : public resolves_to_vector_redirect::value>::result {}; // template struct resolves_to_rowvector_default { static constexpr bool value = false; }; template struct resolves_to_rowvector_test { static constexpr bool value = T1::is_row; }; template struct resolves_to_rowvector_redirect {}; template struct resolves_to_rowvector_redirect { typedef resolves_to_rowvector_default result; }; template struct resolves_to_rowvector_redirect { typedef resolves_to_rowvector_test result; }; template struct resolves_to_rowvector : public resolves_to_rowvector_redirect::value>::result {}; // template struct resolves_to_colvector_default { static constexpr bool value = false; }; template struct resolves_to_colvector_test { static constexpr bool value = T1::is_col; }; template struct resolves_to_colvector_redirect {}; template struct resolves_to_colvector_redirect { typedef resolves_to_colvector_default result; }; template struct resolves_to_colvector_redirect { typedef resolves_to_colvector_test result; }; template struct resolves_to_colvector : public resolves_to_colvector_redirect::value>::result {}; template struct is_outer_product { static constexpr bool value = false; }; template struct is_outer_product< Glue > { static constexpr bool value = (resolves_to_colvector::value && resolves_to_rowvector::value); }; template struct has_op_inv { static constexpr bool value = false; }; template struct has_op_inv< Op > { static constexpr bool value = true; }; template struct has_op_inv< Glue, T2, glue_times> > { static constexpr bool value = true; }; template struct has_op_inv< Glue, glue_times> > { static constexpr bool value = true; }; template struct has_op_inv_sympd { static constexpr bool value = false; }; template struct has_op_inv_sympd< Op > { static constexpr bool value = true; }; template struct has_op_inv_sympd< Glue, T2, glue_times> > { static constexpr bool value = true; }; template struct has_op_inv_sympd< Glue, glue_times> > { static constexpr bool value = true; }; template struct has_nested_op_traits { typedef char yes[1]; typedef char no[2]; template static yes& check(typename X::template traits*); template static no& check(...); static constexpr bool value = ( sizeof(check(0)) == sizeof(yes) ); }; template struct has_nested_glue_traits { typedef char yes[1]; typedef char no[2]; template static yes& check(typename X::template traits*); template static no& check(...); static constexpr bool value = ( sizeof(check(0)) == sizeof(yes) ); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_diagvec.hpp0000644000176200001440000000332414124060717023172 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_diagvec //! @{ //! extract main diagonal from matrix template arma_warn_unused arma_inline const Op diagvec(const Base& X) { arma_extra_debug_sigprint(); return Op(X.get_ref()); } //! extract arbitrary diagonal from matrix template arma_warn_unused arma_inline const Op diagvec(const Base& X, const sword diag_id) { arma_extra_debug_sigprint(); return Op(X.get_ref(), ((diag_id < 0) ? -diag_id : diag_id), ((diag_id < 0) ? 1 : 0) ); } template arma_warn_unused arma_inline const SpOp diagvec(const SpBase& X, const sword diag_id = 0) { arma_extra_debug_sigprint(); return SpOp(X.get_ref(), ((diag_id < 0) ? -diag_id : diag_id), ((diag_id < 0) ? 1 : 0) ); } //! @} RcppArmadillo/inst/include/armadillo_bits/op_expmat_bones.hpp0000644000176200001440000000273514124060717024274 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_expmat //! @{ class op_expmat : public traits_op_default { public: template inline static void apply(Mat& out, const Op& expr); template inline static bool apply_direct(Mat& out, const Base& X); }; class op_expmat_sym : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); template inline static bool apply_direct(Mat& out, const Base& expr); }; //! @} RcppArmadillo/inst/include/armadillo_bits/translate_lapack.hpp0000644000176200001440000024620114124060717024420 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #ifdef ARMA_USE_LAPACK //! \namespace lapack namespace for LAPACK functions namespace lapack { template inline void getrf(blas_int* m, blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); if( is_float::value) { typedef float T; arma_fortran(arma_sgetrf)(m, n, (T*)a, lda, ipiv, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgetrf)(m, n, (T*)a, lda, ipiv, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgetrf)(m, n, (T*)a, lda, ipiv, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgetrf)(m, n, (T*)a, lda, ipiv, info); } } template inline void getrs(char* trans, blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, blas_int* ipiv, eT* b, blas_int* ldb, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sgetrs)(trans, n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info, 1); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgetrs)(trans, n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info, 1); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgetrs)(trans, n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info, 1); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgetrs)(trans, n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sgetrs)(trans, n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgetrs)(trans, n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgetrs)(trans, n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgetrs)(trans, n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); } #endif } template inline void getri(blas_int* n, eT* a, blas_int* lda, blas_int* ipiv, eT* work, blas_int* lwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); if( is_float::value) { typedef float T; arma_fortran(arma_sgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgetri)(n, (T*)a, lda, ipiv, (T*)work, lwork, info); } } template inline void trtri(char* uplo, char* diag, blas_int* n, eT* a, blas_int* lda, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_strtri)(uplo, diag, n, (T*)a, lda, info, 1, 1); } else if( is_double::value) { typedef double T; arma_fortran(arma_dtrtri)(uplo, diag, n, (T*)a, lda, info, 1, 1); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_ctrtri)(uplo, diag, n, (T*)a, lda, info, 1, 1); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_ztrtri)(uplo, diag, n, (T*)a, lda, info, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_strtri)(uplo, diag, n, (T*)a, lda, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dtrtri)(uplo, diag, n, (T*)a, lda, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_ctrtri)(uplo, diag, n, (T*)a, lda, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_ztrtri)(uplo, diag, n, (T*)a, lda, info); } #endif } template inline void geev(char* jobvl, char* jobvr, blas_int* n, eT* a, blas_int* lda, eT* wr, eT* wi, eT* vl, blas_int* ldvl, eT* vr, blas_int* ldvr, eT* work, blas_int* lwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sgeev)(jobvl, jobvr, n, (T*)a, lda, (T*)wr, (T*)wi, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info, 1, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgeev)(jobvl, jobvr, n, (T*)a, lda, (T*)wr, (T*)wi, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sgeev)(jobvl, jobvr, n, (T*)a, lda, (T*)wr, (T*)wi, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgeev)(jobvl, jobvr, n, (T*)a, lda, (T*)wr, (T*)wi, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info); } #endif } template inline void cx_geev(char* jobvl, char* jobvr, blas_int* n, eT* a, blas_int* lda, eT* w, eT* vl, blas_int* ldvl, eT* vr, blas_int* ldvr, eT* work, blas_int* lwork, typename eT::value_type* rwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_cx_float::value) { typedef float T; typedef blas_cxf cx_T; arma_fortran(arma_cgeev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)w, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info, 1, 1); } else if(is_cx_double::value) { typedef double T; typedef blas_cxd cx_T; arma_fortran(arma_zgeev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)w, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info, 1, 1); } #else if( is_cx_float::value) { typedef float T; typedef blas_cxf cx_T; arma_fortran(arma_cgeev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)w, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info); } else if(is_cx_double::value) { typedef double T; typedef blas_cxd cx_T; arma_fortran(arma_zgeev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)w, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info); } #endif } template inline void geevx(char* balanc, char* jobvl, char* jobvr, char* sense, blas_int* n, eT* a, blas_int* lda, eT* wr, eT* wi, eT* vl, blas_int* ldvl, eT* vr, blas_int* ldvr, blas_int* ilo, blas_int* ihi, eT* scale, eT* abnrm, eT* rconde, eT* rcondv, eT* work, blas_int* lwork, blas_int* iwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sgeevx)(balanc, jobvl, jobvr, sense, n, (T*)(a), lda, (T*)(wr), (T*)(wi), (T*)(vl), ldvl, (T*)(vr), ldvr, ilo, ihi, (T*)(scale), (T*)(abnrm), (T*)(rconde), (T*)(rcondv), (T*)(work), lwork, iwork, info, 1, 1, 1, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgeevx)(balanc, jobvl, jobvr, sense, n, (T*)(a), lda, (T*)(wr), (T*)(wi), (T*)(vl), ldvl, (T*)(vr), ldvr, ilo, ihi, (T*)(scale), (T*)(abnrm), (T*)(rconde), (T*)(rcondv), (T*)(work), lwork, iwork, info, 1, 1, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sgeevx)(balanc, jobvl, jobvr, sense, n, (T*)(a), lda, (T*)(wr), (T*)(wi), (T*)(vl), ldvl, (T*)(vr), ldvr, ilo, ihi, (T*)(scale), (T*)(abnrm), (T*)(rconde), (T*)(rcondv), (T*)(work), lwork, iwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgeevx)(balanc, jobvl, jobvr, sense, n, (T*)(a), lda, (T*)(wr), (T*)(wi), (T*)(vl), ldvl, (T*)(vr), ldvr, ilo, ihi, (T*)(scale), (T*)(abnrm), (T*)(rconde), (T*)(rcondv), (T*)(work), lwork, iwork, info); } #endif } template inline void cx_geevx(char* balanc, char* jobvl, char* jobvr, char* sense, blas_int* n, eT* a, blas_int* lda, eT* w, eT* vl, blas_int* ldvl, eT* vr, blas_int* ldvr, blas_int* ilo, blas_int* ihi, typename eT::value_type* scale, typename eT::value_type* abnrm, typename eT::value_type* rconde, typename eT::value_type* rcondv, eT* work, blas_int* lwork, typename eT::value_type* rwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_cx_float::value) { typedef float T; typedef blas_cxf cx_T; arma_fortran(arma_cgeevx)(balanc, jobvl, jobvr, sense, n, (cx_T*)(a), lda, (cx_T*)(w), (cx_T*)(vl), ldvl, (cx_T*)(vr), ldvr, ilo, ihi, (T*)(scale), (T*)(abnrm), (T*)(rconde), (T*)(rcondv), (cx_T*)(work), lwork, (T*)(rwork), info, 1, 1, 1, 1); } else if(is_cx_double::value) { typedef double T; typedef blas_cxd cx_T; arma_fortran(arma_zgeevx)(balanc, jobvl, jobvr, sense, n, (cx_T*)(a), lda, (cx_T*)(w), (cx_T*)(vl), ldvl, (cx_T*)(vr), ldvr, ilo, ihi, (T*)(scale), (T*)(abnrm), (T*)(rconde), (T*)(rcondv), (cx_T*)(work), lwork, (T*)(rwork), info, 1, 1, 1, 1); } #else if( is_cx_float::value) { typedef float T; typedef blas_cxf cx_T; arma_fortran(arma_cgeevx)(balanc, jobvl, jobvr, sense, n, (cx_T*)(a), lda, (cx_T*)(w), (cx_T*)(vl), ldvl, (cx_T*)(vr), ldvr, ilo, ihi, (T*)(scale), (T*)(abnrm), (T*)(rconde), (T*)(rcondv), (cx_T*)(work), lwork, (T*)(rwork), info); } else if(is_cx_double::value) { typedef double T; typedef blas_cxd cx_T; arma_fortran(arma_zgeevx)(balanc, jobvl, jobvr, sense, n, (cx_T*)(a), lda, (cx_T*)(w), (cx_T*)(vl), ldvl, (cx_T*)(vr), ldvr, ilo, ihi, (T*)(scale), (T*)(abnrm), (T*)(rconde), (T*)(rcondv), (cx_T*)(work), lwork, (T*)(rwork), info); } #endif } template inline void syev(char* jobz, char* uplo, blas_int* n, eT* a, blas_int* lda, eT* w, eT* work, blas_int* lwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_ssyev)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, info, 1, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dsyev)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, info, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_ssyev)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dsyev)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, info); } #endif } template inline void heev ( char* jobz, char* uplo, blas_int* n, eT* a, blas_int* lda, typename eT::value_type* w, eT* work, blas_int* lwork, typename eT::value_type* rwork, blas_int* info ) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_cx_float::value) { typedef float T; typedef blas_cxf cx_T; arma_fortran(arma_cheev)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, info, 1, 1); } else if(is_cx_double::value) { typedef double T; typedef blas_cxd cx_T; arma_fortran(arma_zheev)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, info, 1, 1); } #else if( is_cx_float::value) { typedef float T; typedef blas_cxf cx_T; arma_fortran(arma_cheev)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, info); } else if(is_cx_double::value) { typedef double T; typedef blas_cxd cx_T; arma_fortran(arma_zheev)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, info); } #endif } template inline void syevd(char* jobz, char* uplo, blas_int* n, eT* a, blas_int* lda, eT* w, eT* work, blas_int* lwork, blas_int* iwork, blas_int* liwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_ssyevd)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, iwork, liwork, info, 1, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dsyevd)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, iwork, liwork, info, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_ssyevd)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, iwork, liwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dsyevd)(jobz, uplo, n, (T*)a, lda, (T*)w, (T*)work, lwork, iwork, liwork, info); } #endif } template inline void heevd ( char* jobz, char* uplo, blas_int* n, eT* a, blas_int* lda, typename eT::value_type* w, eT* work, blas_int* lwork, typename eT::value_type* rwork, blas_int* lrwork, blas_int* iwork, blas_int* liwork, blas_int* info ) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_cx_float::value) { typedef float T; typedef blas_cxf cx_T; arma_fortran(arma_cheevd)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, lrwork, iwork, liwork, info, 1, 1); } else if(is_cx_double::value) { typedef double T; typedef blas_cxd cx_T; arma_fortran(arma_zheevd)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, lrwork, iwork, liwork, info, 1, 1); } #else if( is_cx_float::value) { typedef float T; typedef blas_cxf cx_T; arma_fortran(arma_cheevd)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, lrwork, iwork, liwork, info); } else if(is_cx_double::value) { typedef double T; typedef blas_cxd cx_T; arma_fortran(arma_zheevd)(jobz, uplo, n, (cx_T*)a, lda, (T*)w, (cx_T*)work, lwork, (T*)rwork, lrwork, iwork, liwork, info); } #endif } template inline void ggev ( char* jobvl, char* jobvr, blas_int* n, eT* a, blas_int* lda, eT* b, blas_int* ldb, eT* alphar, eT* alphai, eT* beta, eT* vl, blas_int* ldvl, eT* vr, blas_int* ldvr, eT* work, blas_int* lwork, blas_int* info ) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sggev)(jobvl, jobvr, n, (T*)a, lda, (T*)b, ldb, (T*)alphar, (T*)alphai, (T*)beta, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info, 1, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dggev)(jobvl, jobvr, n, (T*)a, lda, (T*)b, ldb, (T*)alphar, (T*)alphai, (T*)beta, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sggev)(jobvl, jobvr, n, (T*)a, lda, (T*)b, ldb, (T*)alphar, (T*)alphai, (T*)beta, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dggev)(jobvl, jobvr, n, (T*)a, lda, (T*)b, ldb, (T*)alphar, (T*)alphai, (T*)beta, (T*)vl, ldvl, (T*)vr, ldvr, (T*)work, lwork, info); } #endif } template inline void cx_ggev ( char* jobvl, char* jobvr, blas_int* n, eT* a, blas_int* lda, eT* b, blas_int* ldb, eT* alpha, eT* beta, eT* vl, blas_int* ldvl, eT* vr, blas_int* ldvr, eT* work, blas_int* lwork, typename eT::value_type* rwork, blas_int* info ) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_cx_float::value) { typedef float T; typedef blas_cxf cx_T; arma_fortran(arma_cggev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)b, ldb, (cx_T*)alpha, (cx_T*)beta, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info, 1, 1); } else if(is_cx_double::value) { typedef double T; typedef blas_cxd cx_T; arma_fortran(arma_zggev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)b, ldb, (cx_T*)alpha, (cx_T*)beta, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info, 1, 1); } #else if( is_cx_float::value) { typedef float T; typedef blas_cxf cx_T; arma_fortran(arma_cggev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)b, ldb, (cx_T*)alpha, (cx_T*)beta, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info); } else if(is_cx_double::value) { typedef double T; typedef blas_cxd cx_T; arma_fortran(arma_zggev)(jobvl, jobvr, n, (cx_T*)a, lda, (cx_T*)b, ldb, (cx_T*)alpha, (cx_T*)beta, (cx_T*)vl, ldvl, (cx_T*)vr, ldvr, (cx_T*)work, lwork, (T*)rwork, info); } #endif } template inline void potrf(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_spotrf)(uplo, n, (T*)a, lda, info, 1); } else if( is_double::value) { typedef double T; arma_fortran(arma_dpotrf)(uplo, n, (T*)a, lda, info, 1); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cpotrf)(uplo, n, (T*)a, lda, info, 1); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zpotrf)(uplo, n, (T*)a, lda, info, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_spotrf)(uplo, n, (T*)a, lda, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dpotrf)(uplo, n, (T*)a, lda, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cpotrf)(uplo, n, (T*)a, lda, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zpotrf)(uplo, n, (T*)a, lda, info); } #endif } template inline void potrs(char* uplo, blas_int* n, const blas_int* nrhs, eT* a, blas_int* lda, eT* b, blas_int* ldb, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_spotrs)(uplo, n, nrhs, (T*)a, lda, (T*)b, ldb, info, 1); } else if( is_double::value) { typedef double T; arma_fortran(arma_dpotrs)(uplo, n, nrhs, (T*)a, lda, (T*)b, ldb, info, 1); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cpotrs)(uplo, n, nrhs, (T*)a, lda, (T*)b, ldb, info, 1); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zpotrs)(uplo, n, nrhs, (T*)a, lda, (T*)b, ldb, info, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_spotrs)(uplo, n, nrhs, (T*)a, lda, (T*)b, ldb, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dpotrs)(uplo, n, nrhs, (T*)a, lda, (T*)b, ldb, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cpotrs)(uplo, n, nrhs, (T*)a, lda, (T*)b, ldb, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zpotrs)(uplo, n, nrhs, (T*)a, lda, (T*)b, ldb, info); } #endif } template inline void pbtrf(char* uplo, blas_int* n, blas_int* kd, eT* ab, blas_int* ldab, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_spbtrf)(uplo, n, kd, (T*)ab, ldab, info, 1); } else if( is_double::value) { typedef double T; arma_fortran(arma_dpbtrf)(uplo, n, kd, (T*)ab, ldab, info, 1); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cpbtrf)(uplo, n, kd, (T*)ab, ldab, info, 1); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zpbtrf)(uplo, n, kd, (T*)ab, ldab, info, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_spbtrf)(uplo, n, kd, (T*)ab, ldab, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dpbtrf)(uplo, n, kd, (T*)ab, ldab, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cpbtrf)(uplo, n, kd, (T*)ab, ldab, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zpbtrf)(uplo, n, kd, (T*)ab, ldab, info); } #endif } template inline void potri(char* uplo, blas_int* n, eT* a, blas_int* lda, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_spotri)(uplo, n, (T*)a, lda, info, 1); } else if( is_double::value) { typedef double T; arma_fortran(arma_dpotri)(uplo, n, (T*)a, lda, info, 1); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cpotri)(uplo, n, (T*)a, lda, info, 1); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zpotri)(uplo, n, (T*)a, lda, info, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_spotri)(uplo, n, (T*)a, lda, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dpotri)(uplo, n, (T*)a, lda, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cpotri)(uplo, n, (T*)a, lda, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zpotri)(uplo, n, (T*)a, lda, info); } #endif } template inline void geqrf(blas_int* m, blas_int* n, eT* a, blas_int* lda, eT* tau, eT* work, blas_int* lwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); if( is_float::value) { typedef float T; arma_fortran(arma_sgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgeqrf)(m, n, (T*)a, lda, (T*)tau, (T*)work, lwork, info); } } template inline void geqp3(blas_int* m, blas_int* n, eT* a, blas_int* lda, blas_int* jpvt, eT* tau, eT* work, blas_int* lwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); if( is_float::value) { typedef float T; arma_fortran(arma_sgeqp3)(m, n, (T*)a, lda, jpvt, (T*)tau, (T*)work, lwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgeqp3)(m, n, (T*)a, lda, jpvt, (T*)tau, (T*)work, lwork, info); } } template inline void cx_geqp3(blas_int* m, blas_int* n, eT* a, blas_int* lda, blas_int* jpvt, eT* tau, eT* work, blas_int* lwork, typename eT::value_type* rwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); if( is_cx_float::value) { typedef float T; typedef blas_cxf cx_T; arma_fortran(arma_cgeqp3)(m, n, (cx_T*)a, lda, jpvt, (cx_T*)tau, (cx_T*)work, lwork, (T*)rwork, info); } else if(is_cx_double::value) { typedef double T; typedef blas_cxd cx_T; arma_fortran(arma_zgeqp3)(m, n, (cx_T*)a, lda, jpvt, (cx_T*)tau, (cx_T*)work, lwork, (T*)rwork, info); } } template inline void orgqr(blas_int* m, blas_int* n, blas_int* k, eT* a, blas_int* lda, eT* tau, eT* work, blas_int* lwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); if( is_float::value) { typedef float T; arma_fortran(arma_sorgqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dorgqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info); } } template inline void ungqr(blas_int* m, blas_int* n, blas_int* k, eT* a, blas_int* lda, eT* tau, eT* work, blas_int* lwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cungqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zungqr)(m, n, k, (T*)a, lda, (T*)tau, (T*)work, lwork, info); } } template inline void gesvd ( char* jobu, char* jobvt, blas_int* m, blas_int* n, eT* a, blas_int* lda, eT* s, eT* u, blas_int* ldu, eT* vt, blas_int* ldvt, eT* work, blas_int* lwork, blas_int* info ) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sgesvd)(jobu, jobvt, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, info, 1, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgesvd)(jobu, jobvt, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, info, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sgesvd)(jobu, jobvt, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgesvd)(jobu, jobvt, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, info); } #endif } template inline void cx_gesvd ( char* jobu, char* jobvt, blas_int* m, blas_int* n, std::complex* a, blas_int* lda, T* s, std::complex* u, blas_int* ldu, std::complex* vt, blas_int* ldvt, std::complex* work, blas_int* lwork, T* rwork, blas_int* info ) { arma_type_check(( is_supported_blas_type::value == false )); arma_type_check(( is_supported_blas_type< std::complex >::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float bT; typedef blas_cxf cx_bT; arma_fortran(arma_cgesvd)(jobu, jobvt, m, n, (cx_bT*)a, lda, (bT*)s, (cx_bT*)u, ldu, (cx_bT*)vt, ldvt, (cx_bT*)work, lwork, (bT*)rwork, info, 1, 1); } else if(is_double::value) { typedef double bT; typedef blas_cxd cx_bT; arma_fortran(arma_zgesvd)(jobu, jobvt, m, n, (cx_bT*)a, lda, (bT*)s, (cx_bT*)u, ldu, (cx_bT*)vt, ldvt, (cx_bT*)work, lwork, (bT*)rwork, info, 1, 1); } #else if( is_float::value) { typedef float bT; typedef blas_cxf cx_bT; arma_fortran(arma_cgesvd)(jobu, jobvt, m, n, (cx_bT*)a, lda, (bT*)s, (cx_bT*)u, ldu, (cx_bT*)vt, ldvt, (cx_bT*)work, lwork, (bT*)rwork, info); } else if(is_double::value) { typedef double bT; typedef blas_cxd cx_bT; arma_fortran(arma_zgesvd)(jobu, jobvt, m, n, (cx_bT*)a, lda, (bT*)s, (cx_bT*)u, ldu, (cx_bT*)vt, ldvt, (cx_bT*)work, lwork, (bT*)rwork, info); } #endif } template inline void gesdd ( char* jobz, blas_int* m, blas_int* n, eT* a, blas_int* lda, eT* s, eT* u, blas_int* ldu, eT* vt, blas_int* ldvt, eT* work, blas_int* lwork, blas_int* iwork, blas_int* info ) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sgesdd)(jobz, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, iwork, info, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgesdd)(jobz, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, iwork, info, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sgesdd)(jobz, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, iwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgesdd)(jobz, m, n, (T*)a, lda, (T*)s, (T*)u, ldu, (T*)vt, ldvt, (T*)work, lwork, iwork, info); } #endif } template inline void cx_gesdd ( char* jobz, blas_int* m, blas_int* n, std::complex* a, blas_int* lda, T* s, std::complex* u, blas_int* ldu, std::complex* vt, blas_int* ldvt, std::complex* work, blas_int* lwork, T* rwork, blas_int* iwork, blas_int* info ) { arma_type_check(( is_supported_blas_type::value == false )); arma_type_check(( is_supported_blas_type< std::complex >::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float bT; typedef blas_cxf cx_bT; arma_fortran(arma_cgesdd)(jobz, m, n, (cx_bT*)a, lda, (bT*)s, (cx_bT*)u, ldu, (cx_bT*)vt, ldvt, (cx_bT*)work, lwork, (bT*)rwork, iwork, info, 1); } else if(is_double::value) { typedef double bT; typedef blas_cxd cx_bT; arma_fortran(arma_zgesdd)(jobz, m, n, (cx_bT*)a, lda, (bT*)s, (cx_bT*)u, ldu, (cx_bT*)vt, ldvt, (cx_bT*)work, lwork, (bT*)rwork, iwork, info, 1); } #else if( is_float::value) { typedef float bT; typedef blas_cxf cx_bT; arma_fortran(arma_cgesdd)(jobz, m, n, (cx_bT*)a, lda, (bT*)s, (cx_bT*)u, ldu, (cx_bT*)vt, ldvt, (cx_bT*)work, lwork, (bT*)rwork, iwork, info); } else if(is_double::value) { typedef double bT; typedef blas_cxd cx_bT; arma_fortran(arma_zgesdd)(jobz, m, n, (cx_bT*)a, lda, (bT*)s, (cx_bT*)u, ldu, (cx_bT*)vt, ldvt, (cx_bT*)work, lwork, (bT*)rwork, iwork, info); } #endif } template inline void gesv(blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, blas_int* ipiv, eT* b, blas_int* ldb, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); if( is_float::value) { typedef float T; arma_fortran(arma_sgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgesv)(n, nrhs, (T*)a, lda, ipiv, (T*)b, ldb, info); } } template inline void gesvx(char* fact, char* trans, blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, eT* af, blas_int* ldaf, blas_int* ipiv, char* equed, eT* r, eT* c, eT* b, blas_int* ldb, eT* x, blas_int* ldx, eT* rcond, eT* ferr, eT* berr, eT* work, blas_int* iwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sgesvx)(fact, trans, n, nrhs, (T*)a, lda, (T*)af, ldaf, ipiv, equed, (T*)r, (T*)c, (T*)b, ldb, (T*)x, ldx, (T*)rcond, (T*)ferr, (T*)berr, (T*)work, iwork, info, 1, 1, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgesvx)(fact, trans, n, nrhs, (T*)a, lda, (T*)af, ldaf, ipiv, equed, (T*)r, (T*)c, (T*)b, ldb, (T*)x, ldx, (T*)rcond, (T*)ferr, (T*)berr, (T*)work, iwork, info, 1, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sgesvx)(fact, trans, n, nrhs, (T*)a, lda, (T*)af, ldaf, ipiv, equed, (T*)r, (T*)c, (T*)b, ldb, (T*)x, ldx, (T*)rcond, (T*)ferr, (T*)berr, (T*)work, iwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgesvx)(fact, trans, n, nrhs, (T*)a, lda, (T*)af, ldaf, ipiv, equed, (T*)r, (T*)c, (T*)b, ldb, (T*)x, ldx, (T*)rcond, (T*)ferr, (T*)berr, (T*)work, iwork, info); } #endif } template inline void cx_gesvx(char* fact, char* trans, blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, eT* af, blas_int* ldaf, blas_int* ipiv, char* equed, T* r, T* c, eT* b, blas_int* ldb, eT* x, blas_int* ldx, T* rcond, T* ferr, T* berr, eT* work, T* rwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf cx_T; arma_fortran(arma_cgesvx)(fact, trans, n, nrhs, (cx_T*)a, lda, (cx_T*)af, ldaf, ipiv, equed, (pod_T*)r, (pod_T*)c, (cx_T*)b, ldb, (cx_T*)x, ldx, (pod_T*)rcond, (pod_T*)ferr, (pod_T*)berr, (cx_T*)work, (pod_T*)rwork, info, 1, 1, 1); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd cx_T; arma_fortran(arma_zgesvx)(fact, trans, n, nrhs, (cx_T*)a, lda, (cx_T*)af, ldaf, ipiv, equed, (pod_T*)r, (pod_T*)c, (cx_T*)b, ldb, (cx_T*)x, ldx, (pod_T*)rcond, (pod_T*)ferr, (pod_T*)berr, (cx_T*)work, (pod_T*)rwork, info, 1, 1, 1); } #else if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf cx_T; arma_fortran(arma_cgesvx)(fact, trans, n, nrhs, (cx_T*)a, lda, (cx_T*)af, ldaf, ipiv, equed, (pod_T*)r, (pod_T*)c, (cx_T*)b, ldb, (cx_T*)x, ldx, (pod_T*)rcond, (pod_T*)ferr, (pod_T*)berr, (cx_T*)work, (pod_T*)rwork, info); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd cx_T; arma_fortran(arma_zgesvx)(fact, trans, n, nrhs, (cx_T*)a, lda, (cx_T*)af, ldaf, ipiv, equed, (pod_T*)r, (pod_T*)c, (cx_T*)b, ldb, (cx_T*)x, ldx, (pod_T*)rcond, (pod_T*)ferr, (pod_T*)berr, (cx_T*)work, (pod_T*)rwork, info); } #endif } template inline void posv(char* uplo, blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, eT* b, blas_int* ldb, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sposv)(uplo, n, nrhs, (T*)a, lda, (T*)b, ldb, info, 1); } else if( is_double::value) { typedef double T; arma_fortran(arma_dposv)(uplo, n, nrhs, (T*)a, lda, (T*)b, ldb, info, 1); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cposv)(uplo, n, nrhs, (T*)a, lda, (T*)b, ldb, info, 1); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zposv)(uplo, n, nrhs, (T*)a, lda, (T*)b, ldb, info, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sposv)(uplo, n, nrhs, (T*)a, lda, (T*)b, ldb, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dposv)(uplo, n, nrhs, (T*)a, lda, (T*)b, ldb, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cposv)(uplo, n, nrhs, (T*)a, lda, (T*)b, ldb, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zposv)(uplo, n, nrhs, (T*)a, lda, (T*)b, ldb, info); } #endif } template inline void posvx(char* fact, char* uplo, blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, eT* af, blas_int* ldaf, char* equed, eT* s, eT* b, blas_int* ldb, eT* x, blas_int* ldx, eT* rcond, eT* ferr, eT* berr, eT* work, blas_int* iwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sposvx)(fact, uplo, n, nrhs, (T*)a, lda, (T*)af, ldaf, equed, (T*)s, (T*)b, ldb, (T*)x, ldx, (T*)rcond, (T*)ferr, (T*)berr, (T*)work, iwork, info, 1, 1, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dposvx)(fact, uplo, n, nrhs, (T*)a, lda, (T*)af, ldaf, equed, (T*)s, (T*)b, ldb, (T*)x, ldx, (T*)rcond, (T*)ferr, (T*)berr, (T*)work, iwork, info, 1, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sposvx)(fact, uplo, n, nrhs, (T*)a, lda, (T*)af, ldaf, equed, (T*)s, (T*)b, ldb, (T*)x, ldx, (T*)rcond, (T*)ferr, (T*)berr, (T*)work, iwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dposvx)(fact, uplo, n, nrhs, (T*)a, lda, (T*)af, ldaf, equed, (T*)s, (T*)b, ldb, (T*)x, ldx, (T*)rcond, (T*)ferr, (T*)berr, (T*)work, iwork, info); } #endif } template inline void cx_posvx(char* fact, char* uplo, blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, eT* af, blas_int* ldaf, char* equed, T* s, eT* b, blas_int* ldb, eT* x, blas_int* ldx, T* rcond, T* ferr, T* berr, eT* work, T* rwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf cx_T; arma_fortran(arma_cposvx)(fact, uplo, n, nrhs, (cx_T*)a, lda, (cx_T*)af, ldaf, equed, (pod_T*)s, (cx_T*)b, ldb, (cx_T*)x, ldx, (pod_T*)rcond, (pod_T*)ferr, (pod_T*)berr, (cx_T*)work, (pod_T*)rwork, info, 1, 1, 1); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd cx_T; arma_fortran(arma_zposvx)(fact, uplo, n, nrhs, (cx_T*)a, lda, (cx_T*)af, ldaf, equed, (pod_T*)s, (cx_T*)b, ldb, (cx_T*)x, ldx, (pod_T*)rcond, (pod_T*)ferr, (pod_T*)berr, (cx_T*)work, (pod_T*)rwork, info, 1, 1, 1); } #else if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf cx_T; arma_fortran(arma_cposvx)(fact, uplo, n, nrhs, (cx_T*)a, lda, (cx_T*)af, ldaf, equed, (pod_T*)s, (cx_T*)b, ldb, (cx_T*)x, ldx, (pod_T*)rcond, (pod_T*)ferr, (pod_T*)berr, (cx_T*)work, (pod_T*)rwork, info); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd cx_T; arma_fortran(arma_zposvx)(fact, uplo, n, nrhs, (cx_T*)a, lda, (cx_T*)af, ldaf, equed, (pod_T*)s, (cx_T*)b, ldb, (cx_T*)x, ldx, (pod_T*)rcond, (pod_T*)ferr, (pod_T*)berr, (cx_T*)work, (pod_T*)rwork, info); } #endif } template inline void gels(char* trans, blas_int* m, blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, eT* b, blas_int* ldb, eT* work, blas_int* lwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info, 1); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info, 1); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info, 1); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgels)(trans, m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)work, lwork, info); } #endif } template inline void gelsd(blas_int* m, blas_int* n, blas_int* nrhs, eT* a, blas_int* lda, eT* b, blas_int* ldb, eT* S, eT* rcond, blas_int* rank, eT* work, blas_int* lwork, blas_int* iwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); if( is_float::value) { typedef float T; arma_fortran(arma_sgelsd)(m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)S, (T*)rcond, rank, (T*)work, lwork, iwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgelsd)(m, n, nrhs, (T*)a, lda, (T*)b, ldb, (T*)S, (T*)rcond, rank, (T*)work, lwork, iwork, info); } } template inline void cx_gelsd(blas_int* m, blas_int* n, blas_int* nrhs, std::complex* a, blas_int* lda, std::complex* b, blas_int* ldb, T* S, T* rcond, blas_int* rank, std::complex* work, blas_int* lwork, T* rwork, blas_int* iwork, blas_int* info) { typedef typename std::complex eT; arma_type_check(( is_supported_blas_type::value == false )); if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf cx_T; arma_fortran(arma_cgelsd)(m, n, nrhs, (cx_T*)a, lda, (cx_T*)b, ldb, (pod_T*)S, (pod_T*)rcond, rank, (cx_T*)work, lwork, (pod_T*)rwork, iwork, info); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd cx_T; arma_fortran(arma_zgelsd)(m, n, nrhs, (cx_T*)a, lda, (cx_T*)b, ldb, (pod_T*)S, (pod_T*)rcond, rank, (cx_T*)work, lwork, (pod_T*)rwork, iwork, info); } } template inline void trtrs(char* uplo, char* trans, char* diag, blas_int* n, blas_int* nrhs, const eT* a, blas_int* lda, eT* b, blas_int* ldb, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_strtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info, 1, 1, 1); } else if( is_double::value) { typedef double T; arma_fortran(arma_dtrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info, 1, 1, 1); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_ctrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info, 1, 1, 1); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_ztrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info, 1, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_strtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dtrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_ctrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_ztrtrs)(uplo, trans, diag, n, nrhs, (T*)a, lda, (T*)b, ldb, info); } #endif } template inline void gbtrf(blas_int* m, blas_int* n, blas_int* kl, blas_int* ku, eT* ab, blas_int* ldab, blas_int* ipiv, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); if( is_float::value) { typedef float T; arma_fortran(arma_sgbtrf)(m, n, kl, ku, (T*)ab, ldab, ipiv, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgbtrf)(m, n, kl, ku, (T*)ab, ldab, ipiv, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgbtrf)(m, n, kl, ku, (T*)ab, ldab, ipiv, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgbtrf)(m, n, kl, ku, (T*)ab, ldab, ipiv, info); } } template inline void gbtrs(char* trans, blas_int* n, blas_int* kl, blas_int* ku, blas_int* nrhs, eT* ab, blas_int* ldab, blas_int* ipiv, eT* b, blas_int* ldb, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sgbtrs)(trans, n, kl, ku, nrhs, (T*)ab, ldab, ipiv, (T*)b, ldb, info, 1); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgbtrs)(trans, n, kl, ku, nrhs, (T*)ab, ldab, ipiv, (T*)b, ldb, info, 1); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgbtrs)(trans, n, kl, ku, nrhs, (T*)ab, ldab, ipiv, (T*)b, ldb, info, 1); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgbtrs)(trans, n, kl, ku, nrhs, (T*)ab, ldab, ipiv, (T*)b, ldb, info, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sgbtrs)(trans, n, kl, ku, nrhs, (T*)ab, ldab, ipiv, (T*)b, ldb, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgbtrs)(trans, n, kl, ku, nrhs, (T*)ab, ldab, ipiv, (T*)b, ldb, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgbtrs)(trans, n, kl, ku, nrhs, (T*)ab, ldab, ipiv, (T*)b, ldb, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgbtrs)(trans, n, kl, ku, nrhs, (T*)ab, ldab, ipiv, (T*)b, ldb, info); } #endif } template inline void gbsv(blas_int* n, blas_int* kl, blas_int* ku, blas_int* nrhs, eT* ab, blas_int* ldab, blas_int* ipiv, eT* b, blas_int* ldb, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); if( is_float::value) { typedef float T; arma_fortran(arma_sgbsv)(n, kl, ku, nrhs, (T*)ab, ldab, ipiv, (T*)b, ldb, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgbsv)(n, kl, ku, nrhs, (T*)ab, ldab, ipiv, (T*)b, ldb, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgbsv)(n, kl, ku, nrhs, (T*)ab, ldab, ipiv, (T*)b, ldb, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgbsv)(n, kl, ku, nrhs, (T*)ab, ldab, ipiv, (T*)b, ldb, info); } } template inline void gbsvx(char* fact, char* trans, blas_int* n, blas_int* kl, blas_int* ku, blas_int* nrhs, eT* ab, blas_int* ldab, eT* afb, blas_int* ldafb, blas_int* ipiv, char* equed, eT* r, eT* c, eT* b, blas_int* ldb, eT* x, blas_int* ldx, eT* rcond, eT* ferr, eT* berr, eT* work, blas_int* iwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sgbsvx)(fact, trans, n, kl, ku, nrhs, (T*)ab, ldab, (T*)afb, ldafb, ipiv, equed, (T*)r, (T*)c, (T*)b, ldb, (T*)x, ldx, (T*)rcond, (T*)ferr, (T*)berr, (T*)work, iwork, info, 1, 1, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgbsvx)(fact, trans, n, kl, ku, nrhs, (T*)ab, ldab, (T*)afb, ldafb, ipiv, equed, (T*)r, (T*)c, (T*)b, ldb, (T*)x, ldx, (T*)rcond, (T*)ferr, (T*)berr, (T*)work, iwork, info, 1, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sgbsvx)(fact, trans, n, kl, ku, nrhs, (T*)ab, ldab, (T*)afb, ldafb, ipiv, equed, (T*)r, (T*)c, (T*)b, ldb, (T*)x, ldx, (T*)rcond, (T*)ferr, (T*)berr, (T*)work, iwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgbsvx)(fact, trans, n, kl, ku, nrhs, (T*)ab, ldab, (T*)afb, ldafb, ipiv, equed, (T*)r, (T*)c, (T*)b, ldb, (T*)x, ldx, (T*)rcond, (T*)ferr, (T*)berr, (T*)work, iwork, info); } #endif } template inline void cx_gbsvx(char* fact, char* trans, blas_int* n, blas_int* kl, blas_int* ku, blas_int* nrhs, eT* ab, blas_int* ldab, eT* afb, blas_int* ldafb, blas_int* ipiv, char* equed, T* r, T* c, eT* b, blas_int* ldb, eT* x, blas_int* ldx, T* rcond, T* ferr, T* berr, eT* work, T* rwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf cx_T; arma_fortran(arma_cgbsvx)(fact, trans, n, kl, ku, nrhs, (cx_T*)ab, ldab, (cx_T*)afb, ldafb, ipiv, equed, (pod_T*)r, (pod_T*)c, (cx_T*)b, ldb, (cx_T*)x, ldx, (pod_T*)rcond, (pod_T*)ferr, (pod_T*)berr, (cx_T*)work, (pod_T*)rwork, info, 1, 1, 1); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd cx_T; arma_fortran(arma_zgbsvx)(fact, trans, n, kl, ku, nrhs, (cx_T*)ab, ldab, (cx_T*)afb, ldafb, ipiv, equed, (pod_T*)r, (pod_T*)c, (cx_T*)b, ldb, (cx_T*)x, ldx, (pod_T*)rcond, (pod_T*)ferr, (pod_T*)berr, (cx_T*)work, (pod_T*)rwork, info, 1, 1, 1); } #else if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf cx_T; arma_fortran(arma_cgbsvx)(fact, trans, n, kl, ku, nrhs, (cx_T*)ab, ldab, (cx_T*)afb, ldafb, ipiv, equed, (pod_T*)r, (pod_T*)c, (cx_T*)b, ldb, (cx_T*)x, ldx, (pod_T*)rcond, (pod_T*)ferr, (pod_T*)berr, (cx_T*)work, (pod_T*)rwork, info); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd cx_T; arma_fortran(arma_zgbsvx)(fact, trans, n, kl, ku, nrhs, (cx_T*)ab, ldab, (cx_T*)afb, ldafb, ipiv, equed, (pod_T*)r, (pod_T*)c, (cx_T*)b, ldb, (cx_T*)x, ldx, (pod_T*)rcond, (pod_T*)ferr, (pod_T*)berr, (cx_T*)work, (pod_T*)rwork, info); } #endif } template inline void gtsv(blas_int* n, blas_int* nrhs, eT* dl, eT* d, eT* du, eT* b, blas_int* ldb, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); if( is_float::value) { typedef float T; arma_fortran(arma_sgtsv)(n, nrhs, (T*)dl, (T*)d, (T*)du, (T*)b, ldb, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgtsv)(n, nrhs, (T*)dl, (T*)d, (T*)du, (T*)b, ldb, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgtsv)(n, nrhs, (T*)dl, (T*)d, (T*)du, (T*)b, ldb, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgtsv)(n, nrhs, (T*)dl, (T*)d, (T*)du, (T*)b, ldb, info); } } template inline void gtsvx(char* fact, char* trans, blas_int* n, blas_int* nrhs, eT* dl, eT* d, eT* du, eT* dlf, eT* df, eT* duf, eT* du2, blas_int* ipiv, eT* b, blas_int* ldb, eT* x, blas_int* ldx, eT* rcond, eT* ferr, eT* berr, eT* work, blas_int* iwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sgtsvx)(fact, trans, n, nrhs, (T*)dl, (T*)d, (T*)du, (T*)dlf, (T*)df, (T*)duf, (T*)du2, ipiv, (T*)b, ldb, (T*)x, ldx, (T*)rcond, (T*)ferr, (T*)berr, (T*)work, iwork, info, 1, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgtsvx)(fact, trans, n, nrhs, (T*)dl, (T*)d, (T*)du, (T*)dlf, (T*)df, (T*)duf, (T*)du2, ipiv, (T*)b, ldb, (T*)x, ldx, (T*)rcond, (T*)ferr, (T*)berr, (T*)work, iwork, info, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sgtsvx)(fact, trans, n, nrhs, (T*)dl, (T*)d, (T*)du, (T*)dlf, (T*)df, (T*)duf, (T*)du2, ipiv, (T*)b, ldb, (T*)x, ldx, (T*)rcond, (T*)ferr, (T*)berr, (T*)work, iwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgtsvx)(fact, trans, n, nrhs, (T*)dl, (T*)d, (T*)du, (T*)dlf, (T*)df, (T*)duf, (T*)du2, ipiv, (T*)b, ldb, (T*)x, ldx, (T*)rcond, (T*)ferr, (T*)berr, (T*)work, iwork, info); } #endif } template inline void cx_gtsvx(char* fact, char* trans, blas_int* n, blas_int* nrhs, eT* dl, eT* d, eT* du, eT* dlf, eT* df, eT* duf, eT* du2, blas_int* ipiv, eT* b, blas_int* ldb, eT* x, blas_int* ldx, T* rcond, T* ferr, T* berr, eT* work, T* rwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf cx_T; arma_fortran(arma_cgtsvx)(fact, trans, n, nrhs, (cx_T*)dl, (cx_T*)d, (cx_T*)du, (cx_T*)dlf, (cx_T*)df, (cx_T*)duf, (cx_T*)du2, ipiv, (cx_T*)b, ldb, (cx_T*)x, ldx, (pod_T*)rcond, (pod_T*)ferr, (pod_T*)berr, (cx_T*)work, (pod_T*)rwork, info, 1, 1); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd cx_T; arma_fortran(arma_zgtsvx)(fact, trans, n, nrhs, (cx_T*)dl, (cx_T*)d, (cx_T*)du, (cx_T*)dlf, (cx_T*)df, (cx_T*)duf, (cx_T*)du2, ipiv, (cx_T*)b, ldb, (cx_T*)x, ldx, (pod_T*)rcond, (pod_T*)ferr, (pod_T*)berr, (cx_T*)work, (pod_T*)rwork, info, 1, 1); } #else if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf cx_T; arma_fortran(arma_cgtsvx)(fact, trans, n, nrhs, (cx_T*)dl, (cx_T*)d, (cx_T*)du, (cx_T*)dlf, (cx_T*)df, (cx_T*)duf, (cx_T*)du2, ipiv, (cx_T*)b, ldb, (cx_T*)x, ldx, (pod_T*)rcond, (pod_T*)ferr, (pod_T*)berr, (cx_T*)work, (pod_T*)rwork, info); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd cx_T; arma_fortran(arma_zgtsvx)(fact, trans, n, nrhs, (cx_T*)dl, (cx_T*)d, (cx_T*)du, (cx_T*)dlf, (cx_T*)df, (cx_T*)duf, (cx_T*)du2, ipiv, (cx_T*)b, ldb, (cx_T*)x, ldx, (pod_T*)rcond, (pod_T*)ferr, (pod_T*)berr, (cx_T*)work, (pod_T*)rwork, info); } #endif } template inline void gees(char* jobvs, char* sort, void* select, blas_int* n, eT* a, blas_int* lda, blas_int* sdim, eT* wr, eT* wi, eT* vs, blas_int* ldvs, eT* work, blas_int* lwork, blas_int* bwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sgees)(jobvs, sort, (fn_select_s2)select, n, (T*)a, lda, sdim, (T*)wr, (T*)wi, (T*)vs, ldvs, (T*)work, lwork, bwork, info, 1, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgees)(jobvs, sort, (fn_select_d2)select, n, (T*)a, lda, sdim, (T*)wr, (T*)wi, (T*)vs, ldvs, (T*)work, lwork, bwork, info, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sgees)(jobvs, sort, (fn_select_s2)select, n, (T*)a, lda, sdim, (T*)wr, (T*)wi, (T*)vs, ldvs, (T*)work, lwork, bwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgees)(jobvs, sort, (fn_select_d2)select, n, (T*)a, lda, sdim, (T*)wr, (T*)wi, (T*)vs, ldvs, (T*)work, lwork, bwork, info); } #endif } template inline void cx_gees(char* jobvs, char* sort, void* select, blas_int* n, std::complex* a, blas_int* lda, blas_int* sdim, std::complex* w, std::complex* vs, blas_int* ldvs, std::complex* work, blas_int* lwork, T* rwork, blas_int* bwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); arma_type_check(( is_supported_blas_type< std::complex >::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float bT; typedef blas_cxf cT; arma_fortran(arma_cgees)(jobvs, sort, (fn_select_c1)select, n, (cT*)a, lda, sdim, (cT*)w, (cT*)vs, ldvs, (cT*)work, lwork, (bT*)rwork, bwork, info, 1, 1); } else if(is_double::value) { typedef double bT; typedef blas_cxd cT; arma_fortran(arma_zgees)(jobvs, sort, (fn_select_z1)select, n, (cT*)a, lda, sdim, (cT*)w, (cT*)vs, ldvs, (cT*)work, lwork, (bT*)rwork, bwork, info, 1, 1); } #else if( is_float::value) { typedef float bT; typedef blas_cxf cT; arma_fortran(arma_cgees)(jobvs, sort, (fn_select_c1)select, n, (cT*)a, lda, sdim, (cT*)w, (cT*)vs, ldvs, (cT*)work, lwork, (bT*)rwork, bwork, info); } else if(is_double::value) { typedef double bT; typedef blas_cxd cT; arma_fortran(arma_zgees)(jobvs, sort, (fn_select_z1)select, n, (cT*)a, lda, sdim, (cT*)w, (cT*)vs, ldvs, (cT*)work, lwork, (bT*)rwork, bwork, info); } #endif } template inline void trsyl(char* transa, char* transb, blas_int* isgn, blas_int* m, blas_int* n, const eT* a, blas_int* lda, const eT* b, blas_int* ldb, eT* c, blas_int* ldc, eT* scale, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_strsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (T*)scale, info, 1, 1); } else if( is_double::value) { typedef double T; arma_fortran(arma_dtrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (T*)scale, info, 1, 1); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_ctrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (float*)scale, info, 1, 1); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_ztrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (double*)scale, info, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_strsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (T*)scale, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dtrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (T*)scale, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_ctrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (float*)scale, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_ztrsyl)(transa, transb, isgn, m, n, (T*)a, lda, (T*)b, ldb, (T*)c, ldc, (double*)scale, info); } #endif } template inline void gges ( char* jobvsl, char* jobvsr, char* sort, void* selctg, blas_int* n, eT* a, blas_int* lda, eT* b, blas_int* ldb, blas_int* sdim, eT* alphar, eT* alphai, eT* beta, eT* vsl, blas_int* ldvsl, eT* vsr, blas_int* ldvsr, eT* work, blas_int* lwork, blas_int* bwork, blas_int* info ) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sgges)(jobvsl, jobvsr, sort, (fn_select_s3)selctg, n, (T*)a, lda, (T*)b, ldb, sdim, (T*)alphar, (T*)alphai, (T*)beta, (T*)vsl, ldvsl, (T*)vsr, ldvsr, (T*)work, lwork, bwork, info, 1, 1, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgges)(jobvsl, jobvsr, sort, (fn_select_d3)selctg, n, (T*)a, lda, (T*)b, ldb, sdim, (T*)alphar, (T*)alphai, (T*)beta, (T*)vsl, ldvsl, (T*)vsr, ldvsr, (T*)work, lwork, bwork, info, 1, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sgges)(jobvsl, jobvsr, sort, (fn_select_s3)selctg, n, (T*)a, lda, (T*)b, ldb, sdim, (T*)alphar, (T*)alphai, (T*)beta, (T*)vsl, ldvsl, (T*)vsr, ldvsr, (T*)work, lwork, bwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgges)(jobvsl, jobvsr, sort, (fn_select_d3)selctg, n, (T*)a, lda, (T*)b, ldb, sdim, (T*)alphar, (T*)alphai, (T*)beta, (T*)vsl, ldvsl, (T*)vsr, ldvsr, (T*)work, lwork, bwork, info); } #endif } template inline void cx_gges ( char* jobvsl, char* jobvsr, char* sort, void* selctg, blas_int* n, eT* a, blas_int* lda, eT* b, blas_int* ldb, blas_int* sdim, eT* alpha, eT* beta, eT* vsl, blas_int* ldvsl, eT* vsr, blas_int* ldvsr, eT* work, blas_int* lwork, typename eT::value_type* rwork, blas_int* bwork, blas_int* info ) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_cx_float::value) { typedef float T; typedef blas_cxf cx_T; arma_fortran(arma_cgges)(jobvsl, jobvsr, sort, (fn_select_c2)selctg, n, (cx_T*)a, lda, (cx_T*)b, ldb, sdim, (cx_T*)alpha, (cx_T*)beta, (cx_T*)vsl, ldvsl, (cx_T*)vsr, ldvsr, (cx_T*)work, lwork, (T*)rwork, bwork, info, 1, 1, 1); } else if(is_cx_double::value) { typedef double T; typedef blas_cxd cx_T; arma_fortran(arma_zgges)(jobvsl, jobvsr, sort, (fn_select_z2)selctg, n, (cx_T*)a, lda, (cx_T*)b, ldb, sdim, (cx_T*)alpha, (cx_T*)beta, (cx_T*)vsl, ldvsl, (cx_T*)vsr, ldvsr, (cx_T*)work, lwork, (T*)rwork, bwork, info, 1, 1, 1); } #else if( is_cx_float::value) { typedef float T; typedef blas_cxf cx_T; arma_fortran(arma_cgges)(jobvsl, jobvsr, sort, (fn_select_c2)selctg, n, (cx_T*)a, lda, (cx_T*)b, ldb, sdim, (cx_T*)alpha, (cx_T*)beta, (cx_T*)vsl, ldvsl, (cx_T*)vsr, ldvsr, (cx_T*)work, lwork, (T*)rwork, bwork, info); } else if(is_cx_double::value) { typedef double T; typedef blas_cxd cx_T; arma_fortran(arma_zgges)(jobvsl, jobvsr, sort, (fn_select_z2)selctg, n, (cx_T*)a, lda, (cx_T*)b, ldb, sdim, (cx_T*)alpha, (cx_T*)beta, (cx_T*)vsl, ldvsl, (cx_T*)vsr, ldvsr, (cx_T*)work, lwork, (T*)rwork, bwork, info); } #endif } template inline typename get_pod_type::result lange(char* norm, blas_int* m, blas_int* n, eT* a, blas_int* lda, typename get_pod_type::result* work) { arma_type_check(( is_supported_blas_type::value == false )); typedef typename get_pod_type::result out_T; #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float pod_T; typedef float T; return out_T( arma_fortran(arma_slange)(norm, m, n, (T*)a, lda, (pod_T*)work, 1) ); } else if( is_double::value) { typedef double pod_T; typedef double T; return out_T( arma_fortran(arma_dlange)(norm, m, n, (T*)a, lda, (pod_T*)work, 1) ); } else if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf T; return out_T( arma_fortran(arma_clange)(norm, m, n, (T*)a, lda, (pod_T*)work, 1) ); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd T; return out_T( arma_fortran(arma_zlange)(norm, m, n, (T*)a, lda, (pod_T*)work, 1) ); } #else if( is_float::value) { typedef float pod_T; typedef float T; return out_T( arma_fortran(arma_slange)(norm, m, n, (T*)a, lda, (pod_T*)work) ); } else if( is_double::value) { typedef double pod_T; typedef double T; return out_T( arma_fortran(arma_dlange)(norm, m, n, (T*)a, lda, (pod_T*)work) ); } else if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf T; return out_T( arma_fortran(arma_clange)(norm, m, n, (T*)a, lda, (pod_T*)work) ); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd T; return out_T( arma_fortran(arma_zlange)(norm, m, n, (T*)a, lda, (pod_T*)work) ); } #endif return out_T(0); } template inline typename get_pod_type::result lansy(char* norm, char* uplo, blas_int* n, eT* a, blas_int* lda, typename get_pod_type::result* work) { arma_type_check(( is_supported_blas_type::value == false )); typedef typename get_pod_type::result out_T; #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float pod_T; typedef float T; return out_T( arma_fortran(arma_slansy)(norm, uplo, n, (T*)a, lda, (pod_T*)work, 1, 1) ); } else if( is_double::value) { typedef double pod_T; typedef double T; return out_T( arma_fortran(arma_dlansy)(norm, uplo, n, (T*)a, lda, (pod_T*)work, 1, 1) ); } else if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf T; return out_T( arma_fortran(arma_clansy)(norm, uplo, n, (T*)a, lda, (pod_T*)work, 1, 1) ); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd T; return out_T( arma_fortran(arma_zlansy)(norm, uplo, n, (T*)a, lda, (pod_T*)work, 1, 1) ); } #else if( is_float::value) { typedef float pod_T; typedef float T; return out_T( arma_fortran(arma_slansy)(norm, uplo, n, (T*)a, lda, (pod_T*)work) ); } else if( is_double::value) { typedef double pod_T; typedef double T; return out_T( arma_fortran(arma_dlansy)(norm, uplo, n, (T*)a, lda, (pod_T*)work) ); } else if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf T; return out_T( arma_fortran(arma_clansy)(norm, uplo, n, (T*)a, lda, (pod_T*)work) ); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd T; return out_T( arma_fortran(arma_zlansy)(norm, uplo, n, (T*)a, lda, (pod_T*)work) ); } #endif return out_T(0); } template inline typename get_pod_type::result lanhe(char* norm, char* uplo, blas_int* n, eT* a, blas_int* lda, typename get_pod_type::result* work) { arma_type_check(( is_supported_blas_type::value == false )); typedef typename get_pod_type::result out_T; #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf T; return out_T( arma_fortran(arma_clanhe)(norm, uplo, n, (T*)a, lda, (pod_T*)work, 1, 1) ); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd T; return out_T( arma_fortran(arma_zlanhe)(norm, uplo, n, (T*)a, lda, (pod_T*)work, 1, 1) ); } #else if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf T; return out_T( arma_fortran(arma_clanhe)(norm, uplo, n, (T*)a, lda, (pod_T*)work) ); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd T; return out_T( arma_fortran(arma_zlanhe)(norm, uplo, n, (T*)a, lda, (pod_T*)work) ); } #endif return out_T(0); } template inline typename get_pod_type::result langb(char* norm, blas_int* n, blas_int* kl, blas_int* ku, eT* ab, blas_int* ldab, typename get_pod_type::result* work) { arma_type_check(( is_supported_blas_type::value == false )); typedef typename get_pod_type::result out_T; #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float pod_T; typedef float T; return out_T( arma_fortran(arma_slangb)(norm, n, kl, ku, (T*)ab, ldab, (pod_T*)work, 1) ); } else if( is_double::value) { typedef double pod_T; typedef double T; return out_T( arma_fortran(arma_dlangb)(norm, n, kl, ku, (T*)ab, ldab, (pod_T*)work, 1) ); } else if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf T; return out_T( arma_fortran(arma_clangb)(norm, n, kl, ku, (T*)ab, ldab, (pod_T*)work, 1) ); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd T; return out_T( arma_fortran(arma_zlangb)(norm, n, kl, ku, (T*)ab, ldab, (pod_T*)work, 1) ); } #else if( is_float::value) { typedef float pod_T; typedef float T; return out_T( arma_fortran(arma_slangb)(norm, n, kl, ku, (T*)ab, ldab, (pod_T*)work) ); } else if( is_double::value) { typedef double pod_T; typedef double T; return out_T( arma_fortran(arma_dlangb)(norm, n, kl, ku, (T*)ab, ldab, (pod_T*)work) ); } else if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf T; return out_T( arma_fortran(arma_clangb)(norm, n, kl, ku, (T*)ab, ldab, (pod_T*)work) ); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd T; return out_T( arma_fortran(arma_zlangb)(norm, n, kl, ku, (T*)ab, ldab, (pod_T*)work) ); } #endif return out_T(0); } template inline void gecon(char* norm, blas_int* n, const eT* a, blas_int* lda, const eT* anorm, eT* rcond, eT* work, blas_int* iwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sgecon)(norm, n, (T*)a, lda, (T*)anorm, (T*)rcond, (T*)work, iwork, info, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgecon)(norm, n, (T*)a, lda, (T*)anorm, (T*)rcond, (T*)work, iwork, info, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sgecon)(norm, n, (T*)a, lda, (T*)anorm, (T*)rcond, (T*)work, iwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgecon)(norm, n, (T*)a, lda, (T*)anorm, (T*)rcond, (T*)work, iwork, info); } #endif } template inline void cx_gecon(char* norm, blas_int* n, const std::complex* a, blas_int* lda, const T* anorm, T* rcond, std::complex* work, T* rwork, blas_int* info) { typedef typename std::complex eT; arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf cx_T; arma_fortran(arma_cgecon)(norm, n, (cx_T*)a, lda, (pod_T*)anorm, (pod_T*)rcond, (cx_T*)work, (pod_T*)rwork, info, 1); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd cx_T; arma_fortran(arma_zgecon)(norm, n, (cx_T*)a, lda, (pod_T*)anorm, (pod_T*)rcond, (cx_T*)work, (pod_T*)rwork, info, 1); } #else if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf cx_T; arma_fortran(arma_cgecon)(norm, n, (cx_T*)a, lda, (pod_T*)anorm, (pod_T*)rcond, (cx_T*)work, (pod_T*)rwork, info); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd cx_T; arma_fortran(arma_zgecon)(norm, n, (cx_T*)a, lda, (pod_T*)anorm, (pod_T*)rcond, (cx_T*)work, (pod_T*)rwork, info); } #endif } template inline void pocon(char* uplo, blas_int* n, const eT* a, blas_int* lda, const eT* anorm, eT* rcond, eT* work, blas_int* iwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_spocon)(uplo, n, (T*)a, lda, (T*)anorm, (T*)rcond, (T*)work, iwork, info, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dpocon)(uplo, n, (T*)a, lda, (T*)anorm, (T*)rcond, (T*)work, iwork, info, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_spocon)(uplo, n, (T*)a, lda, (T*)anorm, (T*)rcond, (T*)work, iwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dpocon)(uplo, n, (T*)a, lda, (T*)anorm, (T*)rcond, (T*)work, iwork, info); } #endif } template inline void cx_pocon(char* uplo, blas_int* n, const std::complex* a, blas_int* lda, const T* anorm, T* rcond, std::complex* work, T* rwork, blas_int* info) { typedef typename std::complex eT; arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf cx_T; arma_fortran(arma_cpocon)(uplo, n, (cx_T*)a, lda, (pod_T*)anorm, (pod_T*)rcond, (cx_T*)work, (pod_T*)rwork, info, 1); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd cx_T; arma_fortran(arma_zpocon)(uplo, n, (cx_T*)a, lda, (pod_T*)anorm, (pod_T*)rcond, (cx_T*)work, (pod_T*)rwork, info, 1); } #else if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf cx_T; arma_fortran(arma_cpocon)(uplo, n, (cx_T*)a, lda, (pod_T*)anorm, (pod_T*)rcond, (cx_T*)work, (pod_T*)rwork, info); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd cx_T; arma_fortran(arma_zpocon)(uplo, n, (cx_T*)a, lda, (pod_T*)anorm, (pod_T*)rcond, (cx_T*)work, (pod_T*)rwork, info); } #endif } template inline void trcon(char* norm, char* uplo, char* diag, blas_int* n, const eT* a, blas_int* lda, eT* rcond, eT* work, blas_int* iwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_strcon)(norm, uplo, diag, n, (T*)a, lda, (T*)rcond, (T*)work, iwork, info, 1, 1, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dtrcon)(norm, uplo, diag, n, (T*)a, lda, (T*)rcond, (T*)work, iwork, info, 1, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_strcon)(norm, uplo, diag, n, (T*)a, lda, (T*)rcond, (T*)work, iwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dtrcon)(norm, uplo, diag, n, (T*)a, lda, (T*)rcond, (T*)work, iwork, info); } #endif } template inline void cx_trcon(char* norm, char* uplo, char* diag, blas_int* n, const std::complex* a, blas_int* lda, T* rcond, std::complex* work, T* rwork, blas_int* info) { typedef typename std::complex eT; arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf cx_T; arma_fortran(arma_ctrcon)(norm, uplo, diag, n, (cx_T*)a, lda, (pod_T*)rcond, (cx_T*)work, (pod_T*)rwork, info, 1, 1, 1); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd cx_T; arma_fortran(arma_ztrcon)(norm, uplo, diag, n, (cx_T*)a, lda, (pod_T*)rcond, (cx_T*)work, (pod_T*)rwork, info, 1, 1, 1); } #else if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf cx_T; arma_fortran(arma_ctrcon)(norm, uplo, diag, n, (cx_T*)a, lda, (pod_T*)rcond, (cx_T*)work, (pod_T*)rwork, info); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd cx_T; arma_fortran(arma_ztrcon)(norm, uplo, diag, n, (cx_T*)a, lda, (pod_T*)rcond, (cx_T*)work, (pod_T*)rwork, info); } #endif } template inline void gbcon(char* norm, blas_int* n, blas_int* kl, blas_int* ku, const eT* ab, blas_int* ldab, const blas_int* ipiv, const eT* anorm, eT* rcond, eT* work, blas_int* iwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sgbcon)(norm, n, kl, ku, (T*)ab, ldab, ipiv, (T*)anorm, (T*)rcond, (T*)work, iwork, info, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgbcon)(norm, n, kl, ku, (T*)ab, ldab, ipiv, (T*)anorm, (T*)rcond, (T*)work, iwork, info, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sgbcon)(norm, n, kl, ku, (T*)ab, ldab, ipiv, (T*)anorm, (T*)rcond, (T*)work, iwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dgbcon)(norm, n, kl, ku, (T*)ab, ldab, ipiv, (T*)anorm, (T*)rcond, (T*)work, iwork, info); } #endif } template inline void cx_gbcon(char* norm, blas_int* n, blas_int* kl, blas_int* ku, const std::complex* ab, blas_int* ldab, const blas_int* ipiv, const T* anorm, T* rcond, std::complex* work, T* rwork, blas_int* info) { typedef typename std::complex eT; arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf cx_T; arma_fortran(arma_cgbcon)(norm, n, kl, ku, (cx_T*)ab, ldab, ipiv, (pod_T*)anorm, (pod_T*)rcond, (cx_T*)work, (pod_T*)rwork, info, 1); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd cx_T; arma_fortran(arma_zgbcon)(norm, n, kl, ku, (cx_T*)ab, ldab, ipiv, (pod_T*)anorm, (pod_T*)rcond, (cx_T*)work, (pod_T*)rwork, info, 1); } #else if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf cx_T; arma_fortran(arma_cgbcon)(norm, n, kl, ku, (cx_T*)ab, ldab, ipiv, (pod_T*)anorm, (pod_T*)rcond, (cx_T*)work, (pod_T*)rwork, info); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd cx_T; arma_fortran(arma_zgbcon)(norm, n, kl, ku, (cx_T*)ab, ldab, ipiv, (pod_T*)anorm, (pod_T*)rcond, (cx_T*)work, (pod_T*)rwork, info); } #endif } inline blas_int laenv(blas_int* ispec, char* name, char* opts, blas_int* n1, blas_int* n2, blas_int* n3, blas_int* n4, blas_len name_len, blas_len opts_len) { #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) return arma_fortran(arma_ilaenv)(ispec, name, opts, n1, n2, n3, n4, name_len, opts_len); #else arma_ignore(name_len); arma_ignore(opts_len); return arma_fortran(arma_ilaenv)(ispec, name, opts, n1, n2, n3, n4); // not advised! #endif } template inline void lahqr(blas_int* wantt, blas_int* wantz, blas_int* n, blas_int* ilo, blas_int* ihi, eT* h, blas_int* ldh, eT* wr, eT* wi, blas_int* iloz, blas_int* ihiz, eT* z, blas_int* ldz, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); if( is_float::value) { typedef float T; arma_fortran(arma_slahqr)(wantt, wantz, n, ilo, ihi, (T*)h, ldh, (T*)wr, (T*)wi, iloz, ihiz, (T*)z, ldz, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dlahqr)(wantt, wantz, n, ilo, ihi, (T*)h, ldh, (T*)wr, (T*)wi, iloz, ihiz, (T*)z, ldz, info); } } template inline void stedc(char* compz, blas_int* n, eT* d, eT* e, eT* z, blas_int* ldz, eT* work, blas_int* lwork, blas_int* iwork, blas_int* liwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_sstedc)(compz, n, (T*)d, (T*)e, (T*)z, ldz, (T*)work, lwork, iwork, liwork, info, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dstedc)(compz, n, (T*)d, (T*)e, (T*)z, ldz, (T*)work, lwork, iwork, liwork, info, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_sstedc)(compz, n, (T*)d, (T*)e, (T*)z, ldz, (T*)work, lwork, iwork, liwork, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dstedc)(compz, n, (T*)d, (T*)e, (T*)z, ldz, (T*)work, lwork, iwork, liwork, info); } #endif } template inline void trevc(char* side, char* howmny, blas_int* select, blas_int* n, eT* t, blas_int* ldt, eT* vl, blas_int* ldvl, eT* vr, blas_int* ldvr, blas_int* mm, blas_int* m, eT* work, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float T; arma_fortran(arma_strevc)(side, howmny, select, n, (T*)t, ldt, (T*)vl, ldvl, (T*)vr, ldvr, mm, m, (T*)work, info, 1, 1); } else if(is_double::value) { typedef double T; arma_fortran(arma_dtrevc)(side, howmny, select, n, (T*)t, ldt, (T*)vl, ldvl, (T*)vr, ldvr, mm, m, (T*)work, info, 1, 1); } #else if( is_float::value) { typedef float T; arma_fortran(arma_strevc)(side, howmny, select, n, (T*)t, ldt, (T*)vl, ldvl, (T*)vr, ldvr, mm, m, (T*)work, info); } else if(is_double::value) { typedef double T; arma_fortran(arma_dtrevc)(side, howmny, select, n, (T*)t, ldt, (T*)vl, ldvl, (T*)vr, ldvr, mm, m, (T*)work, info); } #endif } template inline void larnv(blas_int* idist, blas_int* iseed, const blas_int* n, eT* x) { arma_type_check(( is_supported_blas_type::value == false )); if( is_float::value) { typedef float T; arma_fortran(arma_slarnv)(idist, iseed, n, (T*)x); } else if(is_double::value) { typedef double T; arma_fortran(arma_dlarnv)(idist, iseed, n, (T*)x); } } template inline void gehrd(blas_int* n, blas_int* ilo, blas_int* ihi, eT* a, blas_int* lda, eT* tao, eT* work, blas_int* lwork, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); if( is_float::value) { typedef float T; arma_fortran(arma_sgehrd)(n, ilo, ihi, (T*)a, lda, (T*)tao, (T*)work, lwork, info); } else if( is_double::value) { typedef double T; arma_fortran(arma_dgehrd)(n, ilo, ihi, (T*)a, lda, (T*)tao, (T*)work, lwork, info); } else if( is_cx_float::value) { typedef blas_cxf T; arma_fortran(arma_cgehrd)(n, ilo, ihi, (T*)a, lda, (T*)tao, (T*)work, lwork, info); } else if(is_cx_double::value) { typedef blas_cxd T; arma_fortran(arma_zgehrd)(n, ilo, ihi, (T*)a, lda, (T*)tao, (T*)work, lwork, info); } } template inline void pstrf(const char* uplo, const blas_int* n, eT* a, const blas_int* lda, blas_int* piv, blas_int* rank, const typename get_pod_type::result* tol, const typename get_pod_type::result* work, blas_int* info) { arma_type_check(( is_supported_blas_type::value == false )); #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) if( is_float::value) { typedef float pod_T; typedef float T; arma_fortran(arma_spstrf)(uplo, n, (T*)a, lda, piv, rank, (const pod_T*)tol, (pod_T*)work, info, 1); } else if( is_double::value) { typedef double pod_T; typedef double T; arma_fortran(arma_dpstrf)(uplo, n, (T*)a, lda, piv, rank, (const pod_T*)tol, (pod_T*)work, info, 1); } else if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf T; arma_fortran(arma_cpstrf)(uplo, n, (T*)a, lda, piv, rank, (const pod_T*)tol, (pod_T*)work, info, 1); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd T; arma_fortran(arma_zpstrf)(uplo, n, (T*)a, lda, piv, rank, (const pod_T*)tol, (pod_T*)work, info, 1); } #else if( is_float::value) { typedef float pod_T; typedef float T; arma_fortran(arma_spstrf)(uplo, n, (T*)a, lda, piv, rank, (const pod_T*)tol, (pod_T*)work, info); } else if( is_double::value) { typedef double pod_T; typedef double T; arma_fortran(arma_dpstrf)(uplo, n, (T*)a, lda, piv, rank, (const pod_T*)tol, (pod_T*)work, info); } else if( is_cx_float::value) { typedef float pod_T; typedef blas_cxf T; arma_fortran(arma_cpstrf)(uplo, n, (T*)a, lda, piv, rank, (const pod_T*)tol, (pod_T*)work, info); } else if(is_cx_double::value) { typedef double pod_T; typedef blas_cxd T; arma_fortran(arma_zpstrf)(uplo, n, (T*)a, lda, piv, rank, (const pod_T*)tol, (pod_T*)work, info); } #endif } } #endif RcppArmadillo/inst/include/armadillo_bits/spop_var_meat.hpp0000644000176200001440000002262214124060717023746 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_var //! @{ template inline void spop_var::apply(SpMat& out, const mtSpOp& in) { arma_extra_debug_sigprint(); //typedef typename T1::elem_type in_eT; typedef typename T1::pod_type out_eT; const uword norm_type = in.aux_uword_a; const uword dim = in.aux_uword_b; arma_debug_check( (norm_type > 1), "var(): parameter 'norm_type' must be 0 or 1" ); arma_debug_check( (dim > 1), "var(): parameter 'dim' must be 0 or 1" ); const SpProxy p(in.m); if(p.is_alias(out) == false) { spop_var::apply_noalias(out, p, norm_type, dim); } else { SpMat tmp; spop_var::apply_noalias(tmp, p, norm_type, dim); out.steal_mem(tmp); } } template inline void spop_var::apply_noalias ( SpMat& out, const SpProxy& p, const uword norm_type, const uword dim ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type in_eT; //typedef typename T1::pod_type out_eT; const uword p_n_rows = p.get_n_rows(); const uword p_n_cols = p.get_n_cols(); // TODO: this is slow; rewrite based on the approach used by sparse mean() if(dim == 0) // find variance in each column { arma_extra_debug_print("spop_var::apply_noalias(): dim = 0"); out.set_size((p_n_rows > 0) ? 1 : 0, p_n_cols); if( (p_n_rows == 0) || (p.get_n_nonzero() == 0) ) { return; } for(uword col = 0; col < p_n_cols; ++col) { if(SpProxy::use_iterator) { // We must use an iterator; we can't access memory directly. typename SpProxy::const_iterator_type it = p.begin_col(col); typename SpProxy::const_iterator_type end = p.begin_col(col + 1); const uword n_zero = p_n_rows - (end.pos() - it.pos()); // in_eT is used just to get the specialization right (complex / noncomplex) out.at(0, col) = spop_var::iterator_var(it, end, n_zero, norm_type, in_eT(0)); } else { // We can use direct memory access to calculate the variance. out.at(0, col) = spop_var::direct_var ( &p.get_values()[p.get_col_ptrs()[col]], p.get_col_ptrs()[col + 1] - p.get_col_ptrs()[col], p_n_rows, norm_type ); } } } else if(dim == 1) // find variance in each row { arma_extra_debug_print("spop_var::apply_noalias(): dim = 1"); out.set_size(p_n_rows, (p_n_cols > 0) ? 1 : 0); if( (p_n_cols == 0) || (p.get_n_nonzero() == 0) ) { return; } for(uword row = 0; row < p_n_rows; ++row) { // We have to use an iterator here regardless of whether or not we can // directly access memory. typename SpProxy::const_row_iterator_type it = p.begin_row(row); typename SpProxy::const_row_iterator_type end = p.end_row(row); const uword n_zero = p_n_cols - (end.pos() - it.pos()); out.at(row, 0) = spop_var::iterator_var(it, end, n_zero, norm_type, in_eT(0)); } } } template inline typename T1::pod_type spop_var::var_vec ( const T1& X, const uword norm_type ) { arma_extra_debug_sigprint(); arma_debug_check( (norm_type > 1), "var(): parameter 'norm_type' must be 0 or 1" ); // conditionally unwrap it into a temporary and then directly operate. const unwrap_spmat tmp(X); return direct_var(tmp.M.values, tmp.M.n_nonzero, tmp.M.n_elem, norm_type); } template inline eT spop_var::direct_var ( const eT* const X, const uword length, const uword N, const uword norm_type ) { arma_extra_debug_sigprint(); if(length >= 2 && N >= 2) { const eT acc1 = spop_mean::direct_mean(X, length, N); eT acc2 = eT(0); eT acc3 = eT(0); uword i, j; for(i = 0, j = 1; j < length; i += 2, j += 2) { const eT Xi = X[i]; const eT Xj = X[j]; const eT tmpi = acc1 - Xi; const eT tmpj = acc1 - Xj; acc2 += tmpi * tmpi + tmpj * tmpj; acc3 += tmpi + tmpj; } if(i < length) { const eT Xi = X[i]; const eT tmpi = acc1 - Xi; acc2 += tmpi * tmpi; acc3 += tmpi; } // Now add in all zero elements. acc2 += (N - length) * (acc1 * acc1); acc3 += (N - length) * acc1; const eT norm_val = (norm_type == 0) ? eT(N - 1) : eT(N); const eT var_val = (acc2 - (acc3 * acc3) / eT(N)) / norm_val; return var_val; } else if(length == 1 && N > 1) // if N == 1, then variance is zero. { const eT mean = X[0] / eT(N); const eT val = mean - X[0]; const eT acc2 = (val * val) + (N - length) * (mean * mean); const eT acc3 = val + (N - length) * mean; const eT norm_val = (norm_type == 0) ? eT(N - 1) : eT(N); const eT var_val = (acc2 - (acc3 * acc3) / eT(N)) / norm_val; return var_val; } else { return eT(0); } } template inline T spop_var::direct_var ( const std::complex* const X, const uword length, const uword N, const uword norm_type ) { arma_extra_debug_sigprint(); typedef typename std::complex eT; if(length >= 2 && N >= 2) { const eT acc1 = spop_mean::direct_mean(X, length, N); T acc2 = T(0); eT acc3 = eT(0); for(uword i = 0; i < length; ++i) { const eT tmp = acc1 - X[i]; acc2 += std::norm(tmp); acc3 += tmp; } // Add zero elements to sums acc2 += std::norm(acc1) * T(N - length); acc3 += acc1 * T(N - length); const T norm_val = (norm_type == 0) ? T(N - 1) : T(N); const T var_val = (acc2 - std::norm(acc3) / T(N)) / norm_val; return var_val; } else if(length == 1 && N > 1) // if N == 1, then variance is zero. { const eT mean = X[0] / T(N); const eT val = mean - X[0]; const T acc2 = std::norm(val) + (N - length) * std::norm(mean); const eT acc3 = val + T(N - length) * mean; const T norm_val = (norm_type == 0) ? T(N - 1) : T(N); const T var_val = (acc2 - std::norm(acc3) / T(N)) / norm_val; return var_val; } else { return T(0); // All elements are zero } } template inline eT spop_var::iterator_var ( T1& it, const T1& end, const uword n_zero, const uword norm_type, const eT junk1, const typename arma_not_cx::result* junk2 ) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); T1 new_it(it); // for mean // T1 backup_it(it); // in case we have to call robust iterator_var eT mean = spop_mean::iterator_mean(new_it, end, n_zero, eT(0)); eT acc2 = eT(0); eT acc3 = eT(0); const uword it_begin_pos = it.pos(); while(it != end) { const eT tmp = mean - (*it); acc2 += (tmp * tmp); acc3 += (tmp); ++it; } const uword n_nonzero = (it.pos() - it_begin_pos); if(n_nonzero == 0) { return eT(0); } if(n_nonzero + n_zero == 1) { return eT(0); // only one element } // Add in entries for zeros. acc2 += eT(n_zero) * (mean * mean); acc3 += eT(n_zero) * mean; const eT norm_val = (norm_type == 0) ? eT(n_zero + n_nonzero - 1) : eT(n_zero + n_nonzero); const eT var_val = (acc2 - (acc3 * acc3) / eT(n_nonzero + n_zero)) / norm_val; return var_val; } template inline typename get_pod_type::result spop_var::iterator_var ( T1& it, const T1& end, const uword n_zero, const uword norm_type, const eT junk1, const typename arma_cx_only::result* junk2 ) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); typedef typename get_pod_type::result T; T1 new_it(it); // for mean // T1 backup_it(it); // in case we have to call robust iterator_var eT mean = spop_mean::iterator_mean(new_it, end, n_zero, eT(0)); T acc2 = T(0); eT acc3 = eT(0); const uword it_begin_pos = it.pos(); while(it != end) { eT tmp = mean - (*it); acc2 += std::norm(tmp); acc3 += (tmp); ++it; } const uword n_nonzero = (it.pos() - it_begin_pos); if(n_nonzero == 0) { return T(0); } if(n_nonzero + n_zero == 1) { return T(0); // only one element } // Add in entries for zero elements. acc2 += T(n_zero) * std::norm(mean); acc3 += T(n_zero) * mean; const T norm_val = (norm_type == 0) ? T(n_zero + n_nonzero - 1) : T(n_zero + n_nonzero); const T var_val = (acc2 - std::norm(acc3) / T(n_nonzero + n_zero)) / norm_val; return var_val; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_strans_meat.hpp0000644000176200001440000002464414125053103024123 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_strans //! @{ //! for tiny square matrices (size <= 4x4) template arma_cold inline void op_strans::apply_mat_noalias_tinysq(Mat& out, const TA& A) { const eT* Am = A.memptr(); eT* outm = out.memptr(); switch(A.n_rows) { case 1: { outm[0] = Am[0]; } break; case 2: { outm[pos::n2] = Am[pos::n2]; outm[pos::n2] = Am[pos::n2]; outm[pos::n2] = Am[pos::n2]; outm[pos::n2] = Am[pos::n2]; } break; case 3: { outm[pos::n3] = Am[pos::n3]; outm[pos::n3] = Am[pos::n3]; outm[pos::n3] = Am[pos::n3]; outm[pos::n3] = Am[pos::n3]; outm[pos::n3] = Am[pos::n3]; outm[pos::n3] = Am[pos::n3]; outm[pos::n3] = Am[pos::n3]; outm[pos::n3] = Am[pos::n3]; outm[pos::n3] = Am[pos::n3]; } break; case 4: { outm[pos::n4] = Am[pos::n4]; outm[pos::n4] = Am[pos::n4]; outm[pos::n4] = Am[pos::n4]; outm[pos::n4] = Am[pos::n4]; outm[pos::n4] = Am[pos::n4]; outm[pos::n4] = Am[pos::n4]; outm[pos::n4] = Am[pos::n4]; outm[pos::n4] = Am[pos::n4]; outm[pos::n4] = Am[pos::n4]; outm[pos::n4] = Am[pos::n4]; outm[pos::n4] = Am[pos::n4]; outm[pos::n4] = Am[pos::n4]; outm[pos::n4] = Am[pos::n4]; outm[pos::n4] = Am[pos::n4]; outm[pos::n4] = Am[pos::n4]; outm[pos::n4] = Am[pos::n4]; } break; default: ; } } template arma_hot inline void op_strans::block_worker(eT* Y, const eT* X, const uword X_n_rows, const uword Y_n_rows, const uword n_rows, const uword n_cols) { for(uword row = 0; row < n_rows; ++row) { const uword Y_offset = row * Y_n_rows; for(uword col = 0; col < n_cols; ++col) { const uword X_offset = col * X_n_rows; Y[col + Y_offset] = X[row + X_offset]; } } } template arma_hot inline void op_strans::apply_mat_noalias_large(Mat& out, const Mat& A) { arma_extra_debug_sigprint(); const uword n_rows = A.n_rows; const uword n_cols = A.n_cols; const uword block_size = 64; const uword n_rows_base = block_size * (n_rows / block_size); const uword n_cols_base = block_size * (n_cols / block_size); const uword n_rows_extra = n_rows - n_rows_base; const uword n_cols_extra = n_cols - n_cols_base; const eT* X = A.memptr(); eT* Y = out.memptr(); for(uword row = 0; row < n_rows_base; row += block_size) { const uword Y_offset = row * n_cols; for(uword col = 0; col < n_cols_base; col += block_size) { const uword X_offset = col * n_rows; op_strans::block_worker(&Y[col + Y_offset], &X[row + X_offset], n_rows, n_cols, block_size, block_size); } const uword X_offset = n_cols_base * n_rows; op_strans::block_worker(&Y[n_cols_base + Y_offset], &X[row + X_offset], n_rows, n_cols, block_size, n_cols_extra); } if(n_rows_extra == 0) { return; } const uword Y_offset = n_rows_base * n_cols; for(uword col = 0; col < n_cols_base; col += block_size) { const uword X_offset = col * n_rows; op_strans::block_worker(&Y[col + Y_offset], &X[n_rows_base + X_offset], n_rows, n_cols, n_rows_extra, block_size); } const uword X_offset = n_cols_base * n_rows; op_strans::block_worker(&Y[n_cols_base + Y_offset], &X[n_rows_base + X_offset], n_rows, n_cols, n_rows_extra, n_cols_extra); } //! Immediate transpose of a dense matrix template arma_hot inline void op_strans::apply_mat_noalias(Mat& out, const TA& A) { arma_extra_debug_sigprint(); const uword A_n_cols = A.n_cols; const uword A_n_rows = A.n_rows; out.set_size(A_n_cols, A_n_rows); if( (TA::is_row) || (TA::is_col) || (A_n_cols == 1) || (A_n_rows == 1) ) { arrayops::copy( out.memptr(), A.memptr(), A.n_elem ); } else { if( (A_n_rows <= 4) && (A_n_rows == A_n_cols) ) { op_strans::apply_mat_noalias_tinysq(out, A); } else if( (A_n_rows >= 512) && (A_n_cols >= 512) ) { op_strans::apply_mat_noalias_large(out, A); } else { eT* outptr = out.memptr(); for(uword k=0; k < A_n_rows; ++k) { const eT* Aptr = &(A.at(k,0)); uword j; for(j=1; j < A_n_cols; j+=2) { const eT tmp_i = (*Aptr); Aptr += A_n_rows; const eT tmp_j = (*Aptr); Aptr += A_n_rows; (*outptr) = tmp_i; outptr++; (*outptr) = tmp_j; outptr++; } if((j-1) < A_n_cols) { (*outptr) = (*Aptr); outptr++;; } } } } } template arma_hot inline void op_strans::apply_mat_inplace(Mat& out) { arma_extra_debug_sigprint(); const uword n_rows = out.n_rows; const uword n_cols = out.n_cols; if(n_rows == n_cols) { arma_extra_debug_print("op_strans::apply(): doing in-place transpose of a square matrix"); const uword N = n_rows; for(uword k=0; k < N; ++k) { eT* colptr = &(out.at(k,k)); eT* rowptr = colptr; colptr++; rowptr += N; uword j; for(j=(k+2); j < N; j+=2) { std::swap( (*rowptr), (*colptr) ); rowptr += N; colptr++; std::swap( (*rowptr), (*colptr) ); rowptr += N; colptr++; } if((j-1) < N) { std::swap( (*rowptr), (*colptr) ); } } } else { Mat tmp; op_strans::apply_mat_noalias(tmp, out); out.steal_mem(tmp); } } template inline void op_strans::apply_mat(Mat& out, const TA& A) { arma_extra_debug_sigprint(); if(&out != &A) { op_strans::apply_mat_noalias(out, A); } else { op_strans::apply_mat_inplace(out); } } template inline void op_strans::apply_proxy(Mat& out, const Proxy& P) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword n_rows = P.get_n_rows(); const uword n_cols = P.get_n_cols(); if( (resolves_to_vector::yes) && (Proxy::use_at == false) ) { out.set_size(n_cols, n_rows); eT* out_mem = out.memptr(); const uword n_elem = P.get_n_elem(); typename Proxy::ea_type Pea = P.get_ea(); uword i,j; for(i=0, j=1; j < n_elem; i+=2, j+=2) { const eT tmp_i = Pea[i]; const eT tmp_j = Pea[j]; out_mem[i] = tmp_i; out_mem[j] = tmp_j; } if(i < n_elem) { out_mem[i] = Pea[i]; } } else // general matrix transpose { out.set_size(n_cols, n_rows); eT* outptr = out.memptr(); for(uword k=0; k < n_rows; ++k) { uword j; for(j=1; j < n_cols; j+=2) { const uword i = j-1; const eT tmp_i = P.at(k,i); const eT tmp_j = P.at(k,j); (*outptr) = tmp_i; outptr++; (*outptr) = tmp_j; outptr++; } const uword i = j-1; if(i < n_cols) { (*outptr) = P.at(k,i); outptr++; } } } } template inline void op_strans::apply_direct(Mat& out, const T1& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // allow detection of in-place transpose if(is_Mat::value || (arma_config::openmp && Proxy::use_mp)) { const unwrap U(X); op_strans::apply_mat(out, U.M); } else { const Proxy P(X); const bool is_alias = P.is_alias(out); if(is_Mat::stored_type>::value) { const quasi_unwrap::stored_type> U(P.Q); if(is_alias) { Mat tmp; op_strans::apply_mat_noalias(tmp, U.M); out.steal_mem(tmp); } else { op_strans::apply_mat_noalias(out, U.M); } } else { if(is_alias) { Mat tmp; op_strans::apply_proxy(tmp, P); out.steal_mem(tmp); } else { op_strans::apply_proxy(out, P); } } } } template inline void op_strans::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); op_strans::apply_direct(out, in.m); } // // // template inline void op_strans_cube::apply_noalias(Cube& out, const Cube& X) { out.set_size(X.n_cols, X.n_rows, X.n_slices); for(uword s=0; s < X.n_slices; ++s) { Mat out_slice( out.slice_memptr(s), X.n_cols, X.n_rows, false, true ); const Mat X_slice( const_cast(X.slice_memptr(s)), X.n_rows, X.n_cols, false, true ); op_strans::apply_mat_noalias(out_slice, X_slice); } } //! @} RcppArmadillo/inst/include/armadillo_bits/op_dot_bones.hpp0000644000176200001440000000703114124060717023556 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_dot //! @{ //! \brief //! dot product operation class op_dot : public traits_op_default { public: template arma_inline static typename arma_not_cx::result direct_dot_arma(const uword n_elem, const eT* const A, const eT* const B); template arma_hot inline static typename arma_cx_only::result direct_dot_arma(const uword n_elem, const eT* const A, const eT* const B); template arma_hot inline static typename arma_real_only::result direct_dot(const uword n_elem, const eT* const A, const eT* const B); template arma_hot inline static typename arma_cx_only::result direct_dot(const uword n_elem, const eT* const A, const eT* const B); template arma_hot inline static typename arma_integral_only::result direct_dot(const uword n_elem, const eT* const A, const eT* const B); template arma_hot inline static eT direct_dot(const uword n_elem, const eT* const A, const eT* const B, const eT* C); template arma_hot inline static typename T1::elem_type apply(const T1& X, const T2& Y); template arma_hot inline static typename arma_not_cx::result apply_proxy(const Proxy& PA, const Proxy& PB); template arma_hot inline static typename arma_cx_only::result apply_proxy(const Proxy& PA, const Proxy& PB); }; //! \brief //! normalised dot product operation class op_norm_dot : public traits_op_default { public: template arma_hot inline static typename T1::elem_type apply(const T1& X, const T2& Y); }; //! \brief //! complex conjugate dot product operation class op_cdot : public traits_op_default { public: template arma_hot inline static eT direct_cdot_arma(const uword n_elem, const eT* const A, const eT* const B); template arma_hot inline static eT direct_cdot(const uword n_elem, const eT* const A, const eT* const B); template arma_hot inline static typename T1::elem_type apply (const T1& X, const T2& Y); template arma_hot inline static typename T1::elem_type apply_unwrap(const T1& X, const T2& Y); template arma_hot inline static typename T1::elem_type apply_proxy (const T1& X, const T2& Y); }; class op_dot_mixed : public traits_op_default { public: template arma_hot inline static typename promote_type::result apply(const T1& A, const T2& B); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_htrans_bones.hpp0000644000176200001440000000717314124060717024276 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_htrans //! @{ //! 'hermitian transpose' operation class op_htrans { public: template struct traits { static constexpr bool is_row = T1::is_col; // deliberately swapped static constexpr bool is_col = T1::is_row; static constexpr bool is_xvec = T1::is_xvec; }; template arma_hot inline static void apply_mat_noalias(Mat& out, const Mat& A, const typename arma_not_cx::result* junk = nullptr); template arma_hot inline static void apply_mat_noalias(Mat& out, const Mat& A, const typename arma_cx_only::result* junk = nullptr); // template arma_hot inline static void block_worker(std::complex* Y, const std::complex* X, const uword X_n_rows, const uword Y_n_rows, const uword n_rows, const uword n_cols); template arma_hot inline static void apply_mat_noalias_large(Mat< std::complex >& out, const Mat< std::complex >& A); // template arma_hot inline static void apply_mat_inplace(Mat& out, const typename arma_not_cx::result* junk = nullptr); template arma_hot inline static void apply_mat_inplace(Mat& out, const typename arma_cx_only::result* junk = nullptr); // template inline static void apply_mat(Mat& out, const Mat& A, const typename arma_not_cx::result* junk = nullptr); template inline static void apply_mat(Mat& out, const Mat& A, const typename arma_cx_only::result* junk = nullptr); // template inline static void apply_proxy(Mat& out, const Proxy& P); // template inline static void apply_direct(Mat& out, const T1& X); template inline static void apply(Mat& out, const Op& in, const typename arma_not_cx::result* junk = nullptr); template inline static void apply(Mat& out, const Op& in, const typename arma_cx_only::result* junk = nullptr); }; class op_htrans2 { public: template struct traits { static constexpr bool is_row = T1::is_col; // deliberately swapped static constexpr bool is_col = T1::is_row; static constexpr bool is_xvec = T1::is_xvec; }; template inline static void apply(Mat& out, const Op& in, const typename arma_not_cx::result* junk = nullptr); template inline static void apply(Mat& out, const Op& in, const typename arma_cx_only::result* junk = nullptr); }; //! @} RcppArmadillo/inst/include/armadillo_bits/glue_kron_bones.hpp0000644000176200001440000000325714124060717024265 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_kron //! @{ class glue_kron { public: template struct traits { static constexpr bool is_row = (T1::is_row && T2::is_row); static constexpr bool is_col = (T1::is_col && T2::is_col); static constexpr bool is_xvec = false; }; template inline static void direct_kron(Mat& out, const Mat& A, const Mat& B); template inline static void direct_kron(Mat< std::complex >& out, const Mat< std::complex >& A, const Mat& B); template inline static void direct_kron(Mat< std::complex >& out, const Mat& A, const Mat< std::complex >& B); template inline static void apply(Mat& out, const Glue& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/mtSpGlue_bones.hpp0000644000176200001440000000321414124060717024031 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup mtSpGlue //! @{ template class mtSpGlue : public SpBase< out_eT, mtSpGlue > { public: typedef out_eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = spglue_type::template traits::is_row; static constexpr bool is_col = spglue_type::template traits::is_col; static constexpr bool is_xvec = spglue_type::template traits::is_xvec; inline mtSpGlue(const T1& in_A, const T2& in_B); inline ~mtSpGlue(); template arma_inline bool is_alias(const SpMat& X) const; const T1& A; //!< first operand; must be derived from SpBase const T2& B; //!< second operand; must be derived from SpBase }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_resize_meat.hpp0000644000176200001440000001022114160256234024105 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_resize //! @{ template inline void op_resize::apply(Mat& out, const Op& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword new_n_rows = in.aux_uword_a; const uword new_n_cols = in.aux_uword_b; const unwrap tmp(in.m); const Mat& A = tmp.M; if(&out == &A) { op_resize::apply_mat_inplace(out, new_n_rows, new_n_cols); } else { op_resize::apply_mat_noalias(out, A, new_n_rows, new_n_cols); } } template inline void op_resize::apply_mat_inplace(Mat& A, const uword new_n_rows, const uword new_n_cols) { arma_extra_debug_sigprint(); if( (A.n_rows == new_n_rows) && (A.n_cols == new_n_cols) ) { return; } if(A.is_empty()) { A.zeros(new_n_rows, new_n_cols); return; } Mat B; op_resize::apply_mat_noalias(B, A, new_n_rows, new_n_cols); A.steal_mem(B); } template inline void op_resize::apply_mat_noalias(Mat& out, const Mat& A, const uword new_n_rows, const uword new_n_cols) { arma_extra_debug_sigprint(); out.set_size(new_n_rows, new_n_cols); if( (new_n_rows > A.n_rows) || (new_n_cols > A.n_cols) ) { out.zeros(); } if( (out.n_elem > 0) && (A.n_elem > 0) ) { const uword end_row = (std::min)(new_n_rows, A.n_rows) - 1; const uword end_col = (std::min)(new_n_cols, A.n_cols) - 1; out.submat(0, 0, end_row, end_col) = A.submat(0, 0, end_row, end_col); } } // template inline void op_resize::apply(Cube& out, const OpCube& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword new_n_rows = in.aux_uword_a; const uword new_n_cols = in.aux_uword_b; const uword new_n_slices = in.aux_uword_c; const unwrap_cube tmp(in.m); const Cube& A = tmp.M; if(&out == &A) { op_resize::apply_cube_inplace(out, new_n_rows, new_n_cols, new_n_slices); } else { op_resize::apply_cube_noalias(out, A, new_n_rows, new_n_cols, new_n_slices); } } template inline void op_resize::apply_cube_inplace(Cube& A, const uword new_n_rows, const uword new_n_cols, const uword new_n_slices) { arma_extra_debug_sigprint(); if( (A.n_rows == new_n_rows) && (A.n_cols == new_n_cols) && (A.n_slices == new_n_slices) ) { return; } if(A.is_empty()) { A.zeros(new_n_rows, new_n_cols, new_n_slices); return; } Cube B; op_resize::apply_cube_noalias(B, A, new_n_rows, new_n_cols, new_n_slices); A.steal_mem(B); } template inline void op_resize::apply_cube_noalias(Cube& out, const Cube& A, const uword new_n_rows, const uword new_n_cols, const uword new_n_slices) { arma_extra_debug_sigprint(); out.set_size(new_n_rows, new_n_cols, new_n_slices); if( (new_n_rows > A.n_rows) || (new_n_cols > A.n_cols) || (new_n_slices > A.n_slices) ) { out.zeros(); } if( (out.n_elem > 0) && (A.n_elem > 0) ) { const uword end_row = (std::min)(new_n_rows, A.n_rows) - 1; const uword end_col = (std::min)(new_n_cols, A.n_cols) - 1; const uword end_slice = (std::min)(new_n_slices, A.n_slices) - 1; out.subcube(0, 0, 0, end_row, end_col, end_slice) = A.subcube(0, 0, 0, end_row, end_col, end_slice); } } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_pinv.hpp0000644000176200001440000000464714124060717022555 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_pinv //! @{ template arma_warn_unused inline typename enable_if2< is_real::value, const Op >::result pinv ( const Base& X, const typename T1::pod_type tol = 0.0, const char* method = nullptr ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; uword method_id = 0; // default setting if(method != nullptr) { const char sig = method[0]; arma_debug_check( ((sig != 's') && (sig != 'd')), "pinv(): unknown method specified" ); if(sig == 's') { method_id = 1; } if(sig == 'd') { method_id = 2; } } return Op(X.get_ref(), eT(tol), method_id, uword(0)); } template inline typename enable_if2< is_real::value, bool >::result pinv ( Mat& out, const Base& X, const typename T1::pod_type tol = 0.0, const char* method = nullptr ) { arma_extra_debug_sigprint(); uword method_id = 0; // default setting if(method != nullptr) { const char sig = method[0]; arma_debug_check( ((sig != 's') && (sig != 'd')), "pinv(): unknown method specified" ); if(sig == 's') { method_id = 1; } if(sig == 'd') { method_id = 2; } } const bool status = op_pinv::apply_direct(out, X.get_ref(), tol, method_id); if(status == false) { out.soft_reset(); arma_debug_warn_level(3, "pinv(): svd failed"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_sp_minus_meat.hpp0000644000176200001440000001517414124060717024454 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_sp_minus //! @{ // scalar - SpBase template inline void op_sp_minus_pre::apply(Mat& out, const SpToDOp& in) { arma_extra_debug_sigprint(); // Note that T1 will be a sparse type, so we use SpProxy. const SpProxy proxy(in.m); out.set_size(proxy.get_n_rows(), proxy.get_n_cols()); out.fill(in.aux); typename SpProxy::const_iterator_type it = proxy.begin(); typename SpProxy::const_iterator_type it_end = proxy.end(); for(; it != it_end; ++it) { out.at(it.row(), it.col()) -= (*it); } } // force apply into SpMat template inline void op_sp_minus_pre::apply(SpMat& out, const SpToDOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // Note that T1 will be a sparse type, so we use SpProxy. const SpProxy proxy(in.m); const uword n_rows = proxy.get_n_rows(); const uword n_cols = proxy.get_n_cols(); out.set_size(n_rows, n_cols); const eT k = in.aux; for(uword c = 0; c < n_cols; ++c) for(uword r = 0; r < n_rows; ++r) { out.at(r, c) = k - proxy.at(r, c); } } // used for the optimization of sparse % (scalar - sparse) template inline void op_sp_minus_pre::apply_inside_schur(SpMat& out, const T2& x, const SpToDOp& y) { arma_extra_debug_sigprint(); const SpProxy proxy2(x); const SpProxy proxy3(y.m); arma_debug_assert_same_size(proxy2.get_n_rows(), proxy2.get_n_cols(), proxy3.get_n_rows(), proxy3.get_n_cols(), "element-wise multiplication"); out.zeros(proxy2.get_n_rows(), proxy2.get_n_cols()); typename SpProxy::const_iterator_type it = proxy2.begin(); typename SpProxy::const_iterator_type it_end = proxy2.end(); const eT k = y.aux; for(; it != it_end; ++it) { const uword it_row = it.row(); const uword it_col = it.col(); out.at(it_row, it_col) = (*it) * (k - proxy3.at(it_row, it_col)); } } // used for the optimization of sparse / (scalar - sparse) template inline void op_sp_minus_pre::apply_inside_div(SpMat& out, const T2& x, const SpToDOp& y) { arma_extra_debug_sigprint(); const SpProxy proxy2(x); const SpProxy proxy3(y.m); arma_debug_assert_same_size(proxy2.get_n_rows(), proxy2.get_n_cols(), proxy3.get_n_rows(), proxy3.get_n_cols(), "element-wise multiplication"); out.zeros(proxy2.get_n_rows(), proxy2.get_n_cols()); typename SpProxy::const_iterator_type it = proxy2.begin(); typename SpProxy::const_iterator_type it_end = proxy2.end(); const eT k = y.aux; for(; it != it_end; ++it) { const uword it_row = it.row(); const uword it_col = it.col(); out.at(it_row, it_col) = (*it) / (k - proxy3.at(it_row, it_col)); } } // SpBase - scalar template inline void op_sp_minus_post::apply(Mat& out, const SpToDOp& in) { arma_extra_debug_sigprint(); // Note that T1 will be a sparse type, so we use SpProxy. const SpProxy proxy(in.m); out.set_size(proxy.get_n_rows(), proxy.get_n_cols()); out.fill(-in.aux); typename SpProxy::const_iterator_type it = proxy.begin(); typename SpProxy::const_iterator_type it_end = proxy.end(); for(; it != it_end; ++it) { out.at(it.row(), it.col()) += (*it); } } // force apply into sparse matrix template inline void op_sp_minus_post::apply(SpMat& out, const SpToDOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; // Note that T1 will be a sparse type, so we use SpProxy. const SpProxy proxy(in.m); const uword n_rows = proxy.get_n_rows(); const uword n_cols = proxy.get_n_cols(); out.set_size(n_rows, n_cols); const eT k = in.aux; for(uword c = 0; c < n_cols; ++c) for(uword r = 0; r < n_rows; ++r) { out.at(r, c) = proxy.at(r, c) - k; } } // used for the optimization of sparse % (sparse - scalar) template inline void op_sp_minus_post::apply_inside_schur(SpMat& out, const T2& x, const SpToDOp& y) { arma_extra_debug_sigprint(); const SpProxy proxy2(x); const SpProxy proxy3(y.m); arma_debug_assert_same_size(proxy2.get_n_rows(), proxy2.get_n_cols(), proxy3.get_n_rows(), proxy3.get_n_cols(), "element-wise multiplication"); out.zeros(proxy2.get_n_rows(), proxy2.get_n_cols()); typename SpProxy::const_iterator_type it = proxy2.begin(); typename SpProxy::const_iterator_type it_end = proxy2.end(); const eT k = y.aux; for(; it != it_end; ++it) { const uword it_row = it.row(); const uword it_col = it.col(); out.at(it_row, it_col) = (*it) * (proxy3.at(it_row, it_col) - k); } } // used for the optimization of sparse / (sparse - scalar) template inline void op_sp_minus_post::apply_inside_div(SpMat& out, const T2& x, const SpToDOp& y) { arma_extra_debug_sigprint(); const SpProxy proxy2(x); const SpProxy proxy3(y.m); arma_debug_assert_same_size(proxy2.get_n_rows(), proxy2.get_n_cols(), proxy3.get_n_rows(), proxy3.get_n_cols(), "element-wise multiplication"); out.zeros(proxy2.get_n_rows(), proxy2.get_n_cols()); typename SpProxy::const_iterator_type it = proxy2.begin(); typename SpProxy::const_iterator_type it_end = proxy2.end(); const eT k = y.aux; for(; it != it_end; ++it) { const uword it_row = it.row(); const uword it_col = it.col(); out.at(it_row, it_col) = (*it) / (proxy3.at(it_row, it_col) - k); } } //! @} RcppArmadillo/inst/include/armadillo_bits/def_superlu.hpp0000644000176200001440000001551714124060717023431 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #if defined(ARMA_USE_SUPERLU) extern "C" { extern void arma_wrapper(sgssv)(superlu::superlu_options_t*, superlu::SuperMatrix*, int*, int*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::SuperLUStat_t*, int*); extern void arma_wrapper(dgssv)(superlu::superlu_options_t*, superlu::SuperMatrix*, int*, int*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::SuperLUStat_t*, int*); extern void arma_wrapper(cgssv)(superlu::superlu_options_t*, superlu::SuperMatrix*, int*, int*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::SuperLUStat_t*, int*); extern void arma_wrapper(zgssv)(superlu::superlu_options_t*, superlu::SuperMatrix*, int*, int*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::SuperLUStat_t*, int*); extern void arma_wrapper(sgssvx)(superlu::superlu_options_t*, superlu::SuperMatrix*, int*, int*, int*, char*, float*, float*, superlu::SuperMatrix*, superlu::SuperMatrix*, void*, int, superlu::SuperMatrix*, superlu::SuperMatrix*, float*, float*, float*, float*, superlu::GlobalLU_t*, superlu::mem_usage_t*, superlu::SuperLUStat_t*, int*); extern void arma_wrapper(dgssvx)(superlu::superlu_options_t*, superlu::SuperMatrix*, int*, int*, int*, char*, double*, double*, superlu::SuperMatrix*, superlu::SuperMatrix*, void*, int, superlu::SuperMatrix*, superlu::SuperMatrix*, double*, double*, double*, double*, superlu::GlobalLU_t*, superlu::mem_usage_t*, superlu::SuperLUStat_t*, int*); extern void arma_wrapper(cgssvx)(superlu::superlu_options_t*, superlu::SuperMatrix*, int*, int*, int*, char*, float*, float*, superlu::SuperMatrix*, superlu::SuperMatrix*, void*, int, superlu::SuperMatrix*, superlu::SuperMatrix*, float*, float*, float*, float*, superlu::GlobalLU_t*, superlu::mem_usage_t*, superlu::SuperLUStat_t*, int*); extern void arma_wrapper(zgssvx)(superlu::superlu_options_t*, superlu::SuperMatrix*, int*, int*, int*, char*, double*, double*, superlu::SuperMatrix*, superlu::SuperMatrix*, void*, int, superlu::SuperMatrix*, superlu::SuperMatrix*, double*, double*, double*, double*, superlu::GlobalLU_t*, superlu::mem_usage_t*, superlu::SuperLUStat_t*, int*); extern void arma_wrapper(sgstrf)(superlu::superlu_options_t*, superlu::SuperMatrix*, int, int, int*, void*, int, int*, int*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::GlobalLU_t*, superlu::SuperLUStat_t*, int*); extern void arma_wrapper(dgstrf)(superlu::superlu_options_t*, superlu::SuperMatrix*, int, int, int*, void*, int, int*, int*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::GlobalLU_t*, superlu::SuperLUStat_t*, int*); extern void arma_wrapper(cgstrf)(superlu::superlu_options_t*, superlu::SuperMatrix*, int, int, int*, void*, int, int*, int*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::GlobalLU_t*, superlu::SuperLUStat_t*, int*); extern void arma_wrapper(zgstrf)(superlu::superlu_options_t*, superlu::SuperMatrix*, int, int, int*, void*, int, int*, int*, superlu::SuperMatrix*, superlu::SuperMatrix*, superlu::GlobalLU_t*, superlu::SuperLUStat_t*, int*); extern void arma_wrapper(sgstrs)(superlu::trans_t, superlu::SuperMatrix*, superlu::SuperMatrix*, int*, int*, superlu::SuperMatrix*, superlu::SuperLUStat_t*, int*); extern void arma_wrapper(dgstrs)(superlu::trans_t, superlu::SuperMatrix*, superlu::SuperMatrix*, int*, int*, superlu::SuperMatrix*, superlu::SuperLUStat_t*, int*); extern void arma_wrapper(cgstrs)(superlu::trans_t, superlu::SuperMatrix*, superlu::SuperMatrix*, int*, int*, superlu::SuperMatrix*, superlu::SuperLUStat_t*, int*); extern void arma_wrapper(zgstrs)(superlu::trans_t, superlu::SuperMatrix*, superlu::SuperMatrix*, int*, int*, superlu::SuperMatrix*, superlu::SuperLUStat_t*, int*); extern float arma_wrapper(slangs)(char* norm, superlu::SuperMatrix* A); extern double arma_wrapper(dlangs)(char* norm, superlu::SuperMatrix* A); extern float arma_wrapper(clangs)(char* norm, superlu::SuperMatrix* A); extern double arma_wrapper(zlangs)(char* norm, superlu::SuperMatrix* A); extern void arma_wrapper(sgscon)(char* norm, superlu::SuperMatrix* L, superlu::SuperMatrix* U, float anorm, float* rcond, superlu::SuperLUStat_t* stat, int* info); extern void arma_wrapper(dgscon)(char* norm, superlu::SuperMatrix* L, superlu::SuperMatrix* U, double anorm, double* rcond, superlu::SuperLUStat_t* stat, int* info); extern void arma_wrapper(cgscon)(char* norm, superlu::SuperMatrix* L, superlu::SuperMatrix* U, float anorm, float* rcond, superlu::SuperLUStat_t* stat, int* info); extern void arma_wrapper(zgscon)(char* norm, superlu::SuperMatrix* L, superlu::SuperMatrix* U, double anorm, double* rcond, superlu::SuperLUStat_t* stat, int* info); extern void arma_wrapper(StatInit)(superlu::SuperLUStat_t*); extern void arma_wrapper(StatFree)(superlu::SuperLUStat_t*); extern void arma_wrapper(set_default_options)(superlu::superlu_options_t*); extern void arma_wrapper(get_perm_c)(int, superlu::SuperMatrix*, int*); extern int arma_wrapper(sp_ienv)(int); extern void arma_wrapper(sp_preorder)(superlu::superlu_options_t*, superlu::SuperMatrix*, int*, int*, superlu::SuperMatrix*); extern void arma_wrapper(Destroy_SuperNode_Matrix)(superlu::SuperMatrix*); extern void arma_wrapper(Destroy_CompCol_Matrix)(superlu::SuperMatrix*); extern void arma_wrapper(Destroy_CompCol_Permuted)(superlu::SuperMatrix*); extern void arma_wrapper(Destroy_SuperMatrix_Store)(superlu::SuperMatrix*); // We also need superlu_malloc() and superlu_free(). // When using the original SuperLU code directly, you (the user) may // define USER_MALLOC and USER_FREE, but the joke is on you because // if you are linking against SuperLU and not compiling from scratch, // it won't actually make a difference anyway! If you've compiled // SuperLU against a custom USER_MALLOC and USER_FREE, you're probably up // shit creek about a thousand different ways before you even get to this // code, so, don't do that! extern void* arma_wrapper(superlu_malloc)(size_t); extern void arma_wrapper(superlu_free)(void*); } #endif RcppArmadillo/inst/include/armadillo_bits/glue_hist_bones.hpp0000644000176200001440000000303414124060717024254 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_hist //! @{ class glue_hist : public traits_glue_default { public: template inline static void apply_noalias(Mat& out, const Mat& X, const Mat& C, const uword dim); template inline static void apply(Mat& out, const mtGlue& expr); }; class glue_hist_default { public: template struct traits { static constexpr bool is_row = T1::is_row; static constexpr bool is_col = T1::is_col; static constexpr bool is_xvec = T1::is_xvec; }; template inline static void apply(Mat& out, const mtGlue& expr); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_n_unique.hpp0000644000176200001440000000640614124060717023417 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_n_unique //! @{ //! \brief //! Get the number of unique nonzero elements in two sparse matrices. //! This is very useful for determining the amount of memory necessary before //! a sparse matrix operation on two matrices. template inline uword n_unique ( const SpBase& x, const SpBase& y, const op_n_unique_type junk ) { arma_extra_debug_sigprint(); const SpProxy pa(x.get_ref()); const SpProxy pb(y.get_ref()); return n_unique(pa,pb,junk); } template arma_hot inline uword n_unique ( const SpProxy& pa, const SpProxy& pb, const op_n_unique_type junk ) { arma_extra_debug_sigprint(); arma_ignore(junk); typename SpProxy::const_iterator_type x_it = pa.begin(); typename SpProxy::const_iterator_type x_it_end = pa.end(); typename SpProxy::const_iterator_type y_it = pb.begin(); typename SpProxy::const_iterator_type y_it_end = pb.end(); uword total_n_nonzero = 0; while( (x_it != x_it_end) || (y_it != y_it_end) ) { if(x_it == y_it) { if(op_n_unique_type::eval((*x_it), (*y_it)) != typename T1::elem_type(0)) { ++total_n_nonzero; } ++x_it; ++y_it; } else { if((x_it.col() < y_it.col()) || ((x_it.col() == y_it.col()) && (x_it.row() < y_it.row()))) // if y is closer to the end { if(op_n_unique_type::eval((*x_it), typename T1::elem_type(0)) != typename T1::elem_type(0)) { ++total_n_nonzero; } ++x_it; } else // x is closer to the end { if(op_n_unique_type::eval(typename T1::elem_type(0), (*y_it)) != typename T1::elem_type(0)) { ++total_n_nonzero; } ++y_it; } } } return total_n_nonzero; } // Simple operators. struct op_n_unique_add { template inline static eT eval(const eT& l, const eT& r) { return (l + r); } }; struct op_n_unique_sub { template inline static eT eval(const eT& l, const eT& r) { return (l - r); } }; struct op_n_unique_mul { template inline static eT eval(const eT& l, const eT& r) { return (l * r); } }; struct op_n_unique_count { template inline static eT eval(const eT&, const eT&) { return eT(1); } }; //! @} RcppArmadillo/inst/include/armadillo_bits/glue_polyfit_bones.hpp0000644000176200001440000000303614124060717024775 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_polyfit //! @{ class glue_polyfit { public: template struct traits { static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; }; template inline static bool apply_noalias(Mat& out, const Col& X, const Col& Y, const uword N); template inline static bool apply_direct(Mat& out, const Base& X_expr, const Base& Y_expr, const uword N); template inline static void apply(Mat& out, const Glue& expr); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_randi.hpp0000644000176200001440000001263714124060717022674 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_randi //! @{ template arma_warn_unused inline obj_type randi(const uword n_rows, const uword n_cols, const distr_param& param = distr_param(), const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename obj_type::elem_type eT; if(is_Col::value) { arma_debug_check( (n_cols != 1), "randi(): incompatible size" ); } else if(is_Row::value) { arma_debug_check( (n_rows != 1), "randi(): incompatible size" ); } obj_type out(n_rows, n_cols, arma_nozeros_indicator()); int a; int b; if(param.state == 0) { a = 0; b = arma_rng::randi::max_val(); } else if(param.state == 1) { a = param.a_int; b = param.b_int; } else { a = int(param.a_double); b = int(param.b_double); } arma_debug_check( (a > b), "randi(): incorrect distribution parameters: a must be less than b" ); arma_rng::randi::fill(out.memptr(), out.n_elem, a, b); return out; } template arma_warn_unused inline obj_type randi(const SizeMat& s, const distr_param& param = distr_param(), const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return randi(s.n_rows, s.n_cols, param); } template arma_warn_unused inline obj_type randi(const uword n_elem, const distr_param& param = distr_param(), const arma_empty_class junk1 = arma_empty_class(), const typename arma_Mat_Col_Row_only::result* junk2 = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk1); arma_ignore(junk2); if(is_Row::value) { return randi(1, n_elem, param); } else { return randi(n_elem, 1, param); } } arma_warn_unused inline imat randi(const uword n_rows, const uword n_cols, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); return randi(n_rows, n_cols, param); } arma_warn_unused inline imat randi(const SizeMat& s, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); return randi(s.n_rows, s.n_cols, param); } arma_warn_unused inline ivec randi(const uword n_elem, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); return randi(n_elem, uword(1), param); } arma_warn_unused inline sword randi(const distr_param& param) { return as_scalar( randi(uword(1), uword(1), param) ); } template arma_warn_unused inline typename arma_scalar_only::result randi(const distr_param& param) { return eT( as_scalar( randi< Col >(uword(1), uword(1), param) ) ); } arma_warn_unused inline sword randi() { return sword( arma_rng::randi() ); } template arma_warn_unused inline typename arma_scalar_only::result randi() { return eT( arma_rng::randi() ); } template arma_warn_unused inline cube_type randi(const uword n_rows, const uword n_cols, const uword n_slices, const distr_param& param = distr_param(), const typename arma_Cube_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename cube_type::elem_type eT; cube_type out(n_rows, n_cols, n_slices, arma_nozeros_indicator()); int a; int b; if(param.state == 0) { a = 0; b = arma_rng::randi::max_val(); } else if(param.state == 1) { a = param.a_int; b = param.b_int; } else { a = int(param.a_double); b = int(param.b_double); } arma_debug_check( (a > b), "randi(): incorrect distribution parameters: a must be less than b" ); arma_rng::randi::fill(out.memptr(), out.n_elem, a, b); return out; } template arma_warn_unused inline cube_type randi(const SizeCube& s, const distr_param& param = distr_param(), const typename arma_Cube_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); return randi(s.n_rows, s.n_cols, s.n_slices, param); } arma_warn_unused inline icube randi(const uword n_rows, const uword n_cols, const uword n_slices, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); return randi(n_rows, n_cols, n_slices, param); } arma_warn_unused inline icube randi(const SizeCube& s, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); return randi(s.n_rows, s.n_cols, s.n_slices, param); } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_intersect_meat.hpp0000644000176200001440000000664214124060717025135 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_intersect //! @{ template inline void glue_intersect::apply(Mat& out, const Glue& X) { arma_extra_debug_sigprint(); uvec iA; uvec iB; glue_intersect::apply(out, iA, iB, X.A, X.B, false); } template inline void glue_intersect::apply(Mat& out, uvec& iA, uvec& iB, const Base& A_expr, const Base& B_expr, const bool calc_indx) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap UA(A_expr.get_ref()); const quasi_unwrap UB(B_expr.get_ref()); if(UA.M.is_empty() || UB.M.is_empty()) { out.reset(); iA.reset(); iB.reset(); return; } uvec A_uniq_indx; uvec B_uniq_indx; Mat A_uniq; Mat B_uniq; if(calc_indx) { A_uniq_indx = find_unique(UA.M); B_uniq_indx = find_unique(UB.M); A_uniq = UA.M.elem(A_uniq_indx); B_uniq = UB.M.elem(B_uniq_indx); } else { A_uniq = unique(UA.M); B_uniq = unique(UB.M); } const uword C_n_elem = A_uniq.n_elem + B_uniq.n_elem; Col C(C_n_elem, arma_nozeros_indicator()); arrayops::copy(C.memptr(), A_uniq.memptr(), A_uniq.n_elem); arrayops::copy(C.memptr() + A_uniq.n_elem, B_uniq.memptr(), B_uniq.n_elem); uvec C_sorted_indx; Col C_sorted; if(calc_indx) { C_sorted_indx = stable_sort_index(C); C_sorted = C.elem(C_sorted_indx); } else { C_sorted = sort(C); } const eT* C_sorted_mem = C_sorted.memptr(); uvec jj(C_n_elem, arma_nozeros_indicator()); // worst case length uword* jj_mem = jj.memptr(); uword jj_count = 0; for(uword i=0; i < (C_n_elem-1); ++i) { if( C_sorted_mem[i] == C_sorted_mem[i+1] ) { jj_mem[jj_count] = i; ++jj_count; } } if(jj_count == 0) { out.reset(); iA.reset(); iB.reset(); return; } const uvec ii(jj.memptr(), jj_count, false); if(UA.M.is_rowvec() && UB.M.is_rowvec()) { out.set_size(1, ii.n_elem); Mat out_alias(out.memptr(), ii.n_elem, 1, false, true); // NOTE: this relies on .elem() not changing the size of the output and not reallocating memory for the output out_alias = C_sorted.elem(ii); } else { out = C_sorted.elem(ii); } if(calc_indx) { iA = A_uniq_indx.elem(C_sorted_indx.elem(ii ) ); iB = B_uniq_indx.elem(C_sorted_indx.elem(ii+1) - A_uniq.n_elem); } } //! @} RcppArmadillo/inst/include/armadillo_bits/constants.hpp0000644000176200001440000002546214164333462023134 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup constants //! @{ namespace priv { class Datum_helper { public: template static typename arma_real_only::result nan(typename arma_real_only::result* junk = nullptr) { arma_ignore(junk); if(std::numeric_limits::has_quiet_NaN) { return std::numeric_limits::quiet_NaN(); } else { return eT(0); } } template static typename arma_cx_only::result nan(typename arma_cx_only::result* junk = nullptr) { arma_ignore(junk); typedef typename get_pod_type::result T; return eT( Datum_helper::nan(), Datum_helper::nan() ); } template static typename arma_integral_only::result nan(typename arma_integral_only::result* junk = nullptr) { arma_ignore(junk); return eT(0); } template static typename arma_real_only::result inf(typename arma_real_only::result* junk = nullptr) { arma_ignore(junk); if(std::numeric_limits::has_infinity) { return std::numeric_limits::infinity(); } else { return std::numeric_limits::max(); } } template static typename arma_cx_only::result inf(typename arma_cx_only::result* junk = nullptr) { arma_ignore(junk); typedef typename get_pod_type::result T; return eT( Datum_helper::inf(), Datum_helper::inf() ); } template static typename arma_integral_only::result inf(typename arma_integral_only::result* junk = nullptr) { arma_ignore(junk); return std::numeric_limits::max(); } }; } //! various constants. //! Physical constants taken from NIST 2018 CODATA values, and some from WolframAlpha (values provided as of 2009-06-23) //! http://physics.nist.gov/cuu/Constants //! http://www.wolframalpha.com //! See also http://en.wikipedia.org/wiki/Physical_constant template class Datum { public: static const eT pi; //!< ratio of any circle's circumference to its diameter static const eT tau; //!< ratio of any circle's circumference to its radius (replacement of 2*pi) static const eT e; //!< base of the natural logarithm static const eT euler; //!< Euler's constant, aka Euler-Mascheroni constant static const eT gratio; //!< golden ratio static const eT sqrt2; //!< square root of 2 static const eT sqrt2pi; //!< square root of 2*pi static const eT log_sqrt2pi; //!< log of square root of 2*pi static const eT eps; //!< the difference between 1 and the least value greater than 1 that is representable static const eT log_min; //!< log of the minimum representable value static const eT log_max; //!< log of the maximum representable value static const eT nan; //!< "not a number" static const eT inf; //!< infinity // static const eT m_u; //!< atomic mass constant (in kg) static const eT N_A; //!< Avogadro constant static const eT k; //!< Boltzmann constant (in joules per kelvin) static const eT k_evk; //!< Boltzmann constant (in eV/K) static const eT a_0; //!< Bohr radius (in meters) static const eT mu_B; //!< Bohr magneton static const eT Z_0; //!< characteristic impedance of vacuum (in ohms) static const eT G_0; //!< conductance quantum (in siemens) static const eT k_e; //!< Coulomb's constant (in meters per farad) static const eT eps_0; //!< electric constant (in farads per meter) static const eT m_e; //!< electron mass (in kg) static const eT eV; //!< electron volt (in joules) static const eT ec; //!< elementary charge (in coulombs) static const eT F; //!< Faraday constant (in coulombs) static const eT alpha; //!< fine-structure constant static const eT alpha_inv; //!< inverse fine-structure constant static const eT K_J; //!< Josephson constant static const eT mu_0; //!< magnetic constant (in henries per meter) static const eT phi_0; //!< magnetic flux quantum (in webers) static const eT R; //!< molar gas constant (in joules per mole kelvin) static const eT G; //!< Newtonian constant of gravitation (in newton square meters per kilogram squared) static const eT h; //!< Planck constant (in joule seconds) static const eT h_bar; //!< Planck constant over 2 pi, aka reduced Planck constant (in joule seconds) static const eT m_p; //!< proton mass (in kg) static const eT R_inf; //!< Rydberg constant (in reciprocal meters) static const eT c_0; //!< speed of light in vacuum (in meters per second) static const eT sigma; //!< Stefan-Boltzmann constant static const eT R_k; //!< von Klitzing constant (in ohms) static const eT b; //!< Wien wavelength displacement law constant }; // the long lengths of the constants are for future support of "long double" // and any smart compiler that does high-precision computation at compile-time template const eT Datum::pi = eT(3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679); template const eT Datum::tau = eT(6.2831853071795864769252867665590057683943387987502116419498891846156328125724179972560696506842341359); template const eT Datum::e = eT(2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274); template const eT Datum::euler = eT(0.5772156649015328606065120900824024310421593359399235988057672348848677267776646709369470632917467495); template const eT Datum::gratio = eT(1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374); template const eT Datum::sqrt2 = eT(1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727); template const eT Datum::sqrt2pi = eT(2.5066282746310005024157652848110452530069867406099383166299235763422936546078419749465958383780572661); template const eT Datum::log_sqrt2pi = eT(0.9189385332046727417803297364056176398613974736377834128171515404827656959272603976947432986359541976); template const eT Datum::eps = std::numeric_limits::epsilon(); template const eT Datum::log_min = std::log(std::numeric_limits::min()); template const eT Datum::log_max = std::log(std::numeric_limits::max()); template const eT Datum::nan = priv::Datum_helper::nan(); template const eT Datum::inf = priv::Datum_helper::inf(); template const eT Datum::m_u = eT(1.66053906660e-27); template const eT Datum::N_A = eT(6.02214076e23); template const eT Datum::k = eT(1.380649e-23); template const eT Datum::k_evk = eT(8.617333262e-5); template const eT Datum::a_0 = eT(5.29177210903e-11); template const eT Datum::mu_B = eT(9.2740100783e-24); template const eT Datum::Z_0 = eT(376.730313668); template const eT Datum::G_0 = eT(7.748091729e-5); template const eT Datum::k_e = eT(8.9875517923e9); template const eT Datum::eps_0 = eT(8.8541878128e-12); template const eT Datum::m_e = eT(9.1093837015e-31); template const eT Datum::eV = eT(1.602176634e-19); template const eT Datum::ec = eT(1.602176634e-19); template const eT Datum::F = eT(96485.33212); template const eT Datum::alpha = eT(7.2973525693e-3); template const eT Datum::alpha_inv = eT(137.035999084); template const eT Datum::K_J = eT(483597.8484e9); template const eT Datum::mu_0 = eT(1.25663706212e-6); template const eT Datum::phi_0 = eT(2.067833848e-15); template const eT Datum::R = eT(8.314462618); template const eT Datum::G = eT(6.67430e-11); template const eT Datum::h = eT(6.62607015e-34); template const eT Datum::h_bar = eT(1.054571817e-34); template const eT Datum::m_p = eT(1.67262192369e-27); template const eT Datum::R_inf = eT(10973731.568160); template const eT Datum::c_0 = eT(299792458.0); template const eT Datum::sigma = eT(5.670374419e-8); template const eT Datum::R_k = eT(25812.80745); template const eT Datum::b = eT(2.897771955e-3); typedef Datum fdatum; typedef Datum datum; namespace priv { template static constexpr typename arma_real_only::result most_neg() { return (std::numeric_limits::has_infinity) ? -(std::numeric_limits::infinity()) : std::numeric_limits::lowest(); } template static constexpr typename arma_integral_only::result most_neg() { return std::numeric_limits::lowest(); } template static constexpr typename arma_real_only::result most_pos() { return (std::numeric_limits::has_infinity) ? std::numeric_limits::infinity() : std::numeric_limits::max(); } template static constexpr typename arma_integral_only::result most_pos() { return std::numeric_limits::max(); } } //! @} RcppArmadillo/inst/include/armadillo_bits/op_median_meat.hpp0000644000176200001440000002645314125053103024046 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_median //! @{ //! \brief //! For each row or for each column, find the median value. //! The result is stored in a dense matrix that has either one column or one row. //! The dimension, for which the medians are found, is set via the median() function. template inline void op_median::apply(Mat& out, const Op& in, const typename arma_not_cx::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); // typedef typename T1::elem_type eT; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "median(): parameter 'dim' must be 0 or 1" ); const Proxy P(in.m); typedef typename Proxy::stored_type P_stored_type; const bool is_alias = P.is_alias(out); if(is_Mat::value || is_alias) { const unwrap_check tmp(P.Q, is_alias); const typename unwrap_check::stored_type& X = tmp.M; const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; if(dim == 0) // in each column { arma_extra_debug_print("op_median::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols); if(X_n_rows > 0) { std::vector tmp_vec(X_n_rows); for(uword col=0; col < X_n_cols; ++col) { arrayops::copy( &(tmp_vec[0]), X.colptr(col), X_n_rows ); out[col] = op_median::direct_median(tmp_vec); } } } else // in each row { arma_extra_debug_print("op_median::apply(): dim = 1"); out.set_size(X_n_rows, (X_n_cols > 0) ? 1 : 0); if(X_n_cols > 0) { std::vector tmp_vec(X_n_cols); for(uword row=0; row < X_n_rows; ++row) { for(uword col=0; col < X_n_cols; ++col) { tmp_vec[col] = X.at(row,col); } out[row] = op_median::direct_median(tmp_vec); } } } } else { const uword P_n_rows = P.get_n_rows(); const uword P_n_cols = P.get_n_cols(); if(dim == 0) // in each column { arma_extra_debug_print("op_median::apply(): dim = 0"); out.set_size((P_n_rows > 0) ? 1 : 0, P_n_cols); if(P_n_rows > 0) { std::vector tmp_vec(P_n_rows); for(uword col=0; col < P_n_cols; ++col) { for(uword row=0; row < P_n_rows; ++row) { tmp_vec[row] = P.at(row,col); } out[col] = op_median::direct_median(tmp_vec); } } } else // in each row { arma_extra_debug_print("op_median::apply(): dim = 1"); out.set_size(P_n_rows, (P_n_cols > 0) ? 1 : 0); if(P_n_cols > 0) { std::vector tmp_vec(P_n_cols); for(uword row=0; row < P_n_rows; ++row) { for(uword col=0; col < P_n_cols; ++col) { tmp_vec[col] = P.at(row,col); } out[row] = op_median::direct_median(tmp_vec); } } } } } //! Implementation for complex numbers template inline void op_median::apply(Mat& out, const Op& in, const typename arma_cx_only::result* junk) { arma_extra_debug_sigprint(); arma_ignore(junk); // typedef typename std::complex eT; typedef typename get_pod_type::result T; arma_type_check(( is_same_type::no )); const unwrap_check tmp(in.m, out); const Mat& X = tmp.M; const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; const uword dim = in.aux_uword_a; arma_debug_check( (dim > 1), "median(): parameter 'dim' must be 0 or 1" ); if(dim == 0) // in each column { arma_extra_debug_print("op_median::apply(): dim = 0"); out.set_size((X_n_rows > 0) ? 1 : 0, X_n_cols); if(X_n_rows > 0) { std::vector< arma_cx_median_packet > tmp_vec(X_n_rows); for(uword col=0; col 0) ? 1 : 0); if(X_n_cols > 0) { std::vector< arma_cx_median_packet > tmp_vec(X_n_cols); for(uword row=0; row inline typename T1::elem_type op_median::median_vec ( const T1& X, const typename arma_not_cx::result* junk ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typedef typename Proxy::stored_type P_stored_type; const Proxy P(X); const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "median(): object has no elements"); return Datum::nan; } std::vector tmp_vec(n_elem); if(is_Mat::value) { const unwrap tmp(P.Q); const typename unwrap::stored_type& Y = tmp.M; arrayops::copy( &(tmp_vec[0]), Y.memptr(), n_elem ); } else { if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; ea_type A = P.get_ea(); for(uword i=0; i inline typename T1::elem_type op_median::median_vec ( const T1& X, const typename arma_cx_only::result* junk ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const Proxy P(X); const uword n_elem = P.get_n_elem(); if(n_elem == 0) { arma_debug_check(true, "median(): object has no elements"); return Datum::nan; } std::vector< arma_cx_median_packet > tmp_vec(n_elem); if(Proxy::use_at == false) { typedef typename Proxy::ea_type ea_type; ea_type A = P.get_ea(); for(uword i=0; i inline eT op_median::direct_median(std::vector& X) { arma_extra_debug_sigprint(); // TODO: if NaN is detected, return NaN const uword n_elem = uword(X.size()); const uword half = n_elem/2; typename std::vector::iterator first = X.begin(); typename std::vector::iterator nth = first + half; typename std::vector::iterator pastlast = X.end(); std::nth_element(first, nth, pastlast); if((n_elem % 2) == 0) // even number of elements { typename std::vector::iterator start = X.begin(); typename std::vector::iterator pastend = start + half; const eT val1 = (*nth); const eT val2 = (*(std::max_element(start, pastend))); return op_mean::robust_mean(val1, val2); } else // odd number of elements { return (*nth); } } template inline void op_median::direct_cx_median_index ( uword& out_index1, uword& out_index2, std::vector< arma_cx_median_packet >& X ) { arma_extra_debug_sigprint(); typedef arma_cx_median_packet eT; // TODO: if NaN is detected, return bool set to false, indicating presence of NaN const uword n_elem = uword(X.size()); const uword half = n_elem/2; typename std::vector::iterator first = X.begin(); typename std::vector::iterator nth = first + half; typename std::vector::iterator pastlast = X.end(); std::nth_element(first, nth, pastlast); out_index1 = (*nth).index; if((n_elem % 2) == 0) // even number of elements { typename std::vector::iterator start = X.begin(); typename std::vector::iterator pastend = start + half; out_index2 = (*(std::max_element(start, pastend))).index; } else // odd number of elements { out_index2 = out_index1; } } //! @} RcppArmadillo/inst/include/armadillo_bits/op_sort_index_bones.hpp0000644000176200001440000000634414124060717025154 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_sort_index //! @{ class op_sort_index : public traits_op_col { public: template static inline bool apply_noalias(Mat& out, const Proxy& P, const uword sort_type); template static inline void apply(Mat& out, const mtOp& in); }; class op_stable_sort_index : public traits_op_col { public: template static inline bool apply_noalias(Mat& out, const Proxy& P, const uword sort_type); template static inline void apply(Mat& out, const mtOp& in); }; template struct arma_sort_index_packet { eT val; uword index; }; template struct arma_sort_index_helper_ascend { arma_inline bool operator() (const arma_sort_index_packet& A, const arma_sort_index_packet& B) const { return (A.val < B.val); } }; template struct arma_sort_index_helper_descend { arma_inline bool operator() (const arma_sort_index_packet& A, const arma_sort_index_packet& B) const { return (A.val > B.val); } }; template struct arma_sort_index_helper_ascend< std::complex > { typedef typename std::complex eT; inline bool operator() (const arma_sort_index_packet& A, const arma_sort_index_packet& B) const { return (std::abs(A.val) < std::abs(B.val)); } // inline // bool // operator() (const arma_sort_index_packet& A, const arma_sort_index_packet& B) const // { // const T abs_A_val = std::abs(A.val); // const T abs_B_val = std::abs(B.val); // // return ( (abs_A_val != abs_B_val) ? (abs_A_val < abs_B_val) : (std::arg(A.val) < std::arg(B.val)) ); // } }; template struct arma_sort_index_helper_descend< std::complex > { typedef typename std::complex eT; inline bool operator() (const arma_sort_index_packet& A, const arma_sort_index_packet& B) const { return (std::abs(A.val) > std::abs(B.val)); } // inline // bool // operator() (const arma_sort_index_packet& A, const arma_sort_index_packet& B) const // { // const T abs_A_val = std::abs(A.val); // const T abs_B_val = std::abs(B.val); // // return ( (abs_A_val != abs_B_val) ? (abs_A_val > abs_B_val) : (std::arg(A.val) > std::arg(B.val)) ); // } }; //! @} RcppArmadillo/inst/include/armadillo_bits/spglue_times_meat.hpp0000644000176200001440000004432514124060717024621 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_times //! @{ template inline void spglue_times::apply(SpMat& out, const SpGlue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat UA(X.A); const unwrap_spmat UB(X.B); const bool is_alias = (UA.is_alias(out) || UB.is_alias(out)); if(is_alias == false) { spglue_times::apply_noalias(out, UA.M, UB.M); } else { SpMat tmp; spglue_times::apply_noalias(tmp, UA.M, UB.M); out.steal_mem(tmp); } } template inline void spglue_times::apply(SpMat& out, const SpGlue,T2,spglue_times>& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat UA(X.A.m); const unwrap_spmat UB(X.B); const bool is_alias = (UA.is_alias(out) || UB.is_alias(out)); if(is_alias == false) { spglue_times::apply_noalias(out, UA.M, UB.M); } else { SpMat tmp; spglue_times::apply_noalias(tmp, UA.M, UB.M); out.steal_mem(tmp); } out *= X.A.aux; } template arma_hot inline void spglue_times::apply_noalias(SpMat& c, const SpMat& x, const SpMat& y) { arma_extra_debug_sigprint(); const uword x_n_rows = x.n_rows; const uword x_n_cols = x.n_cols; const uword y_n_rows = y.n_rows; const uword y_n_cols = y.n_cols; arma_debug_assert_mul_size(x_n_rows, x_n_cols, y_n_rows, y_n_cols, "matrix multiplication"); // First we must determine the structure of the new matrix (column pointers). // This follows the algorithm described in 'Sparse Matrix Multiplication // Package (SMMP)' (R.E. Bank and C.C. Douglas, 2001). Their description of // "SYMBMM" does not include anything about memory allocation. In addition it // does not consider that there may be elements which space may be allocated // for but which evaluate to zero anyway. So we have to modify the algorithm // to work that way. For the "SYMBMM" implementation we will not determine // the row indices but instead just the column pointers. //SpMat c(x_n_rows, y_n_cols); // Initializes col_ptrs to 0. c.zeros(x_n_rows, y_n_cols); //if( (x.n_elem == 0) || (y.n_elem == 0) ) { return; } if( (x.n_nonzero == 0) || (y.n_nonzero == 0) ) { return; } // Auxiliary storage which denotes when items have been found. podarray index(x_n_rows); index.fill(x_n_rows); // Fill with invalid links. typename SpMat::const_iterator y_it = y.begin(); typename SpMat::const_iterator y_end = y.end(); // SYMBMM: calculate column pointers for resultant matrix to obtain a good // upper bound on the number of nonzero elements. uword cur_col_length = 0; uword last_ind = x_n_rows + 1; do { const uword y_it_row = y_it.row(); // Look through the column that this point (*y_it) could affect. typename SpMat::const_iterator x_it = x.begin_col_no_sync(y_it_row); while(x_it.col() == y_it_row) { const uword x_it_row = x_it.row(); // A point at x(i, j) and y(j, k) implies a point at c(i, k). if(index[x_it_row] == x_n_rows) { index[x_it_row] = last_ind; last_ind = x_it_row; ++cur_col_length; } ++x_it; } const uword old_col = y_it.col(); ++y_it; // See if column incremented. if(old_col != y_it.col()) { // Set column pointer (this is not a cumulative count; that is done later). access::rw(c.col_ptrs[old_col + 1]) = cur_col_length; cur_col_length = 0; // Return index markers to zero. Use last_ind for traversal. while(last_ind != x_n_rows + 1) { const uword tmp = index[last_ind]; index[last_ind] = x_n_rows; last_ind = tmp; } } } while(y_it != y_end); // Accumulate column pointers. for(uword i = 0; i < c.n_cols; ++i) { access::rw(c.col_ptrs[i + 1]) += c.col_ptrs[i]; } // Now that we know a decent bound on the number of nonzero elements, allocate // the memory and fill it. c.mem_resize(c.col_ptrs[c.n_cols]); // Now the implementation of the NUMBMM algorithm. uword cur_pos = 0; // Current position in c matrix. podarray sums(x_n_rows); // Partial sums. sums.zeros(); podarray sorted_indices(x_n_rows); // upper bound // last_ind is already set to x_n_rows, and cur_col_length is already set to 0. // We will loop through all columns as necessary. uword cur_col = 0; while(cur_col < c.n_cols) { // Skip to next column with elements in it. while((cur_col < c.n_cols) && (c.col_ptrs[cur_col] == c.col_ptrs[cur_col + 1])) { // Update current column pointer to actual number of nonzero elements up // to this point. access::rw(c.col_ptrs[cur_col]) = cur_pos; ++cur_col; } if(cur_col == c.n_cols) { break; } // Update current column pointer. access::rw(c.col_ptrs[cur_col]) = cur_pos; // Check all elements in this column. typename SpMat::const_iterator y_col_it = y.begin_col_no_sync(cur_col); while(y_col_it.col() == cur_col) { const uword y_col_it_row = y_col_it.row(); // Check all elements in the column of the other matrix corresponding to // the row of this column. typename SpMat::const_iterator x_col_it = x.begin_col_no_sync(y_col_it_row); const eT y_value = (*y_col_it); while(x_col_it.col() == y_col_it_row) { const uword x_col_it_row = x_col_it.row(); // A point at x(i, j) and y(j, k) implies a point at c(i, k). // Add to partial sum. const eT x_value = (*x_col_it); sums[x_col_it_row] += (x_value * y_value); // Add point if it hasn't already been marked. if(index[x_col_it_row] == x_n_rows) { index[x_col_it_row] = last_ind; last_ind = x_col_it_row; } ++x_col_it; } ++y_col_it; } // Now sort the indices that were used in this column. uword cur_index = 0; while(last_ind != x_n_rows + 1) { const uword tmp = last_ind; // Check that it wasn't a "fake" nonzero element. if(sums[tmp] != eT(0)) { // Assign to next open position. sorted_indices[cur_index] = tmp; ++cur_index; } last_ind = index[tmp]; index[tmp] = x_n_rows; } // Now sort the indices. if(cur_index != 0) { op_sort::direct_sort_ascending(sorted_indices.memptr(), cur_index); for(uword k = 0; k < cur_index; ++k) { const uword row = sorted_indices[k]; access::rw(c.row_indices[cur_pos]) = row; access::rw(c.values[cur_pos]) = sums[row]; sums[row] = eT(0); ++cur_pos; } } // Move to next column. ++cur_col; } // Update last column pointer and resize to actual memory size. access::rw(c.col_ptrs[c.n_cols]) = cur_pos; c.mem_resize(cur_pos); } // // // template inline void spglue_times_misc::sparse_times_dense(Mat& out, const T1& x, const T2& y) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(is_op_diagmat::value) { const SpMat tmp(y); out = x * tmp; } else { const unwrap_spmat UA(x); const quasi_unwrap UB(y); const SpMat& A = UA.M; const Mat& B = UB.M; if( (resolves_to_vector::no) && (B.is_vec() == false) && B.is_diagmat() ) { const SpMat tmp(diagmat(B)); out = A * tmp; return; } const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; const uword B_n_rows = B.n_rows; const uword B_n_cols = B.n_cols; arma_debug_assert_mul_size(A_n_rows, A_n_cols, B_n_rows, B_n_cols, "matrix multiplication"); if(B_n_cols >= (B_n_rows / uword(100))) { arma_extra_debug_print("using transpose-based multiplication"); const SpMat At = A.st(); const Mat Bt = B.st(); if(A_n_rows == B_n_cols) { spglue_times_misc::dense_times_sparse(out, Bt, At); op_strans::apply_mat(out, out); // since 'out' is square-sized, this will do an inplace transpose } else { Mat tmp; spglue_times_misc::dense_times_sparse(tmp, Bt, At); op_strans::apply_mat(out, tmp); } } else { arma_extra_debug_print("using standard multiplication"); out.zeros(A_n_rows, B_n_cols); typename SpMat::const_iterator A_it = A.begin(); typename SpMat::const_iterator A_it_end = A.end(); while(A_it != A_it_end) { const eT A_it_val = (*A_it); const uword A_it_row = A_it.row(); const uword A_it_col = A_it.col(); for(uword col = 0; col < B_n_cols; ++col) { out.at(A_it_row, col) += A_it_val * B.at(A_it_col, col); } ++A_it; } } } } template inline void spglue_times_misc::dense_times_sparse(Mat& out, const T1& x, const T2& y) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(is_op_diagmat::value) { const SpMat tmp(x); out = tmp * y; } else { const quasi_unwrap UA(x); const unwrap_spmat UB(y); const Mat& A = UA.M; const SpMat& B = UB.M; if( (resolves_to_vector::no) && (A.is_vec() == false) && A.is_diagmat() ) { const SpMat tmp(diagmat(A)); out = tmp * B; return; } arma_debug_assert_mul_size(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "matrix multiplication"); out.zeros(A.n_rows, B.n_cols); if( (A.n_elem > 0) && (B.n_nonzero > 0) ) { if( (arma_config::openmp) && (mp_thread_limit::in_parallel() == false) && (A.n_rows <= (A.n_cols / uword(100))) ) { #if defined(ARMA_USE_OPENMP) { arma_extra_debug_print("using parallelised multiplication"); const uword B_n_cols = B.n_cols; const int n_threads = mp_thread_limit::get(); #pragma omp parallel for schedule(static) num_threads(n_threads) for(uword i=0; i < B_n_cols; ++i) { const uword col_offset_1 = B.col_ptrs[i ]; const uword col_offset_2 = B.col_ptrs[i+1]; const uword col_offset_delta = col_offset_2 - col_offset_1; const uvec indices(const_cast(&(B.row_indices[col_offset_1])), col_offset_delta, false, false); const Col B_col(const_cast< eT*>(&( B.values[col_offset_1])), col_offset_delta, false, false); out.col(i) = A.cols(indices) * B_col; } } #endif } else { arma_extra_debug_print("using standard multiplication"); typename SpMat::const_iterator B_it = B.begin(); typename SpMat::const_iterator B_it_end = B.end(); const uword out_n_rows = out.n_rows; while(B_it != B_it_end) { const eT B_it_val = (*B_it); const uword B_it_col = B_it.col(); const uword B_it_row = B_it.row(); eT* out_col = out.colptr(B_it_col); for(uword row = 0; row < out_n_rows; ++row) { out_col[row] += A.at(row, B_it_row) * B_it_val; } ++B_it; } } } } } // template inline void spglue_times_mixed::apply(SpMat::eT>& out, const mtSpGlue::eT, T1, T2, spglue_times_mixed>& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename eT_promoter::eT out_eT; if( (is_same_type::no) && (is_same_type::yes) ) { // upgrade T1 const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; SpMat AA(arma_layout_indicator(), A); for(uword i=0; i < A.n_nonzero; ++i) { access::rw(AA.values[i]) = out_eT(A.values[i]); } const SpMat& BB = reinterpret_cast< const SpMat& >(B); out = AA * BB; } else if( (is_same_type::yes) && (is_same_type::no) ) { // upgrade T2 const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; const SpMat& AA = reinterpret_cast< const SpMat& >(A); SpMat BB(arma_layout_indicator(), B); for(uword i=0; i < B.n_nonzero; ++i) { access::rw(BB.values[i]) = out_eT(B.values[i]); } out = AA * BB; } else { // upgrade T1 and T2 const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; SpMat AA(arma_layout_indicator(), A); SpMat BB(arma_layout_indicator(), B); for(uword i=0; i < A.n_nonzero; ++i) { access::rw(AA.values[i]) = out_eT(A.values[i]); } for(uword i=0; i < B.n_nonzero; ++i) { access::rw(BB.values[i]) = out_eT(B.values[i]); } out = AA * BB; } } template inline void spglue_times_mixed::sparse_times_dense(Mat< typename promote_type::result >& out, const T1& X, const T2& Y) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); if( (is_same_type::no) && (is_same_type::yes) ) { // upgrade T1 const unwrap_spmat UA(X); const quasi_unwrap UB(Y); const SpMat& A = UA.M; const Mat& B = UB.M; SpMat AA(arma_layout_indicator(), A); for(uword i=0; i < A.n_nonzero; ++i) { access::rw(AA.values[i]) = out_eT(A.values[i]); } const Mat& BB = reinterpret_cast< const Mat& >(B); spglue_times_misc::sparse_times_dense(out, AA, BB); } else if( (is_same_type::yes) && (is_same_type::no) ) { // upgrade T2 const unwrap_spmat UA(X); const quasi_unwrap UB(Y); const SpMat& A = UA.M; const Mat& B = UB.M; const SpMat& AA = reinterpret_cast< const SpMat& >(A); const Mat BB = conv_to< Mat >::from(B); spglue_times_misc::sparse_times_dense(out, AA, BB); } else { // upgrade T1 and T2 const unwrap_spmat UA(X); const quasi_unwrap UB(Y); const SpMat& A = UA.M; const Mat& B = UB.M; SpMat AA(arma_layout_indicator(), A); for(uword i=0; i < A.n_nonzero; ++i) { access::rw(AA.values[i]) = out_eT(A.values[i]); } const Mat BB = conv_to< Mat >::from(B); spglue_times_misc::sparse_times_dense(out, AA, BB); } } template inline void spglue_times_mixed::dense_times_sparse(Mat< typename promote_type::result >& out, const T1& X, const T2& Y) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); if( (is_same_type::no) && (is_same_type::yes) ) { // upgrade T1 const quasi_unwrap UA(X); const unwrap_spmat UB(Y); const Mat& A = UA.M; const SpMat& B = UB.M; const Mat AA = conv_to< Mat >::from(A); const SpMat& BB = reinterpret_cast< const SpMat& >(B); spglue_times_misc::dense_times_sparse(out, AA, BB); } else if( (is_same_type::yes) && (is_same_type::no) ) { // upgrade T2 const quasi_unwrap UA(X); const unwrap_spmat UB(Y); const Mat& A = UA.M; const SpMat& B = UB.M; const Mat& AA = reinterpret_cast< const Mat& >(A); SpMat BB(arma_layout_indicator(), B); for(uword i=0; i < B.n_nonzero; ++i) { access::rw(BB.values[i]) = out_eT(B.values[i]); } spglue_times_misc::dense_times_sparse(out, AA, BB); } else { // upgrade T1 and T2 const quasi_unwrap UA(X); const unwrap_spmat UB(Y); const Mat& A = UA.M; const SpMat& B = UB.M; const Mat AA = conv_to< Mat >::from(A); SpMat BB(arma_layout_indicator(), B); for(uword i=0; i < B.n_nonzero; ++i) { access::rw(BB.values[i]) = out_eT(B.values[i]); } spglue_times_misc::dense_times_sparse(out, AA, BB); } } //! @} RcppArmadillo/inst/include/armadillo_bits/sp_auxlib_meat.hpp0000644000176200001440000024214014124060717024102 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup sp_auxlib //! @{ inline sp_auxlib::form_type sp_auxlib::interpret_form_str(const char* form_str) { arma_extra_debug_sigprint(); // the order of the 3 if statements below is important if( form_str == nullptr ) { return form_none; } if( form_str[0] == char(0) ) { return form_none; } if( form_str[1] == char(0) ) { return form_none; } const char c1 = form_str[0]; const char c2 = form_str[1]; if(c1 == 'l') { if(c2 == 'm') { return form_lm; } if(c2 == 'r') { return form_lr; } if(c2 == 'i') { return form_li; } if(c2 == 'a') { return form_la; } } else if(c1 == 's') { if(c2 == 'm') { return form_sm; } if(c2 == 'r') { return form_sr; } if(c2 == 'i') { return form_si; } if(c2 == 'a') { return form_sa; } } return form_none; } //! immediate eigendecomposition of symmetric real sparse object template inline bool sp_auxlib::eigs_sym(Col& eigval, Mat& eigvec, const SpBase& X, const uword n_eigvals, const form_type form_val, const eigs_opts& opts) { arma_extra_debug_sigprint(); const unwrap_spmat U(X.get_ref()); arma_debug_check( (U.M.is_square() == false), "eigs_sym(): given matrix must be square sized" ); if((arma_config::debug) && (sp_auxlib::rudimentary_sym_check(U.M) == false)) { if(is_cx::no ) { arma_debug_warn_level(1, "eigs_sym(): given matrix is not symmetric"); } if(is_cx::yes) { arma_debug_warn_level(1, "eigs_sym(): given matrix is not hermitian"); } } // TODO: investigate optional redirection of "sm" to ARPACK as it's capable of shift-invert; // TODO: in shift-invert mode, "sm" maps to "lm" of the shift-inverted matrix (with sigma = 0) #if defined(ARMA_USE_NEWARP) { return sp_auxlib::eigs_sym_newarp(eigval, eigvec, U.M, n_eigvals, form_val, opts); } #elif defined(ARMA_USE_ARPACK) { constexpr eT sigma = eT(0); return sp_auxlib::eigs_sym_arpack(eigval, eigvec, U.M, n_eigvals, form_val, sigma, opts); } #else { arma_ignore(eigval); arma_ignore(eigvec); arma_ignore(n_eigvals); arma_ignore(form_val); arma_ignore(opts); arma_stop_logic_error("eigs_sym(): use of NEWARP or ARPACK must be enabled"); return false; } #endif } //! immediate eigendecomposition of symmetric real sparse object template inline bool sp_auxlib::eigs_sym(Col& eigval, Mat& eigvec, const SpBase& X, const uword n_eigvals, const eT sigma, const eigs_opts& opts) { arma_extra_debug_sigprint(); const unwrap_spmat U(X.get_ref()); arma_debug_check( (U.M.is_square() == false), "eigs_sym(): given matrix must be square sized" ); if((arma_config::debug) && (sp_auxlib::rudimentary_sym_check(U.M) == false)) { if(is_cx::no ) { arma_debug_warn_level(1, "eigs_sym(): given matrix is not symmetric"); } if(is_cx::yes) { arma_debug_warn_level(1, "eigs_sym(): given matrix is not hermitian"); } } #if (defined(ARMA_USE_NEWARP) && defined(ARMA_USE_SUPERLU)) { return sp_auxlib::eigs_sym_newarp(eigval, eigvec, U.M, n_eigvals, sigma, opts); } #elif (defined(ARMA_USE_ARPACK) && defined(ARMA_USE_SUPERLU)) { constexpr form_type form_val = form_sigma; return sp_auxlib::eigs_sym_arpack(eigval, eigvec, U.M, n_eigvals, form_val, sigma, opts); } #else { arma_ignore(eigval); arma_ignore(eigvec); arma_ignore(n_eigvals); arma_ignore(sigma); arma_ignore(opts); arma_stop_logic_error("eigs_sym(): use of NEWARP or ARPACK as well as SuperLU must be enabled to use 'sigma'"); return false; } #endif } template inline bool sp_auxlib::eigs_sym_newarp(Col& eigval, Mat& eigvec, const SpMat& X, const uword n_eigvals, const form_type form_val, const eigs_opts& opts) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_NEWARP) { arma_debug_check( (form_val != form_lm) && (form_val != form_sm) && (form_val != form_la) && (form_val != form_sa), "eigs_sym(): unknown form specified" ); if(X.is_square() == false) { return false; } const newarp::SparseGenMatProd op(X); arma_debug_check( (n_eigvals >= op.n_rows), "eigs_sym(): n_eigvals must be less than the number of rows in the matrix" ); // If the matrix is empty, the case is trivial. if( (op.n_cols == 0) || (n_eigvals == 0) ) // We already know n_cols == n_rows. { eigval.reset(); eigvec.reset(); return true; } uword n = op.n_rows; // Use max(2*k+1, 20) as default subspace dimension for the sym case; MATLAB uses max(2*k, 20), but we need to be backward-compatible. uword ncv_default = uword( ((2*n_eigvals+1)>(20)) ? (2*n_eigvals+1) : (20) ); // Use opts.subdim only if it's within the limits, otherwise cap it. uword ncv = ncv_default; if(opts.subdim != 0) { if(opts.subdim < (n_eigvals + 1)) { arma_debug_warn_level(1, "eigs_sym(): opts.subdim must be greater than k; using k+1 instead of ", opts.subdim); ncv = uword(n_eigvals + 1); } else if(opts.subdim > n) { arma_debug_warn_level(1, "eigs_sym(): opts.subdim cannot be greater than n_rows; using n_rows instead of ", opts.subdim); ncv = n; } else { ncv = uword(opts.subdim); } } // Re-check that we are within the limits if(ncv < (n_eigvals + 1)) { ncv = (n_eigvals + 1); } if(ncv > n ) { ncv = n; } eT tol = (std::max)(eT(opts.tol), std::numeric_limits::epsilon()); uword maxiter = uword(opts.maxiter); // eigval.set_size(n_eigvals); // eigvec.set_size(n, n_eigvals); bool status = true; uword nconv = 0; try { if(form_val == form_lm) { newarp::SymEigsSolver< eT, newarp::EigsSelect::LARGEST_MAGN, newarp::SparseGenMatProd > eigs(op, n_eigvals, ncv); eigs.init(); nconv = eigs.compute(maxiter, tol); eigval = eigs.eigenvalues(); eigvec = eigs.eigenvectors(); } else if(form_val == form_sm) { newarp::SymEigsSolver< eT, newarp::EigsSelect::SMALLEST_MAGN, newarp::SparseGenMatProd > eigs(op, n_eigvals, ncv); eigs.init(); nconv = eigs.compute(maxiter, tol); eigval = eigs.eigenvalues(); eigvec = eigs.eigenvectors(); } else if(form_val == form_la) { newarp::SymEigsSolver< eT, newarp::EigsSelect::LARGEST_ALGE, newarp::SparseGenMatProd > eigs(op, n_eigvals, ncv); eigs.init(); nconv = eigs.compute(maxiter, tol); eigval = eigs.eigenvalues(); eigvec = eigs.eigenvectors(); } else if(form_val == form_sa) { newarp::SymEigsSolver< eT, newarp::EigsSelect::SMALLEST_ALGE, newarp::SparseGenMatProd > eigs(op, n_eigvals, ncv); eigs.init(); nconv = eigs.compute(maxiter, tol); eigval = eigs.eigenvalues(); eigvec = eigs.eigenvectors(); } } catch(const std::runtime_error&) { status = false; } if(status == true) { if(nconv == 0) { status = false; } } return status; } #else { arma_ignore(eigval); arma_ignore(eigvec); arma_ignore(X); arma_ignore(n_eigvals); arma_ignore(form_val); arma_ignore(opts); return false; } #endif } template inline bool sp_auxlib::eigs_sym_newarp(Col& eigval, Mat& eigvec, const SpMat& X, const uword n_eigvals, const eT sigma, const eigs_opts& opts) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_NEWARP) { if(X.is_square() == false) { return false; } const newarp::SparseGenRealShiftSolve op(X, sigma); if(op.valid == false) { return false; } arma_debug_check( (n_eigvals >= op.n_rows), "eigs_sym(): n_eigvals must be less than the number of rows in the matrix" ); // If the matrix is empty, the case is trivial. if( (op.n_cols == 0) || (n_eigvals == 0) ) // We already know n_cols == n_rows. { eigval.reset(); eigvec.reset(); return true; } uword n = op.n_rows; // Use max(2*k+1, 20) as default subspace dimension for the sym case; MATLAB uses max(2*k, 20), but we need to be backward-compatible. uword ncv_default = uword( ((2*n_eigvals+1)>(20)) ? (2*n_eigvals+1) : (20) ); // Use opts.subdim only if it's within the limits, otherwise cap it. uword ncv = ncv_default; if(opts.subdim != 0) { if(opts.subdim < (n_eigvals + 1)) { arma_debug_warn_level(1, "eigs_sym(): opts.subdim must be greater than k; using k+1 instead of ", opts.subdim); ncv = uword(n_eigvals + 1); } else if(opts.subdim > n) { arma_debug_warn_level(1, "eigs_sym(): opts.subdim cannot be greater than n_rows; using n_rows instead of ", opts.subdim); ncv = n; } else { ncv = uword(opts.subdim); } } // Re-check that we are within the limits if(ncv < (n_eigvals + 1)) { ncv = (n_eigvals + 1); } if(ncv > n ) { ncv = n; } eT tol = (std::max)(eT(opts.tol), std::numeric_limits::epsilon()); uword maxiter = uword(opts.maxiter); // eigval.set_size(n_eigvals); // eigvec.set_size(n, n_eigvals); bool status = true; uword nconv = 0; try { newarp::SymEigsShiftSolver< eT, newarp::EigsSelect::LARGEST_MAGN, newarp::SparseGenRealShiftSolve > eigs(op, n_eigvals, ncv, sigma); eigs.init(); nconv = eigs.compute(maxiter, tol); eigval = eigs.eigenvalues(); eigvec = eigs.eigenvectors(); } catch(const std::runtime_error&) { status = false; } if(status == true) { if(nconv == 0) { status = false; } } return status; } #else { arma_ignore(eigval); arma_ignore(eigvec); arma_ignore(X); arma_ignore(n_eigvals); arma_ignore(sigma); arma_ignore(opts); return false; } #endif } template inline bool sp_auxlib::eigs_sym_arpack(Col& eigval, Mat& eigvec, const SpMat& X, const uword n_eigvals, const form_type form_val, const eT sigma, const eigs_opts& opts) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_ARPACK) { arma_debug_check( (form_val != form_lm) && (form_val != form_sm) && (form_val != form_la) && (form_val != form_sa) && (form_val != form_sigma), "eigs_sym(): unknown form specified" ); if(X.is_square() == false) { return false; } char which_sm[3] = "SM"; char which_lm[3] = "LM"; char which_sa[3] = "SA"; char which_la[3] = "LA"; char* which; switch(form_val) { case form_sm: which = which_sm; break; case form_lm: which = which_lm; break; case form_sa: which = which_sa; break; case form_la: which = which_la; break; default: which = which_lm; break; } // Make sure we aren't asking for every eigenvalue. // The _saupd() functions allow asking for one more eigenvalue than the _naupd() functions. arma_debug_check( (n_eigvals >= X.n_rows), "eigs_sym(): n_eigvals must be less than the number of rows in the matrix" ); // If the matrix is empty, the case is trivial. if( (X.n_cols == 0) || (n_eigvals == 0) ) // We already know n_cols == n_rows. { eigval.reset(); eigvec.reset(); return true; } // Set up variables that get used for neupd(). blas_int n, ncv, ncv_default, ldv, lworkl, info, maxiter; eT tol = eT(opts.tol); maxiter = blas_int(opts.maxiter); podarray resid, v, workd, workl; podarray iparam, ipntr; podarray rwork; // Not used in this case. n = blas_int(X.n_rows); // The size of the matrix. // Use max(2*k+1, 20) as default subspace dimension for the sym case; MATLAB uses max(2*k, 20), but we need to be backward-compatible. ncv_default = blas_int( ((2*n_eigvals+1)>(20)) ? (2*n_eigvals+1) : (20) ); // Use opts.subdim only if it's within the limits ncv = ncv_default; if(opts.subdim != 0) { if(opts.subdim < (n_eigvals + 1)) { arma_debug_warn_level(1, "eigs_sym(): opts.subdim must be greater than k; using k+1 instead of ", opts.subdim); ncv = blas_int(n_eigvals + 1); } else if(blas_int(opts.subdim) > n) { arma_debug_warn_level(1, "eigs_sym(): opts.subdim cannot be greater than n_rows; using n_rows instead of ", opts.subdim); ncv = n; } else { ncv = blas_int(opts.subdim); } } if(use_sigma) //if(form_val == form_sigma) { run_aupd_shiftinvert(n_eigvals, sigma, X, true /* sym, not gen */, n, tol, maxiter, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, rwork, info); } else { run_aupd_plain(n_eigvals, which, X, true /* sym, not gen */, n, tol, maxiter, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, rwork, info); } if(info != 0) { return false; } // The process has converged, and now we need to recover the actual eigenvectors using seupd() blas_int rvec = 1; // .TRUE blas_int nev = blas_int(n_eigvals); char howmny = 'A'; char bmat = 'I'; // We are considering the standard eigenvalue problem. podarray select(ncv); // Logical array of dimension NCV. blas_int ldz = n; // seupd() will output directly into the eigval and eigvec objects. eigval.zeros(n_eigvals); eigvec.zeros(n, n_eigvals); arpack::seupd(&rvec, &howmny, select.memptr(), eigval.memptr(), eigvec.memptr(), &ldz, (eT*) &sigma, &bmat, &n, which, &nev, &tol, resid.memptr(), &ncv, v.memptr(), &ldv, iparam.memptr(), ipntr.memptr(), workd.memptr(), workl.memptr(), &lworkl, &info); // Check for errors. if(info != 0) { arma_debug_warn_level(1, "eigs_sym(): ARPACK error ", info, " in seupd()"); return false; } return (info == 0); } #else { arma_ignore(eigval); arma_ignore(eigvec); arma_ignore(X); arma_ignore(n_eigvals); arma_ignore(form_val); arma_ignore(sigma); arma_ignore(opts); return false; } #endif } //! immediate eigendecomposition of non-symmetric real sparse object template inline bool sp_auxlib::eigs_gen(Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpBase& X, const uword n_eigvals, const form_type form_val, const eigs_opts& opts) { arma_extra_debug_sigprint(); const unwrap_spmat U(X.get_ref()); arma_debug_check( (U.M.is_square() == false), "eigs_gen(): given matrix must be square sized" ); // TODO: investigate optional redirection of "sm" to ARPACK as it's capable of shift-invert; // TODO: in shift-invert mode, "sm" maps to "lm" of the shift-inverted matrix (with sigma = 0) #if defined(ARMA_USE_NEWARP) { return sp_auxlib::eigs_gen_newarp(eigval, eigvec, U.M, n_eigvals, form_val, opts); } #elif defined(ARMA_USE_ARPACK) { constexpr std::complex sigma = T(0); return sp_auxlib::eigs_gen_arpack(eigval, eigvec, U.M, n_eigvals, form_val, sigma, opts); } #else { arma_ignore(eigval); arma_ignore(eigvec); arma_ignore(n_eigvals); arma_ignore(form_val); arma_ignore(opts); arma_stop_logic_error("eigs_gen(): use of NEWARP or ARPACK must be enabled"); return false; } #endif } //! immediate eigendecomposition of non-symmetric real sparse object template inline bool sp_auxlib::eigs_gen(Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpBase& X, const uword n_eigvals, const std::complex sigma, const eigs_opts& opts) { arma_extra_debug_sigprint(); const unwrap_spmat U(X.get_ref()); arma_debug_check( (U.M.is_square() == false), "eigs_gen(): given matrix must be square sized" ); #if (defined(ARMA_USE_ARPACK) && defined(ARMA_USE_SUPERLU)) { constexpr form_type form_val = form_sigma; return sp_auxlib::eigs_gen_arpack(eigval, eigvec, U.M, n_eigvals, form_val, sigma, opts); } #else { arma_ignore(eigval); arma_ignore(eigvec); arma_ignore(n_eigvals); arma_ignore(sigma); arma_ignore(opts); arma_stop_logic_error("eigs_gen(): use of ARPACK and SuperLU must be enabled to use 'sigma'"); return false; } #endif } template inline bool sp_auxlib::eigs_gen_newarp(Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpMat& X, const uword n_eigvals, const form_type form_val, const eigs_opts& opts) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_NEWARP) { arma_debug_check( (form_val != form_lm) && (form_val != form_sm) && (form_val != form_lr) && (form_val != form_sr) && (form_val != form_li) && (form_val != form_si), "eigs_gen(): unknown form specified" ); if(X.is_square() == false) { return false; } const newarp::SparseGenMatProd op(X); arma_debug_check( (n_eigvals + 1 >= op.n_rows), "eigs_gen(): n_eigvals + 1 must be less than the number of rows in the matrix" ); // If the matrix is empty, the case is trivial. if( (op.n_cols == 0) || (n_eigvals == 0) ) // We already know n_cols == n_rows. { eigval.reset(); eigvec.reset(); return true; } uword n = op.n_rows; // Use max(2*k+1, 20) as default subspace dimension for the gen case; same as MATLAB. uword ncv_default = uword( ((2*n_eigvals+1)>(20)) ? (2*n_eigvals+1) : (20) ); // Use opts.subdim only if it's within the limits uword ncv = ncv_default; if(opts.subdim != 0) { if(opts.subdim < (n_eigvals + 3)) { arma_debug_warn_level(1, "eigs_gen(): opts.subdim must be greater than k+2; using k+3 instead of ", opts.subdim); ncv = uword(n_eigvals + 3); } else if(opts.subdim > n) { arma_debug_warn_level(1, "eigs_gen(): opts.subdim cannot be greater than n_rows; using n_rows instead of ", opts.subdim); ncv = n; } else { ncv = uword(opts.subdim); } } // Re-check that we are within the limits if(ncv < (n_eigvals + 3)) { ncv = (n_eigvals + 3); } if(ncv > n ) { ncv = n; } T tol = (std::max)(T(opts.tol), std::numeric_limits::epsilon()); uword maxiter = uword(opts.maxiter); // eigval.set_size(n_eigvals); // eigvec.set_size(n, n_eigvals); bool status = true; uword nconv = 0; try { if(form_val == form_lm) { newarp::GenEigsSolver< T, newarp::EigsSelect::LARGEST_MAGN, newarp::SparseGenMatProd > eigs(op, n_eigvals, ncv); eigs.init(); nconv = eigs.compute(maxiter, tol); eigval = eigs.eigenvalues(); eigvec = eigs.eigenvectors(); } else if(form_val == form_sm) { newarp::GenEigsSolver< T, newarp::EigsSelect::SMALLEST_MAGN, newarp::SparseGenMatProd > eigs(op, n_eigvals, ncv); eigs.init(); nconv = eigs.compute(maxiter, tol); eigval = eigs.eigenvalues(); eigvec = eigs.eigenvectors(); } else if(form_val == form_lr) { newarp::GenEigsSolver< T, newarp::EigsSelect::LARGEST_REAL, newarp::SparseGenMatProd > eigs(op, n_eigvals, ncv); eigs.init(); nconv = eigs.compute(maxiter, tol); eigval = eigs.eigenvalues(); eigvec = eigs.eigenvectors(); } else if(form_val == form_sr) { newarp::GenEigsSolver< T, newarp::EigsSelect::SMALLEST_REAL, newarp::SparseGenMatProd > eigs(op, n_eigvals, ncv); eigs.init(); nconv = eigs.compute(maxiter, tol); eigval = eigs.eigenvalues(); eigvec = eigs.eigenvectors(); } else if(form_val == form_li) { newarp::GenEigsSolver< T, newarp::EigsSelect::LARGEST_IMAG, newarp::SparseGenMatProd > eigs(op, n_eigvals, ncv); eigs.init(); nconv = eigs.compute(maxiter, tol); eigval = eigs.eigenvalues(); eigvec = eigs.eigenvectors(); } else if(form_val == form_si) { newarp::GenEigsSolver< T, newarp::EigsSelect::SMALLEST_IMAG, newarp::SparseGenMatProd > eigs(op, n_eigvals, ncv); eigs.init(); nconv = eigs.compute(maxiter, tol); eigval = eigs.eigenvalues(); eigvec = eigs.eigenvectors(); } } catch(const std::runtime_error&) { status = false; } if(status == true) { if(nconv == 0) { status = false; } } return status; } #else { arma_ignore(eigval); arma_ignore(eigvec); arma_ignore(X); arma_ignore(n_eigvals); arma_ignore(form_val); arma_ignore(opts); return false; } #endif } template inline bool sp_auxlib::eigs_gen_arpack(Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpMat& X, const uword n_eigvals, const form_type form_val, const std::complex sigma, const eigs_opts& opts) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_ARPACK) { arma_debug_check( (form_val != form_lm) && (form_val != form_sm) && (form_val != form_lr) && (form_val != form_sr) && (form_val != form_li) && (form_val != form_si) && (form_val != form_sigma), "eigs_gen(): unknown form specified" ); if(X.is_square() == false) { return false; } char which_lm[3] = "LM"; char which_sm[3] = "SM"; char which_lr[3] = "LR"; char which_sr[3] = "SR"; char which_li[3] = "LI"; char which_si[3] = "SI"; char* which; switch(form_val) { case form_lm: which = which_lm; break; case form_sm: which = which_sm; break; case form_lr: which = which_lr; break; case form_sr: which = which_sr; break; case form_li: which = which_li; break; case form_si: which = which_si; break; default: which = which_lm; } // Make sure we aren't asking for every eigenvalue. arma_debug_check( (n_eigvals + 1 >= X.n_rows), "eigs_gen(): n_eigvals + 1 must be less than the number of rows in the matrix" ); // If the matrix is empty, the case is trivial. if( (X.n_cols == 0) || (n_eigvals == 0) ) // We already know n_cols == n_rows. { eigval.reset(); eigvec.reset(); return true; } // Set up variables that get used for neupd(). blas_int n, ncv, ncv_default, ldv, lworkl, info, maxiter; T tol = T(opts.tol); maxiter = blas_int(opts.maxiter); podarray resid, v, workd, workl; podarray iparam, ipntr; podarray rwork; // Not used in the real case. n = blas_int(X.n_rows); // The size of the matrix. // Use max(2*k+1, 20) as default subspace dimension for the gen case; same as MATLAB. ncv_default = blas_int( ((2*n_eigvals+1)>(20)) ? (2*n_eigvals+1) : (20) ); // Use opts.subdim only if it's within the limits ncv = ncv_default; if(opts.subdim != 0) { if(opts.subdim < (n_eigvals + 3)) { arma_debug_warn_level(1, "eigs_gen(): opts.subdim must be greater than k+2; using k+3 instead of ", opts.subdim); ncv = blas_int(n_eigvals + 3); } else if(blas_int(opts.subdim) > n) { arma_debug_warn_level(1, "eigs_gen(): opts.subdim cannot be greater than n_rows; using n_rows instead of ", opts.subdim); ncv = n; } else { ncv = blas_int(opts.subdim); } } // WARNING!!! // We are still not able to apply truly complex shifts to real matrices, // in which case the OP that ARPACK wants is different (see [s/d]naupd). // Also, if sigma contains a non-zero imaginary part, retrieving the eigenvalues // becomes utterly messy (see [s/d]eupd, remark #3). // We should never get to the point in which the imaginary part of sigma is non-zero; // the user-facing functions currently convert X from real to complex if a complex sigma is detected. // The check here is just for extra safety, and as a reminder of what's missing. T sigmar = real(sigma); T sigmai = imag(sigma); if(use_sigma) //if(form_val == form_sigma) { if(sigmai != T(0)) { arma_stop_logic_error("eigs_gen(): complex 'sigma' not applicable to real matrix"); return false; } run_aupd_shiftinvert(n_eigvals, sigmar, X, false /* gen, not sym */, n, tol, maxiter, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, rwork, info); } else { run_aupd_plain(n_eigvals, which, X, false /* gen, not sym */, n, tol, maxiter, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, rwork, info); } if(info != 0) { return false; } // The process has converged, and now we need to recover the actual eigenvectors using neupd(). blas_int rvec = 1; // .TRUE blas_int nev = blas_int(n_eigvals); char howmny = 'A'; char bmat = 'I'; // We are considering the standard eigenvalue problem. podarray select(ncv); // logical array of dimension NCV podarray dr(nev + 1); // real array of dimension NEV + 1 podarray di(nev + 1); // real array of dimension NEV + 1 podarray z(n * (nev + 1)); // real N by NEV array if HOWMNY = 'A' blas_int ldz = n; podarray workev(3 * ncv); dr.zeros(); di.zeros(); z.zeros(); arpack::neupd(&rvec, &howmny, select.memptr(), dr.memptr(), di.memptr(), z.memptr(), &ldz, (T*) &sigmar, (T*) &sigmai, workev.memptr(), &bmat, &n, which, &nev, &tol, resid.memptr(), &ncv, v.memptr(), &ldv, iparam.memptr(), ipntr.memptr(), workd.memptr(), workl.memptr(), &lworkl, rwork.memptr(), &info); // Check for errors. if(info != 0) { arma_debug_warn_level(1, "eigs_gen(): ARPACK error ", info, " in neupd()"); return false; } // Put it into the outputs. eigval.set_size(n_eigvals); eigvec.zeros(n, n_eigvals); for(uword i = 0; i < n_eigvals; ++i) { eigval[i] = std::complex(dr[i], di[i]); } // Now recover the eigenvectors. for(uword i = 0; i < n_eigvals; ++i) { // ARPACK ?neupd lays things out kinda odd in memory; // so does LAPACK ?geev -- see auxlib::eig_gen() if((i < n_eigvals - 1) && (eigval[i] == std::conj(eigval[i + 1]))) { for(uword j = 0; j < uword(n); ++j) { eigvec.at(j, i) = std::complex(z[n * i + j], z[n * (i + 1) + j]); eigvec.at(j, i + 1) = std::complex(z[n * i + j], -z[n * (i + 1) + j]); } ++i; // Skip the next one. } else if((i == n_eigvals - 1) && (std::complex(eigval[i]).imag() != 0.0)) { // We don't have the matched conjugate eigenvalue. for(uword j = 0; j < uword(n); ++j) { eigvec.at(j, i) = std::complex(z[n * i + j], z[n * (i + 1) + j]); } } else { // The eigenvector is entirely real. for(uword j = 0; j < uword(n); ++j) { eigvec.at(j, i) = std::complex(z[n * i + j], T(0)); } } } return (info == 0); } #else { arma_ignore(eigval); arma_ignore(eigvec); arma_ignore(X); arma_ignore(n_eigvals); arma_ignore(form_val); arma_ignore(sigma); arma_ignore(opts); return false; } #endif } //! immediate eigendecomposition of non-symmetric complex sparse object template inline bool sp_auxlib::eigs_gen(Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpBase< std::complex, T1>& X_expr, const uword n_eigvals, const form_type form_val, const eigs_opts& opts) { arma_extra_debug_sigprint(); const unwrap_spmat U(X_expr.get_ref()); arma_debug_check( (U.M.is_square() == false), "eigs_gen(): given matrix must be square sized" ); constexpr std::complex sigma = T(0); return sp_auxlib::eigs_gen(eigval, eigvec, U.M, n_eigvals, form_val, sigma, opts); } //! immediate eigendecomposition of non-symmetric complex sparse object template inline bool sp_auxlib::eigs_gen(Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpBase< std::complex, T1>& X, const uword n_eigvals, const std::complex sigma, const eigs_opts& opts) { arma_extra_debug_sigprint(); const unwrap_spmat U(X.get_ref()); arma_debug_check( (U.M.is_square() == false), "eigs_gen(): given matrix must be square sized" ); #if (defined(ARMA_USE_ARPACK) && defined(ARMA_USE_SUPERLU)) { constexpr form_type form_val = form_sigma; return sp_auxlib::eigs_gen(eigval, eigvec, U.M, n_eigvals, form_val, sigma, opts); } #else { arma_ignore(eigval); arma_ignore(eigvec); arma_ignore(n_eigvals); arma_ignore(sigma); arma_ignore(opts); arma_stop_logic_error("eigs_gen(): use of ARPACK and SuperLU must be enabled to use 'sigma'"); return false; } #endif } template inline bool sp_auxlib::eigs_gen(Col< std::complex >& eigval, Mat< std::complex >& eigvec, const SpMat< std::complex >& X, const uword n_eigvals, const form_type form_val, const std::complex sigma, const eigs_opts& opts) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_ARPACK) { // typedef typename std::complex eT; arma_debug_check( (form_val != form_lm) && (form_val != form_sm) && (form_val != form_lr) && (form_val != form_sr) && (form_val != form_li) && (form_val != form_si) && (form_val != form_sigma), "eigs_gen(): unknown form specified" ); if(X.is_square() == false) { return false; } char which_lm[3] = "LM"; char which_sm[3] = "SM"; char which_lr[3] = "LR"; char which_sr[3] = "SR"; char which_li[3] = "LI"; char which_si[3] = "SI"; char* which; switch(form_val) { case form_lm: which = which_lm; break; case form_sm: which = which_sm; break; case form_lr: which = which_lr; break; case form_sr: which = which_sr; break; case form_li: which = which_li; break; case form_si: which = which_si; break; default: which = which_lm; } // Make sure we aren't asking for every eigenvalue. arma_debug_check( (n_eigvals + 1 >= X.n_rows), "eigs_gen(): n_eigvals + 1 must be less than the number of rows in the matrix" ); // If the matrix is empty, the case is trivial. if( (X.n_cols == 0) || (n_eigvals == 0) ) // We already know n_cols == n_rows. { eigval.reset(); eigvec.reset(); return true; } // Set up variables that get used for neupd(). blas_int n, ncv, ncv_default, ldv, lworkl, info, maxiter; T tol = T(opts.tol); maxiter = blas_int(opts.maxiter); podarray< std::complex > resid, v, workd, workl; podarray iparam, ipntr; podarray rwork; n = blas_int(X.n_rows); // The size of the matrix. // Use max(2*k+1, 20) as default subspace dimension for the gen case; same as MATLAB. ncv_default = blas_int( ((2*n_eigvals+1)>(20)) ? (2*n_eigvals+1) : (20) ); // Use opts.subdim only if it's within the limits ncv = ncv_default; if(opts.subdim != 0) { if(opts.subdim < (n_eigvals + 3)) { arma_debug_warn_level(1, "eigs_gen(): opts.subdim must be greater than k+2; using k+3 instead of ", opts.subdim); ncv = blas_int(n_eigvals + 3); } else if(blas_int(opts.subdim) > n) { arma_debug_warn_level(1, "eigs_gen(): opts.subdim cannot be greater than n_rows; using n_rows instead of ", opts.subdim); ncv = n; } else { ncv = blas_int(opts.subdim); } } if(use_sigma) //if(form_val == form_sigma) { run_aupd_shiftinvert(n_eigvals, sigma, X, false /* gen, not sym */, n, tol, maxiter, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, rwork, info); } else { run_aupd_plain(n_eigvals, which, X, false /* gen, not sym */, n, tol, maxiter, resid, ncv, v, ldv, iparam, ipntr, workd, workl, lworkl, rwork, info); } if(info != 0) { return false; } // The process has converged, and now we need to recover the actual eigenvectors using neupd(). blas_int rvec = 1; // .TRUE blas_int nev = blas_int(n_eigvals); char howmny = 'A'; char bmat = 'I'; // We are considering the standard eigenvalue problem. podarray select(ncv); // logical array of dimension NCV podarray> d(nev + 1); // complex array of dimension NEV + 1 podarray> z(n * nev); // complex N by NEV array if HOWMNY = 'A' blas_int ldz = n; podarray> workev(2 * ncv); // Prepare the outputs; neupd() will write directly to them. eigval.zeros(n_eigvals); eigvec.zeros(n, n_eigvals); arpack::neupd(&rvec, &howmny, select.memptr(), eigval.memptr(), (std::complex*) NULL, eigvec.memptr(), &ldz, (std::complex*) &sigma, (std::complex*) NULL, workev.memptr(), &bmat, &n, which, &nev, &tol, resid.memptr(), &ncv, v.memptr(), &ldv, iparam.memptr(), ipntr.memptr(), workd.memptr(), workl.memptr(), &lworkl, rwork.memptr(), &info); // Check for errors. if(info != 0) { arma_debug_warn_level(1, "eigs_gen(): ARPACK error ", info, " in neupd()"); return false; } return (info == 0); } #else { arma_ignore(eigval); arma_ignore(eigvec); arma_ignore(X); arma_ignore(n_eigvals); arma_ignore(form_val); arma_ignore(sigma); arma_ignore(opts); arma_stop_logic_error("eigs_gen(): use of ARPACK must be enabled for decomposition of complex matrices"); return false; } #endif } template inline bool sp_auxlib::spsolve_simple(Mat& X, const SpBase& A_expr, const Base& B_expr, const superlu_opts& user_opts) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_SUPERLU) { typedef typename T1::elem_type eT; superlu::superlu_options_t options; sp_auxlib::set_superlu_opts(options, user_opts); const unwrap_spmat tmp1(A_expr.get_ref()); const SpMat& A = tmp1.M; X = B_expr.get_ref(); // superlu::gssv() uses X as input (the B matrix) and as output (the solution) if(A.n_rows > A.n_cols) { arma_stop_logic_error("spsolve(): solving over-determined systems currently not supported"); X.soft_reset(); return false; } else if(A.n_rows < A.n_cols) { arma_stop_logic_error("spsolve(): solving under-determined systems currently not supported"); X.soft_reset(); return false; } arma_debug_check( (A.n_rows != X.n_rows), "spsolve(): number of rows in the given objects must be the same" ); if(A.is_empty() || X.is_empty()) { X.zeros(A.n_cols, X.n_cols); return true; } if(A.n_nonzero == uword(0)) { X.soft_reset(); return false; } if(arma_config::debug) { bool overflow = false; overflow = (A.n_nonzero > INT_MAX); overflow = (A.n_rows > INT_MAX) || overflow; overflow = (A.n_cols > INT_MAX) || overflow; overflow = (X.n_rows > INT_MAX) || overflow; overflow = (X.n_cols > INT_MAX) || overflow; if(overflow) { arma_stop_runtime_error("spsolve(): integer overflow: matrix dimensions are too large for integer type used by SuperLU"); return false; } } superlu_supermatrix_wrangler x; superlu_supermatrix_wrangler a; const bool status_x = wrap_to_supermatrix(x.get_ref(), X); const bool status_a = copy_to_supermatrix(a.get_ref(), A); if( (status_x == false) || (status_a == false) ) { X.soft_reset(); return false; } superlu_supermatrix_wrangler l; superlu_supermatrix_wrangler u; // paranoia: use SuperLU's memory allocation, in case it reallocs superlu_array_wrangler perm_c(A.n_cols+1); // extra paranoia: increase array length by 1 superlu_array_wrangler perm_r(A.n_rows+1); superlu_stat_wrangler stat; int info = 0; // Return code. arma_extra_debug_print("superlu::gssv()"); superlu::gssv(&options, a.get_ptr(), perm_c.get_ptr(), perm_r.get_ptr(), l.get_ptr(), u.get_ptr(), x.get_ptr(), stat.get_ptr(), &info); // Process the return code. if( (info > 0) && (info <= int(A.n_cols)) ) { // std::ostringstream tmp; // tmp << "spsolve(): could not solve system; LU factorisation completed, but detected zero in U(" << (info-1) << ',' << (info-1) << ')'; // arma_debug_warn_level(1, tmp.str()); } else if(info > int(A.n_cols)) { arma_debug_warn_level(1, "spsolve(): memory allocation failure: could not allocate ", (info - int(A.n_cols)), " bytes"); } else if(info < 0) { arma_debug_warn_level(1, "spsolve(): unknown SuperLU error code from gssv(): ", info); } // No need to extract the data from x, since it's using the same memory as X return (info == 0); } #else { arma_ignore(X); arma_ignore(A_expr); arma_ignore(B_expr); arma_ignore(user_opts); arma_stop_logic_error("spsolve(): use of SuperLU must be enabled"); return false; } #endif } template inline bool sp_auxlib::spsolve_refine(Mat& X, typename T1::pod_type& out_rcond, const SpBase& A_expr, const Base& B_expr, const superlu_opts& user_opts) { arma_extra_debug_sigprint(); #if defined(ARMA_USE_SUPERLU) { typedef typename T1::pod_type T; typedef typename T1::elem_type eT; superlu::superlu_options_t options; sp_auxlib::set_superlu_opts(options, user_opts); const unwrap_spmat tmp1(A_expr.get_ref()); const SpMat& A = tmp1.M; const unwrap tmp2(B_expr.get_ref()); const Mat& B_unwrap = tmp2.M; const bool B_is_modified = ( (user_opts.equilibrate) || (&B_unwrap == &X) ); Mat B_copy; if(B_is_modified) { B_copy = B_unwrap; } const Mat& B = (B_is_modified) ? B_copy : B_unwrap; if(A.n_rows > A.n_cols) { arma_stop_logic_error("spsolve(): solving over-determined systems currently not supported"); X.soft_reset(); return false; } else if(A.n_rows < A.n_cols) { arma_stop_logic_error("spsolve(): solving under-determined systems currently not supported"); X.soft_reset(); return false; } arma_debug_check( (A.n_rows != B.n_rows), "spsolve(): number of rows in the given objects must be the same" ); X.zeros(A.n_cols, B.n_cols); // set the elements to zero, as we don't trust the SuperLU spaghetti code if(A.is_empty() || B.is_empty()) { return true; } if(A.n_nonzero == uword(0)) { X.soft_reset(); return false; } if(arma_config::debug) { bool overflow; overflow = (A.n_nonzero > INT_MAX); overflow = (A.n_rows > INT_MAX) || overflow; overflow = (A.n_cols > INT_MAX) || overflow; overflow = (B.n_rows > INT_MAX) || overflow; overflow = (B.n_cols > INT_MAX) || overflow; overflow = (X.n_rows > INT_MAX) || overflow; overflow = (X.n_cols > INT_MAX) || overflow; if(overflow) { arma_stop_runtime_error("spsolve(): integer overflow: matrix dimensions are too large for integer type used by SuperLU"); return false; } } superlu_supermatrix_wrangler x; superlu_supermatrix_wrangler a; superlu_supermatrix_wrangler b; const bool status_x = wrap_to_supermatrix(x.get_ref(), X); const bool status_a = copy_to_supermatrix(a.get_ref(), A); // NOTE: superlu::gssvx() modifies 'a' if equilibration is enabled const bool status_b = wrap_to_supermatrix(b.get_ref(), B); // NOTE: superlu::gssvx() modifies 'b' if equilibration is enabled if( (status_x == false) || (status_a == false) || (status_b == false) ) { X.soft_reset(); return false; } superlu_supermatrix_wrangler l; superlu_supermatrix_wrangler u; // paranoia: use SuperLU's memory allocation, in case it reallocs superlu_array_wrangler perm_c(A.n_cols+1); // extra paranoia: increase array length by 1 superlu_array_wrangler perm_r(A.n_rows+1); superlu_array_wrangler etree(A.n_cols+1); superlu_array_wrangler R(A.n_rows+1); superlu_array_wrangler C(A.n_cols+1); superlu_array_wrangler ferr(B.n_cols+1); superlu_array_wrangler berr(B.n_cols+1); superlu::GlobalLU_t glu; arrayops::inplace_set(reinterpret_cast(&glu), char(0), sizeof(superlu::GlobalLU_t)); superlu::mem_usage_t mu; arrayops::inplace_set(reinterpret_cast(&mu), char(0), sizeof(superlu::mem_usage_t)); superlu_stat_wrangler stat; char equed[8]; // extra characters for paranoia T rpg = T(0); T rcond = T(0); int info = int(0); // Return code. char work[8]; int lwork = int(0); // 0 means superlu will allocate memory arma_extra_debug_print("superlu::gssvx()"); superlu::gssvx(&options, a.get_ptr(), perm_c.get_ptr(), perm_r.get_ptr(), etree.get_ptr(), equed, R.get_ptr(), C.get_ptr(), l.get_ptr(), u.get_ptr(), &work[0], lwork, b.get_ptr(), x.get_ptr(), &rpg, &rcond, ferr.get_ptr(), berr.get_ptr(), &glu, &mu, stat.get_ptr(), &info); bool status = false; // Process the return code. if(info == 0) { status = true; } if( (info > 0) && (info <= int(A.n_cols)) ) { // std::ostringstream tmp; // tmp << "spsolve(): could not solve system; LU factorisation completed, but detected zero in U(" << (info-1) << ',' << (info-1) << ')'; // arma_debug_warn_level(1, tmp.str()); } else if( (info == int(A.n_cols+1)) && (user_opts.allow_ugly) ) { arma_debug_warn_level(2, "spsolve(): system is singular to working precision (rcond: ", rcond, ")"); status = true; } else if(info > int(A.n_cols+1)) { arma_debug_warn_level(1, "spsolve(): memory allocation failure: could not allocate ", (info - int(A.n_cols)), " bytes"); } else if(info < 0) { arma_debug_warn_level(1, "spsolve(): unknown SuperLU error code from gssvx(): ", info); } // No need to extract the data from x, since it's using the same memory as X out_rcond = rcond; return status; } #else { arma_ignore(X); arma_ignore(out_rcond); arma_ignore(A_expr); arma_ignore(B_expr); arma_ignore(user_opts); arma_stop_logic_error("spsolve(): use of SuperLU must be enabled"); return false; } #endif } // template // inline // typename T1::pod_type // sp_auxlib::rcond(const SpBase& A_expr) // { // arma_extra_debug_sigprint(); // // #if defined(ARMA_USE_SUPERLU) // { // typedef typename T1::pod_type T; // typedef typename T1::elem_type eT; // // const unwrap_spmat tmp1(A_expr.get_ref()); // const SpMat& A = tmp1.M; // // arma_debug_check( (A.is_square() == false), "rcond(): matrix must be square sized" ); // // superlu_opts superlu_opts_default; // superlu::superlu_options_t options; // sp_auxlib::set_superlu_opts(options, superlu_opts_default); // int lwork = 0; // // superlu::GlobalLU_t Glu; // arrayops::fill_zeros(reinterpret_cast(&Glu), sizeof(superlu::GlobalLU_t)); // // superlu_supermatrix_wrangler a; // superlu_supermatrix_wrangler aC; // // const bool status_a = sp_auxlib::copy_to_supermatrix(a.get_ref(), A); // // if(status_a == false) { arma_stop_runtime_error("rcond(): could not construct SuperLU matrix"); return T(0); } // // superlu_supermatrix_wrangler l; // superlu_supermatrix_wrangler u; // // superlu_array_wrangler perm_c(A.n_cols+1); // paranoia: increase array length by 1 // superlu_array_wrangler perm_r(A.n_rows+1); // superlu_array_wrangler etree(A.n_cols+1); // // superlu_stat_wrangler stat; // // int panel_size = superlu::sp_ispec_environ(1); // int relax = superlu::sp_ispec_environ(2); // int slu_info = 0; // Return code. // // arma_extra_debug_print("superlu::gstrf()"); // superlu::get_permutation_c(options.ColPerm, a.get_ptr(), perm_c.get_ptr()); // superlu::sp_preorder_mat(&options, a.get_ptr(), perm_c.get_ptr(), etree.get_ptr(), aC.get_ptr()); // superlu::gstrf(&options, aC.get_ptr(), relax, panel_size, etree.get_ptr(), NULL, lwork, perm_c.get_ptr(), perm_r.get_ptr(), l.get_ptr(), u.get_ptr(), &Glu, stat.get_ptr(), &slu_info); // // if(slu_info != 0) { return T(0); } // // T a_norm_val = sp_auxlib::norm1(a.get_ptr()); // T a_rcond = sp_auxlib::lu_rcond(l.get_ptr(), u.get_ptr(), a_norm_val); // // if(arma_isnan(a_rcond)) { return T(0); } // // return a_rcond; // } // #else // { // typename T1::pod_type T; // // arma_ignore(A_expr); // arma_stop_logic_error("rcond(): use of SuperLU must be enabled"); // // return T(0); // } // #endif // } #if defined(ARMA_USE_SUPERLU) template inline typename get_pod_type::result sp_auxlib::norm1(superlu::SuperMatrix* A) { arma_extra_debug_sigprint(); char norm_id = '1'; return superlu::langs(&norm_id, A); } template inline typename get_pod_type::result sp_auxlib::lu_rcond(superlu::SuperMatrix* L, superlu::SuperMatrix* U, typename get_pod_type::result norm_val) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; char norm_id = '1'; T rcond_out = T(0); int info = int(0); superlu_stat_wrangler stat; superlu::gscon(&norm_id, L, U, norm_val, &rcond_out, stat.get_ptr(), &info); return (info == 0) ? T(rcond_out) : T(0); } inline void sp_auxlib::set_superlu_opts(superlu::superlu_options_t& options, const superlu_opts& user_opts) { arma_extra_debug_sigprint(); // default options as the starting point superlu::set_default_opts(&options); // our settings options.Trans = superlu::NOTRANS; options.ConditionNumber = superlu::YES; // process user_opts if(user_opts.equilibrate == true) { options.Equil = superlu::YES; } if(user_opts.equilibrate == false) { options.Equil = superlu::NO; } if(user_opts.symmetric == true) { options.SymmetricMode = superlu::YES; } if(user_opts.symmetric == false) { options.SymmetricMode = superlu::NO; } options.DiagPivotThresh = user_opts.pivot_thresh; if(user_opts.permutation == superlu_opts::NATURAL) { options.ColPerm = superlu::NATURAL; } if(user_opts.permutation == superlu_opts::MMD_ATA) { options.ColPerm = superlu::MMD_ATA; } if(user_opts.permutation == superlu_opts::MMD_AT_PLUS_A) { options.ColPerm = superlu::MMD_AT_PLUS_A; } if(user_opts.permutation == superlu_opts::COLAMD) { options.ColPerm = superlu::COLAMD; } if(user_opts.refine == superlu_opts::REF_NONE) { options.IterRefine = superlu::NOREFINE; } if(user_opts.refine == superlu_opts::REF_SINGLE) { options.IterRefine = superlu::SLU_SINGLE; } if(user_opts.refine == superlu_opts::REF_DOUBLE) { options.IterRefine = superlu::SLU_DOUBLE; } if(user_opts.refine == superlu_opts::REF_EXTRA) { options.IterRefine = superlu::SLU_EXTRA; } } template inline bool sp_auxlib::copy_to_supermatrix(superlu::SuperMatrix& out, const SpMat& A) { arma_extra_debug_sigprint(); // We store in column-major CSC. out.Stype = superlu::SLU_NC; if( is_float::value) { out.Dtype = superlu::SLU_S; } else if( is_double::value) { out.Dtype = superlu::SLU_D; } else if( is_cx_float::value) { out.Dtype = superlu::SLU_C; } else if(is_cx_double::value) { out.Dtype = superlu::SLU_Z; } out.Mtype = superlu::SLU_GE; // Just a general matrix. We don't know more now. // We have to actually create the object which stores the data. // This gets cleaned by destroy_supermatrix(). // We have to use SuperLU's problematic memory allocation routines since they are // not guaranteed to be new and delete. See the comments in def_superlu.hpp superlu::NCformat* nc = (superlu::NCformat*)superlu::malloc(sizeof(superlu::NCformat)); if(nc == nullptr) { return false; } A.sync(); nc->nnz = A.n_nonzero; nc->nzval = (void*) superlu::malloc(sizeof(eT) * A.n_nonzero ); nc->colptr = (superlu::int_t*)superlu::malloc(sizeof(superlu::int_t) * (A.n_cols + 1)); nc->rowind = (superlu::int_t*)superlu::malloc(sizeof(superlu::int_t) * A.n_nonzero ); if( (nc->nzval == nullptr) || (nc->colptr == nullptr) || (nc->rowind == nullptr) ) { return false; } // Fill the matrix. arrayops::copy((eT*) nc->nzval, A.values, A.n_nonzero); // // These have to be copied by hand, because the types may differ. // for(uword i = 0; i <= A.n_cols; ++i) { nc->colptr[i] = (int_t) A.col_ptrs[i]; } // for(uword i = 0; i < A.n_nonzero; ++i) { nc->rowind[i] = (int_t) A.row_indices[i]; } arrayops::convert(nc->colptr, A.col_ptrs, A.n_cols+1 ); arrayops::convert(nc->rowind, A.row_indices, A.n_nonzero); out.nrow = superlu::int_t(A.n_rows); out.ncol = superlu::int_t(A.n_cols); out.Store = (void*) nc; return true; } // memory efficient implementation of out = A - shift*I, where A is a square matrix template inline bool sp_auxlib::copy_to_supermatrix_with_shift(superlu::SuperMatrix& out, const SpMat& A, const eT shift) { arma_extra_debug_sigprint(); arma_debug_check( (A.is_square() == false), "sp_auxlib::copy_to_supermatrix_with_shift(): given matrix must be square sized" ); if(shift == eT(0)) { arma_extra_debug_print("sp_auxlib::copy_to_supermatrix_with_shift(): shift is zero; redirecting to sp_auxlib::copy_to_supermatrix()"); return sp_auxlib::copy_to_supermatrix(out, A); } // We store in column-major CSC. out.Stype = superlu::SLU_NC; if( is_float::value) { out.Dtype = superlu::SLU_S; } else if( is_double::value) { out.Dtype = superlu::SLU_D; } else if( is_cx_float::value) { out.Dtype = superlu::SLU_C; } else if(is_cx_double::value) { out.Dtype = superlu::SLU_Z; } out.Mtype = superlu::SLU_GE; // Just a general matrix. We don't know more now. // We have to actually create the object which stores the data. // This gets cleaned by destroy_supermatrix(). superlu::NCformat* nc = (superlu::NCformat*)superlu::malloc(sizeof(superlu::NCformat)); if(nc == nullptr) { return false; } A.sync(); uword n_nonzero_diag_old = 0; uword n_nonzero_diag_new = 0; const uword n_search_cols = (std::min)(A.n_rows, A.n_cols); for(uword j=0; j < n_search_cols; ++j) { const uword col_offset = A.col_ptrs[j ]; const uword next_col_offset = A.col_ptrs[j + 1]; const uword* start_ptr = &(A.row_indices[ col_offset]); const uword* end_ptr = &(A.row_indices[next_col_offset]); const uword wanted_row = j; const uword* pos_ptr = std::lower_bound(start_ptr, end_ptr, wanted_row); // binary search if( (pos_ptr != end_ptr) && ((*pos_ptr) == wanted_row) ) { // element on the main diagonal is non-zero ++n_nonzero_diag_old; const uword offset = uword(pos_ptr - start_ptr); const uword index = offset + col_offset; const eT new_val = A.values[index] - shift; if(new_val != eT(0)) { ++n_nonzero_diag_new; } } else { // element on the main diagonal is zero, but sigma is non-zero, // so the number of new non-zero elments on the diagonal is increased ++n_nonzero_diag_new; } } const uword out_n_nonzero = A.n_nonzero - n_nonzero_diag_old + n_nonzero_diag_new; arma_extra_debug_print( arma_str::format("A.n_nonzero: %d") % A.n_nonzero ); arma_extra_debug_print( arma_str::format("n_nonzero_diag_old: %d") % n_nonzero_diag_old ); arma_extra_debug_print( arma_str::format("n_nonzero_diag_new: %d") % n_nonzero_diag_new ); arma_extra_debug_print( arma_str::format("out_n_nonzero: %d") % out_n_nonzero ); nc->nnz = out_n_nonzero; nc->nzval = (void*) superlu::malloc(sizeof(eT) * out_n_nonzero ); nc->colptr = (superlu::int_t*)superlu::malloc(sizeof(superlu::int_t) * (A.n_cols + 1)); nc->rowind = (superlu::int_t*)superlu::malloc(sizeof(superlu::int_t) * out_n_nonzero ); if( (nc->nzval == nullptr) || (nc->colptr == nullptr) || (nc->rowind == nullptr) ) { return false; } // fill the matrix column by column, and insert diagonal elements when necessary nc->colptr[0] = 0; eT* values_current = (eT*) nc->nzval; superlu::int_t* rowind_current = nc->rowind; uword count = 0; for(uword j=0; j < A.n_cols; ++j) { const uword idx_start = A.col_ptrs[j ]; const uword idx_end = A.col_ptrs[j + 1]; const eT* values_start = values_current; uword i = idx_start; // elements in the upper triangular part, excluding the main diagonal for(; (i < idx_end) && (A.row_indices[i] < j); ++i) { (*values_current) = A.values[i]; (*rowind_current) = superlu::int_t(A.row_indices[i]); ++values_current; ++rowind_current; ++count; } // elements on the main diagonal if( (i < idx_end) && (A.row_indices[i] == j) ) { // A(j,j) is non-zero const eT new_diag_val = A.values[i] - shift; if(new_diag_val != eT(0)) { (*values_current) = new_diag_val; (*rowind_current) = superlu::int_t(j); ++values_current; ++rowind_current; ++count; } ++i; } else { // A(j,j) is zero, so insert a new element if(j < n_search_cols) { (*values_current) = -shift; (*rowind_current) = superlu::int_t(j); ++values_current; ++rowind_current; ++count; } } // elements in the lower triangular part, excluding the main diagonal for(; i < idx_end; ++i) { (*values_current) = A.values[i]; (*rowind_current) = superlu::int_t(A.row_indices[i]); ++values_current; ++rowind_current; ++count; } // number of non-zero elements in the j-th column of out const uword nnz_col = values_current - values_start; nc->colptr[j + 1] = superlu::int_t(nc->colptr[j] + nnz_col); } arma_extra_debug_print( arma_str::format("count: %d") % count ); arma_check( (count != out_n_nonzero), "internal error: sp_auxlib::copy_to_supermatrix_with_shift(): count != out_n_nonzero" ); out.nrow = superlu::int_t(A.n_rows); out.ncol = superlu::int_t(A.n_cols); out.Store = (void*) nc; return true; } // // for debugging only // template // inline // void // sp_auxlib::copy_to_spmat(SpMat& out, const superlu::SuperMatrix& A) // { // arma_extra_debug_sigprint(); // // bool type_matched = false; // // if( is_float::value) { type_matched = (A.Dtype == superlu::SLU_S); } // else if( is_double::value) { type_matched = (A.Dtype == superlu::SLU_D); } // else if( is_cx_float::value) { type_matched = (A.Dtype == superlu::SLU_C); } // else if(is_cx_double::value) { type_matched = (A.Dtype == superlu::SLU_Z); } // // arma_debug_check( (type_matched == false), "copy_to_spmat(): type mismatch" ); // arma_debug_check( (A.Mtype != superlu::SLU_GE), "copy_to_spmat(): unknown layout" ); // // const superlu::NCformat* nc = (const superlu::NCformat*)(A.Store); // // if(nc == nullptr) { out.reset(); return; } // // if( (nc->nzval == nullptr) || (nc->colptr == nullptr) || (nc->rowind == nullptr) ) { out.reset(); return; } // // const uword A_n_rows = uword(A.nrow ); // const uword A_n_cols = uword(A.ncol ); // const uword A_n_nonzero = uword(nc->nnz); // // if(A_n_nonzero == 0) { out.zeros(A_n_rows, A_n_cols); return; } // // out.reserve(A_n_rows, A_n_cols, A_n_nonzero); // // arrayops::copy(access::rwp(out.values), (const eT*)(nc->nzval), A_n_nonzero); // // arrayops::convert(access::rwp(out.col_ptrs), nc->colptr, A_n_cols+1 ); // arrayops::convert(access::rwp(out.row_indices), nc->rowind, A_n_nonzero); // } template inline bool sp_auxlib::wrap_to_supermatrix(superlu::SuperMatrix& out, const Mat& A) { arma_extra_debug_sigprint(); // NOTE: this function re-uses memory from matrix A // This is being stored as a dense matrix. out.Stype = superlu::SLU_DN; if( is_float::value) { out.Dtype = superlu::SLU_S; } else if( is_double::value) { out.Dtype = superlu::SLU_D; } else if( is_cx_float::value) { out.Dtype = superlu::SLU_C; } else if(is_cx_double::value) { out.Dtype = superlu::SLU_Z; } out.Mtype = superlu::SLU_GE; // We have to create the object that stores the data. superlu::DNformat* dn = (superlu::DNformat*)superlu::malloc(sizeof(superlu::DNformat)); if(dn == nullptr) { return false; } dn->lda = A.n_rows; dn->nzval = (void*) A.memptr(); // re-use memory instead of copying out.nrow = A.n_rows; out.ncol = A.n_cols; out.Store = (void*) dn; return true; } inline void sp_auxlib::destroy_supermatrix(superlu::SuperMatrix& out) { arma_extra_debug_sigprint(); // Clean up. if(out.Stype == superlu::SLU_NC) { superlu::destroy_compcol_mat(&out); } else if(out.Stype == superlu::SLU_NCP) { superlu::destroy_compcolperm_mat(&out); } else if(out.Stype == superlu::SLU_DN) { // superlu::destroy_dense_mat(&out); // since dn->nzval is set to re-use memory from a Mat object (which manages its own memory), // we cannot simply call superlu::destroy_dense_mat(). // Only the out.Store structure can be freed. superlu::DNformat* dn = (superlu::DNformat*) out.Store; if(dn != nullptr) { superlu::free(dn); } } else if(out.Stype == superlu::SLU_SC) { superlu::destroy_supernode_mat(&out); } else { // Uh, crap. std::ostringstream tmp; tmp << "sp_auxlib::destroy_supermatrix(): unhandled Stype" << std::endl; tmp << "Stype val: " << out.Stype << std::endl; tmp << "Stype name: "; if(out.Stype == superlu::SLU_NC) { tmp << "SLU_NC"; } if(out.Stype == superlu::SLU_NCP) { tmp << "SLU_NCP"; } if(out.Stype == superlu::SLU_NR) { tmp << "SLU_NR"; } if(out.Stype == superlu::SLU_SC) { tmp << "SLU_SC"; } if(out.Stype == superlu::SLU_SCP) { tmp << "SLU_SCP"; } if(out.Stype == superlu::SLU_SR) { tmp << "SLU_SR"; } if(out.Stype == superlu::SLU_DN) { tmp << "SLU_DN"; } if(out.Stype == superlu::SLU_NR_loc) { tmp << "SLU_NR_loc"; } arma_debug_warn_level(1, tmp.str()); arma_stop_runtime_error("internal error: sp_auxlib::destroy_supermatrix()"); } } #endif template inline void sp_auxlib::run_aupd_plain ( const uword n_eigvals, char* which, const SpMat& X, const bool sym, blas_int& n, eT& tol, blas_int& maxiter, podarray& resid, blas_int& ncv, podarray& v, blas_int& ldv, podarray& iparam, podarray& ipntr, podarray& workd, podarray& workl, blas_int& lworkl, podarray& rwork, blas_int& info ) { #if defined(ARMA_USE_ARPACK) { // ARPACK provides a "reverse communication interface" which is an // entertainingly archaic FORTRAN software engineering technique that // basically means that we call saupd()/naupd() and it tells us with some // return code what we need to do next (usually a matrix-vector product) and // then call it again. So this results in some type of iterative process // where we call saupd()/naupd() many times. blas_int ido = 0; // This must be 0 for the first call. char bmat = 'I'; // We are considering the standard eigenvalue problem. n = X.n_rows; // The size of the matrix (should already be set outside). blas_int nev = n_eigvals; resid.set_size(n); // Two contraints on NCV: (NCV > NEV) for sym problems or // (NCV > NEV + 2) for gen problems and (NCV <= N) // // We're calling either arpack::saupd() or arpack::naupd(), // which have slighly different minimum constraint and recommended value for NCV: // http://www.caam.rice.edu/software/ARPACK/UG/node136.html // http://www.caam.rice.edu/software/ARPACK/UG/node138.html if(ncv < (nev + (sym ? 1 : 3))) { ncv = (nev + (sym ? 1 : 3)); } if(ncv > n ) { ncv = n; } v.set_size(n * ncv); // Array N by NCV (output). rwork.set_size(ncv); // Work array of size NCV for complex calls. ldv = n; // "Leading dimension of V exactly as declared in the calling program." // IPARAM: integer array of length 11. iparam.zeros(11); iparam(0) = 1; // Exact shifts (not provided by us). iparam(2) = maxiter; // Maximum iterations; all the examples use 300, but they were written in the ancient times. iparam(6) = 1; // Mode 1: A * x = lambda * x. // IPNTR: integer array of length 14 (output). ipntr.set_size(14); // Real work array used in the basic Arnoldi iteration for reverse communication. workd.set_size(3 * n); // lworkl must be at least 3 * NCV^2 + 6 * NCV. lworkl = 3 * (ncv * ncv) + 6 * ncv; // Real work array of length lworkl. workl.set_size(lworkl); info = 0; // Set to 0 initially to use random initial vector. // All the parameters have been set or created. Time to loop a lot. while(ido != 99) { // Call saupd() or naupd() with the current parameters. if(sym) { arma_extra_debug_print("arpack::saupd()"); arpack::saupd(&ido, &bmat, &n, which, &nev, &tol, resid.memptr(), &ncv, v.memptr(), &ldv, iparam.memptr(), ipntr.memptr(), workd.memptr(), workl.memptr(), &lworkl, &info); } else { arma_extra_debug_print("arpack::naupd()"); arpack::naupd(&ido, &bmat, &n, which, &nev, &tol, resid.memptr(), &ncv, v.memptr(), &ldv, iparam.memptr(), ipntr.memptr(), workd.memptr(), workl.memptr(), &lworkl, rwork.memptr(), &info); } // What do we do now? switch (ido) { case -1: // fallthrough case 1: { // We need to calculate the matrix-vector multiplication y = OP * x // where x is of length n and starts at workd(ipntr(0)), and y is of // length n and starts at workd(ipntr(1)). // operator*(sp_mat, vec) doesn't properly put the result into the // right place so we'll just reimplement it here for now... // Set the output to point at the right memory. We have to subtract // one from FORTRAN pointers... Col out(workd.memptr() + ipntr(1) - 1, n, false /* don't copy */); // Set the input to point at the right memory. Col in(workd.memptr() + ipntr(0) - 1, n, false /* don't copy */); out.zeros(); typename SpMat::const_iterator X_it = X.begin(); typename SpMat::const_iterator X_it_end = X.end(); while(X_it != X_it_end) { const uword X_it_row = X_it.row(); const uword X_it_col = X_it.col(); out[X_it_row] += (*X_it) * in[X_it_col]; ++X_it; } // No need to modify memory further since it was all done in-place. break; } case 99: // Nothing to do here, things have converged. break; default: { return; // Parent frame can look at the value of info. } } } // The process has ended; check the return code. if( (info != 0) && (info != 1) ) { // Print warnings if there was a failure. if(sym) { arma_debug_warn_level(1, "eigs_sym(): ARPACK error ", info, " in saupd()"); } else { arma_debug_warn_level(1, "eigs_gen(): ARPACK error ", info, " in naupd()"); } return; // Parent frame can look at the value of info. } } #else { arma_ignore(n_eigvals); arma_ignore(which); arma_ignore(X); arma_ignore(sym); arma_ignore(n); arma_ignore(tol); arma_ignore(maxiter); arma_ignore(resid); arma_ignore(ncv); arma_ignore(v); arma_ignore(ldv); arma_ignore(iparam); arma_ignore(ipntr); arma_ignore(workd); arma_ignore(workl); arma_ignore(lworkl); arma_ignore(rwork); arma_ignore(info); } #endif } // Here 'sigma' is 'T', but should be 'eT'. // Applying complex shifts to real matrices is currently not directly implemented template inline void sp_auxlib::run_aupd_shiftinvert ( const uword n_eigvals, const T sigma, const SpMat& X, const bool sym, blas_int& n, eT& tol, blas_int& maxiter, podarray& resid, blas_int& ncv, podarray& v, blas_int& ldv, podarray& iparam, podarray& ipntr, podarray& workd, podarray& workl, blas_int& lworkl, podarray& rwork, blas_int& info ) { // TODO: inconsistent use of type names: T can be complex while eT can be real #if (defined(ARMA_USE_ARPACK) && defined(ARMA_USE_SUPERLU)) { char which_lm[3] = "LM"; char* which = which_lm; // NOTE: which_lm is the assumed operation when using shift-invert blas_int ido = 0; // This must be 0 for the first call. char bmat = 'I'; // We are considering the standard eigenvalue problem. n = X.n_rows; // The size of the matrix (should already be set outside). blas_int nev = n_eigvals; resid.set_size(n); // Two contraints on NCV: (NCV > NEV) for sym problems or // (NCV > NEV + 2) for gen problems and (NCV <= N) // // We're calling either arpack::saupd() or arpack::naupd(), // which have slighly different minimum constraint and recommended value for NCV: // http://www.caam.rice.edu/software/ARPACK/UG/node136.html // http://www.caam.rice.edu/software/ARPACK/UG/node138.html if(ncv < (nev + (sym ? 1 : 3))) { ncv = (nev + (sym ? 1 : 3)); } if(ncv > n ) { ncv = n; } v.set_size(n * ncv); // Array N by NCV (output). rwork.set_size(ncv); // Work array of size NCV for complex calls. ldv = n; // "Leading dimension of V exactly as declared in the calling program." // IPARAM: integer array of length 11. iparam.zeros(11); iparam(0) = 1; // Exact shifts (not provided by us). iparam(2) = maxiter; // Maximum iterations; all the examples use 300, but they were written in the ancient times. // iparam(6) = 1; // Mode 1: A * x = lambda * x. // Change IPARAM for shift-invert iparam(6) = 3; // Mode 3: A * x = lambda * M * x, M symmetric semi-definite. OP = inv[A - sigma*M]*M (A complex) or Real_Part{ inv[A - sigma*M]*M } (A real) and B = M. // IPNTR: integer array of length 14 (output). ipntr.set_size(14); // Real work array used in the basic Arnoldi iteration for reverse communication. workd.set_size(3 * n); // lworkl must be at least 3 * NCV^2 + 6 * NCV. lworkl = 3 * (ncv * ncv) + 6 * ncv; // Real work array of length lworkl. workl.set_size(lworkl); info = 0; // Set to 0 initially to use random initial vector. superlu_opts superlu_opts_default; superlu::superlu_options_t options; sp_auxlib::set_superlu_opts(options, superlu_opts_default); int lwork = 0; superlu::trans_t trans = superlu::NOTRANS; superlu::GlobalLU_t Glu; /* Not needed on return. */ arrayops::fill_zeros(reinterpret_cast(&Glu), sizeof(superlu::GlobalLU_t)); superlu_supermatrix_wrangler x; superlu_supermatrix_wrangler xC; const bool status_x = sp_auxlib::copy_to_supermatrix_with_shift(x.get_ref(), X, sigma); if(status_x == false) { arma_stop_runtime_error("run_aupd_shiftinvert(): could not construct SuperLU matrix"); info = blas_int(-1); return; } // // for debugging only // if(true) // { // cout << "*** testing output of copy_to_supermatrix_with_shift()" << endl; // cout << "*** sigma: " << sigma << endl; // // SpMat Y(X); // Y.diag() -= sigma; // // SpMat Z; // // sp_auxlib::copy_to_spmat(Z, x.get_ref()); // // cout << "*** size(Y): " << arma::size(Y) << endl; // cout << "*** size(Z): " << arma::size(Z) << endl; // cout << "*** accu(abs(Y)): " << accu(abs(Y)) << endl; // cout << "*** accu(abs(Z)): " << accu(abs(Z)) << endl; // // if(arma::size(Y) == arma::size(Z)) // { // cout << "*** error: " << accu(abs(Y-Z)) << endl; // } // } superlu_supermatrix_wrangler l; superlu_supermatrix_wrangler u; superlu_array_wrangler perm_c(X.n_cols+1); // paranoia: increase array length by 1 superlu_array_wrangler perm_r(X.n_rows+1); superlu_array_wrangler etree(X.n_cols+1); superlu_stat_wrangler stat; int panel_size = superlu::sp_ispec_environ(1); int relax = superlu::sp_ispec_environ(2); int slu_info = 0; // Return code. arma_extra_debug_print("superlu::gstrf()"); superlu::get_permutation_c(options.ColPerm, x.get_ptr(), perm_c.get_ptr()); superlu::sp_preorder_mat(&options, x.get_ptr(), perm_c.get_ptr(), etree.get_ptr(), xC.get_ptr()); superlu::gstrf(&options, xC.get_ptr(), relax, panel_size, etree.get_ptr(), NULL, lwork, perm_c.get_ptr(), perm_r.get_ptr(), l.get_ptr(), u.get_ptr(), &Glu, stat.get_ptr(), &slu_info); if(slu_info != 0) { arma_debug_warn_level(2, "matrix is singular to working precision"); info = blas_int(-1); return; } eT x_norm_val = sp_auxlib::norm1(x.get_ptr()); eT x_rcond = sp_auxlib::lu_rcond(l.get_ptr(), u.get_ptr(), x_norm_val); if( (x_rcond < std::numeric_limits::epsilon()) || arma_isnan(x_rcond) ) { arma_debug_warn_level(2, "matrix is singular to working precision (rcond: ", x_rcond, ")"); info = blas_int(-1); return; } // All the parameters have been set or created. Time to loop a lot. while(ido != 99) { // Call saupd() or naupd() with the current parameters. if(sym) { arma_extra_debug_print("arpack::saupd()"); arpack::saupd(&ido, &bmat, &n, which, &nev, &tol, resid.memptr(), &ncv, v.memptr(), &ldv, iparam.memptr(), ipntr.memptr(), workd.memptr(), workl.memptr(), &lworkl, &info); } else { arma_extra_debug_print("arpack::naupd()"); arpack::naupd(&ido, &bmat, &n, which, &nev, &tol, resid.memptr(), &ncv, v.memptr(), &ldv, iparam.memptr(), ipntr.memptr(), workd.memptr(), workl.memptr(), &lworkl, rwork.memptr(), &info); } // What do we do now? switch (ido) { case -1: // fallthrough case 1: { // We need to calculate the matrix-vector multiplication y = OP * x // where x is of length n and starts at workd(ipntr(0)), and y is of // length n and starts at workd(ipntr(1)). // operator*(sp_mat, vec) doesn't properly put the result into the // right place so we'll just reimplement it here for now... // Set the output to point at the right memory. We have to subtract // one from FORTRAN pointers... Col out(workd.memptr() + ipntr(1) - 1, n, false /* don't copy */); // Set the input to point at the right memory. Col in(workd.memptr() + ipntr(0) - 1, n, false /* don't copy */); // Consider getting the LU factorization from ZGSTRF, and then // solve the system L*U*out = in (possibly with permutation matrix?) // Instead of "spsolve(out,X,in)" we call gstrf above and gstrs below out = in; superlu_supermatrix_wrangler out_slu; const bool status_out_slu = sp_auxlib::wrap_to_supermatrix(out_slu.get_ref(), out); if(status_out_slu == false) { arma_stop_runtime_error("run_aupd_shiftinvert(): could not construct SuperLU matrix"); return; } arma_extra_debug_print("superlu::gstrs()"); superlu::gstrs(trans, l.get_ptr(), u.get_ptr(), perm_c.get_ptr(), perm_r.get_ptr(), out_slu.get_ptr(), stat.get_ptr(), &info); // No need to modify memory further since it was all done in-place. break; } case 99: // Nothing to do here, things have converged. break; default: { return; // Parent frame can look at the value of info. } } } // The process has ended; check the return code. if( (info != 0) && (info != 1) ) { // Print warnings if there was a failure. if(sym) { arma_debug_warn_level(2, "eigs_sym(): ARPACK error ", info, " in saupd()"); } else { arma_debug_warn_level(2, "eigs_gen(): ARPACK error ", info, " in naupd()"); } return; // Parent frame can look at the value of info. } } #else { arma_ignore(n_eigvals); arma_ignore(sigma); arma_ignore(X); arma_ignore(sym); arma_ignore(n); arma_ignore(tol); arma_ignore(maxiter); arma_ignore(resid); arma_ignore(ncv); arma_ignore(v); arma_ignore(ldv); arma_ignore(iparam); arma_ignore(ipntr); arma_ignore(workd); arma_ignore(workl); arma_ignore(lworkl); arma_ignore(rwork); arma_ignore(info); } #endif } template inline bool sp_auxlib::rudimentary_sym_check(const SpMat& X) { arma_extra_debug_sigprint(); if(X.n_rows != X.n_cols) { return false; } const eT tol = eT(10000) * std::numeric_limits::epsilon(); // allow some leeway typename SpMat::const_iterator it = X.begin(); typename SpMat::const_iterator it_end = X.end(); const uword n_check_limit = (std::max)( uword(2), uword(X.n_nonzero/100) ); uword n_check = 1; while( (it != it_end) && (n_check <= n_check_limit) ) { const uword it_row = it.row(); const uword it_col = it.col(); if(it_row != it_col) { const eT A = (*it); const eT B = X.at( it_col, it_row ); // deliberately swapped const eT C = (std::max)(std::abs(A), std::abs(B)); const eT delta = std::abs(A - B); if(( (delta <= tol) || (delta <= (C * tol)) ) == false) { return false; } ++n_check; } ++it; } return true; } template inline bool sp_auxlib::rudimentary_sym_check(const SpMat< std::complex >& X) { arma_extra_debug_sigprint(); // NOTE: the function name is a misnomer, as it checks for hermitian complex matrices; // NOTE: for simplicity of use, the function name is the same as for real matrices typedef typename std::complex eT; if(X.n_rows != X.n_cols) { return false; } const T tol = T(10000) * std::numeric_limits::epsilon(); // allow some leeway typename SpMat::const_iterator it = X.begin(); typename SpMat::const_iterator it_end = X.end(); const uword n_check_limit = (std::max)( uword(2), uword(X.n_nonzero/100) ); uword n_check = 1; while( (it != it_end) && (n_check <= n_check_limit) ) { const uword it_row = it.row(); const uword it_col = it.col(); if(it_row != it_col) { const eT A = (*it); const eT B = X.at( it_col, it_row ); // deliberately swapped const T C_real = (std::max)(std::abs(A.real()), std::abs(B.real())); const T C_imag = (std::max)(std::abs(A.imag()), std::abs(B.imag())); const T delta_real = std::abs(A.real() - B.real()); const T delta_imag = std::abs(A.imag() + B.imag()); // take into account the conjugate const bool okay_real = ( (delta_real <= tol) || (delta_real <= (C_real * tol)) ); const bool okay_imag = ( (delta_imag <= tol) || (delta_imag <= (C_imag * tol)) ); if( (okay_real == false) || (okay_imag == false) ) { return false; } ++n_check; } else { const eT A = (*it); if(std::abs(A.imag()) > tol) { return false; } } ++it; } return true; } #if defined(ARMA_USE_SUPERLU) inline superlu_supermatrix_wrangler::~superlu_supermatrix_wrangler() { arma_extra_debug_sigprint_this(this); if(used == false) { return; } char* m_char = reinterpret_cast(&m); bool all_zero = true; for(size_t i=0; i < sizeof(superlu::SuperMatrix); ++i) { if(m_char[i] != char(0)) { all_zero = false; break; } } if(all_zero == false) { sp_auxlib::destroy_supermatrix(m); } } inline superlu_supermatrix_wrangler::superlu_supermatrix_wrangler() { arma_extra_debug_sigprint_this(this); arrayops::fill_zeros(reinterpret_cast(&m), sizeof(superlu::SuperMatrix)); } inline superlu::SuperMatrix& superlu_supermatrix_wrangler::get_ref() { used = true; return m; } inline superlu::SuperMatrix* superlu_supermatrix_wrangler::get_ptr() { used = true; return &m; } // inline superlu_stat_wrangler::~superlu_stat_wrangler() { arma_extra_debug_sigprint_this(this); superlu::free_stat(&stat); } inline superlu_stat_wrangler::superlu_stat_wrangler() { arma_extra_debug_sigprint_this(this); arrayops::fill_zeros(reinterpret_cast(&stat), sizeof(superlu::SuperLUStat_t)); superlu::init_stat(&stat); } inline superlu::SuperLUStat_t* superlu_stat_wrangler::get_ptr() { return &stat; } // template inline superlu_array_wrangler::~superlu_array_wrangler() { arma_extra_debug_sigprint_this(this); if(mem != nullptr) { superlu::free(mem); mem = nullptr; } } template inline superlu_array_wrangler::superlu_array_wrangler(const uword n_elem) { arma_extra_debug_sigprint_this(this); mem = (eT*)(superlu::malloc(n_elem * sizeof(eT))); arma_check_bad_alloc( (mem == nullptr), "superlu::malloc(): out of memory" ); arrayops::fill_zeros(mem, n_elem); } template inline eT* superlu_array_wrangler::get_ptr() { return mem; } #endif //! @} RcppArmadillo/inst/include/armadillo_bits/fn_trunc_exp.hpp0000644000176200001440000000363314124060717023602 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_trunc_exp //! @{ template arma_warn_unused inline static typename arma_real_only::result trunc_exp(const eT x) { if(std::numeric_limits::is_iec559 && (x >= Datum::log_max )) { return std::numeric_limits::max(); } else { return std::exp(x); } } template arma_warn_unused inline static typename arma_integral_only::result trunc_exp(const eT x) { return eT( trunc_exp( double(x) ) ); } template arma_warn_unused inline static std::complex trunc_exp(const std::complex& x) { return std::polar( trunc_exp( x.real() ), x.imag() ); } template arma_warn_unused arma_inline typename enable_if2< is_arma_type::value, const eOp >::result trunc_exp(const T1& A) { arma_extra_debug_sigprint(); return eOp(A); } template arma_warn_unused arma_inline const eOpCube trunc_exp(const BaseCube& A) { arma_extra_debug_sigprint(); return eOpCube(A.get_ref()); } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_join_bones.hpp0000644000176200001440000000552714124060717024255 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_join //! @{ class glue_join_cols { public: template struct traits { static constexpr bool is_row = false; static constexpr bool is_col = (T1::is_col && T2::is_col); static constexpr bool is_xvec = false; }; template inline static void apply(Mat& out, const Glue& X); template inline static void apply_noalias(Mat& out, const Proxy& A, const Proxy& B); template inline static void apply(Mat& out, const Base& A, const Base& B, const Base& C); template inline static void apply(Mat& out, const Base& A, const Base& B, const Base& C, const Base& D); }; class glue_join_rows { public: template struct traits { static constexpr bool is_row = (T1::is_row && T2::is_row); static constexpr bool is_col = false; static constexpr bool is_xvec = false; }; template inline static void apply(Mat& out, const Glue& X); template inline static void apply_noalias(Mat& out, const Proxy& A, const Proxy& B); template inline static void apply(Mat& out, const Base& A, const Base& B, const Base& C); template inline static void apply(Mat& out, const Base& A, const Base& B, const Base& C, const Base& D); }; class glue_join_slices { public: template inline static void apply(Cube& out, const GlueCube& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_powmat_bones.hpp0000644000176200001440000000332314124060717024277 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_powmat //! @{ class op_powmat : public traits_op_default { public: template inline static void apply(Mat& out, const Op& expr); template inline static bool apply_direct(Mat& out, const Base& X, const uword y, const bool y_neg); template inline static void apply_direct_positive(Mat& out, const Mat& X, const uword y); }; class op_powmat_cx : public traits_op_default { public: template inline static void apply(Mat< std::complex >& out, const mtOp,T1,op_powmat_cx>& expr); template inline static bool apply_direct(Mat< std::complex >& out, const Base& X, const typename T1::pod_type y); }; //! @} RcppArmadillo/inst/include/armadillo_bits/unwrap_cube.hpp0000644000176200001440000000521014124060717023413 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup unwrap_cube //! @{ template struct unwrap_cube { typedef typename T1::elem_type eT; inline unwrap_cube(const T1& A) : M(A) { arma_extra_debug_sigprint(); } const Cube M; template constexpr bool is_alias(const Cube&) const { return false; } }; template struct unwrap_cube< Cube > { inline unwrap_cube(const Cube& A) : M(A) { arma_extra_debug_sigprint(); } const Cube& M; template arma_inline bool is_alias(const Cube& X) const { return (void_ptr(&M) == void_ptr(&X)); } }; // // // template struct unwrap_cube_check { typedef typename T1::elem_type eT; inline unwrap_cube_check(const T1& A, const Cube&) : M(A) { arma_extra_debug_sigprint(); arma_type_check(( is_arma_cube_type::value == false )); } inline unwrap_cube_check(const T1& A, const bool) : M(A) { arma_extra_debug_sigprint(); arma_type_check(( is_arma_cube_type::value == false )); } const Cube M; }; template struct unwrap_cube_check< Cube > { inline unwrap_cube_check(const Cube& A, const Cube& B) : M_local( (&A == &B) ? new Cube(A) : nullptr ) , M ( (&A == &B) ? (*M_local) : A ) { arma_extra_debug_sigprint(); } inline unwrap_cube_check(const Cube& A, const bool is_alias) : M_local( is_alias ? new Cube(A) : nullptr ) , M ( is_alias ? (*M_local) : A ) { arma_extra_debug_sigprint(); } inline ~unwrap_cube_check() { arma_extra_debug_sigprint(); if(M_local) { delete M_local; } } // the order below is important const Cube* M_local; const Cube& M; }; //! @} RcppArmadillo/inst/include/armadillo_bits/field_meat.hpp0000644000176200001440000017013614124060717023204 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup field //! @{ template inline field::~field() { arma_extra_debug_sigprint_this(this); delete_objects(); if(n_elem > field_prealloc_n_elem::val) { delete [] mem; } // try to expose buggy user code that accesses deleted objects if(arma_config::debug) { mem = nullptr; } } template inline field::field() : n_rows(0) , n_cols(0) , n_slices(0) , n_elem(0) , mem(nullptr) { arma_extra_debug_sigprint_this(this); } //! construct a field from a given field template inline field::field(const field& x) : n_rows(0) , n_cols(0) , n_slices(0) , n_elem(0) , mem(nullptr) { arma_extra_debug_sigprint(arma_str::format("this = %x x = %x") % this % &x); init(x); } //! construct a field from a given field template inline field& field::operator=(const field& x) { arma_extra_debug_sigprint(); init(x); return *this; } //! construct a field from subview_field (eg. construct a field from a delayed subfield operation) template inline field::field(const subview_field& X) : n_rows(0) , n_cols(0) , n_slices(0) , n_elem(0) , mem(nullptr) { arma_extra_debug_sigprint_this(this); this->operator=(X); } //! construct a field from subview_field (eg. construct a field from a delayed subfield operation) template inline field& field::operator=(const subview_field& X) { arma_extra_debug_sigprint(); subview_field::extract(*this, X); return *this; } //! construct the field with the specified number of elements, //! assuming a column-major layout template inline field::field(const uword n_elem_in) : n_rows(0) , n_cols(0) , n_slices(0) , n_elem(0) , mem(nullptr) { arma_extra_debug_sigprint_this(this); init(n_elem_in, 1); } //! construct the field with the specified dimensions template inline field::field(const uword n_rows_in, const uword n_cols_in) : n_rows(0) , n_cols(0) , n_slices(0) , n_elem(0) , mem(nullptr) { arma_extra_debug_sigprint_this(this); init(n_rows_in, n_cols_in); } //! construct the field with the specified dimensions template inline field::field(const uword n_rows_in, const uword n_cols_in, const uword n_slices_in) : n_rows(0) , n_cols(0) , n_slices(0) , n_elem(0) , mem(nullptr) { arma_extra_debug_sigprint_this(this); init(n_rows_in, n_cols_in, n_slices_in); } template inline field::field(const SizeMat& s) : n_rows(0) , n_cols(0) , n_slices(0) , n_elem(0) , mem(nullptr) { arma_extra_debug_sigprint_this(this); init(s.n_rows, s.n_cols); } template inline field::field(const SizeCube& s) : n_rows(0) , n_cols(0) , n_slices(0) , n_elem(0) , mem(nullptr) { arma_extra_debug_sigprint_this(this); init(s.n_rows, s.n_cols, s.n_slices); } //! change the field to have the specified number of elements, //! assuming a column-major layout (data is not preserved) template inline void field::set_size(const uword n_elem_in) { arma_extra_debug_sigprint(arma_str::format("n_elem_in = %d") % n_elem_in); init(n_elem_in, 1); } //! change the field to have the specified dimensions (data is not preserved) template inline void field::set_size(const uword n_rows_in, const uword n_cols_in) { arma_extra_debug_sigprint(arma_str::format("n_rows_in = %d, n_cols_in = %d") % n_rows_in % n_cols_in); init(n_rows_in, n_cols_in); } //! change the field to have the specified dimensions (data is not preserved) template inline void field::set_size(const uword n_rows_in, const uword n_cols_in, const uword n_slices_in) { arma_extra_debug_sigprint(arma_str::format("n_rows_in = %d, n_cols_in = %d, n_slices_in = %d") % n_rows_in % n_cols_in % n_slices_in); init(n_rows_in, n_cols_in, n_slices_in); } template inline void field::set_size(const SizeMat& s) { init(s.n_rows, s.n_cols); } template inline void field::set_size(const SizeCube& s) { init(s.n_rows, s.n_cols, s.n_slices); } template inline field::field(const std::vector& x) : n_rows (0) , n_cols (0) , n_slices(0) , n_elem (0) { arma_extra_debug_sigprint_this(this); (*this).operator=(x); } template inline field& field::operator=(const std::vector& x) { arma_extra_debug_sigprint(); const uword N = uword(x.size()); set_size(N, 1); for(uword i=0; i inline field::field(const std::initializer_list& list) : n_rows (0) , n_cols (0) , n_slices(0) , n_elem (0) { arma_extra_debug_sigprint_this(this); (*this).operator=(list); } template inline field& field::operator=(const std::initializer_list& list) { arma_extra_debug_sigprint(); const uword N = uword(list.size()); set_size(1, N); const oT* item_ptr = list.begin(); for(uword i=0; i inline field::field(const std::initializer_list< std::initializer_list >& list) : n_rows (0) , n_cols (0) , n_slices(0) , n_elem (0) { arma_extra_debug_sigprint_this(this); (*this).operator=(list); } template inline field& field::operator=(const std::initializer_list< std::initializer_list >& list) { arma_extra_debug_sigprint(); uword x_n_rows = uword(list.size()); uword x_n_cols = 0; auto it = list.begin(); auto it_end = list.end(); for(; it != it_end; ++it) { x_n_cols = (std::max)(x_n_cols, uword((*it).size())); } field& t = (*this); t.set_size(x_n_rows, x_n_cols); uword row_num = 0; auto row_it = list.begin(); auto row_it_end = list.end(); for(; row_it != row_it_end; ++row_it) { uword col_num = 0; auto col_it = (*row_it).begin(); auto col_it_end = (*row_it).end(); for(; col_it != col_it_end; ++col_it) { t.at(row_num, col_num) = (*col_it); ++col_num; } for(uword c=col_num; c < x_n_cols; ++c) { t.at(row_num, c) = oT(); } ++row_num; } return *this; } template inline field::field(field&& X) : n_rows (X.n_rows ) , n_cols (X.n_cols ) , n_slices(X.n_slices) , n_elem (X.n_elem ) { arma_extra_debug_sigprint(arma_str::format("this = %x X = %x") % this % &X); if(n_elem > field_prealloc_n_elem::val) { mem = X.mem; } else { arrayops::copy(&mem_local[0], &X.mem_local[0], n_elem); mem = mem_local; } access::rw(X.n_rows ) = 0; access::rw(X.n_cols ) = 0; access::rw(X.n_slices) = 0; access::rw(X.n_elem ) = 0; access::rw(X.mem ) = nullptr; } template inline field& field::operator=(field&& X) { arma_extra_debug_sigprint(arma_str::format("this = %x X = %x") % this % &X); reset(); access::rw(n_rows ) = X.n_rows; access::rw(n_cols ) = X.n_cols; access::rw(n_slices) = X.n_slices; access::rw(n_elem ) = X.n_elem; if(n_elem > field_prealloc_n_elem::val) { mem = X.mem; } else { arrayops::copy(&mem_local[0], &X.mem_local[0], n_elem); mem = mem_local; } access::rw(X.n_rows ) = 0; access::rw(X.n_cols ) = 0; access::rw(X.n_elem ) = 0; access::rw(X.n_slices) = 0; access::rw(X.mem ) = nullptr; return *this; } //! change the field to have the specified dimensions (data is not preserved) template template inline void field::copy_size(const field& x) { arma_extra_debug_sigprint(); init(x.n_rows, x.n_cols, x.n_slices); } //! linear element accessor (treats the field as a vector); no bounds check template arma_inline arma_warn_unused oT& field::operator[] (const uword i) { return (*mem[i]); } //! linear element accessor (treats the field as a vector); no bounds check template arma_inline arma_warn_unused const oT& field::operator[] (const uword i) const { return (*mem[i]); } //! linear element accessor (treats the field as a vector); no bounds check template arma_inline arma_warn_unused oT& field::at(const uword i) { return (*mem[i]); } //! linear element accessor (treats the field as a vector); no bounds check template arma_inline arma_warn_unused const oT& field::at(const uword i) const { return (*mem[i]); } //! linear element accessor (treats the field as a vector); bounds checking not done when ARMA_NO_DEBUG is defined template arma_inline arma_warn_unused oT& field::operator() (const uword i) { arma_debug_check_bounds( (i >= n_elem), "field::operator(): index out of bounds" ); return (*mem[i]); } //! linear element accessor (treats the field as a vector); bounds checking not done when ARMA_NO_DEBUG is defined template arma_inline arma_warn_unused const oT& field::operator() (const uword i) const { arma_debug_check_bounds( (i >= n_elem), "field::operator(): index out of bounds" ); return (*mem[i]); } //! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined template arma_inline arma_warn_unused oT& field::operator() (const uword in_row, const uword in_col) { arma_debug_check_bounds( ((in_row >= n_rows) || (in_col >= n_cols) || (0 >= n_slices) ), "field::operator(): index out of bounds" ); return (*mem[in_row + in_col*n_rows]); } //! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined template arma_inline arma_warn_unused const oT& field::operator() (const uword in_row, const uword in_col) const { arma_debug_check_bounds( ((in_row >= n_rows) || (in_col >= n_cols) || (0 >= n_slices) ), "field::operator(): index out of bounds" ); return (*mem[in_row + in_col*n_rows]); } //! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined template arma_inline arma_warn_unused oT& field::operator() (const uword in_row, const uword in_col, const uword in_slice) { arma_debug_check_bounds( ((in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices)), "field::operator(): index out of bounds" ); return (*mem[in_row + in_col*n_rows + in_slice*(n_rows*n_cols)]); } //! element accessor; bounds checking not done when ARMA_NO_DEBUG is defined template arma_inline arma_warn_unused const oT& field::operator() (const uword in_row, const uword in_col, const uword in_slice) const { arma_debug_check_bounds( ((in_row >= n_rows) || (in_col >= n_cols) || (in_slice >= n_slices)), "field::operator(): index out of bounds" ); return (*mem[in_row + in_col*n_rows + in_slice*(n_rows*n_cols)]); } //! element accessor; no bounds check template arma_inline arma_warn_unused oT& field::at(const uword in_row, const uword in_col) { return (*mem[in_row + in_col*n_rows]); } //! element accessor; no bounds check template arma_inline arma_warn_unused const oT& field::at(const uword in_row, const uword in_col) const { return (*mem[in_row + in_col*n_rows]); } //! element accessor; no bounds check template arma_inline arma_warn_unused oT& field::at(const uword in_row, const uword in_col, const uword in_slice) { return (*mem[in_row + in_col*n_rows + in_slice*(n_rows*n_cols)]); } //! element accessor; no bounds check template arma_inline arma_warn_unused const oT& field::at(const uword in_row, const uword in_col, const uword in_slice) const { return (*mem[in_row + in_col*n_rows + in_slice*(n_rows*n_cols)]); } template arma_inline arma_warn_unused oT& field::front() { arma_debug_check( (n_elem == 0), "field::front(): field is empty" ); return (*mem[0]); } template arma_inline arma_warn_unused const oT& field::front() const { arma_debug_check( (n_elem == 0), "field::front(): field is empty" ); return (*mem[0]); } template arma_inline arma_warn_unused oT& field::back() { arma_debug_check( (n_elem == 0), "field::back(): field is empty" ); return (*mem[n_elem-1]); } template arma_inline arma_warn_unused const oT& field::back() const { arma_debug_check( (n_elem == 0), "field::back(): field is empty" ); return (*mem[n_elem-1]); } template arma_cold inline field_injector< field > field::operator<<(const oT& val) { return field_injector< field >(*this, val); } template arma_cold inline field_injector< field > field::operator<<(const injector_end_of_row<>& x) { return field_injector< field >(*this, x); } //! creation of subview_field (row of a field) template inline subview_field field::row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check( (n_slices >= 2), "field::row(): field must be 2D" ); arma_debug_check_bounds( (row_num >= n_rows), "field::row(): row out of bounds" ); return subview_field(*this, row_num, 0, 1, n_cols); } //! creation of subview_field (row of a field) template inline const subview_field field::row(const uword row_num) const { arma_extra_debug_sigprint(); arma_debug_check( (n_slices >= 2), "field::row(): field must be 2D" ); arma_debug_check_bounds( (row_num >= n_rows), "field::row(): row out of bounds" ); return subview_field(*this, row_num, 0, 1, n_cols); } //! creation of subview_field (column of a field) template inline subview_field field::col(const uword col_num) { arma_extra_debug_sigprint(); arma_debug_check( (n_slices >= 2), "field::col(): field must be 2D" ); arma_debug_check_bounds( (col_num >= n_cols), "field::col(): out of bounds" ); return subview_field(*this, 0, col_num, n_rows, 1); } //! creation of subview_field (column of a field) template inline const subview_field field::col(const uword col_num) const { arma_extra_debug_sigprint(); arma_debug_check( (n_slices >= 2), "field::col(): field must be 2D" ); arma_debug_check_bounds( (col_num >= n_cols), "field::col(): out of bounds" ); return subview_field(*this, 0, col_num, n_rows, 1); } //! creation of subview_field (slice of a field) template inline subview_field field::slice(const uword slice_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (slice_num >= n_slices), "field::slice(): out of bounds" ); return subview_field(*this, 0, 0, slice_num, n_rows, n_cols, 1); } //! creation of subview_field (slice of a field) template inline const subview_field field::slice(const uword slice_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (slice_num >= n_slices), "field::slice(): out of bounds" ); return subview_field(*this, 0, 0, slice_num, n_rows, n_cols, 1); } //! creation of subview_field (subfield comprised of specified rows) template inline subview_field field::rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check( (n_slices >= 2), "field::rows(): field must be 2D" ); arma_debug_check_bounds ( ( (in_row1 > in_row2) || (in_row2 >= n_rows) ), "field::rows(): indicies out of bounds or incorrectly used" ); const uword sub_n_rows = in_row2 - in_row1 + 1; return subview_field(*this, in_row1, 0, sub_n_rows, n_cols); } //! creation of subview_field (subfield comprised of specified rows) template inline const subview_field field::rows(const uword in_row1, const uword in_row2) const { arma_extra_debug_sigprint(); arma_debug_check( (n_slices >= 2), "field::rows(): field must be 2D" ); arma_debug_check_bounds ( ( (in_row1 > in_row2) || (in_row2 >= n_rows) ), "field::rows(): indicies out of bounds or incorrectly used" ); const uword sub_n_rows = in_row2 - in_row1 + 1; return subview_field(*this, in_row1, 0, sub_n_rows, n_cols); } //! creation of subview_field (subfield comprised of specified columns) template inline subview_field field::cols(const uword in_col1, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check( (n_slices >= 2), "field::cols(): field must be 2D" ); arma_debug_check_bounds ( ( (in_col1 > in_col2) || (in_col2 >= n_cols) ), "field::cols(): indicies out of bounds or incorrectly used" ); const uword sub_n_cols = in_col2 - in_col1 + 1; return subview_field(*this, 0, in_col1, n_rows, sub_n_cols); } //! creation of subview_field (subfield comprised of specified columns) template inline const subview_field field::cols(const uword in_col1, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check( (n_slices >= 2), "field::cols(): field must be 2D" ); arma_debug_check_bounds ( ( (in_col1 > in_col2) || (in_col2 >= n_cols) ), "field::cols(): indicies out of bounds or incorrectly used" ); const uword sub_n_cols = in_col2 - in_col1 + 1; return subview_field(*this, 0, in_col1, n_rows, sub_n_cols); } //! creation of subview_field (subfield comprised of specified slices) template inline subview_field field::slices(const uword in_slice1, const uword in_slice2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( ( (in_slice1 > in_slice2) || (in_slice2 >= n_slices) ), "field::slices(): indicies out of bounds or incorrectly used" ); const uword sub_n_slices = in_slice2 - in_slice1 + 1; return subview_field(*this, 0, 0, in_slice1, n_rows, n_cols, sub_n_slices); } //! creation of subview_field (subfield comprised of specified slices) template inline const subview_field field::slices(const uword in_slice1, const uword in_slice2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( ( (in_slice1 > in_slice2) || (in_slice2 >= n_slices) ), "field::slices(): indicies out of bounds or incorrectly used" ); const uword sub_n_slices = in_slice2 - in_slice1 + 1; return subview_field(*this, 0, 0, in_slice1, n_rows, n_cols, sub_n_slices); } //! creation of subview_field (subfield with arbitrary dimensions) template inline subview_field field::subfield(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) { arma_extra_debug_sigprint(); arma_debug_check( (n_slices >= 2), "field::subfield(): field must be 2D" ); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols), "field::subfield(): indices out of bounds or incorrectly used" ); const uword sub_n_rows = in_row2 - in_row1 + 1; const uword sub_n_cols = in_col2 - in_col1 + 1; return subview_field(*this, in_row1, in_col1, sub_n_rows, sub_n_cols); } //! creation of subview_field (subfield with arbitrary dimensions) template inline const subview_field field::subfield(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const { arma_extra_debug_sigprint(); arma_debug_check( (n_slices >= 2), "field::subfield(): field must be 2D" ); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >= n_rows) || (in_col2 >= n_cols), "field::subfield(): indices out of bounds or incorrectly used" ); const uword sub_n_rows = in_row2 - in_row1 + 1; const uword sub_n_cols = in_col2 - in_col1 + 1; return subview_field(*this, in_row1, in_col1, sub_n_rows, sub_n_cols); } //! creation of subview_field (subfield with arbitrary dimensions) template inline subview_field field::subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_slice1 > in_slice2) || (in_row2 >= n_rows) || (in_col2 >= n_cols) || (in_slice2 >= n_slices), "field::subfield(): indices out of bounds or incorrectly used" ); const uword sub_n_rows = in_row2 - in_row1 + 1; const uword sub_n_cols = in_col2 - in_col1 + 1; const uword sub_n_slices = in_slice2 - in_slice1 + 1; return subview_field(*this, in_row1, in_col1, in_slice1, sub_n_rows, sub_n_cols, sub_n_slices); } //! creation of subview_field (subfield with arbitrary dimensions) template inline const subview_field field::subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const uword in_row2, const uword in_col2, const uword in_slice2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_col1 > in_col2) || (in_slice1 > in_slice2) || (in_row2 >= n_rows) || (in_col2 >= n_cols) || (in_slice2 >= n_slices), "field::subfield(): indices out of bounds or incorrectly used" ); const uword sub_n_rows = in_row2 - in_row1 + 1; const uword sub_n_cols = in_col2 - in_col1 + 1; const uword sub_n_slices = in_slice2 - in_slice1 + 1; return subview_field(*this, in_row1, in_col1, in_slice1, sub_n_rows, sub_n_cols, sub_n_slices); } //! creation of subview_field (subfield with arbitrary dimensions) template inline subview_field field::subfield(const uword in_row1, const uword in_col1, const SizeMat& s) { arma_extra_debug_sigprint(); arma_debug_check( (n_slices >= 2), "field::subfield(): field must be 2D" ); const uword l_n_rows = n_rows; const uword l_n_cols = n_cols; const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; arma_debug_check_bounds ( ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols)), "field::subfield(): indices or size out of bounds" ); return subview_field(*this, in_row1, in_col1, s_n_rows, s_n_cols); } //! creation of subview_field (subfield with arbitrary dimensions) template inline const subview_field field::subfield(const uword in_row1, const uword in_col1, const SizeMat& s) const { arma_extra_debug_sigprint(); arma_debug_check( (n_slices >= 2), "field::subfield(): field must be 2D" ); const uword l_n_rows = n_rows; const uword l_n_cols = n_cols; const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; arma_debug_check_bounds ( ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols)), "field::subfield(): indices or size out of bounds" ); return subview_field(*this, in_row1, in_col1, s_n_rows, s_n_cols); } //! creation of subview_field (subfield with arbitrary dimensions) template inline subview_field field::subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) { arma_extra_debug_sigprint(); const uword l_n_rows = n_rows; const uword l_n_cols = n_cols; const uword l_n_slices = n_slices; const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; const uword sub_n_slices = s.n_slices; arma_debug_check_bounds ( ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || (in_slice1 >= l_n_slices) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols) || ((in_slice1 + sub_n_slices) > l_n_slices)), "field::subfield(): indices or size out of bounds" ); return subview_field(*this, in_row1, in_col1, in_slice1, s_n_rows, s_n_cols, sub_n_slices); } //! creation of subview_field (subfield with arbitrary dimensions) template inline const subview_field field::subfield(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const { arma_extra_debug_sigprint(); const uword l_n_rows = n_rows; const uword l_n_cols = n_cols; const uword l_n_slices = n_slices; const uword s_n_rows = s.n_rows; const uword s_n_cols = s.n_cols; const uword sub_n_slices = s.n_slices; arma_debug_check_bounds ( ((in_row1 >= l_n_rows) || (in_col1 >= l_n_cols) || (in_slice1 >= l_n_slices) || ((in_row1 + s_n_rows) > l_n_rows) || ((in_col1 + s_n_cols) > l_n_cols) || ((in_slice1 + sub_n_slices) > l_n_slices)), "field::subfield(): indices or size out of bounds" ); return subview_field(*this, in_row1, in_col1, in_slice1, s_n_rows, s_n_cols, sub_n_slices); } //! creation of subview_field (subfield with arbitrary dimensions) template inline subview_field field::subfield(const span& row_span, const span& col_span) { arma_extra_debug_sigprint(); arma_debug_check( (n_slices >= 2), "field::subfield(): field must be 2D" ); const bool row_all = row_span.whole; const bool col_all = col_span.whole; const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword sub_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword sub_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "field::subfield(): indices out of bounds or incorrectly used" ); return subview_field(*this, in_row1, in_col1, sub_n_rows, sub_n_cols); } //! creation of subview_field (subfield with arbitrary dimensions) template inline const subview_field field::subfield(const span& row_span, const span& col_span) const { arma_extra_debug_sigprint(); arma_debug_check( (n_slices >= 2), "field::subfield(): field must be 2D" ); const bool row_all = row_span.whole; const bool col_all = col_span.whole; const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword sub_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword sub_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) , "field::subfield(): indices out of bounds or incorrectly used" ); return subview_field(*this, in_row1, in_col1, sub_n_rows, sub_n_cols); } //! creation of subview_field (subfield with arbitrary dimensions) template inline subview_field field::subfield(const span& row_span, const span& col_span, const span& slice_span) { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const bool col_all = col_span.whole; const bool slice_all = slice_span.whole; const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword local_n_slices = n_slices; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword sub_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword sub_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; const uword in_slice1 = slice_all ? 0 : slice_span.a; const uword in_slice2 = slice_span.b; const uword sub_n_slices = slice_all ? local_n_slices : in_slice2 - in_slice1 + 1; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) || ( slice_all ? false : ((in_slice1 > in_slice2) || (in_slice2 >= local_n_slices)) ) , "field::subfield(): indices out of bounds or incorrectly used" ); return subview_field(*this, in_row1, in_col1, in_slice1, sub_n_rows, sub_n_cols, sub_n_slices); } //! creation of subview_field (subfield with arbitrary dimensions) template inline const subview_field field::subfield(const span& row_span, const span& col_span, const span& slice_span) const { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const bool col_all = col_span.whole; const bool slice_all = slice_span.whole; const uword local_n_rows = n_rows; const uword local_n_cols = n_cols; const uword local_n_slices = n_slices; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword sub_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; const uword in_col1 = col_all ? 0 : col_span.a; const uword in_col2 = col_span.b; const uword sub_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1; const uword in_slice1 = slice_all ? 0 : slice_span.a; const uword in_slice2 = slice_span.b; const uword sub_n_slices = slice_all ? local_n_slices : in_slice2 - in_slice1 + 1; arma_debug_check_bounds ( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ) || ( col_all ? false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) ) || ( slice_all ? false : ((in_slice1 > in_slice2) || (in_slice2 >= local_n_slices)) ) , "field::subfield(): indices out of bounds or incorrectly used" ); return subview_field(*this, in_row1, in_col1, in_slice1, sub_n_rows, sub_n_cols, sub_n_slices); } template inline subview_field field::operator()(const span& row_span, const span& col_span) { arma_extra_debug_sigprint(); return (*this).subfield(row_span, col_span); } template inline const subview_field field::operator()(const span& row_span, const span& col_span) const { arma_extra_debug_sigprint(); return (*this).subfield(row_span, col_span); } template inline subview_field field::operator()(const span& row_span, const span& col_span, const span& slice_span) { arma_extra_debug_sigprint(); return (*this).subfield(row_span, col_span, slice_span); } template inline const subview_field field::operator()(const span& row_span, const span& col_span, const span& slice_span) const { arma_extra_debug_sigprint(); return (*this).subfield(row_span, col_span, slice_span); } template inline subview_field field::operator()(const uword in_row1, const uword in_col1, const SizeMat& s) { arma_extra_debug_sigprint(); return (*this).subfield(in_row1, in_col1, s); } template inline const subview_field field::operator()(const uword in_row1, const uword in_col1, const SizeMat& s) const { arma_extra_debug_sigprint(); return (*this).subfield(in_row1, in_col1, s); } template inline subview_field field::operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) { arma_extra_debug_sigprint(); return (*this).subfield(in_row1, in_col1, in_slice1, s); } template inline const subview_field field::operator()(const uword in_row1, const uword in_col1, const uword in_slice1, const SizeCube& s) const { arma_extra_debug_sigprint(); return (*this).subfield(in_row1, in_col1, in_slice1, s); } //! print contents of the field (to the cout stream), //! optionally preceding with a user specified line of text. //! the field class preserves the stream's flags //! but the associated operator<< function for type oT //! may still modify the stream's parameters. //! NOTE: this function assumes that type oT can be printed, //! ie. the function "std::ostream& operator<< (std::ostream&, const oT&)" //! has been defined. template arma_cold inline void field::print(const std::string extra_text) const { arma_extra_debug_sigprint(); if(extra_text.length() != 0) { const std::streamsize orig_width = get_cout_stream().width(); get_cout_stream() << extra_text << '\n'; get_cout_stream().width(orig_width); } arma_ostream::print(get_cout_stream(), *this); } //! print contents of the field to a user specified stream, //! optionally preceding with a user specified line of text. //! the field class preserves the stream's flags //! but the associated operator<< function for type oT //! may still modify the stream's parameters. //! NOTE: this function assumes that type oT can be printed, //! ie. the function "std::ostream& operator<< (std::ostream&, const oT&)" //! has been defined. template arma_cold inline void field::print(std::ostream& user_stream, const std::string extra_text) const { arma_extra_debug_sigprint(); if(extra_text.length() != 0) { const std::streamsize orig_width = user_stream.width(); user_stream << extra_text << '\n'; user_stream.width(orig_width); } arma_ostream::print(user_stream, *this); } //! apply a lambda function to each object template inline const field& field::for_each(const std::function< void(oT&) >& F) { arma_extra_debug_sigprint(); for(uword i=0; i < n_elem; ++i) { F(operator[](i)); } return *this; } template inline const field& field::for_each(const std::function< void(const oT&) >& F) const { arma_extra_debug_sigprint(); for(uword i=0; i < n_elem; ++i) { F(operator[](i)); } return *this; } //! fill the field with an object template inline const field& field::fill(const oT& x) { arma_extra_debug_sigprint(); field& t = *this; for(uword i=0; i inline void field::reset() { arma_extra_debug_sigprint(); init(0,0,0); } //! reset each object template inline void field::reset_objects() { arma_extra_debug_sigprint(); field_aux::reset_objects(*this); } //! returns true if the field has no objects template arma_inline bool field::is_empty() const { return (n_elem == 0); } //! returns true if the given index is currently in range template arma_inline arma_warn_unused bool field::in_range(const uword i) const { return (i < n_elem); } //! returns true if the given start and end indices are currently in range template arma_inline arma_warn_unused bool field::in_range(const span& x) const { arma_extra_debug_sigprint(); if(x.whole) { return true; } else { const uword a = x.a; const uword b = x.b; return ( (a <= b) && (b < n_elem) ); } } //! returns true if the given location is currently in range template arma_inline arma_warn_unused bool field::in_range(const uword in_row, const uword in_col) const { return ( (in_row < n_rows) && (in_col < n_cols) ); } template arma_inline arma_warn_unused bool field::in_range(const span& row_span, const uword in_col) const { arma_extra_debug_sigprint(); if(row_span.whole) { return (in_col < n_cols); } else { const uword in_row1 = row_span.a; const uword in_row2 = row_span.b; return ( (in_row1 <= in_row2) && (in_row2 < n_rows) && (in_col < n_cols) ); } } template arma_inline arma_warn_unused bool field::in_range(const uword in_row, const span& col_span) const { arma_extra_debug_sigprint(); if(col_span.whole) { return (in_row < n_rows); } else { const uword in_col1 = col_span.a; const uword in_col2 = col_span.b; return ( (in_row < n_rows) && (in_col1 <= in_col2) && (in_col2 < n_cols) ); } } template arma_inline arma_warn_unused bool field::in_range(const span& row_span, const span& col_span) const { arma_extra_debug_sigprint(); const uword in_row1 = row_span.a; const uword in_row2 = row_span.b; const uword in_col1 = col_span.a; const uword in_col2 = col_span.b; const bool rows_ok = row_span.whole ? true : ( (in_row1 <= in_row2) && (in_row2 < n_rows) ); const bool cols_ok = col_span.whole ? true : ( (in_col1 <= in_col2) && (in_col2 < n_cols) ); return ( rows_ok && cols_ok ); } template arma_inline arma_warn_unused bool field::in_range(const uword in_row, const uword in_col, const SizeMat& s) const { const uword l_n_rows = n_rows; const uword l_n_cols = n_cols; if( (in_row >= l_n_rows) || (in_col >= l_n_cols) || ((in_row + s.n_rows) > l_n_rows) || ((in_col + s.n_cols) > l_n_cols) ) { return false; } else { return true; } } template arma_inline arma_warn_unused bool field::in_range(const uword in_row, const uword in_col, const uword in_slice) const { return ( (in_row < n_rows) && (in_col < n_cols) && (in_slice < n_slices) ); } template arma_inline arma_warn_unused bool field::in_range(const span& row_span, const span& col_span, const span& slice_span) const { arma_extra_debug_sigprint(); const uword in_row1 = row_span.a; const uword in_row2 = row_span.b; const uword in_col1 = col_span.a; const uword in_col2 = col_span.b; const uword in_slice1 = slice_span.a; const uword in_slice2 = slice_span.b; const bool rows_ok = row_span.whole ? true : ( (in_row1 <= in_row2 ) && (in_row2 < n_rows ) ); const bool cols_ok = col_span.whole ? true : ( (in_col1 <= in_col2 ) && (in_col2 < n_cols ) ); const bool slices_ok = slice_span.whole ? true : ( (in_slice1 <= in_slice2) && (in_slice2 < n_slices) ); return ( rows_ok && cols_ok && slices_ok ); } template arma_inline arma_warn_unused bool field::in_range(const uword in_row, const uword in_col, const uword in_slice, const SizeCube& s) const { const uword l_n_rows = n_rows; const uword l_n_cols = n_cols; const uword l_n_slices = n_slices; if( (in_row >= l_n_rows) || (in_col >= l_n_cols) || (in_slice >= l_n_slices) || ((in_row + s.n_rows) > l_n_rows) || ((in_col + s.n_cols) > l_n_cols) || ((in_slice + s.n_slices) > l_n_slices) ) { return false; } else { return true; } } template inline arma_cold bool field::save(const std::string name, const file_type type) const { arma_extra_debug_sigprint(); std::string err_msg; const bool save_okay = field_aux::save(*this, name, type, err_msg); if(save_okay == false) { if(err_msg.length() > 0) { arma_debug_warn_level(3, "field::save(): ", err_msg, "; file: ", name); } else { arma_debug_warn_level(3, "field::save(): couldn't write; file: ", name); } } return save_okay; } template inline arma_cold bool field::save(std::ostream& os, const file_type type) const { arma_extra_debug_sigprint(); std::string err_msg; const bool save_okay = field_aux::save(*this, os, type, err_msg); if(save_okay == false) { if(err_msg.length() > 0) { arma_debug_warn_level(3, "field::save(): ", err_msg); } else { arma_debug_warn_level(3, "field::save(): couldn't write to stream"); } } return save_okay; } template inline arma_cold bool field::load(const std::string name, const file_type type) { arma_extra_debug_sigprint(); std::string err_msg; const bool load_okay = field_aux::load(*this, name, type, err_msg); if(load_okay == false) { if(err_msg.length() > 0) { arma_debug_warn_level(3, "field::load(): ", err_msg, "; file: ", name); } else { arma_debug_warn_level(3, "field::load(): couldn't read; file: ", name); } } if(load_okay == false) { (*this).reset(); } return load_okay; } template inline arma_cold bool field::load(std::istream& is, const file_type type) { arma_extra_debug_sigprint(); std::string err_msg; const bool load_okay = field_aux::load(*this, is, type, err_msg); if(load_okay == false) { if(err_msg.length() > 0) { arma_debug_warn_level(3, "field::load(): ", err_msg); } else { arma_debug_warn_level(3, "field::load(): couldn't read from stream"); } } if(load_okay == false) { (*this).reset(); } return load_okay; } template inline arma_cold bool field::quiet_save(const std::string name, const file_type type) const { arma_extra_debug_sigprint(); return (*this).save(name, type); } template inline arma_cold bool field::quiet_save(std::ostream& os, const file_type type) const { arma_extra_debug_sigprint(); return (*this).save(os, type); } template inline arma_cold bool field::quiet_load(const std::string name, const file_type type) { arma_extra_debug_sigprint(); return (*this).load(name, type); } template inline arma_cold bool field::quiet_load(std::istream& is, const file_type type) { arma_extra_debug_sigprint(); return (*this).load(is, type); } //! construct a field from a given field template inline void field::init(const field& x) { arma_extra_debug_sigprint(); if(this != &x) { const uword x_n_rows = x.n_rows; const uword x_n_cols = x.n_cols; const uword x_n_slices = x.n_slices; init(x_n_rows, x_n_cols, x_n_slices); field& t = *this; if(x_n_slices == 1) { for(uword ucol=0; ucol < x_n_cols; ++ucol) for(uword urow=0; urow < x_n_rows; ++urow) { t.at(urow,ucol) = x.at(urow,ucol); } } else { for(uword uslice=0; uslice < x_n_slices; ++uslice) for(uword ucol=0; ucol < x_n_cols; ++ucol ) for(uword urow=0; urow < x_n_rows; ++urow ) { t.at(urow,ucol,uslice) = x.at(urow,ucol,uslice); } } } } template inline void field::init(const uword n_rows_in, const uword n_cols_in) { (*this).init(n_rows_in, n_cols_in, 1); } template inline void field::init(const uword n_rows_in, const uword n_cols_in, const uword n_slices_in) { arma_extra_debug_sigprint( arma_str::format("n_rows_in = %d, n_cols_in = %d, n_slices_in = %d") % n_rows_in % n_cols_in % n_slices_in ); #if defined(ARMA_64BIT_WORD) const char* error_message = "field::init(): requested size is too large"; #else const char* error_message = "field::init(): requested size is too large; suggest to enable ARMA_64BIT_WORD"; #endif arma_debug_check ( ( ( (n_rows_in > 0x0FFF) || (n_cols_in > 0x0FFF) || (n_slices_in > 0xFF) ) ? ( (double(n_rows_in) * double(n_cols_in) * double(n_slices_in)) > double(ARMA_MAX_UWORD) ) : false ), error_message ); const uword n_elem_new = n_rows_in * n_cols_in * n_slices_in; if(n_elem == n_elem_new) { // delete_objects(); // create_objects(); access::rw(n_rows) = n_rows_in; access::rw(n_cols) = n_cols_in; access::rw(n_slices) = n_slices_in; } else { delete_objects(); if(n_elem > field_prealloc_n_elem::val) { delete [] mem; } if(n_elem_new <= field_prealloc_n_elem::val) { mem = (n_elem_new == 0) ? nullptr : mem_local; } else { mem = new(std::nothrow) oT* [n_elem_new]; arma_check_bad_alloc( (mem == nullptr), "field::init(): out of memory" ); } access::rw(n_rows) = n_rows_in; access::rw(n_cols) = n_cols_in; access::rw(n_slices) = n_slices_in; access::rw(n_elem) = n_elem_new; create_objects(); } } template inline void field::delete_objects() { arma_extra_debug_sigprint( arma_str::format("n_elem = %d") % n_elem ); for(uword i=0; i inline void field::create_objects() { arma_extra_debug_sigprint( arma_str::format("n_elem = %d") % n_elem ); for(uword i=0; i inline field::iterator::iterator(field& in_M, const bool at_end) : M(in_M) , i( (at_end == false) ? 0 : in_M.n_elem ) { arma_extra_debug_sigprint(); } template inline oT& field::iterator::operator*() { return M[i]; } template inline typename field::iterator& field::iterator::operator++() { ++i; return *this; } template inline void field::iterator::operator++(int) { operator++(); } template inline typename field::iterator& field::iterator::operator--() { if(i > 0) { --i; } return *this; } template inline void field::iterator::operator--(int) { operator--(); } template inline bool field::iterator::operator!=(const typename field::iterator& X) const { return (i != X.i); } template inline bool field::iterator::operator==(const typename field::iterator& X) const { return (i == X.i); } template inline field::const_iterator::const_iterator(const field& in_M, const bool at_end) : M(in_M) , i( (at_end == false) ? 0 : in_M.n_elem ) { arma_extra_debug_sigprint(); } template inline field::const_iterator::const_iterator(const typename field::iterator& X) : M(X.M) , i(X.i) { arma_extra_debug_sigprint(); } template inline const oT& field::const_iterator::operator*() const { return M[i]; } template inline typename field::const_iterator& field::const_iterator::operator++() { ++i; return *this; } template inline void field::const_iterator::operator++(int) { operator++(); } template inline typename field::const_iterator& field::const_iterator::operator--() { if(i > 0) { --i; } return *this; } template inline void field::const_iterator::operator--(int) { operator--(); } template inline bool field::const_iterator::operator!=(const typename field::const_iterator& X) const { return (i != X.i); } template inline bool field::const_iterator::operator==(const typename field::const_iterator& X) const { return (i == X.i); } template inline typename field::iterator field::begin() { arma_extra_debug_sigprint(); return field::iterator(*this); } template inline typename field::const_iterator field::begin() const { arma_extra_debug_sigprint(); return field::const_iterator(*this); } template inline typename field::const_iterator field::cbegin() const { arma_extra_debug_sigprint(); return field::const_iterator(*this); } template inline typename field::iterator field::end() { arma_extra_debug_sigprint(); return field::iterator(*this, true); } template inline typename field::const_iterator field::end() const { arma_extra_debug_sigprint(); return field::const_iterator(*this, true); } template inline typename field::const_iterator field::cend() const { arma_extra_debug_sigprint(); return field::const_iterator(*this, true); } template inline void field::clear() { reset(); } template inline bool field::empty() const { return (n_elem == 0); } template inline uword field::size() const { return n_elem; } // // // template inline void field_aux::reset_objects(field& x) { arma_extra_debug_sigprint(); x.delete_objects(); x.create_objects(); } template inline void field_aux::reset_objects(field< Mat >& x) { arma_extra_debug_sigprint(); for(uword i=0; i < x.n_elem; ++i) { (*(x.mem[i])).reset(); } } template inline void field_aux::reset_objects(field< Col >& x) { arma_extra_debug_sigprint(); for(uword i=0; i < x.n_elem; ++i) { (*(x.mem[i])).reset(); } } template inline void field_aux::reset_objects(field< Row >& x) { arma_extra_debug_sigprint(); for(uword i=0; i < x.n_elem; ++i) { (*(x.mem[i])).reset(); } } template inline void field_aux::reset_objects(field< Cube >& x) { arma_extra_debug_sigprint(); for(uword i=0; i < x.n_elem; ++i) { (*(x.mem[i])).reset(); } } inline void field_aux::reset_objects(field< std::string >& x) { arma_extra_debug_sigprint(); for(uword i=0; i < x.n_elem; ++i) { (*(x.mem[i])).clear(); } } // // // template inline bool field_aux::save(const field&, const std::string&, const file_type, std::string& err_msg) { arma_extra_debug_sigprint(); err_msg = "saving/loading this type of field is currently not supported"; return false; } template inline bool field_aux::save(const field&, std::ostream&, const file_type, std::string& err_msg) { arma_extra_debug_sigprint(); err_msg = "saving/loading this type of field is currently not supported"; return false; } template inline bool field_aux::load(field&, const std::string&, const file_type, std::string& err_msg) { arma_extra_debug_sigprint(); err_msg = "saving/loading this type of field is currently not supported"; return false; } template inline bool field_aux::load(field&, std::istream&, const file_type, std::string& err_msg) { arma_extra_debug_sigprint(); err_msg = "saving/loading this type of field is currently not supported"; return false; } template inline bool field_aux::save(const field< Mat >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case arma_binary: return diskio::save_arma_binary(x, name); break; case ppm_binary: return diskio::save_ppm_binary(x, name); break; default: err_msg = "unsupported type"; return false; } } template inline bool field_aux::save(const field< Mat >& x, std::ostream& os, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case arma_binary: return diskio::save_arma_binary(x, os); break; case ppm_binary: return diskio::save_ppm_binary(x, os); break; default: err_msg = "unsupported type"; return false; } } template inline bool field_aux::load(field< Mat >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case auto_detect: return diskio::load_auto_detect(x, name, err_msg); break; case arma_binary: return diskio::load_arma_binary(x, name, err_msg); break; case ppm_binary: return diskio::load_ppm_binary(x, name, err_msg); break; default: err_msg = "unsupported type"; return false; } } template inline bool field_aux::load(field< Mat >& x, std::istream& is, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case auto_detect: return diskio::load_auto_detect(x, is, err_msg); break; case arma_binary: return diskio::load_arma_binary(x, is, err_msg); break; case ppm_binary: return diskio::load_ppm_binary(x, is, err_msg); break; default: err_msg = "unsupported type"; return false; } } template inline bool field_aux::save(const field< Col >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case arma_binary: return diskio::save_arma_binary(x, name); break; case ppm_binary: return diskio::save_ppm_binary(x, name); break; default: err_msg = "unsupported type"; return false; } } template inline bool field_aux::save(const field< Col >& x, std::ostream& os, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case arma_binary: return diskio::save_arma_binary(x, os); break; case ppm_binary: return diskio::save_ppm_binary(x, os); break; default: err_msg = "unsupported type"; return false; } } template inline bool field_aux::load(field< Col >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case auto_detect: return diskio::load_auto_detect(x, name, err_msg); break; case arma_binary: return diskio::load_arma_binary(x, name, err_msg); break; case ppm_binary: return diskio::load_ppm_binary(x, name, err_msg); break; default: err_msg = "unsupported type"; return false; } } template inline bool field_aux::load(field< Col >& x, std::istream& is, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case auto_detect: return diskio::load_auto_detect(x, is, err_msg); break; case arma_binary: return diskio::load_arma_binary(x, is, err_msg); break; case ppm_binary: return diskio::load_ppm_binary(x, is, err_msg); break; default: err_msg = "unsupported type"; return false; } } template inline bool field_aux::save(const field< Row >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case arma_binary: return diskio::save_arma_binary(x, name); break; case ppm_binary: return diskio::save_ppm_binary(x, name); break; default: err_msg = "unsupported type"; return false; } } template inline bool field_aux::save(const field< Row >& x, std::ostream& os, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case arma_binary: return diskio::save_arma_binary(x, os); break; case ppm_binary: return diskio::save_ppm_binary(x, os); break; default: err_msg = "unsupported type"; return false; } } template inline bool field_aux::load(field< Row >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case auto_detect: return diskio::load_auto_detect(x, name, err_msg); break; case arma_binary: return diskio::load_arma_binary(x, name, err_msg); break; case ppm_binary: return diskio::load_ppm_binary(x, name, err_msg); break; default: err_msg = "unsupported type"; return false; } } template inline bool field_aux::load(field< Row >& x, std::istream& is, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case auto_detect: return diskio::load_auto_detect(x, is, err_msg); break; case arma_binary: return diskio::load_arma_binary(x, is, err_msg); break; case ppm_binary: return diskio::load_ppm_binary(x, is, err_msg); break; default: err_msg = "unsupported type"; return false; } } template inline bool field_aux::save(const field< Cube >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case arma_binary: return diskio::save_arma_binary(x, name); break; default: err_msg = "unsupported type"; return false; } } template inline bool field_aux::save(const field< Cube >& x, std::ostream& os, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case arma_binary: return diskio::save_arma_binary(x, os); break; default: err_msg = "unsupported type"; return false; } } template inline bool field_aux::load(field< Cube >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case auto_detect: case arma_binary: return diskio::load_arma_binary(x, name, err_msg); break; default: err_msg = "unsupported type"; return false; } } template inline bool field_aux::load(field< Cube >& x, std::istream& is, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); switch(type) { case auto_detect: case arma_binary: return diskio::load_arma_binary(x, is, err_msg); break; default: err_msg = "unsupported type"; return false; } } inline bool field_aux::save(const field< std::string >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); arma_ignore(type); err_msg.clear(); return diskio::save_std_string(x, name); } inline bool field_aux::save(const field< std::string >& x, std::ostream& os, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); arma_ignore(type); err_msg.clear(); return diskio::save_std_string(x, os); } inline bool field_aux::load(field< std::string >& x, const std::string& name, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); arma_ignore(type); return diskio::load_std_string(x, name, err_msg); } inline bool field_aux::load(field< std::string >& x, std::istream& is, const file_type type, std::string& err_msg) { arma_extra_debug_sigprint(); arma_ignore(type); return diskio::load_std_string(x, is, err_msg); } #ifdef ARMA_EXTRA_FIELD_MEAT #include ARMA_INCFILE_WRAP(ARMA_EXTRA_FIELD_MEAT) #endif //! @} RcppArmadillo/inst/include/armadillo_bits/op_log_det_meat.hpp0000644000176200001440000001146614124060717024234 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_log_det //! @{ template inline bool op_log_det::apply_direct(typename T1::elem_type& out_val, typename T1::pod_type& out_sign, const Base& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(strip_diagmat::do_diagmat) { const strip_diagmat strip(expr.get_ref()); return op_log_det::apply_diagmat(out_val, out_sign, strip.M); } if(strip_trimat::do_trimat) { const strip_trimat strip(expr.get_ref()); return op_log_det::apply_trimat(out_val, out_sign, strip.M); } Mat A(expr.get_ref()); arma_debug_check( (A.is_square() == false), "log_det(): given matrix must be square sized" ); if(A.is_diagmat()) { return op_log_det::apply_diagmat(out_val, out_sign, A); } const bool is_triu = trimat_helper::is_triu(A); const bool is_tril = is_triu ? false : trimat_helper::is_tril(A); if(is_triu || is_tril) { return op_log_det::apply_trimat(out_val, out_sign, A); } return auxlib::log_det(out_val, out_sign, A); } template inline bool op_log_det::apply_diagmat(typename T1::elem_type& out_val, typename T1::pod_type& out_sign, const Base& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const diagmat_proxy A(expr.get_ref()); arma_debug_check( (A.n_rows != A.n_cols), "log_det(): given matrix must be square sized" ); const uword N = (std::min)(A.n_rows, A.n_cols); if(N == 0) { out_val = eT(0); out_sign = T(1); return true; } eT x = A[0]; T sign = (is_cx::no) ? ( (access::tmp_real(x) < T(0)) ? T(-1) : T(1) ) : T(1); eT val = (is_cx::no) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x); for(uword i=1; i::no) ? ( (access::tmp_real(x) < T(0)) ? T(-1) : T(1) ) : T(1); val += (is_cx::no) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x); } out_val = val; out_sign = sign; return (arma_isnan(out_val) == false); } template inline bool op_log_det::apply_trimat(typename T1::elem_type& out_val, typename T1::pod_type& out_sign, const Base& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const Proxy P(expr.get_ref()); const uword N = P.get_n_rows(); arma_debug_check( (N != P.get_n_cols()), "log_det(): given matrix must be square sized" ); if(N == 0) { out_val = eT(0); out_sign = T(1); return true; } eT x = P.at(0,0); T sign = (is_cx::no) ? ( (access::tmp_real(x) < T(0)) ? T(-1) : T(1) ) : T(1); eT val = (is_cx::no) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x); for(uword i=1; i::no) ? ( (access::tmp_real(x) < T(0)) ? T(-1) : T(1) ) : T(1); val += (is_cx::no) ? std::log( (access::tmp_real(x) < T(0)) ? x*T(-1) : x ) : std::log(x); } out_val = val; out_sign = sign; return (arma_isnan(out_val) == false); } // template inline bool op_log_det_sympd::apply_direct(typename T1::pod_type& out_val, const Base& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; Mat A(expr.get_ref()); arma_debug_check( (A.is_square() == false), "log_det_sympd(): given matrix must be square sized" ); if((arma_config::debug) && (auxlib::rudimentary_sym_check(A) == false)) { if(is_cx::no ) { arma_debug_warn_level(1, "log_det_sympd(): given matrix is not symmetric"); } if(is_cx::yes) { arma_debug_warn_level(1, "log_det_sympd(): given matrix is not hermitian"); } } return auxlib::log_det_sympd(out_val, A); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_roots.hpp0000644000176200001440000000324514124060717022740 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_roots //! @{ template arma_warn_unused inline typename enable_if2 < is_supported_blas_type::value, const mtOp, T1, op_roots> >::result roots(const Base& X) { arma_extra_debug_sigprint(); return mtOp, T1, op_roots>(X.get_ref()); } template inline typename enable_if2 < is_supported_blas_type::value, bool >::result roots(Mat< std::complex >& out, const Base& X) { arma_extra_debug_sigprint(); const bool status = op_roots::apply_direct(out, X.get_ref()); if(status == false) { out.soft_reset(); arma_debug_warn_level(3, "roots(): eigen decomposition failed"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_log_det.hpp0000644000176200001440000000677114124060717023216 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_log_det //! @{ //! log determinant of mat template inline bool log_det ( typename T1::elem_type& out_val, typename T1::pod_type& out_sign, const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; const bool status = op_log_det::apply_direct(out_val, out_sign, X.get_ref()); if(status == false) { out_val = eT(Datum::nan); out_sign = T(0); arma_debug_warn_level(3, "log_det(): failed to find determinant"); } return status; } template inline arma_warn_unused std::complex log_det ( const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; eT out_val = eT(0); T out_sign = T(0); const bool status = op_log_det::apply_direct(out_val, out_sign, X.get_ref()); if(status == false) { out_val = eT(Datum::nan); out_sign = T(0); arma_stop_runtime_error("log_det(): failed to find determinant"); } return (out_sign >= T(1)) ? std::complex(out_val) : (out_val + std::complex(T(0),Datum::pi)); } // template inline bool log_det_sympd ( typename T1::pod_type& out_val, const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::pod_type T; out_val = T(0); const bool status = op_log_det_sympd::apply_direct(out_val, X.get_ref()); if(status == false) { out_val = Datum::nan; arma_debug_warn_level(3, "log_det_sympd(): given matrix is not symmetric positive definite"); } return status; } template inline arma_warn_unused typename T1::pod_type log_det_sympd ( const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); typedef typename T1::pod_type T; T out_val = T(0); const bool status = op_log_det_sympd::apply_direct(out_val, X.get_ref()); if(status == false) { out_val = Datum::nan; arma_stop_runtime_error("log_det_sympd(): given matrix is not symmetric positive definite"); } return out_val; } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_max_bones.hpp0000644000176200001440000000455314124060717024126 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_max //! @{ class spop_max : public traits_op_xvec { public: template inline static void apply(SpMat& out, const SpOp& in); // template inline static void apply_proxy(SpMat& out, const SpProxy& p, const uword dim, const typename arma_not_cx::result* junk = nullptr); template inline static typename T1::elem_type vector_max(const T1& X, const typename arma_not_cx::result* junk = nullptr); template inline static typename arma_not_cx::result max(const SpBase& X); template inline static typename arma_not_cx::result max_with_index(const SpProxy& P, uword& index_of_max_val); // template inline static void apply_proxy(SpMat& out, const SpProxy& p, const uword dim, const typename arma_cx_only::result* junk = nullptr); template inline static typename T1::elem_type vector_max(const T1& X, const typename arma_cx_only::result* junk = nullptr); template inline static typename arma_cx_only::result max(const SpBase& X); template inline static typename arma_cx_only::result max_with_index(const SpProxy& P, uword& index_of_max_val); }; //! @} RcppArmadillo/inst/include/armadillo_bits/spop_diagmat_meat.hpp0000644000176200001440000002461314124060717024566 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_diagmat //! @{ template inline void spop_diagmat::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(in.is_alias(out) == false) { spop_diagmat::apply_noalias(out, in.m); } else { SpMat tmp; spop_diagmat::apply_noalias(tmp, in.m); out.steal_mem(tmp); } } template inline void spop_diagmat::apply_noalias(SpMat& out, const SpBase& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const SpProxy P(expr.get_ref()); const uword P_n_rows = P.get_n_rows(); const uword P_n_cols = P.get_n_cols(); const uword P_n_nz = P.get_n_nonzero(); const bool P_is_vec = (P_n_rows == 1) || (P_n_cols == 1); if(P_is_vec) // generate a diagonal matrix out of a vector { const uword N = (P_n_rows == 1) ? P_n_cols : P_n_rows; out.zeros(N, N); if(P_n_nz == 0) { return; } typename SpProxy::const_iterator_type it = P.begin(); if(P_n_cols == 1) { for(uword i=0; i < P_n_nz; ++i) { const uword row = it.row(); out.at(row,row) = (*it); ++it; } } else if(P_n_rows == 1) { for(uword i=0; i < P_n_nz; ++i) { const uword col = it.col(); out.at(col,col) = (*it); ++it; } } } else // generate a diagonal matrix out of a matrix { out.zeros(P_n_rows, P_n_cols); const uword N = (std::min)(P_n_rows, P_n_cols); if( (is_SpMat::stored_type>::value) && (P_n_nz >= 5*N) ) { const unwrap_spmat::stored_type> U(P.Q); const SpMat& X = U.M; for(uword i=0; i < N; ++i) { const eT val = X.at(i,i); // use binary search if(val != eT(0)) { out.at(i,i) = val; } } } else { if(P_n_nz == 0) { return; } typename SpProxy::const_iterator_type it = P.begin(); for(uword i=0; i < P_n_nz; ++i) { const uword row = it.row(); const uword col = it.col(); if(row == col) { out.at(row,row) = (*it); } ++it; } } } } template inline void spop_diagmat::apply_noalias(SpMat& out, const SpGlue& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; arma_debug_assert_same_size(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "addition"); const bool is_vec = (A.n_rows == 1) || (A.n_cols == 1); if(is_vec) // generate a diagonal matrix out of a vector { const uword N = (A.n_rows == 1) ? A.n_cols : A.n_rows; out.zeros(N,N); if(A.n_rows == 1) { for(uword i=0; i < N; ++i) { out.at(i,i) = A.at(0,i) + B.at(0,i); } } else { for(uword i=0; i < N; ++i) { out.at(i,i) = A.at(i,0) + B.at(i,0); } } } else // generate a diagonal matrix out of a matrix { SpMat AA; spop_diagmat::apply_noalias(AA, A); SpMat BB; spop_diagmat::apply_noalias(BB, B); out = AA + BB; } } template inline void spop_diagmat::apply_noalias(SpMat& out, const SpGlue& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; arma_debug_assert_same_size(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "subtraction"); const bool is_vec = (A.n_rows == 1) || (A.n_cols == 1); if(is_vec) // generate a diagonal matrix out of a vector { const uword N = (A.n_rows == 1) ? A.n_cols : A.n_rows; out.zeros(N,N); if(A.n_rows == 1) { for(uword i=0; i < N; ++i) { out.at(i,i) = A.at(0,i) - B.at(0,i); } } else { for(uword i=0; i < N; ++i) { out.at(i,i) = A.at(i,0) - B.at(i,0); } } } else // generate a diagonal matrix out of a matrix { SpMat AA; spop_diagmat::apply_noalias(AA, A); SpMat BB; spop_diagmat::apply_noalias(BB, B); out = AA - BB; } } template inline void spop_diagmat::apply_noalias(SpMat& out, const SpGlue& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; arma_debug_assert_same_size(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "element-wise multiplication"); const bool is_vec = (A.n_rows == 1) || (A.n_cols == 1); if(is_vec) // generate a diagonal matrix out of a vector { const uword N = (A.n_rows == 1) ? A.n_cols : A.n_rows; out.zeros(N,N); if(A.n_rows == 1) { for(uword i=0; i < N; ++i) { out.at(i,i) = A.at(0,i) * B.at(0,i); } } else { for(uword i=0; i < N; ++i) { out.at(i,i) = A.at(i,0) * B.at(i,0); } } } else // generate a diagonal matrix out of a matrix { SpMat AA; spop_diagmat::apply_noalias(AA, A); SpMat BB; spop_diagmat::apply_noalias(BB, B); out = AA % BB; } } template inline void spop_diagmat::apply_noalias(SpMat& out, const SpGlue& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_spmat UA(expr.A); const unwrap_spmat UB(expr.B); const SpMat& A = UA.M; const SpMat& B = UB.M; arma_debug_assert_mul_size(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "matrix multiplication"); const uword C_n_rows = A.n_rows; const uword C_n_cols = B.n_cols; const bool is_vec = (C_n_rows == 1) || (C_n_cols == 1); if(is_vec) // generate a diagonal matrix out of a vector { const SpMat C = A*B; spop_diagmat::apply_noalias(out, C); } else // generate a diagonal matrix out of a matrix { const uword N = (std::min)(C_n_rows, C_n_cols); if( (A.n_nonzero >= 5*N) || (B.n_nonzero >= 5*N) ) { out.zeros(C_n_rows, C_n_cols); for(uword k=0; k < N; ++k) { typename SpMat::const_col_iterator B_it = B.begin_col_no_sync(k); typename SpMat::const_col_iterator B_it_end = B.end_col_no_sync(k); eT acc = eT(0); while(B_it != B_it_end) { const eT B_val = (*B_it); const uword i = B_it.row(); acc += A.at(k,i) * B_val; ++B_it; } out(k,k) = acc; } } else { const SpMat C = A*B; spop_diagmat::apply_noalias(out, C); } } } // // template inline void spop_diagmat2::apply(SpMat& out, const SpOp& in) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const uword row_offset = in.aux_uword_a; const uword col_offset = in.aux_uword_b; const unwrap_spmat U(in.m); if(U.is_alias(out)) { SpMat tmp; spop_diagmat2::apply_noalias(tmp, U.M, row_offset, col_offset); out.steal_mem(tmp); } else { spop_diagmat2::apply_noalias(out, U.M, row_offset, col_offset); } } template inline void spop_diagmat2::apply_noalias(SpMat& out, const SpMat& X, const uword row_offset, const uword col_offset) { arma_extra_debug_sigprint(); const uword n_rows = X.n_rows; const uword n_cols = X.n_cols; const uword n_elem = X.n_elem; if(n_elem == 0) { out.reset(); return; } const bool X_is_vec = (n_rows == 1) || (n_cols == 1); if(X_is_vec) // generate a diagonal matrix out of a vector { const uword n_pad = (std::max)(row_offset, col_offset); out.zeros(n_elem + n_pad, n_elem + n_pad); const uword X_n_nz = X.n_nonzero; if(X_n_nz == 0) { return; } typename SpMat::const_iterator it = X.begin(); if(n_cols == 1) { for(uword i=0; i < X_n_nz; ++i) { const uword row = it.row(); out.at(row_offset + row, col_offset + row) = (*it); ++it; } } else if(n_rows == 1) { for(uword i=0; i < X_n_nz; ++i) { const uword col = it.col(); out.at(row_offset + col, col_offset + col) = (*it); ++it; } } } else // generate a diagonal matrix out of a matrix { arma_debug_check_bounds ( ((row_offset > 0) && (row_offset >= n_rows)) || ((col_offset > 0) && (col_offset >= n_cols)), "diagmat(): requested diagonal out of bounds" ); out.zeros(n_rows, n_cols); if(X.n_nonzero == 0) { return; } const uword N = (std::min)(n_rows - row_offset, n_cols - col_offset); for(uword i=0; i class UpperHessenbergQR { protected: uword n; Mat mat_T; // Gi = [ cos[i] sin[i]] // [-sin[i] cos[i]] // Q = G1 * G2 * ... * G_{n-1} Col rot_cos; Col rot_sin; bool computed; public: //! Default constructor. Computation can //! be performed later by calling the compute() method. inline UpperHessenbergQR(); //! Constructor to create an object that performs and stores the //! QR decomposition of an upper Hessenberg matrix `mat_obj`. inline UpperHessenbergQR(const Mat& mat_obj); //! Conduct the QR factorisation of an upper Hessenberg matrix. virtual void compute(const Mat& mat_obj); //! Return the \f$RQ\f$ matrix, the multiplication of \f$R\f$ and \f$Q\f$, //! which is an upper Hessenberg matrix. virtual Mat matrix_RQ(); //! Apply the \f$Q\f$ matrix to another matrix \f$Y\f$. inline void apply_YQ(Mat& Y); }; //! Perform the QR decomposition of a tridiagonal matrix, a special //! case of upper Hessenberg matrices. template class TridiagQR : public UpperHessenbergQR { public: //! Default constructor. Computation can //! be performed later by calling the compute() method. inline TridiagQR(); //! Constructor to create an object that performs and stores the //! QR decomposition of a tridiagonal matrix `mat_obj`. inline TridiagQR(const Mat& mat_obj); //! Conduct the QR factorisation of a tridiagonal matrix. inline void compute(const Mat& mat_obj); //! Return the \f$RQ\f$ matrix, the multiplication of \f$R\f$ and \f$Q\f$, //! which is a tridiagonal matrix. inline Mat matrix_RQ(); }; } // namespace newarp RcppArmadillo/inst/include/armadillo_bits/fn_lu.hpp0000644000176200001440000000445014124060717022211 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_lu //! @{ //! immediate lower upper decomposition, permutation info is embedded into L (similar to Matlab/Octave) template inline bool lu ( Mat& L, Mat& U, const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); arma_debug_check( (&L == &U), "lu(): L and U are the same object" ); const bool status = auxlib::lu(L, U, X); if(status == false) { L.soft_reset(); U.soft_reset(); arma_debug_warn_level(3, "lu(): decomposition failed"); } return status; } //! immediate lower upper decomposition, also providing the permutation matrix template inline bool lu ( Mat& L, Mat& U, Mat& P, const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); arma_debug_check( ( (&L == &U) || (&L == &P) || (&U == &P) ), "lu(): two or more output objects are the same object" ); const bool status = auxlib::lu(L, U, P, X); if(status == false) { L.soft_reset(); U.soft_reset(); P.soft_reset(); arma_debug_warn_level(3, "lu(): decomposition failed"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/SpSubview_bones.hpp0000644000176200001440000004010514124060717024220 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup SpSubview //! @{ template class SpSubview : public SpBase< eT, SpSubview > { public: const SpMat& m; typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = false; static constexpr bool is_col = false; static constexpr bool is_xvec = false; const uword aux_row1; const uword aux_col1; const uword n_rows; const uword n_cols; const uword n_elem; const uword n_nonzero; protected: inline SpSubview(const SpMat& in_m, const uword in_row1, const uword in_col1, const uword in_n_rows, const uword in_n_cols); public: inline ~SpSubview(); inline SpSubview() = delete; inline SpSubview(const SpSubview& in); inline SpSubview( SpSubview&& in); inline const SpSubview& operator+= (const eT val); inline const SpSubview& operator-= (const eT val); inline const SpSubview& operator*= (const eT val); inline const SpSubview& operator/= (const eT val); inline const SpSubview& operator=(const SpSubview& x); template inline const SpSubview& operator= (const Base& x); template inline const SpSubview& operator+=(const Base& x); template inline const SpSubview& operator-=(const Base& x); template inline const SpSubview& operator*=(const Base& x); template inline const SpSubview& operator%=(const Base& x); template inline const SpSubview& operator/=(const Base& x); template inline const SpSubview& operator_equ_common(const SpBase& x); template inline const SpSubview& operator= (const SpBase& x); template inline const SpSubview& operator+=(const SpBase& x); template inline const SpSubview& operator-=(const SpBase& x); template inline const SpSubview& operator*=(const SpBase& x); template inline const SpSubview& operator%=(const SpBase& x); template inline const SpSubview& operator/=(const SpBase& x); /* inline static void extract(SpMat& out, const SpSubview& in); inline static void plus_inplace(Mat& out, const subview& in); inline static void minus_inplace(Mat& out, const subview& in); inline static void schur_inplace(Mat& out, const subview& in); inline static void div_inplace(Mat& out, const subview& in); */ template inline void for_each(functor F); template inline void for_each(functor F) const; template inline void transform(functor F); inline void replace(const eT old_val, const eT new_val); inline void clean(const pod_type threshold); inline void clamp(const eT min_val, const eT max_val); inline void fill(const eT val); inline void zeros(); inline void ones(); inline void eye(); inline void randu(); inline void randn(); arma_hot inline SpSubview_MapMat_val operator[](const uword i); arma_hot inline eT operator[](const uword i) const; arma_hot inline SpSubview_MapMat_val operator()(const uword i); arma_hot inline eT operator()(const uword i) const; arma_hot inline SpSubview_MapMat_val operator()(const uword in_row, const uword in_col); arma_hot inline eT operator()(const uword in_row, const uword in_col) const; arma_hot inline SpSubview_MapMat_val at(const uword i); arma_hot inline eT at(const uword i) const; arma_hot inline SpSubview_MapMat_val at(const uword in_row, const uword in_col); arma_hot inline eT at(const uword in_row, const uword in_col) const; inline bool check_overlap(const SpSubview& x) const; inline bool is_vec() const; inline SpSubview_row row(const uword row_num); inline const SpSubview_row row(const uword row_num) const; inline SpSubview_col col(const uword col_num); inline const SpSubview_col col(const uword col_num) const; inline SpSubview rows(const uword in_row1, const uword in_row2); inline const SpSubview rows(const uword in_row1, const uword in_row2) const; inline SpSubview cols(const uword in_col1, const uword in_col2); inline const SpSubview cols(const uword in_col1, const uword in_col2) const; inline SpSubview submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2); inline const SpSubview submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const; inline SpSubview submat(const span& row_span, const span& col_span); inline const SpSubview submat(const span& row_span, const span& col_span) const; inline SpSubview operator()(const uword row_num, const span& col_span); inline const SpSubview operator()(const uword row_num, const span& col_span) const; inline SpSubview operator()(const span& row_span, const uword col_num); inline const SpSubview operator()(const span& row_span, const uword col_num) const; inline SpSubview operator()(const span& row_span, const span& col_span); inline const SpSubview operator()(const span& row_span, const span& col_span) const; inline void swap_rows(const uword in_row1, const uword in_row2); inline void swap_cols(const uword in_col1, const uword in_col2); // Forward declarations. class iterator_base; class const_iterator; class iterator; class const_row_iterator; class row_iterator; // Similar to SpMat iterators but automatically iterates past and ignores values not in the subview. class iterator_base { public: inline iterator_base(const SpSubview& in_M); inline iterator_base(const SpSubview& in_M, const uword col, const uword pos); arma_inline uword col() const { return internal_col; } arma_inline uword pos() const { return internal_pos; } arma_aligned const SpSubview* M; arma_aligned uword internal_col; arma_aligned uword internal_pos; typedef std::bidirectional_iterator_tag iterator_category; typedef eT value_type; typedef std::ptrdiff_t difference_type; // TODO: not certain on this one typedef const eT* pointer; typedef const eT& reference; }; class const_iterator : public iterator_base { public: inline const_iterator(const SpSubview& in_M, uword initial_pos = 0); inline const_iterator(const SpSubview& in_M, uword in_row, uword in_col); inline const_iterator(const SpSubview& in_M, uword in_row, uword in_col, uword in_pos, uword skip_pos); inline const_iterator(const const_iterator& other); arma_inline eT operator*() const; // Don't hold location internally; call "dummy" methods to get that information. arma_inline uword row() const { return iterator_base::M->m.row_indices[iterator_base::internal_pos + skip_pos] - iterator_base::M->aux_row1; } inline arma_hot const_iterator& operator++(); inline arma_warn_unused const_iterator operator++(int); inline arma_hot const_iterator& operator--(); inline arma_warn_unused const_iterator operator--(int); inline arma_hot bool operator!=(const const_iterator& rhs) const; inline arma_hot bool operator==(const const_iterator& rhs) const; inline arma_hot bool operator!=(const typename SpMat::const_iterator& rhs) const; inline arma_hot bool operator==(const typename SpMat::const_iterator& rhs) const; inline arma_hot bool operator!=(const const_row_iterator& rhs) const; inline arma_hot bool operator==(const const_row_iterator& rhs) const; inline arma_hot bool operator!=(const typename SpMat::const_row_iterator& rhs) const; inline arma_hot bool operator==(const typename SpMat::const_row_iterator& rhs) const; arma_aligned uword skip_pos; // not used in row_iterator or const_row_iterator }; class iterator : public const_iterator { public: inline iterator(SpSubview& in_M, const uword initial_pos = 0) : const_iterator(in_M, initial_pos) { } inline iterator(SpSubview& in_M, const uword in_row, const uword in_col) : const_iterator(in_M, in_row, in_col) { } inline iterator(SpSubview& in_M, const uword in_row, const uword in_col, const uword in_pos, const uword in_skip_pos) : const_iterator(in_M, in_row, in_col, in_pos, in_skip_pos) { } inline iterator(const iterator& other) : const_iterator(other) { } inline arma_hot SpValProxy< SpSubview > operator*(); // overloads needed for return type correctness inline arma_hot iterator& operator++(); inline arma_warn_unused iterator operator++(int); inline arma_hot iterator& operator--(); inline arma_warn_unused iterator operator--(int); // This has a different value_type than iterator_base. typedef SpValProxy< SpSubview > value_type; typedef const SpValProxy< SpSubview >* pointer; typedef const SpValProxy< SpSubview >& reference; }; class const_row_iterator : public iterator_base { public: inline const_row_iterator(); inline const_row_iterator(const SpSubview& in_M, uword initial_pos = 0); inline const_row_iterator(const SpSubview& in_M, uword in_row, uword in_col); inline const_row_iterator(const const_row_iterator& other); inline arma_hot const_row_iterator& operator++(); inline arma_warn_unused const_row_iterator operator++(int); inline arma_hot const_row_iterator& operator--(); inline arma_warn_unused const_row_iterator operator--(int); uword internal_row; // Hold row internally because we use internal_pos differently. uword actual_pos; // Actual position in subview's parent matrix. arma_inline eT operator*() const { return iterator_base::M->m.values[actual_pos]; } arma_inline uword row() const { return internal_row; } inline arma_hot bool operator!=(const const_iterator& rhs) const; inline arma_hot bool operator==(const const_iterator& rhs) const; inline arma_hot bool operator!=(const typename SpMat::const_iterator& rhs) const; inline arma_hot bool operator==(const typename SpMat::const_iterator& rhs) const; inline arma_hot bool operator!=(const const_row_iterator& rhs) const; inline arma_hot bool operator==(const const_row_iterator& rhs) const; inline arma_hot bool operator!=(const typename SpMat::const_row_iterator& rhs) const; inline arma_hot bool operator==(const typename SpMat::const_row_iterator& rhs) const; }; class row_iterator : public const_row_iterator { public: inline row_iterator(SpSubview& in_M, uword initial_pos = 0) : const_row_iterator(in_M, initial_pos) { } inline row_iterator(SpSubview& in_M, uword in_row, uword in_col) : const_row_iterator(in_M, in_row, in_col) { } inline row_iterator(const row_iterator& other) : const_row_iterator(other) { } inline arma_hot SpValProxy< SpSubview > operator*(); // overloads needed for return type correctness inline arma_hot row_iterator& operator++(); inline arma_warn_unused row_iterator operator++(int); inline arma_hot row_iterator& operator--(); inline arma_warn_unused row_iterator operator--(int); // This has a different value_type than iterator_base. typedef SpValProxy< SpSubview > value_type; typedef const SpValProxy< SpSubview >* pointer; typedef const SpValProxy< SpSubview >& reference; }; inline iterator begin(); inline const_iterator begin() const; inline const_iterator cbegin() const; inline iterator begin_col(const uword col_num); inline const_iterator begin_col(const uword col_num) const; inline row_iterator begin_row(const uword row_num = 0); inline const_row_iterator begin_row(const uword row_num = 0) const; inline iterator end(); inline const_iterator end() const; inline const_iterator cend() const; inline row_iterator end_row(); inline const_row_iterator end_row() const; inline row_iterator end_row(const uword row_num); inline const_row_iterator end_row(const uword row_num) const; //! don't use this unless you're writing internal Armadillo code arma_inline bool is_alias(const SpMat& X) const; private: friend class SpMat; friend class SpSubview_col; friend class SpSubview_row; friend class SpValProxy< SpSubview >; // allow SpValProxy to call insert_element() and delete_element() inline arma_warn_unused eT& insert_element(const uword in_row, const uword in_col, const eT in_val = eT(0)); inline void delete_element(const uword in_row, const uword in_col); inline void invalidate_cache() const; }; template class SpSubview_col : public SpSubview { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = false; static constexpr bool is_col = true; static constexpr bool is_xvec = false; inline void operator= (const SpSubview& x); inline void operator= (const SpSubview_col& x); template inline void operator= (const SpBase& x); template inline void operator= (const Base& x); inline arma_warn_unused const SpOp,spop_htrans> t() const; inline arma_warn_unused const SpOp,spop_htrans> ht() const; inline arma_warn_unused const SpOp,spop_strans> st() const; protected: inline SpSubview_col(const SpMat& in_m, const uword in_col); inline SpSubview_col(const SpMat& in_m, const uword in_col, const uword in_row1, const uword in_n_rows); inline SpSubview_col() = delete; private: friend class SpMat; friend class SpSubview; }; template class SpSubview_row : public SpSubview { public: typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_row = true; static constexpr bool is_col = false; static constexpr bool is_xvec = false; inline void operator= (const SpSubview& x); inline void operator= (const SpSubview_row& x); template inline void operator= (const SpBase& x); template inline void operator= (const Base& x); inline arma_warn_unused const SpOp,spop_htrans> t() const; inline arma_warn_unused const SpOp,spop_htrans> ht() const; inline arma_warn_unused const SpOp,spop_strans> st() const; protected: inline SpSubview_row(const SpMat& in_m, const uword in_row); inline SpSubview_row(const SpMat& in_m, const uword in_row, const uword in_col1, const uword in_n_cols); inline SpSubview_row() = delete; private: friend class SpMat; friend class SpSubview; }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_cx_scalar_meat.hpp0000644000176200001440000003012714124060717024551 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_cx_scalar //! @{ template inline void op_cx_scalar_times::apply ( Mat< typename std::complex >& out, const mtOp, T1, op_cx_scalar_times>& X ) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const Proxy A(X.m); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); out.set_size(n_rows, n_cols); const eT k = X.aux_out_eT; eT* out_mem = out.memptr(); if(Proxy::use_at == false) { const uword n_elem = A.get_n_elem(); for(uword i=0; i inline void op_cx_scalar_plus::apply ( Mat< typename std::complex >& out, const mtOp, T1, op_cx_scalar_plus>& X ) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const Proxy A(X.m); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); out.set_size(n_rows, n_cols); const eT k = X.aux_out_eT; eT* out_mem = out.memptr(); if(Proxy::use_at == false) { const uword n_elem = A.get_n_elem(); for(uword i=0; i inline void op_cx_scalar_minus_pre::apply ( Mat< typename std::complex >& out, const mtOp, T1, op_cx_scalar_minus_pre>& X ) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const Proxy A(X.m); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); out.set_size(n_rows, n_cols); const eT k = X.aux_out_eT; eT* out_mem = out.memptr(); if(Proxy::use_at == false) { const uword n_elem = A.get_n_elem(); for(uword i=0; i inline void op_cx_scalar_minus_post::apply ( Mat< typename std::complex >& out, const mtOp, T1, op_cx_scalar_minus_post>& X ) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const Proxy A(X.m); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); out.set_size(n_rows, n_cols); const eT k = X.aux_out_eT; eT* out_mem = out.memptr(); if(Proxy::use_at == false) { const uword n_elem = A.get_n_elem(); for(uword i=0; i inline void op_cx_scalar_div_pre::apply ( Mat< typename std::complex >& out, const mtOp, T1, op_cx_scalar_div_pre>& X ) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const Proxy A(X.m); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); out.set_size(n_rows, n_cols); const eT k = X.aux_out_eT; eT* out_mem = out.memptr(); if(Proxy::use_at == false) { const uword n_elem = A.get_n_elem(); for(uword i=0; i inline void op_cx_scalar_div_post::apply ( Mat< typename std::complex >& out, const mtOp, T1, op_cx_scalar_div_post>& X ) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const Proxy A(X.m); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); out.set_size(n_rows, n_cols); const eT k = X.aux_out_eT; eT* out_mem = out.memptr(); if(Proxy::use_at == false) { const uword n_elem = A.get_n_elem(); for(uword i=0; i inline void op_cx_scalar_times::apply ( Cube< typename std::complex >& out, const mtOpCube, T1, op_cx_scalar_times>& X ) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const ProxyCube A(X.m); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); const uword n_slices = A.get_n_slices(); out.set_size(n_rows, n_cols, n_slices); const eT k = X.aux_out_eT; const uword n_elem = out.n_elem; eT* out_mem = out.memptr(); if(ProxyCube::use_at == false) { for(uword i=0; i inline void op_cx_scalar_plus::apply ( Cube< typename std::complex >& out, const mtOpCube, T1, op_cx_scalar_plus>& X ) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const ProxyCube A(X.m); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); const uword n_slices = A.get_n_slices(); out.set_size(n_rows, n_cols, n_slices); const eT k = X.aux_out_eT; const uword n_elem = out.n_elem; eT* out_mem = out.memptr(); if(ProxyCube::use_at == false) { for(uword i=0; i inline void op_cx_scalar_minus_pre::apply ( Cube< typename std::complex >& out, const mtOpCube, T1, op_cx_scalar_minus_pre>& X ) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const ProxyCube A(X.m); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); const uword n_slices = A.get_n_slices(); out.set_size(n_rows, n_cols, n_slices); const eT k = X.aux_out_eT; const uword n_elem = out.n_elem; eT* out_mem = out.memptr(); if(ProxyCube::use_at == false) { for(uword i=0; i inline void op_cx_scalar_minus_post::apply ( Cube< typename std::complex >& out, const mtOpCube, T1, op_cx_scalar_minus_post>& X ) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const ProxyCube A(X.m); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); const uword n_slices = A.get_n_slices(); out.set_size(n_rows, n_cols, n_slices); const eT k = X.aux_out_eT; const uword n_elem = out.n_elem; eT* out_mem = out.memptr(); if(ProxyCube::use_at == false) { for(uword i=0; i inline void op_cx_scalar_div_pre::apply ( Cube< typename std::complex >& out, const mtOpCube, T1, op_cx_scalar_div_pre>& X ) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const ProxyCube A(X.m); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); const uword n_slices = A.get_n_slices(); out.set_size(n_rows, n_cols, n_slices); const eT k = X.aux_out_eT; const uword n_elem = out.n_elem; eT* out_mem = out.memptr(); if(ProxyCube::use_at == false) { for(uword i=0; i inline void op_cx_scalar_div_post::apply ( Cube< typename std::complex >& out, const mtOpCube, T1, op_cx_scalar_div_post>& X ) { arma_extra_debug_sigprint(); typedef typename std::complex eT; const ProxyCube A(X.m); const uword n_rows = A.get_n_rows(); const uword n_cols = A.get_n_cols(); const uword n_slices = A.get_n_slices(); out.set_size(n_rows, n_cols, n_slices); const eT k = X.aux_out_eT; const uword n_elem = out.n_elem; eT* out_mem = out.memptr(); if(ProxyCube::use_at == false) { for(uword i=0; i inline void op_wishrnd::apply(Mat& out, const Op& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const eT df = expr.aux; const uword mode = expr.aux_uword_a; const bool status = op_wishrnd::apply_direct(out, expr.m, df, mode); if(status == false) { out.soft_reset(); arma_stop_runtime_error("wishrnd(): given matrix is not symmetric positive definite"); } } template inline bool op_wishrnd::apply_direct(Mat& out, const Base& X, const typename T1::elem_type df, const uword mode) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap U(X.get_ref()); bool status = false; if(U.is_alias(out)) { Mat tmp; if(mode == 1) { status = op_wishrnd::apply_noalias_mode1(tmp, U.M, df); } if(mode == 2) { status = op_wishrnd::apply_noalias_mode2(tmp, U.M, df); } out.steal_mem(tmp); } else { if(mode == 1) { status = op_wishrnd::apply_noalias_mode1(out, U.M, df); } if(mode == 2) { status = op_wishrnd::apply_noalias_mode2(out, U.M, df); } } return status; } template inline bool op_wishrnd::apply_noalias_mode1(Mat& out, const Mat& S, const eT df) { arma_extra_debug_sigprint(); arma_debug_check( (S.is_square() == false), "wishrnd(): given matrix must be square sized" ); if(S.is_empty()) { out.reset(); return true; } if(auxlib::rudimentary_sym_check(S) == false) { return false; } Mat D; const bool status = op_chol::apply_direct(D, S, 0); if(status == false) { return false; } return op_wishrnd::apply_noalias_mode2(out, D, df); } template inline bool op_wishrnd::apply_noalias_mode2(Mat& out, const Mat& D, const eT df) { arma_extra_debug_sigprint(); arma_debug_check( (df <= eT(0)), "df must be greater than zero" ); arma_debug_check( (D.is_square() == false), "wishrnd(): given matrix must be square sized" ); if(D.is_empty()) { out.reset(); return true; } const uword N = D.n_rows; if(df < eT(N)) { arma_extra_debug_print("simple generator"); const uword df_floor = uword(std::floor(df)); const Mat tmp = (randn< Mat >(df_floor, N)) * D; out = tmp.t() * tmp; } else { arma_extra_debug_print("standard generator"); op_chi2rnd_varying_df chi2rnd_generator; Mat A(N, N, arma_zeros_indicator()); for(uword i=0; i::fill( A.colptr(i), i ); } const Mat tmp = A * D; A.reset(); out = tmp.t() * tmp; } return true; } // template inline void op_iwishrnd::apply(Mat& out, const Op& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const eT df = expr.aux; const uword mode = expr.aux_uword_a; const bool status = op_iwishrnd::apply_direct(out, expr.m, df, mode); if(status == false) { out.soft_reset(); arma_stop_runtime_error("iwishrnd(): given matrix is not symmetric positive definite and/or df is too low"); } } template inline bool op_iwishrnd::apply_direct(Mat& out, const Base& X, const typename T1::elem_type df, const uword mode) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap U(X.get_ref()); bool status = false; if(U.is_alias(out)) { Mat tmp; if(mode == 1) { status = op_iwishrnd::apply_noalias_mode1(tmp, U.M, df); } if(mode == 2) { status = op_iwishrnd::apply_noalias_mode2(tmp, U.M, df); } out.steal_mem(tmp); } else { if(mode == 1) { status = op_iwishrnd::apply_noalias_mode1(out, U.M, df); } if(mode == 2) { status = op_iwishrnd::apply_noalias_mode2(out, U.M, df); } } return status; } template inline bool op_iwishrnd::apply_noalias_mode1(Mat& out, const Mat& T, const eT df) { arma_extra_debug_sigprint(); arma_debug_check( (T.is_square() == false), "iwishrnd(): given matrix must be square sized" ); if(T.is_empty()) { out.reset(); return true; } if(auxlib::rudimentary_sym_check(T) == false) { return false; } Mat Tinv; Mat Dinv; const bool inv_status = auxlib::inv_sympd(Tinv, T); if(inv_status == false) { return false; } const bool chol_status = op_chol::apply_direct(Dinv, Tinv, 0); if(chol_status == false) { return false; } return op_iwishrnd::apply_noalias_mode2(out, Dinv, df); } template inline bool op_iwishrnd::apply_noalias_mode2(Mat& out, const Mat& Dinv, const eT df) { arma_extra_debug_sigprint(); arma_debug_check( (df <= eT(0)), "df must be greater than zero" ); arma_debug_check( (Dinv.is_square() == false), "iwishrnd(): given matrix must be square sized" ); if(Dinv.is_empty()) { out.reset(); return true; } Mat tmp; const bool wishrnd_status = op_wishrnd::apply_noalias_mode2(tmp, Dinv, df); if(wishrnd_status == false) { return false; } const bool inv_status1 = auxlib::inv_sympd(out, tmp); const bool inv_status2 = (inv_status1) ? bool(true) : bool(auxlib::inv(out, tmp)); if(inv_status2 == false) { return false; } return true; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_inv_meat.hpp0000644000176200001440000003573714162345366023432 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_inv //! @{ template inline void op_inv::apply(Mat& out, const Op& X) { arma_extra_debug_sigprint(); const bool status = op_inv::apply_direct(out, X.m, "inv()"); if(status == false) { out.soft_reset(); arma_stop_runtime_error("inv(): matrix is singular"); } } template inline bool op_inv::apply_direct(Mat& out, const Base& expr, const char* caller_sig) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(strip_diagmat::do_diagmat) { const strip_diagmat strip(expr.get_ref()); return op_inv::apply_diagmat(out, strip.M, caller_sig); } if(strip_trimat::do_trimat) { const strip_trimat strip(expr.get_ref()); out = strip.M; arma_debug_check( (out.is_square() == false), caller_sig, ": given matrix must be square sized" ); return auxlib::inv_tr(out, (strip.do_triu ? uword(0) : uword(1))); } out = expr.get_ref(); arma_debug_check( (out.is_square() == false), caller_sig, ": given matrix must be square sized" ); if((out.n_rows <= 4) && is_cx::no) { Mat tmp(out.n_rows, out.n_rows, arma_nozeros_indicator()); const bool status = op_inv::apply_tiny_noalias(tmp, out); if(status) { arrayops::copy(out.memptr(), tmp.memptr(), tmp.n_elem); return true; } // fallthrough if optimisation failed } if(out.is_diagmat()) { return op_inv::apply_diagmat(out, out, caller_sig); } const bool is_triu = trimat_helper::is_triu(out); const bool is_tril = (is_triu) ? false : trimat_helper::is_tril(out); if(is_triu || is_tril) { return auxlib::inv_tr(out, ((is_triu) ? uword(0) : uword(1))); } #if defined(ARMA_OPTIMISE_SYMPD) const bool try_sympd = sympd_helper::guess_sympd(out); #else const bool try_sympd = false; #endif if(try_sympd) { arma_extra_debug_print("op_inv: attempting sympd optimisation"); Mat tmp = out; const bool status = auxlib::inv_sympd(tmp); if(status) { out.steal_mem(tmp); return true; } arma_extra_debug_print("op_inv: sympd optimisation failed"); // fallthrough if optimisation failed } return auxlib::inv(out); } template inline bool op_inv::apply_diagmat(Mat& out, const T1& X, const char* caller_sig) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const diagmat_proxy A(X); arma_debug_check( (A.n_rows != A.n_cols), caller_sig, ": given matrix must be square sized" ); const uword N = (std::min)(A.n_rows, A.n_cols); bool status = true; if(A.is_alias(out) == false) { out.zeros(N,N); for(uword i=0; i tmp(N, N, arma_zeros_indicator()); for(uword i=0; i arma_cold inline bool op_inv::apply_tiny_noalias(Mat& out, const Mat& X) { arma_extra_debug_sigprint(); typedef typename get_pod_type::result T; // NOTE: assuming matrix X is square sized const uword N = X.n_rows; out.set_size(N,N); constexpr T det_min = std::numeric_limits::epsilon(); constexpr T det_max = T(1) / std::numeric_limits::epsilon(); const eT* Xm = X.memptr(); eT* outm = out.memptr(); if(N == 0) { return true; } if(N == 1) { outm[0] = eT(1) / Xm[0]; return true; }; if(N == 2) { const eT a = Xm[pos<0,0>::n2]; const eT b = Xm[pos<0,1>::n2]; const eT c = Xm[pos<1,0>::n2]; const eT d = Xm[pos<1,1>::n2]; const eT det_val = (a*d - b*c); const T abs_det_val = std::abs(det_val); if((abs_det_val < det_min) || (abs_det_val > det_max)) { return false; } outm[pos<0,0>::n2] = d / det_val; outm[pos<0,1>::n2] = -b / det_val; outm[pos<1,0>::n2] = -c / det_val; outm[pos<1,1>::n2] = a / det_val; return true; } if(N == 3) { const eT det_val = op_det::apply_tiny(X); const T abs_det_val = std::abs(det_val); if((abs_det_val < det_min) || (abs_det_val > det_max)) { return false; } outm[pos<0,0>::n3] = (Xm[pos<2,2>::n3]*Xm[pos<1,1>::n3] - Xm[pos<2,1>::n3]*Xm[pos<1,2>::n3]) / det_val; outm[pos<1,0>::n3] = -(Xm[pos<2,2>::n3]*Xm[pos<1,0>::n3] - Xm[pos<2,0>::n3]*Xm[pos<1,2>::n3]) / det_val; outm[pos<2,0>::n3] = (Xm[pos<2,1>::n3]*Xm[pos<1,0>::n3] - Xm[pos<2,0>::n3]*Xm[pos<1,1>::n3]) / det_val; outm[pos<0,1>::n3] = -(Xm[pos<2,2>::n3]*Xm[pos<0,1>::n3] - Xm[pos<2,1>::n3]*Xm[pos<0,2>::n3]) / det_val; outm[pos<1,1>::n3] = (Xm[pos<2,2>::n3]*Xm[pos<0,0>::n3] - Xm[pos<2,0>::n3]*Xm[pos<0,2>::n3]) / det_val; outm[pos<2,1>::n3] = -(Xm[pos<2,1>::n3]*Xm[pos<0,0>::n3] - Xm[pos<2,0>::n3]*Xm[pos<0,1>::n3]) / det_val; outm[pos<0,2>::n3] = (Xm[pos<1,2>::n3]*Xm[pos<0,1>::n3] - Xm[pos<1,1>::n3]*Xm[pos<0,2>::n3]) / det_val; outm[pos<1,2>::n3] = -(Xm[pos<1,2>::n3]*Xm[pos<0,0>::n3] - Xm[pos<1,0>::n3]*Xm[pos<0,2>::n3]) / det_val; outm[pos<2,2>::n3] = (Xm[pos<1,1>::n3]*Xm[pos<0,0>::n3] - Xm[pos<1,0>::n3]*Xm[pos<0,1>::n3]) / det_val; const eT check_val = Xm[pos<0,0>::n3]*outm[pos<0,0>::n3] + Xm[pos<0,1>::n3]*outm[pos<1,0>::n3] + Xm[pos<0,2>::n3]*outm[pos<2,0>::n3]; const T max_diff = (is_float::value) ? T(1e-4) : T(1e-10); // empirically determined; may need tuning if(std::abs(T(1) - check_val) >= max_diff) { return false; } return true; } if(N == 4) { const eT det_val = op_det::apply_tiny(X); const T abs_det_val = std::abs(det_val); if((abs_det_val < det_min) || (abs_det_val > det_max)) { return false; } outm[pos<0,0>::n4] = ( Xm[pos<1,2>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,1>::n4] - Xm[pos<1,3>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,1>::n4] + Xm[pos<1,3>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,2>::n4] - Xm[pos<1,1>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,2>::n4] - Xm[pos<1,2>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,3>::n4] + Xm[pos<1,1>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,3>::n4] ) / det_val; outm[pos<1,0>::n4] = ( Xm[pos<1,3>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,0>::n4] - Xm[pos<1,2>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,0>::n4] - Xm[pos<1,3>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,2>::n4] + Xm[pos<1,0>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,2>::n4] + Xm[pos<1,2>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,3>::n4] - Xm[pos<1,0>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,3>::n4] ) / det_val; outm[pos<2,0>::n4] = ( Xm[pos<1,1>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,0>::n4] - Xm[pos<1,3>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,0>::n4] + Xm[pos<1,3>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,1>::n4] - Xm[pos<1,0>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,1>::n4] - Xm[pos<1,1>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,3>::n4] + Xm[pos<1,0>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,3>::n4] ) / det_val; outm[pos<3,0>::n4] = ( Xm[pos<1,2>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,0>::n4] - Xm[pos<1,1>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,0>::n4] - Xm[pos<1,2>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,1>::n4] + Xm[pos<1,0>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,1>::n4] + Xm[pos<1,1>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,2>::n4] - Xm[pos<1,0>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,2>::n4] ) / det_val; outm[pos<0,1>::n4] = ( Xm[pos<0,3>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,1>::n4] - Xm[pos<0,2>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,1>::n4] - Xm[pos<0,3>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,2>::n4] + Xm[pos<0,1>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,2>::n4] + Xm[pos<0,2>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,3>::n4] - Xm[pos<0,1>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,3>::n4] ) / det_val; outm[pos<1,1>::n4] = ( Xm[pos<0,2>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,3>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,0>::n4] + Xm[pos<0,3>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,2>::n4] - Xm[pos<0,0>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,2>::n4] - Xm[pos<0,2>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,3>::n4] + Xm[pos<0,0>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,3>::n4] ) / det_val; outm[pos<2,1>::n4] = ( Xm[pos<0,3>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,1>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,3>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,1>::n4] + Xm[pos<0,0>::n4]*Xm[pos<2,3>::n4]*Xm[pos<3,1>::n4] + Xm[pos<0,1>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,3>::n4] - Xm[pos<0,0>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,3>::n4] ) / det_val; outm[pos<3,1>::n4] = ( Xm[pos<0,1>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,2>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,0>::n4] + Xm[pos<0,2>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,1>::n4] - Xm[pos<0,0>::n4]*Xm[pos<2,2>::n4]*Xm[pos<3,1>::n4] - Xm[pos<0,1>::n4]*Xm[pos<2,0>::n4]*Xm[pos<3,2>::n4] + Xm[pos<0,0>::n4]*Xm[pos<2,1>::n4]*Xm[pos<3,2>::n4] ) / det_val; outm[pos<0,2>::n4] = ( Xm[pos<0,2>::n4]*Xm[pos<1,3>::n4]*Xm[pos<3,1>::n4] - Xm[pos<0,3>::n4]*Xm[pos<1,2>::n4]*Xm[pos<3,1>::n4] + Xm[pos<0,3>::n4]*Xm[pos<1,1>::n4]*Xm[pos<3,2>::n4] - Xm[pos<0,1>::n4]*Xm[pos<1,3>::n4]*Xm[pos<3,2>::n4] - Xm[pos<0,2>::n4]*Xm[pos<1,1>::n4]*Xm[pos<3,3>::n4] + Xm[pos<0,1>::n4]*Xm[pos<1,2>::n4]*Xm[pos<3,3>::n4] ) / det_val; outm[pos<1,2>::n4] = ( Xm[pos<0,3>::n4]*Xm[pos<1,2>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,2>::n4]*Xm[pos<1,3>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,3>::n4]*Xm[pos<1,0>::n4]*Xm[pos<3,2>::n4] + Xm[pos<0,0>::n4]*Xm[pos<1,3>::n4]*Xm[pos<3,2>::n4] + Xm[pos<0,2>::n4]*Xm[pos<1,0>::n4]*Xm[pos<3,3>::n4] - Xm[pos<0,0>::n4]*Xm[pos<1,2>::n4]*Xm[pos<3,3>::n4] ) / det_val; outm[pos<2,2>::n4] = ( Xm[pos<0,1>::n4]*Xm[pos<1,3>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,3>::n4]*Xm[pos<1,1>::n4]*Xm[pos<3,0>::n4] + Xm[pos<0,3>::n4]*Xm[pos<1,0>::n4]*Xm[pos<3,1>::n4] - Xm[pos<0,0>::n4]*Xm[pos<1,3>::n4]*Xm[pos<3,1>::n4] - Xm[pos<0,1>::n4]*Xm[pos<1,0>::n4]*Xm[pos<3,3>::n4] + Xm[pos<0,0>::n4]*Xm[pos<1,1>::n4]*Xm[pos<3,3>::n4] ) / det_val; outm[pos<3,2>::n4] = ( Xm[pos<0,2>::n4]*Xm[pos<1,1>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,1>::n4]*Xm[pos<1,2>::n4]*Xm[pos<3,0>::n4] - Xm[pos<0,2>::n4]*Xm[pos<1,0>::n4]*Xm[pos<3,1>::n4] + Xm[pos<0,0>::n4]*Xm[pos<1,2>::n4]*Xm[pos<3,1>::n4] + Xm[pos<0,1>::n4]*Xm[pos<1,0>::n4]*Xm[pos<3,2>::n4] - Xm[pos<0,0>::n4]*Xm[pos<1,1>::n4]*Xm[pos<3,2>::n4] ) / det_val; outm[pos<0,3>::n4] = ( Xm[pos<0,3>::n4]*Xm[pos<1,2>::n4]*Xm[pos<2,1>::n4] - Xm[pos<0,2>::n4]*Xm[pos<1,3>::n4]*Xm[pos<2,1>::n4] - Xm[pos<0,3>::n4]*Xm[pos<1,1>::n4]*Xm[pos<2,2>::n4] + Xm[pos<0,1>::n4]*Xm[pos<1,3>::n4]*Xm[pos<2,2>::n4] + Xm[pos<0,2>::n4]*Xm[pos<1,1>::n4]*Xm[pos<2,3>::n4] - Xm[pos<0,1>::n4]*Xm[pos<1,2>::n4]*Xm[pos<2,3>::n4] ) / det_val; outm[pos<1,3>::n4] = ( Xm[pos<0,2>::n4]*Xm[pos<1,3>::n4]*Xm[pos<2,0>::n4] - Xm[pos<0,3>::n4]*Xm[pos<1,2>::n4]*Xm[pos<2,0>::n4] + Xm[pos<0,3>::n4]*Xm[pos<1,0>::n4]*Xm[pos<2,2>::n4] - Xm[pos<0,0>::n4]*Xm[pos<1,3>::n4]*Xm[pos<2,2>::n4] - Xm[pos<0,2>::n4]*Xm[pos<1,0>::n4]*Xm[pos<2,3>::n4] + Xm[pos<0,0>::n4]*Xm[pos<1,2>::n4]*Xm[pos<2,3>::n4] ) / det_val; outm[pos<2,3>::n4] = ( Xm[pos<0,3>::n4]*Xm[pos<1,1>::n4]*Xm[pos<2,0>::n4] - Xm[pos<0,1>::n4]*Xm[pos<1,3>::n4]*Xm[pos<2,0>::n4] - Xm[pos<0,3>::n4]*Xm[pos<1,0>::n4]*Xm[pos<2,1>::n4] + Xm[pos<0,0>::n4]*Xm[pos<1,3>::n4]*Xm[pos<2,1>::n4] + Xm[pos<0,1>::n4]*Xm[pos<1,0>::n4]*Xm[pos<2,3>::n4] - Xm[pos<0,0>::n4]*Xm[pos<1,1>::n4]*Xm[pos<2,3>::n4] ) / det_val; outm[pos<3,3>::n4] = ( Xm[pos<0,1>::n4]*Xm[pos<1,2>::n4]*Xm[pos<2,0>::n4] - Xm[pos<0,2>::n4]*Xm[pos<1,1>::n4]*Xm[pos<2,0>::n4] + Xm[pos<0,2>::n4]*Xm[pos<1,0>::n4]*Xm[pos<2,1>::n4] - Xm[pos<0,0>::n4]*Xm[pos<1,2>::n4]*Xm[pos<2,1>::n4] - Xm[pos<0,1>::n4]*Xm[pos<1,0>::n4]*Xm[pos<2,2>::n4] + Xm[pos<0,0>::n4]*Xm[pos<1,1>::n4]*Xm[pos<2,2>::n4] ) / det_val; const eT check_val = Xm[pos<0,0>::n4]*outm[pos<0,0>::n4] + Xm[pos<0,1>::n4]*outm[pos<1,0>::n4] + Xm[pos<0,2>::n4]*outm[pos<2,0>::n4] + Xm[pos<0,3>::n4]*outm[pos<3,0>::n4]; const T max_diff = (is_float::value) ? T(1e-4) : T(1e-10); // empirically determined; may need tuning if(std::abs(T(1) - check_val) >= max_diff) { return false; } return true; } return false; } template inline void op_inv_sympd::apply(Mat& out, const Op& X) { arma_extra_debug_sigprint(); const bool status = op_inv_sympd::apply_direct(out, X.m); if(status == false) { out.soft_reset(); arma_stop_runtime_error("inv_sympd(): matrix is singular or not positive definite"); } } template inline bool op_inv_sympd::apply_direct(Mat& out, const Base& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; out = expr.get_ref(); arma_debug_check( (out.is_square() == false), "inv_sympd(): given matrix must be square sized" ); if((arma_config::debug) && (auxlib::rudimentary_sym_check(out) == false)) { if(is_cx::no ) { arma_debug_warn_level(1, "inv_sympd(): given matrix is not symmetric"); } if(is_cx::yes) { arma_debug_warn_level(1, "inv_sympd(): given matrix is not hermitian"); } } if((out.n_rows <= 4) && is_cx::no) { Mat tmp(out.n_rows, out.n_rows, arma_nozeros_indicator()); const bool status = op_inv::apply_tiny_noalias(tmp, out); if(status) { arrayops::copy(out.memptr(), tmp.memptr(), tmp.n_elem); return true; } // fallthrough if optimisation failed } if((is_cx::no) && (is_op_diagmat::value || out.is_diagmat())) { arma_extra_debug_print("op_inv_sympd: detected diagonal matrix"); // specialised handling of real matrices only; // currently auxlib::inv_sympd() does not enforce that // imaginary components of diagonal elements must be zero; // strictly enforcing this constraint may break existing user software. const uword N = (std::min)(out.n_rows, out.n_cols); for(uword i=0; i inline static void apply(Mat& out, const Op& in); }; class op_normalise_mat : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); template inline static void apply(Mat& out, const Mat& A, const uword p, const uword dim); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_shuffle_bones.hpp0000644000176200001440000000246214124060717024427 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_shuffle //! @{ class op_shuffle : public traits_op_default { public: template inline static void apply_direct(Mat& out, const Mat& X, const uword dim); template inline static void apply(Mat& out, const Op& in); }; class op_shuffle_vec : public traits_op_passthru { public: template inline static void apply(Mat& out, const Op& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/Mat_bones.hpp0000644000176200001440000012657214160256234023030 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup Mat //! @{ //! Dense matrix class template class Mat : public Base< eT, Mat > { public: typedef eT elem_type; //!< the type of elements stored in the matrix typedef typename get_pod_type::result pod_type; //!< if eT is std::complex, pod_type is T; otherwise pod_type is eT const uword n_rows; //!< number of rows (read-only) const uword n_cols; //!< number of columns (read-only) const uword n_elem; //!< number of elements (read-only) const uword n_alloc; //!< number of allocated elements (read-only); NOTE: n_alloc can be 0, even if n_elem > 0 const uhword vec_state; //!< 0: matrix layout; 1: column vector layout; 2: row vector layout const uhword mem_state; // mem_state = 0: normal matrix which manages its own memory // mem_state = 1: use auxiliary memory until a size change // mem_state = 2: use auxiliary memory and don't allow the number of elements to be changed // mem_state = 3: fixed size (eg. via template based size specification) arma_aligned const eT* const mem; //!< pointer to the memory used for storing elements (memory is read-only) protected: arma_align_mem eT mem_local[ arma_config::mat_prealloc ]; // local storage, for small vectors and matrices public: static constexpr bool is_col = false; static constexpr bool is_row = false; static constexpr bool is_xvec = false; inline ~Mat(); inline Mat(); inline explicit Mat(const uword in_n_rows, const uword in_n_cols); inline explicit Mat(const SizeMat& s); template inline explicit Mat(const uword in_n_rows, const uword in_n_cols, const arma_initmode_indicator&); template inline explicit Mat(const SizeMat& s, const arma_initmode_indicator&); template inline Mat(const uword in_n_rows, const uword in_n_cols, const fill::fill_class& f); template inline Mat(const SizeMat& s, const fill::fill_class& f); inline Mat(const uword in_n_rows, const uword in_n_cols, const fill::scalar_holder f); inline Mat(const SizeMat& s, const fill::scalar_holder f); inline arma_cold Mat(const char* text); inline arma_cold Mat& operator=(const char* text); inline arma_cold Mat(const std::string& text); inline arma_cold Mat& operator=(const std::string& text); inline Mat(const std::vector& x); inline Mat& operator=(const std::vector& x); inline Mat(const std::initializer_list& list); inline Mat& operator=(const std::initializer_list& list); inline Mat(const std::initializer_list< std::initializer_list >& list); inline Mat& operator=(const std::initializer_list< std::initializer_list >& list); inline Mat(Mat&& m); inline Mat& operator=(Mat&& m); inline Mat( eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, const bool copy_aux_mem = true, const bool strict = false); inline Mat(const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols); inline Mat& operator= (const eT val); inline Mat& operator+=(const eT val); inline Mat& operator-=(const eT val); inline Mat& operator*=(const eT val); inline Mat& operator/=(const eT val); inline Mat(const Mat& m); inline Mat& operator= (const Mat& m); inline Mat& operator+=(const Mat& m); inline Mat& operator-=(const Mat& m); inline Mat& operator*=(const Mat& m); inline Mat& operator%=(const Mat& m); inline Mat& operator/=(const Mat& m); template inline Mat(const BaseCube& X); template inline Mat& operator= (const BaseCube& X); template inline Mat& operator+=(const BaseCube& X); template inline Mat& operator-=(const BaseCube& X); template inline Mat& operator*=(const BaseCube& X); template inline Mat& operator%=(const BaseCube& X); template inline Mat& operator/=(const BaseCube& X); template inline explicit Mat(const Base& A, const Base& B); inline explicit Mat(const subview& X, const bool use_colmem); // only to be used by the quasi_unwrap class inline Mat(const subview& X); inline Mat& operator= (const subview& X); inline Mat& operator+=(const subview& X); inline Mat& operator-=(const subview& X); inline Mat& operator*=(const subview& X); inline Mat& operator%=(const subview& X); inline Mat& operator/=(const subview& X); inline Mat(const subview_row_strans& X); // subview_row_strans can only be generated by the Proxy class inline Mat(const subview_row_htrans& X); // subview_row_htrans can only be generated by the Proxy class inline Mat(const xvec_htrans& X); // xvec_htrans can only be generated by the Proxy class template inline Mat(const xtrans_mat& X); // xtrans_mat can only be generated by the Proxy class inline Mat(const subview_cube& X); inline Mat& operator= (const subview_cube& X); inline Mat& operator+=(const subview_cube& X); inline Mat& operator-=(const subview_cube& X); inline Mat& operator*=(const subview_cube& X); inline Mat& operator%=(const subview_cube& X); inline Mat& operator/=(const subview_cube& X); inline Mat(const diagview& X); inline Mat& operator= (const diagview& X); inline Mat& operator+=(const diagview& X); inline Mat& operator-=(const diagview& X); inline Mat& operator*=(const diagview& X); inline Mat& operator%=(const diagview& X); inline Mat& operator/=(const diagview& X); template inline Mat(const subview_elem1& X); template inline Mat& operator= (const subview_elem1& X); template inline Mat& operator+=(const subview_elem1& X); template inline Mat& operator-=(const subview_elem1& X); template inline Mat& operator*=(const subview_elem1& X); template inline Mat& operator%=(const subview_elem1& X); template inline Mat& operator/=(const subview_elem1& X); template inline Mat(const subview_elem2& X); template inline Mat& operator= (const subview_elem2& X); template inline Mat& operator+=(const subview_elem2& X); template inline Mat& operator-=(const subview_elem2& X); template inline Mat& operator*=(const subview_elem2& X); template inline Mat& operator%=(const subview_elem2& X); template inline Mat& operator/=(const subview_elem2& X); // Operators on sparse matrices (and subviews) template inline explicit Mat(const SpBase& m); template inline Mat& operator= (const SpBase& m); template inline Mat& operator+=(const SpBase& m); template inline Mat& operator-=(const SpBase& m); template inline Mat& operator*=(const SpBase& m); template inline Mat& operator%=(const SpBase& m); template inline Mat& operator/=(const SpBase& m); inline explicit Mat(const SpSubview& X); inline Mat& operator= (const SpSubview& X); inline explicit Mat(const spdiagview& X); inline Mat& operator= (const spdiagview& X); inline Mat& operator+=(const spdiagview& X); inline Mat& operator-=(const spdiagview& X); inline Mat& operator*=(const spdiagview& X); inline Mat& operator%=(const spdiagview& X); inline Mat& operator/=(const spdiagview& X); arma_cold inline mat_injector operator<<(const eT val); arma_cold inline mat_injector operator<<(const injector_end_of_row<>& x); arma_inline subview_row row(const uword row_num); arma_inline const subview_row row(const uword row_num) const; inline subview_row operator()(const uword row_num, const span& col_span); inline const subview_row operator()(const uword row_num, const span& col_span) const; arma_inline subview_col col(const uword col_num); arma_inline const subview_col col(const uword col_num) const; inline subview_col operator()(const span& row_span, const uword col_num); inline const subview_col operator()(const span& row_span, const uword col_num) const; inline Col unsafe_col(const uword col_num); inline const Col unsafe_col(const uword col_num) const; arma_inline subview rows(const uword in_row1, const uword in_row2); arma_inline const subview rows(const uword in_row1, const uword in_row2) const; arma_inline subview_cols cols(const uword in_col1, const uword in_col2); arma_inline const subview_cols cols(const uword in_col1, const uword in_col2) const; inline subview rows(const span& row_span); inline const subview rows(const span& row_span) const; arma_inline subview_cols cols(const span& col_span); arma_inline const subview_cols cols(const span& col_span) const; arma_inline subview submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2); arma_inline const subview submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2) const; arma_inline subview submat(const uword in_row1, const uword in_col1, const SizeMat& s); arma_inline const subview submat(const uword in_row1, const uword in_col1, const SizeMat& s) const; inline subview submat (const span& row_span, const span& col_span); inline const subview submat (const span& row_span, const span& col_span) const; inline subview operator()(const span& row_span, const span& col_span); inline const subview operator()(const span& row_span, const span& col_span) const; inline subview operator()(const uword in_row1, const uword in_col1, const SizeMat& s); inline const subview operator()(const uword in_row1, const uword in_col1, const SizeMat& s) const; inline subview head_rows(const uword N); inline const subview head_rows(const uword N) const; inline subview tail_rows(const uword N); inline const subview tail_rows(const uword N) const; inline subview_cols head_cols(const uword N); inline const subview_cols head_cols(const uword N) const; inline subview_cols tail_cols(const uword N); inline const subview_cols tail_cols(const uword N) const; template arma_inline subview_elem1 elem(const Base& a); template arma_inline const subview_elem1 elem(const Base& a) const; template arma_inline subview_elem1 operator()(const Base& a); template arma_inline const subview_elem1 operator()(const Base& a) const; template arma_inline subview_elem2 elem(const Base& ri, const Base& ci); template arma_inline const subview_elem2 elem(const Base& ri, const Base& ci) const; template arma_inline subview_elem2 submat(const Base& ri, const Base& ci); template arma_inline const subview_elem2 submat(const Base& ri, const Base& ci) const; template arma_inline subview_elem2 operator()(const Base& ri, const Base& ci); template arma_inline const subview_elem2 operator()(const Base& ri, const Base& ci) const; template arma_inline subview_elem2 rows(const Base& ri); template arma_inline const subview_elem2 rows(const Base& ri) const; template arma_inline subview_elem2 cols(const Base& ci); template arma_inline const subview_elem2 cols(const Base& ci) const; arma_inline subview_each1< Mat, 0 > each_col(); arma_inline subview_each1< Mat, 1 > each_row(); arma_inline const subview_each1< Mat, 0 > each_col() const; arma_inline const subview_each1< Mat, 1 > each_row() const; template inline subview_each2< Mat, 0, T1 > each_col(const Base& indices); template inline subview_each2< Mat, 1, T1 > each_row(const Base& indices); template inline const subview_each2< Mat, 0, T1 > each_col(const Base& indices) const; template inline const subview_each2< Mat, 1, T1 > each_row(const Base& indices) const; inline const Mat& each_col(const std::function< void( Col&) >& F); inline const Mat& each_col(const std::function< void(const Col&) >& F) const; inline const Mat& each_row(const std::function< void( Row&) >& F); inline const Mat& each_row(const std::function< void(const Row&) >& F) const; arma_inline diagview diag(const sword in_id = 0); arma_inline const diagview diag(const sword in_id = 0) const; inline void swap_rows(const uword in_row1, const uword in_row2); inline void swap_cols(const uword in_col1, const uword in_col2); inline void shed_row(const uword row_num); inline void shed_col(const uword col_num); inline void shed_rows(const uword in_row1, const uword in_row2); inline void shed_cols(const uword in_col1, const uword in_col2); template inline void shed_rows(const Base& indices); template inline void shed_cols(const Base& indices); inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero = true); inline void insert_cols(const uword col_num, const uword N, const bool set_to_zero = true); template inline void insert_rows(const uword row_num, const Base& X); template inline void insert_cols(const uword col_num, const Base& X); template inline Mat(const Gen& X); template inline Mat& operator= (const Gen& X); template inline Mat& operator+=(const Gen& X); template inline Mat& operator-=(const Gen& X); template inline Mat& operator*=(const Gen& X); template inline Mat& operator%=(const Gen& X); template inline Mat& operator/=(const Gen& X); template inline Mat(const Op& X); template inline Mat& operator= (const Op& X); template inline Mat& operator+=(const Op& X); template inline Mat& operator-=(const Op& X); template inline Mat& operator*=(const Op& X); template inline Mat& operator%=(const Op& X); template inline Mat& operator/=(const Op& X); template inline Mat(const eOp& X); template inline Mat& operator= (const eOp& X); template inline Mat& operator+=(const eOp& X); template inline Mat& operator-=(const eOp& X); template inline Mat& operator*=(const eOp& X); template inline Mat& operator%=(const eOp& X); template inline Mat& operator/=(const eOp& X); template inline Mat(const mtOp& X); template inline Mat& operator= (const mtOp& X); template inline Mat& operator+=(const mtOp& X); template inline Mat& operator-=(const mtOp& X); template inline Mat& operator*=(const mtOp& X); template inline Mat& operator%=(const mtOp& X); template inline Mat& operator/=(const mtOp& X); template inline Mat(const CubeToMatOp& X); template inline Mat& operator= (const CubeToMatOp& X); template inline Mat& operator+=(const CubeToMatOp& X); template inline Mat& operator-=(const CubeToMatOp& X); template inline Mat& operator*=(const CubeToMatOp& X); template inline Mat& operator%=(const CubeToMatOp& X); template inline Mat& operator/=(const CubeToMatOp& X); template inline Mat(const SpToDOp& X); template inline Mat& operator= (const SpToDOp& X); template inline Mat& operator+=(const SpToDOp& X); template inline Mat& operator-=(const SpToDOp& X); template inline Mat& operator*=(const SpToDOp& X); template inline Mat& operator%=(const SpToDOp& X); template inline Mat& operator/=(const SpToDOp& X); template inline Mat(const Glue& X); template inline Mat& operator= (const Glue& X); template inline Mat& operator+=(const Glue& X); template inline Mat& operator-=(const Glue& X); template inline Mat& operator*=(const Glue& X); template inline Mat& operator%=(const Glue& X); template inline Mat& operator/=(const Glue& X); template inline Mat& operator+=(const Glue& X); template inline Mat& operator-=(const Glue& X); template inline Mat(const eGlue& X); template inline Mat& operator= (const eGlue& X); template inline Mat& operator+=(const eGlue& X); template inline Mat& operator-=(const eGlue& X); template inline Mat& operator*=(const eGlue& X); template inline Mat& operator%=(const eGlue& X); template inline Mat& operator/=(const eGlue& X); template inline Mat(const mtGlue& X); template inline Mat& operator= (const mtGlue& X); template inline Mat& operator+=(const mtGlue& X); template inline Mat& operator-=(const mtGlue& X); template inline Mat& operator*=(const mtGlue& X); template inline Mat& operator%=(const mtGlue& X); template inline Mat& operator/=(const mtGlue& X); arma_inline arma_warn_unused const eT& at_alt (const uword ii) const; arma_inline arma_warn_unused eT& operator[] (const uword ii); arma_inline arma_warn_unused const eT& operator[] (const uword ii) const; arma_inline arma_warn_unused eT& at (const uword ii); arma_inline arma_warn_unused const eT& at (const uword ii) const; arma_inline arma_warn_unused eT& operator() (const uword ii); arma_inline arma_warn_unused const eT& operator() (const uword ii) const; arma_inline arma_warn_unused eT& at (const uword in_row, const uword in_col); arma_inline arma_warn_unused const eT& at (const uword in_row, const uword in_col) const; arma_inline arma_warn_unused eT& operator() (const uword in_row, const uword in_col); arma_inline arma_warn_unused const eT& operator() (const uword in_row, const uword in_col) const; arma_inline const Mat& operator++(); arma_inline void operator++(int); arma_inline const Mat& operator--(); arma_inline void operator--(int); arma_inline arma_warn_unused bool is_empty() const; arma_inline arma_warn_unused bool is_vec() const; arma_inline arma_warn_unused bool is_rowvec() const; arma_inline arma_warn_unused bool is_colvec() const; arma_inline arma_warn_unused bool is_square() const; inline arma_warn_unused bool is_finite() const; inline arma_warn_unused bool has_inf() const; inline arma_warn_unused bool has_nan() const; inline arma_warn_unused bool is_sorted(const char* direction = "ascend") const; inline arma_warn_unused bool is_sorted(const char* direction, const uword dim) const; template inline arma_warn_unused bool is_sorted_helper(const comparator& comp, const uword dim) const; arma_inline arma_warn_unused bool in_range(const uword ii) const; arma_inline arma_warn_unused bool in_range(const span& x ) const; arma_inline arma_warn_unused bool in_range(const uword in_row, const uword in_col) const; arma_inline arma_warn_unused bool in_range(const span& row_span, const uword in_col) const; arma_inline arma_warn_unused bool in_range(const uword in_row, const span& col_span) const; arma_inline arma_warn_unused bool in_range(const span& row_span, const span& col_span) const; arma_inline arma_warn_unused bool in_range(const uword in_row, const uword in_col, const SizeMat& s) const; arma_inline arma_warn_unused eT* colptr(const uword in_col); arma_inline arma_warn_unused const eT* colptr(const uword in_col) const; arma_inline arma_warn_unused eT* memptr(); arma_inline arma_warn_unused const eT* memptr() const; template inline void copy_size(const Base& X); inline void set_size(const uword new_n_elem); inline void set_size(const uword new_n_rows, const uword new_n_cols); inline void set_size(const SizeMat& s); inline void resize(const uword new_n_elem); inline void resize(const uword new_n_rows, const uword new_n_cols); inline void resize(const SizeMat& s); inline void reshape(const uword new_n_rows, const uword new_n_cols); inline void reshape(const SizeMat& s); arma_deprecated inline void reshape(const uword new_n_rows, const uword new_n_cols, const uword dim); //!< NOTE: don't use this form: it will be removed template inline const Mat& for_each(functor F); template inline const Mat& for_each(functor F) const; template inline const Mat& transform(functor F); template inline const Mat& imbue(functor F); inline const Mat& replace(const eT old_val, const eT new_val); inline const Mat& clean(const pod_type threshold); inline const Mat& clamp(const eT min_val, const eT max_val); inline const Mat& fill(const eT val); template inline const Mat& fill(const fill::fill_class& f); inline const Mat& zeros(); inline const Mat& zeros(const uword new_n_elem); inline const Mat& zeros(const uword new_n_rows, const uword new_n_cols); inline const Mat& zeros(const SizeMat& s); inline const Mat& ones(); inline const Mat& ones(const uword new_n_elem); inline const Mat& ones(const uword new_n_rows, const uword new_n_cols); inline const Mat& ones(const SizeMat& s); inline const Mat& randu(); inline const Mat& randu(const uword new_n_elem); inline const Mat& randu(const uword new_n_rows, const uword new_n_cols); inline const Mat& randu(const SizeMat& s); inline const Mat& randn(); inline const Mat& randn(const uword new_n_elem); inline const Mat& randn(const uword new_n_rows, const uword new_n_cols); inline const Mat& randn(const SizeMat& s); inline const Mat& eye(); inline const Mat& eye(const uword new_n_rows, const uword new_n_cols); inline const Mat& eye(const SizeMat& s); inline arma_cold void reset(); inline arma_cold void soft_reset(); template inline void set_real(const Base& X); template inline void set_imag(const Base& X); inline arma_warn_unused eT min() const; inline arma_warn_unused eT max() const; inline eT min(uword& index_of_min_val) const; inline eT max(uword& index_of_max_val) const; inline eT min(uword& row_of_min_val, uword& col_of_min_val) const; inline eT max(uword& row_of_max_val, uword& col_of_max_val) const; inline arma_cold bool save(const std::string name, const file_type type = arma_binary) const; inline arma_cold bool save(const hdf5_name& spec, const file_type type = hdf5_binary) const; inline arma_cold bool save(const csv_name& spec, const file_type type = csv_ascii) const; inline arma_cold bool save( std::ostream& os, const file_type type = arma_binary) const; inline arma_cold bool load(const std::string name, const file_type type = auto_detect); inline arma_cold bool load(const hdf5_name& spec, const file_type type = hdf5_binary); inline arma_cold bool load(const csv_name& spec, const file_type type = csv_ascii); inline arma_cold bool load( std::istream& is, const file_type type = auto_detect); inline arma_cold bool quiet_save(const std::string name, const file_type type = arma_binary) const; inline arma_cold bool quiet_save(const hdf5_name& spec, const file_type type = hdf5_binary) const; inline arma_cold bool quiet_save(const csv_name& spec, const file_type type = csv_ascii) const; inline arma_cold bool quiet_save( std::ostream& os, const file_type type = arma_binary) const; inline arma_cold bool quiet_load(const std::string name, const file_type type = auto_detect); inline arma_cold bool quiet_load(const hdf5_name& spec, const file_type type = hdf5_binary); inline arma_cold bool quiet_load(const csv_name& spec, const file_type type = csv_ascii); inline arma_cold bool quiet_load( std::istream& is, const file_type type = auto_detect); // for container-like functionality typedef eT value_type; typedef uword size_type; typedef eT* iterator; typedef const eT* const_iterator; typedef eT* col_iterator; typedef const eT* const_col_iterator; class const_row_iterator; class row_iterator { public: inline row_iterator(); inline row_iterator(const row_iterator& X); inline row_iterator(Mat& in_M, const uword in_row, const uword in_col); inline arma_warn_unused eT& operator* (); inline row_iterator& operator++(); inline arma_warn_unused row_iterator operator++(int); inline row_iterator& operator--(); inline arma_warn_unused row_iterator operator--(int); inline arma_warn_unused bool operator!=(const row_iterator& X) const; inline arma_warn_unused bool operator==(const row_iterator& X) const; inline arma_warn_unused bool operator!=(const const_row_iterator& X) const; inline arma_warn_unused bool operator==(const const_row_iterator& X) const; typedef std::bidirectional_iterator_tag iterator_category; typedef eT value_type; typedef std::ptrdiff_t difference_type; // TODO: not certain on this one typedef eT* pointer; typedef eT& reference; arma_aligned Mat* M; arma_aligned uword current_row; arma_aligned uword current_col; }; class const_row_iterator { public: inline const_row_iterator(); inline const_row_iterator(const row_iterator& X); inline const_row_iterator(const const_row_iterator& X); inline const_row_iterator(const Mat& in_M, const uword in_row, const uword in_col); inline arma_warn_unused const eT& operator*() const; inline const_row_iterator& operator++(); inline arma_warn_unused const_row_iterator operator++(int); inline const_row_iterator& operator--(); inline arma_warn_unused const_row_iterator operator--(int); inline arma_warn_unused bool operator!=(const row_iterator& X) const; inline arma_warn_unused bool operator==(const row_iterator& X) const; inline arma_warn_unused bool operator!=(const const_row_iterator& X) const; inline arma_warn_unused bool operator==(const const_row_iterator& X) const; typedef std::bidirectional_iterator_tag iterator_category; typedef eT value_type; typedef std::ptrdiff_t difference_type; // TODO: not certain on this one typedef const eT* pointer; typedef const eT& reference; arma_aligned const Mat* M; arma_aligned uword current_row; arma_aligned uword current_col; }; class const_row_col_iterator; class row_col_iterator { public: inline row_col_iterator(); inline row_col_iterator(const row_col_iterator& in_it); inline row_col_iterator(Mat& in_M, const uword row = 0, const uword col = 0); inline arma_warn_unused eT& operator*(); inline row_col_iterator& operator++(); inline arma_warn_unused row_col_iterator operator++(int); inline row_col_iterator& operator--(); inline arma_warn_unused row_col_iterator operator--(int); inline arma_warn_unused uword row() const; inline arma_warn_unused uword col() const; inline arma_warn_unused bool operator==(const row_col_iterator& rhs) const; inline arma_warn_unused bool operator!=(const row_col_iterator& rhs) const; inline arma_warn_unused bool operator==(const const_row_col_iterator& rhs) const; inline arma_warn_unused bool operator!=(const const_row_col_iterator& rhs) const; typedef std::bidirectional_iterator_tag iterator_category; typedef eT value_type; typedef std::ptrdiff_t difference_type; // TODO: not certain on this one typedef eT* pointer; typedef eT& reference; arma_aligned Mat* M; arma_aligned eT* current_ptr; arma_aligned uword current_col; arma_aligned uword current_row; }; class const_row_col_iterator { public: inline const_row_col_iterator(); inline const_row_col_iterator(const row_col_iterator& in_it); inline const_row_col_iterator(const const_row_col_iterator& in_it); inline const_row_col_iterator(const Mat& in_M, const uword row = 0, const uword col = 0); inline arma_warn_unused const eT& operator*() const; inline const_row_col_iterator& operator++(); inline arma_warn_unused const_row_col_iterator operator++(int); inline const_row_col_iterator& operator--(); inline arma_warn_unused const_row_col_iterator operator--(int); inline arma_warn_unused uword row() const; inline arma_warn_unused uword col() const; inline arma_warn_unused bool operator==(const const_row_col_iterator& rhs) const; inline arma_warn_unused bool operator!=(const const_row_col_iterator& rhs) const; inline arma_warn_unused bool operator==(const row_col_iterator& rhs) const; inline arma_warn_unused bool operator!=(const row_col_iterator& rhs) const; // So that we satisfy the STL iterator types. typedef std::bidirectional_iterator_tag iterator_category; typedef eT value_type; typedef std::ptrdiff_t difference_type; // TODO: not certain on this one typedef const eT* pointer; typedef const eT& reference; arma_aligned const Mat* M; arma_aligned const eT* current_ptr; arma_aligned uword current_col; arma_aligned uword current_row; }; inline iterator begin(); inline const_iterator begin() const; inline const_iterator cbegin() const; inline iterator end(); inline const_iterator end() const; inline const_iterator cend() const; inline col_iterator begin_col(const uword col_num); inline const_col_iterator begin_col(const uword col_num) const; inline col_iterator end_col (const uword col_num); inline const_col_iterator end_col (const uword col_num) const; inline row_iterator begin_row(const uword row_num); inline const_row_iterator begin_row(const uword row_num) const; inline row_iterator end_row (const uword row_num); inline const_row_iterator end_row (const uword row_num) const; inline row_col_iterator begin_row_col(); inline const_row_col_iterator begin_row_col() const; inline row_col_iterator end_row_col(); inline const_row_col_iterator end_row_col() const; inline void clear(); inline bool empty() const; inline uword size() const; inline arma_warn_unused eT& front(); inline arma_warn_unused const eT& front() const; inline arma_warn_unused eT& back(); inline arma_warn_unused const eT& back() const; inline void swap(Mat& B); inline void steal_mem(Mat& X); //!< don't use this unless you're writing code internal to Armadillo inline void steal_mem_col(Mat& X, const uword max_n_rows); template class fixed; protected: inline void init_cold(); inline void init_warm(uword in_n_rows, uword in_n_cols); inline arma_cold void init(const std::string& text); inline void init(const std::initializer_list& list); inline void init(const std::initializer_list< std::initializer_list >& list); template inline void init(const Base& A, const Base& B); inline Mat(const char junk, const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols); inline Mat(const arma_vec_indicator&, const uhword in_vec_state); inline Mat(const arma_vec_indicator&, const uword in_n_rows, const uword in_n_cols, const uhword in_vec_state); inline Mat(const arma_fixed_indicator&, const uword in_n_rows, const uword in_n_cols, const uhword in_vec_state, const eT* in_mem); friend class Cube; friend class subview_cube; friend class glue_join; friend class op_strans; friend class op_htrans; friend class op_resize; friend class op_mean; friend class op_max; friend class op_min; public: #ifdef ARMA_EXTRA_MAT_PROTO #include ARMA_INCFILE_WRAP(ARMA_EXTRA_MAT_PROTO) #endif }; template template class Mat::fixed : public Mat { private: static constexpr uword fixed_n_elem = fixed_n_rows * fixed_n_cols; static constexpr bool use_extra = (fixed_n_elem > arma_config::mat_prealloc); arma_align_mem eT mem_local_extra[ (use_extra) ? fixed_n_elem : 1 ]; public: typedef fixed Mat_fixed_type; typedef eT elem_type; typedef typename get_pod_type::result pod_type; static constexpr bool is_col = (fixed_n_cols == 1); static constexpr bool is_row = (fixed_n_rows == 1); static constexpr bool is_xvec = false; static const uword n_rows; // value provided below the class definition static const uword n_cols; // value provided below the class definition static const uword n_elem; // value provided below the class definition arma_inline fixed(); arma_inline fixed(const fixed& X); inline fixed(const fill::scalar_holder f); template inline fixed(const fill::fill_class& f); template inline fixed(const Base& A); template inline fixed(const Base& A, const Base& B); inline fixed(const eT* aux_mem); inline fixed(const char* text); inline fixed(const std::string& text); using Mat::operator=; using Mat::operator(); inline fixed(const std::initializer_list& list); inline Mat& operator=(const std::initializer_list& list); inline fixed(const std::initializer_list< std::initializer_list >& list); inline Mat& operator=(const std::initializer_list< std::initializer_list >& list); arma_inline Mat& operator=(const fixed& X); #if defined(ARMA_GOOD_COMPILER) template inline Mat& operator=(const eOp& X); template inline Mat& operator=(const eGlue& X); #endif arma_inline arma_warn_unused const Op< Mat_fixed_type, op_htrans > t() const; arma_inline arma_warn_unused const Op< Mat_fixed_type, op_htrans > ht() const; arma_inline arma_warn_unused const Op< Mat_fixed_type, op_strans > st() const; arma_inline arma_warn_unused const eT& at_alt (const uword i) const; arma_inline arma_warn_unused eT& operator[] (const uword i); arma_inline arma_warn_unused const eT& operator[] (const uword i) const; arma_inline arma_warn_unused eT& at (const uword i); arma_inline arma_warn_unused const eT& at (const uword i) const; arma_inline arma_warn_unused eT& operator() (const uword i); arma_inline arma_warn_unused const eT& operator() (const uword i) const; arma_inline arma_warn_unused eT& at (const uword in_row, const uword in_col); arma_inline arma_warn_unused const eT& at (const uword in_row, const uword in_col) const; arma_inline arma_warn_unused eT& operator() (const uword in_row, const uword in_col); arma_inline arma_warn_unused const eT& operator() (const uword in_row, const uword in_col) const; arma_inline arma_warn_unused eT* colptr(const uword in_col); arma_inline arma_warn_unused const eT* colptr(const uword in_col) const; arma_inline arma_warn_unused eT* memptr(); arma_inline arma_warn_unused const eT* memptr() const; arma_inline arma_warn_unused bool is_vec() const; inline const Mat& fill(const eT val); inline const Mat& zeros(); inline const Mat& ones(); }; // these definitions are outside of the class due to bizarre C++ rules; // C++17 has inline variables to address this shortcoming template template const uword Mat::fixed::n_rows = fixed_n_rows; template template const uword Mat::fixed::n_cols = fixed_n_cols; template template const uword Mat::fixed::n_elem = fixed_n_rows * fixed_n_cols; class Mat_aux { public: template inline static void prefix_pp(Mat& x); template inline static void prefix_pp(Mat< std::complex >& x); template inline static void postfix_pp(Mat& x); template inline static void postfix_pp(Mat< std::complex >& x); template inline static void prefix_mm(Mat& x); template inline static void prefix_mm(Mat< std::complex >& x); template inline static void postfix_mm(Mat& x); template inline static void postfix_mm(Mat< std::complex >& x); template inline static void set_real(Mat& out, const Base& X); template inline static void set_real(Mat< std::complex >& out, const Base< T,T1>& X); template inline static void set_imag(Mat& out, const Base& X); template inline static void set_imag(Mat< std::complex >& out, const Base< T,T1>& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/def_blas.hpp0000644000176200001440000002534214124060717022650 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #ifdef ARMA_USE_BLAS #if defined(dgemm) || defined(DGEMM) #pragma message ("WARNING: detected possible interference with definitions of BLAS functions;") #pragma message ("WARNING: include the armadillo header before any other header as a workaround") #endif #if defined(ARMA_BLAS_NOEXCEPT) #undef ARMA_NOEXCEPT #define ARMA_NOEXCEPT noexcept #else #undef ARMA_NOEXCEPT #define ARMA_NOEXCEPT #endif #if !defined(ARMA_BLAS_CAPITALS) #define arma_sasum sasum #define arma_dasum dasum #define arma_snrm2 snrm2 #define arma_dnrm2 dnrm2 #define arma_sdot sdot #define arma_ddot ddot #define arma_sgemv sgemv #define arma_dgemv dgemv #define arma_cgemv cgemv #define arma_zgemv zgemv #define arma_sgemm sgemm #define arma_dgemm dgemm #define arma_cgemm cgemm #define arma_zgemm zgemm #define arma_ssyrk ssyrk #define arma_dsyrk dsyrk #define arma_cherk cherk #define arma_zherk zherk #else #define arma_sasum SASUM #define arma_dasum DASUM #define arma_snrm2 SNRM2 #define arma_dnrm2 DNRM2 #define arma_sdot SDOT #define arma_ddot DDOT #define arma_sgemv SGEMV #define arma_dgemv DGEMV #define arma_cgemv CGEMV #define arma_zgemv ZGEMV #define arma_sgemm SGEMM #define arma_dgemm DGEMM #define arma_cgemm CGEMM #define arma_zgemm ZGEMM #define arma_ssyrk SSYRK #define arma_dsyrk DSYRK #define arma_cherk CHERK #define arma_zherk ZHERK #endif // NOTE: "For arguments of CHARACTER type, the character length is passed as a hidden argument at the end of the argument list." // NOTE: https://gcc.gnu.org/onlinedocs/gfortran/Argument-passing-conventions.html extern "C" { #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS) float arma_fortran(arma_sasum)(const blas_int* n, const float* x, const blas_int* incx) ARMA_NOEXCEPT; double arma_fortran(arma_dasum)(const blas_int* n, const double* x, const blas_int* incx) ARMA_NOEXCEPT; float arma_fortran(arma_snrm2)(const blas_int* n, const float* x, const blas_int* incx) ARMA_NOEXCEPT; double arma_fortran(arma_dnrm2)(const blas_int* n, const double* x, const blas_int* incx) ARMA_NOEXCEPT; float arma_fortran(arma_sdot)(const blas_int* n, const float* x, const blas_int* incx, const float* y, const blas_int* incy) ARMA_NOEXCEPT; double arma_fortran(arma_ddot)(const blas_int* n, const double* x, const blas_int* incx, const double* y, const blas_int* incy) ARMA_NOEXCEPT; void arma_fortran(arma_sgemv)(const char* transA, const blas_int* m, const blas_int* n, const float* alpha, const float* A, const blas_int* ldA, const float* x, const blas_int* incx, const float* beta, float* y, const blas_int* incy, blas_len transA_len) ARMA_NOEXCEPT; void arma_fortran(arma_dgemv)(const char* transA, const blas_int* m, const blas_int* n, const double* alpha, const double* A, const blas_int* ldA, const double* x, const blas_int* incx, const double* beta, double* y, const blas_int* incy, blas_len transA_len) ARMA_NOEXCEPT; void arma_fortran(arma_cgemv)(const char* transA, const blas_int* m, const blas_int* n, const blas_cxf* alpha, const blas_cxf* A, const blas_int* ldA, const blas_cxf* x, const blas_int* incx, const blas_cxf* beta, blas_cxf* y, const blas_int* incy, blas_len transA_len) ARMA_NOEXCEPT; void arma_fortran(arma_zgemv)(const char* transA, const blas_int* m, const blas_int* n, const blas_cxd* alpha, const blas_cxd* A, const blas_int* ldA, const blas_cxd* x, const blas_int* incx, const blas_cxd* beta, blas_cxd* y, const blas_int* incy, blas_len transA_len) ARMA_NOEXCEPT; void arma_fortran(arma_sgemm)(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const float* alpha, const float* A, const blas_int* ldA, const float* B, const blas_int* ldB, const float* beta, float* C, const blas_int* ldC, blas_len transA_len, blas_len transB_len) ARMA_NOEXCEPT; void arma_fortran(arma_dgemm)(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const double* alpha, const double* A, const blas_int* ldA, const double* B, const blas_int* ldB, const double* beta, double* C, const blas_int* ldC, blas_len transA_len, blas_len transB_len) ARMA_NOEXCEPT; void arma_fortran(arma_cgemm)(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const blas_cxf* alpha, const blas_cxf* A, const blas_int* ldA, const blas_cxf* B, const blas_int* ldB, const blas_cxf* beta, blas_cxf* C, const blas_int* ldC, blas_len transA_len, blas_len transB_len) ARMA_NOEXCEPT; void arma_fortran(arma_zgemm)(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const blas_cxd* alpha, const blas_cxd* A, const blas_int* ldA, const blas_cxd* B, const blas_int* ldB, const blas_cxd* beta, blas_cxd* C, const blas_int* ldC, blas_len transA_len, blas_len transB_len) ARMA_NOEXCEPT; void arma_fortran(arma_ssyrk)(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const float* alpha, const float* A, const blas_int* ldA, const float* beta, float* C, const blas_int* ldC, blas_len uplo_len, blas_len transA_len) ARMA_NOEXCEPT; void arma_fortran(arma_dsyrk)(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const double* alpha, const double* A, const blas_int* ldA, const double* beta, double* C, const blas_int* ldC, blas_len uplo_len, blas_len transA_len) ARMA_NOEXCEPT; void arma_fortran(arma_cherk)(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const float* alpha, const blas_cxf* A, const blas_int* ldA, const float* beta, blas_cxf* C, const blas_int* ldC, blas_len uplo_len, blas_len transA_len) ARMA_NOEXCEPT; void arma_fortran(arma_zherk)(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const double* alpha, const blas_cxd* A, const blas_int* ldA, const double* beta, blas_cxd* C, const blas_int* ldC, blas_len uplo_len, blas_len transA_len) ARMA_NOEXCEPT; #else // prototypes without hidden arguments float arma_fortran(arma_sasum)(const blas_int* n, const float* x, const blas_int* incx) ARMA_NOEXCEPT; double arma_fortran(arma_dasum)(const blas_int* n, const double* x, const blas_int* incx) ARMA_NOEXCEPT; float arma_fortran(arma_snrm2)(const blas_int* n, const float* x, const blas_int* incx) ARMA_NOEXCEPT; double arma_fortran(arma_dnrm2)(const blas_int* n, const double* x, const blas_int* incx) ARMA_NOEXCEPT; float arma_fortran(arma_sdot)(const blas_int* n, const float* x, const blas_int* incx, const float* y, const blas_int* incy) ARMA_NOEXCEPT; double arma_fortran(arma_ddot)(const blas_int* n, const double* x, const blas_int* incx, const double* y, const blas_int* incy) ARMA_NOEXCEPT; void arma_fortran(arma_sgemv)(const char* transA, const blas_int* m, const blas_int* n, const float* alpha, const float* A, const blas_int* ldA, const float* x, const blas_int* incx, const float* beta, float* y, const blas_int* incy) ARMA_NOEXCEPT; void arma_fortran(arma_dgemv)(const char* transA, const blas_int* m, const blas_int* n, const double* alpha, const double* A, const blas_int* ldA, const double* x, const blas_int* incx, const double* beta, double* y, const blas_int* incy) ARMA_NOEXCEPT; void arma_fortran(arma_cgemv)(const char* transA, const blas_int* m, const blas_int* n, const blas_cxf* alpha, const blas_cxf* A, const blas_int* ldA, const blas_cxf* x, const blas_int* incx, const blas_cxf* beta, blas_cxf* y, const blas_int* incy) ARMA_NOEXCEPT; void arma_fortran(arma_zgemv)(const char* transA, const blas_int* m, const blas_int* n, const blas_cxd* alpha, const blas_cxd* A, const blas_int* ldA, const blas_cxd* x, const blas_int* incx, const blas_cxd* beta, blas_cxd* y, const blas_int* incy) ARMA_NOEXCEPT; void arma_fortran(arma_sgemm)(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const float* alpha, const float* A, const blas_int* ldA, const float* B, const blas_int* ldB, const float* beta, float* C, const blas_int* ldC) ARMA_NOEXCEPT; void arma_fortran(arma_dgemm)(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const double* alpha, const double* A, const blas_int* ldA, const double* B, const blas_int* ldB, const double* beta, double* C, const blas_int* ldC) ARMA_NOEXCEPT; void arma_fortran(arma_cgemm)(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const blas_cxf* alpha, const blas_cxf* A, const blas_int* ldA, const blas_cxf* B, const blas_int* ldB, const blas_cxf* beta, blas_cxf* C, const blas_int* ldC) ARMA_NOEXCEPT; void arma_fortran(arma_zgemm)(const char* transA, const char* transB, const blas_int* m, const blas_int* n, const blas_int* k, const blas_cxd* alpha, const blas_cxd* A, const blas_int* ldA, const blas_cxd* B, const blas_int* ldB, const blas_cxd* beta, blas_cxd* C, const blas_int* ldC) ARMA_NOEXCEPT; void arma_fortran(arma_ssyrk)(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const float* alpha, const float* A, const blas_int* ldA, const float* beta, float* C, const blas_int* ldC) ARMA_NOEXCEPT; void arma_fortran(arma_dsyrk)(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const double* alpha, const double* A, const blas_int* ldA, const double* beta, double* C, const blas_int* ldC) ARMA_NOEXCEPT; void arma_fortran(arma_cherk)(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const float* alpha, const blas_cxf* A, const blas_int* ldA, const float* beta, blas_cxf* C, const blas_int* ldC) ARMA_NOEXCEPT; void arma_fortran(arma_zherk)(const char* uplo, const char* transA, const blas_int* n, const blas_int* k, const double* alpha, const blas_cxd* A, const blas_int* ldA, const double* beta, blas_cxd* C, const blas_int* ldC) ARMA_NOEXCEPT; #endif } #undef ARMA_NOEXCEPT #endif RcppArmadillo/inst/include/armadillo_bits/spglue_minus_bones.hpp0000644000176200001440000000374314124060717025012 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_minus //! @{ class spglue_minus : public traits_glue_or { public: template arma_hot inline static void apply(SpMat& out, const SpGlue& X); template arma_hot inline static void apply_noalias(SpMat& result, const SpProxy& pa, const SpProxy& pb); template arma_hot inline static void apply_noalias(SpMat& out, const SpMat& A, const SpMat& B); }; class spglue_minus_mixed : public traits_glue_or { public: template inline static void apply(SpMat::eT>& out, const mtSpGlue::eT, T1, T2, spglue_minus_mixed>& expr); template inline static void sparse_minus_dense(Mat< typename promote_type::result>& out, const T1& X, const T2& Y); template inline static void dense_minus_sparse(Mat< typename promote_type::result>& out, const T1& X, const T2& Y); }; //! @} RcppArmadillo/inst/include/armadillo_bits/operator_cube_minus.hpp0000644000176200001440000001131714124060717025152 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup operator_cube_minus //! @{ //! unary - template arma_inline const eOpCube operator- ( const BaseCube& X ) { arma_extra_debug_sigprint(); return eOpCube(X.get_ref()); } //! BaseCube - scalar template arma_inline const eOpCube operator- ( const BaseCube& X, const typename T1::elem_type k ) { arma_extra_debug_sigprint(); return eOpCube(X.get_ref(), k); } //! scalar - BaseCube template arma_inline const eOpCube operator- ( const typename T1::elem_type k, const BaseCube& X ) { arma_extra_debug_sigprint(); return eOpCube(X.get_ref(), k); } //! complex scalar - non-complex BaseCube (experimental) template arma_inline const mtOpCube, T1, op_cx_scalar_minus_pre> operator- ( const std::complex& k, const BaseCube& X ) { arma_extra_debug_sigprint(); return mtOpCube, T1, op_cx_scalar_minus_pre>('j', X.get_ref(), k); } //! non-complex BaseCube - complex scalar (experimental) template arma_inline const mtOpCube, T1, op_cx_scalar_minus_post> operator- ( const BaseCube& X, const std::complex& k ) { arma_extra_debug_sigprint(); return mtOpCube, T1, op_cx_scalar_minus_post>('j', X.get_ref(), k); } //! subtraction of BaseCube objects with same element type template arma_inline const eGlueCube operator- ( const BaseCube& X, const BaseCube& Y ) { arma_extra_debug_sigprint(); return eGlueCube(X.get_ref(), Y.get_ref()); } //! subtraction of BaseCube objects with different element types template inline const mtGlueCube::result, T1, T2, glue_mixed_minus> operator- ( const BaseCube< typename force_different_type::T1_result, T1>& X, const BaseCube< typename force_different_type::T2_result, T2>& Y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); return mtGlueCube( X.get_ref(), Y.get_ref() ); } template arma_inline Cube operator- ( const subview_cube_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); return subview_cube_each1_aux::operator_minus(X, Y.get_ref()); } template arma_inline Cube operator- ( const Base& X, const subview_cube_each1& Y ) { arma_extra_debug_sigprint(); return subview_cube_each1_aux::operator_minus(X.get_ref(), Y); } template arma_inline Cube operator- ( const subview_cube_each2& X, const Base& Y ) { arma_extra_debug_sigprint(); return subview_cube_each2_aux::operator_minus(X, Y.get_ref()); } template arma_inline Cube operator- ( const Base& X, const subview_cube_each2& Y ) { arma_extra_debug_sigprint(); return subview_cube_each2_aux::operator_minus(X.get_ref(), Y); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_qz.hpp0000644000176200001440000000360314124060717022222 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_qz //! @{ //! QZ decomposition for pair of N-by-N general matrices A and B template inline typename enable_if2 < is_supported_blas_type::value, bool >::result qz ( Mat& AA, Mat& BB, Mat& Q, Mat& Z, const Base& A_expr, const Base& B_expr, const char* select = "none" ) { arma_extra_debug_sigprint(); const char sig = (select != nullptr) ? select[0] : char(0); arma_debug_check( ( (sig != 'n') && (sig != 'l') && (sig != 'r') && (sig != 'i') && (sig != 'o') ), "qz(): unknown select form" ); const bool status = auxlib::qz(AA, BB, Q, Z, A_expr.get_ref(), B_expr.get_ref(), sig); if(status == false) { AA.soft_reset(); BB.soft_reset(); Q.soft_reset(); Z.soft_reset(); arma_debug_warn_level(3, "qz(): decomposition failed"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/operator_schur.hpp0000644000176200001440000002157614124060717024155 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup operator_schur //! @{ // operator %, which we define it to do a schur product (element-wise multiplication) //! element-wise multiplication of user-accessible Armadillo objects with same element type template arma_inline typename enable_if2 < is_arma_type::value && is_arma_type::value && is_same_type::value, const eGlue >::result operator% ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); return eGlue(X, Y); } //! element-wise multiplication of user-accessible Armadillo objects with different element types template inline typename enable_if2 < (is_arma_type::value && is_arma_type::value && (is_same_type::no)), const mtGlue::result, T1, T2, glue_mixed_schur> >::result operator% ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); return mtGlue( X, Y ); } //! element-wise multiplication of two sparse matrices template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_sparse_type::value && is_same_type::value), SpGlue >::result operator% ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); return SpGlue(x, y); } //! element-wise multiplication of one dense and one sparse object template inline typename enable_if2 < (is_arma_type::value && is_arma_sparse_type::value && is_same_type::value), SpMat >::result operator% ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); SpMat out; spglue_schur_misc::dense_schur_sparse(out, x, y); return out; } //! element-wise multiplication of one sparse and one dense object template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_type::value && is_same_type::value), SpMat >::result operator% ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); SpMat out; // Just call the other order (these operations are commutative) // TODO: if there is a matrix size mismatch, the debug assert will print the matrix sizes in wrong order spglue_schur_misc::dense_schur_sparse(out, y, x); return out; } //! optimization: sparse % (sparse +/- scalar) can be done without forming the dense result of the (sparse +/- scalar) term template inline typename enable_if2 < ( is_arma_sparse_type::value && is_arma_sparse_type::value && is_same_type::yes && (is_same_type::value || is_same_type::value || is_same_type::value) ), SpMat >::result operator% ( const T1& x, const SpToDOp& y ) { arma_extra_debug_sigprint(); SpMat out; op_type::apply_inside_schur(out, x, y); return out; } //! optimization: (sparse +/- scalar) % sparse can be done without forming the dense result of the (sparse +/- scalar) term template inline typename enable_if2 < ( is_arma_sparse_type::value && is_arma_sparse_type::value && is_same_type::yes && (is_same_type::value || is_same_type::value || is_same_type::value) ), SpMat >::result operator% ( const SpToDOp& x, const T2& y ) { arma_extra_debug_sigprint(); SpMat out; // Just call the other order (these operations are commutative) // TODO: if there is a matrix size mismatch, the debug assert will print the matrix sizes in wrong order op_type::apply_inside_schur(out, y, x); return out; } //! element-wise multiplication of two sparse objects with different element types template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_sparse_type::value && is_same_type::no), const mtSpGlue< typename promote_type::result, T1, T2, spglue_schur_mixed > >::result operator% ( const T1& X, const T2& Y ) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT1; typedef typename T2::elem_type eT2; typedef typename promote_type::result out_eT; promote_type::check(); return mtSpGlue( X, Y ); } //! element-wise multiplication of one dense and one sparse object with different element types template inline typename enable_if2 < (is_arma_type::value && is_arma_sparse_type::value && is_same_type::no), SpMat< typename promote_type::result > >::result operator% ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); SpMat< typename promote_type::result > out; spglue_schur_mixed::dense_schur_sparse(out, x, y); return out; } //! element-wise multiplication of one sparse and one dense object with different element types template inline typename enable_if2 < (is_arma_sparse_type::value && is_arma_type::value && is_same_type::no), SpMat< typename promote_type::result > >::result operator% ( const T1& x, const T2& y ) { arma_extra_debug_sigprint(); SpMat< typename promote_type::result > out; // Just call the other order (these operations are commutative) // TODO: if there is a matrix size mismatch, the debug assert will print the matrix sizes in wrong order spglue_schur_mixed::dense_schur_sparse(out, y, x); return out; } template inline Mat operator% ( const subview_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); return subview_each1_aux::operator_schur(X, Y.get_ref()); } template arma_inline Mat operator% ( const Base& X, const subview_each1& Y ) { arma_extra_debug_sigprint(); return subview_each1_aux::operator_schur(Y, X.get_ref()); // NOTE: swapped order } template inline Mat operator% ( const subview_each2& X, const Base& Y ) { arma_extra_debug_sigprint(); return subview_each2_aux::operator_schur(X, Y.get_ref()); } template arma_inline Mat operator% ( const Base& X, const subview_each2& Y ) { arma_extra_debug_sigprint(); return subview_each2_aux::operator_schur(Y, X.get_ref()); // NOTE: swapped order } //! @} RcppArmadillo/inst/include/armadillo_bits/glue_relational_bones.hpp0000644000176200001440000000672014124060717025444 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup glue_relational //! @{ class glue_rel_lt : public traits_glue_or { public: template inline static void apply(Mat & out, const mtGlue& X); template inline static void apply(Cube & out, const mtGlueCube& X); }; class glue_rel_gt : public traits_glue_or { public: template inline static void apply(Mat & out, const mtGlue& X); template inline static void apply(Cube & out, const mtGlueCube& X); }; class glue_rel_lteq : public traits_glue_or { public: template inline static void apply(Mat & out, const mtGlue& X); template inline static void apply(Cube & out, const mtGlueCube& X); }; class glue_rel_gteq : public traits_glue_or { public: template inline static void apply(Mat & out, const mtGlue& X); template inline static void apply(Cube & out, const mtGlueCube& X); }; class glue_rel_eq : public traits_glue_or { public: template inline static void apply(Mat & out, const mtGlue& X); template inline static void apply(Cube & out, const mtGlueCube& X); }; class glue_rel_noteq : public traits_glue_or { public: template inline static void apply(Mat & out, const mtGlue& X); template inline static void apply(Cube & out, const mtGlueCube& X); }; class glue_rel_and : public traits_glue_or { public: template inline static void apply(Mat & out, const mtGlue& X); template inline static void apply(Cube & out, const mtGlueCube& X); }; class glue_rel_or : public traits_glue_or { public: template inline static void apply(Mat & out, const mtGlue& X); template inline static void apply(Cube & out, const mtGlueCube& X); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_shift_bones.hpp0000644000176200001440000000312614124060717024106 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_shift //! @{ class op_shift_vec : public traits_op_passthru { public: template inline static void apply(Mat& out, const Op& in); }; class op_shift : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); template inline static void apply_direct(Mat& out, const Mat& X, const uword len, const uword neg, const uword dim); template inline static void apply_noalias(Mat& out, const Mat& X, const uword len, const uword neg, const uword dim); template inline static void apply_alias(Mat& out, const uword len, const uword neg, const uword dim); }; //! @} RcppArmadillo/inst/include/armadillo_bits/operator_cube_times.hpp0000644000176200001440000000545214124060717025143 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup operator_cube_times //! @{ //! BaseCube * scalar template arma_inline const eOpCube operator* ( const BaseCube& X, const typename T1::elem_type k ) { arma_extra_debug_sigprint(); return eOpCube(X.get_ref(), k); } //! scalar * BaseCube template arma_inline const eOpCube operator* ( const typename T1::elem_type k, const BaseCube& X ) { arma_extra_debug_sigprint(); return eOpCube(X.get_ref(), k); } //! non-complex BaseCube * complex scalar (experimental) template arma_inline const mtOpCube, T1, op_cx_scalar_times> operator* ( const BaseCube& X, const std::complex& k ) { arma_extra_debug_sigprint(); return mtOpCube, T1, op_cx_scalar_times>('j', X.get_ref(), k); } //! complex scalar * non-complex BaseCube (experimental) template arma_inline const mtOpCube, T1, op_cx_scalar_times> operator* ( const std::complex& k, const BaseCube& X ) { arma_extra_debug_sigprint(); return mtOpCube, T1, op_cx_scalar_times>('j', X.get_ref(), k); } template arma_inline Cube operator* ( const subview_cube_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); return subview_cube_each1_aux::operator_times(X, Y.get_ref()); } template arma_inline Cube operator* ( const Base& X, const subview_cube_each1& Y ) { arma_extra_debug_sigprint(); return subview_cube_each1_aux::operator_times(X.get_ref(), Y); } //! @} RcppArmadillo/inst/include/armadillo_bits/fn_qr.hpp0000644000176200001440000000652614124060717022221 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_qr //! @{ //! QR decomposition template inline bool qr ( Mat& Q, Mat& R, const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); arma_debug_check( (&Q == &R), "qr(): Q and R are the same object" ); const bool status = auxlib::qr(Q, R, X); if(status == false) { Q.soft_reset(); R.soft_reset(); arma_debug_warn_level(3, "qr(): decomposition failed"); } return status; } //! economical QR decomposition template inline bool qr_econ ( Mat& Q, Mat& R, const Base& X, const typename arma_blas_type_only::result* junk = nullptr ) { arma_extra_debug_sigprint(); arma_ignore(junk); arma_debug_check( (&Q == &R), "qr_econ(): Q and R are the same object" ); const bool status = auxlib::qr_econ(Q, R, X); if(status == false) { Q.soft_reset(); R.soft_reset(); arma_debug_warn_level(3, "qr_econ(): decomposition failed"); } return status; } //! QR decomposition with pivoting template inline typename enable_if2< is_supported_blas_type::value, bool >::result qr ( Mat& Q, Mat& R, Mat& P, const Base& X, const char* P_mode = "matrix" ) { arma_extra_debug_sigprint(); arma_debug_check( (&Q == &R), "qr(): Q and R are the same object" ); const char sig = (P_mode != nullptr) ? P_mode[0] : char(0); arma_debug_check( ((sig != 'm') && (sig != 'v')), "qr(): argument 'P_mode' must be \"vector\" or \"matrix\"" ); bool status = false; if(sig == 'v') { status = auxlib::qr_pivot(Q, R, P, X); } else if(sig == 'm') { Mat P_vec; status = auxlib::qr_pivot(Q, R, P_vec, X); if(status) { // construct P const uword N = P_vec.n_rows; P.zeros(N,N); for(uword row=0; row < N; ++row) { P.at(P_vec[row], row) = uword(1); } } } if(status == false) { Q.soft_reset(); R.soft_reset(); P.soft_reset(); arma_debug_warn_level(3, "qr(): decomposition failed"); } return status; } //! @} RcppArmadillo/inst/include/armadillo_bits/spop_symmat_bones.hpp0000644000176200001440000000232214124060717024643 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spop_symmat //! @{ class spop_symmat : public traits_op_default { public: template inline static void apply(SpMat& out, const SpOp& in); }; class spop_symmat_cx : public traits_op_default { public: template inline static void apply(SpMat& out, const SpOp& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_max_bones.hpp0000644000176200001440000000767014124060717023566 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_max //! @{ class op_max : public traits_op_xvec { public: // // dense matrices template inline static void apply(Mat& out, const Op& in); template inline static void apply_noalias(Mat& out, const Mat& X, const uword dim, const typename arma_not_cx::result* junk = nullptr); template inline static void apply_noalias(Mat& out, const Mat& X, const uword dim, const typename arma_cx_only::result* junk = nullptr); // // cubes template inline static void apply(Cube& out, const OpCube& in); template inline static void apply_noalias(Cube& out, const Cube& X, const uword dim, const typename arma_not_cx::result* junk = nullptr); template inline static void apply_noalias(Cube& out, const Cube& X, const uword dim, const typename arma_cx_only::result* junk = nullptr); // // for non-complex numbers template inline static eT direct_max(const eT* const X, const uword N); template inline static eT direct_max(const eT* const X, const uword N, uword& index_of_max_val); template inline static eT direct_max(const Mat& X, const uword row); template inline static eT max(const subview& X); template inline static typename arma_not_cx::result max(const Base& X); template inline static typename arma_not_cx::result max(const BaseCube& X); template inline static typename arma_not_cx::result max_with_index(const Proxy& P, uword& index_of_max_val); template inline static typename arma_not_cx::result max_with_index(const ProxyCube& P, uword& index_of_max_val); // // for complex numbers template inline static std::complex direct_max(const std::complex* const X, const uword n_elem); template inline static std::complex direct_max(const std::complex* const X, const uword n_elem, uword& index_of_max_val); template inline static std::complex direct_max(const Mat< std::complex >& X, const uword row); template inline static std::complex max(const subview< std::complex >& X); template inline static typename arma_cx_only::result max(const Base& X); template inline static typename arma_cx_only::result max(const BaseCube& X); template inline static typename arma_cx_only::result max_with_index(const Proxy& P, uword& index_of_max_val); template inline static typename arma_cx_only::result max_with_index(const ProxyCube& P, uword& index_of_max_val); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_toeplitz_bones.hpp0000644000176200001440000000231014124060717024635 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_toeplitz //! @{ class op_toeplitz : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); }; class op_toeplitz_c : public traits_op_default { public: template inline static void apply(Mat& out, const Op& in); }; //! @} RcppArmadillo/inst/include/armadillo_bits/spglue_max_meat.hpp0000644000176200001440000001247114124060717024262 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup spglue_max //! @{ template inline void spglue_max::apply(SpMat& out, const SpGlue& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const SpProxy pa(X.A); const SpProxy pb(X.B); const bool is_alias = pa.is_alias(out) || pb.is_alias(out); if(is_alias == false) { spglue_max::apply_noalias(out, pa, pb); } else { SpMat tmp; spglue_max::apply_noalias(tmp, pa, pb); out.steal_mem(tmp); } } template inline void spglue_max::apply_noalias(SpMat& out, const SpProxy& pa, const SpProxy& pb) { arma_extra_debug_sigprint(); arma_debug_assert_same_size(pa.get_n_rows(), pa.get_n_cols(), pb.get_n_rows(), pb.get_n_cols(), "element-wise max"); const uword max_n_nonzero = pa.get_n_nonzero() + pb.get_n_nonzero(); // Resize memory to upper bound out.reserve(pa.get_n_rows(), pa.get_n_cols(), max_n_nonzero); // Now iterate across both matrices. typename SpProxy::const_iterator_type x_it = pa.begin(); typename SpProxy::const_iterator_type x_end = pa.end(); typename SpProxy::const_iterator_type y_it = pb.begin(); typename SpProxy::const_iterator_type y_end = pb.end(); uword count = 0; while( (x_it != x_end) || (y_it != y_end) ) { eT out_val; const uword x_it_col = x_it.col(); const uword x_it_row = x_it.row(); const uword y_it_col = y_it.col(); const uword y_it_row = y_it.row(); bool use_y_loc = false; if(x_it == y_it) { out_val = elem_max(eT(*x_it), eT(*y_it)); ++x_it; ++y_it; } else { if((x_it_col < y_it_col) || ((x_it_col == y_it_col) && (x_it_row < y_it_row))) // if y is closer to the end { out_val = elem_max(eT(*x_it), eT(0)); ++x_it; } else { out_val = elem_max(eT(*y_it), eT(0)); ++y_it; use_y_loc = true; } } if(out_val != eT(0)) { access::rw(out.values[count]) = out_val; const uword out_row = (use_y_loc == false) ? x_it_row : y_it_row; const uword out_col = (use_y_loc == false) ? x_it_col : y_it_col; access::rw(out.row_indices[count]) = out_row; access::rw(out.col_ptrs[out_col + 1])++; ++count; } arma_check( (count > max_n_nonzero), "internal error: spglue_max::apply_noalias(): count > max_n_nonzero" ); } const uword out_n_cols = out.n_cols; uword* col_ptrs = access::rwp(out.col_ptrs); // Fix column pointers to be cumulative. for(uword c = 1; c <= out_n_cols; ++c) { col_ptrs[c] += col_ptrs[c - 1]; } if(count < max_n_nonzero) { if(count <= (max_n_nonzero/2)) { out.mem_resize(count); } else { // quick resize without reallocating memory and copying data access::rw( out.n_nonzero) = count; access::rw( out.values[count]) = eT(0); access::rw(out.row_indices[count]) = uword(0); } } } template inline void spglue_max::apply_noalias(SpMat& out, const SpMat& A, const SpMat& B) { arma_extra_debug_sigprint(); const SpProxy< SpMat > pa(A); const SpProxy< SpMat > pb(B); spglue_max::apply_noalias(out, pa, pb); } template inline void spglue_max::dense_sparse_max(Mat& out, const Base& X, const SpBase& Y) { arma_extra_debug_sigprint(); // NOTE: this function assumes there is no aliasing between matrix 'out' and X const Proxy pa(X.get_ref()); const SpProxy pb(Y.get_ref()); const uword n_rows = pa.get_n_rows(); const uword n_cols = pa.get_n_cols(); arma_debug_assert_same_size( n_rows, n_cols, pb.get_n_rows(), pb.get_n_cols(), "element-wise maximum" ); out.set_size(n_rows, n_cols); for(uword c=0; c < n_cols; ++c) for(uword r=0; r < n_rows; ++r) { out.at(r,c) = elem_max(pa.at(r,c), pb.at(r,c)); } } //! max of non-complex elements template inline typename enable_if2::no, eT>::result spglue_max::elem_max(const eT& a, const eT& b) { return (std::max)(a, b); } //! max of complex elements template inline typename enable_if2::yes, eT>::result spglue_max::elem_max(const eT& a, const eT& b) { return (std::abs(a) > std::abs(b)) ? a : b; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_clamp_bones.hpp0000644000176200001440000000556614124060717024077 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_clamp //! @{ class op_clamp : public traits_op_passthru { public: // matrices template inline static void apply(Mat& out, const mtOp& in); template inline static void apply_direct(Mat& out, const Mat& X, const eT min_val, const eT max_val); template inline static void apply_proxy_noalias(Mat& out, const Proxy& P, const typename T1::elem_type min_val, const typename T1::elem_type max_val); // cubes template inline static void apply(Cube& out, const mtOpCube& in); template inline static void apply_direct(Cube& out, const Cube& X, const eT min_val, const eT max_val); template inline static void apply_proxy_noalias(Cube& out, const ProxyCube& P, const typename T1::elem_type min_val, const typename T1::elem_type max_val); }; class op_clamp_cx : public traits_op_passthru { public: // matrices template inline static void apply(Mat& out, const mtOp& in); template inline static void apply_direct(Mat& out, const Mat& X, const eT min_val, const eT max_val); template inline static void apply_proxy_noalias(Mat& out, const Proxy& P, const typename T1::elem_type min_val, const typename T1::elem_type max_val); // cubes template inline static void apply(Cube& out, const mtOpCube& in); template inline static void apply_direct(Cube& out, const Cube& X, const eT min_val, const eT max_val); template inline static void apply_proxy_noalias(Cube& out, const ProxyCube& P, const typename T1::elem_type min_val, const typename T1::elem_type max_val); }; //! @} RcppArmadillo/inst/include/armadillo_bits/span.hpp0000644000176200001440000000321314124060717022043 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup span //! @{ struct span_alt {}; template class span_base { public: static const span_alt all; }; template const span_alt span_base::all = span_alt(); class span : public span_base<> { public: uword a; uword b; bool whole; inline span() : a(0) , b(0) , whole(true) { } inline span(const span_alt&) : a(0) , b(0) , whole(true) { } inline explicit span(const uword in_a) : a(in_a) , b(in_a) , whole(false) { } // the "explicit" keyword is required here to prevent automatic conversion of {a,b} // into an instance of span() when submatrices are specified inline explicit span(const uword in_a, const uword in_b) : a(in_a) , b(in_b) , whole(false) { } }; //! @} RcppArmadillo/inst/include/armadillo_bits/Col_meat.hpp0000644000176200001440000011316414124060717022634 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup Col //! @{ //! construct an empty column vector template inline Col::Col() : Mat(arma_vec_indicator(), 1) { arma_extra_debug_sigprint(); } template inline Col::Col(const Col& X) : Mat(arma_vec_indicator(), X.n_elem, 1, 1) { arma_extra_debug_sigprint(); arrayops::copy((*this).memptr(), X.memptr(), X.n_elem); } //! construct a column vector with the specified number of n_elem template inline Col::Col(const uword in_n_elem) : Mat(arma_vec_indicator(), in_n_elem, 1, 1) { arma_extra_debug_sigprint(); #if (!defined(ARMA_DONT_ZERO_INIT)) { arma_extra_debug_print("Col::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } #endif } template inline Col::Col(const uword in_n_rows, const uword in_n_cols) : Mat(arma_vec_indicator(), 0, 0, 1) { arma_extra_debug_sigprint(); Mat::init_warm(in_n_rows, in_n_cols); #if (!defined(ARMA_DONT_ZERO_INIT)) { arma_extra_debug_print("Col::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } #endif } template inline Col::Col(const SizeMat& s) : Mat(arma_vec_indicator(), 0, 0, 1) { arma_extra_debug_sigprint(); Mat::init_warm(s.n_rows, s.n_cols); #if (!defined(ARMA_DONT_ZERO_INIT)) { arma_extra_debug_print("Col::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } #endif } //! internal use only template template inline Col::Col(const uword in_n_elem, const arma_initmode_indicator&) : Mat(arma_vec_indicator(), in_n_elem, 1, 1) { arma_extra_debug_sigprint(); if(do_zeros) { arma_extra_debug_print("Col::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } } //! internal use only template template inline Col::Col(const uword in_n_rows, const uword in_n_cols, const arma_initmode_indicator&) : Mat(arma_vec_indicator(), 0, 0, 1) { arma_extra_debug_sigprint(); Mat::init_warm(in_n_rows, in_n_cols); if(do_zeros) { arma_extra_debug_print("Col::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } } //! internal use only template template inline Col::Col(const SizeMat& s, const arma_initmode_indicator&) : Mat(arma_vec_indicator(), 0, 0, 1) { arma_extra_debug_sigprint(); Mat::init_warm(s.n_rows, s.n_cols); if(do_zeros) { arma_extra_debug_print("Col::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } } template template inline Col::Col(const uword in_n_elem, const fill::fill_class& f) : Mat(arma_vec_indicator(), in_n_elem, 1, 1) { arma_extra_debug_sigprint(); (*this).fill(f); } template template inline Col::Col(const uword in_n_rows, const uword in_n_cols, const fill::fill_class& f) : Mat(arma_vec_indicator(), 0, 0, 1) { arma_extra_debug_sigprint(); Mat::init_warm(in_n_rows, in_n_cols); (*this).fill(f); } template template inline Col::Col(const SizeMat& s, const fill::fill_class& f) : Mat(arma_vec_indicator(), 0, 0, 1) { arma_extra_debug_sigprint(); Mat::init_warm(s.n_rows, s.n_cols); (*this).fill(f); } template inline Col::Col(const uword in_n_elem, const fill::scalar_holder f) : Mat(arma_vec_indicator(), in_n_elem, 1, 1) { arma_extra_debug_sigprint(); (*this).fill(f.scalar); } template inline Col::Col(const uword in_n_rows, const uword in_n_cols, const fill::scalar_holder f) : Mat(arma_vec_indicator(), 0, 0, 1) { arma_extra_debug_sigprint(); Mat::init_warm(in_n_rows, in_n_cols); (*this).fill(f.scalar); } template inline Col::Col(const SizeMat& s, const fill::scalar_holder f) : Mat(arma_vec_indicator(), 0, 0, 1) { arma_extra_debug_sigprint(); Mat::init_warm(s.n_rows, s.n_cols); (*this).fill(f.scalar); } template inline Col::Col(const char* text) : Mat(arma_vec_indicator(), 1) { arma_extra_debug_sigprint(); (*this).operator=(text); } template inline Col& Col::operator=(const char* text) { arma_extra_debug_sigprint(); Mat tmp(text); arma_debug_check( ((tmp.n_elem > 0) && (tmp.is_vec() == false)), "Mat::init(): requested size is not compatible with column vector layout" ); access::rw(tmp.n_rows) = tmp.n_elem; access::rw(tmp.n_cols) = 1; (*this).steal_mem(tmp); return *this; } template inline Col::Col(const std::string& text) : Mat(arma_vec_indicator(), 1) { arma_extra_debug_sigprint(); (*this).operator=(text); } template inline Col& Col::operator=(const std::string& text) { arma_extra_debug_sigprint(); Mat tmp(text); arma_debug_check( ((tmp.n_elem > 0) && (tmp.is_vec() == false)), "Mat::init(): requested size is not compatible with column vector layout" ); access::rw(tmp.n_rows) = tmp.n_elem; access::rw(tmp.n_cols) = 1; (*this).steal_mem(tmp); return *this; } //! create a column vector from std::vector template inline Col::Col(const std::vector& x) : Mat(arma_vec_indicator(), uword(x.size()), 1, 1) { arma_extra_debug_sigprint_this(this); if(x.size() > 0) { arrayops::copy( Mat::memptr(), &(x[0]), uword(x.size()) ); } } //! create a column vector from std::vector template inline Col& Col::operator=(const std::vector& x) { arma_extra_debug_sigprint(); Mat::init_warm(uword(x.size()), 1); if(x.size() > 0) { arrayops::copy( Mat::memptr(), &(x[0]), uword(x.size()) ); } return *this; } template inline Col::Col(const std::initializer_list& list) : Mat(arma_vec_indicator(), 1) { arma_extra_debug_sigprint(); (*this).operator=(list); } template inline Col& Col::operator=(const std::initializer_list& list) { arma_extra_debug_sigprint(); Mat tmp(list); arma_debug_check( ((tmp.n_elem > 0) && (tmp.is_vec() == false)), "Mat::init(): requested size is not compatible with column vector layout" ); access::rw(tmp.n_rows) = tmp.n_elem; access::rw(tmp.n_cols) = 1; (*this).steal_mem(tmp); return *this; } template inline Col::Col(Col&& X) : Mat(arma_vec_indicator(), 1) { arma_extra_debug_sigprint(arma_str::format("this = %x X = %x") % this % &X); access::rw(Mat::n_rows) = X.n_rows; access::rw(Mat::n_cols) = 1; access::rw(Mat::n_elem) = X.n_elem; access::rw(Mat::n_alloc) = X.n_alloc; if( (X.n_alloc > arma_config::mat_prealloc) || (X.mem_state == 1) || (X.mem_state == 2) ) { access::rw(Mat::mem_state) = X.mem_state; access::rw(Mat::mem) = X.mem; access::rw(X.n_rows) = 0; access::rw(X.n_cols) = 1; access::rw(X.n_elem) = 0; access::rw(X.n_alloc) = 0; access::rw(X.mem_state) = 0; access::rw(X.mem) = nullptr; } else // condition: (X.n_alloc <= arma_config::mat_prealloc) || (X.mem_state == 0) || (X.mem_state == 3) { (*this).init_cold(); arrayops::copy( (*this).memptr(), X.mem, X.n_elem ); if( (X.mem_state == 0) && (X.n_alloc <= arma_config::mat_prealloc) ) { access::rw(X.n_rows) = 0; access::rw(X.n_cols) = 1; access::rw(X.n_elem) = 0; access::rw(X.mem) = nullptr; } } } template inline Col& Col::operator=(Col&& X) { arma_extra_debug_sigprint(arma_str::format("this = %x X = %x") % this % &X); (*this).steal_mem(X); if( (X.mem_state == 0) && (X.n_alloc <= arma_config::mat_prealloc) && (this != &X) ) { access::rw(X.n_rows) = 0; access::rw(X.n_cols) = 1; access::rw(X.n_elem) = 0; access::rw(X.mem) = nullptr; } return *this; } template inline Col& Col::operator=(const eT val) { arma_extra_debug_sigprint(); Mat::operator=(val); return *this; } template inline Col& Col::operator=(const Col& X) { arma_extra_debug_sigprint(); Mat::operator=(X); return *this; } template template inline Col::Col(const Base& X) : Mat(arma_vec_indicator(), 1) { arma_extra_debug_sigprint(); Mat::operator=(X.get_ref()); } template template inline Col& Col::operator=(const Base& X) { arma_extra_debug_sigprint(); Mat::operator=(X.get_ref()); return *this; } template template inline Col::Col(const SpBase& X) : Mat(arma_vec_indicator(), 1) { arma_extra_debug_sigprint_this(this); Mat::operator=(X.get_ref()); } template template inline Col& Col::operator=(const SpBase& X) { arma_extra_debug_sigprint(); Mat::operator=(X.get_ref()); return *this; } //! construct a column vector from a given auxiliary array of eTs template inline Col::Col(eT* aux_mem, const uword aux_length, const bool copy_aux_mem, const bool strict) : Mat(aux_mem, aux_length, 1, copy_aux_mem, strict) { arma_extra_debug_sigprint(); access::rw(Mat::vec_state) = 1; } //! construct a column vector from a given auxiliary array of eTs template inline Col::Col(const eT* aux_mem, const uword aux_length) : Mat(aux_mem, aux_length, 1) { arma_extra_debug_sigprint(); access::rw(Mat::vec_state) = 1; } template template inline Col::Col ( const Base::pod_type, T1>& A, const Base::pod_type, T2>& B ) { arma_extra_debug_sigprint(); access::rw(Mat::vec_state) = 1; Mat::init(A,B); } template template inline Col::Col(const BaseCube& X) { arma_extra_debug_sigprint(); access::rw(Mat::vec_state) = 1; Mat::operator=(X); } template template inline Col& Col::operator=(const BaseCube& X) { arma_extra_debug_sigprint(); Mat::operator=(X); return *this; } template inline Col::Col(const subview_cube& X) { arma_extra_debug_sigprint(); access::rw(Mat::vec_state) = 1; Mat::operator=(X); } template inline Col& Col::operator=(const subview_cube& X) { arma_extra_debug_sigprint(); Mat::operator=(X); return *this; } template inline arma_cold mat_injector< Col > Col::operator<<(const eT val) { return mat_injector< Col >(*this, val); } template arma_inline arma_warn_unused const Op,op_htrans> Col::t() const { return Op,op_htrans>(*this); } template arma_inline arma_warn_unused const Op,op_htrans> Col::ht() const { return Op,op_htrans>(*this); } template arma_inline arma_warn_unused const Op,op_strans> Col::st() const { return Op,op_strans>(*this); } template arma_inline arma_warn_unused const Op,op_strans> Col::as_row() const { return Op,op_strans>(*this); } template arma_inline subview_col Col::row(const uword in_row1) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (in_row1 >= Mat::n_rows), "Col::row(): indices out of bounds or incorrectly used" ); return subview_col(*this, 0, in_row1, 1); } template arma_inline const subview_col Col::row(const uword in_row1) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (in_row1 >= Mat::n_rows), "Col::row(): indices out of bounds or incorrectly used" ); return subview_col(*this, 0, in_row1, 1); } template arma_inline subview_col Col::rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check_bounds( ( (in_row1 > in_row2) || (in_row2 >= Mat::n_rows) ), "Col::rows(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; return subview_col(*this, 0, in_row1, subview_n_rows); } template arma_inline const subview_col Col::rows(const uword in_row1, const uword in_row2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( ( (in_row1 > in_row2) || (in_row2 >= Mat::n_rows) ), "Col::rows(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; return subview_col(*this, 0, in_row1, subview_n_rows); } template arma_inline subview_col Col::subvec(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check_bounds( ( (in_row1 > in_row2) || (in_row2 >= Mat::n_rows) ), "Col::subvec(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; return subview_col(*this, 0, in_row1, subview_n_rows); } template arma_inline const subview_col Col::subvec(const uword in_row1, const uword in_row2) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( ( (in_row1 > in_row2) || (in_row2 >= Mat::n_rows) ), "Col::subvec(): indices out of bounds or incorrectly used" ); const uword subview_n_rows = in_row2 - in_row1 + 1; return subview_col(*this, 0, in_row1, subview_n_rows); } template arma_inline subview_col Col::rows(const span& row_span) { arma_extra_debug_sigprint(); return subvec(row_span); } template arma_inline const subview_col Col::rows(const span& row_span) const { arma_extra_debug_sigprint(); return subvec(row_span); } template arma_inline subview_col Col::subvec(const span& row_span) { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const uword local_n_rows = Mat::n_rows; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword subvec_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; arma_debug_check_bounds( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ), "Col::subvec(): indices out of bounds or incorrectly used" ); return subview_col(*this, 0, in_row1, subvec_n_rows); } template arma_inline const subview_col Col::subvec(const span& row_span) const { arma_extra_debug_sigprint(); const bool row_all = row_span.whole; const uword local_n_rows = Mat::n_rows; const uword in_row1 = row_all ? 0 : row_span.a; const uword in_row2 = row_span.b; const uword subvec_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1; arma_debug_check_bounds( ( row_all ? false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) ), "Col::subvec(): indices out of bounds or incorrectly used" ); return subview_col(*this, 0, in_row1, subvec_n_rows); } template arma_inline subview_col Col::operator()(const span& row_span) { arma_extra_debug_sigprint(); return subvec(row_span); } template arma_inline const subview_col Col::operator()(const span& row_span) const { arma_extra_debug_sigprint(); return subvec(row_span); } template arma_inline subview_col Col::subvec(const uword start_row, const SizeMat& s) { arma_extra_debug_sigprint(); arma_debug_check( (s.n_cols != 1), "Col::subvec(): given size does not specify a column vector" ); arma_debug_check_bounds( ( (start_row >= Mat::n_rows) || ((start_row + s.n_rows) > Mat::n_rows) ), "Col::subvec(): size out of bounds" ); return subview_col(*this, 0, start_row, s.n_rows); } template arma_inline const subview_col Col::subvec(const uword start_row, const SizeMat& s) const { arma_extra_debug_sigprint(); arma_debug_check( (s.n_cols != 1), "Col::subvec(): given size does not specify a column vector" ); arma_debug_check_bounds( ( (start_row >= Mat::n_rows) || ((start_row + s.n_rows) > Mat::n_rows) ), "Col::subvec(): size out of bounds" ); return subview_col(*this, 0, start_row, s.n_rows); } template arma_inline subview_col Col::head(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > Mat::n_rows), "Col::head(): size out of bounds" ); return subview_col(*this, 0, 0, N); } template arma_inline const subview_col Col::head(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > Mat::n_rows), "Col::head(): size out of bounds" ); return subview_col(*this, 0, 0, N); } template arma_inline subview_col Col::tail(const uword N) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > Mat::n_rows), "Col::tail(): size out of bounds" ); const uword start_row = Mat::n_rows - N; return subview_col(*this, 0, start_row, N); } template arma_inline const subview_col Col::tail(const uword N) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (N > Mat::n_rows), "Col::tail(): size out of bounds" ); const uword start_row = Mat::n_rows - N; return subview_col(*this, 0, start_row, N); } template arma_inline subview_col Col::head_rows(const uword N) { arma_extra_debug_sigprint(); return (*this).head(N); } template arma_inline const subview_col Col::head_rows(const uword N) const { arma_extra_debug_sigprint(); return (*this).head(N); } template arma_inline subview_col Col::tail_rows(const uword N) { arma_extra_debug_sigprint(); return (*this).tail(N); } template arma_inline const subview_col Col::tail_rows(const uword N) const { arma_extra_debug_sigprint(); return (*this).tail(N); } //! remove specified row template inline void Col::shed_row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( row_num >= Mat::n_rows, "Col::shed_row(): index out of bounds" ); shed_rows(row_num, row_num); } //! remove specified rows template inline void Col::shed_rows(const uword in_row1, const uword in_row2) { arma_extra_debug_sigprint(); arma_debug_check_bounds ( (in_row1 > in_row2) || (in_row2 >= Mat::n_rows), "Col::shed_rows(): indices out of bounds or incorrectly used" ); const uword n_keep_front = in_row1; const uword n_keep_back = Mat::n_rows - (in_row2 + 1); Col X(n_keep_front + n_keep_back, arma_nozeros_indicator()); eT* X_mem = X.memptr(); const eT* t_mem = (*this).memptr(); if(n_keep_front > 0) { arrayops::copy( X_mem, t_mem, n_keep_front ); } if(n_keep_back > 0) { arrayops::copy( &(X_mem[n_keep_front]), &(t_mem[in_row2+1]), n_keep_back); } Mat::steal_mem(X); } //! remove specified rows template template inline void Col::shed_rows(const Base& indices) { arma_extra_debug_sigprint(); Mat::shed_rows(indices); } //! insert N rows at the specified row position, //! optionally setting the elements of the inserted rows to zero template inline void Col::insert_rows(const uword row_num, const uword N, const bool set_to_zero) { arma_extra_debug_sigprint(); const uword t_n_rows = Mat::n_rows; const uword A_n_rows = row_num; const uword B_n_rows = t_n_rows - row_num; // insertion at row_num == n_rows is in effect an append operation arma_debug_check_bounds( (row_num > t_n_rows), "Col::insert_rows(): index out of bounds" ); if(N > 0) { Col out(t_n_rows + N, arma_nozeros_indicator()); eT* out_mem = out.memptr(); const eT* t_mem = (*this).memptr(); if(A_n_rows > 0) { arrayops::copy( out_mem, t_mem, A_n_rows ); } if(B_n_rows > 0) { arrayops::copy( &(out_mem[row_num + N]), &(t_mem[row_num]), B_n_rows ); } if(set_to_zero) { arrayops::inplace_set( &(out_mem[row_num]), eT(0), N ); } Mat::steal_mem(out); } } //! insert the given object at the specified row position; //! the given object must have one column template template inline void Col::insert_rows(const uword row_num, const Base& X) { arma_extra_debug_sigprint(); Mat::insert_rows(row_num, X); } template arma_inline arma_warn_unused eT& Col::at(const uword i) { return access::rw(Mat::mem[i]); } template arma_inline arma_warn_unused const eT& Col::at(const uword i) const { return Mat::mem[i]; } template arma_inline arma_warn_unused eT& Col::at(const uword in_row, const uword) { return access::rw( Mat::mem[in_row] ); } template arma_inline arma_warn_unused const eT& Col::at(const uword in_row, const uword) const { return Mat::mem[in_row]; } template inline typename Col::row_iterator Col::begin_row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (row_num >= Mat::n_rows), "Col::begin_row(): index out of bounds" ); return Mat::memptr() + row_num; } template inline typename Col::const_row_iterator Col::begin_row(const uword row_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (row_num >= Mat::n_rows), "Col::begin_row(): index out of bounds" ); return Mat::memptr() + row_num; } template inline typename Col::row_iterator Col::end_row(const uword row_num) { arma_extra_debug_sigprint(); arma_debug_check_bounds( (row_num >= Mat::n_rows), "Col::end_row(): index out of bounds" ); return Mat::memptr() + row_num + 1; } template inline typename Col::const_row_iterator Col::end_row(const uword row_num) const { arma_extra_debug_sigprint(); arma_debug_check_bounds( (row_num >= Mat::n_rows), "Col::end_row(): index out of bounds" ); return Mat::memptr() + row_num + 1; } template template arma_inline Col::fixed::fixed() : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); #if (!defined(ARMA_DONT_ZERO_INIT)) { arma_extra_debug_print("Col::fixed::constructor: zeroing memory"); eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat::mem_local[0]); arrayops::inplace_set_fixed( mem_use, eT(0) ); } #endif } template template arma_inline Col::fixed::fixed(const fixed& X) : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); eT* dest = (use_extra) ? mem_local_extra : Mat::mem_local; const eT* src = (use_extra) ? X.mem_local_extra : X.mem_local; arrayops::copy( dest, src, fixed_n_elem ); } template template arma_inline Col::fixed::fixed(const subview_cube& X) : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); Col::operator=(X); } template template inline Col::fixed::fixed(const fill::scalar_holder f) : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); (*this).fill(f.scalar); } template template template inline Col::fixed::fixed(const fill::fill_class&) : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); if(is_same_type::yes) { (*this).zeros(); } if(is_same_type::yes) { (*this).ones(); } if(is_same_type::yes) { (*this).eye(); } if(is_same_type::yes) { (*this).randu(); } if(is_same_type::yes) { (*this).randn(); } } template template template arma_inline Col::fixed::fixed(const Base& A) : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); Col::operator=(A.get_ref()); } template template template arma_inline Col::fixed::fixed(const Base& A, const Base& B) : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); Col::init(A,B); } template template inline Col::fixed::fixed(const eT* aux_mem) : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); eT* dest = (use_extra) ? mem_local_extra : Mat::mem_local; arrayops::copy( dest, aux_mem, fixed_n_elem ); } template template inline Col::fixed::fixed(const char* text) : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); Col::operator=(text); } template template inline Col::fixed::fixed(const std::string& text) : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); Col::operator=(text); } template template template Col& Col::fixed::operator=(const Base& A) { arma_extra_debug_sigprint(); Col::operator=(A.get_ref()); return *this; } template template Col& Col::fixed::operator=(const eT val) { arma_extra_debug_sigprint(); Col::operator=(val); return *this; } template template Col& Col::fixed::operator=(const char* text) { arma_extra_debug_sigprint(); Col::operator=(text); return *this; } template template Col& Col::fixed::operator=(const std::string& text) { arma_extra_debug_sigprint(); Col::operator=(text); return *this; } template template Col& Col::fixed::operator=(const subview_cube& X) { arma_extra_debug_sigprint(); Col::operator=(X); return *this; } template template inline Col::fixed::fixed(const std::initializer_list& list) : Col( arma_fixed_indicator(), fixed_n_elem, ((use_extra) ? mem_local_extra : Mat::mem_local) ) { arma_extra_debug_sigprint_this(this); (*this).operator=(list); } template template inline Col& Col::fixed::operator=(const std::initializer_list& list) { arma_extra_debug_sigprint(); const uword N = uword(list.size()); arma_debug_check( (N > fixed_n_elem), "Col::fixed: initialiser list is too long" ); eT* this_mem = (*this).memptr(); arrayops::copy( this_mem, list.begin(), N ); for(uword iq=N; iq < fixed_n_elem; ++iq) { this_mem[iq] = eT(0); } return *this; } template template arma_inline Col& Col::fixed::operator=(const fixed& X) { arma_extra_debug_sigprint(); if(this != &X) { eT* dest = (use_extra) ? mem_local_extra : Mat::mem_local; const eT* src = (use_extra) ? X.mem_local_extra : X.mem_local; arrayops::copy( dest, src, fixed_n_elem ); } return *this; } #if defined(ARMA_GOOD_COMPILER) template template template inline Col& Col::fixed::operator=(const eOp& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); const bool bad_alias = (eOp::proxy_type::has_subview && X.P.is_alias(*this)); if(bad_alias == false) { arma_debug_assert_same_size(fixed_n_elem, uword(1), X.get_n_rows(), X.get_n_cols(), "Col::fixed::operator="); eop_type::apply(*this, X); } else { arma_extra_debug_print("bad_alias = true"); Col tmp(X); (*this) = tmp; } return *this; } template template template inline Col& Col::fixed::operator=(const eGlue& X) { arma_extra_debug_sigprint(); arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); arma_type_check(( is_same_type< eT, typename T2::elem_type >::no )); const bool bad_alias = ( (eGlue::proxy1_type::has_subview && X.P1.is_alias(*this)) || (eGlue::proxy2_type::has_subview && X.P2.is_alias(*this)) ); if(bad_alias == false) { arma_debug_assert_same_size(fixed_n_elem, uword(1), X.get_n_rows(), X.get_n_cols(), "Col::fixed::operator="); eglue_type::apply(*this, X); } else { arma_extra_debug_print("bad_alias = true"); Col tmp(X); (*this) = tmp; } return *this; } #endif template template arma_inline arma_warn_unused const Op< typename Col::template fixed::Col_fixed_type, op_htrans > Col::fixed::t() const { return Op< typename Col::template fixed::Col_fixed_type, op_htrans >(*this); } template template arma_inline arma_warn_unused const Op< typename Col::template fixed::Col_fixed_type, op_htrans > Col::fixed::ht() const { return Op< typename Col::template fixed::Col_fixed_type, op_htrans >(*this); } template template arma_inline arma_warn_unused const Op< typename Col::template fixed::Col_fixed_type, op_strans > Col::fixed::st() const { return Op< typename Col::template fixed::Col_fixed_type, op_strans >(*this); } template template arma_inline arma_warn_unused const eT& Col::fixed::at_alt(const uword ii) const { #if defined(ARMA_HAVE_ALIGNED_ATTRIBUTE) return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; #else const eT* mem_aligned = (use_extra) ? mem_local_extra : Mat::mem_local; memory::mark_as_aligned(mem_aligned); return mem_aligned[ii]; #endif } template template arma_inline arma_warn_unused eT& Col::fixed::operator[] (const uword ii) { return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; } template template arma_inline arma_warn_unused const eT& Col::fixed::operator[] (const uword ii) const { return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; } template template arma_inline arma_warn_unused eT& Col::fixed::at(const uword ii) { return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; } template template arma_inline arma_warn_unused const eT& Col::fixed::at(const uword ii) const { return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; } template template arma_inline arma_warn_unused eT& Col::fixed::operator() (const uword ii) { arma_debug_check_bounds( (ii >= fixed_n_elem), "Col::operator(): index out of bounds" ); return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; } template template arma_inline arma_warn_unused const eT& Col::fixed::operator() (const uword ii) const { arma_debug_check_bounds( (ii >= fixed_n_elem), "Col::operator(): index out of bounds" ); return (use_extra) ? mem_local_extra[ii] : Mat::mem_local[ii]; } template template arma_inline arma_warn_unused eT& Col::fixed::at(const uword in_row, const uword) { return (use_extra) ? mem_local_extra[in_row] : Mat::mem_local[in_row]; } template template arma_inline arma_warn_unused const eT& Col::fixed::at(const uword in_row, const uword) const { return (use_extra) ? mem_local_extra[in_row] : Mat::mem_local[in_row]; } template template arma_inline arma_warn_unused eT& Col::fixed::operator() (const uword in_row, const uword in_col) { arma_debug_check_bounds( ((in_row >= fixed_n_elem) || (in_col > 0)), "Col::operator(): index out of bounds" ); return (use_extra) ? mem_local_extra[in_row] : Mat::mem_local[in_row]; } template template arma_inline arma_warn_unused const eT& Col::fixed::operator() (const uword in_row, const uword in_col) const { arma_debug_check_bounds( ((in_row >= fixed_n_elem) || (in_col > 0)), "Col::operator(): index out of bounds" ); return (use_extra) ? mem_local_extra[in_row] : Mat::mem_local[in_row]; } template template arma_inline arma_warn_unused eT* Col::fixed::memptr() { return (use_extra) ? mem_local_extra : Mat::mem_local; } template template arma_inline arma_warn_unused const eT* Col::fixed::memptr() const { return (use_extra) ? mem_local_extra : Mat::mem_local; } template template arma_hot inline const Col& Col::fixed::fill(const eT val) { arma_extra_debug_sigprint(); eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat::mem_local[0]); arrayops::inplace_set_fixed( mem_use, val ); return *this; } template template arma_hot inline const Col& Col::fixed::zeros() { arma_extra_debug_sigprint(); eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat::mem_local[0]); arrayops::inplace_set_fixed( mem_use, eT(0) ); return *this; } template template arma_hot inline const Col& Col::fixed::ones() { arma_extra_debug_sigprint(); eT* mem_use = (use_extra) ? &(mem_local_extra[0]) : &(Mat::mem_local[0]); arrayops::inplace_set_fixed( mem_use, eT(1) ); return *this; } template inline Col::Col(const arma_fixed_indicator&, const uword in_n_elem, const eT* in_mem) : Mat(arma_fixed_indicator(), in_n_elem, 1, 1, in_mem) { arma_extra_debug_sigprint_this(this); } #ifdef ARMA_EXTRA_COL_MEAT #include ARMA_INCFILE_WRAP(ARMA_EXTRA_COL_MEAT) #endif //! @} RcppArmadillo/inst/include/armadillo_bits/subview_each_meat.hpp0000644000176200001440000007376614124060717024600 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup subview_each //! @{ // // // subview_each_common template inline subview_each_common::subview_each_common(const parent& in_P) : P(in_P) { arma_extra_debug_sigprint(); } template arma_inline const Mat& subview_each_common::get_mat_ref_helper(const Mat& X) const { return X; } template arma_inline const Mat& subview_each_common::get_mat_ref_helper(const subview& X) const { return X.m; } template arma_inline const Mat& subview_each_common::get_mat_ref() const { return get_mat_ref_helper(P); } template inline void subview_each_common::check_size(const Mat& A) const { if(arma_config::debug == true) { if(mode == 0) { if( (A.n_rows != P.n_rows) || (A.n_cols != 1) ) { arma_stop_logic_error( incompat_size_string(A) ); } } else { if( (A.n_rows != 1) || (A.n_cols != P.n_cols) ) { arma_stop_logic_error( incompat_size_string(A) ); } } } } template arma_cold inline const std::string subview_each_common::incompat_size_string(const Mat& A) const { std::ostringstream tmp; if(mode == 0) { tmp << "each_col(): incompatible size; expected " << P.n_rows << "x1" << ", got " << A.n_rows << 'x' << A.n_cols; } else { tmp << "each_row(): incompatible size; expected 1x" << P.n_cols << ", got " << A.n_rows << 'x' << A.n_cols; } return tmp.str(); } // // // subview_each1 template inline subview_each1::~subview_each1() { arma_extra_debug_sigprint(); } template inline subview_each1::subview_each1(const parent& in_P) : subview_each_common::subview_each_common(in_P) { arma_extra_debug_sigprint(); } template template inline void subview_each1::operator= (const Base& in) { arma_extra_debug_sigprint(); parent& p = access::rw(subview_each_common::P); const unwrap_check tmp( in.get_ref(), (*this).get_mat_ref() ); const Mat& A = tmp.M; subview_each_common::check_size(A); const eT* A_mem = A.memptr(); const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; if(mode == 0) // each column { for(uword i=0; i < p_n_cols; ++i) { arrayops::copy( p.colptr(i), A_mem, p_n_rows ); } } else // each row { for(uword i=0; i < p_n_cols; ++i) { arrayops::inplace_set( p.colptr(i), A_mem[i], p_n_rows); } } } template template inline void subview_each1::operator+= (const Base& in) { arma_extra_debug_sigprint(); parent& p = access::rw(subview_each_common::P); const unwrap_check tmp( in.get_ref(), (*this).get_mat_ref() ); const Mat& A = tmp.M; subview_each_common::check_size(A); const eT* A_mem = A.memptr(); const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; if(mode == 0) // each column { for(uword i=0; i < p_n_cols; ++i) { arrayops::inplace_plus( p.colptr(i), A_mem, p_n_rows ); } } else // each row { for(uword i=0; i < p_n_cols; ++i) { arrayops::inplace_plus( p.colptr(i), A_mem[i], p_n_rows); } } } template template inline void subview_each1::operator-= (const Base& in) { arma_extra_debug_sigprint(); parent& p = access::rw(subview_each_common::P); const unwrap_check tmp( in.get_ref(), (*this).get_mat_ref() ); const Mat& A = tmp.M; subview_each_common::check_size(A); const eT* A_mem = A.memptr(); const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; if(mode == 0) // each column { for(uword i=0; i < p_n_cols; ++i) { arrayops::inplace_minus( p.colptr(i), A_mem, p_n_rows ); } } else // each row { for(uword i=0; i < p_n_cols; ++i) { arrayops::inplace_minus( p.colptr(i), A_mem[i], p_n_rows); } } } template template inline void subview_each1::operator%= (const Base& in) { arma_extra_debug_sigprint(); parent& p = access::rw(subview_each_common::P); const unwrap_check tmp( in.get_ref(), (*this).get_mat_ref() ); const Mat& A = tmp.M; subview_each_common::check_size(A); const eT* A_mem = A.memptr(); const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; if(mode == 0) // each column { for(uword i=0; i < p_n_cols; ++i) { arrayops::inplace_mul( p.colptr(i), A_mem, p_n_rows ); } } else // each row { for(uword i=0; i < p_n_cols; ++i) { arrayops::inplace_mul( p.colptr(i), A_mem[i], p_n_rows); } } } template template inline void subview_each1::operator/= (const Base& in) { arma_extra_debug_sigprint(); parent& p = access::rw(subview_each_common::P); const unwrap_check tmp( in.get_ref(), (*this).get_mat_ref() ); const Mat& A = tmp.M; subview_each_common::check_size(A); const eT* A_mem = A.memptr(); const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; if(mode == 0) // each column { for(uword i=0; i < p_n_cols; ++i) { arrayops::inplace_div( p.colptr(i), A_mem, p_n_rows ); } } else // each row { for(uword i=0; i < p_n_cols; ++i) { arrayops::inplace_div( p.colptr(i), A_mem[i], p_n_rows); } } } // // // subview_each2 template inline subview_each2::~subview_each2() { arma_extra_debug_sigprint(); } template inline subview_each2::subview_each2(const parent& in_P, const Base& in_indices) : subview_each_common::subview_each_common(in_P) , base_indices(in_indices) { arma_extra_debug_sigprint(); } template inline void subview_each2::check_indices(const Mat& indices) const { if(mode == 0) { arma_debug_check( ((indices.is_vec() == false) && (indices.is_empty() == false)), "each_col(): list of indices must be a vector" ); } else { arma_debug_check( ((indices.is_vec() == false) && (indices.is_empty() == false)), "each_row(): list of indices must be a vector" ); } } template template inline void subview_each2::operator= (const Base& in) { arma_extra_debug_sigprint(); parent& p = access::rw(subview_each_common::P); const unwrap_check tmp( in.get_ref(), (*this).get_mat_ref() ); const Mat& A = tmp.M; subview_each_common::check_size(A); const unwrap_check_mixed U( base_indices.get_ref(), (*this).get_mat_ref() ); check_indices(U.M); const eT* A_mem = A.memptr(); const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; if(mode == 0) // each column { for(uword i=0; i < N; ++i) { const uword col = indices_mem[i]; arma_debug_check_bounds( (col >= p_n_cols), "each_col(): index out of bounds" ); arrayops::copy( p.colptr(col), A_mem, p_n_rows ); } } else // each row { for(uword i=0; i < N; ++i) { const uword row = indices_mem[i]; arma_debug_check_bounds( (row >= p_n_rows), "each_row(): index out of bounds" ); for(uword col=0; col < p_n_cols; ++col) { p.at(row,col) = A_mem[col]; } } } } template template inline void subview_each2::operator+= (const Base& in) { arma_extra_debug_sigprint(); parent& p = access::rw(subview_each_common::P); const unwrap_check tmp( in.get_ref(), (*this).get_mat_ref() ); const Mat& A = tmp.M; subview_each_common::check_size(A); const unwrap_check_mixed U( base_indices.get_ref(), (*this).get_mat_ref() ); check_indices(U.M); const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; if(mode == 0) // each column { const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword col = indices_mem[i]; arma_debug_check_bounds( (col >= p_n_cols), "each_col(): index out of bounds" ); arrayops::inplace_plus( p.colptr(col), A_mem, p_n_rows ); } } else // each row { for(uword i=0; i < N; ++i) { const uword row = indices_mem[i]; arma_debug_check_bounds( (row >= p_n_rows), "each_row(): index out of bounds" ); p.row(row) += A; } } } template template inline void subview_each2::operator-= (const Base& in) { arma_extra_debug_sigprint(); parent& p = access::rw(subview_each_common::P); const unwrap_check tmp( in.get_ref(), (*this).get_mat_ref() ); const Mat& A = tmp.M; subview_each_common::check_size(A); const unwrap_check_mixed U( base_indices.get_ref(), (*this).get_mat_ref() ); check_indices(U.M); const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; if(mode == 0) // each column { const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword col = indices_mem[i]; arma_debug_check_bounds( (col >= p_n_cols), "each_col(): index out of bounds" ); arrayops::inplace_minus( p.colptr(col), A_mem, p_n_rows ); } } else // each row { for(uword i=0; i < N; ++i) { const uword row = indices_mem[i]; arma_debug_check_bounds( (row >= p_n_rows), "each_row(): index out of bounds" ); p.row(row) -= A; } } } template template inline void subview_each2::operator%= (const Base& in) { arma_extra_debug_sigprint(); parent& p = access::rw(subview_each_common::P); const unwrap_check tmp( in.get_ref(), (*this).get_mat_ref() ); const Mat& A = tmp.M; subview_each_common::check_size(A); const unwrap_check_mixed U( base_indices.get_ref(), (*this).get_mat_ref() ); check_indices(U.M); const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; if(mode == 0) // each column { const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword col = indices_mem[i]; arma_debug_check_bounds( (col >= p_n_cols), "each_col(): index out of bounds" ); arrayops::inplace_mul( p.colptr(col), A_mem, p_n_rows ); } } else // each row { for(uword i=0; i < N; ++i) { const uword row = indices_mem[i]; arma_debug_check_bounds( (row >= p_n_rows), "each_row(): index out of bounds" ); p.row(row) %= A; } } } template template inline void subview_each2::operator/= (const Base& in) { arma_extra_debug_sigprint(); parent& p = access::rw(subview_each_common::P); const unwrap_check tmp( in.get_ref(), (*this).get_mat_ref() ); const Mat& A = tmp.M; subview_each_common::check_size(A); const unwrap_check_mixed U( base_indices.get_ref(), (*this).get_mat_ref() ); check_indices(U.M); const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; if(mode == 0) // each column { const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword col = indices_mem[i]; arma_debug_check_bounds( (col >= p_n_cols), "each_col(): index out of bounds" ); arrayops::inplace_div( p.colptr(col), A_mem, p_n_rows ); } } else // each row { for(uword i=0; i < N; ++i) { const uword row = indices_mem[i]; arma_debug_check_bounds( (row >= p_n_rows), "each_row(): index out of bounds" ); p.row(row) /= A; } } } // // // subview_each1_aux template inline Mat subview_each1_aux::operator_plus ( const subview_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); typedef typename parent::elem_type eT; const parent& p = X.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; Mat out(p_n_rows, p_n_cols, arma_nozeros_indicator()); const quasi_unwrap tmp(Y.get_ref()); const Mat& A = tmp.M; X.check_size(A); const eT* A_mem = A.memptr(); if(mode == 0) // each column { for(uword i=0; i < p_n_cols; ++i) { const eT* p_mem = p.colptr(i); eT* out_mem = out.colptr(i); for(uword row=0; row < p_n_rows; ++row) { out_mem[row] = p_mem[row] + A_mem[row]; } } } if(mode == 1) // each row { for(uword i=0; i < p_n_cols; ++i) { const eT* p_mem = p.colptr(i); eT* out_mem = out.colptr(i); const eT A_val = A_mem[i]; for(uword row=0; row < p_n_rows; ++row) { out_mem[row] = p_mem[row] + A_val; } } } return out; } template inline Mat subview_each1_aux::operator_minus ( const subview_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); typedef typename parent::elem_type eT; const parent& p = X.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; Mat out(p_n_rows, p_n_cols, arma_nozeros_indicator()); const quasi_unwrap tmp(Y.get_ref()); const Mat& A = tmp.M; X.check_size(A); const eT* A_mem = A.memptr(); if(mode == 0) // each column { for(uword i=0; i < p_n_cols; ++i) { const eT* p_mem = p.colptr(i); eT* out_mem = out.colptr(i); for(uword row=0; row < p_n_rows; ++row) { out_mem[row] = p_mem[row] - A_mem[row]; } } } if(mode == 1) // each row { for(uword i=0; i < p_n_cols; ++i) { const eT* p_mem = p.colptr(i); eT* out_mem = out.colptr(i); const eT A_val = A_mem[i]; for(uword row=0; row < p_n_rows; ++row) { out_mem[row] = p_mem[row] - A_val; } } } return out; } template inline Mat subview_each1_aux::operator_minus ( const Base& X, const subview_each1& Y ) { arma_extra_debug_sigprint(); typedef typename parent::elem_type eT; const parent& p = Y.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; Mat out(p_n_rows, p_n_cols, arma_nozeros_indicator()); const quasi_unwrap tmp(X.get_ref()); const Mat& A = tmp.M; Y.check_size(A); const eT* A_mem = A.memptr(); if(mode == 0) // each column { for(uword i=0; i < p_n_cols; ++i) { const eT* p_mem = p.colptr(i); eT* out_mem = out.colptr(i); for(uword row=0; row < p_n_rows; ++row) { out_mem[row] = A_mem[row] - p_mem[row]; } } } if(mode == 1) // each row { for(uword i=0; i < p_n_cols; ++i) { const eT* p_mem = p.colptr(i); eT* out_mem = out.colptr(i); const eT A_val = A_mem[i]; for(uword row=0; row < p_n_rows; ++row) { out_mem[row] = A_val - p_mem[row]; } } } return out; } template inline Mat subview_each1_aux::operator_schur ( const subview_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); typedef typename parent::elem_type eT; const parent& p = X.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; Mat out(p_n_rows, p_n_cols, arma_nozeros_indicator()); const quasi_unwrap tmp(Y.get_ref()); const Mat& A = tmp.M; X.check_size(A); const eT* A_mem = A.memptr(); if(mode == 0) // each column { for(uword i=0; i < p_n_cols; ++i) { const eT* p_mem = p.colptr(i); eT* out_mem = out.colptr(i); for(uword row=0; row < p_n_rows; ++row) { out_mem[row] = p_mem[row] * A_mem[row]; } } } if(mode == 1) // each row { for(uword i=0; i < p_n_cols; ++i) { const eT* p_mem = p.colptr(i); eT* out_mem = out.colptr(i); const eT A_val = A_mem[i]; for(uword row=0; row < p_n_rows; ++row) { out_mem[row] = p_mem[row] * A_val; } } } return out; } template inline Mat subview_each1_aux::operator_div ( const subview_each1& X, const Base& Y ) { arma_extra_debug_sigprint(); typedef typename parent::elem_type eT; const parent& p = X.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; Mat out(p_n_rows, p_n_cols, arma_nozeros_indicator()); const quasi_unwrap tmp(Y.get_ref()); const Mat& A = tmp.M; X.check_size(A); const eT* A_mem = A.memptr(); if(mode == 0) // each column { for(uword i=0; i < p_n_cols; ++i) { const eT* p_mem = p.colptr(i); eT* out_mem = out.colptr(i); for(uword row=0; row < p_n_rows; ++row) { out_mem[row] = p_mem[row] / A_mem[row]; } } } if(mode == 1) // each row { for(uword i=0; i < p_n_cols; ++i) { const eT* p_mem = p.colptr(i); eT* out_mem = out.colptr(i); const eT A_val = A_mem[i]; for(uword row=0; row < p_n_rows; ++row) { out_mem[row] = p_mem[row] / A_val; } } } return out; } template inline Mat subview_each1_aux::operator_div ( const Base& X, const subview_each1& Y ) { arma_extra_debug_sigprint(); typedef typename parent::elem_type eT; const parent& p = Y.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; Mat out(p_n_rows, p_n_cols, arma_nozeros_indicator()); const quasi_unwrap tmp(X.get_ref()); const Mat& A = tmp.M; Y.check_size(A); const eT* A_mem = A.memptr(); if(mode == 0) // each column { for(uword i=0; i < p_n_cols; ++i) { const eT* p_mem = p.colptr(i); eT* out_mem = out.colptr(i); for(uword row=0; row < p_n_rows; ++row) { out_mem[row] = A_mem[row] / p_mem[row]; } } } if(mode == 1) // each row { for(uword i=0; i < p_n_cols; ++i) { const eT* p_mem = p.colptr(i); eT* out_mem = out.colptr(i); const eT A_val = A_mem[i]; for(uword row=0; row < p_n_rows; ++row) { out_mem[row] = A_val / p_mem[row]; } } } return out; } // // // subview_each2_aux template inline Mat subview_each2_aux::operator_plus ( const subview_each2& X, const Base& Y ) { arma_extra_debug_sigprint(); typedef typename parent::elem_type eT; const parent& p = X.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; Mat out = p; const quasi_unwrap tmp(Y.get_ref()); const Mat& A = tmp.M; const unwrap U(X.base_indices.get_ref()); X.check_size(A); X.check_indices(U.M); const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; if(mode == 0) // process columns { const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword col = indices_mem[i]; arma_debug_check_bounds( (col >= p_n_cols), "each_col(): index out of bounds" ); arrayops::inplace_plus( out.colptr(col), A_mem, p_n_rows ); } } if(mode == 1) // process rows { for(uword i=0; i < N; ++i) { const uword row = indices_mem[i]; arma_debug_check_bounds( (row >= p_n_rows), "each_row(): index out of bounds" ); out.row(row) += A; } } return out; } template inline Mat subview_each2_aux::operator_minus ( const subview_each2& X, const Base& Y ) { arma_extra_debug_sigprint(); typedef typename parent::elem_type eT; const parent& p = X.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; Mat out = p; const quasi_unwrap tmp(Y.get_ref()); const Mat& A = tmp.M; const unwrap U(X.base_indices.get_ref()); X.check_size(A); X.check_indices(U.M); const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; if(mode == 0) // process columns { const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword col = indices_mem[i]; arma_debug_check_bounds( (col >= p_n_cols), "each_col(): index out of bounds" ); arrayops::inplace_minus( out.colptr(col), A_mem, p_n_rows ); } } if(mode == 1) // process rows { for(uword i=0; i < N; ++i) { const uword row = indices_mem[i]; arma_debug_check_bounds( (row >= p_n_rows), "each_row(): index out of bounds" ); out.row(row) -= A; } } return out; } template inline Mat subview_each2_aux::operator_minus ( const Base& X, const subview_each2& Y ) { arma_extra_debug_sigprint(); typedef typename parent::elem_type eT; const parent& p = Y.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; Mat out = p; const quasi_unwrap tmp(X.get_ref()); const Mat& A = tmp.M; const unwrap U(Y.base_indices.get_ref()); Y.check_size(A); Y.check_indices(U.M); const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; if(mode == 0) // process columns { const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword col = indices_mem[i]; arma_debug_check_bounds( (col >= p_n_cols), "each_col(): index out of bounds" ); const eT* p_mem = p.colptr(col); eT* out_mem = out.colptr(col); for(uword row=0; row < p_n_rows; ++row) { out_mem[row] = A_mem[row] - p_mem[row]; } } } if(mode == 1) // process rows { for(uword i=0; i < N; ++i) { const uword row = indices_mem[i]; arma_debug_check_bounds( (row >= p_n_rows), "each_row(): index out of bounds" ); out.row(row) = A - p.row(row); } } return out; } template inline Mat subview_each2_aux::operator_schur ( const subview_each2& X, const Base& Y ) { arma_extra_debug_sigprint(); typedef typename parent::elem_type eT; const parent& p = X.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; Mat out = p; const quasi_unwrap tmp(Y.get_ref()); const Mat& A = tmp.M; const unwrap U(X.base_indices.get_ref()); X.check_size(A); X.check_indices(U.M); const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; if(mode == 0) // process columns { const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword col = indices_mem[i]; arma_debug_check_bounds( (col >= p_n_cols), "each_col(): index out of bounds" ); arrayops::inplace_mul( out.colptr(col), A_mem, p_n_rows ); } } if(mode == 1) // process rows { for(uword i=0; i < N; ++i) { const uword row = indices_mem[i]; arma_debug_check_bounds( (row >= p_n_rows), "each_row(): index out of bounds" ); out.row(row) %= A; } } return out; } template inline Mat subview_each2_aux::operator_div ( const subview_each2& X, const Base& Y ) { arma_extra_debug_sigprint(); typedef typename parent::elem_type eT; const parent& p = X.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; Mat out = p; const quasi_unwrap tmp(Y.get_ref()); const Mat& A = tmp.M; const unwrap U(X.base_indices.get_ref()); X.check_size(A); X.check_indices(U.M); const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; if(mode == 0) // process columns { const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword col = indices_mem[i]; arma_debug_check_bounds( (col >= p_n_cols), "each_col(): index out of bounds" ); arrayops::inplace_div( out.colptr(col), A_mem, p_n_rows ); } } if(mode == 1) // process rows { for(uword i=0; i < N; ++i) { const uword row = indices_mem[i]; arma_debug_check_bounds( (row >= p_n_rows), "each_row(): index out of bounds" ); out.row(row) /= A; } } return out; } template inline Mat subview_each2_aux::operator_div ( const Base& X, const subview_each2& Y ) { arma_extra_debug_sigprint(); typedef typename parent::elem_type eT; const parent& p = Y.P; const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; Mat out = p; const quasi_unwrap tmp(X.get_ref()); const Mat& A = tmp.M; const unwrap U(Y.base_indices.get_ref()); Y.check_size(A); Y.check_indices(U.M); const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; if(mode == 0) // process columns { const eT* A_mem = A.memptr(); for(uword i=0; i < N; ++i) { const uword col = indices_mem[i]; arma_debug_check_bounds( (col >= p_n_cols), "each_col(): index out of bounds" ); const eT* p_mem = p.colptr(col); eT* out_mem = out.colptr(col); for(uword row=0; row < p_n_rows; ++row) { out_mem[row] = A_mem[row] / p_mem[row]; } } } if(mode == 1) // process rows { for(uword i=0; i < N; ++i) { const uword row = indices_mem[i]; arma_debug_check_bounds( (row >= p_n_rows), "each_row(): index out of bounds" ); out.row(row) = A / p.row(row); } } return out; } //! @} RcppArmadillo/inst/include/armadillo_bits/op_diagvec_bones.hpp0000644000176200001440000000362614124060717024400 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_diagvec //! @{ class op_diagvec : public traits_op_col { public: template inline static void apply(Mat& out, const Op& X); template inline static void apply_proxy(Mat& out, const Proxy& P); template inline static void apply(Mat& out, const Op< Glue, op_diagvec>& X, const typename arma_not_cx::result* junk = nullptr); template inline static void apply(Mat& out, const Op< Glue, op_diagvec>& X, const typename arma_cx_only::result* junk = nullptr); }; class op_diagvec2 : public traits_op_col { public: template inline static void apply(Mat& out, const Op& X); template inline static void apply_proxy(Mat& out, const Proxy& P, const uword row_offset, const uword col_offset); }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_sp_plus_bones.hpp0000644000176200001440000000323214124060717024454 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_sp_plus //! @{ // Add a scalar to a sparse matrix; this will return a dense matrix. class op_sp_plus : public traits_op_passthru { public: template inline static void apply(Mat& out, const SpToDOp& in); // force apply into an SpMat<> template inline static void apply(SpMat& out, const SpToDOp& in); // used for the optimization of sparse % (sparse + scalar) template inline static void apply_inside_schur(SpMat& out, const T2& x, const SpToDOp& y); // used for the optimization of sparse / (sparse + scalar) template inline static void apply_inside_div(SpMat& out, const T2& x, const SpToDOp& y); }; //! @} RcppArmadillo/inst/include/armadillo_bits/strip.hpp0000644000176200001440000000567314124060717022257 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup strip //! @{ template struct strip_diagmat { typedef T1 stored_type; inline strip_diagmat(const T1& X) : M(X) { arma_extra_debug_sigprint(); } static constexpr bool do_diagmat = false; const T1& M; }; template struct strip_diagmat< Op > { typedef T1 stored_type; inline strip_diagmat(const Op& X) : M(X.m) { arma_extra_debug_sigprint(); } static constexpr bool do_diagmat = true; const T1& M; }; template struct strip_inv { typedef T1 stored_type; inline strip_inv(const T1& X) : M(X) { arma_extra_debug_sigprint(); } const T1& M; static constexpr bool do_inv = false; static constexpr bool do_inv_sympd = false; }; template struct strip_inv< Op > { typedef T1 stored_type; inline strip_inv(const Op& X) : M(X.m) { arma_extra_debug_sigprint(); } const T1& M; static constexpr bool do_inv = true; static constexpr bool do_inv_sympd = false; }; template struct strip_inv< Op > { typedef T1 stored_type; inline strip_inv(const Op& X) : M(X.m) { arma_extra_debug_sigprint(); } const T1& M; static constexpr bool do_inv = true; static constexpr bool do_inv_sympd = true; }; template struct strip_trimat { typedef T1 stored_type; const T1& M; static constexpr bool do_trimat = false; static constexpr bool do_triu = false; static constexpr bool do_tril = false; inline strip_trimat(const T1& X) : M(X) { arma_extra_debug_sigprint(); } }; template struct strip_trimat< Op > { typedef T1 stored_type; const T1& M; static constexpr bool do_trimat = true; const bool do_triu; const bool do_tril; inline strip_trimat(const Op& X) : M(X.m) , do_triu(X.aux_uword_a == 0) , do_tril(X.aux_uword_a == 1) { arma_extra_debug_sigprint(); } }; //! @} RcppArmadillo/inst/include/armadillo_bits/op_wishrnd_bones.hpp0000644000176200001440000000377114124060717024455 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup op_wishrnd //! @{ class op_wishrnd : public traits_op_default { public: template inline static void apply(Mat& out, const Op& expr); template inline static bool apply_direct(Mat& out, const Base& X, const typename T1::elem_type df, const uword mode); template inline static bool apply_noalias_mode1(Mat& out, const Mat& S, const eT df); template inline static bool apply_noalias_mode2(Mat& out, const Mat& D, const eT df); }; class op_iwishrnd : public traits_op_default { public: template inline static void apply(Mat& out, const Op& expr); template inline static bool apply_direct(Mat& out, const Base& X, const typename T1::elem_type df, const uword mode); template inline static bool apply_noalias_mode1(Mat& out, const Mat& T, const eT df); template inline static bool apply_noalias_mode2(Mat& out, const Mat& Dinv, const eT df); }; //! @} RcppArmadillo/inst/include/armadillo_bits/fn_normcdf.hpp0000644000176200001440000001235614124060717023225 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup fn_normcdf //! @{ template inline typename enable_if2< (is_real::value), void >::result normcdf_helper(Mat& out, const Base& X_expr, const Base& M_expr, const Base& S_expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; if(Proxy::use_at || Proxy::use_at || Proxy::use_at) { const quasi_unwrap UX(X_expr.get_ref()); const quasi_unwrap UM(M_expr.get_ref()); const quasi_unwrap US(S_expr.get_ref()); normcdf_helper(out, UX.M, UM.M, US.M); return; } const Proxy PX(X_expr.get_ref()); const Proxy PM(M_expr.get_ref()); const Proxy PS(S_expr.get_ref()); arma_debug_check( ( (PX.get_n_rows() != PM.get_n_rows()) || (PX.get_n_cols() != PM.get_n_cols()) || (PM.get_n_rows() != PS.get_n_rows()) || (PM.get_n_cols() != PS.get_n_cols()) ), "normcdf(): size mismatch" ); out.set_size(PX.get_n_rows(), PX.get_n_cols()); eT* out_mem = out.memptr(); const uword N = PX.get_n_elem(); typename Proxy::ea_type X_ea = PX.get_ea(); typename Proxy::ea_type M_ea = PM.get_ea(); typename Proxy::ea_type S_ea = PS.get_ea(); const bool use_mp = arma_config::openmp && mp_gate::eval(N); if(use_mp) { #if defined(ARMA_USE_OPENMP) { const int n_threads = mp_thread_limit::get(); #pragma omp parallel for schedule(static) num_threads(n_threads) for(uword i=0; i::sqrt2)); out_mem[i] = eT(0.5) * std::erfc(tmp); } } #endif } else { for(uword i=0; i::sqrt2)); out_mem[i] = eT(0.5) * std::erfc(tmp); } } } template inline arma_warn_unused typename enable_if2< (is_real::value), eT >::result normcdf(const eT x) { const eT out = eT(0.5) * std::erfc( x / (-Datum::sqrt2) ); return out; } template inline arma_warn_unused typename enable_if2< (is_real::value), eT >::result normcdf(const eT x, const eT mu, const eT sigma) { const eT tmp = (x - mu) / (sigma * (-Datum::sqrt2)); const eT out = eT(0.5) * std::erfc(tmp); return out; } template inline arma_warn_unused typename enable_if2< (is_real::value), Mat >::result normcdf(const eT x, const Base& M_expr, const Base& S_expr) { arma_extra_debug_sigprint(); const quasi_unwrap UM(M_expr.get_ref()); const Mat& M = UM.M; Mat out; normcdf_helper(out, x*ones< Mat >(arma::size(M)), M, S_expr.get_ref()); return out; } template inline arma_warn_unused typename enable_if2< (is_real::value), Mat >::result normcdf(const Base& X_expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap UX(X_expr.get_ref()); const Mat& X = UX.M; Mat out; normcdf_helper(out, X, zeros< Mat >(arma::size(X)), ones< Mat >(arma::size(X))); return out; } template inline arma_warn_unused typename enable_if2< (is_real::value), Mat >::result normcdf(const Base& X_expr, const typename T1::elem_type mu, const typename T1::elem_type sigma) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const quasi_unwrap UX(X_expr.get_ref()); const Mat& X = UX.M; Mat out; normcdf_helper(out, X, mu*ones< Mat >(arma::size(X)), sigma*ones< Mat >(arma::size(X))); return out; } template inline arma_warn_unused typename enable_if2< (is_real::value), Mat >::result normcdf(const Base& X_expr, const Base& M_expr, const Base& S_expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; Mat out; normcdf_helper(out, X_expr.get_ref(), M_expr.get_ref(), S_expr.get_ref()); return out; } //! @} RcppArmadillo/inst/include/armadillo_bits/CubeToMatOp_meat.hpp0000644000176200001440000000247114124060717024237 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ //! \addtogroup CubeToMatOp //! @{ template inline CubeToMatOp::CubeToMatOp(const T1& in_m) : m(in_m) { arma_extra_debug_sigprint(); } template inline CubeToMatOp::CubeToMatOp(const T1& in_m, const typename T1::elem_type in_aux) : m(in_m) , aux(in_aux) { arma_extra_debug_sigprint(); } template inline CubeToMatOp::~CubeToMatOp() { arma_extra_debug_sigprint(); } //! @} RcppArmadillo/inst/include/RcppArmadillo.h0000644000176200001440000000257114124466371020322 0ustar liggesusers // RcppArmadillo.h: Rcpp/Armadillo glue // // Copyright (C) 2010 - 2021 Dirk Eddelbuettel, Romain Francois and Douglas Bates // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #ifndef RcppArmadillo__RcppArmadillo__h #define RcppArmadillo__RcppArmadillo__h #if defined(Rcpp_hpp) && !defined(COMPILING_RCPPARMADILLO) #error "The file 'Rcpp.h' should not be included. Please correct to include only 'RcppArmadillo.h'." #endif // Set up actual #include after first #include and more config #include // Now automatically include Rcpp as well #include // Remaining RcppArmadillo code #include #include #include #endif RcppArmadillo/inst/include/RcppArmadilloConfigGenerated.h.in0000644000176200001440000000231414124466403023663 0ustar liggesusers // RcppArmadilloGenerated.h: Autoconf-updated file for LAPACK and OpenMP choices // // Copyright (C) 2013 - 2021 Dirk Eddelbuettel // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #ifndef RcppArmadillo__RcppArmadilloConfigGenerated__h #define RcppArmadillo__RcppArmadilloConfigGenerated__h #ifndef ARMA_CRIPPLED_LAPACK // value on next line may be changed between #undef and #define by the configure script @ARMA_LAPACK@ #endif #ifndef ARMA_USE_OPENMP // from configure test for OpenMP based on how R is configured, and whether g++ new enough @ARMA_HAVE_OPENMP@ #endif #endif RcppArmadillo/inst/include/RcppArmadilloForward.h0000644000176200001440000001152514124327657021651 0ustar liggesusers// // RcppArmadilloForward.h: Rcpp/Armadillo glue // // Copyright (C) 2010 - 2021 Dirk Eddelbuettel, Romain Francois and Douglas Bates // Copyright (C) 2019 - 2021 Conrad Sanderson // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #ifndef RcppArmadillo__RcppArmadilloForward__h #define RcppArmadillo__RcppArmadilloForward__h #include #include #include #define ARMA_EXTRA_MAT_PROTO RcppArmadillo/Mat_proto.h #define ARMA_EXTRA_MAT_MEAT RcppArmadillo/Mat_meat.h #define ARMA_EXTRA_COL_PROTO RcppArmadillo/Col_proto.h #define ARMA_EXTRA_COL_MEAT RcppArmadillo/Col_meat.h #define ARMA_EXTRA_ROW_PROTO RcppArmadillo/Row_proto.h #define ARMA_EXTRA_ROW_MEAT RcppArmadillo/Row_meat.h // using this define makes the R RNG have precedent over both the // C++11-based RNG provided by Armadillo, as well as the C++98-based // fallback. // // One can use the C++11-based on by commenting out the following // #define and also selecting C++11 (eg via src/Makevars* or the // DESCRIPTION file) and/or defining #define-ing ARMA_USE_CXX11_RNG #define ARMA_RNG_ALT RcppArmadillo/Alt_R_RNG.h // workaround to mitigate possible interference from a system-level installation of Armadillo #define ARMA_DONT_USE_WRAPPER #include "armadillo" /* forward declarations */ namespace Rcpp { /* support for wrap */ template SEXP wrap ( const arma::Mat& ) ; template SEXP wrap ( const arma::Row& ) ; template SEXP wrap ( const arma::Col& ) ; template SEXP wrap ( const arma::field& ) ; template SEXP wrap ( const arma::Cube& ) ; template SEXP wrap ( const arma::subview& ) ; template SEXP wrap ( const arma::subview_cols& ) ; template SEXP wrap ( const arma::SpMat& ) ; template SEXP wrap(const arma::Glue& X ) ; template SEXP wrap(const arma::Op& X ) ; template SEXP wrap(const arma::eGlue& X ) ; template SEXP wrap(const arma::eOp& X ) ; template SEXP wrap(const arma::OpCube& X ) ; template SEXP wrap(const arma::GlueCube& X ) ; template SEXP wrap(const arma::eOpCube& X ) ; template SEXP wrap(const arma::eGlueCube& X ) ; template SEXP wrap( const arma::mtOp& X ) ; template SEXP wrap( const arma::mtGlue& X ); template SEXP wrap( const arma::Gen& X) ; template SEXP wrap( const arma::GenCube& X) ; namespace traits { /* support for as */ template class Exporter< arma::Mat > ; template class Exporter< arma::Row > ; template class Exporter< arma::Col > ; template class Exporter< arma::SpMat > ; template class Exporter< arma::field > ; // template class Exporter< arma::Cube > ; } // namespace traits template class ConstReferenceInputParameter< arma::Mat > ; template class ReferenceInputParameter< arma::Mat > ; template class ConstInputParameter< arma::Mat > ; template class ConstReferenceInputParameter< arma::Col > ; template class ReferenceInputParameter< arma::Col > ; template class ConstInputParameter< arma::Col > ; template class ConstReferenceInputParameter< arma::Row > ; template class ReferenceInputParameter< arma::Row > ; template class ConstInputParameter< arma::Row > ; } #endif RcppArmadillo/inst/include/armadillo0000644000176200001440000007353114160256234017306 0ustar liggesusers// SPDX-License-Identifier: Apache-2.0 // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ #ifndef ARMA_INCLUDES #define ARMA_INCLUDES #include "armadillo_bits/config.hpp" #include "armadillo_bits/compiler_check.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if !defined(ARMA_DONT_USE_STD_MUTEX) #include #include #endif #if defined(ARMA_USE_TBB_ALLOC) #include #endif #if defined(ARMA_USE_MKL_ALLOC) #include #endif #if ( defined(__unix__) || defined(__unix) || defined(_POSIX_C_SOURCE) || (defined(__APPLE__) && defined(__MACH__)) ) && !defined(_WIN32) #include #endif #include "armadillo_bits/compiler_setup.hpp" #if defined(ARMA_USE_OPENMP) #include #endif #include "armadillo_bits/include_atlas.hpp" #include "armadillo_bits/include_hdf5.hpp" #include "armadillo_bits/include_superlu.hpp" //! \namespace arma namespace for Armadillo classes and functions namespace arma { // preliminaries #include "armadillo_bits/arma_forward.hpp" #include "armadillo_bits/arma_static_check.hpp" #include "armadillo_bits/typedef_elem.hpp" #include "armadillo_bits/typedef_elem_check.hpp" #include "armadillo_bits/typedef_mat.hpp" #include "armadillo_bits/arma_str.hpp" #include "armadillo_bits/arma_version.hpp" #include "armadillo_bits/arma_config.hpp" #include "armadillo_bits/traits.hpp" #include "armadillo_bits/promote_type.hpp" #include "armadillo_bits/upgrade_val.hpp" #include "armadillo_bits/restrictors.hpp" #include "armadillo_bits/access.hpp" #include "armadillo_bits/span.hpp" #include "armadillo_bits/distr_param.hpp" #include "armadillo_bits/constants.hpp" #include "armadillo_bits/constants_old.hpp" #include "armadillo_bits/mp_misc.hpp" #include "armadillo_bits/arma_rel_comparators.hpp" #include "armadillo_bits/fill.hpp" #ifdef ARMA_RNG_ALT #include ARMA_INCFILE_WRAP(ARMA_RNG_ALT) #else #include "armadillo_bits/arma_rng_cxx98.hpp" #endif #include "armadillo_bits/arma_rng_cxx11.hpp" #include "armadillo_bits/arma_rng.hpp" // // class prototypes #include "armadillo_bits/Base_bones.hpp" #include "armadillo_bits/BaseCube_bones.hpp" #include "armadillo_bits/SpBase_bones.hpp" #include "armadillo_bits/def_blas.hpp" #include "armadillo_bits/def_lapack.hpp" #include "armadillo_bits/def_atlas.hpp" #include "armadillo_bits/def_arpack.hpp" #include "armadillo_bits/def_superlu.hpp" #include "armadillo_bits/def_hdf5.hpp" #include "armadillo_bits/translate_blas.hpp" #include "armadillo_bits/translate_lapack.hpp" #include "armadillo_bits/translate_atlas.hpp" #include "armadillo_bits/translate_arpack.hpp" #include "armadillo_bits/translate_superlu.hpp" #include "armadillo_bits/cond_rel_bones.hpp" #include "armadillo_bits/arrayops_bones.hpp" #include "armadillo_bits/podarray_bones.hpp" #include "armadillo_bits/auxlib_bones.hpp" #include "armadillo_bits/sp_auxlib_bones.hpp" #include "armadillo_bits/injector_bones.hpp" #include "armadillo_bits/Mat_bones.hpp" #include "armadillo_bits/Col_bones.hpp" #include "armadillo_bits/Row_bones.hpp" #include "armadillo_bits/Cube_bones.hpp" #include "armadillo_bits/xvec_htrans_bones.hpp" #include "armadillo_bits/xtrans_mat_bones.hpp" #include "armadillo_bits/SizeMat_bones.hpp" #include "armadillo_bits/SizeCube_bones.hpp" #include "armadillo_bits/SpValProxy_bones.hpp" #include "armadillo_bits/SpMat_bones.hpp" #include "armadillo_bits/SpCol_bones.hpp" #include "armadillo_bits/SpRow_bones.hpp" #include "armadillo_bits/SpSubview_bones.hpp" #include "armadillo_bits/SpSubview_col_list_bones.hpp" #include "armadillo_bits/spdiagview_bones.hpp" #include "armadillo_bits/MapMat_bones.hpp" #include "armadillo_bits/typedef_mat_fixed.hpp" #include "armadillo_bits/field_bones.hpp" #include "armadillo_bits/subview_bones.hpp" #include "armadillo_bits/subview_elem1_bones.hpp" #include "armadillo_bits/subview_elem2_bones.hpp" #include "armadillo_bits/subview_field_bones.hpp" #include "armadillo_bits/subview_cube_bones.hpp" #include "armadillo_bits/diagview_bones.hpp" #include "armadillo_bits/subview_each_bones.hpp" #include "armadillo_bits/subview_cube_each_bones.hpp" #include "armadillo_bits/subview_cube_slices_bones.hpp" #include "armadillo_bits/hdf5_name.hpp" #include "armadillo_bits/csv_name.hpp" #include "armadillo_bits/diskio_bones.hpp" #include "armadillo_bits/wall_clock_bones.hpp" #include "armadillo_bits/running_stat_bones.hpp" #include "armadillo_bits/running_stat_vec_bones.hpp" #include "armadillo_bits/Op_bones.hpp" #include "armadillo_bits/CubeToMatOp_bones.hpp" #include "armadillo_bits/OpCube_bones.hpp" #include "armadillo_bits/SpOp_bones.hpp" #include "armadillo_bits/SpToDOp_bones.hpp" #include "armadillo_bits/eOp_bones.hpp" #include "armadillo_bits/eOpCube_bones.hpp" #include "armadillo_bits/mtOp_bones.hpp" #include "armadillo_bits/mtOpCube_bones.hpp" #include "armadillo_bits/mtSpOp_bones.hpp" #include "armadillo_bits/Glue_bones.hpp" #include "armadillo_bits/eGlue_bones.hpp" #include "armadillo_bits/mtGlue_bones.hpp" #include "armadillo_bits/SpGlue_bones.hpp" #include "armadillo_bits/mtSpGlue_bones.hpp" #include "armadillo_bits/GlueCube_bones.hpp" #include "armadillo_bits/eGlueCube_bones.hpp" #include "armadillo_bits/mtGlueCube_bones.hpp" #include "armadillo_bits/eop_core_bones.hpp" #include "armadillo_bits/eglue_core_bones.hpp" #include "armadillo_bits/GenSpecialiser.hpp" #include "armadillo_bits/Gen_bones.hpp" #include "armadillo_bits/GenCube_bones.hpp" #include "armadillo_bits/op_diagmat_bones.hpp" #include "armadillo_bits/op_diagvec_bones.hpp" #include "armadillo_bits/op_dot_bones.hpp" #include "armadillo_bits/op_det_bones.hpp" #include "armadillo_bits/op_log_det_bones.hpp" #include "armadillo_bits/op_inv_bones.hpp" #include "armadillo_bits/op_htrans_bones.hpp" #include "armadillo_bits/op_max_bones.hpp" #include "armadillo_bits/op_min_bones.hpp" #include "armadillo_bits/op_index_max_bones.hpp" #include "armadillo_bits/op_index_min_bones.hpp" #include "armadillo_bits/op_mean_bones.hpp" #include "armadillo_bits/op_median_bones.hpp" #include "armadillo_bits/op_sort_bones.hpp" #include "armadillo_bits/op_sort_index_bones.hpp" #include "armadillo_bits/op_sum_bones.hpp" #include "armadillo_bits/op_stddev_bones.hpp" #include "armadillo_bits/op_strans_bones.hpp" #include "armadillo_bits/op_var_bones.hpp" #include "armadillo_bits/op_repmat_bones.hpp" #include "armadillo_bits/op_repelem_bones.hpp" #include "armadillo_bits/op_reshape_bones.hpp" #include "armadillo_bits/op_vectorise_bones.hpp" #include "armadillo_bits/op_resize_bones.hpp" #include "armadillo_bits/op_cov_bones.hpp" #include "armadillo_bits/op_cor_bones.hpp" #include "armadillo_bits/op_shift_bones.hpp" #include "armadillo_bits/op_shuffle_bones.hpp" #include "armadillo_bits/op_prod_bones.hpp" #include "armadillo_bits/op_pinv_bones.hpp" #include "armadillo_bits/op_dotext_bones.hpp" #include "armadillo_bits/op_flip_bones.hpp" #include "armadillo_bits/op_reverse_bones.hpp" #include "armadillo_bits/op_princomp_bones.hpp" #include "armadillo_bits/op_misc_bones.hpp" #include "armadillo_bits/op_orth_null_bones.hpp" #include "armadillo_bits/op_relational_bones.hpp" #include "armadillo_bits/op_find_bones.hpp" #include "armadillo_bits/op_find_unique_bones.hpp" #include "armadillo_bits/op_chol_bones.hpp" #include "armadillo_bits/op_cx_scalar_bones.hpp" #include "armadillo_bits/op_trimat_bones.hpp" #include "armadillo_bits/op_cumsum_bones.hpp" #include "armadillo_bits/op_cumprod_bones.hpp" #include "armadillo_bits/op_symmat_bones.hpp" #include "armadillo_bits/op_hist_bones.hpp" #include "armadillo_bits/op_unique_bones.hpp" #include "armadillo_bits/op_toeplitz_bones.hpp" #include "armadillo_bits/op_fft_bones.hpp" #include "armadillo_bits/op_any_bones.hpp" #include "armadillo_bits/op_all_bones.hpp" #include "armadillo_bits/op_normalise_bones.hpp" #include "armadillo_bits/op_clamp_bones.hpp" #include "armadillo_bits/op_expmat_bones.hpp" #include "armadillo_bits/op_nonzeros_bones.hpp" #include "armadillo_bits/op_diff_bones.hpp" #include "armadillo_bits/op_norm_bones.hpp" #include "armadillo_bits/op_sqrtmat_bones.hpp" #include "armadillo_bits/op_logmat_bones.hpp" #include "armadillo_bits/op_range_bones.hpp" #include "armadillo_bits/op_chi2rnd_bones.hpp" #include "armadillo_bits/op_wishrnd_bones.hpp" #include "armadillo_bits/op_roots_bones.hpp" #include "armadillo_bits/op_cond_bones.hpp" #include "armadillo_bits/op_sp_plus_bones.hpp" #include "armadillo_bits/op_sp_minus_bones.hpp" #include "armadillo_bits/op_powmat_bones.hpp" #include "armadillo_bits/op_rank_bones.hpp" #include "armadillo_bits/glue_times_bones.hpp" #include "armadillo_bits/glue_mixed_bones.hpp" #include "armadillo_bits/glue_cov_bones.hpp" #include "armadillo_bits/glue_cor_bones.hpp" #include "armadillo_bits/glue_kron_bones.hpp" #include "armadillo_bits/glue_cross_bones.hpp" #include "armadillo_bits/glue_join_bones.hpp" #include "armadillo_bits/glue_relational_bones.hpp" #include "armadillo_bits/glue_solve_bones.hpp" #include "armadillo_bits/glue_conv_bones.hpp" #include "armadillo_bits/glue_toeplitz_bones.hpp" #include "armadillo_bits/glue_hist_bones.hpp" #include "armadillo_bits/glue_histc_bones.hpp" #include "armadillo_bits/glue_max_bones.hpp" #include "armadillo_bits/glue_min_bones.hpp" #include "armadillo_bits/glue_trapz_bones.hpp" #include "armadillo_bits/glue_atan2_bones.hpp" #include "armadillo_bits/glue_hypot_bones.hpp" #include "armadillo_bits/glue_polyfit_bones.hpp" #include "armadillo_bits/glue_polyval_bones.hpp" #include "armadillo_bits/glue_intersect_bones.hpp" #include "armadillo_bits/glue_affmul_bones.hpp" #include "armadillo_bits/glue_mvnrnd_bones.hpp" #include "armadillo_bits/glue_quantile_bones.hpp" #include "armadillo_bits/gmm_misc_bones.hpp" #include "armadillo_bits/gmm_diag_bones.hpp" #include "armadillo_bits/gmm_full_bones.hpp" #include "armadillo_bits/spop_max_bones.hpp" #include "armadillo_bits/spop_min_bones.hpp" #include "armadillo_bits/spop_sum_bones.hpp" #include "armadillo_bits/spop_strans_bones.hpp" #include "armadillo_bits/spop_htrans_bones.hpp" #include "armadillo_bits/spop_misc_bones.hpp" #include "armadillo_bits/spop_diagmat_bones.hpp" #include "armadillo_bits/spop_mean_bones.hpp" #include "armadillo_bits/spop_var_bones.hpp" #include "armadillo_bits/spop_trimat_bones.hpp" #include "armadillo_bits/spop_symmat_bones.hpp" #include "armadillo_bits/spop_normalise_bones.hpp" #include "armadillo_bits/spop_reverse_bones.hpp" #include "armadillo_bits/spop_repmat_bones.hpp" #include "armadillo_bits/spop_vectorise_bones.hpp" #include "armadillo_bits/spop_norm_bones.hpp" #include "armadillo_bits/spglue_plus_bones.hpp" #include "armadillo_bits/spglue_minus_bones.hpp" #include "armadillo_bits/spglue_schur_bones.hpp" #include "armadillo_bits/spglue_times_bones.hpp" #include "armadillo_bits/spglue_join_bones.hpp" #include "armadillo_bits/spglue_kron_bones.hpp" #include "armadillo_bits/spglue_min_bones.hpp" #include "armadillo_bits/spglue_max_bones.hpp" #include "armadillo_bits/spglue_merge_bones.hpp" #include "armadillo_bits/spglue_relational_bones.hpp" #if defined(ARMA_USE_NEWARP) #include "armadillo_bits/newarp_EigsSelect.hpp" #include "armadillo_bits/newarp_DenseGenMatProd_bones.hpp" #include "armadillo_bits/newarp_SparseGenMatProd_bones.hpp" #include "armadillo_bits/newarp_SparseGenRealShiftSolve_bones.hpp" #include "armadillo_bits/newarp_DoubleShiftQR_bones.hpp" #include "armadillo_bits/newarp_GenEigsSolver_bones.hpp" #include "armadillo_bits/newarp_SymEigsSolver_bones.hpp" #include "armadillo_bits/newarp_SymEigsShiftSolver_bones.hpp" #include "armadillo_bits/newarp_TridiagEigen_bones.hpp" #include "armadillo_bits/newarp_UpperHessenbergEigen_bones.hpp" #include "armadillo_bits/newarp_UpperHessenbergQR_bones.hpp" #endif // // low-level debugging and memory handling functions #include "armadillo_bits/debug.hpp" #include "armadillo_bits/memory.hpp" // // wrappers for various cmath functions #include "armadillo_bits/arma_cmath.hpp" // // classes that underlay metaprogramming #include "armadillo_bits/unwrap.hpp" #include "armadillo_bits/unwrap_cube.hpp" #include "armadillo_bits/unwrap_spmat.hpp" #include "armadillo_bits/Proxy.hpp" #include "armadillo_bits/ProxyCube.hpp" #include "armadillo_bits/SpProxy.hpp" #include "armadillo_bits/diagmat_proxy.hpp" #include "armadillo_bits/strip.hpp" #include "armadillo_bits/eop_aux.hpp" // // ostream #include "armadillo_bits/arma_ostream_bones.hpp" #include "armadillo_bits/arma_ostream_meat.hpp" // // n_unique, which is used by some sparse operators #include "armadillo_bits/fn_n_unique.hpp" // // operators #include "armadillo_bits/operator_plus.hpp" #include "armadillo_bits/operator_minus.hpp" #include "armadillo_bits/operator_times.hpp" #include "armadillo_bits/operator_schur.hpp" #include "armadillo_bits/operator_div.hpp" #include "armadillo_bits/operator_relational.hpp" #include "armadillo_bits/operator_cube_plus.hpp" #include "armadillo_bits/operator_cube_minus.hpp" #include "armadillo_bits/operator_cube_times.hpp" #include "armadillo_bits/operator_cube_schur.hpp" #include "armadillo_bits/operator_cube_div.hpp" #include "armadillo_bits/operator_cube_relational.hpp" #include "armadillo_bits/operator_ostream.hpp" // // user accessible functions // the order of the fn_*.hpp include files matters, // as some files require functionality given in preceding files #include "armadillo_bits/fn_conv_to.hpp" #include "armadillo_bits/fn_max.hpp" #include "armadillo_bits/fn_min.hpp" #include "armadillo_bits/fn_index_max.hpp" #include "armadillo_bits/fn_index_min.hpp" #include "armadillo_bits/fn_accu.hpp" #include "armadillo_bits/fn_sum.hpp" #include "armadillo_bits/fn_diagmat.hpp" #include "armadillo_bits/fn_diagvec.hpp" #include "armadillo_bits/fn_inv.hpp" #include "armadillo_bits/fn_trace.hpp" #include "armadillo_bits/fn_trans.hpp" #include "armadillo_bits/fn_det.hpp" #include "armadillo_bits/fn_log_det.hpp" #include "armadillo_bits/fn_eig_gen.hpp" #include "armadillo_bits/fn_eig_sym.hpp" #include "armadillo_bits/fn_eig_pair.hpp" #include "armadillo_bits/fn_lu.hpp" #include "armadillo_bits/fn_zeros.hpp" #include "armadillo_bits/fn_ones.hpp" #include "armadillo_bits/fn_eye.hpp" #include "armadillo_bits/fn_misc.hpp" #include "armadillo_bits/fn_orth_null.hpp" #include "armadillo_bits/fn_regspace.hpp" #include "armadillo_bits/fn_find.hpp" #include "armadillo_bits/fn_find_unique.hpp" #include "armadillo_bits/fn_elem.hpp" #include "armadillo_bits/fn_approx_equal.hpp" #include "armadillo_bits/fn_norm.hpp" #include "armadillo_bits/fn_dot.hpp" #include "armadillo_bits/fn_randu.hpp" #include "armadillo_bits/fn_randn.hpp" #include "armadillo_bits/fn_trig.hpp" #include "armadillo_bits/fn_mean.hpp" #include "armadillo_bits/fn_median.hpp" #include "armadillo_bits/fn_stddev.hpp" #include "armadillo_bits/fn_var.hpp" #include "armadillo_bits/fn_sort.hpp" #include "armadillo_bits/fn_sort_index.hpp" #include "armadillo_bits/fn_strans.hpp" #include "armadillo_bits/fn_chol.hpp" #include "armadillo_bits/fn_qr.hpp" #include "armadillo_bits/fn_svd.hpp" #include "armadillo_bits/fn_solve.hpp" #include "armadillo_bits/fn_repmat.hpp" #include "armadillo_bits/fn_repelem.hpp" #include "armadillo_bits/fn_reshape.hpp" #include "armadillo_bits/fn_vectorise.hpp" #include "armadillo_bits/fn_resize.hpp" #include "armadillo_bits/fn_cov.hpp" #include "armadillo_bits/fn_cor.hpp" #include "armadillo_bits/fn_shift.hpp" #include "armadillo_bits/fn_shuffle.hpp" #include "armadillo_bits/fn_prod.hpp" #include "armadillo_bits/fn_eps.hpp" #include "armadillo_bits/fn_pinv.hpp" #include "armadillo_bits/fn_rank.hpp" #include "armadillo_bits/fn_kron.hpp" #include "armadillo_bits/fn_flip.hpp" #include "armadillo_bits/fn_reverse.hpp" #include "armadillo_bits/fn_as_scalar.hpp" #include "armadillo_bits/fn_princomp.hpp" #include "armadillo_bits/fn_cross.hpp" #include "armadillo_bits/fn_join.hpp" #include "armadillo_bits/fn_conv.hpp" #include "armadillo_bits/fn_trunc_exp.hpp" #include "armadillo_bits/fn_trunc_log.hpp" #include "armadillo_bits/fn_toeplitz.hpp" #include "armadillo_bits/fn_trimat.hpp" #include "armadillo_bits/fn_trimat_ind.hpp" #include "armadillo_bits/fn_cumsum.hpp" #include "armadillo_bits/fn_cumprod.hpp" #include "armadillo_bits/fn_symmat.hpp" #include "armadillo_bits/fn_sylvester.hpp" #include "armadillo_bits/fn_hist.hpp" #include "armadillo_bits/fn_histc.hpp" #include "armadillo_bits/fn_unique.hpp" #include "armadillo_bits/fn_fft.hpp" #include "armadillo_bits/fn_fft2.hpp" #include "armadillo_bits/fn_any.hpp" #include "armadillo_bits/fn_all.hpp" #include "armadillo_bits/fn_size.hpp" #include "armadillo_bits/fn_numel.hpp" #include "armadillo_bits/fn_inplace_strans.hpp" #include "armadillo_bits/fn_inplace_trans.hpp" #include "armadillo_bits/fn_randi.hpp" #include "armadillo_bits/fn_randg.hpp" #include "armadillo_bits/fn_cond.hpp" #include "armadillo_bits/fn_normalise.hpp" #include "armadillo_bits/fn_clamp.hpp" #include "armadillo_bits/fn_expmat.hpp" #include "armadillo_bits/fn_nonzeros.hpp" #include "armadillo_bits/fn_interp1.hpp" #include "armadillo_bits/fn_interp2.hpp" #include "armadillo_bits/fn_qz.hpp" #include "armadillo_bits/fn_diff.hpp" #include "armadillo_bits/fn_hess.hpp" #include "armadillo_bits/fn_schur.hpp" #include "armadillo_bits/fn_kmeans.hpp" #include "armadillo_bits/fn_sqrtmat.hpp" #include "armadillo_bits/fn_logmat.hpp" #include "armadillo_bits/fn_trapz.hpp" #include "armadillo_bits/fn_range.hpp" #include "armadillo_bits/fn_polyfit.hpp" #include "armadillo_bits/fn_polyval.hpp" #include "armadillo_bits/fn_intersect.hpp" #include "armadillo_bits/fn_normpdf.hpp" #include "armadillo_bits/fn_log_normpdf.hpp" #include "armadillo_bits/fn_normcdf.hpp" #include "armadillo_bits/fn_mvnrnd.hpp" #include "armadillo_bits/fn_chi2rnd.hpp" #include "armadillo_bits/fn_wishrnd.hpp" #include "armadillo_bits/fn_roots.hpp" #include "armadillo_bits/fn_randperm.hpp" #include "armadillo_bits/fn_quantile.hpp" #include "armadillo_bits/fn_powmat.hpp" #include "armadillo_bits/fn_speye.hpp" #include "armadillo_bits/fn_spones.hpp" #include "armadillo_bits/fn_sprandn.hpp" #include "armadillo_bits/fn_sprandu.hpp" #include "armadillo_bits/fn_eigs_sym.hpp" #include "armadillo_bits/fn_eigs_gen.hpp" #include "armadillo_bits/fn_spsolve.hpp" #include "armadillo_bits/fn_svds.hpp" // // misc stuff #include "armadillo_bits/hdf5_misc.hpp" #include "armadillo_bits/fft_engine.hpp" #include "armadillo_bits/band_helper.hpp" #include "armadillo_bits/sympd_helper.hpp" #include "armadillo_bits/trimat_helper.hpp" // // classes implementing various forms of dense matrix multiplication #include "armadillo_bits/mul_gemv.hpp" #include "armadillo_bits/mul_gemm.hpp" #include "armadillo_bits/mul_gemm_mixed.hpp" #include "armadillo_bits/mul_syrk.hpp" #include "armadillo_bits/mul_herk.hpp" // // class meat #include "armadillo_bits/Op_meat.hpp" #include "armadillo_bits/CubeToMatOp_meat.hpp" #include "armadillo_bits/OpCube_meat.hpp" #include "armadillo_bits/SpOp_meat.hpp" #include "armadillo_bits/SpToDOp_meat.hpp" #include "armadillo_bits/mtOp_meat.hpp" #include "armadillo_bits/mtOpCube_meat.hpp" #include "armadillo_bits/mtSpOp_meat.hpp" #include "armadillo_bits/Glue_meat.hpp" #include "armadillo_bits/GlueCube_meat.hpp" #include "armadillo_bits/SpGlue_meat.hpp" #include "armadillo_bits/mtSpGlue_meat.hpp" #include "armadillo_bits/eOp_meat.hpp" #include "armadillo_bits/eOpCube_meat.hpp" #include "armadillo_bits/eGlue_meat.hpp" #include "armadillo_bits/eGlueCube_meat.hpp" #include "armadillo_bits/mtGlue_meat.hpp" #include "armadillo_bits/mtGlueCube_meat.hpp" #include "armadillo_bits/Base_meat.hpp" #include "armadillo_bits/BaseCube_meat.hpp" #include "armadillo_bits/SpBase_meat.hpp" #include "armadillo_bits/Gen_meat.hpp" #include "armadillo_bits/GenCube_meat.hpp" #include "armadillo_bits/eop_core_meat.hpp" #include "armadillo_bits/eglue_core_meat.hpp" #include "armadillo_bits/cond_rel_meat.hpp" #include "armadillo_bits/arrayops_meat.hpp" #include "armadillo_bits/podarray_meat.hpp" #include "armadillo_bits/auxlib_meat.hpp" #include "armadillo_bits/sp_auxlib_meat.hpp" #include "armadillo_bits/injector_meat.hpp" #include "armadillo_bits/Mat_meat.hpp" #include "armadillo_bits/Col_meat.hpp" #include "armadillo_bits/Row_meat.hpp" #include "armadillo_bits/Cube_meat.hpp" #include "armadillo_bits/xvec_htrans_meat.hpp" #include "armadillo_bits/xtrans_mat_meat.hpp" #include "armadillo_bits/SizeMat_meat.hpp" #include "armadillo_bits/SizeCube_meat.hpp" #include "armadillo_bits/field_meat.hpp" #include "armadillo_bits/subview_meat.hpp" #include "armadillo_bits/subview_elem1_meat.hpp" #include "armadillo_bits/subview_elem2_meat.hpp" #include "armadillo_bits/subview_field_meat.hpp" #include "armadillo_bits/subview_cube_meat.hpp" #include "armadillo_bits/diagview_meat.hpp" #include "armadillo_bits/subview_each_meat.hpp" #include "armadillo_bits/subview_cube_each_meat.hpp" #include "armadillo_bits/subview_cube_slices_meat.hpp" #include "armadillo_bits/SpValProxy_meat.hpp" #include "armadillo_bits/SpMat_meat.hpp" #include "armadillo_bits/SpMat_iterators_meat.hpp" #include "armadillo_bits/SpCol_meat.hpp" #include "armadillo_bits/SpRow_meat.hpp" #include "armadillo_bits/SpSubview_meat.hpp" #include "armadillo_bits/SpSubview_iterators_meat.hpp" #include "armadillo_bits/SpSubview_col_list_meat.hpp" #include "armadillo_bits/spdiagview_meat.hpp" #include "armadillo_bits/MapMat_meat.hpp" #include "armadillo_bits/diskio_meat.hpp" #include "armadillo_bits/wall_clock_meat.hpp" #include "armadillo_bits/running_stat_meat.hpp" #include "armadillo_bits/running_stat_vec_meat.hpp" #include "armadillo_bits/op_diagmat_meat.hpp" #include "armadillo_bits/op_diagvec_meat.hpp" #include "armadillo_bits/op_dot_meat.hpp" #include "armadillo_bits/op_det_meat.hpp" #include "armadillo_bits/op_log_det_meat.hpp" #include "armadillo_bits/op_inv_meat.hpp" #include "armadillo_bits/op_htrans_meat.hpp" #include "armadillo_bits/op_max_meat.hpp" #include "armadillo_bits/op_index_max_meat.hpp" #include "armadillo_bits/op_index_min_meat.hpp" #include "armadillo_bits/op_min_meat.hpp" #include "armadillo_bits/op_mean_meat.hpp" #include "armadillo_bits/op_median_meat.hpp" #include "armadillo_bits/op_sort_meat.hpp" #include "armadillo_bits/op_sort_index_meat.hpp" #include "armadillo_bits/op_sum_meat.hpp" #include "armadillo_bits/op_stddev_meat.hpp" #include "armadillo_bits/op_strans_meat.hpp" #include "armadillo_bits/op_var_meat.hpp" #include "armadillo_bits/op_repmat_meat.hpp" #include "armadillo_bits/op_repelem_meat.hpp" #include "armadillo_bits/op_reshape_meat.hpp" #include "armadillo_bits/op_vectorise_meat.hpp" #include "armadillo_bits/op_resize_meat.hpp" #include "armadillo_bits/op_cov_meat.hpp" #include "armadillo_bits/op_cor_meat.hpp" #include "armadillo_bits/op_shift_meat.hpp" #include "armadillo_bits/op_shuffle_meat.hpp" #include "armadillo_bits/op_prod_meat.hpp" #include "armadillo_bits/op_pinv_meat.hpp" #include "armadillo_bits/op_dotext_meat.hpp" #include "armadillo_bits/op_flip_meat.hpp" #include "armadillo_bits/op_reverse_meat.hpp" #include "armadillo_bits/op_princomp_meat.hpp" #include "armadillo_bits/op_misc_meat.hpp" #include "armadillo_bits/op_orth_null_meat.hpp" #include "armadillo_bits/op_relational_meat.hpp" #include "armadillo_bits/op_find_meat.hpp" #include "armadillo_bits/op_find_unique_meat.hpp" #include "armadillo_bits/op_chol_meat.hpp" #include "armadillo_bits/op_cx_scalar_meat.hpp" #include "armadillo_bits/op_trimat_meat.hpp" #include "armadillo_bits/op_cumsum_meat.hpp" #include "armadillo_bits/op_cumprod_meat.hpp" #include "armadillo_bits/op_symmat_meat.hpp" #include "armadillo_bits/op_hist_meat.hpp" #include "armadillo_bits/op_unique_meat.hpp" #include "armadillo_bits/op_toeplitz_meat.hpp" #include "armadillo_bits/op_fft_meat.hpp" #include "armadillo_bits/op_any_meat.hpp" #include "armadillo_bits/op_all_meat.hpp" #include "armadillo_bits/op_normalise_meat.hpp" #include "armadillo_bits/op_clamp_meat.hpp" #include "armadillo_bits/op_expmat_meat.hpp" #include "armadillo_bits/op_nonzeros_meat.hpp" #include "armadillo_bits/op_diff_meat.hpp" #include "armadillo_bits/op_norm_meat.hpp" #include "armadillo_bits/op_sqrtmat_meat.hpp" #include "armadillo_bits/op_logmat_meat.hpp" #include "armadillo_bits/op_range_meat.hpp" #include "armadillo_bits/op_chi2rnd_meat.hpp" #include "armadillo_bits/op_wishrnd_meat.hpp" #include "armadillo_bits/op_roots_meat.hpp" #include "armadillo_bits/op_cond_meat.hpp" #include "armadillo_bits/op_sp_plus_meat.hpp" #include "armadillo_bits/op_sp_minus_meat.hpp" #include "armadillo_bits/op_powmat_meat.hpp" #include "armadillo_bits/op_rank_meat.hpp" #include "armadillo_bits/glue_times_meat.hpp" #include "armadillo_bits/glue_mixed_meat.hpp" #include "armadillo_bits/glue_cov_meat.hpp" #include "armadillo_bits/glue_cor_meat.hpp" #include "armadillo_bits/glue_kron_meat.hpp" #include "armadillo_bits/glue_cross_meat.hpp" #include "armadillo_bits/glue_join_meat.hpp" #include "armadillo_bits/glue_relational_meat.hpp" #include "armadillo_bits/glue_solve_meat.hpp" #include "armadillo_bits/glue_conv_meat.hpp" #include "armadillo_bits/glue_toeplitz_meat.hpp" #include "armadillo_bits/glue_hist_meat.hpp" #include "armadillo_bits/glue_histc_meat.hpp" #include "armadillo_bits/glue_max_meat.hpp" #include "armadillo_bits/glue_min_meat.hpp" #include "armadillo_bits/glue_trapz_meat.hpp" #include "armadillo_bits/glue_atan2_meat.hpp" #include "armadillo_bits/glue_hypot_meat.hpp" #include "armadillo_bits/glue_polyfit_meat.hpp" #include "armadillo_bits/glue_polyval_meat.hpp" #include "armadillo_bits/glue_intersect_meat.hpp" #include "armadillo_bits/glue_affmul_meat.hpp" #include "armadillo_bits/glue_mvnrnd_meat.hpp" #include "armadillo_bits/glue_quantile_meat.hpp" #include "armadillo_bits/gmm_misc_meat.hpp" #include "armadillo_bits/gmm_diag_meat.hpp" #include "armadillo_bits/gmm_full_meat.hpp" #include "armadillo_bits/spop_max_meat.hpp" #include "armadillo_bits/spop_min_meat.hpp" #include "armadillo_bits/spop_sum_meat.hpp" #include "armadillo_bits/spop_strans_meat.hpp" #include "armadillo_bits/spop_htrans_meat.hpp" #include "armadillo_bits/spop_misc_meat.hpp" #include "armadillo_bits/spop_diagmat_meat.hpp" #include "armadillo_bits/spop_mean_meat.hpp" #include "armadillo_bits/spop_var_meat.hpp" #include "armadillo_bits/spop_trimat_meat.hpp" #include "armadillo_bits/spop_symmat_meat.hpp" #include "armadillo_bits/spop_normalise_meat.hpp" #include "armadillo_bits/spop_reverse_meat.hpp" #include "armadillo_bits/spop_repmat_meat.hpp" #include "armadillo_bits/spop_vectorise_meat.hpp" #include "armadillo_bits/spop_norm_meat.hpp" #include "armadillo_bits/spglue_plus_meat.hpp" #include "armadillo_bits/spglue_minus_meat.hpp" #include "armadillo_bits/spglue_schur_meat.hpp" #include "armadillo_bits/spglue_times_meat.hpp" #include "armadillo_bits/spglue_join_meat.hpp" #include "armadillo_bits/spglue_kron_meat.hpp" #include "armadillo_bits/spglue_min_meat.hpp" #include "armadillo_bits/spglue_max_meat.hpp" #include "armadillo_bits/spglue_merge_meat.hpp" #include "armadillo_bits/spglue_relational_meat.hpp" #if defined(ARMA_USE_NEWARP) #include "armadillo_bits/newarp_cx_attrib.hpp" #include "armadillo_bits/newarp_SortEigenvalue.hpp" #include "armadillo_bits/newarp_DenseGenMatProd_meat.hpp" #include "armadillo_bits/newarp_SparseGenMatProd_meat.hpp" #include "armadillo_bits/newarp_SparseGenRealShiftSolve_meat.hpp" #include "armadillo_bits/newarp_DoubleShiftQR_meat.hpp" #include "armadillo_bits/newarp_GenEigsSolver_meat.hpp" #include "armadillo_bits/newarp_SymEigsSolver_meat.hpp" #include "armadillo_bits/newarp_SymEigsShiftSolver_meat.hpp" #include "armadillo_bits/newarp_TridiagEigen_meat.hpp" #include "armadillo_bits/newarp_UpperHessenbergEigen_meat.hpp" #include "armadillo_bits/newarp_UpperHessenbergQR_meat.hpp" #endif } #include "armadillo_bits/compiler_setup_post.hpp" #endif RcppArmadillo/inst/include/RcppArmadilloSugar.h0000644000176200001440000000376014124466154021324 0ustar liggesusers // RcppArmadilloSugar.h: Rcpp/Armadillo glue // // Copyright (C) 2010 - 2021 Dirk Eddelbuettel, Romain Francois and Douglas Bates // Copyright (C) 2017 - 2021 Serguei Sokol // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #ifndef RcppArmadillo__RcppArmadilloSugar__h #define RcppArmadillo__RcppArmadilloSugar__h namespace Rcpp{ // forward is not needed anymore, but we just leave this // for backwards compatibility template inline const T& forward(const T& x) { return x; } template List simple_triplet_matrix ( const arma::SpMat& sm ){ const int RTYPE = Rcpp::traits::r_sexptype_traits::rtype; sm.sync(); // important: update internal state of SpMat object // copy the data into R objects Vector x(sm.values, sm.values + sm.n_nonzero); IntegerVector i(sm.row_indices, sm.row_indices + sm.n_nonzero); i=i+1; IntegerVector p(sm.col_ptrs, sm.col_ptrs + sm.n_cols + 1); IntegerVector j(i.size()); for (size_t cp=1, ie=0; ie < sm.n_nonzero; ie++) { for (; static_cast(p[cp]) <= ie && cp < sm.n_cols; cp++) ; j[ie] = cp; } List s; s("i") = i; s("j") = j; s("v") = x; s("nrow") = sm.n_rows; s("ncol") = sm.n_cols; s("dimnames") = R_NilValue; s.attr("class") = "simple_triplet_matrix"; return s; } } // Rcpp #endif RcppArmadillo/inst/CITATION0000644000176200001440000000150113471075574015127 0ustar liggesuserscitHeader("To cite RcppArmadillo in publications use:") citEntry(entry = "Article", title = "RcppArmadillo: Accelerating R with high-performance C++ linear algebra", author = personList(as.person("Dirk Eddelbuettel"), as.person("Conrad Sanderson")), journal = "Computational Statistics and Data Analysis", year = "2014", volume = "71", month = "March", pages = "1054--1063", url = "http://dx.doi.org/10.1016/j.csda.2013.02.005", textVersion = paste("Dirk Eddelbuettel, Conrad Sanderson (2014).", "RcppArmadillo: Accelerating R with high-performance C++ linear algebra.", "Computational Statistics and Data Analysis, Volume 71, March 2014, pages 1054-1063.", "URL http://dx.doi.org/10.1016/j.csda.2013.02.005") ) RcppArmadillo/inst/tinytest/0000755000176200001440000000000014145016772015652 5ustar liggesusersRcppArmadillo/inst/tinytest/test_sparse.R0000644000176200001440000000610113537314632020327 0ustar liggesusers#!/usr/bin/r -t ## ## Copyright (C) 2014 - 2019 Dirk Eddelbuettel ## ## This file is part of RcppArmadillo. ## ## RcppArmadillo is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 2 of the License, or ## (at your option) any later version. ## ## RcppArmadillo is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with RcppArmadillo. If not, see . if (!requireNamespace("Matrix", quietly=TRUE)) exit_file("No Matrix package") suppressMessages(require(Matrix)) library(RcppArmadillo) Rcpp::sourceCpp("cpp/sparse.cpp") ## setting up an example matrix -- using the fact that the as ## converter prefers sparse matrix objects create by the Matrix package suppressMessages(require(Matrix)) ## cf http://people.sc.fsu.edu/~jburkardt/data/st/st.html mtxt <- c("11 0 0 14 0 16", " 0 22 0 0 25 26", " 0 0 33 34 0 36", "41 0 43 44 0 46") M <- as.matrix(read.table(text=mtxt)) dimnames(M) <- NULL SM <- Matrix(M, sparse=TRUE) #test.as.sparse <- function() { expect_equal(SM, asSpMat(SM))#, msg="as") #test.sparse.addition <- function() { expect_equal(SM + SM, sparseAddition(SM))#, msg="addSparse") #test.sparse.multiplication <- function() { k <- 3 expect_equal(k*SM, sparseMultiplication(SM, k))#, msg="multSparse") #test.sparse.fromTriplet <- function() { mtxt <- c("0 0 1", "0 2 0", "3 0 0") M <- as.matrix(read.table(text=mtxt)) dimnames(M) <- NULL SM <- Matrix(M, sparse=TRUE) spM <- fromTriplet(0:2, # rows 2:0, # cols 1:3) # values expect_equal(SM, spM)#, msg="fromTriplet") #test.sparse.transpose <- function() { expect_equal(t(SM), sparseTranspose(SM))#, msg="transposeSparse") #test.sparse.sqrt <- function() { expect_equal(sqrt(SM), sparseSqrt(SM))#, msg="sqrtSparse") #test.sparse.square <- function() { expect_equal(SM^2, sparseSquare(SM))#, msg="squareSparse") #test.sparse.iterators <- function() { SM <- matrix(0, 5, 5) diag(SM) <- 1:5 SM <- methods::as(SM, "dgCMatrix") spM <- sparseIterators(SM, -1.5) diag(SM) <- diag(SM) - 1.5 expect_equal(SM, spM)#, msg="sparseIterators") #test.sparse.list <- function() { SM <- matrix(0, 5, 5) diag(SM) <- 1:5 SM <- methods::as(SM, "dgCMatrix") l <- list(SM, SM) expect_equal(l, sparseList(l))#, msg="sparseList") #test.speye <- function() { SM <- speye(4, 4) SM2 <- sparseMatrix(i = c(1:4), j = c(1:4), x = 1) expect_equal(SM, SM2)#, msg="speye") SM <- speye(3, 5) SM2 <- sparseMatrix(i = c(1:3), j = c(1:3), x = 1, dims = c(3, 5)) expect_equal(SM, SM2)#, msg="speye") SM <- speye(5, 3) SM2 <- sparseMatrix(i = c(1:3), j = c(1:3), x = 1, dims = c(5, 3)) expect_equal(SM, SM2)#, msg="speye") RcppArmadillo/inst/tinytest/test_cube.R0000644000176200001440000000627714021545270017757 0ustar liggesusers#!/usr/bin/r -t # # Copyright (C) 2015 - 2021 Dirk Eddelbuettel and Nathan Russell # Copyright (C) 2019 Dirk Eddelbuettel # # This file is part of RcppArmadillo. # # RcppArmadillo is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # RcppArmadillo is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with RcppArmadillo. If not, see . library(RcppArmadillo) Rcpp::sourceCpp("cpp/cube.cpp") .onWindows <- .Platform$OS.type == "windows" critTol <- if (.onWindows) 1.0e-6 else 1.5e-7 ## test arrays dbl_cube <- array(1.5:27.5, rep(3, 3)) int_cube <- array(1L:27L, rep(3, 3)) cplx_cube <- array(1.5:27.5 + 2i, rep(3, 3)) ## check cube (Cube) and fcube (Cube) expect_equal(cube_test(dbl_cube), (dbl_cube ** 2)) #, "cube_test") expect_equal(fcube_test(dbl_cube), (dbl_cube ** 2)) #, "fcube_test") ## check icube (Cube) and ucube (Cube) expect_equal(icube_test(int_cube), (int_cube ** 2)) #, "icube_test") expect_equal(ucube_test(int_cube), (int_cube ** 2)) #, "ucube_test") ## check cx_cube (Cube) and cx_fcube (Cube) expect_equal(cx_cube_test(cplx_cube), (cplx_cube ** 2)) #, "cx_cube_test") expect_equivalent(cx_fcube_test(cplx_cube), (cplx_cube ** 2), #"cx_fcube_test", tolerance = critTol) ## test that exception is thrown with dims(x) != 3 dbl_cube <- array(1.5:16.5, rep(2, 4)) int_cube <- array(1L:16L, rep(2, 4)) cplx_cube <- array(1.5:16.5 + 2i, rep(2, 4)) ## cube_test and fcube_test should throw here expect_error(cube_test(dbl_cube)) #"cube_test bad dimensions") expect_error(fcube_test(dbl_cube)) #"fcube_test bad dimensions") ## icube_test and ucube_test should throw here expect_error(icube_test(int_cube)) #"icube_test bad dimensions") expect_error(ucube_test(int_cube)) #"ucube_test bad dimensions") ## cx_cube_test and cx_fcube_test should throw here expect_error(cx_cube_test(cplx_cube)) #"cx_cube_test bad dimensions") expect_error(cx_fcube_test(cplx_cube)) #"cx_fcube_test bad dimensions") ## sanity check for explicit calls to Rcpp::as< arma::Cube > dbl_cube <- array(1.5:27.5, rep(3, 3)) int_cube <- array(1L:27L, rep(3, 3)) cplx_cube <- array(1.5:27.5 + 2i, rep(3, 3)) ## check cube (Cube) and fcube (Cube) expect_equal(as_cube(dbl_cube), (dbl_cube ** 2))#, "as_cube") expect_equal(as_fcube(dbl_cube), (dbl_cube ** 2))#, "as_fcube") ## check icube (Cube) and ucube (Cube) expect_equal(as_icube(int_cube), (int_cube ** 2))#, "as_icube") expect_equal(as_ucube(int_cube), (int_cube ** 2))#, "as_ucube") ## check cx_cube (Cube) and cx_fcube (Cube) expect_equal(as_cx_cube(cplx_cube), (cplx_cube ** 2))#, "as_cx_cube") expect_equivalent(as_cx_fcube(cplx_cube), (cplx_cube ** 2), #"as_cx_fcube", tolerance = critTol) RcppArmadillo/inst/tinytest/test_sample.R0000644000176200001440000000756113537314632020326 0ustar liggesusers#!/usr/bin/r -t # ## Copyright (C) 2012 - 2019 Christian Gunning ## Copyright (C) 2013 - 2019 Romain Francois ## Copyright (C) 2019 Dirk Eddelbuettel ## ## ## This file is part of RcppArmadillo. ## ## RcppArmadillo is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 2 of the License, or ## (at your option) any later version. ## ## RcppArmadillo is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with RcppArmadillo. If not, see . library(RcppArmadillo) Rcpp::sourceCpp("cpp/sample.cpp") #test.sample <- function() { ## set up S3 dispatching, ## simplifies lapply(tests, ...) below csample <- function(x, ...) UseMethod("csample") csample.numeric <- csample_numeric csample.integer <- csample_integer csample.complex <- csample_complex csample.character <- csample_character csample.logical <- csample_logical ## Seed needs to be reset to compare R to C++ seed <- 441 ## Input vectors to sample N <- 100 ## Number of samples ## works for size == N?! size <- N%/%2 ## all atomic vector classes except raw ## for each list element, check that sampling works ## with and without replacement, with and without prob tests <- list() tests <- within(tests, { int <- 1:N num <- (1:N)/10 cpx <- (1:N)/10 + 1i char <-rep(letters, 4)[1:N] bool <- rep(c(T,F), times=N/2) }) ## Un-normalized probs probs <- seq(from=0, to=1, length.out=N) ##probs <- probs/sum(probs) ## Needed for a change in R 3.6.0 reducing a bias in very large samples suppressWarnings(RNGversion("3.5.0")) ## Run the S3 generic function csample ## and associated R function on each data type ## ReplaceYN.ProbsYN lapply(tests, function(dat) { .class <- class(dat) set.seed(seed) ## R r.no.no <- sample(dat, size, replace=F) set.seed(seed) r.yes.no <- sample(dat, size, replace=T) set.seed(seed) r.no.yes <- sample(dat, size, replace=F, prob=probs) set.seed(seed) r.yes.yes <- sample(dat, size, replace=T, prob=probs) ## C set.seed(seed) c.no.no <- csample(dat, size, replace=F) set.seed(seed) c.yes.no <- csample(dat, size, replace=T) set.seed(seed) c.no.yes <- csample(dat, size, replace=F, prob=probs) set.seed(seed) c.yes.yes <- csample(dat, size, replace=T, prob=probs) ## comparisons expect_equal(r.no.no, c.no.no)#, msg=sprintf("sample.%s.no_replace.no_prob",.class)) expect_equal(r.yes.no, c.yes.no)#, msg=sprintf("sample.%s.replace.no_prob",.class)) ## the following don't pass expect_equal(r.no.yes, c.no.yes)#, msg=sprintf("sample.%s.no_replace.prob",.class)) expect_equal(r.yes.yes, c.yes.yes)#, msg=sprintf("sample.%s.replace.prob",.class)) }) ## Walker Alias method test ## With replacement, >200 "nonzero" probabilities ## Not implemented, see below walker.N <- 1e3 walker.sample <- (1:walker.N)/10 walker.probs <- rep(0.1, walker.N) ## uncomment following 5 lines if/when walker alias method is implemented set.seed(seed) r.walker <- sample( walker.sample, walker.N, replace=T, prob=walker.probs) set.seed(seed) c.walker <- csample( walker.sample, walker.N, replace=T, prob=walker.probs) expect_equal(r.walker, c.walker)#, msg=sprintf("Walker Alias method test")) ## Walker Alias method is not implemented. ## For this problem (replace, >200 non-zero probs) R is much faster ## So throw an error and refuse to proceed ##walker.error <- try( csample( walker.sample, walker.N, replace=T, prob=walker.probs), TRUE) ##expect_equal(inherits(walker.error, "try-error"), TRUE, msg=sprintf("Walker Alias method test")) RcppArmadillo/inst/tinytest/test_rcpparmadillo.R0000644000176200001440000001553514142617157021677 0ustar liggesusers#!/usr/bin/r -t # # Copyright (C) 2010 - 2019 Dirk Eddelbuettel, Romain Francois and Douglas Bates # Copyright (C) 2019 Dirk Eddelbuettel # # This file is part of RcppArmadillo. # # RcppArmadillo is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # RcppArmadillo is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with RcppArmadillo. If not, see . library(RcppArmadillo) Rcpp::sourceCpp("cpp/armadillo.cpp") ## test.wrap.R fx <- wrap_ res <- fx() expect_equal( res[[1]][[1]], matrix(as.integer((diag(3))),nr=3))#, msg = "eye(3,3)" ) expect_equal( res[[1]][[2]], diag(3))#, msg = "eye(3,3)" ) expect_equal( res[[1]][[3]], diag(3))#, msg = "eye(3,3)" ) expect_equal( res[[1]][[4]], matrix(as.integer((diag(3))),nr=3))#, msg = "eye(3,3)" ) expect_equal( res[[2]][[1]], matrix(0, ncol = 5, nrow=1))#, msg = "zeros(5,1)" ) expect_equal( res[[2]][[2]], matrix(0, ncol = 5, nrow=1))#, msg = "zeros(5,1)" ) expect_equal( res[[3]][[1]], matrix(0, ncol = 1, nrow=5))#, msg = "zeros(1,5)" ) expect_equal( res[[3]][[2]], matrix(0, ncol = 1, nrow=5))#, msg = "zeros(1,5)" ) # TODO: Revisit field tests later and fix see https://github.com/RcppCore/RcppArmadillo/pull/352 expect_equal( res[[4]][[1]], matrix(0:3, ncol = 2, nrow=2))#, msg = "field" ) expect_equal( res[[4]][[2]], matrix(letters[1:4], ncol = 2, nrow=2))#, msg = "field" ) # test.wrap.Glue <- function(){ fx <- wrapGlue_ res <- fx() expect_equal( res[[1]], 2*diag(3))#, msg = "wrap(Glue)" ) # test.wrap.Op <- function(){ fx <- wrapOp_ res <- fx() expect_equal( res[[1]], -1*diag(3))#, msg = "wrap(Op)" ) # test.as.Mat <- function(){ fx <- asMat_ integer_mat <- matrix( as.integer(diag(4)), ncol = 4, nrow = 4 ) numeric_mat <- diag(5) res <- fx( list( integer_mat, numeric_mat ) ) expect_equal( unlist( res), c(4L, 5L, 4L, 5L ))#, msg = "as" ) #} #test.as.Col <- function(){ fx <- asCol_ res <- fx( list( 1:10, as.numeric(1:10) ) ) expect_equal( unlist( res ), rep(55.0, 4 ))#, msg = "as" ) #} #test.as.Row <- function(){ fx <- asRow_ res <- fx( list( 1:10, as.numeric(1:10) ) ) expect_equal( unlist( res ), rep(55.0, 4 ))#, msg = "as" ) #test.cxmat <- function(){ fx <- cxMat_ expect_equal(fx(), list(double=(1+0i)*diag(3), float=(1+0i)*diag(3))) #,msg = "support for complex matrices" ) #test.mtOp <- function(){ fx <- mtOp_ expect_equal(fx(), (1+2i)*diag(3))#, msg = "support for mtOp" ) #test.mtGlue <- function(){ fx <- mtGlue_ expect_equal(fx(), 2.0 * diag(3))# , msg = "support for mtGlue" ) #test.sugar <- function(){ fx <- sugar_ expect_equal(fx(1:10), matrix( 2*(1:10), nrow = 10 ))# , msg = "RcppArmadillo and sugar" ) #test.sugar.cplx <- function(){ fx <- sugarCplx_ x <- 1:10*(1+1i) expect_equal(fx(x), matrix( exp(x), nrow = 10 ))# , msg = "RcppArmadillo and sugar (complex)" ) #test.armadillo.sugar.ctor <- function(){ fx <- sugarCtor_ expect_equal(fx(1:10), list(mat = matrix( 4*(1:10), nrow = 10 ), rowvec = matrix( 1:10, nrow = 1 ), colvec = matrix( 1:10, ncol = 1 ))) #,msg = "Mat( sugar expression )" ) #test.armadillo.sugar.matrix.ctor <- function(){ fx <- sugarMatrixCtor_ res <- fx(1:10) norm <- function(x, y) sqrt( x*x + y*y ) expect_equal(res, list(mat = diag(2*(1:10)), rowvec = outer( 1, 1:10, norm ), colvec = outer( 1:10, 1, norm ))) #msg = "Mat( sugar expression )" ) ## test.armadillo.rtti.check <- function() { ## inc <- ' ## void blah(arma::mat& X) { ## X.set_size(5,5); ## } ## ' ## src <- ' ## arma::vec V; ## blah(V); // if blah() worked, we have a problem ## ' ## fun <- cxxfunction(signature(), body=src, inc=inc, plugin = "RcppArmadillo") ## checkException(fun(), msg="RTTI check on matrix constructor exception") ## } #test.armadillo.mat.plain <- function() { fx <- mat_plain m <- matrix(1:9, 3, 3) expect_equal(fx(m), 9)#, msg = "Plain Matrix function signature" ) #test.armadillo.mat.const <- function() { fx <- mat_const m <- matrix(1:9, 3, 3) expect_equal(fx(m), 9)#, msg = "Const Matrix function signature" ) #test.armadillo.mat.ref <- function() { fx <- mat_ref m <- matrix(1:9, 3, 3) expect_equal(fx(m), 9)#, msg = "Reference Matrix function signature" ) #test.armadillo.mat.const.ref <- function() { fx <- mat_const_ref m <- matrix(1:9, 3, 3) expect_equal(fx(m), 9)#, msg = "Const Reference Matrix function signature" ) #test.armadillo.vec.plain <- function() { fx <- vec_plain m <- 1:9 expect_equal(fx(m), 9)#, msg = "Plain Vector function signature" ) #test.armadillo.vec.const <- function() { fx <- vec_const m <- 1:9 expect_equal(fx(m), 9)#, msg = "Const Vector function signature" ) #test.armadillo.vec.ref <- function() { fx <- vec_ref m <- 1:9 expect_equal(fx(m), 9)#, msg = "Reference Vector function signature" ) #test.armadillo.vec.const.ref <- function() { fx <- vec_const_ref m <- 1:9 expect_equal(fx(m), 9)#, msg = "Const Reference Vector function signature" ) #test.armadillo.mat.plain <- function() { fx <- cx_mat_plain m <- matrix(1:9, 3, 3) expect_equal(fx(m), 9)#, msg = "Plain Matrix function signature" ) #test.armadillo.mat.const <- function() { fx <- cx_mat_const m <- matrix(1:9, 3, 3) expect_equal(fx(m), 9)#, msg = "Const Matrix function signature" ) #test.armadillo.mat.ref <- function() { fx <- cx_mat_ref m <- matrix(1:9, 3, 3) expect_equal(fx(m), 9)#, msg = "Reference Matrix function signature" ) #test.armadillo.mat.const.ref <- function() { fx <- cx_mat_const_ref m <- matrix(1:9, 3, 3) expect_equal(fx(m), 9)#, msg = "Const Reference Matrix function signature" ) Rcpp::sourceCpp("cpp/colrow_as_vec.cpp") vec <- as.matrix(1:3) expect_equal(vec, uvec_test(vec)) expect_equal(vec, c_uvec_test(vec)) expect_equal(vec, r_uvec_test(vec)) expect_equal(vec, cr_uvec_test(vec)) mat <- matrix(1:4, nrow=2) expect_equal(mat, umat_test(mat)) expect_equal(mat, c_umat_test(mat)) expect_equal(mat, r_umat_test(mat)) expect_equal(mat, cr_umat_test(mat)) Rcpp::sourceCpp("cpp/any_as_vec.cpp") vec <- 1:3 vecc <- as.matrix(1:3) vecr <- t(vecc) expect_equal(vecc, vecc_test(vec))#, msg="legacy vec") expect_equal(vecr, vecr_test(vecr))#, msg="legacy rowvec") expect_equal(vec, vecc_as_v_test(vec))#, msg="vec as vector") expect_equal(vec, vecr_as_v_test(vec))#, msg="rowvec as vector") expect_equal(vec, veccany_as_v_test(vec))#, msg="vec (by any) as vector") expect_equal(vec, vecrany_as_v_test(vec))#, msg="rowvec (by any) as vector") RcppArmadillo/inst/tinytest/test_sparseConversion.R0000644000176200001440000006006213776176650022416 0ustar liggesusers#!/usr/bin/r -t ## ## Copyright (C) 2017 - 2021 Binxiang Ni and Dirk Eddelbuettel ## ## This file is part of RcppArmadillo. It is based on the documentation ## of package Matrix, slam, SparseM, spam and SciPy, which are ## respectively created by developers of the packages: Douglas Bates, ## Martin Maechler; Kurt Hornik, David Meyer, Christian Buchta; Roger ## Koenker, Pin Ng; Reinhard Furrer, Florian Gerber, Daniel Gerber, ## Kaspar Moesinger, Youcef Saad, Esmond G. Ng, Barry W. Peyton, Joseph ## W.H. Liu, Alan D. George; the developers of SciPy. It is also ## modified by Binxiang Ni. ## ## RcppArmadillo is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 2 of the License, or ## (at your option) any later version. ## ## RcppArmadillo is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with RcppArmadillo. If not, see . ## Reference: ## [Matrix]: https://cran.r-project.org/web/packages/Matrix/Matrix.pdf ## [slam]: https://cran.r-project.org/web/packages/slam/slam.pdf ## [SparseM]: https://cran.r-project.org/web/packages/SparseM/SparseM.pdf ## [spam]: https://cran.r-project.org/web/packages/spam/spam.pdf ## [SciPy]: https://docs.scipy.org/doc/scipy/reference/sparse.html if (!requireNamespace("Matrix", quietly=TRUE)) exit_file("No Matrix package") ## It now (Nov 2020) appears to fail on Windows starting around line 115 .onWindows <- .Platform$OS.type == "windows" library(RcppArmadillo) Rcpp::sourceCpp("cpp/sparse.cpp") ## setting up an example matrix -- using the fact that the as ## converter prefers sparse matrix objects create by the Matrix package suppressMessages({ library(Matrix) library(stats) ## Per email with Martin Maechler, hard to suppress such messages on ## first (and only) use of particular dispatches. So simply running ## twice: once silent, and again to test and possibly fail visibly. kronecker(Diagonal(3), Matrix(0+0:5, 3, 2)) ## n1 <- 10 p <- 5 a <- rnorm(n1*p) a[abs(a)<0.5] <- 0 A <- matrix(a,n1,p) RA <- as(A, "dgRMatrix") dgt <- RA %x% matrix(1:4,2,2) }) #test.as.dgc2dgc <- function() { ## [Matrix] p10 (dgCMatrix) set.seed(7) m <- matrix(0, 5, 5) m[sample(length(m), size = 14)] <- rep(1:9, length=14) mm <- as(m, "CsparseMatrix") expect_equal(mm, asSpMat(mm))#, msg="dgC2dgC_1") ## [Matrix] p36 (dgCMatrix) m <- Matrix(c(0,0,2:0), 3,5) expect_equal(m, asSpMat(m))#, msg="dgC2dgC_2") ## [Matrix] p74 (dgCMatrix) set.seed(27) IM1 <- as(sample(1:20, 100, replace=TRUE), "indMatrix") set.seed(27) IM2 <- as(sample(1:18, 100, replace=TRUE), "indMatrix") c12 <- crossprod(IM1,IM2) expect_equal(c12, asSpMat(c12))#, msg="dgC2dgC_3") ## [Matrix] p87 (dgCMatrix) m <- Matrix(c(0,0,2:0), 3,5, dimnames=list(LETTERS[1:3],NULL)) m <- unname(m) expect_equal(m, asSpMat(m))#, msg="dgC2dgC_4") ## [Matrix] p118 (dgCMatrix) f1 <- gl(5, 3, labels = LETTERS[1:5]) X <- as(f1, "sparseMatrix") X <- unname(X) expect_equal(X, asSpMat(X))#, msg="dgC2dgC_5") ## [Matrix] p142 (dgCMatrix) i <- c(1,3:8); j <- c(2,9,6:10); x <- 7 * (1:7) A <- sparseMatrix(i, j, x = x) expect_equal(A, asSpMat(A))#, msg="dgC2dgC_6") ## [slam] p4 (dgCMatrix) x <- matrix(c(1, 0, 0, 2, 1, 0), nrow = 3) SM <- Matrix(x, sparse = TRUE) expect_equal(SM, asSpMat(SM))#, msg="dgC2dgC_7") ## [slam] p9 (dgCMatrix) x <- matrix(c(1, 0, 0, 2, 1, NA), nrow = 2) SM <- Matrix(x, sparse = TRUE) expect_equal(SM, asSpMat(SM))#, msg="dgC2dgC_8") if (.onWindows) exit_file("Skipping remainder on Windows") ## [slam] p12 (dgCMatrix) if (utils::packageVersion("Matrix") >= "1.3.0") { x <- matrix(c(1, 0, 0, 2), nrow = 2) SM <- Matrix(x, sparse = TRUE, doDiag=FALSE) dgc <- as(SM, "dgCMatrix") expect_equal(dgc, asSpMat(SM))#, msg="dgC2dgC_9") } ## [SparseM] p21 (dgCMatrix) set.seed(21) a <- rnorm(20*5) A <- matrix(a,20,5) A[row(A)>col(A)+4|row(A)col(A)+2|row(A)= "1.3.0") { set.seed(129) T2 <- rsparsematrix(40, 12, nnz = 99, repr="T") dgc <- as(T2, "dgCMatrix") expect_equal(dgc, asSpMat(T2))#, msg="dgT2dgC_8") } ## [Matrix] p152 (dgTMatrix) A <- spMatrix(10,20, i = c(1,3:8), j = c(2,9,6:10), x = 7 * (1:7)) dgc <- as(A, "dgCMatrix") expect_equal(dgc, asSpMat(A))#, msg="dgT2dgC_9") ## [SparseM] p21 (dgTMatrix) set.seed(21) a <- rnorm(20*5) A <- matrix(a,20,5) A[row(A)>col(A)+4|row(A)col(A)+2|row(A) 1) ## checkException(asSpMat(lm)) ## # [Matrix] p152 (lgTMatrix) ## L <- spMatrix(9, 30, i = rep(1:9, 3), 1:27, ## (1:27) %% 4 != 1) ## checkException(asSpMat(L)) ## ## [Matrix] p111 (ngCMatrix) ## m <- Matrix(c(0,0,2:0), 3,5, dimnames=list(LETTERS[1:3],NULL)) ## dimnames(m) <- NULL ## nm <- as(m, "nsparseMatrix") ## checkException(asSpMat(nm)) ## ## [Matrix] p74 (ngTMatrix) ## sm1 <- as(rep(c(2,3,1), e=3), "indMatrix") ## ngt <- as(sm1, "ngTMatrix") ## checkException(asSpMat(ngt)) ## ## [Matrix] p85 (ntTMatrix) ## lM <- Diagonal(x = c(TRUE,FALSE,FALSE)) ## nM <- as(lM, "nMatrix") ## checkException(asSpMat(nM)) ## ## [Matrix] p85 (nsCMatrix) ## nsc <- crossprod(nM) ## checkException(asSpMat(nsc)) ## ## [Matrix] p42 (ldiMatrix) ## ldi <- Diagonal(x = (1:4) >= 2) ## checkException(asSpMat(ldi)) ## } ## test.as.lgc2dgc <- function() { ## ## [Matrix] p87 (lgCMatrix) (To be continued) ## lm <- (m > 1) ## ## ## [Matrix] p111 (lgCMatrix) (To be continued) ## m <- Matrix(c(0,0,2:0), 3,5, dimnames=list(LETTERS[1:3],NULL)) ## dimnames(m) <- NULL ## nm <- as(m, "nsparseMatrix") ## nnm <- !nm # no longer sparse ## nnm <- as(nnm, "sparseMatrix") ## } ## ## test.as.lgt2dgc <- function() { ## ## [Matrix] p152 (lgTMatrix) (To be continued) ## L <- spMatrix(9, 30, i = rep(1:9, 3), 1:27, ## (1:27) %% 4 != 1) ## } ## ## test.as.ngc2dgc <- function() { ## ## [Matrix] p111 (ngCMatrix) (To be continued) ## m <- Matrix(c(0,0,2:0), 3,5, dimnames=list(LETTERS[1:3],NULL)) ## dimnames(m) <- NULL ## nm <- as(m, "nsparseMatrix") ## ## ## [Matrix] p129 (ngCMatrix) (To be continued) ## n7 <- rsparsematrix(5, 12, nnz = 10, rand.x = NULL) ## } ## ## test.as.ngt2dgc <- function() { ## # [Matrix] p74 (ngTMatrix) (To be continued) ## sm1 <- as(rep(c(2,3,1), e=3), "indMatrix") ## ngt <- as(sm1, "ngTMatrix") ## mtxt <- c("0 1 0", ## "0 1 0", ## "0 1 0", ## "0 0 1", ## "0 0 1", ## "0 0 1", ## "1 0 0", ## "1 0 0", ## "1 0 0") ## M <- as.matrix(read.table(text=mtxt)) ## dimnames(M) <- NULL ## dgc <- as(M, "dgCMatrix") ## expect_equal(dgc, asSpMat(ngt))#, msg="ngT2dgC") ## ## set.seed(27) ## s10 <- as(sample(10, 30, replace=TRUE),"indMatrix") ## ngt <- s10[1:7, 1:4] ## mtxt <- c("0 0 0 0", ## "1 0 0 0", ## "0 0 0 0", ## "0 0 0 1", ## "0 0 1 0", ## "0 0 0 0", ## "1 0 0 0") ## M <- as.matrix(read.table(text=mtxt)) ## dimnames(M) <- NULL ## dgc <- as(M, "dgCMatrix") ## expect_equal(dgc, asSpMat(ngt))#, msg="ngT2dgC") ## ## ## [Matrix] p116 (ngTMatrix) (To be continued) ## pm1 <- as(as.integer(c(2,3,1)), "pMatrix") ## as(pm1, "ngTMatrix") ## set.seed(11) ## p10 <- as(sample(10),"pMatrix") ## p10[1:7, 1:4] ## } ## ## test.as.ntt2dgc <- function() { ## ## [Matrix] p85 (ntTMatrix) (To be continued) ## lM <- Diagonal(x = c(TRUE,FALSE,FALSE)) ## nM <- as(lM, "nMatrix") ## expect_equal(dgc, asSpMat(nM))#, msg="ntT2dgC") ## } ## ## test.as.nsc2dgc <- function() { ## ## [Matrix] p85 (nsCMatrix) (To be continued) ## lM <- Diagonal(x = c(TRUE,FALSE,FALSE)) ## nM <- as(lM, "nMatrix") ## nsc <- crossprod(nM) ## expect_equal(dgc, asSpMat(nsc))#, msg="nsC2dgC") ## } ## ## test.as.ldi2dgc <- function() { ## ## [Matrix] p42 (ldiMatrix) (To be continued) ## Diagonal(x = (1:4) >= 2) ## ## ## [Matrix] p85 (ldiMatrix) (To be continued) ## lM <- Diagonal(x = c(TRUE,FALSE,FALSE)) ## } RcppArmadillo/inst/tinytest/test_rmultinom.R0000644000176200001440000000424613537314632021070 0ustar liggesusers#!/usr/bin/r -t ## ## Copyright (C) 2013 Romain Francois ## Copyright (C) 2014 - 2019 Christian Gunning and Dirk Eddelbuettel ## Copyright (C) 2019 Dirk Eddelbuettel ## ## This file is part of RcppArmadillo. ## ## RcppArmadillo is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 2 of the License, or ## (at your option) any later version. ## ## RcppArmadillo is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with RcppArmadillo. If not, see . .runThisTest <- isTRUE(capabilities("long.double")) if (!.runThisTest) exit_file("No long double support") library(RcppArmadillo) Rcpp::sourceCpp("cpp/rmultinom.cpp") ## Seed needs to be reset to compare R to C++ .seed=39 ## test cases ## should be indentical between R and C++ tests <- list( vanilla=list( n=5, size=100, prob=rep(1/10,10)), big=list( n=5, size=1e6, prob=rep(1/1e3,1e3)), fixup.prob=list( n=10, size=1e5, prob=1:10), n0=list( n=0, size=5, prob=1:10), size0=list( n=10, size=0, prob=1:10) ) fail.tests <- list( na.prob=list( n=7, size=100, prob=c(1:10,NA)), prob0=list( n=10, size=100, prob=0) ) ## these give errors lapply(names(fail.tests), function(.name) { with(fail.tests[[.name]], { expect_error(rmultinom(n, size, prob)) #msg=sprintf("rmultinom.R.error.%s",.name) }) with(fail.tests[[.name]], { expect_error(rmultinomC(n, size, prob)) #msg=sprintf("rmultinom.cpp.error.%s",.name) }) }) ## for each test, check that results match lapply(names(tests), function(.name) { with(tests[[.name]], { set.seed(.seed) r.multinom <- rmultinom(n, size, prob) set.seed(.seed) c.multinom <- rmultinomC(n, size, prob) expect_equal(r.multinom, c.multinom)# , msg=sprintf("rmultinom.%s",.name)) }) }) RcppArmadillo/inst/tinytest/test_complex.R0000644000176200001440000000414313644067760020513 0ustar liggesusers#!/usr/bin/r -t # # Copyright (C) 2013 - 2019 Baptiste Auguie and Dirk Eddelbuettel # Copyright (C) 2019 - 2020 Dirk Eddelbuettel # # This file is part of RcppArmadillo. # # RcppArmadillo is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # RcppArmadillo is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with RcppArmadillo. If not, see . library(RcppArmadillo) ## It now (Apr 2020) appears to fail on 32-bit Windows .onWindows <- .Platform$OS.type == "windows" .is32bit <- .Platform$r_arch == "i386" if (.onWindows && .is32bit) exit_file("Do not bother on 32-bit Windows") Rcpp::sourceCpp("cpp/complex.cpp") set.seed(123) ## create variables A <- matrix(rnorm(9), 3) B <- matrix(rnorm(9), 3) C <- A + 1i * B V <- rnorm(3) + 1i * rnorm(3) S <- matrix(rnorm(5*3), nrow=3) ## Basic operations rl <- complexCppTests(A, B, V, S) # returns results list from C++ expect_equal(rl[["C"]], C)#, msg="complex matrix") expect_equal(rl[["Cst"]], t(C))#, msg="complex matrix transpose") expect_equal(rl[["Ct"]], Conj(t(C)))#, msg="complex matrix transpose conjugated") expect_equal(rl[["conjC"]], Conj(C))#, msg="complex matrix conjugated") expect_equal(rl[["absC"]], Mod(C))#, msg="complex matrix mod") expect_equal(rl[["CV"]], C %*% V)#, msg="complex matrix product") expect_equal(rl[["CS"]], C %*% S)#, msg="complex matrix times vector") expect_equal(rl[["CC"]], C * C)#, msg="complex matrix ops mult") expect_equal(rl[["CdC"]], C / C)#, msg="complex matrix ops div") expect_equal(rl[["CpC"]], C + C)#, msg="complex matrix ops plus") expect_equal(rl[["CmC"]], C - C)#, msg="complex matrix ops minus") RcppArmadillo/inst/tinytest/cpp/0000755000176200001440000000000014145557252016437 5ustar liggesusersRcppArmadillo/inst/tinytest/cpp/colrow_as_vec.cpp0000644000176200001440000000051613537314632021767 0ustar liggesusers// [[Rcpp::depends(RcppArmadillo)]] #define RCPP_ARMADILLO_RETURN_COLVEC_AS_VECTOR #define RCPP_ARMADILLO_RETURN_ROWVEC_AS_VECTOR #include using namespace Rcpp; // [[Rcpp::export]] arma::vec vecc_as_v_test(arma::vec v) { return(v); } // [[Rcpp::export]] arma::rowvec vecr_as_v_test(arma::rowvec v) { return(v); } RcppArmadillo/inst/tinytest/cpp/armadillo.cpp0000644000176200001440000001767413537314632021123 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- // // armadillo.cpp: RcppArmadillo unit test code // // Copyright (C) 2010 - 2019 Dirk Eddelbuettel, Romain Francois and Douglas Bates // Copyright (C) 2019 Dirk Eddelbuettel // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . // [[Rcpp::depends(RcppArmadillo)]] #include using namespace Rcpp; // [[Rcpp::export]] List wrap_() { // using the Named(.) = . notation List cols = List::create(Named( "Col" ) = arma::zeros(5,1), Named( "Col" ) = arma::zeros(5,1)); // using the Named(., .) notation List rows = List::create(Named( "Row", arma::zeros(1,5) ), Named( "Row" , arma::zeros(1,5) )); // using the _[.] = . notation List matrices = List::create(_["Mat"] = arma::eye( 3,3 ), _["Mat"] = arma::eye( 3,3 ), _["Mat"] = arma::eye( 3, 3 ), _["Mat"] = arma::eye( 3, 3 )); // creating an empty list and grow it on demand List fields; arma::field f1( 2, 2 ); f1( 0, 0 ) = 0; f1( 1, 0 ) = 1; f1( 0, 1 ) = 2; f1( 1, 1 ) = 3; fields["field"] = f1; arma::field f2(2,2); f2( 0, 0 ) = "a"; f2( 1, 0 ) = "b"; f2( 0, 1 ) = "c"; f2( 1, 1 ) = "d"; fields["field"] = f2; arma::field f3(2,2); f3(0,0) = arma::zeros(5,1); f3(1,0) = arma::zeros(4,1); f3(0,1) = arma::zeros(3,1); f3(1,1) = arma::zeros(2,1); fields["field"] = f3; List output = List::create(_["matrices : Mat"] = matrices, _["rows : Row"] = rows, _["columns : Col"] = cols, _["fields : field"] = fields ); return output; } // [[Rcpp::export]] List wrapGlue_() { arma::mat m1 = arma::eye( 3, 3 ); arma::mat m2 = arma::eye( 3, 3 ); List res; res["mat+mat"] = m1 + m2; return res; } // [[Rcpp::export]] List wrapOp_() { arma::mat m1 = arma::eye( 3, 3 ); List res; res["- mat"] = - m1; return res; } // [[Rcpp::export]] List asMat_(List input) { arma::imat m1 = input[0]; /* implicit as */ arma::mat m2 = input[1]; /* implicit as */ arma::umat m3 = input[0]; /* implicit as */ arma::fmat m4 = input[1]; /* implicit as */ List res = List::create(arma::accu( m1 ), arma::accu( m2 ), arma::accu( m3 ), arma::accu( m4 ) ); return res; } // [[Rcpp::export]] List asCol_(List input) { arma::icolvec m1 = input[0]; /* implicit as */ arma::colvec m2 = input[1]; /* implicit as */ arma::ucolvec m3 = input[0]; /* implicit as */ arma::fcolvec m4 = input[1]; /* implicit as */ List res = List::create(arma::accu( m1 ), arma::accu( m2 ), arma::accu( m3 ), arma::accu( m4 ) ); return res; } // [[Rcpp::export]] List asRow_(List input) { arma::irowvec m1 = input[0]; /* implicit as */ arma::rowvec m2 = input[1]; /* implicit as */ arma::urowvec m3 = input[0]; /* implicit as */ arma::frowvec m4 = input[1]; /* implicit as */ List res = List::create(arma::accu( m1 ), arma::accu( m2 ), arma::accu( m3 ), arma::accu( m4 ) ); return res; } // [[Rcpp::export]] List cxMat_() { arma::cx_mat m1 = arma::eye ( 3, 3 ); arma::cx_fmat m2 = arma::eye( 3, 3 ); return List::create( _["double"] = m1, _["float"] = m2 ); } // [[Rcpp::export]] ComplexMatrix mtOp_() { std::complex x( 1.0, 2.0 ); arma::mat m1 = arma::eye ( 3, 3 ); return wrap( x * m1 ); } // [[Rcpp::export]] NumericMatrix mtGlue_() { arma::imat m2 = arma::eye ( 3, 3 ); arma::mat m1 = arma::eye ( 3, 3 ); return wrap( m1 + m2 ); } // [[Rcpp::export]] NumericMatrix sugar_(NumericVector xx) { arma::mat m = xx + xx; return wrap( m ); } // [[Rcpp::export]] ComplexMatrix sugarCplx_(ComplexVector xx) { arma::cx_mat m = exp( xx ); return wrap( m ); } // [[Rcpp::export]] List sugarCtor_(NumericVector xx) { arma::mat m = xx + xx; arma::colvec co = xx; arma::rowvec ro = xx; return List::create(_["mat"] = m + m, _["rowvec"] = ro, _["colvec"] = co); } double norm( double x, double y){ return ::sqrt( x*x + y*y ); } // [[Rcpp::export]] List sugarMatrixCtor_(NumericVector xx) { NumericVector yy = NumericVector::create( 1 ); arma::mat m = diag( xx ); arma::colvec co = outer( xx, yy, ::norm ); arma::rowvec ro = outer( yy, xx, ::norm ); return List::create(_["mat"] = m + m , _["rowvec"] = ro, _["colvec"] = co); } // test.armadillo.rtti.check <- function() { // inc <- ' // void blah(arma::mat& X) { // X.set_size(5,5); // } // ' // src <- ' // arma::vec V; // blah(V); // if blah() worked, we have a problem // ' // fun <- cxxfunction(signature(), body=src, inc=inc, plugin = "RcppArmadillo") // checkException(fun(), msg="RTTI check on matrix constructor exception") // } // [[Rcpp::export]] int mat_plain(arma::mat x) { return x.n_elem; } // [[Rcpp::export]] int mat_const(const arma::mat x) { return x.n_elem; } // [[Rcpp::export]] int mat_ref(arma::mat & x) { return x.n_elem; } // [[Rcpp::export]] int mat_const_ref(const arma::mat & x) { return x.n_elem; } // [[Rcpp::export]] int vec_plain(arma::vec x) { return x.n_elem; } // [[Rcpp::export]] int vec_const(const arma::vec x) { return x.n_elem; } // [[Rcpp::export]] int vec_ref(arma::vec & x) { return x.n_elem; } // [[Rcpp::export]] int vec_const_ref(const arma::vec & x) { return x.n_elem; } // [[Rcpp::export]] int cx_mat_plain(arma::cx_mat x) { return x.n_elem; } // [[Rcpp::export]] int cx_mat_const(const arma::cx_mat x) { return x.n_elem; } // [[Rcpp::export]] int cx_mat_ref(arma::cx_mat & x) { return x.n_elem; } // [[Rcpp::export]] int cx_mat_const_ref(const arma::cx_mat & x) { return x.n_elem; } // [[Rcpp::export]] arma::uvec uvec_test(arma::uvec v) { return(v); } // [[Rcpp::export]] arma::uvec c_uvec_test(const arma::uvec v) { return(v); } // [[Rcpp::export]] arma::uvec r_uvec_test(arma::uvec& v) { return(v); } // [[Rcpp::export]] arma::uvec cr_uvec_test(const arma::uvec& v) { return(v); } // [[Rcpp::export]] arma::umat umat_test(arma::umat v) { return(v); } // [[Rcpp::export]] arma::umat c_umat_test(const arma::umat v) { return(v); } // [[Rcpp::export]] arma::umat r_umat_test(arma::umat& v) { return(v); } // [[Rcpp::export]] arma::umat cr_umat_test(const arma::umat& v) { return(v); } // [[Rcpp::export]] arma::vec vecc_test(arma::vec v) { return(v); } // [[Rcpp::export]] arma::rowvec vecr_test(arma::rowvec v) { return(v); } RcppArmadillo/inst/tinytest/cpp/complex.cpp0000644000176200001440000000436413537314632020616 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- // // complex.cpp: RcppArmadillo unit tests for complex vectors and matrices // // Copyright (C) 2013 - 2019 Baptiste Auguie and Dirk Eddelbuettel // Copyright (C) 2019 Dirk Eddelbuettel // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #include using namespace Rcpp; using namespace arma; // [[Rcpp::depends(RcppArmadillo)]] // [[Rcpp::export]] List complexCppTests(const arma::mat& A, const arma::mat& B, const arma::cx_colvec& V, const arma::mat& S) { arma::cx_mat C(A, B); // create complex matrix arma::cx_mat Cst = strans(C), Ct = trans(C); // transpose arma::cx_mat conjC = conj(C); // conjugate arma::mat absC = abs(C); // modulus arma::cx_colvec CtV = C * V; // multiply matrix-vector arma::cx_mat CtS = C * S; // multiply matrix-matrix arma::cx_mat CC = C % C; // element-wise multiplication arma::cx_mat CdC = C / C; // division arma::cx_mat CpC = C + C; // addition arma::cx_mat CmC = C - C; // subtraction return List::create(_["C"] = C, _["Cst"] = Cst, _["Ct"] = Ct, _["conjC"] = conjC, _["absC"] = absC, _["CV"] = CtV, _["CS"] = CtS, _["CC"] = CC, _["CdC"] = CdC, _["CpC"] = CpC, _["CmC"] = CmC ); } RcppArmadillo/inst/tinytest/cpp/rmultinom.cpp0000644000176200001440000000114713537314632021171 0ustar liggesusers// [[Rcpp::depends(RcppArmadillo)]] #include #include using namespace Rcpp; // [[Rcpp::export]] IntegerVector rmultinomC(int n, int size, NumericVector prob) { IntegerMatrix draws(prob.size(), n); // FixProb modifies in-place arma::colvec fixprob(prob.begin(), prob.size()); // forced copy RcppArmadillo::FixProb(fixprob, 1, true); NumericVector newprob(Rcpp::wrap(fixprob)); RNGScope scope; for (int ii=0; ii using namespace Rcpp; // [[Rcpp::export]] arma::vec veccany_as_v_test(arma::vec v) { return(v); } // [[Rcpp::export]] arma::rowvec vecrany_as_v_test(arma::rowvec v) { return(v); } RcppArmadillo/inst/tinytest/cpp/cube.cpp0000644000176200001440000000467513537314632020072 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- // // cube.cpp: RcppArmadillo unit test code for cube types // // Copyright (C) 2015 - 2019 Dirk Eddelbuettel and Nathan Russell // Copyright (C) 2019 Dirk Eddelbuettel // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . // [[Rcpp::depends(RcppArmadillo)]] #include // [[Rcpp::export]] arma::cube cube_test(const arma::cube& x) { return arma::pow(x, 2); } // [[Rcpp::export]] arma::fcube fcube_test(const arma::fcube& x) { return arma::pow(x, 2); } // [[Rcpp::export]] arma::icube icube_test(const arma::icube& x) { return arma::pow(x, 2); } // [[Rcpp::export]] arma::ucube ucube_test(const arma::ucube& x) { return arma::pow(x, 2); } // [[Rcpp::export]] arma::cx_cube cx_cube_test(const arma::cx_cube& x) { return arma::pow(x, 2); } // [[Rcpp::export]] arma::cx_fcube cx_fcube_test(const arma::cx_fcube& x) { return arma::pow(x, 2); } // [[Rcpp::export]] arma::cube as_cube(Rcpp::NumericVector x) { arma::cube y = Rcpp::as(x); return arma::pow(y, 2); } // [[Rcpp::export]] arma::fcube as_fcube(Rcpp::NumericVector x) { arma::fcube y = Rcpp::as(x); return arma::pow(y, 2); } // [[Rcpp::export]] arma::icube as_icube(Rcpp::IntegerVector x) { arma::icube y = Rcpp::as(x); return arma::pow(y, 2); } // [[Rcpp::export]] arma::ucube as_ucube(Rcpp::IntegerVector x) { arma::ucube y = Rcpp::as(x); return arma::pow(y, 2); } // [[Rcpp::export]] arma::cx_cube as_cx_cube(Rcpp::ComplexVector x) { arma::cx_cube y = Rcpp::as(x); return arma::pow(y, 2); } // [[Rcpp::export]] arma::cx_fcube as_cx_fcube(Rcpp::ComplexVector x) { arma::cx_fcube y = Rcpp::as(x); return arma::pow(y, 2); } RcppArmadillo/inst/tinytest/cpp/sample.cpp0000644000176200001440000000471013537314632020423 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- // // sample.cpp: RcppArmadillo unit test code for sample() function // // Copyright (C) 2012 - 2013 Christian Gunning and Dirk Eddelbuettel // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . // [[Rcpp::depends(RcppArmadillo)]] #include #include using namespace Rcpp; // function defns exported to R -- instantiate templated sample // functions are identical except for class of sampled vector and return val // [[Rcpp::export]] IntegerVector csample_integer( IntegerVector x, int size, bool replace, NumericVector prob = NumericVector::create()) { RNGScope scope; IntegerVector ret = RcppArmadillo::sample(x, size, replace, prob); return ret; } // [[Rcpp::export]] NumericVector csample_numeric( NumericVector x, int size, bool replace, NumericVector prob = NumericVector::create()) { RNGScope scope; NumericVector ret = RcppArmadillo::sample(x, size, replace, prob); return ret; } // [[Rcpp::export]] ComplexVector csample_complex( ComplexVector x, int size, bool replace, NumericVector prob = NumericVector::create()) { RNGScope scope; ComplexVector ret = RcppArmadillo::sample(x, size, replace, prob); return ret; } // [[Rcpp::export]] CharacterVector csample_character( CharacterVector x, int size, bool replace, NumericVector prob = NumericVector::create()) { RNGScope scope; CharacterVector ret = RcppArmadillo::sample(x, size, replace, prob); return ret; } // [[Rcpp::export]] LogicalVector csample_logical( LogicalVector x, int size, bool replace, NumericVector prob = NumericVector::create()) { RNGScope scope; LogicalVector ret = RcppArmadillo::sample(x, size, replace, prob); return ret; } RcppArmadillo/inst/tinytest/cpp/fields_new.cpp0000644000176200001440000000631214145557252021264 0ustar liggesusers // fields_new.cpp: RcppArmadillo unit test code for field types // // Copyright (C) 2021 Dirk Eddelbuettel // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . #define RCPP_ARMADILLO_FIX_Field 1 // [[Rcpp::depends(RcppArmadillo)]] #include // [[Rcpp::export]] arma::field field1m22n() { arma::mat A = arma::randn(2,2); arma::field F(1); F(0) = A; return F; } // [[Rcpp::export]] arma::field field11m22n() { arma::mat A = arma::randn(2,2); arma::field F(1,1); F(0,0) = A; return F; } // [[Rcpp::export]] arma::field field12m22n() { arma::mat A = arma::randn(2,2); arma::mat B = arma::randn(2,2); arma::field F(1,2); F(0,0) = A; F(0,1) = B; //F.print("12m22xx"); return F; } // [[Rcpp::export]] arma::field field21m22n() { arma::mat A = arma::randn(2,2); arma::mat B = arma::randn(2,2); arma::field F(2,1); F(0,0) = A; F(1,0) = B; return F; } // [[Rcpp::export]] arma::field field22m2233n() { arma::mat A = arma::randn(2,2); arma::mat B = arma::randn(3,3); arma::field F(2,2); F(0,1) = A; F(1,0) = B; return F; } // [[Rcpp::export]] arma::field field222m223344n() { arma::mat A = arma::randn(2,2); arma::mat B = arma::randn(3,3); arma::mat C = arma::randn(4,4); arma::field F(2,2,2); F(0,1,0) = A; F(1,0,0) = B; F(0,0,1) = C; return F; } // [[Rcpp::export]] arma::ivec infield1m22n(arma::field F) { arma::uvec v = { F.n_rows, F.n_cols, F.n_slices }; return arma::conv_to::from(v); } // [[Rcpp::export]] arma::ivec infield11m22n(arma::field F) { arma::uvec v = { F.n_rows, F.n_cols, F.n_slices }; return arma::conv_to::from(v); } // [[Rcpp::export]] arma::ivec infield12m22n(arma::field F) { arma::uvec v = { F.n_rows, F.n_cols, F.n_slices }; return arma::conv_to::from(v); } // [[Rcpp::export]] arma::ivec infield21m22n(arma::field F) { arma::uvec v = { F.n_rows, F.n_cols, F.n_slices }; return arma::conv_to::from(v); } // [[Rcpp::export]] arma::ivec infield22m2233n(arma::field F) { arma::uvec v = { F.n_rows, F.n_cols, F.n_slices }; return arma::conv_to::from(v); } // [[Rcpp::export]] arma::ivec infield222m223344n(arma::field F) { arma::uvec v = { F.n_rows, F.n_cols, F.n_slices }; return arma::conv_to::from(v); } RcppArmadillo/inst/tinytest/cpp/rng.cpp0000644000176200001440000000246613537314632017736 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- // // rng.cpp: RcppArmadillo unit test code for fallback RNG // // Copyright (C) 2014 - 2019 Dirk Eddelbuettel // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . // [[Rcpp::depends(RcppArmadillo)]] #include // [[Rcpp::export]] int setSeed(int val) { arma::arma_rng::set_seed(val); // should trigger warning return 0; } // [[Rcpp::export]] arma::vec randu(int n) { return arma::randu(n); } // [[Rcpp::export]] arma::ivec randi(int n) { return arma::randi(n); } // [[Rcpp::export]] arma::vec randn(int n) { return arma::randn(n); } RcppArmadillo/inst/tinytest/cpp/sparse.cpp0000644000176200001440000000464513537314632020446 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- // // sparse.cpp: RcppArmadillo unit test code for sparse matrices // // Copyright (C) 2014 Dirk Eddelbuettel // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . // [[Rcpp::depends(RcppArmadillo)]] #include // [[Rcpp::export]] arma::sp_mat asSpMat(SEXP S) { return Rcpp::as(S); } // [[Rcpp::export]] Rcpp::List asStm(SEXP S) { return Rcpp::simple_triplet_matrix(Rcpp::as(S)); } // [[Rcpp::export]] arma::sp_mat sparseAddition(arma::sp_mat SM) { return SM + SM; } // [[Rcpp::export]] arma::sp_mat sparseMultiplication(arma::sp_mat SM, int k) { return k * SM; } // [[Rcpp::export]] arma::sp_mat fromTriplet(arma::urowvec ri, arma::urowvec ci, arma::colvec values) { arma::umat loc = arma::join_vert(ri, ci);// form 2*N 'locations' matrix arma::sp_mat sp(loc, values); // create sparse from locations and values return sp; } // [[Rcpp::export]] arma::sp_mat sparseTranspose(arma::sp_mat SM) { return SM.t(); } // [[Rcpp::export]] arma::sp_mat sparseSqrt(arma::sp_mat SM) { return arma::sqrt(SM); } // [[Rcpp::export]] arma::sp_mat sparseSquare(arma::sp_mat SM) { return arma::square(SM); } // [[Rcpp::export]] arma::sp_mat sparseIterators(arma::sp_mat SM, double val) { arma::sp_mat::iterator begin = SM.begin(); arma::sp_mat::iterator end = SM.end(); for (arma::sp_mat::iterator it = begin; it != end; ++it) (*it) += val; return SM; } // [[Rcpp::export]] Rcpp::List sparseList(Rcpp::List l) { arma::sp_mat mat1 = l[0]; arma::sp_mat mat2 = l[0]; return Rcpp::List::create(mat1, mat2); } // [[Rcpp::export]] arma::sp_mat speye(int nrow, int ncol) { return arma::speye(nrow, ncol); } RcppArmadillo/inst/tinytest/cpp/Rlapack.cpp0000644000176200001440000000653713537314632020530 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- // // Rlapack.cpp: RcppArmadillo unit tests for borked Lapack // // Copyright (C) 2018 Keith O'Hara and Dirk Eddelbuettel // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . // #define ARMA_EXTRA_DEBUG #include using namespace Rcpp; // [[Rcpp::depends(RcppArmadillo)]] // [[Rcpp::export]] arma::cx_mat cx_eig_pair_test(const int n) { arma::cx_mat A = arma::randu(n,n); arma::cx_mat B = arma::randu(n,n); arma::cx_vec eigval; arma::cx_mat eigvec; arma::eig_pair(eigval, eigvec, A, B); return A*eigvec - B*eigvec*arma::diagmat(eigval); } // [[Rcpp::export]] arma::cx_mat cx_qz_test(const int n) { // test qz in complex matrix case arma::cx_mat A = arma::randu(n,n); arma::cx_mat B = arma::randu(n,n); arma::cx_mat AA; arma::cx_mat BB; arma::cx_mat Q; arma::cx_mat Z; arma::qz(AA,BB,Q,Z,A,B); return A - Q.t()*AA*Z.t(); } // [[Rcpp::export]] int cx_rank_test(const int n) { // test svd_dc arma::cx_mat A = arma::randu(n,n+1); int rA = arma::rank(A); return rA; } // [[Rcpp::export]] arma::cx_mat cx_pinv_test(const int n) { // test svd_dc arma::cx_mat A = arma::randu(n,n+1); arma::cx_mat B = arma::pinv(A); return A*B; } // [[Rcpp::export]] arma::cx_mat cx_schur_test(const int n) { arma::cx_mat A = arma::randu(n,n); arma::cx_mat U; arma::cx_mat S; arma::schur(U,S,A); return A - U*S*U.t(); } // [[Rcpp::export]] arma::cx_mat cx_solve_test(const int n) { arma::cx_mat A = arma::randu(n,n); arma::cx_vec b = arma::randu(n); arma::cx_mat B = arma::randu(n,n); arma::cx_vec x1 = solve(A, b); arma::cx_vec x2; solve(x2, A, b); arma::cx_mat X1 = solve(A, B); arma::cx_mat X2 = solve(A, B, arma::solve_opts::fast); // enable fast mode // next for non-square matrices; to test solve_approx_svd arma::cx_mat C = arma::randu(n,n+1); arma::cx_vec x3 = solve(C, b); return C*x3 - b; } // [[Rcpp::export]] arma::cx_mat cx_solve_band_test(const int n) { // trigger solve_tridiag_refine int n_tri_rows = std::min(34,n); arma::cx_mat A_tri = arma::zeros(n_tri_rows,n_tri_rows); A_tri.diag() = arma::randu(n_tri_rows,1); A_tri.diag(1) = arma::randu(n_tri_rows-1,1); A_tri.diag(-1) = arma::randu(n_tri_rows-1,1); arma::cx_vec b_tri = arma::randu(n_tri_rows); arma::cx_vec x_tri = solve(A_tri, b_tri); return A_tri*x_tri - b_tri; } RcppArmadillo/inst/tinytest/cpp/fields.cpp0000644000176200001440000000621414145015317020403 0ustar liggesusers// fields.cpp: RcppArmadillo unit test code for field types // // Copyright (C) 2021 Dirk Eddelbuettel // // This file is part of RcppArmadillo. // // RcppArmadillo is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // RcppArmadillo is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with RcppArmadillo. If not, see . // [[Rcpp::depends(RcppArmadillo)]] #include // [[Rcpp::export]] arma::field field1m22() { arma::mat A = arma::randn(2,2); arma::field F(1); F(0) = A; return F; } // [[Rcpp::export]] arma::field field11m22() { arma::mat A = arma::randn(2,2); arma::field F(1,1); F(0,0) = A; return F; } // [[Rcpp::export]] arma::field field12m22() { arma::mat A = arma::randn(2,2); arma::mat B = arma::randn(2,2); arma::field F(1,2); F(0,0) = A; F(0,1) = B; return F; } // [[Rcpp::export]] arma::field field21m22() { arma::mat A = arma::randn(2,2); arma::mat B = arma::randn(2,2); arma::field F(2,1); F(0,0) = A; F(1,0) = B; return F; } // [[Rcpp::export]] arma::field field22m2233() { arma::mat A = arma::randn(2,2); arma::mat B = arma::randn(3,3); arma::field F(2,2); F(0,1) = A; F(1,0) = B; return F; } // [[Rcpp::export]] arma::field field222m223344() { arma::mat A = arma::randn(2,2); arma::mat B = arma::randn(3,3); arma::mat C = arma::randn(4,4); arma::field F(2,2,2); F(0,1,0) = A; F(1,0,0) = B; F(0,0,1) = B; return F; } // [[Rcpp::export]] arma::ivec infield1m22(arma::field F) { arma::uvec v = { F.n_rows, F.n_cols, F.n_slices }; return arma::conv_to::from(v); } // [[Rcpp::export]] arma::ivec infield11m22(arma::field F) { arma::uvec v = { F.n_rows, F.n_cols, F.n_slices }; return arma::conv_to::from(v); } // [[Rcpp::export]] arma::ivec infield12m22(arma::field F) { arma::uvec v = { F.n_rows, F.n_cols, F.n_slices }; return arma::conv_to::from(v); } // [[Rcpp::export]] arma::ivec infield21m22(arma::field F) { arma::uvec v = { F.n_rows, F.n_cols, F.n_slices }; return arma::conv_to::from(v); } // [[Rcpp::export]] arma::ivec infield22m2233(arma::field F) { arma::uvec v = { F.n_rows, F.n_cols, F.n_slices }; return arma::conv_to::from(v); } // [[Rcpp::export]] arma::ivec infield222m223344(arma::field F) { F.print("F"); arma::uvec v = { F.n_rows, F.n_cols, F.n_slices }; return arma::conv_to::from(v); } RcppArmadillo/inst/tinytest/test_fields.R0000644000176200001440000000522514145015342020276 0ustar liggesusers # Copyright (C) 2021 Dirk Eddelbuettel # # This file is part of RcppArmadillo. # # RcppArmadillo is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # RcppArmadillo is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with RcppArmadillo. If not, see . library(RcppArmadillo) Rcpp::sourceCpp("cpp/fields.cpp") .onWindows <- .Platform$OS.type == "windows" f1m22 <- field1m22() expect_true(inherits(f1m22, "array")) expect_true(inherits(f1m22[[1]], "matrix")) expect_equal(dim(f1m22), c(1,1)) # should this be just 1 ? expect_equal(dim(f1m22[[1]]), c(2,2)) f11m22 <- field11m22() expect_true(inherits(f11m22, "array")) expect_true(inherits(f11m22[[1]], "matrix")) expect_equal(dim(f11m22), c(1,1)) expect_equal(dim(f11m22[[1]]), c(2,2)) f12m22 <- field12m22() expect_true(inherits(f12m22, "array")) expect_true(inherits(f12m22[[1]], "matrix")) expect_equal(dim(f12m22), c(1,2)) expect_equal(dim(f12m22[[1]]), c(2,2)) expect_equal(dim(f12m22[[2]]), c(2,2)) f21m22 <- field21m22() expect_true(inherits(f21m22, "array")) expect_true(inherits(f21m22[[1]], "matrix")) expect_equal(dim(f21m22), c(2,1)) expect_equal(dim(f21m22[[1]]), c(2,2)) expect_equal(dim(f21m22[[2]]), c(2,2)) f22m2233 <- field22m2233() expect_true(inherits(f22m2233, "array")) expect_true(inherits(f22m2233[[1]], "matrix")) expect_equal(dim(f22m2233), c(2,2)) expect_equal(dim(f22m2233[[2]]), c(3,3)) expect_equal(dim(f22m2233[[3]]), c(2,2)) #f222m223344 <- field222m223344() #expect_true(inherits(f222m223344, "array")) #expect_true(inherits(f222m223344[[1]], "matrix")) #expect_equal(dim(f222m223344), c(2,2,2)) #expect_equal(dim(f222m223344[[2]]), c(3,3)) #expect_equal(dim(f222m223344[[3]]), c(2,2)) v <- infield1m22( field1m22() ) expect_equal(v, matrix(c(1L, 1L, 1L),3,1)) v <- infield11m22( field11m22() ) expect_equal(v, matrix(c(1L, 1L, 1L),3,1)) v <- infield12m22( field12m22() ) expect_equal(v, matrix(c(2L, 1L, 1L),3,1)) # should be 1,2,1 ? v <- infield21m22( field21m22() ) expect_equal(v, matrix(c(2L, 1L, 1L),3,1)) v <- infield22m2233( field22m2233() ) expect_equal(v, matrix(c(4L, 1L, 1L),3,1)) # should 2,2,1 ? #v <- infield222m223344( field222m223344() ) #expect_equal(v, matrix(c(4L, 1L, 1L),3,1)) # should 2,2,1 ? #print(v); RcppArmadillo/inst/tinytest/test_misc.R0000644000176200001440000000257514056453006017774 0ustar liggesusers#!/usr/bin/r -t # # Copyright (C) 2021 Dirk Eddelbuettel # # This file is part of RcppArmadillo. # # RcppArmadillo is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # RcppArmadillo is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with RcppArmadillo. If not, see . library(RcppArmadillo) ## -- src/RcppArmadillo.cpp arma <- armadillo_version(FALSE) expect_equal(length(arma), 3) # major minor patch expect_equal(names(arma), c("major","minor","patch")) arma <- armadillo_version(TRUE) expect_equal(class(arma), "integer") expect_equal(length(arma), 1L) ## no tests as we have no (current) accessor as we prefer R RNGs expect_warning(armadillo_set_seed_random()) armadillo_set_seed(42L) # no test as we have no (current) accessor as we prefer R RNGs ## -- R/flags.R cxxflags <- RcppArmadillo:::RcppArmadilloCxxFlags() expect_true(is.character(cxxflags)) expect_stdout(RcppArmadillo:::CxxFlags()) RcppArmadillo/inst/tinytest/test_fastLm.R0000644000176200001440000001061514061151744020261 0ustar liggesusers#!/usr/bin/r -t ## ## Copyright (C) 2010 - 2019 Dirk Eddelbuettel, Romain Francois and Douglas Bates ## ## This file is part of RcppArmadillo. ## ## RcppArmadillo is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 2 of the License, or ## (at your option) any later version. ## ## RcppArmadillo is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with RcppArmadillo. If not, see . library(RcppArmadillo) library(datasets) #test.fastLm <- function() { data(trees, package="datasets") flm <- fastLmPure(cbind(1, log(trees$Girth)), log(trees$Volume)) fit <- lm(log(Volume) ~ log(Girth), data=trees) expect_equal(as.numeric(flm$coefficients), as.numeric(coef(fit)))#,msg="fastLm.coef") expect_equal(as.numeric(flm$stderr), as.numeric(coef(summary(fit))[,2]))#,msg="fastLm.stderr") expect_equal(as.numeric(flm$df.residual), as.numeric(fit$df.residual))#,msg="fastLm.df.residual") #test.fastLm.default <- function() { data(trees, package="datasets") flm <- RcppArmadillo:::fastLm.default(cbind(1, log(trees$Girth)), log(trees$Volume)) fit <- lm(log(Volume) ~ log(Girth), data=trees) expect_equal(as.numeric(flm$coefficients), as.numeric(coef(fit)))#,msg="fastLm.default.coef") expect_equal(as.numeric(flm$stderr), as.numeric(coef(summary(fit))[,2]))#,msg="fastLm.default.stderr") expect_equal(as.numeric(flm$df.residual), as.numeric(fit$df.residual))#,msg="fastLm.default.df.residual") expect_equal(as.numeric(flm$residuals), as.numeric(fit$residuals))#,msg="fastLm.default.residuals") expect_equal(as.numeric(flm$fitted.values), as.numeric(fit$fitted.values))#,msg="fastLm.default.fitted.values") #test.summary.fastLm <- function() { data(trees, package="datasets") sflm <- summary(fastLm(log(Volume) ~ log(Girth), data=trees)) sfit <- summary(lm(log(Volume) ~ log(Girth), data=trees)) expect_equal(as.numeric(coef(sflm)), as.numeric(coef(sfit)))#,msg="summary.fastLm.coef") expect_equal(sflm$r.squared, sfit$r.squared)#,msg="summary.fastLm.r.squared") expect_equal(sflm$adj.r.squared, sfit$adj.r.squared)#,msg="summary.fastLm.r.squared") expect_equal(sflm$sigma, sfit$sigma)#,msg="summary.fastLm.sigma") ## no intercept case sflm <- summary(fastLm(log(Volume) ~ log(Girth) - 1, data=trees)) sfit <- summary(lm(log(Volume) ~ log(Girth) - 1, data=trees)) expect_equal(as.numeric(coef(sflm)), as.numeric(coef(sfit)))#,msg="summary.fastLm.coef.noint") expect_equal(sflm$r.squared, sfit$r.squared)#,msg="summary.fastLm.r.squared.noint") expect_equal(sflm$adj.r.squared, sfit$adj.r.squared)#,msg="summary.fastLm.r.squared.noint") expect_equal(sflm$sigma, sfit$sigma)#,msg="summary.fastLm.sigma.noint") ## non-formula use sflm <- summary(fastLm(log(trees$Girth), log(trees$Volume))) sfit <- summary(lm(log(Volume) ~ log(Girth) - 1, data=trees)) expect_equal(as.numeric(coef(sflm)), as.numeric(coef(sfit)))#,msg="summary.fastLm.coef.nonform") expect_equal(sflm$r.squared, sfit$r.squared)#,msg="summary.fastLm.r.squared.nonform") expect_equal(sflm$adj.r.squared, sfit$adj.r.squared)#,msg="summary.fastLm.r.squared.nonform") expect_equal(sflm$sigma, sfit$sigma)#,msg="summary.fastLm.sigma.nonform") #test.fastLm.formula <- function() { data(trees, package="datasets") flm <- fastLm(log(Volume) ~ log(Girth), data=trees) fit <- lm(log(Volume) ~ log(Girth), data=trees) expect_equal(flm$coefficients, coef(fit))#, msg="fastLm.formula.coef") expect_equal(as.numeric(flm$stderr), as.numeric(coef(summary(fit))[,2]))#,msg="fastLm.formula.stderr") expect_equal(as.numeric(flm$df.residual), as.numeric(fit$df.residual))#,msg="fastLm.formula.df.residual") expect_equal(as.numeric(flm$residuals), as.numeric(fit$residuals))#,msg="fastLm.formula.residuals") expect_equal(as.numeric(flm$fitted.values), as.numeric(fit$fitted.values))#,msg="fastLm.formula.fitted.values") ## also tickle print and predict methods expect_stdout(print(flm)) expect_stdout(print(summary(flm))) vec <- predict(flm, newdata=data.frame(Girth=c(1,2,3), Volume=c(2,3,4))) expect_equal(class(vec), "numeric") expect_equal(length(vec), 3L) vec <- predict(flm, newdata=NULL) expect_equal(vec, fitted(flm)) RcppArmadillo/inst/tinytest/test_Rlapack.R0000644000176200001440000000333113537314632020411 0ustar liggesusers#!/usr/bin/r -t # # Copyright (C) 2018 Keith O'Hara and Dirk Eddelbuettel # Copyright (C) 2019 Dirk Eddelbuettel # # This file is part of RcppArmadillo. # # RcppArmadillo is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # RcppArmadillo is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with RcppArmadillo. If not, see . library(RcppArmadillo) Rcpp::sourceCpp("cpp/Rlapack.cpp") set.seed(123) ## create variables n <- 5 # size the of matrices generated in tests n_tri <- 50 # size the of matrices generated in tridiagonal tests ## Basic operations rl1 <- norm(cx_eig_pair_test(n),"2") rl2 <- norm(cx_qz_test(n),"2") rl3 <- cx_rank_test(n) # should equal n rl4 <- norm(cx_solve_test(n),"2") rl5 <- norm(cx_solve_band_test(n_tri),"2") rl6 <- norm(cx_pinv_test(n),"2") # should be (approx) an identity matrix rl7 <- norm(cx_schur_test(n),"2") expect_equal(rl1, 0)#, msg="eig_pair for complex matrices") expect_equal(rl2, 0)#, msg="qz for complex matrices") expect_equal(rl3, n)#, msg="rank complex matrices") expect_equal(rl4, 0)#, msg="solve for complex matrices") expect_equal(rl5, 0)#, msg="solve for band complex matrices") expect_equal(rl6, 1)#, msg="pinv for complex matrices") expect_equal(rl7, 0)#, msg="schur for complex matrices") RcppArmadillo/inst/tinytest/test_scipy2r.R0000644000176200001440000000517313650076546020442 0ustar liggesusers## py2r.R: Conversion of SciPy sparse matrix to R ## ## Copyright (C) 2017 - 2020 Binxiang Ni and Dirk Eddelbuettel ## ## This file is part of RcppArmadillo. ## ## RcppArmadillo is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 2 of the License, or ## (at your option) any later version. ## ## RcppArmadillo is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with RcppArmadillo. If not, see . ## Reference: https://docs.scipy.org/doc/scipy-0.19.1/reference/sparse.html #exit_file("Skip this test for now.") ## It now (Apr 2020) appears to fail on 32-bit Windows .onWindows <- .Platform$OS.type == "windows" .is32bit <- .Platform$r_arch == "i386" if (.onWindows && .is32bit) exit_file("Do not bother on 32-bit Windows") if (!requireNamespace("Matrix", quietly=TRUE)) exit_file("Package Matrix missing") if (!requireNamespace("reticulate", quietly=TRUE)) exit_file("Package reticulate missing") if (!packageVersion("reticulate") >= package_version("1.14")) exit_file("SciPy not needed on newer reticulate") suppressMessages({ library(Matrix) library(reticulate) }) ## SciPy implies NumPy too if (! py_module_available("scipy")) exit_file("Module scipy missing") np <- import("numpy") mat <- np$array(list(list(1, 0, 4), list(0, 0, 5), list(2, 3, 6))) sp <- import("scipy.sparse") mtxt <- c("1 0 4", "0 0 5", "2 3 6") M <- as.matrix(read.table(text=mtxt)) dimnames(M) <- NULL ## Since 'reticulate' automatically converts CSC matrix to dgCMatrix, ## no need to convert it in RcppArmadillo #test.csc2dgc <- function() { csc <- sp$csc_matrix(mat) dgC <- methods::as(M, "dgCMatrix") expect_equal(dgC, csc, info="csc2dgc") #test.coo2dgt <- function() { coo <- sp$coo_matrix(mat) dgT <- new("dgTMatrix", i = c(0L, 0L, 1L, 2L, 2L, 2L), j = c(0L, 2L, 2L, 0L, 1L, 2L), x = c(1, 4, 5, 2, 3, 6), Dim = c(3L, 3L)) expect_equal(dgT, coo, info="coo2dgt") #RcppArmadillo:::.SciPy2R(coo)) #test.csr2dgr <- function() { csr <- sp$csr_matrix(mat) dgR <- methods::as(M, "dgRMatrix") expect_equal(dgR, csr, info="csr2dgr") #RcppArmadillo:::.SciPy2R(csr)) #test.other <- function() { #bsr <- sp$bsr_matrix(list(3, 4)) #expect_error(RcppArmadillo:::.SciPy2R(bsr)) expect_error(sp$bsr_matrix(list(3, 4))) RcppArmadillo/inst/tinytest/test_rng.R0000644000176200001440000000325013537314632017622 0ustar liggesusers#!/usr/bin/r -t # # Copyright (C) 2014 - 2019 Dirk Eddelbuettel # # This file is part of RcppArmadillo. # # RcppArmadillo is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # RcppArmadillo is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with RcppArmadillo. If not, see . library(RcppArmadillo) Rcpp::sourceCpp("cpp/rng.cpp") #test.randu.seed <- function() { set.seed(123) a <- randu(10) set.seed(123) b <- randu(10) expect_equal(a, b)#, msg="randu seeding") #test.randi.seed <- function() { set.seed(123) a <- randi(10) set.seed(123) b <- randi(10) expect_equal(a, b)#, msg="randi seeding") #test.randn.seed <- function() { set.seed(123) a <- randn(10) set.seed(123) b <- randn(10) expect_equal(a, b)#, msg="randn seeding") #test.randu <- function() { set.seed(123) a <- randu(10) expect_true(min(a) > 0)#, msg="randu min") expect_true(max(a) < 1)#, msg="randu max") #test.randi <- function() { set.seed(123) a <- randi(10) expect_true(min(a) > 0)#, msg="randi min") expect_true(typeof(a) == "integer")#, msg="randi type") #test.randn <- function() { set.seed(123) a <- randn(10) expect_true(min(a) > -4)#, msg="randn min") expect_true(max(a) < 4)#, msg="randn max") expect_true(typeof(a) == "double")#, msg="randi type") RcppArmadillo/inst/tinytest/test_fields_new.R0000644000176200001440000000516414145016772021161 0ustar liggesusers # Copyright (C) 2021 Dirk Eddelbuettel # # This file is part of RcppArmadillo. # # RcppArmadillo is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # RcppArmadillo is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with RcppArmadillo. If not, see . library(RcppArmadillo) Rcpp::sourceCpp("cpp/fields_new.cpp") .onWindows <- .Platform$OS.type == "windows" f1m22 <- field1m22n() expect_true(inherits(f1m22, "array")) expect_true(inherits(f1m22[[1]], "matrix")) expect_equal(dim(f1m22), c(1,1,1)) expect_equal(dim(f1m22[[1]]), c(2,2)) f11m22 <- field11m22n() expect_true(inherits(f11m22, "array")) expect_true(inherits(f11m22[[1]], "matrix")) expect_equal(dim(f11m22), c(1,1,1)) expect_equal(dim(f11m22[[1]]), c(2,2)) f12m22 <- field12m22n() expect_true(inherits(f12m22, "array")) expect_true(inherits(f12m22[[1]], "matrix")) expect_equal(dim(f12m22), c(1,2,1)) expect_equal(dim(f12m22[[1]]), c(2,2)) expect_equal(dim(f12m22[[2]]), c(2,2)) f21m22 <- field21m22n() expect_true(inherits(f21m22, "array")) expect_true(inherits(f21m22[[1]], "matrix")) expect_equal(dim(f21m22), c(2,1,1)) expect_equal(dim(f21m22[[1]]), c(2,2)) expect_equal(dim(f21m22[[2]]), c(2,2)) f22m2233 <- field22m2233n() expect_true(inherits(f22m2233, "array")) expect_true(inherits(f22m2233[[1]], "matrix")) expect_equal(dim(f22m2233), c(2,2,1)) expect_equal(dim(f22m2233[[2]]), c(3,3)) expect_equal(dim(f22m2233[[3]]), c(2,2)) f222m223344 <- field222m223344n() expect_true(inherits(f222m223344, "array")) expect_true(inherits(f222m223344[[1]], "matrix")) expect_equal(dim(f222m223344), c(2,2,2)) expect_equal(dim(f222m223344[[2]]), c(3,3)) expect_equal(dim(f222m223344[[3]]), c(2,2)) expect_equal(dim(f222m223344[[5]]), c(4,4)) v <- infield1m22n( field1m22n() ) expect_equal(v, matrix(c(1L, 1L, 1L),3,1)) v <- infield11m22n( field11m22n() ) expect_equal(v, matrix(c(1L, 1L, 1L),3,1)) v <- infield12m22n( field12m22n() ) expect_equal(v, matrix(c(1L, 2L, 1L),3,1)) v <- infield21m22n( field21m22n() ) expect_equal(v, matrix(c(2L, 1L, 1L),3,1)) v <- infield22m2233n( field22m2233n() ) expect_equal(v, matrix(c(2L, 2L, 1L),3,1)) v <- infield222m223344n( field222m223344n() ) expect_equal(v, matrix(c(2L, 2L, 2L),3,1)) RcppArmadillo/inst/AUTHORS0000644000176200001440000000124013123245425015026 0ustar liggesusers Armadillo itself carries the following in file NOTICE.TXT: Armadillo C++ Linear Algebra Library Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) Copyright 2008-2016 National ICT Australia (NICTA) This product includes software developed by Conrad Sanderson (http://conradsanderson.id.au) This product includes software developed at National ICT Australia (NICTA) The RcppArmadillo package integrates Armadillo into R, provides wrappers, converters, a test framework, examples and more. It was written by Dirk Eddelbuettel, Romain Francois and Doug Bates with contributions by many others as detailed in the ChangeLog file. RcppArmadillo/inst/announce/0000755000176200001440000000000012253723621015571 5ustar liggesusersRcppArmadillo/inst/announce/ANNOUNCE-0.2.0.txt0000644000176200001440000001170212253723621020174 0ustar liggesusers ===== Armadillo ===== Armadillo is a C++ linear algebra library aiming towards a good balance between speed and ease of use. Integer, floating point and complex numbers are supported, as well as a subset of trigonometric and statistics functions. Various matrix decompositions are provided through optional integration with LAPACK and ATLAS libraries. A delayed evaluation approach is employed (during compile time) to combine several operations into one and reduce (or eliminate) the need for temporaries. This is accomplished through recursive templates and template meta-programming. This library is useful if C++ has been decided as the language of choice (due to speed and/or integration capabilities), rather than another language like Matlab or Octave. It is distributed under a license that is useful in both open-source and commercial contexts. Armadillo is primarily developed by Conrad Sanderson at NICTA (Australia), with contributions from around the world. ===== RcppArmadillo ===== RcppArmadillo is an R package that facilitates using Armadillo classes in R packages through Rcpp. It achieves the integration by extending Rcpp's data interchange concepts to Armadillo classes. ===== Example ===== Here is a simple implementation of a fast linear regression (provided by RcppArmadillo via the fastLm() function): #include extern "C" SEXP fastLm(SEXP ys, SEXP Xs) { Rcpp::NumericVector yr(ys); // creates Rcpp vector from SEXP Rcpp::NumericMatrix Xr(Xs); // creates Rcpp matrix from SEXP int n = Xr.nrow(), k = Xr.ncol(); arma::mat X(Xr.begin(), n, k, false); // reuses memory and avoids extra copy arma::colvec y(yr.begin(), yr.size(), false); arma::colvec coef = arma::solve(X, y); // fit model y ~ X arma::colvec res = y - X*coef; // residuals double s2 = std::inner_product(res.begin(), res.end(), res.begin(), double())/(n - k); // std.errors of coefficients arma::colvec stderr = arma::sqrt(s2 * arma::diagvec( arma::inv(arma::trans(X)*X) )); return Rcpp::List::create(Rcpp::Named("coefficients") = coef, Rcpp::Named("stderr") = stderr, Rcpp::Named("df") = n - k ); } Note however that you may not want to compute a linear regression fit this way in order to protect from numerical inaccuracies on rank-deficient problems. The help page for fastLm() provides an example. ===== Using RcppArmadillo in other packages ===== RcppArmadillo is designed so that its classes can be used from other packages. Using RcppArmadillo requires: - Using the header files provided by Rcpp and RcppArmadillo. This is typically achieved by adding this line in the DESCRIPTION file of the client package: LinkingTo : Rcpp, RcppArmadillo and the following line in the package code: #include - Linking against Rcpp dynamic or shared library and librairies needed by Armadillo, which is achieved by adding this line in the src/Makevars file of the client package: PKG_LIBS = $(shell $(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()" ) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) and this line in the file src/Makevars.win: PKG_LIBS = $(shell Rscript.exe -e "Rcpp:::LdFlags()") $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) RcppArmadillo contains a function RcppArmadillo.package.skeleton, modelled after package.skeleton from the utils package in base r, that creates a skeleton of a package using RcppArmadillo, including example code. ===== Quality Assurance ===== RcppArmadillo uses the RUnit package by Matthias Burger et al to provide unit testing. RcppArmadillo currently has 19 unit tests (called from 8 unit test functions). Source code for unit test functions are stored in the unitTests directory of the installed package and the results are collected in the "RcppArmadillo-unitTests" vignette. We run unit tests before sending the package to CRAN on as many systems as possible, including Mac OSX (Snow Leopard), Debian, Ubuntu, Fedora 12 (64bit), Win 32 and Win64. Unit tests can also be run from the installed package by executing RcppArmadillo:::test() where an output directory can be provided as an optional first argument. ===== Links ===== Armadillo : http://arma.sourceforge.net/ RcppArmadillo main page: http://dirk.eddelbuettel.com/code/rcpp.armadillo.html R-forge Rcpp project page: http://r-forge.r-project.org/projects/rcpp/ Dirk's blog : http://dirk.eddelbuettel.com/blog/code/rcpp/ Romain's blog : http://romainfrancois.blog.free.fr/index.php?category/R-package/RcppArmadillo ===== Support ===== Questions about RcppArmadillo should be directed to the Rcpp-devel mailing list at https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel Questions about Armadillo itself should be directed to its forum http://sourceforge.net/apps/phpbb/arma/ -- Romain Francois, Montpellier, France Dirk Eddelbuettel, Chicago, IL, USA Doug Bates, Madison, WI, USA May 2010 RcppArmadillo/inst/NEWS.Rd0000644000176200001440000027366114173264002015041 0ustar liggesusers\name{NEWS} \title{News for Package \pkg{RcppArmadillo}} \newcommand{\ghpr}{\href{https://github.com/RcppCore/RcppArmadillo/pull/#1}{##1}} \newcommand{\ghit}{\href{https://github.com/RcppCore/RcppArmadillo/issues/#1}{##1}} \section{Changes in RcppArmadillo version 0.10.8.1.0 (2022-01-23)}{ \itemize{ \item Upgraded to Armadillo release 10.8.1 (Realm Raider) \itemize{ \item fix interaction between OpenBLAS and LAPACK \item emit warning if \code{find()} is incorrectly used to locate NaN elements } } } \section{Changes in RcppArmadillo version 0.10.8.0.0 (2022-01-02)}{ \itemize{ \item Upgraded to Armadillo release 10.8 (Realm Raider) \itemize{ \item faster handling of symmetric matrices by \code{pinv()} and \code{rank()} \item faster handling of diagonal matrices by \code{inv_sympd()}, \code{pinv()}, \code{rank()} \item expanded \code{norm()} to handle integer vectors and matrices \item added \code{datum::tau} to replace \code{2π} } } } \section{Changes in RcppArmadillo version 0.10.7.5.0 (2021-12-16)}{ \itemize{ \item Upgraded to Armadillo release 10.7.5 \itemize{ \item fix aliasing bug in \code{diagmat()} \item fix detection of 2x2 triangular matrices } } } \section{Changes in RcppArmadillo version 0.10.7.4.0 (2021-11-23)}{ \itemize{ \item Upgraded to Armadillo release 10.7.4 \itemize{ \item faster handling of diagonal matrices by \code{inv_sympd()}, \code{pinv()}, \code{rank()} \item more robust detection of incorrect data format by \code{.load()} } \item Correct dimensions setting in import/export of \code{arma::field} types, protected by \code{#define} (Jonathan Berrisch in \ghpr{352} fixing \ghit{351}) \item Add unit tests for \code{fields} both with and without new \code{#define} (Dirk) } } \section{Changes in RcppArmadillo version 0.10.7.3.0 (2021-11-04)}{ \itemize{ \item Upgraded to Armadillo release 10.7.3 \itemize{ \item fix regression in alias handling by \code{fliplr()}, \code{flipud()}, \code{reverse()} } } } \section{Changes in RcppArmadillo version 0.10.7.2.0 (2021-11-02)}{ \itemize{ \item Upgraded to Armadillo release 10.7.2 \itemize{ \item more robust handling of diagonal matrices by \code{pinv()} } } } \section{Changes in RcppArmadillo version 0.10.7.1.0 (2021-10-08)}{ \itemize{ \item Upgraded to Armadillo release 10.7.1 \itemize{ \item fix regression in interactions between dense matrix subviews and sparse matrices } } } \section{Changes in RcppArmadillo version 0.10.7.0.0 (2021-09-30)}{ \itemize{ \item Upgraded to Armadillo release 10.7.0 (Entropy Maximizer) \itemize{ \item faster handling of submatrix views accessed by \code{X.cols(first_col,last_col)} \item faster handling of element-wise \code{min()} and \code{max()} in compound expressions \item expanded \code{solve()} with \code{solve_opts::force_approx} option to force use of the approximate solver } } } \section{Changes in RcppArmadillo version 0.10.6.2.0 (2021-08-05)}{ \itemize{ \item Upgraded to Armadillo release 10.6.2 (Keep Calm) \itemize{ \item fix incorrect use of \code{constexpr} for handling fixed-size matrices and vectors \item improved documentation } \item GitHub- and drat-only release } } \section{Changes in RcppArmadillo version 0.10.6.0.0 (2021-07-16)}{ \itemize{ \item Upgraded to Armadillo release 10.6.0 (Keep Calm) \itemize{ \item expanded \code{chol()} to optionally use pivoted decomposition \item expanded vector, matrix and cube constructors to allow element initialisation via \code{fill::value(scalar)}, eg. \code{mat X(4,5,fill::value(123))} \item faster loading of CSV files when using OpenMP \item added \code{csv_opts::semicolon} option to allow saving/loading of CSV files with semicolon (;) instead of comma (,) as the separator } } } \section{Changes in RcppArmadillo version 0.10.5.3.0 (2021-07-01)}{ \itemize{ \item Upgraded to Armadillo release 10.5.3 (Antipodean Fortress) \item GitHub-only release \item Extended test coverage with several new tests, added a coverage badge. } } \section{Changes in RcppArmadillo version 0.10.5.0 (2021-05-21)}{ \itemize{ \item Upgraded to Armadillo release 10.5 (Antipodean Fortress) \itemize{ \item added \code{.clamp()} member function \item expanded the standalone \code{clamp()} function to handle complex values \item more efficient use of OpenMP \item vector, matrix and cube constructors now initialise elements to zero by default; use the \code{fill::none} specifier, eg. \code{mat X(4,5,fill::none)}, to disable element initialisation } \item Added \code{codecov.yml} to exclude Armadillo from coverage analysis } } \section{Changes in RcppArmadillo version 0.10.4.1.0 (2021-04-23)}{ \itemize{ \item Upgraded to Armadillo release 10.4.1 (Pressure Cooker) \item GitHub-only release } } \section{Changes in RcppArmadillo version 0.10.4.0.0 (2021-04-12)}{ \itemize{ \item Upgraded to Armadillo release 10.4.0 (Pressure Cooker) \itemize{ \item faster handling of triangular matrices by \code{log_det()} \item added \code{log_det_sympd()} for log determinant of symmetric positive matrices \item added ARMA_WARN_LEVEL configuration option, to control the degree of emitted warning messages \item reduced the default degree of warning messages, so that failed decompositions, failed saving/loading, etc, no longer emit warnings } \item Apply one upstream corrections for \code{arma::randn} draws when using alternative (here R) generator, and \code{arma::randg}. } } \section{Changes in RcppArmadillo version 0.10.3.0.0 (2021-03-10)}{ \itemize{ \item Upgraded to Armadillo release 10.3 (Sunrise Chaos) \itemize{ \item faster handling of symmetric positive definite matrices by \code{pinv()} \item expanded \code{.save()} / \code{.load()} for dense matrices to handle coord_ascii format \item for out of bounds access, element accessors now throw the more nuanced \code{std::out_of_range} exception, instead of only \code{std::logic_error} \item improved quality of random numbers } } } \section{Changes in RcppArmadillo version 0.10.2.2.0 (2021-03-09)}{ \itemize{ \item Upgraded to Armadillo release 10.2.2 (Cicada Swarm) \itemize{ \item faster handling of subcubes \item added \code{tgamma()} \item added \code{.brief_print()} for abridged printing of matrices & cubes \item expanded forms of \code{trimatu()} and \code{trimatl()} with diagonal specification to handle sparse matrices \item expanded \code{eigs_sym()} and \code{eigs_gen()} with optional shift-invert mode } \item Removed \code{debian/} directory from repository as packaging is on salsa.debian.org. \item Relaxed tolerance on two \code{cube} tests on Windows to accomodate new 'gcc10-UCRT' builder. } } \section{Changes in RcppArmadillo version 0.10.2.1.0 (2021-02-09)}{ \itemize{ \item Upgraded to Armadillo release 10.2.1 (Cicada Swarm) \itemize{ \item faster handling of subcubes \item added \code{tgamma()} \item added \code{.brief_print()} for abridged printing of matrices & cubes \item expanded forms of \code{trimatu()} and \code{trimatl()} with diagonal specification to handle sparse matrices \item expanded \code{eigs_sym()} and \code{eigs_gen()} with optional shift-invert mode } } } \section{Changes in RcppArmadillo version 0.10.1.2.2 (2021-01-08)}{ \itemize{ \item Correct one unit test for \pkg{Matrix} 1.3.0-caused changed (Binxiang in \ghpr{319} and Dirk in \ghpr{322}). \item Suppress one further warning from \pkg{Matrix} (Dirk) \item Apply an upstream \code{NaN} correction (Conrad in \ghpr{321}) \item Added GitHub Actions CI using \code{run.sh} from r-ci (Dirk) } } \section{Changes in RcppArmadillo version 0.10.1.2.0 (2020-11-15)}{ \itemize{ \item Upgraded to Armadillo release 10.1.2 (Orchid Ambush) \item Remove three unused int constants (\ghit{313}) \item Include main armadillo header using quotes instead of brackets \item Rewrite version number use in old-school mode because gcc 4.8.5 \item Skipping parts of sparse conversion on Windows as win-builder fails } } \section{Changes in RcppArmadillo version 0.10.1.0.0 (2020-10-09)}{ \itemize{ \item Upgraded to Armadillo release 10.1.0 (Orchid Ambush) \itemize{ \item C++11 is now the minimum required C++ standard \item faster handling of compound expressions by \code{trimatu()} and \code{trimatl()} \item faster sparse matrix addition, subtraction and element-wise multiplication \item expanded sparse submatrix views to handle the non-contiguous form of \code{X.cols(vector_of_column_indices)} \item expanded \code{eigs_sym()} and \code{eigs_gen()} with optional fine-grained parameters (subspace dimension, number of iterations, eigenvalues closest to specified value) \item deprecated form of \code{reshape()} removed from Cube and SpMat classes \item ignore and warn on use of the \code{ARMA_DONT_USE_CXX11} macro } \item Switch Travis CI testing to focal and BSPM } } \section{Changes in RcppArmadillo version 0.9.900.3.0 (2020-09-02)}{ \itemize{ \item Upgraded to Armadillo release 9.900.3 (Nocturnal Misbehaviour) \itemize{ \item More efficient code for initialising matrices with \code{fill::zeros} \item Fixes for various error messages } } } \section{Changes in RcppArmadillo version 0.9.900.2.0 (2020-07-17)}{ \itemize{ \item Upgraded to Armadillo release 9.900.2 (Nocturnal Misbehaviour) \itemize{ \item In \code{sort()}, fixes for inconsistencies between checks applied to matrix and vector expressions \item In \code{sort()}, remove unnecessary copying when applied in-place to vectors function when applied in-place to vectors } } } \section{Changes in RcppArmadillo version 0.9.900.1.0 (2020-06-08)}{ \itemize{ \item Upgraded to Armadillo release 9.900.1 (Nocturnal Misbehaviour) \itemize{ \item faster \code{solve()} for under/over-determined systems \item faster \code{eig_gen()} and \code{eig_pair()} for large matrices \item expanded \code{eig_gen()} and \code{eig_pair()} to optionally provide left and right eigenvectors } \item Switch Travis CI testing to R 4.0.0, use bionic as base distro and test R 3.6.3 and 4.0.0 in a matrix (Dirk in \ghpr{298}). \item Add two badges to README for indirect use and the CSDA paper. \item Adapt \code{RcppArmadillo.package.skeleton()} to a change in R 4.0.0 affecting what it exports in \code{NAMESPACE}. } } \section{Changes in RcppArmadillo version 0.9.880.1.0 (2020-05-15)}{ \itemize{ \item Upgraded to Armadillo release 9.880.1 (Roasted Mocha Detox) \itemize{ \item expanded \code{qr()} to optionally use pivoted decomposition \item updated physical constants to NIST 2018 CODATA values \item added \code{ARMA_DONT_USE_CXX11_MUTEX} confguration option to disable use of \code{std::mutex} } \item OpenMP capability is tested explicitly (Kevin Ushey and Dirk in \ghpr{294}, \ghpr{295}, and \ghpr{296} all fixing \ghit{290}). } } \section{Changes in RcppArmadillo version 0.9.870.2.0 (2020-04-24)}{ \itemize{ \item Upgraded to Armadillo release 9.870.2 (Roasted Mocha Retox) \itemize{ \item faster handling of matrix multiplication expressions by \code{diagvec()} and \code{diagmat()} \item added \code{trimatu_ind()} and \code{trimatl_ind()} \item more consistent detection of sparse vector expressions } } } \section{Changes in RcppArmadillo version 0.9.860.2.0 (2020-04-13)}{ \itemize{ \item Upgraded to Armadillo release 9.860.2 (Roasted Mocha Fix) \itemize{ \item added \code{powmat()} \item faster access to columns in sparse submatrix views \item faster handling of relational expressions by \code{accu()} \item faster handling of sympd matrices by \code{expmat()}, \code{logmat()}, \code{sqrtmat()} \item workaround for save/load issues with HDF5 v1.12 } \item Vignettes are now pre-made and include (\ghpr{285}) \item Two test files are now skipped on 32-bit Windows } } \section{Changes in RcppArmadillo version 0.9.850.1.0 (2020-02-09)}{ \itemize{ \item Upgraded to Armadillo release 9.850.1 (Pyrocumulus Wrath) \itemize{ \item faster handling of compound expressions by \code{diagmat()} \item expanded \code{.save()} and \code{.load()} to handle CSV files with headers via csv_name(filename,header) specification \item added \code{log_normpdf()} \item added \code{.is_zero()} \item added \code{quantile()} } \item The sparse matrix test using scipy, if available, is now simplified thanks to recently added \CRANpkg{reticulate} conversions. } } \section{Changes in RcppArmadillo version 0.9.800.4.0 (2020-01-24)}{ \itemize{ \item Upgraded to Armadillo release 9.800.4 (Horizon Scraper) \itemize{ \item fixes for incorrect type promotion in \code{normpdf()} } } } \section{Changes in RcppArmadillo version 0.9.800.3.0 (2019-12-04)}{ \itemize{ \item Upgraded to Armadillo release 9.800.3 (Horizon Scraper) \itemize{ \item fixes for matrix row iterators \item better detection of non-hermitian matrices by \code{eig_sym()}, \code{inv_sympd()}, \code{chol()}, \code{expmat_sym()} } \item The \code{sample} function passes the prob vector as const allowing subsequent calls (Christian Gunning in \ghpr{276} fixing \ghit{275}) } } \section{Changes in RcppArmadillo version 0.9.800.1.0 (2019-10-09)}{ \itemize{ \item Upgraded to Armadillo release 9.800 (Horizon Scraper) \itemize{ \item faster \code{solve()} in default operation; iterative refinement is no longer applied by default; use \code{solve_opts::refine} to explicitly enable refinement \item faster \code{expmat()} \item faster handling of triangular matrices by \code{rcond()} \item added \code{.front()} and \code{.back()} \item added \code{.is_trimatu()} and \code{.is_trimatl()} \item added \code{.is_diagmat()} } \item The package now uses \pkg{tinytest} for unit tests (Dirk in \ghpr{269}). \item The \code{configure.ac} script is now more careful about shell portability (Min Kim in \ghpr{270}). } } \section{Changes in RcppArmadillo version 0.9.700.2.0 (2019-09-01)}{ \itemize{ \item Upgraded to Armadillo release 9.700.2 (Gangster Democracy) \itemize{ \item faster handling of cubes by \code{vectorise()} \item faster faster handling of sparse matrices by \code{nonzeros()} \item faster row-wise \code{index_min()} and \code{index_max()} \item expanded \code{join_rows()} and \code{join_cols()} to handle joining up to 4 matrices \item expanded \code{.save()} and \code{.load()} to allow storing sparse matrices in CSV format \item added \code{randperm()} to generate a vector with random permutation of a sequence of integers } \item Expanded the list of known good \code{gcc} and \code{clang} versions in \code{configure.ac} } } \section{Changes in RcppArmadillo version 0.9.600.4.0 (2019-07-14)}{ \itemize{ \item Upgraded to Armadillo release 9.600.4 (Napa Invasion) \itemize{ \item faster handling of sparse submatrices \item faster handling of sparse diagonal views \item faster handling of sparse matrices by \code{symmatu()} and \code{symmatl()} \item faster handling of sparse matrices by \code{join_cols()} \item expanded \code{clamp()} to handle sparse matrices \item added \code{.clean()} to replace elements below a threshold with zeros } } } \section{Changes in RcppArmadillo version 0.9.500.2.0 (2019-06-11)}{ \itemize{ \item Upgraded to Armadillo release 9.500.2 (Riot Compact) \itemize{ \item Expanded \code{solve()} with \code{solve_opts::likely_sympd} to indicate that the given matrix is likely positive definite \item more robust automatic detection of positive definite matrices by \code{solve()} and \code{inv()} \item faster handling of sparse submatrices \item expanded \code{eigs_sym()} to print a warning if the given matrix is not symmetric \item extended LAPACK function prototypes to follow Fortran passing conventions for so-called "hidden arguments", in order to address GCC Bug 90329; to use previous LAPACK function prototypes without the "hidden arguments", \code{#define ARMA_DONT_USE_FORTRAN_HIDDEN_ARGS before #include } } } } \section{Changes in RcppArmadillo version 0.9.400.3.0 (2019-05-09)}{ \itemize{ \item Upgraded to Armadillo release 9.400.3 (Surrogate Miscreant) \itemize{ \item check for symmetric / hermitian matrices (used by decomposition functions) has been made more robust \item \code{linspace()} and \code{logspace()} now honour requests for generation of vectors with zero elements \item fix for vectorisation / flattening of complex sparse matrices } } } \section{Changes in RcppArmadillo version 0.9.400.2.0 (2019-04-28)}{ \itemize{ \item Upgraded to Armadillo release 9.400.2 (Surrogate Miscreant) \itemize{ \item faster \code{cov()} and \code{cor()} \item added \code{.as_col()} and \code{.as_row()} \item expanded \code{.shed_rows()} / \code{.shed_cols()} / \code{.shed_slices()} to remove rows/columns/slices specified in a vector \item expanded \code{vectorise()} to handle sparse matrices \item expanded element-wise versions of \code{max()} and \code{min()} to handle sparse matrices \item optimised handling of sparse matrix expressions: \code{sparse \% (sparse +- scalar)} and \code{sparse / (sparse +- scalar)} \item expanded \code{eig_sym()}, \code{chol()}, \code{expmat_sym()}, \code{logmat_sympd()}, \code{sqrtmat_sympd()}, \code{inv_sympd()} to print a warning if the given matrix is not symmetric \item more consistent detection of vector expressions } } } \section{Changes in RcppArmadillo version 0.9.300.2.0 (2019-03-21)}{ \itemize{ \item Upgraded to Armadillo release 9.300.2 (Fomo Spiral) \itemize{ \item Faster handling of compound complex matrix expressions by \code{trace()} \item More efficient handling of element access for inplace modifications in sparse matrices \item Added \code{.is_sympd()} to check whether a matrix is symmetric/hermitian positive definite \item Added \code{interp2()} for 2D data interpolation \item Added \code{expm1()} and \code{log1p()} \item Expanded \code{.is_sorted()} with options "strictascend" and "strictdescend" \item Expanded \code{eig_gen()} to optionally perform balancing prior to decomposition } } } \section{Changes in RcppArmadillo version 0.9.200.7.1 (2019-03-08)}{ \itemize{ \item Explicit setting of \code{RNGversion("3.5.0")} in one unit test to accomodate the change in \code{sample()} in R 3.6.0 \item Back-ported a fix to the Wishart RNG from upstream (Dirk in \ghpr{248} fixing \ghit{247}) } } \section{Changes in RcppArmadillo version 0.9.200.7.0 (2019-01-17)}{ \itemize{ \item Upgraded to Armadillo release 9.200.7 (Carpe Noctem) \item Fixes in 9.200.7 compared to 9.200.5: \itemize{ \item handling complex compound expressions by \code{trace()} \item handling \code{.rows()} and \code{.cols()} by the \code{Cube} class } } } \section{Changes in RcppArmadillo version 0.9.200.5.0 (2018-11-27)}{ \itemize{ \item Upgraded to Armadillo release 9.200.5 (Carpe Noctem) \item Changes in this release \itemize{ \item linking issue when using fixed size matrices and vectors \item faster handling of common cases by \code{princomp()} } } } \section{Changes in RcppArmadillo version 0.9.200.4.0 (2018-11-09)}{ \itemize{ \item Upgraded to Armadillo release 9.200.4 (Carpe Noctem) \itemize{ \item faster handling of symmetric positive definite matrices by \code{rcond()} \item faster transpose of matrices with size ≥ 512x512 \item faster handling of compound sparse matrix expressions by \code{accu()}, \code{diagmat()}, \code{trace()} \item faster handling of sparse matrices by \code{join_rows()} \item expanded \code{sign()} to handle scalar arguments \item expanded operators (\code{*}, \code{\%}, \code{+}, \code{−}) to handle sparse matrices with differing element types (eg. multiplication of complex matrix by real matrix) \item expanded \code{conv_to()} to allow conversion between sparse matrices with differing element types \item expanded \code{solve()} to optionally allow keeping solutions of systems singular to working precision \item workaround for \code{gcc} and \code{clang} bug in C++17 mode } \item Commented-out sparse matrix test consistently failing on the fedora-clang machine CRAN, and only there. No fix without access. \item The 'Unit test' vignette is no longer included. } } \section{Changes in RcppArmadillo version 0.9.100.5.0 (2018-08-16)}{ \itemize{ \item Upgraded to Armadillo release 9.100.4 (Armatus Ad Infinitum) \itemize{ \item faster handling of symmetric/hermitian positive definite matrices by \code{solve()} \item faster handling of \code{inv_sympd()} in compound expressions \item added \code{.is_symmetric()} \item added \code{.is_hermitian()} \item expanded \code{spsolve()} to optionally allow keeping solutions of systems singular to working precision \item new configuration options \code{ARMA_OPTIMISE_SOLVE_BAND} and \code{ARMA_OPTIMISE_SOLVE_SYMPD} smarter use of the element cache in sparse matrices \item smarter use of the element cache in sparse matrices } \item Aligned OpenMP flags in the RcppArmadillo.package.skeleton used Makevars{,.win} to not use one C and C++ flag. } } \section{Changes in RcppArmadillo version 0.8.600.0.0 (2018-06-28)}{ \itemize{ \item Upgraded to Armadillo release 8.600.0 (Sabretooth Rugrat) \itemize{ \item added \code{hess()} for Hessenberg decomposition \item added \code{.row()}, \code{.rows()}, \code{.col()}, \code{.cols()} to subcube views \item expanded \code{.shed_rows()} and \code{.shed_cols()} to handle cubes \item expanded \code{.insert_rows()} and \code{.insert_cols()} to handle cubes \item expanded subcube views to allow non-contiguous access to slices \item improved tuning of sparse matrix element access operators \item faster handling of tridiagonal matrices by \code{solve()} \item faster multiplication of matrices with differing element types when using OpenMP } } } \section{Changes in RcppArmadillo version 0.8.500.1.1 (2018-05-17) [GH only]}{ \itemize{ \item Upgraded to Armadillo release 8.500.1 (Caffeine Raider) \itemize{ \item bug fix for banded matricex } \item Added \code{slam} to Suggests: as it is used in two unit test functions [CRAN requests] \item The \code{RcppArmadillo.package.skeleton()} function now works with \code{example_code=FALSE} when \CRANpkg{pkgKitten} is present (Santiago Olivella in \ghpr{231} fixing \ghpr{229}) \item The LAPACK tests now cover band matrix solvers (Keith O'Hara in \ghpr{230}). } } \section{Changes in RcppArmadillo version 0.8.500.0 (2018-04-21)}{ \itemize{ \item Upgraded to Armadillo release 8.500 (Caffeine Raider) \itemize{ \item faster handling of sparse matrices by \code{kron()} and \code{repmat()} \item faster transpose of sparse matrices \item faster element access in sparse matrices \item faster row iterators for sparse matrices \item faster handling of compound expressions by \code{trace()} \item more efficient handling of aliasing in submatrix views \item expanded \code{normalise()} to handle sparse matrices \item expanded \code{.transform()} and \code{.for_each()} to handle sparse matrices \item added \code{reverse()} for reversing order of elements \item added \code{repelem()} for replicating elements \item added \code{roots()} for finding the roots of a polynomial } \item Fewer LAPACK compile-time guards are used, new unit tests for underlying features have been added (Keith O'Hara in \ghpr{211} addressing \ghit{207}). \item The configure check for LAPACK features has been updated accordingly (Keith O'Hara in \ghpr{214} addressing \ghit{213}). \item The compile-time check for \code{g++} is now more robust to minimal shell versions (\ghpr{217} addressing \ghit{216}). \item Compiler tests to were added for macOS (Keith O'Hara in \ghpr{219}). } } \section{Changes in RcppArmadillo version 0.8.400.0.0 (2018-02-19)}{ \itemize{ \item Upgraded to Armadillo release 8.400.0 (Entropy Bandit) \itemize{ \item faster handling of sparse matrices by \code{repmat()} \item faster loading of CSV files \item expanded \code{kron()} to handle sparse matrices \item expanded \code{index_min()} and \code{index_max()} to handle cubes \item expanded \code{randi()}, \code{randu()}, \code{randn()}, \code{randg()} to output single scalars \item added submatrix & subcube iterators \item added \code{normcdf()} \item added \code{mvnrnd()} \item added \code{chi2rnd()} \item added \code{wishrnd()} and \code{iwishrnd()} } \item The \code{configure} generated header settings for LAPACK and OpenMP can be overridden by the user. \item This release was preceded by two release candidates which were tested extensively. } } \section{Changes in RcppArmadillo version 0.8.300.1.0 (2017-12-04)}{ \itemize{ \item Upgraded to Armadillo release 8.300.1 (Tropical Shenanigans) \itemize{ \item faster handling of band matrices by \code{solve()} \item faster handling of band matrices by \code{chol()} \item faster \code{randg()} when using OpenMP \item added \code{normpdf()} \item expanded \code{.save()} to allow appending new datasets to existing HDF5 files } \item Includes changes made in several earlier GitHub-only releases (versions 0.8.300.0.0, 0.8.200.2.0 and 0.8.200.1.0). \item Conversion from \code{simple_triplet_matrix} is now supported (Serguei Sokol in \ghpr{192}). \item Updated configure code to check for g++ 5.4 or later to enable OpenMP. \item Updated the skeleton package to current packaging standards \item Suppress warnings from Armadillo about missing OpenMP support and \code{-fopenmp} flags by setting \code{ARMA_DONT_PRINT_OPENMP_WARNING} } } \section{Changes in RcppArmadillo version 0.8.100.1.0 (2017-10-10)}{ \itemize{ \item Upgraded to Armadillo release 8.100.1 (Feral Pursuits) \itemize{ \item faster incremental construction of sparse matrices via element access operators \item faster diagonal views in sparse matrices \item expanded \code{SpMat} to save/load sparse matrices in coord format \item expanded \code{.save()},\code{.load()} to allow specification of datasets within HDF5 files \item added \code{affmul()} to simplify application of affine transformations \item warnings and errors are now printed by default to the \code{std::cerr} stream \item added \code{set_cerr_stream()} and \code{get_cerr_stream()} to replace \code{set_stream_err1()}, \code{set_stream_err2()}, \code{get_stream_err1()}, \code{get_stream_err2()} \item new configuration options \code{ARMA_COUT_STREAM} and \code{ARMA_CERR_STREAM} } \item Constructors for sparse matrices of types \code{dgt}, \code{dtt} amd \code{dst} now use Armadillo code for improved performance (Serguei Sokol in \ghpr{175} addressing \ghit{173}) \item Sparse matrices call \code{.sync()} before accessing internal arrays (Binxiang Ni in \ghpr{171}) \item The sparse matrix vignette has been converted to Rmarkdown using the pinp package, and is now correctly indexed. (\ghpr{176}) } } \section{Changes in RcppArmadillo version 0.7.960.1.2 (2017-08-29)}{ \itemize{ \item On macOS, OpenMP support is now turned off (\ghpr{170}). \item The package is now compiling under the C++11 standard (\ghpr{170}). \item The vignette dependency are correctly set (James and Dirk in \ghpr{168} and \ghpr{169}) } } \section{Changes in RcppArmadillo version 0.7.960.1.1 (2017-08-20)}{ \itemize{ \item Added improved check for inherited S4 matrix classes (\ghpr{162} fixing \ghit{161}) \item Changed \code{fastLm} C++ function to \code{fastLm_impl} to not clash with R method (\ghpr{164} fixing \ghpr{163}) \item Added OpenMP check for \code{configure} (\ghpr{166} fixing \ghit{165}) } } \section{Changes in RcppArmadillo version 0.7.960.1.0 (2017-08-11)}{ \itemize{ \item Upgraded to Armadillo release 7.960.1 (Northern Banana Republic Deluxe) \itemize{ \item faster \code{randn()} when using OpenMP (NB: usually omitted when used fromR) \item faster \code{gmm_diag} class, for Gaussian mixture models with diagonal covariance matrices \item added \code{.sum_log_p()} to the \code{gmm_diag} class \item added \code{gmm_full} class, for Gaussian mixture models with full covariance matrices \item expanded \code{.each_slice()} to optionally use OpenMP for multi-threaded execution } \item Upgraded to Armadillo release 7.950.0 (Northern Banana Republic) \itemize{ \item expanded \code{accu()} and \code{sum()} to use OpenMP for processing expressions with computationally expensive element-wise functions \item expanded \code{trimatu()} and \code{trimatl()} to allow specification of the diagonal which delineates the boundary of the triangular part } \item Enhanced support for sparse matrices (Binxiang Ni as part of Google Summer of Code 2017) \itemize{ \item Add support for \code{dtCMatrix} and \code{dsCMatrix} (\ghpr{135}) \item Add conversion and unit tests for \code{dgT}, \code{dtT} and \code{dsTMatrix} (\ghpr{136}) \item Add conversion and unit tests for \code{dgR}, \code{dtR} and \code{dsRMatrix} (\ghpr{139}) \item Add conversion and unit tests for \code{pMatrix} and \code{ddiMatrix} (\ghpr{140}) \item Rewrite conversion for \code{dgT}, \code{dtT} and \code{dsTMatrix}, and add file-based tests (\ghpr{142}) \item Add conversion and unit tests for \code{indMatrix} (\ghpr{144}) \item Rewrite conversion for \code{ddiMatrix} (\ghpr{145}) \item Add a warning message for matrices that cannot be converted (\ghpr{147}) \item Add new vignette for sparse matrix support (\ghpr{152}; Dirk in \ghpr{153}) \item Add support for sparse matrix conversion from Python SciPy (\ghpr{158} addressing \ghit{141}) } \item Optional return of row or column vectors in collapsed form if appropriate \code{#define} is set (Serguei Sokol in \ghpr{151} and \ghpr{154}) \item Correct \code{speye()} for non-symmetric cases (Qiang Kou in \ghpr{150} closing \ghit{149}). \item Ensure tests using Scientific Python and reticulate are properly conditioned on the packages being present. \item Added \code{.aspell/} directory with small local directory now supported by R-devel. } } \section{Changes in RcppArmadillo version 0.7.900.2.0 (2017-06-02)}{ \itemize{ \item Upgraded to Armadillo release 7.900.2 (Evil Banana Republic) \itemize{ \item Expanded \code{clamp()} to handle cubes \item Computationally expensive element-wise functions (such as \code{exp()}, \code{log()}, \code{cos()}, etc) can now be automatically sped up via OpenMP; this requires a C++11/C++14 compiler with OpenMP 3.0+ support for GCC and clang compilers \item One caveat: when using GCC, use of \code{-march=native} in conjunction with \code{-fopenmp} may lead to speed regressions on recent processors } \item Added gcc 7 to support compiler check (James Balamuta in \ghpr{128} addressing \ghit{126}). \item A unit test helper function for \code{rmultinom} was corrected (\ghpr{133}). \item OpenMP support was added to the skeleton helper in \code{inline.R} } } \section{Changes in RcppArmadillo version 0.7.800.2.0 (2017-04-12)}{ \itemize{ \item Upgraded to Armadillo release 7.800.2 (Rogue State Redux) \itemize{ \item The Armadillo license changed to Apache License 2.0 } \item The \code{DESCRIPTION} file now mentions the Apache License 2.0, as well as the former MPL2 license used for earlier releases. \item A new file \code{init.c} was added with calls to \code{R_registerRoutines()} and \code{R_useDynamicSymbols()} \item Symbol registration is enabled in \code{useDynLib} \item The \code{fastLm} example was updated } } \section{Changes in RcppArmadillo version 0.7.700.0.0 (2017-02-07)}{ \itemize{ \item Upgraded to Armadillo release 7.700.0 (Rogue State) \itemize{ \item added \code{polyfit()} and \code{polyval()} \item added second form of \code{log_det()} to directly return the result as a complex number \item added \code{range()} to statistics functions \item expanded \code{trimatu()}/\code{trimatl()} and \code{symmatu()}/\code{symmatl()} to handle sparse matrice } } } \section{Changes in RcppArmadillo version 0.7.600.2.0 (2017-01-05)}{ \itemize{ \item Upgraded to Armadillo release 7.600.2 (Coup d'Etat Deluxe) \itemize{ \item Bug fix to memory allocation for \code{fields} } } } \section{Changes in RcppArmadillo version 0.7.600.1.0 (2016-12-16)}{ \itemize{ \item Upgraded to Armadillo release 7.600.1 (Coup d'Etat Deluxe) \itemize{ \item more accurate \code{eigs_sym()} and \code{eigs_gen()} \item expanded \code{floor()}, \code{ceil()}, \code{round()}, \code{trunc()}, \code{sign()} to handle sparse matrices \item added \code{arg()}, \code{atan2()}, \code{hypot()} } } } \section{Changes in RcppArmadillo version 0.7.500.1.0 (2016-11-11)}{ \itemize{ \item Upgraded to Armadillo release 7.500.1 \item Small improvement to return value treatment \item The \code{sample.h} extension was updated to the newer Armadillo interface. (Closes \ghit{111}) } } \section{Changes in RcppArmadillo version 0.7.500.0.0 (2016-10-20)}{ \itemize{ \item Upgraded to Armadillo release 7.500.0 (Coup d'Etat) \itemize{ \item Expanded \code{qz()} to optionally specify ordering of the Schur form \item Expanded \code{each_slice()} to support matrix multiplication } } } \section{Changes in RcppArmadillo version 0.7.400.2.0 (2016-08-24)}{ \itemize{ \item Upgraded to Armadillo release 7.400.2 (Feral Winter Deluxe) \itemize{ \item added \code{expmat_sym()}, \code{logmat_sympd()}, \code{sqrtmat_sympd()} \item added \code{.replace()} } } } \section{Changes in RcppArmadillo version 0.7.300.1.0 (2016-07-30)}{ \itemize{ \item Upgraded to Armadillo release 7.300.1 \itemize{ \item added \code{index_min()} and \code{index_max()} standalone functions \item expanded \code{.subvec()} to accept \code{size()} arguments \item more robust handling of non-square matrices by \code{lu()} } } } \section{Changes in RcppArmadillo version 0.7.200.2.0 (2016-07-22)}{ \itemize{ \item Upgraded to Armadillo release 7.200.2 \item The sampling extension was rewritten to use Armadillo vector types instead of Rcpp types (PR \ghpr{101} by James Balamuta) } } \section{Changes in RcppArmadillo version 0.7.200.1.0 (2016-06-06)}{ \itemize{ \item Upgraded to Armadillo release 7.200.1 \itemize{ \item added \code{.index_min()} and \code{.index_max()} \item expanded \code{ind2sub()} to handle vectors of indices \item expanded \code{sub2ind()} to handle matrix of subscripts \item expanded \code{expmat()}, \code{logmat()} and \code{sqrtmat()} to optionally return a bool indicating success \item faster handling of compound expressions by \code{vectorise()} } \item The \code{configure} code now (once again) sets the values for the LAPACK feature \code{#define} correctly. } } \section{Changes in RcppArmadillo version 0.7.100.3.0 (2016-05-25)}{ \itemize{ \item Upgraded to Armadillo test release 7.100.3 \itemize{ \item added \code{erf()}, \code{erfc()}, \code{lgamma()} \item added \code{.head_slices()} and \code{.tail_slices()} to subcube views \item \code{spsolve()} now requires SuperLU 5.2 \item \code{eigs_sym()}, \code{eigs_gen()} and \code{svds()} now use a built-in reimplementation of ARPACK for real (non-complex) matrices (code contributed by Yixuan Qiu) } \item The \code{configure} code now checks against old \code{g++} version which are no longer sufficient to build the package. } } \section{Changes in RcppArmadillo version 0.6.700.6.0 (2016-05-05)}{ \itemize{ \item Upgraded to Armadillo 6.700.6 (Catabolic Amalgamator Deluxe) \itemize{ \item fix for handling empty matrices by \code{kron()} \item fix for clang warning in advanced matrix constructors \item fix for false deprecated warning in \code{trunc_log()} and \code{trunc_exp()} \item fix for gcc-6.1 warning about misleading indentation \item corrected documentation for the \code{solve()} function } \item Added support for \code{int64_t} (\code{ARMA_64BIT_WORD}) when required during compilation time. (PR \ghpr{90} by George G. Vega Yon, fixing \ghpr{88}) \item Fixed bug in \code{SpMat} exporter (PR \ghpr{91} by George G. Vega Yon, fixing \ghit{89} and \ghit{72}) } } \section{Changes in RcppArmadillo version 0.6.700.3.0 (2016-04-05)}{ \itemize{ \item Upgraded to Armadillo 6.700.3 (Catabolic Amalgamator Deluxe) \itemize{ \item added \code{logmat()} for calcuating the matrix logarithm \item added \code{regspace()} for generating vectors with regularly spaced elements \item added \code{logspace()} for generating vectors with logarithmically spaced elements \item added \code{approx_equal()} for determining approximate equality \item added \code{trapz()} for numerical integration \item expanded \code{.save()} and \code{.load()} with hdf5_binary_trans file type, to save/load data with columns transposed to rows } } } \section{Changes in RcppArmadillo version 0.6.600.4.0 (2016-03-15)}{ \itemize{ \item Upgraded to Armadillo 6.600.4 (Catabolic Amalgamator) \itemize{ \item expanded \code{sum()}, \code{mean()}, \code{min()}, \code{max()} to handle cubes \item expanded \code{Cube} class to handle arbitrarily sized empty cubes (eg. 0x5x2) \item added \code{shift()} for circular shifts of elements \item added \code{sqrtmat()} for finding the square root of a matrix \item fix for \code{gmm_diag} when using Mahalanobis distance } \item The \code{configure} script now reflects the full LAPACK fallback offered by R 3.3.0 or later (PR \ghpr{81}) } } \section{Changes in RcppArmadillo version 0.6.500.4.0 (2016-01-26)}{ \itemize{ \item Upgraded to Armadillo 6.500.4 (Gourmet Electron Jumper) \itemize{ \item added \code{conv2()} for 2D convolution \item added stand-alone \code{kmeans()} function for clustering data \item added \code{trunc()} \item extended \code{conv()} to optionally provide central convolution \item faster handling of multiply-and-accumulate by \code{accu()} when using Intel MKL, ATLAS or OpenBLAS } \item The \code{configure} script now uses \code{#!/usr/bin/env bash} to cope with systems that do not have \code{#!/bin/bash} (PR \ghpr{75} fixing issue \ghpr{74}) \item RcppArmadillo now defines ARMA_32BIT_WORD to ensure we always use integer vectors that be passed to R } } \section{Changes in RcppArmadillo version 0.6.400.2.0 (2015-12-15)}{ \itemize{ \item Upgraded to Armadillo 6.400.2 ("Flying Spaghetti Monster Deluxe") \itemize{ \item expanded \code{each_col()}, \code{each_row()} and \code{each_slice()} to handle C++11 lambda functions \item added \code{ind2sub()} and \code{sub2ind()} \item fixes for corner cases in gmm_diag class } } } \section{Changes in RcppArmadillo version 0.6.300.2.2 (2015-12-12)}{ \itemize{ \item Upgraded to Armadillo 6.300.3-test ("Flying Spaghetti Monster") \itemize{ \item Additional test in \code{auxlib_meat.hpp} for limited LAPACK } \item Updated test and \code{#define} for limited LAPACK version R might be built with on Unix-alike systems } } \section{Changes in RcppArmadillo version 0.6.300.2.0 (2015-12-03)}{ \itemize{ \item Upgraded to Armadillo 6.300.2 ("Flying Spaghetti Monster") \itemize{ \item expanded \code{solve()} to find approximate solutions for rank-deficient systems \item faster handling of non-contiguous submatrix views in compound expressions \item added \code{.for_each()} to Mat, Row, Col, Cube and field classes \item added \code{rcond()} for estimating the reciprocal condition number \item fixes for \code{spsolve()}, \code{eigs_sym()}, \code{eigs_gen()}, \code{svds()} } \item Added support for \code{Cube} types via \code{as<>} converters (PR \ghpr{64} by Nathan Russell, fixing \ghit{63} and \ghit{42}) } } \section{Changes in RcppArmadillo version 0.6.200.2.0 (2015-10-31)}{ \itemize{ \item Upgraded to Armadillo 6.200.0 ("Midnight Blue Deluxe") \itemize{ \item expanded \code{diagmat()} to handle non-square matrices and arbitrary diagonals \item expanded \code{trace()} to handle non-square matrices } } } \section{Changes in RcppArmadillo version 0.6.100.0.0 (2015-10-03)}{ \itemize{ \item Upgraded to Armadillo 6.100.0 ("Midnight Blue") \itemize{ \item faster \code{norm()} and \code{normalise()} when using ATLAS or OpenBLAS \item added Schur decomposition: \code{schur()} \item stricter handling of matrix objects by \code{hist()} and \code{histc()} \item advanced constructors for using auxiliary memory by Mat, Col, Row and Cube now have the default of \emph{strict = false} \item Cube class now delays allocation of .slice() related structures until needed \item expanded \code{join_slices()} to handle joining cubes with matrices } } } \section{Changes in RcppArmadillo version 0.6.000.1.0 (2015-09-25)}{ \itemize{ \item Upgraded to Armadillo test / bug-fix release 0.6.000.1-test \item Non-CRAN release } } \section{Changes in RcppArmadillo version 0.5.600.2.0 (2015-09-19)}{ \itemize{ \item Upgraded to Armadillo 5.600.2 ("Molotov Cocktail Deluxe") \itemize{ \item expanded \code{.each_col()} and \code{.each_row()} to handle out-of-place operations \item added \code{.each_slice()} for repeated matrix operations on each slice of a cube \item faster handling of compound expressions by \code{join_rows()} and \code{join_cols()} } } } \section{Changes in RcppArmadillo version 0.5.500.2.0 (2015-09-03)}{ \itemize{ \item Upgraded to Armadillo 5.500.2 ("Molotov Cocktail") \itemize{ \item expanded object constructors and generators to handle \code{size()} based specification of dimensions \item faster handling of submatrix rows \item faster \code{clamp()} \item fixes for handling sparse matrices } } } \section{Changes in RcppArmadillo version 0.5.400.2.0 (2015-08-17)}{ \itemize{ \item Upgraded to Armadillo 5.400.2 ("Plutocracy Incorporated Deluxe") \itemize{ \item added \code{find_unique()} for finding indices of unique values \item added \code{diff()} for calculating differences between consecutive elements \item added \code{cumprod()} for calculating cumulative product \item added \code{null()} for finding the orthonormal basis of null space \item expanded \code{interp1()} to handle repeated locations \item expanded \code{unique()} to handle complex numbers \item faster \code{flupud()} \item faster row-wise \code{cumsum()} \item fix for k-means clustering in gmm_diag class } \item corrected use of \code{kitten()} thanks to Grant Brown } } \section{Changes in RcppArmadillo version 0.5.300.4 (2015-08-03)}{ \itemize{ \item Upgraded to Armadillo 5.300.4 ("Plutocrazy Incorporated") \itemize{ \item added generalised Schur decomposition: \code{qz()} \item added \code{.has_inf()} and \code{.has_nan()} \item expanded \code{interp1()} to handle out-of-domain locations \item expanded sparse matrix class with \code{.set_imag()} and \code{.set_real()} \item expanded \code{imag()}, \code{real()} and \code{conj()} to handle sparse matrices \item expanded \code{diagmat()}, \code{reshape()} and \code{resize()} to handle sparse matrices \item faster sparse \code{sum()} \item faster row-wise \code{sum()}, \code{mean()}, \code{min()}, \code{max()} \item updated physical constants to NIST 2014 CODATA values \item fixes for handling sparse submatrix views \item Armadillo can make use of GPUs by linking with NVIDIA NVBLAS (a GPU-accelerated implementation of BLAS), or by linking with AMD ACML (which can use GPUs via OpenCL) } \item Added \code{importFrom} statements for R functions not from base \item Added explicit \code{Rcpp::sourceCpp()} reference as well \item Updated one formatting detail in vignette to please TeXlive2015 } } \section{Changes in RcppArmadillo version 0.5.200.1.0 (2015-06-04)}{ \itemize{ \item Upgraded to Armadillo release 5.200.1 ("Boston Tea Smuggler") \itemize{ \item added \code{orth()} for finding the orthonormal basis of the range space of a matrix \item expanded element initialisation to handle nested initialiser lists (C++11) \item workarounds for bugs in GCC, Intel and MSVC C++ compilers } \item Added another example to \code{inst/examples/fastLm.r} } } \section{Changes in RcppArmadillo version 0.5.100.2.0 (2015-05-12)}{ \itemize{ \item Upgraded to Armadillo test / bug-fix release 5.100.2 \item Non-CRAN release } } \section{Changes in RcppArmadillo version 0.5.100.1.0 (2015-05-01)}{ \itemize{ \item Upgraded to Armadillo release 5.100.1 ("Ankle Biter Deluxe") \itemize{ \item added \code{interp1()} for 1D interpolation \item added \code{.is_sorted()} for checking whether a vector or matrix has sorted elements \item updated physical constants to NIST 2010 CODATA values } } } \section{Changes in RcppArmadillo version 0.5.000.0 (2015-04-12)}{ \itemize{ \item Upgraded to Armadillo release Version 5.000 ("Ankle Biter") \itemize{ \item added \code{spsolve()} for solving sparse systems of linear equations \item added \code{svds()} for singular value decomposition of sparse matrices \item added \code{nonzeros()} for extracting non-zero values from matrices \item added handling of diagonal views by sparse matrices \item expanded \code{repmat()} to handle sparse matrices \item expanded \code{join_rows()} and \code{join_cols()} to handle sparse matrices \item \code{sort_index()} and \code{stable_sort_index()} have been placed in the delayed operations framework for increased efficiency \item use of 64 bit integers is automatically enabled when using a C++11 compiler \item workaround for a bug in recent releases of Apple Xcode \item workaround for a bug in LAPACK 3.5 } } } \section{Changes in RcppArmadillo version 0.4.999.1.0 (2015-04-04)}{ \itemize{ \item Upgraded to Armadillo release preview 4.999.1 \item Non-CRAN test release } } \section{Changes in RcppArmadillo version 0.4.650.1.1 (2015-02-25)}{ \itemize{ \item Upgraded to Armadillo release Version 4.650.1 ("Intravenous Caffeine Injector") \itemize{ \item added \code{randg()} for generating random values from gamma distributions (C++11 only) \item added \code{.head_rows()} and \code{.tail_rows()} to submatrix views \item added \code{.head_cols()} and \code{.tail_cols()} to submatrix views \item expanded \code{eigs_sym()} to optionally calculate eigenvalues with smallest/largest algebraic values fixes for handling of sparse matrices } \item Applied small correction to main header file to set up C++11 RNG whether or not the alternate RNG (based on R, our default) is used } } \section{Changes in RcppArmadillo version 0.4.600.4.0 (2015-01-23)}{ \itemize{ \item Upgraded to Armadillo release Version 4.600.4 (still "Off The Reservation") \itemize{ \item Speedups in the transpose operation \item Small bug fixes } } } \section{Changes in RcppArmadillo version 0.4.600.0 (2014-12-27)}{ \itemize{ \item Upgraded to Armadillo release Version 4.600 ("Singapore Sling Deluxe") \itemize{ \item added \code{.head()} and \code{.tail()} to submatrix views \item faster matrix transposes within compound expressions \item faster \code{accu()} and \code{norm()} when compiling with -O3 -ffast-math -march=native (gcc and clang) \item workaround for a bug in GCC 4.4 } } } \section{Changes in RcppArmadillo version 0.4.550.2.0 (2014-12-02)}{ \itemize{ \item Upgraded to Armadillo release Version 4.550.2 ("Singapore Sling Deluxe") \itemize{ \item Bug fixes for implicit template initiation for \code{std::pow()} seen with the old g++ 4.4* series } } } \section{Changes in RcppArmadillo version 0.4.550.1.0 (2014-11-26)}{ \itemize{ \item Upgraded to Armadillo release Version 4.550.1 ("Singapore Sling Deluxe") \itemize{ \item added matrix exponential function: \code{expmat()} \item faster \code{.log_p()} and \code{.avg_log_p()} functions in the \code{gmm_diag} class when compiling with OpenMP enabled \item faster handling of in-place addition/subtraction of expressions with an outer product \item applied correction to \code{gmm_diag} relative to the 4.550 release } \item The Armadillo Field type is now converted in \code{as<>} conversions } } \section{Changes in RcppArmadillo version 0.4.500.0 (2014-10-30)}{ \itemize{ \item Upgraded to Armadillo release Version 4.500 ("Singapore Sling") \itemize{ \item faster handling of complex vectors by \code{norm()} \item expanded \code{chol()} to optionally specify output matrix as upper or lower triangular \item better handling of non-finite values when saving matrices as text files } \item The \code{sample} functionality has been extended to provide the Walker Alias method (including new unit tests) via a pull request by Christian Gunning } } \section{Changes in RcppArmadillo version 0.4.450.1.0 (2014-09-21)}{ \itemize{ \item Upgraded to Armadillo release Version 4.450.1 (Spring Hill Fort) \itemize{ \item faster handling of matrix transposes within compound expressions \item expanded \code{symmatu()}/\code{symmatl()} to optionally disable taking the complex conjugate of elements \item expanded \code{sort_index()} to handle complex vectors \item expanded the \code{gmm_diag} class with functions to generate random samples } \item A new random-number implementation for Armadillo uses the RNG from R as a fallback (when C++11 is not selected so the C++11-based RNG is unavailable) which avoids using the older C++98-based \code{std::rand} \item The \code{RcppArmadillo.package.skeleton()} function was updated to only set an "Imports:" for Rcpp, but not RcppArmadillo which (as a template library) needs only LinkingTo: \item The \code{RcppArmadillo.package.skeleton()} function will now prefer \code{pkgKitten::kitten()} over \code{package.skeleton()} in order to create a working package which passes \code{R CMD check}. \item The \CRANpkg{pkgKitten} package is now a \code{Suggests:} \item A manual page was added to provide documentation for the functions provided by the skeleton package. \item A small update was made to the package manual page. } } \section{Changes in RcppArmadillo version 0.4.400.0 (2014-08-19)}{ \itemize{ \item Upgraded to Armadillo release Version 4.400 (Winter Shark Alley) \itemize{ \item added \code{gmm_diag} class for statistical modelling using Gaussian Mixture Models; includes multi-threaded implementation of k-means and Expectation-Maximisation for parameter estimation \item added \code{clamp()} for clamping values to be between lower and upper limits \item expanded batch insertion constructors for sparse matrices to add values at repeated locations \item faster handling of subvectors by \code{dot()} \item faster handling of aliasing by submatrix views } \item Corrected a bug (found by the g++ Address Sanitizer) in sparse matrix initialization where space for a sentinel was allocated, but the sentinel was not set; with extra thanks to Ryan Curtin for help \item Added a few unit tests for sparse matrices } } \section{Changes in RcppArmadillo version 0.4.320.0 (2014-07-03)}{ \itemize{ \item Upgraded to Armadillo release Version 4.320 (Daintree Tea Raider) \itemize{ \item expanded \code{eigs_sym()} and \code{eigs_gen()} to use an optional tolerance parameter \item expanded \code{eig_sym()} to automatically fall back to standard decomposition method if divide-and-conquer fails \item automatic installer enables use of C++11 random number generator when using gcc 4.8.3+ in C++11 mode } } } \section{Changes in RcppArmadillo version 0.4.300.8.0 (2014-05-31)}{ \itemize{ \item Upgraded to Armadillo release Version 4.300.8 (Medieval Cornea Scraper) \itemize{ \item More robust \code{norm}-related functions \item Fixes between interactions between \code{cube} and \code{vector} types. } \item Adds a \code{#define ARMA_DONT_USE_CXX11} to provide an option to turn C++11 off for Armadillo (but client packages may still use it) \item More robust Windows detection by using \code{_WIN32} as well as \code{WIN32} as the latter gets diabled by MinGW with C++11 \item On Windows, C++11 is turned off as the Armadillo code base uses more features of C++11 than g++ 4.6.2 version in Rtools implements } } \section{Changes in RcppArmadillo version 0.4.300.5.0 (2014-05-19)}{ \itemize{ \item Upgraded to Armadillo release Version 4.300.5 (Medieval Cornea Scraper) \itemize{ \item Handle possible underflows and overflows in \code{norm()}, \code{normalise()}, \code{norm_dot()} \item Fix for handling of null vectors by \code{norm_dot()} } } } \section{Changes in RcppArmadillo version 0.4.300.2.0 (2014-05-13)}{ \itemize{ \item Upgraded to Armadillo release Version 4.300.2 (Medieval Cornea Scraper) \itemize{ \item faster \code{find()} } } } \section{Changes in RcppArmadillo version 0.4.300.0 (2014-05-04)}{ \itemize{ \item Upgraded to Armadillo release Version 4.300 (Medieval Cornea Scraper) \itemize{ \item faster \code{find()} \item added \code{find_finite()} and \code{find_nonfinite()} for finding indices of finite and non-finite elements \item expressions \code{X=inv(A)*B*C} and \code{X=A.i()*B*C} are automatically converted to X=solve(A,B*C) } \item Corrected conversion to \code{unsigned int} vectors and matrices \item Configure script now checks for R version 3.0.3 or newer to enable complex divide-and-conquer SVD in case of R-supplied LAPACK } } \section{Changes in RcppArmadillo version 0.4.200.0 (2014-04-07)}{ \itemize{ \item Upgraded to Armadillo release Version 4.200 (Flintlock Swoop) \itemize{ \item faster transpose of sparse matrices \item more efficient handling of aliasing during matrix multiplication \item faster inverse of matrices marked as diagonal } } } \section{Changes in RcppArmadillo version 0.4.100.2 (2014-03-07)}{ \itemize{ \item Upgraded to Armadillo release Version 4.100.2 \itemize{ \item fix for handling null vectors by \code{normalise()} \item fix for memory handling by sparse matrices } \item Correct use of \code{[[ depends()]]} in skeleton example file \item Prepare \code{src/Makevars} for C++11 support from R 3.1.0 by defining \code{USE_CXX11} which is currently commented out \item In the Armadillo configuration, turn on C++11 support if \code{USE_CXX11} is defined } } \section{Changes in RcppArmadillo version 0.4.100.0 (2014-02-28)}{ \itemize{ \item Upgraded to Armadillo release Version 4.100.0 (Dirt Cruiser) \itemize{ \item added \code{normalise()} for normalising vectors to unit p-norm \item extended the \code{field} class to handle 3D layout \item extended \code{eigs_sym()} and \code{eigs_gen()} to obtain eigenvalues of various forms (eg. largest or smallest magnitude) \item automatic SIMD vectorisation of elementary expressions (eg. matrix addition) when using Clang 3.4+ with -O3 optimisation \item faster handling of sparse submatrix views \item workaround for a bug in LAPACK 3.4 } } } \section{Changes in RcppArmadillo version 0.4.000.4 (2014-02-19)}{ \itemize{ \item Upgraded to Armadillo release Version 4.000.4 \itemize{ \item fix for \code{randi()} generating out-of-interval values \item fix for saving field objects \item workaround for a bug in the Intel compiler } \item Updated for \CRANpkg{Rcpp} (>= 0.11.0) by removing linking step from build process, added appropriate dependency on \CRANpkg{Rcpp} \item Updated \code{RcppArmadillo.package.skeleton} function accordingly to use proper \code{NAMESPACE} import \item Rewritten \code{rcpparma_hello_world} (which is used by the \code{RcppArmadillo.package.skeleton} function) to use Rcpp Attributes, and added more examples \item Added two functions to set Armadillo's RNGs (ie the system RNG) from a given value and to randomize it, as suggested by Gábor Csárdi. Note that these do not work within RStudio (which itself also uses the same system RNG). } } \section{Changes in RcppArmadillo version 0.4.000.2 (2014-01-21)}{ \itemize{ \item Upgraded to Armadillo release Version 4.000.2 \itemize{ \item fix for \code{randi()} generating out-of-interval values \item workaround for a bug in the Intel compiler } } } \section{Changes in RcppArmadillo version 0.4.000 (2014-01-05)}{ \itemize{ \item Upgraded to Armadillo release Version 4.000 (Feral Steamroller) \itemize{ \item added eigen decompositions of sparse matrices: \code{eigs_sym()} and \code{eigs_gen()} [ but this requires linking against ARPACK which \CRANpkg{RcppArmadillo} as a pure-template package does not do, and R is not linked against ARPACK either. ] \item added eigen decomposition for pair of matrices: \code{eig_pair()} \item added simpler forms of \code{eig_gen()} \item added condition number of matrices: \code{cond()} \item expanded \code{find()} to handle cubes \item expanded subcube views to access elements specified in a vector \item template argument for \code{running_stat_vec} expanded to accept vector types \item more robust fast inverse of 4x4 matrices \item faster divide-and-conquer decompositions are now used by default for \code{eig_sym()}, \code{pinv()}, \code{princomp()}, \code{rank()}, \code{svd()}, \code{svd_econ()} \item the form \code{inv(sympd(X))} no longer assumes that X is positive definite; use \code{inv_sympd()} instead \item added MEX connector for interfacing Octave/Matlab with Armadillo matrices (contributed by George Yammine) } } } \section{Changes in RcppArmadillo version 0.3.930.1 (2013-12-09)}{ \itemize{ \item Upgraded to Armadillo release Version 3.930.1 \itemize{ \item Armadillo falls back to standard complex svd if the more performant divide-and-conquer variant is unavailable } \item Added detection for Lapack library and distinguish between R's own version (withhout zgesdd) and system Lapack; a preprocessor define is set accordingly } } \section{Changes in RcppArmadillo version 0.3.930.0 (2013-12-06)}{ \itemize{ \item Upgraded to Armadillo release Version 3.930 ("Dragon's Back") \itemize{ \item added divide-and-conquer variant of \code{svd_econ()}, for faster SVD \item added divide-and-conquer variant of \code{pinv()}, for faster pseudo-inverse \item added element-wise variants of \code{min()} and \code{max()} \item added \code{size()} based specifications of submatrix view sizes \item added \code{randi()} for generating matrices with random integer values \item added more intuitive specification of sort direction in \code{sort()} and \code{sort_index()} \item added more intuitive specification of method in \code{det()}, \code{.i()}, \code{inv()} and \code{solve()} \item added more precise timer for the \code{wall_clock} class when using C++11 } \item New unit tests for complex matrices and vectors } } \section{Changes in RcppArmadillo version 0.3.920.3 (2013-11-20)}{ \itemize{ \item Upgraded to Armadillo release Version 3.920.3 \itemize{ \item fix for handling of tiny matrices by \code{.swap()} } } } \section{Changes in RcppArmadillo version 0.3.920.1 (2013-09-27)}{ \itemize{ \item Upgraded to Armadillo release Version 3.920.1 (Agencia Nacional Stasi) \itemize{ \item faster \code{.zeros()} \item faster \code{round()}, \code{exp2()} and \code{log2()} when using C++11 \item added signum function: \code{sign()} \item added move constructors when using C++11 \item added 2D fast Fourier transform: \code{fft2()} \item added \code{.tube()} for easier extraction of vectors and subcubes from cubes \item added specification of a fill type during construction of Mat, Col, Row and Cube classes, eg. \code{mat X(4, 5, fill::zeros)} } \item Initial implementation of \code{wrap} \item Improved implementation of \code{as<>()} and \code{wrap()} for sparse matrices \item Converted main vignette from \code{LaTeX} style \code{minted} to \code{lstlisting} which permits builds on CRAN; removed set \code{BuildVignettes: FALSE}. } } \section{Changes in RcppArmadillo version 0.3.910.0 (2013-08-12)}{ \itemize{ \item Upgraded to Armadillo release Version 3.910.0 (Pyrenees) \itemize{ \item faster multiplication of a matrix with a transpose of itself, ie. \code{X*X.t()} and \code{X.t()*X} \item added \code{vectorise()} for reshaping matrices into vectors \item added \code{all()} and \code{any()} for indicating presence of elements satisfying a relational condition } \item Added conversion support for sparse matrices (of type double) created by the \CRANpkg{Matrix} package as class \code{dgCMatrix} \item Moved vignette sources from \code{inst/doc} to \code{vignettes}; set \code{BuildVignettes: FALSE} as the \code{minted} mode for \code{LaTeX} upsets the CRAN builders. } } \section{Changes in RcppArmadillo version 0.3.900.7 (2013-08-02)}{ \itemize{ \item Upgraded to Armadillo release Version 3.900.7 (Bavarian Sunflower) \itemize{ \item minor fix for inplace \code{reshape()} \item minor corrections for compilation issues under GCC 4.8+ and MSVC } \item Corrected setting of \code{vec_stats} in intialization of row, vector and matrix objects \item The \pkg{inline} package is no longer used in the examples and unit tests which have all been converted to using Rcpp attributes } } \section{Changes in RcppArmadillo version 0.3.900 (2013-06-04)}{ \itemize{ \item Upgraded to Armadillo release Version 3.900.0 (Bavarian Sunflower) \itemize{ \item added automatic SSE2 vectorisation of elementary expressions (eg. matrix addition) when using GCC 4.7+ with -O3 optimisation \item added support for saving & loading of cubes in HDF5 format, contributed by Szabolcs Horvat \item faster \code{median()}, contributed by Ruslan Shestopalyuk \item faster handling of compound expressions with transposes of submatrix rows \item faster handling of compound expressions with transposes of complex vectors } \item Kalman filter example switched from inline to \code{sourceCpp}, which simplifies / streamlines the C++ side a little } } \section{Changes in RcppArmadillo version 0.3.820 (2013-05-12)}{ \itemize{ \item Upgraded to Armadillo release Version 3.820 (Mt Cootha) \itemize{ \item faster \code{as_scalar()} for compound expressions \item faster transpose of small vectors \item faster matrix-vector product for small vectors \item faster multiplication of small fixed size matrices } } } \section{Changes in RcppArmadillo version 0.3.810.2 (2013-04-30)}{ \itemize{ \item Upgraded to Armadillo release Version 3.810.2 \itemize{ \item minor fix for initialisation of sparse matrices } } } \section{Changes in RcppArmadillo version 0.3.810.0 (2013-04-19)}{ \itemize{ \item Upgraded to Armadillo release Version 3.810.0 (Newell Highway) \itemize{ \item added fast Fourier transform: \code{fft()} \item added handling of \code{.imbue()} and \code{.transform()} by submatrices and subcubes \item added batch insertion constructors for sparse matrices \item minor fix for multiplication of complex sparse matrices } \item Updated sample() function and test again contributed by Christian Gunning } } \section{Changes in RcppArmadillo version 0.3.800.1 (2013-03-12)}{ \itemize{ \item Upgraded to Armadillo release Version 3.800.1 (Miami Beach) \itemize{ \item workaround for a bug in ATLAS 3.8 on 64 bit systems \item faster matrix-vector multiply for small matrices } \item Added new sample() function and tests contributed by Christian Gunning \item Refactored unit testing code for faster unit test performance } } \section{Changes in RcppArmadillo version 0.3.800.0 (2013-03-01)}{ \itemize{ \item Upgraded to Armadillo release Version 3.800.0 (Miami Beach) \itemize{ \item Armadillo is now licensed using the Mozilla Public License 2.0 \item added \code{.imbue()} for filling a matrix/cube with values provided by a functor or lambda expression \item added \code{.swap()} for swapping contents with another matrix \item added \code{.transform()} for transforming a matrix/cube using a functor or lambda expression \item added \code{round()} for rounding matrix elements towards nearest integer \item faster \code{find()} \item fixes for handling non-square matrices by \code{qr()} and \code{qr_econ()} \item minor fixes for handling empty matrices \item reduction of pedantic compiler warnings } \item Updated vignette to paper now in press at CSDA \item Added CITATION file with reference to CSDA paper } } \section{Changes in RcppArmadillo version 0.3.6.3 (2013-02-20)}{ \itemize{ \item Upgraded to Armadillo release Version 3.6.3 \itemize{ \item faster \code{find()} \item minor fix for non-contiguous submatrix views to handle empty vectors of indices \item reduction of pedantic compiler warnings } } } \section{Changes in RcppArmadillo version 0.3.6.2 (2013-01-29)}{ \itemize{ \item Upgraded to Armadillo release Version 3.6.2 \itemize{ \item faster determinant for matrices marked as diagonal or triangular \item more fine-grained handling of 64 bit integers } \item Added a new example of a Kalman filter implementation in R, and C++ using Armadillo via RcppArmadillo, complete with timing comparison } } \section{Changes in RcppArmadillo version 0.3.6.1 (2012-12-17)}{ \itemize{ \item Upgraded to Armadillo release Version 3.6.1 (Piazza del Duomo) \itemize{ \item faster \code{trace()} \item fix for handling sparse matrices by \code{dot()} \item fixes for interactions between sparse and dense matrices } \item Now throws compiler error if \code{Rcpp.h} is included before \code{RcppArmadillo.h} (as the former is included automatically by the latter anyway, but template logic prefers this ordering). } } \section{Changes in RcppArmadillo version 0.3.4.3 (2012-10-04)}{ \itemize{ \item Upgraded to Armadillo release 3.4.3 \itemize{ \item fix for aliasing issue in \code{diagmat()} \item fix for \code{speye()} signature } } } \section{Changes in RcppArmadillo version 0.3.4.2 (2012-09-25)}{ \itemize{ \item Upgraded to Armadillo release 3.4.2 \itemize{ \item minor fixes for handling sparse submatrix views \item minor speedups for sparse matrices } } } \section{Changes in RcppArmadillo version 0.3.4.1 (2012-09-18)}{ \itemize{ \item Upgraded to Armadillo release 3.4.1 \itemize{ \item workaround for a bug in the Mac OS X accelerate framework \item fixes for handling empty sparse matrices \item added documentation for saving & loading matrices in HDF5 format \item faster dot() and cdot() for complex numbers } } } \section{Changes in RcppArmadillo version 0.3.4.0 (2012-09-06)}{ \itemize{ \item Upgraded to Armadillo release 3.4.0 (Ku De Ta) \itemize{ \item added economical QR decomposition: qr_econ() \item added .each_col() & .each_row() for vector operations repeated on each column or row \item added preliminary support for sparse matrices, contributed by Ryan Curtin et al. (Georgia Institute of Technology) \item faster singular value decomposition via divide-and-conquer algorithm \item faster .randn() } \item NEWS file converted to Rd format } } \section{Changes in RcppArmadillo version 0.3.3.91 (2012-08-30)}{ \itemize{ \item Upgraded to Armadillo release 3.3.91 \itemize{ \item faster singular value decomposition via "divide and conquer" algorithm \item added economical QR decomposition: qr_econ() \item added .each_col() & .each_row() for vector operations repeated on each column or row \item added preliminary support for sparse matrices, contributed by Ryan Curtin, James Cline and Matthew Amidon (Georgia Institute of Technology) } \item Corrected summary method to deal with the no intercept case when using a formula; also display residual summary() statistics \item Expanded unit tests for fastLm } } \section{Changes in RcppArmadillo version 0.3.2.4 (2012-07-11)}{ \itemize{ \item Upgraded to Armadillo release 3.2.4 \itemize{ \item workaround for a regression (bug) in GCC 4.7.0 and 4.7.1 } } } \section{Changes in RcppArmadillo version 0.3.2.3 (2012-07-01)}{ \itemize{ \item Upgraded to Armadillo release 3.2.3 \itemize{ \item minor correction for declaration of fixed size vectors and matrices \item Reverted three header files \{Mat,Row,Col\}_bones.hpp back to previous release due to compilation failures under g++-4.7 \item Added new vignette 'RcppArmadillo-intro' based on a just-submitted introductory paper (by Eddelbuettel and Sanderson) about RcppArmadillo \item Change from release 3.2.2 which we skipped as it did not really affect builds under R: \itemize{ \item minor fix for compiling without debugging enabled (aka release mode) \item better detection of ATLAS during installation on Fedora and Red Hat systems } \item Small enhancement to fastLm } } } \section{Changes in RcppArmadillo version 0.3.2.0 (2012-05-21)}{ \itemize{ \item Upgraded to Armadillo release 3.2.0 "Creamfields" \itemize{ \item faster eigen decomposition via "divide and conquer" algorithm \item faster transpose of vectors and compound expressions \item faster handling of diagonal views \item faster handling of tiny fixed size vectors (≤ 4 elements) \item added unique(), for finding unique elements of a matrix } } } \section{Changes in RcppArmadillo version 0.3.1.94 (2012-05-15)}{ \itemize{ \item Upgraded to Armadillo release 3.1.94 "v3.2 beta 2" \itemize{ \item added unique(), for finding unique elements of a matrix \item faster eigen decomposition via "divide and conquer" algorithm \item faster transpose of vectors and compound expressions \item faster handling of tiny fixed size vectors (≤ 4 elements) } } } \section{Changes in RcppArmadillo version 0.3.1.92 (2012-05-10)}{ \itemize{ \item Upgraded to Armadillo release 3.1.92 "v3.2 beta 2" \itemize{ \item added unique(), for finding unique elements of a matrix \item faster eigen decomposition via optional use of "divide and conquer" by eig_sym() \item faster transpose of vectors and compound expressions } } } \section{Changes in RcppArmadillo version 0.3.0.3 (2012-05-03)}{ \itemize{ \item Upgraded to Armadillo release 3.0.3 \itemize{ \item fixes for inplace transpose of complex number matrices \item fixes for complex number version of svd_econ() \item fixes for potential aliasing issues with submatrix views } \item New example script fastLm } } \section{Changes in RcppArmadillo version 0.3.0.2 (2012-04-19)}{ \itemize{ \item Upgraded to Armadillo release 3.0.2 \itemize{ \item fixes for handling diagonal matrices } \item Undefine NDEBUG if it has been set (as R does) as this prevents a number of useful debugging checks. Users can still define it or define ARMA_NO_DEBUG if they want a 'non-development' build } } \section{Changes in RcppArmadillo version 0.3.0.1 (2012-04-12)}{ \itemize{ \item Upgraded to Armadillo release 3.0.1 \itemize{ \item fixes for compilation errors \item fixes for potential aliasing issues } } } \section{Changes in RcppArmadillo version 0.3.0 (2012-04-10)}{ \itemize{ \item Upgraded to Armadillo release 3.0.0 "Antarctic Chilli Ranch" \itemize{ \item added non-contiguous submatrix views \item added shorthand for inverse: .i() \item added hist() and histc() \item faster repmat() \item faster handling of submatrix views with one row or column \item faster generation of random numbers \item faster element access in fixed size matrices \item better detection of vector expressions by sum(), cumsum(), prod(), min(), max(), mean(), median(), stddev(), var() \item expressions X=A.i()*B and X=inv(A)*B are automatically converted to X=solve(A,B) } } } \section{Changes in RcppArmadillo version 0.2.40 (2012-04-04)}{ \itemize{ \item Upgraded to Armadillo release 2.99.4 "Antarctic Chilli Ranch (Beta 4)" \itemize{ \item fixes for handling expressions with fixed size matrices } } } \section{Changes in RcppArmadillo version 0.2.39 (2012-04-02)}{ \itemize{ \item Upgraded to Armadillo release 2.99.3 "Antarctic Chilli Ranch (Beta 3)" \itemize{ \item faster repmat() \item workarounds for braindead compilers (eg. Visual Studio) } } } \section{Changes in RcppArmadillo version 0.2.38 (2012-03-28)}{ \itemize{ \item Upgraded to Armadillo release 2.99.2 "Antarctic Chilli Ranch (Beta 2)" \itemize{ \item added .i() \item much faster handling of .col() and .row() \item expressions X=A.i()*B and X=inv(A)*B are automatically converted to X=solve(A,B) } } } \section{Changes in RcppArmadillo version 0.2.37 (2012-03-19)}{ \itemize{ \item Upgraded to Armadillo release 2.99.1 "Antarctic Chilli Ranch (Beta 1)" \itemize{ \item added non-contiguous submatrix views \item added hist() and histc() \item faster handling of submatrix views \item faster generation of random numbers \item faster element access in fixed size matrices \item better detection of vector expressions by sum(), cumsum(), prod(), min(), max(), mean(), median(), stddev(), var() } } } \section{Changes in RcppArmadillo version 0.2.36 (2012-03-05)}{ \itemize{ \item Upgraded to Armadillo release 2.4.4 \itemize{ \item fixes for qr() and syl() \item more portable wall_clock class \item faster relational operators on submatrices } } } \section{Changes in RcppArmadillo version 0.2.35 (2012-02-17)}{ \itemize{ \item Upgraded to Armadillo release 2.4.3 \itemize{ \item Support for ARMA_DEFAULT_OSTREAM using Rcpp::Rcout added \item Minor bug fix release improving corner cases affecting builds: \itemize{ \item Missing semicolon added in Mat_meat (when in C++0x mode), with thanks to Teo Guo Ci \item Armadillo version vars now instantiated in RcppArmadillo.cpp which helps older g++ versions, with thanks to Gershon Bialer \item Thanks also to Martin Renner for testing these changes \item Unit tests output fallback directory changed per Brian Ripley's request to not ever use /tmp \item Minor update to version numbers in RcppArmadillo-package.Rd } } } } \section{Changes in RcppArmadillo version 0.2.34 (2011-12-12)}{ \itemize{ \item Upgraded to Armadillo release 2.4.2 \itemize{ \item clarified documentation for .reshape() \item fix for handling of empty matrices by .resize() } } } \section{Changes in RcppArmadillo version 0.2.33 (2011-12-07)}{ \itemize{ \item Upgraded to Armadillo release 2.4.1 \itemize{ \item added .resize() \item fix for vector initialisation } } } \section{Changes in RcppArmadillo version 0.2.32 (2011-12-04)}{ \itemize{ \item Upgraded to Armadillo test release 2.4.0 "Loco Lounge Lizard" \item Minimal changes relative to 0.2.31 based on 2.3.92, next section is relative to the previous stable release series 2.2.* of Armadillo \itemize{ \item added shorter forms of transposes: .t() and .st() \item added optional use of 64 bit indices, allowing matrices to have more than 4 billion elements \item added experimental support for C++11 initialiser lists \item faster pinv() \item faster inplace transpose \item faster handling of expressions with diagonal views \item fixes for handling expressions with aliasing and submatrices \item fixes for linking on Ubuntu and Debian systems \item fixes for inconsistencies in interactions between matrices and cubes \item refactored code to eliminate warnings when using the Clang C++ compiler \item .print_trans() and .raw_print_trans() are deprecated } } } \section{Changes in RcppArmadillo version 0.2.31 (2011-11-28)}{ \itemize{ \item Upgraded to Armadillo test release 2.3.92 "Loco Lounge Lizard (Beta 2)" \itemize{ \item fixes for linking on Ubuntu and Debian systems \item fixes for inconsistencies in interactions between matrices and cubes } } } \section{Changes in RcppArmadillo version 0.2.30 (2011-11-19)}{ \itemize{ \item Upgraded to Armadillo test release 2.3.91 "Loco Lounge Lizard (Beta 1)" \itemize{ \item added shorter forms of transposes: .t() and .st() \item added optional use of 64 bit indices, allowing matrices to have more than 4 billion elements \item added experimental support for C++11 initialiser lists \item faster pinv() \item faster inplace transpose \item bugfixes for handling expressions with aliasing and submatrices \item refactored code to eliminate warnings when using the Clang C++ compiler \item .print_trans() and .raw_print_trans() are deprecated } } } \section{Changes in RcppArmadillo version 0.2.29 (2011-09-01)}{ \itemize{ \item Upgraded to Armadillo release 2.2.3 \itemize{ \item Release fixes a speed issue in the as_scalar() function. } } } \section{Changes in RcppArmadillo version 0.2.28 (2011-08-02)}{ \itemize{ \item Upgraded to Armadillo release 2.2.1 "Blue Skies Debauchery" \itemize{ \item faster multiplication of small matrices \item faster trans() \item faster handling of submatrices by norm() \item added economical singular value decomposition: svd_thin() \item added circ_toeplitz() \item added .is_colvec() & .is_rowvec() \item fixes for handling of complex numbers by cov(), cor(), running_stat_vec } } } \section{Changes in RcppArmadillo version 0.2.27 (2011-07-22)}{ \itemize{ \item Upgraded to Armadillo release 2.1.91 "v2.2 beta 1" \itemize{ \item faster multiplication of small matrices \item faster trans() \item faster handling of submatrices by norm() \item added economical singular value decomposition: svd_thin() \item added circ_toeplitz() \item added .is_colvec() & .is_rowvec() } } } \section{Changes in RcppArmadillo version 0.2.26 (2011-07-17)}{ \itemize{ \item Upgraded to Armadillo release 2.0.2 \itemize{ \item fix for handling of conjugate transpose by as_scalar() \item fix for handling of aliasing by diagmat() \item fix for handling of empty matrices by symmatu()/symmatl() } } } \section{Changes in RcppArmadillo version 0.2.25 (2011-06-30)}{ \itemize{ \item Upgraded to Armadillo 2.0.1 which fixes two minor compilation issues } } \section{Changes in RcppArmadillo version 0.2.24 (2011-06-29)}{ \itemize{ \item Upgraded to Armadillo release 2.0.0 "Carnivorous Sugar Glider" \itemize{ \item faster multiplication of tiny matrices (≤ 4x4) \item faster compound expressions containing submatrices \item faster inverse of symmetric positive definite matrices \item faster element access for fixed size matrices \item added handling of arbitrarily sized empty matrices (eg. 5x0) \item added loading & saving of matrices as CSV text files \item added .count() member function to running_stat and running_stat_vec \item added syl(), strans(), symmatu()/symmatl() \item added submatrices of submatrices \item det(), inv() and solve() can be forced to use more precise \item algorithms for tiny matrices (≤ 4x4) \item htrans() has been deprecated; use trans() instead \item API change: trans() now takes the complex conjugate when transposing a complex matrix \item API change: .is_vec() now outputs true for empty vectors (eg. 0x1) \item API change: forms of chol(), eig_sym(), eig_gen(), inv(), lu(), pinv(), princomp(), qr(), solve(), svd(), syl() that do not return a bool indicating success now throw std::runtime_error exceptions when failures are detected \item API change: princomp_cov() has been removed; princomp() in conjunction with cov() can be used instead \item API change: set_log_stream() & get_log_stream() have been replaced by set_stream_err1() & get_stream_err1() } } } \section{Changes in RcppArmadillo version 0.2.23 (2011-06-23)}{ \itemize{ \item Upgraded to Armadillo release 1.99.5 "v2.0 beta 5" \itemize{ \item Forms of chol(), eig_sym(), eig_gen(), inv(), lu(), pinv(), princomp(), qr(), solve(), svd(), syl() that do not return a bool indicating success now throw std::runtime_error exceptions when failures are detected \item princomp_cov() has been removed; princomp() in conjunction with cov() can be used instead \item set_log_stream() & get_log_stream() have been replaced by set_stream_err1() & get_stream_err1() \item det(), inv() and solve() can be forced to use more precise algorithms for tiny matrices (≤ 4x4) \item Added loading & saving of matrices as CSV text files } \item fastLmPure() now uses same argument order as R's lm.fit() \item Export and document S3 methods in NAMESPACE and manual page as such } } \section{Changes in RcppArmadillo version 0.2.22 (2011-06-06)}{ \itemize{ \item Upgraded to Armadillo release 1.99.4 "v2.0 beta 4" \itemize{ \item fixes for handling of tiny matrices } } } \section{Changes in RcppArmadillo version 0.2.21 (2011-05-27)}{ \itemize{ \item Upgraded to Armadillo release 1.99.3 "v2.0 beta 3" \itemize{ \item stricter size checking for row and column vectors \item added .count() member function to running_stat and running_stat_vec } } } \section{Changes in RcppArmadillo version 0.2.20 (2011-05-25)}{ \itemize{ \item Upgraded to Armadillo release 1.99.2 "v2.0 beta 2" (and 1.99.1 before) \itemize{ \item faster inverse of symmetric matrices \item faster element access for fixed size matrices \item faster multiplication of tiny matrices (eg. 4x4) \item faster compund expressions containing submatrices \item added handling of arbitrarily sized empty matrices (eg. 5x0) \item added syl() \item added strans() \item added symmatu()/symmatl() \item added submatrices of submatrices \item htrans() has been deprecated; use trans() instead \item trans() now takes the complex conjugate when transposing a complex matrix \item .is_vec() now outputs true for empty matrices \item most functions with matrix inputs no longer throw exceptions when given empty matrices (eg. 5x0) } \item Added a new subdirectory examples/ seeded with a nice Vector Autoregression simulation simulation example by Lance Bachmeier \item Rewrote armadillo_version as to no longer require an instance of arma::arma_version, with tanks to Conrad for the suggestion } } \section{Changes in RcppArmadillo version 0.2.19 (2011-04-18)}{ \itemize{ \item Upgraded to Armadillo version 1.2.0 "Unscrupulous Carbon Emitter" \itemize{ \item Added ability to use Blas & Lapack libraries with capitalised function names \item Reduction of pedantic compiler warnings } } } \section{Changes in RcppArmadillo version 0.2.18 (2011-04-03)}{ \itemize{ \item Upgraded to Armadillo version 1.1.92 "Jurassic Barbecue" \itemize{ \item Bugfix in cor() \item Automatic installation now requires CMake >= 2.6 } } } \section{Changes in RcppArmadillo version 0.2.17 (2011-03-22)}{ \itemize{ \item Upgraded to Armadillo version 1.1.90 "Inside Job" \itemize{ \item Added .min() & .max(), which can provide the extremum's location \item More robust mean(), var(), stddev() } } } \section{Changes in RcppArmadillo version 0.2.16 (2011-03-10)}{ \itemize{ \item Upgraded to Armadillo version 1.1.8 "Kangaroo Steak" \itemize{ \item Added floor() and ceil() \item Added “not a number”: math::nan() \item Added infinity: math::inf() \item Added standalone is_finite() \item Faster min(), max(), mean() \item Bugfix for a corner case with NaNs in min() and max() } } } \section{Changes in RcppArmadillo version 0.2.15 (2011-03-04)}{ \itemize{ \item Upgraded to Armadillo version 1.1.6 “Baby Carpet Shark” \itemize{ \item fixed size matrices and vectors can use auxiliary (external) memory \item .in_range() can use span() arguments \item subfields can use span() arguments } } } \section{Changes in RcppArmadillo version 0.2.14 (2011-03-02)}{ \itemize{ \item Support Run-Time Type Information (RTTI) on matrices by setting the state variable vec_state in Row and Col instantiation, with thanks to Conrad Sanderson for the hint \item fastLm code simplified further by instantiating the Armadillo matrix and vector directly from the SEXP coming from R \item inst/doc/Makefile now respects $R_HOME environment variable } } \section{Changes in RcppArmadillo version 0.2.13 (2011-02-18)}{ \itemize{ \item Upgraded to Armadillo version 1.1.4 “Manta Lodge” \itemize{ \item Faster sort() \item Updated installation to detect recent versions of Intel's MKL \item Added interpretation of arbitrary "flat" subcubes as matrices } } } \section{Changes in RcppArmadillo version 0.2.12 (2011-02-15)}{ \itemize{ \item Upgraded to Armadillo version 1.1.2 “Flood Kayak” \itemize{ \item Faster prod() \item Faster solve() for compound expressions \item Fix for compilation using GCC's C++0x mode \item Fix for matrix handling by subcubes } } } \section{Changes in RcppArmadillo version 0.2.11 (2011-01-06)}{ \itemize{ \item Upgraded to Armadillo version 1.1.0 “Climate Vandal” \itemize{ \item Extended submatrix views, including access to elements whose indices are specified in a separate vector \item Added handling of raw binary files by save/load functions \item Added cumsum() \item Added interpretation of matrices as triangular via trimatu()/trimatl() \item Faster solve(), inv() via explicit handling of triangular matrices \item The stream for logging of errors and warnings can now be changed } \item New unexported R function SHLIB, a small wrapper around R CMD SHLIB, which can be used as Rscript -e "RcppArmadillo:::SHLIB('foo.cpp')" } } \section{Changes in RcppArmadillo version 0.2.10 (2010-11-25)}{ \itemize{ \item Upgraded to Armadillo 1.0.0 "Antipodean Antileech" \itemize{ \item After 2 1/2 years of collaborative development, we are proud to release the 1.0 milestone version. \item Many thanks are extended to all contributors and bug reporters. } \item R/RcppArmadillo.package.skeleton.R: Updated to no longer rely on GNU make for builds of packages using RcppArmadillo \item summary() for fastLm() objects now returns r.squared and adj.r.squared } } \section{Changes in RcppArmadillo version 0.2.9 (2010-11-11)}{ \itemize{ \item Upgraded to Armadillo 0.9.92 "Wall Street Gangster": \itemize{ \item Fixes for compilation issues under the Intel C++ compiler \item Added matrix norms } } } \section{Changes in RcppArmadillo version 0.2.8 (2010-10-16)}{ \itemize{ \item Upgraded to Armadillo 0.9.90 "Water Dragon": \itemize{ \item Added unsafe_col() \item Speedups and bugfixes in lu() \item Minimisation of pedantic compiler warnings } \item Switched NEWS and ChangeLog between inst/ and the top-level directory so that NEWS (this file) gets installed with the package } } \section{Changes in RcppArmadillo version 0.2.7 (2010-09-25)}{ \itemize{ \item Upgraded to Armadillo 0.9.80 "Chihuahua Muncher": \itemize{ \item Added join_slices(), insert_slices(), shed_slices() \item Added in-place operations on diagonals \item Various speedups due to internal architecture improvements } } } \section{Changes in RcppArmadillo version 0.2.6 (2010-09-12)}{ \itemize{ \item Upgraded to Armadillo 0.9.70 "Subtropical Winter Safari" \item arma::Mat, arma::Row and arma::Col get constructor that take vector or matrix sugar expressions. See the unit test "test.armadillo.sugar.ctor" and "test.armadillo.sugar.matrix.ctor" for examples. } } \section{Changes in RcppArmadillo version 0.2.5 (2010-08-05)}{ \itemize{ \item Upgraded to Armadillo 0.9.60 "Killer Bush Turkey" } } \section{Changes in RcppArmadillo version 0.2.4 (2010-07-27)}{ \itemize{ \item Upgraded to Armadillo 0.9.52 'Monkey Wrench' \item src/fastLm.cpp: Switch from inv() to pinv() as inv() now tests for singular matrices and warns and returns an empty matrix which stops the example fastLm() implementation on the manual page -- and while this is generally reasonably it makes sense here to continue which the Moore-Penrose pseudo-inverse allows us to do this } } \section{Changes in RcppArmadillo version 0.2.3 (2010-06-14)}{ \itemize{ \item Better configuration to detect suncc (which does not have std::isfinite) } } \section{Changes in RcppArmadillo version 0.2.2 (2010-06-09)}{ \itemize{ \item Added RcppArmadillo:::CxxFlags for cases where RcppArmadillo is not used via a package \item Upgraded to Armadillo 0.9.10 'Chilli Espresso' \item Wrap support for mtOp, i.e. operations involving mixed types such as a complex and an arma::mat, which have been introduced in armadillo 0.9.10 \item Wrap support for mtGlue, i.e. operations involving matrices of mixed types such as an arma::mat and an arma::imat, which have been introduced in armadillo 0.9.10 \item Included an inline plugin to support the plugin system introduced in inline 0.3.5. The unit tests have moved from the src directory to the unit test directory (similar to Rcpp) using cxxfunction with the RcppArmadillo plugin. } } \section{Changes in RcppArmadillo version 0.2.1 (2010-05-19)}{ \itemize{ \item Bug-fix release permitting compilation on Windows } } \section{Changes in RcppArmadillo version 0.2.0 (2010-05-18)}{ \itemize{ \item fastLm() is now generic and has a formula interface as well as methods for print, summary, predict to behave like a standard model fitting function \item Armadillo sources (using release 0.9.8) are now included in the package using a standardized build suitable for our purposes (not assuming Boost or Atlas) -- see ?RcppArmadillo for details \item New R function RcppArmadillo.package.skeleton, similar to Rcpp::Rcpp.package.skeleton, but targetting use of RcppArmadillo } } \section{Changes in RcppArmadillo version 0.1.0 (2010-03-11)}{ \itemize{ \item the fastLm() implementation of a bare-bones lm() fit (using Armadillo's solve() function) provides an example of how efficient code can be written compactly using the combination of Rcpp, RcppAramadillo and Armadillo \item support for Rcpp implicit wrap of these types : Mat, Col, Row, Cube where T is one of : int, unsigned int, double, float \item support for Rcpp implicit as of these types : Mat, Col, Row where R is one of : int, unsigned int, double, float } } RcppArmadillo/inst/skeleton/0000755000176200001440000000000013332026770015607 5ustar liggesusersRcppArmadillo/inst/skeleton/rcpparma_hello_world.cpp0000644000176200001440000000265512304377763022533 0ustar liggesusers// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- // we only include RcppArmadillo.h which pulls Rcpp.h in for us #include "RcppArmadillo.h" // via the depends attribute we tell Rcpp to create hooks for // RcppArmadillo so that the build process will know what to do // // [[Rcpp::depends(RcppArmadillo)]] // simple example of creating two matrices and // returning the result of an operatioon on them // // via the exports attribute we tell Rcpp to make this function // available from R // // [[Rcpp::export]] arma::mat rcpparma_hello_world() { arma::mat m1 = arma::eye(3, 3); arma::mat m2 = arma::eye(3, 3); return m1 + 3 * (m1 + m2); } // another simple example: outer product of a vector, // returning a matrix // // [[Rcpp::export]] arma::mat rcpparma_outerproduct(const arma::colvec & x) { arma::mat m = x * x.t(); return m; } // and the inner product returns a scalar // // [[Rcpp::export]] double rcpparma_innerproduct(const arma::colvec & x) { double v = arma::as_scalar(x.t() * x); return v; } // and we can use Rcpp::List to return both at the same time // // [[Rcpp::export]] Rcpp::List rcpparma_bothproducts(const arma::colvec & x) { arma::mat op = x * x.t(); double ip = arma::as_scalar(x.t() * x); return Rcpp::List::create(Rcpp::Named("outer")=op, Rcpp::Named("inner")=ip); } RcppArmadillo/inst/skeleton/Makevars0000644000176200001440000000112513332026770017302 0ustar liggesusers ## With R 3.1.0 or later, you can uncomment the following line to tell R to ## enable compilation with C++11 (where available) ## ## Also, OpenMP support in Armadillo prefers C++11 support. However, for wider ## availability of the package we do not yet enforce this here. It is however ## recommended for client packages to set it. ## ## And with R 3.4.0, and RcppArmadillo 0.7.960.*, we turn C++11 on as OpenMP ## support within Armadillo prefers / requires it CXX_STD = CXX11 PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS) PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) RcppArmadillo/inst/skeleton/rcpparma_hello_world.Rd0000644000176200001440000000251612401065421022271 0ustar liggesusers\name{RcppArmadillo-Functions} \alias{rcpparma_hello_world} \alias{rcpparma_innerproduct} \alias{rcpparma_outerproduct} \alias{rcpparma_bothproducts} \title{Set of functions in example RcppArmadillo package} \description{ These four functions are created when \code{RcppArmadillo.package.skeleton()} is invoked to create a skeleton packages. } \usage{ rcpparma_hello_world() rcpparma_outerproduct(x) rcpparma_innerproduct(x) rcpparma_bothproducts(x) } \arguments{ \item{x}{a numeric vector} } \value{ \code{rcpparma_hello_world()} does not return a value, but displays a message to the console. \code{rcpparma_outerproduct()} returns a numeric matrix computed as the outer (vector) product of \code{x}. \code{rcpparma_innerproduct()} returns a double computer as the inner (vector) product of \code{x}. \code{rcpparma_bothproducts()} returns a list with both the outer and inner products. } \details{ These are example functions which should be largely self-explanatory. Their main benefit is to demonstrate how to write a function using the Armadillo C++ classes, and to have to such a function accessible from R. } \references{ See the documentation for Armadillo, and RcppArmadillo, for more details. } \examples{ x <- sqrt(1:4) rcpparma_innerproduct(x) rcpparma_outerproduct(x) } \author{Dirk Eddelbuettel} RcppArmadillo/inst/skeleton/Makevars.win0000644000176200001440000000112513332026752020076 0ustar liggesusers ## With R 3.1.0 or later, you can uncomment the following line to tell R to ## enable compilation with C++11 (where available) ## ## Also, OpenMP support in Armadillo prefers C++11 support. However, for wider ## availability of the package we do not yet enforce this here. It is however ## recommended for client packages to set it. ## ## And with R 3.4.0, and RcppArmadillo 0.7.960.*, we turn C++11 on as OpenMP ## support within Armadillo prefers / requires it CXX_STD = CXX11 PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS) PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) RcppArmadillo/cleanup0000755000176200001440000000143714173355571014400 0ustar liggesusers#!/bin/sh rm -f config.log config.status confdefs.h \ src/*.o src/*.so src/symbols.rds \ vignettes/RcppArmadillo-unitTests.out \ vignettes/RcppArmadillo-unitTests.aux \ vignettes/RcppArmadillo-unitTests.log \ vignettes/RcppArmadillo-intro.out \ vignettes/RcppArmadillo*.log \ vignettes/RcppArmadillo*.aux \ vignettes/RcppArmadillo*.out \ vignettes/RcppArmadillo*.tex \ vignettes/RcppArmadillo-*.pdf \ vignettes/*.blg \ vignettes/*.bbl \ vignettes/*.xwm \ vignettes/*~ \ */*~ *~ \ inst/include/RcppArmadilloLapack.h \ inst/include/RcppArmadilloConfigGenerated.h \ src/Makevars \ vignettes/jss.bst vignettes/pinp.cls rm -rf autom4te.cache/ \ vignettes/auto/ RcppArmadillo/configure0000755000176200001440000035604214173355571014737 0ustar liggesusers#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for RcppArmadillo 0.10.8.1.0. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and edd@debian.org $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='RcppArmadillo' PACKAGE_TARNAME='rcpparmadillo' PACKAGE_VERSION='0.10.8.1.0' PACKAGE_STRING='RcppArmadillo 0.10.8.1.0' PACKAGE_BUGREPORT='edd@debian.org' PACKAGE_URL='' ac_subst_vars='LTLIBOBJS LIBOBJS OPENMP_FLAG ARMA_HAVE_OPENMP ARMA_LAPACK CXXCPP OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures RcppArmadillo 0.10.8.1.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/rcpparmadillo] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of RcppArmadillo 0.10.8.1.0:";; esac cat <<\_ACEOF Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF RcppArmadillo configure 0.10.8.1.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by RcppArmadillo $as_me 0.10.8.1.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ## Set R_HOME, respecting an environment variable if one is set : ${R_HOME=$(R RHOME)} if test -z "${R_HOME}"; then as_fn_error $? "Could not determine R_HOME." "$LINENO" 5 fi ## Use R to set CXX and CXXFLAGS CXX=$(${R_HOME}/bin/R CMD config CXX) CXXFLAGS=$("${R_HOME}/bin/R" CMD config CXXFLAGS) ## We are using C++ ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ## Is R already configured to compile things using OpenMP without ## any extra hand-holding? openmp_already_works="no" ## default to not even thinking about OpenMP as Armadillo wants a pragma ## variant available if and only if C++11 is used with g++ 5.4 or newer can_use_openmp="no" ## Ensure TMPDIR is set. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have a suitable tempdir" >&5 $as_echo_n "checking whether we have a suitable tempdir... " >&6; } TMPDIR=$("${R_HOME}/bin/R" --vanilla --slave -e "cat(dirname(tempdir()))") { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${TMPDIR}" >&5 $as_echo "${TMPDIR}" >&6; } ## Check if R is configured to compile programs using OpenMP out-of-the-box. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether R CMD SHLIB can already compile programs using OpenMP" >&5 $as_echo_n "checking whether R CMD SHLIB can already compile programs using OpenMP... " >&6; } ## Create private directory in TMPDIR. BUILDDIR="${TMPDIR}/rcpparmadillo-$$-$RANDOM" mkdir -p "${BUILDDIR}" owd=$(pwd) cd "${BUILDDIR}" cat < test-omp.cpp #include int main() { return omp_get_num_threads(); } EOF ## Execute R CMD SHLIB. "${R_HOME}/bin/R" CMD SHLIB test-omp.cpp >/dev/null 2>&1 if test x"$?" = x"0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } openmp_already_works="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ## Go back home. cd "${owd}" rm -rf "${BUILDDIR}" ## If the above checks failed, then perform other heuristics ## based on the compiler version, etc. if test x"${openmp_already_works}" = x"no"; then ## Check the C++ compiler using the CXX value set ## If it is g++, we have GXX set so let's examine it if test "${GXX}" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether g++ version is sufficient" >&5 $as_echo_n "checking whether g++ version is sufficient... " >&6; } gxx_version=$(${CXX} -v 2>&1 | awk '/^.*g.. version/ {print $3}') case ${gxx_version} in 1.*|2.*|3.*|4.0.*|4.1.*|4.2.*|4.3.*|4.4.*|4.5.*|4.6.*|4.7.0|4.7.1) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Only g++ version 4.7.2 or greater can be used with RcppArmadillo." >&5 $as_echo "$as_me: WARNING: Only g++ version 4.7.2 or greater can be used with RcppArmadillo." >&2;} as_fn_error $? "Please use a different compiler." "$LINENO" 5 ;; 4.7.*|4.8.*|4.9.*|5.0*|5.1*|5.2*|5.3*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, but without OpenMP as version ${gxx_version} (Armadillo constraint)" >&5 $as_echo "yes, but without OpenMP as version ${gxx_version} (Armadillo constraint)" >&6; } ## we know this one is bad can_use_openmp="no" ;; 5.4*|5.5*|5.6*|5.7*|5.8*|5.9*|6.*|7.*|8.*|9.*|10.*|11.*|12.*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, with OpenMP as version ${gxx_version}" >&5 $as_echo "yes, with OpenMP as version ${gxx_version}" >&6; } ## we know this one is good, yay can_use_openmp="yes" ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: almost" >&5 $as_echo "almost" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Compiler self-identifies as being compliant with GNUC extensions but is not g++." >&5 $as_echo "$as_me: WARNING: Compiler self-identifies as being compliant with GNUC extensions but is not g++." >&2;} ## we know nothing, so no can_use_openmp="no" ;; esac fi ## Check for Apple LLVM { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macOS" >&5 $as_echo_n "checking for macOS... " >&6; } RSysinfoName=$("${R_HOME}/bin/Rscript" --vanilla -e 'cat(Sys.info()["sysname"])') if test x"${RSysinfoName}" = x"Darwin"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for macOS Apple compiler" >&5 $as_echo_n "checking for macOS Apple compiler... " >&6; } apple_compiler=$($CXX --version 2>&1 | grep -i -c -e 'apple llvm') if test x"${apple_compiler}" = x"1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: OpenMP unavailable and turned off." >&5 $as_echo "$as_me: WARNING: OpenMP unavailable and turned off." >&2;} can_use_openmp="no" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clang compiler" >&5 $as_echo_n "checking for clang compiler... " >&6; } clang_compiler=$($CXX --version 2>&1 | grep -i -c -e 'clang ') if test x"${clang_compiler}" = x"1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenMP compatible version of clang" >&5 $as_echo_n "checking for OpenMP compatible version of clang... " >&6; } clang_version=$(${CXX} -v 2>&1 | awk '/^.*clang version/ {print $3}') case ${clang_version} in 4.*|5.*|6.*|7.*|8.*|9.*|10.*|11.*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: found and suitable" >&5 $as_echo "found and suitable" >&6; } can_use_openmp="yes" ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: OpenMP unavailable and turned off." >&5 $as_echo "$as_me: WARNING: OpenMP unavailable and turned off." >&2;} can_use_openmp="no" ;; esac else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unsupported macOS build detected; if anything breaks, you keep the pieces." >&5 $as_echo "$as_me: WARNING: unsupported macOS build detected; if anything breaks, you keep the pieces." >&2;} fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi # if test x"${openmp_already_works}" = x"no" ## Check for suitable LAPACK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: checking LAPACK_LIBS" >&5 $as_echo_n "checking LAPACK_LIBS... " >&6; } ## external LAPACK has the required function lapack=$(${R_HOME}/bin/R CMD config LAPACK_LIBS) hasRlapack=$(echo ${lapack} | grep lRlapack) ## in what follows below we substitute both side of the define/undef ## while this may seem a little unusual we do it to fully reproduce the ## previous bash-based implementation if test x"${hasRlapack}" = x""; then ## We are using a full Lapack and can use zgbsv -- so #undef remains { $as_echo "$as_me:${as_lineno-$LINENO}: result: system LAPACK found" >&5 $as_echo "system LAPACK found" >&6; } arma_lapack="#undef ARMA_CRIPPLED_LAPACK" else ## We are using R's subset of Lapack and CANNOT use zgbsv etc, so we mark it { $as_echo "$as_me:${as_lineno-$LINENO}: result: R-supplied partial LAPACK found" >&5 $as_echo "R-supplied partial LAPACK found" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Some complex-valued LAPACK functions may not be available" >&5 $as_echo "$as_me: WARNING: Some complex-valued LAPACK functions may not be available" >&2;} arma_lapack="#define ARMA_CRIPPLED_LAPACK 1" fi ## Default the OpenMP flag to the empty string. ## If and only if OpenMP is found, expand to $(SHLIB_OPENMP_CXXFLAGS) openmp_flag="" ## Set the fallback, by default it is nope arma_have_openmp="#define ARMA_DONT_USE_OPENMP 1" if test x"${openmp_already_works}" = x"yes"; then arma_have_openmp="#define ARMA_USE_OPENMP 1" fi if test x"${can_use_openmp}" = x"yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenMP" >&5 $as_echo_n "checking for OpenMP... " >&6; } ## if R has -fopenmp we should be good allldflags=$(${R_HOME}/bin/R CMD config --ldflags) hasOpenMP=$(echo ${allldflags} | grep -- -fopenmp) if test x"${hasOpenMP}" = x""; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: missing" >&5 $as_echo "missing" >&6; } arma_have_openmp="#define ARMA_DONT_USE_OPENMP 1" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found and suitable" >&5 $as_echo "found and suitable" >&6; } arma_have_openmp="#define ARMA_USE_OPENMP 1" openmp_flag='$(SHLIB_OPENMP_CXXFLAGS)' fi fi ## now use all these ARMA_LAPACK="${arma_lapack}" ARMA_HAVE_OPENMP="${arma_have_openmp}" OPENMP_FLAG="${openmp_flag}" ac_config_files="$ac_config_files inst/include/RcppArmadilloConfigGenerated.h src/Makevars" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by RcppArmadillo $as_me 0.10.8.1.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ RcppArmadillo config.status 0.10.8.1.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "inst/include/RcppArmadilloConfigGenerated.h") CONFIG_FILES="$CONFIG_FILES inst/include/RcppArmadilloConfigGenerated.h" ;; "src/Makevars") CONFIG_FILES="$CONFIG_FILES src/Makevars" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi