@@ -162,15 +162,23 @@ impl<C> Layer<C> {
162162 self . nodes . len ( )
163163 }
164164
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 > {
166170 // Calculate using the circulants
167171 let size = self . node_count ( ) ;
168172 PRIMES
169173 . iter ( )
170174 . 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)
174182 }
175183}
176184
@@ -217,13 +225,14 @@ impl<C: Comparator> Layer<C> {
217225 let neighbors = self . get_neighbors ( next) ;
218226 let mut neighbor_distances: Vec < _ > = neighbors
219227 . 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) )
222231 . map ( |n| {
223232 let distance = self
224233 . 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)
227236 } )
228237 . collect ( ) ;
229238 neighbor_distances. sort_by_key ( |( n, distance) | ( OrderedFloat ( * distance) , * n) ) ;
0 commit comments