diff --git a/circuits/ArgMax.circom b/circuits/ArgMax.circom new file mode 100644 index 0000000..387a7df --- /dev/null +++ b/circuits/ArgMax.circom @@ -0,0 +1,40 @@ +// from 0xZKML/zk-mnist + +pragma circom 2.0.3; + +include "../node_modules/circomlib/circuits/comparators.circom"; +include "../node_modules/circomlib/circuits/switcher.circom"; + +template ArgMax (n) { + signal input in[n]; + signal output out; + component gts[n]; // store comparators + component switchers[n+1]; // switcher for comparing maxs + component aswitchers[n+1]; // switcher for arg max + + signal maxs[n+1]; + signal amaxs[n+1]; + + maxs[0] <== in[0]; + amaxs[0] <== 0; + for(var i = 0; i < n; i++) { + gts[i] = GreaterThan(30); + switchers[i+1] = Switcher(); + aswitchers[i+1] = Switcher(); + + gts[i].in[1] <== maxs[i]; + gts[i].in[0] <== in[i]; + + switchers[i+1].sel <== gts[i].out; + switchers[i+1].L <== maxs[i]; + switchers[i+1].R <== in[i]; + + aswitchers[i+1].sel <== gts[i].out; + aswitchers[i+1].L <== amaxs[i]; + aswitchers[i+1].R <== i; + amaxs[i+1] <== aswitchers[i+1].outL; + maxs[i+1] <== switchers[i+1].outL; + } + + out <== amaxs[n]; +} \ No newline at end of file diff --git a/circuits/ReLU.circom b/circuits/ReLU.circom index 0d3efcd..bbd8d25 100644 --- a/circuits/ReLU.circom +++ b/circuits/ReLU.circom @@ -3,19 +3,13 @@ pragma circom 2.0.3; include "util.circom"; // ReLU layer -template ReLU (m,n) { - signal input in[m][n]; - signal output out[m][n]; +template ReLU () { + signal input in; + signal output out; - component isPositive[m][n]; + component isPositive = IsPositive(); + + isPositive.in <== in; - for (var i=0; i" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(28, 28, 1)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X = X_test[0]\n", + "X.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1.5824087e-11, 6.1573762e-21, 3.0310914e-11, 1.3590869e-04,\n", + " 2.2671966e-12, 3.1620637e-10, 1.7203982e-17, 9.9986279e-01,\n", + " 1.9324822e-09, 1.3374932e-06]], dtype=float32)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y = model.predict(X_test[[0]])\n", + "y" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAD4CAYAAAAq5pAIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAANh0lEQVR4nO3df6zddX3H8dfL/sJeYFKwtSuVKqKxOsHlCppuSw3DAYYUo2w0GekSZskGCSxmG2ExkmxxjIiETWdSR2clCFOBQLRzksaNkLHKhZRSKFuRdVh71wvUrUXgtqXv/XG/LJdyz+dezvd7zve07+cjuTnnfN/ne77vfHtf/X7v+XzP+TgiBODY95a2GwDQH4QdSIKwA0kQdiAJwg4kMbufG5vreXGchvq5SSCVV/QLHYhxT1WrFXbb50u6RdIsSX8XETeUnn+chnSOz62zSQAFm2NTx1rXp/G2Z0n6qqQLJC2XtNr28m5fD0Bv1fmb/WxJT0fEMxFxQNKdklY10xaAptUJ+xJJP530eFe17HVsr7U9YnvkoMZrbA5AHXXCPtWbAG+49jYi1kXEcEQMz9G8GpsDUEedsO+StHTS41Ml7a7XDoBeqRP2hyWdYftdtudKulTSfc20BaBpXQ+9RcQh21dJ+idNDL2tj4gnGusMQKNqjbNHxEZJGxvqBUAPcbkskARhB5Ig7EAShB1IgrADSRB2IAnCDiRB2IEkCDuQBGEHkiDsQBKEHUiCsANJEHYgCcIOJEHYgSQIO5AEYQeSIOxAEoQdSIKwA0kQdiAJwg4kQdiBJAg7kARhB5Ig7EAShB1IgrADSRB2IIlaUzbb3ilpv6RXJR2KiOEmmgLQvFphr3w8Ip5v4HUA9BCn8UASdcMekn5o+xHba6d6gu21tkdsjxzUeM3NAehW3dP4FRGx2/ZCSffbfioiHpj8hIhYJ2mdJJ3oBVFzewC6VOvIHhG7q9sxSfdIOruJpgA0r+uw2x6yfcJr9yV9QtK2phoD0Kw6p/GLJN1j+7XX+VZE/KCRrgA0ruuwR8Qzks5ssBcAPcTQG5AEYQeSIOxAEoQdSIKwA0k08UGYFF747Mc61t552dPFdZ8aW1SsHxifU6wvuaNcn7/rxY61w1ueLK6LPDiyA0kQdiAJwg4kQdiBJAg7kARhB5Ig7EASjLPP0J/88bc61j499PPyyqfX3PjKcnnnoZc61m557uM1N370+vHYaR1rQzf9UnHd2Zseabqd1nFkB5Ig7EAShB1IgrADSRB2IAnCDiRB2IEkHNG/SVpO9II4x+f2bXtN+sVnzulYe/5D5f8zT9pe3sc/f7+L9bkf+p9i/cYP3t2xdt5bXy6u+/2Xji/WPzm/82fl63o5DhTrm8eHivWVxx3setvv+f4Vxfp71z7c9Wu3aXNs0r7YO+UvFEd2IAnCDiRB2IEkCDuQBGEHkiDsQBKEHUiCz7PP0NB3Nxdq9V77xHqr62/esbJj7S9WLCtv+1/K33l/48r3dNHRzMx++XCxPrR1tFg/+YG7ivVfmdv5+/bn7yx/F/+xaNoju+31tsdsb5u0bIHt+23vqG5P6m2bAOqayWn8NySdf8SyayVtiogzJG2qHgMYYNOGPSIekLT3iMWrJG2o7m+QdHGzbQFoWrdv0C2KiFFJqm4Xdnqi7bW2R2yPHNR4l5sDUFfP342PiHURMRwRw3M0r9ebA9BBt2HfY3uxJFW3Y821BKAXug37fZLWVPfXSLq3mXYA9Mq04+y279DEN5efYnuXpC9IukHSt21fLulZSZf0skmUHfrvPR1rQ3d1rknSq9O89tB3X+iio2bs+f2PFesfmFv+9f3S3vd1rC37+2eK6x4qVo9O04Y9IlZ3KB2d30IBJMXlskAShB1IgrADSRB2IAnCDiTBR1zRmtmnLS3Wv3LdV4r1OZ5VrH/nlt/sWDt59KHiuscijuxAEoQdSIKwA0kQdiAJwg4kQdiBJAg7kATj7GjNU3+0pFj/yLzyVNZPHChPR73gyZfedE/HMo7sQBKEHUiCsANJEHYgCcIOJEHYgSQIO5AE4+zoqfFPfqRj7dHP3DzN2uUZhP7g6quL9bf+64+nef1cOLIDSRB2IAnCDiRB2IEkCDuQBGEHkiDsQBKMs6Onnr2g8/HkeJfH0Vf/53nF+vwfPFasR7Gaz7RHdtvrbY/Z3jZp2fW2f2Z7S/VzYW/bBFDXTE7jvyHp/CmW3xwRZ1U/G5ttC0DTpg17RDwgaW8fegHQQ3XeoLvK9tbqNP+kTk+yvdb2iO2RgxqvsTkAdXQb9q9JOl3SWZJGJd3U6YkRsS4ihiNieM40H2wA0DtdhT0i9kTEqxFxWNLXJZ3dbFsAmtZV2G0vnvTwU5K2dXougMEw7Ti77TskrZR0iu1dkr4gaaXtszQxlLlT0hW9axGD7C0nnFCsX/brD3as7Tv8SnHdsS++u1ifN/5wsY7XmzbsEbF6isW39qAXAD3E5bJAEoQdSIKwA0kQdiAJwg4kwUdcUcuO6z9QrH/vlL/tWFu149PFdedtZGitSRzZgSQIO5AEYQeSIOxAEoQdSIKwA0kQdiAJxtlR9L+/+9Fifevv/HWx/pNDBzvWXvyrU4vrztNosY43hyM7kARhB5Ig7EAShB1IgrADSRB2IAnCDiTBOHtys5f8crF+zef/oVif5/Kv0KWPXdax9vZ/5PPq/cSRHUiCsANJEHYgCcIOJEHYgSQIO5AEYQeSYJz9GOfZ5X/iM7+3q1i/5PgXivXb9y8s1hd9vvPx5HBxTTRt2iO77aW2f2R7u+0nbF9dLV9g+37bO6rbk3rfLoBuzeQ0/pCkz0XE+yV9VNKVtpdLulbSpog4Q9Km6jGAATVt2CNiNCIere7vl7Rd0hJJqyRtqJ62QdLFPeoRQAPe1Bt0tpdJ+rCkzZIWRcSoNPEfgqQp/3izvdb2iO2Rgxqv2S6Abs047LaPl3SXpGsiYt9M14uIdRExHBHDczSvmx4BNGBGYbc9RxNBvz0i7q4W77G9uKovljTWmxYBNGHaoTfblnSrpO0R8eVJpfskrZF0Q3V7b086RD1nvq9Y/vOFt9V6+a9+8ZJi/W2PPVTr9dGcmYyzr5B0maTHbW+pll2niZB/2/blkp6VVP5XB9CqacMeEQ9Kcofyuc22A6BXuFwWSIKwA0kQdiAJwg4kQdiBJPiI6zFg1vL3dqytvbPe5Q/L119ZrC+77d9qvT76hyM7kARhB5Ig7EAShB1IgrADSRB2IAnCDiTBOPsx4Kk/7PzFvhfNn/GXCk3p1H8+UH5CRK3XR/9wZAeSIOxAEoQdSIKwA0kQdiAJwg4kQdiBJBhnPwq8ctHZxfqmi24qVOc32wyOWhzZgSQIO5AEYQeSIOxAEoQdSIKwA0kQdiCJmczPvlTSNyW9Q9JhSesi4hbb10v6rKTnqqdeFxEbe9VoZrtXzCrW3zm7+7H02/cvLNbn7Ct/np1Psx89ZnJRzSFJn4uIR22fIOkR2/dXtZsj4ku9aw9AU2YyP/uopNHq/n7b2yUt6XVjAJr1pv5mt71M0oclba4WXWV7q+31tqf8biTba22P2B45qPF63QLo2ozDbvt4SXdJuiYi9kn6mqTTJZ2liSP/lBdoR8S6iBiOiOE5mle/YwBdmVHYbc/RRNBvj4i7JSki9kTEqxFxWNLXJZU/rQGgVdOG3bYl3Sppe0R8edLyxZOe9ilJ25pvD0BTZvJu/ApJl0l63PaWatl1klbbPksToy87JV3Rg/5Q01++sLxYf+i3lhXrMfp4g92gTTN5N/5BSZ6ixJg6cBThCjogCcIOJEHYgSQIO5AEYQeSIOxAEo4+Trl7ohfEOT63b9sDstkcm7Qv9k41VM6RHciCsANJEHYgCcIOJEHYgSQIO5AEYQeS6Os4u+3nJP3XpEWnSHq+bw28OYPa26D2JdFbt5rs7bSIePtUhb6G/Q0bt0ciYri1BgoGtbdB7Uuit271qzdO44EkCDuQRNthX9fy9ksGtbdB7Uuit271pbdW/2YH0D9tH9kB9AlhB5JoJey2z7f977aftn1tGz10Ynun7cdtb7E90nIv622P2d42adkC2/fb3lHdTjnHXku9XW/7Z9W+22L7wpZ6W2r7R7a3237C9tXV8lb3XaGvvuy3vv/NbnuWpP+QdJ6kXZIelrQ6Ip7sayMd2N4paTgiWr8Aw/ZvSHpR0jcj4oPVshsl7Y2IG6r/KE+KiD8dkN6ul/Ri29N4V7MVLZ48zbikiyX9nlrcd4W+flt92G9tHNnPlvR0RDwTEQck3SlpVQt9DLyIeEDS3iMWr5K0obq/QRO/LH3XobeBEBGjEfFodX+/pNemGW913xX66os2wr5E0k8nPd6lwZrvPST90PYjtte23cwUFkXEqDTxyyNpYcv9HGnaabz76Yhpxgdm33Uz/XldbYR9qu/HGqTxvxUR8auSLpB0ZXW6ipmZ0TTe/TLFNOMDodvpz+tqI+y7JC2d9PhUSbtb6GNKEbG7uh2TdI8GbyrqPa/NoFvdjrXcz/8bpGm8p5pmXAOw79qc/ryNsD8s6Qzb77I9V9Klku5roY83sD1UvXEi20OSPqHBm4r6PklrqvtrJN3bYi+vMyjTeHeaZlwt77vWpz+PiL7/SLpQE+/I/0TSn7XRQ4e+3i3psernibZ7k3SHJk7rDmrijOhySSdL2iRpR3W7YIB6u03S45K2aiJYi1vq7dc08afhVklbqp8L2953hb76st+4XBZIgivogCQIO5AEYQeSIOxAEoQdSIKwA0kQdiCJ/wNGNvRI2D7VDgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.imshow(X)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.weights" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "in_json = {\n", + " \"in\": X.astype(int).flatten().tolist(),\n", + " \"conv2d_weights\": (model.weights[0].numpy()*1000).round().astype(int).flatten().tolist(),\n", + " \"conv2d_bias\": (model.weights[1].numpy()*1000).round().astype(int).flatten().tolist(),\n", + " \"dense_weights\":(model.weights[2].numpy()*1000).round().astype(int).flatten().tolist(),\n", + " \"dense_bias\":(model.weights[3].numpy()*1000000).round().astype(int).flatten().tolist(),\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "import json" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"mnist_input.json\", \"w\") as f:\n", + " json.dump(in_json, f)" + ] + } + ], + "metadata": { + "interpreter": { + "hash": "11280bdb37aa6bc5d4cf1e4de756386eb1f9eecd8dcdefa77636dfac7be2370d" + }, + "kernelspec": { + "display_name": "Python 3.8.6 ('tf24')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.6" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/models/mnist_input.json b/models/mnist_input.json new file mode 100644 index 0000000..d9dc384 --- /dev/null +++ b/models/mnist_input.json @@ -0,0 +1 @@ +{"in": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 185, 159, 151, 60, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 254, 254, 254, 254, 241, 198, 198, 198, 198, 198, 198, 198, 198, 170, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 114, 72, 114, 163, 227, 254, 225, 254, 254, 254, 250, 229, 254, 254, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 66, 14, 67, 67, 67, 59, 21, 236, 254, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 253, 209, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 233, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 254, 238, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 249, 254, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 254, 187, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 205, 248, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, 254, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 251, 240, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 221, 254, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 203, 254, 219, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 254, 254, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 224, 254, 115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 254, 254, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 242, 254, 254, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 254, 254, 219, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 254, 207, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "conv2d_weights": [-15, 2, 11, 17, 11, 4, -10, -8, 6], "conv2d_bias": [22], "dense_weights": [-39, 449, -272, -320, 153, 188, -77, 311, -283, -110, -12, 558, -243, -290, 224, 117, -25, 108, -381, -62, -35, 469, -248, -296, 130, 172, 66, 219, -370, -64, -155, 395, -208, -341, 173, 147, 7, 153, -296, -37, -66, 420, -191, -271, -7, 291, 184, 295, -427, -10, -21, 504, -138, -347, -135, 123, 218, 72, -500, -44, -158, 188, 15, -389, -191, 206, 194, 100, -382, -131, -57, 131, 86, -222, -249, 109, 159, -12, -561, -44, -53, 122, -21, -73, -218, -82, 217, 36, -338, -96, -57, 39, -20, -101, -198, -288, 252, -89, -308, -215, 6, 123, -77, -83, -227, -145, 184, -90, -302, -290, -35, 245, -140, -138, -127, -283, 78, 71, -241, -53, -56, 226, -183, -108, 97, -172, 47, -19, -256, -26, -78, 273, -93, -131, -86, -136, 123, 98, -227, 8, 87, 81, 151, -124, -195, 18, -36, 111, -106, -158, 139, 53, 209, -284, -163, 206, -41, -61, -34, -54, 56, 14, -65, -159, -259, -5, 90, -2, -85, -219, 112, 198, -232, -263, -201, 98, 108, 152, -147, -166, -54, 313, -199, -172, -221, -87, 417, 82, -233, 33, -83, 286, -201, -218, -170, -121, 344, 230, -220, 21, -68, 399, -163, -301, -88, -31, 323, 260, -413, -76, -163, 465, -101, -410, -125, 20, 329, 265, -483, -144, -15, 408, 63, -400, -127, -33, 103, 288, -498, -77, 20, 467, 20, -371, 170, 19, -130, 151, -425, -37, -58, 502, -60, -196, 263, 237, -34, 155, -336, -20, -75, 579, -175, -230, 116, 217, 77, 197, -412, -43, -101, 465, -263, -262, 131, 123, 58, 195, -343, -108, 73, 571, -344, -301, 164, 100, 169, 182, -482, 6, 64, 387, -282, -331, 46, 311, 188, 96, -356, -102, -251, 216, -98, -33, 80, 16, -24, 187, -411, -91, -207, 344, -96, -95, -215, -125, 213, 167, -271, -134, -174, 144, 83, 1, -175, -266, 128, -38, -376, -86, 80, -127, 36, 109, -345, -219, 295, -66, -291, -49, -110, -164, 184, -32, -354, -130, 115, -36, -222, -314, -163, -190, 136, -48, -257, -99, 172, -160, -138, -70, -197, -329, 192, 23, -451, -146, 243, -106, -166, -183, -60, -66, 64, 152, -488, -84, 95, -147, -317, -176, -21, 71, 40, 17, -376, -161, 30, -164, -118, -224, -202, 112, 62, 72, -95, -32, 127, -132, -264, -234, -225, 175, 34, 66, -224, -154, 116, -51, -209, -75, -231, 148, 12, 13, -135, -106, 73, -142, -139, -163, -255, 181, 132, 8, -36, 63, 61, 131, -126, -31, -363, 41, -64, -5, -206, 131, 124, 152, -41, 85, -251, 226, -120, -144, 1, 148, 177, 35, -144, -46, -293, 31, -60, -148, -197, 69, 100, 26, 20, -168, -139, -61, -158, -144, -148, 5, 98, -10, -61, -7, -135, -48, -77, -321, -120, 4, 210, 210, 4, -13, -64, 39, -163, -389, -50, -46, 256, 128, -46, -81, -91, 158, 63, -253, -70, 33, 110, 150, -169, -34, -95, 225, 115, -316, -223, 114, -124, 245, -257, -77, -152, 212, 176, -389, -74, -68, -86, 278, -511, -76, 13, 344, -50, -358, 164, -96, -48, 262, -433, 57, -13, 520, -165, -313, 288, 187, -35, 330, -340, -98, 36, 362, -299, -183, -78, 33, -49, 193, -422, -62, 42, 60, -92, -150, 15, -54, 203, 11, -422, -160, -200, 53, -16, 105, -134, -182, 160, -252, -272, -155, -178, 88, 25, 139, -185, -97, 73, -180, -105, -61, 40, -29, -88, 187, -101, -143, 113, -242, -47, -130, 42, 84, 36, 92, -216, -168, 125, -335, 88, -180, -95, -104, 212, 131, -214, -14, 70, -467, -26, -229, -91, -96, 58, 58, -350, -2, 70, -430, -10, -143, -117, -176, 50, 18, -299, -10, 88, -278, 24, -121, -23, -102, 92, 162, -216, 3, 32, -137, 4, -258, 45, 51, 72, 104, -212, -35, 80, -283, -7, -289, 61, 68, 112, 128, -282, -2, 34, -254, -48, -496, -2, -152, 24, 127, -348, 30, 10, -215, -12, -496, 26, -81, 91, 137, -156, 71, 61, -233, -4, -603, -14, -14, -13, 80, -83, 32, 20, -263, -50, -572, -3, -4, 62, 182, -183, 189, 94, -103, 23, -239, 9, -29, -84, 58, 54, 55, -17, 1, 27, -104, -80, -161, -120, 21, 47, 41, 54, -233, -21, -102, -118, -44, -100, 173, -2, 70, 19, 48, -46, -261, -26, -191, -60, -2, -36, 200, 16, -97, 29, -119, -7, -110, -232, -279, 22, 115, 110, -10, -66, -51, -162, -265, -104, -508, 74, 109, 99, 175, 97, 85, -50, -197, 103, -389, -61, 85, -8, 123, 217, 17, -52, -99, -128, -345, -108, 42, 124, 183, -3, -156, 86, 244, -355, -376, 199, 66, -35, 190, -180, -132, 26, 603, -219, -80, 140, -57, -24, 207, -317, -7, -91, 274, -183, -42, 113, 11, -269, 112, -438, -53, -282, 56, -100, 133, 215, -317, 96, -25, -202, 88, -277, 98, -50, 170, 135, -205, 10, 11, -131, -85, -30, 18, 30, 150, -161, -271, 3, -121, -86, -151, -112, -74, 77, 87, -33, -62, -63, -268, -46, -19, -41, -28, 1, 25, -40, -94, 3, -179, 6, -206, -25, -43, 65, 66, -77, 20, -20, -224, -20, -187, 53, 16, 92, 84, -159, -9, 25, -362, 29, -143, 106, -106, 102, 42, -14, 6, -107, -355, 27, 74, -7, -36, 50, 121, -69, -6, -32, -285, 95, -196, 12, 44, 80, 66, -124, 60, -68, -233, 40, -138, 1, 3, 2, 11, 100, -76, 6, -171, 29, -174, -28, 84, 60, 90, -26, 0, -45, -271, 23, -254, 11, 37, 41, 61, -89, 85, -51, -255, 74, -228, 13, -29, 2, 4, 40, 11, -39, -337, 2, -174, -42, 19, 5, 12, -75, 85, 26, -465, 0, -210, 27, -38, 7, 86, 83, 88, 44, -570, 39, -145, -33, 140, 9, 15, 5, 99, -1, -267, 97, -161, -30, 50, -66, -40, 85, 11, 1, -69, -3, -237, -71, -12, -94, -114, 89, 15, 23, -14, -44, -344, -141, 51, -203, -143, 229, 122, 131, -15, -4, -357, -25, -93, -408, -103, 165, 58, 66, -7, 11, -245, -139, -243, -104, -311, 177, 256, -128, 75, 34, 40, -182, -383, -356, -198, 260, 231, -138, 147, 136, 7, -37, -368, -196, -420, 77, 41, -16, 117, 229, 10, -127, 136, -176, -172, 179, 128, -6, 257, -329, -54, -137, 242, 8, 127, 44, -129, -213, 237, -306, -98, -172, 120, -22, 129, 102, -148, 146, -152, -151, -51, -149, 132, 35, 183, 48, -139, -75, 23, -140, -356, -117, 150, 98, 122, -130, -167, -36, 134, -128, -44, -64, 19, 21, 10, -107, -23, -101, 7, -64, -131, -39, -30, 16, 60, -17, -48, -63, 105, 108, -149, -50, -55, -17, 80, -9, 39, -45, 1, 9, -55, -25, -33, 61, -24, -45, -11, -33, 81, -18, -133, -14, -109, -26, 67, -24, 19, -28, 78, -81, -8, 8, -93, 22, 0, 9, 23, -109, -66, 94, 98, 42, -134, 64, 61, -76, 25, -51, -7, 53, 27, 35, -47, 20, 34, 38, 30, -4, 23, 72, 118, 2, -30, 73, 15, -56, 32, -14, -45, 91, 6, -10, 8, 28, 48, 24, 27, -51, -6, 0, -28, -38, -80, -38, -14, 24, 22, 0, -143, 50, -35, 42, -46, -2, -16, -51, 48, -43, -9, -29, -90, 9, -46, 21, -15, 47, 117, 30, -93, 68, -46, -56, -44, -89, -41, 49, -36, 82, -148, -43, -42, 19, -30, 15, -2, -13, 14, 38, -212, 32, -34, 1, 1, -43, -27, -26, 102, 34, -270, -52, -125, -35, 154, 22, -23, 111, 45, 129, -321, 46, -249, -229, -8, -30, -118, 30, 111, -37, -267, -62, -436, -247, -115, 21, -30, 41, 155, -23, -170, 7, -302, -180, 6, -2, -326, -56, 64, 35, -55, -25, -79, -240, -155, -80, -246, 71, 30, 88, 117, 123, -124, -140, -54, 37, -185, 169, 187, -49, 162, -286, 30, -13, 165, -3, 176, -44, -190, -289, 257, -328, 26, -140, 315, 82, 128, -5, -359, 34, -90, 40, -238, -115, 94, 19, 52, 39, 29, -50, -6, -37, -354, 12, 54, -20, -15, -55, 64, -194, 86, -161, -141, -45, -70, -26, 40, -81, -8, -12, 142, 1, -195, -23, -217, 112, 45, -38, 27, 0, 104, 36, -39, -32, -88, -61, 90, 23, -4, -22, 137, 12, 24, 31, -62, 42, 4, -5, -9, -30, 72, -16, -27, -38, -78, 49, 115, 15, 21, -80, 100, -14, 91, -23, 4, 4, -3, -123, -22, -109, 149, 22, 60, 32, -25, -8, 63, -92, -33, -59, 53, 19, 124, 56, -107, 9, 52, -138, 13, -130, -63, -15, 33, -23, -116, -33, -24, -88, -15, -31, 5, 63, 90, 16, -106, -1, 11, -130, -19, -104, -39, -8, 11, 35, -139, 52, -12, -73, 123, -51, 32, 68, 59, 29, -92, -81, -29, -89, 28, -4, -54, -35, 36, -84, -70, -31, -44, -68, 34, -36, 17, -8, 51, -15, -77, -31, -47, -72, 73, -107, -73, 12, 0, -6, -15, -34, 2, -68, 108, -63, -12, 116, 16, 41, -42, -26, -68, -54, 7, -15, 18, -96, 13, 82, -25, -243, -57, 60, 117, -66, -36, 41, -121, 29, -51, -387, 29, 102, 131, 36, -43, 0, -168, -380, -220, -414, -146, -29, 245, 39, -203, 63, -98, -559, -131, -304, -99, -49, 149, -39, -141, 3, -98, -309, 34, -45, -194, 106, 95, 99, 88, -9, -83, -108, -172, -7, -97, 168, 76, -36, 164, -401, -91, -30, -126, 46, 4, -48, -330, -287, 212, -3, -420, -193, -34, 185, -31, -33, -314, -43, 106, -14, -259, -55, -104, 79, 86, 117, -25, -14, 97, -2, -173, 56, -73, 31, 99, 17, 81, -130, 84, 25, -125, 13, -186, 14, -17, 26, -52, -50, 44, 2, -154, 27, -175, 73, 44, -43, 126, 54, 122, -17, 38, -12, -114, 12, 5, -25, -18, -49, 10, -53, -8, -68, -16, 46, 42, -88, 40, -88, 64, 65, -57, 70, -13, -51, 66, -59, 21, -15, 74, -12, 49, -17, -35, 45, -39, -52, -5, -48, 73, 1, 15, -18, -59, -33, 14, -139, -43, -35, 10, -20, 113, 108, 41, 69, 69, -162, 9, -122, 15, -54, 85, 33, -95, 47, 30, -55, 4, 17, 23, 38, 93, 17, -126, -2, 41, -117, -16, -99, 36, 42, 85, 70, -123, -19, -13, -70, 39, -13, 23, 6, 6, -9, -94, -68, -36, -54, 104, -128, 33, -22, 94, 28, -1, -77, 15, -13, 40, -58, 23, 28, 28, 20, -2, 5, -15, -42, 146, -72, -6, 36, 24, 48, -43, -30, -18, 27, 14, -17, -52, -13, 47, -40, 20, -20, -34, -41, 63, -100, 23, 10, -47, -16, 73, -10, -201, 88, 92, -48, -72, 71, -35, -62, -230, -293, -255, 130, 193, -51, -109, 115, -148, -106, -317, -503, 36, -82, 162, 71, -33, 53, -39, -134, -265, -76, -245, 65, 161, 27, 32, 114, -152, -94, 45, 47, -278, 69, 110, 135, -79, -99, -27, 247, -41, 37, -47, 85, 17, -121, 15, -466, -189, 130, -24, 68, -37, -43, -283, -365, 162, -26, -161, -144, 36, 15, 55, -43, -363, 112, -18, -25, -132, -16, -66, -7, 35, 108, -201, -15, 25, 104, -147, -32, -111, -70, -31, -15, -22, -48, 80, 43, -24, -65, -35, -63, 59, 97, -40, 48, 149, 47, 16, -28, 35, -14, -8, -37, 4, -16, 0, 62, -67, -57, -192, -1, -26, 19, 20, -143, 69, 1, -1, 80, -9, 43, -4, -63, -11, -84, 112, 3, 28, -3, -91, -8, -10, -88, 86, -58, 25, 58, -38, 29, -32, 72, 62, -55, -29, -18, 120, -12, 0, 72, 7, 48, 86, -77, -31, -26, 95, 48, 42, 3, -7, 39, 28, -103, -56, -131, 68, -5, 48, -21, 18, -3, 91, -133, -43, -53, -11, -32, 47, 107, -156, -22, -11, -85, -55, -150, 86, 77, 46, 147, -62, -27, 24, -52, -4, -139, 63, -35, 22, 113, -121, -44, 0, -55, 49, -121, 63, 14, 2, -11, -59, -31, 27, 3, 21, -132, -21, 67, -61, 2, -32, -12, 27, -14, 68, -185, 43, 10, 24, 17, 0, -17, -8, -40, 166, -29, -6, 18, -82, -45, -67, 70, -2, 30, 108, -191, -18, 53, -127, 134, -88, -28, -80, 17, 133, -201, 27, -35, 15, 12, -217, -319, -133, -118, 255, -78, -65, 47, -66, -309, -503, -148, -415, -61, 298, -208, -89, -38, -300, -356, -438, -192, -481, 65, 161, -111, -228, 161, -203, -189, -36, -382, -177, 69, 35, -171, -168, 57, -53, 201, -118, 5, -37, 43, -44, -196, 227, -663, -183, 120, -139, 129, 40, -59, -335, -413, 182, 72, -1, -105, -146, 51, 116, -8, -257, -89, 127, 3, -135, -19, -126, 81, 118, -93, -2, -12, 79, -19, 30, 18, -167, 21, 33, -48, -31, -87, 88, 85, 75, -13, 9, 7, 75, 4, -18, -59, 98, 53, -52, -31, 97, -87, 17, -58, 2, -64, 22, 14, 24, 29, -40, -45, 65, -7, 44, -77, -8, 55, 5, 26, -14, 35, -23, -35, -11, 2, 2, 78, -11, 34, 34, 71, 18, -45, 21, -66, 30, 44, 55, -9, -2, -29, -40, -60, 10, -90, 78, 41, -26, 38, 57, -18, 25, -75, 38, -37, 139, -6, 29, 49, 24, 22, 2, -119, -102, -130, 122, -48, 42, -28, 44, 24, 88, -87, -113, -124, 140, -138, 37, 18, 27, 43, 71, -55, -59, -125, 159, 49, 57, 111, -1, 59, 78, -56, -76, -93, 38, -2, -4, 39, -16, 42, 65, 55, -72, -222, 174, 51, 29, 64, -9, 43, 53, -19, 11, -145, 143, 49, 3, 51, -95, -1, 87, -42, 31, -37, 31, 49, -44, 21, -57, -42, -20, 0, 58, -15, 12, 13, -31, -28, -10, 30, 104, -47, 67, -114, -1, 101, -20, -71, -151, -83, 44, 48, 272, -34, -35, 19, -264, -7, -267, -256, -410, -90, 372, -90, -105, 59, -87, -401, -192, -340, -319, 29, 356, -141, -141, -21, -114, -338, -118, -91, -283, -223, 302, -53, -57, 79, -382, -357, -64, -248, -126, -223, 103, -254, 88, 271, -213, 140, -30, -226, 86, -98, -30, -135, 198, -395, -228, 203, -126, 102, 128, 8, -344, -389, 37, -111, -105, -3, 3, 94, 99, -79, -75, -4, 173, 45, -44, -72, -214, 55, -39, -85, -65, -133, 6, -45, -53, 13, -325, -26, -20, -45, 31, -155, 88, 102, 110, -67, -29, 86, 44, -151, -46, 60, -41, 10, -36, -33, -2, 19, -61, 32, -12, 5, -77, 50, -17, 57, -166, 1, -43, -2, 87, 9, 55, 31, 38, -22, -18, -14, -95, -5, 116, -91, -54, 62, -6, -37, 23, -16, -169, 9, 72, -8, 27, 50, 44, -21, 31, -35, -74, -41, 72, -114, 17, 130, 19, 49, 124, -52, -2, -56, 81, -44, 25, 55, 15, 11, 70, 11, 67, -180, 16, -46, 131, 52, 25, -20, 120, 2, 60, -110, -101, -172, 212, -176, -31, 27, 89, 39, 11, 18, -53, -125, 57, -85, 26, 46, -13, 32, 73, -8, -45, -177, 153, -13, 2, 103, 15, -8, 19, -2, -71, -81, 83, 21, 9, 106, -120, 118, 43, 58, -149, -99, 51, -4, -16, 89, -147, -68, 35, -101, -90, -63, 51, 7, -24, -37, -117, -2, 13, -37, -59, -93, 67, 32, -38, 69, 73, -63, 141, -4, 56, -29, 155, 101, -10, -17, -43, 18, -14, -70, 63, -157, 5, 86, -24, 140, -407, -383, -486, -83, 374, -152, -108, -79, -171, -97, -318, -169, -150, -259, 603, -307, -91, -58, -221, -410, -131, -129, -210, -75, 430, -138, -9, -1, -377, -375, 192, -7, -204, -232, 114, -204, 86, 24, -8, 297, 151, -157, -143, -125, -81, -194, 317, -311, -126, 93, -39, -89, 289, 18, -282, -186, 135, -84, -78, -160, -44, -31, 110, -102, -13, -19, 116, 5, 9, 6, -235, 32, 58, 29, -3, -22, 32, 90, -8, -115, -178, 22, -64, -13, -2, 36, 61, -8, 38, 18, -189, -97, -68, 84, 39, 2, 12, 86, 44, -84, -67, -6, -157, 62, 45, -25, 3, -6, 53, -19, -96, -79, -209, 25, -7, 57, -63, 112, 28, -15, -63, -157, -48, 120, 46, -26, 33, 89, 133, -99, 5, -179, -34, 72, 106, 26, 15, 114, 91, -19, -3, -178, -109, 122, 1, 5, 4, 41, 59, -72, 77, -196, 64, -38, 80, 4, 84, 40, 68, -81, 189, -255, 46, -269, 43, -40, 172, 77, 100, -121, 99, -187, 24, -61, -54, -158, 158, -72, -25, -190, 72, -102, -6, 47, -73, -107, 136, -82, 32, 52, -29, -6, 36, 10, -64, -85, 104, -31, 32, -52, -61, -35, 41, 81, -34, -120, 79, 2, 69, 4, -107, -29, 39, 76, -6, 9, 119, 102, 128, 26, -81, 40, 30, 16, -154, 0, 65, -21, 21, 40, -10, -49, 25, -19, -144, -12, 56, 36, 16, 85, 11, 17, -2, -113, -190, 13, 4, 21, 62, 59, -130, -42, 35, -193, -76, 12, -19, 93, 31, 55, -206, -176, -349, -101, 257, 36, -152, 89, -84, -180, -163, 16, -161, -268, 546, -202, 39, -115, -266, -395, 4, 146, -146, -662, 606, -415, -350, -35, -173, -226, -68, 84, -248, -445, 521, -383, -175, 115, -163, -13, 380, -269, -141, -216, 19, -32, 298, -158, -122, 31, 164, -147, 171, -118, -255, -207, 158, 18, -22, -72, 17, -248, 20, -24, -77, 39, 51, 26, 41, -79, -61, -99, -181, -64, 70, 67, 61, 118, 37, 102, -125, -121, -59, -63, -74, -58, -12, -25, 65, 94, -11, -239, -62, 58, 99, -8, -15, 118, 56, -7, 14, -237, -121, 31, -8, 43, 79, 40, 124, -33, -125, -197, -76, 141, 63, 5, 25, 39, 50, -79, -7, -97, -72, 91, -27, 39, -3, -60, -7, 37, -87, -140, -56, 61, -20, -77, -89, -6, 93, -89, 50, -128, 1, 92, 64, 9, -193, -19, -39, -25, 13, -159, 62, -24, 52, 49, -146, 54, 17, -79, 215, -133, 65, -131, 24, -8, -13, 39, 51, -169, 165, -172, 54, 61, -41, -164, 77, -22, 90, -220, 158, -78, 58, 91, -98, -23, 147, 20, 108, -52, -83, -121, -17, -2, -67, -55, 82, -86, 39, -12, -95, -55, 55, 5, -111, -75, 63, -3, 57, -38, -84, -63, -11, -10, -20, -43, 83, 2, 31, 43, -103, 23, 47, 6, -133, -26, 37, 86, 134, 60, -37, -29, -123, -31, -172, -80, 2, 28, 56, 71, -62, 63, -113, 72, -245, 60, 48, 87, 12, 138, 13, -99, -59, -101, -271, 180, -58, 182, 54, 149, -75, -81, -145, -10, -336, 157, -149, 231, -165, 8, -43, 120, -21, 69, -63, -63, -75, -37, -118, -355, -104, 249, 8, 90, 238, -374, -31, -150, -116, -305, -13, 266, -336, -309, 470, -249, 251, -173, -191, 29, 377, -284, -305, -150, 10, -38, 357, -263, -156, -10, 200, -122, 45, -89, -54, -111, 190, 104, -126, 11, 131, -288, -7, -44, -4, -100, 72, 23, 137, 8, -8, -224, -159, -110, -53, 33, 32, -15, 112, 44, -7, -372, -101, 51, 5, 45, -75, 25, 21, 130, -55, -282, -86, 90, 52, 115, 76, -26, 69, -46, -30, -184, -80, 56, -85, 62, 71, -59, -24, 51, -41, -124, -10, 57, -27, 21, -101, 11, 57, -25, -54, -97, -37, 107, 62, 14, -46, 16, 37, 88, -182, -75, -29, 144, 25, -16, -44, -8, -12, 6, -5, -80, -13, 135, 85, 19, -202, 14, -58, -119, 65, -56, 6, -22, 50, -28, -236, 41, -39, -289, 175, -5, 78, -72, 30, -83, -103, 63, 40, -326, 140, -122, 11, 24, -62, -45, 14, -20, 89, -165, -27, -85, 51, 141, -58, -23, 78, 2, 65, -66, 32, -102, -16, 57, -108, -44, 103, -20, 90, -21, -132, -54, 32, 60, -48, -5, 106, -17, 65, 36, -127, 41, 36, 53, -29, -89, -54, 9, 63, -67, -127, -79, -86, 51, -21, -51, -49, -38, 90, -14, -21, -70, -144, 84, -38, 1, 15, 23, 116, 61, -128, -117, -182, 55, -128, 119, 86, 34, 46, -2, -37, -17, -139, -16, -128, 122, -41, 66, -5, 144, -157, 90, -63, -92, -368, 234, -66, 145, -343, 31, -194, 253, -14, -21, -373, -2, -31, 54, -503, -145, -13, 351, -33, -135, -7, -314, 136, -117, -98, -179, -32, 415, -314, -129, 43, -347, 68, -118, -76, -98, 382, -189, -132, -48, 33, 28, 336, -358, -161, -196, 269, -74, -85, -67, -56, -218, 129, -2, 7, -31, 321, -123, -129, 114, 18, -217, 162, -172, 103, 60, 15, -122, -94, 163, 23, 44, 47, -35, 95, -7, 31, -233, -174, 33, -28, 90, -10, -22, -10, 159, -39, -55, -159, 131, -45, 19, -30, -89, 48, 120, 15, 28, -37, 103, 71, -20, -34, -35, 73, 72, -33, 66, 9, 115, -1, 18, -53, -75, 6, 39, -152, -114, -20, 35, 62, 99, -67, -46, -25, -34, -102, 46, -2, 103, 37, 35, -114, -42, -15, 57, -8, -88, -31, 66, 44, 40, -182, 93, -77, -147, 75, -7, 38, -52, -1, 11, -279, 62, 7, -197, 117, 18, 22, -53, -53, -107, -132, 40, 12, -234, 155, 13, 21, 147, -31, -40, 119, 4, 92, -204, 28, -66, -35, 38, -64, 5, -12, 15, 96, -129, 37, -59, 34, 83, -65, 15, 114, -54, 59, -24, -123, -16, 86, 61, 22, -93, 122, -12, 93, 33, -249, 17, 2, 65, -22, 58, 91, 34, 56, -28, -85, -26, -89, 67, -71, -72, 121, -12, 14, 12, -26, -30, -33, 94, -66, 85, 88, -39, 56, 61, -84, -23, -177, 77, -103, 47, 57, -85, 1, 133, -97, -99, -39, -29, 26, 184, -27, -26, -5, 93, 20, 216, 58, -167, -3, 87, -88, -128, -356, 37, 94, 95, -357, -16, -163, -71, -29, 3, -476, -147, 193, 255, -106, -75, 79, -144, -78, -68, -161, -15, 400, 371, -231, -168, -90, -235, 217, -390, 122, -136, 436, -149, 198, 14, -103, -36, 247, -516, -218, -161, 142, 166, 10, -121, 125, -225, 65, 36, -50, -79, 246, -42, -59, 51, -12, -252, 10, -225, 70, 214, 23, -50, -57, 126, -54, -18, 71, -32, -12, 22, -176, -1, -47, 75, -27, 69, -25, -86, -13, 21, -243, 43, -70, 78, -129, 93, 49, -101, 57, 16, -29, -38, -57, 20, 13, 69, -109, -90, -48, 69, 59, 12, -47, 79, 26, 143, -86, -61, 1, -5, -100, 11, -36, 77, 77, 4, -83, -12, -21, -6, -123, -28, -58, 79, -26, 61, -151, -40, 6, 18, 90, 22, 17, 89, 42, -33, -171, 53, -78, -186, 112, -6, 39, -53, -42, -23, -161, 12, 1, -188, 191, 35, -6, 42, -33, 12, -120, 51, 19, -203, 97, 28, 10, 105, -15, 65, 62, 66, 50, -235, 78, 12, -8, 101, -119, -17, -28, -12, 58, 1, -56, -24, 9, 91, -59, -56, 122, -18, 97, -41, -151, 12, 51, 77, -19, -39, 105, -23, 64, -60, -264, -60, -16, 64, 30, 2, 181, -52, 6, 22, -81, -37, 2, 7, -3, 23, 66, -39, 49, 86, -260, -22, 29, 19, 43, 35, 37, -82, -35, 2, -176, -86, -28, 66, -56, 50, 40, -100, 105, -42, -100, -38, 17, -45, -19, -14, 170, -43, -230, 182, -112, -32, 186, -65, -152, 41, -29, -98, -364, -24, 1, 257, -182, -234, -231, 67, -81, -29, -212, -267, 117, 435, -64, -205, -215, -212, -101, -94, -99, -42, 225, 252, -115, 107, 78, -256, -340, -188, -6, -105, 327, -109, 178, 135, -221, -65, 53, -523, -251, -95, 295, 139, 82, -122, 44, -238, -153, -25, -102, -11, -21, 133, 29, -21, -83, -411, -26, -136, 112, 154, -139, 105, -48, -97, -131, 32, -80, -101, 34, 53, -70, 64, -56, -2, -93, -20, -64, -59, -17, 75, -39, -9, -85, 0, -165, 71, -15, 9, -47, 175, 55, -49, -145, 61, -126, 105, -70, -11, 73, 169, -25, 50, -80, 84, -53, 103, -18, 2, -16, 66, -158, 29, -54, 6, -71, 75, -53, -11, -65, -44, 12, 81, -10, 23, -13, 103, -143, 14, -6, -29, 54, 40, -1, -23, -57, 59, -143, 71, -65, -244, 120, 131, 41, -14, -32, -37, -103, 40, 8, -249, 126, -44, -54, 77, -73, -26, -62, 33, 14, -271, 36, 55, 88, 88, -54, 41, -31, 3, 18, -73, 12, -16, -35, 152, -40, 33, 21, -8, 65, 37, -262, 14, -18, 110, -27, -35, 75, -11, 43, -46, -298, -19, -39, 79, -59, 15, 111, 0, 29, 62, -361, 14, 13, 23, 4, -42, 20, -59, -16, 16, -192, 13, 28, -9, -55, 3, 153, -160, -48, 21, -78, -75, 32, 45, -28, 69, 24, -117, -118, 92, -66, 43, 31, 124, 63, 21, 23, -80, -57, 3, -175, 80, 17, -7, 41, -13, -40, -117, -160, 7, -174, 105, -44, -111, 187, -6, 3, -116, -242, 47, -96, 296, -123, -72, -149, 185, -210, 45, -106, -386, 29, 423, 164, -111, -464, -245, -241, -59, -219, -112, 28, 503, -158, 46, -260, -458, -105, -325, -190, -226, 493, -94, 79, 96, -203, -146, 79, -294, -119, -198, 258, 132, 156, -147, -60, -92, -77, -268, -114, 22, -31, 55, 95, -134, -35, -162, -2, -116, -88, 131, -52, 111, -4, -109, 4, -44, 44, -74, -50, 21, -132, 121, 51, -51, 63, 35, -52, -122, 19, 103, -7, 34, -101, 45, -16, 13, 26, 3, 15, 44, -62, 32, -24, 29, -43, 95, -83, -29, -4, 76, -34, -27, -110, 44, -104, 129, -10, 143, 58, 74, -85, 111, -74, -33, -84, 174, -84, -13, -41, 60, -43, 42, -110, -45, -92, 114, -155, 83, 2, -111, 124, 109, -80, 24, -137, 136, -49, 1, -3, -267, 36, 99, -16, 10, -74, 9, 57, 85, 35, -177, 160, 35, -68, 86, -140, 59, -56, -10, 7, -149, 90, 2, -85, 145, -110, 16, -62, -26, 7, 25, -54, 4, -39, 91, -60, -43, 45, -28, 52, -97, -135, 27, -35, 39, 15, -39, 37, 3, 53, -11, -270, -25, -3, 32, -6, -18, 45, -99, 55, 10, -58, -51, 61, 1, 55, 19, 32, -54, -27, 18, -81, -79, -5, 23, 120, -34, -13, -68, -12, 95, -15, 94, 40, 26, 77, 30, 23, 0, -65, -31, 0, 64, 40, -2, 60, 14, 39, -41, -10, 38, 1, -44, -18, -10, 9, -24, -138, -49, -253, -97, 149, 63, 92, -23, 117, -39, 58, -123, -323, -63, -11, 177, -394, -194, -74, 134, 31, -92, -295, -162, -116, 394, -552, -202, -594, 102, 135, -12, -197, 5, -12, 297, -373, -285, -183, -347, 140, -331, -1, -194, 439, -57, -18, 119, -18, -93, 374, -215, -138, -202, 204, 28, 185, -5, 93, -38, -78, -192, -98, 22, -260, 125, 111, -147, 55, -124, 16, -90, -149, -39, -299, 55, 107, 48, 92, -22, 3, -50, -130, -19, -161, 76, 23, -11, 135, -51, -101, -27, -31, 16, -129, 62, -41, 10, 33, -83, -155, -13, -49, -2, -178, 18, -66, -19, -66, 43, -63, -47, -8, 124, -40, 88, -114, -11, -64, 110, -73, 90, 19, 181, -34, 93, -90, -45, -109, 133, -205, 17, 32, 92, -67, 23, -160, -71, -62, 115, -82, 93, -15, -55, 18, 116, -90, 18, -80, 113, 15, 103, 28, -163, 113, 105, -70, 91, -10, -15, -15, -18, -2, -224, 107, 37, -83, 89, -23, 134, -41, -21, -69, -104, 18, 16, -90, 112, 17, -24, -45, -75, 21, -55, -172, 17, -5, 65, 0, -28, -67, 11, 32, 77, -279, 9, 105, -5, 13, 35, -73, -16, 1, -56, -86, 51, 16, -19, 26, 50, 14, -84, -24, 33, 77, 41, 27, -122, -35, 4, -14, -51, -3, -3, -30, -12, 0, -20, 49, 64, -24, -36, -80, 37, 20, 4, -13, 95, 58, -26, 116, -110, -50, 14, 99, 86, 134, -145, -26, 3, 97, -17, -127, 96, -55, 25, 195, -57, 97, -67, -75, 34, -86, 58, 9, 68, 75, -2, 98, 19, -191, -41, -274, -49, 33, 274, -501, 45, -169, 51, -301, -278, -231, -216, 84, 510, -367, -256, -256, -189, -225, -401, -249, 68, 305, 78, -200, -196, -177, -46, 180, -25, -170, -39, 144, -23, 23, 14, 55, -45, 430, -165, -177, -96, -11, -16, 117, -41, -7, -19, 56, -251, -212, -27, -195, 21, 90, -24, -5, -82, 76, -96, -73, 31, -466, 36, 84, -49, 18, -129, -60, -81, -86, -8, -274, -2, -9, -57, 33, 57, -86, -3, -77, 49, -84, -1, 33, 26, 11, 42, -86, -32, 20, 131, 58, 35, -87, -62, 22, -4, -18, 13, -39, 49, 56, 40, -52, -27, -44, 55, -174, -1, -43, 88, 30, 81, -131, -197, 25, 105, -65, 71, -5, 59, 16, 35, -67, -115, -61, 117, -38, 15, -30, -6, 32, 114, -92, -25, -10, 173, -44, 44, -111, -26, -8, 90, -50, 20, -50, 174, -25, 40, -49, -98, 46, 24, 22, 35, -13, 19, -2, -60, 48, 58, -81, 79, -9, -25, 7, 1, -14, -68, -59, -49, -69, 43, 57, 66, 3, 86, -118, -52, -54, -40, -56, 67, 12, -43, -19, 23, -67, -39, -37, 43, 98, 78, 101, -83, 45, 67, -123, 13, -11, 29, 27, 18, 48, -3, 21, 51, -29, -10, -55, 13, -35, 33, 83, -138, -2, -26, -66, 45, -19, -98, 14, 13, 48, -66, 42, 82, 32, 29, -12, 75, 17, 57, 20, -241, 79, -18, -54, -32, -139, -47, -29, 97, 127, -129, 105, 32, -186, 38, 7, -3, 72, 27, -79, -174, 133, 55, -169, 106, -135, 68, 120, 246, -257, -178, -103, 50, -23, -195, 14, -164, 97, 311, -626, -178, -222, -76, 165, -557, -8, -153, 246, 105, -203, 64, 9, -132, 95, -536, -100, 79, 191, -33, -145, 113, 46, -175, 183, -217, -245, 11, 2, 1, 81, 82, 134, -255, -188, -266, -137, 12, -37, 62, 49, -13, -16, 23, -130, -159, -152, -18, -272, 66, 83, -67, 22, -87, -162, 36, -71, 67, -177, 38, 132, 6, -27, -36, -178, -6, 84, -23, -15, 85, 19, -218, 23, -35, -279, 1, -4, 7, 41, 142, 85, -97, 0, 34, -110, 74, -129, 20, -21, 63, 40, -149, 24, -16, -49, 6, -130, 124, 106, 120, 50, -133, -1, 175, -88, 59, -106, 106, -59, 116, 7, -48, 60, 102, -53, -15, -139, 100, 26, 12, -121, -70, -28, 131, 10, -2, -146, 84, 99, 93, -31, -110, -13, 65, -38, -37, -165, -64, 51, 16, -8, 31, 3, 114, 18, -7, -43, 2, -76, -44, -1, -25, -26, 54, -66, -90, -100, -49, 50, 75, 82, -15, 0, 99, -74, -40, 15, 56, -83, 69, 38, 80, 52, 106, -118, -69, -52, -1, 59, 20, 53, -11, 5, 56, -152, 25, -68, -60, 168, -8, 21, 19, 71, 23, -205, 0, 26, 46, 67, 50, 20, 17, 68, -18, -176, -26, -116, 80, 96, 67, 43, -127, -16, 34, -228, -35, -164, 102, -39, 108, 27, -134, 45, -37, -322, 38, -141, -130, 24, 107, 52, -218, 0, 32, -200, 39, -131, -133, 127, 37, -42, -210, 122, -37, -188, -32, 47, -267, 142, 296, -143, -330, 10, 67, -22, -130, -28, -127, -60, 257, -281, -163, -446, -52, -19, -359, 183, -69, 47, -135, -279, 100, -124, 142, -15, -107, 194, -28, 154, 111, 27, 95, -21, -129, 28, -195, -93, -56, 149, 49, 87, 55, -31, -124, -258, -177, -137, -57, 3, 22, 67, -14, -47, -100, -164, -93, -31, 113, 16, 56, -16, -129, 16, -122, -86, -29, -46, 0, 82, -51, 64, -47, -22, -264, -44, -8, -59, -24, 103, -5, -20, -179, -39, -23, -224, 63, -81, 55, 25, 20, 8, -124, 40, 65, -101, 30, -45, 90, 125, 41, 69, -49, 96, 21, -96, 21, 30, -33, 55, 50, 21, -14, 25, 189, -16, 35, -72, 131, 47, 65, -27, -25, -31, 50, -79, 20, -44, 95, -7, 46, -37, 23, 59, 156, 2, -21, -103, 75, -94, -17, -3, -93, 0, 80, 10, 39, -82, 30, 33, 17, 46, -3, 48, 145, -7, 23, -7, -28, -50, -24, 14, -49, -47, 118, -83, -28, -139, 29, 52, 35, -15, -31, 46, 59, -81, -23, -101, -59, 73, 8, 92, -33, 23, 59, -118, -76, -130, -2, 51, 74, 50, 25, 54, 101, -161, 20, -73, -105, -13, 125, 13, -67, -12, 139, -138, 4, -87, -148, -16, 16, 5, -70, 30, 8, -154, -8, 21, -7, 73, 151, 13, 9, 24, 83, -279, 38, -44, 17, -32, 10, -45, -7, 181, -87, -73, -20, -141, -4, 10, 34, -36, 30, 10, -2, -268, 54, 1, -161, -45, 213, -281, -120, 60, -100, -72, -72, 204, -248, 118, 292, -195, -78, -6, 41, -144, -200, -196, 167, 134, 111, -275, 28, -92, 55, 182, -593, -105, 77, 238, 46, -243, 153, -253, 70, 129, -294, -296, -178, 209, 64, 69, 245, -109, 59, -113, -624, -161, -180, 73, 151, 193, -6, 18, -157, -381, -78, -38, -123, 62, 25, 93, -216, 26, -131, -122, -15, -100, -9, 225, 17, -65, -165, -24, -117, -97, 68, -9, -94, 77, 135, 11, -286, -23, -247, -134, -37, -26, 62, 79, 50, 5, -208, -115, -155, 27, 57, -151, 95, -8, 118, 38, 6, 25, -30, -48, 61, 30, 40, 58, 49, -2, -34, 3, 65, 35, -11, -16, 74, 17, 110, -61, -174, -25, 27, -64, -31, -48, 19, -51, 4, 45, -76, -27, 95, 25, -72, -66, 109, -12, 127, -5, -48, 75, 87, 48, 69, 47, 49, -177, 2, 23, -75, 25, 131, -41, 33, -9, 55, -122, -21, -45, -54, 24, 18, -74, 8, -57, 109, -35, -58, 10, -29, 41, 76, -22, 45, -26, 6, 1, 20, 23, 16, -2, 14, 62, 37, 8, 34, -3, 54, -3, -12, 58, 102, -68, 15, -39, -1, 64, 57, 103, 71, 35, 55, -68, 45, -70, -34, 105, 66, 37, -28, 0, -40, -83, -78, -139, 14, 87, 55, -9, -26, 68, 10, -169, 23, -94, -22, 102, 102, 38, 108, 115, 67, -139, -4, -24, -14, -64, 25, 65, -60, -9, -9, -162, 39, -168, -50, -91, 113, -41, 46, 87, -77, -291, 47, -100, -48, 50, 92, -95, 19, 37, -258, -228, -216, 132, -22, 183, 199, -343, 8, 106, -279, -63, -106, 115, 144, 217, -35, -377, -90, -39, 37, -68, -231, -7, 184, 319, -103, -261, 48, -45, 179, 94, -190, 51, -187, 185, -26, 127, 83, -107, -55, -73, -470, 29, -229, -22, 68, 196, -150, 15, -116, -263, -90, 49, -301, -198, 8, 137, -400, 56, -113, -100, -50, -38, -98, 38, 55, 59, -206, -23, -239, 163, -25, -73, 9, 119, 28, 38, -73, -38, -405, -23, -48, -175, 11, -40, 110, 51, -93, 38, -249, 44, -78, -92, -14, 10, -10, 46, -3, -43, -89, 25, -34, -12, 116, 28, 128, 3, -38, 4, -61, -120, 40, -68, 71, -26, -10, -22, 2, -44, -58, -66, -25, -28, 55, -27, -13, 66, -29, 60, -36, -117, 24, -47, 108, -44, 17, 7, 19, 25, 36, -13, 13, -31, 62, -70, 26, 28, -100, -22, 4, -110, 23, -63, 84, -18, 10, -36, 7, 64, -73, -30, 75, -18, 3, 27, -36, 48, -64, 33, 14, -15, 64, -69, 82, -32, -22, -13, -7, 39, 92, -62, 47, -7, 22, 72, -17, 5, 32, 31, -64, -22, 71, -42, -36, 127, 134, 41, 12, 45, -35, -92, 87, 1, -70, 30, 88, 98, 29, 4, 34, -32, 40, -47, -102, -31, 35, -66, 52, -60, 102, -233, -24, -11, -111, -85, 181, 73, 22, 79, -35, -180, 43, 8, 117, -176, 75, -96, 59, -65, -180, -269, 99, 91, -108, -134, 108, -185, -70, -53, -232, -391, 47, 99, -272, 73, 289, -365, -37, 82, -137, -92, 52, 36, -211, 2, 131, -129, -201, 0, -139, -165, -90, 53, -15, 121, 55, 13, 189, -115, -71, -50, -163, -8, -88, 479, -81, -93, 120, 188, 28, 211, -283, -218, -131, 519, -222, -75, 183, 113, 56, 73, -499, -25, -209, -126, -130, 171, 58, 159, -2, -175, -226, 7, -223, -302, 15, 181, 17, 205, 58, 107, -62, -36, -7, -57, -162, 165, -208, -6, -119, 85, -177, -61, 112, 11, -175, 98, 54, -68, -170, 44, -75, -38, 58, -63, -25, 31, -65, -89, -285, 172, -54, 23, -62, 55, -64, 66, 18, -27, -223, 5, -1, 49, 32, -50, 13, -23, 0, 10, -123, -41, 12, -16, 124, 21, 36, 100, 64, 63, -329, -13, -28, -27, 60, -56, 28, 65, -3, 59, -274, -20, 64, 29, 102, 135, 85, 30, -24, 31, -142, -36, 103, 0, 6, -26, -54, 24, -43, 7, -146, -44, 15, -80, 76, -41, 51, 36, 9, 32, -170, -19, 85, -45, 96, 57, 65, 73, -32, 121, -234, 44, 51, -64, 31, -57, 58, -13, 25, 46, -271, -42, 92, -81, 36, -85, -43, 32, -32, 0, -162, -77, 47, -7, 15, -18, 12, 13, 25, 27, 9, -40, -24, -51, 5, 88, 74, -60, 54, 11, -303, -172, 118, 24, -213, 206, 92, -114, 27, 69, -223, -213, 142, 7, -167, 63, 75, -39, 121, -15, -165, -47, -5, 35, -207, -174, 134, -17, -72, -19, -292, 24, -34, -60, -327, 117, -51, 20, 28, 41, -220, -250, -133, 145, -211, -27, -53, -239, -81, 61, -210, -365, 98, 107, -126, 122, 234, -83, 359, -156, -98, -128, -525, 148, -111, 294, 283, -261, 165, -117, -6, -39, -393, -131, -76, 389, 145, -334, 226, 32, -62, 226, -384, -237, -60, 455, -266, -164, 175, 203, 66, 176, -436, -10, -120, 167, -413, 141, 82, 172, -25, 63, -263, -156, 34, -190, -178, 43, 96, 38, -142, 114, -199, 114, 5, -88, -209, -111, -29, 64, -24, 93, -313, 149, -235, -33, -226, 115, -97, -7, -132, 126, -160, 90, -205, -124, -127, 211, -103, 17, -180, 52, -49, 82, -173, -97, -109, 77, -53, -31, -307, 92, 17, 41, -45, -188, -116, 111, -102, 102, -240, 23, -86, -42, -120, -89, -216, 228, -21, 18, -500, 79, -37, 66, -231, -298, -171, 171, -30, 60, -363, 30, 17, -22, -181, -276, -20, 96, -8, 61, -178, 19, 61, -2, -93, -115, -157, 135, -93, 9, -135, 40, -18, -49, -331, -93, -115, 134, 4, 28, -101, 25, 50, -47, -290, -74, 31, 29, 51, 64, -114, 65, 70, 50, -568, -151, -124, 24, 12, 85, -175, -17, 78, -27, -332, -207, 213, 63, -45, -10, -369, -1, 37, -20, -356, -33, 77, 5, -16, 72, -500, -33, 138, 10, -472, -161, -110, 1, 64, 140, -295, 36, 110, 32, -483, -375, -150, 136, -18, 75, -301, -5, 140, 124, -459, -328, -147, -6, 49, -43, -141, -54, 66, 92, -384, -60, -174, -147, 10, 162, -105, -34, -101, 75, -175, 77, -164, -354, -29, 237, -41, -101, -133, 43, -205, 208, 69, -497, 47, 145, -62, -21, -107, 32, 37, 241, -51, -347, 161, 27, 41, 87, -277, -55, -25, 296, -200, -363, 108, -25, 61, 184, -407, 128, -41, 407, -165, -211, 263, 214, 34, 255, -361, -24, 35, 537, -274, -166, 204, 167, 92, 116, -471, -48, -73, 293, -364, -312, 235, 314, 36, 175, -279, 63, 19, 97, -257, -194, 204, 39, -71, 103, -213, 5, -147, -37, -307, -27, -57, -84, -15, -81, -264, 167, -194, -91, -166, -24, -98, -134, -81, -43, -109, 220, -213, -235, -115, 38, -146, -119, 12, 104, -45, 186, -123, -126, -443, 62, -238, -324, -120, 179, -115, 294, -183, -141, -714, -85, -186, -233, -37, 172, -166, 152, -251, -518, -590, -133, -182, -154, -59, 173, -85, 221, -141, -582, -288, -56, -215, -41, 24, 110, -244, 169, -367, -225, -298, 33, -333, -7, 59, 202, -204, 167, -424, -435, -307, 36, -241, 34, -222, 46, -218, 147, -328, -548, 0, -111, -301, -127, -130, 177, -155, 208, -400, -400, -276, -40, -360, -67, -312, 70, -187, 144, -356, -412, -361, 42, -292, 79, -70, 173, -322, 179, -459, -495, -493, -49, -302, 24, -41, 273, -389, 151, -522, -277, -315, 33, -259, -95, -134, 110, -270, 179, -340, -293, -249, 205, -571, -63, -115, 263, -263, 94, -294, -74, -288, 8, -323, 60, -100, 135, -338, 205, -235, 103, -248, -2, -275, -47, -52, 176, -307, 176, -289, 73, -344, -43, -434, 138, -81, 163, -271, -41, -180, 329, -494, -298, -90, 9, -5, -79, 3, 148, -37, 293, -304, -429, 99, 54, -4, 209, -139, 59, 17, 434, -117, -379, 261, 234, 55, 170, -103, -18, 49, 480, -4, -404, 199, 295, 64, 256, -307, -63, -12, 542, -166, -232, 122, 206, -72, 260, -462, -10], "dense_bias": [-146663, 614922, -89605, -336684, 226681, 476296, 5570, 359890, -654400, -100228]} \ No newline at end of file diff --git a/package.json b/package.json index efb5df3..987bccf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "circomlib-ml", - "version": "1.0.0", + "version": "1.0.1", "description": "Circuits library for machine learning in circom", "main": "index.js", "directories": { diff --git a/test/circuits/ReLU_test.circom b/test/circuits/ReLU_test.circom index 113be2a..eb50256 100644 --- a/test/circuits/ReLU_test.circom +++ b/test/circuits/ReLU_test.circom @@ -2,4 +2,18 @@ pragma circom 2.0.3; include "../../circuits/ReLU.circom"; -component main = ReLU(1,3); \ No newline at end of file +template relu_test() { + signal input in[3]; + signal output out[3]; + + component relu[3]; + + for (var i=0; i<3; i++) { + relu[i] = ReLU(); + + relu[i].in <== in[i]; + out[i] <== relu[i].out; + } +} + +component main = relu_test(); \ No newline at end of file diff --git a/test/circuits/mnist_test.circom b/test/circuits/mnist_test.circom new file mode 100644 index 0000000..b9b3251 --- /dev/null +++ b/test/circuits/mnist_test.circom @@ -0,0 +1,60 @@ +pragma circom 2.0.3; + +include "../../circuits/Conv2D.circom"; +include "../../circuits/Dense.circom"; +include "../../circuits/ArgMax.circom"; +include "../../circuits/ReLU.circom"; + +template mnist() { + signal input in[28][28][1]; + signal input conv2d_weights[3][3][1][1]; + signal input conv2d_bias[1]; + signal input dense_weights[676][10]; + signal input dense_bias[10]; + signal output out; + + component conv2d = Conv2D(28,28,1,1,3); + component relu[26*26]; + component dense = Dense(676,10); + component argmax = ArgMax(10); + + for (var i=0; i<28; i++) { + for (var j=0; j<28; j++) { + conv2d.in[i][j][0] <== in[i][j][0]; + } + } + + for (var i=0; i<3; i++) { + for (var j=0; j<3; j++) { + conv2d.weights[i][j][0][0] <== conv2d_weights[i][j][0][0]; + } + } + + conv2d.bias[0] <== conv2d_bias[0]; + + var idx = 0; + + for (var i=0; i<26; i++) { + for (var j=0; j<26; j++) { + relu[idx] = ReLU(); + relu[idx].in <== conv2d.out[i][j][0]; + dense.in[idx] <== relu[idx].out; + for (var k=0; k<10; k++) { + dense.weights[idx][k] <== dense_weights[idx][k]; + } + idx++; + } + } + + for (var i=0; i<10; i++) { + dense.bias[i] <== dense_bias[i]; + } + + for (var i=0; i<10; i++) { + argmax.in[i] <== dense.out[i]; + } + + out <== argmax.out; +} + +component main = mnist(); \ No newline at end of file diff --git a/test/circuits/model1_test.circom b/test/circuits/model1_test.circom index 4877737..f993c06 100644 --- a/test/circuits/model1_test.circom +++ b/test/circuits/model1_test.circom @@ -10,7 +10,7 @@ template model1() { signal output out; component Dense32 = Dense(3,2); - component relu = ReLU(2,1); + component relu[2]; component Dense21 = Dense(2,1); for (var i=0; i<3; i++) { @@ -25,11 +25,12 @@ template model1() { } for (var i=0; i<2; i++) { - relu.in[i][0] <== Dense32.out[i]; + relu[i] = ReLU(); + relu[i].in <== Dense32.out[i]; } for (var i=0; i<2; i++) { - Dense21.in[i] <== relu.out[i][0]; + Dense21.in[i] <== relu[i].out; Dense21.weights[i][0] <== Dense21weights[i][0]; } diff --git a/test/mnist.js b/test/mnist.js new file mode 100644 index 0000000..10a11e3 --- /dev/null +++ b/test/mnist.js @@ -0,0 +1,60 @@ +const chai = require("chai"); +const path = require("path"); + +const wasm_tester = require("circom_tester").wasm; + +const F1Field = require("ffjavascript").F1Field; +const Scalar = require("ffjavascript").Scalar; +exports.p = Scalar.fromString("21888242871839275222246405745257275088548364400416034343698204186575808495617"); +const Fr = new F1Field(exports.p); + +const assert = chai.assert; + +const json = require("../models/mnist_input.json"); + +describe("mnist test", function () { + this.timeout(100000000); + + it("should return correct output", async () => { + const circuit = await wasm_tester(path.join(__dirname, "circuits", "mnist_test.circom")); + await circuit.loadConstraints(); + assert.equal(circuit.nVars, 368866); + assert.equal(circuit.constraints.length, 362663); + + const conv2d_weights = []; + const conv2d_bias = []; + const dense_weights = []; + const dense_bias = []; + + for (var i=0; i