use crate::{dsl::DslKernel, graph::OwnedGraphId};
#[derive(Debug, Clone, Copy, Default)]
pub enum TraversalStrategy {
#[default]
BreadthFirst,
DepthFirst,
}
#[derive(Debug, Clone)]
pub struct TraversalConfig {
pub kernel: DslKernel,
pub start_nodes: Vec<OwnedGraphId>,
pub max_depth: Option<usize>,
pub max_paths: Option<usize>,
pub strategy: TraversalStrategy,
pub max_revisits_per_node: usize,
pub parallel: bool,
pub intermediate_states: bool,
pub progress: bool,
}
#[derive(Debug)]
pub struct TraversalConfigBuilder {
kernel: DslKernel,
start_nodes: Vec<OwnedGraphId>,
max_depth: Option<usize>,
max_paths: Option<usize>,
strategy: TraversalStrategy,
max_revisits_per_node: usize,
parallel: bool,
intermediate_states: bool,
progress: bool,
}
impl TraversalConfigBuilder {
pub fn new(kernel: DslKernel) -> Self {
Self {
kernel,
start_nodes: Vec::new(),
max_depth: None,
max_paths: None,
strategy: TraversalStrategy::DepthFirst,
max_revisits_per_node: 0,
parallel: true,
intermediate_states: false,
progress: false,
}
}
pub fn with_start_nodes<I, N>(mut self, nodes: I) -> Self
where
I: IntoIterator<Item = N>,
N: Into<OwnedGraphId>,
{
self.start_nodes = nodes.into_iter().map(Into::into).collect();
self
}
pub fn with_max_depth(mut self, depth: usize) -> Self {
self.max_depth = Some(depth);
self
}
pub fn with_max_paths(mut self, paths: usize) -> Self {
self.max_paths = Some(paths);
self
}
pub fn with_strategy(mut self, strategy: TraversalStrategy) -> Self {
self.strategy = strategy;
self
}
pub fn with_parallelism(mut self, enabled: bool) -> Self {
self.parallel = enabled;
self
}
pub fn with_intermediate_states(mut self, enabled: bool) -> Self {
self.intermediate_states = enabled;
self
}
pub fn with_progress(mut self, enabled: bool) -> Self {
self.progress = enabled;
self
}
pub fn build(self) -> TraversalConfig {
TraversalConfig {
kernel: self.kernel,
start_nodes: self.start_nodes,
max_depth: self.max_depth,
max_paths: self.max_paths,
strategy: self.strategy,
max_revisits_per_node: self.max_revisits_per_node,
parallel: self.parallel,
intermediate_states: self.intermediate_states,
progress: self.progress,
}
}
}