diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Compaqt/Plots/compaqt-center.png b/Compaqt/Plots/compaqt-center.png new file mode 100644 index 0000000..d7a1880 Binary files /dev/null and b/Compaqt/Plots/compaqt-center.png differ diff --git a/Compaqt/Plots/pics_png/Scaling_linear.png b/Compaqt/Plots/pics_png/Scaling_linear.png new file mode 100644 index 0000000..dbc9b25 Binary files /dev/null and b/Compaqt/Plots/pics_png/Scaling_linear.png differ diff --git a/Compaqt/Plots/pics_png/Scaling_log.png b/Compaqt/Plots/pics_png/Scaling_log.png new file mode 100644 index 0000000..1f4df6a Binary files /dev/null and b/Compaqt/Plots/pics_png/Scaling_log.png differ diff --git a/Compaqt/Plots/pics_png/distributions_pic.png b/Compaqt/Plots/pics_png/distributions_pic.png new file mode 100644 index 0000000..d43d445 Binary files /dev/null and b/Compaqt/Plots/pics_png/distributions_pic.png differ diff --git a/Compaqt/Plots/pics_png/knowledge_distillation.png b/Compaqt/Plots/pics_png/knowledge_distillation.png new file mode 100644 index 0000000..298c0ab Binary files /dev/null and b/Compaqt/Plots/pics_png/knowledge_distillation.png differ diff --git a/Compaqt/Plots/pics_png/qae-circuit.png b/Compaqt/Plots/pics_png/qae-circuit.png new file mode 100644 index 0000000..b02a61c Binary files /dev/null and b/Compaqt/Plots/pics_png/qae-circuit.png differ diff --git a/Compaqt/Plots/pics_png/qkrt-qae-sim-8192.png b/Compaqt/Plots/pics_png/qkrt-qae-sim-8192.png new file mode 100644 index 0000000..4ae9ef1 Binary files /dev/null and b/Compaqt/Plots/pics_png/qkrt-qae-sim-8192.png differ diff --git a/Compaqt/Plots/pics_png/qkrt-qnn-belem-1024.png b/Compaqt/Plots/pics_png/qkrt-qnn-belem-1024.png new file mode 100644 index 0000000..2677e38 Binary files /dev/null and b/Compaqt/Plots/pics_png/qkrt-qnn-belem-1024.png differ diff --git a/Compaqt/Plots/pics_png/qkrt-qnn-belem-8192.png b/Compaqt/Plots/pics_png/qkrt-qnn-belem-8192.png new file mode 100644 index 0000000..db6e16f Binary files /dev/null and b/Compaqt/Plots/pics_png/qkrt-qnn-belem-8192.png differ diff --git a/Compaqt/Plots/pics_png/qkrt-qnn-sim-1024.png b/Compaqt/Plots/pics_png/qkrt-qnn-sim-1024.png new file mode 100644 index 0000000..c6765e6 Binary files /dev/null and b/Compaqt/Plots/pics_png/qkrt-qnn-sim-1024.png differ diff --git a/Compaqt/Plots/pics_png/qkrt_qae_belem_8192.png b/Compaqt/Plots/pics_png/qkrt_qae_belem_8192.png new file mode 100644 index 0000000..7192c57 Binary files /dev/null and b/Compaqt/Plots/pics_png/qkrt_qae_belem_8192.png differ diff --git a/Compaqt/Plots/pics_png/qnn-circuit.png b/Compaqt/Plots/pics_png/qnn-circuit.png new file mode 100644 index 0000000..f2b8fdb Binary files /dev/null and b/Compaqt/Plots/pics_png/qnn-circuit.png differ diff --git a/Compaqt/Plots/qae-belem-4096-qkrt.pdf b/Compaqt/Plots/qae-belem-4096-qkrt.pdf new file mode 100644 index 0000000..3e0a437 Binary files /dev/null and b/Compaqt/Plots/qae-belem-4096-qkrt.pdf differ diff --git a/Compaqt/Plots/qae-belem-8192-qkrt.pdf b/Compaqt/Plots/qae-belem-8192-qkrt.pdf new file mode 100644 index 0000000..d3e1bc1 Binary files /dev/null and b/Compaqt/Plots/qae-belem-8192-qkrt.pdf differ diff --git a/Compaqt/Plots/qae-sim-8192-qkrt.pdf b/Compaqt/Plots/qae-sim-8192-qkrt.pdf new file mode 100644 index 0000000..fc72347 Binary files /dev/null and b/Compaqt/Plots/qae-sim-8192-qkrt.pdf differ diff --git a/Compaqt/Plots/qae_circuit.pdf b/Compaqt/Plots/qae_circuit.pdf new file mode 100644 index 0000000..62981b3 Binary files /dev/null and b/Compaqt/Plots/qae_circuit.pdf differ diff --git a/Compaqt/Plots/qae_manila.pdf b/Compaqt/Plots/qae_manila.pdf new file mode 100644 index 0000000..9676451 Binary files /dev/null and b/Compaqt/Plots/qae_manila.pdf differ diff --git a/Compaqt/Plots/qae_sim.pdf b/Compaqt/Plots/qae_sim.pdf new file mode 100644 index 0000000..08402af Binary files /dev/null and b/Compaqt/Plots/qae_sim.pdf differ diff --git a/Compaqt/Plots/qkdistil.png b/Compaqt/Plots/qkdistil.png new file mode 100644 index 0000000..da0e69a Binary files /dev/null and b/Compaqt/Plots/qkdistil.png differ diff --git a/Compaqt/Plots/qnn-belem-1024-qkrt.pdf b/Compaqt/Plots/qnn-belem-1024-qkrt.pdf new file mode 100644 index 0000000..8ef0cad Binary files /dev/null and b/Compaqt/Plots/qnn-belem-1024-qkrt.pdf differ diff --git a/Compaqt/Plots/qnn-belem-4096-qkrt.pdf b/Compaqt/Plots/qnn-belem-4096-qkrt.pdf new file mode 100644 index 0000000..d7b21b9 Binary files /dev/null and b/Compaqt/Plots/qnn-belem-4096-qkrt.pdf differ diff --git a/Compaqt/Plots/qnn-belem-8192-qkrt.pdf b/Compaqt/Plots/qnn-belem-8192-qkrt.pdf new file mode 100644 index 0000000..fa35cd5 Binary files /dev/null and b/Compaqt/Plots/qnn-belem-8192-qkrt.pdf differ diff --git a/Compaqt/Plots/qnn-sim-1024-qkrt.pdf b/Compaqt/Plots/qnn-sim-1024-qkrt.pdf new file mode 100644 index 0000000..3438129 Binary files /dev/null and b/Compaqt/Plots/qnn-sim-1024-qkrt.pdf differ diff --git a/Compaqt/Plots/qnn_belem.pdf b/Compaqt/Plots/qnn_belem.pdf new file mode 100644 index 0000000..bc81f85 Binary files /dev/null and b/Compaqt/Plots/qnn_belem.pdf differ diff --git a/Compaqt/Plots/qnn_circuit.pdf b/Compaqt/Plots/qnn_circuit.pdf new file mode 100644 index 0000000..f0ab5f1 Binary files /dev/null and b/Compaqt/Plots/qnn_circuit.pdf differ diff --git a/Compaqt/Plots/qnn_sim.pdf b/Compaqt/Plots/qnn_sim.pdf new file mode 100644 index 0000000..bb39835 Binary files /dev/null and b/Compaqt/Plots/qnn_sim.pdf differ diff --git a/Compaqt/README.md b/Compaqt/README.md new file mode 100644 index 0000000..7a859b1 --- /dev/null +++ b/Compaqt/README.md @@ -0,0 +1,83 @@ +

+ +

+ +Team: Mykola Maksymenko, Richard Givhan, Sourav Sen Choudhury, Jackson Wu + +## Project description + +[Check presentation slides here](compaqt_presentation.pdf) + + Financial institutions, like JPMorgan Chase and HSBC, have been some of the most aggressive adopters of quantum technology to date. It's not hard to see why. + + With $90T+ AUM globally, the inefficiencies (2-3%) of classical approaches to portfolio optimization lead to annual costs of **$1.8T+**. Quantum algorithms can [outperform](https://arxiv.org/abs/2012.03819) their classical counterparts to reduce these costs by orders of magnitude-- theoretically. Quantum hardware constraints render these approaches infeasible for the forseeable future. Xanadu estimates that, for a quantum system to perform derivatives pricing on an industry-scale problem, it would need 7.5k qubits, it would need to be 100x faster than today's systems and, worst of all, it would need **46 Million gates**. Of these gates, most originate from the application of **Quantum Amplitude Estimation (QAE)**. At **Compaqt**, we figured that if we could replace QAE with a more efficient circuit, then we could reach our financially efficient future, sooner. + +Compaqt is building QNNs with considerably shorter gate sequences to replace circuitous algorithms like QAE. We do this via Quantum Knowledge Distillation and have so far achieved **10x size reduction** in gates. + +## Technology approach + +Knowledge Distillation is an elegant and surprisingly powerful concept originating from classical deep learning to compress large neural networks architectures. If you train a small **student** network to mimic output of a larger **teacher** network, it will asymptotically approach the performance of the teacher network. In other words, the student becomes the master! + +

+ + +

+ + +We apply this same concept to reduce the size of the Quantum Amplitude Estimation circuit. We feed the QAE circuit and a small 7-parameter QNN the same random input mapped to highly entangled quantum states, we then match the ouput distributions of the two networks, calculate the loss between the two and, using a Quantum Natural Gradient Optimizer, update the parameters of our student QNN. In this way, the student QNN progressively approximates the ouput of the unwieldy Quantum Amplitude Estimation (QAE) circuit. In fact, we managed to reduce the size of the QAE circuit by a **factor of 10**. + +From **this**: +![qae](Plots/pics_png/qae-circuit.png) +To **this**! +![qnn](Plots/pics_png/qnn-circuit.png) + +**CompaQt** QNN captures well the main features of the underlying distribution of large QAE circuit which can be well observed in the histograms below. While it clearly showcases the superior performance running on the QPU hardware. Here unlike the deep QAE circuit the two dominant peaks in the distribution well survive the effects of noise. + +![qae](Plots/pics_png/distributions_pic.png) + +## Business application + +Please see [ our slides ](compaqt_presentation.pdf) for a better understanding of our value proposition! + +As mentioned up top, first-movers in quantum (JPMorgan Chase, HSBC, MUFG, etc.) swallow hundreds of billions (**$1.8T accross the industry**) in cost every year to the inefficiencies of classical financial optimization methods. We aim to reduce the size of the relevant quantum optimization approaches (Quantum Amplitude Estimation) to derivatives pricing so that these institutions may sooner adopt more efficient quantum methods. To do this, we will develop a model compression system that also reduces the number of logical qubits needed, as well as the number of gates. + +We will initially tackle smaller-qubit (~100-200 qubit) optimization problems to gain industry traction, operating too within the chemical simulation industry, where there are useful problems at around 200 qubits, such as the simulation of penicillin (256). + +## Qiskit Runtime usage description + +Qiskit Runtime is a containerized execution environment that automates the process of setting up a quantum algorithm (circuit), running it multiple times (shots), and interpreting the results. Qiskit Runtime greatly simplifies this process by having the IBM quantum-classical hybrid cloud handle much of the work using its software architecture and containers, and according to IBM, this has created a 100x speedup in iterative circuit execution workloads. + +There are currently two **primitives** implemented in Qiskit Runtime. Primitives are predefined programs that provide a simplified interface for defining near-term quantum-classical workloads. One is **Sampler**, which takes user circuits as an input and generates an error-mitigated readout of quasiprobabilities. This provides users a way to better evaluate shot results using error mitigation and enables them to more efficiently evaluate the possibility of multiple relevant data points in the context of destructive interference. The other is **Estimator**, which allows users to efficiently calculate and interpret expectation values of quantum operators required for many algorithms. In our project, we used Sampler. + +To use Sampler, we have to first instantiate `QiskitRuntimeService`: +``` +from qiskit_ibm_runtime import QiskitRuntimeService, Sampler + +# Save credentials on disk for an IBM Quantum/Cloud account +# QiskitRuntimeService.save_account(channel="ibm_quantum", token="MY_IBM_QUANTUM_TOKEN") +# QiskitRuntimeService.save_account(channel="ibm_cloud", token="MY_IBM_CLOUD_API_KEY", instance="MY_IBM_CLOUD_CRN") +# +# Once account is saved on disk, service can be instantiated without any arguments +# service = QiskitRuntimeService() + +# Enable an account just for the current session +service = QiskitRuntimeService(channel="ibm_quantum", token="MY_IBM_QUANTUM_TOKEN") + +``` +After we defined our `student_network` circuit +``` +qc3 = QuantumCircuit(3) +qc=qc3.compose(student_network) +qc.assign_parameters(weights, inplace=True) +``` +we called Sampler to run the job on the 5-qubit `ibmq_belem` chip, and we plotted the quasiprobabilities from the returned result: +``` +with Sampler(circuits=qc, service=service, options={ "backend": "ibmq_belem" }) as sampler: + # pass indices of circuits + result = sampler(circuits=[0], shots=8192), + print(result) + +plot_histogram(result.quasi_dists) +``` +The `circuits` argument above takes in a list of user-defined circuits. The list can be the order in which each circuit is defined (e.g. for the single circuit here, it is simply the index 0), or it can consist of names given to the defined circuits. Note that the `backend` option is required as we ran on IBM Quantum. However, if running on IBM Cloud, backend can be left unspecified, in which case the least busy backend is used. + diff --git a/Compaqt/compaqt-center.png b/Compaqt/compaqt-center.png new file mode 100644 index 0000000..d7a1880 Binary files /dev/null and b/Compaqt/compaqt-center.png differ diff --git a/Compaqt/compaqt_presentation.pdf b/Compaqt/compaqt_presentation.pdf new file mode 100644 index 0000000..f334d17 Binary files /dev/null and b/Compaqt/compaqt_presentation.pdf differ diff --git a/Compaqt/network_distillation.ipynb b/Compaqt/network_distillation.ipynb new file mode 100644 index 0000000..a2d8ced --- /dev/null +++ b/Compaqt/network_distillation.ipynb @@ -0,0 +1,1158 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 16, + "id": "daae30bb", + "metadata": {}, + "outputs": [], + "source": [ + "# General Imports\n", + "import numpy as np\n", + "\n", + "# Visualisation Imports\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Scikit Imports\n", + "from sklearn import datasets\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.svm import SVC\n", + "from sklearn.decomposition import PCA\n", + "from sklearn.preprocessing import StandardScaler, MinMaxScaler\n", + "\n", + "# Qiskit Imports\n", + "from qiskit import Aer, execute\n", + "from qiskit.circuit import QuantumCircuit, Parameter, ParameterVector\n", + "from qiskit.circuit.library import PauliFeatureMap, ZFeatureMap, ZZFeatureMap\n", + "from qiskit.circuit.library import TwoLocal, NLocal, RealAmplitudes, EfficientSU2\n", + "from qiskit.circuit.library import HGate, RXGate, RYGate, RZGate, CXGate, CRXGate, CRZGate\n", + "from qiskit.opflow import StateFn, PauliSumOp, AerPauliExpectation, ListOp, Gradient\n", + "from qiskit_machine_learning.kernels import QuantumKernel\n", + "\n", + "from qiskit.utils import QuantumInstance, algorithm_globals\n", + "from qiskit_machine_learning.neural_networks import CircuitQNN" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "e25cdbe5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1.63031449 2.93514704]\n" + ] + } + ], + "source": [ + "# Generate random inputs\n", + "inputs = np.random.uniform(low=0.0, high=np.pi, size=2)\n", + "print(inputs)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "8001eaed", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbsAAAB7CAYAAADt9i4eAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAYF0lEQVR4nO3de1xVZb7H8Q8bQbzghRhFME1UFFA0ncyoETQzdTpl5SWzPGOe0VC7WKfmNIpdvNRxHLXykjWOnjpmJXLGxhxPmYCV1miWJmnkXRQT76KIsvc+f+wjihvYG1zstVl+368Xf7DW2s/6wlrwW5dnPSvA6XQ6ERERsTCb2QFERESqm4qdiIhYnoqdiIhYnoqdiIhYnoqdiIhYnoqdiIhYnoqdiIhYnoqdiIhYnoqdiIhYnoqdiIhYnoqdiIhYnoqdiIhYnoqdiIhYnoqdiIhYnoqdiIhYnoqdiIhYnoqdiIhYnoqdiIhYnoqdiIhYXi2zA4jv7dixo8L5c+bMYdy4cRUu0759eyMjiYhUK53ZiZu5c+eaHUFExFAqdiIiYnkqdiIiYnkqduImLS3N7AgiIoZSsRMREctTsRM3AwcONDuCiIih9OiBB+mb4OAJc9Yd1Rge+LU56/aVn9bCmSNmp7gstAm062V2ChExmoqdBwdPwC4/+mdsNWeOwMlcs1OIiNXpMqa4GTt2rNkRREQMpWInbjyNniIiUtOo2ImbHj16mB1BRMRQKnbiJj8/3+wIIiKGUrETERHLU29McRMXF2d2BK89Oz+Z7fs2EBgYhM0WSLOwaIbdOZHfJDxodjQR8SM6sxM3y5cvNztCpQzrncrfpxaQ/tIxenYeypQlQ8jNzzE7loj4ERU7cTNp0iSzI1RJYGAt7k0cg8NhZ0/eD2bHERE/omInbpYtW2Z2hCq5WHyBFevnUiswiOjITmbH8ej8RThTCHaH2UlEjOF0wtkiKDgPDqfZaUrz63t2DoeDmTNnsmDBAg4cOEC7du144403GDVqFElJSbz99ttmR3STNiWZFh16023ARK+my7V7//OpLMuaQVBgMJHhbZg0fDlR4W3MjlWuHw9Cxnb4+RfX9yFB0L019IqDBnXMzSZSFQ4nfLMLsnbA4VOuaY3qwh0x0KMdBPtBpfGDCOUbOXIk6enppKam0rVrV9avX8/QoUPJz8/nmWeeMTue+ImH75zAsN414yAiYzus2AwBAZennb8ImTvgu33wVB8Iq29ePpHKcjjh/fWwaS9csVtz8hys/B6ycyHlTvMLnt8Wu6VLl7J48WIyMzNJSkoCoGfPnmzevJn09HS6dOlickLrysrKMjuCJR045ip04Lrcc7XThbBkAzxxl29ziVyLb3a5Ch1AWVcu9xyFVVtgQFdfpnLnt/fspk2bRt++fUsK3SVt2rQhKCiIhIQEAPbu3UtSUhIxMTF07NiRL774woy4lpKdnW12BEv6Iqf0ke/VnLgGHc876aNAItfI6XRduqxovwbYsBOKin0SqVx+eWaXm5vLtm3bGD9+vNu8/fv3Ex8fT+3atQEYPXo0Q4YMYcyYMaxfv55BgwaxZ88egoODK1xHQICnzePy4IQMmscmVyr/P1dM5dtVM0pNu3i+gBYdeleqnaysTJ7s07NSn/FGWb/XK82aNcurZYww4/EMOrVONqQtI2RlZXLLUON/5wCPvb6P0BtaeFyu7+BxbP1sbrVkEDFS7bqNePxtz+9AKyqGVnGJ5P28wfAMzrIuk5TBb4sdQERERKnphYWFZGVl0a9fPwCOHj3Kl19+yccffwxAYmIikZGRZGRkcPfdd/s29BW63TehzA4qYrw/p2SaHcFrAbZAr5azebmciNm83acru2x18MtiFx4eDkBOTg79+/cvmT59+nTy8vLo2tV18Xf//v00bdq05CwPoFWrVuzbt8/jOrw9GnjzM/PeZ5eUlEzaFOP77+7YsaPC+bNmzWLUqFEVLjNz5kxDsmz6wL/eZ5eUlIxzfvX0mV6YBdtyy76vcaXl775OdJPXqyWDiJEcTnjlb67OKBUJtEHOli+oV7vi5aqTXxa76OhoEhISmDZtGmFhYURFRZGWlsaqVasASoqdVI+XX37Z7AiWdEcM/FBBYQ8AmjaEVr/yWSSRa2ILcO3XK78vf5kAoMtNmFrowE87qNhsNpYtW0Z8fDwpKSmMGDGC8PBwxo4dS2BgYEnnlBYtWvDLL79QVFRU8tk9e/bQsmVLs6JbwuDBg82OYEkxEZDYtux5AQEQVAuG3Vb6sQQRf5fUvvwDtACgcT24t7MvE5XNL8/sAGJiYsjIyCg17dFHHyUuLo46dVxP3oaHh3P77bezcOHCkg4qBw8epGfP6ulg4I2BEzMrNd0fxcbGsn37drNjWE5AAAy6BZo0gIwf4VTh5XmxzeCezhDZ2LR4IlUSFAgpveAfW2H9Tii66JoeaHOd0d3bGUL9YLAEvy12Zdm0aRPdu3cvNe2tt97id7/7HbNnzyY4OJilS5d67IkpYpaAAEhuDz1i4Jmlrmkv3e8abUKkpgquBfd1gX4J8PyHrmmvPGD+pcsr+eVlzLIUFBSQk5Pj9jB5dHQ069atIycnh23btrk9lyc1x/b93/DUnESennsH8z8u/ejD0VOHeO6tXjw1J5HNOWtwOp2cLTzFu5++hN1h59z5M2W2eV9qQxauegGAPYe38fTcO3hqzu3sPrQVgEWrJzIgtRF2u28fArJd8ZenQidWceUoKf5U6KAGndnVr18fu91udozrQnJysinrbdqoJX8avZbgoBBefX8Ye/J+oFWzjgB8mPEa/3r3ZFpHdmLiX++hY3QPVn69gOy961myZjJ9u42kbkioW5utIjoysv+rAPzX6lT+OGwptgAbb6SP4ZURKxjRdwrb9nzp059TRHyvxpzZie/Mnz/flPWGNYggOCgEgEBbUKnnzfYc/oH4mxKpU7s+dWuHcqH4vNvAAFOXDGXnwe/Zk/cDr7w3yK39M4UnaNLoRsIbRlFw/mS1/iwi4l9qzJmd+E5KSoppBQ9g96GtnDqbT8uml9+Y7nDYS4pbvZCGFBSe4Le3juL8hbMM651K0YVzjLl3NtPefxhbQCDPDVns1q7T6bjym+r+MUTEj6jYiZvMzEzT1n363HHm/G0cEx/5qNT0gIDLFyHOFp2mfp3G1AtpwPA+LwFQNySUuiGhNAuLxhZgI7xhpHvjV5wJXtmeiFif/uLFb9jtxby29BFG3TODsAalh4qLbpbAj3s3UHjhLOfOn6ZeSAO3z+8+tJXCojOcLDjCgSM/uc1vUCeM/JO5HD11iLplfF5ErEtnduI3srYuI+fARt755HkARvZ7lbXfv8+4AW8yOPl5pn8wnKKLhQzv4z7Ci91hZ8HKZ/nDQ+9RbL/A7PTHmfrYJ6WWGd7nZab89xAAnrhfAy2LXE9U7MSNWQ+U97p5KL1uHlpqWtxNtwHwq0bN+dPja8v9bKAtkP8c9VnJ99NGuoaWO332KAtXvcDI/q8SHZnA6+O+KvW5RasncuLMYQ1bImJxKnbi5qOPPrLMkGF/fb7iQa9H9J3CiL5TfJRGRMyiYudBlInDN5m17hdffNFnxS60iU9W4zV/yyMixlCx8+CBX5udwNra9TI7gYhcD9QbU0RELE/FTtzMmzfP7AgiIoZSsRM38fHxZkcQETGUip240ZsjRMRqVOxERMTyVOxERMTyVOzEzS233GJ2BBERQ6nYiZuNGzeaHUFExFAqdiIiYnkqdiIiYnkqduImLS3N7AgiIoZSsRMREctTsRM3AwcONDuCiIih9NYDD9I3wcET5qw7qrH137rw01o4c8TsFJeFNtGbGMD/tou4075aOSp2Hhw8Abv0R19tzhyBk7lmp5CrabuI1egyprgZO3as2RFERAylYiduxo0bZ3YEERFD6TKmuOnRowfr1q0zO4Yl/XIafjwIB45dnjZnjev+bMsboENzCNZfpdQgTifsPQo5h+HA8cvT31oLN4ZBdBNoFwE2k0+t9GclbvLz882OYDl7j8KqLa5/CFfb+YvrC6BOMCS2gT4doHaQbzOKVIbTCVv2w6fZcKiMTnw78lxfZENYPUiOhTvamlf0VOykRnt2fjLb920gMDAImy2QZmHRDLtzIr9JeNDsaADYHbDye8jcDk4vli+8AJ//CN/tg2GJ0LpJdSe0Nn/fP2qqs0Xw4Tew9YB3yx8/6+rZvnkvPJII4aHVGq9MumcnbuLi4syOUCnDeqfy96kFpL90jJ6dhzJlyRBy83PMjkWxHf66DjK8LHRXOn4W5n0O29Qj8pr56/5RU505D29+5n2hu9LeozD7fyHvpOGxPFKxEzfLly83O0KVBAbW4t7EMTgcdvbk/WB2HNI2QvbBqn/e7oDFX5S+DyJV52/7R01kd8A7mXD4VNXbKCiC+Wuh4LxhsbyiYiduJk2aZHaEKrlYfIEV6+dSKzCI6MhOpmbZlgtf76p4mdnDXF8VKXbA++tdZ4lybfxp/6ipPsuG/ccqXsab/fp0ISzfZFwub/h1sXM4HMyYMYO2bdsSEhJCp06dyMrKol27dowaNcrseJa1bNkysyNUyvufT2VAaiMentKcDdkrmDR8OVHhbUzL43DA/3xrXHt5p+Crn41r73rjb/tHTXWqED7bZlx73+2D3T4csMOvO6iMHDmS9PR0UlNT6dq1K+vXr2fo0KHk5+fzzDPPmB2vTGlTkmnRoTfdBkz0arpcu4fvnMCw3v7ze92eB8cKjG3zq5+hRzsICDC23euBv+0fNdXXO12XMY30ZY7r0QRf8Ntit3TpUhYvXkxmZiZJSUkA9OzZk82bN5Oenk6XLl1MTihSts17jW/zyGnIPQ433mB82yLe+Hav8W1uOQAX7RAUaHzbV/Pby5jTpk2jb9++JYXukjZt2hAUFERCQgLgur8UExODzWbTe9gMkpWVZXaEGs3TPY0qt6uOKmKS8xddB1xGszt81zPTL4tdbm4u27ZtY9CgQW7z9u/fT3x8PLVr1wagb9++rF69mh49evg6pmVlZ2ebHaHGKrZD/pnqafvwyeppV8STa+l96Ymvip1fXsbMzXU9XBQREVFqemFhIVlZWfTr169kWmJiYpXWEeDlzY8HJ2TQPDa5Um3/c8VUvl01o9S0i+cLaNGhd6XaycrK5Mk+PSv1GW+MHz++wvmzZs3yahkjzHg8g06tk6v8+T+nZBqS45KsrExuGVr133lwnVBS3il9COypZ1p5859eUvr7+W//hYHdfl/lbJVxrdvFXxi9f/iTa91XK6N5bDIPTsgoNc2o/XrU42PYumZ+lbM5nd49xeqXxS48PByAnJwc+vfvXzJ9+vTp5OXl0bVrV7OieaXbfRPK7KAi1me/WAS4/gC9PaDyuu0LPn4wSeT/FV+svn2v+EJhtbV9Jb8sdtHR0SQkJDBt2jTCwsKIiooiLS2NVatWARhS7Lw9GnjzM/PeZ5eUlEzalMqOveHZjh07Kpw/a9Ysj492zJw505Asmz7wr/emJSUl45x/bb/zySvgWMHlQnf1kewll458y5vv1u6EcdzxX755I4W/bRdxZ8S+6q1zF+CPVz2RZNR+/cnyRdwUvqjq4bzkl/fsbDYby5YtIz4+npSUFEaMGEF4eDhjx44lMDCwpHOKVI+XX37Z7Ag12o1hNatdEU/qBlfPeJa2AIhsZHy7ZfHLMzuAmJgYMjJKXyN+9NFHiYuLo06dOialuj4MHjzY7Ag12s0t4fv9xrZ5Q309diDmurmFawQVI/nylVZ+eWZXnk2bNrldwkxNTaV58+Zs2LCB0aNH07x5c3bt8jBOUzUaODGzzAfHy5vuj2JjY82OUKN1aA4NDT4eu72t6yhYxCyJ1bAP3hFjbHsVqTHFrqCggJycHLeHySdPnkxubi5FRUUcO3aM3NxcWrdubVJKuRbb93/DU3MSeXruHcz/uHRv0KOnDvHcW714ak4im3PW4HQ6OVt4inc/fQm7w86582X3978vtSELV70AwJLPpzJkciSLVl8+6Fi0eiIDUhthtxcb9nME2mCAgX2ofhXq238KZalo2wDM/3g84+f9hrkrngKgoPAkW3ZlsmVXJgWFJwFYljmDnQe/q7aM/7txMSOmt2PLrqwyMx08upPRMzuzaPVEdh3awocZ0/0i69FTh0iZ3YX+L4SU7IflZTVT43rQ08Dj4A7NoW1T49rzpMYUu/r162O323niiSfMjiLVpGmjlvxp9Fpmj/2SkwVHSo1M/2HGa/zr3ZN57fefsuTzKRTbL7Ly6wVk713PkjWTKTh/ssw2W0V0ZGT/VwHo3+3feGFo6bvmI/pOoXVkZ8N/lptbur4q8vQSzzfxbQHw8G3mv728om3zc+5mCosKmDXmC4qLL/DTgY1s2/Mla759j8++fZetu9fhcDjI3vsVbaJurtacg5Keo1PrpDIzRYW3Ycx9swFoHdmJ7fs24HQ6Tc/aoG4Y00d9TmyL7iXzystqtr4J0Kxhxct4s1/Xqw2Duvl2+LsaU+zEd5KTk01Zb1iDCIKDQgAItLletnnJnsM/EH9TInVq16du7VAuFJ9369o/dclQdh78nj15P/DKe+4DEjQObWr44wAVGdr92o5cbQGuF122+pVxmaqqom2zff/XdI25C4AubXvz474Nbp/fnbeFyP8ffHnLrkzun9SYZ+cnM2xqSyYtuq/Seb7+cSVvr3wOh8PBC+/05ciJ0jdJvckUFd62zLM3X2cNDgohtG7jCtsoL6uvBQXC6F6ue8hVVScIHu9p/KV+T1TsxM38+VV/wNMIuw9t5dTZfFo2vfwSWYfDXlKo6oU0pKDwBL+9dRTxNyUyrHcq9UMaMebe2SxY+Sxv/f1Zxtz7ulnxSwTXgt8nw21VGGA/NAT+LQm63GR0qmtT1rYpKDxJ3doNgEvb5iQdWt1B766PclfX4SRE9+Dg0Z9p2vgmADq26kG7G7vx55RMEqKTePKBeZXO0T3uHk6c+YVZy0fRPe5faNK4Ran5ZWW6WsQN0RzI32F6Vm9cyuoPGtWFJ/tATITnZa8W2cj1WTM6W/ltb0wxT0pKimkF7/S548z52zgmPvJRqekBAZePy84WnaZ+ncbUC2nA8D4vAVA3JJS6IaE0C4vGFmAjvGGkL2OXK7gWDLkVOreAT7Z4HjczKBC6RUP/Tq5LPf6kvG1TL6Qh54pco8a4tk0j6tdpVO4ILHnHd9MsLBqA/FMHCG8YVWr+8dOHmbrkoVLTwkIjmPDIB6Wm/bb7aCYs7McT9891W0dZmcpjdtaaqGEdSOnlemfjmmzPb/moXxt6tIdesVDLB4M+l0XFTtxkZmaasl67vZjXlj7CqHtmENag9GFjdLMEfty7gVaRCZw7f5p6IQ3cPr/70FYKi85wsbiIA0d+4sYm7XwV3aN2zVxf+4+53l5+4BgcLXANhFsnGKIaQ8sboHNL1zNN/qaibRPX8jY++XoBSZ0G893Pa+jz69+5fT4qvC0/HdgIwL7D2bSMiMfusJc6iLkkrEGEx2G+HA4HS9ZM5pG7XuTDta/xaJ8XK53p8LHdJHd+yG26r7N6o7ysZgoIcF21uLU1/JQHOYddb+Y4eQ6cuArcjWGuV/h0bG5ekbtExU78RtbWZeQc2Mg7nzwPwMh+r7L2+/cZN+BNBic/z/QPhlN0sZDhfdwferc77CxY+Sx/eOg9iu0XmJ3+OFMf+6TUMv/450L+vn4eZ84d58y5Ezz5gO+Pslvc4PqqacraNhFhrfjHxoUMu3MCQUEhjJ/3G1pHdqZ9i25un49u1ol3P30JgL2/ZBPX8jYuFhdxsuAIx07ncUODZpXK87ev3uD2Dvdzz22jeeXdgew9XPoBsLbNu3jMlHs0p8zOSb7OWmy/yB//0o/deVv4j7/czWP9phHb4lavsvoDWwDERrq+/FmA0x+6+PgxM4cLa90EnrjL+HY9DRcWGxvL9u3bK1ymffv2hmSp7mGpHpvents73F/SI/Nqi1ZP5Iutabzz79kE2gJp1Bx+7V8H0Kaoju2yLHMGN7e9s9p6Oa7bmsYHGa8x+p4/06l1ktv8g0d38trSR+iRMIgubXuz8afVPNTzDzU2q/bVylGx8+B6LHbeqCnFrrL0D8TF37aLuNO+Wjm6jOlBVMU9gi257o8++shnQ4aFNvHJarzmb3nMot+D/9M2qhyd2V2H/OkypoiIL+g5OxERsTwVOxERsTwVO3Ezb17lR4kQEfFnKnbiJj4+3uwIIiKGUrETN0lJ7s/9iIjUZCp2IiJieXrO7jrk6bGBF198UY8WiIil6Dk7ERGxPF3GFBERy1OxExERy1OxExERy1OxExERy1OxExERy1OxExERy1OxExERy1OxExERy1OxExERy1OxExERy/s/1A43s6l4MrsAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Encode random vector into a circuit\n", + "\n", + "%matplotlib inline\n", + "\n", + "inputs = np.random.uniform(low=0.0, high=np.pi, size=2)\n", + "\n", + "\n", + "def encode_map(input_data, dim = 2):\n", + " \n", + " q_num = len(input_data)\n", + " encode_map = ZZFeatureMap(feature_dimension=2, reps=1, insert_barriers=True)\n", + " #encode_circuit = encode_map.bind_parameters(input_data)\n", + " \n", + " return encode_map\n", + "\n", + "\n", + "feature_map = encode_map(inputs)\n", + "\n", + "feature_map.decompose().draw(output='mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "10f3cd91", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ┌───┐ ┌───┐\n", + "q_0: ┤ H ├──■──┤ H ├\n", + " └───┘┌─┴─┐└───┘\n", + "q_1: ─────┤ X ├─────\n", + " └───┘ \n", + " ┌──────────┐┌──────────┐ ┌──────────┐┌──────────┐\n", + "q_0: ┤ Ry(θ[0]) ├┤ Rx(θ[2]) ├──■──┤ Ry(θ[4]) ├┤ Rx(θ[6]) ├\n", + " ├──────────┤├──────────┤┌─┴─┐├──────────┤├──────────┤\n", + "q_1: ┤ Ry(θ[1]) ├┤ Rx(θ[3]) ├┤ X ├┤ Ry(θ[5]) ├┤ Rx(θ[7]) ├\n", + " └──────────┘└──────────┘└───┘└──────────┘└──────────┘\n" + ] + } + ], + "source": [ + "# Construct teacher and student networks\n", + "\n", + "from qiskit.circuit.library import RealAmplitudes\n", + "\n", + "\n", + "def teacher_circuit_builder(num_qubits):\n", + " circuit = QuantumCircuit(num_qubits)\n", + "\n", + " circuit.h(0)\n", + " circuit.cx(0, 1)\n", + " circuit.h(0)\n", + " \n", + " return circuit\n", + "\n", + "\n", + "def student_network_builder(num_qubits):\n", + " circuit = TwoLocal(num_qubits=num_qubits, reps=1, entanglement_blocks='cx', entanglement='linear', rotation_blocks=['ry','rx']).decompose()\n", + " \n", + " return circuit\n", + "\n", + "teacher_circuit = teacher_circuit_builder(2)\n", + "print(teacher_circuit)\n", + "\n", + "student_network = student_network_builder(2)\n", + "print(student_network)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "85fcabe2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ParameterView([ParameterVectorElement(x[0]), ParameterVectorElement(x[1]), ParameterVectorElement(θ[0]), ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]), ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]), ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]), ParameterVectorElement(θ[7])])\n", + "ParameterView([])\n" + ] + } + ], + "source": [ + "# Glue together feature map and network\n", + "\n", + "\n", + "tc_full = feature_map.compose(teacher_circuit)\n", + "\n", + "sc_full = feature_map.compose(student_network)\n", + "\n", + "\n", + "print(sc_full.parameters)\n", + "print(teacher_circuit.parameters)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "87421beb", + "metadata": {}, + "outputs": [], + "source": [ + "# set up backed\n", + "\n", + "from qiskit import Aer\n", + "from qiskit.utils import QuantumInstance\n", + "\n", + "backend = Aer.get_backend('qasm_simulator')\n", + "q_instance = QuantumInstance(backend, shots = 8192, seed_simulator = 2718, seed_transpiler = 2718)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "4defc9f5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0.24731445 0.2442627 0.25170898 0.25671387]\n", + " [0.24279785 0.25610352 0.24731445 0.25378418]]\n", + "[[0.24731445 0.2442627 0.25170898 0.25671387]\n", + " [0.3359375 0.046875 0.04370117 0.57348633]]\n", + "8\n" + ] + } + ], + "source": [ + "# QNN formulation\n", + "\n", + "\n", + "qnn_student = CircuitQNN(sc_full, feature_map.parameters, student_network.parameters, quantum_instance=q_instance)\n", + "qnn_teacher = CircuitQNN(tc_full, feature_map.parameters, teacher_circuit.parameters, quantum_instance=q_instance)\n", + "\n", + "\n", + "\n", + "\n", + "input_data = [[0., 0.],[1., 1.] ]\n", + "\n", + "weights = [0. , 0., 0., 0.,0.,0.,0.,0.]\n", + "\n", + "print(qnn_student.forward(input_data, weights))\n", + "print(qnn_teacher.forward(input_data, []))\n", + "print(qnn_student.num_weights)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "62107b82", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 0.00741414 0.03692014 -0.09518764 -0.0651257 0.08205347 -0.06788118\n", + " -0.06402362 -0.09932174]\n", + "tensor([[0.1849, 0.2319, 0.2657, 0.3174],\n", + " [0.3367, 0.1996, 0.1998, 0.2639]], grad_fn=<_TorchNNFunctionBackward>)\n", + "tensor([[0.2473, 0.2443, 0.2517, 0.2567],\n", + " [0.3359, 0.0469, 0.0437, 0.5735]], grad_fn=<_TorchNNFunctionBackward>)\n", + "tensor(1.3710, grad_fn=)\n" + ] + } + ], + "source": [ + "# Defining a PyTorch model and test it\n", + "\n", + "from qiskit_machine_learning.connectors import TorchConnector\n", + "from torch import Tensor\n", + "from torch.nn import Linear, CrossEntropyLoss, MSELoss, KLDivLoss\n", + "\n", + "initial_weights = 0.1 * (2 * algorithm_globals.random.random(qnn_student.num_weights) - 1)\n", + "print(initial_weights)\n", + "#initial_weights = [0. , 0., 0., 0.]\n", + "student_model = TorchConnector(qnn_student, initial_weights=initial_weights)\n", + "teacher_model = TorchConnector(qnn_teacher, initial_weights=[])\n", + "\n", + "\n", + "# test on a dummy input\n", + "input_data = [[0., 0.],[1., 1.]]\n", + "\n", + "f_loss = MSELoss(reduction=\"sum\")\n", + "\n", + "ce_loss = CrossEntropyLoss() \n", + "\n", + "output = student_model(Tensor(input_data)) # Forward pass\n", + "target = teacher_model(Tensor(input_data))\n", + "\n", + "\n", + "\n", + "print(output)\n", + "\n", + "print(target)\n", + "\n", + "\n", + "print(ce_loss(output, target))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "0cc6dc52", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate: 0.08\n", + "MSE Loss 0.0311 CE_Loss: 1.3848 KL_Loss: -0.3959\n", + "MSE Loss 0.2558 CE_Loss: 1.3963 KL_Loss: -0.2988\n", + "MSE Loss 0.3340 CE_Loss: 1.4015 KL_Loss: -0.2723\n", + "MSE Loss 0.1067 CE_Loss: 1.3237 KL_Loss: -0.3174\n", + "MSE Loss 0.0232 CE_Loss: 1.3835 KL_Loss: -0.4001\n", + "Training [1%]\tLoss: 0.1639\n", + "Learning rate: 0.04\n", + "MSE Loss 0.0357 CE_Loss: 1.3542 KL_Loss: -0.3711\n", + "MSE Loss 0.6381 CE_Loss: 1.4905 KL_Loss: -0.2316\n", + "MSE Loss 0.0278 CE_Loss: 1.3829 KL_Loss: -0.4082\n", + "MSE Loss 0.4380 CE_Loss: 1.4024 KL_Loss: -0.2308\n", + "MSE Loss 0.1135 CE_Loss: 1.3089 KL_Loss: -0.3160\n", + "Training [2%]\tLoss: 0.2645\n", + "Learning rate: 0.04\n", + "MSE Loss 0.1228 CE_Loss: 1.4165 KL_Loss: -0.3935\n", + "MSE Loss 0.1494 CE_Loss: 1.3475 KL_Loss: -0.2907\n", + "MSE Loss 0.0342 CE_Loss: 1.3604 KL_Loss: -0.3997\n", + "MSE Loss 0.1221 CE_Loss: 1.3437 KL_Loss: -0.3541\n", + "MSE Loss 0.1616 CE_Loss: 1.4254 KL_Loss: -0.3924\n", + "Training [3%]\tLoss: 0.1318\n", + "Learning rate: 0.04\n", + "MSE Loss 0.1595 CE_Loss: 1.3297 KL_Loss: -0.3196\n", + "MSE Loss 0.1961 CE_Loss: 1.2300 KL_Loss: -0.2498\n", + "MSE Loss 0.0661 CE_Loss: 1.3418 KL_Loss: -0.3803\n", + "MSE Loss 0.0287 CE_Loss: 1.3039 KL_Loss: -0.3720\n", + "MSE Loss 0.5708 CE_Loss: 1.4483 KL_Loss: -0.2188\n", + "Training [4%]\tLoss: 0.2175\n", + "Learning rate: 0.04\n", + "MSE Loss 0.0535 CE_Loss: 1.3486 KL_Loss: -0.3828\n", + "MSE Loss 0.2326 CE_Loss: 1.3905 KL_Loss: -0.2994\n", + "MSE Loss 0.1987 CE_Loss: 1.4400 KL_Loss: -0.3844\n", + "MSE Loss 0.3721 CE_Loss: 1.3675 KL_Loss: -0.2493\n", + "MSE Loss 0.1323 CE_Loss: 1.4183 KL_Loss: -0.3823\n", + "Training [5%]\tLoss: 0.2118\n", + "Learning rate: 0.04\n", + "MSE Loss 0.0341 CE_Loss: 1.2604 KL_Loss: -0.3429\n", + "MSE Loss 0.1473 CE_Loss: 1.4221 KL_Loss: -0.3841\n", + "MSE Loss 0.3715 CE_Loss: 1.2861 KL_Loss: -0.1881\n", + "MSE Loss 0.0069 CE_Loss: 1.3084 KL_Loss: -0.3948\n", + "MSE Loss 0.0589 CE_Loss: 1.3907 KL_Loss: -0.3974\n", + "Training [6%]\tLoss: 0.1370\n", + "Learning rate: 0.04\n", + "MSE Loss 0.0891 CE_Loss: 1.3033 KL_Loss: -0.3345\n", + "MSE Loss 0.2098 CE_Loss: 1.4390 KL_Loss: -0.3931\n", + "MSE Loss 0.0457 CE_Loss: 1.3807 KL_Loss: -0.3873\n", + "MSE Loss 0.1983 CE_Loss: 1.4114 KL_Loss: -0.4089\n", + "MSE Loss 0.0826 CE_Loss: 1.0733 KL_Loss: -0.2718\n", + "Training [7%]\tLoss: 0.1383\n", + "Learning rate: 0.04\n", + "MSE Loss 0.0125 CE_Loss: 1.1506 KL_Loss: -0.3321\n", + "MSE Loss 0.0462 CE_Loss: 1.0881 KL_Loss: -0.2732\n", + "MSE Loss 0.1678 CE_Loss: 1.3413 KL_Loss: -0.3976\n", + "MSE Loss 0.0072 CE_Loss: 1.2416 KL_Loss: -0.3408\n", + "MSE Loss 0.0481 CE_Loss: 1.0202 KL_Loss: -0.2766\n", + "Training [8%]\tLoss: 0.0680\n", + "Learning rate: 0.04\n", + "MSE Loss 0.0736 CE_Loss: 1.3429 KL_Loss: -0.3612\n", + "MSE Loss 0.0059 CE_Loss: 1.1372 KL_Loss: -0.3548\n", + "MSE Loss 0.0027 CE_Loss: 1.2079 KL_Loss: -0.3723\n", + "MSE Loss 0.1907 CE_Loss: 1.4145 KL_Loss: -0.4073\n", + "MSE Loss 0.0072 CE_Loss: 1.2558 KL_Loss: -0.3877\n", + "Training [9%]\tLoss: 0.0687\n", + "Learning rate: 0.04\n", + "MSE Loss 0.0160 CE_Loss: 1.0970 KL_Loss: -0.2829\n", + "MSE Loss 0.1431 CE_Loss: 1.3721 KL_Loss: -0.3993\n", + "MSE Loss 0.0774 CE_Loss: 1.3505 KL_Loss: -0.3516\n", + "MSE Loss 0.0248 CE_Loss: 1.2306 KL_Loss: -0.3455\n", + "MSE Loss 0.0236 CE_Loss: 1.2104 KL_Loss: -0.3324\n", + "Training [10%]\tLoss: 0.0695\n", + "Learning rate: 0.04\n", + "MSE Loss 0.0059 CE_Loss: 1.1214 KL_Loss: -0.3352\n", + "MSE Loss 0.0051 CE_Loss: 1.0371 KL_Loss: -0.3068\n", + "MSE Loss 0.0328 CE_Loss: 1.2376 KL_Loss: -0.3819\n", + "MSE Loss 0.0009 CE_Loss: 1.2514 KL_Loss: -0.3667\n", + "MSE Loss 0.0107 CE_Loss: 1.3691 KL_Loss: -0.3987\n", + "Training [11%]\tLoss: 0.0231\n", + "Learning rate: 0.02\n", + "MSE Loss 0.0345 CE_Loss: 1.3699 KL_Loss: -0.4056\n", + "MSE Loss 0.0004 CE_Loss: 0.8610 KL_Loss: -0.2883\n", + "MSE Loss 0.0206 CE_Loss: 1.3731 KL_Loss: -0.4090\n", + "MSE Loss 0.0079 CE_Loss: 1.3107 KL_Loss: -0.3978\n", + "MSE Loss 0.0090 CE_Loss: 1.1266 KL_Loss: -0.3361\n", + "Training [12%]\tLoss: 0.0266\n", + "Learning rate: 0.02\n", + "MSE Loss 0.0008 CE_Loss: 1.1803 KL_Loss: -0.3538\n", + "MSE Loss 0.0019 CE_Loss: 1.3065 KL_Loss: -0.3884\n", + "MSE Loss 0.0341 CE_Loss: 1.1799 KL_Loss: -0.3122\n", + "MSE Loss 0.0241 CE_Loss: 1.2102 KL_Loss: -0.3338\n", + "MSE Loss 0.0013 CE_Loss: 1.0444 KL_Loss: -0.3468\n", + "Training [13%]\tLoss: 0.0243\n", + "Learning rate: 0.02\n", + "MSE Loss 0.0005 CE_Loss: 1.1514 KL_Loss: -0.3571\n", + "MSE Loss 0.0017 CE_Loss: 1.0200 KL_Loss: -0.3303\n", + "MSE Loss 0.0140 CE_Loss: 1.3860 KL_Loss: -0.4092\n", + "MSE Loss 0.0020 CE_Loss: 1.0606 KL_Loss: -0.3237\n", + "MSE Loss 0.0024 CE_Loss: 1.3647 KL_Loss: -0.4040\n", + "Training [14%]\tLoss: 0.0161\n", + "Learning rate: 0.02\n", + "MSE Loss 0.0095 CE_Loss: 1.0900 KL_Loss: -0.3112\n", + "MSE Loss 0.0158 CE_Loss: 1.3454 KL_Loss: -0.3995\n", + "MSE Loss 0.0005 CE_Loss: 1.1372 KL_Loss: -0.3565\n", + "MSE Loss 0.0113 CE_Loss: 1.1505 KL_Loss: -0.3393\n", + "MSE Loss 0.0096 CE_Loss: 1.1577 KL_Loss: -0.3257\n", + "Training [15%]\tLoss: 0.0211\n", + "Learning rate: 0.02\n", + "MSE Loss 0.0000 CE_Loss: 0.9426 KL_Loss: -0.3182\n", + "MSE Loss 0.0001 CE_Loss: 1.1412 KL_Loss: -0.3505\n", + "MSE Loss 0.0000 CE_Loss: 0.9011 KL_Loss: -0.2987\n", + "MSE Loss 0.0000 CE_Loss: 1.2293 KL_Loss: -0.3493\n", + "MSE Loss 0.0008 CE_Loss: 1.0369 KL_Loss: -0.3321\n", + "Training [16%]\tLoss: 0.0107\n", + "Learning rate: 0.02\n", + "MSE Loss 0.0000 CE_Loss: 1.3850 KL_Loss: -0.4087\n", + "MSE Loss 0.0024 CE_Loss: 1.3798 KL_Loss: -0.4071\n", + "MSE Loss 0.0001 CE_Loss: 1.1828 KL_Loss: -0.3603\n", + "MSE Loss 0.0004 CE_Loss: 1.1712 KL_Loss: -0.3115\n", + "MSE Loss 0.0001 CE_Loss: 1.2251 KL_Loss: -0.3466\n", + "Training [17%]\tLoss: 0.0133\n", + "Learning rate: 0.02\n", + "MSE Loss 0.0002 CE_Loss: 0.7854 KL_Loss: -0.2729\n", + "MSE Loss 0.0014 CE_Loss: 1.3726 KL_Loss: -0.4038\n", + "MSE Loss 0.0006 CE_Loss: 1.1237 KL_Loss: -0.3584\n", + "MSE Loss 0.0057 CE_Loss: 1.1668 KL_Loss: -0.3440\n", + "MSE Loss 0.0007 CE_Loss: 1.3820 KL_Loss: -0.4081\n", + "Training [18%]\tLoss: 0.0134\n", + "Learning rate: 0.02\n", + "MSE Loss 0.0026 CE_Loss: 1.2739 KL_Loss: -0.3854\n", + "MSE Loss 0.0009 CE_Loss: 1.2591 KL_Loss: -0.3870\n", + "MSE Loss 0.0019 CE_Loss: 1.3215 KL_Loss: -0.3859\n", + "MSE Loss 0.0004 CE_Loss: 1.1446 KL_Loss: -0.3418\n", + "MSE Loss 0.0024 CE_Loss: 1.2922 KL_Loss: -0.3901\n", + "Training [19%]\tLoss: 0.0142\n", + "Learning rate: 0.02\n", + "MSE Loss 0.0017 CE_Loss: 1.3833 KL_Loss: -0.4086\n", + "MSE Loss 0.0008 CE_Loss: 1.3675 KL_Loss: -0.4040\n", + "MSE Loss 0.0000 CE_Loss: 0.7730 KL_Loss: -0.2654\n", + "MSE Loss 0.0004 CE_Loss: 1.2045 KL_Loss: -0.3538\n", + "MSE Loss 0.0001 CE_Loss: 1.0268 KL_Loss: -0.3379\n", + "Training [20%]\tLoss: 0.0121\n", + "Learning rate: 0.02\n", + "MSE Loss 0.0001 CE_Loss: 1.1143 KL_Loss: -0.3551\n", + "MSE Loss 0.0001 CE_Loss: 1.0285 KL_Loss: -0.3275\n", + "MSE Loss 0.0018 CE_Loss: 1.3628 KL_Loss: -0.4027\n", + "MSE Loss 0.0035 CE_Loss: 1.3262 KL_Loss: -0.3904\n", + "MSE Loss 0.0010 CE_Loss: 1.0926 KL_Loss: -0.3473\n", + "Training [21%]\tLoss: 0.0131\n", + "Learning rate: 0.01\n", + "MSE Loss 0.0005 CE_Loss: 1.3611 KL_Loss: -0.4012\n", + "MSE Loss 0.0005 CE_Loss: 1.2417 KL_Loss: -0.3707\n", + "MSE Loss 0.0001 CE_Loss: 1.2798 KL_Loss: -0.3839\n", + "MSE Loss 0.0006 CE_Loss: 1.3617 KL_Loss: -0.4027\n", + "MSE Loss 0.0001 CE_Loss: 1.2290 KL_Loss: -0.3605\n", + "Training [22%]\tLoss: 0.0133\n", + "Learning rate: 0.01\n", + "MSE Loss 0.0000 CE_Loss: 1.0630 KL_Loss: -0.3375\n", + "MSE Loss 0.0000 CE_Loss: 1.2830 KL_Loss: -0.3848\n", + "MSE Loss 0.0002 CE_Loss: 1.3154 KL_Loss: -0.3871\n", + "MSE Loss 0.0000 CE_Loss: 0.9596 KL_Loss: -0.3161\n", + "MSE Loss 0.0002 CE_Loss: 1.3055 KL_Loss: -0.3900\n", + "Training [23%]\tLoss: 0.0119\n", + "Learning rate: 0.01\n", + "MSE Loss 0.0010 CE_Loss: 1.2701 KL_Loss: -0.3796\n", + "MSE Loss 0.0000 CE_Loss: 0.8784 KL_Loss: -0.3004\n", + "MSE Loss 0.0002 CE_Loss: 1.1326 KL_Loss: -0.3580\n", + "MSE Loss 0.0001 CE_Loss: 1.0747 KL_Loss: -0.3397\n", + "MSE Loss 0.0003 CE_Loss: 1.1413 KL_Loss: -0.3629\n", + "Training [24%]\tLoss: 0.0113\n", + "Learning rate: 0.01\n", + "MSE Loss 0.0000 CE_Loss: 1.0630 KL_Loss: -0.3416\n", + "MSE Loss 0.0015 CE_Loss: 1.1027 KL_Loss: -0.3233\n", + "MSE Loss 0.0011 CE_Loss: 1.3784 KL_Loss: -0.4055\n", + "MSE Loss 0.0002 CE_Loss: 1.3721 KL_Loss: -0.4052\n", + "MSE Loss 0.0001 CE_Loss: 1.2984 KL_Loss: -0.3888\n", + "Training [25%]\tLoss: 0.0130\n", + "Learning rate: 0.01\n", + "MSE Loss 0.0001 CE_Loss: 1.3738 KL_Loss: -0.4058\n", + "MSE Loss 0.0001 CE_Loss: 1.0897 KL_Loss: -0.3521\n", + "MSE Loss 0.0000 CE_Loss: 1.2752 KL_Loss: -0.3769\n", + "MSE Loss 0.0001 CE_Loss: 1.3059 KL_Loss: -0.3856\n", + "MSE Loss 0.0000 CE_Loss: 1.3217 KL_Loss: -0.3946\n", + "Training [26%]\tLoss: 0.0128\n", + "Learning rate: 0.01\n", + "MSE Loss 0.0001 CE_Loss: 1.1988 KL_Loss: -0.3622\n", + "MSE Loss 0.0001 CE_Loss: 1.3817 KL_Loss: -0.4076\n", + "MSE Loss 0.0002 CE_Loss: 1.3069 KL_Loss: -0.3861\n", + "MSE Loss 0.0001 CE_Loss: 1.1818 KL_Loss: -0.3175\n", + "MSE Loss 0.0002 CE_Loss: 0.8344 KL_Loss: -0.2741\n", + "Training [27%]\tLoss: 0.0119\n", + "Learning rate: 0.01\n", + "MSE Loss 0.0001 CE_Loss: 1.2118 KL_Loss: -0.3698\n", + "MSE Loss 0.0001 CE_Loss: 1.3327 KL_Loss: -0.3919\n", + "MSE Loss 0.0000 CE_Loss: 1.1136 KL_Loss: -0.3318\n", + "MSE Loss 0.0000 CE_Loss: 1.0819 KL_Loss: -0.3324\n", + "MSE Loss 0.0000 CE_Loss: 1.3623 KL_Loss: -0.4028\n", + "Training [28%]\tLoss: 0.0122\n", + "Learning rate: 0.01\n", + "MSE Loss 0.0001 CE_Loss: 1.3553 KL_Loss: -0.3994\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MSE Loss 0.0000 CE_Loss: 1.3538 KL_Loss: -0.3999\n", + "MSE Loss 0.0000 CE_Loss: 1.3855 KL_Loss: -0.4089\n", + "MSE Loss 0.0000 CE_Loss: 1.1624 KL_Loss: -0.3386\n", + "MSE Loss 0.0000 CE_Loss: 1.3630 KL_Loss: -0.4025\n", + "Training [29%]\tLoss: 0.0133\n", + "Learning rate: 0.01\n", + "MSE Loss 0.0001 CE_Loss: 1.3647 KL_Loss: -0.4025\n", + "MSE Loss 0.0000 CE_Loss: 1.3490 KL_Loss: -0.3979\n", + "MSE Loss 0.0000 CE_Loss: 1.3685 KL_Loss: -0.4042\n", + "MSE Loss 0.0000 CE_Loss: 1.3805 KL_Loss: -0.4076\n", + "MSE Loss 0.0000 CE_Loss: 1.3254 KL_Loss: -0.3957\n", + "Training [30%]\tLoss: 0.0136\n", + "Learning rate: 0.01\n", + "MSE Loss 0.0000 CE_Loss: 1.3385 KL_Loss: -0.3952\n", + "MSE Loss 0.0000 CE_Loss: 1.3778 KL_Loss: -0.4065\n", + "MSE Loss 0.0000 CE_Loss: 1.0558 KL_Loss: -0.3370\n", + "MSE Loss 0.0000 CE_Loss: 1.2610 KL_Loss: -0.3784\n", + "MSE Loss 0.0000 CE_Loss: 1.3590 KL_Loss: -0.4013\n", + "Training [31%]\tLoss: 0.0128\n", + "Learning rate: 0.005\n", + "MSE Loss 0.0000 CE_Loss: 0.9554 KL_Loss: -0.3116\n", + "MSE Loss 0.0000 CE_Loss: 1.1313 KL_Loss: -0.3326\n", + "MSE Loss 0.0000 CE_Loss: 1.0811 KL_Loss: -0.3461\n", + "MSE Loss 0.0000 CE_Loss: 1.0993 KL_Loss: -0.3209\n", + "MSE Loss 0.0000 CE_Loss: 1.2216 KL_Loss: -0.3695\n", + "Training [32%]\tLoss: 0.0110\n", + "Learning rate: 0.005\n", + "MSE Loss 0.0000 CE_Loss: 1.2795 KL_Loss: -0.3848\n", + "MSE Loss 0.0000 CE_Loss: 1.2414 KL_Loss: -0.3550\n", + "MSE Loss 0.0000 CE_Loss: 1.3090 KL_Loss: -0.3931\n", + "MSE Loss 0.0000 CE_Loss: 0.9696 KL_Loss: -0.3137\n", + "MSE Loss 0.0000 CE_Loss: 1.1080 KL_Loss: -0.3500\n", + "Training [33%]\tLoss: 0.0118\n", + "Learning rate: 0.005\n", + "MSE Loss 0.0000 CE_Loss: 1.0171 KL_Loss: -0.3306\n", + "MSE Loss 0.0000 CE_Loss: 0.8638 KL_Loss: -0.2918\n", + "MSE Loss 0.0000 CE_Loss: 1.3124 KL_Loss: -0.3901\n", + "MSE Loss 0.0000 CE_Loss: 1.1331 KL_Loss: -0.3382\n", + "MSE Loss 0.0000 CE_Loss: 1.3420 KL_Loss: -0.3962\n", + "Training [34%]\tLoss: 0.0113\n", + "Learning rate: 0.005\n", + "MSE Loss 0.0001 CE_Loss: 1.2668 KL_Loss: -0.3822\n", + "MSE Loss 0.0000 CE_Loss: 1.3678 KL_Loss: -0.4039\n", + "MSE Loss 0.0000 CE_Loss: 1.2796 KL_Loss: -0.3830\n", + "MSE Loss 0.0000 CE_Loss: 1.1762 KL_Loss: -0.3111\n", + "MSE Loss 0.0000 CE_Loss: 1.2137 KL_Loss: -0.3577\n", + "Training [35%]\tLoss: 0.0126\n", + "Learning rate: 0.005\n", + "MSE Loss 0.0000 CE_Loss: 1.1966 KL_Loss: -0.3677\n", + "MSE Loss 0.0000 CE_Loss: 0.8217 KL_Loss: -0.2877\n", + "MSE Loss 0.0000 CE_Loss: 1.0357 KL_Loss: -0.3418\n", + "MSE Loss 0.0000 CE_Loss: 1.1706 KL_Loss: -0.3333\n", + "MSE Loss 0.0000 CE_Loss: 1.3253 KL_Loss: -0.3922\n", + "Training [36%]\tLoss: 0.0111\n", + "Learning rate: 0.005\n", + "MSE Loss 0.0000 CE_Loss: 1.3775 KL_Loss: -0.4065\n", + "MSE Loss 0.0000 CE_Loss: 1.1742 KL_Loss: -0.3094\n", + "MSE Loss 0.0000 CE_Loss: 1.2891 KL_Loss: -0.3764\n", + "MSE Loss 0.0000 CE_Loss: 1.2476 KL_Loss: -0.3630\n", + "MSE Loss 0.0000 CE_Loss: 1.2693 KL_Loss: -0.3793\n", + "Training [37%]\tLoss: 0.0127\n", + "Learning rate: 0.005\n", + "MSE Loss 0.0000 CE_Loss: 1.1629 KL_Loss: -0.3486\n", + "MSE Loss 0.0000 CE_Loss: 1.2412 KL_Loss: -0.3660\n", + "MSE Loss 0.0001 CE_Loss: 1.2865 KL_Loss: -0.3751\n", + "MSE Loss 0.0000 CE_Loss: 1.3151 KL_Loss: -0.3880\n", + "MSE Loss 0.0000 CE_Loss: 1.0613 KL_Loss: -0.3378\n", + "Training [38%]\tLoss: 0.0122\n", + "Learning rate: 0.005\n", + "MSE Loss 0.0000 CE_Loss: 1.2506 KL_Loss: -0.3765\n", + "MSE Loss 0.0000 CE_Loss: 0.9980 KL_Loss: -0.3073\n", + "MSE Loss 0.0000 CE_Loss: 1.3451 KL_Loss: -0.3964\n", + "MSE Loss 0.0000 CE_Loss: 0.9386 KL_Loss: -0.3208\n", + "MSE Loss 0.0000 CE_Loss: 1.3186 KL_Loss: -0.3898\n", + "Training [39%]\tLoss: 0.0117\n", + "Learning rate: 0.005\n", + "MSE Loss 0.0000 CE_Loss: 1.2000 KL_Loss: -0.3727\n", + "MSE Loss 0.0000 CE_Loss: 0.9171 KL_Loss: -0.2953\n", + "MSE Loss 0.0000 CE_Loss: 1.0641 KL_Loss: -0.3451\n", + "MSE Loss 0.0000 CE_Loss: 0.9906 KL_Loss: -0.3116\n", + "MSE Loss 0.0000 CE_Loss: 1.3786 KL_Loss: -0.4069\n", + "Training [40%]\tLoss: 0.0111\n", + "Learning rate: 0.005\n", + "MSE Loss 0.0000 CE_Loss: 1.3719 KL_Loss: -0.4049\n", + "MSE Loss 0.0000 CE_Loss: 1.3556 KL_Loss: -0.4001\n", + "MSE Loss 0.0000 CE_Loss: 1.0596 KL_Loss: -0.3091\n", + "MSE Loss 0.0000 CE_Loss: 0.8691 KL_Loss: -0.2971\n", + "MSE Loss 0.0000 CE_Loss: 0.8885 KL_Loss: -0.3033\n", + "Training [41%]\tLoss: 0.0111\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.0000 CE_Loss: 1.3523 KL_Loss: -0.4006\n", + "MSE Loss 0.0000 CE_Loss: 0.9881 KL_Loss: -0.3250\n", + "MSE Loss 0.0000 CE_Loss: 1.2173 KL_Loss: -0.3710\n", + "MSE Loss 0.0000 CE_Loss: 1.3621 KL_Loss: -0.4034\n", + "MSE Loss 0.0000 CE_Loss: 1.3467 KL_Loss: -0.3988\n", + "Training [42%]\tLoss: 0.0125\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.0000 CE_Loss: 1.1149 KL_Loss: -0.3319\n", + "MSE Loss 0.0000 CE_Loss: 1.3516 KL_Loss: -0.3999\n", + "MSE Loss 0.0000 CE_Loss: 1.2095 KL_Loss: -0.3491\n", + "MSE Loss 0.0000 CE_Loss: 1.2767 KL_Loss: -0.3726\n", + "MSE Loss 0.0000 CE_Loss: 1.3181 KL_Loss: -0.3926\n", + "Training [43%]\tLoss: 0.0125\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.0000 CE_Loss: 1.3117 KL_Loss: -0.3850\n", + "MSE Loss 0.0000 CE_Loss: 1.2652 KL_Loss: -0.3737\n", + "MSE Loss 0.0000 CE_Loss: 1.3733 KL_Loss: -0.4053\n", + "MSE Loss 0.0000 CE_Loss: 1.1795 KL_Loss: -0.3645\n", + "MSE Loss 0.0000 CE_Loss: 1.3348 KL_Loss: -0.3967\n", + "Training [44%]\tLoss: 0.0129\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.0000 CE_Loss: 1.3674 KL_Loss: -0.4044\n", + "MSE Loss 0.0000 CE_Loss: 1.2406 KL_Loss: -0.3769\n", + "MSE Loss 0.0000 CE_Loss: 1.3840 KL_Loss: -0.4083\n", + "MSE Loss 0.0000 CE_Loss: 1.0483 KL_Loss: -0.3414\n", + "MSE Loss 0.0000 CE_Loss: 1.2499 KL_Loss: -0.3678\n", + "Training [45%]\tLoss: 0.0126\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.0000 CE_Loss: 1.2048 KL_Loss: -0.3354\n", + "MSE Loss 0.0000 CE_Loss: 1.0160 KL_Loss: -0.3068\n", + "MSE Loss 0.0000 CE_Loss: 1.2649 KL_Loss: -0.3681\n", + "MSE Loss 0.0000 CE_Loss: 0.9835 KL_Loss: -0.3047\n", + "MSE Loss 0.0000 CE_Loss: 1.3267 KL_Loss: -0.3947\n", + "Training [46%]\tLoss: 0.0116\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.0000 CE_Loss: 1.2146 KL_Loss: -0.3593\n", + "MSE Loss 0.0000 CE_Loss: 1.3290 KL_Loss: -0.3944\n", + "MSE Loss 0.0000 CE_Loss: 1.1608 KL_Loss: -0.3583\n", + "MSE Loss 0.0000 CE_Loss: 1.3841 KL_Loss: -0.4085\n", + "MSE Loss 0.0000 CE_Loss: 1.1273 KL_Loss: -0.3502\n", + "Training [47%]\tLoss: 0.0124\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.0000 CE_Loss: 1.3746 KL_Loss: -0.4059\n", + "MSE Loss 0.0000 CE_Loss: 1.3661 KL_Loss: -0.4037\n", + "MSE Loss 0.0000 CE_Loss: 1.3394 KL_Loss: -0.3948\n", + "MSE Loss 0.0000 CE_Loss: 1.0990 KL_Loss: -0.3261\n", + "MSE Loss 0.0000 CE_Loss: 0.9276 KL_Loss: -0.2964\n", + "Training [48%]\tLoss: 0.0122\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.0000 CE_Loss: 1.2919 KL_Loss: -0.3855\n", + "MSE Loss 0.0000 CE_Loss: 1.2107 KL_Loss: -0.3442\n", + "MSE Loss 0.0000 CE_Loss: 1.2785 KL_Loss: -0.3828\n", + "MSE Loss 0.0000 CE_Loss: 1.2519 KL_Loss: -0.3727\n", + "MSE Loss 0.0000 CE_Loss: 1.3826 KL_Loss: -0.4080\n", + "Training [49%]\tLoss: 0.0128\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.0000 CE_Loss: 1.3687 KL_Loss: -0.4039\n", + "MSE Loss 0.0000 CE_Loss: 1.1874 KL_Loss: -0.3680\n", + "MSE Loss 0.0000 CE_Loss: 1.0403 KL_Loss: -0.3278\n", + "MSE Loss 0.0000 CE_Loss: 1.1648 KL_Loss: -0.3056\n", + "MSE Loss 0.0000 CE_Loss: 0.8093 KL_Loss: -0.2812\n", + "Training [50%]\tLoss: 0.0111\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.0000 CE_Loss: 1.3559 KL_Loss: -0.4016\n", + "MSE Loss 0.0000 CE_Loss: 1.2304 KL_Loss: -0.3612\n", + "MSE Loss 0.0000 CE_Loss: 1.3782 KL_Loss: -0.4067\n", + "MSE Loss 0.0000 CE_Loss: 1.1528 KL_Loss: -0.3648\n", + "MSE Loss 0.0000 CE_Loss: 1.3007 KL_Loss: -0.3869\n", + "Training [51%]\tLoss: 0.0128\n", + "Learning rate: 0.00125\n", + "MSE Loss 0.0000 CE_Loss: 1.3400 KL_Loss: -0.3961\n", + "MSE Loss 0.0000 CE_Loss: 1.3542 KL_Loss: -0.4002\n", + "MSE Loss 0.0000 CE_Loss: 1.1895 KL_Loss: -0.3327\n", + "MSE Loss 0.0000 CE_Loss: 1.0775 KL_Loss: -0.3276\n", + "MSE Loss 0.0000 CE_Loss: 1.0820 KL_Loss: -0.3136\n", + "Training [52%]\tLoss: 0.0121\n", + "Learning rate: 0.00125\n", + "MSE Loss 0.0000 CE_Loss: 1.2150 KL_Loss: -0.3442\n", + "MSE Loss 0.0000 CE_Loss: 1.3850 KL_Loss: -0.4087\n", + "MSE Loss 0.0000 CE_Loss: 1.3815 KL_Loss: -0.4078\n", + "MSE Loss 0.0000 CE_Loss: 1.0189 KL_Loss: -0.3387\n", + "MSE Loss 0.0000 CE_Loss: 0.8845 KL_Loss: -0.2942\n", + "Training [53%]\tLoss: 0.0118\n", + "Learning rate: 0.00125\n", + "MSE Loss 0.0000 CE_Loss: 0.8912 KL_Loss: -0.3000\n", + "MSE Loss 0.0000 CE_Loss: 1.3862 KL_Loss: -0.4091\n", + "MSE Loss 0.0000 CE_Loss: 0.9481 KL_Loss: -0.3201\n", + "MSE Loss 0.0000 CE_Loss: 1.3179 KL_Loss: -0.3876\n", + "MSE Loss 0.0000 CE_Loss: 1.2534 KL_Loss: -0.3623\n", + "Training [54%]\tLoss: 0.0116\n", + "Learning rate: 0.00125\n", + "MSE Loss 0.0000 CE_Loss: 1.2212 KL_Loss: -0.3569\n", + "MSE Loss 0.0000 CE_Loss: 1.2121 KL_Loss: -0.3491\n", + "MSE Loss 0.0000 CE_Loss: 1.3852 KL_Loss: -0.4088\n", + "MSE Loss 0.0000 CE_Loss: 0.9195 KL_Loss: -0.3035\n", + "MSE Loss 0.0000 CE_Loss: 1.3367 KL_Loss: -0.3948\n", + "Training [55%]\tLoss: 0.0122\n", + "Learning rate: 0.00125\n", + "MSE Loss 0.0000 CE_Loss: 1.3823 KL_Loss: -0.4080\n", + "MSE Loss 0.0000 CE_Loss: 1.3757 KL_Loss: -0.4065\n", + "MSE Loss 0.0000 CE_Loss: 1.1304 KL_Loss: -0.3263\n", + "MSE Loss 0.0000 CE_Loss: 1.1499 KL_Loss: -0.3577\n", + "MSE Loss 0.0000 CE_Loss: 1.3168 KL_Loss: -0.3900\n", + "Training [56%]\tLoss: 0.0127\n", + "Learning rate: 0.00125\n", + "MSE Loss 0.0000 CE_Loss: 1.3851 KL_Loss: -0.4087\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MSE Loss 0.0000 CE_Loss: 1.2421 KL_Loss: -0.3749\n", + "MSE Loss 0.0000 CE_Loss: 0.7998 KL_Loss: -0.2746\n", + "MSE Loss 0.0000 CE_Loss: 0.8881 KL_Loss: -0.3003\n", + "MSE Loss 0.0000 CE_Loss: 1.3279 KL_Loss: -0.3920\n", + "Training [57%]\tLoss: 0.0113\n", + "Learning rate: 0.00125\n", + "MSE Loss 0.0000 CE_Loss: 1.3204 KL_Loss: -0.3938\n", + "MSE Loss 0.0000 CE_Loss: 1.0971 KL_Loss: -0.3505\n", + "MSE Loss 0.0000 CE_Loss: 1.2548 KL_Loss: -0.3632\n", + "MSE Loss 0.0000 CE_Loss: 1.2066 KL_Loss: -0.3650\n", + "MSE Loss 0.0000 CE_Loss: 1.2863 KL_Loss: -0.3850\n", + "Training [58%]\tLoss: 0.0123\n", + "Learning rate: 0.00125\n", + "MSE Loss 0.0000 CE_Loss: 1.2674 KL_Loss: -0.3793\n", + "MSE Loss 0.0000 CE_Loss: 1.0994 KL_Loss: -0.3348\n", + "MSE Loss 0.0000 CE_Loss: 1.2788 KL_Loss: -0.3755\n", + "MSE Loss 0.0000 CE_Loss: 1.3455 KL_Loss: -0.3995\n", + "MSE Loss 0.0000 CE_Loss: 1.0321 KL_Loss: -0.3401\n", + "Training [59%]\tLoss: 0.0121\n", + "Learning rate: 0.00125\n", + "MSE Loss 0.0000 CE_Loss: 1.2476 KL_Loss: -0.3700\n", + "MSE Loss 0.0000 CE_Loss: 1.1480 KL_Loss: -0.3587\n", + "MSE Loss 0.0000 CE_Loss: 1.0078 KL_Loss: -0.3297\n", + "MSE Loss 0.0000 CE_Loss: 1.1441 KL_Loss: -0.3094\n", + "MSE Loss 0.0000 CE_Loss: 1.1737 KL_Loss: -0.3592\n", + "Training [60%]\tLoss: 0.0114\n", + "Learning rate: 0.00125\n", + "MSE Loss 0.0000 CE_Loss: 1.0760 KL_Loss: -0.3361\n", + "MSE Loss 0.0000 CE_Loss: 1.1117 KL_Loss: -0.3262\n", + "MSE Loss 0.0000 CE_Loss: 1.2954 KL_Loss: -0.3871\n", + "MSE Loss 0.0000 CE_Loss: 1.2653 KL_Loss: -0.3759\n", + "MSE Loss 0.0000 CE_Loss: 1.2423 KL_Loss: -0.3745\n", + "Training [61%]\tLoss: 0.0120\n", + "Learning rate: 0.000625\n", + "MSE Loss 0.0000 CE_Loss: 0.9661 KL_Loss: -0.3113\n", + "MSE Loss 0.0000 CE_Loss: 1.1573 KL_Loss: -0.3395\n", + "MSE Loss 0.0000 CE_Loss: 1.3357 KL_Loss: -0.3956\n", + "MSE Loss 0.0000 CE_Loss: 1.2499 KL_Loss: -0.3805\n", + "MSE Loss 0.0000 CE_Loss: 1.2620 KL_Loss: -0.3845\n", + "Training [62%]\tLoss: 0.0119\n", + "Learning rate: 0.000625\n", + "MSE Loss 0.0000 CE_Loss: 1.0117 KL_Loss: -0.3240\n", + "MSE Loss 0.0000 CE_Loss: 1.3810 KL_Loss: -0.4076\n", + "MSE Loss 0.0000 CE_Loss: 1.2194 KL_Loss: -0.3694\n", + "MSE Loss 0.0000 CE_Loss: 0.9807 KL_Loss: -0.3220\n", + "MSE Loss 0.0000 CE_Loss: 1.0856 KL_Loss: -0.3323\n", + "Training [63%]\tLoss: 0.0114\n", + "Learning rate: 0.000625\n", + "MSE Loss 0.0000 CE_Loss: 1.3492 KL_Loss: -0.3978\n", + "MSE Loss 0.0000 CE_Loss: 1.2210 KL_Loss: -0.3457\n", + "MSE Loss 0.0000 CE_Loss: 1.2997 KL_Loss: -0.3803\n", + "MSE Loss 0.0000 CE_Loss: 1.3832 KL_Loss: -0.4082\n", + "MSE Loss 0.0000 CE_Loss: 1.3744 KL_Loss: -0.4058\n", + "Training [64%]\tLoss: 0.0133\n", + "Learning rate: 0.000625\n", + "MSE Loss 0.0000 CE_Loss: 1.0962 KL_Loss: -0.3426\n", + "MSE Loss 0.0000 CE_Loss: 1.3632 KL_Loss: -0.4027\n", + "MSE Loss 0.0000 CE_Loss: 0.9650 KL_Loss: -0.3192\n", + "MSE Loss 0.0000 CE_Loss: 1.2445 KL_Loss: -0.3675\n", + "MSE Loss 0.0000 CE_Loss: 1.2143 KL_Loss: -0.3468\n", + "Training [65%]\tLoss: 0.0118\n", + "Learning rate: 0.000625\n", + "MSE Loss 0.0000 CE_Loss: 1.3823 KL_Loss: -0.4079\n", + "MSE Loss 0.0000 CE_Loss: 1.1420 KL_Loss: -0.3537\n", + "MSE Loss 0.0000 CE_Loss: 1.1212 KL_Loss: -0.3446\n", + "MSE Loss 0.0000 CE_Loss: 1.3720 KL_Loss: -0.4049\n", + "MSE Loss 0.0000 CE_Loss: 0.9057 KL_Loss: -0.2996\n", + "Training [66%]\tLoss: 0.0118\n", + "Learning rate: 0.000625\n", + "MSE Loss 0.0000 CE_Loss: 1.3854 KL_Loss: -0.4088\n", + "MSE Loss 0.0000 CE_Loss: 1.0977 KL_Loss: -0.2994\n", + "MSE Loss 0.0000 CE_Loss: 1.3853 KL_Loss: -0.4088\n", + "MSE Loss 0.0000 CE_Loss: 1.3112 KL_Loss: -0.3928\n", + "MSE Loss 0.0000 CE_Loss: 1.1436 KL_Loss: -0.3458\n", + "Training [67%]\tLoss: 0.0127\n", + "Learning rate: 0.000625\n", + "MSE Loss 0.0000 CE_Loss: 1.0267 KL_Loss: -0.3400\n", + "MSE Loss 0.0000 CE_Loss: 0.8605 KL_Loss: -0.2976\n", + "MSE Loss 0.0000 CE_Loss: 1.1707 KL_Loss: -0.3343\n", + "MSE Loss 0.0000 CE_Loss: 1.0137 KL_Loss: -0.3110\n", + "MSE Loss 0.0000 CE_Loss: 1.1660 KL_Loss: -0.3446\n", + "Training [68%]\tLoss: 0.0105\n", + "Learning rate: 0.000625\n", + "MSE Loss 0.0000 CE_Loss: 1.3170 KL_Loss: -0.3937\n", + "MSE Loss 0.0000 CE_Loss: 1.2202 KL_Loss: -0.3430\n", + "MSE Loss 0.0000 CE_Loss: 1.3677 KL_Loss: -0.4036\n", + "MSE Loss 0.0000 CE_Loss: 1.3779 KL_Loss: -0.4068\n", + "MSE Loss 0.0000 CE_Loss: 1.3853 KL_Loss: -0.4088\n", + "Training [69%]\tLoss: 0.0133\n", + "Learning rate: 0.000625\n", + "MSE Loss 0.0000 CE_Loss: 0.8492 KL_Loss: -0.2932\n", + "MSE Loss 0.0000 CE_Loss: 1.1759 KL_Loss: -0.3139\n", + "MSE Loss 0.0000 CE_Loss: 1.3383 KL_Loss: -0.3942\n", + "MSE Loss 0.0000 CE_Loss: 0.8573 KL_Loss: -0.2919\n", + "MSE Loss 0.0000 CE_Loss: 0.8001 KL_Loss: -0.2771\n", + "Training [70%]\tLoss: 0.0100\n", + "Learning rate: 0.000625\n", + "MSE Loss 0.0000 CE_Loss: 0.9990 KL_Loss: -0.3291\n", + "MSE Loss 0.0000 CE_Loss: 0.7969 KL_Loss: -0.2718\n", + "MSE Loss 0.0000 CE_Loss: 0.9340 KL_Loss: -0.3187\n", + "MSE Loss 0.0000 CE_Loss: 1.3862 KL_Loss: -0.4091\n", + "MSE Loss 0.0000 CE_Loss: 0.9876 KL_Loss: -0.3268\n", + "Training [71%]\tLoss: 0.0102\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.3540 KL_Loss: -0.4001\n", + "MSE Loss 0.0000 CE_Loss: 1.2062 KL_Loss: -0.3530\n", + "MSE Loss 0.0000 CE_Loss: 1.2018 KL_Loss: -0.3466\n", + "MSE Loss 0.0000 CE_Loss: 1.3583 KL_Loss: -0.4013\n", + "MSE Loss 0.0000 CE_Loss: 1.2254 KL_Loss: -0.3575\n", + "Training [72%]\tLoss: 0.0127\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 0.8693 KL_Loss: -0.2996\n", + "MSE Loss 0.0000 CE_Loss: 1.1273 KL_Loss: -0.3551\n", + "MSE Loss 0.0000 CE_Loss: 1.1354 KL_Loss: -0.3547\n", + "MSE Loss 0.0000 CE_Loss: 1.2284 KL_Loss: -0.3729\n", + "MSE Loss 0.0000 CE_Loss: 1.3862 KL_Loss: -0.4090\n", + "Training [73%]\tLoss: 0.0115\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.2548 KL_Loss: -0.3763\n", + "MSE Loss 0.0000 CE_Loss: 1.3843 KL_Loss: -0.4085\n", + "MSE Loss 0.0000 CE_Loss: 1.3114 KL_Loss: -0.3905\n", + "MSE Loss 0.0000 CE_Loss: 1.2009 KL_Loss: -0.3378\n", + "MSE Loss 0.0000 CE_Loss: 1.3471 KL_Loss: -0.3968\n", + "Training [74%]\tLoss: 0.0130\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.2116 KL_Loss: -0.3711\n", + "MSE Loss 0.0000 CE_Loss: 1.2855 KL_Loss: -0.3851\n", + "MSE Loss 0.0001 CE_Loss: 1.2681 KL_Loss: -0.3743\n", + "MSE Loss 0.0000 CE_Loss: 1.1385 KL_Loss: -0.3439\n", + "MSE Loss 0.0000 CE_Loss: 1.2075 KL_Loss: -0.3625\n", + "Training [75%]\tLoss: 0.0122\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.2809 KL_Loss: -0.3738\n", + "MSE Loss 0.0000 CE_Loss: 1.2848 KL_Loss: -0.3744\n", + "MSE Loss 0.0000 CE_Loss: 1.3731 KL_Loss: -0.4052\n", + "MSE Loss 0.0000 CE_Loss: 1.3516 KL_Loss: -0.3986\n", + "MSE Loss 0.0000 CE_Loss: 1.3583 KL_Loss: -0.4019\n", + "Training [76%]\tLoss: 0.0133\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.0174 KL_Loss: -0.3302\n", + "MSE Loss 0.0000 CE_Loss: 1.3738 KL_Loss: -0.4062\n", + "MSE Loss 0.0000 CE_Loss: 1.3265 KL_Loss: -0.3933\n", + "MSE Loss 0.0000 CE_Loss: 1.2754 KL_Loss: -0.3779\n", + "MSE Loss 0.0000 CE_Loss: 1.1236 KL_Loss: -0.3409\n", + "Training [77%]\tLoss: 0.0122\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.3373 KL_Loss: -0.3964\n", + "MSE Loss 0.0000 CE_Loss: 1.3502 KL_Loss: -0.3989\n", + "MSE Loss 0.0000 CE_Loss: 1.2487 KL_Loss: -0.3706\n", + "MSE Loss 0.0000 CE_Loss: 1.3817 KL_Loss: -0.4077\n", + "MSE Loss 0.0000 CE_Loss: 1.3399 KL_Loss: -0.3963\n", + "Training [78%]\tLoss: 0.0133\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.3186 KL_Loss: -0.3928\n", + "MSE Loss 0.0000 CE_Loss: 1.3683 KL_Loss: -0.4040\n", + "MSE Loss 0.0000 CE_Loss: 1.0703 KL_Loss: -0.3271\n", + "MSE Loss 0.0000 CE_Loss: 1.2477 KL_Loss: -0.3685\n", + "MSE Loss 0.0000 CE_Loss: 1.3671 KL_Loss: -0.4035\n", + "Training [79%]\tLoss: 0.0128\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.1816 KL_Loss: -0.3444\n", + "MSE Loss 0.0000 CE_Loss: 1.0964 KL_Loss: -0.3532\n", + "MSE Loss 0.0000 CE_Loss: 1.3713 KL_Loss: -0.4050\n", + "MSE Loss 0.0000 CE_Loss: 1.3570 KL_Loss: -0.4010\n", + "MSE Loss 0.0000 CE_Loss: 1.1438 KL_Loss: -0.3325\n", + "Training [80%]\tLoss: 0.0123\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.2790 KL_Loss: -0.3860\n", + "MSE Loss 0.0000 CE_Loss: 1.1857 KL_Loss: -0.3613\n", + "MSE Loss 0.0000 CE_Loss: 1.2193 KL_Loss: -0.3766\n", + "MSE Loss 0.0000 CE_Loss: 0.8322 KL_Loss: -0.2794\n", + "MSE Loss 0.0000 CE_Loss: 1.2224 KL_Loss: -0.3677\n", + "Training [81%]\tLoss: 0.0115\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 0.9903 KL_Loss: -0.3230\n", + "MSE Loss 0.0000 CE_Loss: 1.2005 KL_Loss: -0.3464\n", + "MSE Loss 0.0000 CE_Loss: 0.9080 KL_Loss: -0.3037\n", + "MSE Loss 0.0000 CE_Loss: 1.2749 KL_Loss: -0.3779\n", + "MSE Loss 0.0000 CE_Loss: 1.0901 KL_Loss: -0.3477\n", + "Training [82%]\tLoss: 0.0109\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.1152 KL_Loss: -0.3247\n", + "MSE Loss 0.0000 CE_Loss: 1.3014 KL_Loss: -0.3861\n", + "MSE Loss 0.0000 CE_Loss: 1.3766 KL_Loss: -0.4064\n", + "MSE Loss 0.0000 CE_Loss: 1.3197 KL_Loss: -0.3881\n", + "MSE Loss 0.0000 CE_Loss: 1.2760 KL_Loss: -0.3808\n", + "Training [83%]\tLoss: 0.0128\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.3861 KL_Loss: -0.4090\n", + "MSE Loss 0.0000 CE_Loss: 1.1998 KL_Loss: -0.3644\n", + "MSE Loss 0.0000 CE_Loss: 1.3374 KL_Loss: -0.3944\n", + "MSE Loss 0.0000 CE_Loss: 1.3841 KL_Loss: -0.4085\n", + "MSE Loss 0.0000 CE_Loss: 1.1691 KL_Loss: -0.3409\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Training [84%]\tLoss: 0.0130\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.2213 KL_Loss: -0.3515\n", + "MSE Loss 0.0000 CE_Loss: 1.3846 KL_Loss: -0.4086\n", + "MSE Loss 0.0000 CE_Loss: 1.3098 KL_Loss: -0.3896\n", + "MSE Loss 0.0000 CE_Loss: 1.2630 KL_Loss: -0.3695\n", + "MSE Loss 0.0000 CE_Loss: 1.3722 KL_Loss: -0.4049\n", + "Training [85%]\tLoss: 0.0131\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 0.8350 KL_Loss: -0.2867\n", + "MSE Loss 0.0000 CE_Loss: 1.1941 KL_Loss: -0.3586\n", + "MSE Loss 0.0000 CE_Loss: 1.3166 KL_Loss: -0.3922\n", + "MSE Loss 0.0000 CE_Loss: 1.3805 KL_Loss: -0.4075\n", + "MSE Loss 0.0000 CE_Loss: 1.3656 KL_Loss: -0.4035\n", + "Training [86%]\tLoss: 0.0122\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.2260 KL_Loss: -0.3645\n", + "MSE Loss 0.0000 CE_Loss: 1.1998 KL_Loss: -0.3340\n", + "MSE Loss 0.0000 CE_Loss: 0.9488 KL_Loss: -0.2993\n", + "MSE Loss 0.0000 CE_Loss: 0.9008 KL_Loss: -0.3094\n", + "MSE Loss 0.0000 CE_Loss: 1.2663 KL_Loss: -0.3757\n", + "Training [87%]\tLoss: 0.0111\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.3388 KL_Loss: -0.3948\n", + "MSE Loss 0.0000 CE_Loss: 1.1887 KL_Loss: -0.3528\n", + "MSE Loss 0.0000 CE_Loss: 1.1454 KL_Loss: -0.3550\n", + "MSE Loss 0.0000 CE_Loss: 1.2095 KL_Loss: -0.3391\n", + "MSE Loss 0.0000 CE_Loss: 1.3862 KL_Loss: -0.4090\n", + "Training [88%]\tLoss: 0.0125\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.2660 KL_Loss: -0.3679\n", + "MSE Loss 0.0000 CE_Loss: 1.3194 KL_Loss: -0.3923\n", + "MSE Loss 0.0000 CE_Loss: 1.3844 KL_Loss: -0.4085\n", + "MSE Loss 0.0000 CE_Loss: 1.3773 KL_Loss: -0.4065\n", + "MSE Loss 0.0000 CE_Loss: 1.3426 KL_Loss: -0.3962\n", + "Training [89%]\tLoss: 0.0134\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.2302 KL_Loss: -0.3633\n", + "MSE Loss 0.0000 CE_Loss: 1.3556 KL_Loss: -0.4001\n", + "MSE Loss 0.0000 CE_Loss: 1.3662 KL_Loss: -0.4037\n", + "MSE Loss 0.0000 CE_Loss: 1.3759 KL_Loss: -0.4062\n", + "MSE Loss 0.0000 CE_Loss: 1.3421 KL_Loss: -0.3970\n", + "Training [90%]\tLoss: 0.0133\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.2364 KL_Loss: -0.3690\n", + "MSE Loss 0.0000 CE_Loss: 1.3862 KL_Loss: -0.4091\n", + "MSE Loss 0.0000 CE_Loss: 1.3122 KL_Loss: -0.3870\n", + "MSE Loss 0.0000 CE_Loss: 1.0240 KL_Loss: -0.3152\n", + "MSE Loss 0.0000 CE_Loss: 1.2480 KL_Loss: -0.3682\n", + "Training [91%]\tLoss: 0.0124\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.3197 KL_Loss: -0.3894\n", + "MSE Loss 0.0000 CE_Loss: 1.2241 KL_Loss: -0.3452\n", + "MSE Loss 0.0000 CE_Loss: 0.9064 KL_Loss: -0.3027\n", + "MSE Loss 0.0000 CE_Loss: 1.3776 KL_Loss: -0.4066\n", + "MSE Loss 0.0000 CE_Loss: 1.2399 KL_Loss: -0.3730\n", + "Training [92%]\tLoss: 0.0121\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.2531 KL_Loss: -0.3739\n", + "MSE Loss 0.0000 CE_Loss: 1.3245 KL_Loss: -0.3899\n", + "MSE Loss 0.0000 CE_Loss: 1.3840 KL_Loss: -0.4085\n", + "MSE Loss 0.0000 CE_Loss: 1.0680 KL_Loss: -0.3476\n", + "MSE Loss 0.0000 CE_Loss: 0.9737 KL_Loss: -0.3230\n", + "Training [93%]\tLoss: 0.0120\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.1997 KL_Loss: -0.3301\n", + "MSE Loss 0.0000 CE_Loss: 1.0761 KL_Loss: -0.3139\n", + "MSE Loss 0.0000 CE_Loss: 1.3190 KL_Loss: -0.3887\n", + "MSE Loss 0.0000 CE_Loss: 1.3731 KL_Loss: -0.4053\n", + "MSE Loss 0.0000 CE_Loss: 1.2917 KL_Loss: -0.3791\n", + "Training [94%]\tLoss: 0.0125\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.3065 KL_Loss: -0.3882\n", + "MSE Loss 0.0000 CE_Loss: 1.2432 KL_Loss: -0.3728\n", + "MSE Loss 0.0000 CE_Loss: 1.0648 KL_Loss: -0.3114\n", + "MSE Loss 0.0000 CE_Loss: 1.3227 KL_Loss: -0.3890\n", + "MSE Loss 0.0000 CE_Loss: 1.1713 KL_Loss: -0.3288\n", + "Training [95%]\tLoss: 0.0122\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.3066 KL_Loss: -0.3906\n", + "MSE Loss 0.0000 CE_Loss: 1.3600 KL_Loss: -0.4012\n", + "MSE Loss 0.0000 CE_Loss: 1.3524 KL_Loss: -0.3993\n", + "MSE Loss 0.0000 CE_Loss: 1.2822 KL_Loss: -0.3822\n", + "MSE Loss 0.0000 CE_Loss: 1.3206 KL_Loss: -0.3913\n", + "Training [96%]\tLoss: 0.0132\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.2594 KL_Loss: -0.3655\n", + "MSE Loss 0.0000 CE_Loss: 1.3380 KL_Loss: -0.3947\n", + "MSE Loss 0.0000 CE_Loss: 1.2999 KL_Loss: -0.3882\n", + "MSE Loss 0.0000 CE_Loss: 1.3310 KL_Loss: -0.3931\n", + "MSE Loss 0.0000 CE_Loss: 0.9987 KL_Loss: -0.3166\n", + "Training [97%]\tLoss: 0.0125\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.2396 KL_Loss: -0.3728\n", + "MSE Loss 0.0000 CE_Loss: 1.3249 KL_Loss: -0.3901\n", + "MSE Loss 0.0000 CE_Loss: 1.2787 KL_Loss: -0.3811\n", + "MSE Loss 0.0000 CE_Loss: 1.3030 KL_Loss: -0.3826\n", + "MSE Loss 0.0000 CE_Loss: 1.1216 KL_Loss: -0.3186\n", + "Training [98%]\tLoss: 0.0125\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 1.0935 KL_Loss: -0.3315\n", + "MSE Loss 0.0000 CE_Loss: 1.1699 KL_Loss: -0.3386\n", + "MSE Loss 0.0000 CE_Loss: 1.0403 KL_Loss: -0.3401\n", + "MSE Loss 0.0000 CE_Loss: 1.3088 KL_Loss: -0.3910\n", + "MSE Loss 0.0000 CE_Loss: 1.3786 KL_Loss: -0.4068\n", + "Training [99%]\tLoss: 0.0120\n", + "Learning rate: 0.0003125\n", + "MSE Loss 0.0000 CE_Loss: 0.9326 KL_Loss: -0.3141\n", + "MSE Loss 0.0000 CE_Loss: 1.3366 KL_Loss: -0.3960\n", + "MSE Loss 0.0000 CE_Loss: 0.8690 KL_Loss: -0.3012\n", + "MSE Loss 0.0000 CE_Loss: 1.2673 KL_Loss: -0.3737\n", + "MSE Loss 0.0000 CE_Loss: 1.0179 KL_Loss: -0.3301\n", + "Training [100%]\tLoss: 0.0109\n" + ] + } + ], + "source": [ + "import torch.optim as optim\n", + "# Define optimizer and loss\n", + "lr = 0.08\n", + "lr_min = 0.0005\n", + "optimizer = optim.Adam(student_model.parameters(), lr=lr)\n", + "\n", + "\n", + "mse_loss = MSELoss(reduction=\"sum\")\n", + "ce_loss = CrossEntropyLoss() \n", + "kl_div_loss = KLDivLoss()\n", + "\n", + "# Start training\n", + "student_model.train() # set model to training mode\n", + "\n", + "\n", + "# Note from (https://pytorch.org/docs/stable/optim.html):\n", + "# Some optimization algorithms such as LBFGS need to\n", + "# reevaluate the function multiple times, so you have to\n", + "# pass in a closure that allows them to recompute your model.\n", + "# The closure should clear the gradients, compute the loss,\n", + "# and return it.\n", + "\n", + "epochs = 100\n", + "\n", + "loss_list = [] \n", + "\n", + "for epoch in range(epochs):\n", + " total_loss = []\n", + " \n", + " print(\"Learning rate:\", lr )\n", + " \n", + " for batch_idx in range(5):\n", + " \n", + " input_data = np.random.uniform(low=0.0, high=np.pi, size=(1,2))\n", + " \n", + " optimizer.zero_grad(set_to_none=True) # Initialize gradient\n", + " \n", + " output = student_model(Tensor(input_data)) # Forward pass\n", + " target = Tensor(qnn_teacher.forward(input_data, [])) # took a Qiskit QNN object defined above\n", + " #teacher_model(Tensor(input_data))\n", + " #print(target)\n", + " mse_l = mse_loss(output, target)\n", + " ce_l = ce_loss(output, target) \n", + " kl_div_l = kl_div_loss(output, target) \n", + " \n", + " print(\"MSE Loss {:.4f} CE_Loss: {:.4f} KL_Loss: {:.4f}\".format(mse_l, ce_l, kl_div_l))\n", + " \n", + " loss = 1.* mse_l + 0.01*ce_l + 0.*kl_div_l # Calculate loss\n", + " \n", + " #print(loss)\n", + " loss.backward() # Backward pass\n", + " optimizer.step() # Optimize weights\n", + " total_loss.append(loss.item()) # Store loss\n", + " loss_list.append(sum(total_loss) / len(total_loss))\n", + " \n", + " if epoch % 10 == 0 and lr > lr_min :\n", + " lr = lr / 2.\n", + " \n", + " print(\"Training [{:.0f}%]\\tLoss: {:.4f}\".format(100.0 * (epoch + 1) / epochs, loss_list[-1]))\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "a4271f79", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Parameter containing:\n", + "tensor([-1.5702e+00, -1.8719e-03, -4.1066e-03, 2.7337e-02, 1.5715e+00,\n", + " -6.8814e-04, -5.0672e-03, -2.6600e-02], requires_grad=True)" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "student_model.weight" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "38c59bf0", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(loss_list)\n", + "plt.title(\"Distillation QNN trainin\")\n", + "plt.xlabel(\"Training Iterations\")\n", + "plt.ylabel(\"Loss\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1152edd7", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Compaqt/network_distillation_AE_model_histogram.ipynb b/Compaqt/network_distillation_AE_model_histogram.ipynb new file mode 100644 index 0000000..a6d73ac --- /dev/null +++ b/Compaqt/network_distillation_AE_model_histogram.ipynb @@ -0,0 +1,205 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 5, + "id": "daae30bb", + "metadata": {}, + "outputs": [], + "source": [ + "# General Imports\n", + "import numpy as np\n", + "\n", + "# Visualisation Imports\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Scikit Imports\n", + "from sklearn import datasets\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.svm import SVC\n", + "from sklearn.decomposition import PCA\n", + "from sklearn.preprocessing import StandardScaler, MinMaxScaler\n", + "\n", + "# Qiskit Imports\n", + "from qiskit import Aer, execute\n", + "from qiskit.circuit import QuantumCircuit, Parameter, ParameterVector\n", + "from qiskit.circuit.library import PauliFeatureMap, ZFeatureMap, ZZFeatureMap\n", + "from qiskit.circuit.library import TwoLocal, NLocal, RealAmplitudes, EfficientSU2\n", + "from qiskit.circuit.library import HGate, RXGate, RYGate, RZGate, CXGate, CRXGate, CRZGate\n", + "from qiskit.opflow import StateFn, PauliSumOp, AerPauliExpectation, ListOp, Gradient\n", + "from qiskit_machine_learning.kernels import QuantumKernel\n", + "\n", + "from qiskit.utils import QuantumInstance, algorithm_globals\n", + "from qiskit_machine_learning.neural_networks import CircuitQNN" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "10f3cd91", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐\n", + "q_0: ┤ Ry(θ[0]) ├─░───■────────░─┤ Ry(θ[3]) ├─░───■────────░─┤ Ry(θ[6]) ├\n", + " ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤\n", + "q_1: ┤ Ry(θ[1]) ├─░─┤ X ├──■───░─┤ Ry(θ[4]) ├─░─┤ X ├──■───░─┤ Ry(θ[7]) ├\n", + " ├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤\n", + "q_2: ┤ Ry(θ[2]) ├─░──────┤ X ├─░─┤ Ry(θ[5]) ├─░──────┤ X ├─░─┤ Ry(θ[8]) ├\n", + " └──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘\n" + ] + } + ], + "source": [ + "# Construct teacher and student networks\n", + "\n", + "from qiskit.circuit.library import RealAmplitudes\n", + "\n", + "def student_network_builder(num_qubits):\n", + " circuit = TwoLocal(num_qubits=num_qubits, reps=2, entanglement_blocks='cx', entanglement='linear', rotation_blocks=['ry'], insert_barriers=True).decompose()\n", + " \n", + " return circuit\n", + "\n", + "student_network = student_network_builder(3)\n", + "print(student_network)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "af756cd4", + "metadata": {}, + "source": [ + "# Student Circuit validate" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "b9c63873", + "metadata": {}, + "outputs": [], + "source": [ + "weights = [ 2.8131, -0.6038, -1.5985, 0.1035, -3.0277, -0.0254, -0.0591, -1.3483,\n", + " 1.5391]" + ] + }, + { + "cell_type": "markdown", + "id": "201540f7", + "metadata": {}, + "source": [ + "# Test histogram" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24f7ee43", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "dd54f992", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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JIWFBuvmay8vd3lwUKAG9r3CYxuLEs1FOGj52i168+Mv9e3iX4wOBQAAAACAGq9OZLiu79W1zGXdOrZWwgXG3nzF1SwWi27pc7lCymighoeGaMDV3Q2Iyr3aXHiBOrRJKHPZjddepnAHLwevabymuWixWIq7vF9//bUuu+wyhYeHKzo6WgMHDtSePXuK1/3mm290xRVXKDIyUuHh4brhhhu0e/fucsfOy8vT66+/rm7duikyMlJBQUG68MIL9fjjjys9Pb3MbdasWaMnnnhCnTt3VoMGDRQYGKjY2FgNHjxYa9euLXdfCxYsUL9+/VSvXj35+/urTp06SkxM1N13362VK1c6+dupHtm5Z7Rq/VZJUpO4BobGAgAAAACAp+jc9kIlNi959l7dqAj1ueISgyJyr7DQYN3U57JSzw+67goFBwUaEJH7DejdXZHhoSWea9+qudq2bGpQRNXHa+ZcPNdYfPPNNzVmzBg1bNhQ9evX186dO5Wbm6vY2Fht3LhRn3zyiR555BHFxMSoQYMGxcsbNGig3377TXXr1i0x7pEjR9S3b19t3LhRPj4+io+PV3h4uHbt2qW8vDw1atRIS5YsUdOmJf8zNG/eXHv27FFUVJRiYmIUEBCggwcP6vjx4/Lz89Onn36qW265pcQ2b7/9th588EFJUp06ddS4cWPl5ubq0KFDysrK0n333ad3333Xhb/Fii36ea2WrN6omHp1NHbEzR59yi4AAAAAAO6UmZ2jf82cq+ycM/LxseiB229UXEzdyjf0Ip9/u1Trt+6SJHXr2EYDenczOCL32nPwsGbM/kZWSRFhIRp390DV8oLmqtecuXjOhAkT9NFHHyklJUUbNmxQcnKyOnfurJSUFN19993629/+po8++kiHDx/Whg0bdOjQIXXs2FFpaWl69dVXS4xltVp16623auPGjbruuuu0Z88e7d+/X7/99pvS09N199136+DBg7r99ttLxfHcc89p9+7dOn78uLZu3aoNGzbo6NGj+uKLLxQUFKR77rlHWVlZxesXFBTomWeekWRrMh45ckTr16/X9u3bdfr0aS1btkzXXnuta395FTj/rMXe3TvSWAQAAAAAwAFhIX/OvderWwfTNRYlqX/vbooMD1XdqEj1vaKL0eG4XbNGDdWjc1tJ0qB+V3pFY1HywjMXH3roIb3xxhslln333Xfq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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc3 = QuantumCircuit(3)\n", + "qc=qc3.compose(student_network)\n", + "qc.assign_parameters(weights, inplace=True)\n", + "\n", + "qc.measure_all()\n", + "qc.decompose().draw(output='mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "c9f00715", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'001': 608, '101': 1, '010': 2, '000': 38, '011': 375}\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHHCAYAAAAveOlqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAA9hAAAPYQGoP6dpAABTPUlEQVR4nO3deXxOV+LH8e/NQgiJ2PeglnQhUXu0iC3GrlrRzTIdzLTVdpjOlKmtC9XqVKe0RrWq1QU1NZ1aQq1VsbSllrEERYKQUIlkyPac3x9+ecYjCYnsuZ/36+XFc+557j3HeW7yfe5yrmWMMQIAAIBtuBV1AwAAAFC4CIAAAAA2QwAEAACwGQIgAACAzRAAAQAAbIYACAAAYDMEQAAAAJvxKOoGlGYOh0NnzpxRxYoVZVlWUTcHAACUYsYYXb58WbVr15ab282P8REAC9CZM2dUr169om4GAACwkaioKNWtW/emdQiABahixYqSrg2Ej49PEbcGAACUZgkJCapXr54zf9wMAbAAZZz29fHxIQACAIBCkZPLzrgJBAAAwGYIgAAAADZDAAQAALAZAiAAAIDNEAABAABshgAIAABgMwRAAAAAmyEAAgAA2AwBEAAAwGYIgAAAADZDAAQAALAZAiAAAIDNEAABAABshgAIAABgMwRAAAAAmyEAAgAA2AwBEAAAwGYIgAAAADZDAAQAALAZAiAAAIDNEAABAABshgAIAABgMwRAAAAAmyEAAgAA2AwBEAAAwGYIgAAAADZDAAQAALAZAiAAAIDNEAABAABshgAIAABgMwRAAAAAmyEAAgAA2AwBEAAAwGYIgEAxNnfuXDVo0EBeXl5q166ddu7cmW3djz76SJZlufzx8vJyqXPu3DmNGDFCtWvXVvny5dWrVy9FRkZmuT5jjH7zm9/IsiytWLEiP7sFAChiBECgmFqyZInGjRunKVOm6KefflJgYKBCQ0N1/vz5bN/j4+Ojs2fPOv+cPHnSucwYo4EDB+r48eP617/+pd27d8vf31/du3dXUlJSpnXNnj1blmUVSN8AAEWLAAgUU3/72980atQojRw5UnfddZfmzZun8uXL68MPP8z2PZZlqWbNms4/NWrUcC6LjIzU9u3b9d5776lNmzZq1qyZ3nvvPV25ckWff/65y3r27NmjN99886bbAgCUXARAoBhKSUnRjz/+qO7duzvL3Nzc1L17d0VERGT7vsTERPn7+6tevXoaMGCADhw44FyWnJwsSS6nhd3c3FS2bFlt3brVWfbf//5XjzzyiObOnauaNWvmZ7cAAMUEARAohuLi4pSenu5yBE+SatSooZiYmCzf06xZM3344Yf617/+pcWLF8vhcCg4OFjR0dGSpICAANWvX18TJkzQr7/+qpSUFM2cOVPR0dE6e/ascz1//OMfFRwcrAEDBhRcBwEARcqjqBsAIH906NBBHTp0cL4ODg7WnXfeqX/84x96+eWX5enpqX/+85964oknVLlyZbm7u6t79+76zW9+I2OMJOnrr7/Whg0btHv37qLqBgCgEHAEECiGqlatKnd3d507d86l/Ny5czk+Levp6amWLVvq6NGjzrJWrVppz549unTpks6ePas1a9bowoULatSokSRpw4YNOnbsmCpVqiQPDw95eFz7jjh48GB16dIlfzoHAChyBECgGCpTpoxatWql9evXO8scDofWr1/vcpTvZtLT07Vv3z7VqlUr0zJfX19Vq1ZNkZGR+uGHH5yne1944QXt3btXe/bscf6RpLfeeksLFy7Me8cAAMUCp4CBYmrcuHEaPny4WrdurbZt22r27NlKSkrSyJEjJUnDhg1TnTp1NGPGDEnSSy+9pPbt26tx48a6dOmS3njjDZ08eVK/+93vnOtctmyZqlWrpvr162vfvn169tlnNXDgQPXs2VOSnHcP36h+/fpq2LBhIfQaAFAYCIBAMRUWFqbY2FhNnjxZMTExCgoK0po1a5w3hpw6dUpubv87iP/rr79q1KhRiomJkZ+fn1q1aqVt27bprrvuctY5e/asxo0bp3PnzqlWrVoaNmyYJk2aVOh9AwAULctkXP2NfJeQkCBfX1/Fx8fLx8enqJsDAABKsdzkDq4BBAAAsBkCIAAAgM0QAAEAAGyGAAgAAGAzBEAAAACbIQACAADYDAEQAADAZgiAAAAANlNsA+CuXbvUu3dvVapUSd7e3mrfvr2WLl2a6/WcP39ef/zjH9WkSRN5eXmpSpUq6tChg957770s64eHh6tz586qWLGifHx8FBIS4vI8VgAAgJKuWD4JZOPGjQoNDZWXl5eGDh2qihUravny5Tp58qRmzZql8ePH52g9e/bsUc+ePfXrr7+qT58+uvPOO5WYmKiDBw+qTJkyWrVqlUv9xYsX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j4IDAAClRrE7AihJISEh2rp1qzp27KglS5bovffeU40aNfTFF1/k6DnA0rX5cP71r39p6tSpio2N1VtvvaXvv/9eTzzxhCIiIjKFP0n661//qsWLF6tatWp67733tHTpUt1///3atm0b4Q8AAJQaxfIIIAAAAApOsTwCCAAAgIJDAAQAALAZAiAAAIDNEAABAABshgAIAABgMwRA5Eh2N4tzEzkAACUPARA5YlmWTp8+LUlKSUnRf//7X2c5gPzDly0AhYF5AHFTxhh98803+uCDD7Rv3z4lJiaqRYsWat68uVq1aqWgoCA1btxYZcuWlTGGQAjkg8jISFWvXl2XL19WuXLlVKVKlaJuEoBShgCIm5o8ebJmzZql8uXLq169ekpNTVVKSoqioqJkjFFgYKAefPBBDRs2TDVq1Cjq5uI66enpcnNzI5SXEMnJyVq2bJneffdd7d69W25ubmrSpIkaN26sVq1aKTg4WPfee68qVqxY1E3FDYwxSk9Pl7u7O/sbSgwCILJ14sQJ3X333erSpYvefPNNBQQEKC4uTlFRUTp27Ji2bNmi8PBwRUZGKjAwUNOnT9dvfvMbORwOublxdUFRiYqKUr169ZyvHQ6HjDFyd3cvwlbhVsaPH6+3335b/v7+atKkiTw9PXXp0iXt27dPCQkJqlevnvr27avf/va3atWqVVE3F//v2LFjuuOOO5yvHQ6HHA6HPDw8irBVuJmMs1V2HysCILL18ssva/bs2Vq6dKm6deumtLQ0lx0lISFBBw4c0NKlS/X222+rRo0aWr16tYKCgoqu0TZ34sQJNWrUSD179tTDDz+svn37upw+TE9Pl2VZcnNzc/4QTElJUZkyZYqw1fjll1901113qV+/fpo7d66qVaumy5cv69KlSzp79qy2bNmir776Srt27VKdOnU0bdo0DRs2jMsuitixY8fUpEkTBQQE6Le//a0ee+wx1axZ07k8PT1dkuTu7u4cq6SkJCUmJqpKlSq2DR5FLSEhQZcuXVL9+vWdZdePlW0YIBvDhg0ztWrVMjExMcYYYxwOh8vf1/viiy+Mr6+vad++faG2Ea6mT59uLMty/qlataoZPny4WblypUlNTXWpm5ycbIwxZt68eaZbt27m8OHDRdFkGGNeffVVU7lyZbN+/XpjjDFpaWkuy1NTU83x48fN7NmzTbVq1Yxl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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#choosing the qasm simulator backend\n", + "\n", + "from qiskit.visualization import plot_histogram\n", + "\n", + "backend = Aer.get_backend('qasm_simulator')\n", + "\n", + "# running the job and getting results (counts)\n", + "job = execute(qc, backend, shots=1024) # shots = no. of times you want to run the experiment\n", + "result = job.result()\n", + "counts = result.get_counts(qc)\n", + "\n", + "#printing and visualizing results (histogram data of experiment)\n", + "print(counts)\n", + "plot_histogram(counts)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4078e87c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Compaqt/network_distillation_AE_model_histogram_noisy-qkrt.ipynb b/Compaqt/network_distillation_AE_model_histogram_noisy-qkrt.ipynb new file mode 100644 index 0000000..1524632 --- /dev/null +++ b/Compaqt/network_distillation_AE_model_histogram_noisy-qkrt.ipynb @@ -0,0 +1,666 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 10, + "id": "daae30bb", + "metadata": {}, + "outputs": [], + "source": [ + "# General Imports\n", + "import numpy as np\n", + "\n", + "# Visualisation Imports\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Scikit Imports\n", + "from sklearn import datasets\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.svm import SVC\n", + "from sklearn.decomposition import PCA\n", + "from sklearn.preprocessing import StandardScaler, MinMaxScaler\n", + "\n", + "# Qiskit Imports\n", + "from qiskit import Aer, execute\n", + "from qiskit.tools import *\n", + "from qiskit.visualization import *\n", + "from ibm_quantum_widgets import *\n", + "from qiskit.circuit import QuantumCircuit, Parameter, ParameterVector\n", + "from qiskit.circuit.library import PauliFeatureMap, ZFeatureMap, ZZFeatureMap\n", + "from qiskit.circuit.library import TwoLocal, NLocal, RealAmplitudes, EfficientSU2\n", + "from qiskit.circuit.library import HGate, RXGate, RYGate, RZGate, CXGate, CRXGate, CRZGate\n", + "from qiskit.opflow import StateFn, PauliSumOp, AerPauliExpectation, ListOp, Gradient\n", + "from qiskit_machine_learning.kernels import QuantumKernel\n", + "\n", + "from qiskit.utils import QuantumInstance, algorithm_globals\n", + "from qiskit_machine_learning.neural_networks import CircuitQNN" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "10f3cd91", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐\n", + "q_0: ┤ Ry(θ[0]) ├─░───■────────░─┤ Ry(θ[3]) ├─░───■────────░─┤ Ry(θ[6]) ├\n", + " ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤\n", + "q_1: ┤ Ry(θ[1]) ├─░─┤ X ├──■───░─┤ Ry(θ[4]) ├─░─┤ X ├──■───░─┤ Ry(θ[7]) ├\n", + " ├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤\n", + "q_2: ┤ Ry(θ[2]) ├─░──────┤ X ├─░─┤ Ry(θ[5]) ├─░──────┤ X ├─░─┤ Ry(θ[8]) ├\n", + " └──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘\n" + ] + } + ], + "source": [ + "# Construct teacher and student networks\n", + "\n", + "from qiskit.circuit.library import RealAmplitudes\n", + "\n", + "def student_network_builder(num_qubits):\n", + " circuit = TwoLocal(num_qubits=num_qubits, reps=2, entanglement_blocks='cx', entanglement='linear', rotation_blocks=['ry'], insert_barriers=True).decompose()\n", + " \n", + " return circuit\n", + "\n", + "student_network = student_network_builder(3)\n", + "print(student_network)" + ] + }, + { + "cell_type": "markdown", + "id": "af756cd4", + "metadata": {}, + "source": [ + "# Student Circuit validate" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b9c63873", + "metadata": {}, + "outputs": [], + "source": [ + "weights = [ 2.8131, -0.6038, -1.5985, 0.1035, -3.0277, -0.0254, -0.0591, -1.3483,\n", + " 1.5391]" + ] + }, + { + "cell_type": "markdown", + "id": "201540f7", + "metadata": {}, + "source": [ + "# Test histogram" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "dd54f992", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5gAAADWCAYAAAC0ci08AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABFQklEQVR4nO3dd3wUdf7H8Vd6QkkooQfQUNIUQi8CCU1EOREFLMjvVBSlqBTPcojKqdypIHgqqAeI5fSkqZwFBYEIBvwR6TV0CIROgEAoKb8/9kdgyWZ3E2Yzs8n7+XjkYZj5zuxn8bMf5rMz8x2fvLy8PERERERERESuk6/ZAYiIiIiIiEjpoAZTREREREREDKEGU0RERERERAyhBlNEREREREQMoQZTREREREREDKEGU0RERERERAyhBlNEREREREQMoQZTREREREREDKEGU0RERERERAyhBlNEREREREQMoQZTREREREREDKEGU0RERERERAyhBlNEREREREQMoQZTREREREREDKEGU0RERERERAyhBlNEREREREQMoQZTREREREREDKEGU0RERERERAyhBlNEREREREQM4W92ACJm27p1q8sx7733HsOHD3c6Jjo62qiQxEKUH+KKETmi/Ci9VEPEGeWHlEY6gynihvfff9/sEMTClB/iinJEnFF+iDPKD/E2ajBFRERERETEEGowRURERERExBBqMEXcMGfOHLNDEAtTfogryhFxRvkhzig/xNuowRQRERERERFDqMEUcUPfvn3NDkEsTPkhrihHxBnlhzij/BBvo8eUeKFti+HMEbOjKL6K1SGqi9lRiJRdqiEiUhTeXjOcUT0p3IgRI1i7dm2Jv258fDyTJ08u8dcV46jB9EJnjkBGmtlRiIi3Ug0RkaJQzSib1q5dS1JSktlhiBfSJbIibhg2bJjZIYiFKT/EFeWIOKP8EGeUH+Jt1GCKuGH48OFmhyAWpvwQV5Qj4ozyQ5xRfoi3UYMp4oZOnTqZHYJYmPJDXFGOiDPKD3FG+SHeRg2miBuOHj1qdghiYcoPcUU5Is4oP8QZ5Yd4GzWYIiIiIiIiYgjNIisAjJ6ayJa9K/DzC8DX14+alW/kga5jSGjaz+zQLCE2NtbsEMTClB+qIa4oR8QZ5YdqiDPKD/E2ajAl34BuYxnQ7UVycrL5Nvk9/v7FAzSs04w64Q3N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zq1ZXt3t7sF27+XEf31F22Zx3NmtvdvbiYiIiIiIWI3lGsyiqlq1KmC7xPaOO+5wOCYoKIjz58/z9ddf89JLLzF69Oj8dddO8ANw44038vHHH5OXl8emTZuYMWMGL7zwAuHh4Tz66KMuYyrOJbLJf2wk+Y+NRd5ORERERETE09w9ieb1DWZUVBSRkZFs2LCBl19+udBxFy5cIDs7m4CAALvlM2bMKHQbHx8fbrrpJt5++20++OADNmzYYFjcIiIiIiIipY3XN5g+Pj588MEH3HHHHfTu3ZsHH3yQ6tWrc/ToUVavXs2lS5d46623CAsLo3379kyYMIEaNWpQu3ZtZs2axe+//263v/Xr1/PUU0/Rv39/GjVqBMDs2bPJysqiR48ebsXkbnc/58ck1m7awbOP32fpZ+2IiIiIiIi4w+sbTIDu3buTnJzM66+/zpAhQzhz5gzVq1enefPmPPbYY/njvvjiC4YPH86IESPw8/OjV69efPXVV7Rs2TJ/TM2aNbnhhht45513SEtLIyAggJiYGGbNmlXgcSbX43jGaVZvTKVtszg1lyIiIiIiUipY5jElZc323WnMXfArQx/srQZTRERERERKBTWYJsrNzc1/bqeIiIiIiIi3U4MpIiIiIiIihtDpMxERERERETGEGkwRERERERExhBpMERERERERMYQaTBERERERETGEGkwRERERERExhBpMERERERERMYQaTBERERERETGEGkwRERERERExhBpMERERERERMYQaTBERERERETGEGkwRERERERExhBpMERERERERMYQaTBERERERETGEGkwRERERERExhBpMERERERERMYQaTBERERERETGEGkwRERERERExhBpMERERERERMYQaTBERERERETGEGkwRERERERExhBpMERERERERMYQaTBERERERETGEGkwRERERERExhBpMERERERERMYQaTBERERERETGEGkwRERERERExhBpMERERERERMcT/ATy504sF7A00AAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc3 = QuantumCircuit(3)\n", + "qc=qc3.compose(student_network)\n", + "qc.assign_parameters(weights, inplace=True)\n", + "\n", + "qc.measure_all()\n", + "qc.decompose().draw(output='mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c9f00715", + "metadata": {}, + "outputs": [], + "source": [ + "# #choosing the qasm simulator backend\n", + "\n", + "# from qiskit.visualization import plot_histogram\n", + "\n", + "# backend = Aer.get_backend('qasm_simulator')\n", + "\n", + "# # running the job and getting results (counts)\n", + "# job = execute(qc, backend, shots=1024) # shots = no. of times you want to run the experiment\n", + "# result = job.result()\n", + "# counts = result.get_counts(qc)\n", + "\n", + "# #printing and visualizing results (histogram data of experiment)\n", + "# print(counts)\n", + "# plot_histogram(counts)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "4078e87c", + "metadata": {}, + "outputs": [], + "source": [ + "from qiskit import QuantumCircuit, transpile, IBMQ\n", + "provider = IBMQ.load_account()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "4d820c42-ba9a-4173-935b-b95cbf528410", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ibm_oslo ibm_nairobi ibmq_manila\n", + "-------- ----------- -----------\n", + "Num. Qubits: 7 Num. Qubits: 7 Num. Qubits: 5\n", + "Pending Jobs: 8 Pending Jobs: 13 Pending Jobs: 4\n", + "Least busy: False Least busy: False Least busy: False\n", + "Operational: True Operational: True Operational: True\n", + "Avg. T1: 140.8 Avg. T1: 121.9 Avg. T1: 152.5\n", + "Avg. T2: 98.7 Avg. T2: 53.3 Avg. T2: 58.2\n", + "\n", + "\n", + "\n", + "ibmq_quito ibmq_belem ibmq_lima\n", + "---------- ---------- ---------\n", + "Num. Qubits: 5 Num. Qubits: 5 Num. Qubits: 5\n", + "Pending Jobs: 1 Pending Jobs: 0 Pending Jobs: 3\n", + "Least busy: False Least busy: True Least busy: False\n", + "Operational: True Operational: True Operational: True\n", + "Avg. T1: 92.1 Avg. T1: 89.2 Avg. T1: 92.4\n", + "Avg. T2: 98.3 Avg. T2: 107.7 Avg. T2: 115.9\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "backend_overview()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "6e7b9a93-2d83-4224-93d9-7bb44dd918e8", + "metadata": {}, + "outputs": [], + "source": [ + "backend=provider.get_backend('ibmq_belem')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "2d6e1c95-e68a-477a-b049-d6acc3aa9daa", + "metadata": {}, + "outputs": [], + "source": [ + "#Execute the circuit on the backend\n", + "job=execute(qc,backend,shots=1024)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "15d543fd-11ab-4bfb-8028-211357f6f6e8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "job.status()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "764d4399-fcd6-4cb1-b8f3-a5b0aa8d10b5", + "metadata": {}, + "outputs": [], + "source": [ + "belem = provider.get_backend('ibmq_belem')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8b556338-de6e-4a78-b176-4cb2be32b73d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "belem.jobs()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "3bf75b5e-21b1-4676-ac97-04904e52e2cc", + "metadata": {}, + "outputs": [], + "source": [ + "job = belem.retrieve_job('62e04f0d1813982a9ec6d48a')\n", + "result=job.result()\n", + "counts=result.get_counts()\n", + "histogram = plot_histogram(counts,title=\"Quantum Neural Network on IBMQ_Belem\")\n", + "histogram.savefig('qnn_belem.pdf')" + ] + }, + { + "cell_type": "markdown", + "id": "803073b5-249b-4de1-9e50-312106a578ba", + "metadata": {}, + "source": [ + "## Qiskit Runtime" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "4ebf9064-d10c-4b04-9500-18325ea1f178", + "metadata": {}, + "outputs": [], + "source": [ + "from qiskit_ibm_runtime import QiskitRuntimeService\n", + "\n", + "service = QiskitRuntimeService()\n", + "backend = service.backend('ibmq_belem')" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "7febbca0-0a57-417f-827e-ea103505bb0e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "backend" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "b67ed381-859a-415b-88d0-11e1c4a92c87", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SamplerResult(quasi_dists=[{'101': 0.000244140625, '001': 0.5968017578125, '011': 0.3533935546875, '010': 0.005859375, '000': 0.043701171875}], metadata=[{'header_metadata': {}, 'shots': 8192}])\n" + ] + } + ], + "source": [ + "from qiskit_ibm_runtime import Sampler\n", + "\n", + "with Sampler(circuits=qc, service=service,\n", + " #options={'backend': backend},\n", + " options={\"backend\": \"ibmq_qasm_simulator\"},\n", + " #options={\"backend\": \"ibmq_belem\"},\n", + " #skip_transpilation=True\n", + " ) as sampler:\n", + " result = sampler(circuits=[0], shots=8192)\n", + " print(result)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "53c2c571-c27d-49fd-94bb-257e37eee8fd", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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eSdg9EFHIyIiksQitZ41s9hRgIaZ2Y6Y1ynABIJZSURERA5bUbuclBA0AHLggDksgb0Ekz6LiIgctqImzf4Ew+atAz4HvBezbh+w1d1rWjk2ERGRpBLpnqa7b3D39e7ewd1Lwte1j3eVMEXkcDF//nyys7PJysrijjvuOGD9/fffz8knn8zw4cMpLCykrCyYq2L9+vV07tyZ4cOHM3z4cK666qr925xxxhnk5uaSk5PDVVddRU2NfjLbqyiDG5wL/MXdPwmfN8rd/2+rRSYi0sZqamq49tpreeGFF8jIyGDUqFEUFRUxZMiQ/WUuvPDC/Qnx6aef5uabb2b+/PkAnHTSSSxfvvyA/T7++ON069YNd2fSpEk88cQTTJ48uU3ek7SuKNWzcwgmeN4aPm+MEzQKEhFpl5YuXUpWVhYDBgwAYPLkycydO7dO0uzWrdv+5x9++CFm1ux+a7eprq5m3759kbaR5NRs9WxYJbs15nljDyVMEWnXKisryczM3P86IyODysoDOwb89re/5aSTTuKWW27h3nvv3b+8oqKCESNGMHbsWF555ZU620yYMIFevXrRtWtXJk2adOjehBxS8fbTFBE54l177bX885//5M477+S2224D4IQTTuCdd97hjTfe4K677uLCCy9k165d+7d57rnnePfdd6mqquLllzUWTHsV9Z5mJLqnKSLtWXp6Ohs3btz/etOmTaSnpzdafvLkyVx99dUApKWlkZaWBsApp5zCSSedxNq1a8nLy9tfvlOnTpx99tnMnTuX8ePHH6J3IYdS1HuaUeiepoi0a6NGjaK8vJyKigrS09OZPXs2jzzySJ0y5eXlDBw4EIB58+btf/7ee+/Ro0cPUlJSWLduHeXl5QwYMIA9e/awe/duTjjhBKqrq5k3bx6jR2sAtfYqyoDtqsIVkSNCamoqM2bMYMKECdTU1HDZZZeRk5PD1KlTycvLo6ioiBkzZvDiiy9y1FFH0b17dx588EEAFi1axNSpUznqqKPo0KED999/Pz169GDLli0UFRVRVVXFp59+yhe/+MU63VGkfTH3I3emr7y8PC8pKUl0GEe0K+5OdASNm3ljoiMQkUQws2XuntfQOvXTFBERiUj9NEVERCKK656m7m+KiMiRTElQREQkoriTppmNNLOHzKwkfDxcb75NERGRw1JcSdPMLgL+DpwA/DV8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het/ArwOlIdlbiBImg22yBUREWmpNk2a7v6YmfUEfkTQn3IVMNHdN4RFGuqvWb8V7FeBDUC/8PWxwO+BPsAHYfkx7r60VYMXEZEjXps3BHL3+4D7Glk3roFl1sz+bgJuapXgREREmqCxZ0VERCJS0hQREYlISVNERCQiJU0REZGIlDRFREQiUtIUERGJSElTREQkIiVNERGRiJQ0RUREIlLSFBERiUhJU0REJCIlTRERkYiUNEVERCJS0hQREYlISVNERCQiJU0REZGIlDRFREQiUtIUERGJSElTREQkIiVNERGRiJQ0RUREIlLSFBERiUhJU0REJCIlzUNs/vz5ZGdnk5WVxR133HHA+qqqKs4//3yysrLIz89n/fr1dda/8847dOnShenTp9dZXlNTw4gRIzjrrLMOZfgiIhJDSfMQqqmp4dprr+XZZ5+lrKyMRx99lLKysjpl/vjHP9K9e3fefvttbrrpJm699dY662+++WbOPPPMA/Z9zz33MHjw4EMav4iI1KWkeQgtXbqUrKwsBgwYQMeOHZk8eTJz586tU2bu3LlceumlAEyaNImXXnoJdwfgqaeeon///uTk5NTZZtOmTcybN48pU6a0zRsRERFASfOQqqysJDMzc//rjIwMKisrGy2TmprKf/zHf7B9+3b27NnDnXfeyU9+8pMD9nvjjTfyy1/+kg4d9PGJiLQl/eomqWnTpnHTTTfRpUuXOsufeeYZevXqxSmnnJKgyEREjlypiQ7gcJaens7GjRv3v960aRPp6ekNlsnIyKC6upoPPviAnj17smTJEubMmcMtt9zC+++/T4cOHejUqROVlZU8/fTT/PWvf+Xjjz9m165dXHzxxcyaNaut356IyBFHSfMQGjVqFOXl5VRUVJCens7s2bN55JFH6pQpKiriwQcfpKCggDlz5nDaaadhZrzyyiv7y0ybNo0uXbpw3XXXAXD77bcDsGDBAqZPn66EKSLSRpQ0D6HU1FRmzJjBhAkTqKmp4bLLLiMnJ4epU6eSl5dHUVERl19+Od/85jfJysqiR48ezJ49O9Fhi4hII6y2peaRKC8vz0tKShIdxhHtirsTHUHjZt6Y6AjkUNH3TppiZsvcPa+hdWoIJCIiEpGqZ1uBzlpFRI4MutIUERGJSElTREQkIiVNERGRiJQ0RUREIlLSFDkMHcyUdLfffjtZ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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plot_histogram(result.quasi_dists)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "da4f866e-898d-4c17-beb1-22c4aa18b1a7", + "metadata": {}, + "outputs": [], + "source": [ + "histogram=plot_histogram(result.quasi_dists, title=\"QNN on Simulator, shots = 1024\")\n", + "histogram.savefig('qnn_sim-1024.pdf')" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "da087fcb-9185-477d-967b-09735389184d", + "metadata": {}, + "outputs": [], + "source": [ + "histogram=plot_histogram(result.quasi_dists, title=\"QNN on IBMQ_Belem, shots = 8192\")\n", + "histogram.savefig('qnn_belem-8192.pdf')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3ab11ac2-fc4c-416d-a356-6b079da57143", + "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.8.13" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": { + "0734dd7735794bafa43e6e8909c9dc69": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonModel", + "state": { + "button_style": "primary", + "description": "Clear", + "layout": "IPY_MODEL_3c2d52ad9bdf4b3b80f60b46ab2974c8", + "style": "IPY_MODEL_9b38d69b6fca4ed39b0f0f6e2612548d" + } + }, + "1093aed2cc124459a4b7830e9aae3fb7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "11c13c80bb1e4d55a1c75725070d96cb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "width": "145px" + } + }, + "22e458d660544aca9b82e7f42daff2fa": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "width": "70px" + } + }, + "370aa9316e7a46f499fabfc4e3210425": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "margin": "0px 0px 10px 0px" + } + }, + "3c2d52ad9bdf4b3b80f60b46ab2974c8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "grid_area": "right", + "padding": "0px 0px 0px 0px", + "width": "70px" + } + }, + "401d14a29a4c4e49a4c41bca58df9c7e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "margin": "0px 0px 0px 37px", + "width": "600px" + } + }, + "482746fc12b94f2cbbac2e1fc2bd540b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "grid_template_areas": "\n \". . . . right \"\n ", + "grid_template_columns": "20% 20% 20% 20% 20%", + "width": "100%" + } + }, + "49e9f07085864ea98810d04d92ce59b1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "GridBoxModel", + "state": { + "children": [ + "IPY_MODEL_0734dd7735794bafa43e6e8909c9dc69" + ], + "layout": "IPY_MODEL_482746fc12b94f2cbbac2e1fc2bd540b" + } + }, + "5315110fd5fb4e43895f934b9dcc58bf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "5803810a017d49708b213c65da2b548e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_e74cbb48291d45b893b8dcf4f9e3d83a", + "style": "IPY_MODEL_8cdc368486cb41e19e8477ab04c45409", + "value": "
Message
" + } + }, + "6f2efd7bbe764932a3ae5f0a4cfc2c7b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_370aa9316e7a46f499fabfc4e3210425", + "style": "IPY_MODEL_fc3230a5e9f74fac85fe05ff81414590", + "value": "

Circuit Properties

" + } + }, + "736baa3bc66143888b0aaf973d48d753": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "children": [ + "IPY_MODEL_c446804445904255852074c05122f358", + "IPY_MODEL_7f97fcc3a54a4e3588491420026d7b2b", + "IPY_MODEL_84812c4e54d14ad8bf5742e70c04df9a", + "IPY_MODEL_e635b45b46dc4e40be00679127ac720a", + "IPY_MODEL_5803810a017d49708b213c65da2b548e" + ], + "layout": "IPY_MODEL_401d14a29a4c4e49a4c41bca58df9c7e" + } + }, + "7f97fcc3a54a4e3588491420026d7b2b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_11c13c80bb1e4d55a1c75725070d96cb", + "style": "IPY_MODEL_5315110fd5fb4e43895f934b9dcc58bf", + "value": "
Backend
" + } + }, + "84812c4e54d14ad8bf5742e70c04df9a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_d0fce2296d7e4a5fb332550e9446b6c6", + "style": "IPY_MODEL_d85883f0a81042df9d4b25f66cd905cc", + "value": "
Status
" + } + }, + "8cdc368486cb41e19e8477ab04c45409": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "94abf8b0d69d4924b196cad5f98c5aff": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "width": "190px" + } + }, + "9b38d69b6fca4ed39b0f0f6e2612548d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonStyleModel", + "state": {} + }, + "ac2c8cb7125c4bffb9adb4762614f41b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "c446804445904255852074c05122f358": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_94abf8b0d69d4924b196cad5f98c5aff", + "style": "IPY_MODEL_1093aed2cc124459a4b7830e9aae3fb7", + "value": "
Job ID
" + } + }, + "d0fce2296d7e4a5fb332550e9446b6c6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "width": "95px" + } + }, + "d85883f0a81042df9d4b25f66cd905cc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "e635b45b46dc4e40be00679127ac720a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_22e458d660544aca9b82e7f42daff2fa", + "style": "IPY_MODEL_ac2c8cb7125c4bffb9adb4762614f41b", + "value": "
Queue
" + } + }, + "e74cbb48291d45b893b8dcf4f9e3d83a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "fc3230a5e9f74fac85fe05ff81414590": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + } + }, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Compaqt/network_distillation_AE_model_histogram_noisy.ipynb b/Compaqt/network_distillation_AE_model_histogram_noisy.ipynb new file mode 100644 index 0000000..42cfb44 --- /dev/null +++ b/Compaqt/network_distillation_AE_model_histogram_noisy.ipynb @@ -0,0 +1,326 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 12, + "id": "daae30bb", + "metadata": {}, + "outputs": [], + "source": [ + "# General Imports\n", + "import numpy as np\n", + "\n", + "# Visualisation Imports\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Scikit Imports\n", + "from sklearn import datasets\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.svm import SVC\n", + "from sklearn.decomposition import PCA\n", + "from sklearn.preprocessing import StandardScaler, MinMaxScaler\n", + "\n", + "# Qiskit Imports\n", + "from qiskit import Aer, execute\n", + "from qiskit.visualization import *\n", + "from qiskit.circuit import QuantumCircuit, Parameter, ParameterVector\n", + "from qiskit.circuit.library import PauliFeatureMap, ZFeatureMap, ZZFeatureMap\n", + "from qiskit.circuit.library import TwoLocal, NLocal, RealAmplitudes, EfficientSU2\n", + "from qiskit.circuit.library import HGate, RXGate, RYGate, RZGate, CXGate, CRXGate, CRZGate\n", + "from qiskit.opflow import StateFn, PauliSumOp, AerPauliExpectation, ListOp, Gradient\n", + "from qiskit_machine_learning.kernels import QuantumKernel\n", + "\n", + "from qiskit.utils import QuantumInstance, algorithm_globals\n", + "from qiskit_machine_learning.neural_networks import CircuitQNN" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "10f3cd91", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐\n", + "q_0: ┤ Ry(θ[0]) ├─░───■────────░─┤ Ry(θ[3]) ├─░───■────────░─┤ Ry(θ[6]) ├\n", + " ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤\n", + "q_1: ┤ Ry(θ[1]) ├─░─┤ X ├──■───░─┤ Ry(θ[4]) ├─░─┤ X ├──■───░─┤ Ry(θ[7]) ├\n", + " ├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤\n", + "q_2: ┤ Ry(θ[2]) ├─░──────┤ X ├─░─┤ Ry(θ[5]) ├─░──────┤ X ├─░─┤ Ry(θ[8]) ├\n", + " └──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘\n" + ] + } + ], + "source": [ + "# Construct teacher and student networks\n", + "\n", + "from qiskit.circuit.library import RealAmplitudes\n", + "\n", + "def student_network_builder(num_qubits):\n", + " circuit = TwoLocal(num_qubits=num_qubits, reps=2, entanglement_blocks='cx', entanglement='linear', rotation_blocks=['ry'], insert_barriers=True).decompose()\n", + " \n", + " return circuit\n", + "\n", + "student_network = student_network_builder(3)\n", + "print(student_network)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "af756cd4", + "metadata": {}, + "source": [ + "# Student Circuit validate" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b9c63873", + "metadata": {}, + "outputs": [], + "source": [ + "weights = [ 2.8131, -0.6038, -1.5985, 0.1035, -3.0277, -0.0254, -0.0591, -1.3483,\n", + " 1.5391]" + ] + }, + { + "cell_type": "markdown", + "id": "201540f7", + "metadata": {}, + "source": [ + "# Test histogram" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "dd54f992", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5gAAADWCAYAAAC0ci08AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABFQklEQVR4nO3dd3wUdf7H8Vd6QkkooQfQUNIUQi8CCU1EOREFLMjvVBSlqBTPcojKqdypIHgqqAeI5fSkqZwFBYEIBvwR6TV0CIROgEAoKb8/9kdgyWZ3E2Yzs8n7+XjkYZj5zuxn8bMf5rMz8x2fvLy8PERERERERESuk6/ZAYiIiIiIiEjpoAZTREREREREDKEGU0RERERERAyhBlNEREREREQMoQZTREREREREDKEGU0RERERERAyhBlNEREREREQMoQZTREREREREDKEGU0RERERERAyhBlNEREREREQMoQZTREREREREDKEGU0RERERERAyhBlNEREREREQMoQZTREREREREDKEGU0RERERERAyhBlNEREREREQMoQZTREREREREDKEGU0RERERERAyhBlNEREREREQM4W92ACJm27p1q8sx7733HsOHD3c6Jjo62qiQxEKUH+KKETmi/Ci9VEPEGeWHlEY6gynihvfff9/sEMTClB/iinJEnFF+iDPKD/E2ajBFRERERETEEGowRURERERExBBqMEXcMGfOHLNDEAtTfogryhFxRvkhzig/xNuowRQRERERERFDqMEUcUPfvn3NDkEsTPkhrihHxBnlhzij/BBvo8eUeKFti+HMEbOjKL6K1SGqi9lRiJRdqiEiUhTeXjOcUT0p3IgRI1i7dm2Jv258fDyTJ08u8dcV46jB9EJnjkBGmtlRiIi3Ug0RkaJQzSib1q5dS1JSktlhiBfSJbIibhg2bJjZIYiFKT/EFeWIOKP8EGeUH+Jt1GCKuGH48OFmhyAWpvwQV5Qj4ozyQ5xRfoi3UYMp4oZOnTqZHYJYmPJDXFGOiDPKD3FG+SHeRg2miBuOHj1qdghiYcoPcUU5Is4oP8QZ5Yd4GzWYIiIiIiIiYgjNIisAjJ6ayJa9K/DzC8DX14+alW/kga5jSGjaz+zQLCE2NtbsEMTClB+qIa4oR8QZ5YdqiDPKD/E2ajAl34BuYxnQ7UVycrL5Nvk9/v7FAzSs04w64Q3N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zq1ZXt3t7sF27+XEf31F22Zx3NmtvdvbiYiIiIiIWI3lGsyiqlq1KmC7xPaOO+5wOCYoKIjz58/z9ddf89JLLzF69Oj8dddO8ANw44038vHHH5OXl8emTZuYMWMGL7zwAuHh4Tz66KMuYyrOJbLJf2wk+Y+NRd5ORERERETE09w9ieb1DWZUVBSRkZFs2LCBl19+udBxFy5cIDs7m4CAALvlM2bMKHQbHx8fbrrpJt5++20++OADNmzYYFjcIiIiIiIipY3XN5g+Pj588MEH3HHHHfTu3ZsHH3yQ6tWrc/ToUVavXs2lS5d46623CAsLo3379kyYMIEaNWpQu3ZtZs2axe+//263v/Xr1/PUU0/Rv39/GjVqBMDs2bPJysqiR48ebsXkbnc/58ck1m7awbOP32fpZ+2IiIiIiIi4w+sbTIDu3buTnJzM66+/zpAhQzhz5gzVq1enefPmPPbYY/njvvjiC4YPH86IESPw8/OjV69efPXVV7Rs2TJ/TM2aNbnhhht45513SEtLIyAggJiYGGbNmlXgcSbX43jGaVZvTKVtszg1lyIiIiIiUipY5jElZc323WnMXfArQx/srQZTRERERERKBTWYJsrNzc1/bqeIiIiIiIi3U4MpIiIiIiIihtDpMxERERERETGEGkwRERERERExhBpMERERERERMYQaTBERERERETGEGkwRERERERExhBpMERERERERMYQaTBERERERETGEGkwRERERERExhBpMERERERERMYQaTBERERERETGEGkwRERERERExhBpMERERERERMYQaTBERERERETGEGkwRERERERExhBpMERERERERMYQaTBERERERETGEGkwRERERERExhBpMERERERERMYQaTBERERERETGEGkwRERERERExhBpMERERERERMYQaTBERERERETGEGkwRERERERExhBpMERERERERMYQaTBERERERETGEGkwRERERERExhBpMERERERERMcT/ATy504sF7A00AAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc3 = QuantumCircuit(3)\n", + "qc=qc3.compose(student_network)\n", + "qc.assign_parameters(weights, inplace=True)\n", + "\n", + "qc.measure_all()\n", + "qc.decompose().draw(output='mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c9f00715", + "metadata": {}, + "outputs": [], + "source": [ + "# #choosing the qasm simulator backend\n", + "\n", + "# from qiskit.visualization import plot_histogram\n", + "\n", + "# backend = Aer.get_backend('qasm_simulator')\n", + "\n", + "# # running the job and getting results (counts)\n", + "# job = execute(qc, backend, shots=1024) # shots = no. of times you want to run the experiment\n", + "# result = job.result()\n", + "# counts = result.get_counts(qc)\n", + "\n", + "# #printing and visualizing results (histogram data of experiment)\n", + "# print(counts)\n", + "# plot_histogram(counts)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "4078e87c", + "metadata": {}, + "outputs": [], + "source": [ + "from qiskit import QuantumCircuit, transpile, Aer, IBMQ, execute\n", + "provider = IBMQ.load_account()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "4d820c42-ba9a-4173-935b-b95cbf528410", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ibm_oslo ibm_nairobi ibmq_manila\n", + "-------- ----------- -----------\n", + "Num. Qubits: 7 Num. Qubits: 7 Num. Qubits: 5\n", + "Pending Jobs: 127 Pending Jobs: 22 Pending Jobs: 34\n", + "Least busy: False Least busy: False Least busy: False\n", + "Operational: True Operational: True Operational: True\n", + "Avg. T1: 127.5 Avg. T1: 118.1 Avg. T1: 163.9\n", + "Avg. T2: 98.7 Avg. T2: 53.3 Avg. T2: 58.2\n", + "\n", + "\n", + "\n", + "ibmq_quito ibmq_belem ibmq_lima\n", + "---------- ---------- ---------\n", + "Num. Qubits: 5 Num. Qubits: 5 Num. Qubits: 5\n", + "Pending Jobs: 29 Pending Jobs: 20 Pending Jobs: 39\n", + "Least busy: False Least busy: True Least busy: False\n", + "Operational: True Operational: True Operational: True\n", + "Avg. T1: 92.1 Avg. T1: 89.2 Avg. T1: 92.4\n", + "Avg. T2: 98.3 Avg. T2: 107.7 Avg. T2: 115.9\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "from qiskit.tools import *\n", + "backend_overview()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "6e7b9a93-2d83-4224-93d9-7bb44dd918e8", + "metadata": {}, + "outputs": [], + "source": [ + "backend=provider.get_backend('ibmq_belem')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "2d6e1c95-e68a-477a-b049-d6acc3aa9daa", + "metadata": {}, + "outputs": [], + "source": [ + "#Execute the circuit on the backend\n", + "job=execute(qc,backend,shots=1024)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "15d543fd-11ab-4bfb-8028-211357f6f6e8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "job.status()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "764d4399-fcd6-4cb1-b8f3-a5b0aa8d10b5", + "metadata": {}, + "outputs": [], + "source": [ + "belem = provider.get_backend('ibmq_belem')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8b556338-de6e-4a78-b176-4cb2be32b73d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "belem.jobs()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "3bf75b5e-21b1-4676-ac97-04904e52e2cc", + "metadata": {}, + "outputs": [], + "source": [ + "job = belem.retrieve_job('62e04f0d1813982a9ec6d48a')\n", + "result=job.result()\n", + "counts=result.get_counts()\n", + "histogram = plot_histogram(counts,title=\"Quantum Neural Network on IBMQ_Belem\")\n", + "histogram.savefig('qnn_belem.pdf')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d70ed788-4dfa-43a8-a83b-d5ca30e35cd6", + "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.8.13" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Compaqt/network_distillation_AE_model_train.ipynb b/Compaqt/network_distillation_AE_model_train.ipynb new file mode 100644 index 0000000..c06a7aa --- /dev/null +++ b/Compaqt/network_distillation_AE_model_train.ipynb @@ -0,0 +1,1122 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "daae30bb", + "metadata": {}, + "outputs": [], + "source": [ + "# General Imports\n", + "import numpy as np\n", + "\n", + "# Visualisation Imports\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Scikit Imports\n", + "from sklearn import datasets\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.svm import SVC\n", + "from sklearn.decomposition import PCA\n", + "from sklearn.preprocessing import StandardScaler, MinMaxScaler\n", + "\n", + "# Qiskit Imports\n", + "from qiskit import Aer, execute\n", + "from qiskit.circuit import QuantumCircuit, Parameter, ParameterVector\n", + "from qiskit.circuit.library import PauliFeatureMap, ZFeatureMap, ZZFeatureMap\n", + "from qiskit.circuit.library import TwoLocal, NLocal, RealAmplitudes, EfficientSU2\n", + "from qiskit.circuit.library import HGate, RXGate, RYGate, RZGate, CXGate, CRXGate, CRZGate\n", + "from qiskit.opflow import StateFn, PauliSumOp, AerPauliExpectation, ListOp, Gradient\n", + "from qiskit_machine_learning.kernels import QuantumKernel\n", + "\n", + "from qiskit.utils import QuantumInstance, algorithm_globals\n", + "from qiskit_machine_learning.neural_networks import CircuitQNN" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e25cdbe5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.10545144 1.80110498 1.88227534]\n" + ] + } + ], + "source": [ + "# Generate random inputs\n", + "inputs = np.random.uniform(low=0.0, high=np.pi, size=3)\n", + "print(inputs)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "8001eaed", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9wAAACoCAYAAAASC+ZXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAA5lElEQVR4nO3deVyU5f7/8RcgigsuRIrgkiiooOBSlriAuaTWySy1TOtk/o7ldtKss+RSppbHYycrlzrVt77nHNPU/GaZLZZCi1ouuZFF7oKYoKKiiMDM7485ojDDMAMzc8/g+/l48HjAPfdc95uL+57hM/d1X7ef2Ww2IyIiIiIiIiIu5W90ABEREREREZGqSAW3iIiIiIiIiBuo4BYRERERERFxAxXcIiIiIiIiIm6ggltERERERETEDVRwi4iIiIiIiLiBCm4RERERERERN1DBLSIiIiIiIuIGKrhFRERERERE3EAFt4iIiIiIiIgbqOAWERERERERcQMV3CIiIiIiIiJuoIJbRERERERExA1UcIuIiIiIiIi4gQpuERERERERETdQwS0iIiIiIiLiBiq4RURERERERNxABbeIiIiIiIiIG6jgFhEREREREXGDakYHEM/7+eef7T6+cOFCJkyYYHedNm3auDKSiIiIiIhIlaMz3GJl0aJFRkcQERERERHxeSq4RURERERERNxABbeIiIiIiIiIG6jgFiurVq0yOoKIiIiIiIjPU8EtIiIiIiIi4gYquMXKkCFDjI4gIiIiIiLi83RbsHKs3gYZZ4zZdkQDuPdmY7ZthF82wPmTxmw7uCG0vt3x9Y3Maosv5Xc2q4iIiIiIr1LBXY6MM3DAiwqrquz8SchJNzqFY3wpqy2+nl9ERERExBdoSLlYGT9+vNERREREREREfJ4KbrEyYcIEoyOIiIiIiIj4PBXcYqVnz55GRxAREREREfF5KrjFSlZWltERREREREREfJ4mTROfMmVJEvuObCYgIBB//wDCGrTgwd5TSYwfanS0Kkd9LSIiIiJSOSq4xUpMTIzREewa0Wc6I/pMo6iokDWbFvLiew/SKqIjEaGtjI7msNLFbOOQSEb0nkaPuPuMjlZCVehrERERERGjaEi5WPnggw+MjuCQgIBqDLj1DxSZCjlwfKfRcZw2os90Pp6Ty+rnTtGrw3BmL72f9Kw0o2PZ5Ot9LSIiIiJiBBXcYmXGjBlGR3BIQeFl1m5aAkCT0GiD01RcQEA17k4Yh8lUxKHMPUbHsamq9LWIiIiIiCdpSLlYWblyJc8//7zRMcr03ldzWJkyn7z88wQEBPLk0LeIDI8DICN7P3P+cz+vTNhMYLXqrEj+Oxfzz/PIHd77+xQUXmbNpkVUCwgkMjze6DglVIW+zjgDe47B5UIIDYZON0FQoNGpRCrObIZff4NfT4DJDE1CoH0TqBZgdDL7zubBjsNwPg9q1YCOzeGGOkanEqmcE2dh91G4VAANalveY2rXMDqViHgTry64TSYT//jHP3jjjTc4duwYrVu35tVXX2XMmDEkJibyz3/+0+iIVlbNTqJZuz50uWeaQ8vFeQ/2nsqIPtM4f/EML60cza79GxnQZTQAEaGt6N7+PpZveJE+Nz9M8s7lLJiwyeDEtl0pZgMDqhMe2ooZD3/gdddG+3Jf516C//3WUphc6/+2w10dILGNIbFEKiUzB/7na8g6X3J57RowoivERBgSy64iE3z0I3zzi+UDgivW7oQukTC0CwR6+YcFIqXlXYb/bILUjJLLP9wBd7SHvrHg52dMNhHxLl5dcI8ePZrVq1czffp0OnfuzKZNmxg+fDhZWVk8+eSTRscTgwXXasCTQ9/i93NbsmnvGhLaDQJgWNLTPLEwgR9++ZSxdy+gejXv/Kj5SjHrC3ytry8XwpINcPyM9WMFRZaiO8Afumt0vPiQMxfgtfWQV2D92MV8eCsFxveGlo08n82e/9sO35YxPcUPByG/AB7poeJEfEeRCf65EQ5l235s3S7wA/q283g0EfFCXnsN97Jly3j33Xf56KOPeOqpp+jVqxdTp06la9euFBYW0qlTJ6MjVlkpKSlGR3BY3Voh3NfjSf7ns2cwmUwAVAsIpH1kT3LzztCuRXeDE1YdvtTXPx6xDCU321nnk52WwlzEV2z4CS5etgwpL82MZfnaXR6PZVf2+bKL7St2HYOjpzyTR8QV9qbbLrav9fley1lwERGvLbhfeOEF+vfvT2JiYonlrVq1IjAwkLg4y3Wkhw8fJjExkejoaNq3b88333xjRNwqJTU11egIThnc4wlOn8tk/fZ/AXD4RCqph7+jY6s+rPv+TYPTVS2+0teb91vOLtiTV2D5p0nEFxSZ4PuD9tcxA4eyIOucRyI55IdyMoPlWP3+gNujiLjMlgPlj8goLLJ8+Csi4pVDytPT09m7dy+TJ0+2euzo0aPExsZSo4Zl6Opjjz3G/fffz7hx49i0aRNDhw7l0KFDVK9e3e42/Bwcu3bf1I00aZvkVP4f1sxh+7r5JZYVXMqlWbs+TrWTkpLMH/v1cuo5jrDVr9d6+eWXHVrH1eY/vpH4lkl213lpbLLVstpBdVn9/GnAct3/K6sfZ+LgRTQJjeaJRQkkxA6iQbD9MZYpKcncMtzxvnYkqye5I7+39HVFjH71GHVCmpS73h8mPM2OT+aXu56I0YLqhPDY646dBu6c0JtjqRvcnMgxfce8Q5tuI/EPKPvfjSJTEe+t+pz7b7vTg8lEKm7k3L3c0CTW7jpms5mnnpnD5lXTPZRKRDzNbGvImQ1eeYY7Pd1y2iksLKzE8ry8PFJSUoqHk2dnZ/Ptt98yerRlEqeEhATCw8PZuHGjZwOX0mXQVMb+M6fEV3i09wy3rco+3ryEqIjORDfpTK2gYB65YxaLP5pkdCwrL41N9pnrt8vizX2dfzEH83+Hvdtz+eJZD6QRqbyC/AuYTI5dA5HvRft1ft7Z8k8Fms2W9UR8RP6FM5hNRXbX8fPz034tIoCXnuEODQ0FIC0tjYEDBxYvnzdvHpmZmXTu3BmwnO1u1KhR8dlugBYtWnDkSPljeBz9ROK19XDgpDPpXScxMYlVsx3L6Yyff/7Z7uMvv/wyY8aMsbvOP/7xD1dGAmDbcsip5BDfQd3Gl/i5W7t76NbunnKfl5iYhHmJ433tiqyuZER+T/V1RXyxB9bttr+Ovx9sWvdPgoO8724HIra8nWK5DMLe0RNSGzIPbMPfSyYgO3gSXl1vfx3/gGr87c/D+XThcM+EEqmkr3+B1dvKX++L5X/nhjp/d38gEfFqXllwR0ZGEhcXxwsvvEBISAgRERGsWrWKdevWARQX3OIeM2fONDqCSKV0bQUb91nui1pWcXJbKwgO8mgskUq5PQb2ZmC34u7bDq8ptgFa3Gj5OpxlO7YfcGNdiPXC25mJlOWWFvDFXriQb3sSQ9B95kXkKq8cUu7v78/KlSuJjY1l7NixjBo1itDQUMaPH09AQEDxhGnNmjXjt99+Iz8/v/i5hw4donnz5kZFrxKGDRtmdASRSgmuCY/fDkGlpnK4MrK1XRO4V5/biY9pcSOMTLAuqK/82K8d3NbS47Hs8vOD0T0hosF/fy71+A3B8Hgvy236RHxFzeow7naoU+pOmFfeY6LD4IHbPJ9LRLyTV57hBoiOjra6Fvuhhx4iJiaGmjVrApah5926dePtt98unjQtIyODXr3cOyGTPUOmJTu13Bu1bduWffv2GR1DpFKah8L0QbD1oOU+wAAdmlnOfkc10j1/xTd1vgkib4RNv8L6/95QomsUdI+C8AaGRitTnSCY3B/2pFuOx9QMy/IRXaFDcwgMMDafSEWEN4Cpd8O2Q7Bqq2VZXBPL6KnWjb1rpImIGMunPlPetm2b1XDy119/neXLlxMdHc2YMWNYtmxZuTOUi8j1oVZ1SGxz9effd7eceVCxLb6sQW24s8PVn4d18d5i+4oAf8sHXn9IurrslkgV2+LbggKhe/TVn0f1hLbhKrZFpCSvPcNdWm5uLmlpaYwbN67E8sjISL7++muDUom3yD6bwYrkv9Or43Be/2gyfn7+tG56C2Pvdv3ty0rbd/T7MreZffY4f1s2ksuFl/h9v+fpGNWbi5fO8cE3LzOiz3TyL1+kVlCwVZuDptfj7q7jGD3wRQ6d2MsrHzyO2WzmiXuXEBkexzufTWPNdwv54LlsAuzcbscTss9m8I+V/48Ll856tN9FRERERLydz5zhrlOnDkVFRUycONHoKFVeUlKS0RGctj1tPZ2j+9KofnP+/tgGFoz/lpzckxzK3OP2bdvb5vsb5/L7O2Yx9w9fsPSr2RQWFbB2yxukHt7E0i9nkXspx2abLcLaM3rgiwD872fTeWbEMqY/tIJ3P7fcz3NU/9m0DO/g7l/NIdvT1tO700iP97uIiIiIiLfzmTPc4jlLliwxOoJduw4k89z/DiaycTwnTh+iZXgHgmuFMOGe16hZ4+qUoAH+gfj7u3+8Ykjdq/eLL73NQyf2MG7QK/j5+VGrRjCXCy/hV2o885ylw7k/6c8E+Afw7y+fZ8ZDK0s8fj7vDA3rNwUos0D3BFv9/vyoNew+mMKEe16jeqBlym9P9buIiIiIiLfzmTPc4jljx441OoJd7Vv0pHXTLrw0Npm4yET+eO9iLl2+UKLYPnh8N2cvZNG8UYzHctnapslUVFxg1w6qR27eGe68dQyxNyUwos906gTVZ9zdC3hj7RRe/3gK4+5+xapds9l07Q9u/z3KYqvfzWZzib43ot9FRERERLyVznCLleTkZKMj2JV5+iCNQyIByDp7jJzcLCLD44sfP3fxNAs/nMC0kSs8lqmsbfr5Xf1M60L+OerUbEDtoLo83O85AGoFBVMrKJjGIZH4+/kTWi/cuvFrzohf2567nD53gjlLHyixLCQ4jEf6zy7R76H1ItifsbO4743odxERERERb6aCW3zOkROpNA+LpchUhJ+fPzt+XU/nqL4AFBUVMnfZSMbcNb/EUG93srfNyMZx/HR4My3C47h46Ry1g+paPf/g8d3k5Z+noDCfYyd/oWnD1iUer1szhKycdPz8/Kll4/muFlI3jJfGJlst37R3TYl+B4r73oh+FxERERHxdiq4xecc/i2VmOZdKSjMJyf3JDt+/ZIhPacAkLJ7JWnHtvLmJ38CYPSAF4m5qatb89ja5oad7zHhntcYlvQn5i1/mPyCPB7uN9PquUWmIt5YO4U/P/BvCosus2D148x59JMS6zzcbyaz/3M/ABMHL3Lr72JP6X4/dS6TtPRtDOk5heRd73u830VEREREvJ0KbrGyb98+oyPY9WDvZ4q/f3PKHlJ2rcDf33LG9faOw7m943CP5rG1zSvF5o31m/D3xzeU+dwA/wD+NmZ98c8vjF4HwLkL2by97q+MHvgikeFxvDLhuxLPe+ezaZw5f8KjN5Qu3e8APdrfh7+/vyH9LiIiIiLi7VRwlyOiwfW37RUrVjBs2DCPbze4YcWeN6hJ5bM6u+2KZnXU6ld/tvv45P83m8nMrnAeV+WvSN+7u+9ERERERLyFCu5y3Huz0Qk879lnnzWk4G59u8c3WWG+lNUWX88vIiIiIuILdFswERERERERETdQwS0iIiIiIiLiBiq4xcrixYuNjiAiIiIiIuLzVHCLldjYWKMjiIiIiIiI+DwV3GIlMTHR6AgiIiIiIiI+TwW3iIiIiIiIiBuo4BYrt9xyi9ERREREREREfJ4KbrGydetWoyOIiIiIiIj4PBXcIiIiIiIiIm6ggltERERERETEDVRwi5VVq1YZHUFERERERMTnqeAWERERERERcQMV3GJlyJAhRkcQERERERHxedWMDuDtVm+DjDPGbDuiAdx7szHbNsIvG+D8SWO2HdwQWt/u+PpGZrXFl/I7m7Wq87Z9SaxpnxUREZGKUsFdjowzcED/DHvE+ZOQk250Csf4UlZbfD1/VaK/hYiIiEjVpSHlYmX8+PFGRxAREREREfF5KrjFyoQJE4yOICIiIiIi4vNUcIuVnj17Gh1BxGXO5l39/thpKCgyLouIK5jNkH3+6s+ZOVBkMiyOiIiI2KFruMVKVlaW0RFEKiXjDHyXBnsz4Nw1BfdLn4K/n2VCwi6RcEskBAUal1PEUWYz/PqbZb9O+w3yLl997G+fQGAA3BQKXVtBXFOoFmBcVhEREblKBbf4lClLkth3ZDMBAYH4+wcQ1qAFD/aeSmL8UKOjVTm+2Ne5l+CDbfDjkbLXMZktZ7qPnYZPdsHgzpbi28/PczlFnPHbWVi2BQ5nl71OQZGlIP/1N7ihDjxwG0Q18lxGERERsU0Ft1iJiYkxOoJdI/pMZ0SfaRQVFbJm00JefO9BWkV0JCK0ldHRHFa6mG0cEsmI3tPoEXef0dFK8KW+PpINb6ZYim5HXSqwFDI/HYeRCZazhFJxvrJf+5Lth2HZZih0Ysj4qVxY9CXc0R76t9eHSSIiIkbSNdxi5YMPPjA6gkMCAqox4NY/UGQq5MDxnUbHcdqIPtP5eE4uq587Ra8Ow5m99H7Ss9KMjmWTt/f1sVOw+Cvniu1r7ToK73yt62BdwZf2a2+3/RD85zvniu1rfb4H1u50aSQRERFxkgpusTJjxgyjIzikoPAyazctAaBJaLTBaSouIKAadyeMw2Qq4lDmHqPj2OTNfZ1fAO98A/mFZa+zYITly56fjsP6VNdmu575wn7tzX47B8u+B7OddRzZr7/6CfbqPu8iIiKGUcEtVlauXGl0BLve+2oO90yvz13P1OSdz6fx5NC3iAyPAyAjez/jFnSmoNAyo9CK5L/z7ufe/QFCQeFl1mxaRLWAQCLD442OU4Iv9PXanXD6gmva+mIPHD/jmraud968X3s7sxmWb4ZCF82ov+KHkpOsiYgUmeD8Jb02SNVSWATn8+yfhDGCVxfcJpOJ+fPnExUVRVBQEPHx8aSkpNC6dWvGjBljdDwxyIO9p/LhrBxWPZdNlzYD2bV/Y/FjEaGt6N7+PpZveJHM04dI3rmcB3tPNTBt2a4Usw/ObsLm1DXMePgDr7s22tv7+vwl2LTfde2ZzLBxn+vaux75wn7t7fafhEN2Jkhz1rk8+OGg69oTEd91MR8+2QkzVsP0D+CvK2HB57DzqNHJRCou+zy8/71lf56+Gv7yPrydAoe85MZLXj1p2ujRo1m9ejXTp0+nc+fObNq0ieHDh5OVlcWTTz5pdDybVs1Oolm7PnS5Z5pDy6Xigms14Mmhb/H7uS3ZtHcNCe0GATAs6WmeWJjAD798yti7F1C9Wg2Dk9r2YO+pjOjjG/uDt/b19wdcf931j0fgns5Q2zt3G6/nS/u1t/rODZe8f5sGPVtrAjWR69n5S/DqF5B1vuTyI6fg3W+gbyzc2cGQaCIVln4aFn5pucTwymVYZiy3ht2bAQ8lQKebDAyIF5/hXrZsGe+++y4fffQRTz31FL169WLq1Kl07dqVwsJCOnXqZHTEKislJcXoCA6rWyuE+3o8yf989gwmk6XyqhYQSPvInuTmnaFdi+4GJ6w6vLGv0064vs1Ck/d8IirXH7PZPft11nk4m1f+eiJSda38wXImsDTzf6uU9anwS6ZnM4lUhskEb39tGUJees4Ts9nytXQT5Fw0JF4xry24X3jhBfr3709iYmKJ5a1atSIwMJC4OMt1pDNmzCA6Ohp/f39WrVplRNQqJzXVt2aOGtzjCU6fy2T99n8BcPhEKqmHv6Njqz6s+/5Ng9NVLd7U12az5VNNdzh6yj3tipTn9AW46KZrKo9pvxa5bp25AHuO2Z+I0c8Pvv7FY5FEKm1fpmXfNtvZsYvMsMWFlx9WhFcOKU9PT2fv3r1MnjzZ6rGjR48SGxtLjRqW8Z79+/fnkUce4dFHH3VqG34Ojqu7b+pGmrRNcqptV0lJSeaP/Xq5vF1b/Xqtl19+2aF1XG3+4xuJb5lkd52XxiZbLasdVJfVz1sqL5PJxCurH2fi4EU0CY3miUUJJMQOokFwI7vtpqQkc8twx/vakaye5I783tLXZQkIDGLCOyVP2ZU3Y3NZj09aWvLnfyx8izvf+kMl0jnO2/YlseaqfdYRjaMSGPbsdyWWuWq/HvnoOHZ/uaQS6Vzjif9Y/jNy9H1YxNv5wj4d3fUBBoxfZncdsxl2HsjFr1ewh1KJVE734fPoNGAKfv5ln0M2m028+X4KA+Jvd/n2zfYq/Wt4bcENEBYWVmJ5Xl4eKSkpDBgwoHhZQkKCR7M54oc1c9i+bn6JZQWXcmnWro9Bia4fH29eQlREZ6KbdAbgkTtmsfijSUwdYf9NxtNsFbO+xui+duc/Nn5+Xjv4x6tVhf3aaO79h917iwERcS8//wCXrifiDSz7a3lFrx/+Bu/XfmZHS3MP2r9/P1FRUbz88stMmjSpePnMmTN57rnnWLRoEePGjSvxnKSkJCZMmMCQIUNcmuW19XDgpOPru3LStJYNYWJfx7ftqJ9//tnu423btmXfPvtTNbdp08aVkQDYthxyDLpfbP0mcPMDjq9vZFZbfCm/s1nLYjbDX1Y4duuHK2cAS5/xK8vtMXB3x4pnc4a37UtizVX7rCN+OwcvfuzYus7u17/vDh2bVyyXK13JW96ZexFf4Qv79ImzMHet/XX8gJtuhCf6eSSSSKVtOwT/2VT+eoltYHBn9+cpi1ee4Y6MjCQuLo4XXniBkJAQIiIiWLVqFevWrQOgc2cDe+w6MHPmTKMjiJTLzw8iGsBBN0xw1jTE9W2KOOLGYKhRzT33EG2i/VrkuhVWz3Ii5+DJss8HmoEe0Z5MJVI58c1g9TbL/eTtnUFOiPJYJJu8ctykv78/K1euJDY2lrFjxzJq1ChCQ0MZP348AQEBxROmiXsMGzbM6AgiDmnZ0PVt+gEtbnR9uyKO8Pdzz/5XtyaE1nF9uyLiO4Z1gZrVy764pEMz6OAFo2BEHBUYACMSLCdhSu/XV36+Mx4a1fV0spK8suAGiI6OZuPGjVy4cIGjR48ya9Ys9uzZQ0xMDDVr1jQ6XpXWtm1boyOIOOTWlq6/KjUmAurXcnGjIk5wxyfxXVvpHtwi17tG9WDyHdC+acnXgzo1YGA8PNTN8qGfiC+JjYDxva0/rA4NhhFdoW87Y3JdyyuHlJdl27Zt3HbbbSWWTZ8+nXfeeYesrCz27NnDpEmTSElJoWXLloZkHDIt2anlIlJxocEQ1wx2HXVdm730eZMYLDbCMrQ8y8b9ciuiRjVIaOWatkTEt91YFx7tCWfz4NnVlmUz74UArz0FJ1K+lo3gj/0s95mf/ZFl2TO/854Pmn3m8MrNzSUtLY1OnTqVWD5r1izS09PJz8/n1KlTpKenG1Zsi3Gyz2aweM0k9h39nicWJjBpUXeWfGT/1mauYm+b2WeP8/Trt/PEwgR2pH2J2WzmQt5Z/vXFcxSZirh4yfZ/1IOm1+PtdX8FYOlXc7h/VjjvfHZ1wr13PpvGPdPrU1Tkhgs9nZR9NoNn3hrg8X6/4t6bLUPkXKFrK2hl/65mblfePrzko8lMXtyDRWueACA3L4ddB5LZdSCZ3LwcAFYmz2d/xo9uy/j51ncZNa81uw6k2MyUkb2fx/7RgXc+m8aB47t4f+M8r8iaffY4Yxd0YuBfg4qPnbKyGinAH4bf5rrRG3d3gnoatSEi16h3zWBRFdtSVYRec0c7bym2wYcK7jp16lBUVMTEiRONjlLlJSUlGR3BadvT1tM5ui+N6jfn749tYMH4b8nJPcmhzD1u37a9bb6/cS6/v2MWc//wBUu/mk1hUQFrt7xB6uFNLP1yFrmXcmy22SKsPaMHvgjAwC7/j78OLzkN8aj+s2kZ3sFdv5JTtqetp3enkR7v9yvq1YSRXe0Pg5u0tPyZnCMawKBO9tfxBHv706/pO8jLz+Xlcd9QWHiZX45tZe+hb/ly+79Zv/1f7D74NSaTidTD39Eqwr3TrA9NfJr4lok2M0WEtmLcoAUAtAyPZ9+RzZjNZsOz1q0VwrwxX9G22dWRUmVlNVpkQxgQb38dR/brDs10dltERMRIPlNwi+csWbLE6Ah27TqQzOAZDZiyJIkRc5oz451B7D6YQlxkIiF1w6geGARAgH+gR+67Z2+bh07sIfamBGrWqEOtGsFcLrxkdZ/dOUuHsz9jJ4cy9/D8v4datd8guJGb783rGFv9DrD7YAoJsYM83u/Xim1iueVRRT+lbxoCY2+HoEDX5qoIe/vTvqNb6BxtuVdgp6g+/HRks9XzD2buIjzUUmGV9Tdzxpaf1vLPtU9jMpn465v9OXmm5Ph9RzJFhEbZPIvt6azVA4MIrtXAbhtlZTVC31jo377iz+/QDEYmeNen/CIiItcbFdxiZezYsUZHsKt9i560btqFl8YmExeZyB/vXcylyxeoWePqFLwHj+/m7IUsmjeK8VguW9s0mYqKi+XaQfXIzTvDnbeOIfamBEb0mU6doPqMu3sBb6ydwusfT2Hc3a94LK+zbPW72Wwu0fdG9PsV8c3gqQHO3dLLD+gdY7nup06Q26JViK2+zM3LoVYNy1Sblv0ph3YtutOn80P07fwwcZE9ycj+lUYNbgJs/82cdVvMXZw5/xsvfzCG22J+R8MGzUo8bitTaWE3RHIs62fDszriSlZv4OcH/ePgsV7OTeRXoxrcf6vlQ6hqnv3sS0RERErxqUnTxDOSk5ONjmBX5umDNA6JBCDr7DFycrOIDL869vLcxdMs/HAC00au8Fimsrbp53f1M60L+eeoU7MBtYPq8nC/5wCoFRRMraBgGodE4u/nT2i9cI9lLsvpcyeYs/SBEstCgsN4pP/sEv0eWi+C/Rk7i/veiH4vrXF9mHQH7DkG36TBgZO21wsKhFsioVuU5d6k3qasvqwdVI+L+eeAK/tTferUrE98yySb7ZQ+VkLrRZR4vKy/9dSRy0ssu/O2x5j69gAmDl5ktQ1bmcpidFZf1TYc/nIXbDsE36VB5lnb69WrCV2jLEPI6+pmHiIiIl5BBbf4nCMnUmkeFkuRqQg/P392/LqezlGWIa1FRYXMXTaSMXfNJ6RumEfy2NtmZOM4fjq8mRbhcVy8dI7aQdY3Ajx4fDd5+ecpKMzn2MlfaNqwtUdylyWkbhgvjU22Wr5p75oS/Q4U970R/V6WAH/LfUQ7NIe8y5B+GrJzochkKbQjGljux+jvpeN77PVlTPOufLLlDRLjh/Hjr1/S7+ZHrJ4fERrFL8e2AtbHSmll/a2vZTKZWPrlLEb2fZb3N8zloX7POp3pxKmDJHV4wGq5p7M6oqysRgsKhO7Rlq9zeXDsNJy9CGazZXRGkxAIqa3h4yIiIt7GS//lFCnb4d9SualRLAWF+eTknmTHr18S3eRmAFJ2ryTt2Fbe/ORPTFmSxE+Hra8ndTVb21z4oWVyv2FJf+Kdz6by5zf6MPz2Z6yeW2Qq4o21Uxh79wLGDXqFJR9Ptpqw6dMf3uaNj6ewYcdSXl093u2/T1lK9/upc5mkpW8jusnNhvS7I2pWh6gwy+zj3aPh5haWs+DeWmyD7f3p9LkTLP1qDlFNOhEYGMTkxT3w9w+gTbMuVs+PbBxPelYaYPtv5qwPv3uVbu0GMzRxCodO7OHwidQSjzuSKT07zeYkf57OWlhUwJ/e6MPBzF385a072Hf0e4ezepO6NS23DkuIgm7RlsspbqijYltERMQb+Zm9YTpWL/ba+rKHpbpby4Ywsa/r2/3558pfn9imTRsXJClp23LISXf+eSm7VpAYP6xS267fBG524qRWRbM66tF5bejWbnDxTOWlvfPZNL7ZvYo3n0olwD/AsPwV6Xtns1Z17tiXVibPp2NUb7fN/v317lUs3ziXx+56ifiWiVaPZ2TvZ+6ykfSMG0qnqD5s/eUzHuj1Z5/Nqn3Wta7MrL5ghLE5RFzFV/dpX80tYo837tcaUi5WVqxYwbBhlStgPamyxbY3+p8/2f9QZFT/2YzqP9tDacpWFfu+Khia9JRb2+8ZN4SecUPKfDwitBWvTdxS/HPL8LLvb+VLWUVEREScpYK7HBH27yBTJbf97LPPGlJwBzf0+CYrvG0js9riS/m9re+Mpv7wfvobiYiISEWp4C7HvTcbneD60fp2oxM4zpey2uLr+asS/S1EREREqi4vnjpIRERERERExHep4BYrixcvNjqCiIiIiIiIz1PBLVZiY2ONjiAiIiIiIuLzVHCLlcRE61vniIiIiIiIiHNUcIuIiIiIiIi4gQpuERERERERETdQwS1WbrnlFqMjiIiIiIiI+DwV3GJl69atRkcQERERERHxeSq4RURERERERNxABbeIiIiIiIiIG6jgFiurVq0yOoKIiIiIiIjPU8EtIiIiIiIi4gYquMXKkCFDjI4gIiIiIiLi86oZHcDbrd4GGWeM2XZEA7j3ZmO2bYRfNsD5k8ZsO7ghtL7d8fWNzGqLL+V3NquIiKd422u7lKT3j+uHjkXvpmPROSq4y5FxBg7ogPeI8ychJ93oFI7xpay2+Hp+ERF30GujiHfQsShViYaUi5Xx48cbHUFERERERMTnqeAWKxMmTDA6goiIiIiIiM/TkHKx0rNnT77++mujY4iISBVwIR92H4Ojp+DE2avLl22BpiEQ1xTq1jQun0hFnMqFvelw7NTVZa+th/D60DwU2jWBoEDD4tlUWAQ/HYdDWSXnJ3r3G2gSAjHhEN7AuHwiFZF3Gfakw9FsOJ5zdfnSzdAsxHIsNqhtWDxABbfYkJWVZXQEERHxcWcvwie7YMcRyz/6pX1/wPK1ehvEN4M74yE02PM5RZyRcQY+2Qn7joO51GMHTlq+vkmDGtXg1pbQvz3UqmFE0qsKiuCrn+DbNMi9ZP34zqOWr7U7IfJG6B8H0WEejynilNxLsG43bDsIl228x2w9aPlavc1SdN/ZAcLqeTwmoIJbfMyUJUnsO7KZgIBA/P0DCGvQggd7TyUxfqjR0aoc9bWIVNT2Q7BqK+QVlL+uyQw/HrGcLRzUCbpFgZ+f+zOKOMNkhi/2whd7LN+XJ78Qvv7FUsgOvw3ahrs/oy3HTsN/voPfzjm2/sEsWPwVJLSCezpDdVUK4oV2H4MV30NufvnrmrGcAd93HAbGQ6+2nn+P0WEkVmJiYoyOYNeIPtMZ0WcaRUWFrNm0kBffe5BWER2JCG1ldDSHlS5mG4dEMqL3NHrE3Wd0tBKqQl+LiGdt+Ak++tH55xUUWYr00xfgdx1UdFeGr7zH+AqTCd7bDNsOO//cc3nwz40wIgFubuHyaHYd+A3eSIbLhc4/d9N+S5E+ppflbL1UjI5F19v0K6z4wfnnFZos703Z52FoF8++x2jSNLHywQcfGB3BIQEB1Rhw6x8oMhVy4PhOo+M4bUSf6Xw8J5fVz52iV4fhzF56P+lZaUbHssnX+1pEPGP74YoV29fa8JPlzKBUji+9x3i7tTsrVmxfYcZSsP96wkWBHJB1Dv6ZXLFi+4oDJ+Hf34HZgTP6UjYdi66TmgErK1BsX2vTfvh8r2vyOEoFt1iZMWOG0REcUlB4mbWblgDQJDTa4DQVFxBQjbsTxmEyFXEoc4/RcWyqKn0tIu5z9iKscuAfoQUjLF/2fLzT8SGwYp8vvMd4swMnYeM+++s4sk+bzJaJAvMduMyiskwmeG+LZVi7PY7k3psOWw+5Ltv1TMdi5VzIh+VbrOdOKM2R/fqLPZB+2mXRyuXVBbfJZGL+/PlERUURFBREfHw8KSkptG7dmjFjxhgdr8pauXKl0RHseu+rOdwzvT53PVOTdz6fxpND3yIyPA6AjOz9jFvQmYLCywCsSP47737u3R8gFBReZs2mRVQLCCQyPN7oOCVUtb4WEff5dLdj12w7orAIPtrhmraud978HuPtzGb4v23l/4PvqNMXYEM5xbsr/HjEMhO5q6zZUbkz5WKhY7FyvkyF8zYm/asIkxn+b7tr2nKEVxfco0ePZtasWTz22GN8+umnDBs2jOHDh3Pw4EE6d+5sdDybVs1O4ocPZzu8XJz3YO+pfDgrh1XPZdOlzUB27d9Y/FhEaCu6t7+P5RteJPP0IZJ3LufB3lMNTFu2K8Xsg7ObsDl1DTMe/sDrro2uKn0tIu51Mb9yQ25t+SnDcuslqRhfeI/xdoezIf1M+es5Y/N+KDK5ts3SvnXxaOUL+ZbJ36RidCxW3uVC2HLAtW0eOAmZOa5tsyxeOw3CsmXLePfdd0lOTiYxMRGAXr16sWPHDlavXk2nTp0MTihGC67VgCeHvsXv57Zk0941JLQbBMCwpKd5YmECP/zyKWPvXkD1agbfj6MMD/aeyog+04yO4RBf72sRca896bZv/VUZZixn6vrEurbd64Uvvcd4qx2HXd/muTzY/xu0buz6tgFO58KhbNe3u+MwdIl0fbvXAx2LlfdzpuV+2662/TDc1cH17ZbmtWe4X3jhBfr3719cbF/RqlUrAgMDiYuL48yZM9x1111ER0cTHx9Pv3792L9/v0GJq46UlBSjIzisbq0Q7uvxJP/z2TOYTJaPjKsFBNI+sie5eWdo16K7wQmrDvW1iJTl2Ck3tevBa+xESjvqpv3aXe0CHHXTMXPstCZPE+O465hx13tXaV5ZcKenp7N3716GDrW+3+/Ro0eJjY2lRo0a+Pn5MWnSJNLS0ti1axd33XUXo0aNMiBx1ZKammp0BKcM7vEEp89lsn77vwA4fCKV1MPf0bFVH9Z9/6bB6aoW9bWI2JJ51k3t5rinXRFHnHDTfu2udgFO5Lin3Qv5rrt+VsRZ7jpm3PXeVZpXDilPT08HICwsrMTyvLw8UlJSGDBgAAD169enT58+xY8nJCQwb948h7bh5+DN1+6bupEmbZMcWveKH9bMYfu6+SWWFVzKpVm7PmU8w7aUlGT+2K+XU89xxOTJk+0+/vLLLzu0jqvNf3wj8S2T7K7z0thkq2W1g+qy+nnLR7omk4lXVj/OxMGLaBIazROLEkiIHUSD4EZ2201JSeaW4Y73tSNZPckd+b2lr0XE+90/83vCWnYpsay8WWJtPT5pacmf9x88gp/fTZUL5wRve22Xkjz9/jHxfwvwD7j6r3JF9mmw3q/fX7mah7u75z7M3e6fy82/+7NDucp7vHTups0jOZflmSnLdSx6N08fi4P//AXN2vctscwV+3VWdg5+fg0qnMvs4LAPryy4Q0NDAUhLS2PgwIHFy+fNm0dmZmaZE6YtWLCAe+65xxMR7eoyaCpd7il5rcaq2UnGhLnOfLx5CVERnYluYtlHHrljFos/msTUEcsMTlaSrWLW1/hKX4uI+xUVuOfUV+HlPLe0W9VVhfcYb1BYcInqAXVc3q67jhd3t11YoOPRWToWXaPQXe8xHtqn/cyOluYeZDKZ6NixI5mZmcyfP5+IiAhWrVrFunXrOHr0KFu2bOHWW28t8ZyZM2fy6aefsmHDBmrVquWyLK+tt8xi56hVs5No1q6PzYLb1nJ7WjaEiX3LX89ZP//8s93H27Zty7599u9b0aZNG1dGAmDbcshJd3mzDqnfBG5+wPH1jcxqiy/ldzariHi/Fd/DJgenULly1qH02TNb4prCoz0rnstZ3vbaLiV5+v3jpU8dm0fAmX0aYGAc9Gtf8Vz27DgM//rOsXWdyV2rOswZAg4OEK00HYvezdPH4kc/woafHFvXmf06qhGMd24AcoV45TXc/v7+rFy5ktjYWMaOHcuoUaMIDQ1l/PjxBAQEEBcXV2L92bNns3btWj777DOXFtvXq5kzZxodQUREfEjTG9zUboh72hVxhNv2aze1C9DMTW03CfFcsS1SWjM3vRe481i8llcOKQeIjo5m48aNJZY99NBDxMTEULNmzeJlM2fOZN26daxfv5769et7OGXVNGzYMKMjiIiID2nfBFZtdf39hTs0c217Is7o2Bw2/eraNmvXsJxVc5cb6lg+qHL1DP8dm7u2PRFntAmHGtUgv9C17Xpqv/bagtuWbdu2cdtttxX/nJqaynPPPUfLli1JSkoqXr5z507Ph/uvIdOSnVrujRwZUi4iInJFnSDo2Ay2HXZdm60bw411XdeeiLNaNYSweq6dIfm2llAtwHXtlebnB92iYfkW17UZFAidbnJdeyLOCgqEWyLh2zTXtdn8Bs+NovLKIeW25ObmkpaWRqdOnYqXxcbGYjab2b9/Pzt37iz+EhEREc8aGG85A+EKAX4wqKNr2qqMfUe/54mFCUxa1J0lH1nfvWPJR5OZvLgHi9Y8AUBuXg67DiSz60AyuXk5AKxMns/+jB/dlvHzre8yal5rdh1IsZkpI3s/j/2jA+98No0Dx3fx/sZ5XpHVVt+WldUofn4w2PY8vRVSryb0jnVde2W5pYVrC4m7Orju2K4oXzsWs88eZ+yCTgz8axBFRZbTsjoWK+eOdlC7umva8gPuceGxXR6fKbjr1KlDUVEREydONDqKeKHssxksXjOp3Bdkd7C3zeyzx3n69dt5YmECO9K+xGw2cyHvLP/64jmKTEVcvHTeZpuDptfj7XV/BWDBqsd4YmE3Ji3qzsHjuwH48LuFDJsZRka2g7MUuVH22QyeeWuAx/tdRLxLSB3H/oGZtLT8yWz6x0F4xe/U4jKN6jfn749tYMH4b8nJPcmhzD3Fj/2avoO8/FxeHvcNhYWX+eXYVvYe+pYvt/+b9dv/xe6DX2MymUg9/B2tItz76cHQxKeJb5loM1NEaCvGDVoAQMvwePYd2YzZbDY8q62+LSurkVo3hm5R9tdxZJ8GuP9Wy+Rj7hbgDw92Lf9MuiO5W4dBQjm/vyf42rFYt1YI88Z8RdtmV0fm6lisnOCaMLRL+es5sl/3ioEWN7omlyN8puAWz7l2eL6v2J62ns7Rfe2+ILuLvW2+v3Euv79jFnP/8AVLv5pNYVEBa7e8QerhTSz9cha5l3JsttkirD2jB74IwP23/4VXJnzHU8Pe4d/rLRPa3dNtAje37u/2380R29PW07vTSI/3u4h4n66toF+7yrWREAV9PHAW0BEhdcOoHhgEQIB/IP7+VyuYfUe30DnaciuRTlF9+OnIZqvnH8zcRXhoKwB2HUhm8IwGTFmSxIg5zZnxziCn82z5aS3/XPs0JpOJv77Zn5NnjpZ43JFMEaFRNs+ceTqrvb4tL6un3XsztGtSuTaG3gIxEa7J44jG9eHRHlCtEv/pNw2BR3qAvxdMluZrx2L1wCCCa9n/1FDHovM6NIdBncpfz57ON8Fd8S6J4zAV3GJlyZIlRkewy9aLz+6DKcRFJjr0ouFq9rZ56MQeYm9KoGaNOtSqEczlwkv4lZrmc87S4ezP2MmhzD08/++hVu03DmkBQLUAz/w+ZSnrRX/3wRQSYgd5vN9FxDsNjLcUF4FOvgwE+MOd/32ut82GfPD4bs5eyKJ5o5jiZbl5OdSqYbnIvHZQPXLzcmjXojt9Oj9E384PExfZk4zsX2nU4CYA2rfoSeumXXhpbDJxkYn88d7FTue4LeYuzpz/jZc/GMNtMb+jYYOSs8rZylRa2A2RHMv62fCsV9jq29JZjRbgD6N6QFIby1BUZ9Sqbilau0W7JZpdMREwtjc0qO38czs2t9wuqaYHzsg7w1eORUfoWKyYXm1hRFfLdd3O8PeDvrGW5/p7uAL2qUnTxDPGjh3r1UX3lRefuX/4nL8te5jRA19kyUeTqVmjTvE69l403MXWNk2mouIC2/ImcIY7bx3DpcsXGNFnOvmXLzLu7gW88N6D+PsF8PT975bZ/tuf/pXB3f/o7l+jTLb63Ww2c+nyheK+N6LfRcT7dIu2DMX9+EfYkw4mOyMR/bCsO6iT5ayctzl38TQLP5zAtJErSiyvHVSPi/nnALiQf446NetTp2Z94lsm2Wwn8/RBGodEApB19hih9Uqe7jx97gRzlpa8sW1IcBhTRy4vsezO2x5j6tsDmDh4kdU2bGUqi9FZoey+9UYB/pZLJuKawtqdcDCr/PU73QS/6wB1a9pf151aNoQ/3wmf74HN++FSgf31G9eHAXGW39Pb+NKx6AxvyOpLxyJYJlCLCrO8x+w8Wv4dMqIawe86uu+2eeVRwS1WkpOTjY5gV+kXn5zcLCLDr44NMeJFo6xt+vld/QjN8ibQgNpBdXm433MA1AoKplZQMI1DIvH38ye0XrjN9ld/s4DmDWNo16K7236HK8p68X6k/2yrF/39GTuL+97XXqxFxL1Cg2FUT8i5CD8egaOn4EQOXC6ynP1uVM8yZLVDM8u63qioqJC5y0Yy5q75hNQNK/FYTPOufLLlDRLjh/Hjr1/S7+ZHrJ4fERrFL8e2AnDkRCrNw2IpMhWVeG+4IqRuGC+NTbabx2QysfTLWYzs+yzvb5jLQ/2edTrTiVMHSerwgNVyT2e117flZTVSZEP4Yz84fgZ2p0P6aTh5zvIPf41AiKhv+ae+Y3PL7P3eICjQ8oFW//aW4uRwtiV33mXLaJIrtxJrG265rtXbRpiA7x2LjtCxWDn1a8FD3Sz79o9H4NgpOJ5juXVYNX/Le0yTEIhvavneSCq4xeeUfvHZ8et6OkdZrt1x5EXD1extM7JxHD8d3kyL8DguXjpH7SDre9wcPL6bvPzzFBTmc+zkLzRt2LrE49t++YLUw5uYNvJ9t/4eV5T14r1p7xqrF/0rfW9Ev4uIb6hfyzIE0Bel7F5J2rGtvPnJnwAYPeBFwkJa8OnWtxnReyqBgUFMXtyDluEdaNPMejafyMbx/OuL5wA4/FsqMc27UlCYT07uSU6dy+SGuo2dyvPhd6/Srd1g7ur6GM//awiHT6SWeDyqSadyM6Vnp9EyvIPhWW31bcxNXR3K6g3CG3jHxH7OqBEIt7a0fPkaXzsWC4sKeOatARzM3MVf3rqDRwe8QNtmt5ZYR8eia9StCYltjE5hnwpu8TmlX3x2/PolQ3pOARx70XA1W9vcsPM9JtzzGsOS/sS85Q+TX5DHw/1mWj23yFTEG2un8OcH/k1h0WUWrH6cOY9+UmKdRWsmUqtGXZ56vRdNb2zNpCFvuPX3KYutF/209G0M6TmF5F3ve7zfRUTc7faOw7m943Cr5SN6TwVg/KBX7D7f39+f9i16sD/jRx7s/Uzx8jenVGxiyXt7TCr+fsbDqwA4enIfyzfOJSI0iviWiVaZMrL389a6v9AzbigHju+ibfOu+Nu4gNHTWW31raNZ5frji8fivMe+LPEcHYvXLz+z0XO8e7nX1sOBk8Zsu2VDmNjX9e3+/HPlJz1o08b1HyVtWw456c4/L2XXChLjh1Vq2/WbwM1OjJSpaFZHPTqvDd3aDS6eqby0D79byCebX2f26E9o1KC5Yfkr0vfOZhUR8RR3v7ZL5ej94/qhY9G76Vh0js5wlyPCwOFCRm17xYoVDBtWuQK2IoIbVux5g5pUPquz265oVketftX+hyKP3D+BR+6fUOE8rspfkb53d9+JiFSUXp+8m/4+1w/9rb2b/j7O0Rnu61B5Z7jbtm3Lvn377K7jjjPcIiIiIiIiVYkG44uIiIiIiIi4gQpuERERERERETdQwS1WFi9ebHQEERERERERn6eCW6zExsYaHUFERERERMTnqeAWK4mJiUZHEBERERER8XkquEVERERERETcQPfhvg6Vd0uvZ599Vrf9EhERERERqSTdh1tERERERETEDTSkXERERERERMQNVHCLiIiIiIiIuIEKbhERERERERE3UMEtIiIiIiIi4gYquEVERERERETcQAW3iIiIiIiIiBuo4BYRERERERFxAxXcIiIiIiIiIm6ggltERERERETEDVRwi4iIiIiIiLjB/wfY7UWsXi4eHgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Encode random vector into a circuit\n", + "\n", + "%matplotlib inline\n", + "\n", + "inputs = np.random.uniform(low=0.0, high=np.pi, size=3)\n", + "\n", + "\n", + "def encode_map(input_data, dim = 3):\n", + " \n", + " q_num = len(input_data)\n", + " encode_map = PauliFeatureMap(feature_dimension=dim, reps=1, insert_barriers=True, paulis = ['Y','ZZ'])\n", + " #encode_circuit = encode_map.bind_parameters(input_data)\n", + " \n", + " return encode_map\n", + "\n", + "\n", + "feature_map = encode_map(inputs, dim=3)\n", + "\n", + "feature_map.decompose().draw(output='mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "10f3cd91", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " ┌───┐ ┌───┐ \n", + "q_0: ┤ H ├──■──┤ H ├──────────\n", + " └───┘┌─┴─┐├───┤ ┌───┐\n", + "q_1: ─────┤ X ├┤ H ├──■──┤ H ├\n", + " └───┘└───┘┌─┴─┐└───┘\n", + "q_2: ───────────────┤ X ├─────\n", + " └───┘ \n", + " ┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐\n", + "q_0: ┤ Ry(θ[0]) ├─░───■────────░─┤ Ry(θ[3]) ├─░───■────────░─┤ Ry(θ[6]) ├\n", + " ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤\n", + "q_1: ┤ Ry(θ[1]) ├─░─┤ X ├──■───░─┤ Ry(θ[4]) ├─░─┤ X ├──■───░─┤ Ry(θ[7]) ├\n", + " ├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤ ░ └───┘┌─┴─┐ ░ ├──────────┤\n", + "q_2: ┤ Ry(θ[2]) ├─░──────┤ X ├─░─┤ Ry(θ[5]) ├─░──────┤ X ├─░─┤ Ry(θ[8]) ├\n", + " └──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘\n" + ] + } + ], + "source": [ + "# Construct teacher and student networks\n", + "\n", + "from qiskit.circuit.library import RealAmplitudes\n", + "\n", + "\n", + "def teacher_circuit_builder(num_qubits):\n", + " circuit = QuantumCircuit(num_qubits)\n", + "\n", + " circuit.h(0)\n", + " circuit.cx(0, 1)\n", + " circuit.h(0)\n", + " circuit.h(1)\n", + " circuit.cx(1, 2)\n", + " circuit.h(1)\n", + " #circuit.h(2)\n", + " #circuit.cx(2, 3)\n", + " #circuit.h(2)\n", + " #circuit.h(3)\n", + " #circuit.cx(3, 4)\n", + " #circuit.h(3)\n", + " \n", + " return circuit\n", + "\n", + "\n", + "def student_network_builder(num_qubits):\n", + " circuit = TwoLocal(num_qubits=num_qubits, reps=2, entanglement_blocks='cx', entanglement='linear', rotation_blocks=['ry'], insert_barriers=True).decompose()\n", + " \n", + " return circuit\n", + "\n", + "teacher_circuit = teacher_circuit_builder(3)\n", + "print(teacher_circuit)\n", + "\n", + "student_network = student_network_builder(3)\n", + "print(student_network)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "af756cd4", + "metadata": {}, + "source": [ + "# Teacher Circuit from Amplitude Estimation " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "0fe92c04", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
     ┌──────┐┌────┐\n",
+       "q_0: ┤ P(X) ├┤0   ├\n",
+       "     └──────┘│    │\n",
+       "q_1: ────────┤1 F ├\n",
+       "             │    │\n",
+       "q_2: ────────┤2   ├\n",
+       "             └────┘
" + ], + "text/plain": [ + " ┌──────┐┌────┐\n", + "q_0: ┤ P(X) ├┤0 ├\n", + " └──────┘│ │\n", + "q_1: ────────┤1 F ├\n", + " │ │\n", + "q_2: ────────┤2 ├\n", + " └────┘" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from qiskit.opflow import NaturalGradient\n", + "\n", + "from qiskit.circuit.library import LinearAmplitudeFunction\n", + "from qiskit.algorithms import IterativeAmplitudeEstimation,AmplitudeEstimation, EstimationProblem\n", + "from qiskit_finance.applications.estimation import EuropeanCallPricing\n", + "from qiskit_finance.circuit.library import NormalDistribution, LogNormalDistribution\n", + "\n", + "#number of qubits to represent the uncertainty\n", + "num_uncertainty_qubits = 1\n", + "\n", + "# parameters for considered random distribution\n", + "S = 2.0 # initial spot price\n", + "vol = 0.4 # volatility of 40%\n", + "r = 0.05 # annual interest rate of 4%\n", + "T = 40 / 365 # 40 days to maturity\n", + "\n", + "# resulting parameters for log-normal distribution\n", + "mu = (r - 0.5 * vol**2) * T + np.log(S)\n", + "sigma = vol * np.sqrt(T)\n", + "mean = np.exp(mu + sigma**2 / 2)\n", + "variance = (np.exp(sigma**2) - 1) * np.exp(2 * mu + sigma**2)\n", + "stddev = np.sqrt(variance)\n", + "\n", + "# lowest and highest value considered for the spot price; in between, an equidistant discretization is considered.\n", + "low = np.maximum(0, mean - 3 * stddev)\n", + "high = mean + 3 * stddev\n", + "\n", + "# construct A operator for QAE for the payoff function by\n", + "# composing the uncertainty model and the objective\n", + "uncertainty_model = LogNormalDistribution(\n", + " num_uncertainty_qubits, mu=mu, sigma=sigma**2, bounds=(low, high)\n", + ")\n", + "\n", + "# set the strike price (should be within the low and the high value of the uncertainty)\n", + "strike_price = 1.896\n", + "\n", + "# set the approximation scaling for the payoff function\n", + "c_approx = 0.25\n", + "\n", + "# setup piecewise linear objective fcuntion\n", + "breakpoints = [low, strike_price]\n", + "slopes = [0, 1]\n", + "offsets = [0, 0]\n", + "f_min = 0\n", + "f_max = high - strike_price\n", + "european_call_objective = LinearAmplitudeFunction(\n", + " num_uncertainty_qubits,\n", + " slopes,\n", + " offsets,\n", + " domain=(low, high),\n", + " image=(f_min, f_max),\n", + " breakpoints=breakpoints,\n", + " rescaling_factor=c_approx,\n", + ")\n", + "\n", + "# construct A operator for QAE for the payoff function by\n", + "# composing the uncertainty model and the objective\n", + "num_qubits = european_call_objective.num_qubits\n", + "european_call = QuantumCircuit(num_qubits)\n", + "european_call.append(uncertainty_model, range(num_uncertainty_qubits))\n", + "european_call.append(european_call_objective, range(num_qubits))\n", + "\n", + "# draw the circuit\n", + "european_call.draw()\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "a0428359", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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PDIAS0tLU2Jioq699tpyj+3evVuxsbHy9/eXxWLRvffeq6SkJK1fv16XXnqpRo8ebUDFAADUH7vdof98vE1VXVzgcDj17Yq9Stl73G11AQCAmisotGvep0mq6lZfDodTny1L1YFDue4rrBpvLU5SlW9CJFkkvbl4m1vqAU6VR14CmZaWJkmKiooqsz0vL08JCQkaPny4JCk8PFxDhgwpfbx///6aOXNmjY6RkFBy3bLFYnFFyQAA1B9bsNT1hRrt2i7mbClnaz0XBAAAas23odT5/6rdzeGUmrXuLuXtckNRNdDqDimsl2SxVbqL02nXM8+/rWfuPduNhQG145FngEVGRkqSkpKSymyfOXOm9u/fX+kN8OfMmaMrrriivssDAMC9HEW12JdvYwIAwCPVZo12etB6XqO6LbwHgcfzyDPA2rdvr7i4OM2YMUMRERFq0aKFFi1apK+++kqSKgzApk6dqh07dujHH3+s0TG84StmAQA44aI7lur73/ZV+i1LFovUtFGg9qzdLh8fj/z7FgAAp71zb1milesPVrmet2keop3rdstq9YyrlT5blqor7vm+6p0sVi2eP1lXXvCWe4oCToFHvkO2Wq1auHChYmNjNW7cOI0ePVqRkZG66667ZLPZFBcXV2b/p556SkuWLNHSpUsVFBRkUNUAANSfB27pVuVXjDud0v03dyP8AgDAgz00qnu16/mDt3T3mPBLki45r5U6tGpQaU1Wq0XtWjTQPwa2dnNlQO1YnF50KtTNN9+s9evXa8OGDaXbpk6dqq+++krffPONwsPDjSsOAIB69sL/EnXvzN9ktZTcH0QqedPpcDh121XRen3KuR71hhkAAJT3zFvr9egLaypczyeM7KoXJvb1uHtVb0/N0vm3fa209BxZLCVB3Yn/b9EkSD++ebGi24YZXSZQJa8KwLp06aK+fftq3rx5kqRNmzapW7du6tChg0JCQkr3W7dunUEVAgBQv9ZuPqS5H27Rdyv3ym536szYSI2/vouG9m/hcW+WAQBAxVZtzNDcDzbrx1X75HBK/eKaaPz1XTT47GYeu55nHivQvM+2a/6nSUo/kqemEYG65fJOGn1FtBqG+htdHlAtrwnAsrOzFRYWpjlz5mjChAlGlwMAAAAAAAAv4TUBGAAAAAAAAHAquFMuAAAAAAAATI0ADAAAAAAAAKZGAAYA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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# set target precision and confidence level\n", + "epsilon = 0.01\n", + "alpha = 0.05\n", + "\n", + "qi = QuantumInstance(Aer.get_backend(\"aer_simulator\"), shots=100)\n", + "problem = EstimationProblem(\n", + " state_preparation=european_call,\n", + " objective_qubits=[1],\n", + " post_processing=european_call_objective.post_processing,\n", + ")\n", + "# construct amplitude estimation\n", + "ae = IterativeAmplitudeEstimation(epsilon, alpha=alpha, quantum_instance=qi)\n", + "\n", + "ae_circuit = ae.construct_circuit(problem)\n", + "\n", + "ae_circuit.decompose().draw(\n", + " \"mpl\", style=\"iqx\"\n", + ") # decompose 1 level: exposes the Phase estimation circuit!\n", + "\n", + "\n", + "from qiskit import transpile\n", + "basis_gates = [\"h\", \"ry\", \"cry\", \"cx\", \"ccx\", \"p\", \"cp\", \"x\", \"s\", \"sdg\", \"y\", \"t\", \"cz\"]\n", + "transpile(ae_circuit, basis_gates=basis_gates, optimization_level=2).draw(\"mpl\", style=\"iqx\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "9f1c5fae", + "metadata": {}, + "outputs": [], + "source": [ + "ae_teacher_circuit = transpile(ae_circuit, basis_gates=basis_gates, optimization_level=2)\n", + "\n", + "#ae_teacher_circuit.draw()\n", + "\n", + "teacher_circuit = ae_teacher_circuit" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "85fcabe2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ParameterView([ParameterVectorElement(x[0]), ParameterVectorElement(x[1]), ParameterVectorElement(x[2]), ParameterVectorElement(θ[0]), ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]), ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]), ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]), ParameterVectorElement(θ[7]), ParameterVectorElement(θ[8])])\n", + "ParameterView([])\n" + ] + } + ], + "source": [ + "# Glue together feature map and network\n", + "\n", + "\n", + "tc_full = feature_map.compose(teacher_circuit)\n", + "\n", + "sc_full = feature_map.compose(student_network)\n", + "\n", + "\n", + "print(sc_full.parameters)\n", + "print(teacher_circuit.parameters)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "6992a6cc", + "metadata": {}, + "outputs": [], + "source": [ + "# set up backed\n", + "\n", + "from qiskit import Aer\n", + "from qiskit.utils import QuantumInstance\n", + "\n", + "backend = Aer.get_backend('qasm_simulator')\n", + "q_instance = QuantumInstance(backend, shots = 100, seed_simulator = 2718, seed_transpiler = 2718)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "4b16efe9", + "metadata": {}, + "outputs": [], + "source": [ + "# QNN formulation\n", + "\n", + "\n", + "qnn_student = CircuitQNN(sc_full, feature_map.parameters, student_network.parameters, quantum_instance=q_instance)\n", + "qnn_teacher = CircuitQNN(tc_full, feature_map.parameters, teacher_circuit.parameters, quantum_instance=q_instance)\n", + "\n", + "\n", + "\n", + "\n", + "#input_data = [[0., 0.],[1., 1.] ]\n", + "\n", + "#weights = [0. , 0., 0., 0.,0.,0.,0.,0.]\n", + "\n", + "#print(qnn_student.forward(input_data, weights))\n", + "#print(qnn_teacher.forward(input_data, []))\n", + "#print(qnn_student.num_weights)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "c281ca4e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 0.04174081 -0.05768226 -0.09151663 0.05043395 -0.00869563 0.02233297\n", + " -0.03693855 0.09626855 0.02697694]\n", + "tensor([[0.1200, 0.0700, 0.1000, 0.1700, 0.1200, 0.1700, 0.0600, 0.1900],\n", + " [0.0000, 0.0800, 0.0000, 0.8400, 0.0000, 0.0000, 0.0600, 0.0200]],\n", + " grad_fn=<_TorchNNFunctionBackward>)\n", + "tensor([[0.0200, 0.1500, 0.1200, 0.1900, 0.0800, 0.0200, 0.1600, 0.2600],\n", + " [0.0300, 0.0000, 0.0500, 0.0000, 0.1400, 0.0000, 0.7800, 0.0000]],\n", + " grad_fn=<_TorchNNFunctionBackward>)\n", + "tensor(1.3100, grad_fn=)\n" + ] + } + ], + "source": [ + "# Defining a PyTorch model and test it\n", + "\n", + "from qiskit_machine_learning.connectors import TorchConnector\n", + "from torch import Tensor\n", + "from torch.nn import Linear, CrossEntropyLoss, MSELoss, KLDivLoss\n", + "\n", + "initial_weights = 0.1 * (2 * algorithm_globals.random.random(qnn_student.num_weights) - 1)\n", + "print(initial_weights)\n", + "#initial_weights = [0. , 0., 0., 0.]\n", + "student_model = TorchConnector(qnn_student, initial_weights=initial_weights)\n", + "teacher_model = TorchConnector(qnn_teacher, initial_weights=[])\n", + "\n", + "\n", + "# test on a dummy input\n", + "input_data = [[0., 0., 0.],[1., 1., 1.]]\n", + "\n", + "f_loss = MSELoss(reduction=\"sum\")\n", + "\n", + "ce_loss = CrossEntropyLoss() \n", + "\n", + "output = student_model(Tensor(input_data)) # Forward pass\n", + "target = teacher_model(Tensor(input_data))\n", + "\n", + "\n", + "\n", + "print(output)\n", + "\n", + "print(target)\n", + "\n", + "\n", + "print(f_loss(output, target))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "f5affdc7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Learning rate: 0.16\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/mykola/opt/anaconda3/envs/quantum_env3.8/lib/python3.8/site-packages/torch/nn/functional.py:2904: UserWarning: reduction: 'mean' divides the total loss by both the batch size and the support size.'batchmean' divides only by the batch size, and aligns with the KL div math definition.'mean' will be changed to behave the same as 'batchmean' in the next major release.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MSE Loss 3.5438 CE_Loss: 2.1370 KL_Loss: -0.1751\n", + "Training [2%]\tLoss: 4.5274\n", + "Learning rate: 0.08\n", + "MSE Loss 1.8056 CE_Loss: 2.0593 KL_Loss: -0.1926\n", + "Training [3%]\tLoss: 2.3237\n", + "Learning rate: 0.08\n", + "MSE Loss 2.7434 CE_Loss: 2.0099 KL_Loss: -0.1804\n", + "Training [5%]\tLoss: 3.1634\n", + "Learning rate: 0.08\n", + "MSE Loss 1.2190 CE_Loss: 2.0391 KL_Loss: -0.2135\n", + "Training [7%]\tLoss: 2.3392\n", + "Learning rate: 0.08\n", + "MSE Loss 2.9652 CE_Loss: 2.0566 KL_Loss: -0.1659\n", + "Training [8%]\tLoss: 2.5277\n", + "Learning rate: 0.08\n", + "MSE Loss 1.9856 CE_Loss: 1.9876 KL_Loss: -0.1710\n", + "Training [10%]\tLoss: 2.2240\n", + "Learning rate: 0.08\n", + "MSE Loss 2.1376 CE_Loss: 2.0354 KL_Loss: -0.1941\n", + "Training [12%]\tLoss: 1.9089\n", + "Learning rate: 0.08\n", + "MSE Loss 0.4216 CE_Loss: 1.9397 KL_Loss: -0.2110\n", + "Training [13%]\tLoss: 0.8994\n", + "Learning rate: 0.08\n", + "MSE Loss 0.3088 CE_Loss: 1.8707 KL_Loss: -0.2055\n", + "Training [15%]\tLoss: 0.3994\n", + "Learning rate: 0.08\n", + "MSE Loss 0.1932 CE_Loss: 1.8808 KL_Loss: -0.2044\n", + "Training [17%]\tLoss: 0.3020\n", + "Learning rate: 0.08\n", + "MSE Loss 0.4362 CE_Loss: 1.8381 KL_Loss: -0.1867\n", + "Training [18%]\tLoss: 0.4884\n", + "Learning rate: 0.04\n", + "MSE Loss 0.8366 CE_Loss: 1.9342 KL_Loss: -0.2044\n", + "Training [20%]\tLoss: 0.4644\n", + "Learning rate: 0.04\n", + "MSE Loss 0.2112 CE_Loss: 1.8780 KL_Loss: -0.2125\n", + "Training [22%]\tLoss: 0.3570\n", + "Learning rate: 0.04\n", + "MSE Loss 1.1302 CE_Loss: 1.8889 KL_Loss: -0.1934\n", + "Training [23%]\tLoss: 0.3622\n", + "Learning rate: 0.04\n", + "MSE Loss 0.1512 CE_Loss: 1.7999 KL_Loss: -0.1839\n", + "Training [25%]\tLoss: 0.2969\n", + "Learning rate: 0.04\n", + "MSE Loss 0.7252 CE_Loss: 1.9752 KL_Loss: -0.2130\n", + "Training [27%]\tLoss: 0.4034\n", + "Learning rate: 0.04\n", + "MSE Loss 0.3844 CE_Loss: 1.8941 KL_Loss: -0.2047\n", + "Training [28%]\tLoss: 0.3176\n", + "Learning rate: 0.04\n", + "MSE Loss 0.1862 CE_Loss: 1.8613 KL_Loss: -0.2103\n", + "Training [30%]\tLoss: 0.3058\n", + "Learning rate: 0.04\n", + "MSE Loss 0.3198 CE_Loss: 1.8549 KL_Loss: -0.2023\n", + "Training [32%]\tLoss: 0.4277\n", + "Learning rate: 0.04\n", + "MSE Loss 0.3938 CE_Loss: 1.9186 KL_Loss: -0.2052\n", + "Training [33%]\tLoss: 0.2865\n", + "Learning rate: 0.04\n", + "MSE Loss 0.2304 CE_Loss: 1.7961 KL_Loss: -0.1882\n", + "Training [35%]\tLoss: 0.3094\n", + "Learning rate: 0.02\n", + "MSE Loss 0.1664 CE_Loss: 1.8801 KL_Loss: -0.2093\n", + "Training [37%]\tLoss: 0.3500\n", + "Learning rate: 0.02\n", + "MSE Loss 0.1450 CE_Loss: 1.9524 KL_Loss: -0.2283\n", + "Training [38%]\tLoss: 0.2756\n", + "Learning rate: 0.02\n", + "MSE Loss 0.1986 CE_Loss: 1.8101 KL_Loss: -0.1954\n", + "Training [40%]\tLoss: 0.4129\n", + "Learning rate: 0.02\n", + "MSE Loss 0.1402 CE_Loss: 1.8049 KL_Loss: -0.1980\n", + "Training [42%]\tLoss: 0.3179\n", + "Learning rate: 0.02\n", + "MSE Loss 0.0954 CE_Loss: 1.8840 KL_Loss: -0.2059\n", + "Training [43%]\tLoss: 0.1768\n", + "Learning rate: 0.02\n", + "MSE Loss 0.4558 CE_Loss: 1.8836 KL_Loss: -0.1984\n", + "Training [45%]\tLoss: 0.4590\n", + "Learning rate: 0.02\n", + "MSE Loss 0.2882 CE_Loss: 1.8465 KL_Loss: -0.2012\n", + "Training [47%]\tLoss: 0.2369\n", + "Learning rate: 0.02\n", + "MSE Loss 0.0884 CE_Loss: 1.8439 KL_Loss: -0.2045\n", + "Training [48%]\tLoss: 0.4296\n", + "Learning rate: 0.02\n", + "MSE Loss 0.2466 CE_Loss: 1.7924 KL_Loss: -0.1982\n", + "Training [50%]\tLoss: 0.4602\n", + "Learning rate: 0.02\n", + "MSE Loss 0.5582 CE_Loss: 1.8954 KL_Loss: -0.2038\n", + "Training [52%]\tLoss: 0.3453\n", + "Learning rate: 0.01\n", + "MSE Loss 0.2606 CE_Loss: 1.8796 KL_Loss: -0.2066\n", + "Training [53%]\tLoss: 0.2168\n", + "Learning rate: 0.01\n", + "MSE Loss 0.2734 CE_Loss: 1.7771 KL_Loss: -0.1833\n", + "Training [55%]\tLoss: 0.4134\n", + "Learning rate: 0.01\n", + "MSE Loss 0.5908 CE_Loss: 1.9388 KL_Loss: -0.2078\n", + "Training [57%]\tLoss: 0.4754\n", + "Learning rate: 0.01\n", + "MSE Loss 0.0918 CE_Loss: 1.8295 KL_Loss: -0.1985\n", + "Training [58%]\tLoss: 0.2715\n", + "Learning rate: 0.01\n", + "MSE Loss 0.1828 CE_Loss: 1.8361 KL_Loss: -0.2039\n", + "Training [60%]\tLoss: 0.2540\n", + "Learning rate: 0.01\n", + "MSE Loss 0.2732 CE_Loss: 1.9062 KL_Loss: -0.2175\n", + "Training [62%]\tLoss: 0.4094\n", + "Learning rate: 0.01\n", + "MSE Loss 0.5508 CE_Loss: 1.9121 KL_Loss: -0.2014\n", + "Training [63%]\tLoss: 0.4422\n", + "Learning rate: 0.01\n", + "MSE Loss 0.3262 CE_Loss: 1.8901 KL_Loss: -0.2026\n", + "Training [65%]\tLoss: 0.2422\n", + "Learning rate: 0.01\n", + "MSE Loss 0.4142 CE_Loss: 1.9108 KL_Loss: -0.2065\n", + "Training [67%]\tLoss: 0.3371\n", + "Learning rate: 0.01\n", + "MSE Loss 0.3194 CE_Loss: 1.9211 KL_Loss: -0.2139\n", + "Training [68%]\tLoss: 0.3184\n", + "Learning rate: 0.005\n", + "MSE Loss 0.1610 CE_Loss: 1.8764 KL_Loss: -0.1989\n", + "Training [70%]\tLoss: 0.3243\n", + "Learning rate: 0.005\n", + "MSE Loss 0.2510 CE_Loss: 1.9053 KL_Loss: -0.2055\n", + "Training [72%]\tLoss: 0.4252\n", + "Learning rate: 0.005\n", + "MSE Loss 0.5968 CE_Loss: 1.8482 KL_Loss: -0.1858\n", + "Training [73%]\tLoss: 0.3320\n", + "Learning rate: 0.005\n", + "MSE Loss 0.2714 CE_Loss: 1.8660 KL_Loss: -0.1980\n", + "Training [75%]\tLoss: 0.4608\n", + "Learning rate: 0.005\n", + "MSE Loss 1.1148 CE_Loss: 1.9028 KL_Loss: -0.1899\n", + "Training [77%]\tLoss: 0.3863\n", + "Learning rate: 0.005\n", + "MSE Loss 0.4142 CE_Loss: 1.8841 KL_Loss: -0.1933\n", + "Training [78%]\tLoss: 0.5953\n", + "Learning rate: 0.005\n", + "MSE Loss 0.1622 CE_Loss: 1.7969 KL_Loss: -0.1909\n", + "Training [80%]\tLoss: 0.2238\n", + "Learning rate: 0.005\n", + "MSE Loss 0.4512 CE_Loss: 1.8507 KL_Loss: -0.1910\n", + "Training [82%]\tLoss: 0.4860\n", + "Learning rate: 0.005\n", + "MSE Loss 0.2370 CE_Loss: 1.8783 KL_Loss: -0.2103\n", + "Training [83%]\tLoss: 0.3845\n", + "Learning rate: 0.005\n", + "MSE Loss 0.3398 CE_Loss: 1.8677 KL_Loss: -0.1999\n", + "Training [85%]\tLoss: 0.4468\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.5422 CE_Loss: 1.9061 KL_Loss: -0.2082\n", + "Training [87%]\tLoss: 0.3366\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.4064 CE_Loss: 1.9274 KL_Loss: -0.2093\n", + "Training [88%]\tLoss: 0.3196\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.1770 CE_Loss: 1.7933 KL_Loss: -0.1871\n", + "Training [90%]\tLoss: 0.2749\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.2292 CE_Loss: 1.8576 KL_Loss: -0.1977\n", + "Training [92%]\tLoss: 0.3176\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.6372 CE_Loss: 1.8433 KL_Loss: -0.1866\n", + "Training [93%]\tLoss: 0.4340\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.2488 CE_Loss: 1.8261 KL_Loss: -0.1920\n", + "Training [95%]\tLoss: 0.4325\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.5084 CE_Loss: 1.9042 KL_Loss: -0.2007\n", + "Training [97%]\tLoss: 0.5108\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.4186 CE_Loss: 1.8654 KL_Loss: -0.1934\n", + "Training [98%]\tLoss: 0.3006\n", + "Learning rate: 0.0025\n", + "MSE Loss 0.1478 CE_Loss: 1.9300 KL_Loss: -0.2190\n", + "Training [100%]\tLoss: 0.2372\n" + ] + } + ], + "source": [ + "import torch.optim as optim\n", + "# Define optimizer and loss\n", + "lr = 0.16\n", + "lr_min = 0.0005\n", + "optimizer = optim.Adam(student_model.parameters(), lr=lr)\n", + "\n", + "\n", + "mse_loss = MSELoss(reduction=\"mean\")\n", + "ce_loss = CrossEntropyLoss() \n", + "kl_div_loss = KLDivLoss()\n", + "\n", + "# Start training\n", + "student_model.train() # set model to training mode\n", + "\n", + "\n", + "# Note from (https://pytorch.org/docs/stable/optim.html):\n", + "# Some optimization algorithms such as LBFGS need to\n", + "# reevaluate the function multiple times, so you have to\n", + "# pass in a closure that allows them to recompute your model.\n", + "# The closure should clear the gradients, compute the loss,\n", + "# and return it.\n", + "\n", + "epochs = 60\n", + "n_qbits = 3\n", + "loss_list = [] \n", + "\n", + "for epoch in range(epochs):\n", + " total_loss = []\n", + " \n", + " print(\"Learning rate:\", lr )\n", + " \n", + " \n", + " for batch_idx in range(5):\n", + " \n", + " input_data = np.random.uniform(low=0.0, high=2. * np.pi, size=(8,n_qbits))\n", + " \n", + " optimizer.zero_grad(set_to_none=True) # Initialize gradient\n", + " \n", + " output = student_model(Tensor(input_data)) # Forward pass\n", + " target = Tensor(qnn_teacher.forward(input_data, [])) # took a Qiskit QNN object defined above\n", + " #teacher_model(Tensor(input_data))\n", + " #print(target)\n", + " mse_l = mse_loss(2**n_qbits * output, 2**n_qbits * target)\n", + " ce_l = ce_loss(output,target) \n", + " kl_div_l = kl_div_loss(output,target) \n", + " \n", + " \n", + " \n", + " loss = (mse_l + 0.0000*ce_l + 0.*kl_div_l) # Calculate loss\n", + " \n", + " #print(loss)\n", + " loss.backward() # Backward pass\n", + " optimizer.step() # Optimize weights\n", + " total_loss.append(loss.item()) # Store loss\n", + " loss_list.append(sum(total_loss) / len(total_loss))\n", + " \n", + " if epoch % 10 == 0 and lr > lr_min :\n", + " lr = lr / 2.\n", + " \n", + " print(\"MSE Loss {:.4f} CE_Loss: {:.4f} KL_Loss: {:.4f}\".format(mse_l, ce_l, kl_div_l))\n", + " \n", + " print(\"Training [{:.0f}%]\\tLoss: {:.4f}\".format(100.0 * (epoch + 1) / epochs, loss_list[-1]))\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "b9c63873", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Parameter containing:\n", + "tensor([ 2.8131, -0.6038, -1.5985, 0.1035, -3.0277, -0.0254, -0.0591, -1.3483,\n", + " 1.5391], requires_grad=True)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "student_model.weight" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "be317b5e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXgAAAEWCAYAAABsY4yMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAxoklEQVR4nO3deXxU1f3/8dcn+wYBQmQnYRMFVDZRVBRR61qXatVqLVbr1q/VWv25tLZ16aYVq9Z9RaXuK4gLyCICCiTs+5oAgYSQQFayzXx+f8xNmIQkhCTDTC6f5+MxD2bm3rn3nMnwnjPnnnuuqCrGGGPcJyzYBTDGGBMYFvDGGONSFvDGGONSFvDGGONSFvDGGONSFvDGGONSFvCmyUTkRRH5czNe11tEikUk3Hk8W0R+49y/XkTmtqBMX4nI+Oa+3q1E5FoRmdba65q2xQLeACAiGSKyT0SKRGSviMwXkVtFpOYzoqq3quqjTdzW2X6v26qqCarqaWEZHxKRSf7Pqer5qvpmS7bbyP5OEZGZzntSICKTReQYv+VjRURF5Pk6r5srItc796931rm3zjrbRWRsA/udKCJ/a0nZVfV/qvqT1l7XtC0W8MbfT1W1HZAC/Au4D3gtuEUKDhEZDUwDPge6A32A5cA8EUn1W7UEuK7Oc3XlA/eKSLtWKltEa2zHuJ8FvDmAqhao6mTgKmC8iAyB2i1LEeksIl84rf18EfleRMJE5G2gNzDF6Za5V0RSnVbsQYNJRJ4WkW0iUigi6SIyxnn+POCPwFXOdpc5z/t394SJyIMikikiu0TkLRFJdJZVl2G8iGwVkd0i8qdGivI48JaqPq2qRaqar6oPAguBv/qttxeYWOe5utYAPwB/aEL9bwauxfeFUCwiU5znM0TkPhFZDpSISISI3C8im5xfGKtF5DK/7dTq+nLqfquIbHD+Zs+JiDRj3XARmeC8f1tE5Pam/m3N4WcBbxqkqguB7cCYehbf7SxLBrrgC19V1euArfh+DSSo6uOHuNtFwFCgE/AO8KGIxKjq18A/gPed7Z5Qz2uvd25nAn2BBODZOuucBgwEzgL+IiLH1t2IiMQBpwAf1rOPD4C63Rl/By4XkYGN1OvPwO9FpFMj66CqLwP/Ax536vlTv8W/AC4EOqhqFbAJ398mEXgYmCQi3RrZ/EXAicDxwJXAuc1Y9ybgfHx/o+HApY3VxwSXBbw5mB34wrauSqAbkKKqlar6vbbCxEaqOklV81S1SlUnANH4ArkprgWeVNXNqloMPABcXad1+bCq7lPVZcAyoL4vik74/m/srGfZTnxfav5lzgZeBB5ppF5Lgen4ur2a6xlV3aaq+5xtfqiqO1TVq6rvAxuAUY28/l+quldVtwKz8IX0oa57JfC0qm5X1T34uvJMiLKANwfTA18fcl3/BjYC00Rks4jc3xo7E5F7RGSNc1BzL77Waecmvrw7kOn3OBOIwPcLo1q23/1SfK38uvYAXnxfYHV1A3bX8/xjwLkiUt8XRrW/ALeJSJdG1mnMNv8HIvIrEVnqdKPsBYbQ+HvVlLofbN3udcpRq0wmtFjAmwaJyIn4Av6AYYxOv/TdqtoXuBj4g4icVb24mfsbA9yLr5XYUVU7AAWANHG7O/AdIK7WG6gCcg6lHKpagq/P/Of1LL4SmF3Pa/KAp4AGRxmp6lrgE6Cxvn9ouJ41z4tICvAKcDuQ5LxXK9n/XgXKTqCn3+NeAd6faQE7MGIOICLtgdOBp4FJqrqinnUuAtbi6wcuADz4Wr3gC9S+zdh1O3yBnAtEOL8K2vstzwHOEZEwVfXW8/p3gftE5CtnG9V99lXOMcJDcT/wjYisBd7A93/lbnx93ic38Jongc00HrIP4xuN09g6TXn/4vEFfi6AiPwaXws+0D4A7hSRqfhGELWky8kEmLXgjb8pIlKE72f3n/AF1q8bWHcA8C1QjK+1+7yqznKW/RN40Ok6uOcQ9v8N8DWwHl/3Shm1uwCqD3rmicjiel7/OvA2MAfY4rz+d4ew/xqqOhffgcWf4Wu15gPjgbNUdWUDrynEN/qmwQOpqrrFKWN8I7t/DRjkvH+fNbCd1cAEfO99DnAcMK/xWrWKV/ANH10OLAG+xPel3KJzHExgiF3ww5iDE5Hj8R1svEZVvwl2eUKFiJwPvKiqKQdd2Rx21oI3pglUdTm+IYHHHcljvkUkVkQucMbh98A3/v/TYJfL1M9a8MaYJnPOEfgOOAbYB0wF7nS6p0yIsYA3xhiXsi4aY4xxqZDqS+zcubOmpqYGuxjGGNNmpKen71bV5PqWhVTAp6amkpaWFuxiGGNMmyEimQ0tsy4aY4xxKQt4Y4xxKQt4Y4xxKQt4Y4xxKQt4Y4xxKQt4Y4xxKQt4Y4xxKVcE/DMzNvDd+txgF8MYY0KKKwL+pe828d06C3hjjPHnioCPj46gpLwq2MUwxpiQ4oqAT4iOoLjCAt4YY/y5IuCtBW+MMQdyRcAnWMAbY8wBXBHw8dERFJVZwBtjjD9XBHxCdDgl1gdvjDG1uCLgfX3wnmAXwxhjQoorAj4hOoJi64M3xphaXBPwFVVeKj3eYBfFGGNChisCPj7ad+VBG0ljjDH7uSLgE5yAt5E0xhiznysCvqYFbyNpjDGmhksCPhywLhpjjPHnioBvF+NrwRfbUEljjKnhioC3g6zGGHMgdwR8lNOCt4OsxhhTwxUBXz2Kxk52MsaY/VwR8NZFY4wxB3JFwEdFhBEVEWYX/TDGGD+uCHiwOeGNMaaugAe8iISLyBIR+SKQ+4mPDreDrMYY4+dwtODvBNYEeifxURE2Dt4YY/wENOBFpCdwIfBqIPcD1kVjjDF1BboF/xRwL9DgPL4icrOIpIlIWm5ubrN3FB8dYXPRGGOMn4AFvIhcBOxS1fTG1lPVl1V1pKqOTE5Obvb+EmLsoh/GGOMvkC34U4GLRSQDeA8YJyKTArWzhCjrojHGGH8BC3hVfUBVe6pqKnA1MFNVfxmo/cVHR9goGmOM8eOicfDhlFR48Ho12EUxxpiQcFgCXlVnq+pFgdxH9XQFpZU2VNIYY8BNLfgYm4/GGGP8uSfgbUZJY4ypxTUBb3PCG2NMbe4JeJsy2BhjanFNwFsXjTHG1OaegK8+yGrTFRhjDOCigI+PDgewGSWNMcbhmoBPsD54Y4ypxTUBHxsZTpjYKBpjjKnmmoAXEeeiHxbwxhgDLgp48B1otS4aY4zxcVXA20U/jDFmP9cFvI2iMcYYH1cFfEJ0OMVllcEuhjHGhARXBXx8VAQl1oI3xhjAZQFv12U1xpj93BXwdpDVGGNquCrg46NtmKQxxlRzVcAnREdQ6VHKq6wf3hhjXBXw8VHOhGM2XYExxrgr4BNiIgFsJI0xxuC2gK+ZMtha8MYY46qAr7lsn42kMcYYdwa8teCNMcZlAV9zXVY7yGqMMe4MeBsLb4wxLgt466Ixxpj93BXwzjh4GyZpjDEuC/iI8DBiIsNsFI0xxuCygAdfP3yRHWQ1xhh3BrwdZDXGGBcGfGMzSq7NLmTO+tzDXCJjjAkOVwZ8Q6Nonpy2nrs/XHaYS2SMMcHhuoBv7KIfmXml5BaVWxeOMeaI4LqA93XRHDhMUlXZml8K+ILeGGPcznUBnxAdXu8omtzicvZV+oJ/a37J4S6WMcYcdgELeBGJEZGFIrJMRFaJyMOB2pe/hkbRbMvf32q3Frwx5kgQEcBtlwPjVLVYRCKBuSLylar+GMB9Eh8dwb5KDx6vEh4mNc/7h3qGBbwx5ggQsBa8+hQ7DyOdmwZqf9USGpgTPjOvFBEY1K29ddEYY44IAe2DF5FwEVkK7AKmq+qCQO4P/C76UaebZlt+Kd3ax9D/qATrojHGHBECGvCq6lHVoUBPYJSIDKm7jojcLCJpIpKWm9vyk5DiG5gTPjO/lN5JcaQmxbFj7z4qqrwt3pcxxoSywzKKRlX3ArOA8+pZ9rKqjlTVkcnJyS3eV7sGpgzOzCuld6c4eifF41XYvsda8cYYdwvkKJpkEeng3I8FzgHWBmp/1fZ30ewfC19aUcXu4nJSkuJJSYoDfC16Y4xxs0COoukGvCki4fi+SD5Q1S8CuD8A4qN9c8L7t+CrT3Dq3SmOlE6+gN9q/fDGGJcLWMCr6nJgWKC235D6LttXfVC1d6c4kttFExsZbgdajTGu57ozWePrGSZZfZJTSlIcIkJKUhyZeTZU0hjjbq4L+OoWvP90BZl5pbSLiSAxNhLwteStD94Y43auC/joiDAiwqRWF83W/NKa1jtAaud4tuaX4vUG/LwrY4wJGtcFvIgccNGPrfmlpHSKr3ncu1McFVVecorKglFEY4w5LFwX8ODrpil2hkl6vMr2PaX0ckbPADVDJTN2WzeNMca9XBnw8dHhNS34nQX7qPRoTagDNa15m5PGGONmrgz4BL/L9lWPd0/xa8F37xBDRJjYUEljjKu5MuD9r8taPVrGv4smIjyMnh1jbSSNMcbVXBnw/hf92JpfSkSY0L1DbK11eifF21h4Y4yruTLg/UfRbM0rpWfH2FoX/wBfl01mXimqNlTSGONOrgz4Wn3w+aX0Too/YJ2UpDiKyqrYW1p5uItnjDGHhWsDvqTCg6qSmVdS6wBrtRQn9K0f3hjjVq4M+PjoCDxeJaewnMKyKnrXG/DOtMHWD2+McSlXBnyCM2Xw6p0FAPROOjDgq0PfhkoaY9zKlQFfPaPkmp1FAPW24GMiw+naPsYC3hjjWq4O+NU7CoH6Ax58Lfv6zmbNLijjH1+uoazSU8+rjDGmbWhSwItIvIiEOfePFpGLRSQysEVrvurrsq7eWUjnhOiawK8rpVMcGfW04B/8bCUvz9nMlGU7AlpOY4wJpKa24OcAMSLSA5gGXAdMDFShWqo60DPySujdKbbB9VI7x5NbVE6p38VBZqzJ4ds1OYSHCR+lbw94WY0xJlCaGvCiqqXAz4DnVfXnwODAFatlqgNedf9wyPpUd91UX7O1rNLDQ1NW0S85ntvP7M+CLfk1V4Myxpi2pskBLyKjgWuBqc5z4YEpUssl+HXJ9Gqg/x38h0r6QvzF7zaxLX8fj14yhCtP7IUIfLzYWvHGmLapqQH/e+AB4FNVXSUifYFZAStVC8VH7//uqe8kp/3LnJOd8krYmlfK87M38dMTunNK/8706BDLqf068/Hi7XblJ2NMm9SkgFfV71T1YlV9zDnYultV7whw2ZotPmp/Cz6lnjHw1RLjIukQF0lmXikPT1lFZJjwpwuOrVl++YgebMvfx6KM/ICW1xhjAqGpo2jeEZH2IhIPrARWi8j/C2zRmi8sTIiP8rXiGxoiWS2lUxxfrtjJjLW7+P3ZR9M1MaZm2bmDu5IQHWEHW40xbVJTu2gGqWohcCnwFdAH30iakBUfHUFsZDjJ7aIbXa93Ujx7Sis5uksC15+aWmtZXFQEFx7XjS9X7Kw10sYYY9qCpgZ8pDPu/VJgsqpWAiHdMZ0QHUHvTnGISKPr9e3s64d/5JIhRIYf+HZcPqInJRUevl6ZHZByGmNMoNR/BtCBXgIygGXAHBFJAQoDVajW0KdzPJ0TGm+9A1x/Sionpnbi5L5J9S4/MbUjvTvF8VH6dn42vGdrF9MYYwJGmnvBCxGJUNVW7bcYOXKkpqWltcq2qjxewHd5vpZ6ZsYGnpy+nrn3nUnPjo336RtjzOEkIumqOrK+ZU09yJooIk+KSJpzmwA0fAZRCIgID2uVcAe4bFgPAD5dnNUq2zPGmMOhqQn4OlAEXOncCoE3AlWoUNOrUxyj+ybx0eLtdok/Y0yb0dSA76eqf1XVzc7tYaBvIAsWaq4Y0ZPMvFLSMvcEuyjGGNMkTQ34fSJyWvUDETkV2BeYIoWm84Z0JS4qnE+sm8YY00Y0NeBvBZ4TkQwRyQCeBW4JWKlCUHx0BOcO7srU5Tsor7J54o0xoa+pUxUsU9UTgOOB41V1GDAuoCULQZcO60FhWRWz1uYGuyjGGHNQhzTMRFULnTNaAf4QgPKEtFP7JdE5IZrPllg3jTEm9LVkHGHjp4i6UER4GJcM7c7MtbsoKK0MdnGMMaZRLQn4I3K84GXDelDh8TJ1xc5gF8UYYxrVaMCLSJGIFNZzKwK6H6YyhpTB3dvT/6gE66YxxoS8RgNeVdupavt6bu1UtdF5bESkl4jMEpHVIrJKRO5s3aIHh4hw2bAeLMywy/kZY0Jb65zLX78q4G5VHQScDPyfiAwK4P4Om0uG+n68fL7UWvHGmNAVsIBX1Z2quti5XwSsAXoEan+HU8+OcYzq04lPl2TZ1AXGmJAVyBZ8DRFJBYYBC+pZdnP1JGa5uW1nfPllw3qwKbeElVkhPWuyMeYIFvCAF5EE4GPg935j6Guo6suqOlJVRyYnJwe6OK3mguO6ERUexqd2sNUYE6ICGvDOVaA+Bv6nqp8Ecl+HW2JsJGcdexSTl+2omXveGGNCScACXnzXynsNWKOqTwZqP8F06bAe7C4uZ+7G3cEuijHGHCCQLfhT8V2Ye5yILHVuFwRwf4fd2IHJRIWH8ePm/GAXxRhjDtDUa7IeMlWdi8unM4iOCKdLYjQ7C46omZONMW3EYRlF42bdEmPZubcs2MUwxpgDWMC3UPfEGHZYC94YE4Is4Fuoa2IsOYVleL12wpMxJrRYwLdQ9w4xVHqU3SXlwS6KMcbUYgHfQt0SYwGsH94YE3Is4FuoW2IMgI2kMcaEHAv4FurewdeC32EteGNMiLGAb6GOcZFER4SRXWgBb4wJLRbwLSQidEuMYcde66IxxoQWC/hW0C0xlp0F1oI3xoQWC/hW0K1DDDutBW+MCTEW8K2ge2IsOUXleOxkJ2NMCLGAbwVdE2PweJXcIjvZyRgTOizgW0H3Dr6x8DYnjTEmlFjAtwI7m9UYE4os4FtB9+qAtxa8MSaEWMC3gvaxEcRGhtvZrMaYkGIB3wpEhG4dYsgutBa8MSZ0WMC3ku6JsdaCN8aEFAv4VtItMcb64I0xIcUCvpV06xDLrqJyKj3eYBfFGGMAC/hW0y0xBlXYZSc7GWNChAV8K6m58IfNSWOMCREW8K2k5sIfNqukMSZEWMC3EmvBG2NCjQV8K2kXE0m76AibF94YEzIs4FtRVxsqaYwJIRbwrahbB7uykzEmdFjAt6LuiTF2NqsxJmRYwLeibomx7C4up7zKE+yiGGOMBXxr6uZc+GNXoZ3sZIwJPgv4VlQ9VHKHDZU0xoQAC/hWVHNlJzvQaowJARbwrciuzWqMCSUW8K0oLiqCxNhIuzarMSYkWMC3Mt+88BbwxpjgC1jAi8jrIrJLRFYGah+hyC78YYwJFYFswU8Ezgvg9kOSnc1qjAkVAQt4VZ0D5Adq+6Gqe2IM+SUVlFXayU7GmOCyPvhWVj1UMtta8caYIAt6wIvIzSKSJiJpubm5wS5Oi9Wc7GT98MaYIAt6wKvqy6o6UlVHJicnB7s4LdbNubKTDZU0xgRb0APebWqu7GQteGNMkAVymOS7wA/AQBHZLiI3BmpfoSQmMpxO8VF2bVZjTNBFBGrDqvqLQG071KUmxbE+uyjYxTDGHOGsiyYARqR0ZHlWgc0Lb4wJKgv4ABiR0pGKKi+rdhQGuyjGmCOYBXwADO/dEYDFmXuCXBJjzJHMAj4AjmofQ69OsaRbwBtjgsgCPkBGpnQiLXMPqhrsohhjjlAW8AEyPKUjuUXlbN9j4+GNMcFhAR8gI5x+eOumMcYEiwV8gAzs2o74qHALeGNM0FjAB0h4mDCsd0cLeGNM0FjAB9DwlI6szS6kuLwq2EUxxhyBLOADaERKR7wKy7btDXZRjDFHIAv4ABrWuwMidqDVGBMcFvAB1D4mkoFd2pFmAW9MLa9+v5mHp6wKdjFczwI+wIandGRJ5h68XjvhyRiA7XtKefzrdbw5P4M9JRXBLo6rWcAH2IjeHSkqr2LDruJgF8WYkPDktPVUeb14FWau3RXs4riaBXyAjUixE56MqbZ6RyGfLs3ipjF96dI+mm/X5AS7SK5mAR9gKUlxJMVHWcAbA/zr67W0j4nkt2P7c9axXfhufS5lle67bsL8TbsZ98Rsnpy+PqjlsIAPMBFhREpHFm9tWsB/vTKb4x/6hstfmM8jU1bz+dIsMvNKbNIyF1iZVcDa7CP3GgHzNu5mzvpcbj+zP4lxkZxzbBdKKzz8uDmvwdeszCrgihfms7SNDDUuq/Tw6BerueaVBWzbU8oLszeyLb80aOWxgD8MRqR0ZMvuEvKKyxtdr7Cskj9/vpKO8VGECbyzMJM731vKGf+ezYl//5aZa+3n7KF4b+FWvl19aO9ZpcdLWkY+/5m+nj9+uoLdB/mbNcWW3SXcNimdi/47l2teWUBhWWWLtxmKyqs8PPjZCv63IPOAQQVer/LPr9bQo0Ms141OAWB0vyTiosKZ3sjf6JkZG0jL3MMvXv6RWQfpry+r9AS1IbRiewEX/Xcur83dwq9GpzDtrjMIDxMmTFsXtDIF7JqsZr/qfvjFW/dyzqAuDa73n+nr2V1czqe/PZWhvTpQ6fGyPqeIZdsKmPRjJje/lc5TVw/louO7H66iN2jH3n10bR9DWJgEuyj1yisu58+fryQhOoLv7xtHQnTDH/WS8io+XrydOet38+PmPIrLqxCBiDAhLSOfd286maSE6EMuw+7icp6ZsYF3FmwlKiKM8aNTePOHTJ6ftYn7zz+m2XUrrajih015zFq3i0Vb9vDABccwduBRzd5eU+yr8BAbFd7gcq9XuefD5UxZtgOAyUt38Njlx5PaOR6AKct3sDKrkCevPIGYSN92YiLDOX1AMt+uyeFvlw5BpPZnaVt+KdPX5PCLUb1YkVXAb95K45+XHceVJ/aqtV7Bvkqen72RN+ZlcNFx3Xj8iuOJCA9M27W4vIpJP2ZSWl5FWJgQLkJ4uLC7qIK3fsigc0I0b90witOPTgbghlP78PzsTfxmTF+G9EgMSJkaYwF/GAzpkUhkuJCWmd9gwK/aUcCb8zO4ZlRvhvbqAEBkeBiDuycyuHsiF53QjRsnLuKOd5dQWu454EN+qLxepbzK2+h/2oZ8nL6duz9cxjUn9eYflx3XonI0Jq+4nA/Tt/OLE3uTGBd5SK/9KH07lR5lT2klE+dt4fZxAxpc9+4PlvH1qmx6dozlpyd0Z8yAzpzSL4lVOwq5YeIirn11Ae/cdDKd4qOavP+3fsjgsa/WUlbl5ZpRvbnjrAEkt4umqKyK1+dt4Zcn96Znx7gmb6/S4+W9hVuZvmYXP27Oo6LKS1xUODGR4fzl81VM/0MS0RGH/rc8GFXliWnreGH2Ju46+2huH9f/gCAGeOybtUxZtoN7zxtI5/hoHp26mvOensM9PxnIL09O4Ylp6zi2W3suHdqj1uvOHtSFr1dlszKrkON61g7AN+dnECbCHWcNoF1MJLdNSufej5eTU1jG7eP6U+HxMunHrfx35gYK9lUyKrUTnyzJorzKy1NXDyWylUO+tKKKGyYuYuGW/HqXXzK0O49cPKTWZ/WWM/rxzsKtPP7NOt66YVSrlqcpLOAPg5jIcIb0SGTaqhxuGtOXznVag16v8ufPVtIxLop7z62/Zdc+JpK3bjiJW5wPeXF5FTec1qdZ5Skur+KmN9NYmVXAv39+POcN6dbk105blc29Hy8nuV007yzYyuDu7bn2pJRmlaMx5VUebnk7nbTMPXyQto3Xxp9IH6c1eDBer/Luwq2MSu1Eu5gIXp6zmetGp5IYe+CXxPcbcvl6VTZ/OOdoflcnvE7t35lXx4/kxjfT+OWrC3jnppPoEHfwkF+xvYC/Tl7Faf0789DFg+mXnFCz7J5zBzJ1xU7+/c06nr56WJPqA/DEtHW89N1m+ibHc93JKZw58ChO7NORhVvyue61hUycl8EtZ/Rr8vaaoqLKy/2fLOeTxVkMOCqBCdPXszaniCeuOKFWw+DN+Rm89N1mrjs5hdvO6IeIcPrRyfzp0xX8beoaXvl+MzmF5bx5w3EH/OI7c2AyYQLT1+TUCviS8ireT9vG+UO60i0xFoDXxp/I/R8vZ8L09azJLmRFVgHb8vcxZkBn7j//GAZ3T+TV7zfzt6lrqPB4efaaYa32pVdW6eGmt9JIy8jn6auHcsnQHni9SpVX8TrdQtW/TPwlxkZy+5n9+dvUNczbuJtT+3dulfI0lfXBHyZ3njWAnQX7uOz5eWzcVVRr2Yfp21i8dS8PXHBsoy3V2KhwXvnVCM4f0pVHvljNMzM2UFhWSXZBGZtzi1mZVcDCLfkUlDbcx7unpIJrX/mRhRn5dE2M4dZJi3l4yioqqrwHrcP8jbu5/Z0lHNcjkRl3n8HYgck8NHkVaRn1t2iaS1V58NOVpGXu4fYz+7OnpIJLn5vH/E27m/T6HzbnkZFXyjUn9eauc46msKyK1+duOWC9So+Xh6esJiUpjlvO6Ftvy3TMgGRe+dVINuYWc+2rCxp9b6vL/vCUVSTFR/HctcNrhTtA9w6x/GZMHz5fuqPJcxTNWZ/LS99t5pqTejPz7rH8+aJBnDagM9ER4YwZkMy4Y47i2ZkbW+V4QbXi8ipufHMRnyzO4u5zjmbaXadz//nH8OWKnVzx4nyy9vouZPPNqmwemrKKcwZ14aGLB9e8h10TY3h1/Eieumoo5VVexg5M5vQBB4ZbUkI0I1I6HtAP/8ni7RSVVfHrU/c3YqIiwphw5QncekY/vlyRTXxUBG/dMIq3bzyJwd19Xw6/GdOXRy4ZzPTVOdzydnqrjNApq/Rw89vpzN+Ux7+vOIFLnF8hYWFCVEQYMZHh9YZ7tV+enEKPDrH866u1h/+ER1UNmduIESPUzZZu3aMjHp2uQ/76tc7bkKuqqnnF5XrCw9/oz1+Yr16vt0nbqazy6F3vL9GU+76o93b8Q9/o63M3a0WVp9brsgv26dkTZuuAP32p01dla3mlR//6+UpNue8LvfjZubotv6TBfS7ZukcH/fkrPefJ2bqnpFxVVfeWVOgZj8/UEY9O15179zWp7OuyC/Wxr9bov75aowX7Kupd55U5mzTlvi90wrR1qqqasbtYz5owW/s9MFXfWZB50H38dlK6Dn34G91XUaWqqre8laZD/vJ1Tbnr7ufb1dkH3eastTk64I9f6kXPfN9guVVVP1+apSn3faHvLWy4nEVllTri0WlN+pvvKizTEY9O13OenF1Tn7o25BRpvwem6h8/Wd7gdqo8Xi0uq2x0X9VyCvbpBU/P0b4PTNX3F22ttWzGmmwd/JevdcSj0/TN+Vv06D99qZc8O1dLy+svm6rqvooqLatsePlL323UlPu+qPn8eTxePfOJWXrxf79v8P3ZtKtIqzwNv3fvLMjU1Pu/0Gte+aHJ9a5PeaVHb3hj4UH/pgfzcfo2TbnvC528NKvZ22gIkKYNZKpoCA2/GzlypKalpQW7GAG1fU8pN0xcxObcEv5x2XEs3rqHD9O38+UdYxjYtV2Tt+P1Kp8syWJvaQVxURHER4cTFxVBmMDr87Ywb2Me/Y9K4M8XDeKMo5PZmlfKta/9SH5xBa+MH8kp/fa3pr5asZN7P1pOWJjw6KVDGJnSkeR20TV9mBtyivj5Sz/QLiaCj249hS7tY2peuz6niMuem0f/Lu14/+aT623JZBeUMXlZFp8u2cGanYWEhwmqylHtYvjHz4Yw7pj9xyVmrdvFjRMXce7grjx3zfCan/SFZZXc/s4S5qzP5cbT+vDHC44lvJ4DvLlF5Yz+5wyuPyWVBy8aBMC67CLOe3oOt53Rj3vP83WB7SoqY9wT3zEytSNvXH9iva33umat3cXNb6cxMqUTE2848YCf//sqPIybMJtO8VFMvv20estXbdKPmTz42Upeum4E5w7uWu86Xq8y/o2FLNySz5TfncbRXRr+fDw0eRVv/ZDBl3eO4Ziu7WstW59TxG/eTGNrfik9OsQyoEsCA45KYMBR7UhuF01xeRUl5VUUO7eP0reTX1LBc9cO58x6Dt5u3OXbXkZeKalJcXx82ynNOghdbXNuMeMmfMfDFw9m/CmpzF63i+vfWMRTVw3l0mE9Dr6BBnyUvp17P1oGQK9OcfTpHE/fzgn0SY5neO8ONa3+hpRVerjzvSV8s8p3EPiXJze/K9LjVS585nv2VXqYftcZREW0XueJiKSr6sh6l1nAH36FZZX83/8W8/0GX5fDzaf35Y8XHNtq21dVpq/O4e9friEzr5QzByazakchFR4vE389quYgrr+M3SX89n+LWb3TN05bBJLio+maGM2OvWWEhwkf3TqalKQD+8G/XpnNrZPSuXJkT/5x2XFszC1m+fYCVmYVsGx7Acu370UVhvbqwGXDenDh8d3I2rOPez9azrqcIi4b1oO/XDSIvJIKLntuHj07xfHxbaOJi6p9iKjK4+XvX67hjXkZ3HBqH/7y00EHlOX52Rt5/Ot1fPuHM+h/1P7ukd+9u4QZa3L4/t4zSUqI5u4PljF5WRbf/P50+tbpRmnMZ0uy+P37S7n4hO48ddXQWn3K/5m+nqdnbOCDW0Yzqk+nRrdT5fFy3tPf4/Eq3/z+9Hr/w7/03Sb++dVa/n7ZkIMe59hbWsEZ/57N8T0TeeuGUTVfWLPW7eJ37ywhNiqca0b1JiOvhA05xWzKLaa8gW65nh1jef7a4Rzfs0Oj+3tt7hZ+PqIXvZOafrC4IeMmzKZHh1jevvEkxr++kNU7C5l337gWB+HCLfnM3ZDL5t0lbHFupRW+bpvB3dtz9ajeXDK0O+1jfF2jqsry7QV8mL6NyUt3UFhWxV9/OqhWV1FzzVq3i1+/sYj7zjuGWxvoEmwOC/gQVOnx8siU1SzZtof3bh7d6DC+5iqv8jBxXgb/nbmRuKhw3r7xpEZ/JZRXefhhUx47C8rILigjp9B3q/QoD1507AEtQ39PTlvHMzM3EhURVtOfnxAdweDu7RndL4lLhvY44CBpRZWX52Zt5LlZG+kQF0lMZDhllR4+v/00enSIbXBfD01excT5GUz4+QlcPqJnzfNerzL2idl0S4zh/VtG13rNptxiznnyO248rQ/nDenG5S/M59Yz+jVruGL1l4j/67P27uOsCbM5+9guPHvN8CZtZ+baHG6YmMaDFx7Ljaf1qfUffum2vVzxwnzOGdSF568d3qQweH3uFh75YjWvXz+SMwcexevzMvj71NUc07U9r44fSXe/99TjVbbll5JfWkG76AjioyNIiIkgPiqi0V8egfLPL9fw+rwtfHjrKVz63DzuOvto7jy74ZFPzaWqZBeW8e3qHN5duI3VOwuJiQzjwuO60zc5ns+WZLFhVzHREWGcN6QrV53Yq9av3Zbu+/o3FvHd+lxO69+ZP15wLIO6N/x/qqks4I9w1QcGD3Wo4aHwepV/T1tHeaWX43smclzPRPokxTdpnPzqHYXc+/Ey1mcX885NJzEytfHWb6XHy3WvLWDx1r18dOvompbmnPW5/Or1hTWjHOr6wwdLmbp8J6lJ8ezdV8HMu8cS34wvVlXlz5+vZNKPW3nkksH8anQqv3t3CdNWZTPznrGNfjnV3c4vX1vAvI15JERH0C85nr7JCfRLjueDtO14vMqXd4xp8t+t0uPl3KfmgMJJfTvx7sJtnDu4C/+5augBv4ZCTVpGPle8+AO9O8WRXVDGvPvHkdyu+d0+TaGqrMgq4L1FvtZ6cXkVI1I6csWInlx4fLeaVn1rqqjyMunHTJ52Bkj8fERP7v7JwFrdnofKAt6EPI9XKdhX2eSx5nnF5Vz87Dy8qky+/TSS20Vz69vpLMzI54cHxtU7PC4zr4RxE77D49UGvwQOpby3Tkrn2zU53HZGP56fvYk7zxrAXeccfUjbKSit5LOlWWzOLWZTbgmbc4vZUVBGRJjw/i0nMyKl8S+7umasyeHGN33/h/7vzH7cfc7AkD0ZzZ/Hq5z492/JL6ng8uE9mXDlCYd1/6UVVRTsq6wZkhloBaWV/HfmBt78IYOIsDBuOaMvt43t16xhnRbwxpVWZhVwxYvzOa5HIk9dPYzTH59VcwC2IU99u54tu0t46qqhLe4D3Vfh4Rev/MjSbXvplhjDzLvHNuvEsbpKK3wHO49qd+itOlXlmRkb6XdUfEic8Xwo7vlwGR+lb+eL350WlLM+gyEzr4THvl7L5twSpt4xplndYxbwxrU+X5rFne8tpUeHWLL27mPWPWObfEJUa8grLufej5Zz3eiUgE8X4Hbb8ktZlJHPz4b3PPjKLlNSXtWs7kJoPOBDu2POmIO4ZGgPVu8o5KU5mzmlX9JhDXfwnajz2vUnHtZ9ulWvTnH06tTyETltUXPD/WAs4E2bd+95xxAXFcFPBjc8kZsxRyILeNPmhYdJQIbUGdPW2Vw0xhjjUhbwxhjjUhbwxhjjUgENeBE5T0TWichGEbk/kPsyxhhTW8ACXkTCgeeA84FBwC9E5MDZoYwxxgREIFvwo4CNqrpZVSuA94BLArg/Y4wxfgIZ8D2AbX6PtzvP1SIiN4tImoik5ebmBrA4xhhzZAn6QVZVfVlVR6rqyOTk5GAXxxhjXCOQJzplAb38Hvd0nmtQenr6bhHJbOb+OgNNu2hn6HNTXcDqE8rcVBdwV32aWpcGrwYTsMnGRCQCWA+chS/YFwHXqOqqAO0vraEJd9oaN9UFrD6hzE11AXfVpzXqErAWvKpWicjtwDdAOPB6oMLdGGPMgQI6F42qfgl8Gch9GGOMqV/QD7K2opeDXYBW5Ka6gNUnlLmpLuCu+rS4LiF1wQ9jjDGtx00teGOMMX4s4I0xxqXafMC39QnNROR1EdklIiv9nuskItNFZIPzb8dglrGpRKSXiMwSkdUiskpE7nSeb6v1iRGRhSKyzKnPw87zfURkgfOZe19EooJd1qYSkXARWSIiXziP23JdMkRkhYgsFZE057k2+VkDEJEOIvKRiKwVkTUiMrql9WnTAe+SCc0mAufVee5+YIaqDgBmOI/bgirgblUdBJwM/J/z92ir9SkHxqnqCcBQ4DwRORl4DPiPqvYH9gA3Bq+Ih+xOYI3f47ZcF4AzVXWo33jxtvpZA3ga+FpVjwFOwPd3all9VLXN3oDRwDd+jx8AHgh2uZpRj1Rgpd/jdUA35343YF2wy9jMen0OnOOG+gBxwGLgJHxnF0Y4z9f6DIbyDd/Z5DOAccAXgLTVujjlzQA613muTX7WgERgC87Al9aqT5tuwdPECc3aoC6qutO5nw20uatJi0gqMAxYQBuuj9OlsRTYBUwHNgF7VbXKWaUtfeaeAu4FvM7jJNpuXQAUmCYi6SJys/NcW/2s9QFygTecLrRXRSSeFtanrQe866nvq7tNjWUVkQTgY+D3qlrov6yt1UdVPao6FF/rdxRwTHBL1DwichGwS1XTg12WVnSaqg7H10X7fyJyuv/CNvZZiwCGAy+o6jCghDrdMc2pT1sP+EOe0KyNyBGRbgDOv7uCXJ4mE5FIfOH+P1X9xHm6zdanmqruBWbh68bo4My1BG3nM3cqcLGIZOC7NsM4fH2+bbEuAKhqlvPvLuBTfF/AbfWzth3YrqoLnMcf4Qv8FtWnrQf8ImCAMxIgCrgamBzkMrWGycB45/54fH3ZIU9EBHgNWKOqT/otaqv1SRaRDs79WHzHE9bgC/ornNXaRH1U9QFV7amqqfj+n8xU1Wtpg3UBEJF4EWlXfR/4CbCSNvpZU9VsYJuIDHSeOgtYTUvrE+yDC61wcOICfLNWbgL+FOzyNKP87wI7gUp83+I34usbnQFsAL4FOgW7nE2sy2n4fkIuB5Y6twvacH2OB5Y49VkJ/MV5vi+wENgIfAhEB7ush1ivscAXbbkuTrmXObdV1f/32+pnzSn7UCDN+bx9BnRsaX1sqgJjjHGptt5FY4wxpgEW8MYY41IW8MYY41IW8MYY41IW8MYY41IW8OawE5EkZwbApSKSLSJZfo8bnc1QREaKyDNN2Mf8VirrWL+ZF8eKyCmtsV1ne6kico3f4ybVzZimCug1WY2pj6rm4Rvzi4g8BBSr6hPVy0UkQvfPj1L3tWn4xgofbB+tFsR+xgLFQJO/PBqrC75J5q4B3oGm182YprIWvAkJIjJRRF4UkQXA4yIySkR+cCZeml99hl+dFvVD4ptPf7aIbBaRO/y2V+y3/my/ebb/55xxi4hc4DyXLiLPVG+3gfKlArcCdzm/NMY4Z7p+LCKLnNupfuV6W0TmAW87LfXvRWSxc6v+8vkXMMbZ3l116tZJRD4TkeUi8qOIHN9YnZ0zO6eKb+76lSJyVSv+eUwbZS14E0p6AqeoqkdE2gNjVLVKRM4G/gFcXs9rjgHOBNoB60TkBVWtrLPOMGAwsAOYB5wqvgtEvAScrqpbROTdxgqmqhki8iJ+vzZE5B18c6nPFZHewDfAsc5LBuGbDGufiMQB56hqmYgMwHf28kh8k0ndo6oXOdsb67fLh4ElqnqpiIwD3sL51VNfnfFdU2CHql7obCuxsfqYI4MFvAklH6qqx7mfCLzpBKICkQ28ZqqqlgPlIrIL33Sq2+uss1BVtwOIb+rfVHxdLZtVdYuzzrvAzRyas4FBzg8CgPbim0kTYLKq7nPuRwLPishQwAMc3YRtn4bzhaaqM53jFu2dZfXVeQUwQUQewzcNwfeHWBfjQhbwJpSU+N1/FJilqpc53SOzG3hNud99D/V/ppuyTnOEASerapn/k07g+9flLiAH31V6woBa6zfDAfVR1fUiMhzf3D9/E5EZqvpIC/dj2jjrgzehKpH9U9deH4DtrwP6Ol8eAE3psy7C1y1SbRrwu+oHTgu9PonATlX1AtcB4Q1sz9/3wLXOdscCu7XO3Pr+RKQ7UKqqk4B/45tq1hzhLOBNqHoc+KeILCEAvzSd7pPfAl+LSDq+sC04yMumAJdVH2QF7gBGOgdCV+M7CFuf54HxIrIMX/95det+OeBxDozeVec1DwEjRGQ5voOx42ncccBCpwvqr8DfDrK+OQLYbJLmiCUiCapa7IyqeQ7YoKr/CXa5jGkt1oI3R7KbnBbvKnzdKC8FtzjGtC5rwRtjjEtZC94YY1zKAt4YY1zKAt4YY1zKAt4YY1zKAt4YY1zq/wNNph8c/3h8BwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(loss_list)\n", + "plt.title(\"Distillation QNN training\")\n", + "plt.xlabel(\"Training Iterations\")\n", + "plt.ylabel(\"Loss\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "201540f7", + "metadata": {}, + "source": [ + "# Test histogram" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24f7ee43", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "a58aa3e7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
        ┌────────────┐                                      »\n",
+       "   q_0: ┤ Ry(2.6831) ├────■──────■──────────────────────────»\n",
+       "        └┬──────────┬┘┌───┴───┐  │  ┌───┐┌─────┐┌───┐┌─────┐»\n",
+       "   q_1: ─┤ Ry(3π/8) ├─┤ Ry(0) ├──┼──┤ X ├┤ Sdg ├┤ H ├┤ Sdg ├»\n",
+       "         └──────────┘ └───────┘┌─┴─┐└─┬─┘└─────┘└───┘└─────┘»\n",
+       "   q_2: ───────────────────────┤ X ├──■─────────────────────»\n",
+       "                               └───┘                        »\n",
+       "meas: 3/════════════════════════════════════════════════════»\n",
+       "                                                            »\n",
+       "«                                                                        »\n",
+       "«   q_0: ────────────────────────────────────────────────────────────────»\n",
+       "«        ┌─────────────────────┐┌─────┐┌───┐┌─────┐┌───────┐┌───┐┌──────┐»\n",
+       "«   q_1: ┤ P(3.43584501835934) ├┤ Sdg ├┤ H ├┤ Sdg ├┤ P(3π) ├┤ X ├┤ P(0) ├»\n",
+       "«        └─────────────────────┘└─────┘└───┘└─────┘└───────┘└─┬─┘└──────┘»\n",
+       "«   q_2: ─────────────────────────────────────────────────────■──────────»\n",
+       "«                                                                        »\n",
+       "«meas: 3/════════════════════════════════════════════════════════════════»\n",
+       "«                                                                        »\n",
+       "«                                                                              »\n",
+       "«   q_0: ──────────────────────────────────────────────────────────────────────»\n",
+       "«        ┌─────┐┌───┐┌─────┐┌─────────────────────┐┌─────┐┌───┐┌─────┐┌───────┐»\n",
+       "«   q_1: ┤ Sdg ├┤ H ├┤ Sdg ├┤ P(2.84734028882025) ├┤ Sdg ├┤ H ├┤ Sdg ├┤ P(3π) ├»\n",
+       "«        └─────┘└───┘└─────┘└─────────────────────┘└─────┘└───┘└─────┘└───────┘»\n",
+       "«   q_2: ──────────────────────────────────────────────────────────────────────»\n",
+       "«                                                                              »\n",
+       "«meas: 3/══════════════════════════════════════════════════════════════════════»\n",
+       "«                                                                              »\n",
+       "«                                                                          »\n",
+       "«   q_0: ──────────────────────────────────────────────────────────────────»\n",
+       "«        ┌───┐┌─────┐┌───┐┌─────┐┌─────────────────────┐┌─────┐┌───┐┌─────┐»\n",
+       "«   q_1: ┤ X ├┤ Sdg ├┤ H ├┤ Sdg ├┤ P(2.79811693035566) ├┤ Sdg ├┤ H ├┤ Sdg ├»\n",
+       "«        └─┬─┘└─────┘└───┘└─────┘└─────────────────────┘└─────┘└───┘└─────┘»\n",
+       "«   q_2: ──■───────────────────────────────────────────────────────────────»\n",
+       "«                                                                          »\n",
+       "«meas: 3/══════════════════════════════════════════════════════════════════»\n",
+       "«                                                                          »\n",
+       "«                                                                        »\n",
+       "«   q_0: ────────────────────────────────────────────────────────────────»\n",
+       "«        ┌───────┐┌───┐┌──────┐┌─────┐┌───┐┌─────┐┌─────────────────────┐»\n",
+       "«   q_1: ┤ P(3π) ├┤ X ├┤ P(0) ├┤ Sdg ├┤ H ├┤ Sdg ├┤ P(3.48506837682393) ├»\n",
+       "«        └───────┘└─┬─┘└──────┘└─────┘└───┘└─────┘└─────────────────────┘»\n",
+       "«   q_2: ───────────■────────────────────────────────────────────────────»\n",
+       "«                                                                        »\n",
+       "«meas: 3/════════════════════════════════════════════════════════════════»\n",
+       "«                                                                        »\n",
+       "«                                                                 »\n",
+       "«   q_0: ──────────────────────────────■──────────────────────────»\n",
+       "«        ┌─────┐┌───┐┌─────┐┌───────┐┌─┴─┐┌───┐┌─────┐┌───┐┌─────┐»\n",
+       "«   q_1: ┤ Sdg ├┤ H ├┤ Sdg ├┤ P(3π) ├┤ X ├┤ X ├┤ Sdg ├┤ H ├┤ Sdg ├»\n",
+       "«        └─────┘└───┘└─────┘└───────┘└─┬─┘└─┬─┘└─────┘└───┘└─────┘»\n",
+       "«   q_2: ──────────────────────────────■────■─────────────────────»\n",
+       "«                                                                 »\n",
+       "«meas: 3/═════════════════════════════════════════════════════════»\n",
+       "«                                                                 »\n",
+       "«                                                                        »\n",
+       "«   q_0: ────────────────────────────────────────────────────────────────»\n",
+       "«        ┌─────────────────────┐┌─────┐┌───┐┌─────┐┌───────┐┌───┐┌──────┐»\n",
+       "«   q_1: ┤ P(3.48506837682393) ├┤ Sdg ├┤ H ├┤ Sdg ├┤ P(3π) ├┤ X ├┤ P(0) ├»\n",
+       "«        └─────────────────────┘└─────┘└───┘└─────┘└───────┘└─┬─┘└──────┘»\n",
+       "«   q_2: ─────────────────────────────────────────────────────■──────────»\n",
+       "«                                                                        »\n",
+       "«meas: 3/════════════════════════════════════════════════════════════════»\n",
+       "«                                                                        »\n",
+       "«                                                                              »\n",
+       "«   q_0: ──────────────────────────────────────────────────────────────────────»\n",
+       "«        ┌─────┐┌───┐┌─────┐┌─────────────────────┐┌─────┐┌───┐┌─────┐┌───────┐»\n",
+       "«   q_1: ┤ Sdg ├┤ H ├┤ Sdg ├┤ P(2.79811693035566) ├┤ Sdg ├┤ H ├┤ Sdg ├┤ P(3π) ├»\n",
+       "«        └─────┘└───┘└─────┘└─────────────────────┘└─────┘└───┘└─────┘└───────┘»\n",
+       "«   q_2: ──────────────────────────────────────────────────────────────────────»\n",
+       "«                                                                              »\n",
+       "«meas: 3/══════════════════════════════════════════════════════════════════════»\n",
+       "«                                                                              »\n",
+       "«                   ░ ┌─┐      \n",
+       "«   q_0: ──■────■───░─┤M├──────\n",
+       "«        ┌─┴─┐  │   ░ └╥┘┌─┐   \n",
+       "«   q_1: ┤ X ├──┼───░──╫─┤M├───\n",
+       "«        └─┬─┘┌─┴─┐ ░  ║ └╥┘┌─┐\n",
+       "«   q_2: ──■──┤ X ├─░──╫──╫─┤M├\n",
+       "«             └───┘ ░  ║  ║ └╥┘\n",
+       "«meas: 3/══════════════╩══╩══╩═\n",
+       "«                      0  1  2 
" + ], + "text/plain": [ + " ┌────────────┐ »\n", + " q_0: ┤ Ry(2.6831) ├────■──────■──────────────────────────»\n", + " └┬──────────┬┘┌───┴───┐ │ ┌───┐┌─────┐┌───┐┌─────┐»\n", + " q_1: ─┤ Ry(3π/8) ├─┤ Ry(0) ├──┼──┤ X ├┤ Sdg ├┤ H ├┤ Sdg ├»\n", + " └──────────┘ └───────┘┌─┴─┐└─┬─┘└─────┘└───┘└─────┘»\n", + " q_2: ───────────────────────┤ X ├──■─────────────────────»\n", + " └───┘ »\n", + "meas: 3/════════════════════════════════════════════════════»\n", + " »\n", + "« »\n", + "« q_0: ────────────────────────────────────────────────────────────────»\n", + "« ┌─────────────────────┐┌─────┐┌───┐┌─────┐┌───────┐┌───┐┌──────┐»\n", + "« q_1: ┤ P(3.43584501835934) ├┤ Sdg ├┤ H ├┤ Sdg ├┤ P(3π) ├┤ X ├┤ P(0) ├»\n", + "« └─────────────────────┘└─────┘└───┘└─────┘└───────┘└─┬─┘└──────┘»\n", + "« q_2: ─────────────────────────────────────────────────────■──────────»\n", + "« »\n", + "«meas: 3/════════════════════════════════════════════════════════════════»\n", + "« »\n", + "« »\n", + "« q_0: ──────────────────────────────────────────────────────────────────────»\n", + "« ┌─────┐┌───┐┌─────┐┌─────────────────────┐┌─────┐┌───┐┌─────┐┌───────┐»\n", + "« q_1: ┤ Sdg ├┤ H ├┤ Sdg ├┤ P(2.84734028882025) ├┤ Sdg ├┤ H ├┤ Sdg ├┤ P(3π) ├»\n", + "« └─────┘└───┘└─────┘└─────────────────────┘└─────┘└───┘└─────┘└───────┘»\n", + "« q_2: ──────────────────────────────────────────────────────────────────────»\n", + "« »\n", + "«meas: 3/══════════════════════════════════════════════════════════════════════»\n", + "« »\n", + "« »\n", + "« q_0: ──────────────────────────────────────────────────────────────────»\n", + "« ┌───┐┌─────┐┌───┐┌─────┐┌─────────────────────┐┌─────┐┌───┐┌─────┐»\n", + "« q_1: ┤ X ├┤ Sdg ├┤ H ├┤ Sdg ├┤ P(2.79811693035566) ├┤ Sdg ├┤ H ├┤ Sdg ├»\n", + "« └─┬─┘└─────┘└───┘└─────┘└─────────────────────┘└─────┘└───┘└─────┘»\n", + "« q_2: ──■───────────────────────────────────────────────────────────────»\n", + "« »\n", + "«meas: 3/══════════════════════════════════════════════════════════════════»\n", + "« »\n", + "« »\n", + "« q_0: ────────────────────────────────────────────────────────────────»\n", + "« ┌───────┐┌───┐┌──────┐┌─────┐┌───┐┌─────┐┌─────────────────────┐»\n", + "« q_1: ┤ P(3π) ├┤ X ├┤ P(0) ├┤ Sdg ├┤ H ├┤ Sdg ├┤ P(3.48506837682393) ├»\n", + "« └───────┘└─┬─┘└──────┘└─────┘└───┘└─────┘└─────────────────────┘»\n", + "« q_2: ───────────■────────────────────────────────────────────────────»\n", + "« »\n", + "«meas: 3/════════════════════════════════════════════════════════════════»\n", + "« »\n", + "« »\n", + "« q_0: ──────────────────────────────■──────────────────────────»\n", + "« ┌─────┐┌───┐┌─────┐┌───────┐┌─┴─┐┌───┐┌─────┐┌───┐┌─────┐»\n", + "« q_1: ┤ Sdg ├┤ H ├┤ Sdg ├┤ P(3π) ├┤ X ├┤ X ├┤ Sdg ├┤ H ├┤ Sdg ├»\n", + "« └─────┘└───┘└─────┘└───────┘└─┬─┘└─┬─┘└─────┘└───┘└─────┘»\n", + "« q_2: ──────────────────────────────■────■─────────────────────»\n", + "« »\n", + "«meas: 3/═════════════════════════════════════════════════════════»\n", + "« »\n", + "« »\n", + "« q_0: ────────────────────────────────────────────────────────────────»\n", + "« ┌─────────────────────┐┌─────┐┌───┐┌─────┐┌───────┐┌───┐┌──────┐»\n", + "« q_1: ┤ P(3.48506837682393) ├┤ Sdg ├┤ H ├┤ Sdg ├┤ P(3π) ├┤ X ├┤ P(0) ├»\n", + "« └─────────────────────┘└─────┘└───┘└─────┘└───────┘└─┬─┘└──────┘»\n", + "« q_2: ─────────────────────────────────────────────────────■──────────»\n", + "« »\n", + "«meas: 3/════════════════════════════════════════════════════════════════»\n", + "« »\n", + "« »\n", + "« q_0: ──────────────────────────────────────────────────────────────────────»\n", + "« ┌─────┐┌───┐┌─────┐┌─────────────────────┐┌─────┐┌───┐┌─────┐┌───────┐»\n", + "« q_1: ┤ Sdg ├┤ H ├┤ Sdg ├┤ P(2.79811693035566) ├┤ Sdg ├┤ H ├┤ Sdg ├┤ P(3π) ├»\n", + "« └─────┘└───┘└─────┘└─────────────────────┘└─────┘└───┘└─────┘└───────┘»\n", + "« q_2: ──────────────────────────────────────────────────────────────────────»\n", + "« »\n", + "«meas: 3/══════════════════════════════════════════════════════════════════════»\n", + "« »\n", + "« ░ ┌─┐ \n", + "« q_0: ──■────■───░─┤M├──────\n", + "« ┌─┴─┐ │ ░ └╥┘┌─┐ \n", + "« q_1: ┤ X ├──┼───░──╫─┤M├───\n", + "« └─┬─┘┌─┴─┐ ░ ║ └╥┘┌─┐\n", + "« q_2: ──■──┤ X ├─░──╫──╫─┤M├\n", + "« └───┘ ░ ║ ║ └╥┘\n", + "«meas: 3/══════════════╩══╩══╩═\n", + "« 0 1 2 " + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc2 = QuantumCircuit(3)\n", + "qc=qc2.compose(teacher_circuit)\n", + "qc.measure_all()\n", + "qc.draw()#.savefig('qae_circuit.pdf')" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "bf563d7c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'001': 328, '010': 23, '000': 40, '011': 633}\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#choosing the qasm simulator backend\n", + "\n", + "from qiskit.visualization import plot_histogram\n", + "\n", + "backend = Aer.get_backend('qasm_simulator')\n", + "\n", + "# running the job and getting results (counts)\n", + "job = execute(qc, backend, shots=1024) # shots = no. of times you want to run the experiment\n", + "result = job.result()\n", + "counts = result.get_counts(qc)\n", + "\n", + "#printing and visualizing results (histogram data of experiment)\n", + "print(counts)\n", + "plot_histogram(counts)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "dd54f992", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABCEAAADWCAYAAADvqphMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAABPmUlEQVR4nO3de3gM9/4H8PfuZpMgESJuSSQVIjci4q4lcStKqRZt6enlKI6idWmrWpTeKaWnF3q/OdpKaKmDU1SCRluhCSLEPUJEXHMRiWzy+2N/iWx2NjuJ3ZnZ2ffreTxkdr4zn00++97xzcyspry8vBxERERERERERHamlbsAIiIiIiIiInIOnIQgIiIiIiIiIklwEoKIiIiIiIiIJMFJCCIiIiIiIiKSBCchiIiIiIiIiEgSnIQgIiIiIiIiIklwEoKIiIiIiIiIJMFJCCIiIiIiIiKSBCchiIiIiIiIiEgSnIQgIiIiIiIiIklwEoKIiIiIiIiIJMFJCCIiIiIiIiKSBCchiIiIiIiIiEgSnIQgIiIiIiIiIklwEoKIiIiIiIiIJMFJCCIiIiIiIiKSBCchiIiIiIiIiEgSnIQgIiIiIiIiIklwEoKIiIiIiIiIJOEidwFEVHtHjhyxus6HH36IqVOn1rhOaGiorUoihbFFj7A/SGms9TVzz7nxvZHUiO/npEY8E4JIpT766CO5SyCFY4+Q2rCnyRr2CKkR+5ocDSchiIiIiIiIiEgSnIQgIiIiIiIiIklwEoJIpeLj4+UugRSOPUJqw54ma9gjpEbsa3I0nIQgIiIiIiIiIklwEoJIpUaNGiV3CaRw7BFSG/Y0WcMeITViX5Oj4Ud0OoCjvwH5F+WugqrzbAaE9JO7CiL1YNY5FmYgkXjMN3VzxjycPn06UlJSZNl3VFQUli9fLsu+yTY4CeEA8i8C17LkroKIyL6YdUSkVsw3UpuUlBQkJibKXQY5KF6OQaRSU6ZMkbsEUjj2CKkNe5qsYY+QGrGvydFwEoJIpaZOnSp3CaRw7BFSG/Y0WcMeITViX5Oj4SQEkUr16dNH7hJI4dgjpDbsabKGPUJqxL4mR8NJCCKVys3NlbsEUjj2CKkNe5qsYY+QGrGvydFwEoKIiIiIiIiIJMFPxyC7m7UiFuln9kCn00Or1aFF49YY2/8VxHQcLXdpqhYeHi53CaRw7BH7Ye7Jgz1N1rBH7Ie5Jx/2NTkaTkKQJMYNmIdxA+bCYCjF+qQP8fbqsWjr1wl+Pm3lLk211q5dK3cJpHDsEfti7kmPPU3WsEfsi7knDzX3tV6vx61bt+Qug2yMl2OQpHQ6FwzpPgGGslKcOJ8idzmqNn/+fLlLIIVjj0iDuScd9jRZwx6RBnNPWo7Q1+Hh4ZgyZQq+/PJLbN68GVu2bMHXX3+NadOmoUOHDoJjRowYgbS0NAQGBkpcLdkbJyFIUrdKS7AxaQUAwN+nnczVqFtcXJzcJdRaebncFTgXR+wRR8Tck44j9jRzT1qO2COOiLknLSX39X333YedO3ciLS0NH374IZ566ikMHjwYgwYNwhNPPIF///vfOHDgAH7//XcMHz68ctyIESMQFxeH4OBgPPLIIzI+A7IHp7wco6ysDO+99x4++eQTnD17FiEhIfj3v/+NiRMnIiYmBp9++qncJarO6u1vIi5xCYqK86HT6TFz9OcI8o2UuyxSgKISIOmY8c+VQkDvAnRsBcSEAv7ecldHVHfMPbKk1AD8dRLYnQFkXwd0GiCkpTH32rWQuzqiumPuUYVGjRrhww8/xLhx4wAAeXl5+Omnn/DXX3/h1KlTKC8vR+vWrdG1a1eMHDkSvXr1wvr16/Hjjz9i48aN+PLLL6HX67F48WIsWrRI5mdDtuaUkxDjx4/HunXrMG/ePHTu3BlJSUl49NFHkZubi5kzZ8pdniqN7f8Kxg2Yi/wbV7E0bjxSj+/AkG7j5S6LZJZfBHywDbiYd3tZSSmQfArYdxp4rBcQfZdc1RHdGeYeCSkpBT5LAI7lABoA5QBKy4HD54C0c8B9HYF728tcJFEdMfcIAHx8fLB9+3ZERkbixo0bmD9/PlauXInCwkKzdVesWIGpU6diwoQJeOONN/Dwww9jzJgx0Gg0WLx4MWbPni3DMyB7c7rLMb7//nt8/fXX2LBhA55//nn07dsXr7zyCnr27InS0lJER0fLXaKqedZvjJmjP8efR/6LpEPr5S5H1RITE+UuwarvkoDcPPPl5QDKyoFVFh4n23CEHlED5p50HKGnN6YYJyAAY9ZVqPj3plQg/bzERTkRR+gRNWDuSUtJfa3X67Fp0yZERkYiPT0dHTt2xNKlSwUnICrcuHED77//PmbOnIny8nJoNBrk5OQ4xL0uqG6cbhLirbfewuDBgxETE2OyvG3bttDr9YiMNJ4ydvr0acTExKBdu3bo0KEDdu3aJUe5qtSwvjce6j0TX255GWVlZXKXo1ppaWlyl1CjC9eBjAumB+HVlZUDvx+TrCSno/QeURPmnjSU3tM3bwF7jte8jkYDJB6Rph5npPQeURPmnnSU1Ndz585F165dcerUKfTt2xfHj1sJvf83YsQIfPTRR9BoNLhy5QqaN2+OBQsW2LdYko1TXY6RlZWFQ4cOYcaMGWaPZWZmIiIiAm5ubgCASZMm4eGHH8YzzzyDpKQkjB49GqdOnYKrq6vV/Wg0GpvWveRfO9CxTaxNtym3kb2fw7pdy7B137cY1PVJucupk8TEBHR9tK8s+xbq4eqWLVtmdb1ly5bZqqRaixr0HGL+sdzqeut+O4qRXULtX5DK2KJHpO4PNWZdVWrIvarkyEAxmabk3AvocC9Gzv5fjeuUlwOHzxmg0ep518paUvJ7o9rzzRK15Z4l9sxDR3o/DwgIwMsvvwwAeOKJJ5CTkyNqXMVNKCvuAbFu3Tr8/vvveOGFF/DFF1+YTWQkJiba/P9bdOfKa/Ge5XSTEADQooXpXZ+KioqQmJiIIUOGAAAuXbqE3bt3Y8OGDQCAXr16wdfXFzt27MCgQYOkLVoFlk5OMFvWwL0h1r12RfpiSDF0LtYn9ABApxe3HpGSMPdIiNjc02p10Gp1KDOU2rkiItth7tGkSZPg4uKC1atXiz6LvPoERMU9IL799ls89dRT+Ne//oXnn3/enmWTDDTltZmycHDHjx9HcHAwli1bhunTp1cuX7hwIRYsWICPPvoIzzzzDPbv349Ro0bh5MmTleuMGTMGAwYMwMSJEyWvO/kH4FqW5LslKxr5A11k+sSgI0esn6sbFhaG9PT0GtcJDZXvDIO0c8abs9VEowHCfYEJsVJUpC626BGp+4NZ51jkyEBrfa303MvNB97cUPM6GgDeHsC8EZKUpCpKfm9kvqmbPfNQqe/nsbGxZveiyMzMRKtWrXD33XcjKSnJ6jYsTUAAQOfOnZGcnIycnByzXyDHxMQgISHBJs+D5OFUZ0IEBQUhMjISb731Fry9veHn54f4+Hhs2rQJgLHZidRi4cKFcpdQo7CWgFc9IK/I8n0hysuBu4MlLcupKL1HiGpL6T3d1BMIbg4cv2j5SotyAL3bSVqWU1F6jxDVhRL6ukWLFmjVqhWuX7+OPXv2WF2/pgkIANi3bx9yc3PRvHlzBAQEIDMz016lkwyc6saUWq0WcXFxiIiIwOTJk/HUU0/Bx8cHU6ZMgU6nq7wpZUBAAHJyclBcXFw59tSpUwgMDJSrdKJaGzNmjNwl1EirBR7pYTzbwdJVfZ0CgFBfSctyKkrvEaLacoSefrAL4KozZp+QAG+gFydf7cYReoSotpTQ1x06dAAApKSkWL03gLUJiAp///03AFT+H43Uw6kmIQCgXbt22LFjBwoLC5GZmYnXX38dBw8eRHh4OOrVqwfA+Nm2d999N7744gsAQFJSEs6dO4e+feW5CSFRXYSFhcldglVhvsCkvkBzL9Plbi7AgAjgsbsBLe87ZDeO0CNEteEIPd2yEfDcvUBQU9PlOi3QvQ3wzADA1anOU5WWI/QIUW0poa9zcnLw6aefYt26dTWuFxoaKmoCAgB+/vlnfPrpp8jOzrZ1uSQzvs0BSE5ORo8ePUyWrVy5Ek8++SSWL18OV1dXfP/996I+GUMK6Zl/YuWGGdBotAhp1RWTh9++4+3Nkht4/bvRuFlSiAbuXpj7jzXIK7yMeV8Nw5mcw/jljQLodC44deEQlsdPhFarg2+Ttnh+zJe4nJdtth4ArNgwAxlZyWjrF40pI94X3MeJ8ykWa6o+/sKV05j2QXcENAuDi84Vo/rMxA873gEAZOUexbMPrkCPsGF45/vHcLUgByH+XTFh2GKzcYsm/ir4vTAYSs3G1sal6+ewJuFd9O30qMXnRLYT0hKYPRQ4ewV4b4tx2WsPGSciiKrnR4VL18+LyiuhrMu5ekZUllS1ducy7Dq4Fsun7BbMwHOXjpnt53ROmtmysjKDWT4JPZe9R7aY5eLd7R/A1uRv8eu+b1BWZsCcsf8BoDEbK1Sfq4ub6O85M9D+fBsD0wYaP6r4nY3GZQtHAh7u8tZFymEp+yw9LnSMZOl4SMxYoUy0lEtitic203y8/ACYZq7QWFcX9zrXUhuXrp/De3FPo/DmdWahFQcOHMCkSZOsrnfkyBG8/fbbcHd3r3ECAgBWrFhhq/JIYZzuTIjqCgoKkJGRgejoaJPlQUFB2LlzJzIyMnDo0CHExMTIVKG55o0C8e6k37B8ym5cK7iIU9kHKx/be3QLQgO6Y+nkBIQEdEPykS1oWN8biyduR1jA7YmWVk1D8P7UJCx7xnjn2oysZMH1jmXtR1FxAZY9swulpSU4enav4D4s1SQ0HgA6Bw/E0skJWDTxV3QNHYylkxOwdHICmjUKQHTwAOw+9BOCfDtiyb92oLi0CCfOp5qNs/S9sDRWrH0ZW9G53cAav89kWxoNENDk9tecgCDAcn4AEJ1XQlkHiMuSCiWlxThxPqXya6EMFNqP0DKhfBJ6LkK5eOn6ORw4mYh3J23H0skJ8PHyExwrVF9tMAOl06LKWWCcgKAKNWVfTY9XzzWhvBE7Vuj1L5RLYrcnNtMA88wVGnsntdTGvoyt6B/9GLPQxl599VWrExCkbk4/CeHh4QGDwYBp06bJXYpo3g1bwFVvPFrRafXQanWVj/k2aYObJYUAgMKia2jYoAlc9e7wrN/YZBsuOn3lv/Uubmjq1UpwvfTMP9C53UAAQHTwABw+s0dwH5ZqEhoPACkndmDGx72xduft2eTsyyfRyLM56rl5IPvKSQS1NF7/1cY3CodPJwmOE9qvpbHVpZ5IwMj5jTFrRSzGvRmI+V8Zb0V+4GQiIoNiavw+O4LY2Fi5SyCFU3qPWMoPAKLzSijrAHFZUmHLX19gYJcnKr8WykCh/QgtE8onoedSoWouJh/9HwxlBrzwSX98+PM0GMoMgmOF6rNEKAcdOQOV3tMkP0fokZqyr6bHq+eaUN6IHVvT679qLtXmOK/6WKFMA8wzV2isLWqpqqZjwl4RIxSfhY7Q10RVOf0khCM7ef4ArhfmIrB5eOUyP59gpJ/Zg6eXRCAjKxnhgb0sjk9K24AJS9rjWn6OxYPUgqJrqO/WEADQwN0LBUXXatxH9ZqExns3bImvZmdgyaQd2H9sG06ePwAA2H1wHe5uPxKA8UyNAyeMH/uTenwHCm5aHld9v0JjhXRo3Qchrbph6eQERAbF4NkHP0Z5eTlulhSavMEJfZ8dAU9hI2uU3iNC+VGX9atnndgsAYBSwy2knkhAp7b9KtexlIFCmVp9mdh8qlA1F68W5KDUUIJ3J22Hm74+ktLWC46pzfuAUA46cgYqvadJfo7QI9ayT+yxlVDe1Oa4DBB+/VfNpdpuz1qmCWWu0Fhb1FKVmGNCJWehI/Q1UVWchHBQeTeu4MOfp2LW6C9Mlm9N/gY9wu/H58+noXvoUGzfv8riNnpFDMdnzx+CTyN//HF4o+A6Ddy9cKM4DwBQWJwHj3qNLO5DqCah8a4ubqjn2gA6nQt6hA3D6ZxDAIA96b+gV/hwAECP8PtRXFqEFz7pD72LGxp7NLc4rvp+hcYKyb5yEi29gwAAudfPwsfLDyfOpyLIt6PV77MjmDx5stwlkMIpvUeE8qMu61fPOrFZAgDb9n2Hfp3GmuzHUgYKZWr1ZWLzqULVXGzg7oXIIOOlgVFt+yHzovBnwtfmfaB6Dl4ryHXoDFR6T5P8lNQjV/IuYNaKWJM/b656xGr2iT22Esqb2hyXWXr9V88lsdsTGls904QyV2isLWqpytoxodKzUEl9TSQGJyEcUMWNhiYOWwLvhi1MHitHOTzrewMAGjbwQeHN64LbKCm9/fGj9d0awk1fT3C98MCe+PvYdgDA38e2ISygh+A+LNUkNP7GzfzKx9NO/46WTdrgSt4F6HWulb891Gl1mPrAB3h30nZotTp0CRkkOE5ov0JjDYZSXM3PMXluZy6kIbBFBAxlBmg0xpfC/mNb0Tl4oNXvsyNISEiQuwRSOKX3iFB+1HZ9oawTmyUAcDb3KH7ZswJzPhuMMzlp+Hn3B4IZKLQfoWVC+WRJ9VwMD+yFk9nG3+KdOJ+Clt6tBcdZyujqGQiY56CjZ6DSe5rkp6Qe8W7YovK+BhV/XnnsB6vZJ/bYSihvxI619Po3zyVx2xMea55pQpkrNPZOaqntMaEjZKGS+ppIDN7+zQElHohDxtm9+Oy/LwIAxg95Gy28W2Pz3i8wotcUvLHqYWzb9x1cdHq88tiPKDXcwsufD8HJ7FS89Pkg/HPIW7iadwHxu94DYDx1t3O7ewXXCwvoDr3eHTM+7o02vlEIDegG/6btzPYhVFP4XT0R7B9tNv7P9E345n/zoHdxQ/vWvREW0B0b93yCnhEjKp/jpevn8PbqcdBqtBjQ+XH4ePkJjvvt7+/N9tuscYDZ2HOXjuPHHYswc/Rnlfs4nZOG8MCeuFVajGsFF3E5LxsZWckY1WeWxe9z+F097f8DJiIAEMyPK3kXsHnvF3g49kVReZV0aL1Z1u09ukVUloTf1RMThi6qrGf6R/fggXumoaDomlkGJh/ZYrafPw7/YrZMKNssZW9S2nqTXGzrFwU3fT3MWhELrwY+eKj3DMGx/TqNNavvwtXTZhkImOfg/mPbmIFEMqsp+8b1f0X0sZVQ3vh4+YkaaykTq+eS2FoAiMq0qmdBVGSu0FihZWJrqe0xYULqj8xCIhvTlJeXl8tdBNUs+QfgWpbcVTi2XQfWwqN+Y8FrDKtKTF2DmI5jRG2zkT/Q5RFbVFd7R44csbpOWFgY0tOFT9euEBoaaquSbGL6f4x/Lx8nbx1qYIsekbo/mHX2o5YMtNbXzD3npuT3RuabcjhaHir1/Tw2NhaJiYk2364YMTExPPvDwfFMCHIKvSMfErWe2DcbR2DtIIuIPeI8nCUD2dNkDXuE1JiH7GtyNLwnBJFKrVmzRu4SSOHYI6Q27Gmyhj1CasS+JkfDMyEcgGczuSsgIUr/ubz66qsYM8ZxZvFJekrrEaW/psiUEn9eSutpUh65ekSJrxeyHbl/vnL0dVRUVJ3GnczMNvk6KKClZPsm5eAkhAMIqfmSNSIiVWDWEZFaMd9IbZYvX16ncS8t+tTk63dmT7RBNeRoeDkGEREREREREUmCkxBEKvXxxx/LXQIpHHuE1IY9TdawR0iN2NfkaDgJQaRSERERcpdACsceIbVhT5M17BFSI/Y1ORpOQhCpVExMjNwlkMKxR0ht2NNkDXuE1Ih9TY6GkxBEREREREREJAlOQhARERERERGRJDgJQaRSXbt2lbsEUjj2CKkNe5qsYY+QGrGvydFwEoJIpfbu3St3CaRw7BFSG/Y0WcMeITViX5Oj4SQEEREREREREUmCkxBEREREREREJAlOQhCpVHx8vNwlkMKxR0ht2NNkDXuE1Ih9TY6GkxBEREREREREJAlOQhCp1KhRo+QugRSOPUJqw54ma9gjpEbsa3I0LnIXQLcd/Q3Ivyh3FXSnPJsBIf3kroLIcTELlY0ZR2R7zD1lY+6px/Tp05GSkiL5fqOiorB8+XLJ96tUnIRQkPyLwLUsuasgIpIXs5CInA1zj0gaKSkpSExMlLsMp8fLMYhUasqUKXKXQArHHiG1YU+TNewRUiP2NTkaTkIQqdTUqVPlLoEUjj1CasOeJmvYI6RG7GtyNJyEIFKpPn36yF2CVWVlwLEcYFsa8M3u28vX7wf2nQYKi2UrzSk4Qo8Q1YYj9HR5OZB5GUg8Avwn6fby+L3AnyeAq4Xy1eYMHKFHiGqLfU2OhveEIFKp3NxcuUuwqNQA7M4AdmUAlwvMH9+RbvzbRQt0ugu4tz3Q1FPSEp2CknuEqC6U3NPl5UDyKSDhCHDuqvnjuzOMf2sARPgbcy+giaQlOgUl9whRXbGvydFwEoLsbtaKWKSf2QOdTg+tVocWjVtjbP9XENNxtNylkQzOXwVW7TH+bU1pGbD3JJByBhgWBfQJATQau5dIdMeYe1TVtRvA938AR7Otr1sO4FAWkJYF9A0H7osEXHR2L5HojjH3iEgsTkKQJMYNmIdxA+bCYCjF+qQP8fbqsWjr1wl+Pm3lLk21wsPD5S7BzPEc4NMEoKS0duNuGYCf9gE5ecDorpyIsBUl9oiaMPekp8SevpgHfLQNuF5Uu3HlAH47bJywHR8D6DkRYRNK7BE1Ye7Jg31Njob3hCBJ6XQuGNJ9AgxlpThxPkXuclRt7dq1cpdgIvsa8FlC7Scgqko6Bmw+YKuKSGk9olbMPekoracLbgIfb6/9BERVR7KBVUnGyznozimtR9SKuSct9rV9+fj4oHfv3hg4cCDuvvtuNG7cuMb1x40bh8DAQImqc0ychCBJ3SotwcakFQAAf592MlejbvPnz5e7hEqGMmD1HqDYygTE8nHGPzXZegg4fcl2tTkzJfWImjH3pKO0nl6XbLwUoyZici8103izXrpzSusRtWLuSYt9bXtBQUFYvHgxTp8+jdzcXOzcuRO//vordu/ejStXruD48eN47bXX4O/vbzJuwoQJWLVqFRISEuDh4SFT9crntJMQZWVlWLJkCYKDg+Hu7o6OHTsiMTERISEhmDhxotzlqc7q7W/igXmNMOzlevjqf3Mxc/TnCPKNlLssVYuLi5O7hEp7jgNnr9hmW+UA4v+S/7eC5eXAiYvAplTgl7+NN5y7ZZC3ptpSUo+oEXNPekrq6WM5wP4zttveuuQ7O5PMVs5fBbYcBDbsB37PAIpK5K6odpTUI2rE3JMH+9p26tWrh6VLl+LYsWN44YUXEBgYiIKCAuzZswe//vor/vrrLxQVFaFNmzaYN28eTp06hddeew16vR4TJkzAp59+CgB4//33UVAgcPd1AuDE94QYP3481q1bh3nz5qFz585ISkrCo48+itzcXMycOVPu8lRnbP9XMG7AXOTfuIqlceORenwHhnQbL3dZJIHy8tt3fbeVrKvGsyFaN7XtdsW6lA98uRM4f810+dpk4OHuQFSALGWRwjD3nNvuo7bd3o0S46RGjza23a5YhcXAd78bLw+p6qf9wNCOQGwo79dDzD1ybIGBgdi8eTPCwsJQWlqK7777DitXrsRff/2FsrKyyvV0Oh3uvvtuPPPMMxg9ejTmzZuHxx9/vPISjBkzZmD58uUyPQvH4JRnQnz//ff4+uuvsWHDBjz//PPo27cvXnnlFfTs2ROlpaWIjo6Wu0TV8qzfGDNHf44/j/wXSYfWy10OSSDrKnDhuu23u/ek7bcpRn4R8O+tQLbAc7pZAnyzCzh8Tvq6SLmYe87n5i3gYJbttytX7pUagJW/CX+6R6kBWL8f2GnjSRdybMw9cjR+fn5ITExEWFgY0tLS0KNHDzz55JP4448/TCYgAMBgMGDnzp145JFHEBMTg4sXL1ZOQMydO5cTECI45STEW2+9hcGDByMmJsZkedu2baHX6xEZaTxtbP78+WjXrh20Wi3i4+PlKFWVGtb3xkO9Z+LLLS+bvajJdhITE+UuAQCQaaf7N2Rets92rdl5FMgrEr4cpGLRhr/lv1xEDKX0iDNg7klDKT199gpQZocMOHsFkKN9UjKN+67pKW1KtX7fHyVQSo84A+aedNjXd0aj0WDVqlUIDAzEnj170KtXL+zbt0/U2LCwMDRr1qzy686dO9urTFVxukmIrKwsHDp0CKNHm39mcWZmJiIiIuDm5gYAGDx4MLZs2YI+ffpIXabqjez9HK7kZWPrvm/lLkW10tLS5C4BgPklC7bcrj0O8q3Zc7zmx8thPPPDVvfAsCel9IizYO7Zn1J6+vxV+2y3pBS4XGifbddkz3HA2pUWxaXAwbOSlHNHlNIjzoK5Jw329Z2ZNGkSYmNjkZOTg/vvvx95eXmixlW9B8TChQuRl5eHkSNHYsyYMfYsVxU05eWO8Ps62/njjz/Qs2dP/Pe//8V9991XubziBiNDhgzBF198YTImNjYWU6dOxahRo0TtQ1PHiyKX/GsHOraJrdNYUo7UEwl4fmVfu+5jxowZVtdZtmyZ1fWWLVtmq5IsunfSNwjr/bjJMmt3grdk+n9Mv/7wqXow3LpZx8pqT6PV4dlvxf2qb+PyB3Ei+Sc7V2SZLXpEiv4QwixUNikyzhIxmaaE3Os6fA56jXnLZJmtcm/1K52QeyalbhuroyeXnYRX09ZW10ta8zL2bnhbgoqEOdJ7Y3XMPWVTcu4Byn0/FzL7nU9Mvl700iSZKjHSarU4efIkAgMDMWbMGNE3+aw6AVFxD4hJkyZh5cqVSE1NRVRUlB2rVqbaTCs43ZkQPj4+AICMDNM75S1evBjZ2dk8hYbIxgwG2986vSLkygy3bL7tGvdbZkBpSZGodUuK7HAjDCJyCIZS+31khOFWsd22bUlx4TWUizidvvgGc4+IHMvgwYMRGBiI48ePi778XmgCAgC++uorXLx4ER07dkSPHj3sVbIqON2ZEGVlZejUqROys7OxZMkS+Pn5IT4+Hps2bUJmZib++OMPdO/e3WRMbc+EqKvkH4BrdriRFUmrkT/Q5RH77uPIkSNW1wkLC0N6enqN64SGhtqqJIt+O2y8R4IYFb8prP6bPyE+nsDc4XWvq65W7zHeHK6m4PRwAxaMBFx0kpVlxhY9IkV/CGEWKpsUGWeJtb5WSu4dygI+F3mJdm1yT6sB3hkDuEr82Wbb0oCNKTWvo9UArz4AeNWXoiJhjvTeWB1zT9mUnHuAct/Phby06FOTr9+ZPVHS/cfGxprcQ2Pp0qWYOXMmFixYgIULF1odb2kCosL777+PZ599FnPnzsWbb75ZuTwmJgYJCQk2eQ5q4HRnQmi1WsTFxSEiIgKTJ0/GU089BR8fH0yZMgU6na7yppREjk5MkErB39s+221lp+1aU/ExdDVddNUvXN4JCLGU0iNEtqKUnrZXPrVoJP0EBGD8WND6rjXnXtcgeScgxFJKjxDZEvu67irOgv/zzz+trmttAgIA/vrrL5PtkjCnm4QAgHbt2mHHjh0oLCxEZmYmXn/9dRw8eBDh4eGoV6+e3OUR2YRSbooT1NR4ZoCtdWxl+22K4dsY+GcfQFctPSsOzvuEAH3DJC+rTpTSI0S2opSe9qoPBPrYfrty5Z6HOzC5H1C/WpZX5F6EHzCqq+Rl1YlSeoTIltjXdefn5wcAOHHiRI3riZmAAIDjx413MPf19bVdkSrklJMQQpKTk81mrObNmwd/f3/s2bMHkyZNgr+/v9UGJVKKsDBl/E/YRQf0aGvbbTZ0BzrIdDAOAO39gXkjgMFVTpzq3gaYORh4sIvxTAlHoJQeIbIVJfX0PcG23Z5WY/ssrY1WTYyXwD3Y5fayjgHGyYnxMYDeAc7+ApTVI0S2wr6uu8jISHh7e1v9P56/vz+AmicgAGDfvn3w9vZGbGysDatUHxlO6lOegoICZGRk4JlnnjFZ/vrrr+P111+XqaqardgwAxlZyWjrF40pI943e3xr8rf4dd83KCszYM7Y/8DHy89szKkLh7A8fiK0Wh18m7TF82O+RPLR/+GHHe8AALJyj+LZB1egjW8Upn3QHQHNwuCic8Wiib9i75EtZuvd3f4Bs/0CGsz7ahjO5BzGL28UQKdzgcFQine+fwxXC3IQ4t8VE4Ytxs2SG3j9u9G4WVKIBu5emPuPNbiSly1qv64u7mbLOre712x7ZWUGs2WuLuJ/RX/p+jm8F/c0Cm9eh0ajRUirrpg8XDl3G1ayvmHAnyeAfBt9kMXQKPMzEaTmVR8Y3AHYcsD49SO8/5DkhDKs+qcTVc+99Mw/sXLDDJPXsNhc8W7YUtTYkFbdzHJP7H7vbv+AYN1C6wpls9B+aoM5ZzvRdwGJR4EsG31cb98wwEvmkzXruRrP9lqXbPz6yd7y1uOMLl0/b5YvVdWUi2t3LsOug2uxfMpuweOuc5eOCY6tnkdCx3Fil1mqUej4syIPq9YtNLaszCC4H/HfU+aeMysqKkJRkfWbjr/66qvYsmUL9uzZU+N6paWluHrVTp/TrCI8EwKAh4cHDAYDpk2bJncpohzL2o+i4gIse2YXSktLcPTsXpPHL10/hwMnE/HupO1YOjkBPl5+gmNaNQ3B+1OTsOyZXQCAjKxkdA0djKWTE7B0cgKaNQpAdPAAAEDn4IFYOjkBiyb+CgCC6wntt2F9byyeuB1hAbf/h7b70E8I8u2IJf/ageLSIpw4n4q9R7cgNKA7lk5OQEhANyQf2SJ6v0LLhLZnaR9i7cvYiv7Rj+HdSb9h+ZTduFZwEaeyD9bth+hkGrgBY7rZZlvhvkC3INtsixybUIZVJZR7zRsFmr2GxeaK2LFCuSd2rKW6xWaz0H5qgzlnOzotMLaHbSZMW3iZnnlFzksoX6qylIslpcU4cT6lcj2hYyKhsUJ5JHQcJ3aZpRotZVz1uoXGWtqPWMw9EsvaBASJx0kIB5Se+Qc6txsIAIgOHoDDZ0xfEMlH/wdDmQEvfNIfH/48DYYyg+AYF52+cozexQ1NvW6f3559+SQaeTZHPTcPAEDKiR2Y8XFvrN1pOjNcdT2h/brq3eFZv7HpmCsnEdTSeDTVxjcKh08nwbdJG9wsKQQAFBZdQ8MGTUTvV2iZ0PYs7aO61BMJGDm/MWatiMW4NwMx/6sRAIADJxPRK2IEXPXuAACdVg+tVrnnnyrtNLAOrYAR0TWvM/0/Nd8hvpU38Pg9jnO5g9IprUdqq6YMA4Sz0rthC4uvYWu5InasUO7VZr81Zby1bK5pP1WpJeeqU1pP+zYGnrjHeCmFJdZyr1F9YGKs41zuoHRK65HaEsqXqizl4pa/vsDALk9UPiZ0TCQ0ViiPhI7jxC6rqUbAPOOq1y001tJ+qlNr7gGO39fkfDgJ4YAKiq6hvltDAEADdy8UFF0zefxqQQ5KDSV4d9J2uOnrIyltvcUxSWkbMGFJe1zLzzH5T/nug+twd/uRAADvhi3x1ewMLJm0A/uPbcPJ8wcE1xPar5BWTUNw4ITxo3FSj+9Awc1r8PMJRvqZPXh6SQQyspIRHthL9H6FlgltT2iZkA6t+yCkVTcsnZyAyKAYPPvgxygvL8fNksLKN8WT5w/gemEuApuHW/gpyW/FihVyl2Cmb5jxsoW63N29gz8wZQDgrre+LomjxB6pLUsZBtSclUKvYWu5UtuxQsSMralusdlsLaPUknPVKbGnI1sBE/sCnu61HxvoAzx3L+DtYX1dEkeJPWJr1XOx1HALqScS0Kltv8p1LB0TVR8rlEdCx3Fil1mqsULVjBOqW2hsTfupSq25BzhHX5O6cBJCwa7kXcCsFbEmf95c9QgauHvhRnEeAKCwOA8e9RqZjGvg7oXIoBgAQFTbfsi8mG5xTK+I4fjs+UPwaeSPPw5vrNzGnvRf0Ct8OADA1cUN9VwbQKdzQY+wYTidc0hwPaH9CukRfj+KS4vwwif9oXdxQ2OP5tia/A16hN+Pz59PQ/fQodi+f5Xo/QotE9qe0DIh2VdOoqW38Xz/3Otn4ePlhxPnUxHk2xEAkHfjCj78eSpmjf5CcLxSTJ48We4SBPVoA7x4n/Fu6mJOaGjiAfyjl/ETKTgBYVtK7ZHqLGUhYDnDAFjMPUuvYWu5Utux1YkdW1PGi8lmMRmllpyrTqk9HdoSeGmY8Qa2Yi7P8HAznjn23ECgcQP71+dMlNoj1dWUe9ZUz8Vt+75Dv05jTdaxdExUfaxQHgkdx4ldZqnGClUzTqhuobE17acqteYe4Dh9TVSBN6ZUMO+GLbB0coLZ8mNZ+/HfPz5BTMcx+PvYNtzb5UmTx8MDe2HTn58BAE6cT0FL79Zo1TTUbExJaXHljRnruzWEm954x6sreReg17lWzkzfuJmP+u6eAIC0079jxD3TBNcT2q8QnVaHqQ98AABYFj8RXUIGISltPTzrGz9YvWEDHxTevC56v0LLylFutj2tVme2zGAoRd6Ny2jsefsN68yFNAS2iIChzACNxni0uP/YVnQOHlh5k6WJw5bAu2ELweenFAkJCXKXYJGPJzAhFriUD+w9BZy5BJy/ChTdMh6gN/UE/L2Nn0IR1hLQcrrULpTcI1VZykJLGVYhPLCnWe5Zeg2LyZXajK2uNmOF6hZaVygjhfaj5pyrTsk93cANeLQHMCwK2HsSOJVrvGllYbHxErPGDYyXnIW0BKICjJ8sRLan5B6pylLuWSOUi+mZf+DE+RRs3LMSZ3LS8PPuDwSPiYTGCuWR0HGc2GWWagTMM+5s7lGzuu/rMdFsrNB+nCn3AMfpa6IKnIRwQMH+0dDr3THj495o4xuF0IBuuJJ3AZv3foFx/V9BW78ouOnrYdaKWHg18MFDvWdA7+JqNibp0HrE73oPgPG0vM7t7gUAJKWtR8+IEZX7O3hqF7753zzoXdzQvnVvhAV0F1xPaL+lhlt4+fMhOJmdipc+H4R/DnkLTb388fbqcdBqtBjQ+XH4ePmhX6exeGPVw9i27zu46PR45bEfRe9XaJnQ9rQardmyC1dP48cdizBz9GeVY0/npCE8sCdulRbjWsFFXM7LRkZWMkb1mYWE1B+RcXYvPvvviwCA8UPeRvhdPW3543UqPp7AEN5sjeoo+cgWswyrmoVCWfnb398LvobF5ErigThRY4VyL/vySdH7FapbqB6hjBR6fl4eTZlzCuLpDvRzrDO9SUGE8qV5o8DK3BPKxa6hgyvHT//oHjxwzzQUFF0zOyYSGqvVas3y6NL1c2bHcWKXAcLZDZhn3IShi8zqFjp2FdrPuUvHmXtECqYpLy8vl7sIMkr+AbiWJXcVzmXXgbXwqN/Y7HrD6hJT1yCm4xhR22zkD3QRd8ZknR05csTqOmFhYUhPF74kpkJoaKitSnJaFTeUWz5O3jqqs0WPyNUfzELbsnXOSZFxlljra+aeNNSce4A8PcLcsy1nyj1Aue/nQl5a9KnJ1+/Mnijp/mNjY5GYmCjpPgEgJiaGZ6xUwTMhyKn1jnxI1HpiJyCUxNpBFhF7xDmoOeeqY0+TNewR5+BMuQewr8nxcBJCQTybyV0B2YJSfo5r1qzBmDHqeHMl+1BqjyjlNUTClPzzUWpPk3IotUeU/Loi5f98lNrXShQVFVXrMSczswEAQQEtTf5t7/2qGSchFCSk5jPGiGrl1Vdf5RsS1UipPcIspLpSak+Tcii1R5h7dCeU2tdKtHz58lqPqbiE5J3ZE03+TXXHe84TERERERERkSQ4CUFEREREREREkuAkBJFKffzxx3KXQArHHiG1YU+TNewRUiP2NTkaTkIQqVRERITcJZDCsUdIbdjTZA17hNSIfU2OhpMQRCoVExMjdwmkcOwRUhv2NFnDHiE1Yl+To+EkBBERERERERFJgpMQRCrVtWtXuUsghWOPkNqwp8ka9gipEfuaHA0nIYhUau/evXKXQArHHiG1YU+TNewRUiP2NTkaTkIQERERERERkSQ4CUFEREREREREkuAkBJFKxcfHy10CKRx7hNSGPU3WsEdIjdjX5Gg4CUFEREREREREkuAkBJFKjRo1Su4SSOHYI6Q27Gmyhj1CasS+JkfjIncBZO7ob0D+RbmroNrybAaE9JO7CiLlY8apG7OQqG6YjcrETCO5TZ8+HSkpKbLsOyoqCsuXL7f5djkJoUD5F4FrWXJXQURkH8w4IiJzzEYiEpKSkoLExES5y7ApXo5BpFJTpkyRuwRSOPYIqQ17mqxhj5Aasa/J0XASgkilpk6dKncJpHDsEVIb9jRZwx4hNWJfk6PhJASRSvXp00fuElStvBy4XHD76/NXAUOZfPXUBXuE1IY9bX95Rbf/ffYyUFIqXy11wR4hNWJfk6PhPSGIVCo3N1fuElSnvBw4mQv8ngEcyQZulNx+bPEmwEULBDQBerYFogIBvU6+WsVgj5DasKft4/xV4PdjwKEs4HqVSYilWwCtBvBtDHQLArq2Buq5ylenGOwRUiP2NTkaTkIQEYlwuQD44Q/gWI7ldUrLjJMUJ3OB/6YCD3cHwnylq5GIyJYKi4F1ycC+05bXKSsHsq4Y/2xKBR6IBrq3ATQaycokIiIHw0kIsrtZK2KRfmYPdDo9tFodWjRujbH9X0FMx9Fyl6Zq4eHhcpegGoeygG9/r91px9duAJ/sAGJCgRHRxt8WKg17xH6Ye/JgT9vO2cvApwlA/k3xY27eAn74E0g7B/zjbsBVgUeZ7BH7Ye7Jh31Njob3hCBJjBswD7+8WYB1Cy5jUNcn8fbqsTh36bjcZana2rVr5S5BFQ5lAV/urPt1z4lHgHV7jZdyKA17xL6Ye9JjT9tG1hXgo+21m4Co6uD/52apwbZ12QJ7xL6Ye/JgX5MteHl5SbYvTkKQpHQ6FwzpPgGGslKcOJ8idzmqNn/+fLlLcHhXC4HvfjeebmzJ8nHGPzXZfazm05nlwh6RBnNPOuzpO1dcCny9y3hWgyVicu9INvDrIdvWZgvsEWkw96TFvqYKOp0Ow4YNw6JFi7Bt2zakpqYiJSUFGzduxMKFC9G7d2/BcfPmzUNqairuuusuSep02kmIsrIyLFmyBMHBwXB3d0fHjh2RmJiIkJAQTJw4Ue7yVOtWaQk2Jq0AAPj7tJO5GnWLi4uTuwSHt+Yv4wG5LaxNrvtvFe2FPSIN5p502NN3blMqcKnA+npibEsznlWhJOwRaTD3pMW+Jp1Oh5kzZ+L06dP45Zdf8OKLL6J///6IjIxEx44dMXToUMyfPx87d+7EoUOH8Mgjj1SOnTdvHl577TX4+/ujc+fOktSrwKv1pDF+/HisW7cO8+bNQ+fOnZGUlIRHH30Uubm5mDlzptzlqc7q7W8iLnEJiorzodPpMXP05wjyjZS7LCKLzl4B0s/bbntFJca7yw/uYLttkrIx98jRFBYbc8pWysqB3w4Dj99ju22SsjH3iKQXHByMVatWoVu3bgCAo0eP4scff8TevXtx9uxZaDQaBAcHo3v37hg7diwiIiLw/fff45FHHkF6ejpeeuklGAwGPP7445Jd2uOUkxDff/89vv76ayQkJCAmJgYA0LdvX+zfvx/r1q1DdHS0zBWqz9j+r2DcgLnIv3EVS+PGI/X4DgzpNl7usogsSrLhgXiFPceAeyMArdOeg+ZcmHvkaP46afv7OKSeNZ4F5ulu2+2SMjH3iKTVoUMHbN++HU2bNkVmZiamTJmCjRs3mq2XkpKCuLg4zJkzB0888QSWLFmCESNGYMSIEZUTEKtXr5asbqc8FH7rrbcwePDgygmICm3btoVer0dkZCSuXr2KYcOGoV27dujYsSPuvfdeHD/OG+vcKc/6jTFz9Of488h/kXRovdzlqFpiYqLcJTi0jAu23+b1IiAnz/bbrSv2iDSYe9JhT98Ze+SeoQw4edH2260r9og0mHvSYl87p6ZNm+LXX39F06ZNsWnTJrRv315wAqKqW7du4fPPP8dnn31WuSwzM1PyS3qcbhIiKysLhw4dwujR5h8XlJmZiYiICLi5uUGj0WD69OnIyMhAamoqhg0bhqeeekqGitWnYX1vPNR7Jr7c8jLKysrkLke10tLS5C7BYRUWA5dtdE10dWcVdH00e0Q6zD1psKfvjL3u35B52T7brQv2iHSYe9JhXzunjz76CC1atMDOnTsxcuRI5Ofnixo3b948PP/88zAYDLh48SJat26NOXPm2LlaU053OUZWVhYAoEWLFibLi4qKkJiYiCFDhgAAGjVqhAEDBlQ+3qtXLyxevFjUPjQazR3VuORfO9CxTewdbUPpRvZ+Dut2LcPWfd9iUNcn5S7HJhITE9D10b6S7GvGjBlW11m2bJnV9ZYtW2arklSliX8EHnvH9Lbu1u4Eb+nx6f8x/XrK9DlI/uWdO6hOHFv0iL36wxkyTogac0+IPbNQTKYx9+pGo9Xh2W9N78Rrq9z74JNvMPyTJ+tenEiO/t6oxmxUQ+5JeXwnRMnv53Ux+51PTL6+0/83SaGiZo1GY/JvOfXp0wejR49Gfn4+Hn/8cZSUlIgaV3ETyopLMM6dO4eEhATMnTsXn332GbKzs03WT0xMFP1cy2vxefRONwnh4+MDAMjIyMB9991XuXzx4sXIzs62eEfQ5cuX44EHHpCiRNVZOjnBbFkD94ZY95qCfiVMZMJ+byxyv2mRNJh75GjsmU0ajdOdeOuUmHtE0pkyZQoA4wTTmTNnRI2pPgFRcQ+I+Ph4jBo1Ck8//TRef/11u9Vclaa8NlMWKlBWVoZOnTohOzsbS5YsgZ+fH+Lj47Fp0yZkZmbijz/+QPfu3U3GLFy4EJs3b8Zvv/2G+vXr273G5B+Aa1l23w3ZWCN/oMsj1tezhSNHjlhdJywsDOnp6TWuExoaaquSVCWvCJi/Tty6Fb8JrP6bP0se7g70bFu3umrDFj1ir/5gxqmbPbPQWl8z9+7MnDjjJ/lYU9vciwkFRkrwqW+O/t7IbFQmKY/vhCj5/bwuXlr0qcnX78yeKFMl4lXU/M7siSb/lkpsbKzJfT/c3d1x/fp16HQ6BAQE4Px56x/nZmkCAgD69++Pbdu2IT09HeHh4SbjYmJikJCQYLPnUsHppqa1Wi3i4uIQERGByZMn46mnnoKPjw+mTJkCnU6HyEjTjxF64403sHHjRmzZskWSCQgiW1m4cKHcJTishvWMf+zBv7F9tlsX7BFSG/b0nbFXPrXyts9264I9QmrEvnYukZGRcHV1xeHDh+94AgIAdu3aheLiYoSEhMDDw8NeZZtwukkIAGjXrh127NiBwsJCZGZm4vXXX8fBgwcRHh6OevVu/89j4cKF+OWXX7B161Y0atRIvoKJ6mDMmDFyl+DQ2jSz/Tbd9UDLRrbfbl2xR0ht2NN3JsgOuQcArZvaZ7t1wR4hNWJfO5eIiAgAQGpqqtV1rU1AAEBJSQkOHz4MrVaLsLAwm9crxCknIYQkJyeb3A8iLS0NCxYswOXLlxEbG4uoqChERUXJVyBRLUkVImplj0smurcBXHS2325dsUdIbdjTd6ZHG9vfESe0JdBEml+sicIeITViXzuXAwcO4LXXXkN8fHyN68XExFidgKiwYsUKLFiwADk5ObYuV5DT3ZhSSEFBATIyMvDMM89ULouIiKjVHT7lcun6ecz7ahjO5BzGL28UQKcz/ZFeuHIa0z7ojoBmYXDRuWLRxF9hMJTine8fw9WCHIT4d8WEYYtxs+QGXv9uNG6WFKKBuxfm/mMNruRlm40FgBUbZiAjKxlt/aIxZcT72HtkC37YYbzbf1buUTz74Arc3f4BbE3+Fr/u+wZlZQbMGfsf+Hj5AQDW7lyGXQfXYvmU3UjP/BMrN8yARqNFSKuumDx8mcXtVR8r9rnVtD1x3+NzWJPwLvp2etSsVlKv4OaAv7ftPrLORQv0bmebbTmb6plj7XGhXBHKiwpVc0UoU4WWCWXNqQuHsDx+IrRaHXybtMXzY76ERqMRzCBfn7Zm6xbfKrKaw6P6zDTbVo+wYaJzr6bvgxiXrp/De3FPo/DmdWahCjVuAHQKBPaLu8eZKH35f6M6q+kYT+i1LJRBZWUGs3wQ2q6l/BI6PnR1cTM7xjuVfVDUsZvYPNRoNILHkWLyvnbfYx7jkePZt28f9u3bZ3W9xMRELFy4EBkZGTVOQADAZ599ZqvyROEkBAAPDw8YDAa5y6iThvW9sXjidiz4ZqTFdToHD8RLY1dVfr370E8I8u2IR/vNwYc/T8OJ86k4f/kEQgO64x8D5+M/299E8pEtCPLtaDb2WNZ+FBUXYNkzu/D+2sk4enYvuoYORtfQwQCAaf/ujujgAbh0/RwOnEzEu5O2m9RSUlqME+dTKr9u3igQ7076Da56d7y9ehxOZR8U3J7QWLHPzdL2xNqXsRWd2w0UrLV1yw612hY5Do0GeLQHsHQzUGaD+cghkYCP551vx9kIZU5Iq641Pi70Wq3n5mmWF4B5rghlqtAyoawJbB6O96cmAQDe/fEpZGQlI6RVV8EM0ru4ma178dpZUTlcfVu1zT2h74NY+zK2on/0Y+jd4SFmoUqN7AIcvQAUFt/5troFASEt73w7zsraMV7113KrpiFmuXLhymmzfGjVNMRsu0JjQ1p1xd6jW8xyqV2rLmbHeD5efqKO3cTmYZOGvmb7EJv3tckjHuOR2i1YsEDuEgTxcgwH56p3h2f9mu8klXJiB2Z83BtrdxpndbOvnERQS+MNONv4RuHw6ST4NmmDmyWFAIDComto2KCJ4Nj0zD/Qud1AAEB08AAcPrOncj/Zl0+ikWdz1HPzQPLR/8FQZsALn/THhz9Pg6HMOMmz5a8vMLDLE5VjvBu2gKveHQCg0+qh1eoEtyc0Vuxzs7S96lJPJGDk/MaYtSIW494MxPyvRgAADpxMRGRQTI21KlFsbKzcJTg8v8bW7+g+/T/W7xAf5qvM3wY6Qo/UlDmWHrf0Wq2eF4B5rghlqtAyoaxx0ekrH9e7uKGpVyvTMVUySGhdsTlcfVu1zT2h7VVXUx72ihih2Cx0hJ5WOk93YFxPQFvDdRlicq9lI2k+EaO2HKlHrB3jVX8tC+WKUD4IbddSfgnlkqVjPEDcsVv19YT2LbSP2uR9dWo7xqvOkfqaCOAkhOp5N2yJr2ZnYMmkHdh/bBtOnj+AVk1DcOCE8WNeUo/vQMHNa/DzCUb6mT14ekkEMrKSER7YS3BsQdE11HdrCABo4O6FgqJrlfvafXAd7m5vnFW/WpCDUkMJ3p20HW76+khKW49Swy2knkhAp7b9zOo8ef4ArhfmIrB5uOD2hMaKfW5C2xPSoXUfhLTqhqWTExAZFINnH/wY5eXluFlSaHIAL1SrEq1YsULuElShdwjwQHTdx0f4AU/1BrQKTFtH6JGaMsfa41Vfq0J5UVMmWWMpa5LSNmDCkva4lp9TOYlQoXoGVV9XbA5X31Ztcs/S9qoTk4dKzEJH6GlHEO4HPNnbeBlZXfg1Bp7pB9RztW1dtqCWHrH0Wq6eKzXlQ3VC+SWUS0LHeBWsHbsJrSe0b6F9iM17IWo7xqtOLX1NzkOBh8Uk5EreBcxaEWvy581V1j+02NXFDfVcG0Cnc0GPsGE4nXMIPcLvR3FpEV74pD/0Lm5o7NEcW5O/QY/w+/H582noHjoU2/evEhzbwN0LN4rzAACFxXnwqNeocl970n9Br/DhAIxvDpFBMQCAqLb9kHkxHdv2fYd+ncaa1Zh34wo+/HkqZo3+wmR51e0JjRX73IS2JyT7ykm09A4CAORePwsfLz+cOJ+KIN+OVmtVosmTJ8tdgmrEhgHTBtTu5mp6nfG3gONjAFeFXvimpB6xlHE1ZQ4Ai49Xf60K5YWlTBLDUtb0ihiOz54/BJ9G/vjj8EaTMdUzqPq6YnO4+rZqk3uWtledtTxUahYqqacdXWQr4Pn7gIAm1tetoAHQLwx47l7A004fc3yn1NIjll7L1XOlpnyoTii/hHJJ6BivgrVjN6H1hPYttA+xeS9Ebcd41amlr8l5cBLCQXg3bIGlkxNM/rzy2A9Wx924mV/577TTv6NlkzbQaXWY+sAHeHfSdmi1OnQJGYRylMOzvvGDvBs28EHhzeuCY8MDe+LvY8br8/4+tg1hAT0AGP8Dode5Vs6chwf2wsls46z8ifMpaOndGmdzj+KXPSsw57PBOJOThp93f1B5c7eJw5bAu2GLyv1V357QWLHPTWh7BkMpruab3v31zIU0BLaIgKHMAI3G+NLYf2wrOgcPrBwjVKtSJSQkyF2CqrRpDsweCjzcHfCv4QooT3dgYATw8v1ATGjNpzTLTUk9YinjLGVOBaHHhV6rQnkhlCtiCWVNSenti+jruzWEm/72/8KqZ5DQumJzuPq2xOaepe9DbfNQyVmopJ5WgxZexgmFp3obb9ZriZsLcE8wMHsYMDxauROvgHp6ROi1LJQrlvKhOkv5JZRLQsd4gLhjN6H1hPYttA+xee8Mx3jVqaWvyXko+G2CxCg13MLLnw/ByexUvPT5IPxzyFto3igQm/d+gXH9X8HBU7vwzf/mQe/ihvateyMsoDsuXT+Ht1ePg1ajxYDOj8PHyw/9Oo3FG6sexrZ938FFp8crj/0oOBYA9Hp3zPi4N9r4RiE0oBsAICltPXpGjKisq61fFNz09TBrRSy8Gvjgod4zTGbDp390Dx64Zxp++/t7ZJzdi8/++yIAYPyQtxF+V0+z7U0Yushs7J/pm0Q9N6H6Llw9jR93LMLM0bfvBHs6Jw3hgT1xq7QY1wou4nJeNjKykjGqzywAQOKBOMFayXm4uhg/urNnW6DgJnD2CnC1ECgvB+q7GT9No4mHsiceHE2wf7RZ5lzJu1CZcUKPC+VKftFVs7yoyDTgdq4IZWqwX7TZsqZe/mZZk3RoPeJ3vQfAeApz53b3Vm6/egYlH9litu6N4jxRObxxzycm2xKbewAEt3fu0vFa5WFC6o/MQiei0wIdA4x/ikqArKvApXzAUAa4642XXjRraFyPbKumY7y2vp3MXstCGSSUD0LbvZp3QTC/hI4PG9b3NjvGA8wzR+jYTWg9oTzUarVm+9C7uIrKey+PpjzGI1I4TbkjfA6lk0n+AbiWJXcV6rbrwFp41G9s9VrwxNQ1iOk4RtQ2G/kDXaxfIWMTR44csbpOWFgY0tPTa1wnNDTUViWRwtiiR+zVH8w4ZbF1HtozC631NXPPuTn6eyOz0TYcKdPEUPL7eV28tOhTk6/fmT1RpkrEq6j5ndkTTf4tldjYWCQmJkq2v6piYmLscqYNz4Qgp9Q78iFR64mdgFAiawdZROwRAtSVh+xpsoY9on5qyjSx2NfkaHjyHJFKrVmzRu4SSOHYI6Q27Gmyhj1CasS+JkfDMyEUyLOZ3BVQXSjt5/bqq69izBj1zPKT7cnVI0p7rZBtyfnzZe6RNUruEWajMjnCz0XJfU13LioqqtZjTmZmAwCCAlqa/FuKfYvBSQgFCqn9R9YTETkMZhwRkTlmIxEJWb58ea3HyH0fC2t4OQYRERERERERSYKTEEQq9fHHH8tdAikce4TUhj1N1rBHSI3Y1+RoOAlBpFIRERFyl0AKxx4htWFPkzXsEVIj9jU5Gk5CEKlUTEyM3CWQwrFHSG3Y02QNe4TUiH1NjoaTEEREREREREQkCU5CEBEREREREZEk+BGdRA4oNDTU6jqvvvqqqPVIndgjpEbW+pU97dyYe6RG7GtSI54JQaRSCxYskLsEUjj2CKkNe5qsYY+QGrGvydFwEoKIiIiIiIiIJMFJCCIiIiIiIiKSBCchiIiIiIiIiEgSnIQgIiIiIiIiIklwEoKIiIiIiIiIJMFJCCIiIiIiIiKSBCchZHDvvfciKioKHTp0wKhRo5CXlyd3SURERERERIqVkJCAiIgItG3bFk8//TQMBoPcJVn13HPPwd/fHy4uLnKXItrZs2fRv39/hIWFISIiAnPmzLH5PjgJIYO4uDikpKTg4MGD8Pf3x3vvvSd3SURERERERIpUVlaGp59+GnFxcTh+/Djy8vKwatUqucuyavTo0UhOTpa7jFpxcXHBokWLkJ6ejr///hu7d+/G+vXrbboPTkLIwMvLC4DxxXTz5k1oNBqZKyIiIiIiIlKmvXv3wtfXF+Hh4QCA8ePHY+3atTJXZd0999yDFi1ayF1GrbRs2RJdunQBALi6uqJTp07IzMy06T44CSGTkSNHolmzZjh69ChmzZoldzlERERERESKlJWVhVatWlV+HRAQgLNnz8pYkXO4cuUKfv75ZwwcONCm23Wci1NU5qeffkJJSQnGjx+P+Ph4PPnkk3KXREREREREZDNbdyfj8LEzFh9//6vbZzOEtmmFQX26Ca5XXl5u89osuXT1Olav34bqu6xaa8W/dTotHh95Lxp6NpCsPkvWb92N01k5JsuEagaA6PbB6N01ssbtlZSUYNSoUXjuuecQGhpq01p5JoSMXF1d8cgjj+Cnn36SuxQiIiIiIiKb6hkdgfzCG8i+eBnZFy+bPV6x/Hp+AXpFt7e4nVatWpmc+ZCZmQl/f3+71OzT2AvBd/mb1Vz939kXL6N9u9aKmIAAgHu6ROLy1etWay4uLkG3yJonFQwGA8aOHYuoqCi7nLXPSQiJ5efnIzs7G4DxnhAbNmxARESEzFURERERERHZlkf9enhocB+r6z04qA88PepbfLxLly7IysrC4cOHAQBffPEFHnzwQZvVWd3Ae7qgRVPvGte5y78F+nSr+WwCKTVp3BDD+veqcR0NgDHD+sLNzbXG9SZOnAhPT08sXbrUhhXexkkIieXn52P48OGIjIxEZGQkSktLMXfuXLnLIiIiIiIisrmwtoHo1tHyb96j27dD+5DWNW5Dp9Ph888/x6hRo9CmTRt4eHjgH//4h61LreTiosPDw/pCpxP+77Krqx5jhsZCq635v9OTJk2Cv78/DAYD/P39MWXKFHuUW6lrZAjC2gZYfDymRxTu8q/5Rpm///47vvzySyQnJ6NTp06IiorCv//9b5vWqSmX8gIbqlF5eTk/KYOIiIiIiFSluOQW3v8qHleu5Zssb9TQA9P/OQruVn4zL5fEP1OxOeFPs+UPDemDrlYuaZBLfuENLP8iHoVFN02Wt2zWBFMefwAuOp1Mld3GMyEU5Odfd2PDtt/lLoOIiIiIiMhm3Fz1eHhoX5NfuGoAjBkaq9gJCADo3bUDWrdqabIsrG0gunQIkaki6zwb1MeD1S6B0em0eHhYX0VMQAAKmoRYsGABNBoNDh06hKFDh8LDwwMtW7bEu+++CwDYvHkzoqOjUb9+fXTq1Am7d+82GZ+UlIRBgwbBy8sL9erVQ+/evc3WSU5OxpgxYxAQEIB69eqhbdu2mDZtGq5fv26y3vHjxzFq1Ci0aNECbm5u8PPzw/Dhw3H5svnNVGzl8rU87D1wBMaXIxERERERkXoE+rdAbI+OlV/f0zUSQQG+MlZknVarxeihsXBz1QMAGtR3x0OD+yj+7PWIdnehc4d2lV8P6tPN6j0upKSYSYgKo0ePRr9+/So/j/TFF1/ESy+9hBdeeAEvvvgi4uLiUF5ejhEjRiA/33g6z6+//orY2FhoNBp89dVXiI+Ph6enJ/r374+9e/dWbvv06dPo0KEDPvzwQ2zZsgVz5szB5s2bcd9995nUMHToUJw5cwYffPABtm7dimXLlqF58+YoKiqy2/PesedvaDVaxHbvaH1lIiIiIiIiB9P/7s7wbd4EzX0a494+XeQuRxRvL0/c//83fHxocB94NKgnc0Xi3N+/Fxp7eaJ1q5a4p2sHucsxoZh7QixYsAALFy7EihUr8K9//QsAUFxcjObNm+PGjRvIyMjAXXfdBQD47bff0L9/f8THx+Ohhx5Cu3bt4OPjg927d1feHKS0tBTt27dHUFAQNm3aJLjP0tJS7NmzB3369MHff/+NqKgoXLp0CU2bNsXPP/+MESNG1Om5vLTo0zqNIyIiIiIiInI078yeKHpdxZ0JUfWsBDc3NwQFBSEsLKxyAgIAQkONNwE5e/Ysjh8/jmPHjuGxxx5DWVkZSktLUVpaCgAYMGAAEhMTK8cVFBRg7ty5CA4Ohru7O/R6Pfr0MV4vc/ToUQBAkyZNEBQUhJdeegmffvopjhw5Yu+nTEREREREROQUXOQuoDpvb9NrVVxdXeHu7m62DABu3ryJnJwcAMCUKVMsfuRJUVER6tWrh3/+85/YvHkzFixYgOjoaHh6euLs2bN48MEHKy+10Gg02LZtG1577TXMnTsXubm5lR+nMnv2bFHX/9RmFujytTws/exH9OgUgeEDav5cVyIiIiIiIiJHprhJiNpq0qQJAOPlHEOHDhVcx83NDTdv3sRPP/2E+fPnY9asWZWPVb8pJQC0bt0aX331FcrLy5GWloYvv/wSc+bMgY+PD55++mmrNdXlcoykfYeQtO9QrccRERERERERyak2v4h3+EmIkJAQBAUF4eDBg3j11VctrldcXIzS0lLo9XqT5V9++aXFMRqNBu3bt8d7772HlStX4uDBgzarm4iIiIiIiMjZOPwkhEajwcqVKzF06FCMGDECjz32GJo1a4bc3Fzs378ft27dwrvvvgsvLy/06tULS5YsQfPmzeHr64s1a9bgzz//NNnegQMH8Oyzz2LMmDEIDg4GAMTFxaGoqAiDBg0SVZPYWaD4zYlISTuOFyc9goaeDWr3xImIiIiIiIgcjMNPQgDAwIEDkZSUhDfffBOTJ09Gfn4+mjVrhujoaEyYMKFyvdWrV2Pq1KmYPn06dDodhg0bhh9//BFdutz+eJgWLVrgrrvuwvvvv4+srCzo9XqEhYVhzZo1Zh/leScuX8vD/kMZ6NEpghMQRERERERE5BQU8xGdzubYqSys3bITzzw2gpMQRERERERE5BQ4CSGjsrIyaLWK+5RUIiIiIiIiIrvgJAQRERERERERSYK/hiciIiIiIiIiSXASgoiIiIiIiIgkwUkIIiIiIiIiIpIEJyGIiIiIiIiISBKchCAiIiIiIiIiSXASgoiIiIiIiIgkwUkIIiIiIiIiIpIEJyGIiIiIiIiISBKchCAiIiIiIiIiSXASgoiIiIiIiIgkwUkIIiIiIiIiIpIEJyGIiIiIiIiISBKchCAiIiIiIiIiSXASgoiIiIiIiIgkwUkIIiIiIiIiIpIEJyGIiIiIiIiISBKchCAiIiIiIiIiSXASgoiIiIiIiIgkwUkIIiIiIiIiIpIEJyGIiIiIiIiISBKchCAiIiIiIiIiSXASgoiIiIiIiIgkwUkIIiIiIiIiIpIEJyGIiIiIiIiISBKchCAiIiIiIiIiSXASgoiIiIiIiIgkwUkIIiIiIiIiIpLE/wF3HFs8rSIZPAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc3 = QuantumCircuit(3)\n", + "qc=qc3.compose(student_network)\n", + "qc.assign_parameters(student_model.weight.detach().numpy(), inplace=True)\n", + "\n", + "qc.measure_all()\n", + "qc.decompose().draw(output='mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "c9f00715", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'001': 604, '010': 7, '000': 48, '011': 365}\n" + ] + }, + { + "data": { + "image/png": "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SBpLtBu9F8zs6Ham9zezF7qsViIiImko0c4NTgV6tzP9SOCUQ66NiIhIGosUmmZWbGYtPQGNb/kcviYB0wnGvxQRkR5uwYIFFBQUkJ+fz+233/6Z+ffffz9f/OIXmTBhAmVlZdTWBh3GrV+/nj59+jBhwgQmTJjAFVdc0bpMU1MT06dPZ8yYMXz+85/nySfbG2Y59aI+clJNcAOQA8+2M38vcE1XVUpERNJTc3MzV199NQsXLiQvL49JkyZRXl7O2LFjW8t8+9vfbg3Ep59+mhtuuIEFCxYAcOKJJ7JixYrPrPdnP/sZgwcPZu3atXz66afs3LkzKduTqKihOZKg27x1wJeAd+PmNQHb3L25i+smIiJpZtmyZeTn5zNq1CgApk2bxrx58/YLzf79+7e+//DDDzGzz6ynrd/97ne88cYbAPTq1Ytjjjmmi2veNSJdnnX3De6+3t17uXt1+LnltVmBKSKSGRoaGhg+fHjr57y8PBoaPts696tf/YoTTzyRm266iXvuuad1en19PRMnTmTKlCm8+OKLALz33nsA3HrrrRQXF3P++eezdevW7t2Qg3TA0DSzc83siLj3Hb66v7oiInI4uPrqq3nrrbeYNWsWt912GwDHHXccb7/9Nq+++ip33nkn3/72t9m9ezf79u1j06ZNnHzyydTU1FBaWsqNN96Y4i1oX5TLs3OBocC28H1HHMjqikqJiEh6ys3NZePGja2fN23aRG5uboflp02bxpVXXglATk4OOTk5AJx00kmceOKJrF27lpNOOomjjjqKc88Nzr3OP/98HnjggW7cioN3wDPN8JLstrj3Hb0UmCIiPdykSZOoq6ujvr6epqYmKioqKC8v369MXV1d6/tnnnmG0aNHA/Duu+/S3By05q1bt466ujpGjRqFmXH22WezaNEiAJ5//vn92kjTyUF32C4iIpknOzube++9lzPPPJPm5mYuueQSCgsLmTFjBrFYjPLycu69916ee+45jjjiCAYMGMCcOXMAWLJkCTNmzOCII46gV69e3H///QwcOBCAWbNmceGFF3Lddddx7LHH8uCDD6ZyMztk7p13JZtIW6W7//sh1yiJYrGYV1dXp7oa0g0uvyvVNeg6s69LdQ1EMouZLXf3WHvzorZpRqE2TRER6dGidNieaFd7IiIiPZICUUREJKIog1CfC/yHu39yoPbN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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#choosing the qasm simulator backend\n", + "\n", + "from qiskit.visualization import plot_histogram\n", + "\n", + "backend = Aer.get_backend('qasm_simulator')\n", + "\n", + "# running the job and getting results (counts)\n", + "job = execute(qc, backend, shots=1024) # shots = no. of times you want to run the experiment\n", + "result = job.result()\n", + "counts = result.get_counts(qc)\n", + "\n", + "#printing and visualizing results (histogram data of experiment)\n", + "print(counts)\n", + "plot_histogram(counts)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4078e87c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Compaqt/three_qubit_ae_circuit.ipynb b/Compaqt/three_qubit_ae_circuit.ipynb new file mode 100644 index 0000000..6169c7e --- /dev/null +++ b/Compaqt/three_qubit_ae_circuit.ipynb @@ -0,0 +1,520 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 39, + "id": "5f99be15-a9b3-402e-8b2f-b0a142e6f795", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ibmqfactory.load_account:WARNING:2022-07-26 18:36:14,318: Credentials are already in use. The existing account in the session will be replaced.\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "\n", + "# Importing standard Qiskit libraries\n", + "from qiskit import QuantumCircuit, transpile, Aer, IBMQ, execute\n", + "from qiskit.tools.jupyter import *\n", + "from qiskit.visualization import *\n", + "from ibm_quantum_widgets import *\n", + "from qiskit.providers.aer import QasmSimulator\n", + "\n", + "# Loading your IBM Quantum account(s)\n", + "provider = IBMQ.load_account()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "9fa501bd-67b9-4276-a95d-59c45c52f897", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "%matplotlib inline\n", + "import numpy as np\n", + "\n", + "from qiskit import Aer, QuantumCircuit\n", + "from qiskit.utils import QuantumInstance\n", + "from qiskit.algorithms import IterativeAmplitudeEstimation, EstimationProblem\n", + "from qiskit.circuit.library import LinearAmplitudeFunction\n", + "from qiskit_finance.circuit.library import LogNormalDistribution" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "a7e4e5cd-cf99-46b7-a680-413eb1226cf2", + "metadata": {}, + "outputs": [], + "source": [ + "#number of qubits to represent the uncertainty\n", + "num_uncertainty_qubits = 1\n", + "\n", + "# parameters for considered random distribution\n", + "S = 2.0 # initial spot price\n", + "vol = 0.4 # volatility of 40%\n", + "r = 0.05 # annual interest rate of 4%\n", + "T = 40 / 365 # 40 days to maturity\n", + "\n", + "# resulting parameters for log-normal distribution\n", + "mu = (r - 0.5 * vol**2) * T + np.log(S)\n", + "sigma = vol * np.sqrt(T)\n", + "mean = np.exp(mu + sigma**2 / 2)\n", + "variance = (np.exp(sigma**2) - 1) * np.exp(2 * mu + sigma**2)\n", + "stddev = np.sqrt(variance)\n", + "\n", + "# lowest and highest value considered for the spot price; in between, an equidistant discretization is considered.\n", + "low = np.maximum(0, mean - 3 * stddev)\n", + "high = mean + 3 * stddev\n", + "\n", + "# construct A operator for QAE for the payoff function by\n", + "# composing the uncertainty model and the objective\n", + "uncertainty_model = LogNormalDistribution(\n", + " num_uncertainty_qubits, mu=mu, sigma=sigma**2, bounds=(low, high)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "84420bb7-a07e-44e3-a508-2fc9d334ea83", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# set the strike price (should be within the low and the high value of the uncertainty)\n", + "strike_price = 1.896\n", + "\n", + "# set the approximation scaling for the payoff function\n", + "c_approx = 0.25\n", + "\n", + "# setup piecewise linear objective fcuntion\n", + "breakpoints = [low, strike_price]\n", + "slopes = [0, 1]\n", + "offsets = [0, 0]\n", + "f_min = 0\n", + "f_max = high - strike_price\n", + "european_call_objective = LinearAmplitudeFunction(\n", + " num_uncertainty_qubits,\n", + " slopes,\n", + " offsets,\n", + " domain=(low, high),\n", + " image=(f_min, f_max),\n", + " breakpoints=breakpoints,\n", + " rescaling_factor=c_approx,\n", + ")\n", + "\n", + "# construct A operator for QAE for the payoff function by\n", + "# composing the uncertainty model and the objective\n", + "num_qubits = european_call_objective.num_qubits\n", + "european_call = QuantumCircuit(num_qubits)\n", + "european_call.append(uncertainty_model, range(num_uncertainty_qubits))\n", + "european_call.append(european_call_objective, range(num_qubits))\n", + "\n", + "# draw the circuit\n", + "european_call.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "27857bab-30de-4add-9d47-bbaeadf5eec8", + "metadata": {}, + "outputs": [], + "source": [ + "# set target precision and confidence level\n", + "epsilon = 0.01\n", + "alpha = 0.05\n", + "\n", + "qi = QuantumInstance(Aer.get_backend(\"aer_simulator\"), shots=100)\n", + "problem = EstimationProblem(\n", + " state_preparation=european_call,\n", + " objective_qubits=[1],\n", + " post_processing=european_call_objective.post_processing,\n", + ")\n", + "# construct amplitude estimation\n", + "ae = IterativeAmplitudeEstimation(epsilon, alpha=alpha, quantum_instance=qi)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "cb0b453a-3d66-4bfe-9120-8906e2510e15", + "metadata": {}, + "outputs": [], + "source": [ + "ae_circuit = ae.construct_circuit(problem)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "1f32a00d-1e7c-4e2c-a387-efc9a5078f3e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ae_circuit.decompose().draw(\n", + " \"mpl\", style=\"iqx\"\n", + ") # decompose 1 level: exposes the Phase estimation circuit!" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "81a4c3ae-9e09-4e7e-98a3-19d9d8a2c2e1", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc2 = QuantumCircuit(3)\n", + "qc=qc2.compose(ae_circuit)\n", + "qc.measure_all()\n", + "qc.draw()#.savefig('qae_circuit.pdf')" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "e7a8aaf5-5bf8-4492-9499-dae99af0b149", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'010': 14, '000': 56, '001': 276, '011': 678}\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcQAAAFCCAYAAABvtq3aAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAlXElEQVR4nO3de3RV9Z338fcXAgEaGCEWkCQ0xEDGBOXioUiNXOqFSp9J0VKh2tpWxarUjtpanz6DPF6mVpcOg63L2kGnXgdUno5YO1BsKSA2QgOCQJRESZBE7qiAxUDi9/ljn9AQE8iRk32SnM9rrSzO+e29T757/XL47Mtv723ujoiISLLrlOgCRERE2gIFooiICApEERERQIEoIiICKBBFREQASEl0Aa3l1FNP9ezs7ESXISIibciaNWv2uPvnm5rWYQMxOzubkpKSRJchIiJtiJltbW6aDpmKiIigQBQREQEUiCIiIoACUUREBFAgioiIAApEERERQIEoIiICKBBFREQABaKIiAigQBQREQEUiCIiIoACUUREBFAgioiIAApEERERQIEoIiICKBBFREQABaKIiAigQBQREQEUiCIiIoACUUREBFAgioiIAApEERERQIEoIiICKBBFRKSBxYsXk5eXR25uLvfee2+T8zz33HPk5+dTUFDA5ZdffrT93Xff5aKLLuKMM84gPz+fyspKAK644gry8vIYOnQoV111FUeOHAljVWKmQBQREQDq6uqYMWMGixYtorS0lHnz5lFaWnrMPOXl5fz85z/n1VdfZdOmTcyZM+fotCuvvJJbb72VN998k9WrV9O3b18gCMS33nqLDRs2cOjQIR599NEwV6vFFIgiIgLA6tWryc3NJScnh65duzJt2jQWLlx4zDxz585lxowZ9O7dG+Bo6JWWllJbW8uFF14IQFpaGj169ABg0qRJmBlmxhe/+EWqqqpCXKuWUyCKiAgA1dXVZGVlHX2fmZlJdXX1MfOUlZVRVlbGueeeyznnnMPixYuPtp9yyilceumljBgxgltvvZW6urpjlj1y5AhPPfUUX/nKV1p/ZT6DlEQXICIi7UdtbS3l5eUsW7aMqqoqxo4dy4YNG6itreWVV17h9ddfZ+DAgUydOpXHH3+cq6+++uiyN9xwA2PHjuW8885L4Bo0T3uIIiICQEZGBtu2bTv6vqqqioyMjGPmyczMpKioiC5dujBo0CCGDBlCeXk5mZmZDB8+nJycHFJSUpg8eTJr1649utydd97J7t27mT17dmjrEysFooiIADBq1CjKy8upqKjg8OHDzJ8/n6KiomPmmTx5MsuWLQNgz549lJWVkZOTw6hRo/jggw/YvXs3AEuXLiU/Px+ARx99lD/84Q/MmzePTp3abuy03cpERCRUKSkpPPTQQ0ycOJEzzjiDyy67jIKCAmbNmsWLL74IwMSJE0lPTyc/P58JEyZw//33k56eTufOnXnggQc4//zzOfPMM3F3pk+fDsB1113Hzp07GTNmDMOHD+euu+5K5Go2y9w90TW0ikgk4iUlJYkuQ0RE2hAzW+PukaamaQ9RREQEBaKIiAigQBQREQEUiCIiIoACUUREBFAgioiIAApEERERQIEoIiICKBBFREQABaKIiAigQBQREQEUiCIiIoAeECwi0mFNn5PoCuJn7k2t/zu0hygiIoICUUREBFAgioiIAApEERERQIEoIiICKBBFREQABaKIiAigQBQREQEUiCIiIoACUUREBFAgioiIAApEERERQIEoIiICKBBFREQABaKIiAigQBQREQESEIhmdoOZVZjZx2a2xszOO8H8Xc3srugyNWb2rpn9MKx6RUQkOaSE+cvMbCrwIHADsDL67yIzy3f3d5tZbD6QCVwLlAP9gO4hlCsiIkkk1EAEbgEed/e50fc3mtlXgOuBnzae2cwuAs4HTnf3PdHmyjAKFRGR5BLaIVMz6wqcDSxpNGkJ8KVmFpsM/BW4xcyqzKzczH5hZmmtV6mIiCSjMPcQTwU6Azsbte8ELmhmmRygEKgBvg6cAvwSGABMaTyzmV1LcGiVAQMGsGzZsuBDcnLo2bMn69evByA9PZ2CggJWrFgBQEpKCoWFhaxdu5b9+/cDEIlE2LlzJ9u2bQNg8ODBpKamsnHjRgD69u3LkCFDWLlyJQCpqamMGTOGkpISDh48CMDo0aOpqqqiuroagLy8PDp37kxpaSkA/fv3Z9CgQRQXFwPQvXt3Ro8ezapVqzh06BAAY8aMoaKigh07dgCQn59PXV0dmzdvBiAjI4PMzExWrVoFQFpaGpFIhOLiYmpqagAoLCykrKyMXbt2ATB06FBqamooLy8HICsri379+lFSUgJAr169GDlyJCtXrqS2thaAsWPHsmnTJvbu3QvA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9JqaGqZOnUpubi6jR4+msrISgMrKSrp3787w4cMZPnw411133dFlxo8fT15e3tFpu3btCmt1RESSQkqiC+ho6urqmDFjBi+//DKZmZmMGjWKoqIi8vPzj87z2GOP0bt3b95++23mz5/PbbfdxrPPPgvA6aefzrp165r87GeeeYZIJBLGaoiIJB3tIcbZ6tWryc3NJScnh65duzJt2jQWLlx4zDwLFy7kO9/5DgBTpkzhT3/6E+6eiHJFRCRKgRhn1dXVZGVlHX2fmZlJdXV1s/OkpKTwD//wD+zduxeAiooKRowYwbhx43jllVeOWe573/sew4cP5+6771aAiojEmQ6ZtiGnnXYa7777Lunp6axZs4bJkyezadMmevXqxTPPPENGRgYHDhzg61//Ok899RRXXnlloksWEekwtIcYZxkZGWzbtu3o+6qqKjIyMpqdp7a2lg8//JD09HRSU1NJT08H4Oyzz+b000+nrKzs6DIAPXv25PLLL2f16tVhrI6ISNJQIMbZqFGjKC8vp6KigsOHDzN//nyKioqOmaeoqIgnnngCgAULFvDlL38ZM2P37t3U1dUBsGXLFsrLy8nJyaG2tpY9e/YAcOTIEV566SWGDh0a7oqJiHRwOmQaZykpKTz00ENMnDiRuro6rrrqKgoKCpg1axaRSISioiKuvvpqvv3tb5Obm0ufPn2YP38+ACtWrGDWrFl06dKFTp068cgjj9CnTx8++ugjJk6cyJEjR6irq+OCCy5g+vTpCV5TEZGOxTrq4IxIJOIlJSWJLkNayfQ5ia4gPubelOgKpCPrKN8TiN93xczWuHuT16/pkKmIiAg6ZHpC2sISEUkO2kMUERFBgSgiIgIoEEVERAAFooiICKBAFJEE+qyPStu7dy8TJkwgLS2NH/zgB01+dlFRkW5gITFRIIpIQtQ/Km3RokWUlpYyb948SktLj5mn4aPSbr75Zm677TYAunXrxt13380DDzzQ5Gf/9re/JS0trdXXQToWBaKIJMTJPCrtc5/7HIWFhXTr1u1Tn3vw4EFmz57NzJkzQ1kP6TgUiCKSECf7qLTm3H777fzoRz+iR48e8S9aOjQFooh0GOvWreOdd97hkksuSXQp0g4pEEUkIU7mUWnNKS4upqSkhOzsbAoLCykrK2P8+PGtUr90PApEEUmIk3lUWnOuv/563nvvPSor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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#choosing the qasm simulator backend\n", + "\n", + "backend = Aer.get_backend('qasm_simulator')\n", + "\n", + "# running the job and getting results (counts)\n", + "job = execute(qc, backend, shots=1024) # shots = no. of times you want to run the experiment\n", + "result = job.result()\n", + "counts = result.get_counts(qc)\n", + "\n", + "#printing and visualizing results (histogram data of experiment)\n", + "print(counts)\n", + "plot_histogram(counts)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "87dc200a-ffab-4d52-ab9b-a4917b5fa235", + "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.8.13" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": { + "0896113746a0475e955d5c374e16b677": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "margin": "0px 0px 0px 37px", + "width": "600px" + } + }, + "0a445a7a896e48c88d10bfc9ddb16d56": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "grid_area": "right", + "padding": "0px 0px 0px 0px", + "width": "70px" + } + }, + "183a878708724c7cb5bedf95ae67b2c5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "width": "190px" + } + }, + "19061323ac0f4b8d86706e88dd6c2fd8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "1c8eba4202bd41169f960e819f6f9f62": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "margin": "0px 0px 10px 0px" + } + }, + "20e857b040e940e0a5c295c85ab7c5cd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "490f64ee1a05466db2ccf6916fb902ac": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonModel", + "state": { + "button_style": "primary", + "description": "Clear", + "layout": "IPY_MODEL_0a445a7a896e48c88d10bfc9ddb16d56", + "style": "IPY_MODEL_c3e7eb3dd970471fafe0d88a731e428d" + } + }, + "49c725f8317e4bbcbea138a6a3d8c7f2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "width": "70px" + } + }, + "50c6e20662324391addd28659ffb9467": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "children": [ + "IPY_MODEL_f27536a36a68454cac108225494cf10c", + "IPY_MODEL_7d4b291b63164b15a6f6340555495b92", + "IPY_MODEL_c640d80b40864d9fb7767e08cfbcbd8c", + "IPY_MODEL_ca7464ced777416fbcc2d12b0117ae18", + "IPY_MODEL_a55c1d99ccc3419e92e2247bc06a5118" + ], + "layout": "IPY_MODEL_0896113746a0475e955d5c374e16b677" + } + }, + "51469f5c10854add855b9f85367f7bef": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "667806b28b2841ef8aa921b116499e3f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "width": "145px" + } + }, + "6db22bf201c745fb869adb35472b594c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "GridBoxModel", + "state": { + "children": [ + "IPY_MODEL_490f64ee1a05466db2ccf6916fb902ac" + ], + "layout": "IPY_MODEL_d33010831d6e421d9f68d6cd03a8be3b" + } + }, + "7c17bda266224be883edf55bc6b4bde8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "width": "95px" + } + }, + "7d4b291b63164b15a6f6340555495b92": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_667806b28b2841ef8aa921b116499e3f", + "style": "IPY_MODEL_20e857b040e940e0a5c295c85ab7c5cd", + "value": "
Backend
" + } + }, + "9db88b56224b41a09e981b3479df2206": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "a55c1d99ccc3419e92e2247bc06a5118": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_f094ba572d4e4fa9bd4e9e18eaf9c7d3", + "style": "IPY_MODEL_19061323ac0f4b8d86706e88dd6c2fd8", + "value": "
Message
" + } + }, + "b61947f905ec4486988762e68be73044": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_1c8eba4202bd41169f960e819f6f9f62", + "style": "IPY_MODEL_9db88b56224b41a09e981b3479df2206", + "value": "

Circuit Properties

" + } + }, + "c3e7eb3dd970471fafe0d88a731e428d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonStyleModel", + "state": {} + }, + "c640d80b40864d9fb7767e08cfbcbd8c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_7c17bda266224be883edf55bc6b4bde8", + "style": "IPY_MODEL_e9c2da93d6574d75939a634692c6430c", + "value": "
Status
" + } + }, + "c80b15805dd1451499cbea5c91366d56": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "ca7464ced777416fbcc2d12b0117ae18": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_49c725f8317e4bbcbea138a6a3d8c7f2", + "style": "IPY_MODEL_51469f5c10854add855b9f85367f7bef", + "value": "
Queue
" + } + }, + "d33010831d6e421d9f68d6cd03a8be3b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "grid_template_areas": "\n \". . . . right \"\n ", + "grid_template_columns": "20% 20% 20% 20% 20%", + "width": "100%" + } + }, + "e9c2da93d6574d75939a634692c6430c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "f094ba572d4e4fa9bd4e9e18eaf9c7d3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "f27536a36a68454cac108225494cf10c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_183a878708724c7cb5bedf95ae67b2c5", + "style": "IPY_MODEL_c80b15805dd1451499cbea5c91366d56", + "value": "
Job ID
" + } + } + }, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Compaqt/three_qubit_ae_circuit_noisy-qkrt.ipynb b/Compaqt/three_qubit_ae_circuit_noisy-qkrt.ipynb new file mode 100644 index 0000000..18fda1b --- /dev/null +++ b/Compaqt/three_qubit_ae_circuit_noisy-qkrt.ipynb @@ -0,0 +1,471 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "id": "5f99be15-a9b3-402e-8b2f-b0a142e6f795", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Importing standard Qiskit libraries\n", + "from qiskit import QuantumCircuit, transpile, Aer, IBMQ, execute\n", + "from qiskit.tools import *\n", + "from qiskit.visualization import *\n", + "from ibm_quantum_widgets import *\n", + "from qiskit.providers.aer import QasmSimulator\n", + "\n", + "# Loading your IBM Quantum account(s)\n", + "provider = IBMQ.load_account()" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "9fa501bd-67b9-4276-a95d-59c45c52f897", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":219: RuntimeWarning: scipy._lib.messagestream.MessageStream size changed, may indicate binary incompatibility. Expected 56 from C header, got 64 from PyObject\n" + ] + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "%matplotlib inline\n", + "import numpy as np\n", + "\n", + "from qiskit import Aer, QuantumCircuit\n", + "from qiskit.utils import QuantumInstance\n", + "from qiskit.algorithms import IterativeAmplitudeEstimation, EstimationProblem\n", + "from qiskit.circuit.library import LinearAmplitudeFunction\n", + "from qiskit_finance.circuit.library import LogNormalDistribution" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a7e4e5cd-cf99-46b7-a680-413eb1226cf2", + "metadata": {}, + "outputs": [], + "source": [ + "#number of qubits to represent the uncertainty\n", + "num_uncertainty_qubits = 1\n", + "\n", + "# parameters for considered random distribution\n", + "S = 2.0 # initial spot price\n", + "vol = 0.4 # volatility of 40%\n", + "r = 0.05 # annual interest rate of 4%\n", + "T = 40 / 365 # 40 days to maturity\n", + "\n", + "# resulting parameters for log-normal distribution\n", + "mu = (r - 0.5 * vol**2) * T + np.log(S)\n", + "sigma = vol * np.sqrt(T)\n", + "mean = np.exp(mu + sigma**2 / 2)\n", + "variance = (np.exp(sigma**2) - 1) * np.exp(2 * mu + sigma**2)\n", + "stddev = np.sqrt(variance)\n", + "\n", + "# lowest and highest value considered for the spot price; in between, an equidistant discretization is considered.\n", + "low = np.maximum(0, mean - 3 * stddev)\n", + "high = mean + 3 * stddev\n", + "\n", + "# construct A operator for QAE for the payoff function by\n", + "# composing the uncertainty model and the objective\n", + "uncertainty_model = LogNormalDistribution(\n", + " num_uncertainty_qubits, mu=mu, sigma=sigma**2, bounds=(low, high)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "84420bb7-a07e-44e3-a508-2fc9d334ea83", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# set the strike price (should be within the low and the high value of the uncertainty)\n", + "strike_price = 1.896\n", + "\n", + "# set the approximation scaling for the payoff function\n", + "c_approx = 0.25\n", + "\n", + "# setup piecewise linear objective fcuntion\n", + "breakpoints = [low, strike_price]\n", + "slopes = [0, 1]\n", + "offsets = [0, 0]\n", + "f_min = 0\n", + "f_max = high - strike_price\n", + "european_call_objective = LinearAmplitudeFunction(\n", + " num_uncertainty_qubits,\n", + " slopes,\n", + " offsets,\n", + " domain=(low, high),\n", + " image=(f_min, f_max),\n", + " breakpoints=breakpoints,\n", + " rescaling_factor=c_approx,\n", + ")\n", + "\n", + "# construct A operator for QAE for the payoff function by\n", + "# composing the uncertainty model and the objective\n", + "num_qubits = european_call_objective.num_qubits\n", + "european_call = QuantumCircuit(num_qubits)\n", + "european_call.append(uncertainty_model, range(num_uncertainty_qubits))\n", + "european_call.append(european_call_objective, range(num_qubits))\n", + "\n", + "# draw the circuit\n", + "european_call.draw(output='mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "27857bab-30de-4add-9d47-bbaeadf5eec8", + "metadata": {}, + "outputs": [], + "source": [ + "# set target precision and confidence level\n", + "epsilon = 0.01\n", + "alpha = 0.05\n", + "\n", + "qi = QuantumInstance(Aer.get_backend(\"aer_simulator\"), shots=100)\n", + "problem = EstimationProblem(\n", + " state_preparation=european_call,\n", + " objective_qubits=[1],\n", + " post_processing=european_call_objective.post_processing,\n", + ")\n", + "# construct amplitude estimation\n", + "ae = IterativeAmplitudeEstimation(epsilon, alpha=alpha, quantum_instance=qi)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cb0b453a-3d66-4bfe-9120-8906e2510e15", + "metadata": {}, + "outputs": [], + "source": [ + "ae_circuit = ae.construct_circuit(problem)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "1f32a00d-1e7c-4e2c-a387-efc9a5078f3e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ae_circuit.decompose().draw(\n", + " \"mpl\", style=\"iqx\"\n", + ") # decompose 1 level: exposes the Phase estimation circuit!" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "81a4c3ae-9e09-4e7e-98a3-19d9d8a2c2e1", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc2 = QuantumCircuit(3)\n", + "qc=qc2.compose(ae_circuit)\n", + "qc.measure_all()\n", + "qc.draw()#.savefig('qae_circuit.pdf')" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "e7a8aaf5-5bf8-4492-9499-dae99af0b149", + "metadata": {}, + "outputs": [], + "source": [ + "# #choosing the qasm simulator backend\n", + "\n", + "# backend = Aer.get_backend('qasm_simulator')\n", + "\n", + "# # running the job and getting results (counts)\n", + "# job = execute(qc, backend, shots=1024) # shots = no. of times you want to run the experiment\n", + "# result = job.result()\n", + "# counts = result.get_counts(qc)\n", + "\n", + "# #printing and visualizing results (histogram data of experiment)\n", + "# print(counts)\n", + "# plot_histogram(counts)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "87dc200a-ffab-4d52-ab9b-a4917b5fa235", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "provider.backends()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "2be7dab5-4dd9-41b7-94d5-93279a9b215d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ibm_oslo ibm_nairobi ibmq_manila\n", + "-------- ----------- -----------\n", + "Num. Qubits: 7 Num. Qubits: 7 Num. Qubits: 5\n", + "Pending Jobs: 6 Pending Jobs: 23 Pending Jobs: 7\n", + "Least busy: False Least busy: False Least busy: False\n", + "Operational: True Operational: True Operational: True\n", + "Avg. T1: 123.3 Avg. T1: 121.9 Avg. T1: 152.5\n", + "Avg. T2: 98.7 Avg. T2: 53.3 Avg. T2: 58.2\n", + "\n", + "\n", + "\n", + "ibmq_quito ibmq_belem ibmq_lima\n", + "---------- ---------- ---------\n", + "Num. Qubits: 5 Num. Qubits: 5 Num. Qubits: 5\n", + "Pending Jobs: 1 Pending Jobs: 0 Pending Jobs: 0\n", + "Least busy: False Least busy: True Least busy: False\n", + "Operational: True Operational: True Operational: True\n", + "Avg. T1: 92.1 Avg. T1: 89.2 Avg. T1: 92.4\n", + "Avg. T2: 98.3 Avg. T2: 107.7 Avg. T2: 115.9\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "backend_overview()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "1773a7f2-6f13-4174-a637-d7f1147a4f24", + "metadata": {}, + "outputs": [], + "source": [ + "backend=provider.get_backend('ibmq_manila')" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "28e12cbe-5258-4eeb-8a1a-035ea6daf04c", + "metadata": {}, + "outputs": [], + "source": [ + "#Execute the circuit on the backend\n", + "job=execute(qc,backend,shots=1024)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "dac27a5c-52f3-453d-a39e-9d005b17d9fc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "job.status()" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "2453d1a9-18cc-478e-9781-7542255dd9ff", + "metadata": {}, + "outputs": [], + "source": [ + "result=job.result()\n", + "counts=result.get_counts()\n", + "histogram = plot_histogram(counts,title=\"QAE on IBMQ_Manila\")\n", + "histogram.savefig('qae_manila.pdf')\n" + ] + }, + { + "cell_type": "markdown", + "id": "74cb07a4-9925-4ee4-bded-eb7e57c65d3d", + "metadata": {}, + "source": [ + "## Qiskit Runtime" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "955bd769-1e9a-4090-836e-b14725191933", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SamplerResult(quasi_dists=[{'010': 0.0146484375, '000': 0.0367431640625, '011': 0.658447265625, '001': 0.2901611328125}], metadata=[{'header_metadata': {}, 'shots': 8192}])\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from qiskit_ibm_runtime import QiskitRuntimeService, Sampler\n", + "\n", + "service = QiskitRuntimeService()\n", + "\n", + "with Sampler(circuits=qc, service=service,\n", + " #options={'backend': backend},\n", + " options={\"backend\": \"ibmq_qasm_simulator\"},\n", + " #options={\"backend\": \"ibmq_belem\"},\n", + " #skip_transpilation=True\n", + " ) as sampler:\n", + " result = sampler(circuits=[0], shots=8192)\n", + " print(result)\n", + " \n", + "plot_histogram(result.quasi_dists)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "30cf768e-4346-4935-b06b-df004bfe1625", + "metadata": {}, + "outputs": [], + "source": [ + "histogram=plot_histogram(result.quasi_dists, title=\"QAE on IBMQ_Belem, shots = 8192\")\n", + "histogram.savefig('qae_belem-8192.pdf')" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "86b48874-7acc-4937-9596-f087ddcf8289", + "metadata": {}, + "outputs": [], + "source": [ + "histogram=plot_histogram(result.quasi_dists, title=\"QAE on Simulator, shots = 8192\")\n", + "histogram.savefig('qae_sim-8192.pdf')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4e7b0289-6de4-45ec-926b-6671fc9bb402", + "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.8.13" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Compaqt/three_qubit_ae_circuit_noisy.ipynb b/Compaqt/three_qubit_ae_circuit_noisy.ipynb new file mode 100644 index 0000000..853152e --- /dev/null +++ b/Compaqt/three_qubit_ae_circuit_noisy.ipynb @@ -0,0 +1,809 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 11, + "id": "5f99be15-a9b3-402e-8b2f-b0a142e6f795", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ibmqfactory.load_account:WARNING:2022-07-26 21:38:19,487: Credentials are already in use. The existing account in the session will be replaced.\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "\n", + "# Importing standard Qiskit libraries\n", + "from qiskit import QuantumCircuit, transpile, Aer, IBMQ, execute\n", + "from qiskit.tools.jupyter import *\n", + "from qiskit.visualization import *\n", + "from ibm_quantum_widgets import *\n", + "from qiskit.providers.aer import QasmSimulator\n", + "\n", + "# Loading your IBM Quantum account(s)\n", + "provider = IBMQ.load_account()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "9fa501bd-67b9-4276-a95d-59c45c52f897", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "%matplotlib inline\n", + "import numpy as np\n", + "\n", + "from qiskit import Aer, QuantumCircuit\n", + "from qiskit.utils import QuantumInstance\n", + "from qiskit.algorithms import IterativeAmplitudeEstimation, EstimationProblem\n", + "from qiskit.circuit.library import LinearAmplitudeFunction\n", + "from qiskit_finance.circuit.library import LogNormalDistribution" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "a7e4e5cd-cf99-46b7-a680-413eb1226cf2", + "metadata": {}, + "outputs": [], + "source": [ + "#number of qubits to represent the uncertainty\n", + "num_uncertainty_qubits = 1\n", + "\n", + "# parameters for considered random distribution\n", + "S = 2.0 # initial spot price\n", + "vol = 0.4 # volatility of 40%\n", + "r = 0.05 # annual interest rate of 4%\n", + "T = 40 / 365 # 40 days to maturity\n", + "\n", + "# resulting parameters for log-normal distribution\n", + "mu = (r - 0.5 * vol**2) * T + np.log(S)\n", + "sigma = vol * np.sqrt(T)\n", + "mean = np.exp(mu + sigma**2 / 2)\n", + "variance = (np.exp(sigma**2) - 1) * np.exp(2 * mu + sigma**2)\n", + "stddev = np.sqrt(variance)\n", + "\n", + "# lowest and highest value considered for the spot price; in between, an equidistant discretization is considered.\n", + "low = np.maximum(0, mean - 3 * stddev)\n", + "high = mean + 3 * stddev\n", + "\n", + "# construct A operator for QAE for the payoff function by\n", + "# composing the uncertainty model and the objective\n", + "uncertainty_model = LogNormalDistribution(\n", + " num_uncertainty_qubits, mu=mu, sigma=sigma**2, bounds=(low, high)\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "84420bb7-a07e-44e3-a508-2fc9d334ea83", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKoAAACoCAYAAABwvnWJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAALhUlEQVR4nO3de1CVBRrH8R/3i6Bk5AUaVG6uoqBSs0gXoBCvGU6aoIPBULJiW27aqhkuBFKa03WdzHak1fKyIltAiJsIR12syUhQtgkJkKXQ8EKKcj/sH+ZZjqCcIxze99HfZ4Y/fH2P7xN8O+85WDxmHR0dHSBSOXOlByAyBEMlERgqicBQSQSGSiIwVBKBoZIIDJVEYKgkAkMlERgqicBQSQSGSiIwVBKBoZIIDJVEYKgkAkMlERgqicBQSQSGSiIwVBKBoZIIDJVEYKgkAkMlESyVHkDtfjgIXP5FmWs7DgFGP3Z7j1Vq7t7MfCsMtQeXfwHqa5SewnhS574Z3vpJBIZKIjBUEoGhkggMlURgqCQCQyURGCqJwFD7WNbRzXhjZ5RRj3nh/ckoOpVnoonuDKoOVavVYuPGjfDy8oKtrS38/Pyg0WgwevRoLF68WJGZln8QjBmrbPDEGgc8mTAIf3h7Ig6X7AUANLZcwbb9a7FoSiIAoLWtBXFvTcDmrOV6f0bG4XexcN0INDTWAwCiwhKxOfNP/TJ/u7YdW7JfxtzE+zD7VUck/f0p/HrlXL9cuzdUHWpsbCySk5MRFxeHffv24emnn0ZkZCQqKirg7++v2FwLQxOQta4BGYnnETIhEimfzkdNXRnyvv0EI4ePh4uzBwDAytIaqxd8ii+ObsZ35QcBAJW1J5C27xX8OWIbHOycAAD+XlPQ0HhRd44p7cp/A4Wln+P9P36NnWuu/R3reiPvAEpQbag7d+7Exx9/jMzMTKxYsQIhISFYs2YNJk+ejLa2NkyaNEnpEWFhYYnZgfHQattRWXsChaWfwd9rit45I4f5IGZ6Kt7cHY0Ll87g9R0LMfuh5+HnEaQ7x9zcHBM8H0fhyc9MPnPOV1swP2Qlht/rjgF2g/DczA345odcnL142uTX7g3Vhpqamopp06YhKChI77inpyesrKzg6+sLAKiqqkJQUBC8vb0xfvx4HD58uN9mbG1rweeFm2BpYQV3Fz+c+qkIbkPHdjlvzsMvwG3IGMS95QsLC0tET03ucs6o4eNx6qcik87b0FiPX+qr4eX6/7uRi7MH7G0H4sefi0167d5SZag1NTU4efIk5s2b1+X3qqur4ePjAxsbGwBAXFwc5s+fj7KyMnz44YeIiIhAS0tLj9cwMzMz6EOjKejy2B156xCe4IQFKffjaOnnWLtoL1ydPdHQeBEDbAd2ey0/j2DUX6lD6KQoWFladzlngO1AXL56Qe+YRlNg8JyGzH21+fK1a9kN0jvuYOuEq02XevycGcLYmQ2lyv/Mr6bm2munYcOG6R1vbGyERqPB9OnTAQDnzp3DkSNHkJmZCQAIDAyEi4sL8vPzMXXqVJPNt+DxNVgY+mqX4w529+BKN1/wytoT2HEgBfNDVmL7l0l4ZPxTGHKPm945V5ouwdF+sMlmBgB7G8dr12r8Ve94Q1M97Lv5F0xNVPmM6uzsDAAoKyvTO75hwwbU1tbq3khVV1dj6NChumdXABg1ahROn+759VZHR4dBH0FBwQbP7ekyEdVn/6N3rKWtGa/vWIg5jyzDszPewEPj5mDD7meg1Wr1zqs6cxKerhP1jgUFBRs8pyFzO9g5YYiTG8o7vcSoPV+Bq02X4D7c1+B/zlsxdmZDqTJUd3d3+Pr6IjU1Fdu2bUNeXh6WLFmCrVu3AoCi7/hvJXBcOIpOHdA7tjVnNSwtrbEoLBEAsPTJ93D2QhX2HnpLd45Wq8V35XkI9Ak3+YwzAhZjd8F61F6oxJWmS/goZyUe8J6KYYNHmvzavaHKUM3NzbFnzx74+PhgyZIliImJgbOzM5YuXQoLCwvdGyk3NzecPXsWzc3NusdWVlZixIgRiswd6h+Fitpi1J6vAAAUncrDF19vwerIT2FpYQUAsLd1xMrI7dj2r7+gsvbEb+cdwADbQZjk9bjJZ4wIWYWAMU/g+XcfRGSKK7Tadqxa8InJr9tbZpLWoEdFRaG4uBglJSW6Y2FhYQgPD0d8fDwKCwsxd+5cVFVVwdq66xuW23Fsl3H/S0fW0c0orfo3VkVuN/gxL/41EM+EvYZJ3qF6x53uBx6IMPzanRk7d1/pzcy3IirUMWPGICAgAGlpabpjFRUViI6OxpkzZ2BtbY1NmzZ1+ZZWbyj1BQcYameqfNffnYaGBpSVlSE+Pl7vuLu7Ow4dOqTQVNRfxITq4OCA9vZ2pccghajyzRTRjRgqicBQSQSGSiIwVBKBoZIIYr49pRTHIXfntdWGofbAFD9CkYzHWz+JwFBJBIZKIjBUEoGhkggMlURgqCQCQyURGCqJwFBJBIZKIjBUEoGhkggMlURgqCQCQyURGCqJwFBJBIZKIjBUEoGhkggMlURgqCQCQyURVB2qGpf2kjJU/ZNSYmNjkZGRgYSEBPj7+6OwsBCRkZGoq6vDSy+9pPR44uQf34XMwk2o+LkYTa1XsX99W4+PWf5BML4/fRQWv211AYDgCRFYPu9vphy1C9WGen1pb0FBgW55REhICIqKipCRkaGKpb3SONjdgycmx6OltRFv7zX8jrQwNKHbTYX9SbW3fkOX9q5duxbe3t4wNzdHenq6EqOK8eDoqXhsYiSG3+uu9ChGU2WoxiztnTZtGnJzc/Hoo48adY3bXYYr5aO7pb39gUt70XVpL3BtUS+Z1o68ddij2aj7deqzuRg7IqBfZ1BlqJ2X9s6YMUN3/Malvb0haA/cbenLhWg326bdnaCgYHR80PefW1WG2nlp7+DBg+Hq6or09HTk5OQAUO/SXjIdVb5GNXRpLxmnXduOltYmtLa1AABaWpvQ0tok4u6iymdUAPD29kZ+fr7esaioKIwdOxZ2dnYKTSXbgW+3Y+M/YnS/nvnKtc/j9tWVql+DLn5pb0JCAtLS0lBXVwcHBwfY2dlBo9HAw8NDwUmVd6ct7VXlrb8715f23viN/uTkZNTU1KC5uRnnz59HTU3NXR/pnUi1t/4bcWnv3U3MMyrd3RgqicBQSQSGSiIwVBKBoZIIDJVEYKgkAkMlERgqicBQSQSGSiIwVBKBoZIIDJVEYKgkAkMlERgqicBQSQSGSiIwVBKBoZIIDJVEYKgkAkMlERgqicBQSQSGSiIwVBKBoZIIDJVEYKgkgqpD5dJeuk7VP3GaS3v71kdfrMTX32ejrv6/sLVxwO9/NxPPzlyPgfaDlR6tR6oNlUt7+565uQVWRX6CkcPGoaGxHht2LcKbu6ORHJOp9Gg9Uu2t35ClvRcvXsSsWbPg7e0NPz8/hIWFoby8XKGJ1S92eio8XSfC0sIKTg73Yc7DL6LkxwKlxzKIKkM1dGmvmZkZli1bhrKyMhQXF2PWrFmIiYnp5k+k7nxXngd3Fz+lxzCIakMFbr609/pt38nJCaGhobrfDwwMRGVlpUHXUHr7s9LbpQ+X7EX2V5sRP/tdI74yPTPVdmlVhtp5aW9nPS3tfeeddxAeHm7q8cTTFO/B2+nP4bXoTHjdL+O1virfTN3O0t6kpCSUl5fj4MGDBl1D0MLC23KzzX2536RhS9ZyvBaThXGjHurz65pqu7Qqn1GNXdqbkpKC7Oxs5Obmwt7eXqGp1e+fR97DluwVeP25/SaJ1JRE7UKNiopCcXExSkpKdMeSkpKQk5OD/fv3w8nJSbnhVKa7Z9QpL5vBwtwSVpY2esez1jX02XVNtQtVlbf+mzl27BgCAgJ0vy4tLUViYiI8PDwQHBysO378+PH+H06AL98U85zUhZhQry/tjY+P1x3z8fG5419r0jViQuXS3rubKt9MEd2IoZIIDJVEYKgkAkMlERgqicBQSQQx30cl4zgOubOuK+rv+unuxVs/icBQSQSGSiIwVBKBoZIIDJVEYKgkAkMlERgqicBQSQSGSiIwVBKBoZIIDJVEYKgkAkMlERgqicBQSYT/AdW7H11NwM3oAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# set the strike price (should be within the low and the high value of the uncertainty)\n", + "strike_price = 1.896\n", + "\n", + "# set the approximation scaling for the payoff function\n", + "c_approx = 0.25\n", + "\n", + "# setup piecewise linear objective fcuntion\n", + "breakpoints = [low, strike_price]\n", + "slopes = [0, 1]\n", + "offsets = [0, 0]\n", + "f_min = 0\n", + "f_max = high - strike_price\n", + "european_call_objective = LinearAmplitudeFunction(\n", + " num_uncertainty_qubits,\n", + " slopes,\n", + " offsets,\n", + " domain=(low, high),\n", + " image=(f_min, f_max),\n", + " breakpoints=breakpoints,\n", + " rescaling_factor=c_approx,\n", + ")\n", + "\n", + "# construct A operator for QAE for the payoff function by\n", + "# composing the uncertainty model and the objective\n", + "num_qubits = european_call_objective.num_qubits\n", + "european_call = QuantumCircuit(num_qubits)\n", + "european_call.append(uncertainty_model, range(num_uncertainty_qubits))\n", + "european_call.append(european_call_objective, range(num_qubits))\n", + "\n", + "# draw the circuit\n", + "european_call.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "27857bab-30de-4add-9d47-bbaeadf5eec8", + "metadata": {}, + "outputs": [], + "source": [ + "# set target precision and confidence level\n", + "epsilon = 0.01\n", + "alpha = 0.05\n", + "\n", + "qi = QuantumInstance(Aer.get_backend(\"aer_simulator\"), shots=100)\n", + "problem = EstimationProblem(\n", + " state_preparation=european_call,\n", + " objective_qubits=[1],\n", + " post_processing=european_call_objective.post_processing,\n", + ")\n", + "# construct amplitude estimation\n", + "ae = IterativeAmplitudeEstimation(epsilon, alpha=alpha, quantum_instance=qi)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "cb0b453a-3d66-4bfe-9120-8906e2510e15", + "metadata": {}, + "outputs": [], + "source": [ + "ae_circuit = ae.construct_circuit(problem)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "1f32a00d-1e7c-4e2c-a387-efc9a5078f3e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ae_circuit.decompose().draw(\n", + " \"mpl\", style=\"iqx\"\n", + ") # decompose 1 level: exposes the Phase estimation circuit!" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "81a4c3ae-9e09-4e7e-98a3-19d9d8a2c2e1", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc2 = QuantumCircuit(3)\n", + "qc=qc2.compose(ae_circuit)\n", + "qc.measure_all()\n", + "qc.draw()#.savefig('qae_circuit.pdf')" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "e7a8aaf5-5bf8-4492-9499-dae99af0b149", + "metadata": {}, + "outputs": [], + "source": [ + "# #choosing the qasm simulator backend\n", + "\n", + "# backend = Aer.get_backend('qasm_simulator')\n", + "\n", + "# # running the job and getting results (counts)\n", + "# job = execute(qc, backend, shots=1024) # shots = no. of times you want to run the experiment\n", + "# result = job.result()\n", + "# counts = result.get_counts(qc)\n", + "\n", + "# #printing and visualizing results (histogram data of experiment)\n", + "# print(counts)\n", + "# plot_histogram(counts)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "87dc200a-ffab-4d52-ab9b-a4917b5fa235", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "provider.backends()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "2be7dab5-4dd9-41b7-94d5-93279a9b215d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ibm_oslo ibm_nairobi ibmq_manila\n", + "-------- ----------- -----------\n", + "Num. Qubits: 7 Num. Qubits: 7 Num. Qubits: 5\n", + "Pending Jobs: 58 Pending Jobs: 24 Pending Jobs: 16\n", + "Least busy: False Least busy: False Least busy: True\n", + "Operational: True Operational: True Operational: True\n", + "Avg. T1: 127.5 Avg. T1: 118.1 Avg. T1: 135.7\n", + "Avg. T2: 98.7 Avg. T2: 53.3 Avg. T2: 58.2\n", + "\n", + "\n", + "\n", + "ibmq_quito ibmq_belem ibmq_lima\n", + "---------- ---------- ---------\n", + "Num. Qubits: 5 Num. Qubits: 5 Num. Qubits: 5\n", + "Pending Jobs: 23 Pending Jobs: 17 Pending Jobs: 35\n", + "Least busy: False Least busy: False Least busy: False\n", + "Operational: True Operational: True Operational: True\n", + "Avg. T1: 92.1 Avg. T1: 89.2 Avg. T1: 92.4\n", + "Avg. T2: 98.3 Avg. T2: 107.7 Avg. T2: 115.9\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "from qiskit.tools import *\n", + "backend_overview()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "1773a7f2-6f13-4174-a637-d7f1147a4f24", + "metadata": {}, + "outputs": [], + "source": [ + "backend=provider.get_backend('ibmq_manila')" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "28e12cbe-5258-4eeb-8a1a-035ea6daf04c", + "metadata": {}, + "outputs": [], + "source": [ + "#Execute the circuit on the backend\n", + "job=execute(qc,backend,shots=1024)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "dac27a5c-52f3-453d-a39e-9d005b17d9fc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "job.status()" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "2453d1a9-18cc-478e-9781-7542255dd9ff", + "metadata": {}, + "outputs": [], + "source": [ + "result=job.result()\n", + "counts=result.get_counts()\n", + "histogram = plot_histogram(counts,title=\"QAE on IBMQ_Manila\")\n", + "histogram.savefig('qae_manila.pdf')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c63f852a-4484-4bbc-8bcf-fc93f3b305e3", + "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.8.13" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": { + "053f5e61a7ea4738b0066acd610cfef8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_1acef339631d4237b14d6e0a3ec93c5b", + "style": "IPY_MODEL_11d743b1f1b5495b9d60688da3b520d2", + "value": "job has successfully run" + } + }, + "07beff27633d48da9f0b0359c6fd55de": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "0b3476e202dd403a94fd0df296093c40": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "0c8daf2eb2f241b7969d45c25a7c6e90": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "1086392d9a1e4888b5cfe9ae92eef8f5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "width": "95px" + } + }, + "109d6eab719b4e84aee86acd77543aff": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "width": "190px" + } + }, + "11d743b1f1b5495b9d60688da3b520d2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "1614eaa9fdb44b22a481bb26d83d32e2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "width": "190px" + } + }, + "18567f3645914976aa1ae0aa5aaea1bf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "1a4091d2415543018a0d705fbb678bd5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "max_width": "700px", + "min_width": "700px" + } + }, + "1acef339631d4237b14d6e0a3ec93c5b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "overflow_x": "scroll" + } + }, + "1f2ea46711f94fd2a611a185aa5a6f16": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_1fb1d58ac7cd48c099f422a11db851fc", + "style": "IPY_MODEL_42051dd4f8d24f2ab015505d9a4eb530", + "value": "
Status
" + } + }, + "1fb1d58ac7cd48c099f422a11db851fc": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "width": "95px" + } + }, + "237573a03ad14398ba366fe009a8a39a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "width": "145px" + } + }, + "2780ede453c046c1a21759837ba33dfe": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "children": [ + "IPY_MODEL_28a1167360d24d3794541bbd02beddba", + "IPY_MODEL_2c0bfc085ffa4d44ae1d352062631364", + "IPY_MODEL_d9e608b14ca44b96be51d751a6124dd1", + "IPY_MODEL_4cd818da666441539cceb69715a2da81", + "IPY_MODEL_78628a9f787b4b7c9039bb6942a2d9ff", + "IPY_MODEL_053f5e61a7ea4738b0066acd610cfef8" + ], + "layout": "IPY_MODEL_1a4091d2415543018a0d705fbb678bd5" + } + }, + "28a1167360d24d3794541bbd02beddba": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonModel", + "state": { + "icon": "close", + "layout": "IPY_MODEL_b22abcbc572e4004a82fd15dbcd21c08", + "style": "IPY_MODEL_5c573c00830f4598852d43fc3920661d" + } + }, + "2c0bfc085ffa4d44ae1d352062631364": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_109d6eab719b4e84aee86acd77543aff", + "style": "IPY_MODEL_82c7d3b6603843579043d7ef4a403dfa", + "value": "62e05f21181398da4ec6d4a6" + } + }, + "2e0a8d303904473c82e4c7d41af98bb4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "grid_template_areas": "\n \". . . . right \"\n ", + "grid_template_columns": "20% 20% 20% 20% 20%", + "width": "100%" + } + }, + "30e5845584d148bcbbc90a1d7c2ede05": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_8649d97d59774c6f9a2e76e57dacb567", + "style": "IPY_MODEL_07beff27633d48da9f0b0359c6fd55de", + "value": "
Message
" + } + }, + "41df843ba2f146e0aa989592819df82c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "grid_area": "right", + "padding": "0px 0px 0px 0px", + "width": "70px" + } + }, + "42051dd4f8d24f2ab015505d9a4eb530": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "4cd818da666441539cceb69715a2da81": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_1086392d9a1e4888b5cfe9ae92eef8f5", + "style": "IPY_MODEL_52dd5de59a9b49a9bc85230f357fc237", + "value": "DONE" + } + }, + "52dd5de59a9b49a9bc85230f357fc237": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "5c573c00830f4598852d43fc3920661d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonStyleModel", + "state": { + "button_color": "white" + } + }, + "5fe4dd0f0d5f464fa9489c2e64e7f189": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonStyleModel", + "state": {} + }, + "68be72052bea46a8a13dc421bc02fc40": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "GridBoxModel", + "state": { + "children": [ + "IPY_MODEL_8e0e1b8590f145ca9a2efd9450b99458" + ], + "layout": "IPY_MODEL_2e0a8d303904473c82e4c7d41af98bb4" + } + }, + "68ebb442b82e42e09866923de8ae4d07": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_dc9d5ac197c144b68f8997c81fc744cf", + "style": "IPY_MODEL_0c8daf2eb2f241b7969d45c25a7c6e90", + "value": "

Circuit Properties

" + } + }, + "78628a9f787b4b7c9039bb6942a2d9ff": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_96f5aff7df1b4871807732d61eb4dc29", + "style": "IPY_MODEL_961108f947dd402ca433fe81c7f91214", + "value": "-" + } + }, + "82c7d3b6603843579043d7ef4a403dfa": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "8649d97d59774c6f9a2e76e57dacb567": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": {} + }, + "8e0e1b8590f145ca9a2efd9450b99458": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ButtonModel", + "state": { + "button_style": "primary", + "description": "Clear", + "layout": "IPY_MODEL_41df843ba2f146e0aa989592819df82c", + "style": "IPY_MODEL_5fe4dd0f0d5f464fa9489c2e64e7f189" + } + }, + "961108f947dd402ca433fe81c7f91214": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "96f5aff7df1b4871807732d61eb4dc29": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "width": "70px" + } + }, + "9a348309fb524a708f9269acd87f0791": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "children": [ + "IPY_MODEL_f7c88c90e59b4e858b6dddc66713bb39", + "IPY_MODEL_e9af3d1e2ee14019bf4742dc44d7005d", + "IPY_MODEL_1f2ea46711f94fd2a611a185aa5a6f16", + "IPY_MODEL_c668dfdb5cd949d58336b25395af85fc", + "IPY_MODEL_30e5845584d148bcbbc90a1d7c2ede05" + ], + "layout": "IPY_MODEL_a8b0540237a643978dc716ab22a2219d" + } + }, + "a8b0540237a643978dc716ab22a2219d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "margin": "0px 0px 0px 37px", + "width": "600px" + } + }, + "b22abcbc572e4004a82fd15dbcd21c08": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "margin": "0px 5px 0px 0px", + "width": "32px" + } + }, + "c668dfdb5cd949d58336b25395af85fc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_f36d9dc034d34e73b5fcb0ea70379591", + "style": "IPY_MODEL_c927cc69b772492b9036065e96802858", + "value": "
Queue
" + } + }, + "c927cc69b772492b9036065e96802858": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "d9e608b14ca44b96be51d751a6124dd1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_237573a03ad14398ba366fe009a8a39a", + "style": "IPY_MODEL_18567f3645914976aa1ae0aa5aaea1bf", + "value": "ibmq_manila" + } + }, + "dc9d5ac197c144b68f8997c81fc744cf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "margin": "0px 0px 10px 0px" + } + }, + "e9af3d1e2ee14019bf4742dc44d7005d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_fe7cb80a75c7432bba941a8e2c2a31aa", + "style": "IPY_MODEL_f2332936c6c24ade86f8fc64f6d2e080", + "value": "
Backend
" + } + }, + "f2332936c6c24ade86f8fc64f6d2e080": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "description_width": "" + } + }, + "f36d9dc034d34e73b5fcb0ea70379591": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "width": "70px" + } + }, + "f7c88c90e59b4e858b6dddc66713bb39": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "layout": "IPY_MODEL_1614eaa9fdb44b22a481bb26d83d32e2", + "style": "IPY_MODEL_0b3476e202dd403a94fd0df296093c40", + "value": "
Job ID
" + } + }, + "fe7cb80a75c7432bba941a8e2c2a31aa": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "width": "145px" + } + } + }, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}