1
1
use std:: marker:: PhantomData ;
2
+ use std:: collections:: HashMap ;
3
+ use std:: sync:: RwLock ;
2
4
3
5
use crate :: crypto:: feistel:: { self , FeistelPrecomputed } ;
4
6
use crate :: drgraph:: { BucketGraph , Graph } ;
18
20
base_graph : G ,
19
21
pub reversed : bool ,
20
22
feistel_precomputed : FeistelPrecomputed ,
23
+ parents_cache : RwLock < HashMap < usize , Vec < usize > > > ,
21
24
_h : PhantomData < H > ,
22
25
}
23
26
50
53
expansion_degree,
51
54
reversed : false ,
52
55
feistel_precomputed : feistel:: precompute ( ( expansion_degree * nodes) as u32 ) ,
56
+ parents_cache : RwLock :: new ( HashMap :: new ( ) ) ,
53
57
_h : PhantomData ,
54
58
}
55
59
}
@@ -83,6 +87,7 @@ pub trait ZigZag: ::std::fmt::Debug + Clone + PartialEq + Eq {
83
87
fn reversed ( & self ) -> bool ;
84
88
fn expanded_parents ( & self , node : usize ) -> Vec < usize > ;
85
89
fn real_index ( & self , i : usize ) -> usize ;
90
+ fn parents_cache ( & self ) -> RwLock < HashMap < usize , Vec < usize > > > ;
86
91
fn new_zigzag (
87
92
nodes : usize ,
88
93
base_degree : usize ,
@@ -205,6 +210,7 @@ where
205
210
expansion_degree : self . expansion_degree ,
206
211
reversed : !self . reversed ,
207
212
feistel_precomputed : feistel:: precompute ( ( self . expansion_degree * self . size ( ) ) as u32 ) ,
213
+ parents_cache : RwLock :: new ( HashMap :: new ( ) ) ,
208
214
_h : PhantomData ,
209
215
}
210
216
}
@@ -223,7 +229,13 @@ where
223
229
224
230
#[ inline]
225
231
fn expanded_parents ( & self , node : usize ) -> Vec < usize > {
226
- ( 0 ..self . expansion_degree )
232
+
233
+ // let parents_cache = self.parents_cache().read().unwrap();
234
+ // if (*parents_cache).contains_key(&node) {
235
+ // return (*parents_cache)[&node].clone();
236
+ // }
237
+
238
+ let parents: Vec < usize > = ( 0 ..self . expansion_degree )
227
239
. filter_map ( |i| {
228
240
let other = self . correspondent ( node, i) ;
229
241
if self . reversed {
@@ -238,7 +250,12 @@ where
238
250
None
239
251
}
240
252
} )
241
- . collect ( )
253
+ . collect ( ) ;
254
+
255
+ // let mut parents_cache = self.parents_cache().write().unwrap();
256
+ // (*parents_cache).insert(node, parents.clone());
257
+
258
+ parents
242
259
}
243
260
244
261
#[ inline]
@@ -249,6 +266,10 @@ where
249
266
i
250
267
}
251
268
}
269
+
270
+ fn parents_cache ( & self ) -> RwLock < HashMap < usize , Vec < usize > > > {
271
+ self . parents_cache
272
+ }
252
273
}
253
274
254
275
#[ cfg( test) ]
0 commit comments