refactor(astar): Add interface to separately push single node and pop

This commit is contained in:
Mikolaj Wielgus 2025-11-19 19:29:38 +01:00
parent a8a2e8d8cb
commit 5e8d5974f4
2 changed files with 30 additions and 22 deletions

View File

@ -94,6 +94,7 @@ allowed_scopes = [
"router/router",
"router/thetastar",
"specctra/design",
"astar",
"stepper",
"triangulation",
]

View File

@ -36,30 +36,37 @@ impl<N: Clone + Ord, S: Add<S, Output = S> + Copy + Default + PartialOrd> Astar<
}
pub fn expand(&mut self, new_nodes: &[(S, S, N)]) -> Option<N> {
let curr_g_score = self.g_scores.get(&self.curr_node).unwrap().clone();
for new_node in new_nodes {
self.push(new_node.clone());
}
self.pop()
}
pub fn push(&mut self, new_node: (S, S, N)) {
let curr_g_score = self.g_scores.get(&self.curr_node).unwrap().clone();
let (edge_g_cost, h_heuristic, node) = new_node;
for (edge_g_cost, h_heuristic, node) in new_nodes {
match self.g_scores.entry(node.clone()) {
Entry::Occupied(mut entry) => {
let entry_score = *entry.get();
if curr_g_score + *edge_g_cost >= entry_score {
continue;
if curr_g_score + edge_g_cost >= entry_score {
return;
}
entry.insert(curr_g_score + *edge_g_cost);
entry.insert(curr_g_score + edge_g_cost);
}
Entry::Vacant(entry) => {
entry.insert(curr_g_score + *edge_g_cost);
entry.insert(curr_g_score + edge_g_cost);
}
}
self.frontier.push(MinScored(
curr_g_score + *edge_g_cost + *h_heuristic,
node.clone(),
));
self.frontier
.push(MinScored(curr_g_score + edge_g_cost + h_heuristic, node));
}
pub fn pop(&mut self) -> Option<N> {
MinScored(_ /*f_score*/, self.curr_node) = self.frontier.pop()?;
Some(self.curr_node.clone())
}