Remove EdgeIndex and NodeIndex types, prefer u32 instead

This commit is contained in:
Loïc Lecrenier
2023-02-21 12:55:44 +01:00
parent 66d0c63694
commit dcf3f1d18a
10 changed files with 139 additions and 165 deletions

View File

@ -26,18 +26,10 @@ pub struct Edges {
pub successors: RoaringBitmap,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NodeIndex(pub u32);
impl fmt::Display for NodeIndex {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Display::fmt(&self.0, f)
}
}
#[derive(Debug, Clone)]
pub struct QueryGraph {
pub root_node: NodeIndex,
pub end_node: NodeIndex,
pub root_node: u32,
pub end_node: u32,
pub nodes: Vec<QueryNode>,
pub edges: Vec<Edges>,
}
@ -56,28 +48,28 @@ impl Default for QueryGraph {
Edges { predecessors: RoaringBitmap::new(), successors: RoaringBitmap::new() },
];
Self { root_node: NodeIndex(0), end_node: NodeIndex(1), nodes, edges }
Self { root_node: 0, end_node: 1, nodes, edges }
}
}
impl QueryGraph {
fn connect_to_node(&mut self, from_nodes: &[NodeIndex], to_node: NodeIndex) {
fn connect_to_node(&mut self, from_nodes: &[u32], to_node: u32) {
for &from_node in from_nodes {
self.edges[from_node.0 as usize].successors.insert(to_node.0);
self.edges[to_node.0 as usize].predecessors.insert(from_node.0);
self.edges[from_node as usize].successors.insert(to_node);
self.edges[to_node as usize].predecessors.insert(from_node);
}
}
fn add_node(&mut self, from_nodes: &[NodeIndex], node: QueryNode) -> NodeIndex {
fn add_node(&mut self, from_nodes: &[u32], node: QueryNode) -> u32 {
let new_node_idx = self.nodes.len() as u32;
self.nodes.push(node);
self.edges.push(Edges {
predecessors: from_nodes.iter().map(|x| x.0).collect(),
predecessors: from_nodes.iter().collect(),
successors: RoaringBitmap::new(),
});
for from_node in from_nodes {
self.edges[from_node.0 as usize].successors.insert(new_node_idx);
self.edges[*from_node as usize].successors.insert(new_node_idx);
}
NodeIndex(new_node_idx)
new_node_idx
}
}
@ -99,7 +91,7 @@ impl QueryGraph {
let word_set = index.words_fst(txn)?;
let mut graph = QueryGraph::default();
let (mut prev2, mut prev1, mut prev0): (Vec<NodeIndex>, Vec<NodeIndex>, Vec<NodeIndex>) =
let (mut prev2, mut prev1, mut prev0): (Vec<u32>, Vec<u32>, Vec<u32>) =
(vec![], vec![], vec![graph.root_node]);
// TODO: add all the word derivations found in the fst
@ -173,33 +165,33 @@ impl QueryGraph {
Ok(graph)
}
pub fn remove_nodes(&mut self, nodes: &[NodeIndex]) {
pub fn remove_nodes(&mut self, nodes: &[u32]) {
for &node in nodes {
self.nodes[node.0 as usize] = QueryNode::Deleted;
let edges = self.edges[node.0 as usize].clone();
self.nodes[node as usize] = QueryNode::Deleted;
let edges = self.edges[node as usize].clone();
for pred in edges.predecessors.iter() {
self.edges[pred as usize].successors.remove(node.0);
self.edges[pred as usize].successors.remove(node);
}
for succ in edges.successors {
self.edges[succ as usize].predecessors.remove(node.0);
self.edges[succ as usize].predecessors.remove(node);
}
self.edges[node.0 as usize] =
self.edges[node as usize] =
Edges { predecessors: RoaringBitmap::new(), successors: RoaringBitmap::new() };
}
}
pub fn remove_nodes_keep_edges(&mut self, nodes: &[NodeIndex]) {
pub fn remove_nodes_keep_edges(&mut self, nodes: &[u32]) {
for &node in nodes {
self.nodes[node.0 as usize] = QueryNode::Deleted;
let edges = self.edges[node.0 as usize].clone();
self.nodes[node as usize] = QueryNode::Deleted;
let edges = self.edges[node as usize].clone();
for pred in edges.predecessors.iter() {
self.edges[pred as usize].successors.remove(node.0);
self.edges[pred as usize].successors.remove(node);
self.edges[pred as usize].successors |= &edges.successors;
}
for succ in edges.successors {
self.edges[succ as usize].predecessors.remove(node.0);
self.edges[succ as usize].predecessors.remove(node);
self.edges[succ as usize].predecessors |= &edges.predecessors;
}
self.edges[node.0 as usize] =
self.edges[node as usize] =
Edges { predecessors: RoaringBitmap::new(), successors: RoaringBitmap::new() };
}
}
@ -207,7 +199,7 @@ impl QueryGraph {
let mut nodes_to_remove_keeping_edges = vec![];
let mut nodes_to_remove = vec![];
for (node_idx, node) in self.nodes.iter().enumerate() {
let node_idx = NodeIndex(node_idx as u32);
let node_idx = node_idx as u32;
let QueryNode::Term(LocatedQueryTerm { value: _, positions }) = node else { continue };
if positions.contains(&position) {
nodes_to_remove_keeping_edges.push(node_idx)
@ -231,7 +223,7 @@ impl QueryGraph {
|| (!matches!(node, QueryNode::Start | QueryNode::Deleted)
&& self.edges[node_idx].predecessors.is_empty())
{
nodes_to_remove.push(NodeIndex(node_idx as u32));
nodes_to_remove.push(node_idx as u32);
}
}
if nodes_to_remove.is_empty() {
@ -315,9 +307,9 @@ node [shape = "record"]
continue;
}
desc.push_str(&format!("{node} [label = {:?}]", &self.nodes[node],));
if node == self.root_node.0 as usize {
if node == self.root_node as usize {
desc.push_str("[color = blue]");
} else if node == self.end_node.0 as usize {
} else if node == self.end_node as usize {
desc.push_str("[color = red]");
}
desc.push_str(";\n");