Armadillo is a powerful and expressive C++ template library for linear algebra and scientific computing. It aims towards a good balance between speed and ease of use, has a syntax deliberately close to Matlab, and is useful for algorithm development directly in C++, or quick conversion of research code into production environments. RcppArmadillo integrates this library with the R environment and language–and is widely used by (currently) 1279 other packages on CRAN, downloaded 41.2 million times (per the partial logs from the cloud mirrors of CRAN), and the CSDA paper (preprint / vignette) by Conrad and myself has been cited 644 times according to Google Scholar.
Fairly shortly after the release of Armadillo 14.6.3 (which became our precedig release 14.6.3), Conrad released version 15.0.0 of Armadillo. It contains several breaking changes which made it unsuitable for CRAN as is. First, the minimum C++ standard was lifted to C++14. There are many good reasons for doing so, but doing it unannounced with no transition offered cannot work at CRAN. For (mostly historical) reasons (as C++11 was once a step up from even more archaic code) many packages still enforce C++11. These packages would break under Armadillo 15.0.0. With some reverse-dependency checks we quickly found that this would affect over 200 packages. Second, Armadillo frequently deprecates code and issues a warning offering a hint towards an improved / current alternative. That too is good practice, and recommended. But at CRAN a deprecation warning seen leads to NOTE and an unfixed NOTEs can lead to archival which is not great. For that reason, we had added a global ‘muffler’ suppressing the deprecation warnings. This was now removed in C++14 (as one can rely on newer compiler attributes we cannot undo, whereas the old scheme just used macros). Again, not something we can do at CRAN.
So I hatched the plan of offering both the final release
under the previous state of the world, i.e. 14.6.3, along with 15.0.0.
User could then opt-into 15.0.0 but have a fallback of 14.6.3 allowing
all packages to coexist. The first idea was to turn the fallback on only
if C++11 compilation was noticed. This lead still a lot of deprecation
warnings meaning we had to more strongly default to 14.6.3 and only if
users actively selected 15.0.* would they get it. This seemed to work.
We were still faced with two hard failures. Turns out one was local to a
since-archived package, the other reveal a bad interaction betweem Armadillo and gcc
for complex
variables and lead to bug fix 15.0.1. Which I
wrapped and uploaded a week ago.
Release 15.0.1 was quickly seen as only temporary because I
overlooked two issues. Moving ‘legacy’ and ‘current’ into, respectively,
a directory of that name meant to top-level include header
armadillo
remained. This broked a few use cases where
packages use a direct #include <armadillo>
(which we
do not recommend as it may miss a few other settings we apply for the R
case). The other is that an old test for ‘limited’ LAPACK capabilities
made noise in some builds (for example on Windows). As (current) R
versions generally have sufficient LAPACK and BLAS, this too has been
removed.
We have tested and rested these changed extensively. The usual repository with the logs shows eight reverse-dependency runs each of which can take up to a day. This careful approach, together with pacing uploads at CRAN usually works. We got a NOTE for ‘seven uploads in six months’ for this one, but a CRAN maintainer quickly advanced it, and the fully automated test showed no regression or other human intervention which is nice given the set of changes, and the over 1200 reverse dependencies.
The changes since the last announced CRAN release 14.6.3 follow.
Changes in RcppArmadillo version 15.0.2-1 (2025-09-08)
Upgraded to Armadillo release 15.0.2-1 (Medium Roast)
Optionally use OpenMP parallelisation for fp16 matrix multiplication
Faster vectorisation of cube tubes
Provide a top-level include file
armadillo
as fallback (#480)Retire the no-longer-needed check for insufficient LAPACK as R now should supply a sufficient libRlapack (when used) (#483)
Two potential narrowing warnings are avoided via cast
Changes in RcppArmadillo version 15.0.1-1 (2025-09-01)
Upgraded to Armadillo release 15.0.1-1 (Medium Roast)
- Workaround for GCC compiler bug involving misoptimisation of complex number multiplication
This version contains both 'legacy' and 'current' version of Armadillo (see also below). Package authors should set a '#define' to select the 'current' version, or select the 'legacy' version (also chosen as default) if they must. See GitHub issue #475 for more details.
Updated DESCRIPTION and README.md
Changes in RcppArmadillo version 15.0.0-1 (2025-08-21) (GitHub Only)
Upgraded to Armadillo release 15.0.0-1 (Medium Roast)
C++14 is now the minimum required C++ standard
Aded preliminary support for matrices with half-precision fp16 element type
Added second form of
cond()
to allow detection of failuresAdded
repcube()
Added
.freeze()
and.unfreeze()
member functions towall_clock
Extended
conv()
andconv2()
to accept the "valid" shape argumentAlso includes Armadillo 14.6.3 as fallback for C++11 compilations
This new 'dual' setup had been rigorously tested with five interim pre-releases of which several received full reverse-dependency checks
Courtesy of my CRANberries, there is a diffstat report relative to previous release. More detailed information is on the RcppArmadillo page. Questions, comments etc should go to the rcpp-devel mailing list off the Rcpp R-Forge page.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. If you like this or other open-source work I do, you can sponsor me at GitHub.