|
1 | 1 | use itertools::Itertools; |
2 | 2 | use rayon::prelude::*; |
3 | | -use std::{collections::HashMap, process::Command}; |
| 3 | +use std::collections::{HashMap, HashSet}; |
| 4 | +use std::process::Command; |
4 | 5 |
|
5 | 6 | pub const INTRINSIC_DELIMITER: &str = "############"; |
6 | 7 | fn runner_command(runner: &str) -> Command { |
@@ -56,23 +57,34 @@ pub fn compare_outputs(intrinsic_name_list: &Vec<String>, runner: &str, target: |
56 | 57 | .to_lowercase() |
57 | 58 | .replace("-nan", "nan"); |
58 | 59 |
|
59 | | - let c_output_map = c |
| 60 | + let c_output_set = c |
60 | 61 | .split(INTRINSIC_DELIMITER) |
61 | 62 | .filter_map(|output| output.trim().split_once("\n")) |
62 | | - .collect::<HashMap<&str, &str>>(); |
63 | | - let rust_output_map = rust |
| 63 | + .collect::<HashSet<(&str, &str)>>(); |
| 64 | + let rust_output_set = rust |
64 | 65 | .split(INTRINSIC_DELIMITER) |
65 | 66 | .filter_map(|output| output.trim().split_once("\n")) |
| 67 | + .collect::<HashSet<(&str, &str)>>(); |
| 68 | + |
| 69 | + let intrinsics = rust_output_set |
| 70 | + .symmetric_difference(&c_output_set) |
| 71 | + .map(|&(x, _)| x) |
| 72 | + .collect::<HashSet<&str>>(); |
| 73 | + |
| 74 | + let c_output_map = c_output_set |
| 75 | + .into_iter() |
| 76 | + .filter_map(|(key, value)| intrinsics.get(key).zip(Some(value))) |
| 77 | + .map(|(&key, value)| (key, value)) |
| 78 | + .collect::<HashMap<&str, &str>>(); |
| 79 | + let rust_output_map = rust_output_set |
| 80 | + .into_iter() |
| 81 | + .filter_map(|(key, value)| intrinsics.get(key).zip(Some(value))) |
| 82 | + .map(|(&key, value)| (key, value)) |
66 | 83 | .collect::<HashMap<&str, &str>>(); |
67 | 84 |
|
68 | | - let intrinsics = c_output_map |
69 | | - .keys() |
70 | | - .chain(rust_output_map.keys()) |
71 | | - .unique() |
72 | | - .collect_vec(); |
73 | 85 | let intrinsics_diff_count = intrinsics |
74 | 86 | .par_iter() |
75 | | - .filter_map(|&&intrinsic| { |
| 87 | + .filter_map(|&intrinsic| { |
76 | 88 | let c_output = c_output_map.get(intrinsic).unwrap(); |
77 | 89 | let rust_output = rust_output_map.get(intrinsic).unwrap(); |
78 | 90 | if rust_output.eq(c_output) { |
|
0 commit comments