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 triangulation;
use draw::DrawException;
use geo::point;
use graph::{FixedDotIndex, FixedSegWeight, LooseDotIndex, MakePrimitive};
use graph::{FixedDotIndex, FixedSegWeight, Index, LooseDotIndex, MakePrimitive};
use layout::Layout;
use mesh::{Mesh, MeshEdgeReference, VertexIndex};
use petgraph::visit::{EdgeRef, IntoEdgeReferences};
@ -68,7 +69,14 @@ struct EmptyRouterObserver;
impl RouterObserver for EmptyRouterObserver {
fn on_rework(&mut self, tracer: &Tracer, trace: &Trace) {}
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) {}
}
@ -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(
self.event_pump,
self.window,

View File

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