use crate::graph::program_graph::BINDING_PRIMITIVE_START;
pub const OP_ID: &str = "vyre-primitives::graph::persistent_bfs";
pub const BATCH_OP_ID: &str = "vyre-primitives::graph::persistent_bfs_batch";
pub const BINDING_FRONTIER_IN: u32 = BINDING_PRIMITIVE_START;
pub const BINDING_FRONTIER_OUT: u32 = BINDING_PRIMITIVE_START + 1;
pub const BINDING_CHANGED: u32 = BINDING_PRIMITIVE_START + 2;
pub const PERSISTENT_BFS_WORKGROUP_SIZE: [u32; 3] = [256, 1, 1];
pub(crate) const PERSISTENT_BFS_SINGLE_DISPATCH_GRID: [u32; 3] = [1, 1, 1];
#[must_use]
pub const fn persistent_bfs_single_dispatch_grid(node_count: u32) -> [u32; 3] {
[persistent_bfs_grid_x(node_count), 1, 1]
}
#[must_use]
pub const fn persistent_bfs_batch_dispatch_grid(node_count: u32, query_count: u32) -> [u32; 3] {
if query_count == 0 {
[1, 1, 1]
} else {
[persistent_bfs_grid_x(node_count), query_count, 1]
}
}
const fn persistent_bfs_grid_x(node_count: u32) -> u32 {
if node_count == 0 {
1
} else {
((node_count - 1) / PERSISTENT_BFS_WORKGROUP_SIZE[0]) + 1
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct PersistentBfsLayout {
pub node_count: u32,
pub edge_count: u32,
pub words: usize,
pub words_u32: u32,
pub node_words: usize,
pub edge_storage_words: usize,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct PersistentBfsBatchLayout {
pub query_count: u32,
pub total_words: usize,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct PersistentBfsFrontierLayout {
pub words: usize,
pub words_u32: u32,
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum PersistentBfsPlanCacheKind {
Single,
Batch,
}
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub struct PersistentBfsPlanCacheKey {
pub layout_hash: u64,
pub node_count: u32,
pub edge_count: u32,
pub words_per_query: u32,
pub query_count: u32,
pub allow_mask: u32,
pub max_iters: u32,
pub device_features: u64,
pub kind: PersistentBfsPlanCacheKind,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct PersistentBfsStaticInputKey {
pub layout_hash: u64,
pub node_count: u32,
pub edge_count: u32,
pub words: u32,
}