{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Simulating noisy quantum circuits with Paddle Quantum\n",
"\n",
" Copyright (c) 2021 Institute for Quantum Computing, Baidu Inc. All Rights Reserved. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introduction to quantum noises\n",
"\n",
"In ideal models, we usually assume that quantum circuits are operating on a **closed physical system**. However, real quantum devices suffer from **incoherent noises** introduced by unwanted interactions between the system and the environment. This type of noise can significantly change the performance of quantum computation tasks and hence can hardly be ignored for near-term quantum devices. Consequently, designing robust quantum algorithms under the presence of noise is crucial for utilizing quantum computation in the real world. With the noise module of Paddle Quantum, we can now not only design and simulate quantum algorithms but also examine various noises' influence and further develop error mitigation schemes.\n",
"\n",
"## Building noise models in Paddle Quantum\n",
"\n",
"### Noise model and quantum channel\n",
" \n",
"The evolution of a closed quantum system is always unitary. Mathematically, we can describe such a process as implementing a parameterized quantum circuit $U(\\vec{\\theta})$,\n",
"\n",
"$$\n",
"\\rho \\longrightarrow U(\\vec{\\theta}) \\rho U^\\dagger(\\vec{\\theta}),\n",
"\\tag{1}\n",
"$$\n",
"\n",
"where $\\rho$ is the initial quantum state, $\\vec{\\theta}$ is a vector containing all the parameters. The most intuitive type of noise one can think of is the error that appears in these parameters, \n",
"$$\n",
"\\rho \\longrightarrow U(\\vec{\\theta}+\\vec{\\epsilon}) \\rho U^\\dagger(\\vec{\\theta}+\\vec{\\epsilon}),\n",
"\\tag{2}\n",
"$$\n",
"\n",
"$\\vec{\\epsilon}$ can be a white noise sampled from Gaussian distributions. This kind of noise is a specific example of **coherent noises**. Coherent noise usually occurs due to device calibration errors or quantum control errors. We want to emphasize that one also uses unitary transformation $U(\\vec{\\epsilon})$ to describe coherent noises. In certain cases, coherent noises can be more damaging than incoherent noises [1]. \n",
"\n",
"Most of the time, the real problem lies on the evolution of an **open quantum system** that is non-unitary. Under this circumstance, we need a more general description beyond the unitary transformation to characterize incoherent noises, the language of **quantum channels**. To keep the discussion precise, we use *operator-sum representation* [2] to introduce a quantum channel as \n",
"\n",
"$$\n",
"\\mathcal{E}(\\rho) = \\sum_{k=0}^{m-1} E_k \\rho E_k^{\\dagger},\n",
"\\tag{3}\n",
"$$\n",
"\n",
"where $\\{E_k\\}$ are *Kraus* operators, and they satisfy the completeness condition $\\sum_k E_k^\\dagger E_k = I$. Mathematically, a quantum channel is completely positive and trace-preserving [2].\n",
"\n",
"Under this representation, we can explicitly observe the results of implementing a quantum channel: Suppose we start with a pure state $\\rho = |\\psi\\rangle\\langle \\psi|$, then we send it through a noisy quantum channel (e.g., $m = 2$ ). Eventually, we will get a mixed state $\\mathcal{E}(\\rho) = E_0 \\rho E_0^\\dagger + E_1 \\rho E_1^\\dagger$. Let's take the bit flip noise as an example: \n",
"\n",
"$$\n",
"\\mathcal{E}_{BF}(\\rho) = (1 - p) I \\rho I+ p X \\rho X,\n",
"\\tag{4}\n",
"$$\n",
"\n",
"where $X,I$ are Pauli operators. The corresponding *Kraus* operators are:\n",
"\n",
"$$\n",
"E_0 = \\sqrt{1-p}\n",
"\\begin{bmatrix}\n",
"1&0 \\\\\n",
"0&1\n",
"\\end{bmatrix},\n",
"E_1 = \\sqrt{p}\n",
"\\begin{bmatrix}\n",
"0& 1 \\\\\n",
"1 &0\n",
"\\end{bmatrix}.\n",
"\\tag{5}\n",
"$$\n",
"\n",
"The physical meaning of this quantum channel is there exist a probability $p$ that the state $|0\\rangle$ will flip into $|1\\rangle$, and vice versa. In Paddle Quantum, we can use this quantum channel by `Circuit.bit_flip(p, which_qubit)`, where `p` is the noise level.\n",
"\n",
"**Note:** For a quantum channel, the Kraus operator representation is not necessarily unique [3]."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Implementation with Paddle Quantum\n",
"\n",
"In this section, we will learn how to build a noise model in Paddle Quantum. First, we initialize a qubit to $|0\\rangle$. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2021-04-09T02:32:24.919291Z",
"start_time": "2021-04-09T02:32:22.237264Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/zl/miniconda3/envs/pq/lib/python3.8/site-packages/openfermion/hamiltonians/hartree_fock.py:11: DeprecationWarning: Please use `OptimizeResult` from the `scipy.optimize` namespace, the `scipy.optimize.optimize` namespace is deprecated.\n",
" from scipy.optimize.optimize import OptimizeResult\n",
"/home/zl/miniconda3/envs/pq/lib/python3.8/site-packages/paddle/tensor/creation.py:125: DeprecationWarning: `np.object` is a deprecated alias for the builtin `object`. To silence this warning, use `object` by itself. Doing this will not modify any behavior and is safe. \n",
"Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations\n",
" if data.dtype == np.object:\n",
"/home/zl/miniconda3/envs/pq/lib/python3.8/site-packages/paddle/tensor/creation.py:125: DeprecationWarning: `np.object` is a deprecated alias for the builtin `object`. To silence this warning, use `object` by itself. Doing this will not modify any behavior and is safe. \n",
"Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations\n",
" if data.dtype == np.object:\n",
"/home/zl/miniconda3/envs/pq/lib/python3.8/site-packages/paddle/fluid/framework.py:1104: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.\n",
"Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations\n",
" elif dtype == np.bool:\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEDCAYAAAA4FgP0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAAARcklEQVR4nO3debRdZX3G8e+TMKngBKlVkgDW0DYOoEZwaQdUsGBVnKogDlgktoKVpdJiq2DRrjq7akVrHCrqEkSrNNUIWgVtHQnIYILRiCBBXYIgDlQQ+fWPs5HD5d57TvDuc0ne72ets+7e7373Pr9kZeW5+333kKpCktSuBfNdgCRpfhkEktQ4g0CSGmcQSFLjDAJJapxBIEmN22a+C9hcu+yyS+2+++7zXYYkbVHOPffcq6pq0XTbtrgg2H333Vm7du18lyFJW5Qkl820zaEhSWqcQSBJjTMIJKlxBoEkNc4gkKTG9RYESd6b5EdJvjHD9iR5a5KNSS5M8pC+apEkzazPM4L3AQfOsv0gYFn3WQm8o8daJEkz6C0IquoLwNWzdDkYeH8NfAW4e5J791WPJGl683lD2a7A5UPrm7q2H0ztmGQlg7MGli5deru/cPfjPnm799XW79LX/vl8lyDNiy1isriqVlXViqpasWjRtHdIS5Jup/kMgiuAJUPri7s2SdIEzWcQrAae01099HDg2qq6zbCQJKlfvc0RJDkF2A/YJckm4ARgW4Cq+jdgDfA4YCNwHfC8vmqRJM2styCoqkNHbC/gqL6+X5I0ni1isliS1B+DQJIaZxBIUuMMAklqnEEgSY0zCCSpcQaBJDXOIJCkxhkEktQ4g0CSGmcQSFLjDAJJapxBIEmNMwgkqXEGgSQ1ziCQpMYZBJLUOINAkhpnEEhS4wwCSWqcQSBJjTMIJKlxBoEkNc4gkKTGGQSS1DiDQJIaZxBIUuMMAklqnEEgSY0zCCSpcQaBJDXOIJCkxvUaBEkOTLIhycYkx02zfWmSs5J8PcmFSR7XZz2SpNvqLQiSLAROAg4ClgOHJlk+pdsrgNOq6sHAIcDb+6pHkjS9Ps8I9gE2VtUlVXUDcCpw8JQ+Bdy1W74b8P0e65EkTWObHo+9K3D50PomYN8pfV4FfDrJi4C7APv3WI8kaRrzPVl8KPC+qloMPA74QJLb1JRkZZK1SdZeeeWVEy9SkrZmfQbBFcCSofXFXduwI4DTAKrqy8AOwC5TD1RVq6pqRVWtWLRoUU/lSlKb+gyCc4BlSfZIsh2DyeDVU/p8D3gMQJI/ZBAE/sovSRPUWxBU1Y3A0cCZwMUMrg5al+TEJE/sur0UODLJBcApwOFVVX3VJEm6rT4ni6mqNcCaKW3HDy2vBx7ZZw2SpNnN92SxJGmeGQSS1DiDQJIaZxBIUuMMAklqnEEgSY0zCCSpcQaBJDXOIJCkxhkEktQ4g0CSGmcQSFLjDAJJapxBIEmNMwgkqXEGgSQ1ziCQpMYZBJLUOINAkhpnEEhS4wwCSWqcQSBJjTMIJKlxYwVBkkcmuUu3/Kwkb06yW7+lSZImYdwzgncA1yXZC3gp8B3g/b1VJUmamHGD4MaqKuBg4G1VdRKwU39lSZImZZsx+/0sycuBZwN/nGQBsG1/ZUmSJmXcM4JnANcDf1lVPwQWA2/orSpJ0sSMFQTdf/7/AWzfNV0FfLyvoiRJkzPuVUNHAh8F3tk17Qqc3lNNkqQJGndo6CjgkcBPAarq28Dv9FWUJGlyxg2C66vqhptXkmwDVD8lSZImadwg+HySvwfulOQA4CPAf43aKcmBSTYk2ZjkuBn6PD3J+iTrknxo/NIlSXNh3MtHjwOOAC4CXgCsAd492w5JFgInAQcAm4BzkqyuqvVDfZYBLwceWVXXJHG4SZImbKwgqKqbgHd1n3HtA2ysqksAkpzK4Ia09UN9jgROqqpruu/50WYcX5I0B2YNgiSnVdXTk1zENHMCVfWgWXbfFbh8aH0TsO+UPnt23/NFYCHwqqo6Y5zCJUlzY9QZwYu7n4/v8fuXAfsxuEntC0keWFU/Ge6UZCWwEmDp0qU9lSJJbZp1sriqftAtvrCqLhv+AC8ccewrgCVD64u7tmGbgNVV9auq+i7wLQbBMLWOVVW1oqpWLFq0aMTXSpI2x7hXDR0wTdtBI/Y5B1iWZI8k2wGHAKun9DmdwdkASXZhMFR0yZg1SZLmwKg5gr9m8Jv/fZNcOLRpJ+CLs+1bVTcmORo4k8H4/3ural2SE4G1VbW62/bYJOuBXwPHVtWPb/8fR5K0uUbNEXwI+BTwzwwuIb3Zz6rq6lEHr6o1DC41HW47fmi5gJd0H0nSPBgVBFVVlyY5auqGJPccJwwkSXds45wRPB44l8HloxnaVsB9e6pLkjQhswZBVT2++7nHZMqRJE3aqMnih8y2varOm9tyJEmTNmpo6E2zbCvg0XNYiyRpHowaGnrUpAqRJM2PUUNDj66qzyV5ynTbq+pj/ZQlSZqUUUNDfwp8DnjCNNsKMAgkaQs3amjohO7n8yZTjiRp0sZ9ef3OSd6a5Lwk5yb5lyQ7912cJKl/4z507lTgSuCpwNO65Q/3VZQkaXLGfVXlvavq1UPrr0nyjD4KkiRN1rhnBJ9OckiSBd3n6QyeHCpJ2sKNunz0Z9zyjKFjgA92mxYAPwde1mdxkqT+jbpqaKdJFSJJmh/jzhGQ5B4MXiO5w81tVfWFPoqSJE3OWEGQ5PkMXmS/GDgfeDjwZXzWkCRt8cadLH4x8DDgsu75Qw8GftJXUZKkyRk3CH5ZVb8ESLJ9VX0T+P3+ypIkTcq4cwSbktwdOB34TJJrgMv6KkqSNDljBUFVPblbfFWSs4C7AWf0VpUkaWI256qhhwB/xOC+gi9W1Q29VSVJmphxHzp3PHAysDOwC/DvSV7RZ2GSpMkY94zgMGCvoQnj1zK4jPQ1PdUlSZqQca8a+j5DN5IB2wNXzH05kqRJG/WsoX9lMCdwLbAuyWe69QOAr/VfniSpb6OGhtZ2P88FPj7UfnYv1UiSJm7UQ+dOvnk5yXbAnt3qhqr6VZ+FSZImY9xnDe3H4KqhSxk8knpJkuf60DlJ2vKNe9XQm4DHVtUGgCR7AqcAD+2rMEnSZIx71dC2N4cAQFV9C9i2n5IkSZM07hnBuUnezS1vKDuMWyaSJUlbsHGD4K+Ao4C/6db/B3h7LxVJkiZq5NBQkoXABVX15qp6Svd5S1VdP8a+BybZkGRjkuNm6ffUJJVkxWbWL0n6LY0Mgqr6NbAhydLNOXAXICcBBwHLgUOTLJ+m304MXnzz1c05viRpbow7NHQPBncWfw34xc2NVfXEWfbZB9hYVZcAJDkVOBhYP6Xfq4HXAceOW7Qkae6MGwSvvB3H3hW4fGh9E7DvcIfu0dZLquqTSQwCSZoHo541tAODieL7ARcB76mqG+fii5MsAN4MHD5G35XASoClSzdrhEqSNMKoOYKTgRUMQuAgBjeWjesKYMnQ+mJu/cTSnYAHAGcnuRR4OLB6ugnjqlpVVSuqasWiRYs2owRJ0iijhoaWV9UDAZK8h8174ug5wLIkezAIgEOAZ968saquZfCSG7rjnw28rKq8P0GSJmjUGcFvHiy3uUNCXf+jgTOBi4HTqmpdkhOTzDbJLEmaoFFnBHsl+Wm3HOBO3XqAqqq7zrZzVa0B1kxpO36GvvuNVbEkaU6Negz1wkkVIkmaH+M+dE6StJUyCCSpcQaBJDXOIJCkxhkEktQ4g0CSGmcQSFLjDAJJapxBIEmNMwgkqXEGgSQ1ziCQpMYZBJLUOINAkhpnEEhS4wwCSWqcQSBJjTMIJKlxBoEkNc4gkKTGGQSS1DiDQJIaZxBIUuMMAklqnEEgSY0zCCSpcQaBJDXOIJCkxhkEktQ4g0CSGmcQSFLjeg2CJAcm2ZBkY5Ljptn+kiTrk1yY5LNJduuzHknSbfUWBEkWAicBBwHLgUOTLJ/S7evAiqp6EPBR4PV91SNJml6fZwT7ABur6pKqugE4FTh4uENVnVVV13WrXwEW91iPJGkafQbBrsDlQ+uburaZHAF8qsd6JEnT2Ga+CwBI8ixgBfCnM2xfCawEWLp06QQrk6StX59nBFcAS4bWF3dtt5Jkf+AfgCdW1fXTHaiqVlXViqpasWjRol6KlaRW9RkE5wDLkuyRZDvgEGD1cIckDwbeySAEftRjLZKkGfQWBFV1I3A0cCZwMXBaVa1LcmKSJ3bd3gDsCHwkyflJVs9wOElST3qdI6iqNcCaKW3HDy3v3+f3S5JG885iSWqcQSBJjTMIJKlxBoEkNc4gkKTGGQSS1DiDQJIaZxBIUuMMAklqnEEgSY0zCCSpcQaBJDXOIJCkxhkEktQ4g0CSGmcQSFLjDAJJapxBIEmNMwgkqXEGgSQ1ziCQpMYZBJLUOINAkhpnEEhS4wwCSWqcQSBJjTMIJKlxBoEkNc4gkKTGGQSS1DiDQJIaZxBIUuMMAklqXK9BkOTAJBuSbExy3DTbt0/y4W77V5Ps3mc9kqTb6i0IkiwETgIOApYDhyZZPqXbEcA1VXU/4C3A6/qqR5I0vT7PCPYBNlbVJVV1A3AqcPCUPgcDJ3fLHwUekyQ91iRJmmKbHo+9K3D50PomYN+Z+lTVjUmuBXYGrhrulGQlsLJb/XmSDb1U3J5dmPJ33bJ4PnpH5L/RubPbTBv6DII5U1WrgFXzXcfWJsnaqlox33VIM/Hf6GT0OTR0BbBkaH1x1zZtnyTbAHcDftxjTZKkKfoMgnOAZUn2SLIdcAiwekqf1cBzu+WnAZ+rquqxJknSFL0NDXVj/kcDZwILgfdW1bokJwJrq2o18B7gA0k2AlczCAtNjsNtuqPz3+gExF/AJalt3lksSY0zCCSpcQaBJDVui7iPQHMjyR8wuJt7167pCmB1VV08f1VJmm+eETQiyd8xeMxHgK91nwCnTPdAQOmOJMnz5ruGrZlXDTUiybeA+1fVr6a0bwesq6pl81OZNFqS71XV0vmuY2vl0FA7bgLuA1w2pf3e3TZpXiW5cKZNwL0mWUtrDIJ2HAN8Nsm3ueVhgEuB+wFHz1dR0pB7AX8GXDOlPcCXJl9OOwyCRlTVGUn2ZPB48OHJ4nOq6tfzV5n0G58Adqyq86duSHL2xKtpiHMEktQ4rxqSpMYZBJLUOINAW7Uki5P8Z5JvJ7kkyduSbD/Gfj+fof3EJPt3y8ckufMM/R6f5OtJLkiyPskLuvYnTfPu7un2H6ufNBcMAm21uvdffww4vbtPYhlwJ+D1t/eYVXV8Vf13t3oMcJsgSLItg8cnP6Gq9gIeDJzdbX4SMM5/8OP2k35rThZrq5XkMcAJVfUnQ213ZXAvxRIGL0NaUVVHd9s+Abyxqs7uzgjeBTwW+CFwSFVdmeR9DK5uuQ/wRmADcFVVPWroO+4JfBPYrar+b6j9Ed2+13afpwKPZvA+7u2AjcCzgb2n6QdwErAIuA44sqq+OSd/UWqeZwTamt0fOHe4oap+ClzK4P6J2dyFwQuU7g98HjhhynHeCnwfeNRwCHTbrmbw9r3LkpyS5LAkC6rqS137sVW1d1V9B/hYVT2sO3O4GDhihn6rgBdV1UOBlwFv3+y/DWkG3kcgTe8m4MPd8gcZDDGNraqen+SBwP4M/uM+ADh8mq4PSPIa4O7Ajgze6HcrSXYEHgF8ZDDaBcDIeQ5pXAaBtmbrGQz//EY3NPS7DIZ0HsCtz4p3mOVYmz2GWlUXARcl+QDwXaYPgvcBT6qqC5IcDuw3TZ8FwE+qau/NrUEah0ND2pp9FrhzkucAJFkIvAl4Wzd2fymwd5IFSZYwuOv6Zgu4JUSeCfzvNMf/GbDT1MYkOybZb6hpb255xtPUfXYCftBNMB823bG74azvJvmL7vhJstdsf3BpcxgE2mrV4EqIJwNP656x9GPgpqr6p67LFxn8pr4eeCtw3tDuvwD2SfINBhO6J07zFauAM5KcNaU9wN8m2ZDkfOAfueVs4FTg2O7S0t8DXgl8tatlePJ3ar/DgCOSXACsY/BeCWlOeNWQmtFdtXMK8OSqOm9Uf6kVBoEkNc6hIUlqnEEgSY0zCCSpcQaBJDXOIJCkxhkEktQ4g0CSGvf/vuhhSsmwwdkAAAAASUVORK5CYII=",
"text/plain": [
"