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