[Rcpp-devel] RcppArmadillo and sugar

Romain Francois romain at r-enthusiasts.com
Wed Aug 18 08:06:29 CEST 2010


Le 18/08/10 06:56, Davor Cubranic a écrit :
> On August 17, 2010 03:26:15 am Romain Francois wrote:
>> After the last thread, I looked again at armadillo and came up with a
>> way to make it aware of Rcpp sugar, so that we can create an
>> armadillo matrix from an Rcpp sugar expression, without having to
>> assign the expression into an Rcpp vector.
> [...]
>> The name forward might not be the right verb here, I was also
>> thinking about "melt" so that we melt sugar into caramel, but I'd
>> like to hear what others do with sugar.
>
> Can we use the same name that we already use for conversion of Rcpp
> types to Armadillos? ('Rcpp::as'?) Conceptually, does it really matter
> if we're melting a sugar expression or a plain old NumericVector?
>
> Davor

It matters to the compiler.

The way as works, it has to know the target type because of its signature :

template <typename T> T as( SEXP m_sexp) throw(not_compatible)


And the target type here, the type that "forward" creates is not 
arma::mat, but rather something that the mat constructor will handle, 
and it depends on the input type of forward. For example :

NumericVector xx(x) ;
arma::mat m = forward( xx + xx ) ;

forward makes an object of that type :

arma::Op<
	Rcpp::VectorBase<REALSXP,true, Rcpp::sugar::Plus_Vector_Vector< 
REALSXP, true, Rcpp::NumericVector, true, Rcpp::NumericVector > > ,
	Rcpp::RcppArmadillo::r_forward<REALSXP,true, 
Rcpp::sugar::Plus_Vector_Vector< REALSXP, true, Rcpp::NumericVector, 
true, Rcpp::NumericVector > >
 >

you surely don't want to have this in the as angle brackets.





Now I suppose we could use overloading of as and make it coexists with 
another as with a different signature :

template <typename T>
template <typename U>
some_appropriate_lazy_type<T,U> as( const U& u )

but I am not sure how feasible this is.



Another way of course would be to hijack armadillo, which we can do as 
RcppArmadillo contains it, so that Mat has a constructor taking a sugar 
expression, so that w would simply do :

NumericVector xx(x) ;
arma::mat m = xx + xx ;

The problem (not an impossible situation, but still a problem) is that 
it will require manual intervention each time we upgrade to a new 
armadillo.

Plus I think I like to have at least something explicit.

Romain

-- 
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://bit.ly/bzoWrs : Rcpp svn revision 2000
|- http://bit.ly/b8VNE2 : Rcpp at LondonR, oct 5th
`- http://bit.ly/aAyra4 : highlight 0.2-2



More information about the Rcpp-devel mailing list