Skip to content

Commit 8364344

Browse files
tests: use identical(NA_real_+0, NA_real_) to skip tests that depend on NA payload propagation (#7702)
* froll.Rraw: skip tests that depend on NA payload RISC-V chips do not propagate NaN payload through arithmetic operations. * Better test for when to skip NA tests Co-Authored-By: Michael Chirico <chiricom@google.com> * Drop unused check from frollBatch.Rraw * Test R behaviour to stop NA-related test * Fix typo --------- Co-authored-by: Michael Chirico <chiricom@google.com>
1 parent 76ec862 commit 8364344

File tree

3 files changed

+13
-19
lines changed

3 files changed

+13
-19
lines changed

inst/tests/froll.Rraw

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,9 @@ if (exists("test.data.table", .GlobalEnv, inherits=FALSE)) {
99
froll = data.table:::froll
1010
}
1111

12-
exact_NaN = isTRUE(capabilities()["long.double"]) && identical(as.integer(.Machine$longdouble.digits), 64L)
12+
exact_NaN = identical(NA_real_+0, NA_real_)
1313
if (!exact_NaN) {
14-
cat("\n**** Skipping 8 NaN/NA algo='exact' tests because .Machine$longdouble.digits==", .Machine$longdouble.digits, " (!=64); e.g. under valgrind\n\n", sep="")
15-
# for Matt when he runs valgrind it is 53, but 64 when running regular R
16-
# froll.c uses long double and appears to require full long double accuracy in the algo='exact'
14+
cat("\n**** Skipping 10 NaN/NA algo='exact' tests because NaN payload doesn't propagate through arithmetic operations\n\n")
1715
}
1816

1917
## rolling features
@@ -1456,8 +1454,10 @@ test(6001.731, between(frollvar(y, 3)[4L], 0, 1e-7))
14561454
test(6001.732, between(frollsd(y, 3)[4L], 0, 1e-7))
14571455
test(6001.733, frollvar(y, c(3,3,3,3), adaptive=TRUE)[4L], 0)
14581456
test(6001.734, frollsd(y, c(3,3,3,3), adaptive=TRUE)[4L], 0)
1459-
test(6001.740, frollvar(c(1.5,2.5,2,NA), c(3,3)), list(c(NA,NA,0.25,NA), c(NA,NA,0.25,NA)), output="running sequentially, because outer parallelism has been used", options=c(datatable.verbose=TRUE)) # ensure no nested parallelism in rolling functions #7352
1460-
test(6001.741, frollsd(c(1.5,2.5,2,NA), c(3,3)), list(c(NA,NA,0.5,NA), c(NA,NA,0.5,NA)), output="running sequentially, because outer parallelism has been used", options=c(datatable.verbose=TRUE))
1457+
if (exact_NaN) {
1458+
test(6001.740, frollvar(c(1.5,2.5,2,NA), c(3,3)), list(c(NA,NA,0.25,NA), c(NA,NA,0.25,NA)), output="running sequentially, because outer parallelism has been used", options=c(datatable.verbose=TRUE)) # ensure no nested parallelism in rolling functions #7352
1459+
test(6001.741, frollsd(c(1.5,2.5,2,NA), c(3,3)), list(c(NA,NA,0.5,NA), c(NA,NA,0.5,NA)), output="running sequentially, because outer parallelism has been used", options=c(datatable.verbose=TRUE))
1460+
}
14611461
test(6001.742, frollvar(c(1.5,2.5,2,1.5), c(3,3)), list(c(NA,NA,0.25,0.25), c(NA,NA,0.25,0.25)), notOutput="running sequentially, because outer parallelism has been used", options=c(datatable.verbose=TRUE)) # no NA - no fallback to exact
14621462
test(6001.743, frollsd(c(1.5,2.5,2,1.5), c(3,3)), list(c(NA,NA,0.5,0.5), c(NA,NA,0.5,0.5)), notOutput="running sequentially, because outer parallelism has been used", options=c(datatable.verbose=TRUE))
14631463
test(6001.744, frollvar(c(1.5,2.5,2,NA), 3), c(NA,NA,0.25,NA), notOutput="running sequentially, because outer parallelism has been used", options=c(datatable.verbose=TRUE)) # not vectorized - no outer parallelism

inst/tests/frollBatch.Rraw

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,6 @@ if (exists("test.data.table", .GlobalEnv, inherits=FALSE)) {
99
froll = data.table:::froll
1010
}
1111

12-
exact_NaN = isTRUE(capabilities()["long.double"]) && identical(as.integer(.Machine$longdouble.digits), 64L)
13-
if (!exact_NaN) {
14-
cat("\n**** Skipping 7 NaN/NA algo='exact' tests because .Machine$longdouble.digits==", .Machine$longdouble.digits, " (!=64); e.g. under valgrind\n\n", sep="")
15-
# for Matt when he runs valgrind it is 53, but 64 when running regular R
16-
# froll.c uses long double and appears to require full long double accuracy in the algo='exact'
17-
}
18-
19-
2012
## batch validation
2113
set.seed(108)
2214
makeNA = function(x, ratio=0.1, nf=FALSE) {

inst/tests/tests.Rraw

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,11 @@ if (!test_longdouble) {
144144
cat("\n**** Full long double accuracy is not available. Tests using this will be skipped.\n\n")
145145
# e.g. under valgrind, longdouble.digits==53; causing these to fail: 1262, 1729.04, 1729.08, 1729.09, 1729.11, 1729.13, 1830.7; #4639
146146
}
147+
exact_NA = identical(NA_real_ + 0, NA_real_)
148+
if (!exact_NA) {
149+
cat("\n**** NaN payload does not propagate through arithmetic operations. Tests requiring NA not to decay to NaN will be skipped.\n\n")
150+
# e.g. on riscv64
151+
}
147152

148153
tt = Sys.getenv("TZ", unset=NA)
149154
TZnotUTC = !identical(tt,"") && !is_utc(tt)
@@ -1957,12 +1962,9 @@ basemean = base::mean # to isolate time of `::` itself
19571962
ans3 = DT[,list(basemean(x),basemean(y)),by=list(grp1,grp2)]
19581963
test(646, ans1, ans2)
19591964
test(647, ans1, ans3)
1960-
if (test_longdouble) {
1965+
if (exact_NA) {
19611966
test(648, anyNA(ans1$V1) && !any(is.nan(ans1$V1)))
1962-
# used to error with `valgrind` because of the 'long double' usage in gsumm.c (although I wonder if we need long double precision).
1963-
# it doesn't seem to error under valgrind anymore so the test_longdouble may be removable
1964-
# http://valgrind.org/docs/manual/manual-core.html#manual-core.limits
1965-
# http://comments.gmane.org/gmane.comp.debugging.valgrind/10340
1967+
# Valgrind may have had NaN payload propagation problems in the past; RISC-V will in the future
19661968
}
19671969
ans1 = DT[,list(mean(x,na.rm=TRUE),mean(y,na.rm=TRUE)),by=list(grp1,grp2)]
19681970
ans2 = DT[,list(mean.default(x,na.rm=TRUE),mean.default(y,na.rm=TRUE)),by=list(grp1,grp2)]

0 commit comments

Comments
 (0)