[Rcppdevel] Error: unimplemented type 'double' in 'coerceToReal'
Dirk Eddelbuettel
edd at debian.org
Mon Jun 27 16:49:30 CEST 2011
Hi Clarence,
Thanks for posting here on the list.
On 25 June 2011 at 15:36, Lee, Clarence wrote:
 I'm running a MCMC estimation of a Bayesian model, and I'm running into a
 particular error during the MCMC in my likelihood function call. I?ve
 implemented my likelihood function in C++ using RCpp, and I get this
 ?unimplemented type? error:



 Error in loglik.func(): unimplemented type ?double? in ?coerceToReal.?
That didn't ring a bell as a identifier of ours, and indeed, it isn't used by
us:
~/svn/rcpp/pkg$ grep rin coerceToReal .
~/svn/rcpp/pkg$
So sorry, we will have to pass.
 The nasty thing about this is that it is very hard to replicate, and only
 occurs after a particular iteration in my MCMC. While my function stalls when
 this errors occurs, all the other times it returns the correct values. My
 specific question is: are there any particular functions in the Rcpp library
 that calls coerceToReal?? I?m trying to understand what would cause Rcpp to
I do not believe so.
 throw an error like this (eg. memory leaks, mismatching of types?etc). A
 Google search returns very few relevant results on this type of error.



 I think I?ve isolated the problem area in my code to this function:



 //////////////////////////////////////////

 Rcpp::NumericVector pbivpois(arma::colvec x, arma::colvec y, arma::rowvec
 lambda, bool returnLog) {
 // Unlike the pbivpois function, this assumes that x is a vector, and does
 not error check.
 // Declare Internal Variables
 int N = x.n_rows;
 Rcpp::NumericVector logbp(N);
 Rcpp::NumericVector result(N);
 int x0 = 0;
 int y0 = 0;
 int xymin = 0;
 Rcpp::NumericVector i(2);
 arma::rowvec sums = arma::zeros<arma::rowvec>(3);
 double lambdaratio = 0;
 double maxsums = 0;
 double logsummation =0;

 for(int k = 0; k < N; k++) {
 x0 = x.row(k);
 y0 = y.row(k);



 //////////////////////////////////////////////////

 // I think these lines are causing the problem.


 xymin = std::min(x0, y0);
 lambdaratio = lambda.col(2)/(lambda.col(0)*lambda.col(1));
 i = Rcpp::seq(0,xymin);
 sums = Rcpp::lgamma(x0  i + 1)Rcpp::lgamma(i+1)  Rcpp::lgamma
 (y0i+1) + i*std::log(lambdaratio);
 maxsums = sums.max();
 sums = sumsmaxsums;
 logsummation = std::log(arma::accu(arma::exp(sums))) + maxsums;

 logbp[k] = arma::accu(lambda) + x0*std::log(lambda.col(0)) +
 y0*std::log(lambda.col(1)) + logsummation;
You could try replacing the lgamma calls (which we pass on to the R API) with
something from another library.
And/or extract this inner loop and just try to 'blast' it through 1e7
iterations or some other stress test.
Lastly, valgrind may be of help too.
Sorry, but I can offer no better help at this point.
Cheers, Dirk


 ////////////////////////////////////
 }

 if( returnLog == TRUE ) {
 result = logbp;
 } else {
 result = Rcpp::exp(logbp);
 }

 return(result);
 }

 ////////////////////////////////////////////////


 Thanks for your help!



 Best,



 Clarence






 
 _______________________________________________
 Rcppdevel mailing list
 Rcppdevel at lists.rforge.rproject.org
 https://lists.rforge.rproject.org/cgibin/mailman/listinfo/rcppdevel

Gauss once played himself in a zerosum game and won $50.
 #11 at http://www.gaussfacts.com
More information about the Rcppdevel
mailing list