mirror of
https://github.com/zama-ai/concrete.git
synced 2026-01-13 14:58:01 -05:00
56 lines
2.5 KiB
Markdown
56 lines
2.5 KiB
Markdown
# Simulation
|
|
This document explains how to use simulation to speed up the development, enabling faster prototyping while accounting for the inherent probability of errors in Fully Homomorphic Encryption (FHE) execution.
|
|
|
|
## Using simulation for faster prototyping
|
|
During development, the speed of homomorphic execution can be a blocker for fast prototyping. Although you can directly call the function you want to compile, this approach does not fully replicate FHE execution, which involves a certain probability of error (see [Exactness](../core-features/table\_lookups.md#table-lookup-exactness)).
|
|
|
|
To overcome this issue, simulation is introduced:
|
|
|
|
```python
|
|
from concrete import fhe
|
|
import numpy as np
|
|
|
|
@fhe.compiler({"x": "encrypted"})
|
|
def f(x):
|
|
return (x + 1) ** 2
|
|
|
|
inputset = [np.random.randint(0, 10, size=(10,)) for _ in range(10)]
|
|
circuit = f.compile(inputset, p_error=0.1, fhe_simulation=True)
|
|
|
|
sample = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
|
|
|
|
actual = f(sample)
|
|
simulation = circuit.simulate(sample)
|
|
|
|
print(actual.tolist())
|
|
print(simulation.tolist())
|
|
```
|
|
|
|
After the simulation runs, it prints the following results:
|
|
|
|
```
|
|
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
|
|
[1, 4, 9, 16, 16, 36, 49, 64, 81, 100]
|
|
```
|
|
|
|
## Overflow detection in simulation
|
|
|
|
Overflow can happen during an FHE computation, leading to unexpected behaviors. Using simulation can help you detect these events by printing a warning whenever an overflow happens. This feature is disabled by default, but you can enable it by setting `detect_overflow_in_simulation=True` during compilation.
|
|
|
|
To demonstrate, we will compile the previous circuit with overflow detection enabled and trigger an overflow:
|
|
|
|
```python
|
|
# compile with overflow detection enabled
|
|
circuit = f.compile(inputset, p_error=0.1, fhe_simulation=True, detect_overflow_in_simulation=True)
|
|
# cause an overflow
|
|
circuit.simulate([0,1,2,3,4,5,6,7,8,15])
|
|
```
|
|
|
|
You will see the following warning after the simulation call:
|
|
|
|
```bash
|
|
WARNING at loc("script.py":3:0): overflow happened during addition in simulation
|
|
```
|
|
|
|
If you look at the MLIR (`circuit.mlir`), you will see that the input type is supposed to be `eint4` represented in 4 bits with a maximum value of 15. Since there's an addition of the input, we used the maximum value (15) here to trigger an overflow (15 + 1 = 16 which needs 5 bits). The warning specifies the operation that caused the overflow and its location. Similar warnings will be displayed for all basic FHE operations such as add, mul, and lookup tables.
|