Skip to content

Commit d6ba1b7

Browse files
committed
Harden CI table comparison near zero
1 parent c29c6c9 commit d6ba1b7

1 file changed

Lines changed: 10 additions & 2 deletions

File tree

dev/compare_tables.R

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ reference_dir <- args[[1]]
99
generated_dir <- args[[2]]
1010
relative_tolerance <- 2e-5
1111
zero_tolerance <- 1e-12
12+
effect_size_absolute_tolerance <- 1e-6
1213

1314
if (!dir.exists(reference_dir)) {
1415
stop("Reference directory not found: ", reference_dir)
@@ -52,6 +53,9 @@ format_value <- function(value) {
5253
}
5354

5455
compare_numeric_column <- function(reference_col, generated_col, file_label, col_name) {
56+
is_probability_column <- grepl("^(pvalue|padj|qvalue|p.adjust)$", col_name, ignore.case = TRUE)
57+
absolute_tolerance <- if (is_probability_column) 0 else effect_size_absolute_tolerance
58+
5559
same <- (reference_col == generated_col) | (is.na(reference_col) & is.na(generated_col))
5660
same[is.na(same)] <- FALSE
5761

@@ -61,7 +65,7 @@ compare_numeric_column <- function(reference_col, generated_col, file_label, col
6165
reference_vals <- reference_col[needs_check]
6266
generated_vals <- generated_col[needs_check]
6367
scale <- pmax(abs(reference_vals), abs(generated_vals))
64-
allowed_diff <- ifelse(scale == 0, zero_tolerance, relative_tolerance * scale)
68+
allowed_diff <- ifelse(scale == 0, zero_tolerance, pmax(relative_tolerance * scale, absolute_tolerance))
6569
same[needs_check] <- abs(reference_vals - generated_vals) <= allowed_diff
6670
}
6771

@@ -70,7 +74,11 @@ compare_numeric_column <- function(reference_col, generated_col, file_label, col
7074
mismatch <- mismatch[[1]]
7175
diff <- abs(reference_col[[mismatch]] - generated_col[[mismatch]])
7276
scale <- max(abs(reference_col[[mismatch]]), abs(generated_col[[mismatch]]))
73-
allowed_diff <- if (scale == 0) zero_tolerance else relative_tolerance * scale
77+
allowed_diff <- if (scale == 0) {
78+
zero_tolerance
79+
} else {
80+
max(relative_tolerance * scale, absolute_tolerance)
81+
}
7482
stop(
7583
sprintf(
7684
"%s: numeric mismatch in column '%s' at row %d (reference=%s, generated=%s; abs_diff=%s, allowed=%s)",

0 commit comments

Comments
 (0)