From 003bad581a79c4337324b1ea22ecf4e4aafbe777 Mon Sep 17 00:00:00 2001 From: Umut Date: Mon, 4 Oct 2021 12:05:20 +0300 Subject: [PATCH] feat(fhe_circuit): create FHECircuit class to combine operation graph and compiler engine --- concrete/common/fhe_circuit.py | 57 +++++++++ concrete/numpy/compile.py | 7 +- docs/dev/explanation/COMPILATION.md | 4 +- .../explanation/TERMINOLOGY_AND_STRUCTURE.md | 4 + .../QuantizedLinearRegression.ipynb | 59 ++++----- .../QuantizedLogisticRegression.ipynb | 113 +++++++++--------- docs/user/howto/COMPILING_AND_EXECUTING.md | 12 +- docs/user/tutorial/ARITHMETIC_OPERATIONS.md | 36 +++--- docs/user/tutorial/TABLE_LOOKUP.md | 24 ++-- .../tutorial/WORKING_WITH_FLOATING_POINTS.md | 10 +- tests/common/test_fhe_circuit.py | 50 ++++++++ 11 files changed, 239 insertions(+), 137 deletions(-) create mode 100644 concrete/common/fhe_circuit.py create mode 100644 tests/common/test_fhe_circuit.py diff --git a/concrete/common/fhe_circuit.py b/concrete/common/fhe_circuit.py new file mode 100644 index 000000000..03b6b3623 --- /dev/null +++ b/concrete/common/fhe_circuit.py @@ -0,0 +1,57 @@ +"""Module to hold the result of compilation.""" + +from pathlib import Path +from typing import List, Optional, Union + +from zamalang import CompilerEngine + +from .debugging import draw_graph, get_printable_graph +from .operator_graph import OPGraph + + +class FHECircuit: + """Class which is the result of compilation.""" + + opgraph: OPGraph + engine: CompilerEngine + + def __init__(self, opgraph: OPGraph, engine: CompilerEngine): + self.opgraph = opgraph + self.engine = engine + + def __str__(self): + return get_printable_graph(self.opgraph, show_data_types=True) + + def draw( + self, + show: bool = False, + vertical: bool = True, + save_to: Optional[Path] = None, + ) -> str: + """Draw operation graph of the circuit and optionally save/show the drawing. + + Args: + show (bool): if set to True, the drawing will be shown using matplotlib + vertical (bool): if set to True, the orientation will be vertical + save_to (Optional[Path]): if specified, the drawn graph will be saved to this path; + otherwise it will be saved to a temporary file + + Returns: + str: path of the file where the drawn graph is saved + + """ + + return draw_graph(self.opgraph, show, vertical, save_to) + + def run(self, *args: List[Union[int, List[int]]]) -> int: + """Encrypt, evaluate, and decrypt the inputs on the circuit. + + Args: + *args (List[Union[int, List[int]]]): inputs to the circuit + + Returns: + int: homomorphic evaluation result + + """ + + return self.engine.run(*args) diff --git a/concrete/numpy/compile.py b/concrete/numpy/compile.py index 8f7790a90..a5d499996 100644 --- a/concrete/numpy/compile.py +++ b/concrete/numpy/compile.py @@ -11,6 +11,7 @@ from ..common.bounds_measurement.inputset_eval import eval_op_graph_bounds_on_in from ..common.common_helpers import check_op_graph_is_integer_program from ..common.compilation import CompilationArtifacts, CompilationConfiguration from ..common.data_types import Integer +from ..common.fhe_circuit import FHECircuit from ..common.mlir import V0_OPSET_CONVERSION_FUNCTIONS, MLIRConverter from ..common.mlir.utils import ( extend_direct_lookup_tables, @@ -237,7 +238,7 @@ def _compile_numpy_function_internal( compilation_configuration: CompilationConfiguration, compilation_artifacts: CompilationArtifacts, show_mlir: bool, -) -> CompilerEngine: +) -> FHECircuit: """Compile an homomorphic program (internal part of the API). Args: @@ -282,7 +283,7 @@ def _compile_numpy_function_internal( engine = CompilerEngine() engine.compile_fhe(mlir_result) - return engine + return FHECircuit(op_graph, engine) def compile_numpy_function( @@ -292,7 +293,7 @@ def compile_numpy_function( compilation_configuration: Optional[CompilationConfiguration] = None, compilation_artifacts: Optional[CompilationArtifacts] = None, show_mlir: bool = False, -) -> CompilerEngine: +) -> FHECircuit: """Compile an homomorphic program (main API). Args: diff --git a/docs/dev/explanation/COMPILATION.md b/docs/dev/explanation/COMPILATION.md index 5e5f7e393..0dd09ab7d 100644 --- a/docs/dev/explanation/COMPILATION.md +++ b/docs/dev/explanation/COMPILATION.md @@ -22,13 +22,13 @@ x = hnp.EncryptedScalar(hnp.UnsignedInteger(2)) y = hnp.EncryptedScalar(hnp.UnsignedInteger(1)) # Compile the function to its homomorphic equivalent -engine = hnp.compile_numpy_function( +circuit = hnp.compile_numpy_function( f, {"x": x, "y": y}, [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1)], ) # Make homomorphic inference -engine.run(1, 0) +circuit.run(1, 0) ``` ## Overview diff --git a/docs/dev/explanation/TERMINOLOGY_AND_STRUCTURE.md b/docs/dev/explanation/TERMINOLOGY_AND_STRUCTURE.md index 706986fef..f1934029c 100644 --- a/docs/dev/explanation/TERMINOLOGY_AND_STRUCTURE.md +++ b/docs/dev/explanation/TERMINOLOGY_AND_STRUCTURE.md @@ -12,6 +12,10 @@ In this section we will go over some terms that we use throughout the project. - bounds - before intermediate representation is sent to the compiler, we need to know which node will output which type (e.g., uint3 vs uint5) - there are several ways to do this but the simplest one is to evaluate the intermediate representation with all combinations of inputs and remember the maximum and the minimum values for each node, which is what we call bounds, and bounds can be used to determine the appropriate type for each node +- fhe circuit + - it is the result of compilation + - it contains the operation graph and the compiler engine in it + - it has methods for printing, visualizing, and evaluating ## Module structure diff --git a/docs/user/advanced_examples/QuantizedLinearRegression.ipynb b/docs/user/advanced_examples/QuantizedLinearRegression.ipynb index 61d59c9be..db1b74634 100644 --- a/docs/user/advanced_examples/QuantizedLinearRegression.ipynb +++ b/docs/user/advanced_examples/QuantizedLinearRegression.ipynb @@ -201,7 +201,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -234,7 +234,7 @@ "output_type": "stream", "text": [ "[[2.669915]]\n", - "-3.2335129\n" + "-3.2335143\n" ] } ], @@ -517,7 +517,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -630,7 +630,7 @@ "id": "01d67c28", "metadata": {}, "source": [ - "### Let's compile our quantized inference function to it's operation graph for visualization" + "### Let's compile our quantized inference function to it's homomorphic equivalent" ] }, { @@ -644,7 +644,7 @@ "for x_i in x_q:\n", " inputset.append((int(x_i[0]),))\n", "\n", - "homomorphic_model = hnp.compile_numpy_function_into_op_graph(\n", + "circuit = hnp.compile_numpy_function(\n", " infer,\n", " {\"x_0\": hnp.EncryptedScalar(hnp.Integer(input_bits, is_signed=False))},\n", " inputset,\n", @@ -656,7 +656,7 @@ "id": "c62af039", "metadata": {}, "source": [ - "### Here are some representations of the operation graph" + "### Here are some representations of the fhe circuit" ] }, { @@ -681,7 +681,7 @@ } ], "source": [ - "print(hnp.get_printable_graph(homomorphic_model, show_data_types=True))" + "print(circuit)" ] }, { @@ -694,7 +694,7 @@ "data": { "image/png": "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smULZ8+e1WLUmId25ihWr17NlVdeSRsPpUT3NnoGjh8T7DNz7rjjDqKjo8nIyDDbFHegZ+D4M8HszCkpKWHdunUB00QF3Uz1a4LZmfPDDz+Qm5urxajxHYLVmZOZmUmDBg1o27at2aa4DS1GPydYnTmZmZn06NGDkJDAeYQD506CmGCbmVNaWsratWsDqokKWowBQzA5c7Zt28apU6f8fmV/ebQYA4RgcuZkZmZSv359UlJSzDbFrWgxBhDB4syx9RcDbWxVizGACAZnjogEZH8RtBgDDk84c7Zu3Urfvn2Ji4sjNjaW3r17s27dOrd8d03ZsWMHv/zyS5X9xaVLl5KUlERYmP9EI9ViDEDc6czZuHEj3bp1IzY2ll27drF//36aN29OWloay5cvd4O1NSMzM5N69erRoUMHl8f37dtH//79ef755zl58qR3jaslem5qgPLss88yc+ZMfvrpp0sOgFxaWkr79u3Jyclh3759REdHA2oqWtu2bblw4QLZ2dlERka60/RKufvuuzl//jxLlixxefzee++lffv2PPPMMzRt2pQTJ05QXFxROhufQs9NDVTc4czJyspix44dDB48uEyIAKGhoQwbNozDhw+zePFid5hbLUSErKysSvuLM2fOZMKECX7VPLWhxRiguMOZs2rVKgCuv/56p2O2fStXrrx0I2vI7t27OXnyZKVitP/R8De0GAOY2jpzdu/eDcBVV13ldCwhIQGAPXv21M7IGpCZmUlMTAzXXXed167pTbQYA5zaOHNyc3MBqFvXOUdTTEwMAKdPn66VfTUhMzOT7t27Ex4e7rVrehMtxgDHUzNzbH4/bwaCqqq/6O9oMQYBl+rMiYuLA+D8+fNOx2z7bOd4mj179nDs2DEtRo1/c6nOnNatWwNw5MgRp2NHjx4F8Fq80szMTOrUqePSmRQoaDEGCZfizLHlr9i8ebPTMdu+Xr16uc/ISsjMzKRbt25ERER45XpmoMUYRNicOdOnT6/W+T179iQ5OZn58+eTn59ftr+kpIR58+aRmJhI3759PWWuA2vWrAnoJipoMQYVycnJPPnkk0ycOLFazpyQkBBmzpxJTk4Oo0eP5sSJE5w6dYpx48aRnZ3NjBkziIqK8rjd+/bt49ChQ1qMmsCips6crl27sn79es6cOUOrVq1o2rQp2dnZrF69mt///vcetlaRmZlJVFQUnTt3rvLcxYsXY7FYsFgsHD16lJKSkrLPH374oResvXT03NQgZN68eQwfPpx169bRtWtXs82pklGjRnH48OGyGUEBip6bGoz4W8wcW3KbQEeLMUipqTPHLA4dOsTBgwe1GDWBS02dOWbxzTffEBkZSZcuXcw2xeNoMQYx/hAzJzMzky5duvj1aozqosUYxMTExPh8zJxg6S+C9qZq8N1sVkeOHCExMZGvv/7aazN9TER7UzW+68xZvXo1ERERfjH84g60GDU+68zJzMykc+fOLtdTBiJajBrAN505wdRfBC1GjRV7Z85///tfs83h+PHjZGdnB5UYtQNH44CvOHPmzp3LyJEjycnJITY21jQ7vIh24GgcmTp1qk84czIzM7n++uuDRYiAbqZqytGmTRufcOYEW38RtBg1LvCmM+f06dO89NJLfP3112VxdX755Rd++umnoBOj7jNqXGJbZrV27VpuvPFGp+MlJSVu6VMWFBQQHR2NiBAaGsp1111HQkIC//73vzl8+DBNmjSp9TX8hAwtRk2FuHLm7N+/nyeffJKRI0cyaNAgt1ynXr165OXllX0ODw+nqKiI0NBQ2rdvz+9+9zt69uxJampqIPchMxCNpgJ27twp4eHh8t5778nFixflL3/5i0RERAggzz33nNuu06JFCwEqfIWHhwsgf/vb39x2TR8kXdeMmkr505/+xCeffEKdOnU4ePBg2WLk1NRUsrKy3HKNnj17VvpdYWFhXHvttWzcuNGn5s66mQz/S9Wj8RpHjhzhwIEDnDhxgpCQEEpLS8uOff/995SWlhISUnsfYGJiotP322OxWJg9e3YgCxHQ3lSNCwoLC3n33Xdp2bIlCxcuBHASyvnz58nOznbL9Ro3blxh/ozQ0FBeeeUV2rZt65Zr+TK6ZtQ4cPDgQW6++WYOHDhAZT2YkJAQvvvuO1q1alXrazZq1MjltcLCwkhKSuLZZ5+t9TX8AV0zahy4+uqr+dOf/kRISEilzcKwsDC+++47t1yzcePGLrMLiwhz5swJ2KxT5dFi1DgxduxYvvnmG2JjYyvMAFxYWMi6devccr34+HinZnBoaCjPP/88nTp1css1/AHtTdVUyL59++jTpw8HDhygqKjI6XhERATnzp2rdc21fft2UlJSyj6HhYVx9dVXs337dq9ELPcR9ERxTcW0aNGC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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -703,33 +703,11 @@ ], "source": [ "from PIL import Image\n", - "file = Image.open(hnp.draw_graph(homomorphic_model))\n", + "file = Image.open(circuit.draw())\n", "file.show()\n", "file.close()" ] }, - { - "cell_type": "markdown", - "id": "de19a433", - "metadata": {}, - "source": [ - "### It's time to compile the function to its homomorphic equivalent" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "cf89c63d", - "metadata": {}, - "outputs": [], - "source": [ - "engine = hnp.compile_numpy_function(\n", - " infer,\n", - " {\"x_0\": hnp.EncryptedScalar(hnp.Integer(input_bits, is_signed=False))},\n", - " inputset,\n", - ")" - ] - }, { "cell_type": "markdown", "id": "46753da7", @@ -740,14 +718,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "id": "c0b246f7", "metadata": {}, "outputs": [], "source": [ "homomorphic_predictions = []\n", "for x_i in map(lambda x_i: int(x_i[0]), x_q):\n", - " inference = QuantizedArray(engine.run(x_i), y_q.parameters)\n", + " inference = QuantizedArray(circuit.run(x_i), y_q.parameters)\n", " homomorphic_predictions.append(inference.dequantize())\n", "homomorphic_predictions = np.array(homomorphic_predictions, dtype=np.float32)" ] @@ -762,10 +740,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "id": "92c7f2f5", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD4CAYAAAAXUaZHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAne0lEQVR4nO3deVyVZf7/8dcFouYCqKi5rywuldtkTVNZzpRao/m1dZyyxrIpKyLLNFOx0sk2o99kZqu2aI6lmS1jatqqIzZNZmpqggoKIiI7CFy/P85tAaGiAvfhnPfz8eDBfa77PvDxPE7vLj73de7bWGsRERHfEuB2ASIiUvUU7iIiPkjhLiLigxTuIiI+SOEuIuKD6rhdAEBYWJjt2LGj22WIiNQqGzduTLPWNq9on1eEe8eOHYmPj3e7DBGRWsUYk3isfWrLiIj4IIW7iIgPUriLiPgghbuIiA9SuIuI+CCFu4iID1K4i4j4IIW7iIgLMjLzaX1zP5Z/vr5afr7CXUSkhq35vJDmY6LY12kjsW8/Vy2/wys+oSoi4g+ys2H8hEJeSO4G5yTS59BlxM95q1p+l8JdRKQaZedl89AbD/Hjjgy+WQe5LdfAOXu4uHgga579d7X9XoW7iEg1yc3PpevECFKa7IOGwEDP+CVcwupHVlbr71a4i4hUg7yCPNrFRJB+5j7491BuOXcyo0dDWGhjIttFVvvvV7iLiFSxhN35dH84krwuSYR8M4zPnl9K7941W4NWy4iIVBFr4dVXi+l6/YXkddlD5O4hpC2v+WAHhbuISJVISIDLLy9m9JibKD4/njZFHdny8nLquNQfUVtGROQUlZSU8J9N8Sx7pyHPPgtHjjwFvd+GYHj9xpcwxrhWm8JdROQU5Obn0ml8BKkhSbAYyAMCIeTKEHq068HATgNdrU/hLiJykrJy8mkbHUlmuyQ4HEzgX/IY3/4BCs8o4OmfnmbKRVNcnbWDeu4iIifl63X5NLstgsx2e2n9/TC2RO/irFY9eCb5ad5MepP+bfpzWZfL3C5T4S4iUhl5eXD/+EIueDKKI5F76HvwCpLeXUpUh6asvHElkWGRpOSkMOVi92ftoLaMiMgJffEF/O3WQnb0iIJzEhloB7HyueWendbSrEEzPhv1GV/v+ZrBXQe7W6xDM3cRkWPIzISxY+GiiwtJOLs7nLOLP/3UjpVTP/IcYC3ExEBsLE3PaMqVEVd6xawdFO4iIr+Rm59Lqzu7EPK4YXaIgYn1KOq5k0u3t2XF23s8gX402OPiICPD89iLqC0jIlLKnqRcIidFkNcpiaDNXejcKoSGDaFvWF/mTnkRwpxAj4vzPCE6GmbNAi+ZsR9lrBf836Zfv342Pj7e7TJExI9ZC28tyGfU+xGUdN9D5K5h/O/FpdSrV8GBAaWaHiUlrgW7MWajtbZfRfvUlhERv5ecDFcNL+TG96Io6b6Hi/KvYOvrxwj2mJiyY0dbNF5G4S4ifstaeOUViOpeyLLAKDgrkcsDB7H2H8srPvhojz062jNjj472PPbCgFfPXUT80s8/w5gxsGp1EfWv6w5Ru/hTwJ/45OGPK36CMRAaWrbHPmuWZ19oqHruFVHPXUROi7Vlw7X841KycnLpHn0RewsSAKgbkkdh81wuNZeyasqqKv1d1e20e+7GmARjzCZjzHfGmHhnrKkx5lNjzHbnexNn3BhjnjPG7DDGfG+M6VN1/xQRkXJiY8u2RUqtPS9vw7e5NLs9gr3tNhLYKI8GTfMJCjIMrTe0csEOvw1yL5uxH3UybZlLrLVppR5PAFZZax83xkxwHj8IDAbCna/+wAvOdxGRqmWtZ4350WWJs2aV7Ys7s+rCQnh0ej6P/RgFPZPoc2AY8bOXemsuV4nT6bkPAwY42/OANXjCfRgw33r6PeuMMaHGmFbW2n2nU6iIyG+U7nuXW3ue+dg0hk67hISD+9m3Hwob7Yeeh/mTvYIV/1zqWsk1pbKrZSywwhiz0RgzxhlrWSqw9wMtne02wJ5Sz93rjJVhjBljjIk3xsQfOHDgFEoXEaFswDuyZzxK+MORrDVrSay3ncL22wlols2wesNYEVvBShgfVNmZ+x+stUnGmBbAp8aYraV3WmutMeakzsxaa+cCc8FzQvVknisi8otya8+zA6HDnW1J75QJy69nTJ8FPPEEhIS4WKMLKjVzt9YmOd9TgSXAuUCKMaYVgPM91Tk8CWhX6ultnTERkapVbu35vn3ZtLy+GemdMmm4YiirZ77Niy/6X7BDJcLdGNPQGNP46DZwGfADsAwY5Rw2Cnjf2V4G3OSsmjkPOKx+u4hUi1JrzxdfNJ22MZHkhh8k/Js/kDrgXC651IfPmJ5AZdoyLYElzmUs6wBvW2s/McZsABYZY0YDicC1zvEfAUOAHUAucEuVVy0i4jgwNpaxd+fxrwWR0DOJi/OuYs3H73ntEsWacsJwt9b+DJxTwfhB4Dd3gHVWyYytkupERCqQmZPJ5Lcm892PmaxfDwXtV0DPZIbUuZIPH1/idnleQZcfEJFaJTMnky4PhZPWNBWaAIM844PqDOLDSR+4Wps3UbiLSK2RmZNNu3GRZLZKJeDfI7jrj+O45hpoFhJKt/bd3C7PqyjcRaRW+H5zLr+bGUFhl/202HANX7+xiC5d3K7KeyncRcSrFRXBE0/lMum/EdB9H31SRhD/wSJ/P196Qrqeu4h4rU2boP/5+UzaGAXdk7jMDmPj7MUK9krQzF1EvEpJSQmf/GcVb759hHfeAS6+E3rs4YqgK1j+0FK3y6s1FO4i4jUyczLp9GAE6c1ToBlwp2d8UJ1BLH/IP64JU1UU7iLiFVLSsuk8IZLcdinU/eZiLu97Nh07QPiZ4dw99G63y6t1FO4i4roPP85l2JsRFEfsp8u2a/h20SKCg92uqnZTuIuIazIy4N77cpmXHQE99nFxzgjWvL3I7bJ8glbLiIgrli6FqO75zMuKgh5J/DnoKtY8sdjtsnyGwl1EalRKClx7LQwfkU/6gEjouYcr617Jsod0TZiqpLaMiNSIw9mZdBl3Ngeb7IbOwIOWI/VgcJ3BfDBR14Spagp3Eal2P27Lpvc/IinstJ96W7rQsVUj6teH37f8PbP/Ptvt8nySwl1Eqk1JCfy/53O59+sIiNpP7+Tr2PDWQgID3a7M9yncRaRKpWem87tHfsfeomSOHAEbVARRRQyyI/j4xYVul+c3FO4iUmUysjOImBLBwdCDsL0FpiSQkBC4utkVvHzXS26X51cU7iJSJTJzMuk8MYJDYQfh/ZsZ3vE1nn8eWrVyuzL/pHAXkdOWejCTThPCyW17gHorbuStSa8xYoTbVfk3hbuInJaVn2Uz6NVIirum0mnzDcR/MJ+mTd2uShTuInJKsrPh/gdzefFgBHTbz4VZ1/D5orfdLkscCncRqbT0zHSGPzOcXQcOsC8ZikKTodthhtUdwdKndE0Yb6JwF5FKycjOoOvkCA41OQgNAqCr5/olIxpew6L7FezeRuEuIieUkZ1B+/HhZLX0rISZOOg1pkyB+vXdrkyOReEuIsf108+ZnP1YJAUd0mjyxU2sfvU1evVyuyo5EYW7iJRlLRiDtfDiy9ncuSYCG5HKOXtuYMPH8wgKcrtAqQyFu4j8KjYWMjJIiJ7F6NvzWN00ArqlMHhbbz56WythahOFu4gAkJF1iKnbl7FhcwH/+Xw0xVEfQ+R+RnwEi8+/6JcZvdQOCncRISM7g04PhZMRcRAiAH4EC1d9AovPj4ZZsxTstYzCXcTPHTiUQccJ4eS2OkjQiht44KrbuWzGAMKOQI8c4GsFe22k2+yJ+LG1X2XSKjqS3NZpdPh+FHvfe4vpSUu4OMMJdoCYGE9LRmoVhbuIH8rLg/seyGbA8xEUd0nl4syRJLz7Gi3+EQNxcRAd7bnTRnS057ECvtZRW0bEz3zxBdwyOpedfTwrYYbXvY73nn7TszM01BPoR3vss2b9Oq7WTK1irBf837hfv342Pj7e7TJEfFZRcREfr/ucuXOLWf5hCYGXjaY4MomrG1zNvx74V9mDy6+K0SoZr2WM2Wit7VfRPs3cRWqD0wjcjOwMOjzYlcwWB6EzcDcUA8PPGP7bYIff/lwFe61U6XA3xgQC8UCStfZKY0wnYCHQDNgI3GitLTTG1APmA32Bg8B11tqEKq9cxF84Hyz6pVViracHHhrq2XccOxIy6PloOAXtDtJg/SUM6h9Fy5bQvU137vrzXTVQvLjlZGbu0cAWINh5PBOYZa1daIyZA4wGXnC+H7LWdjXGXO8cd10V1iziP6z1BHtcnOfxrFmeYD960rPcDL6kpISM7AyshUXv5jJ2dV9seBrnJIxi/ZLXqVfPnX+G1LxKhbsxpi1wBTAduM8YY4BLgb84h8wDYvGE+zBnG2Ax8E9jjLHe0NwXqW1Kn9SMi/s15KN/+8GinJwcwh8MZ1/zfb8+PxyuKBnJ8tder7maxStUdinks8B4oMR53AzIsNYWOY/3Am2c7TbAHgBn/2Hn+DKMMWOMMfHGmPgDBw6cWvUi/qB0wB9VLthzc3O55PpL2Nd8H2ZrBAGrBhG5ZxCPRDzG8mlv1nDB4g1OOHM3xlwJpFprNxpjBlTVL7bWzgXmgme1TFX9XBGfc7THXlpMzC8Bn5eXx2WXDWND6w1QUJ/zUtcx75UmhIe7U654h8rM3C8AhhpjEvCcQL0UiANCjTFH/+fQFkhytpOAdgDO/hA8J1ZF5GQdDfZjfLAoJzuP3r2v4qvtK6EHDG46ji8/VbBLJcLdWjvRWtvWWtsRuB5Yba0dCXwGXO0cNgp439le5jzG2b9a/XaRU2RMxR8sio7mv3kdadN2BNu2fUrIn8+lYVAj3rgzhgB97lw4vcsPPIjn5OoOPD31V5zxV4Bmzvh9wITTK1HEz8XGlumxFx4xTA1+nL4vreTw4Y+5+o5pZLbbwN3n3kWzBr85vSV+Sp9QFakFUg+l0v+x/uwrSqHwCNiSYqCQ1m3aQcNiDucfJuHeBMIahLldqtQgfUJVpBZLO5xGxLRIDodkwI4WBJgAQoKhc+fWtG3bFoDhUcMV7FKGwl3Ei6VnptN5UiRZYRnw3h3cdt5snnwSQkLcrky8ncJdxEslJmUQGRtBQZt0Gq++jffjZnPJJW5XJbWFwl3ECy1cnMFfloVjOx+k585bWP/JXBo0cLsqqU0U7iJe5MABuOPuTN4NjICINK4oGsXyN151uyyphRTuIi5LPZTK1c9ew66UdPYlQ3HYbuiQyQ2NRvL2uNfdLk9qKYW7iIvSDqcRHhtJZpMMCDYQDAEYRobcyPx757tdntRiCncRl6RlpNNhYgS5LTIIfP8OnrxpNvfcA4GBblcmvkDhLuKCb7/PoP+z4RS1P0Tr9bfz+eLZdOnidlXiSxTuIjWoqAhmPJHB1C1doUs6FxwczRcfzdGd7KTK6RJDIjVk0yY49/eZTN0cAV0Pcu0ZN/Pl/3tZwS7VQjN3kWqUnpnOtAWP8dX6PL79FjjrXeh6gJHBI3kz5jW3yxMfpnAXqSZph9Po/HC459IBHfB8Wbi+0fW8GaO7I0n1UriLVIM9+9MJnxJBQasMGqwcxaSRN9K/P7QMbUnPTj3dLk/8gMJdpApk5mQyf/V8ikuK2brVMnfLo5R0PET3n27nmw/nEBzsdoXibxTuIqcp+WAyUY9GkdUk69fBjjCkaDQfvj3HtbrEvyncRU7D/vT9dHu0G1khWdRfeQMFyf0YMADuvjmK4RcOcbs88WMKd5ETKCwuJMAEUCeg7H8uqYdSiZgWRVZoJiyOITLoGV5ZBH37ulSoSCla5y5yHNZahrw1hJ6ze5KclfzL+IGMNDpNiiQr9DBm6d1MH/kMGzYo2MV7aOYuchyrd61m1a5VGAyXzLuENaPWkLq7Lr+bFcGRNhm0/PoOPlv4HN26uV2pSFmauYscg7WWaWun0aZxGz664SOSMpPo9ewAej0RwZG2h/j9gdtJ+mS2gl28ksJd5BjWJq7li91f0PC/DRkcOZicuTmk5v8EndK5tt5ovpo9R1dwFK+ltozIMUxZPYWggrpsf2cHgYEPEpQSzAWJyQwc2paJ104AaylzYZjyj0VcpHAXqcC/t/6bL/Z8AasNHHmHYf93Dc8/D2ee6RwQGwsZGTBrlifQrYWYGAgN9ewTcZnaMiLl7E1JY+g/r4FsCN4+j8WLr+Hdd0sFu7WeYI+L8wT60WCPi/OMW+ti9SIemrmLlPLRp2n8eUEEJe2yiPrhbr7afiNNm5Y7yBjPjB08gR4X59mOjv51Ji/iMmO9YJbRr18/Gx8f73YZ4seys+G+8em8lB0OndMZXHA7H/3jBJcOsBYCSv3xW1KiYJcaZYzZaK3tV9E+zdzFbyUfTOb8GeeTciSNwkKw9QuhcxE3hYxmXkwlgj0mpuxYTIxm7uI11HMXv7Q/fT+Rj0Sxu9FuCtIbEpDbiCZFTbmnzT3Mi3n5+E8u3WOPjvbM2KOjy/bgRVymmbv4ndRDqXSZHEVuWBbm3RgeuuoZHn4Y6tev5A8wxrMqpnSP/WgPPjRUM3fxCuq5i1/Z/FMavZ8M50jrDJp/fg8rZsXRq9cp/jCtcxeXqecufs9a+OeLaUSvi8B2yKB/8h18sSKOoKDT+KHlg1zBLl5EPXfxeQkJcOnl6dzzdSS24yGuq3c7616afXrBLuLlNHMXn5SVlcWTTz7F2rWH+Gp9EcXXLIDOGYxudisv3627I4nvO2G4G2PqA58D9ZzjF1trpxpjOgELgWbARuBGa22hMaYeMB/oCxwErrPWJlRT/SK/kZ2dzYABQ/j2268gMARzQzZ0LeKWZrfw8l0vuV2eSI2oTFumALjUWnsO0AsYZIw5D5gJzLLWdgUOAaOd40cDh5zxWc5xIjUiIyOHs866gm+//YaGIW/S6x9/wHYt4qU/v8Srd73qdnkiNeaEM3frWU6T7TwMcr4scCnwF2d8HhALvAAMc7YBFgP/NMYY6w3LcqT2K7ciJXF/AuPeuJ/cwlwyM+E/G7ZwpE0i7c+/gc4D57Fm7wrmXDGHW/vc6mLRIjWvUj13Y0wgntZLV+B5YCeQYa0tcg7ZC7RxttsAewCstUXGmMN4Wjdp5X7mGGAMQPv27U/vXyH+odyVGBP3J9D90XByWzhvwwbAxZ7N3bzNvuQgZg+Zze39bnepYBH3VCrcrbXFQC9jTCiwBIg63V9srZ0LzAXPOvfT/Xni40pfiRHYPTGGHo+EkxtWRJMl93Dox8mMHAmPPVaHFi3qAhBoAqlXp56LRYu456RWy1hrM4wxnwHnA6HGmDrO7L0tkOQclgS0A/YaY+oAIXhOrIqculKfAk1+IY4e2XHktAYWTSS0cDr/+tgwcKC7JYp4kxOeUDXGNHdm7BhjzgD+BGwBPgOudg4bBbzvbC9zHuPsX61+u1QJY0h++AG6/jWQ7DbA4vu5d9B0Nm1SsIuUV5nVMq2Az4wx3wMbgE+ttcuBB4H7jDE78PTUX3GOfwVo5ozfB0yo+rLFH23+aR8dJ0SS17aYpotH8c2WL5hFDA0baO4gUl5lVst8D/SuYPxn4NwKxvOBa6qkOvFrGdkZLFi7gJISy8aNxbye+DC2fQ7nfjmMzze+Rr0JMb/eKEOX2hUpQ59QFa+UmJJIj8d7kBOa4xkwQHu4/ofzWbByia7EKHICCnfxOnsP7PUEe+Mcgj4ZScnBs7n8crj9hp4MjR38a5AfDXgFu8hvKNzFqyQfTCbqsW7khOTAoon8/swZvPwRdO16jCco2EUqpKtCitfYk5pM58lR5IRmE/T+A7x43wxWrz5OsIvIMWnmLjXjBDe2WPvNfga+2o3i1ll02ngfn3/4BG3bulCniI9QuEv1K3fZAKyl5N5oikKCKXxwCrEz0ng6uTu0z+TynHv4+IOn1W0ROU0Kd6le5S4bwKxZJI4dzdn5r5HZFHhqOtQF2sPoJnfx8rQ4F4sV8R0Kd6lepZcsxsWxe04cPW6EnLbAl/2paxoSGQk3DhjEAyMecLVUEV+iG2RLzbCWvWcEEPHXAPJal8CiiYy5eAZPPAEhIW4XJ1I76QbZ4i5r2XrbXZw9sj5HWucT8q/bWNqzNQPmWC1lFKkmWgop1cta5v/5abqXvMGRtvn0TbiP5EtDGPDu3RAT4+nJi0iV08xdqs2BA3D7XQdY0vwxaJfF9UHRLJj/tCfQg47osgEi1UjhLlUqMSWRC2deSOqRdAoKgFYFEFLEHS3HMvvOZz0H6bIBItVO4S5VZnfqbrrP6EFuSA7sakadQEPjeg24tePNPHHLE2UPVrCLVCuFu1SJ3Sl7iXikBwXNcqjz3kRm/m0G0dEQGOh2ZSL+SeEup2T73u0MfW4oWUVZFBVBqk3DhhXQbt0DfPb+DLp0cbtCEf+mcJeTtjN5J+c8fQ55jfIILKhHcTFQHMDlmeP5+JOZ6riIeAGFu5yUXft2cdaTZ5HXKI82XzxK0tqHGToUZs+GNm3crk5EjlK4S6UlpiTS84me5DXKwyyKpfDQwyxcCNdeq/OjIt5GH2KSStmdupuo6T3IbZwLiyYz8typ/PgjXHedgl3EG2nmLif0U+Jees7swZGwHBp//BALZz3CkCFuVyUix6Nwl9/YtW8X498cT35RPmlpsD5rDfbMbHrtGM/aVdMJDna7QhE5EYW7lLEzeafnhGlonmcgGDgDrqtzPwvfnulqbSJSeQp3+UXplTCN3p9KzpYx3PF3mDKpES3DNF0XqU0U7gJ4VsL0mNmTvMZ5sHAanRtM4dUvoW9ftysTkVOh1TK+qvyldI9zad3ElN1EPtqDvOBcAhZP5rGbpxAfr2AXqc00c/dFFdyQmpgYzyV2Y2PLHLr+u71cMKcHxS1yaP3VRFa+9wjdurlQs4hUKYW7r6nghtTExHgeR0eTkXWIxV+9S3FxCWvWWhamPwCtsxl4aDz/XjFDF/oS8REKd19T7obUv4R8dDQ7H7iLs6a0+XUlTEPgDLgt9H7mPqKVMCK+RDfI9lXWQsCvp1R2Je2kx5OeSwcEfDKKoLxwrhgCfxvRmyv66xNJIrWRbpDtb4722B2J9aH7Y1HkNzsCC6cx7KwpPP88tGrlYo0iUq20WsbXHA12p8e+PSGB8Jvqkx92hIZLxrP4H5N57z0Fu4ivU7j7GmM8q2Kio1nyp3FETu/JkZb59Fw1it1XNGXE1brKl4g/UFvGB2XfH8s99yfx2nvdoE021zCeRV8+rss3ivgRhbuP2L53O32e7kN2aLZnoBVQAve0up+4v2sljIi/OWG4G2PaAfOBloAF5lpr44wxTYF3gI5AAnCttfaQMcYAccAQIBe42Vr7bfWUL+C5JszZT59DfqM8+LI/ZwTVJzISRl18Ffdeda/b5YmICyozcy8CxllrvzXGNAY2GmM+BW4GVllrHzfGTAAmAA8Cg4Fw56s/8ILzXapBYkoiUTN6Uhiah1k0jQkjpjBlCtSv73ZlIuKmE4a7tXYfsM/ZzjLGbAHaAMOAAc5h84A1eMJ9GDDfehbQrzPGhBpjWjk/R07T5oTN/OHZP5AVlIUFSgJLoIml5ZrJfPLOFHr1crtCEfEGJ9VzN8Z0BHoD64GWpQJ7P562DXiCf0+pp+11xsqEuzFmDDAGoH379idbt1/asnsLfZ/rS0GjAlqkdiXtgIESw+C2t7Js9QPU0RkUEXFUOg6MMY2Ad4F7rbWZptTKC2utNcac1EddrbVzgbng+YTqyTzXH23bs40+z/ahoEEB4RueYvuKcVx4Ibz8MkREuF2diHibSq1zN8YE4Qn2t6y17znDKcaYVs7+VkCqM54EtCv19LbOmJyi7Xu30+uZXuQ3yCdo8Uz2fT2O55+HNWsU7CJSsROGu7P65RVgi7X2mVK7lgGjnO1RwPulxm8yHucBh9VvP3W79u3irKfOIb9RPix8jIGdxrN5M9x5Z5lLx4iIlFGZtswFwI3AJmPMd87YQ8DjwCJjzGggEbjW2fcRnmWQO/AshbylKgv2Jzv2JtL98Z4caZJH/aWPMnfqJP76V30WSUROrDKrZb4EjhUnAys43gJjT7Muv7Q5YTNXz76anKIcCo9AKinYpoV0/34qq1c+TMuWJ/4ZIiKgT6h6jV9WwjQsIKCgLiUWKA7gmpLJLFoa63Z5IlLLKNy9QOmVMGH/foq0DeMYPRqefBKaNHG7OhGpjRTuLtudutuzEqZhPiyYSaOScSz4FP74R7crE5HaTOstXHZ+7B/JD/ashLl36Hh++EHBLiKnTzN3l6SlwR//Pp3ks7ZTP/48PntzEued53ZVIuIrNHOvYdbCokUQcdZe/td+KoHpdUl4/WMFu4hUKYV7DUpOhuHD4brrIO+CyyG4mDmDn6dls1C3SxMRH6O2TA2wFi6NvpM15iXoZDH3QX5wMX0L+nLroFvdLk9EfJDCvZr9/DNcNPZOkvq/QEBKA9rWbU3dQAgrCuODBz9wuzwR8VEK92pSXAzPPQcPzL+b4qEv0CA1lF0zttOiSZjbpYmIH1C4V4PNm2H0aFifHQMj/klwRijbp29TsItIjdEJ1SpUWAiPPAK9e8P/joyDEc8SfDiYbVO30KJJC7fLExE/opl7FdmwwTNb37QJooY/yNaez9D4cGO2TdnGmU3PdLs8EfEzCvfTlJsLA+54kA25CwjsDs0uKGFr8yQaZTZi6+StCnYRcYXC/TSsWQPDJt9B5sA5mJwAAorrkGWgVVYr1j20jtbNWrtdooj4KYX7KTh8GMaPh7nfjIXhc2iU1oRd038iLEQnTEXEOyjcT8KkNyaxaN0KEhPhCHkwfDMhh0P56dGtCnYR8SoK90q6buYoFuXPh6ZAqGeseWZzvp/yvVbCiIjXUbifgLVwSczfWBs6H3aEMaHTdqZNDaVuXbcrExE5NoX7cezdCxfcOYbdfV6jTmIzPo/ezvm/C3W7LBGRE9KHmCpQUgIvvgidr7qD3X1eosH+piQ/85OCXURqDc3cy9mxA267DdYc9KyECU5vws6Z2wgLaep2aSIilaZwd8xb8SavL9nEF1+CabIVhi8j9HAo26ZpJYyI1D4Kd2Bo7Cg+MPPhTOBqz1jIoRC2Td2mlTAiUiv5dbgXFMB5f/8b33WYj9kZRnSPf3LeeYbAgACu7H8l9evWd7tEEZFT4rfhvm4dDJ5wGxkDXqPu3mb8+Oh2unQI9ax9NMbt8kRETovfrZbJyYGYGDj/9jvIGPAyjfY0YN/T234N9pgYiI11u0wRkdPiV+G+ahWcdRY8u2osXDWH0OR67Hojl6ZTH/012OPiICPD81hEpJby2bZMel46hcWFAOzZk8mMGfksXQrBvV6AS+cQejiU7U/8RFiD6Z5Aj4vzPDE6GmbNUmtGRGo1Y71ghtqvXz8bHx9fZT/vg20fMHTh0GPuDz4UzPap2z0rYayFgFJ/wJSUKNhFpFYwxmy01varaJ/PtWWstUz+bDIdg7vQ/vsbYTnU+zSKy4/cwA2Nb+DWsFvLBntMTNkfEBOjloyI1Ho+15Z5f9sy/pfyP+p+eBuFG14mPPxyNm5cSuPG5ZY1lu6xH23FHH0Mas2ISK3mU+GemGgZ9cojUNiCwo0v8fvf/4mVK5dwxhkVrFc3BkJDy/bYZ83y7AsNVbCLSK3mEz33khKYMwfGvfgh+f93JbxvGBAygA8/XE6DBg2O/+Ty69q1zl1EaonT6rkbY141xqQaY34oNdbUGPOpMWa7872JM26MMc8ZY3YYY743xvSpun9GxbZtg4svhrFjLWZANByCi0IvZPnyD04c7J6ij/9YRKQWqswJ1deBQeXGJgCrrLXhwCrnMcBgINz5GgO8UDVlVuz8u/5K1AtBfNk3iIBxQeQ13Un4/nA++uAjGjZsWJ2/WkTEq50w3K21nwPp5YaHAfOc7XnAVaXG51uPdUCoMaZVFdX6G1FtutLgYHva056OdKBvYV++mfONgl1E/N6pnlBtaa3d52zvB1o6222APaWO2+uM7aMcY8wYPLN72rdvf0pFvDYxlteIPaXnioj4stNe5249Z2RP+qystXautbaftbZf8+bNT7cMEREp5VTDPeVou8X5nuqMJwHtSh3X1hkTEZEadKrhvgwY5WyPAt4vNX6Ts2rmPOBwqfaNiIjUkBP23I0xC4ABQJgxZi8wFXgcWGSMGQ0kAtc6h38EDAF2ALnALdVQs4iInMAJw91ae8Mxdg2s4FgLjD3dokRE5PT43IXDRERE4S4i4pMU7iIiPsgrLhxmjDmA58Ssm8KANJdrOFmqufrVtnpBNdcUb6i5g7W2wg8KeUW4ewNjTPyxrq7mrVRz9att9YJqrineXrPaMiIiPkjhLiLigxTuv5rrdgGnQDVXv9pWL6jmmuLVNavnLiLigzRzFxHxQQp3EREf5LfhboxJMMZsMsZ8Z4yJd8YqvDes24wxkU6dR78yjTH3GmNijTFJpcaHuFynV99v9yRqftIYs9Wpa4kxJtQZ72iMySv1es/xopqP+V4wxkx0XudtxpjLvajmd0rVm2CM+c4Zd/11Nsa0M8Z8Zoz50Riz2RgT7Yx79fu5DGutX34BCUBYubEngAnO9gRgptt1VlB3IJ67X3UAYoH73a6pVG0XAX2AH070muK5eujHgAHOA9Z7Uc2XAXWc7Zmlau5Y+jgve50rfC8A3YH/AfWATsBOINAbai63/2lgire8zkAroI+z3Rj4yXktvfr9XPrLb2fux3Cse8N6k4HATmut25/o/Q3rxffbPZaKarbWrrDWFjkP1+G56YzXOMbrfCzDgIXW2gJr7S48l+M+t9qKO4bj1WyMMXguG76gRos6DmvtPmvtt852FrAFzy1Dvfr9XJo/h7sFVhhjNjr3c4Vj3xvWm1xP2f8I7nL+DHzVW9pI5Zzs/Xa9zd/wzMiO6mSM+a8xZq0x5kK3ijqGit4LteF1vhBIsdZuLzXmNa+zMaYj0BtYTy16P/tzuP/BWtsHGAyMNcZcVHqn9fyt5VXrRI0xdYGhwL+coReALkAvPDchf9qdyirHG1/T4zHGTAKKgLecoX1Ae2ttb+A+4G1jTLBb9ZVTq94L5dxA2QmL17zOxphGwLvAvdbazNL7vP397Lfhbq1Ncr6nAkvw/Kl6rHvDeovBwLfW2hQAa22KtbbYWlsCvIQLf25XQq28364x5mbgSmCk8x8xTmvjoLO9EU//OsK1Iks5znvB21/nOsD/Ae8cHfOW19kYE4Qn2N+y1r7nDNea97NfhrsxpqExpvHRbTwn0H7g2PeG9RZlZjjlenrD8fwbvE2tu9+uMWYQMB4Yaq3NLTXe3BgT6Gx3BsKBn92psqzjvBeWAdcbY+oZYzrhqfk/NV3fcfwR2Gqt3Xt0wBteZ+c8wCvAFmvtM6V21Z73s9tndN34AjrjWUHwP2AzMMkZbwasArYDK4GmbtdaquaGwEEgpNTYG8Am4Hs8b65WLte4AM+f1Efw9BxHH+s1xbOq4Hk8s7JNQD8vqnkHnv7pd87XHOfYEc775TvgW+DPXlTzMd8LwCTndd4GDPaWmp3x14G/lzvW9dcZ+AOelsv3pd4HQ7z9/Vz6S5cfEBHxQX7ZlhER8XUKdxERH6RwFxHxQQp3EREfpHAXEfFBCncRER+kcBcR8UH/H5W1FYZWj10/AAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "ax.plot(inputs, homomorphic_predictions, color=\"green\")\n", "display(fig)" diff --git a/docs/user/advanced_examples/QuantizedLogisticRegression.ipynb b/docs/user/advanced_examples/QuantizedLogisticRegression.ipynb index c28845e5b..61fa0b204 100644 --- a/docs/user/advanced_examples/QuantizedLogisticRegression.ipynb +++ b/docs/user/advanced_examples/QuantizedLogisticRegression.ipynb @@ -175,22 +175,22 @@ "name": "stdout", "output_type": "stream", "text": [ - "Epoch: 1 | Loss: 1.0548723936080933\n", - "Epoch: 101 | Loss: 0.13212263584136963\n", - "Epoch: 201 | Loss: 0.07870622724294662\n", - "Epoch: 301 | Loss: 0.055601585656404495\n", - "Epoch: 401 | Loss: 0.04285423085093498\n", - "Epoch: 501 | Loss: 0.03481270745396614\n", - "Epoch: 601 | Loss: 0.029289430007338524\n", - "Epoch: 701 | Loss: 0.025266634300351143\n", - "Epoch: 801 | Loss: 0.02220827341079712\n", - "Epoch: 901 | Loss: 0.019805917516350746\n", - "Epoch: 1001 | Loss: 0.017869682982563972\n", - "Epoch: 1101 | Loss: 0.016276303678750992\n", - "Epoch: 1201 | Loss: 0.014942426234483719\n", - "Epoch: 1301 | Loss: 0.01380960550159216\n", - "Epoch: 1401 | Loss: 0.012835677713155746\n", - "Epoch: 1501 | Loss: 0.011989480815827847\n" + "Epoch: 1 | Loss: 0.9555807113647461\n", + "Epoch: 101 | Loss: 0.12865914404392242\n", + "Epoch: 201 | Loss: 0.0773993730545044\n", + "Epoch: 301 | Loss: 0.05493553355336189\n", + "Epoch: 401 | Loss: 0.042454302310943604\n", + "Epoch: 501 | Loss: 0.034546975046396255\n", + "Epoch: 601 | Loss: 0.02910044603049755\n", + "Epoch: 701 | Loss: 0.02512541227042675\n", + "Epoch: 801 | Loss: 0.02209884487092495\n", + "Epoch: 901 | Loss: 0.019718701019883156\n", + "Epoch: 1001 | Loss: 0.017798559740185738\n", + "Epoch: 1101 | Loss: 0.016217226162552834\n", + "Epoch: 1201 | Loss: 0.014892562292516232\n", + "Epoch: 1301 | Loss: 0.013766967691481113\n", + "Epoch: 1401 | Loss: 0.012798796407878399\n", + "Epoch: 1501 | Loss: 0.011957273818552494\n" ] } ], @@ -253,7 +253,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAUPklEQVR4nO3df2zc933f8eebjmJlpCbZdNBRlhMPQrvpTDZtqtQZGiicrNlOWiQYlmHxtm42FgjY0mzFBqxYgcXY+tdQrGi2oDGM1HG9dU6HxmAtIWlmQPW0oY4GWolN0h4CR04U0SewpnQMT5kv/vHeH3dUaIY/TtKJ3+OHzwcg+O77/fq+L38svfTl5773uchMJElb30DVASRJvWGhS1IhLHRJKoSFLkmFsNAlqRDvqOrEg4ODedNNN1V1evWZ1157jXe+853s2rWLnTt3csMNN1QdSepL3/zmN1/NzHevtq+yQr/pppv4zGc+U9Xp1WdeeOEF3vve9zI+Ps4dd9zBrl27qo4k9aXBwcHvrbXPKRdJKoSFLkmFsNAlqRAWuiQVwkJX31hYWODVV1+lXq9Tr9erjiNtOZXd5SItV6vVADh27BhjY2PcddddtFothoeHveNF6pKFrr4yOjrKzMwMs7OzHDlyhBtvvBHAUpe64JSL+k6tVuPChQvMzc3RaDSqjiNtGRa6JBXCQpekQljoklQIC12SClF+oa/8zlS/Q1VSoTa8bTEibgMeA34KSODhzPzcimMC+BzwUeCHwP2Zebr3ca/Q00/Da6/BPfdARLvMv/512LkTxserTif1zNQUnDgBCwuwezccPgxjY1WnKls/jnk3V+hvAP8qM2vAB4FPR0RtxTEfAX668+so8IWeprwame0yP3WqXeJLZX7qVHu7V+oqxNQUHDsGjUb7t3Wj0X4+NVV1snL165hveIWemXWg3nm8GBEvArcCLyw77OPAY5mZwDciYk9EjHT+3WpEtK/MoV3ip061H99554+v2KUCnDgBr7/+9m2vv97eXvUVY6n6dcyvaA49Im4Hfh44tWLXrcD3lz0/19m28t8/GhGTETF56dKlK4x6FZaX+hLLXIVZWLiy7bp2/TrmXRd6RAwBXwF+PTN/cDUny8yHM/NgZh4cHBy8mpe40hO2p1mWW5p+kQqxe/eVbde169cx76rQI2IH7TL/w8x8YpVDZoHblj3f19lWneVz5nfeCZ/9bPufy+fU1dfm5+d55ZVXaDabLC4uVh2nbx0+DDt2vH3bjh3t7bo++nXMu7nLJYDfB17MzN9Z47AngV+LiC8DdwILlc6fQ3taZefOt8+ZL02/7NzptEufW75I149+9CMOHDgAuEjXapbmbPvtjouS9euYR25wpRoRHwL+FzAFvNXZ/JvAewAy86FO6X8euJf2bYsPZObkeq+7b9++3JQvic58e3mvfK6+Nz09zcGDB/nwhz/Mrl27GBkZqTqSVJnBwcFnM/Pgavu6ucvlfwPrNmDn7pZPX12862xleVvmW87AwABzc3M8++yzjPv5AWlN5X9SVJK2CQtdkgphoUtSISx0SSqEhS5JhbDQJakQFrokFcJCl6RCWOiSVAgLXZIKYaFrSzh79izNZpNWq+XKi9IaLHT1vVqtxsDAAGfOnGF6epp6vU69Xu1inlI/2nBxLqkf1Grtr7E9duwYY2Nj7N+/n1arxfDwsEvqSh0WuraUpXXSm80mN910E8PDw1VHkvqGUy6SVAgLXZIKYaFLUiEsdEkqhIUuSYWw0CWpEBa6JBXCQpekQljoklQIC12SCmGhS1IhXMtFW9LLL7/M0NAQN998M81mk6GhIRfp0rZnoWvLWVp5cWZmhtnZWQ4dOsSBAwdoNpuMjIxUnE6qjlMu2rJqtRp79+5lYmKCZ555BsAvv9C2tmGhR8QjETEXEdNr7N8dEcci4rmImImIB3ofU9pYo9GoOoJUqW6u0B8F7l1n/6eBFzLzfcA48B8j4p3XHk2SdCU2LPTMPAlcWO8QYFdEBDDUOfaN3sSTJHWrF2+Kfh54EngF2AX8vcx8a7UDI+IocBRgz549PTi1JGlJL94UvQf4FrAX+Dng8xHxl1c7MDMfzsyDmXlwcHCwB6eWJC3pRaE/ADyRbS8BLwN/vQevK0m6Ar0o9LPAXQAR8VPAXwPO9OB1JUlXYMM59Ih4nPbdK7dExDngQWAHQGY+BPwW8GhETAEB/EZmvnrdEkuSVrVhoWfmfRvsfwW4u2eJpKvQbDZZWFhg3759VUeRKuMnRbXlDQwMcObMGV599VXq9Tr1er3qSFIlXMtFW97S2i7Hjh1jbGyM/fv302q1GB4edsEubSsWuooxOjrKzMwMzWaTRqPB+Pi4ha5txSkXFefNN9+sOoJUCQtdkgphoUtSISx0SSqEhS5JhbDQJakQFrokFcJCl6RCWOiSVAgLXZIKYaFLUiFcy0VFqdVqTE9Ps3v3bhYXFwEYGhpyTRdtCxa6irO0SNfs7CyHDh3iwIEDNJtNRkZGqo4mXVdOuahItVqNvXv3MjExwVNPPUWr1bp8xS6VykJX0QYGBpifn+f8+fNVR5GuOwtdkgphoUtSISx0SSqEhS5JhbDQJakQFrokFcJCl6RCWOiSVAgLXZIKsWGhR8QjETEXEdPrHDMeEd+KiJmI+J+9jShJ6kY3V+iPAveutTMi9gC/B3wsM+8A/m5Pkkk9srCwwMWLF5mfn3c9FxVtw0LPzJPAhXUO+fvAE5l5tnP8XI+ySdesVqvRaDQ4efIk09PT1Ot16vV61bGk66IXy+f+DLAjIp4GdgGfy8zHVjswIo4CRwH27NnTg1NLG6vVagAcO3aMsbExDhw4ALhOusrTizdF3wH8AvDLwD3Av42In1ntwMx8ODMPZubBwcHBHpxa6t7o6ChTU1PMzc3RaDSqjiP1XC+u0M8B85l5CbgUESeB9wHf7sFrS5K61Isr9D8BPhQR74iIvwTcCbzYg9eVJF2BDa/QI+JxYBy4JSLOAQ8COwAy86HMfDEi/hR4HngL+GJmrnmLoyTp+tiw0DPzvi6O+W3gt3uSSJJ0VfykqCQVwkKXpEJY6JJUCAtdkgphoUtSISx0SSqEha5tp9lssrCwQLPZrDqK1FO9+Oi/tGWMjo4yOTlJq9Xi5ptvBlykS+Ww0LXtjI6OMjMzw+zsLIcOHeLAgQM0m01GRkaqjiZdE6dctC0trZN++vRpnnnmmarjSD1hoUtSISx0SSqEhS5JhbDQJakQFrokFcJCl6RCWOiSVAgLXZIKYaFrWzt79izNZpNWq8Xi4mLVcaRrYqFr26rVagwMDHDmzBmOHz9OvV6nXq9XHUu6aq7lom2tVqsBMDU1dXltl1arxfDwsAt2acvxCl2ivWBXo9Hgueee4/z581XHka6KhS5JhbDQJakQFrokFcJCl6RCWOiSVIgNCz0iHomIuYiY3uC4D0TEGxHxid7FkyR1q5sr9EeBe9c7ICJuAP4D8D96kEmSdBU2LPTMPAlc2OCwzwBfAeZ6EUqSdOWueQ49Im4F/jbwhS6OPRoRkxExeenSpWs9tSRpmV68Kfq7wG9k5lsbHZiZD2fmwcw8ODg42INTS5KW9GItl4PAlyMC4BbgoxHxRmZO9OC1pUo0m03XctGWc82Fnpl/delxRDwKHLfMtRXVajWmp6cZGhri5ptvdpEubTkbFnpEPA6MA7dExDngQWAHQGY+dF3TSZtsdHSUmZmZyysv7t+/n2azycjISNXRpA1tWOiZeV+3L5aZ919TGqkPLC2pOzExwfj4OOPj4ywuLnqlrr7nJ0WlDTQajaojSF2x0CWpEBa6JBXCQpekQljoklQIC12SCmGhS1IhLHRJKoSFLkmFsNAlqRAWuiQVohfL50rFmp+f57vf/S7vete7AFzPRX3NQpfWsHzlxe985zvcfffdrryovmahS+tYWnlxamqKZrPJBz7wAQBLXX3JOXSpCwMDA7z55pvMzfk96OpfFrokFcJCl6RCWOiSVAgLXZIKYaFLUiEsdEkqhIUuSYWw0CWpEBa6JBXCQpekQljoUpfOnj1Ls9mk1WpRr9erjiP9BBfnkrqwtEjX5OQkrVaLu+++m1arxfDwsEvqqm9seIUeEY9ExFxETK+x/x9ExPMRMRURfx4R7+t9TKk/LC2p+6UvfYkXX3yR+fl5FhcXq44lAd1NuTwK3LvO/peBD2fmGPBbwMM9yCX1rVqtRqPR4LnnnuP8+fNVx5Eu23DKJTNPRsTt6+z/82VPvwHs60EuSdIV6vWbov8E+NpaOyPiaERMRsTkpUuXenxqSdreevamaET8TdqF/qG1jsnMh+lMyezbty97dW5JUo8KPSJ+Fvgi8JHMnO/Fa0qSrsw1T7lExHuAJ4BfzcxvX3skSdLV2PAKPSIeB8aBWyLiHPAgsAMgMx8CPgsMA78XEQBvZObB6xVYkrS6bu5yuW+D/Z8CPtWzRJKkq+JH/yWpEBa6dJUWFha4ePGinxZV37DQpauw9GnRiYkJjh8/Tr1ed8EuVc7FuaSrtLRg18zMDLOzsxw5cgSAoaEhF+xSJbxCl65RrVbjwoULzM3N0Wg0qo6jbcxCl6RCWOiSVAgLXZIKYaFLUiEsdEkqhIUuSYWw0CWpEBa6JBXCQpekQljoklQIC13qkWazySuvvEKz2aw6irYpF+eSemB0dJTJyUlarRZ79+6l1WoxPDzsIl3aVBa61COjo6OXV148dOgQ+/fvp9lsMjIyUnU0bRNOuUg9tLRO+unTp3n22WerjqNtxkKXpEJY6JJUCAtdkgphoUtSISx0SSqEhS5JhbDQJakQFrokFaL8Qs9c/7l6zzGXKrHhR/8j4hHgV4C5zBxdZX8AnwM+CvwQuD8zT/c66FV5+ml47TW45x6IaBfL178OO3fC+HjV6crkmGubmJqCEydgYQF274bDh2FsrNpM3VyhPwrcu87+jwA/3fl1FPjCtcfqgcx2sZw61S6UpWI5daq93avG3nPMLzt79mzVEXQdTU3BsWPQaLR/Wzca7edTU9Xm2vAKPTNPRsTt6xzyceCxzEzgGxGxJyJGMrPeq5BXJaJ9lQjtQjl1qv34zjt/fPWo3nLMgfZ6LtPT0zz//PPs2bPHlRcLdOIEvP7627e9/np7e5VX6b2YQ78V+P6y5+c6235CRByNiMmImLx06VIPTr2B5QWzZBsVSyUcc6C98mKj0WBiYoLjx49Tr9ep1+ssLi5WHU09sLBwZds3y6a+KZqZD2fmwcw8ODg4uBknbP/Iv9zSVICuD8f8slqtdnlJ3SeeeILvfe97VUdSj+zefWXbN0sv1kOfBW5b9nxfZ1u1ls/fLv3Iv/QctuVV43XnmGubOHy4PWe+fNplx4729ir1otCfBH4tIr4M3AksVD5/Du3i2Lnz7fO3S1MBO3daLNeDY65tYmmevN/ucunmtsXHgXHglog4BzwI7ADIzIeAr9K+ZfEl2rctPnC9wl6x8fH2VeNSkSwVjMVy/Tjm2ibGxqov8JW6ucvlvg32J/DpniXqtZVFYrFcf465VInyPykqSduEhS5JhbDQJakQFrokFcJCl6RCWOiSVAgLXZIKYaFLm2BhYYGLFy9eXqRLuh568dF/Seuo1WoATExMMDY2xl133eWSurouLHRpkyytvDg7O8uRI0e48cYbASx19YxTLtImqtVqXLhwgbm5ORqNRtVxVBgLXZIKEVnRFw9ExF8Am7ni/y3Aq5t4vl7aqtm3am7Yutm3am7Yutk3O/d7M/Pdq+2orNA3W0RMZubBqnNcja2afavmhq2bfavmhq2bvZ9yO+UiSYWw0CWpENup0B+uOsA12KrZt2pu2LrZt2pu2LrZ+yb3tplDl6TSbacrdEkqmoUuSYUoqtAj4pGImIuI6TX2R0T8p4h4KSKej4j3b3bGtXSRfTwiFiLiW51fn93sjKuJiNsi4s8i4oWImImIf7HKMX037l3m7tcx3xkR/ycinutk/3erHHNjRPxRZ8xPRcTtFURdmamb3PdHxF8sG/NPVZF1LRFxQ0R8MyKOr7Kv+jHPzGJ+AYeA9wPTa+z/KPA1IIAPAqeqznwF2ceB41XnXCXXCPD+zuNdwLeBWr+Pe5e5+3XMAxjqPN4BnAI+uOKYfwY81Hn8SeCPtkju+4HPV511nf+Gfwn8t9V+X/TDmBd1hZ6ZJ4EL6xzyceCxbPsGsCciRjYn3fq6yN6XMrOemac7jxeBF4FbVxzWd+PeZe6+1BnHZufpjs6vlXc3fBz4g87jPwbuiojYpIir6jJ334qIfcAvA19c45DKx7yoQu/CrcD3lz0/xxb5Q9zxNzo/rn4tIu6oOsxKnR8xf572lddyfT3u6+SGPh3zzo/+3wLmgKcyc80xz8w3gAVgeFNDrqKL3AB/pzM198cRcdvmJlzX7wL/Gnhrjf2Vj/l2K/St7DTtNRzeB/xnYKLaOG8XEUPAV4Bfz8wfVJ2nWxvk7tsxz8w3M/PngH3AL0bEaMWRutJF7mPA7Zn5s8BT/PiKt1IR8SvAXGY+W3WW9Wy3Qp8Flv+Nv6+zre9l5g+WflzNzK8COyLilopjARARO2iX4h9m5hOrHNKX475R7n4e8yWZ2QD+DLh3xa7LYx4R7wB2A/ObGm4da+XOzPnMbHWefhH4hU2OtpZfAj4WEd8Fvgwcjoj/uuKYysd8uxX6k8A/6tx18UFgITO3xPeBRcRfWZqPi4hfpP3/rvI/oJ1Mvw+8mJm/s8ZhfTfu3eTu4zF/d0Ts6Tx+F/C3gP+74rAngX/cefwJ4ER23q2rSje5V7y38jHa721ULjP/TWbuy8zbab/heSIz/+GKwyof86K+sSgiHqd9Z8ItEXEOeJD2Gy9k5kPAV2nfcfES8EPggWqS/qQusn8C+KcR8Qbw/4BPVv0HtOOXgF8FpjpzowC/CbwH+nrcu8ndr2M+AvxBRNxA+y+Z/56ZxyPi3wOTmfkk7b+s/ktEvET7zfZPVhf3sm5y//OI+BjwBu3c91eWtgv9NuZ+9F+SCrHdplwkqVgWuiQVwkKXpEJY6JJUCAtdkgphoUtSISx0SSrE/wfN56tHYZy9dgAAAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -291,9 +291,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[4.53867245]\n", - " [2.37340546]]\n", - "-14.672252655029297\n" + "[[4.54124975]\n", + " [2.37628269]]\n", + "-14.683035850524902\n" ] } ], @@ -734,7 +734,7 @@ "id": "babb1a98", "metadata": {}, "source": [ - "### Let's compile our quantized inference function to it's operation graph for visualization" + "### Let's compile our quantized inference function to its homomorphic equivalent" ] }, { @@ -748,7 +748,7 @@ "for x_i in x_q:\n", " inputset.append((int(x_i[0]), int(x_i[1])))\n", " \n", - "homomorphic_model = hnp.compile_numpy_function_into_op_graph(\n", + "circuit = hnp.compile_numpy_function(\n", " infer,\n", " {\n", " \"x_0\": hnp.EncryptedScalar(hnp.Integer(input_bits, is_signed=False)),\n", @@ -763,7 +763,7 @@ "id": "ab5ba39e", "metadata": {}, "source": [ - "### Here are some representations of the operation graph" + "### Here are some representations of the fhe circuit" ] }, { @@ -794,7 +794,7 @@ } ], "source": [ - "print(hnp.get_printable_graph(homomorphic_model, show_data_types=True))" + "print(circuit)" ] }, { @@ -807,7 +807,7 @@ "data": { "image/png": "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cz2TijvbU0aWLl3K7NmzGTt2rE4J5kE02WXDJ598QlJSEq+88kq2/22hQoUAMlyR2f6c/T2utHv3bi5duqTJTnmkevXqZWn4gae0p+tdvXqVQYMG0aVLF1q3bu32/avMabLLhiJFijB69GgmTpzIunXrsvVvK1euDJBhJ5cTJ04AEBkZmfsgb2Lz5s3kyZOHatWquXxfSmVXvXr1+PPPP2969cRT2tP1Xn31VS5evMjo0aPdvm91Y5rssqlr1660atWKp556KltTid13330AbN26Nd1r9ueaN2/unCBvYMuWLdx9993azVl5pPr16yMiGbaT1DylPaW2ZcsWxo4dy8cff0zx4sXdum91czYRH52MzoWOHj1K1apVefHFF7O8JlVSUhLVq1fnwoULHDx4kLCwMAASExOpXr060dHR7Nu3L+V5V6lVqxbNmzfn448/zva/LV26NKdOnSIhIcEFkSlllClThmeeeeaGtws8pT3ZJSQkUK9ePQoUKMDKlStzfL9Q25jLzNUzuxy47bbbePPNN3n33XfZs2dPlv5NQEAAU6ZMISoqit69e3Pq1CnOnTvHoEGD2L9/P5MmTXJ5w7x27Rq7d+/WyZ+VR6tXr95NO6l4QntK7eOPP2bPnj2MHz/eso4x6sY02eXQ0KFDqVGjBn379iUpKSlL/6ZBgwZs2LCBixcvUqlSJcqWLcv+/ftZtWoVDz30kIsjNpd34uPjs9U5ZfHixdhsNmw2GydOnCAxMTHl8eTJk10YrfJX9erVY+PGjTd9n9Xtye7IkSO88847jBw5MuVeYnZoG3MPvYyZC3/88Qd16tRhzJgx9O/f3+pwburTTz/l/fff58yZM1aHolSmVq5cyf3338+xY8cyHDTuaR588EFOnTrF1q1bbzhTirKUXsbMjRo1avDcc8/x0ksvpfQA82RZXelAKSvVqVOHwMBAr1jMddq0aSxfvvymU4Ip62myy6U333yTokWLMnToUKtDualNmzZpslMeL3/+/FSuXDnXg8td7ezZs7z00ksMHjyYe+65x+pw1E1ossul8PBwJk2axIIFC1i4cKHV4WTqn3/+4fDhw5rslFeoX79+tta2s8Jzzz1HWFgY77zzjtWhqCzQZOcE9913H926deOZZ55x+lRizrJ582ZsNpv2xFReoW7duvz2228kJiZaHUqGfv75Z7755hvG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lFI+T5OdUkopn6fJTimllM/TZKeUUsrnabJTSinl8zTZKaWU8nma7JRSSvk8TXZKKaV8niY7pZRSPk+TnVJKKZ+nyU4ppZTP02SnlFLK52myU0op5fM02SmllPJ5muyUUkr5PE12Sqmb2rFjB61ataJQoULkz5+fFi1asH79eqvDUirLNNkppW5o06ZNNGzYkPz587N3714OHz5M+fLladasGb/88ovV4SmVJTYREauDUEpZY86cOXTq1InM/gwkJSVRo0YNoqKiOHjwIOHh4QAkJiZStWpVrl69yv79+wkNDXVn2Epl11w9s1NKZWrNmjXs3r2bJ554IiXRAQQGBtKlSxeOHTvG4sWLLYxQqazRZKeUytSKFSsAqFOnTrrX7M8tX77crTEplROa7JRSmfrzzz8BKF26dLrXIiIiANi3b59bY1IqJzTZKaUydeHCBQDy5s2b7rV8+fIBcP78eXeGpFSOaLJTSuWIvVOLzWazOBKlbk6TnVIqU4UKFQLgypUr6V6zP2d/j1KeTJOdUipTlStXBuD48ePpXjtx4gQAkZGRbo1JqZzQZKeUytR9990HwNatW9O9Zn+uefPmbo1JqZzQZKeUylTTpk2pUqUK8+bNIyYmJuX5xMREZs2aRZkyZWjVqpWFESqVNZrslFKZCggIYMqUKURFRdG7d29OnTrFuXPnGDRoEPv372fSpEmEhYVZHaZSN6XJTil1Qw0aNGDDhg1cvHiRSpUqUbZsWfbv38+qVat46KGHrA5PqSwJsjoApZTnq1WrFkuWLLE6DKVyTM/slFJK+TxNdkoppXyeJjullFI+T5OdUkopn6fJTimllM/TZKeUUsrnabJTSinl8zTZKaWU8nma7JRSSvk8TXZKKaV8niY7pZRSPk+TnVJKKZ+nyU4ppZTP02SnlFLK5+kSP0r5iRMnTlC9enXi4+PTPJ8nTx7y58+f8thms3HPPffw888/uztEpVxGk51SfiIiIoI77riD3377DRHJ9H02m42WLVu6MTKlXE8vYyrlR3r06EFAwM2bfYcOHdwQjVLuo8lOKT/SqVOnG74eEBBAkyZNiIiIcFNESrmHJjul/EjRokVp1qwZgYGBGb5us9no3r27m6NSyvU02SnlZ7p3757pPTubzcZjjz3m5oiUcj1Ndkr5mccee4ygoPR904KCgmjZsiVFihSxICql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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -816,36 +816,11 @@ ], "source": [ "from PIL import Image\n", - "file = Image.open(hnp.draw_graph(homomorphic_model))\n", + "file = Image.open(circuit.draw())\n", "file.show()\n", "file.close()" ] }, - { - "cell_type": "markdown", - "id": "aac3f0d4", - "metadata": {}, - "source": [ - "### It's time to compile the function to its homomorphic equivalent" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ab75221c", - "metadata": {}, - "outputs": [], - "source": [ - "engine = hnp.compile_numpy_function(\n", - " infer,\n", - " {\n", - " \"x_0\": hnp.EncryptedScalar(hnp.Integer(input_bits, is_signed=False)),\n", - " \"x_1\": hnp.EncryptedScalar(hnp.Integer(input_bits, is_signed=False)),\n", - " },\n", - " inputset,\n", - ")" - ] - }, { "cell_type": "markdown", "id": "972edbb0", @@ -856,17 +831,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "id": "c83f68cd", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5385b79125e44bc493c7eaf5f8013b14", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/10000 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "for column in contour.collections:\n", " plt.gca().collections.remove(column)\n", diff --git a/docs/user/howto/COMPILING_AND_EXECUTING.md b/docs/user/howto/COMPILING_AND_EXECUTING.md index 6c5809779..69f2fa819 100644 --- a/docs/user/howto/COMPILING_AND_EXECUTING.md +++ b/docs/user/howto/COMPILING_AND_EXECUTING.md @@ -41,7 +41,7 @@ Finally, we can compile our function to its homomorphic equivalent. ```python -engine = hnp.compile_numpy_function( +circuit = hnp.compile_numpy_function( f, {"x": x, "y": y}, inputset=inputset, ) @@ -49,17 +49,17 @@ engine = hnp.compile_numpy_function( ## Performing homomorphic evaluation -You can use `.run(...)` method of `engine` returned by `hnp.compile_numpy_function(...)` to perform fully homomorphic evaluation. Here are some examples: +You can use `.run(...)` method of `FHECircuit` returned by `hnp.compile_numpy_function(...)` to perform fully homomorphic evaluation. Here are some examples: ```python -engine.run(3, 4) +circuit.run(3, 4) # 7 -engine.run(1, 2) +circuit.run(1, 2) # 3 -engine.run(7, 7) +circuit.run(7, 7) # 14 -engine.run(0, 0) +circuit.run(0, 0) # 0 ``` diff --git a/docs/user/tutorial/ARITHMETIC_OPERATIONS.md b/docs/user/tutorial/ARITHMETIC_OPERATIONS.md index b9ef6d145..d4446deb3 100644 --- a/docs/user/tutorial/ARITHMETIC_OPERATIONS.md +++ b/docs/user/tutorial/ARITHMETIC_OPERATIONS.md @@ -28,8 +28,8 @@ results in ```python -engine.run(3) == 45 -engine.run(0) == 42 +circuit.run(3) == 45 +circuit.run(0) == 42 ``` ### Dynamic ClearScalar and EncryptedScalar @@ -52,8 +52,8 @@ results in ```python -engine.run(6, 4) == 10 -engine.run(1, 1) == 2 +circuit.run(6, 4) == 10 +circuit.run(1, 1) == 2 ``` where @@ -78,8 +78,8 @@ results in ```python -engine.run(7, 7) == 14 -engine.run(3, 4) == 7 +circuit.run(7, 7) == 14 +circuit.run(3, 4) == 7 ``` ## Subtraction @@ -100,8 +100,8 @@ results in ```python -engine.run(2) == 1 -engine.run(3) == 0 +circuit.run(2) == 1 +circuit.run(3) == 0 ``` ### Dynamic ClearScalar and EncryptedScalar @@ -121,8 +121,8 @@ results in ```python -engine.run(2, 4) == 2 -engine.run(1, 7) == 6 +circuit.run(2, 4) == 2 +circuit.run(1, 7) == 6 ``` ## Multiplication @@ -151,8 +151,8 @@ results in ```python -engine.run(2) == 4 -engine.run(5) == 10 +circuit.run(2) == 4 +circuit.run(5) == 10 ``` ### Dynamic ClearScalar and EncryptedScalar @@ -180,8 +180,8 @@ results in ```python -engine.run(2, 3) == 6 -engine.run(1, 7) == 7 +circuit.run(2, 3) == 6 +circuit.run(1, 7) == 7 ``` ## Dot Product @@ -211,8 +211,8 @@ results in ```python -engine.run([1, 1], [2, 3]) == 5 -engine.run([2, 3], [2, 3]) == 13 +circuit.run([1, 1], [2, 3]) == 5 +circuit.run([2, 3], [2, 3]) == 13 ``` ## Combining all together @@ -233,6 +233,6 @@ results in ```python -engine.run([1, 2], [4, 3], 10) == 60 -engine.run([2, 3], [3, 2], 5) == 66 +circuit.run([1, 2], [4, 3], 10) == 60 +circuit.run([2, 3], [3, 2], 5) == 66 ``` diff --git a/docs/user/tutorial/TABLE_LOOKUP.md b/docs/user/tutorial/TABLE_LOOKUP.md index 600a46957..e96b60cc4 100644 --- a/docs/user/tutorial/TABLE_LOOKUP.md +++ b/docs/user/tutorial/TABLE_LOOKUP.md @@ -23,10 +23,10 @@ results in ```python -engine.run(0) == 2 -engine.run(1) == 1 -engine.run(2) == 3 -engine.run(3) == 0 +circuit.run(0) == 2 +circuit.run(1) == 1 +circuit.run(2) == 3 +circuit.run(3) == 0 ``` ## Fused table lookup @@ -49,14 +49,14 @@ results in ```python -engine.run(0) == 77 -engine.run(1) == 35 -engine.run(2) == 32 -engine.run(3) == 70 -engine.run(4) == 115 -engine.run(5) == 125 -engine.run(6) == 91 -engine.run(7) == 45 +circuit.run(0) == 77 +circuit.run(1) == 35 +circuit.run(2) == 32 +circuit.run(3) == 70 +circuit.run(4) == 115 +circuit.run(5) == 125 +circuit.run(6) == 91 +circuit.run(7) == 45 ``` Initially, the function is converted to this operation graph diff --git a/docs/user/tutorial/WORKING_WITH_FLOATING_POINTS.md b/docs/user/tutorial/WORKING_WITH_FLOATING_POINTS.md index 7fbc98905..62d088baf 100644 --- a/docs/user/tutorial/WORKING_WITH_FLOATING_POINTS.md +++ b/docs/user/tutorial/WORKING_WITH_FLOATING_POINTS.md @@ -16,11 +16,11 @@ results in ```python -engine.run(3) == 27 -engine.run(0) == 0 -engine.run(1) == 90 -engine.run(10) == 91 -engine.run(60) == 58 +circuit.run(3) == 27 +circuit.run(0) == 0 +circuit.run(1) == 90 +circuit.run(10) == 91 +circuit.run(60) == 58 ``` ## Supported operations diff --git a/tests/common/test_fhe_circuit.py b/tests/common/test_fhe_circuit.py new file mode 100644 index 000000000..42e4d3bab --- /dev/null +++ b/tests/common/test_fhe_circuit.py @@ -0,0 +1,50 @@ +"""Test module for Circuit class""" + +import filecmp + +import concrete.numpy as hnp +from concrete.common.debugging import draw_graph, get_printable_graph + + +def test_circuit_str(): + """Test function for `__str__` method of `Circuit`""" + + def f(x): + return x + 42 + + x = hnp.EncryptedScalar(hnp.UnsignedInteger(3)) + + inputset = [(i,) for i in range(2 ** 3)] + circuit = hnp.compile_numpy_function(f, {"x": x}, inputset) + + assert str(circuit) == get_printable_graph(circuit.opgraph, show_data_types=True) + + +def test_circuit_draw(): + """Test function for `draw` method of `Circuit`""" + + def f(x): + return x + 42 + + x = hnp.EncryptedScalar(hnp.UnsignedInteger(3)) + + inputset = [(i,) for i in range(2 ** 3)] + circuit = hnp.compile_numpy_function(f, {"x": x}, inputset) + + assert filecmp.cmp(circuit.draw(), draw_graph(circuit.opgraph)) + assert filecmp.cmp(circuit.draw(vertical=False), draw_graph(circuit.opgraph, vertical=False)) + + +def test_circuit_run(): + """Test function for `run` method of `Circuit`""" + + def f(x): + return x + 42 + + x = hnp.EncryptedScalar(hnp.UnsignedInteger(3)) + + inputset = [(i,) for i in range(2 ** 3)] + circuit = hnp.compile_numpy_function(f, {"x": x}, inputset) + + for x in inputset: + assert circuit.run(*x) == circuit.engine.run(*x)