[R-pkg-devel] Solaris SPARC, Fortran, and logical errors?
Ben Bolker
bbolker at gmail.com
Wed Mar 15 18:30:52 CET 2017
On 17-03-15 11:09 AM, J C Nash wrote:
> Possibly tangential, but has there been any effort to set up a Sparc
> testbed? It
> seems we could use a network-available (virtual?) machine, since this
> platform is
> often the unfortunate one. Unless, of course, there's a sunset date.
>
> For information, I mentioned SPARC at our local linux group, and
> apparently there
> are a couple of folk who have them running, but I didn't find out the
> state of the
> OS etc.
>
> JN
The virtual machine platforms I know of (admittedly not a complete
list!) only support Solaris on x86, e.g.
https://community.oracle.com/thread/2569292
>
>
> On 2017-03-15 10:40 AM, Avraham Adler wrote:
>> Hello.
>>
>> The Delaporte package works properly on all R-core platforms except
>> Solaris SPARC, where it compiles properly but fails a number of its
>> tests [1]. Not having access to a SPARC testbed, I'm limited in what
>> kind of diagnostics I can do. One thing I have noticed is that a lot
>> of the failures occur when I am passing non-default logicals (like
>> lower tail or log). For example, the first failure at that link is
>> when "log = true" is supposed to be passed, but the SPARC answers are
>> the unlogged values. Of the 22 failed tests, 12 of them pass logicals.
>>
>> I'll bring an example of how it is coded below, and if anyone
>> recognizes where SPARC specifically goes wrong, I'd appreciate. I
>> guess, if I absolutely had to, I could convert the logical to an
>> integer in C and pass the integer to Fortran which should work even
>> for SPARC, but I'd prefer not to if I could help it.
>>
>> Thank you,
>>
>> Avi
>>
>> [1] https://cran.r-project.org/web/checks/check_results_Delaporte.html
>>
>> *****Example Code*****
>>
>> R code:
>>
>> ddelap <- function(x, alpha, beta, lambda, log = FALSE){
>> if(!is.double(x)) {storage.mode(x) <- 'double'}
>> if(!is.double(alpha)) {storage.mode(alpha) <- 'double'}
>> if(!is.double(beta)) {storage.mode(beta) <- 'double'}
>> if(!is.double(lambda)) {storage.mode(lambda) <- 'double'}
>> if(any(x > floor(x))) {
>> warning("Non-integers passed to ddelap. These will have 0
>> probability.")
>> }
>> .Call(ddelap_C, x, alpha, beta, lambda, log)
>> }
>>
>> C code:
>>
>> void ddelap_f(double *x, int nx, double *a, int na, double *b, int nb,
>> double *l, int nl,
>> int *lg, double *ret);
>>
>> extern SEXP ddelap_C(SEXP x, SEXP alpha, SEXP beta, SEXP lambda, SEXP
>> lg){
>> const int nx = LENGTH(x);
>> const int na = LENGTH(alpha);
>> const int nb = LENGTH(beta);
>> const int nl = LENGTH(lambda);
>> SEXP ret;
>> PROTECT(ret = allocVector(REALSXP, nx));
>> ddelap_f(REAL(x), nx, REAL(alpha), na, REAL(beta), nb, REAL(lambda),
>> nl, LOGICAL(lg), REAL(ret));
>> UNPROTECT(1);
>> return(ret);
>> }
>>
>> Fortran: (not posting ddelap_f_s as that doesn't handle the logging)
>>
>> subroutine ddelap_f(x, nx, a, na, b, nb, l, nl, lg, pmfv) bind(C,
>> name="ddelap_f")
>>
>> integer(kind = c_int), intent(in), value :: nx, na, nb, nl
>> ! Sizes
>> real(kind = c_double), intent(in), dimension(nx) :: x
>> ! Observations
>> real(kind = c_double), intent(out), dimension(nx):: pmfv
>> ! Result
>> real(kind = c_double), intent(in) :: a(na), b(nb),
>> l(nl)! Parameters
>> logical(kind = c_bool), intent(in) :: lg
>> ! Log flag
>> integer :: i
>> ! Integer
>>
>> !$omp parallel do default(shared) private(i)
>> do i = 1, nx
>> if (x(i) > floor(x(i))) then
>> pmfv(i) = ZERO
>> else
>> pmfv(i) = ddelap_f_s(x(i), a(mod(i - 1, na) + 1), &
>> b(mod(i - 1, nb) + 1), l(mod(i -
>> 1, nl) + 1))
>> end if
>> end do
>> !$omp end parallel do
>>
>> if (lg) then
>> pmfv = log(pmfv)
>> end if
>>
>> end subroutine ddelap_f
>>
>> ______________________________________________
>> R-package-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-package-devel
>>
>
> ______________________________________________
> R-package-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-package-devel
More information about the R-package-devel
mailing list