From 59a8fe59d2557475bf79b58d5273e0bcb99e1051 Mon Sep 17 00:00:00 2001 From: MichealChen Date: Thu, 20 Feb 2025 10:02:49 +0800 Subject: [PATCH] Add files via upload When using Classical shadow for properties prediction. We always not reconstruct the full state via shadows because it takes an exponential amount of resources. One better method is to use Median-of-Means estimation to predict fidelities between the system and the target state. Here I add median-of-means estimator function, to effeciently predict n-qubit system properties. --- Tutorial-Shadow_Fidelity_Prediction.ipynb | 306 ++++++++++++++++++++++ 1 file changed, 306 insertions(+) create mode 100644 Tutorial-Shadow_Fidelity_Prediction.ipynb diff --git a/Tutorial-Shadow_Fidelity_Prediction.ipynb b/Tutorial-Shadow_Fidelity_Prediction.ipynb new file mode 100644 index 0000000..82ca632 --- /dev/null +++ b/Tutorial-Shadow_Fidelity_Prediction.ipynb @@ -0,0 +1,306 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Classical Shadow for Directly Fidelity Prediction" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from qiskit import QuantumCircuit\n", + "import matplotlib.pyplot as plt\n", + "from qiskit import quantum_info\n", + "from qiskit.primitives import StatevectorEstimator\n", + "import numpy as np\n", + "from qiskit import transpile, assemble\n", + "from qiskit_aer import AerSimulator\n", + "from qiskit.quantum_info import Statevector" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Prepare n-qubit GHZ state\n", + "def GHZ_state(num_qubits, qc):\n", + " qc.h(0)\n", + " for cnot in range(num_qubits - 1):\n", + " qc.cx(cnot, cnot + 1)\n", + " qc.barrier()\n", + "\n", + "def bitGateMap(qc,g,qi):\n", + " '''Map X/Y/Z string to qiskit ops'''\n", + " if g==\"X\":\n", + " qc.h(qi)\n", + " elif g==\"Y\":\n", + " qc.sdg(qi)\n", + " qc.h(qi)\n", + " elif g==\"Z\":\n", + " pass\n", + " else:\n", + " raise NotImplementedError(f\"Unknown gate {g}\")\n", + "\n", + "# Generate an pure state operator for fidelity prediction \n", + "def gen_op(ket):\n", + " return np.outer(ket, np.conj(ket))\n", + "\n", + "# Inverse Channel\n", + "def Minv(N,X):\n", + " '''inverse shadow channel'''\n", + " return ((2**N+1.))*X - np.eye(2**N)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# An Example GHZ state via Classical shadow\n", + "num_shadows = 2000 # number of classical shadows\n", + "reps = 1\n", + "N = 4 # number of qubits" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "rng = np.random.default_rng(1717)\n", + "cliffords = [quantum_info.random_clifford(N, seed=rng) for _ in range(num_shadows)]\n", + "\n", + "qc1 = QuantumCircuit(N)\n", + "GHZ_state(N,qc1)\n", + "state = Statevector(qc1) # GHZ state\n", + "op = gen_op(state) # Pure operator\n", + "results = []\n", + "for cliff in cliffords:\n", + " qc_c = qc1.compose(cliff.to_circuit())\n", + "\n", + " counts = quantum_info.Statevector(qc_c).sample_counts(reps)\n", + " results.append(counts)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc_c.draw(output='mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Generate Classical shadow\n", + "shadows = []\n", + "for cliff, res in zip(cliffords, results):\n", + " mat = cliff.adjoint().to_matrix()\n", + " for bit,count in res.items():\n", + " Ub = mat[:,int(bit,2)] # this is Udag|b>\n", + " shadows.append(Minv(N,np.outer(Ub,Ub.conj()))*count)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Median-of-Means Estimation\n", + "Suppose we want to predict the expectation value of an operator $\\hat{O}$.\n", + "* Divide the Classical Shadow into K parts. with $\\hat{\\rho}_{(k)}=\\frac{1}{\\lfloor N / K\\rfloor} \\sum_{i=(k-1)\\lfloor N / K\\rfloor+1}^{k\\lfloor N / K\\rfloor} \\hat{\\rho}_i$\n", + "* *Predict $\\hat{o}$= \\textrm{median}($\\cfrac{1}{N/K}\\sum\\limits_{i=1}^{N/K}\\text{Tr}(O\\hat{\\rho_{(1)}}),...,\\cfrac{1}{N/K}\\sum\\limits_{i=N-N/K+1}^{N}\\text{Tr}(O\\hat{\\rho_{(i)}})$)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def median_of_means_est(shadows, num_blocks, op):\n", + " shadow_block = []\n", + " fid = []\n", + " block_size = len(shadows) // num_blocks\n", + "\n", + " for k in range(num_blocks):\n", + "\n", + " idx = k * block_size\n", + " if k == num_blocks - 1:\n", + " end_idx = len(shadows)\n", + " else:\n", + " end_idx = (k + 1) * block_size\n", + "\n", + " block_shadows = shadows[idx: end_idx]\n", + "\n", + " rho_k = np.sum(block_shadows, axis=0) / len(block_shadows)\n", + " shadow_block.append(rho_k)\n", + "\n", + " fid_k = np.trace(op @ rho_k)\n", + " fid_k = np.sqrt(fid_k * fid_k.conj()) # Real Number\n", + " fid.append(fid_k)\n", + " return shadow_block, fid\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[np.complex128(1.0346874999999993+0j), np.complex128(0.981562499999999+0j), np.complex128(0.9018749999999991+0j), np.complex128(1.034687499999999+0j), np.complex128(1.0984374999999988+0j), np.complex128(0.9178124999999993+0j), np.complex128(1.0506249999999993+0j), np.complex128(0.9284374999999991+0j), np.complex128(0.8540624999999992+0j), np.complex128(1.055937499999999+0j)]\n", + "(1.008124999999999+0j)\n" + ] + } + ], + "source": [ + "# One Test\n", + "shadow_block, fid_block = median_of_means_est(shadows, 10, op)\n", + "print(fid_block)\n", + "\n", + "\n", + "print(np.median(fid_block))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# Run Independent Experiments for Data Analysis\n", + "num_exp = 3\n", + "fid_mid = []\n", + "\n", + "for _ in range(num_exp):\n", + " results = []\n", + " qc_test = QuantumCircuit(N)\n", + " cliffords = [quantum_info.random_clifford(N) for _ in range(num_shadows)]\n", + " state = GHZ_state(N, qc_test)\n", + " for cliff in cliffords:\n", + " qc_c = qc_test.compose(cliff.to_circuit())\n", + "\n", + " counts = quantum_info.Statevector(qc_c).sample_counts(reps)\n", + " results.append(counts)\n", + " shadows = []\n", + " for cliff, res in zip(cliffords, results):\n", + " mat = cliff.adjoint().to_matrix()\n", + " for bit,count in res.items():\n", + " Ub = mat[:,int(bit,2)] # this is Udag|b>\n", + " shadows.append(Minv(N,np.outer(Ub,Ub.conj()))*count)\n", + "\n", + " shadow_block, fid_block = median_of_means_est(shadows, 10, op)\n", + " \n", + " fid_mid.append(np.median(fid_block))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\86188\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\matplotlib\\cbook.py:1762: ComplexWarning: Casting complex values to real discards the imaginary part\n", + " return math.isfinite(val)\n", + "c:\\Users\\86188\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\matplotlib\\cbook.py:1398: ComplexWarning: Casting complex values to real discards the imaginary part\n", + " return np.asarray(x, float)\n", + "c:\\Users\\86188\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\numpy\\ma\\core.py:3413: ComplexWarning: Casting complex values to real discards the imaginary part\n", + " _data[indx] = dval\n" + ] + }, + { + "data": { + "image/png": "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7pyioqJ08OBBnTx5skqfB3AGLpEAN9GUKVPUqFGjSgNBTk6OiouLba89PT3l4+OjY8eOKSAgoMyP9F133XXDtbVt27ZMW7t27fTpp5/e8L6vadCggc6dO1emfcyYMerXr5+kii+fdO7cWZGRkWXaV65cWeHxZs+erU2bNikmJqbcsdcTEBCghQsX6oMPPtDBgwe1adMmzZ49W7GxsQoICNCIESMq3ceyZcs0Z84cpaWl6fLly7b2li1bVjr20KFDMgxDU6dO1dSpU8vtc/r0abtQCNxKCBjATXLw4EH9+c9/1rx583Tq1Clb+6VLl3T58mWlp6fL29tbjRo10qBBg/TVV1/Z+kRHR9tN4KwKi8VS7n9p38gdGjcqODhYqampOnnypN0PY7t27dSuXTtJsk2gvFE7duzQ1KlT1aNHD02fPr3a+7FYLLb6+vbtq7Zt2+qTTz6pNGCsXLlSQ4cO1YABAzRhwgT5+fnJ1dVV8fHxOnz4cKXHLS0tlXT1bqOoqKhy+7Rp08bxDwTcJAQM4CY5efKkSktL9eKLL+rFF18s837Lli310ksvad68eZozZ47Onz9ve69p06aSrk4+TEpKUkFBgd1ZjP3795fZ3x133KEjR46UaT927Fi59R08eLBM24EDByq84+QaR1b27Nevn/7617/qk08+0cSJE6s8zlHnz5/XU089pfr162vVqlU3dGvtv2vVqpXuuOMOZWZm2toq+vxr1qxRq1atlJiYaNcnLi7Orl9F46/dalu3bl2Hz74AtwLmYAA3SadOnbR27doyW8eOHdWsWTOtXbtWzz77rCQpLCxMkZGRtq1Dhw6SpD59+ujKlStauHChbb8lJSV67733yhyvdevWSktL05kzZ2xtu3fv1vbt28utb926dXbX9JOTk7Vz585Kbxn18vJSbm5ulb6DJ598Uh06dNCMGTP07bffltunKvMbKjN8+HBlZGRo0aJFat68ucPjd+7cqcLCwjLtycnJOnfunN0lKS8vL+Xl5ZXp6+rqKsn+8+zcuVM7duyw63dtPY5ffod+fn66//779eGHH9oFmmv+/f9X4FbEGQzgJmncuHG5q11eWwujKith9u/fXz179tTkyZOVnp6uDh06KDExsdwfuOHDh2vu3LmKiorSs88+q9OnTyshIUEdO3ZUfn5+mf5t2rRRr169NHr0aBUVFWne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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Visualization\n", + "plt.figure(figsize=(6, 4))\n", + "plt.errorbar(\n", + " x = [1],\n", + " y = [np.mean(fid_mid)],\n", + " yerr = [np.std(fid_mid)],\n", + " fmt = 'o',\n", + " capsize = 5,\n", + " label = 'Fidelity Prediction',\n", + " color = 'b',\n", + " markersize = 8,\n", + " linestyle = 'none'\n", + ")\n", + "\n", + "plt.title(f'{N}-qubit GHZ State')\n", + "plt.ylabel('Fidelity Prediction')\n", + "plt.xlabel('Clifford')\n", + "plt.ylim(0.5, 1.1)\n", + "plt.xticks([])\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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.10.6" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}