Skip to content

Commit f391c5b

Browse files
committed
refactor: show sorted files side-by-side at same line positions
- Compare sorted_baseline[N] vs sorted_rust[N] for apple-to-apple - First 5 lines, last 5 lines, 10 random from middle - Easier to spot systematic patterns (e.g., 1-hour timezone offset)
1 parent ee27a66 commit f391c5b

File tree

1 file changed

+49
-57
lines changed

1 file changed

+49
-57
lines changed

scripts/verify_parity.rs

Lines changed: 49 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -627,80 +627,72 @@ fn collect_sorted_diffs(file_a: &Path, file_b: &Path) -> (Vec<String>, Vec<Strin
627627
(only_a, only_b)
628628
}
629629

630-
/// Show sampled sorted differences: first 5, last 5, and 10 random from middle.
630+
/// Show side-by-side comparison of sorted files at same line positions.
631+
/// Assumes line counts match. Shows first 5, last 5, and 10 random from middle.
631632
fn show_first_sorted_diffs(file_a: &Path, file_b: &Path) {
632-
let (only_baseline, only_rust) = collect_sorted_diffs(file_a, file_b);
633+
let sorted_baseline = read_sorted_lines(file_a);
634+
let sorted_rust = read_sorted_lines(file_b);
633635

634-
if only_baseline.is_empty() && only_rust.is_empty() {
635-
println!("No sorted differences found.");
636+
let n = sorted_baseline.len().min(sorted_rust.len());
637+
if n == 0 {
638+
println!("No lines to compare.");
636639
return;
637640
}
638641

639-
println!("\n=== SORTED DIFF SUMMARY ===");
640-
println!(" Lines only in BASELINE: {}", only_baseline.len());
641-
println!(" Lines only in RUST: {}", only_rust.len());
642+
println!("\n=== SORTED SIDE-BY-SIDE COMPARISON ===");
643+
println!(" Baseline lines: {}", sorted_baseline.len());
644+
println!(" Rust lines: {}", sorted_rust.len());
642645

643-
// Show baseline-only samples
644-
if !only_baseline.is_empty() {
645-
println!("\n--- BASELINE ONLY (first 5, last 5, 10 random middle) ---");
646-
show_sampled_lines(&only_baseline, "BASELINE");
647-
}
648-
649-
// Show rust-only samples
650-
if !only_rust.is_empty() {
651-
println!("\n--- RUST ONLY (first 5, last 5, 10 random middle) ---");
652-
show_sampled_lines(&only_rust, "RUST");
653-
}
654-
}
655-
656-
fn show_sampled_lines(lines: &[String], label: &str) {
657-
let n = lines.len();
658646
let first_n = 5.min(n);
659647
let last_n = 5.min(n);
660648

661-
// First 5
662-
println!("\n First {}:", first_n);
663-
for line in lines.iter().take(first_n) {
664-
println!(" {}", line);
649+
// First 5 lines side by side
650+
println!("\n--- FIRST {} LINES (sorted) ---", first_n);
651+
for i in 0..first_n {
652+
println!(" Line {}:", i + 1);
653+
println!(" BASELINE: {}", sorted_baseline[i]);
654+
println!(" RUST: {}", sorted_rust[i]);
665655
}
666656

667-
if n <= 10 {
668-
return;
669-
}
670-
671-
// Last 5
672-
let last_start = n.saturating_sub(last_n);
673-
if last_start > first_n {
674-
println!("\n Last {}:", last_n);
675-
for line in lines.iter().skip(last_start) {
676-
println!(" {}", line);
657+
// Last 5 lines side by side
658+
if n > 10 {
659+
let last_start = n.saturating_sub(last_n);
660+
println!("\n--- LAST {} LINES (sorted) ---", last_n);
661+
for i in last_start..n {
662+
println!(" Line {}:", i + 1);
663+
println!(" BASELINE: {}", sorted_baseline[i]);
664+
println!(" RUST: {}", sorted_rust[i]);
677665
}
678666
}
679667

680-
// 10 random from middle
668+
// 10 random line positions from middle
681669
if n > 10 {
682670
let middle_start = first_n;
683-
let middle_end = last_start;
671+
let middle_end = n.saturating_sub(last_n);
684672
if middle_end > middle_start {
685-
let middle: Vec<_> = lines[middle_start..middle_end].to_vec();
686-
let sample_count = 10.min(middle.len());
687-
if sample_count > 0 {
688-
println!(
689-
"\n Random {} from middle ({} label={}):",
690-
sample_count,
691-
middle.len(),
692-
label
693-
);
694-
let mut rng_seed = n as u64;
695-
let mut indices: Vec<usize> = (0..middle.len()).collect();
696-
for i in (1..indices.len()).rev() {
697-
rng_seed = rng_seed.wrapping_mul(6364136223846793005).wrapping_add(1);
698-
let j = (rng_seed as usize) % (i + 1);
699-
indices.swap(i, j);
700-
}
701-
for &idx in indices.iter().take(sample_count) {
702-
println!(" {}", middle[idx]);
703-
}
673+
let middle_count = middle_end - middle_start;
674+
let sample_count = 10.min(middle_count);
675+
676+
println!(
677+
"\n--- {} RANDOM LINES FROM MIDDLE (sorted, lines {}-{}) ---",
678+
sample_count,
679+
middle_start + 1,
680+
middle_end
681+
);
682+
683+
// Deterministic shuffle using LCG
684+
let mut rng_seed = n as u64;
685+
let mut indices: Vec<usize> = (middle_start..middle_end).collect();
686+
for i in (1..indices.len()).rev() {
687+
rng_seed = rng_seed.wrapping_mul(6364136223846793005).wrapping_add(1);
688+
let j = (rng_seed as usize) % (i + 1);
689+
indices.swap(i, j);
690+
}
691+
692+
for &idx in indices.iter().take(sample_count) {
693+
println!(" Line {}:", idx + 1);
694+
println!(" BASELINE: {}", sorted_baseline[idx]);
695+
println!(" RUST: {}", sorted_rust[idx]);
704696
}
705697
}
706698
}

0 commit comments

Comments
 (0)