[Rcpp-devel] [Pre-ANN] RcppArmadillo 0.8.100.1.0, and request for help

George Vega Yon g.vegayon at gmail.com
Mon Oct 9 19:46:03 CEST 2017


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
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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20171009/f87113ac/attachment.html>


More information about the Rcpp-devel mailing list