debug: Create and use `before_probe` observer for search visualization

Also changed `as_*`s to `into_*`s.
This commit is contained in:
Mikolaj Wielgus 2023-10-13 04:00:01 +00:00
parent 4e8e9298e6
commit bfbad933e2
9 changed files with 87 additions and 29 deletions

View File

@ -29,7 +29,7 @@ impl Band {
None None
} else { } else {
Some(Self { Some(Self {
from: *interior.pop().unwrap().as_dot().unwrap(), from: interior.pop().unwrap().into_dot().unwrap(),
to: dot, to: dot,
interior, interior,
}) })
@ -54,7 +54,7 @@ impl Band {
} else { } else {
Some(Self { Some(Self {
from: dot, from: dot,
to: *interior.pop().unwrap().as_dot().unwrap(), to: interior.pop().unwrap().into_dot().unwrap(),
interior, interior,
}) })
} }

View File

@ -21,18 +21,18 @@ impl Bow {
let bend = index; let bend = index;
let seg1_dot2 = Bend::new(bend, graph).prev().unwrap(); let seg1_dot2 = Bend::new(bend, graph).prev().unwrap();
let seg1 = *Dot::new(seg1_dot2, graph) let seg1 = Dot::new(seg1_dot2, graph)
.tagged_prev() .tagged_prev()
.unwrap() .unwrap()
.as_seg() .into_seg()
.unwrap(); .unwrap();
let seg1_dot1 = Seg::new(seg1, graph).prev().unwrap(); let seg1_dot1 = Seg::new(seg1, graph).prev().unwrap();
let seg2_dot1 = Bend::new(bend, graph).next().unwrap(); let seg2_dot1 = Bend::new(bend, graph).next().unwrap();
let seg2 = *Dot::new(seg2_dot1, graph) let seg2 = Dot::new(seg2_dot1, graph)
.tagged_next() .tagged_next()
.unwrap() .unwrap()
.as_seg() .into_seg()
.unwrap(); .unwrap();
let seg2_dot2 = Seg::new(seg2, graph).next().unwrap(); let seg2_dot2 = Seg::new(seg2, graph).next().unwrap();

View File

@ -116,7 +116,7 @@ impl<'a, 'b> Guide<'a, 'b> {
.layout .layout
.primitive(bend) .primitive(bend)
.shape() .shape()
.as_bend() .into_bend()
.unwrap() .unwrap()
.circle(); .circle();
circle.r += self.rules.ruleset(&self.conditions).clearance.min; circle.r += self.rules.ruleset(&self.conditions).clearance.min;

View File

@ -188,7 +188,7 @@ impl Layout {
.graph .graph
.node_weight(bend.index) .node_weight(bend.index)
.unwrap() .unwrap()
.as_bend() .into_bend()
.unwrap() .unwrap()
.cw; .cw;
self.graph self.graph

View File

@ -40,7 +40,7 @@ use sdl2::EventPump;
use shape::Shape; use shape::Shape;
use std::panic; use std::panic;
use std::time::Duration; use std::time::Duration;
use tracer::Tracer; use tracer::{Trace, Tracer};
use crate::graph::DotWeight; use crate::graph::DotWeight;
use crate::math::Circle; use crate::math::Circle;
@ -67,7 +67,7 @@ impl<'a> DebugRouterObserver<'a> {
} }
impl<'a> RouterObserver for DebugRouterObserver<'a> { impl<'a> RouterObserver for DebugRouterObserver<'a> {
fn on_rework(&mut self, tracer: &Tracer, path: &[VertexIndex]) { fn on_rework(&mut self, tracer: &Tracer, trace: &Trace) {
render_times( render_times(
self.event_pump, self.event_pump,
self.canvas, self.canvas,
@ -75,12 +75,39 @@ impl<'a> RouterObserver for DebugRouterObserver<'a> {
None, None,
None, None,
Some(tracer.mesh.clone()), Some(tracer.mesh.clone()),
path, &trace.path,
10, 20,
);
}
fn before_probe(&mut self, tracer: &Tracer, trace: &Trace, edge: MeshEdgeReference) {
let mut path = trace.path.clone();
path.push(edge.target());
render_times(
self.event_pump,
self.canvas,
RouterOrLayout::Layout(tracer.layout),
None,
None,
Some(tracer.mesh.clone()),
&path,
5,
);
}
fn on_probe(&mut self, tracer: &Tracer, trace: &Trace, edge: MeshEdgeReference) {
render_times(
self.event_pump,
self.canvas,
RouterOrLayout::Layout(tracer.layout),
None,
None,
Some(tracer.mesh.clone()),
&trace.path,
5,
); );
} }
fn on_probe(&mut self, _tracer: &Tracer, _edge: MeshEdgeReference) {}
fn on_estimate(&mut self, _tracer: &Tracer, _vertex: VertexIndex) {} fn on_estimate(&mut self, _tracer: &Tracer, _vertex: VertexIndex) {}
} }
@ -120,7 +147,7 @@ fn main() {
.add_dot(DotWeight { .add_dot(DotWeight {
net: 1, net: 1,
circle: Circle { circle: Circle {
pos: (500.5, 430.5).into(), pos: (470.5, 350.5).into(),
r: 8.0, r: 8.0,
}, },
}) })
@ -208,6 +235,26 @@ fn main() {
}, },
); );
let dot5 = router
.layout
.add_dot(DotWeight {
net: 2,
circle: Circle {
pos: (530.5, 400.5).into(),
r: 8.0,
},
})
.unwrap();
let _ = router.layout.add_seg(
dot4,
dot5,
SegWeight {
net: 20,
width: 16.0,
},
);
let dot1_2 = router let dot1_2 = router
.layout .layout
.add_dot(DotWeight { .add_dot(DotWeight {
@ -228,6 +275,15 @@ fn main() {
}, },
); );
let _ = router.layout.add_seg(
dot1_2,
dot2_2,
SegWeight {
net: 20,
width: 16.0,
},
);
render_times( render_times(
&mut event_pump, &mut event_pump,
&mut canvas, &mut canvas,
@ -283,7 +339,7 @@ fn render_times(
let state = event_pump.mouse_state(); let state = event_pump.mouse_state();
/*let _ = router.layout.move_dot( /*let _ = router.layout.move_dot(
*follower.as_dot().unwrap(), follower.into_dot().unwrap(),
(state.x() as f64, state.y() as f64).into(), (state.x() as f64, state.y() as f64).into(),
);*/ );*/

View File

@ -286,7 +286,7 @@ impl<'a> Dot<'a> {
} }
pub fn weight(&self) -> DotWeight { pub fn weight(&self) -> DotWeight {
*self.tagged_weight().as_dot().unwrap() self.tagged_weight().into_dot().unwrap()
} }
} }
@ -300,7 +300,7 @@ impl<'a> Seg<'a> {
} }
pub fn weight(&self) -> SegWeight { pub fn weight(&self) -> SegWeight {
*self.tagged_weight().as_seg().unwrap() self.tagged_weight().into_seg().unwrap()
} }
} }
@ -348,7 +348,7 @@ impl<'a> Bend<'a> {
} }
pub fn weight(&self) -> BendWeight { pub fn weight(&self) -> BendWeight {
*self.tagged_weight().as_bend().unwrap() self.tagged_weight().into_bend().unwrap()
} }
pub fn cross_product(&self) -> f64 { pub fn cross_product(&self) -> f64 {

View File

@ -12,8 +12,9 @@ use crate::rules::Rules;
use crate::tracer::{Trace, Tracer}; use crate::tracer::{Trace, Tracer};
pub trait RouterObserver { pub trait RouterObserver {
fn on_rework(&mut self, tracer: &Tracer, path: &[VertexIndex]); fn on_rework(&mut self, tracer: &Tracer, trace: &Trace);
fn on_probe(&mut self, tracer: &Tracer, 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_estimate(&mut self, tracer: &Tracer, vertex: VertexIndex); fn on_estimate(&mut self, tracer: &Tracer, vertex: VertexIndex);
} }
@ -45,18 +46,19 @@ impl<'a, RO: RouterObserver> AstarStrategy<&Mesh, u64> for RouterAstarStrategy<'
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);
self.observer.on_rework(&self.tracer, &new_path); 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()
} }
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);
if self if self
.tracer .tracer
.step(&mut self.trace, edge.target(), 5.0) .step(&mut self.trace, edge.target(), 5.0)
.is_ok() .is_ok()
{ {
self.observer.on_probe(&self.tracer, edge); self.observer.on_probe(&self.tracer, &self.trace, edge);
self.tracer.undo_step(&mut self.trace); self.tracer.undo_step(&mut self.trace);
Some(1) Some(1)
} else { } else {

View File

@ -22,12 +22,12 @@ impl Segbend {
graph: &StableDiGraph<TaggedWeight, Label, usize>, graph: &StableDiGraph<TaggedWeight, Label, usize>,
) -> Option<Self> { ) -> Option<Self> {
Dot::new(dot, graph).tagged_prev().map(|tagged_prev| { Dot::new(dot, graph).tagged_prev().map(|tagged_prev| {
let bend = *tagged_prev.as_bend().unwrap(); let bend = tagged_prev.into_bend().unwrap();
let dot = Bend::new(bend, graph).prev().unwrap(); let dot = Bend::new(bend, graph).prev().unwrap();
let seg = *Dot::new(dot, graph) let seg = Dot::new(dot, graph)
.tagged_prev() .tagged_prev()
.unwrap() .unwrap()
.as_seg() .into_seg()
.unwrap(); .unwrap();
Self { bend, dot, seg } Self { bend, dot, seg }
@ -39,12 +39,12 @@ impl Segbend {
graph: &StableDiGraph<TaggedWeight, Label, usize>, graph: &StableDiGraph<TaggedWeight, Label, usize>,
) -> Option<Self> { ) -> Option<Self> {
Dot::new(dot, graph).tagged_next().map(|tagged_next| { Dot::new(dot, graph).tagged_next().map(|tagged_next| {
let bend = *tagged_next.as_bend().unwrap(); let bend = tagged_next.into_bend().unwrap();
let dot = Bend::new(bend, graph).next().unwrap(); let dot = Bend::new(bend, graph).next().unwrap();
let seg = *Dot::new(dot, graph) let seg = Dot::new(dot, graph)
.tagged_next() .tagged_next()
.unwrap() .unwrap()
.as_seg() .into_seg()
.unwrap(); .unwrap();
Self { bend, dot, seg } Self { bend, dot, seg }

View File

@ -9,7 +9,7 @@ use crate::{
#[derive(Debug)] #[derive(Debug)]
pub struct Trace { pub struct Trace {
path: Vec<VertexIndex>, pub path: Vec<VertexIndex>,
head: Head, head: Head,
} }