[Rcpp-devel] 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
| (y0-i+1) + i*std::log(lambdaratio);
|           maxsums = sums.max();
|           sums = sums-maxsums;     
|           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
| 
|  
| 
|  
| 
| 
| ----------------------------------------------------------------------
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

-- 
Gauss once played himself in a zero-sum game and won $50.
                      -- #11 at http://www.gaussfacts.com


More information about the Rcpp-devel mailing list