@@ -162,15 +162,23 @@ impl<C> Layer<C> {
162
162
self . nodes . len ( )
163
163
}
164
164
165
- pub fn routing_nodes ( & self , nodeid : NodeId , sp : SearchParameters ) -> Vec < NodeId > {
165
+ pub fn routing_nodes (
166
+ & self ,
167
+ nodeid : NodeId ,
168
+ sp : SearchParameters ,
169
+ ) -> impl Iterator < Item = NodeId > {
166
170
// Calculate using the circulants
167
171
let size = self . node_count ( ) ;
168
172
PRIMES
169
173
. iter ( )
170
174
. take ( sp. circulant_parameter_count )
171
- . map ( |prime| NodeId ( ( nodeid. 0 + prime) % size) )
172
- . filter ( |i| * i != nodeid)
173
- . collect ( )
175
+ . flat_map ( move |prime| {
176
+ [
177
+ NodeId ( ( nodeid. 0 + prime) % size) ,
178
+ NodeId ( ( nodeid. 0 + ( size - ( prime % size) ) ) % size) ,
179
+ ]
180
+ } )
181
+ . filter ( move |i| * i != nodeid)
174
182
}
175
183
}
176
184
@@ -217,13 +225,14 @@ impl<C: Comparator> Layer<C> {
217
225
let neighbors = self . get_neighbors ( next) ;
218
226
let mut neighbor_distances: Vec < _ > = neighbors
219
227
. iter ( ) // Remove reviously visited nodes
220
- . chain ( self . routing_nodes ( next, sp) . iter ( ) )
221
- . filter ( |n| !visited. contains ( * n) )
228
+ . copied ( )
229
+ . chain ( self . routing_nodes ( next, sp) )
230
+ . filter ( |n| !visited. contains ( n) )
222
231
. map ( |n| {
223
232
let distance = self
224
233
. comparator
225
- . compare_vec ( v. clone ( ) , AbstractVector :: Stored ( self . get_vector ( * n) ) ) ;
226
- ( * n, distance)
234
+ . compare_vec ( v. clone ( ) , AbstractVector :: Stored ( self . get_vector ( n) ) ) ;
235
+ ( n, distance)
227
236
} )
228
237
. collect ( ) ;
229
238
neighbor_distances. sort_by_key ( |( n, distance) | ( OrderedFloat ( * distance) , * n) ) ;
0 commit comments