From c625bc17a071a3b10c48c130e8c6d102d26bd6b7 Mon Sep 17 00:00:00 2001 From: reinhardfurrer <reinhard.furrer@math.uzh.ch> Date: Thu, 3 Oct 2024 19:26:40 +0200 Subject: [PATCH] Version 1.2 --- DESCRIPTION | 10 +++++----- NEWS | 13 ++++++++++--- dotCall64.Rproj | 21 +++++++++++++++++++++ src/dotCall64.c | 24 ++++++++++++++---------- tests/testthat/test-againstDotC.R | 8 ++++---- tests/testthat/test-flow-center.R | 18 +++++++++--------- tests/testthat/test-flow-left.R | 14 +++++++------- tests/testthat/test-flow-right.R | 4 ++-- tests/testthat/test-long_int64.R | 10 ++++++++-- 9 files changed, 80 insertions(+), 42 deletions(-) create mode 100644 dotCall64.Rproj diff --git a/DESCRIPTION b/DESCRIPTION index a36be37..16a9544 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,15 +1,15 @@ Package: dotCall64 Type: Package Title: Enhanced Foreign Function Interface Supporting Long Vectors -Version: 1.1-0 -Date: 2023-10-16 +Version: 1.2 +Date: 2024-10-03 Authors@R: c(person("Kaspar", "Moesinger", role = c("aut"), email = "kaspar.moesinger@gmail.com"), person("Florian", "Gerber", role = c("aut"), email = "flora.fauna.gerber@gmail.com", comment = c(ORCID = "0000-0001-8545-5263")), person("Reinhard", "Furrer", role = c("cre", "ctb"), - email = "reinhard.furrer@math.uzh.ch", + email = "reinhard.furrer@uzh.ch", comment = c(ORCID = "0000-0002-6319-2332"))) Description: Provides .C64(), which is an enhanced version of .C() and .Fortran() from the foreign function interface. .C64() supports long @@ -20,7 +20,7 @@ License: GPL (>= 2) URL: https://git.math.uzh.ch/reinhard.furrer/dotCall64 BugReports: https://git.math.uzh.ch/reinhard.furrer/dotCall64/-/issues Depends: - R (>= 3.1) + R (>= 4.0) Suggests: microbenchmark, RhpcBLASctl, @@ -32,4 +32,4 @@ Collate: 'vector_dc.R' 'dotCall64.R' 'zzz.R' -RoxygenNote: 7.1.1 +RoxygenNote: 7.2.3 diff --git a/NEWS b/NEWS index 4158a14..11fd7fc 100644 --- a/NEWS +++ b/NEWS @@ -1,8 +1,15 @@ # dotCall64 +# 1.2 +* Depends on R >= 4.0 +* Addressed non-API call to R (here `NAMED` within `MAYBE_SHARED`). + +# 1.1-1 +Date: 2023-11-28 +* Addressed `[-Wformat=]` issue resulting on variable type of `R_xlen_t` # 1.1-0 -Date: 2022-10-16 -* Addressed issue from `_R_CHECK_FORTRAN_KIND_DETAILS_` +Date: 2023-10-16 +* Addressed issue from `_R_CHECK_FORTRAN_KIND_DETAILS_` * Switched from "OpenMPController" to "RhpcBLASctl" * Minor changes in `CITATION` @@ -37,4 +44,4 @@ Date: Tue Dec 5 21:37:52 2017 +0100 * register native routines # 0.9-4 -* CRAN release. \ No newline at end of file +* CRAN release. diff --git a/dotCall64.Rproj b/dotCall64.Rproj new file mode 100644 index 0000000..30e02be --- /dev/null +++ b/dotCall64.Rproj @@ -0,0 +1,21 @@ +Version: 1.0 + +RestoreWorkspace: No +SaveWorkspace: No +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: knitr +LaTeX: pdfLaTeX + +AutoAppendNewline: Yes +StripTrailingWhitespace: Yes + +BuildType: Package +PackageUseDevtools: Yes +PackageInstallArgs: --no-multiarch --with-keep.source +PackageRoxygenize: rd,collate,namespace diff --git a/src/dotCall64.c b/src/dotCall64.c index 9549f5e..a3cd9ae 100644 --- a/src/dotCall64.c +++ b/src/dotCall64.c @@ -1,11 +1,11 @@ #include "dotCall64.h" -// MAYBE_SHARED is not available in R 3.0.1 -#ifndef MAYBE_SHARED -#define MAYBE_SHARED(x) (NAMED(x) > 1) -#define NO_REFERENCES(x) (NAMED(x) == 0) -#define MAYBE_REFERENCED(x) (! NO_REFERENCES(x)) -#endif +// MAYBE_SHARED is not available in R 3.0.1, done in R >= 4.0 +// #ifndef MAYBE_SHARED +// #define MAYBE_SHARED(x) (NAMED(x) > 1) +// #define NO_REFERENCES(x) (NAMED(x) == 0) +// #define MAYBE_REFERENCED(x) (! NO_REFERENCES(x)) +// #endif /* See http://cran.r-project.org/doc/manuals/R-exts.html#C_002dlevel-messages */ #ifdef ENABLE_NLS @@ -156,8 +156,11 @@ SEXP dC64(SEXP args_in) { int type = dotCall64str2type(STRING_ELT(getListElement(s, "mode"), 0)); len = asReal(getListElement(s, "length")); if(flag_verbose == 2) - warning(_("[dotCall64|vector_dc] argument %d; allocate vector of type %s (%d); length %d"), na+1, - CHAR(STRING_ELT(getListElement(s, "mode"), 0)), type, len); + // eliminated the %d-len printing due to issues on CRAN. See emails 27 November, 2023 08:58 + // warning(_("[dotCall64|vector_dc] argument %d; allocate vector of type %s (%d); length %d"), na+1, + // CHAR(STRING_ELT(getListElement(s, "mode"), 0)), type, len); + warning(_("[dotCall64|vector_dc] argument %d; allocate vector of type %s (%d)"), na+1, + CHAR(STRING_ELT(getListElement(s, "mode"), 0)), type); args[na] = PROTECT(allocInitializedVector(type, len)); n_protect++; } @@ -375,10 +378,11 @@ void dotCall64(DL_FUNC fun, int nargs, SEXP *args, int *args_type, int *args_int } if(flag_verbose == 2){ - warning(_("[dotCall64|flags] arg %d: type %s (%d); alloc %d; coerce %d; dup %d;\ncast.in %d; cast.back %d; named: %d, mb-ref %d; mb-shared %d\n"), + warning(_("[dotCall64|flags] arg %d: type %s (%d); alloc %d; coerce %d; dup %d;\ncast.in %d; cast.back %d; mb-ref %d; mb-shared %d\n"), na+1, type2char(do_type[na]), do_type[na], do_alloc[na], do_coerce[na], do_duplicate[na], do_cast_in[na], do_cast_back[na], - NAMED(s), maybe_referenced, maybe_shared); + // NAMED(s), + maybe_referenced, maybe_shared); } } diff --git a/tests/testthat/test-againstDotC.R b/tests/testthat/test-againstDotC.R index f26a817..4a8d20d 100644 --- a/tests/testthat/test-againstDotC.R +++ b/tests/testthat/test-againstDotC.R @@ -8,7 +8,7 @@ test_that("int", { PACKAGE = "dotCall64") expect_equal(cc, dc, label = "[values]") expect_equal(lapply(cc, typeof), lapply(dc, typeof), - label = "[types]") + label = "[types]") }) @@ -21,7 +21,7 @@ test_that("double", { PACKAGE = "dotCall64") expect_equal(cc, dc, label = "[values]") expect_equal(lapply(cc, typeof), lapply(dc, typeof), - label = "[types]") + label = "[types]") }) ## -------------------- @@ -35,7 +35,7 @@ test_that("referenced-integer", { PACKAGE = "dotCall64") expect_equal(cc, dc, label = "[values]") expect_equal(lapply(cc, typeof), lapply(dc, typeof), - label = "[types]") + label = "[types]") expect_identical(input, 2L) }) @@ -49,6 +49,6 @@ test_that("referenced-double", { PACKAGE = "dotCall64") expect_equal(cc, dc, label = "[values]") expect_equal(lapply(cc, typeof), lapply(dc, typeof), - label = "[types]") + label = "[types]") expect_identical(input, 2.2) }) diff --git a/tests/testthat/test-flow-center.R b/tests/testthat/test-flow-center.R index 91f4bae..91e39f3 100644 --- a/tests/testthat/test-flow-center.R +++ b/tests/testthat/test-flow-center.R @@ -7,7 +7,7 @@ test_that("double-double", { PACKAGE = "dotCall64", VERBOSE = 1) dc_e <- list(a = 6.6, b = 2) - expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) + expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) expect_equal(dc, dc_e) expect_identical(a, 3.3, label = "[modified R object]") @@ -27,7 +27,7 @@ test_that("double-double-modifiedRead", { a = a, b = 2, INTENT = c("r", "rw"), PACKAGE = "dotCall64", VERBOSE = 1) dc_e <- list(a = NULL, b = 2) - expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) + expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) expect_equal(dc, dc_e) expect_identical(a, 6.6, label = "[modified R object]") @@ -50,7 +50,7 @@ test_that("int-int", { a = a, b = 2L, PACKAGE = "dotCall64", VERBOSE = 1) dc_e <- list(a = 6L, b = 2L) - expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) + expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) expect_equal(dc, dc_e) expect_identical(a, 3L, label = "[modified R object]") @@ -65,12 +65,12 @@ test_that("int-int", { test_that("int-int-modifiedRead", { - a <- 3L + a <- 3L dc <- .C64("TEST_prod_int", c("int", "int"), a = a, b = 2L, INTENT = c("r", "rw"), PACKAGE = "dotCall64", VERBOSE = 1) dc_e <- list(a = NULL, b = 2L) - expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) + expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) expect_equal(dc, dc_e) expect_identical(a, 6L, label = "[modified R object]") @@ -94,7 +94,7 @@ test_that("int-double-rw", { PACKAGE = "dotCall64", VERBOSE = 1)) dc <- suppressWarnings(eval(expr)) dc_e <- list(a = 6L, b = 2L) - expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) + expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) expect_equal(dc, dc_e) expect_identical(a, 3, label = "[modified R object]") expect_warning(eval(expr), "[dotCall64|wrong R object type]", @@ -117,7 +117,7 @@ test_that("int-double-r", { PACKAGE = "dotCall64", VERBOSE = 1)) dc <- suppressWarnings(eval(expr)) dc_e <- list(a = NULL, b = 2L) - expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) + expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) expect_equal(dc, dc_e) expect_identical(a, 3, label = "[modified R object]") expect_warning(eval(expr), "[dotCall64|wrong R object type]", @@ -141,7 +141,7 @@ test_that("double-int-rw", { PACKAGE = "dotCall64", VERBOSE = 1)) dc <- suppressWarnings(eval(expr)) dc_e <- list(a = 6, b = 2) - expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) + expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) expect_equal(dc, dc_e) expect_identical(a, 3L, label = "[modified R object]") expect_warning(eval(expr), "[dotCall64|wrong R object type]", @@ -164,7 +164,7 @@ test_that("double-int-r", { PACKAGE = "dotCall64", VERBOSE = 1)) dc <- suppressWarnings(eval(expr)) dc_e <- list(a = NULL, b = 2) - expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) + expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) expect_equal(dc, dc_e) expect_identical(a, 3L, label = "[modified R object]") expect_warning(eval(expr), "[dotCall64|wrong R object type]", diff --git a/tests/testthat/test-flow-left.R b/tests/testthat/test-flow-left.R index 5d0b038..b3a6336 100644 --- a/tests/testthat/test-flow-left.R +++ b/tests/testthat/test-flow-left.R @@ -6,7 +6,7 @@ test_that("int64-double-rw", { a = a, b = 2, PACKAGE = "dotCall64", VERBOSE = 1) dc_e <- list(a = 2**33, b = 2) - expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) + expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) expect_equal(dc, dc_e) expect_identical(a, 2**32, label = "[modified R object]") @@ -23,7 +23,7 @@ test_that("int64-double-r", { a = a, b = 2, INTENT = c("r", "rw"), PACKAGE = "dotCall64", VERBOSE = 1) dc_e <- list(a = NULL, b = 2) - expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) + expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) expect_equal(dc, dc_e) expect_identical(a, 2**32, label = "[modified R object]") ## a not modified, because not in place double -> long int transition @@ -46,7 +46,7 @@ test_that("int64-integer-rw", { PACKAGE = "dotCall64", VERBOSE = 1)) dc <- suppressWarnings(eval(expr)) dc_e <- list(a = 10, b = 2) - expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) + expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) expect_equal(dc, dc_e) expect_identical(a, 5L, label = "[modified R object]") expect_warning(eval(expr), "[dotCall64|wrong R object type]", @@ -67,7 +67,7 @@ test_that("int64-integer-r", { PACKAGE = "dotCall64", VERBOSE = 1)) dc <- suppressWarnings(eval(expr)) dc_e <- list(a = NULL, b = 2) - expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) + expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) expect_equal(dc, dc_e) expect_identical(a, 5L, label = "[modified R object]") ## a not modified, because not in place double -> long int transition @@ -92,7 +92,7 @@ test_that("int64-complex-rw", { PACKAGE = "dotCall64", VERBOSE = 1)) dc <- suppressWarnings(eval(expr)) dc_e <- list(a = 10, b = 2) - expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) + expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) expect_equal(dc, dc_e) expect_identical(a, 5+5i, label = "[modified R object]") expect_warning(eval(expr), "[dotCall64|wrong R object type]", @@ -101,7 +101,7 @@ test_that("int64-complex-rw", { expr <- expression(.C64("TEST_prod_int64", c("int64", "int64"), a = a, b = 2+2i, PACKAGE = "dotCall64", VERBOSE = 2)) - + expect_warning(eval(expr), "alloc 0; coerce 1; dup 0;\ncast.in 1; cast.back 1") @@ -114,7 +114,7 @@ test_that("int64-complex-r", { PACKAGE = "dotCall64", VERBOSE = 1)) dc <- suppressWarnings(eval(expr)) dc_e <- list(a = NULL, b = 2) - expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) + expect_equal(lapply(dc, typeof), lapply(dc_e, typeof)) expect_equal(dc, dc_e) expect_identical(a, 5+5i, label = "[modified R object]") ## a not modified, because not in place double -> long int transition diff --git a/tests/testthat/test-flow-right.R b/tests/testthat/test-flow-right.R index 3715ae3..611340f 100644 --- a/tests/testthat/test-flow-right.R +++ b/tests/testthat/test-flow-right.R @@ -31,7 +31,7 @@ test_that(paste0("right-", paste0(tg[i,], collapse = "-")), { int = integer_dc(1), double = numeric_dc(1), int64 = numeric_dc(1)) - + expr <- expression( .C64(paste0("TEST_times2_", signature), c(signature, signature), @@ -59,7 +59,7 @@ test_that(paste0("right-", paste0(tg[i,], collapse = "-")), { int64 = 2^32), label = "[corrupt R object]", info = info) - + if(referenced) expect_identical(b, switch(type, int = 1L, diff --git a/tests/testthat/test-long_int64.R b/tests/testthat/test-long_int64.R index 4fe0bbb..f229bec 100644 --- a/tests/testthat/test-long_int64.R +++ b/tests/testthat/test-long_int64.R @@ -3,12 +3,18 @@ context("test-local-tests") test_that("pass-long-int64_t", { skip_on_cran() - a <- numeric(2^31) + + # Ideally, the following should be tested with N <- 31. Blows my laptop... + N <- 31 + N <- 21 + + a <- numeric(2^N) + expect_identical(.C64("BENCHMARK", SIGNATURE = "int64", a = a, INTENT = "rw", - NAOK = TRUE, + NAOK = TRUE, VERBOSE = 1, PACKAGE = "dotCall64")$a, a) -- GitLab