@@ -7,7 +7,8 @@ if (length(args) != 2) {
77
88reference_dir <- args [[1 ]]
99generated_dir <- args [[2 ]]
10- comparison_digits <- 5L
10+ relative_tolerance <- 2e-5
11+ zero_tolerance <- 1e-12
1112
1213if (! dir.exists(reference_dir )) {
1314 stop(" Reference directory not found: " , reference_dir )
@@ -51,19 +52,35 @@ format_value <- function(value) {
5152}
5253
5354compare_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) {
132149message(
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