weirflow 0.1.0

GPU-first dataflow analysis primitives for Vyre and Santh compiler pipelines.
Documentation
use super::*;

// ------------------------------------------------------------------
// 2. Live variables
// ------------------------------------------------------------------

#[test]
fn analysis_matrix_live() {
    let mut cases = 0u64;
    for size in [0, 1, 10, 100] {
        let seeds = if size == 0 { 10 } else { 20 };
        let probs = if size == 0 {
            vec![0.0]
        } else {
            vec![0.1, 0.5, 0.9]
        };
        for seed in 0..seeds {
            for &prob in &probs {
                if size == 0 {
                    let shape = ProgramGraphShape::new(64, 64);
                    assert!(!weir::live::live_step(shape, "fin", "fout")
                        .entry()
                        .is_empty());
                    record_case();
                    cases += 1;
                    let r = weir::live::live_closure_borrowed_via(
                        &fake_dispatch_borrowed(&FakeResidentBackend::new()),
                        0,
                        &[],
                        &[],
                        &[],
                        &[],
                        10,
                    );
                    assert!(r.is_err() || r.unwrap().is_empty());
                    record_case();
                    cases += 1;
                    continue;
                }
                let fixture = CsrFactory::random_valid(size, prob, seed);
                let shape =
                    ProgramGraphShape::new(fixture.node_count, fixture.edge_targets.len() as u32);
                assert!(!weir::live::live_step(shape, "fin", "fout")
                    .entry()
                    .is_empty());
                record_case();
                cases += 1;
                assert!(!weir::live::live_step(shape, "x", "y").entry().is_empty());
                record_case();
                cases += 1;
                assert!(weir::live::prepare_live_graph(
                    fixture.node_count,
                    &fixture.edge_offsets,
                    &fixture.edge_targets,
                    &fixture.edge_kind_mask
                )
                .is_ok());
                record_case();
                cases += 1;
                let seed_bits = vec![0b1u32];
                let fake = FakeResidentBackend::new();
                let r = weir::live::live_closure_borrowed_via(
                    &fake_dispatch_borrowed(&fake),
                    fixture.node_count,
                    &fixture.edge_offsets,
                    &fixture.edge_targets,
                    &fixture.edge_kind_mask,
                    &seed_bits,
                    100,
                );
                assert!(r.is_err());
                record_case();
                cases += 1;
                #[cfg(feature = "cpu-parity")]
                {
                    let cpu = weir::oracle::graph::live_closure(
                        fixture.node_count,
                        &fixture.edge_offsets,
                        &fixture.edge_targets,
                        &fixture.edge_kind_mask,
                        &seed_bits,
                    );
                    assert_eq!(cpu[0] & 0b1, 0b1);
                    record_case();
                    cases += 1;
                }
            }
        }
    }
    eprintln!("analysis_matrix_live: {cases} cases");
    assert!(cases >= 500, "expected ≥500 cases, got {cases}");
}