Extensions

Concrete supports native Python and NumPy operations as much as possible, but not everything is available in Python or NumPy. So, we provide some extensions ourselves to improve your experience.

fhe.univariate(function)

Allows you to wrap any univariate function into a single table lookup:

import numpy as np
from concrete import fhe

def complex_univariate_function(x):

    def per_element(element):
        result = 0
        for i in range(element):
            result += i
        return result

    return np.vectorize(per_element)(x)

@fhe.compiler({"x": "encrypted"})
def f(x):
    return fhe.univariate(complex_univariate_function)(x)

inputset = [np.random.randint(0, 5, size=(3, 2)) for _ in range(10)]
circuit = f.compile(inputset)

sample = np.array([
    [0, 4],
    [2, 1],
    [3, 0],
])
assert np.array_equal(circuit.encrypt_run_decrypt(sample), complex_univariate_function(sample))
triangle-exclamation

fhe.conv(...)

Allows you to perform a convolution operation, with the same semantic of onnx.Convarrow-up-right:

triangle-exclamation

fhe.maxpool(...)

Allows you to perform a maxpool operation, with the same semantic of onnx.MaxPoolarrow-up-right:

triangle-exclamation

fhe.array(...)

Allows you to create encrypted arrays:

triangle-exclamation

fhe.zero()

Allows you to create encrypted scalar zero:

fhe.zeros(shape)

Allows you to create encrypted tensor of zeros:

fhe.one()

Allows you to create encrypted scalar one:

fhe.ones(shape)

Allows you to create encrypted tensor of ones:

Last updated

Was this helpful?