GNUnet 0.21.1
ibf_sim.c File Reference

implementation of simulation for invertible bloom filter More...

#include "platform.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
Include dependency graph for ibf_sim.c:

Go to the source code of this file.

Macros

#define MAX_IBF_DECODE   16
 
#define ROUNDS   100000
 
#define FIX1   0
 
#define FIX2   1
 
#define STRATA   0
 
#define VERBOSE   0
 
#define SLOW   0
 

Functions

int main (int argc, char **argv)
 

Detailed Description

implementation of simulation for invertible bloom filter

Author
Florian Dold

This code was used for some internal experiments, it is not build or shipped as part of the GNUnet system.

Definition in file ibf_sim.c.

Macro Definition Documentation

◆ MAX_IBF_DECODE

#define MAX_IBF_DECODE   16

Definition at line 34 of file ibf_sim.c.

◆ ROUNDS

#define ROUNDS   100000

Definition at line 37 of file ibf_sim.c.

◆ FIX1

#define FIX1   0

Definition at line 41 of file ibf_sim.c.

◆ FIX2

#define FIX2   1

Definition at line 43 of file ibf_sim.c.

◆ STRATA

#define STRATA   0

Definition at line 46 of file ibf_sim.c.

◆ VERBOSE

#define VERBOSE   0

Definition at line 49 of file ibf_sim.c.

◆ SLOW

#define SLOW   0

Definition at line 51 of file ibf_sim.c.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 54 of file ibf_sim.c.

55{
56 unsigned int round;
57 unsigned int buckets[31]; // max is 2^31 as 'random' returns only between 0 and 2^31
58 unsigned int i;
59 int j;
60 unsigned int r;
61 unsigned int ret;
62 unsigned long long total;
63 unsigned int want;
64 double predict;
65
66 srandom (time (NULL));
67 total = 0;
68 want = atoi (argv[1]);
69 for (round = 0; round < ROUNDS; round++)
70 {
71 memset (buckets, 0, sizeof(buckets));
72 for (i = 0; i < want; i++)
73 {
74 /* FIXME: might want to use 'better' PRNG to avoid
75 PRNG-induced biases */
76 r = random ();
77 if (0 == r)
78 continue;
79#if SLOW
80 for (j = 0; (j < 31) && (0 == (r & (1 << j))); j++)
81 ;
82#else
83 /* use assembly / gcc */
84 j = __builtin_ffs (r) - 1;
85#endif
86 buckets[j]++;
87 }
88 ret = 0;
89 predict = 0.0;
90 for (j = 31; j >= 0; j--)
91 {
92#if FIX1
93 /* improved algorithm, for 1000 elements with IBF-DECODE 8, I
94 get 990/1000 elements on average over 1 million runs; key
95 idea being to stop short of the 'last' possible IBF as
96 otherwise a "lowball" per-chance would unduely influence the
97 result */if ((j > 0) &&
98 (buckets[j - 1] > MAX_IBF_DECODE))
99 {
100 ret *= (1 << (j + 1));
101 break;
102 }
103#endif
104#if FIX2
105 /* another improvement: don't just always cut off the last one,
106 but rather try to predict based on all previous values where
107 that "last" one is; additional prediction can only really
108 work if MAX_IBF_DECODE is sufficiently high */
109 if ((j > 0) &&
110 ((buckets[j - 1] > MAX_IBF_DECODE) ||
111 (predict > MAX_IBF_DECODE)))
112 {
113 ret *= (1 << (j + 1));
114 break;
115 }
116#endif
117#if STRATA
118 /* original algorithm, for 1000 elements with IBF-DECODE 8,
119 I get 920/1000 elements on average over 1 million runs */
120 if (buckets[j] > MAX_IBF_DECODE)
121 {
122 ret *= (1 << (j + 1));
123 break;
124 }
125#endif
126 ret += buckets[j];
127 predict = (buckets[j] + 2.0 * predict) / 2.0;
128 }
129#if VERBOSE
130 fprintf (stderr, "%u ", ret);
131#endif
132 total += ret;
133 }
134 fprintf (stderr, "\n");
135 fprintf (stdout, "average %llu\n", total / ROUNDS);
136 return 0;
137}
#define MAX_IBF_DECODE
Definition: ibf_sim.c:34
#define ROUNDS
Definition: ibf_sim.c:37
static int ret
Final status code.
Definition: gnunet-arm.c:94

References MAX_IBF_DECODE, ret, and ROUNDS.