router: handle tracer results

Pass the result of tracer probing step to the `.on_probe()` observer
method.

Unwrap the result of `.rework_path()`, as it should never fail as the
previous probe step should have ensured that this step is admissible.
This commit is contained in:
Mikolaj Wielgus 2023-12-22 22:46:07 +00:00
parent b24578ff35
commit 95faf96030
2 changed files with 37 additions and 12 deletions

View File

@ -24,8 +24,9 @@ mod shape;
mod tracer; mod tracer;
mod triangulation; mod triangulation;
use draw::DrawException;
use geo::point; use geo::point;
use graph::{FixedDotIndex, FixedSegWeight, LooseDotIndex, MakePrimitive}; use graph::{FixedDotIndex, FixedSegWeight, Index, LooseDotIndex, MakePrimitive};
use layout::Layout; use layout::Layout;
use mesh::{Mesh, MeshEdgeReference, VertexIndex}; use mesh::{Mesh, MeshEdgeReference, VertexIndex};
use petgraph::visit::{EdgeRef, IntoEdgeReferences}; use petgraph::visit::{EdgeRef, IntoEdgeReferences};
@ -68,7 +69,14 @@ struct EmptyRouterObserver;
impl RouterObserver for EmptyRouterObserver { impl RouterObserver for EmptyRouterObserver {
fn on_rework(&mut self, tracer: &Tracer, trace: &Trace) {} fn on_rework(&mut self, tracer: &Tracer, trace: &Trace) {}
fn before_probe(&mut self, tracer: &Tracer, trace: &Trace, edge: MeshEdgeReference) {} fn before_probe(&mut self, tracer: &Tracer, trace: &Trace, edge: MeshEdgeReference) {}
fn on_probe(&mut self, tracer: &Tracer, trace: &Trace, _edge: MeshEdgeReference) {} fn on_probe(
&mut self,
tracer: &Tracer,
trace: &Trace,
_edge: MeshEdgeReference,
result: Result<(), DrawException>,
) {
}
fn on_estimate(&mut self, _tracer: &Tracer, _vertex: VertexIndex) {} fn on_estimate(&mut self, _tracer: &Tracer, _vertex: VertexIndex) {}
} }
@ -128,7 +136,13 @@ impl<'a> RouterObserver for DebugRouterObserver<'a> {
); );
} }
fn on_probe(&mut self, tracer: &Tracer, trace: &Trace, _edge: MeshEdgeReference) { fn on_probe(
&mut self,
tracer: &Tracer,
trace: &Trace,
_edge: MeshEdgeReference,
result: Result<(), DrawException>,
) {
render_times( render_times(
self.event_pump, self.event_pump,
self.window, self.window,

View File

@ -3,6 +3,7 @@ use petgraph::visit::EdgeRef;
use spade::InsertionError; use spade::InsertionError;
use crate::astar::{astar, AstarStrategy, PathTracker}; use crate::astar::{astar, AstarStrategy, PathTracker};
use crate::draw::DrawException;
use crate::graph::FixedDotIndex; use crate::graph::FixedDotIndex;
use crate::layout::Layout; use crate::layout::Layout;
@ -14,7 +15,13 @@ use crate::tracer::{Trace, Tracer};
pub trait RouterObserver { pub trait RouterObserver {
fn on_rework(&mut self, tracer: &Tracer, trace: &Trace); fn on_rework(&mut self, tracer: &Tracer, trace: &Trace);
fn before_probe(&mut self, tracer: &Tracer, trace: &Trace, edge: MeshEdgeReference); fn before_probe(&mut self, tracer: &Tracer, trace: &Trace, edge: MeshEdgeReference);
fn on_probe(&mut self, tracer: &Tracer, trace: &Trace, edge: MeshEdgeReference); fn on_probe(
&mut self,
tracer: &Tracer,
trace: &Trace,
edge: MeshEdgeReference,
result: Result<(), DrawException>,
);
fn on_estimate(&mut self, tracer: &Tracer, vertex: VertexIndex); fn on_estimate(&mut self, tracer: &Tracer, vertex: VertexIndex);
} }
@ -45,7 +52,9 @@ impl<'a, RO: RouterObserver> AstarStrategy<&Mesh, u64> for RouterAstarStrategy<'
fn is_goal(&mut self, vertex: VertexIndex, tracker: &PathTracker<&Mesh>) -> bool { fn is_goal(&mut self, vertex: VertexIndex, tracker: &PathTracker<&Mesh>) -> bool {
let new_path = tracker.reconstruct_path_to(vertex); let new_path = tracker.reconstruct_path_to(vertex);
self.tracer.rework_path(&mut self.trace, &new_path, 5.0); self.tracer
.rework_path(&mut self.trace, &new_path, 5.0)
.unwrap();
self.observer.on_rework(&self.tracer, &self.trace); self.observer.on_rework(&self.tracer, &self.trace);
self.tracer.finish(&mut self.trace, self.to, 5.0).is_ok() self.tracer.finish(&mut self.trace, self.to, 5.0).is_ok()
@ -53,13 +62,15 @@ impl<'a, RO: RouterObserver> AstarStrategy<&Mesh, u64> for RouterAstarStrategy<'
fn edge_cost(&mut self, edge: MeshEdgeReference) -> Option<u64> { fn edge_cost(&mut self, edge: MeshEdgeReference) -> Option<u64> {
self.observer.before_probe(&self.tracer, &self.trace, edge); self.observer.before_probe(&self.tracer, &self.trace, edge);
if edge.target() != self.to.into() if edge.target() == self.to.into() {
&& self return None;
.tracer }
.step(&mut self.trace, edge.target(), 5.0)
.is_ok() let result = self.tracer.step(&mut self.trace, edge.target(), 5.0);
{ self.observer
self.observer.on_probe(&self.tracer, &self.trace, edge); .on_probe(&self.tracer, &self.trace, edge, result);
if result.is_ok() {
self.tracer.undo_step(&mut self.trace); self.tracer.undo_step(&mut self.trace);
Some(1) Some(1)
} else { } else {