Skip to content

Commit c29c6c9

Browse files
committed
Relax CI table comparison for cross-platform numeric drift
1 parent a696a41 commit c29c6c9

1 file changed

Lines changed: 27 additions & 10 deletions

File tree

dev/compare_tables.R

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ if (length(args) != 2) {
77

88
reference_dir <- args[[1]]
99
generated_dir <- args[[2]]
10-
comparison_digits <- 5L
10+
relative_tolerance <- 2e-5
11+
zero_tolerance <- 1e-12
1112

1213
if (!dir.exists(reference_dir)) {
1314
stop("Reference directory not found: ", reference_dir)
@@ -51,19 +52,35 @@ format_value <- function(value) {
5152
}
5253

5354
compare_numeric_column <- function(reference_col, generated_col, file_label, col_name) {
54-
reference_cmp <- signif(reference_col, digits = comparison_digits)
55-
generated_cmp <- signif(generated_col, digits = comparison_digits)
56-
mismatch <- first_mismatch(reference_cmp, generated_cmp)
57-
if (!is.na(mismatch)) {
55+
same <- (reference_col == generated_col) | (is.na(reference_col) & is.na(generated_col))
56+
same[is.na(same)] <- FALSE
57+
58+
non_missing <- !(is.na(reference_col) | is.na(generated_col))
59+
needs_check <- non_missing & !same
60+
if (any(needs_check)) {
61+
reference_vals <- reference_col[needs_check]
62+
generated_vals <- generated_col[needs_check]
63+
scale <- pmax(abs(reference_vals), abs(generated_vals))
64+
allowed_diff <- ifelse(scale == 0, zero_tolerance, relative_tolerance * scale)
65+
same[needs_check] <- abs(reference_vals - generated_vals) <= allowed_diff
66+
}
67+
68+
mismatch <- which(!same)
69+
if (length(mismatch) > 0) {
70+
mismatch <- mismatch[[1]]
71+
diff <- abs(reference_col[[mismatch]] - generated_col[[mismatch]])
72+
scale <- max(abs(reference_col[[mismatch]]), abs(generated_col[[mismatch]]))
73+
allowed_diff <- if (scale == 0) zero_tolerance else relative_tolerance * scale
5874
stop(
5975
sprintf(
60-
"%s: numeric mismatch in column '%s' at row %d (reference=%s, generated=%s; compared at %d significant digits)",
76+
"%s: numeric mismatch in column '%s' at row %d (reference=%s, generated=%s; abs_diff=%s, allowed=%s)",
6177
file_label,
6278
col_name,
6379
mismatch,
6480
format_value(reference_col[[mismatch]]),
6581
format_value(generated_col[[mismatch]]),
66-
comparison_digits
82+
format_value(diff),
83+
format_value(allowed_diff)
6784
)
6885
)
6986
}
@@ -132,7 +149,7 @@ for (filename in reference_files) {
132149
message(
133150
"Tracked tables match regenerated outputs across ",
134151
length(reference_files),
135-
" files at ",
136-
comparison_digits,
137-
" significant digits."
152+
" files within relative tolerance ",
153+
format(relative_tolerance, scientific = TRUE),
154+
"."
138155
)

0 commit comments

Comments
 (0)