@@ -9,6 +9,7 @@ reference_dir <- args[[1]]
99generated_dir <- args [[2 ]]
1010relative_tolerance <- 2e-5
1111zero_tolerance <- 1e-12
12+ effect_size_absolute_tolerance <- 1e-6
1213
1314if (! dir.exists(reference_dir )) {
1415 stop(" Reference directory not found: " , reference_dir )
@@ -52,6 +53,9 @@ format_value <- function(value) {
5253}
5354
5455compare_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