aboutsummaryrefslogtreecommitdiff
path: root/src/set/gnunet-set-ibf-profiler.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/set/gnunet-set-ibf-profiler.c')
-rw-r--r--src/set/gnunet-set-ibf-profiler.c350
1 files changed, 175 insertions, 175 deletions
diff --git a/src/set/gnunet-set-ibf-profiler.c b/src/set/gnunet-set-ibf-profiler.c
index c54557fb0..944b63d30 100644
--- a/src/set/gnunet-set-ibf-profiler.c
+++ b/src/set/gnunet-set-ibf-profiler.c
@@ -50,62 +50,62 @@ static struct InvertibleBloomFilter *ibf_b;
50 50
51 51
52static void 52static void
53register_hashcode(struct GNUNET_HashCode *hash) 53register_hashcode (struct GNUNET_HashCode *hash)
54{ 54{
55 struct GNUNET_HashCode replicated; 55 struct GNUNET_HashCode replicated;
56 struct IBF_Key key; 56 struct IBF_Key key;
57 57
58 key = ibf_key_from_hashcode(hash); 58 key = ibf_key_from_hashcode (hash);
59 ibf_hashcode_from_key(key, &replicated); 59 ibf_hashcode_from_key (key, &replicated);
60 (void)GNUNET_CONTAINER_multihashmap_put( 60 (void) GNUNET_CONTAINER_multihashmap_put (
61 key_to_hashcode, 61 key_to_hashcode,
62 &replicated, 62 &replicated,
63 GNUNET_memdup(hash, sizeof *hash), 63 GNUNET_memdup (hash, sizeof *hash),
64 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); 64 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
65} 65}
66 66
67 67
68static void 68static void
69iter_hashcodes(struct IBF_Key key, 69iter_hashcodes (struct IBF_Key key,
70 GNUNET_CONTAINER_MulitHashMapIteratorCallback iter, 70 GNUNET_CONTAINER_MulitHashMapIteratorCallback iter,
71 void *cls) 71 void *cls)
72{ 72{
73 struct GNUNET_HashCode replicated; 73 struct GNUNET_HashCode replicated;
74 74
75 ibf_hashcode_from_key(key, &replicated); 75 ibf_hashcode_from_key (key, &replicated);
76 GNUNET_CONTAINER_multihashmap_get_multiple(key_to_hashcode, 76 GNUNET_CONTAINER_multihashmap_get_multiple (key_to_hashcode,
77 &replicated, 77 &replicated,
78 iter, 78 iter,
79 cls); 79 cls);
80} 80}
81 81
82 82
83static int 83static int
84insert_iterator(void *cls, const struct GNUNET_HashCode *key, void *value) 84insert_iterator (void *cls, const struct GNUNET_HashCode *key, void *value)
85{ 85{
86 struct InvertibleBloomFilter *ibf = cls; 86 struct InvertibleBloomFilter *ibf = cls;
87 87
88 ibf_insert(ibf, ibf_key_from_hashcode(key)); 88 ibf_insert (ibf, ibf_key_from_hashcode (key));
89 return GNUNET_YES; 89 return GNUNET_YES;
90} 90}
91 91
92 92
93static int 93static int
94remove_iterator(void *cls, const struct GNUNET_HashCode *key, void *value) 94remove_iterator (void *cls, const struct GNUNET_HashCode *key, void *value)
95{ 95{
96 struct GNUNET_CONTAINER_MultiHashMap *hashmap = cls; 96 struct GNUNET_CONTAINER_MultiHashMap *hashmap = cls;
97 97
98 /* if remove fails, there just was a collision with another key */ 98 /* if remove fails, there just was a collision with another key */
99 (void)GNUNET_CONTAINER_multihashmap_remove(hashmap, value, NULL); 99 (void) GNUNET_CONTAINER_multihashmap_remove (hashmap, value, NULL);
100 return GNUNET_YES; 100 return GNUNET_YES;
101} 101}
102 102
103 103
104static void 104static void
105run(void *cls, 105run (void *cls,
106 char *const *args, 106 char *const *args,
107 const char *cfgfile, 107 const char *cfgfile,
108 const struct GNUNET_CONFIGURATION_Handle *cfg) 108 const struct GNUNET_CONFIGURATION_Handle *cfg)
109{ 109{
110 struct GNUNET_HashCode id; 110 struct GNUNET_HashCode id;
111 struct IBF_Key ibf_key; 111 struct IBF_Key ibf_key;
@@ -116,193 +116,193 @@ run(void *cls,
116 struct GNUNET_TIME_Relative delta_time; 116 struct GNUNET_TIME_Relative delta_time;
117 117
118 set_a = 118 set_a =
119 GNUNET_CONTAINER_multihashmap_create(((asize == 0) ? 1 : (asize + csize)), 119 GNUNET_CONTAINER_multihashmap_create (((asize == 0) ? 1 : (asize + csize)),
120 GNUNET_NO); 120 GNUNET_NO);
121 set_b = 121 set_b =
122 GNUNET_CONTAINER_multihashmap_create(((bsize == 0) ? 1 : (bsize + csize)), 122 GNUNET_CONTAINER_multihashmap_create (((bsize == 0) ? 1 : (bsize + csize)),
123 GNUNET_NO); 123 GNUNET_NO);
124 set_c = GNUNET_CONTAINER_multihashmap_create(((csize == 0) ? 1 : csize), 124 set_c = GNUNET_CONTAINER_multihashmap_create (((csize == 0) ? 1 : csize),
125 GNUNET_NO); 125 GNUNET_NO);
126 126
127 key_to_hashcode = 127 key_to_hashcode =
128 GNUNET_CONTAINER_multihashmap_create(((asize + bsize + csize == 0) 128 GNUNET_CONTAINER_multihashmap_create (((asize + bsize + csize == 0)
129 ? 1 129 ? 1
130 : (asize + bsize + csize)), 130 : (asize + bsize + csize)),
131 GNUNET_NO); 131 GNUNET_NO);
132 132
133 printf("hash-num=%u, size=%u, #(A-B)=%u, #(B-A)=%u, #(A&B)=%u\n", 133 printf ("hash-num=%u, size=%u, #(A-B)=%u, #(B-A)=%u, #(A&B)=%u\n",
134 hash_num, 134 hash_num,
135 ibf_size, 135 ibf_size,
136 asize, 136 asize,
137 bsize, 137 bsize,
138 csize); 138 csize);
139 139
140 i = 0; 140 i = 0;
141 while (i < asize) 141 while (i < asize)
142 { 142 {
143 GNUNET_CRYPTO_hash_create_random(random_quality, &id); 143 GNUNET_CRYPTO_hash_create_random (random_quality, &id);
144 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains(set_a, &id)) 144 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (set_a, &id))
145 continue; 145 continue;
146 GNUNET_break(GNUNET_OK == 146 GNUNET_break (GNUNET_OK ==
147 GNUNET_CONTAINER_multihashmap_put( 147 GNUNET_CONTAINER_multihashmap_put (
148 set_a, 148 set_a,
149 &id, 149 &id,
150 NULL, 150 NULL,
151 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); 151 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
152 register_hashcode(&id); 152 register_hashcode (&id);
153 i++; 153 i++;
154 } 154 }
155 i = 0; 155 i = 0;
156 while (i < bsize) 156 while (i < bsize)
157 { 157 {
158 GNUNET_CRYPTO_hash_create_random(random_quality, &id); 158 GNUNET_CRYPTO_hash_create_random (random_quality, &id);
159 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains(set_a, &id)) 159 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (set_a, &id))
160 continue; 160 continue;
161 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains(set_b, &id)) 161 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (set_b, &id))
162 continue; 162 continue;
163 GNUNET_break(GNUNET_OK == 163 GNUNET_break (GNUNET_OK ==
164 GNUNET_CONTAINER_multihashmap_put( 164 GNUNET_CONTAINER_multihashmap_put (
165 set_b, 165 set_b,
166 &id, 166 &id,
167 NULL, 167 NULL,
168 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); 168 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
169 register_hashcode(&id); 169 register_hashcode (&id);
170 i++; 170 i++;
171 } 171 }
172 i = 0; 172 i = 0;
173 while (i < csize) 173 while (i < csize)
174 { 174 {
175 GNUNET_CRYPTO_hash_create_random(random_quality, &id); 175 GNUNET_CRYPTO_hash_create_random (random_quality, &id);
176 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains(set_a, &id)) 176 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (set_a, &id))
177 continue; 177 continue;
178 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains(set_b, &id)) 178 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (set_b, &id))
179 continue; 179 continue;
180 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains(set_c, &id)) 180 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (set_c, &id))
181 continue; 181 continue;
182 GNUNET_break(GNUNET_OK == 182 GNUNET_break (GNUNET_OK ==
183 GNUNET_CONTAINER_multihashmap_put( 183 GNUNET_CONTAINER_multihashmap_put (
184 set_c, 184 set_c,
185 &id, 185 &id,
186 NULL, 186 NULL,
187 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); 187 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
188 register_hashcode(&id); 188 register_hashcode (&id);
189 i++; 189 i++;
190 } 190 }
191 191
192 ibf_a = ibf_create(ibf_size, hash_num); 192 ibf_a = ibf_create (ibf_size, hash_num);
193 ibf_b = ibf_create(ibf_size, hash_num); 193 ibf_b = ibf_create (ibf_size, hash_num);
194 if ((NULL == ibf_a) || (NULL == ibf_b)) 194 if ((NULL == ibf_a) || (NULL == ibf_b))
195 { 195 {
196 /* insufficient memory */ 196 /* insufficient memory */
197 GNUNET_break(0); 197 GNUNET_break (0);
198 GNUNET_SCHEDULER_shutdown(); 198 GNUNET_SCHEDULER_shutdown ();
199 return; 199 return;
200 } 200 }
201 201
202 202
203 printf("generated sets\n"); 203 printf ("generated sets\n");
204 204
205 start_time = GNUNET_TIME_absolute_get(); 205 start_time = GNUNET_TIME_absolute_get ();
206 206
207 GNUNET_CONTAINER_multihashmap_iterate(set_a, &insert_iterator, ibf_a); 207 GNUNET_CONTAINER_multihashmap_iterate (set_a, &insert_iterator, ibf_a);
208 GNUNET_CONTAINER_multihashmap_iterate(set_b, &insert_iterator, ibf_b); 208 GNUNET_CONTAINER_multihashmap_iterate (set_b, &insert_iterator, ibf_b);
209 GNUNET_CONTAINER_multihashmap_iterate(set_c, &insert_iterator, ibf_a); 209 GNUNET_CONTAINER_multihashmap_iterate (set_c, &insert_iterator, ibf_a);
210 GNUNET_CONTAINER_multihashmap_iterate(set_c, &insert_iterator, ibf_b); 210 GNUNET_CONTAINER_multihashmap_iterate (set_c, &insert_iterator, ibf_b);
211 211
212 delta_time = GNUNET_TIME_absolute_get_duration(start_time); 212 delta_time = GNUNET_TIME_absolute_get_duration (start_time);
213 213
214 printf("encoded in: %s\n", 214 printf ("encoded in: %s\n",
215 GNUNET_STRINGS_relative_time_to_string(delta_time, GNUNET_NO)); 215 GNUNET_STRINGS_relative_time_to_string (delta_time, GNUNET_NO));
216 216
217 ibf_subtract(ibf_a, ibf_b); 217 ibf_subtract (ibf_a, ibf_b);
218 218
219 219
220 start_time = GNUNET_TIME_absolute_get(); 220 start_time = GNUNET_TIME_absolute_get ();
221 221
222 for (i = 0; i <= asize + bsize; i++) 222 for (i = 0; i <= asize + bsize; i++)
223 {
224 res = ibf_decode (ibf_a, &side, &ibf_key);
225 if (GNUNET_SYSERR == res)
223 { 226 {
224 res = ibf_decode(ibf_a, &side, &ibf_key); 227 printf ("decode failed, %u/%u elements left\n",
225 if (GNUNET_SYSERR == res) 228 GNUNET_CONTAINER_multihashmap_size (set_a)
226 { 229 + GNUNET_CONTAINER_multihashmap_size (set_b),
227 printf("decode failed, %u/%u elements left\n", 230 asize + bsize);
228 GNUNET_CONTAINER_multihashmap_size(set_a) + 231 return;
229 GNUNET_CONTAINER_multihashmap_size(set_b),
230 asize + bsize);
231 return;
232 }
233 if (GNUNET_NO == res)
234 {
235 if ((0 == GNUNET_CONTAINER_multihashmap_size(set_b)) &&
236 (0 == GNUNET_CONTAINER_multihashmap_size(set_a)))
237 {
238 delta_time = GNUNET_TIME_absolute_get_duration(start_time);
239 printf("decoded successfully in: %s\n",
240 GNUNET_STRINGS_relative_time_to_string(delta_time, GNUNET_NO));
241 }
242 else
243 {
244 printf("decode missed elements (should never happen)\n");
245 }
246 return;
247 }
248
249 if (side == 1)
250 iter_hashcodes(ibf_key, remove_iterator, set_a);
251 if (side == -1)
252 iter_hashcodes(ibf_key, remove_iterator, set_b);
253 } 232 }
254 printf("cyclic IBF, %u/%u elements left\n", 233 if (GNUNET_NO == res)
255 GNUNET_CONTAINER_multihashmap_size(set_a) + 234 {
256 GNUNET_CONTAINER_multihashmap_size(set_b), 235 if ((0 == GNUNET_CONTAINER_multihashmap_size (set_b)) &&
257 asize + bsize); 236 (0 == GNUNET_CONTAINER_multihashmap_size (set_a)))
237 {
238 delta_time = GNUNET_TIME_absolute_get_duration (start_time);
239 printf ("decoded successfully in: %s\n",
240 GNUNET_STRINGS_relative_time_to_string (delta_time, GNUNET_NO));
241 }
242 else
243 {
244 printf ("decode missed elements (should never happen)\n");
245 }
246 return;
247 }
248
249 if (side == 1)
250 iter_hashcodes (ibf_key, remove_iterator, set_a);
251 if (side == -1)
252 iter_hashcodes (ibf_key, remove_iterator, set_b);
253 }
254 printf ("cyclic IBF, %u/%u elements left\n",
255 GNUNET_CONTAINER_multihashmap_size (set_a)
256 + GNUNET_CONTAINER_multihashmap_size (set_b),
257 asize + bsize);
258} 258}
259 259
260 260
261int 261int
262main(int argc, char **argv) 262main (int argc, char **argv)
263{ 263{
264 struct GNUNET_GETOPT_CommandLineOption options[] = { 264 struct GNUNET_GETOPT_CommandLineOption options[] = {
265 GNUNET_GETOPT_option_uint('A', 265 GNUNET_GETOPT_option_uint ('A',
266 "asize", 266 "asize",
267 NULL, 267 NULL,
268 gettext_noop("number of element in set A-B"), 268 gettext_noop ("number of element in set A-B"),
269 &asize), 269 &asize),
270 270
271 GNUNET_GETOPT_option_uint('B', 271 GNUNET_GETOPT_option_uint ('B',
272 "bsize", 272 "bsize",
273 NULL, 273 NULL,
274 gettext_noop("number of element in set B-A"), 274 gettext_noop ("number of element in set B-A"),
275 &bsize), 275 &bsize),
276 276
277 GNUNET_GETOPT_option_uint('C', 277 GNUNET_GETOPT_option_uint ('C',
278 "csize", 278 "csize",
279 NULL, 279 NULL,
280 gettext_noop( 280 gettext_noop (
281 "number of common elements in A and B"), 281 "number of common elements in A and B"),
282 &csize), 282 &csize),
283 283
284 GNUNET_GETOPT_option_uint('k', 284 GNUNET_GETOPT_option_uint ('k',
285 "hash-num", 285 "hash-num",
286 NULL, 286 NULL,
287 gettext_noop("hash num"), 287 gettext_noop ("hash num"),
288 &hash_num), 288 &hash_num),
289 289
290 GNUNET_GETOPT_option_uint('s', 290 GNUNET_GETOPT_option_uint ('s',
291 "ibf-size", 291 "ibf-size",
292 NULL, 292 NULL,
293 gettext_noop("ibf size"), 293 gettext_noop ("ibf size"),
294 &ibf_size), 294 &ibf_size),
295 295
296 GNUNET_GETOPT_OPTION_END 296 GNUNET_GETOPT_OPTION_END
297 }; 297 };
298 298
299 GNUNET_PROGRAM_run2(argc, 299 GNUNET_PROGRAM_run2 (argc,
300 argv, 300 argv,
301 "gnunet-consensus-ibf", 301 "gnunet-consensus-ibf",
302 "help", 302 "help",
303 options, 303 options,
304 &run, 304 &run,
305 NULL, 305 NULL,
306 GNUNET_YES); 306 GNUNET_YES);
307 return 0; 307 return 0;
308} 308}