Files
zk-stats-lib/examples/pvariance/pvariance.ipynb
JernKunpittaya 3a7f57301b stdev & pstdev
2023-11-29 19:52:12 +07:00

511 lines
30 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: ezkl==5.0.8 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from -r ../../requirements.txt (line 1)) (5.0.8)\n",
"Requirement already satisfied: torch in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from -r ../../requirements.txt (line 2)) (2.1.1)\n",
"Requirement already satisfied: requests in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from -r ../../requirements.txt (line 3)) (2.31.0)\n",
"Requirement already satisfied: scipy in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from -r ../../requirements.txt (line 4)) (1.11.4)\n",
"Requirement already satisfied: numpy in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from -r ../../requirements.txt (line 5)) (1.26.2)\n",
"Requirement already satisfied: matplotlib in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from -r ../../requirements.txt (line 6)) (3.8.2)\n",
"Requirement already satisfied: statistics in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from -r ../../requirements.txt (line 7)) (1.0.3.5)\n",
"Requirement already satisfied: onnx in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from -r ../../requirements.txt (line 8)) (1.15.0)\n",
"Requirement already satisfied: filelock in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from torch->-r ../../requirements.txt (line 2)) (3.13.1)\n",
"Requirement already satisfied: networkx in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from torch->-r ../../requirements.txt (line 2)) (3.2.1)\n",
"Requirement already satisfied: fsspec in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from torch->-r ../../requirements.txt (line 2)) (2023.10.0)\n",
"Requirement already satisfied: sympy in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from torch->-r ../../requirements.txt (line 2)) (1.12)\n",
"Requirement already satisfied: typing-extensions in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from torch->-r ../../requirements.txt (line 2)) (4.8.0)\n",
"Requirement already satisfied: jinja2 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from torch->-r ../../requirements.txt (line 2)) (3.1.2)\n",
"Requirement already satisfied: urllib3<3,>=1.21.1 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from requests->-r ../../requirements.txt (line 3)) (2.1.0)\n",
"Requirement already satisfied: certifi>=2017.4.17 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from requests->-r ../../requirements.txt (line 3)) (2023.11.17)\n",
"Requirement already satisfied: charset-normalizer<4,>=2 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from requests->-r ../../requirements.txt (line 3)) (3.3.2)\n",
"Requirement already satisfied: idna<4,>=2.5 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from requests->-r ../../requirements.txt (line 3)) (3.6)\n",
"Requirement already satisfied: cycler>=0.10 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from matplotlib->-r ../../requirements.txt (line 6)) (0.12.1)\n",
"Requirement already satisfied: kiwisolver>=1.3.1 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from matplotlib->-r ../../requirements.txt (line 6)) (1.4.5)\n",
"Requirement already satisfied: fonttools>=4.22.0 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from matplotlib->-r ../../requirements.txt (line 6)) (4.45.1)\n",
"Requirement already satisfied: packaging>=20.0 in /Users/jernkun/Library/Python/3.10/lib/python/site-packages (from matplotlib->-r ../../requirements.txt (line 6)) (23.2)\n",
"Requirement already satisfied: python-dateutil>=2.7 in /Users/jernkun/Library/Python/3.10/lib/python/site-packages (from matplotlib->-r ../../requirements.txt (line 6)) (2.8.2)\n",
"Requirement already satisfied: contourpy>=1.0.1 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from matplotlib->-r ../../requirements.txt (line 6)) (1.2.0)\n",
"Requirement already satisfied: pillow>=8 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from matplotlib->-r ../../requirements.txt (line 6)) (10.1.0)\n",
"Requirement already satisfied: pyparsing>=2.3.1 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from matplotlib->-r ../../requirements.txt (line 6)) (3.1.1)\n",
"Requirement already satisfied: docutils>=0.3 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from statistics->-r ../../requirements.txt (line 7)) (0.20.1)\n",
"Requirement already satisfied: protobuf>=3.20.2 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from onnx->-r ../../requirements.txt (line 8)) (4.25.1)\n",
"Requirement already satisfied: six>=1.5 in /Users/jernkun/Library/Python/3.10/lib/python/site-packages (from python-dateutil>=2.7->matplotlib->-r ../../requirements.txt (line 6)) (1.16.0)\n",
"Requirement already satisfied: MarkupSafe>=2.0 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from jinja2->torch->-r ../../requirements.txt (line 2)) (2.1.3)\n",
"Requirement already satisfied: mpmath>=0.19 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from sympy->torch->-r ../../requirements.txt (line 2)) (1.3.0)\n",
"\u001b[33mWARNING: You are using pip version 21.2.3; however, version 23.3.1 is available.\n",
"You should consider upgrading via the '/usr/local/bin/python3 -m pip install --upgrade pip' command.\u001b[0m\n",
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"pip install -r ../../requirements.txt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import ezkl\n",
"import torch\n",
"from torch import nn\n",
"import json\n",
"import os\n",
"import time\n",
"import scipy\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import statistics\n",
"import math"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Export model\n",
"def export_onnx(model, data_tensor_array, model_loc):\n",
" circuit = model()\n",
"\n",
" device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
"\n",
" # print(device)\n",
"\n",
" circuit.to(device)\n",
"\n",
" # Flips the neural net into inference mode\n",
" circuit.eval()\n",
" input_names = []\n",
" dynamic_axes = {}\n",
"\n",
" data_tensor_tuple = ()\n",
" for i in range(len(data_tensor_array)):\n",
" data_tensor_tuple += (data_tensor_array[i],)\n",
" input_index = \"input\"+str(i+1)\n",
" input_names.append(input_index)\n",
" dynamic_axes[input_index] = {0 : 'batch_size'}\n",
" dynamic_axes[\"output\"] = {0 : 'batch_size'}\n",
"\n",
" # Export the model\n",
" torch.onnx.export(circuit, # model being run\n",
" data_tensor_tuple, # model input (or a tuple for multiple inputs)\n",
" model_loc, # where to save the model (can be a file or file-like object)\n",
" export_params=True, # store the trained parameter weights inside the model file\n",
" opset_version=11, # the ONNX version to export the model to\n",
" do_constant_folding=True, # whether to execute constant folding for optimization\n",
" input_names = input_names, # the model's input names\n",
" output_names = ['output'], # the model's output names\n",
" dynamic_axes=dynamic_axes)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# mode is either \"accuracy\" or \"resources\"\n",
"\n",
"def gen_settings(comb_data_path, onnx_filename, scale, mode, settings_filename):\n",
" print(\"==== Generate & Calibrate Setting ====\")\n",
" # Set input to be Poseidon Hash, and param of computation graph to be public\n",
" # Poseidon is not homomorphic additive, maybe consider Pedersens or Dory commitment.\n",
" gip_run_args = ezkl.PyRunArgs()\n",
" gip_run_args.input_visibility = \"hashed\" # matrix and generalized inverse commitments\n",
" gip_run_args.output_visibility = \"public\" # no parameters used\n",
" gip_run_args.param_visibility = \"private\" # should be Tensor(True)--> to enforce arbitrary data in w\n",
"\n",
" # generate settings\n",
" ezkl.gen_settings(onnx_filename, settings_filename, py_run_args=gip_run_args)\n",
" if scale ==\"default\":\n",
" ezkl.calibrate_settings(\n",
" comb_data_path, onnx_filename, settings_filename, mode)\n",
" else:\n",
" ezkl.calibrate_settings(\n",
" comb_data_path, onnx_filename, settings_filename, mode, scales = scale)\n",
"\n",
" assert os.path.exists(settings_filename)\n",
" assert os.path.exists(comb_data_path)\n",
" assert os.path.exists(onnx_filename)\n",
" f_setting = open(settings_filename, \"r\")\n",
" print(\"scale: \", scale)\n",
" print(\"setting: \", f_setting.read())\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def verifier_init(verifier_model, verifier_model_path, verifier_compiled_model_path, dummy_data_path_array, settings_path, srs_path, pk_path, vk_path, scale, mode):\n",
"\n",
" # load data from dummy_data_path_array into dummy_data_array\n",
" dummy_data_tensor_array = []\n",
" comb_dummy_data = []\n",
" for path in dummy_data_path_array:\n",
" dummy_data = np.array(json.loads(open(path, \"r\").read())[\"input_data\"][0])\n",
" # print(\"dumm: \", dummy_data)\n",
" dummy_data_tensor_array.append(torch.reshape(torch.tensor(dummy_data), (1, len(dummy_data),1 )))\n",
" comb_dummy_data.append(dummy_data.tolist())\n",
" # export onnx file\n",
" export_onnx(verifier_model,dummy_data_tensor_array, verifier_model_path)\n",
"\n",
" comb_dummy_data_path = os.path.join('generated/comb_dummy_data.json')\n",
" # Serialize data into file:\n",
" json.dump(dict(input_data = comb_dummy_data), open(comb_dummy_data_path, 'w' ))\n",
"\n",
" # gen + calibrate setting\n",
" gen_settings(comb_dummy_data_path, verifier_model_path, scale, mode, settings_path)\n",
"\n",
" # compile circuit\n",
" res = ezkl.compile_circuit(verifier_model_path, verifier_compiled_model_path, settings_path)\n",
" assert res == True\n",
"\n",
" # srs path\n",
" res = ezkl.get_srs(srs_path, settings_path)\n",
"\n",
" # setupt vk, pk param for use..... prover can use same pk or can init their own!\n",
" print(\"==== setting up ezkl ====\")\n",
" start_time = time.time()\n",
" res = ezkl.setup(\n",
" verifier_compiled_model_path,\n",
" vk_path,\n",
" pk_path,\n",
" srs_path)\n",
" end_time = time.time()\n",
" time_setup = end_time -start_time\n",
" print(f\"Time setup: {time_setup} seconds\")\n",
"\n",
" assert res == True\n",
" assert os.path.isfile(vk_path)\n",
" assert os.path.isfile(pk_path)\n",
" assert os.path.isfile(settings_path)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": []
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def prover_gen(prover_model, data_path_array, witness_path, prover_model_path, prover_compiled_model_path, settings_path, proof_path):\n",
" # load data from data_path\n",
" # data = json.loads(open(data_path, \"r\").read())[\"input_data\"][0]\n",
" # data_tensor = torch.reshape(torch.tensor(data), (1, len(data),1 ))\n",
"\n",
"\n",
" data_tensor_array = []\n",
" comb_data = []\n",
" for path in data_path_array:\n",
" data = np.array(json.loads(open(path, \"r\").read())[\"input_data\"][0])\n",
" # print(\"dumm: \", dummy_data)\n",
" data_tensor_array.append(torch.reshape(torch.tensor(data), (1, len(data),1 )))\n",
" comb_data.append(data.tolist())\n",
"\n",
" # export onnx file\n",
" export_onnx(prover_model, data_tensor_array, prover_model_path)\n",
"\n",
" comb_data_path = os.path.join('generated/comb_data.json')\n",
" # Serialize data into file:\n",
" json.dump(dict(input_data = comb_data), open(comb_data_path, 'w' ))\n",
"\n",
" res = ezkl.compile_circuit(prover_model_path, prover_compiled_model_path, settings_path)\n",
" assert res == True\n",
" # now generate the witness file\n",
" print('==== Generating Witness ====')\n",
" witness = ezkl.gen_witness(comb_data_path, prover_compiled_model_path, witness_path)\n",
" assert os.path.isfile(witness_path)\n",
" # print(witness[\"outputs\"])\n",
" settings = json.load(open(settings_path))\n",
" output_scale = settings['model_output_scales']\n",
" print(\"witness boolean: \", ezkl.vecu64_to_float(witness['outputs'][0][0], output_scale[0]))\n",
" for i in range(len(witness['outputs'][1])):\n",
" print(\"witness result\", i+1,\":\", ezkl.vecu64_to_float(witness['outputs'][1][i], output_scale[1]))\n",
"\n",
" # GENERATE A PROOF\n",
" print(\"==== Generating Proof ====\")\n",
" start_time = time.time()\n",
" res = ezkl.prove(\n",
" witness_path,\n",
" prover_compiled_model_path,\n",
" pk_path,\n",
" proof_path,\n",
" srs_path,\n",
" \"single\",\n",
" )\n",
"\n",
" print(\"proof: \" ,res)\n",
" end_time = time.time()\n",
" time_gen_prf = end_time -start_time\n",
" print(f\"Time gen prf: {time_gen_prf} seconds\")\n",
" assert os.path.isfile(proof_path)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def verifier_verify(proof_path, settings_path, vk_path, srs_path):\n",
" # enforce boolean statement to be true\n",
" settings = json.load(open(settings_path))\n",
" output_scale = settings['model_output_scales']\n",
"\n",
" proof = json.load(open(proof_path))\n",
" num_inputs = len(settings['model_input_scales'])\n",
" print(\"num_inputs: \", num_inputs)\n",
" proof[\"instances\"][0][num_inputs] = ezkl.float_to_vecu64(1.0, output_scale[0])\n",
" json.dump(proof, open(proof_path, 'w'))\n",
"\n",
" print(\"prf instances: \", proof['instances'])\n",
"\n",
" print(\"proof boolean: \", ezkl.vecu64_to_float(proof['instances'][0][num_inputs], output_scale[0]))\n",
" for i in range(num_inputs+1, len(proof['instances'][0])):\n",
" print(\"proof result\",i-num_inputs,\":\", ezkl.vecu64_to_float(proof['instances'][0][i], output_scale[1]))\n",
"\n",
"\n",
" res = ezkl.verify(\n",
" proof_path,\n",
" settings_path,\n",
" vk_path,\n",
" srs_path,\n",
" )\n",
"\n",
" assert res == True\n",
" print(\"verified\")"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# init path\n",
"os.makedirs(os.path.dirname('generated/'), exist_ok=True)\n",
"verifier_model_path = os.path.join('generated/verifier.onnx')\n",
"prover_model_path = os.path.join('generated/prover.onnx')\n",
"verifier_compiled_model_path = os.path.join('generated/verifier.compiled')\n",
"prover_compiled_model_path = os.path.join('generated/prover.compiled')\n",
"pk_path = os.path.join('generated/test.pk')\n",
"vk_path = os.path.join('generated/test.vk')\n",
"proof_path = os.path.join('generated/test.pf')\n",
"settings_path = os.path.join('generated/settings.json')\n",
"srs_path = os.path.join('generated/kzg.srs')\n",
"witness_path = os.path.join('generated/witness.json')"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"======================= ZK-STATS FLOW ======================="
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"data_path = os.path.join('data.json')\n",
"dummy_data_path = os.path.join('generated/dummy_data.json')\n",
"\n",
"f_raw_input = open(data_path, \"r\")\n",
"data = json.loads(f_raw_input.read())[\"input_data\"][0]\n",
"data_tensor = torch.reshape(torch.tensor(data),(1, len(data), 1))\n",
"\n",
"# dummy data for data consumer: make the bound approx same as real data\n",
"dummy_data = np.random.uniform(min(data), max(data), len(data))\n",
"json.dump({\"input_data\":[dummy_data.tolist()]}, open(dummy_data_path, 'w'))\n",
"\n",
"dummy_data_tensor = torch.reshape(torch.tensor(dummy_data), (1, len(dummy_data),1 ))"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"dummy_theory_output = torch.var(dummy_data_tensor, correction = 0)\n",
"dummy_data_mean = torch.mean(dummy_data_tensor)\n",
"# print(dummy_theory_output)\n",
"# print(torch.sum(torch.pow(dummy_data_tensor-torch.mean(dummy_data_tensor), 2))/(dummy_data_tensor.size()[1]-1))"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/torch/onnx/symbolic_opset9.py:2174: FutureWarning: 'torch.onnx.symbolic_opset9._cast_Bool' is deprecated in version 2.0 and will be removed in the future. Please Avoid using this function and create a Cast node instead.\n",
" return fn(g, to_cast_func(g, input, False), to_cast_func(g, other, False))\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"==== Generate & Calibrate Setting ====\n",
"scale: [0]\n",
"setting: {\"run_args\":{\"tolerance\":{\"val\":0.0,\"scale\":1.0},\"input_scale\":0,\"param_scale\":0,\"scale_rebase_multiplier\":10,\"lookup_range\":[-8,38396],\"logrows\":16,\"num_inner_cols\":1,\"variables\":[[\"batch_size\",1]],\"input_visibility\":{\"Hashed\":{\"hash_is_public\":true,\"outlets\":[]}},\"output_visibility\":\"Public\",\"param_visibility\":\"Private\"},\"num_rows\":14432,\"total_assignments\":1515,\"total_const_size\":1,\"model_instance_shapes\":[[1],[1]],\"model_output_scales\":[0,0],\"model_input_scales\":[0],\"module_sizes\":{\"kzg\":[],\"poseidon\":[14432,[1]],\"elgamal\":[0,[0]]},\"required_lookups\":[\"Abs\",{\"Div\":{\"denom\":100.0}},{\"GreaterThan\":{\"a\":0.0}}],\"check_mode\":\"UNSAFE\",\"version\":\"5.0.8\",\"num_blinding_factors\":null}\n",
"==== setting up ezkl ====\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"spawning module 0\n",
"spawning module 2\n",
"spawning module 0\n",
"spawning module 2\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Time setup: 5.371650218963623 seconds\n"
]
}
],
"source": [
"# Verifier/ data consumer side:\n",
"class verifier_model(nn.Module):\n",
" def __init__(self):\n",
" super(verifier_model, self).__init__()\n",
" # w represents mean in this case\n",
" self.w = nn.Parameter(data = dummy_theory_output, requires_grad = False)\n",
" self.data_mean = nn.Parameter(data = dummy_data_mean, requires_grad = False)\n",
"\n",
" def forward(self,X):\n",
" # some expression of tolerance to error in the inference\n",
" return (torch.logical_and(torch.abs(torch.sum((X-self.data_mean)*(X-self.data_mean))-self.w*X.size()[1])<0.01*self.w*X.size()[1],torch.abs(torch.sum(X)-X.size()[1]*(self.data_mean))<0.01*torch.sum(X) ),self.w)\n",
"\n",
"verifier_init(verifier_model, verifier_model_path, verifier_compiled_model_path, [dummy_data_path], settings_path, srs_path, pk_path, vk_path,[0], \"resources\")"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"theory output: tensor(211.8691)\n",
"==== Generating Witness ====\n",
"witness boolean: 1.0\n",
"witness result 1 : 212.0\n",
"==== Generating Proof ====\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"spawning module 0\n",
"spawning module 2\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"proof: {'instances': [[[10512373747352303962, 11798585516934984832, 13421675179368312123, 2200257403316998104], [12436184717236109307, 3962172157175319849, 7381016538464732718, 1011752739694698287], [13802304918419143583, 17632677359615874021, 16753034178384891922, 1784686540294826319]]], 'proof': '28e0ea05647b851eaddaebf759730ea3964426818798b3aac89a647a79ed4d7611b8fce3d2f1ab810dde3b3cf114112e16473a234898e967e6d3cfaf7ca963e70f3ac7321fe3ea0d4eb105c0819ad7f14c0d0f14377cfeb6d1536cf1b7bd23212722163f8c74b32056f43ab5c3b0f54f01bef0352266fb5118352451ab7d325a2eed9695df2cb7c0f83e4f2e71dbbd2617bc80050114d5f7936664715d5929282752e833ececc52bb044b7ca317c45814ca4a954e7e2e16fc77f6658a557271518366ed7f200a8142cc7f664b25536b9c45569539c86353a60055f101a19574027649318856975606b4182f61851df28ce77dd5467975582e0f0def4d49f0e1c0dd07d6afe15cc1072f4008c75640f1f55e700fedf7cdd69bae30f586e2379d41cc45425af485657ee4dba9ebb0c4f60b187ed23e3ed0c5dd245a7bd115590c9020d7306794e055ab7aed9928d70019e87922dc620c6048d06ea03716686d6620de2f3c670940194899a7b62d7709143f2fcc0cd8caaa715ebc0dbe1f70b2a7629f332df3ef8ae4d4721252403fe4fcfb996a7a530612961286953cd4106562b1f8a92e9f6d1d8d93c7608bc4f966ed1434c7dce9dd954ab260191e308d4d46d2781ab15abf0f9843ac7b2a78b79e8ed83a0749a6713ba965d5b6428babdfdcf08fc4426725b28e9b5b1985d1f75692aa1d1c271a088dd02006e5bc53c3a6561253c17ea9d505aa649ecfccdc96992e0e82c370d1bb982974cc25d8bacc8ef6304afa9c7d7c5fa3130ddaa779de80ff7bcb1020c807efafe5e8097bf7c101715037a106d212a08d2233b25b3bb92fbb27bd1b85498065b59f459eee71253d04c2810928b1d0778821f97ee3e2b5ca882813885310a07ac53c25271ca45b1e322194fb826ccaaf6740876639e4cec43565659048ad4023d67a615835cde913126007274fef36211fa6011144d9037fa2071e118513f358b68cb4670590d4843e62134809a6ef9ce08c69ea847f8ce87f55313885143aeb7080fd40154ef222e73192c3f349e74c32e4cd99f5f3ae2f00e826cc235d41f71f191304dee3e88c6470c02031944963a84af68233964c88e540a7463ac902a14d21cbea599597b43872d12971ebb5929c247b99ab86b17a73bee554cb86d1d72faf2e4396021e049500262623d7e5937367ec1f4481f9d9e5f68c983aca220e812aa3306f524f5f6781f548b2e1e2b600fa17130142b1905e8f04ad83451007ee0586f37ce63171d4c125305915183b8a7592cabdf759c21dd1c2dd5d9f448446770b452636834bd8f26d7dc7e2679ccd48487e6c5f699e01b6dd57fc32bc67855432860cd11ca7d222e1b4a65e4126b1992ef637c26c8e2091a3c605670c9ed6df480b21a86d8daa322f8c3630444c6de004411297c3d52b636cf228d17ef1991b7643881300277bf12097c39477153ccbf93e410864d87afd5cd0487a0d298c67c5c7c4d477df9a80bbf08bc656aa0a998f794c70ad51c1705b6fc2b332902cfc24b418ae96e883521d185508c08e106e32d205c3112c4a3d76a805b014eef73756fd0de74eb8a1f076e5545bd9b72b1537ffc3a677210ea9b096abb04b46286e8d4e60cb5613615227f106cc12e259000f86304472aa5399c6a072fb9d885fcf9adf511dc3b4f812850af052aa4c3cbead805349696b7c70162faa70df77d2d0418732e83917a8d1d72e90bde82d4c8e269335f6cc2972076050b50f05c72fe321bfefcce206ae31b884125941f95b0a4b3bfea071689a71f0a34adca47e0b13f24ea27685ca63e1c59f7ccca6bc717113e7edd9eb20dd9bc0ee3c5c65b36ed59835649f61ce3981b57fc96fd66c66ccb938634338de155a9ca57e14ebaa5ef7093b7a276250dad19d3884bea174758527a5b974c9698a32eb5f3ac030942b8553a0a86811cd046265b644688ba519ddd565438d0d280761d81dd91597855b2bf0e4f5e6ba3232c028d95079f876f5d9e6cfb12bef4048af87496800685b358cc71947519c62a8e0244ffaf80510da1a9039802dc96c18e090dd86241a60c847e13afd12cc5e56c20152869f3cc8e5f41cd055b663638970712172f72003dcc162a51e2def0f1042aac10dcd5941117fc06b3823460b4a713d08daee75b3ac851ac614b9a53dd652932d0dba3335cefe2aa81e34789eae7aa70dfc6f3a88139359ffd05acac0f301c65bd5f65fa46f4ded5a7d429d5276212592d0d7139d164d0ba2b836737131f1549b5e7c43e1aa2d3a07de87e52f2665dc670be9d4413a17342b2e327ee5efd1bc35e515b492f9eed05aadedf92d604c5fd4ce49ab50131ba0e7cbf846b0ca20a2d8ff8e5c59f91ff7a733330870e4ec08ec5bc84d9b7ea969389a7caffff6211f92149ddbf063982a355e5b29a9fe966792d1850a462307a48d7aedc7ad7340ac52fbd4447e759d1df8492b77f4ff23d47a9ea4f28dbe2886ca833e07b549b11e9c0bb4850d5620f257718c06811d74aa28a12561170c95bf42f93ba42cfbc2b08001b9b9943e900dacf71f49e5eb14af61ef9b31a68fab473ced2de19e5c81a63bf2003250c3d43722c8739bd193447c610d258248b3ae9b35755a0e821a31d20b265b0b0a235a59f731655aab3c8b6d4cf55f85453973ee44dec00cb00750bd8be97e06b8cd6e660279a51f9f5d12ec4697244db24d89b875799a440d25400d8adb3b622d378a23c4ffe09c92062cb5af7835d71977edd76d951de4c47ed3041365e11eb623a49adb55ac3f6bad58832ae6a0e6816bd1395e905cf61e70a2189b3c6d69602b66b01f0927c55645288466b2697223b0b3ac8b30a1b7475f30cff613bb7233d912c76d0bd321c503b8d0e9b97748c01722375ecc86a926aff00dd99634a0e30740fc4f3cbff575837ce9cfbb3ee335a53b43fc126b8bd7ebc19a6d4bfba6bc943b61b5f352cfc568afecb6214c24257da82d0d988f88f9a962a10d8a2ea5ef19347c9c173a0e3afb4bb59d27a9186e97240eacec9df43e8b02acc9559d6d55c0fa5a0fc7ad8078276123dde5ce06fe23cc9d696d8f06012f3161d240b95810e8eae54d75882600f1999b7b748e9d5db643f9c2e89661b76a71169a31161743769d5b3e4f4e33f721266381144e28ba5e18fe8fac79f7c3e4711e3ecb99df854ce6a4a4647392aff5e1bddddcee4df252a531c422e3fd99a7a2ae871889b0d613e73f285440a9d20db8bb19045d51f7d36466c10892d4e903e0220367f191aeb43ff23f262ba12c63c7b87db29f3b2dbff636f9c7221a468ba12c96a683112dd04a837ae4ba2c6d0c7e0f096c1123ec4dfafda3d1f9cca8c4c202edada70e6a38cb8076f7604ec77f5be32cbfc4d72e91d83ebe103c138927a2fe44e8e876230cf09ebadbfdf61f6f1b79f3be8cabdf978b010d803be83883f15a8455a50fa75f8db648aa5c0b8a2a8d906f8a176fc87a7ade23c0c95326e090aaad643577399862bfdad2b54999b9cfdf33a776b901cc40f629acef8103395050c35bd706ec65315fe2d897ea9842d0a4bfa9a459d375574a886225a39e6e614e4d59715122fc80a08bf96141f573465446000748a85a417b2b6b66f06425527b7d8d8b8bf7ffbe02ae9655a98ddb5c8bdef35be327cb29b07501a7663425313ab13e1c78f9349cdf0db70b39b9318aa858d211714132d25ab7981c007020b2928d09a27d4d3d849901334cb2b61bff1805a8b82e1cc2918ada324ee7161c41d3d11c438c596258831ec58955feae9f30e4da133557e721f0425e7f3d1d0c40514602127f763e8929b1f2aa39014aca303deea248acd862b1a5be83477bdd014edcd9898a1ed936ec93257c3e16a59536d47b11663e0cd342b19ed68a3f29e203ad099f8659629442bafdf9e94a889943929583da33f936c729b2707d973c22910ea23a8dcba99533f656052a872f1d595a703814aa91976115c21a96749cc039cbc0d7073b150d953d6a97801c2a70dd36aa46f1c8541c6ab08e3fb3be0d1026e7c4beb36465d24d276c48ee1ea52b00a5b8cf2344dd503f1bf2be899171c2c1c8f226faeb11ff3eac72447fece951d77eb90dd9a1d70b60045aa06af72121b7c5127c947f2ca8bda96fd9ada35dac21b90eb8cb304f2033fd641428651272269332e6adfb934b541ed1146c8a526997b6e8ccb9baef3b54a273d310d8c49276ac6168d11829712f5c3d050554ab4b692bbeec8e576f97af205053aecab012d4eba15b85805cb4ff36da62420165088cccc54b8bec3f6e2bd50fc40bc4ed91b553ba526bb680f82eb3b465c550e93527baa2e1d583849bea4dc4ad858139716afb703d55974ea648702a56f387f9cafd26838d773f1728c06db9be100718220479afb84e19d6e4b3cab355a8fb8c221a0b6fd8646d9b21ea25cf65bdf2a45235ab38c9796d6f612b58c6f77f23d3fd85c063c02557ee67d2b7f1bc7ed347f1fd63326d296fd2a9218cff51057509464d3192aa496cdbb889213a524a3aa9201fdfed1101964ee8fe00d63797cb5ba8756a68fab02bd9a19c1bf75f67dcb6e1114e2dc66ab9e59359dc05a7f91781c305849f81db09b5cf60d5fc6136ce845', 'transcript_type': 'EVM'}\n",
"Time gen prf: 6.663037061691284 seconds\n"
]
}
],
"source": [
"# Prover/ data owner side\n",
"theory_output = torch.var(data_tensor, correction = 0)\n",
"data_mean = torch.mean(data_tensor)\n",
"print(\"theory output: \", theory_output)\n",
"class prover_model(nn.Module):\n",
" def __init__(self):\n",
" super(prover_model, self).__init__()\n",
" # w represents mean in this case\n",
" self.w = nn.Parameter(data = theory_output, requires_grad = False)\n",
" self.data_mean = nn.Parameter(data = data_mean, requires_grad = False)\n",
" def forward(self,X):\n",
" # some expression of tolerance to error in the inference\n",
" return (torch.logical_and(torch.abs(torch.sum((X-self.data_mean)*(X-self.data_mean))-self.w*X.size()[1])<0.01*self.w*X.size()[1],torch.abs(torch.sum(X)-X.size()[1]*(self.data_mean))<0.01*torch.sum(X)),self.w)\n",
"prover_gen(prover_model, [data_path], witness_path, prover_model_path, prover_compiled_model_path, settings_path, proof_path)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"num_inputs: 1\n",
"prf instances: [[[10512373747352303962, 11798585516934984832, 13421675179368312123, 2200257403316998104], [12436184717236109307, 3962172157175319849, 7381016538464732718, 1011752739694698287], [13802304918419143583, 17632677359615874021, 16753034178384891922, 1784686540294826319]]]\n",
"proof boolean: 1.0\n",
"proof result 1 : 212.0\n",
"verified\n"
]
}
],
"source": [
"# Verifier verifies\n",
"verifier_verify(proof_path, settings_path, vk_path, srs_path)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.10.0"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}