From 5e8d5974f4c508f7402b05e7c6e1126d6db907ad Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Wed, 19 Nov 2025 19:29:38 +0100 Subject: [PATCH] refactor(astar): Add interface to separately push single node and pop --- committed.toml | 1 + src/astar.rs | 51 ++++++++++++++++++++++++++++---------------------- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/committed.toml b/committed.toml index 3c065d9..bd1d79f 100644 --- a/committed.toml +++ b/committed.toml @@ -94,6 +94,7 @@ allowed_scopes = [ "router/router", "router/thetastar", "specctra/design", + "astar", "stepper", "triangulation", ] diff --git a/src/astar.rs b/src/astar.rs index f82c182..7ec01b8 100644 --- a/src/astar.rs +++ b/src/astar.rs @@ -36,30 +36,37 @@ impl + Copy + Default + PartialOrd> Astar< } pub fn expand(&mut self, new_nodes: &[(S, S, N)]) -> Option { - let curr_g_score = self.g_scores.get(&self.curr_node).unwrap().clone(); - - 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; - } - - entry.insert(curr_g_score + *edge_g_cost); - } - Entry::Vacant(entry) => { - entry.insert(curr_g_score + *edge_g_cost); - } - } - - self.frontier.push(MinScored( - curr_g_score + *edge_g_cost + *h_heuristic, - node.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; + + 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 { + return; + } + + entry.insert(curr_g_score + edge_g_cost); + } + Entry::Vacant(entry) => { + entry.insert(curr_g_score + edge_g_cost); + } + } + + self.frontier + .push(MinScored(curr_g_score + edge_g_cost + h_heuristic, node)); + } + + pub fn pop(&mut self) -> Option { MinScored(_ /*f_score*/, self.curr_node) = self.frontier.pop()?; Some(self.curr_node.clone()) }