[ADMB Users] ABMD & DLLs
Arni Magnusson
arnima at hafro.is
Sun Feb 21 15:15:12 PST 2010
I had experimented with DLL compilation, but never enough to notice this
bug. By the way, the assignment call does work if it's the first thing in
the session,
x <- rep(0,100)
f <- 0
dyn.load("simpleDLL.dll")
res <- .C("simpleDLL", as.integer(length(x)), as.double(x),
as.double(f), "")
but then a plain subsequent run will crash:
.C("simpleDLL", as.integer(length(x)), as.double(x), as.double(f), "")
It is therefore conceivable that an R package would work fine, since
package functions would always make an assignment call, and never make a
plain call without assigning the result to an object name.
R does not have this problem with non-ADMB DLLs I have tried, so it
appears that all ADMB DLLs are at least half broken. I still believe this
can be fixed by a skilled C++ programmer, with hints from Dave Fournier.
Until then, Johnoel will probably tag this bug report with a number.
Laurie, as an encouragement to improve ADMB in this area, can you describe
the benefits of using DLLs as opposed to plain executables? I have only
experimented with this a bit, and tried out the R package 'glmmADMB' which
uses plain executables. I'm guessing DLLs are a tidier connection than
passing text files to and from executables, but the latter approach can
achieve the same goal by adding a couple of lines to the R function to
take care of temporary files, right? The time penalty should be
negligible; I just tried writing and reading a 5 column x 1000 row dataset
in R,
write.table(quakes, "quakes.txt", row.names=FALSE)
quakes2 <- read.table("quakes.txt", header=TRUE)
and it takes 0.06 sec on Windows and 0.02 sec on Linux 64, even when using
the inefficient read.table and write.table functions. File handling on the
ADMB side should be very fast as well.
The benefit of using plain executables is of course that the same model
can be used either as stand-alone or called by other software via text
files. If the medium-term goal is to fix the ADMB DLLs, then a long-term
goal could be to make it possible to compile both DLLs and executables
without modifying the TPL code.
Thanks for exploring this, and for improving the MSVC compilation scripts.
Arni
On Sun, 21 Feb 2010, Laurie Kell wrote:
> I have managed to compile windows MSVC9 DLLs, both on the command line
> and using the IDE with debugging info. I will update the adlink.bat for
> MSVC9
>
> However, using the simple example to create the DLL there is a problem
> when calling the DLL from R for versions compiled in MSVC9 and GCC
> (windows and linux).
>
> The MSVC9 dll crashes at line
>
> mp.computations(argc,argv);
>
> While under GCC (both windows and linux) although the DLL runs i.e.
> .C("simpleDLL", ...)
>
> it crashes R if you try to save the results i.e.
> res<-.C("simpleDLL", ...)
>
> I think this points to a memory allocation or a calling convention
> problem in the ADMB code. I´ve had a quick look at the code on
> http://code.google.com/p/admb-project
>
> But think it might be easier if somebody who is more familar with the
> source than me could have a look at this problem.
>
> Laurie
>
More information about the Users
mailing list