#![allow(deprecated)]
use crate::ifds_cpu_oracle::solve_cpu;
use crate::test_harness::ifds_builder::IfdsProblemBuilder;
use vyre_primitives::graph::exploded::{decode_node, encoded_to_dense};
fn sort_triples(mut v: Vec<(u32, u32, u32)>) -> Vec<(u32, u32, u32)> {
v.sort_unstable();
v
}
fn reached_triples(node_ids: &[u32]) -> Vec<(u32, u32, u32)> {
let mut out: Vec<(u32, u32, u32)> = node_ids.iter().copied().map(decode_node).collect();
out.sort_unstable();
out
}
fn chain_edges(blocks: u32) -> Vec<(u32, u32, u32)> {
(0..blocks.saturating_sub(1))
.map(|i| (0, i, i + 1))
.collect()
}
fn cycle_edges(blocks: u32) -> Vec<(u32, u32, u32)> {
let mut edges: Vec<(u32, u32, u32)> = (0..blocks.saturating_sub(1))
.map(|i| (0, i, i + 1))
.collect();
if blocks > 1 {
edges.push((0, blocks - 1, 0));
}
edges
}
fn star_edges(leaves: u32) -> Vec<(u32, u32, u32)> {
(1..=leaves).map(|i| (0, 0, i)).collect()
}
fn complete_edges(nodes: u32) -> Vec<(u32, u32, u32)> {
let mut edges = Vec::new();
for i in 0..nodes {
for j in 0..nodes {
if i != j {
edges.push((0, i, j));
}
}
}
edges
}
fn all_triples(procs: u32, blocks: u32, facts: u32) -> Vec<(u32, u32, u32)> {
let mut out = Vec::new();
for p in 0..procs {
for b in 0..blocks {
for f in 0..facts {
out.push((p, b, f));
}
}
}
out
}
macro_rules! panic_test {
($name:ident, $expected:literal, $body:expr) => {
#[test]
#[should_panic(expected = $expected)]
#[allow(deprecated)]
fn $name() {
let _ = $body;
}
};
}
macro_rules! bfs_test {
($name:ident, $procs:expr, $blocks:expr, $facts:expr, $intra:expr, $inter:expr, $gen:expr, $kill:expr, $seeds:expr, $expected_triples:expr) => {
#[test]
#[allow(deprecated)]
fn $name() {
let got = solve_cpu($procs, $blocks, $facts, $intra, $inter, $gen, $kill, $seeds);
assert_eq!(reached_triples(&got), sort_triples($expected_triples));
}
};
}
macro_rules! builder_parity_batch {
($prefix:ident, $procs:expr, $blocks:expr, $facts:expr, $edges:expr, $seeds:expr, $summaries:expr, $($seed:tt),+) => {
paste::paste! {
$(
#[test]
#[allow(deprecated)]
fn [<$prefix _ $seed>]() {
let problem = IfdsProblemBuilder::random_valid($procs, $blocks, $facts, $edges, $seeds, $summaries, $seed as u64);
let got = solve_cpu(
problem.num_procs,
problem.blocks_per_proc,
problem.facts_per_proc,
&problem.intra_edges,
&problem.inter_edges,
&problem.flow_gen,
&problem.flow_kill,
&problem.seed_facts,
);
let got_dense: Vec<u32> = got.iter().map(|&e| {
encoded_to_dense(e, problem.blocks_per_proc, problem.facts_per_proc).unwrap()
}).collect();
assert_eq!(got_dense, problem.expected_reached);
}
)+
}
};
}
#[path = "ifds_cpu_oracle_tests/panic_contracts.rs"]
mod panic_contracts;
#[path = "ifds_cpu_oracle_tests/bfs_basic_linear_contracts.rs"]
mod bfs_basic_linear_contracts;
#[path = "ifds_cpu_oracle_tests/bfs_fact_seed_contracts.rs"]
mod bfs_fact_seed_contracts;
#[path = "ifds_cpu_oracle_tests/bfs_interproc_boundary_contracts.rs"]
mod bfs_interproc_boundary_contracts;
#[path = "ifds_cpu_oracle_tests/overflow_boundary_contracts.rs"]
mod overflow_boundary_contracts;
#[path = "ifds_cpu_oracle_tests/builder_parity_contracts.rs"]
mod builder_parity_contracts;
#[path = "ifds_cpu_oracle_tests/summary_contracts.rs"]
mod summary_contracts;
#[path = "ifds_cpu_oracle_tests/seed_contracts.rs"]
mod seed_contracts;