GNUnet  0.20.0
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 }
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
#define MAX_IBF_DECODE
Definition: ibf_sim.c:34
#define ROUNDS
Definition: ibf_sim.c:37

References MAX_IBF_DECODE, ret, and ROUNDS.