use vyre_foundation::ir::Program;
#[cfg(any(test, feature = "cpu-parity"))]
use crate::graph::csr_forward_traverse::cpu_ref as csr_forward_cpu_ref;
#[cfg(any(test, feature = "cpu-parity"))]
use crate::graph::csr_forward_traverse::cpu_ref_into as csr_forward_cpu_ref_into;
use crate::graph::csr_forward_traverse::csr_forward_traverse_with_op_id;
use crate::graph::program_graph::ProgramGraphShape;
pub const OP_ID: &str = "vyre-primitives::predicate::edge";
#[must_use]
pub fn edge(
shape: ProgramGraphShape,
frontier_in: &str,
frontier_out: &str,
edge_kind_mask: u32,
) -> Program {
csr_forward_traverse_with_op_id(OP_ID, shape, frontier_in, frontier_out, edge_kind_mask)
}
#[must_use]
#[cfg(any(test, feature = "cpu-parity"))]
pub fn cpu_ref(
node_count: u32,
edge_offsets: &[u32],
edge_targets: &[u32],
edge_kind_mask: &[u32],
frontier_in: &[u32],
allow_mask: u32,
) -> Vec<u32> {
csr_forward_cpu_ref(
node_count,
edge_offsets,
edge_targets,
edge_kind_mask,
frontier_in,
allow_mask,
)
}
#[cfg(any(test, feature = "cpu-parity"))]
pub fn cpu_ref_into(
node_count: u32,
edge_offsets: &[u32],
edge_targets: &[u32],
edge_kind_mask: &[u32],
frontier_in: &[u32],
allow_mask: u32,
out: &mut Vec<u32>,
) {
csr_forward_cpu_ref_into(
node_count,
edge_offsets,
edge_targets,
edge_kind_mask,
frontier_in,
allow_mask,
out,
);
}
#[cfg(test)]
mod tests {
use super::*;
use vyre_foundation::ir::Node;
#[test]
fn preserves_wrapper_op_id() {
let program = edge(ProgramGraphShape::new(4, 2), "fin", "fout", 0xFFFF_FFFF);
let generator = match &program.entry[0] {
Node::Region { generator, .. } => generator.to_string(),
other => panic!("Fix: edge must build a Region entry, got {other:?}."),
};
assert_eq!(generator, OP_ID);
}
#[test]
fn cpu_ref_into_reuses_forward_edge_nodeset() {
let mut out = Vec::with_capacity(4);
cpu_ref_into(
4,
&[0, 1, 2, 2, 2],
&[1, 2],
&[1, 1],
&[0b0001],
0xFFFF_FFFF,
&mut out,
);
assert_eq!(out, vec![0b0010]);
}
}
#[cfg(feature = "inventory-registry")]
inventory::submit! {
crate::harness::OpEntry::new(
OP_ID,
|| edge(ProgramGraphShape::new(4, 2), "fin", "fout", 0xFFFF_FFFF),
Some(|| {
use super::inventory_u32_le_bytes as b;
vec![vec![
b(&[2, 1, 1, 1]), b(&[0, 1, 2, 2, 2]), b(&[1, 2]), b(&[1, 1]), b(&[0, 0, 0, 0]), b(&[0b0001]), b(&[0]), ]]
}),
Some(|| {
use super::inventory_u32_le_bytes as b;
vec![vec![b(&[0b0010])]] }),
)
}