icentral_distances/
distances.rs1crate::ix!();
2
3pub const INFINITE_DISTANCE: f64 = f64::MAX;
4
5#[derive(Clone,Debug)]
6pub struct DistanceMap {
7 name: String,
8 data: MaybeIndexedMap<f64>,
9}
10
11impl Default for DistanceMap {
12 fn default() -> Self {
13 Self::empty("default_distance_map")
14 }
15}
16
17impl CreateNamedEmpty for DistanceMap {
18
19 fn empty(name: &str) -> Self
20 {
21 Self::empty_mapped(name)
22 }
23}
24
25impl DistanceMap {
26
27 pub fn new_from_nodes(nodes: Vec<NodeId>, name: &str) -> Self
28 {
29 debug!("creating new DistanceMap named {} from {} nodes", name, nodes.len());
30
31 let mut builder = Self::empty_mapped(name);
32
33 for node in nodes {
34
35 builder.set_distance_for_node(
36 node,
37 INFINITE_DISTANCE
38 );
39 }
40
41 builder
42 }
43
44 pub fn empty_indexed(name: &str) -> Self
45 {
46 debug!("creating new empty_indexed DistanceMap named {}", name);
47
48 Self {
49 name: name.to_owned(),
50 data: MaybeIndexedMap::empty_indexed()
51 }
52 }
53
54 pub fn empty_mapped(name: &str) -> Self
55 {
56 debug!("creating new empty_mapped DistanceMap named {}", name);
57
58 Self {
59 name: name.to_owned(),
60 data: MaybeIndexedMap::empty_mapped()
61 }
62 }
63
64 pub fn new(len: usize, name: &str) -> Self
65 {
66 debug!("creating new DistanceMap named {} of len: {}", name, len);
67
68 Self {
69 name: name.to_owned(),
70 data: MaybeIndexedMap::new(len,INFINITE_DISTANCE),
71 }
72 }
73
74 pub fn v_closer_than_u(
75 &self,
76 v: NodeId,
77 u: NodeId) -> bool
78 {
79 debug!("in {}, checking if v={} is closer than u={}", self.name, v, u);
80
81 self.distance(v) < self.distance(u)
82 }
83
84 pub fn len(&self) -> usize
85 {
86 self.data.len()
87 }
88
89 pub fn is_farther_away(&self, v: NodeId, u: NodeId) -> bool
90 {
91 debug!("in {}, checking if v={} is farther away than u={}", self.name, v, u);
92
93 self.data[v] > self.data[u]
94 }
95
96 pub fn is_farther_than_one_away(&self, v: NodeId, u: NodeId) -> bool
97 {
98 debug!("in {}, checking if v={} is farther than one away than u={}", self.name, v, u);
99
100 self.data[v] > (self.data[u] + 1.0)
101 }
102
103 pub fn is_one_step_away(&self, v: NodeId, u: NodeId) -> bool
104 {
105 debug!("in {}, checking if v={} is one step away from u={}", self.name, v, u);
106
107 self.data[v] == (self.data[u] + 1.0)
108 }
109
110 pub fn is_infinite(&self, node: NodeId) -> bool
111 {
112 let result = self.distance(node) == INFINITE_DISTANCE;
113
114 debug!("in {}, checking if the distance to node {} is INFINITE (or possibly unmapped) -- found {}", self.name, node, result);
115
116 result
117 }
118
119 pub fn distance(&self, node: NodeId) -> f64
120 {
121 self.data[node]
122 }
123
124 pub fn distance_ref(&self, node: NodeId)
125 -> &f64
126 {
127 &self.data[node]
128 }
129
130 pub fn distance_mut(&mut self, node: NodeId)
131 -> &mut f64
132 {
133 &mut self.data[node]
134 }
135
136 pub fn set_distance_for_node(&mut self, node: NodeId, val: f64)
137 {
138 debug!("in {}, setting distance for node {} to {}", self.name, node, val);
139
140 self.data.set(node, val);
141 }
142
143 pub fn insert_node_at_infinite_distance(&mut self, node: NodeId)
144 {
145 self.set_distance_for_node(node,INFINITE_DISTANCE);
146 }
147
148 pub fn set_one_step_away(
149 &mut self,
150 dst: NodeId,
151 src: NodeId)
152 {
153 self.set_distance_for_node(dst, self.data[src] + 1.0);
154 }
155
156 pub fn set_zero_distance(&mut self, source: NodeId)
157 {
158 self.set_distance_for_node(source, 0.0);
159 }
160
161 pub fn reinit(&mut self, len: usize)
162 {
163 debug!("reinitializing DistanceMap {} to len {}", self.name, len);
164
165 self.data.refill(len,INFINITE_DISTANCE);
166 }
167}