One of the most common operations in Concrete-Numpy is
Table Lookups(TLUs). TLUs are performed with an FHE operation called
Programmable Bootstrapping(PBS). PBSes have a certain probability of error, which, when triggered, result in inaccurate results.
Let's say you have the table:
[0, 1, 4, 9, 16, 25, 36, 49, 64]
And you performed a table lookup using
4. The result you should get is
16, but because of the possibility of error, you can sometimes get
25. Sometimes even
36if you have a high probability of error.
The probability of this error can be configured through the
global_p_errorconfiguration options. The difference between these two options is that,
p_erroris for individual TLUs but
global_p_erroris for the whole circuit.
Here is an example, if you set
0.01, it means every TLU in the circuit will have a 1% chance of not being exact and 99% chance of being exact. If you have a single TLU in the circuit,
global_p_errorwould be 1% as well. But if you have 2 TLUs for example,
global_p_errorwould be almost 2% (
1 - (0.99 * 0.99)).
However, if you set
0.01, the whole circuit will have 1% probability of being not exact, no matter how many table lookups are there.
If you set both of them, both will be satisfied. Essentially, the stricter one will be used.
By default, both
global_p_erroris set to
None, which results in
1 / 100_000being used. Feel free to play with these configuration options to pick the one best suited for your needs! For example, in some machine learning use cases, off-by-one or off-by-two errors doesn't affect the result much, in such cases
p_errorcould be set to increase performance without losing accuracy.