use vyre_foundation::ir::Program;
use crate::graph::csr_forward_traverse::{cpu_ref as csr_forward_cpu_ref, csr_forward_traverse};
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 {
use std::sync::Arc;
use vyre_foundation::ir::model::expr::Ident;
use vyre_foundation::ir::Node;
let inner = csr_forward_traverse(shape, frontier_in, frontier_out, edge_kind_mask);
let inner_body: Vec<Node> = inner.entry.iter().cloned().collect();
let buffers = inner.buffers.to_vec();
let workgroup = inner.workgroup_size;
Program::wrapped(
buffers,
workgroup,
vec![Node::Region {
generator: Ident::new(OP_ID.into()),
source_region: None,
body: Arc::new(inner_body),
}],
)
}
#[must_use]
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(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])]] }),
)
}