[Rcpp-devel] Using complex numbers in a C program called by R

Baptiste Auguie baptiste.auguie at gmail.com
Mon Jan 4 10:04:19 CET 2016


On 4 January 2016 at 21:14, Pierre Lafaye de Micheaux <
lafaye at dms.umontreal.ca> wrote:

> Dear all,
>
> Thanks again for your answers.
>
> For one of my project, I indeed need the special complex error functions.
> This is why I used the RcppFaddeeva source files in the first time.
>

That's useful to know. In that case, I believe something could be done but
I'd need some help from Dirk to make sure the package export the right
things.
https://github.com/baptiste/rcppfaddeeva/pull/2#issuecomment-109682706


> This being said, it was ALSO a workaround to get access to complex numbers
> operations (and so that the package compile under Windows
> without errors).
>

This workaround is clearly suboptimal and needs to be sorted first IMHO.
I'm guessing that's a magic side-effect of the Rcpp.h include in one of the
files.


> I know that using .C() is now discouraged by R core group. This being
> said, I am a bit reluctant, at least for some projects, to use .Call().
> I like the idea to be able to use old FORTRAN77 codes and/or C codes
> written by others. Usually, using these codes is quite straightforward
> thanks to the .Fortran() interface. As for the C codes, it is only
> necessary to modify the arguments of the C function to make them pointers in
> order to then call it through the .C() function.
>
> My understanding, but maybe I am not good enough, is that to be able to
> call a C/C++ function using .Call() and/or involving Rcpp needs
> a lot more modifications to the original C source file.
>

If you look at RcppFaddeeva, you'll find that the original C+ library is
pretty much untouched, and the c++ wrappers are quite minimal. And with
Rcpp attributes, you don't even have to write R wrappers.

I think this is bad for reproducibility. For example, if one would like to
> call this same C code from Matlab and if this C code is full of Rcpp, then
> I guess there will be some trouble. Am I right?


> Note that I "learned" a bit of Rcpp. I am the author and maintainer of
> package PoweR:
> https://cran.r-project.org/web/packages/PoweR/index.html
> I wrote in this package the file calcpuissRcpp.cpp that contains some Rcpp
> features (maybe you can have a quick look to see my low? level
> of knowledge of Rcpp). And I agree that this is cool stuff when you want
> to be able to access high level
> R functions from C. But as said above, you loose some reproducibility (in
> the sense explained above) and maybe also some speed (and this is why I
> have two "parallel" versions in my PoweR package: calcpuiss.cpp and
> calcpuissRcpp.cpp).
>
> So, with all this in mind, my "request" is still the same. Namely being
> able to manipulate (and create) complex numbers at the (pure) C level in an
> R package so that it could compile properly (without errors) under
> Microsoft Windows. I found this workaround by copying these RcppFaddeeva
> source files
> (.cpp and .h files) in the src/ directory of my package(s) but this is not
> really clean. Probably I could try to remove all "unnecessary" stuff from
> these source
> files in order to keep only what is really needed to play with complex
> numbers at the (pure) C level, but maybe there would be something more
> clever to do? Like adding RcppFaddeeva to the LinkingTo/Depends/Export
> fields?


I believe this step (to use some of Faddeeva's functions) needs some work
in RcppFaddeeva, which I'd be happy to discuss with you and hopefully Dirk,
but that's a different issue altogether.

Or creating a very simple package (by removing all special complex error
> functions from RcppFaddeeva)


Sounds like a good idea to me. And if you put it on github, say, people
could look at it if you get stuck. As I remember, Dirk fixed my
RcppFaddeeva package faster than I was committing to it.

HTH,

baptiste

and call the resulting package EnableC and then add this to
> LinkingTo/Depends/Export fields?


> I hope I made myself clear ...
>
> Thank you again for your time.
>
> Best regards,
>
> Pierre L.
>
>

> Le 03/01/2016 22:14, Dirk Eddelbuettel a écrit :
>
>> On 4 January 2016 at 09:50, Baptiste Auguie wrote:
>> | Hi,
>> |
>> | Just to clarify: did you include files from RcppFaddeeva because you
>> need some
>> | of its functionality (special complex error functions), or was it only a
>> | workaround to get access to complex numbers? In the latter case, I
>> recommend
>> | you try making a minimal Rcpp package to see how easy it is to
>> interface with
>> | C++ functions, and that way you will only have relevant header files
>> included.
>>
>> +1
>>
>> I already responded to Pierre's initial emails in November and tried then
>> to
>> explain to him that that .C() is a _really bad idea at this point in time.
>>
>> It is two months later and nothing has changed.
>>
>> So here is a quick illustration of what Baptiste meant. All it takes is
>>
>>     library(Rcpp)    # no other depends
>>
>> and then (and I even got this right on first try):
>>
>>     R> cppFunction("Rcomplex addTwo(Rcomplex x, Rcomplex y) {return x +
>> y; }")
>>     R> addTwo(2+2i, 3+3i)
>>     [1] 5+5i
>>     R>
>>
>> With one invocation of cppFunction() I created an ad-hoc compiled function
>> (technically compiled as C++ but you can call this C as well) which adds
>> two
>> complex number -- one of Pierre's request as per the email below.  And low
>> and behold is just does that.
>>
>> So yes -- maybe time to learn some Rcpp, maybe forget about .C() and
>> simply
>> get on with this and other other things.
>>
>> Dirk
>>
>> |
>> | Best,
>> |
>> | baptiste
>> |
>> |
>> |
>> | On 4 January 2016 at 09:36, Pierre Lafaye de Micheaux <
>> lafaye at dms.umontreal.ca>
>> | wrote:
>> |
>> |     Dear all,
>> |
>> |     This email comes after a discussion on the R-pkg-devel mailing list:
>> |     https://stat.ethz.ch/pipermail/r-package-devel/2016q1/000627.html
>> |
>> |     My purpose was to be able, in two of my packages, to use complex
>> numbers
>> |     (create some, addition, multiplication, division, modulus, etc)
>> |     directly in a C code that is called from R (using the .C interface).
>> |     Note that these complex numbers might not come from R but could be
>> created
>> |     and used directly in my C code, that will then output (via pointers)
>> |     real (I mean double) values back to R (via the .C interface). I
>> could also
>> |     send from R these complex numbers via the .C interface.
>> |
>> |     A very simple example of such a function called from R via the .C
>> interface
>> |     could be the following:
>> |
>> |     #include <R.h>
>> |     #include "Rmath.h"
>> |     extern "C" {
>> |     void Cfunc(complex double *var) {
>> |         double _Complex z = 1.0 + 2.0 * _Complex_I;
>> |         var[0] = z + exp(var[0]);
>> |     return;
>> |     }}
>> |
>> |     I could call this function from R as follows:
>> |     .C(1i)
>> |
>> |     No problem so far when I use such a function in a package that is
>> compiled
>> |     under Linux. But this will not work under windows (see the
>> discussion
>> |     on the R-pkg-devel list). So what I did to make everything work
>> under
>> |     Windows also was to include in the src/ directory of my package the
>> source
>> |     files
>> |     from the RcppFaddeeva package. Then I would modify the function
>> above as
>> |     follows:
>> |
>> |     #include <R.h>
>> |     #include "Rmath.h"
>> |     #include "libraries/callFaddeeva.cpp"
>> |     #include "libraries/Faddeeva.cpp"
>> |     #include "libraries/RcppExports.cpp"
>> |     extern "C" {
>> |     void Cfunc(complex double *var) {
>> |         cmplx z = C(1.0, 2.0);
>> |         var[0] = z + cexp(var[0]);
>> |     return;
>> |     }}
>> |
>> |     Maybe there is a way not to include all the Faddeeva source files
>> in my
>> |     packages? But I do not know how to do it.
>> |
>> |     Best regards,
>> |
>> |     Pierre L.
>> |
>> |
>> |
>> |     --
>> |     Pierre Lafaye de Micheaux
>> |
>> |     Adresse courrier:
>> |     Université de Montréal
>> |     Pavillon André-Aisenstadt
>> |     Département de Mathématiques et Statistique
>> |     CP 6128 Succursale Centre-ville
>> |     Montréal Qc H3C 3J7
>> |     CANADA
>> |
>> |     Adresse physique:
>> |     Département de Mathématiques et Statistique
>> |     Bureau 4249, Pavillon André-Aisenstadt
>> |     2920, chemin de la Tour
>> |     Montréal, Québec H3T 1J4
>> |     CANADA
>> |
>> |     Tél.: (00-1) 514-343-6607 / Fax: (00-1) 514-343-5700
>> |     lafaye at dms.umontreal.ca
>> |     http://www.biostatisticien.eu
>> |
>> |     _______________________________________________
>> |     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
>> |
>> |
>> | _______________________________________________
>> | 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
>>
>>
> --
> Pierre Lafaye de Micheaux
>
> Adresse courrier:
> Université de Montréal
> Pavillon André-Aisenstadt
> Département de Mathématiques et Statistique
> CP 6128 Succursale Centre-ville
> Montréal Qc H3C 3J7
> CANADA
>
> Adresse physique:
> Département de Mathématiques et Statistique
> Bureau 4249, Pavillon André-Aisenstadt
> 2920, chemin de la Tour
> Montréal, Québec H3T 1J4
> CANADA
>
> Tél.: (00-1) 514-343-6607 / Fax: (00-1) 514-343-5700
> lafaye at dms.umontreal.ca
> http://www.biostatisticien.eu
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20160104/a6a1056b/attachment.html>


More information about the Rcpp-devel mailing list