weirflow 0.1.0

GPU-first dataflow analysis primitives for Vyre and Santh compiler pipelines.
Documentation
//! IFDS CPU oracle comprehensive test suite.
//!
//! 200+ tests covering panic paths, BFS convergence, overflow boundaries,
//! parity with expected results, summary edges, and seed handling.

#![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};

// ------------------------------------------------------------------
// Helpers
// ------------------------------------------------------------------

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
}

// ------------------------------------------------------------------
// Macros
// ------------------------------------------------------------------

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;