Hi, I'm seeing something that may be a bug in R's standalone math library, which is packaged by Debian as r-mathlib. I reported it to the Debian BTS as http://bugs.debian.org/657573 I'm using Debian squeeze, and the code was tested with r-mathlib 2.11.1-6 (default on stable) and 2.14.1-1 (from testing/unstable). I summarize this report below. The following code with the R math library hangs. Note that set_seed is defined as taking two unsigned int arguments, so 0's are valid arguments. I'm guessing that since 0 is as low as an unsigned integer can go, it represents some kind of edge case. ################################################ #define MATHLIB_STANDALONE #include <Rmath.h> int main(void) { set_seed(0, 0); rgamma(1, 1); } ################################################ If I add the definitions of `get_seed` and `set_seed` from `src/nmath/standalone/sunif.c` to my code, then the hang disappears. ################################################ #define MATHLIB_STANDALONE #include <Rmath.h> /* A version of Marsaglia-MultiCarry */ static unsigned int I1=1234, I2=5678; void set_seed(unsigned int i1, unsigned int i2) { I1 = i1; I2 = i2; } void get_seed(unsigned int *i1, unsigned int *i2) { *i1 = I1; *i2 = I2; } int main(void) { set_seed(0, 0); rgamma(1, 1); } ################################################ I assume sunif.c defines the `get_seed` and `set_seed` for the R standalone random number generation facilities. However, I wonder why a) redefining them in my source file makes the hang go away and b) why doesn't redefining `get_seed` and `set_seed` (even with the same definition) give a linker error, since the function has been defined in the library already? Dirk also pointed out (in the bug report) that you get the following ########################################################## int main(void) { set_seed(0, 0); cout << "one normal " << norm_rand() << endl; } ########################################################## edd at max:/tmp$ g++ -o faheem faheem.cpp -lRmath; ./faheem one normal -inf One would expect norm_rand to return finite values, even in edge cases. If you want me to report this as a bug, let me know. Thanks. Regards, Faheem
On 28 January 2012 at 02:33, Faheem Mitha wrote: | | Hi, | | I'm seeing something that may be a bug in R's standalone math library, | which is packaged by Debian as r-mathlib. I reported it to the Debian BTS | as http://bugs.debian.org/657573 | | I'm using Debian squeeze, and the code was tested with r-mathlib 2.11.1-6 | (default on stable) and 2.14.1-1 (from testing/unstable). | | I summarize this report below. The following code with the R math library | hangs. Note that set_seed is defined as taking two unsigned int arguments, | so 0's are valid arguments. I'm guessing that since 0 is as low as an | unsigned integer can go, it represents some kind of edge case. | | ################################################ | #define MATHLIB_STANDALONE | #include <Rmath.h> | | int main(void) | { | set_seed(0, 0); | rgamma(1, 1); | } | ################################################ | | If I add the definitions of `get_seed` and `set_seed` from | `src/nmath/standalone/sunif.c` to my code, then the hang disappears. | | ################################################ | #define MATHLIB_STANDALONE | #include <Rmath.h> | | /* A version of Marsaglia-MultiCarry */ | | static unsigned int I1=1234, I2=5678; | | void set_seed(unsigned int i1, unsigned int i2) | { | I1 = i1; I2 = i2; | } | | void get_seed(unsigned int *i1, unsigned int *i2) | { | *i1 = I1; *i2 = I2; | } | | int main(void) | { | set_seed(0, 0); | rgamma(1, 1); | } | ################################################ | | I assume sunif.c defines the `get_seed` and `set_seed` for the R | standalone random number generation facilities. | | However, I wonder why | | a) redefining them in my source file makes the hang go away | | and | | b) why doesn't redefining `get_seed` and `set_seed` (even with the same | definition) give a linker error, since the function has been defined in | the library already? | | Dirk also pointed out (in the bug report) that you get the following | | ########################################################## | int main(void) | { | set_seed(0, 0); | cout << "one normal " << norm_rand() << endl; | } | ########################################################## | | edd at max:/tmp$ g++ -o faheem faheem.cpp -lRmath; ./faheem | one normal -inf Well I actually sent you a complete program of which you showed only an incomplete part. A better quote would have shown all: #define MATHLIB_STANDALONE #include <Rmath.h> #include <iostream> using std::cout; using std::endl; int main(void) { set_seed(0, 0); cout << "one normal " << norm_rand() << endl; } That does indeed return -Inf on my Ubuntu server. It works with other seed values as does the rgamma which hangs only for value 0 and 0. Dirk | One would expect norm_rand to return finite values, even in edge cases. | | If you want me to report this as a bug, let me know. Thanks. | | Regards, Faheem | | ______________________________________________ | R-devel at r-project.org mailing list | https://stat.ethz.ch/mailman/listinfo/r-devel -- "Outside of a dog, a book is a man's best friend. Inside of a dog, it is too dark to read." -- Groucho Marx
On Fri, 27 Jan 2012, Dirk Eddelbuettel wrote:> | Dirk also pointed out (in the bug report) that you get the following > | > | ########################################################## > | int main(void) > | { > | set_seed(0, 0); > | cout << "one normal " << norm_rand() << endl; > | } > | ########################################################## > | > | edd at max:/tmp$ g++ -o faheem faheem.cpp -lRmath; ./faheem > | one normal -inf > > Well I actually sent you a complete program of which you showed only an > incomplete part. A better quote would have shown all: > > #define MATHLIB_STANDALONE > #include <Rmath.h> > #include <iostream> > using std::cout; > using std::endl; > > int main(void) { > set_seed(0, 0); > cout << "one normal " << norm_rand() << endl; > } > > > That does indeed return -Inf on my Ubuntu server. It works with other seed > values as does the rgamma which hangs only for value 0 and 0.Yes, apologies for not including the complete code. Btw, adding the definitions of `get_seed` and `set_seed` from | `src/nmath/standalone/sunif.c` fixes the problem here as well. faheem at orwell[default branch:rev 12]:~/corrmodel/bug$ ./edd one normal -1.26974 where previously it was giving -inf. Regards, Faheem
Possibly Parallel Threads
- trouble using R Mathlib as standalone
- Fwd: Re: calling R's library using C
- compile error with C code and standalone R math C library
- random number generation issues with r and compiled C code
- How to seed the R random number generator in C (standalone) with an instance of .Random.seed