[Rcpp-devel] RcppEigen: Windows binary from CRAN crashes R, but not when installing from source.

John Buonagurio jbuonagurio at exponent.com
Thu Oct 16 17:58:08 CEST 2014


Hi Henrik,

You can just add #define EIGEN_NO_DEBUG to make it clear that you want to specifically disable Eigen assertions, without relying on what sets or does not set the DNDEBUG flag. It's in the Eigen documentation: 

http://eigen.tuxfamily.org/dox/TopicPreprocessorDirectives.html

John

> -----Original Message-----
> From: rcpp-devel-bounces at lists.r-forge.r-project.org [mailto:rcpp-devel-
> bounces at lists.r-forge.r-project.org] On Behalf Of Henrik Singmann
> Sent: Thursday, October 16, 2014 10:39 AM
> To: Dirk Eddelbuettel
> Cc: rcpp-devel at r-forge.wu-wien.ac.at
> Subject: Re: [Rcpp-devel] RcppEigen: Windows binary from CRAN crashes R, but
> not when installing from source.
> 
> <html>
> Hi Dirk,
> 
> I am sorry to address this again, as I am in no position to argue, but the problem
> is still the following:
> The code runs perfectly as your example showed but will fail when using either
> devtools or winbuilder or CRAN when *inside a package*. The problem of
> producing a minimally reproducible example of your liking is that either of those
> conditions cannot be met: I need the package to reproduce it.
> 
> I also agree that it is an issue of multiplying non-conformable vectors. But as can
> be easily shown using the code you had sent, when compiling it on owns own
> (i.e., not using the conditions reproducing the crash described above) this only
> leads to a result of 0. However, when using the binary from either of the above
> it crashes R with an assertion error.
> It is also important to note that this did not happen in the past.
> 
> So I probably just need to set the correct compiler flags or disable DNDEBUG or
> such a thing, but I did not manage to do this in such a way to prohibit the crash
> under the above described circumstances.
> I would really like to receive any advice on how to avoid this crash (assertion
> error) when using the binary compiled on CRAN, this is in the end the critical
> issue. *How can I disable the assertion error compiling in my code?* Just adding
> "#undef NDEBUG" at the beginning didn't work.
> 
> 
> On an unrelated note, the issue of within package or outside of a package also
> concerns the question of "using Eigen::..." versus prefacing all calls to Eigen
> parts with Eigen:: directly.
> While the code you had sent works great when using sourceCpp(), I didn't
> manage to get it to work in a package (even after wildly using
> compileAttributes). I had to replace all calls of e.g., VectorXd with
> Eigen::VectorXd. Is there a trick of how to do this inside a package?
> 
> Btw, I agree that using the RcppAttributes is great. I hadn't used it, because, you
> know, "never touch a running system." But as it failed now, it is perhaps time for
> a change.
> 
> Thanks again,
> Henrik
> 
> 
> Am 16.10.2014 um 16:04 schrieb Dirk Eddelbuettel:
> > On 16 October 2014 at 08:35, Dirk Eddelbuettel wrote:
> > |
> > |
> > | On 16 October 2014 at 15:07, Henrik Singmann wrote:
> > | | Hi Dirk and Kevin,
> > | |
> > | | I have now rebuild the package using the code Dirk send me (i.e., using
> attributes) and the code still reliably crashes my R on Linux when using devtools
> (independent of RStudio), but not when installing via install.packages. When just
> using the code Dirk had send directly (i.e., outside a package) this does not
> happen.
> > |
> > | Please take that up with the devtools maintainer. I do not use devtools.
> >
> > And FWIW he used confirmed over IM that devtools sets NDEBUG.  So
> > there -- devtools issues, not an Rcpp or RcppEigen issue.
> >
> > Dirk
> >
> > | It is not part of what we asked for:  __a minimally reproducible
> > | example__
> > |
> > | | Note that I had to minimally change the code Dirk had sent as I couldn't
> manage to use "using Eigen::" so had to preface every call to Eigen functions or
> structures with "Eigen::".
> > |
> > | Here is my counter example. Ubuntu 14.04. Everything current.
> > |
> > | Save the following a file "henrik.cpp"
> > |
> > | --------------------------------------------------------------------
> > | ---------
> > |
> > | #include <RcppEigen.h>
> > |
> > | using namespace Rcpp;
> > |
> > | using Eigen::Map;
> > | using Eigen::VectorXd;
> > | using Eigen::RowVectorXd;
> > | using Eigen::MatrixXd;
> > |
> > | // [[Rcpp::depends(RcppEigen)]]
> > |
> > | // The following is __identical__ to mptmin::src/determinant.cpp //
> > | but at the same time much, much shorter and more readable // // The
> > | following 'tag' ensure determinant2() is accessible from R // //
> > | [[Rcpp::export]] int determinant2(int S, Map<MatrixXd> Ineq) {
> > |
> > |     VectorXd thetaTMP = Rcpp::as<VectorXd>(rbeta(S, 0.5, 0.5));
> > |     RowVectorXd theta = thetaTMP.transpose();
> > |
> > |     VectorXd IneqT = (theta*Ineq.transpose());
> > |
> > |     return 0;
> > | }
> > |
> > | /*** R
> > |
> > | # the following is equivalent to mptmin::R/minimal.cpp # but shorter
> > | and easier; also removed the leading dot
> > | oneSample2 <- function(Sx, Ineq) {
> > |   #.Call("determinant2", Sx, Ineq, PACKAGE = "MPTbug")
> > |   determinant2(Sx, Ineq)
> > | }
> > |
> > | # the dimensions are of course incompatible so this is user error
> > | trigger <- function() {
> > |   S <- 3
> > |   # why would you create a matrix via structure() ?
> > |   Ineq <- structure(0, .Dim = c(1L, 1L))  #error
> > |   oneSample2(Sx = S, Ineq = Ineq)
> > | }
> > |
> > | no_trigger <- function() {
> > |   S <- 3
> > |   Ineq <- structure(c(-1, 1, 0), .Dim = c(1L, 3L))  # no error
> > |   oneSample2(Sx = S, Ineq = Ineq)
> > | }
> > |
> > | no_trigger()                 # no issue
> > | trigger()                    # no issue either
> > | */
> > |
> > | --------------------------------------------------------------------
> > | ---------
> > |
> > |
> > | In an R session, issue the following command
> > | sourceCpp("filename.cpp") with the name (plus optional path) to the
> > | file above.  Here is what I get in a fresh session:
> > |
> > | --------------------------------------------------------------------
> > | ---------
> > | R> Rcpp::sourceCpp("~/Dropbox/tmp/henrik.cpp")
> > |
> > | R> # the following is equivalent to mptmin::R/minimal.cpp # but
> > | R> shorter and easier; also removed the leading dot
> > | R> oneSample2 <- function(Sx, In .... [TRUNCATED]
> > |
> > | R> # the dimensions are of course incompatible so this is user error
> > | R> trigger <- function() {
> > | +   S <- 3
> > | +   # why would you create a matrix via str .... [TRUNCATED]
> > |
> > | R> no_trigger <- function() {
> > | +   S <- 3
> > | +   Ineq <- structure(c(-1, 1, 0), .Dim = c(1L, 3L))  # no error
> > | +   oneSample2(Sx = S, Ineq = Ineq)
> > | + }
> > |
> > | R> no_trigger()                 # no issue
> > | [1] 0
> > |
> > | R> trigger()                    # no issue either
> > | [1] 0
> > | R>
> > | --------------------------------------------------------------------
> > | ---------
> > |
> > | I consider this issue closed because __there is still no minimal
> > | reproducible bug__.
> > |
> > | There is what we could call a user error. Or if you wish a design
> > | error. You simply cannot multiply non-conformant vectors.
> > |
> > | Dirk



More information about the Rcpp-devel mailing list