[Rd] Fortran routine affected by unrelated R code
Arne Henningsen
arne.henningsen at googlemail.com
Fri Sep 11 20:31:02 CEST 2009
On Fri, Sep 11, 2009 at 5:00 PM, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
> On 9/11/2009 10:48 AM, Arne Henningsen wrote:
>>
>> Hi!
>>
>> When I run "R CMD check" on the current development version of my R
>> package "frontier" [1], there is no difference between the output of
>> the test scripts in the /tests/ folder and the saved output files
>> (.Rout.save). However, if I change an R file in the /R/ folder, some
>> calls to the Fortran code (called by ".Fortran()") return different
>> results, although the change of the R file is not related to this,
>> e.g. when I add the commands 'print("abc")' or 'newVariable <- 123' to
>> an R file that even does not call the Fortran code. However, adding
>> empty lines or comments does NOT change the values returned by the
>> Fortran code. Different modifications of the R files lead to different
>> results but the same modification always leads to the same results
>> (hence, the results are perfectly reproducible). Since the Fortran
>> code does a non-linear optimization, (slightly) different results
>> (e.g. depending on starting values) could be expected. However, the
>> values passed to the Fortran code are not affected by the
>> modifications that alter the values returned by the Fortran code and I
>> cannot sea any connection between the modification of the R files and
>> the values returned by the Fortran code. Could this phenomenon be
>> caused by an error in the Fortran code, by a bug in R, or is this a
>> usual behavior that an expert would expect in this situation? Any
>> hints are welcome!
>
> It is likely a bug in the Fortran or in R. Since you see it from very
> simple, well-tested R code like print() and <-, I would bet pretty heavily
> on it being in the Fortran.
>
> What it sounds like is that some part of the Fortran code depends on
> uninitialized values, or values outside the bounds of some array. The local
> variables take on values depending on what last used that portion of memory,
> so they are reproducible under identical scripts, but their value depends on
> more than the function arguments.
>
> I don't know Fortran well enough to know if there's an easy way to diagnose
> this. Does valgrind work for Fortran? In the old days, it used to be
> possible to fill the unused portion of the stack with FF bytes: these
> became NaN values in floating point, and -1 in integers, and would often
> trigger errors in functions that weren't ready for NaNs or negatives. I
> don't know how to do that on a modern system, though.
>
> Duncan Murdoch
Thanks for the hint, Duncan. Indeed it was an uninitialized value in
the Fortran code.
/Arne
--
Arne Henningsen
http://www.arne-henningsen.name
More information about the R-devel
mailing list