mirror of https://codeberg.org/topola/topola.git
debug: Create and use `before_probe` observer for search visualization
Also changed `as_*`s to `into_*`s.
This commit is contained in:
parent
4e8e9298e6
commit
bfbad933e2
|
|
@ -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,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
70
src/main.rs
70
src/main.rs
|
|
@ -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(),
|
||||||
);*/
|
);*/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 }
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue