[Rcpp-devel] [Pre-ANN] RcppArmadillo 0.8.100.1.0, and request for help
Dirk Eddelbuettel
edd at debian.org
Mon Oct 9 19:58:56 CEST 2017
Hi George,
On 9 October 2017 at 10:46, George Vega Yon wrote:
| Hi Dirk,
|
| It seems that something's going on with element modification of
| arma::sp_mat objects. While in most of the cases I use batch insertion to
It looks like we got to the bottom reasonably quicky, but that start with
some off-list emails by @fprive who also created a nice minimal example.
I _think_ a one-line fix of adding sync() before wrap() builds its return
object may do it.
Can you take a look at what we have now at #178 in the RcppArmadillo repo?
[ Never mind, you provided such a great example I did ... ]
Turns out you identified the same issue as @fprive, and this should be fixed
now. Output from my box below.
This gets us output, but from a quick glance it does not match what you get
from Matrix. Can you take a look at what I have below?
Thanks so much for helping to find this!
Dirk
R> Rcpp::sourceCpp("/tmp/rcppArma178p2.cpp")
rcppArma178p2.cpp: In function ‘arma::sp_mat edgelist_to_adjmat_minimal(Rcpp::IntegerMatrix, int)’:
rcppArma178p2.cpp:10:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (unsigned int i = 0u; i < edgelist.nrow(); i++)
~~^~~~~~~~~~~~~~~~~
rcppArma178p2.cpp: In function ‘arma::sp_mat edgelist_to_adjmat_minimal2(Rcpp::IntegerMatrix, int)’:
rcppArma178p2.cpp:22:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (unsigned int i = 0u; i < edgelist.nrow(); i++)
~~^~~~~~~~~~~~~~~~~
rcppArma178p2.cpp: In function ‘arma::sp_mat edgelist_to_adjmat_minimal3(Rcpp::IntegerMatrix, int)’:
rcppArma178p2.cpp:35:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (unsigned int i = 0u; i < edgelist.nrow(); i++)
~~^~~~~~~~~~~~~~~~~
R> library(Matrix)
R> # Creating a random edgelist with n vertices
R> n <- 5
R> set.seed(1)
R> edgelist <- unique(matrix(sample.int(n, 10, TRUE), ncol=2) - 1L)
R> # Coercing to adjacency matrix
R> edgelist_to_adjmat_minimal(edgelist, n)
5 x 5 sparse Matrix of class "dgCMatrix"
[1,] . . . . .
[2,] 1 . . . 1
[3,] . . . 1 .
[4,] . . . . .
[5,] . . . 1 .
R> edgelist_to_adjmat_minimal2(edgelist, n)
5 x 5 sparse Matrix of class "dgCMatrix"
[1,] . . . . .
[2,] 1 . . . 1
[3,] . . . 1 .
[4,] . . . . .
[5,] . . . 1 .
R> edgelist_to_adjmat_minimal3(edgelist, n)
5 x 5 sparse Matrix of class "dgCMatrix"
[1,] . . . . .
[2,] 1 . . . 1
[3,] . . . 1 .
[4,] . . . . .
[5,] . . . 1 .
R> # This is what we should get
R> adjmat_ans <- matrix(0, ncol=n, nrow=n)
R> adjmat_ans[edgelist] <- 1
R> methods::as(adjmat_ans, "dgCMatrix")
5 x 5 sparse Matrix of class "dgCMatrix"
[1,] . . . 1 .
[2,] . . 1 . .
[3,] . . . . .
[4,] . . 1 . .
[5,] . . . . .
R> sessionInfo()
R version 3.4.2 (2017-09-28)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 17.04
Matrix products: default
BLAS: /usr/lib/openblas-base/libblas.so.3
LAPACK: /usr/lib/libopenblasp-r0.2.19.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8
[8] LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] Matrix_1.2-11 dang_0.0.7
loaded via a namespace (and not attached):
[1] compiler_3.4.2 tools_3.4.2 RcppArmadillo_0.8.100.1.0 Rcpp_0.12.13 grid_3.4.2 lattice_0.20-35 fortunes_1.5-4
R>
| create arma::sp_mat objects, in some others I have no other way of doing so
| but by looping through a list of elements to be added(modified). I've
| created a minimal example in which I try to create an adjacency matrix (an
| square matrix of size N) by filling its cells according to an edgelist (a
| matrix with 2 columns providing coordinates). I ran the code using Valgrind
| and no memory leaks were detected, but the code is not behaving as I would
| expect. Here is the code:
|
| ---------------- edgelist_to_adjmat_minimal.cpp --------------------------
|
| #include <RcppArmadillo.h>
| using namespace Rcpp;
|
| // EXAMPLE 1: Element access with -at- and in-place addition
| // [[Rcpp::export]]
| arma::sp_mat edgelist_to_adjmat_minimal(IntegerMatrix edgelist, int n) {
|
| arma::sp_mat adjmat(n,n);
| for (unsigned int i = 0u; i < edgelist.nrow(); i++)
| adjmat.at(edgelist.at(i,0u), edgelist.at(i, 1u)) += 1.0;
|
| return adjmat;
|
| }
|
| // EXAMPLE 2: Element access with -at- and addition.
| // [[Rcpp::export]]
| arma::sp_mat edgelist_to_adjmat_minimal2(IntegerMatrix edgelist, int n) {
|
| arma::sp_mat adjmat(n,n);
| for (unsigned int i = 0u; i < edgelist.nrow(); i++)
| adjmat.at(edgelist.at(i,0u), edgelist.at(i, 1u)) =
| adjmat.at(edgelist.at(i,0u), edgelist.at(i, 1u)) + 1.0;
|
| return adjmat;
|
| }
|
| // EXAMPLE 3: Element access with -()- and addition
| // [[Rcpp::export]]
| arma::sp_mat edgelist_to_adjmat_minimal3(IntegerMatrix edgelist, int n) {
|
| arma::sp_mat adjmat(n,n);
| for (unsigned int i = 0u; i < edgelist.nrow(); i++)
| adjmat(edgelist.at(i,0u), edgelist.at(i, 1u)) =
| adjmat(edgelist.at(i,0u), edgelist.at(i, 1u)) + 1.0;
|
| return adjmat;
|
| }
|
| /***R
| library(Matrix)
|
| # Creating a random edgelist with n vertices
| n <- 5
| set.seed(1)
| edgelist <- unique(matrix(sample.int(n, 10, TRUE), ncol=2) - 1L)
|
| # Coercing to adjacency matrix
| edgelist_to_adjmat_minimal(edgelist, n)
| edgelist_to_adjmat_minimal2(edgelist, n)
| edgelist_to_adjmat_minimal3(edgelist, n)
|
| # This is what we should get
| adjmat_ans <- matrix(0, ncol=n, nrow=n)
| adjmat_ans[edgelist] <- 1
| methods::as(adjmat_ans, "dgCMatrix")
|
| sessionInfo()
| */
|
| ---------------- edgelist_to_adjmat_minimal.cpp --------------------------
|
|
| And here is what I get
|
|
| ----------------- begin of output ------------------------------
| --------------
| > Rcpp::sourceCpp("playground/edgelist_to_adjmat_minimal.cpp")
|
| > library(Matrix)
|
| > # Creating a random edgelist with n vertices
| > n <- 5
|
| > set.seed(1)
|
| > edgelist <- unique(matrix(sample.int(n, 10, TRUE), ncol=2) - 1L)
|
| > # Coercing to adjacency matrix
| > edgelist_to_adjmat_minimal(edgelist, n)
| 5 x 5 sparse Matrix of class "dgCMatrix"
|
| [1,] . . . . .
| [2,] . . . . .
| [3,] . . . . .
| [4,] . . . . .
| [5,] . . . . .
|
| > edgelist_to_adjmat_minimal2(edgelist, n)
| 5 x 5 sparse Matrix of class "dgCMatrix"
|
| [1,] . . . . .
| [2,] . . . . .
| [3,] . . . . .
| [4,] . . . . .
| [5,] . . . . .
|
| > edgelist_to_adjmat_minimal3(edgelist, n)
| 5 x 5 sparse Matrix of class "dgCMatrix"
|
| [1,] . . . . .
| [2,] . . . . .
| [3,] . . . . .
| [4,] . . . . .
| [5,] . . . . .
|
| > # This is what we should get
| > adjmat_ans <- matrix(0, ncol=n, nrow=n)
|
| > adjmat_ans[edgelist] <- 1
|
| > methods::as(adjmat_ans, "dgCMatrix")
| 5 x 5 sparse Matrix of class "dgCMatrix"
|
| [1,] . . . 1 .
| [2,] . . 1 . .
| [3,] . . . . .
| [4,] . . 1 . .
| [5,] . . . . .
|
| > sessionInfo()
| R version 3.4.2 (2017-09-28)
| Platform: x86_64-pc-linux-gnu (64-bit)
| Running under: Ubuntu 14.04.5 LTS
|
| Matrix products: default
| BLAS: /usr/lib/libblas/libblas.so.3.0
| LAPACK: /usr/lib/lapack/liblapack.so.3.0
|
| locale:
| [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
| [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
| [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
| [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
| [9] LC_ADDRESS=C LC_TELEPHONE=C
| [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
|
| attached base packages:
| [1] stats graphics grDevices utils datasets methods base
|
| other attached packages:
| [1] Matrix_1.2-11
|
| loaded via a namespace (and not attached):
| [1] compiler_3.4.2 tools_3.4.2
| [3] RcppArmadillo_0.8.100.1.0 Rcpp_0.12.13
| [5] grid_3.4.2 lattice_0.20-35
|
| ------------------------- end of output ------------------------------
| -----------
|
| I use three different examples thinking that perhaps some element accessing
| method was no longer valid, or even the in-place addition was no longer
| working.
|
| Anything looks wrong in what I've written? From what I've seen in my test
| results, all of the errors that I've checked so far have to do with this.
|
| Best,
|
|
| George G. Vega Yon
| +1 (626) 381 8171 <(626)%20381-8171>
| http://cana.usc.edu/vegayon
|
| On Sat, Oct 7, 2017 at 3:15 PM, Dirk Eddelbuettel <edd at debian.org> wrote:
|
| >
| > RcppArmadillo 0.8.100.1.0 is available in the drat repo for the RcppCore
| > org.
| > See the README.md at https://github.com/RcppCore/drat which has this
| > exammple:
| >
| > # first add the repo
| > drat:::add("RcppCore")
| > # either install just one or more given packages
| > install.packages("RcppArmadillo")
| > # or update already installed packages
| > update.packages()
| >
| > You can also add the repo URL by hand to options("repos"), or supply it to
| > install.packages(), or ... I happen to like drat. The files NEWS.Rd and
| > ChangeLog have the goods, I make a fuller announcement if and when it makes
| > it to CRAN.
| >
| > There are a rathre fair number of upstream changes in here -- making it the
| > first Armadillo release by Conrad with an 8.* number. It also has further
| > sparse matrix improvements from our end thanks to Serguei and Binxiang.
| >
| > I had uploaded this to CRAN based on a reverse depends check ... where the
| > previous version was still in the loadpath. Ooops. So I overlooked a few
| > build or test errors for which I need a bit of help from the maintainers.
| > In
| > particular, packages
| >
| > biglasso
| > bigstatsr
| > HSAR
| > netdiffuseR
| > repolr
| >
| > now come up as failing their tests. I am BCCing the maintainers and kindly
| > ask if they could take a look too --- I don't always have all suggested
| > packages installed.
| >
| > In the case of HSAR, I found that a one life of code needs a changed
| > imposed
| > by Conrad as the sparse-to-dense conversion no longer works with with a
| > copy. This patch covers it:
| >
| > diff -ru HSAR.orig/src/diagnostics.cpp HSAR/src/diagnostics.cpp
| > --- HSAR.orig/src/diagnostics.cpp 2016-05-24 13:58:45.000000000 -0500
| > +++ HSAR/src/diagnostics.cpp 2017-10-07 13:24:31.471883248 -0500
| > @@ -10,7 +10,7 @@
| >
| > sp_mat SW = I_sp+rho*W+pow(rho,2)*(W*W)+pow(rho,3)*(W*W*W)+pow(rho,4)*(
| > W*W*W*W)+pow(rho,5)*(W*W*W*W*W);
| >
| > - vec d = SW.diag();
| > + vec d(SW.diag());
| >
| > direct = sum( d )/n * betas ;
| > total = accu( SW )/n * betas ;
| >
| >
| > For the other packages, I had less luck as the failures are generally in
| > the
| > tests and often require packages I have not installed (here at home, and
| > for
| > technical I don't currently have access to the machine where I usually run
| > the tests).
| >
| > Sp I would be grateful if the maintainers of packages
| >
| > biglasso, bigstatsr, netdiffuseR, repolr
| >
| > (or also any interested volunteers) could take a peek. It seems of the
| > now
| > over 400 CRAN package using RcppArmadillo, all others are fine too -- and I
| > suspect these four also need only small and simple changes. Happy to
| > discuss
| > here.
| >
| >
| > Cheers, Dirk
| >
| >
| > --
| > http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
| >
--
http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
More information about the Rcpp-devel
mailing list