On Thu, Oct 16, 2014 at 11:35 AM, Kevin Ushey <kevinus...@gmail.com> wrote:
> I think John's advice is spot on here. The issue is only seen when > `NDEBUG` is not defined. > > I can reproduce the crash (assertion failure) by ensuring I have > > CXXFLAGS=-UNDEBUG > > in my ~/.R/Makevars. Note that: > > 1. An assertion failure from Eigen implies you are doing something > that you should not be doing, and > 2. R by default sets -DNDEBUG whenever compiling by default, so I am > surprised that you are not seeing it (does your package have a custom > Makefile / Makevars or something to that effect? Or do you have your > own custom Makevars somewhere?) > > Anyway, let's assume Eigen is right -- this means you're multiplying > two non-conforming matrices, and hence your matrix product is > undefined. Which makes sense, since you're now trying to multiply two > non-conforming matrices. And if you want a scalar * matrix > multiplication then you need to be using a different function. > > Note that this is exactly what Eigen's assertion was telling you here! > Which brings up the issue of the default Makefile for R packages overriding other settings and enforcing -DNDEBUG. I know that I would prefer to learn that there were identifiable inconsistencies in the underlying code, even if it meant that the failed assertion caused R to crash. Those assertions are there for a reason. The decision to enforce a "fail faulty" scheme, where known errors are silently allowed to go undetected, seems peculiar to me. > > On Thu, Oct 16, 2014 at 8:58 AM, John Buonagurio > <jbuonagu...@exponent.com> wrote: > > 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-boun...@lists.r-forge.r-project.org [mailto: > rcpp-devel- > >> boun...@lists.r-forge.r-project.org] On Behalf Of Henrik Singmann > >> Sent: Thursday, October 16, 2014 10:39 AM > >> To: Dirk Eddelbuettel > >> Cc: rcpp-de...@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 > > > > _______________________________________________ > > Rcpp-devel mailing list > > Rcpp-devel@lists.r-forge.r-project.org > > https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel > _______________________________________________ > Rcpp-devel mailing list > Rcpp-devel@lists.r-forge.r-project.org > https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel >
_______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel