From 5ec36093b7a29c6ddbe0018d28ff031afae9a105 Mon Sep 17 00:00:00 2001 From: Leonid Didukh Date: Sun, 20 Apr 2025 00:41:34 +0300 Subject: [PATCH 1/4] Added the Quantum Vision Transformer Implementation --- .../Quantum Vision Transformer.ipynb | 479 ++++++++++++++++++ 1 file changed, 479 insertions(+) create mode 100644 community/paper_implementation_project/Quantum Vision Transformer.ipynb diff --git a/community/paper_implementation_project/Quantum Vision Transformer.ipynb b/community/paper_implementation_project/Quantum Vision Transformer.ipynb new file mode 100644 index 000000000..1b04808d5 --- /dev/null +++ b/community/paper_implementation_project/Quantum Vision Transformer.ipynb @@ -0,0 +1,479 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "fb8f88e1-d493-4473-80cd-00042b61f868", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/authentication/token_manager.py:101: UserWarning: Device is already registered.\n", + "Generating a new refresh token should only be done if the current refresh token is compromised.\n", + "To do so, set the overwrite parameter to true\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "import classiq\n", + "classiq.authenticate()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "20d0b3d8-8de2-460b-93d2-bc805561c0c8", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/anaconda3/envs/baler/lib/python3.11/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 'dlopen(/opt/anaconda3/envs/baler/lib/python3.11/site-packages/torchvision/image.so, 0x0006): Symbol not found: __ZN3c1017RegisterOperatorsD1Ev\n", + " Referenced from: /opt/anaconda3/envs/baler/lib/python3.11/site-packages/torchvision/image.so\n", + " Expected in: /opt/anaconda3/envs/baler/lib/python3.11/site-packages/torch/lib/libtorch_cpu.dylib'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?\n", + " warn(\n" + ] + } + ], + "source": [ + "import torch\n", + "import numpy as np\n", + "import torch.nn as nn\n", + "import torch.optim as optim\n", + "from typing import List\n", + "import pdb\n", + "\n", + "from classiq import (\n", + " synthesize,\n", + " qfunc,\n", + " QArray,\n", + " QBit,\n", + " RX,\n", + " CArray,\n", + " Output,\n", + " CReal,\n", + " allocate,\n", + " repeat,\n", + " create_model,\n", + " show\n", + ")\n", + "\n", + "# choosing our data\n", + "import torchvision\n", + "import torchvision.transforms as transforms\n", + "import math\n", + "from classiq.applications.qnn.types import SavedResult\n", + "from classiq.applications.qnn import QLayer\n", + "from classiq.qmod.symbolic import pi\n", + "from classiq.synthesis import SerializedQuantumProgram" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "634a20e6-3b46-4907-84f7-27ab3f473417", + "metadata": {}, + "outputs": [], + "source": [ + "from classiq.execution import (\n", + " ExecutionPreferences,\n", + " execute_qnn,\n", + " set_quantum_program_execution_preferences,\n", + ")\n", + "from classiq.synthesis import SerializedQuantumProgram\n", + "from classiq.applications.qnn.types import (\n", + " MultipleArguments,\n", + " ResultsCollection,\n", + " SavedResult,\n", + ")\n", + "\n", + "\n", + "from classiq.applications.qnn.types import (\n", + " MultipleArguments,\n", + " ResultsCollection,\n", + " SavedResult,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "91d168c1-d9da-4c10-a728-a179f3abc9db", + "metadata": {}, + "outputs": [], + "source": [ + "N_QUBITS = 4\n", + "num_shots = 1024" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "5d172b4f-c317-4759-ad63-74b2eb4fa87d", + "metadata": {}, + "outputs": [], + "source": [ + "def execute(\n", + " quantum_program: SerializedQuantumProgram, arguments: MultipleArguments\n", + ") -> ResultsCollection:\n", + " quantum_program = set_quantum_program_execution_preferences(\n", + " quantum_program, preferences=ExecutionPreferences(num_shots=num_shots)\n", + " )\n", + " return execute_qnn(quantum_program, arguments)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "b98e5452-3bc8-4aa0-beee-cc6d0c3cb994", + "metadata": {}, + "outputs": [], + "source": [ + "def post_process(result: SavedResult) -> torch.Tensor:\n", + " res = result.value\n", + " yvec = [\n", + " (res.counts_of_qubits(k)[\"1\"] if \"1\" in res.counts_of_qubits(k) else 0)\n", + " / num_shots\n", + " for k in range(N_QUBITS)\n", + " ]\n", + "\n", + " return torch.tensor(yvec)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2bb9e435-d050-468a-a61f-0d14ce16eb9c", + "metadata": {}, + "outputs": [], + "source": [ + "def get_circuit():\n", + "\n", + " @qfunc\n", + " def vqc(input_: CArray[CReal, N_QUBITS], weight_: CArray[CArray[CReal, N_QUBITS], N_QUBITS], res: QArray[QBit]) -> None:\n", + " num_qubits = input_.len\n", + " num_qlayers = weight_.len\n", + " repeat(\n", + " count=num_qlayers,\n", + " iteration=lambda i: repeat(count=num_qubits, \n", + " iteration=lambda j:RX(pi * weight_[i][j], res[j]))\n", + " )\n", + " \n", + " @qfunc\n", + " def angle_embedding(input_: CArray[CReal, N_QUBITS], res: QArray[QBit]) -> None:\n", + " repeat(\n", + " count=input_.len,\n", + " iteration=lambda index: RX(pi * input_[index], res[index]),\n", + " )\n", + "\n", + " @qfunc\n", + " def main(input_: CArray[CReal, N_QUBITS], weight_: CArray[CArray[CReal, N_QUBITS], N_QUBITS], res: Output[QArray[QBit]]) -> None:\n", + " allocate(N_QUBITS, res)\n", + " angle_embedding(input_=input_, res=res)\n", + " vqc(input_=input_, weight_=weight_, res=res)\n", + " \n", + " qmod = create_model(main)\n", + " quantum_program = synthesize(qmod)\n", + " return quantum_program" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "00f92a77-0b94-4fe6-8f9b-2331d4f77939", + "metadata": {}, + "outputs": [], + "source": [ + "class Patchify(torch.nn.Module):\n", + " \"\"\"\n", + " Patchify layer implemented using the Conv2d layer\n", + " \"\"\"\n", + " def __init__(self, patch_size:int, hidden_size:int):\n", + " super(Patchify, self).__init__()\n", + " self.patch_size = patch_size\n", + " self.conv = torch.nn.Conv2d(in_channels=3, out_channels=hidden_size, kernel_size=self.patch_size, stride=self.patch_size)\n", + " self.hidden_size = hidden_size\n", + " \n", + " def forward(self, x:torch.Tensor):\n", + " bs, c, h, w = x.size()\n", + " self.num_patches = (h // self.patch_size) ** 2\n", + "\n", + " x = self.conv(x)\n", + " x = x.view(bs, self.num_patches, self.hidden_size)\n", + " return x\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "2849e3a5-3d01-42bf-ae4b-4c79375e8443", + "metadata": {}, + "outputs": [], + "source": [ + "class RotaryPositionalEmbedding(torch.nn.Module):\n", + " \"\"\"\n", + " Rotary Positional Embedding\n", + " \"\"\"\n", + " def __init__(self, d_model, max_seq_len):\n", + " super(RotaryPositionalEmbedding, self).__init__()\n", + "\n", + " # Create a rotation matrix.\n", + " self.rotation_matrix = torch.zeros(d_model, d_model)\n", + " for i in range(d_model):\n", + " for j in range(d_model):\n", + " self.rotation_matrix[i, j] = math.cos(i * j * 0.01)\n", + "\n", + " # Create a positional embedding matrix.\n", + " self.positional_embedding = torch.zeros(max_seq_len, d_model)\n", + " for i in range(max_seq_len):\n", + " for j in range(d_model):\n", + " self.positional_embedding[i, j] = math.cos(i * j * 0.01)\n", + "\n", + " def forward(self, x):\n", + " \"\"\"\n", + " Args:\n", + " x: A tensor of shape (batch_size, seq_len, d_model).\n", + "\n", + " Returns:\n", + " A tensor of shape (batch_size, seq_len, d_model).\n", + " \"\"\"\n", + "\n", + " # Add the positional embedding to the input tensor.\n", + " x += self.positional_embedding\n", + "\n", + " # Apply the rotation matrix to the input tensor.\n", + " x = torch.matmul(x, self.rotation_matrix)\n", + "\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "19042677-6d63-426c-b12d-9d107b47eecb", + "metadata": {}, + "outputs": [], + "source": [ + "class QuantumLayer(torch.nn.Module):\n", + " \"\"\"\n", + " Quantum Layer\n", + " \"\"\"\n", + " def __init__(self, in_dim, out_dim):\n", + " super(QuantumLayer, self).__init__()\n", + " self.quantum_program = get_circuit()\n", + " self.quantum_layer = QLayer(self.quantum_program, execute, post_process)\n", + "\n", + " def forward(self, x:torch.Tensor):\n", + " size = x.size()\n", + " x = x.view(-1, size[-1])\n", + " x = self.quantum_layer(x)\n", + " x = x.view(size)\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "376d717d-76bf-45bc-a90f-67d15a92f33a", + "metadata": {}, + "outputs": [], + "source": [ + "class FFN(torch.nn.Module):\n", + " \"\"\"\n", + " Feed Forward Network\n", + " \"\"\"\n", + " def __init__(self, in_dim, hidden_size):\n", + " super().__init__()\n", + " self.linear_1 = torch.nn.Linear(in_dim, hidden_size)\n", + " self.qlinear_1 = QuantumLayer(hidden_size, hidden_size)\n", + " self.dropout = torch.nn.Dropout(p=0.4)\n", + " self.linear_2 = torch.nn.Linear(hidden_size, in_dim)\n", + " return\n", + " \n", + " def forward(self, x:torch.Tensor):\n", + " x = self.linear_1(x)\n", + " x = self.qlinear_1(x)\n", + " x = self.dropout(x)\n", + " x = torch.nn.functional.gelu(x)\n", + " x = self.linear_2(x)\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "f2ffa889-38a6-425b-bf76-c1032406e6e3", + "metadata": {}, + "outputs": [], + "source": [ + "class qMHA(torch.nn.Module):\n", + " \"\"\"\n", + " Quantum Multihead Attention\n", + " \"\"\"\n", + " def __init__(self, in_dim:int, num_heads:int) -> None:\n", + " super().__init__()\n", + "\n", + " self.qK = QuantumLayer(in_dim, in_dim);\n", + " self.qQ = QuantumLayer(in_dim, in_dim);\n", + " self.qV = QuantumLayer(in_dim, in_dim);\n", + " self.dropout = torch.nn.Dropout(p=0.1)\n", + " \n", + " self.final_l = QuantumLayer(in_dim, in_dim)\n", + " self.num_heads = num_heads\n", + " self.in_dim = in_dim\n", + " \n", + " return\n", + "\n", + " def forward(self, X:torch.Tensor):\n", + "\n", + " dim = torch.sqrt(torch.Tensor([X.shape[-1]]))\n", + " attention = torch.nn.functional.softmax((1/dim)*self.qK(X))*self.qQ(X)*self.qV(X)\n", + " x = self.dropout(attention)\n", + " x = self.final_l(x)\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "426e1bed-2197-4d62-ba13-6215c466c97b", + "metadata": {}, + "outputs": [], + "source": [ + "class qTransformerEncoder(torch.nn.Module):\n", + " \"\"\"\n", + " Quantum Transformer Encoder Layer\n", + " \"\"\"\n", + " def __init__(self, in_dim:int, num_heads:int) -> None:\n", + " super().__init__()\n", + " self.layer_norm_1 = torch.nn.LayerNorm(normalized_shape=in_dim)\n", + " self.layer_norm_2 = torch.nn.LayerNorm(normalized_shape=in_dim)\n", + " \n", + " self.qMHA = qMHA(in_dim, num_heads)\n", + " self.qFFN = FFN(in_dim, hidden_size=in_dim)\n", + " self.dropout = torch.nn.Dropout(p=0.3)\n", + " \n", + "\n", + " def forward(self, X:torch.Tensor):\n", + " \n", + " x = self.qMHA(X)\n", + " x = self.layer_norm_1(x)\n", + " x = self.dropout(x) + X\n", + "\n", + " y = self.layer_norm_2(x)\n", + " y = self.qFFN(y)+y\n", + " \n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "e6a37ec6-d82c-4784-aa97-94bf80be78c1", + "metadata": {}, + "outputs": [], + "source": [ + "class QVT(torch.nn.Module):\n", + " \"\"\"\n", + " Quantum Vision Transformer;\n", + " \"\"\"\n", + " def __init__(self, patch_size, in_dim, hidden_size, num_heads, n_classes, n_layers) -> None:\n", + " super().__init__()\n", + " self.patch_formation = Patchify(patch_size=patch_size, hidden_size=hidden_size)\n", + " self.d_model = (in_dim//patch_size)**2\n", + " self.pos_encoding = RotaryPositionalEmbedding(hidden_size, self.d_model)\n", + " self.transformer_blocks = [qTransformerEncoder(hidden_size, num_heads) for i in range(n_layers)]\n", + " \n", + " self.n_classes = n_classes\n", + " self.final_normalization = torch.nn.LayerNorm(hidden_size)\n", + " self.final_layer = torch.nn.Linear(hidden_size, self.n_classes)\n", + "\n", + " def forward(self, x: torch.Tensor) -> torch.Tensor: \n", + " x = self.patch_formation(x)\n", + " x += self.pos_encoding(x)\n", + " for trans_block in self.transformer_blocks:\n", + " x = trans_block(x)\n", + " x = self.final_normalization(x)\n", + " x = x.mean(axis=1)\n", + " x = self.final_layer(x)\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "b57b43fe-0963-4576-95f3-55e7655858e4", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/zj/jmm9ywc51bb4p1pn12_23y340000gn/T/ipykernel_4329/535465168.py:22: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n", + " attention = torch.nn.functional.softmax((1/dim)*self.qK(X))*self.qQ(X)*self.qV(X)\n" + ] + } + ], + "source": [ + "x = torch.rand(32, 3, 16, 16)\n", + "qVisTransformer = QVT(patch_size=4, in_dim=16, hidden_size=4, num_heads=1, n_classes=10, n_layers=4)\n", + "res = qVisTransformer(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "86242cc3-2d4d-48e2-83c2-1ea397976faa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "torch.Size([32, 10])" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "res.size()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "79282b7f-cb02-4b20-a29a-51de390c2d17", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From d5a1f00f3fc573b50b591c4543930938ece5b798 Mon Sep 17 00:00:00 2001 From: Leonid Didukh Date: Wed, 23 Apr 2025 01:25:51 +0300 Subject: [PATCH 2/4] QVT with the MNIST Data for training --- .../Quantum Vision Transformer.ipynb | 211 +++++++++++------- 1 file changed, 130 insertions(+), 81 deletions(-) diff --git a/community/paper_implementation_project/Quantum Vision Transformer.ipynb b/community/paper_implementation_project/Quantum Vision Transformer.ipynb index 1b04808d5..c4e9085fa 100644 --- a/community/paper_implementation_project/Quantum Vision Transformer.ipynb +++ b/community/paper_implementation_project/Quantum Vision Transformer.ipynb @@ -2,21 +2,10 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "fb8f88e1-d493-4473-80cd-00042b61f868", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/authentication/token_manager.py:101: UserWarning: Device is already registered.\n", - "Generating a new refresh token should only be done if the current refresh token is compromised.\n", - "To do so, set the overwrite parameter to true\n", - " warnings.warn(\n" - ] - } - ], + "outputs": [], "source": [ "import classiq\n", "classiq.authenticate()" @@ -24,27 +13,17 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "20d0b3d8-8de2-460b-93d2-bc805561c0c8", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/anaconda3/envs/baler/lib/python3.11/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 'dlopen(/opt/anaconda3/envs/baler/lib/python3.11/site-packages/torchvision/image.so, 0x0006): Symbol not found: __ZN3c1017RegisterOperatorsD1Ev\n", - " Referenced from: /opt/anaconda3/envs/baler/lib/python3.11/site-packages/torchvision/image.so\n", - " Expected in: /opt/anaconda3/envs/baler/lib/python3.11/site-packages/torch/lib/libtorch_cpu.dylib'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?\n", - " warn(\n" - ] - } - ], + "outputs": [], "source": [ "import torch\n", "import numpy as np\n", "import torch.nn as nn\n", "import torch.optim as optim\n", "from typing import List\n", + "import tqdm\n", "import pdb\n", "\n", "from classiq import (\n", @@ -74,7 +53,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "634a20e6-3b46-4907-84f7-27ab3f473417", "metadata": {}, "outputs": [], @@ -107,12 +86,12 @@ "outputs": [], "source": [ "N_QUBITS = 4\n", - "num_shots = 1024" + "num_shots = 4096" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "5d172b4f-c317-4759-ad63-74b2eb4fa87d", "metadata": {}, "outputs": [], @@ -128,7 +107,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "b98e5452-3bc8-4aa0-beee-cc6d0c3cb994", "metadata": {}, "outputs": [], @@ -146,7 +125,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "2bb9e435-d050-468a-a61f-0d14ce16eb9c", "metadata": {}, "outputs": [], @@ -154,9 +133,10 @@ "def get_circuit():\n", "\n", " @qfunc\n", - " def vqc(input_: CArray[CReal, N_QUBITS], weight_: CArray[CArray[CReal, N_QUBITS], N_QUBITS], res: QArray[QBit]) -> None:\n", + " def vqc(input_: CArray[CReal, N_QUBITS], weight_: CArray[CArray[CReal, N_QUBITS], N_QUBITS], res: Output[QArray[QBit]]) -> None:\n", " num_qubits = input_.len\n", " num_qlayers = weight_.len\n", + " allocate(input_.len, res)\n", " repeat(\n", " count=num_qlayers,\n", " iteration=lambda i: repeat(count=num_qubits, \n", @@ -164,16 +144,18 @@ " )\n", " \n", " @qfunc\n", - " def angle_embedding(input_: CArray[CReal, N_QUBITS], res: QArray[QBit]) -> None:\n", + " def angle_embedding(input_: CArray[CReal, N_QUBITS], qbv: Output[QArray[QBit]]) -> None:\n", + " allocate(input_.len, qbv)\n", + "\n", " repeat(\n", " count=input_.len,\n", - " iteration=lambda index: RX(pi * input_[index], res[index]),\n", + " iteration=lambda index: RX(pi * input_[index], qbv[index]),\n", " )\n", "\n", " @qfunc\n", " def main(input_: CArray[CReal, N_QUBITS], weight_: CArray[CArray[CReal, N_QUBITS], N_QUBITS], res: Output[QArray[QBit]]) -> None:\n", - " allocate(N_QUBITS, res)\n", - " angle_embedding(input_=input_, res=res)\n", + " x = QArray(\"x\")\n", + " angle_embedding(input_=input_, qbv=x)\n", " vqc(input_=input_, weight_=weight_, res=res)\n", " \n", " qmod = create_model(main)\n", @@ -183,7 +165,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "00f92a77-0b94-4fe6-8f9b-2331d4f77939", "metadata": {}, "outputs": [], @@ -192,10 +174,10 @@ " \"\"\"\n", " Patchify layer implemented using the Conv2d layer\n", " \"\"\"\n", - " def __init__(self, patch_size:int, hidden_size:int):\n", + " def __init__(self, in_channels:int, patch_size:int, hidden_size:int):\n", " super(Patchify, self).__init__()\n", " self.patch_size = patch_size\n", - " self.conv = torch.nn.Conv2d(in_channels=3, out_channels=hidden_size, kernel_size=self.patch_size, stride=self.patch_size)\n", + " self.conv = torch.nn.Conv2d(in_channels=in_channels, out_channels=hidden_size, kernel_size=self.patch_size, stride=self.patch_size)\n", " self.hidden_size = hidden_size\n", " \n", " def forward(self, x:torch.Tensor):\n", @@ -210,7 +192,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "2849e3a5-3d01-42bf-ae4b-4c79375e8443", "metadata": {}, "outputs": [], @@ -254,7 +236,17 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, + "id": "5bbc585c-c3bc-4cbe-b63a-e927577080d8", + "metadata": {}, + "outputs": [], + "source": [ + "quantum_program = get_circuit()" + ] + }, + { + "cell_type": "code", + "execution_count": null, "id": "19042677-6d63-426c-b12d-9d107b47eecb", "metadata": {}, "outputs": [], @@ -265,8 +257,7 @@ " \"\"\"\n", " def __init__(self, in_dim, out_dim):\n", " super(QuantumLayer, self).__init__()\n", - " self.quantum_program = get_circuit()\n", - " self.quantum_layer = QLayer(self.quantum_program, execute, post_process)\n", + " self.quantum_layer = QLayer(quantum_program, execute, post_process)\n", "\n", " def forward(self, x:torch.Tensor):\n", " size = x.size()\n", @@ -278,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "376d717d-76bf-45bc-a90f-67d15a92f33a", "metadata": {}, "outputs": [], @@ -306,7 +297,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "f2ffa889-38a6-425b-bf76-c1032406e6e3", "metadata": {}, "outputs": [], @@ -340,7 +331,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "426e1bed-2197-4d62-ba13-6215c466c97b", "metadata": {}, "outputs": [], @@ -373,7 +364,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "id": "e6a37ec6-d82c-4784-aa97-94bf80be78c1", "metadata": {}, "outputs": [], @@ -382,9 +373,9 @@ " \"\"\"\n", " Quantum Vision Transformer;\n", " \"\"\"\n", - " def __init__(self, patch_size, in_dim, hidden_size, num_heads, n_classes, n_layers) -> None:\n", + " def __init__(self, in_channels, patch_size, in_dim, hidden_size, num_heads, n_classes, n_layers) -> None:\n", " super().__init__()\n", - " self.patch_formation = Patchify(patch_size=patch_size, hidden_size=hidden_size)\n", + " self.patch_formation = Patchify(in_channels=in_channels, patch_size=patch_size, hidden_size=hidden_size)\n", " self.d_model = (in_dim//patch_size)**2\n", " self.pos_encoding = RotaryPositionalEmbedding(hidden_size, self.d_model)\n", " self.transformer_blocks = [qTransformerEncoder(hidden_size, num_heads) for i in range(n_layers)]\n", @@ -393,7 +384,7 @@ " self.final_normalization = torch.nn.LayerNorm(hidden_size)\n", " self.final_layer = torch.nn.Linear(hidden_size, self.n_classes)\n", "\n", - " def forward(self, x: torch.Tensor) -> torch.Tensor: \n", + " def forward(self, x: torch.Tensor) -> torch.Tensor: \n", " x = self.patch_formation(x)\n", " x += self.pos_encoding(x)\n", " for trans_block in self.transformer_blocks:\n", @@ -406,44 +397,25 @@ }, { "cell_type": "code", - "execution_count": 21, - "id": "b57b43fe-0963-4576-95f3-55e7655858e4", + "execution_count": null, + "id": "b5e36d83-7aaa-4d7c-88a3-9cb59023ca13", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/var/folders/zj/jmm9ywc51bb4p1pn12_23y340000gn/T/ipykernel_4329/535465168.py:22: UserWarning: Implicit dimension choice for softmax has been deprecated. Change the call to include dim=X as an argument.\n", - " attention = torch.nn.functional.softmax((1/dim)*self.qK(X))*self.qQ(X)*self.qV(X)\n" - ] - } - ], + "outputs": [], "source": [ - "x = torch.rand(32, 3, 16, 16)\n", - "qVisTransformer = QVT(patch_size=4, in_dim=16, hidden_size=4, num_heads=1, n_classes=10, n_layers=4)\n", - "res = qVisTransformer(x)" + "from torchvision import datasets" ] }, { "cell_type": "code", - "execution_count": 22, - "id": "86242cc3-2d4d-48e2-83c2-1ea397976faa", + "execution_count": null, + "id": "7d76d0e7-dc24-40dc-ac59-d2332a466ae0", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "torch.Size([32, 10])" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "res.size()" + "transform=transforms.Compose([\n", + " transforms.ToTensor(), # first, convert image to PyTorch tensor\n", + " transforms.Normalize((0.1307,), (0.3081,)) # normalize inputs\n", + " ])" ] }, { @@ -452,7 +424,84 @@ "id": "79282b7f-cb02-4b20-a29a-51de390c2d17", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "#### Example with the MNIST Dataset:\n", + "\n", + "dataset1 = datasets.MNIST('../data', train=True, download=True,transform=transform)\n", + "dataset2 = datasets.MNIST('../data', train=False,transform=transform)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8772eb4c-075e-40a8-993b-2ec3faeb1b39", + "metadata": {}, + "outputs": [], + "source": [ + "train_loader = torch.utils.data.DataLoader(dataset1,batch_size=1)\n", + "test_loader = torch.utils.data.DataLoader(dataset2,batch_size=1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dc61ea1e-0cfa-4498-b5ec-eab29b102750", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "clf = QVT(in_channels=1, patch_size=7, in_dim=28, hidden_size=4, num_heads=1, n_classes=10, n_layers=1)\n", + "\n", + "opt = optim.SGD(clf.parameters(), lr=0.01, momentum=0.5)\n", + "\n", + "loss_history = []\n", + "acc_history = []\n", + "\n", + "def train(epoch):\n", + " clf.train() # set model in training mode (need this because of dropout)\n", + " \n", + " # dataset API gives us pythonic batching \n", + " for data, label in tqdm.tqdm(train_loader):\n", + " # forward pass, calculate loss and backprop!\n", + " opt.zero_grad()\n", + " preds = clf(data)\n", + " loss = torch.nn.functional.nll_loss(preds, label)\n", + " loss.backward()\n", + " loss_history.append(loss.item())\n", + " opt.step()\n", + "\n", + "def test(epoch):\n", + " clf.eval() # set model in inference mode (need this because of dropout)\n", + " test_loss = 0\n", + " correct = 0\n", + " \n", + " for data, target in tqdm.tqdm(test_loader):\n", + " \n", + " output = clf(data)\n", + " test_loss += torch.nn.functional.nll_loss(output, target).item()\n", + " pred = output.argmax() # get the index of the max log-probability\n", + " correct += pred.eq(target).cpu().sum()\n", + "\n", + " test_loss = test_loss\n", + " test_loss /= len(test_loader) # loss function already averages over batch size\n", + " accuracy = 100. * correct / len(test_loader.dataset)\n", + " acc_history.append(accuracy)\n", + " print('\\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\\n'.format(\n", + " test_loss, correct, len(test_loader.dataset),\n", + " accuracy))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c6c0281a-c8e9-46c8-adbf-dfdce58ddc61", + "metadata": {}, + "outputs": [], + "source": [ + "for epoch in range(0, 3):\n", + " train(epoch)\n", + " test(epoch)" + ] } ], "metadata": { From 2b94b8f5434e685e85408bf08a64cb6dfe9860c3 Mon Sep 17 00:00:00 2001 From: Leonid Didukh Date: Tue, 6 May 2025 23:35:01 +0300 Subject: [PATCH 3/4] edited, provided images --- .../Quantum Vision Transformer.ipynb | 540 ++++++++++++++---- 1 file changed, 418 insertions(+), 122 deletions(-) diff --git a/community/paper_implementation_project/Quantum Vision Transformer.ipynb b/community/paper_implementation_project/Quantum Vision Transformer.ipynb index c4e9085fa..c501e30c6 100644 --- a/community/paper_implementation_project/Quantum Vision Transformer.ipynb +++ b/community/paper_implementation_project/Quantum Vision Transformer.ipynb @@ -2,10 +2,21 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "fb8f88e1-d493-4473-80cd-00042b61f868", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/authentication/token_manager.py:101: UserWarning: Device is already registered.\n", + "Generating a new refresh token should only be done if the current refresh token is compromised.\n", + "To do so, set the overwrite parameter to true\n", + " warnings.warn(\n" + ] + } + ], "source": [ "import classiq\n", "classiq.authenticate()" @@ -13,19 +24,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "20d0b3d8-8de2-460b-93d2-bc805561c0c8", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/anaconda3/envs/baler/lib/python3.11/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 'dlopen(/opt/anaconda3/envs/baler/lib/python3.11/site-packages/torchvision/image.so, 0x0006): Symbol not found: __ZN3c1017RegisterOperatorsD1Ev\n", + " Referenced from: /opt/anaconda3/envs/baler/lib/python3.11/site-packages/torchvision/image.so\n", + " Expected in: /opt/anaconda3/envs/baler/lib/python3.11/site-packages/torch/lib/libtorch_cpu.dylib'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?\n", + " warn(\n" + ] + } + ], "source": [ "import torch\n", - "import numpy as np\n", - "import torch.nn as nn\n", "import torch.optim as optim\n", - "from typing import List\n", "import tqdm\n", - "import pdb\n", - "\n", + "import math\n", + "from classiq import *\n", "from classiq import (\n", " synthesize,\n", " qfunc,\n", @@ -35,29 +54,16 @@ " CArray,\n", " Output,\n", " CReal,\n", - " allocate,\n", " repeat,\n", " create_model,\n", " show\n", ")\n", - "\n", - "# choosing our data\n", - "import torchvision\n", - "import torchvision.transforms as transforms\n", - "import math\n", - "from classiq.applications.qnn.types import SavedResult\n", + "from classiq.execution import execute_qnn\n", "from classiq.applications.qnn import QLayer\n", "from classiq.qmod.symbolic import pi\n", - "from classiq.synthesis import SerializedQuantumProgram" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "634a20e6-3b46-4907-84f7-27ab3f473417", - "metadata": {}, - "outputs": [], - "source": [ + "from torch.nn.utils.rnn import pad_sequence\n", + "import torchvision.transforms as transforms\n", + "from torchvision import datasets\n", "from classiq.execution import (\n", " ExecutionPreferences,\n", " execute_qnn,\n", @@ -68,30 +74,23 @@ " MultipleArguments,\n", " ResultsCollection,\n", " SavedResult,\n", - ")\n", - "\n", - "\n", - "from classiq.applications.qnn.types import (\n", - " MultipleArguments,\n", - " ResultsCollection,\n", - " SavedResult,\n", ")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "91d168c1-d9da-4c10-a728-a179f3abc9db", "metadata": {}, "outputs": [], "source": [ "N_QUBITS = 4\n", - "num_shots = 4096" + "num_shots = 1000" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "5d172b4f-c317-4759-ad63-74b2eb4fa87d", "metadata": {}, "outputs": [], @@ -107,7 +106,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "b98e5452-3bc8-4aa0-beee-cc6d0c3cb994", "metadata": {}, "outputs": [], @@ -123,49 +122,126 @@ " return torch.tensor(yvec)" ] }, + { + "cell_type": "markdown", + "id": "68417df2", + "metadata": {}, + "source": [ + "##### Quantum Vision Transformer:\n", + "$$\n", + " y = f_{3} \\circ f_{2} \\circ f_{1} \\circ\t f_{0} \\circ(X)\n", + "$$\n", + ", where X - input tensor, y - result, $$f_{i}$$ is the Neural Network Layer\n" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "2bb9e435-d050-468a-a61f-0d14ce16eb9c", - "metadata": {}, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, "outputs": [], "source": [ "def get_circuit():\n", "\n", + "\n", " @qfunc\n", - " def vqc(input_: CArray[CReal, N_QUBITS], weight_: CArray[CArray[CReal, N_QUBITS], N_QUBITS], res: Output[QArray[QBit]]) -> None:\n", - " num_qubits = input_.len\n", - " num_qlayers = weight_.len\n", - " allocate(input_.len, res)\n", + " def vqc(weight_: CArray[CArray[CReal, N_QUBITS], N_QUBITS], res:QArray) -> None:\n", + " \n", + " num_qubits = N_QUBITS\n", + " num_qlayers = N_QUBITS\n", + " \n", " repeat(\n", " count=num_qlayers,\n", - " iteration=lambda i: repeat(count=num_qubits, \n", - " iteration=lambda j:RX(pi * weight_[i][j], res[j]))\n", + " iteration=lambda i: repeat(count=num_qubits, iteration=lambda j: RX(pi * weight_[i][j], res[j]))\n", " )\n", " \n", - " @qfunc\n", - " def angle_embedding(input_: CArray[CReal, N_QUBITS], qbv: Output[QArray[QBit]]) -> None:\n", - " allocate(input_.len, qbv)\n", - "\n", " repeat(\n", - " count=input_.len,\n", - " iteration=lambda index: RX(pi * input_[index], qbv[index]),\n", + " count=num_qubits - 1,\n", + " iteration=lambda index: CX(ctrl=res[index], target=res[index + 1]),\n", " )\n", "\n", + " \n", " @qfunc\n", - " def main(input_: CArray[CReal, N_QUBITS], weight_: CArray[CArray[CReal, N_QUBITS], N_QUBITS], res: Output[QArray[QBit]]) -> None:\n", - " x = QArray(\"x\")\n", - " angle_embedding(input_=input_, qbv=x)\n", - " vqc(input_=input_, weight_=weight_, res=res)\n", + " def main(input_: CArray[CReal, N_QUBITS], weight_: CArray[CArray[CReal, N_QUBITS], N_QUBITS], res: Output[QArray[QBit, N_QUBITS]]) -> None:\n", " \n", + "\n", + " encode_in_angle(input_, res)\n", + " vqc(weight_, res)\n", + "\n", + "\n", " qmod = create_model(main)\n", " quantum_program = synthesize(qmod)\n", - " return quantum_program" + " return quantum_program\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, + "id": "163130e1-2905-4572-9a59-99a55a6bc17c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Image \n", + " \n", + "# get the image \n", + "Image(url=\"axioms-13-00323-g004-550.jpg\", width=800, height=400) \n" + ] + }, + { + "cell_type": "markdown", + "id": "e8638544", + "metadata": {}, + "source": [ + "![title](\"axioms-13-00323-g004-550.jpg\")" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "5f609226-9ad5-44d3-a62e-0d1760f030fa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Image(url=\"axioms-13-00323-g005-550.jpg\", width=800, height=300) \n" + ] + }, + { + "cell_type": "code", + "execution_count": 62, "id": "00f92a77-0b94-4fe6-8f9b-2331d4f77939", "metadata": {}, "outputs": [], @@ -186,8 +262,19 @@ "\n", " x = self.conv(x)\n", " x = x.view(bs, self.num_patches, self.hidden_size)\n", - " return x\n", - " \n" + " return x" + ] + }, + { + "cell_type": "markdown", + "id": "fabc06a4", + "metadata": {}, + "source": [ + "##### Quantum Vision Transformer:\n", + "$$\n", + " y = f_{3} \\circ f_{2} \\circ f_{1} \\circ\t f_{0} \\circ(X)\n", + "$$\n", + ", where X - input tensor, y - result, $$f_{i}$$ is the Neural Network Layer\n" ] }, { @@ -237,11 +324,20 @@ { "cell_type": "code", "execution_count": null, - "id": "5bbc585c-c3bc-4cbe-b63a-e927577080d8", + "id": "3f0c44e1-a638-4237-abf3-dd5b937abed1", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Quantum program link: https://platform.classiq.io/circuit/2we1LvLdzd9RQ9vSPLE1T3WcIxn?login=True&version=0.77.0\n" + ] + } + ], "source": [ - "quantum_program = get_circuit()" + "quantum_program = get_circuit()\n", + "show(quantum_program)" ] }, { @@ -257,16 +353,26 @@ " \"\"\"\n", " def __init__(self, in_dim, out_dim):\n", " super(QuantumLayer, self).__init__()\n", - " self.quantum_layer = QLayer(quantum_program, execute, post_process)\n", + " self.quantum_program = get_circuit()\n", + " self.quantum_layer = QLayer(quantum_program, execute_qnn, post_process)\n", "\n", " def forward(self, x:torch.Tensor):\n", - " size = x.size()\n", - " x = x.view(-1, size[-1])\n", " x = self.quantum_layer(x)\n", - " x = x.view(size)\n", " return x" ] }, + { + "cell_type": "markdown", + "id": "da820af8", + "metadata": {}, + "source": [ + "##### Feed Forward Neural Network:\n", + "$$\n", + " y = f_{3} \\circ f_{2} \\circ f_{1} \\circ\t f_{0} \\circ(X)\n", + "$$\n", + ", where X - input tensor, y - result, $$f_{i}$$ is the Neural Network Layer\n" + ] + }, { "cell_type": "code", "execution_count": null, @@ -281,20 +387,34 @@ " def __init__(self, in_dim, hidden_size):\n", " super().__init__()\n", " self.linear_1 = torch.nn.Linear(in_dim, hidden_size)\n", - " self.qlinear_1 = QuantumLayer(hidden_size, hidden_size)\n", + " self.qlinear = QuantumLayer(hidden_size, hidden_size)\n", " self.dropout = torch.nn.Dropout(p=0.4)\n", " self.linear_2 = torch.nn.Linear(hidden_size, in_dim)\n", " return\n", " \n", " def forward(self, x:torch.Tensor):\n", + " seq_len = x.size()[1]\n", " x = self.linear_1(x)\n", - " x = self.qlinear_1(x)\n", + " x = [self.qlinear(x[:, t, :]) for t in range(seq_len)]\n", + " x = torch.Tensor(pad_sequence(x))\n", " x = self.dropout(x)\n", " x = torch.nn.functional.gelu(x)\n", " x = self.linear_2(x)\n", " return x" ] }, + { + "cell_type": "markdown", + "id": "61a8840b", + "metadata": {}, + "source": [ + "##### Feed Forward Neural Network:\n", + "$$\n", + " y = f_{3} \\circ f_{2} \\circ f_{1} \\circ\t f_{0} \\circ(X)\n", + "$$\n", + ", where X - input tensor, y - result, $$f_{i}$$ is the Neural Network Layer\n" + ] + }, { "cell_type": "code", "execution_count": null, @@ -309,9 +429,9 @@ " def __init__(self, in_dim:int, num_heads:int) -> None:\n", " super().__init__()\n", "\n", - " self.qK = QuantumLayer(in_dim, in_dim);\n", - " self.qQ = QuantumLayer(in_dim, in_dim);\n", - " self.qV = QuantumLayer(in_dim, in_dim);\n", + " self.k_linear = QuantumLayer(in_dim, in_dim);\n", + " self.q_linear = QuantumLayer(in_dim, in_dim);\n", + " self.v_linear = QuantumLayer(in_dim, in_dim);\n", " self.dropout = torch.nn.Dropout(p=0.1)\n", " \n", " self.final_l = QuantumLayer(in_dim, in_dim)\n", @@ -322,11 +442,22 @@ "\n", " def forward(self, X:torch.Tensor):\n", "\n", - " dim = torch.sqrt(torch.Tensor([X.shape[-1]]))\n", - " attention = torch.nn.functional.softmax((1/dim)*self.qK(X))*self.qQ(X)*self.qV(X)\n", - " x = self.dropout(attention)\n", - " x = self.final_l(x)\n", - " return x" + " seq_len = X.size()[1]\n", + " K = [self.k_linear(X[:, t, :]) for t in range(seq_len)]\n", + " Q = [self.q_linear(X[:, t, :]) for t in range(seq_len)]\n", + " V = [self.v_linear(X[:, t, :]) for t in range(seq_len)]\n", + " \n", + " k = torch.Tensor(pad_sequence(K))\n", + " q = torch.Tensor(pad_sequence(Q))\n", + " v = torch.Tensor(pad_sequence(V))\n", + " \n", + " attention = (q @ k.transpose(-2, -1)) * (1.0 / math.sqrt(k.size(-1)))\n", + " attention = torch.nn.functional.softmax(attention, dim=-1)\n", + "\n", + " attention = self.dropout(attention)\n", + " attention = attention @ v \n", + " #x = self.final_l(attention)\n", + " return attention" ] }, { @@ -342,6 +473,7 @@ " \"\"\"\n", " def __init__(self, in_dim:int, num_heads:int) -> None:\n", " super().__init__()\n", + " \n", " self.layer_norm_1 = torch.nn.LayerNorm(normalized_shape=in_dim)\n", " self.layer_norm_2 = torch.nn.LayerNorm(normalized_shape=in_dim)\n", " \n", @@ -351,15 +483,25 @@ " \n", "\n", " def forward(self, X:torch.Tensor):\n", - " \n", " x = self.qMHA(X)\n", - " x = self.layer_norm_1(x)\n", - " x = self.dropout(x) + X\n", - "\n", - " y = self.layer_norm_2(x)\n", - " y = self.qFFN(y)+y\n", + " x = (self.layer_norm_1(x) + X)\n", + " x = self.dropout(x)\n", " \n", - " return x" + " y = self.qFFN(x)\n", + " y = self.layer_norm_2(y)+x\n", + " return y" + ] + }, + { + "cell_type": "markdown", + "id": "b125354b", + "metadata": {}, + "source": [ + "##### Feed Forward Neural Network:\n", + "$$\n", + " y = f_{3} \\circ f_{2} \\circ f_{1} \\circ\t f_{0} \\circ(X)\n", + "$$\n", + ", where X - input tensor, y - result, $$f_{i}$$ is the Neural Network Layer\n" ] }, { @@ -375,71 +517,171 @@ " \"\"\"\n", " def __init__(self, in_channels, patch_size, in_dim, hidden_size, num_heads, n_classes, n_layers) -> None:\n", " super().__init__()\n", - " self.patch_formation = Patchify(in_channels=in_channels, patch_size=patch_size, hidden_size=hidden_size)\n", - " self.d_model = (in_dim//patch_size)**2\n", - " self.pos_encoding = RotaryPositionalEmbedding(hidden_size, self.d_model)\n", - " self.transformer_blocks = [qTransformerEncoder(hidden_size, num_heads) for i in range(n_layers)]\n", " \n", + " self.d_model = (in_dim//patch_size)**2\n", " self.n_classes = n_classes\n", + "\n", + " self.patch_formation = Patchify(in_channels=in_channels, patch_size=patch_size, hidden_size=hidden_size)\n", + "\n", + " self.pos_encoding = RotaryPositionalEmbedding(hidden_size, self.d_model)\n", + " self.transformer_blocks = torch.nn.ModuleList([qTransformerEncoder(hidden_size, num_heads) for i in range(n_layers)])\n", + " \n", " self.final_normalization = torch.nn.LayerNorm(hidden_size)\n", " self.final_layer = torch.nn.Linear(hidden_size, self.n_classes)\n", "\n", - " def forward(self, x: torch.Tensor) -> torch.Tensor: \n", + " def forward(self, x: torch.Tensor) -> torch.Tensor: \n", + " \n", " x = self.patch_formation(x)\n", " x += self.pos_encoding(x)\n", + " \n", " for trans_block in self.transformer_blocks:\n", " x = trans_block(x)\n", + " \n", " x = self.final_normalization(x)\n", " x = x.mean(axis=1)\n", " x = self.final_layer(x)\n", + " \n", " return x" ] }, { "cell_type": "code", "execution_count": null, - "id": "b5e36d83-7aaa-4d7c-88a3-9cb59023ca13", - "metadata": {}, - "outputs": [], - "source": [ - "from torchvision import datasets" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7d76d0e7-dc24-40dc-ac59-d2332a466ae0", + "id": "79282b7f-cb02-4b20-a29a-51de390c2d17", "metadata": {}, "outputs": [], "source": [ + "#### Example with the MNIST Dataset:\n", "transform=transforms.Compose([\n", " transforms.ToTensor(), # first, convert image to PyTorch tensor\n", " transforms.Normalize((0.1307,), (0.3081,)) # normalize inputs\n", - " ])" + " ])\n", + "dataset1 = datasets.MNIST('../data', train=True, download=True,transform=transform)\n", + "dataset2 = datasets.MNIST('../data', train=False,transform=transform)\n", + "\n", + "train_loader = torch.utils.data.DataLoader(dataset1,batch_size=16)\n", + "test_loader = torch.utils.data.DataLoader(dataset2,batch_size=1)" ] }, { "cell_type": "code", - "execution_count": null, - "id": "79282b7f-cb02-4b20-a29a-51de390c2d17", + "execution_count": 68, + "id": "8ed4f759", "metadata": {}, "outputs": [], "source": [ - "#### Example with the MNIST Dataset:\n", "\n", - "dataset1 = datasets.MNIST('../data', train=True, download=True,transform=transform)\n", - "dataset2 = datasets.MNIST('../data', train=False,transform=transform)" + "clf = QVT(in_channels=1, patch_size=7, in_dim=28, hidden_size=4, num_heads=1, n_classes=10, n_layers=2)\n", + "\n", + "opt = optim.SGD(clf.parameters(), lr=0.01, momentum=0.5)\n", + "\n", + "loss_history = []\n", + "acc_history = []" ] }, { "cell_type": "code", - "execution_count": null, - "id": "8772eb4c-075e-40a8-993b-2ec3faeb1b39", + "execution_count": 69, + "id": "d044b9af", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/3750 [00:00 exception=RuntimeError('Cannot send a request, as the client has been closed.')>\n", + "Traceback (most recent call last):\n", + " File \"/opt/anaconda3/envs/baler/lib/python3.11/asyncio/tasks.py\", line 267, in __step\n", + " result = coro.send(None)\n", + " ^^^^^^^^^^^^^^^\n", + " File \"/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/execution/jobs.py\", line 128, in result_async\n", + " await self.poll_async(timeout_sec=timeout_sec, _http_client=_http_client)\n", + " File \"/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/execution/jobs.py\", line 253, in poll_async\n", + " await self._poll_job(timeout_sec=timeout_sec, _http_client=_http_client)\n", + " File \"/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/execution/jobs.py\", line 271, in _poll_job\n", + " await poller.poll(\n", + " File \"/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/jobs.py\", line 141, in poll\n", + " return await self._poll(\n", + " ^^^^^^^^^^^^^^^^^\n", + " File \"/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/jobs.py\", line 124, in _poll\n", + " async for json_response in poll_for(\n", + " File \"/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/async_utils.py\", line 79, in poll_for\n", + " yield await poller()\n", + " ^^^^^^^^^^^^^^\n", + " File \"/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/jobs.py\", line 119, in poller\n", + " raw_response = await self._request(\n", + " ^^^^^^^^^^^^^^^^^^^^\n", + " File \"/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/jobs.py\", line 85, in _request\n", + " return await client().request(\n", + " ^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/client.py\", line 115, in wrapper\n", + " return await func(*args, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/client.py\", line 240, in request\n", + " response = await http_client.request(\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/opt/anaconda3/envs/baler/lib/python3.11/site-packages/httpx/_client.py\", line 1585, in request\n", + " return await self.send(request, auth=auth, follow_redirects=follow_redirects)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/opt/anaconda3/envs/baler/lib/python3.11/site-packages/httpx/_client.py\", line 1661, in send\n", + " raise RuntimeError(\"Cannot send a request, as the client has been closed.\")\n", + "RuntimeError: Cannot send a request, as the client has been closed.\n", + " 0%| | 0/3750 [39:53 8\u001b[0m \u001b[43mloss\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbackward\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 9\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 10\u001b[0m loss_history\u001b[38;5;241m.\u001b[39mappend(loss)\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/torch/_tensor.py:581\u001b[0m, in \u001b[0;36mTensor.backward\u001b[0;34m(self, gradient, retain_graph, create_graph, inputs)\u001b[0m\n\u001b[1;32m 571\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m has_torch_function_unary(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 572\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m handle_torch_function(\n\u001b[1;32m 573\u001b[0m Tensor\u001b[38;5;241m.\u001b[39mbackward,\n\u001b[1;32m 574\u001b[0m (\u001b[38;5;28mself\u001b[39m,),\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 579\u001b[0m inputs\u001b[38;5;241m=\u001b[39minputs,\n\u001b[1;32m 580\u001b[0m )\n\u001b[0;32m--> 581\u001b[0m \u001b[43mtorch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mautograd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbackward\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 582\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgradient\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mretain_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreate_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minputs\u001b[49m\n\u001b[1;32m 583\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/torch/autograd/__init__.py:347\u001b[0m, in \u001b[0;36mbackward\u001b[0;34m(tensors, grad_tensors, retain_graph, create_graph, grad_variables, inputs)\u001b[0m\n\u001b[1;32m 342\u001b[0m retain_graph \u001b[38;5;241m=\u001b[39m create_graph\n\u001b[1;32m 344\u001b[0m \u001b[38;5;66;03m# The reason we repeat the same comment below is that\u001b[39;00m\n\u001b[1;32m 345\u001b[0m \u001b[38;5;66;03m# some Python versions print out the first line of a multi-line function\u001b[39;00m\n\u001b[1;32m 346\u001b[0m \u001b[38;5;66;03m# calls in the traceback and some print out the last line\u001b[39;00m\n\u001b[0;32m--> 347\u001b[0m \u001b[43m_engine_run_backward\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 348\u001b[0m \u001b[43m \u001b[49m\u001b[43mtensors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 349\u001b[0m \u001b[43m \u001b[49m\u001b[43mgrad_tensors_\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 350\u001b[0m \u001b[43m \u001b[49m\u001b[43mretain_graph\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 351\u001b[0m \u001b[43m \u001b[49m\u001b[43mcreate_graph\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 352\u001b[0m \u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 353\u001b[0m \u001b[43m \u001b[49m\u001b[43mallow_unreachable\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 354\u001b[0m \u001b[43m \u001b[49m\u001b[43maccumulate_grad\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 355\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/torch/autograd/graph.py:825\u001b[0m, in \u001b[0;36m_engine_run_backward\u001b[0;34m(t_outputs, *args, **kwargs)\u001b[0m\n\u001b[1;32m 823\u001b[0m unregister_hooks \u001b[38;5;241m=\u001b[39m _register_logging_hooks_on_whole_graph(t_outputs)\n\u001b[1;32m 824\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 825\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mVariable\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_execution_engine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_backward\u001b[49m\u001b[43m(\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Calls into the C++ engine to run the backward pass\u001b[39;49;00m\n\u001b[1;32m 826\u001b[0m \u001b[43m \u001b[49m\u001b[43mt_outputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\n\u001b[1;32m 827\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# Calls into the C++ engine to run the backward pass\u001b[39;00m\n\u001b[1;32m 828\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 829\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m attach_logging_hooks:\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/torch/autograd/function.py:307\u001b[0m, in \u001b[0;36mBackwardCFunction.apply\u001b[0;34m(self, *args)\u001b[0m\n\u001b[1;32m 301\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\n\u001b[1;32m 302\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mImplementing both \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbackward\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m and \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mvjp\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m for a custom \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 303\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFunction is not allowed. You should only implement one \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 304\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mof them.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 305\u001b[0m )\n\u001b[1;32m 306\u001b[0m user_fn \u001b[38;5;241m=\u001b[39m vjp_fn \u001b[38;5;28;01mif\u001b[39;00m vjp_fn \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m Function\u001b[38;5;241m.\u001b[39mvjp \u001b[38;5;28;01melse\u001b[39;00m backward_fn\n\u001b[0;32m--> 307\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43muser_fn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/applications/qnn/qlayer.py:126\u001b[0m, in \u001b[0;36mQLayerFunction.backward\u001b[0;34m(ctx, grad_output)\u001b[0m\n\u001b[1;32m 123\u001b[0m grad_weights \u001b[38;5;241m=\u001b[39m einsum_weigths(grad_output, grad_weights, is_single_layer)\n\u001b[1;32m 125\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ctx\u001b[38;5;241m.\u001b[39mneeds_input_grad[\u001b[38;5;241m0\u001b[39m]:\n\u001b[0;32m--> 126\u001b[0m grad_inputs \u001b[38;5;241m=\u001b[39m \u001b[43mctx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mquantum_gradient\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgradient_inputs\u001b[49m\u001b[43m(\u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mweights\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 127\u001b[0m grad_inputs \u001b[38;5;241m=\u001b[39m einsum_inputs(grad_output, grad_inputs, is_single_layer)\n\u001b[1;32m 129\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28many\u001b[39m(ctx\u001b[38;5;241m.\u001b[39mneeds_input_grad[i] \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m (\u001b[38;5;241m2\u001b[39m, \u001b[38;5;241m3\u001b[39m, \u001b[38;5;241m4\u001b[39m)):\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/applications/qnn/gradients/simple_quantum_gradient.py:156\u001b[0m, in \u001b[0;36mSimpleQuantumGradient.gradient_inputs\u001b[0;34m(self, inputs, weights, *args, **kwargs)\u001b[0m\n\u001b[1;32m 153\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mgradient_inputs\u001b[39m(\n\u001b[1;32m 154\u001b[0m \u001b[38;5;28mself\u001b[39m, inputs: Tensor, weights: Tensor, \u001b[38;5;241m*\u001b[39margs: Any, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any\n\u001b[1;32m 155\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tensor:\n\u001b[0;32m--> 156\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_gradient\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 157\u001b[0m \u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 158\u001b[0m \u001b[43m \u001b[49m\u001b[43mweights\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 159\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconvert_inputs_tensors_to_arguments\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 160\u001b[0m \u001b[43m \u001b[49m\u001b[43mexpected_shape\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[1;32m 161\u001b[0m \u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mshape\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 162\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 163\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 164\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/applications/qnn/gradients/simple_quantum_gradient.py:125\u001b[0m, in \u001b[0;36mSimpleQuantumGradient._gradient\u001b[0;34m(self, inputs, weights, convert_tensors_to_arguments, expected_shape)\u001b[0m\n\u001b[1;32m 118\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_gradient\u001b[39m(\n\u001b[1;32m 119\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 120\u001b[0m inputs: Tensor,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 123\u001b[0m expected_shape: Shape,\n\u001b[1;32m 124\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tensor:\n\u001b[0;32m--> 125\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43miter_inputs_weights\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 126\u001b[0m \u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 127\u001b[0m \u001b[43m \u001b[49m\u001b[43mweights\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 128\u001b[0m \u001b[43m \u001b[49m\u001b[43mconvert_tensors_to_arguments\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 129\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexecute\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 130\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_post_process\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 131\u001b[0m \u001b[43m \u001b[49m\u001b[43mexpected_shape\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexpected_shape\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 132\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 134\u001b[0m axis_to_squeeze \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m2\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m is_single_layer_circuit(weights) \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;241m3\u001b[39m\n\u001b[1;32m 135\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_differentiate_results(result, axis_to_squeeze)\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/applications/qnn/torch_utils.py:114\u001b[0m, in \u001b[0;36miter_inputs_weights\u001b[0;34m(inputs, weights, convert_tensors_to_arguments, execute, post_process, expected_shape, requires_grad)\u001b[0m\n\u001b[1;32m 104\u001b[0m inputs_weights_shape \u001b[38;5;241m=\u001b[39m (inputs\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m0\u001b[39m], weights\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m0\u001b[39m])\n\u001b[1;32m 105\u001b[0m all_arguments \u001b[38;5;241m=\u001b[39m \u001b[38;5;28msum\u001b[39m(\n\u001b[1;32m 106\u001b[0m (\n\u001b[1;32m 107\u001b[0m convert_tensors_to_arguments(batch_item, out_weight)\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 111\u001b[0m (),\n\u001b[1;32m 112\u001b[0m )\n\u001b[0;32m--> 114\u001b[0m execution_results \u001b[38;5;241m=\u001b[39m \u001b[43mexecute\u001b[49m\u001b[43m(\u001b[49m\u001b[43mall_arguments\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 116\u001b[0m all_results \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m(\u001b[38;5;28mmap\u001b[39m(post_process, execution_results))\n\u001b[1;32m 118\u001b[0m expected_shape \u001b[38;5;241m=\u001b[39m inputs_weights_shape \u001b[38;5;241m+\u001b[39m expected_shape \u001b[38;5;241m+\u001b[39m all_results[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mshape\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/execution/qnn.py:77\u001b[0m, in \u001b[0;36mexecute_qnn\u001b[0;34m(quantum_program, arguments, observable)\u001b[0m\n\u001b[1;32m 75\u001b[0m result: ResultsCollection \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 76\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m chunk \u001b[38;5;129;01min\u001b[39;00m more_itertools\u001b[38;5;241m.\u001b[39mchunked(arguments, _MAX_ARGUMENTS_SIZE):\n\u001b[0;32m---> 77\u001b[0m chunk_result \u001b[38;5;241m=\u001b[39m \u001b[43mexecute_function\u001b[49m\u001b[43m(\u001b[49m\u001b[43marguments\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunk\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 78\u001b[0m result\u001b[38;5;241m.\u001b[39mextend(chunk_result)\n\u001b[1;32m 79\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/execution/qnn.py:53\u001b[0m, in \u001b[0;36m_execute_qnn_sample\u001b[0;34m(session, arguments)\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_execute_qnn_sample\u001b[39m(\n\u001b[1;32m 44\u001b[0m session: ExecutionSession,\n\u001b[1;32m 45\u001b[0m arguments: \u001b[38;5;28mlist\u001b[39m[Arguments],\n\u001b[1;32m 46\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m ResultsCollection:\n\u001b[1;32m 47\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m [\n\u001b[1;32m 48\u001b[0m TaggedExecutionDetails(\n\u001b[1;32m 49\u001b[0m name\u001b[38;5;241m=\u001b[39mDEFAULT_RESULT_NAME,\n\u001b[1;32m 50\u001b[0m value\u001b[38;5;241m=\u001b[39mresult,\n\u001b[1;32m 51\u001b[0m value_type\u001b[38;5;241m=\u001b[39mSavedResultValueType\u001b[38;5;241m.\u001b[39mExecutionDetails,\n\u001b[1;32m 52\u001b[0m )\n\u001b[0;32m---> 53\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m result \u001b[38;5;129;01min\u001b[39;00m \u001b[43msession\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbatch_sample\u001b[49m\u001b[43m(\u001b[49m\u001b[43marguments\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 54\u001b[0m ]\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/execution/execution_session.py:212\u001b[0m, in \u001b[0;36mExecutionSession.batch_sample\u001b[0;34m(self, parameters)\u001b[0m\n\u001b[1;32m 202\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mbatch_sample\u001b[39m(\u001b[38;5;28mself\u001b[39m, parameters: \u001b[38;5;28mlist\u001b[39m[ExecutionParams]) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28mlist\u001b[39m[ExecutionDetails]:\n\u001b[1;32m 203\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 204\u001b[0m \u001b[38;5;124;03m Samples the quantum program multiple times with the given parameters for each iteration. The number of samples is determined by the length of the parameters list.\u001b[39;00m\n\u001b[1;32m 205\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 210\u001b[0m \u001b[38;5;124;03m List[ExecutionDetails]: The results of all the sampling iterations.\u001b[39;00m\n\u001b[1;32m 211\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 212\u001b[0m job \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msubmit_batch_sample\u001b[49m\u001b[43m(\u001b[49m\u001b[43mparameters\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mparameters\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 213\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m job\u001b[38;5;241m.\u001b[39mget_batch_sample_result(_http_client\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_async_client)\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/execution/execution_session.py:231\u001b[0m, in \u001b[0;36mExecutionSession.submit_batch_sample\u001b[0;34m(self, parameters)\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 217\u001b[0m \u001b[38;5;124;03mInitiates an execution job with the `batch_sample` primitive.\u001b[39;00m\n\u001b[1;32m 218\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 226\u001b[0m \u001b[38;5;124;03m The execution job.\u001b[39;00m\n\u001b[1;32m 227\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 228\u001b[0m execution_primitives_input \u001b[38;5;241m=\u001b[39m PrimitivesInput(\n\u001b[1;32m 229\u001b[0m sample\u001b[38;5;241m=\u001b[39m[parse_params(params) \u001b[38;5;28;01mfor\u001b[39;00m params \u001b[38;5;129;01min\u001b[39;00m parameters]\n\u001b[1;32m 230\u001b[0m )\n\u001b[0;32m--> 231\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_execute\u001b[49m\u001b[43m(\u001b[49m\u001b[43mexecution_primitives_input\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/execution/execution_session.py:147\u001b[0m, in \u001b[0;36mExecutionSession._execute\u001b[0;34m(self, primitives_input)\u001b[0m\n\u001b[1;32m 145\u001b[0m primitives_input\u001b[38;5;241m.\u001b[39mrandom_seed \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_random_seed\n\u001b[1;32m 146\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_random_seed \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_rng\u001b[38;5;241m.\u001b[39mrandint(\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m2\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m32\u001b[39m \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m1\u001b[39m)\n\u001b[0;32m--> 147\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43masync_utils\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 148\u001b[0m \u001b[43m \u001b[49m\u001b[43mApiWrapper\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcall_create_session_job\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 149\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_session_id\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprimitives_input\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_async_client\u001b[49m\n\u001b[1;32m 150\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 151\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 152\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ExecutionJob(details\u001b[38;5;241m=\u001b[39mresult)\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/async_utils.py:37\u001b[0m, in \u001b[0;36mrun\u001b[0;34m(coro)\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mrun\u001b[39m(coro: Awaitable[T]) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m T:\n\u001b[1;32m 33\u001b[0m \u001b[38;5;66;03m# Use this function instead of asyncio.run, since it ALWAYS\u001b[39;00m\n\u001b[1;32m 34\u001b[0m \u001b[38;5;66;03m# creates a new event loop and clears the thread event loop.\u001b[39;00m\n\u001b[1;32m 35\u001b[0m \u001b[38;5;66;03m# Never use asyncio.run in library code.\u001b[39;00m\n\u001b[1;32m 36\u001b[0m loop \u001b[38;5;241m=\u001b[39m get_event_loop()\n\u001b[0;32m---> 37\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mloop\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_until_complete\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcoro\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/nest_asyncio.py:98\u001b[0m, in \u001b[0;36m_patch_loop..run_until_complete\u001b[0;34m(self, future)\u001b[0m\n\u001b[1;32m 95\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m f\u001b[38;5;241m.\u001b[39mdone():\n\u001b[1;32m 96\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\n\u001b[1;32m 97\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mEvent loop stopped before Future completed.\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m---> 98\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mf\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mresult\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/asyncio/futures.py:203\u001b[0m, in \u001b[0;36mFuture.result\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 201\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__log_traceback \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m 202\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 203\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception\u001b[38;5;241m.\u001b[39mwith_traceback(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception_tb)\n\u001b[1;32m 204\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_result\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/asyncio/tasks.py:267\u001b[0m, in \u001b[0;36mTask.__step\u001b[0;34m(***failed resolving arguments***)\u001b[0m\n\u001b[1;32m 263\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 264\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m exc \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 265\u001b[0m \u001b[38;5;66;03m# We use the `send` method directly, because coroutines\u001b[39;00m\n\u001b[1;32m 266\u001b[0m \u001b[38;5;66;03m# don't have `__iter__` and `__next__` methods.\u001b[39;00m\n\u001b[0;32m--> 267\u001b[0m result \u001b[38;5;241m=\u001b[39m coro\u001b[38;5;241m.\u001b[39msend(\u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[1;32m 268\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 269\u001b[0m result \u001b[38;5;241m=\u001b[39m coro\u001b[38;5;241m.\u001b[39mthrow(exc)\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/api_wrapper.py:147\u001b[0m, in \u001b[0;36mApiWrapper.call_create_session_job\u001b[0;34m(cls, session_id, primitives_input, http_client)\u001b[0m\n\u001b[1;32m 140\u001b[0m \u001b[38;5;129m@classmethod\u001b[39m\n\u001b[1;32m 141\u001b[0m \u001b[38;5;28;01masync\u001b[39;00m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcall_create_session_job\u001b[39m(\n\u001b[1;32m 142\u001b[0m \u001b[38;5;28mcls\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 145\u001b[0m http_client: Optional[httpx\u001b[38;5;241m.\u001b[39mAsyncClient] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 146\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m execution_request\u001b[38;5;241m.\u001b[39mExecutionJobDetails:\n\u001b[0;32m--> 147\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mawait\u001b[39;00m \u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39m_call_task_pydantic(\n\u001b[1;32m 148\u001b[0m http_method\u001b[38;5;241m=\u001b[39mHTTPMethod\u001b[38;5;241m.\u001b[39mPOST,\n\u001b[1;32m 149\u001b[0m url\u001b[38;5;241m=\u001b[39mroutes\u001b[38;5;241m.\u001b[39mEXECUTION_SESSIONS_PREFIX \u001b[38;5;241m+\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00msession_id\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 150\u001b[0m model\u001b[38;5;241m=\u001b[39mprimitives_input,\n\u001b[1;32m 151\u001b[0m http_client\u001b[38;5;241m=\u001b[39mhttp_client,\n\u001b[1;32m 152\u001b[0m )\n\u001b[1;32m 153\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m execution_request\u001b[38;5;241m.\u001b[39mExecutionJobDetails\u001b[38;5;241m.\u001b[39mmodel_validate(data)\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/api_wrapper.py:78\u001b[0m, in \u001b[0;36mApiWrapper._call_task_pydantic\u001b[0;34m(cls, http_method, url, model, use_versioned_url, http_client, exclude)\u001b[0m\n\u001b[1;32m 64\u001b[0m \u001b[38;5;129m@classmethod\u001b[39m\n\u001b[1;32m 65\u001b[0m \u001b[38;5;28;01masync\u001b[39;00m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_call_task_pydantic\u001b[39m(\n\u001b[1;32m 66\u001b[0m \u001b[38;5;28mcls\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 75\u001b[0m \u001b[38;5;66;03m# This was added because JSON serializer doesn't serialize complex type, and pydantic does.\u001b[39;00m\n\u001b[1;32m 76\u001b[0m \u001b[38;5;66;03m# We should add support for smarter json serialization.\u001b[39;00m\n\u001b[1;32m 77\u001b[0m body \u001b[38;5;241m=\u001b[39m json\u001b[38;5;241m.\u001b[39mloads(model\u001b[38;5;241m.\u001b[39mmodel_dump_json(exclude\u001b[38;5;241m=\u001b[39mexclude))\n\u001b[0;32m---> 78\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mawait\u001b[39;00m \u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39m_call_task(\n\u001b[1;32m 79\u001b[0m http_method,\n\u001b[1;32m 80\u001b[0m url,\n\u001b[1;32m 81\u001b[0m body,\n\u001b[1;32m 82\u001b[0m use_versioned_url\u001b[38;5;241m=\u001b[39muse_versioned_url,\n\u001b[1;32m 83\u001b[0m http_client\u001b[38;5;241m=\u001b[39mhttp_client,\n\u001b[1;32m 84\u001b[0m )\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/api_wrapper.py:98\u001b[0m, in \u001b[0;36mApiWrapper._call_task\u001b[0;34m(cls, http_method, url, body, params, use_versioned_url, headers, allow_none, http_client)\u001b[0m\n\u001b[1;32m 86\u001b[0m \u001b[38;5;129m@classmethod\u001b[39m\n\u001b[1;32m 87\u001b[0m \u001b[38;5;28;01masync\u001b[39;00m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_call_task\u001b[39m(\n\u001b[1;32m 88\u001b[0m \u001b[38;5;28mcls\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 96\u001b[0m http_client: Optional[httpx\u001b[38;5;241m.\u001b[39mAsyncClient] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m 97\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28mdict\u001b[39m:\n\u001b[0;32m---> 98\u001b[0m res: Any \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mawait\u001b[39;00m client()\u001b[38;5;241m.\u001b[39mcall_api(\n\u001b[1;32m 99\u001b[0m http_method\u001b[38;5;241m=\u001b[39mhttp_method,\n\u001b[1;32m 100\u001b[0m url\u001b[38;5;241m=\u001b[39murl,\n\u001b[1;32m 101\u001b[0m body\u001b[38;5;241m=\u001b[39mbody,\n\u001b[1;32m 102\u001b[0m headers\u001b[38;5;241m=\u001b[39mheaders,\n\u001b[1;32m 103\u001b[0m params\u001b[38;5;241m=\u001b[39mparams,\n\u001b[1;32m 104\u001b[0m use_versioned_url\u001b[38;5;241m=\u001b[39muse_versioned_url,\n\u001b[1;32m 105\u001b[0m http_client\u001b[38;5;241m=\u001b[39mhttp_client,\n\u001b[1;32m 106\u001b[0m )\n\u001b[1;32m 107\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m allow_none \u001b[38;5;129;01mand\u001b[39;00m res \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 108\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m {}\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/client.py:277\u001b[0m, in \u001b[0;36mClient.call_api\u001b[0;34m(self, http_method, url, body, params, use_versioned_url, headers, http_client)\u001b[0m\n\u001b[1;32m 275\u001b[0m url \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmake_versioned_url(url)\n\u001b[1;32m 276\u001b[0m \u001b[38;5;28;01masync\u001b[39;00m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39muse_client_or_create(http_client) \u001b[38;5;28;01mas\u001b[39;00m async_client:\n\u001b[0;32m--> 277\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mawait\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrequest(\n\u001b[1;32m 278\u001b[0m http_client\u001b[38;5;241m=\u001b[39masync_client,\n\u001b[1;32m 279\u001b[0m method\u001b[38;5;241m=\u001b[39mhttp_method,\n\u001b[1;32m 280\u001b[0m url\u001b[38;5;241m=\u001b[39murl,\n\u001b[1;32m 281\u001b[0m json\u001b[38;5;241m=\u001b[39mbody,\n\u001b[1;32m 282\u001b[0m params\u001b[38;5;241m=\u001b[39mparams,\n\u001b[1;32m 283\u001b[0m headers\u001b[38;5;241m=\u001b[39mheaders,\n\u001b[1;32m 284\u001b[0m )\n\u001b[1;32m 285\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m response\u001b[38;5;241m.\u001b[39mjson()\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/client.py:115\u001b[0m, in \u001b[0;36mtry_again_on_failure..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 113\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(_RETRY_COUNT):\n\u001b[1;32m 114\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 115\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mawait\u001b[39;00m func(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 116\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ClassiqExpiredTokenError:\n\u001b[1;32m 117\u001b[0m _logger\u001b[38;5;241m.\u001b[39minfo(\n\u001b[1;32m 118\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mToken expired when trying to \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m with args \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 119\u001b[0m func,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 122\u001b[0m exc_info\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m,\n\u001b[1;32m 123\u001b[0m )\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/client.py:254\u001b[0m, in \u001b[0;36mClient.request\u001b[0;34m(self, http_client, method, url, json, params, headers)\u001b[0m\n\u001b[1;32m 240\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mawait\u001b[39;00m http_client\u001b[38;5;241m.\u001b[39mrequest(\n\u001b[1;32m 241\u001b[0m method\u001b[38;5;241m=\u001b[39mmethod,\n\u001b[1;32m 242\u001b[0m url\u001b[38;5;241m=\u001b[39murl,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 245\u001b[0m headers\u001b[38;5;241m=\u001b[39mheaders,\n\u001b[1;32m 246\u001b[0m )\n\u001b[1;32m 247\u001b[0m _logger\u001b[38;5;241m.\u001b[39mdebug(\n\u001b[1;32m 248\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mHTTP response: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m%d\u001b[39;00m\u001b[38;5;124m (\u001b[39m\u001b[38;5;132;01m%.0f\u001b[39;00m\u001b[38;5;124mms)\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 249\u001b[0m method\u001b[38;5;241m.\u001b[39mupper(),\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 252\u001b[0m (time\u001b[38;5;241m.\u001b[39mmonotonic() \u001b[38;5;241m-\u001b[39m start_time) \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m1000\u001b[39m,\n\u001b[1;32m 253\u001b[0m )\n\u001b[0;32m--> 254\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhandle_response\u001b[49m\u001b[43m(\u001b[49m\u001b[43mresponse\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 255\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m response\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/client.py:205\u001b[0m, in \u001b[0;36mClient.handle_response\u001b[0;34m(self, response)\u001b[0m\n\u001b[1;32m 203\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_handle_warnings(response)\n\u001b[1;32m 204\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m response\u001b[38;5;241m.\u001b[39mis_error:\n\u001b[0;32m--> 205\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_handle_error\u001b[49m\u001b[43m(\u001b[49m\u001b[43mresponse\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 206\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_handle_success(response)\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/client.py:224\u001b[0m, in \u001b[0;36mClient._handle_error\u001b[0;34m(response)\u001b[0m\n\u001b[1;32m 222\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m: \u001b[38;5;66;03m# noqa: S110\u001b[39;00m\n\u001b[1;32m 223\u001b[0m \u001b[38;5;28;01mpass\u001b[39;00m\n\u001b[0;32m--> 224\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ClassiqAPIError(message, response\u001b[38;5;241m.\u001b[39mstatus_code)\n", + "\u001b[0;31mClassiqAPIError\u001b[0m: Call to API failed with code 500: Internal error occurred. Please contact Classiq support.\n\nError identifier: E19D7F0AC-1EBC-4508-89F6-8D13FEABC06E\nIf you need further assistance, please reach out on our Community Slack channel at: https://short.classiq.io/join-slack or open a support ticket at: https://classiq-community.freshdesk.com/support/tickets/new" + ] + } + ], "source": [ - "train_loader = torch.utils.data.DataLoader(dataset1,batch_size=1)\n", - "test_loader = torch.utils.data.DataLoader(dataset2,batch_size=1)" + "for data, label in tqdm.tqdm(train_loader):\n", + " # forward pass, calculate loss and backprop!\n", + " opt.zero_grad()\n", + "\n", + " preds = clf(data)\n", + " \n", + " loss = torch.nn.functional.nll_loss(preds, label)\n", + " loss.backward()\n", + " try:\n", + " loss_history.append(loss)\n", + " print(loss)\n", + " except Exception as e:\n", + " print(e)\n", + " opt.step()" ] }, { @@ -450,27 +692,28 @@ "outputs": [], "source": [ "\n", - "clf = QVT(in_channels=1, patch_size=7, in_dim=28, hidden_size=4, num_heads=1, n_classes=10, n_layers=1)\n", - "\n", - "opt = optim.SGD(clf.parameters(), lr=0.01, momentum=0.5)\n", - "\n", - "loss_history = []\n", - "acc_history = []\n", "\n", - "def train(epoch):\n", + "def train():\n", " clf.train() # set model in training mode (need this because of dropout)\n", " \n", " # dataset API gives us pythonic batching \n", " for data, label in tqdm.tqdm(train_loader):\n", " # forward pass, calculate loss and backprop!\n", " opt.zero_grad()\n", + "\n", " preds = clf(data)\n", + " \n", " loss = torch.nn.functional.nll_loss(preds, label)\n", " loss.backward()\n", - " loss_history.append(loss.item())\n", + " try:\n", + " loss_history.append(loss)\n", + " print(loss)\n", + " except Exception as e:\n", + " print(e)\n", " opt.step()\n", + " return loss_history\n", "\n", - "def test(epoch):\n", + "def test():\n", " clf.eval() # set model in inference mode (need this because of dropout)\n", " test_loss = 0\n", " correct = 0\n", @@ -496,11 +739,64 @@ "execution_count": null, "id": "c6c0281a-c8e9-46c8-adbf-dfdce58ddc61", "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/3750 [05:44 2\u001b[0m \u001b[43mtrain\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "Cell \u001b[0;32mIn[51], line 19\u001b[0m, in \u001b[0;36mtrain\u001b[0;34m()\u001b[0m\n\u001b[1;32m 16\u001b[0m preds \u001b[38;5;241m=\u001b[39m clf(data)\n\u001b[1;32m 18\u001b[0m loss \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mnn\u001b[38;5;241m.\u001b[39mfunctional\u001b[38;5;241m.\u001b[39mnll_loss(preds, label)\n\u001b[0;32m---> 19\u001b[0m \u001b[43mloss\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbackward\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 20\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m 21\u001b[0m loss_history\u001b[38;5;241m.\u001b[39mappend(loss)\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/torch/_tensor.py:581\u001b[0m, in \u001b[0;36mTensor.backward\u001b[0;34m(self, gradient, retain_graph, create_graph, inputs)\u001b[0m\n\u001b[1;32m 571\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m has_torch_function_unary(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 572\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m handle_torch_function(\n\u001b[1;32m 573\u001b[0m Tensor\u001b[38;5;241m.\u001b[39mbackward,\n\u001b[1;32m 574\u001b[0m (\u001b[38;5;28mself\u001b[39m,),\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 579\u001b[0m inputs\u001b[38;5;241m=\u001b[39minputs,\n\u001b[1;32m 580\u001b[0m )\n\u001b[0;32m--> 581\u001b[0m \u001b[43mtorch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mautograd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbackward\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 582\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgradient\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mretain_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreate_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minputs\u001b[49m\n\u001b[1;32m 583\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/torch/autograd/__init__.py:347\u001b[0m, in \u001b[0;36mbackward\u001b[0;34m(tensors, grad_tensors, retain_graph, create_graph, grad_variables, inputs)\u001b[0m\n\u001b[1;32m 342\u001b[0m retain_graph \u001b[38;5;241m=\u001b[39m create_graph\n\u001b[1;32m 344\u001b[0m \u001b[38;5;66;03m# The reason we repeat the same comment below is that\u001b[39;00m\n\u001b[1;32m 345\u001b[0m \u001b[38;5;66;03m# some Python versions print out the first line of a multi-line function\u001b[39;00m\n\u001b[1;32m 346\u001b[0m \u001b[38;5;66;03m# calls in the traceback and some print out the last line\u001b[39;00m\n\u001b[0;32m--> 347\u001b[0m \u001b[43m_engine_run_backward\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 348\u001b[0m \u001b[43m \u001b[49m\u001b[43mtensors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 349\u001b[0m \u001b[43m \u001b[49m\u001b[43mgrad_tensors_\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 350\u001b[0m \u001b[43m \u001b[49m\u001b[43mretain_graph\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 351\u001b[0m \u001b[43m \u001b[49m\u001b[43mcreate_graph\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 352\u001b[0m \u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 353\u001b[0m \u001b[43m \u001b[49m\u001b[43mallow_unreachable\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 354\u001b[0m \u001b[43m \u001b[49m\u001b[43maccumulate_grad\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 355\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/torch/autograd/graph.py:825\u001b[0m, in \u001b[0;36m_engine_run_backward\u001b[0;34m(t_outputs, *args, **kwargs)\u001b[0m\n\u001b[1;32m 823\u001b[0m unregister_hooks \u001b[38;5;241m=\u001b[39m _register_logging_hooks_on_whole_graph(t_outputs)\n\u001b[1;32m 824\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 825\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mVariable\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_execution_engine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_backward\u001b[49m\u001b[43m(\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Calls into the C++ engine to run the backward pass\u001b[39;49;00m\n\u001b[1;32m 826\u001b[0m \u001b[43m \u001b[49m\u001b[43mt_outputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\n\u001b[1;32m 827\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;66;03m# Calls into the C++ engine to run the backward pass\u001b[39;00m\n\u001b[1;32m 828\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 829\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m attach_logging_hooks:\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/torch/autograd/function.py:307\u001b[0m, in \u001b[0;36mBackwardCFunction.apply\u001b[0;34m(self, *args)\u001b[0m\n\u001b[1;32m 301\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\n\u001b[1;32m 302\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mImplementing both \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbackward\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m and \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mvjp\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m for a custom \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 303\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFunction is not allowed. You should only implement one \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 304\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mof them.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 305\u001b[0m )\n\u001b[1;32m 306\u001b[0m user_fn \u001b[38;5;241m=\u001b[39m vjp_fn \u001b[38;5;28;01mif\u001b[39;00m vjp_fn \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m Function\u001b[38;5;241m.\u001b[39mvjp \u001b[38;5;28;01melse\u001b[39;00m backward_fn\n\u001b[0;32m--> 307\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43muser_fn\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/applications/qnn/qlayer.py:122\u001b[0m, in \u001b[0;36mQLayerFunction.backward\u001b[0;34m(ctx, grad_output)\u001b[0m\n\u001b[1;32m 119\u001b[0m is_single_layer \u001b[38;5;241m=\u001b[39m is_single_layer_circuit(weights)\n\u001b[1;32m 121\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ctx\u001b[38;5;241m.\u001b[39mneeds_input_grad[\u001b[38;5;241m1\u001b[39m]:\n\u001b[0;32m--> 122\u001b[0m grad_weights \u001b[38;5;241m=\u001b[39m \u001b[43mctx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mquantum_gradient\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgradient_weights\u001b[49m\u001b[43m(\u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mweights\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 123\u001b[0m grad_weights \u001b[38;5;241m=\u001b[39m einsum_weigths(grad_output, grad_weights, is_single_layer)\n\u001b[1;32m 125\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ctx\u001b[38;5;241m.\u001b[39mneeds_input_grad[\u001b[38;5;241m0\u001b[39m]:\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/applications/qnn/gradients/simple_quantum_gradient.py:143\u001b[0m, in \u001b[0;36mSimpleQuantumGradient.gradient_weights\u001b[0;34m(self, inputs, weights, *args, **kwargs)\u001b[0m\n\u001b[1;32m 140\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mgradient_weights\u001b[39m(\n\u001b[1;32m 141\u001b[0m \u001b[38;5;28mself\u001b[39m, inputs: Tensor, weights: Tensor, \u001b[38;5;241m*\u001b[39margs: Any, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any\n\u001b[1;32m 142\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tensor:\n\u001b[0;32m--> 143\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_gradient\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 144\u001b[0m \u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 145\u001b[0m \u001b[43m \u001b[49m\u001b[43mweights\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 146\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconvert_weights_tensors_to_arguments\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 147\u001b[0m \u001b[43m \u001b[49m\u001b[43mexpected_shape\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[1;32m 148\u001b[0m \u001b[43m \u001b[49m\u001b[43mweights\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mshape\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m-\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 149\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 150\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 151\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/applications/qnn/gradients/simple_quantum_gradient.py:125\u001b[0m, in \u001b[0;36mSimpleQuantumGradient._gradient\u001b[0;34m(self, inputs, weights, convert_tensors_to_arguments, expected_shape)\u001b[0m\n\u001b[1;32m 118\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_gradient\u001b[39m(\n\u001b[1;32m 119\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 120\u001b[0m inputs: Tensor,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 123\u001b[0m expected_shape: Shape,\n\u001b[1;32m 124\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tensor:\n\u001b[0;32m--> 125\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43miter_inputs_weights\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 126\u001b[0m \u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 127\u001b[0m \u001b[43m \u001b[49m\u001b[43mweights\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 128\u001b[0m \u001b[43m \u001b[49m\u001b[43mconvert_tensors_to_arguments\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 129\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexecute\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 130\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_post_process\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 131\u001b[0m \u001b[43m \u001b[49m\u001b[43mexpected_shape\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexpected_shape\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 132\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 134\u001b[0m axis_to_squeeze \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m2\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m is_single_layer_circuit(weights) \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;241m3\u001b[39m\n\u001b[1;32m 135\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_differentiate_results(result, axis_to_squeeze)\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/applications/qnn/torch_utils.py:114\u001b[0m, in \u001b[0;36miter_inputs_weights\u001b[0;34m(inputs, weights, convert_tensors_to_arguments, execute, post_process, expected_shape, requires_grad)\u001b[0m\n\u001b[1;32m 104\u001b[0m inputs_weights_shape \u001b[38;5;241m=\u001b[39m (inputs\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m0\u001b[39m], weights\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m0\u001b[39m])\n\u001b[1;32m 105\u001b[0m all_arguments \u001b[38;5;241m=\u001b[39m \u001b[38;5;28msum\u001b[39m(\n\u001b[1;32m 106\u001b[0m (\n\u001b[1;32m 107\u001b[0m convert_tensors_to_arguments(batch_item, out_weight)\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 111\u001b[0m (),\n\u001b[1;32m 112\u001b[0m )\n\u001b[0;32m--> 114\u001b[0m execution_results \u001b[38;5;241m=\u001b[39m \u001b[43mexecute\u001b[49m\u001b[43m(\u001b[49m\u001b[43mall_arguments\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 116\u001b[0m all_results \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m(\u001b[38;5;28mmap\u001b[39m(post_process, execution_results))\n\u001b[1;32m 118\u001b[0m expected_shape \u001b[38;5;241m=\u001b[39m inputs_weights_shape \u001b[38;5;241m+\u001b[39m expected_shape \u001b[38;5;241m+\u001b[39m all_results[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mshape\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/execution/qnn.py:77\u001b[0m, in \u001b[0;36mexecute_qnn\u001b[0;34m(quantum_program, arguments, observable)\u001b[0m\n\u001b[1;32m 75\u001b[0m result: ResultsCollection \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 76\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m chunk \u001b[38;5;129;01min\u001b[39;00m more_itertools\u001b[38;5;241m.\u001b[39mchunked(arguments, _MAX_ARGUMENTS_SIZE):\n\u001b[0;32m---> 77\u001b[0m chunk_result \u001b[38;5;241m=\u001b[39m \u001b[43mexecute_function\u001b[49m\u001b[43m(\u001b[49m\u001b[43marguments\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunk\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 78\u001b[0m result\u001b[38;5;241m.\u001b[39mextend(chunk_result)\n\u001b[1;32m 79\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/execution/qnn.py:53\u001b[0m, in \u001b[0;36m_execute_qnn_sample\u001b[0;34m(session, arguments)\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_execute_qnn_sample\u001b[39m(\n\u001b[1;32m 44\u001b[0m session: ExecutionSession,\n\u001b[1;32m 45\u001b[0m arguments: \u001b[38;5;28mlist\u001b[39m[Arguments],\n\u001b[1;32m 46\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m ResultsCollection:\n\u001b[1;32m 47\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m [\n\u001b[1;32m 48\u001b[0m TaggedExecutionDetails(\n\u001b[1;32m 49\u001b[0m name\u001b[38;5;241m=\u001b[39mDEFAULT_RESULT_NAME,\n\u001b[1;32m 50\u001b[0m value\u001b[38;5;241m=\u001b[39mresult,\n\u001b[1;32m 51\u001b[0m value_type\u001b[38;5;241m=\u001b[39mSavedResultValueType\u001b[38;5;241m.\u001b[39mExecutionDetails,\n\u001b[1;32m 52\u001b[0m )\n\u001b[0;32m---> 53\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m result \u001b[38;5;129;01min\u001b[39;00m \u001b[43msession\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbatch_sample\u001b[49m\u001b[43m(\u001b[49m\u001b[43marguments\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 54\u001b[0m ]\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/execution/execution_session.py:213\u001b[0m, in \u001b[0;36mExecutionSession.batch_sample\u001b[0;34m(self, parameters)\u001b[0m\n\u001b[1;32m 203\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 204\u001b[0m \u001b[38;5;124;03mSamples the quantum program multiple times with the given parameters for each iteration. The number of samples is determined by the length of the parameters list.\u001b[39;00m\n\u001b[1;32m 205\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 210\u001b[0m \u001b[38;5;124;03m List[ExecutionDetails]: The results of all the sampling iterations.\u001b[39;00m\n\u001b[1;32m 211\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 212\u001b[0m job \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msubmit_batch_sample(parameters\u001b[38;5;241m=\u001b[39mparameters)\n\u001b[0;32m--> 213\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mjob\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_batch_sample_result\u001b[49m\u001b[43m(\u001b[49m\u001b[43m_http_client\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_async_client\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/execution/jobs.py:186\u001b[0m, in \u001b[0;36mExecutionJob.get_batch_sample_result\u001b[0;34m(self, _http_client)\u001b[0m\n\u001b[1;32m 173\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mget_batch_sample_result\u001b[39m(\n\u001b[1;32m 174\u001b[0m \u001b[38;5;28mself\u001b[39m, _http_client: Optional[httpx\u001b[38;5;241m.\u001b[39mAsyncClient] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 175\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28mlist\u001b[39m[ExecutionDetails]:\n\u001b[1;32m 176\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 177\u001b[0m \u001b[38;5;124;03m Returns the job's result as a single batch_sample result after validation. If the result is not yet available, waits for it.\u001b[39;00m\n\u001b[1;32m 178\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 184\u001b[0m \u001b[38;5;124;03m ClassiqAPIError: In case the job has failed.\u001b[39;00m\n\u001b[1;32m 185\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 186\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mresult\u001b[49m\u001b[43m(\u001b[49m\u001b[43m_http_client\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m_http_client\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 187\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(results) \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m 188\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ClassiqExecutionResultError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mbatch_sample\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/async_utils.py:43\u001b[0m, in \u001b[0;36msyncify_function..async_wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 41\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(async_func)\n\u001b[1;32m 42\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21masync_wrapper\u001b[39m(\u001b[38;5;241m*\u001b[39margs: Any, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs: Any) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m T:\n\u001b[0;32m---> 43\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43masync_func\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/async_utils.py:37\u001b[0m, in \u001b[0;36mrun\u001b[0;34m(coro)\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mrun\u001b[39m(coro: Awaitable[T]) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m T:\n\u001b[1;32m 33\u001b[0m \u001b[38;5;66;03m# Use this function instead of asyncio.run, since it ALWAYS\u001b[39;00m\n\u001b[1;32m 34\u001b[0m \u001b[38;5;66;03m# creates a new event loop and clears the thread event loop.\u001b[39;00m\n\u001b[1;32m 35\u001b[0m \u001b[38;5;66;03m# Never use asyncio.run in library code.\u001b[39;00m\n\u001b[1;32m 36\u001b[0m loop \u001b[38;5;241m=\u001b[39m get_event_loop()\n\u001b[0;32m---> 37\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mloop\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_until_complete\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcoro\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/nest_asyncio.py:92\u001b[0m, in \u001b[0;36m_patch_loop..run_until_complete\u001b[0;34m(self, future)\u001b[0m\n\u001b[1;32m 90\u001b[0m f\u001b[38;5;241m.\u001b[39m_log_destroy_pending \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m 91\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m f\u001b[38;5;241m.\u001b[39mdone():\n\u001b[0;32m---> 92\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_run_once\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 93\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_stopping:\n\u001b[1;32m 94\u001b[0m \u001b[38;5;28;01mbreak\u001b[39;00m\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/site-packages/nest_asyncio.py:115\u001b[0m, in \u001b[0;36m_patch_loop.._run_once\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 108\u001b[0m heappop(scheduled)\n\u001b[1;32m 110\u001b[0m timeout \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m 111\u001b[0m \u001b[38;5;241m0\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m ready \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_stopping\n\u001b[1;32m 112\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28mmin\u001b[39m(\u001b[38;5;28mmax\u001b[39m(\n\u001b[1;32m 113\u001b[0m scheduled[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39m_when \u001b[38;5;241m-\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtime(), \u001b[38;5;241m0\u001b[39m), \u001b[38;5;241m86400\u001b[39m) \u001b[38;5;28;01mif\u001b[39;00m scheduled\n\u001b[1;32m 114\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m--> 115\u001b[0m event_list \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_selector\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mselect\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 116\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_process_events(event_list)\n\u001b[1;32m 118\u001b[0m end_time \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtime() \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_clock_resolution\n", + "File \u001b[0;32m/opt/anaconda3/envs/baler/lib/python3.11/selectors.py:561\u001b[0m, in \u001b[0;36mKqueueSelector.select\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 559\u001b[0m ready \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 560\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 561\u001b[0m kev_list \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_selector\u001b[38;5;241m.\u001b[39mcontrol(\u001b[38;5;28;01mNone\u001b[39;00m, max_ev, timeout)\n\u001b[1;32m 562\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mInterruptedError\u001b[39;00m:\n\u001b[1;32m 563\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ready\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "#for epoch in range(0, 3):\n", + "train()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ce4a83d3-909c-49f5-a2e4-e1ae9bfcc5b2", + "metadata": {}, "outputs": [], "source": [ - "for epoch in range(0, 3):\n", - " train(epoch)\n", - " test(epoch)" + "plt.style.use('fivethirtyeight')\n", + "plt.title('Model Loss')\n", + "plt.plot(range(1, epochs+1), history.history['loss'], label=\"training\")\n", + "plt.plot(range(1, epochs+1), history.history['val_loss'], label=\"validation\")\n", + "plt.xlabel('Epochs')\n", + "plt.ylabel('Loss')\n", + "plt.legend()\n", + "plt.show()" ] } ], From 08d2a03b6bf6069d4fc540847d19ff5f49847884 Mon Sep 17 00:00:00 2001 From: Leonid Didukh Date: Thu, 15 May 2025 21:42:53 +0300 Subject: [PATCH 4/4] Added description of QVIT --- .../qu_vit/Quantum Vision Transformer.ipynb | 786 ++++++++++++++++++ .../qu_vit/axioms-13-00323-g004-550.jpg | Bin 0 -> 96417 bytes .../qu_vit/axioms-13-00323-g005-550.jpg | Bin 0 -> 37272 bytes .../qu_vit/classiq_circuit.png | Bin 0 -> 25381 bytes .../qu_vit/classsiq_gates.jpg | Bin 0 -> 36995 bytes 5 files changed, 786 insertions(+) create mode 100644 community/paper_implementation_project/qu_vit/Quantum Vision Transformer.ipynb create mode 100644 community/paper_implementation_project/qu_vit/axioms-13-00323-g004-550.jpg create mode 100644 community/paper_implementation_project/qu_vit/axioms-13-00323-g005-550.jpg create mode 100644 community/paper_implementation_project/qu_vit/classiq_circuit.png create mode 100644 community/paper_implementation_project/qu_vit/classsiq_gates.jpg diff --git a/community/paper_implementation_project/qu_vit/Quantum Vision Transformer.ipynb b/community/paper_implementation_project/qu_vit/Quantum Vision Transformer.ipynb new file mode 100644 index 000000000..c5c00aef1 --- /dev/null +++ b/community/paper_implementation_project/qu_vit/Quantum Vision Transformer.ipynb @@ -0,0 +1,786 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b144e47f-089a-49d4-a033-dbe6dcc7a55e", + "metadata": {}, + "source": [ + "##### \n", + "Quantum Vision Transformer Tutorial:\n", + "##### 1. Description of Quantum Vision Transformer Architecture:\n", + "

Quantum Vision Transformer is SOTA (state of the art) neural network architecture that works on image data. \n", + " It was shown in numerous works that the quantum vision transformer can outperform own classical counterpart.\n", + "This tutorial demonstrates the implementation of the hybrid architecture Quantum Vision Transformer [1][2], where some of the operation is quantum (like a Linear layer, Attention Layer) and some are classical.\n", + "

\n", + "\n", + "\n", + "##### 2. Quantum operations:\n", + "###### 2.1 Angle Encoding.\n", + "###### To feed the input data into the quantum circuit, we need to decode it using the angle encoding procedure; all input tensors are expanded at used as an angle for the rotation operation.\n", + "###### 2.2 Quantum Layer:\n", + "###### The quantum layer is constructed using the Rotation Operator acting on each wire, followed by the CNOT gate.\n", + "\n", + "###### 2.3 Attention mechanism:\n", + "\n", + "

It works with the sequence representation of patched images and utilizes the Attention mechanism that is the backbone of the Transformer architecture family. The multihead attention block is traditional for the transformer architecture; for the quantumness, the classical block is replaced with VQC. Another way to compute the attention is to use the quantum orthogonal layer, and calculate the dot product of i-th and j-th vectors.\n", + "

\n", + "\n", + "##### 3. Classical operations:\n", + "###### 3.1 Positional Encoder - the operation for the positional information of image patches incorporation.\n", + "###### 3.3 FFN - Fully Connected Block, consists of MLP and LayerNormalization, followed by the residual connection.\n", + "###### 3.4. Transformer Block\n", + "##### 4. Training Procedure" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "fb8f88e1-d493-4473-80cd-00042b61f868", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/anaconda3/envs/baler/lib/python3.11/site-packages/classiq/_internals/authentication/token_manager.py:101: UserWarning: Device is already registered.\n", + "Generating a new refresh token should only be done if the current refresh token is compromised.\n", + "To do so, set the overwrite parameter to true\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "import classiq\n", + "classiq.authenticate()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "20d0b3d8-8de2-460b-93d2-bc805561c0c8", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/anaconda3/envs/baler/lib/python3.11/site-packages/torchvision/io/image.py:13: UserWarning: Failed to load image Python extension: 'dlopen(/opt/anaconda3/envs/baler/lib/python3.11/site-packages/torchvision/image.so, 0x0006): Symbol not found: __ZN3c1017RegisterOperatorsD1Ev\n", + " Referenced from: /opt/anaconda3/envs/baler/lib/python3.11/site-packages/torchvision/image.so\n", + " Expected in: /opt/anaconda3/envs/baler/lib/python3.11/site-packages/torch/lib/libtorch_cpu.dylib'If you don't plan on using image functionality from `torchvision.io`, you can ignore this warning. Otherwise, there might be something wrong with your environment. Did you have `libjpeg` or `libpng` installed before building `torchvision` from source?\n", + " warn(\n" + ] + } + ], + "source": [ + "import torch\n", + "import torch.optim as optim\n", + "import tqdm\n", + "import math\n", + "from classiq import *\n", + "from classiq import (\n", + " synthesize,\n", + " qfunc,\n", + " QArray,\n", + " QBit,\n", + " RX,\n", + " CArray,\n", + " Output,\n", + " CReal,\n", + " repeat,\n", + " create_model,\n", + " show\n", + ")\n", + "from classiq.execution import execute_qnn\n", + "from classiq.applications.qnn import QLayer\n", + "from classiq.qmod.symbolic import pi\n", + "from torch.nn.utils.rnn import pad_sequence\n", + "import torchvision.transforms as transforms\n", + "from torchvision import datasets\n", + "from classiq.execution import (\n", + " ExecutionPreferences,\n", + " execute_qnn,\n", + " set_quantum_program_execution_preferences,\n", + ")\n", + "from classiq.synthesis import SerializedQuantumProgram\n", + "from classiq.applications.qnn.types import (\n", + " MultipleArguments,\n", + " ResultsCollection,\n", + " SavedResult,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "91d168c1-d9da-4c10-a728-a179f3abc9db", + "metadata": {}, + "outputs": [], + "source": [ + "N_QUBITS = 4\n", + "num_shots = 1000" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "5c9b4ed5-6da6-491c-87eb-5fe7e0029304", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Image \n", + " \n", + "# get the image \n", + "Image(url=\"axioms-13-00323-g004-550.jpg\", width=800, height=400) " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "407ef1c0-0a59-4821-911d-d6cb5827181d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Image(url=\"axioms-13-00323-g005-550.jpg\", width=800, height=300) \n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "5d172b4f-c317-4759-ad63-74b2eb4fa87d", + "metadata": {}, + "outputs": [], + "source": [ + "def execute(\n", + " quantum_program: SerializedQuantumProgram, arguments: MultipleArguments\n", + ") -> ResultsCollection:\n", + " quantum_program = set_quantum_program_execution_preferences(\n", + " quantum_program, preferences=ExecutionPreferences(num_shots=num_shots)\n", + " )\n", + " return execute_qnn(quantum_program, arguments)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "b98e5452-3bc8-4aa0-beee-cc6d0c3cb994", + "metadata": {}, + "outputs": [], + "source": [ + "def post_process(result: SavedResult) -> torch.Tensor:\n", + " res = result.value\n", + " yvec = [\n", + " (res.counts_of_qubits(k)[\"1\"] if \"1\" in res.counts_of_qubits(k) else 0)\n", + " / num_shots\n", + " for k in range(N_QUBITS)\n", + " ]\n", + "\n", + " return torch.tensor(yvec)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "2bb9e435-d050-468a-a61f-0d14ce16eb9c", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "def get_circuit():\n", + "\n", + " #This function produces the quantum circuit:\n", + " @qfunc\n", + " def vqc(weight_: CArray[CArray[CReal, N_QUBITS], N_QUBITS], res:QArray) -> None:\n", + " \n", + " num_qubits = N_QUBITS\n", + " num_qlayers = N_QUBITS\n", + " \n", + " repeat(\n", + " count=num_qlayers,\n", + " iteration=lambda i: repeat(count=num_qubits, iteration=lambda j: RX(pi * weight_[i][j], res[j]))\n", + " )\n", + " \n", + " repeat(\n", + " count=num_qubits - 1,\n", + " iteration=lambda index: CX(ctrl=res[index], target=res[index + 1]),\n", + " )\n", + " \n", + " CX(ctrl=res[num_qubits-1], target=res[0])\n", + "\n", + " \n", + " \n", + " @qfunc\n", + " def main(input_: CArray[CReal, N_QUBITS], weight_: CArray[CArray[CReal, N_QUBITS], N_QUBITS], res: Output[QArray[QBit, N_QUBITS]]) -> None:\n", + " \n", + "\n", + " encode_in_angle(input_, res)\n", + " vqc(weight_, res)\n", + "\n", + "\n", + " qmod = create_model(main)\n", + " quantum_program = synthesize(qmod)\n", + " return quantum_program\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "00f92a77-0b94-4fe6-8f9b-2331d4f77939", + "metadata": {}, + "outputs": [], + "source": [ + "class Patchify(torch.nn.Module):\n", + " \"\"\"\n", + " Patchify layer implemented using the Conv2d layer\n", + " \"\"\"\n", + " def __init__(self, in_channels:int, patch_size:int, hidden_size:int):\n", + " super(Patchify, self).__init__()\n", + " self.patch_size = patch_size\n", + " self.conv = torch.nn.Conv2d(in_channels=in_channels, out_channels=hidden_size, kernel_size=self.patch_size, stride=self.patch_size)\n", + " self.hidden_size = hidden_size\n", + " \n", + " def forward(self, x:torch.Tensor):\n", + " bs, c, h, w = x.size()\n", + " self.num_patches = (h // self.patch_size) ** 2\n", + "\n", + " x = self.conv(x)\n", + " x = x.view(bs, self.num_patches, self.hidden_size)\n", + " return x" + ] + }, + { + "cell_type": "markdown", + "id": "6280490e-86b2-4023-bd59-8ded8ca43907", + "metadata": {}, + "source": [ + "#### Rotary Positional Embedding:\n", + "#### $$f_{q, k}(x,m) = R^{d}_{\\theta, m} W_{q,x}x_{m}$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "2849e3a5-3d01-42bf-ae4b-4c79375e8443", + "metadata": {}, + "outputs": [], + "source": [ + "class RotaryPositionalEmbedding(torch.nn.Module):\n", + " \"\"\"\n", + " Rotary Positional Embedding\n", + " \"\"\"\n", + " def __init__(self, d_model, max_seq_len):\n", + " super(RotaryPositionalEmbedding, self).__init__()\n", + "\n", + " # Create a rotation matrix.\n", + " self.rotation_matrix = torch.zeros(d_model, d_model)\n", + " for i in range(d_model):\n", + " for j in range(d_model):\n", + " self.rotation_matrix[i, j] = math.cos(i * j * 0.01)\n", + "\n", + " # Create a positional embedding matrix.\n", + " self.positional_embedding = torch.zeros(max_seq_len, d_model)\n", + " for i in range(max_seq_len):\n", + " for j in range(d_model):\n", + " self.positional_embedding[i, j] = math.cos(i * j * 0.01)\n", + "\n", + " def forward(self, x):\n", + " \"\"\"\n", + " Args:\n", + " x: A tensor of shape (batch_size, seq_len, d_model).\n", + "\n", + " Returns:\n", + " A tensor of shape (batch_size, seq_len, d_model).\n", + " \"\"\"\n", + "\n", + " # Add the positional embedding to the input tensor.\n", + " x += self.positional_embedding\n", + "\n", + " # Apply the rotation matrix to the input tensor.\n", + " x = torch.matmul(x, self.rotation_matrix)\n", + "\n", + " return x" + ] + }, + { + "cell_type": "markdown", + "id": "e5d99e78-0e5b-463c-a5eb-891c8fc35c1d", + "metadata": {}, + "source": [ + "##### Quantum Layer:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "9711b490-835e-4e29-9567-72e4a8f2fe09", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Image(url=\"classiq_circuit.png\", width=800, height=300) " + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "19042677-6d63-426c-b12d-9d107b47eecb", + "metadata": {}, + "outputs": [], + "source": [ + "class QuantumLayer(torch.nn.Module):\n", + " \"\"\"\n", + " Quantum Layer\n", + " \"\"\"\n", + " def __init__(self, in_dim, out_dim):\n", + " super(QuantumLayer, self).__init__()\n", + " self.quantum_program = get_circuit()\n", + " self.quantum_layer = QLayer(self.quantum_program, execute_qnn, post_process)\n", + "\n", + " def forward(self, x:torch.Tensor):\n", + " x = self.quantum_layer(x)\n", + " return x" + ] + }, + { + "cell_type": "markdown", + "id": "da820af8", + "metadata": {}, + "source": [ + "##### Feed Forward Neural Network:\n", + " $$f_{i}(X) = GELU \\circ Dropout \\circ QuantumLayer(X)$$" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "376d717d-76bf-45bc-a90f-67d15a92f33a", + "metadata": {}, + "outputs": [], + "source": [ + "class FFN(torch.nn.Module):\n", + " \"\"\"\n", + " Feed Forward Network\n", + " \"\"\"\n", + " def __init__(self, in_dim, hidden_size):\n", + " super().__init__()\n", + " self.qlinear = QuantumLayer(hidden_size, hidden_size)\n", + " self.dropout = torch.nn.Dropout(p=0.4)\n", + " return\n", + " \n", + " def forward(self, x:torch.Tensor):\n", + " seq_len = x.size()[1]\n", + " #x = self.linear_1(x)\n", + " x = [self.qlinear(x[:, t, :]) for t in range(seq_len)]\n", + " x = torch.Tensor(pad_sequence(x))\n", + " x = self.dropout(x)\n", + " x = torch.nn.functional.gelu(x)\n", + " return x" + ] + }, + { + "cell_type": "markdown", + "id": "abf5bc46", + "metadata": {}, + "source": [ + "#### Multihead Attention:\n", + "#### $$Attention = softmax(\\frac{K(X)*Q(X)^T}{\\sqrt{dim}})*V(X)$$, where K, Q, V is the quantum Linear Projection of the input data;" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "f2ffa889-38a6-425b-bf76-c1032406e6e3", + "metadata": {}, + "outputs": [], + "source": [ + "class qMHA(torch.nn.Module):\n", + " \"\"\"\n", + " Quantum Multihead Attention\n", + " \"\"\"\n", + " def __init__(self, in_dim:int, num_heads:int) -> None:\n", + " super().__init__()\n", + "\n", + " self.k_linear = QuantumLayer(in_dim, in_dim);\n", + " self.q_linear = QuantumLayer(in_dim, in_dim);\n", + " self.v_linear = QuantumLayer(in_dim, in_dim);\n", + " self.dropout = torch.nn.Dropout(p=0.1)\n", + " \n", + " self.num_heads = num_heads\n", + " self.in_dim = in_dim\n", + " \n", + " return\n", + "\n", + " def forward(self, X:torch.Tensor):\n", + "\n", + " seq_len = X.size()[1]\n", + " K = [self.k_linear(X[:, t, :]) for t in range(seq_len)]\n", + " Q = [self.q_linear(X[:, t, :]) for t in range(seq_len)]\n", + " V = [self.v_linear(X[:, t, :]) for t in range(seq_len)]\n", + " \n", + " k = torch.Tensor(pad_sequence(K))\n", + " q = torch.Tensor(pad_sequence(Q))\n", + " v = torch.Tensor(pad_sequence(V))\n", + " \n", + " attention = (q @ k.transpose(-2, -1)) * (1.0 / math.sqrt(k.size(-1)))\n", + " attention = torch.nn.functional.softmax(attention, dim=-1)\n", + "\n", + " attention = self.dropout(attention)\n", + " attention = attention @ v \n", + " #x = self.final_l(attention)\n", + " return attention" + ] + }, + { + "cell_type": "markdown", + "id": "fb7e14e4", + "metadata": {}, + "source": [ + "#### Transformer Encoder Block:\n", + "#### " + ] + }, + { + "cell_type": "markdown", + "id": "86af5bc7-f121-4487-b5dc-55dfaa5508e9", + "metadata": {}, + "source": [ + "$$\n", + " \\begin{equation}\n", + " \\begin{cases}\n", + " f_{i-1}(x) = X + GELU\\circ Linear \\circ Dropout \\circ QuantumLinear \\circ Linear \\circ X\\\\\n", + " f_{i}(x) = f_{i-1}(X) + GELU \\circ Linear \\circ Dropout \\circ QuantumAttention \\circ Linear \\circ f_{i-1}(X)\n", + " \\end{cases}\n", + " \\end{equation}\n", + " $$\n", + "GELU is an activation function. Linear is the linear projection of the input tensor." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "426e1bed-2197-4d62-ba13-6215c466c97b", + "metadata": {}, + "outputs": [], + "source": [ + "class qTransformerEncoder(torch.nn.Module):\n", + " \"\"\"\n", + " Quantum Transformer Encoder Layer\n", + " \"\"\"\n", + " def __init__(self, in_dim:int, num_heads:int) -> None:\n", + " super().__init__()\n", + " \n", + " self.layer_norm_1 = torch.nn.LayerNorm(normalized_shape=in_dim)\n", + " self.layer_norm_2 = torch.nn.LayerNorm(normalized_shape=in_dim)\n", + " \n", + " self.qMHA = qMHA(in_dim, num_heads)\n", + " self.qFFN = FFN(in_dim, hidden_size=in_dim)\n", + " self.dropout = torch.nn.Dropout(p=0.1)\n", + " \n", + "\n", + " def forward(self, X:torch.Tensor):\n", + " x = self.qMHA(X)\n", + " \n", + " x = (self.layer_norm_1(x) + X)\n", + " x = self.dropout(x)\n", + " \n", + " y = self.qFFN(x)\n", + " y = self.layer_norm_2(y)+x\n", + " return y" + ] + }, + { + "cell_type": "markdown", + "id": "b125354b", + "metadata": {}, + "source": [ + "#### Quantum Vision Transformer:" + ] + }, + { + "cell_type": "markdown", + "id": "f757f693-5d23-4ae7-835f-055c9bc06f6c", + "metadata": {}, + "source": [ + "$$\n", + " \\begin{equation}\n", + " \\begin{cases}\n", + " X = Patrchify(X)\\\\\n", + " X = PositionalEncoding (X)\\\\\n", + " X = TransformerEncoder(X)\\\\\n", + " X = Mean(X)\\\\\n", + " X = Softmax(X)\n", + " \\end{cases}\n", + " \\end{equation}\n", + " $$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "e6a37ec6-d82c-4784-aa97-94bf80be78c1", + "metadata": {}, + "outputs": [], + "source": [ + "class QVT(torch.nn.Module):\n", + " \"\"\"\n", + " Quantum Vision Transformer;\n", + " \"\"\"\n", + " def __init__(self, in_channels, patch_size, in_dim, hidden_size, num_heads, n_classes, n_layers) -> None:\n", + " super().__init__()\n", + " \n", + " self.d_model = (in_dim//patch_size)**2\n", + " self.n_classes = n_classes\n", + "\n", + " self.patch_formation = Patchify(in_channels=in_channels, patch_size=patch_size, hidden_size=hidden_size)\n", + "\n", + " self.pos_encoding = RotaryPositionalEmbedding(hidden_size, self.d_model)\n", + " self.transformer_blocks = torch.nn.ModuleList([qTransformerEncoder(hidden_size, num_heads) for i in range(n_layers)])\n", + " \n", + " self.final_normalization = torch.nn.LayerNorm(hidden_size)\n", + " self.final_layer = torch.nn.Linear(hidden_size, self.n_classes)\n", + "\n", + " def forward(self, x: torch.Tensor) -> torch.Tensor: \n", + " \n", + " x = self.patch_formation(x)\n", + " x += self.pos_encoding(x)\n", + " \n", + " for trans_block in self.transformer_blocks:\n", + " x = trans_block(x)\n", + " \n", + " x = self.final_normalization(x)\n", + " x = x.mean(axis=1)\n", + " x = self.final_layer(x)\n", + " \n", + " return x" + ] + }, + { + "cell_type": "markdown", + "id": "ef9038db", + "metadata": {}, + "source": [ + "#### Definition of MNIST dataset and dataloader:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "79282b7f-cb02-4b20-a29a-51de390c2d17", + "metadata": {}, + "outputs": [], + "source": [ + "#### Example with the MNIST Dataset:\n", + "transform=transforms.Compose([\n", + " transforms.ToTensor(), # first, convert image to PyTorch tensor\n", + " transforms.Normalize((0.1307,), (0.3081,)) # normalize inputs\n", + " ])\n", + "dataset1 = datasets.MNIST('../data', train=True, download=True,transform=transform)\n", + "dataset2 = datasets.MNIST('../data', train=False,transform=transform)\n", + "\n", + "train_loader = torch.utils.data.DataLoader(dataset1,batch_size=256)\n", + "test_loader = torch.utils.data.DataLoader(dataset2,batch_size=256)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "f94e4047-abcd-4d48-ab16-e1442474f6d0", + "metadata": {}, + "outputs": [], + "source": [ + "#### Classifier and optimizer definition:" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "8ed4f759", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "clf = QVT(in_channels=1, patch_size=7, in_dim=28, hidden_size=4, num_heads=1, n_classes=10, n_layers=1)\n", + "\n", + "opt = optim.SGD(clf.parameters(), lr=0.001, momentum=0.5)\n", + "\n", + "loss_history = []\n", + "acc_history = []" + ] + }, + { + "cell_type": "markdown", + "id": "12f70853", + "metadata": {}, + "source": [ + "#### Training Procedure:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "dc61ea1e-0cfa-4498-b5ec-eab29b102750", + "metadata": {}, + "outputs": [], + "source": [ + "def train():\n", + " clf.train() # set model in training mode (need this because of dropout)\n", + " \n", + " # dataset API gives us pythonic batching \n", + " for data, label in tqdm.tqdm(train_loader):\n", + " opt.zero_grad()\n", + " preds = clf(data)\n", + " loss = torch.nn.functional.nll_loss(preds, label)\n", + " loss.backward()\n", + " loss_history.append(loss)\n", + " opt.step()\n", + " return loss_history\n", + "\n", + "def test():\n", + " clf.eval() # set model in inference mode (need this because of dropout)\n", + " test_loss = 0\n", + " correct = 0\n", + " \n", + " for data, target in tqdm.tqdm(test_loader):\n", + " \n", + " output = clf(data)\n", + " test_loss += torch.nn.functional.nll_loss(output, target).item()\n", + " pred = output.argmax() # get the index of the max log-probability\n", + " correct += pred.eq(target).cpu().sum()\n", + "\n", + " test_loss = test_loss\n", + " test_loss /= len(test_loader) # loss function already averages over batch size\n", + " accuracy = 100. * correct / len(test_loader.dataset)\n", + " acc_history.append(accuracy)\n", + " print('\\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\\n'.format(\n", + " test_loss, correct, len(test_loader.dataset),\n", + " accuracy))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c6c0281a-c8e9-46c8-adbf-dfdce58ddc61", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 0%| | 0/235 [00:00Mp|rR|(H3p-0)-YR6iVgm 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 literal 0 HcmV?d00001 diff --git a/community/paper_implementation_project/qu_vit/axioms-13-00323-g005-550.jpg b/community/paper_implementation_project/qu_vit/axioms-13-00323-g005-550.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f4af23f6ccc9218e476b509265bfea9870d0d2d4 GIT binary patch literal 37272 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
F>83VEfPbP+l0R4i`ZbvzwSz#*Xo9@h#fxGL9{ z!-d;zOS)-;(Y<~Q&xf`nzzc4cz^aV7TQ3JMjR;mPlg)!KGcNd(60ZudQjGb4ry^qu zNEHM0UcW3+FV=HcRHu*R^^Fg)-g25+`Vp9K-vY_ti!9cRP}YtY-m8TA@+j&BGSPq= zUB3*>FYP2u8l}IrZ8(Kd49%0g@3xj%i@iPEe}CDXd;tBkKL6~1jKn*#BoOwq;ccz# z9Xj~$kfjfg1dM>E9&y)SFBVt-$L`60vO8XVT{iDaw*9Wl?~XscrZ-i|VqHQ0vaPDy zf~%aeRd&tJFY2A{SPRH(b-z3JlghOJawRLZOX1gm8Oe;`v-zGeBEboeqzZB zKH@t;M1A7hC2lQ`rMIL!yPf%{UD52aZ09!-#$A6h;|)@Ge9DhsJ)w~IT5Di)t;DuD zC0(5iCOH{9eNDstHkfwlbUgc3Jh#quy87K()zsD3*KpQ% zjTr@#f`2Y^xpnK}m1n0PbT=|uyjs+;eEH?T%ZH2ioGCc$m)667xO@4v3CYV@w;T!2 zlGb%PT)rtyv6$5{$-<;!VWP>5i=|7Zi5;FYi#KzX`YpDpw^zQ>yrL0Wb}z(7W!40T zCNIw<&rHuHoy(T1P0&y2DypiqRtQV<|bJ zX6mQ6E%o@jT2WEVKGd%9{Het@L1HJxOnq%Mm)wjl2|wKNsfER*%+<{pn#~|=L{Nl`)94S3gQWXueOkG1iuI`uH_;5OK`7PMWgYSd? z)E~3@ymXt|^BICH32p{QjQIlGHoloH=Puj5PtvcM>*eaV?NZq@OEyiix>TT2x5UE3 zr9QBqk%94j)vT|!ph2JN62Tupsny&4TKBNq?X9yNBQ5U6#JaBe$*8ojkTWpRB1>fR@x!s*yN$PrZ?}{9ezyMP z-I{mr4Y#p|y!9Q z(|=h^u1oM=`13n%4PPgv?DY7|r*|s#*NLwipz`n&ToHSyuK~C{UopTjI!GO)^lr&=Gb{;-Z{Ma?aw=}A5MAr z$=UCj?EL(5&*OQP^G}j0N3!JF!fldOS&P=)&prG4$<g>uUL)-%E^W2%9{@xHo99GK~oH_9i!{(F`< zk5M!9BBfYv|7>UT-KM@+xGm(Ik&{cthc4;oo79TJr(BLY^Zob4w%29ix$1Mg{1zI# udbK9!{EnKZ%CVtAGej=CuVUo<3typvU~D7Q9A2BbeDd-2{j&A{Zvp^fy9lWO literal 0 HcmV?d00001 diff --git a/community/paper_implementation_project/qu_vit/classiq_circuit.png b/community/paper_implementation_project/qu_vit/classiq_circuit.png new file mode 100644 index 0000000000000000000000000000000000000000..49090ce74bcf89ee8da9cf2e9ec885e0f332648f GIT binary patch literal 25381 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 Pe~0i$0*NRV*Yo=y;*u>T literal 0 HcmV?d00001 diff --git a/community/paper_implementation_project/qu_vit/classsiq_gates.jpg b/community/paper_implementation_project/qu_vit/classsiq_gates.jpg new file mode 100644 index 0000000000000000000000000000000000000000..494664260061f5e1cce9b5e6907a44b1cc53c1a1 GIT binary patch literal 36995 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 G{C@x@Ov9i6 literal 0 HcmV?d00001