{ "cells": [ { "cell_type": "markdown", "id": "c4e97d94-9f03-4956-bb03-2f1753d8afa5", "metadata": {}, "source": [ "# Adaptive QPE\n", "\n", "**Download this notebook - {nb-download}`adaptive-qpe.ipynb`**\n", "\n", "This example illustrates a possible implementation of a quantum algorithm in Guppy, showcasing the possible integration, usage and pitfalls of features including:\n", "- [Control flow](https://docs.quantinuum.com/guppy/language_guide/control_flow.html)\n", "- [Compile time expressions](https://docs.quantinuum.com/guppy/language_guide/comptime.html), especially for referencing global constants\n", "\n", "The implemented algorithm is the basic adaptive random walk phase estimation algorithm found at [arXiv:2208.04526](https://arxiv.org/abs/2208.04526) (Alg. 1 with sampling circuit from Fig. 1), with an example Hamiltonian and numbers taken from [arXiv:2206.12950](https://arxiv.org/abs/2206.12950) (Section V.B)." ] }, { "cell_type": "markdown", "id": "df0a6b3278335d52", "metadata": {}, "source": [ "## Setup\n", "\n", "We begin by specifying the example Hamiltonian in use, in this case $H = 0.5 * Z$, in two variants:\n", "1. The unitary oracle $U(t) = R_Z[-0.5t]$ generated by the Hamiltonian, *and*\n", "2. An eigenstate $\\ket{0}$ of the Hamiltonian.\n", "\n", "Although this may seem redundant, we will need both for executing the algorithm." ] }, { "cell_type": "code", "execution_count": 1, "id": "d77268ee-b737-41cf-86a8-6abfb10b9b89", "metadata": { "ExecuteTime": { "end_time": "2025-12-08T17:47:00.347536Z", "start_time": "2025-12-08T17:46:59.783948Z" } }, "outputs": [], "source": [ "from guppylang import guppy\n", "from guppylang.std.quantum import qubit, crz\n", "\n", "\n", "@guppy\n", "def oracle(ctrl: qubit, q: qubit, t: float) -> None:\n", " \"\"\"Applies a controlled e^-iπHt/2 gate for the example Hamiltonian H = 0.5 * Z.\"\"\"\n", " crz(ctrl, q, angle(0.5 * t))\n", "\n", "\n", "@guppy\n", "def eigenstate() -> qubit:\n", " \"\"\"Prepares eigenstate of the example Hamiltonian H = 0.5 * Z.\"\"\"\n", " q = qubit()\n", " x(q)\n", " return q" ] }, { "cell_type": "markdown", "id": "19fcf6eef9268158", "metadata": {}, "source": [ "## Algorithm\n", "\n", "The algorithm roughly performs the following steps on each iteration, which are outlined below:\n", "1. Sample from a distribution generated by a circuit involving the eigenstate, an iteration-specific ancilla and the oracle (see Fig. 1 of [arXiv:2208.04526](https://arxiv.org/abs/2208.04526)).\n", "2. Based on the outcome, step the phase estimate up or down by a fixed amount.\n", "3. Decrease the step size by a fixed amount.\n", "\n", "Following [arXiv:2206.12950](https://arxiv.org/abs/2206.12950) (Fig. 4), we use 24 such iterations, and finally record the phase estimate using `result`.\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "f4b1a3fe-5586-44a4-b891-7af85c28013e", "metadata": { "ExecuteTime": { "end_time": "2025-12-08T17:47:00.374670Z", "start_time": "2025-12-08T17:47:00.355445Z" } }, "outputs": [], "source": [ "import math\n", "from guppylang.std.angles import angle\n", "from guppylang.std.builtins import comptime, result\n", "from guppylang.std.quantum import discard, measure, h, rz, x\n", "\n", "sqrt_e = math.sqrt(math.e)\n", "sqrt_e_div = math.sqrt((math.e - 1) / math.e)\n", "\n", "\n", "@guppy\n", "def main() -> None:\n", " # Pick initial estimate of phase mean and stdv\n", " # and prepare eigenstate\n", " mu, sigma = comptime(sqrt_e_div), 1 / comptime(sqrt_e)\n", " tgt = eigenstate()\n", "\n", " for _ in range(24):\n", " t = 1 / sigma\n", "\n", " # Sample from the phase estimate distribution\n", " aux = qubit()\n", " h(aux)\n", " rz(aux, angle((sigma - mu) * t))\n", " oracle(aux, tgt, t)\n", " h(aux)\n", " outcome = measure(aux)\n", "\n", " # Adjust estimate and step size\n", " if outcome:\n", " mu += sigma / comptime(sqrt_e)\n", " else:\n", " mu -= sigma / comptime(sqrt_e)\n", " sigma *= comptime(sqrt_e_div)\n", "\n", " discard(tgt)\n", " result(\"eigenvalue\", 2 * mu)\n", "\n", "main.check()" ] }, { "cell_type": "markdown", "id": "971da15f27c8fca8", "metadata": {}, "source": [ "Note that the implementation uses [`comptime`](https://docs.quantinuum.com/guppy/language_guide/comptime.html) expressions to reference the constants `sqrt_e` and `sqrt_e_div` since they are defined outside the function annotated with `@guppy`.\n", "\n", "One may ask why expressions involving `sigma` and these constants are not entirely wrapped in [`comptime`](https://docs.quantinuum.com/guppy/language_guide/comptime.html). This uncovers a subtlety of such wrapping: [`comptime`](https://docs.quantinuum.com/guppy/language_guide/comptime.html) expressions are only evaluated *once* during compile time, and thus cannot react to changing variables such as `sigma`." ] }, { "cell_type": "markdown", "id": "ff9db1b761f2faff", "metadata": {}, "source": [ "## Testing and Evaluation\n", "\n", "We test the implementation by creating an emulator and allocating the maximum number of qubits: One holding the eigenstate and one ancilla that will be reused. Running the emulator once yields an example result:" ] }, { "cell_type": "code", "execution_count": 3, "id": "4a51f004-53aa-41d0-884b-cdfd7c6efab5", "metadata": { "ExecuteTime": { "end_time": "2025-12-08T17:47:01.325159Z", "start_time": "2025-12-08T17:47:00.378285Z" } }, "outputs": [ { "data": { "text/plain": [ "EmulatorResult(results=[QsysShot(entries=[('eigenvalue', 2.3679925580437398)])])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "emulator = main.emulator(n_qubits=2).with_seed(2)\n", "emulator.run()" ] }, { "cell_type": "markdown", "id": "90c22ecc1a52005e", "metadata": {}, "source": [ "However, this is not guaranteed to be the actual phase of our example Hamiltonian, as it is only one example drawn from a distribution. We thus run a larger number of shots, extract the recorded phase from each and visualize them using `matplotlib`. Doing this reveals the expected phase of the Hamiltonian as the highest peak in the histogram." ] }, { "cell_type": "code", "execution_count": 4, "id": "526d9fad-1a5a-4adb-bf11-41729e03c3cf", "metadata": { "jupyter": { "is_executing": true } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjwAAAHGCAYAAABw7lF4AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvctoD+AAAAAlwSFlzAAAPYQAAD2EBqD+naQAATy1JREFUeJzt3XlYVOX/P/7nsA3IMiKKKyqIouKuiIq7gpimaJmpqRmWVvq1zDTelZSV9i5Ly6V8W5ZZivsW4oIrrqHihuIKgoiigOw79+8Pf56P47DM4AwznJ6P65rr8tznPue8zhkGnt5zzxmFEEKAiIiISMbMjF0AERERkaEx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsMfAQERGR7DHwEBERkewx8BAREZHsWRi7AKLKCg8Px82bNzFlyhRjl2JyIiIicP78eUybNs3YpejVzp07cfPmTQBA7dq18dprr2n0OXr0KC5fvoycnBxMnDgRjo6OVV0mVcLSpUvRtm1b9OnTx9illOr333/Ho0ePAAAeHh4YPHiwcQsinXGEh0zOP//8g8WLF0uPpUuXYtOmTUhOTlbrFxISgo8//thIVRrfoUOHsHz58lLXbd++HbNmzariiv5PebU9j19//RVffvkl4uLikJiYqLF+4sSJGDFiBM6cOYO4uDgUFhbqvQZ6LD4+HosXL5ZCwPOaNWsWtm7dqpd9GUJiYiLi4uIwd+5crF692tjlUCVwhIdMzt69e/Hpp59i7NixqFOnDnJycrBs2TLcunUL//3vf/Hee+8Zu0STsGnTJvz+++945513NNb17t0bCoXCCFU9Vl5tz6tevXpYvHixRvvNmzfxxx9/YPXq1ZgwYYLej0vqfv/9dyxduhT/7//9P2OXUiWe/Odq27Ztxi2EKo2Bh0zWhx9+iA4dOgAAioqKMGTIEMycORN9+vRBx44djVuciRs2bBiGDRtm7DKq1I0bNwAATZs2NW4h/xLbt2/H0KFDYWbGNwqoemDgoWrBwsICgYGB2Lt3L8LDwzUCz927d7Fnzx4oFAr4+vqiYcOGauvPnj2LI0eOAAAUCgUcHBzQsWNHKVA9LSEhASdOnMCjR4/QrFkz+Pj4wNraWqPf7du3ERERgczMTLi5uWHAgAGwsNDuJaXNtuXVsWPHDpw/fx6FhYVqox2TJ0+GnZ1dqXN4np7zFB8fj/3798PW1hbDhg2T9puQkID9+/fD3NwcQ4cO1Zj/os11rKg2fVy/Z23cuBG7d+8GAGzevBlnz55Fo0aN8PLLL6ud9927dxEeHg4zMzNp/o8QAsePH0d0dDTMzc3RvXt3tG7dWuMYaWlp2LNnD7KysuDj44NWrVph3bp1UCqVGDlyJAAgLy8PP//8M3r37o1OnTqpbf/XX3/B1tYWAQEBau3aHP/p+S0nT57EuXPn0KBBA/j7+8PKykqjViEETp06hUuXLsHa2hrdu3dHs2bNAAArVqxA/fr1Sw3EoaGhiI+Px9tvv13u9b5z5w7Onj2LuXPnltvv6bqPHDmCy5cvw8XFBX5+frC0tCxzu4rO8a+//sKDBw8APP7dULduXfTp0wfOzs6l7ismJgbm5uZo37492rVrp9FH258Bqt4YzanaePILsqioSK19165dGD58OI4ePYrvv/8ezZs3l/4oP5Geno64uDjExcXh5s2b2LFjB7p164aAgACUlJRI/RYuXIgWLVrg999/x9mzZ/HNN9+gQ4cOOHPmjNSnuLgY06ZNg7u7O/7880+cPn0a7777Ltq2bYtbt26Vew7abltRHffv30dmZiaEENJ5xcXFobi4GEDpc3iezHnasmULRo0ahYiICMyZMwedOnVCamoqQkJCMHLkSBw5cgTBwcHw9PTEnTt3dL6OFdX2PNevLElJSdIcr6SkJMTFxeHevXsa5z106FDs378fv/76KwDg1q1b6Ny5M0aMGIGDBw9iz5498PLywuTJk9V+Lg4fPoxmzZph7ty5OH78OCZNmoTFixfju+++U5urlJWVhffffx8HDhzQqPHbb7/Fzz//rNam7fGfzG956623MG/ePBw/fhwTJ06Et7c3cnNz1fZ548YNdO7cGS+88ALCwsKwb98+DBkyBJ988gkA4MSJE3jttdeQlZWltl1ubi7Gjx+PgwcPVni9t2/fDhsbG/j5+ZXbb9asWdiyZQvGjh2L//73vzh69Chef/11dOrUCXfv3i11G23O8e7du9LP1cWLF7Fw4UK4uLhgzZo1Up+cnBz07t0bw4YNw/79+3Hw4EFMmjQJgwcPhhBC6qftc0AyIIhMzBdffCEAiKioKLX2cePGCQDi8OHDQgghAgMDRY0aNcSUKVNEYWGhEEKI/Px80a5dO9GlS5cKj3Pp0iVhaWkpVqxYIYQQIjMzU5iZmYn58+er9UtISBAXL16Ulj/99FNhZmYm9uzZI7VlZ2eL7t27i86dO5d7TG221baOd999V9ja2pZ6nA8++EAolUq1tifX6+233xbFxcVCCCGSk5OFra2tGDt2rJg4caIoKioSQgjx8OFDYW9vL6ZNm1bu+QiheR0rqu15rt/w4cOFp6dnqeu2bt0qAIiIiIhSz3vixInSz0lSUpIoKCgQHh4eok2bNuLhw4dS/7NnzwpLS0vx/fffCyGEyMjIEHXq1BH9+vUTubm5Ur8ZM2aI2rVriwEDBkhtDx48EADEt99+q1Ff+/btxaBBg6RlbY8vhBBKpVI0bNhQbN68WWqLjIwUAMTixYultry8POHu7i5atWol7t69K7UXFxeL8PBwIYQQp06dEgDETz/9pFbfqlWrBACxe/fuUq/v0/z8/MTw4cMr7KdUKkX9+vXF+vXrpbb4+HhRt25d4efnp9FXm3Msy9y5c0WNGjVEcnKyEEKIFStWCIVCIW7fvq3Wb8+ePdLPvy7PwRNNmjQRo0ePrrAeMj0MPGRyngSeWbNmiUWLFon58+cLPz8/AUC8++67Ur/AwEABQFy/fl1t+6+++koAEFlZWWrt2dnZIiwsTPz0009i8eLFYtGiRcLZ2VlMmDBBCCHEnTt3BAAxd+7cMmsrKCgQ9vb24uWXX9ZYt337dgFAnD59+rm21aYOISoXeACIGzduqLUPHTpUABAxMTFq7WWFi4quY3m1Pc/1K68mIcoPPADEhQsX1No3btwoAIht27Zp7GvUqFGiZcuWQgghVq9eLQCIQ4cOqfVJSUkRlpaWlQ482h5fiMdhwNvbW6Nfq1atREBAgLQcEhIiAIgtW7Zo9H1aly5dRLt27dTavLy8hIuLixQGypKeni6srKzEqlWryu33pO4OHTpotD95jd+6dUutrzbn+MTt27fFunXrxJIlS8SiRYvEzJkzBQCxd+9eIYQQX3/9tVAoFBo/10/T5Tl4goGn+uIcHjJZd+/eRWFhISwsLDBw4EAsWLBAY16EtbW1NDfhiQYNGgB4/DHSFi1aAAD27NmDcePGwdHREd27d0fNmjVhZmaGkpIS6a2Qhg0bYvTo0Zg3bx5CQ0Ph7++Pvn37olevXlAqlQCAa9euITMzE3l5eVi6dKk0NC6EQFJSEgAgJiYGnTt31jgfXbatqI7Ksra2hpubm1pb3bp1YWlpiebNm6u116tXD4cPH1Zr0+Y6lud5rt/zMDc315iT8eTtwfPnzyMhIQHi8X8AATyer3Pt2jWUlJTg0qVLAID27durbV+rVi24uLhUuiZtj/9kUnCbNm009tGgQQO1j+dHRUUBALp27Vrusd955x288cYbOHbsGHx8fHDmzBlERkZi7ty5FU5CDgsLQ1FREYYOHarVeT573Z5uu3TpElxdXaV2bc4RAGbMmIHly5ejZ8+eaNGiBWxsbJCSkgIA0s/h2LFj8cMPP6BDhw4YPHgw+vbti4EDB6r9HOj6HFD1xsBDJuvpT2mVxdbWVuPj108mvhYUFAB4PGdk4sSJ6NixI/bs2aP2y2vjxo1q7+eHhIQgMDAQoaGh2L17NxYsWIAGDRpgw4YN6N69u3Rfl6ysLOlTQU+bMWOGRgB7QpdtK6qjssq6XjVq1ND4pW5hYaF2HxtdrmNZnuf6PY+aNWvC3Ny81FqSkpKQmpqqts7T0xOenp4oKSmR5nE8uz0AjUnWT/qUNvfj2Xko2h7/yXV+esL308d/8nMOQJonVdHk7zFjxmDWrFlYvnw5fHx8sGzZMigUCkyaNKnc7YDH83d69OiBOnXqVNgXKP+6PXudtDnH3bt348cff8SqVavU6j148CD+/PNP6efQxcUFMTEx2LBhAw4cOIBvv/0WM2bMgL+/P7Zs2QIbGxudnwOq3hh4SPbu3r2L+/fvIygoSO0X171795CUlIS2bduq9ff19YWvry8AIDY2Ft27d8eHH36Io0ePwt3dHZaWlmjdunWp94Ipj67bllcHgCr/JazLdSyrtue5fvr25H/6EyZMKDdEPhn5iomJgZeXl9Sek5OD+Ph4tVEeR0dH2NjYaIx25eXl4fbt22qjGdoeXxdP9nn+/PlyJxRbW1tj0qRJWLJkCYKDgxESEoIBAwZU+JH+wsJChIWF6XTDz5iYGI22K1euAIDGqKI2noxiPfspsyftT3NwcMDkyZMxefJkAMDKlSvx1ltvYfXq1Zg6dapBngMyXYytJHv16tWDUqnExYsXpTYhBObOnQt7e3upLTk5GfHx8Wrburq6olGjRsjLywPw+H+gkyZNwurVqxEdHa1xrHPnzpV5d19tt9WmDgBwdnZGTk6OWpshaXsdy6vtea6fvo0aNQr16tXDJ598gvz8fLV1RUVF0h/QESNGwNbWFgsXLlQbxVq8eHGpHwnv2rUrdu3aJY22AMCiRYs03o7U9vi6ePnll+Hs7Izg4GBkZ2errbt8+bLa8ttvv43CwkIMGzYMubm5CAwMrHD/hw8fxqNHjzB8+HCta4qOjpZCOgBkZGRg+fLl6Ny5c6U++v0klD39c5icnIzff/9drd+FCxc0rmvPnj0BQPq5NMRzQKaLIzwke5aWlvj8888RFBSE3NxctGzZEgcOHEDv3r3V/sedkZGBwYMHo2XLlmjXrh3s7Oxw6NAhXLlyBZs2bZL6LV68GA8fPpTm2nh4eCAlJQWnT59GVlYWTpw4UWYt2myrbR3Dhg3DZ599hldffRW9evWCubm5xr1ujHEdK6rtea6fPtnb2yM0NBQjR45Eq1atEBAQgDp16uDWrVs4ePAgJkyYgI4dO8LZ2Rm//PILJkyYgP79+6N///64dOkSGjVqVOoIxRdffIEBAwagX79+8PPzQ1RUFDp16qRxjbQ9vq7ntGPHDgQEBKBdu3ZSWDt69ChcXV3xyy+/SH2bNWsGf39/hIWFwdHRESNGjKhw/9u3b0fr1q11GpkZN24cvvjiCzRv3hyOjo7YuHEjMjMzsWPHDp3O7YmXXnoJnTt3xqhRo/Dmm2+iqKgIu3fvxsyZM9Xe4jp27BiGDRuG/v37w93dHVlZWVi3bh3atWuHiRMnAjDMc0Cmi4GHTI63tzdmzJhR4RwBX19f1KtXT6O9VatWmDFjBmrXri21zZkzBz4+Pjhw4ACKioowb9489OrVC3Z2dnBwcADw+O2WmJgY7N27F1FRUcjJycErr7yCkJAQtRvw2djYYPPmzThz5gwOHDiABw8ewMXFBSNHjoSPj0+5NWuzrbZ1tGvXDpGRkQgNDUViYiJKSkqkUYXSvlqirOs1YMCAUr9gs1+/frC1tVVr0+Y6VlTb81y/8jRr1gwzZszQuOlkWecNAJ06dcK1a9cQGhqKqKgoZGVloVu3bvjss8/U9vPqq6+iU6dO2LRpE7KzszFx4kS88MIL6NKli8Y+e/XqhfPnz2Pz5s3Iy8vD9OnT0bdvX1hZWaldI12OP336dPTo0UPjWCNGjEBGRoZam7e3N27cuIGtW7ciOjoaSqUSwcHB6N27t8b248aNQ1hYGF577TWtJsTv3LkTY8eOrbDf0ywtLbF9+3aEhIQgJiYG06ZNw9ixY1GrVi21ftqeo5WVFY4fPy7tr379+ti9ezfMzMwwY8YMtGrVCsDjEaxRo0YhNDQU165dg52dHZYtWwZ/f3+1t1y1fQ6o+lMIbWYaEhGZgICAAJw6dQpz5swp89vSq1KXLl1Qs2ZNhIeHG7WOypo+fTqWLl2Kc+fOlfppqqedO3cOHTt2xMmTJ+Ht7a3V/q2trTF16lSjz9fShyfflj5v3jz4+fkhJCTE2CWRjjjCQ0TVxosvvoimTZsiLi5OY84F6SY/Px8bN25Ejx49Kgw7AJCZmYlZs2ZV+JF3uUpMTMSDBw8wYcIEjdtjUPXAwENE1YY2E2upfCkpKfjjjz+wd+9epKSkYOvWrVpt16tXL/Tq1cvA1ZkuXT6ZRqaJgYeIqJLGjh0LGxsbY5ehk8LCQty+fRtdu3bF/PnzDTopt6x5OUTGwDk8REREJHu8Dw8RERHJHgMPERERyR7n8ODx97ncvXsX9vb2GvcuISIiItMkhEBmZiYaNGhQ4dftMPDg8XcEPc+3HhMREZHxJCQkoFGjRuX2MXrgOX36NNavXw9nZ2d8+OGHpfZJTU3F+vXrERsbi44dO2L06NEaSW7v3r3Yv38/rK2t8dJLL6Fdu3Za1/Dke4ASEhI07oRKREREpikjIwMuLi4a3+dXGqN9SquoqAjdu3dHSUkJLCwsUFxcjNOnT2v0O3PmDPz9/dGpUyf4+voiJiYGOTk5WLt2rdQnKCgIP//8M6ZMmYK0tDT89ttvCAkJwciRI7WqJSMjAyqVCunp6Qw8RERE1YQuf7+NNsKjUCiwfPlyeHl54b333lP7Nt0nCgsL8fLLL+OFF17A6tWrpfa4uDjp39euXcM333yDrVu3YtiwYQAAlUqFadOmYdiwYbCwMPogFhERERmZ0T6lZW5uDi8vr3L77Nq1C3Fxcfj000/V2ps2bSr9+++//4aDgwOGDBkitY0fPx5JSUmIjIzUa81ERERUPZn08MeZM2fg7OwMGxsbfPXVV8jJyUHHjh0xcuRIaQ7P9evX0bhxY5ibm0vbubm5Seu6d++usd/8/Hy17+F59tuGiYiISF5M+j48GRkZKCkpwYABA5CdnQ2lUon3338f/v7+KCkpAQDk5uZqTFaytbWFubk5cnJySt3vggULoFKppAc/oUVERCRvJj3CY29vj4cPH+LPP//EoEGDAACvvPIKWrVqhbCwMAwZMgR2dnZ49OiR2nYZGRkoLi4ucwJTUFAQZs6cqdafoYeIiEi+THqEp02bNgCg9uV2LVu2hI2NjTRx2dPTE3FxccjLy5P6XLlyBQDQunXrUverVCrh4OCg9iAiIiL5MunAM3jwYDg6OmLPnj1SW0REBHJzc6UQNHz4cBQVFal9imvZsmXw8PBA+/btq7xmIiIiMj1GfUtr/vz5uHv3Lo4ePYq7d+9i2rRpAIDvv/8eVlZWcHBwwKpVqzBhwgRs3boV1tbW2LFjBz788EP06NEDANCgQQMsWbIEM2bMwO7du5GamooLFy5g165d/JoIIiIiAmDEGw8CwLp165CSkqLRPmXKFFhaWkrLSUlJCA8Ph5mZGTp37oyWLVtqbHPz5k0cOXIESqUSgwYNgpOTk9Z18MaDRERE1Y8uf7+NGnhMBQMPERFR9aPL32+TnsNDREREpA8MPERERCR7DDxEREQkeww8REREJHsmfadlIjK+ph+Fqi3HfT2kjJ5ERKaLIzxEREQkeww8REREJHsMPERERCR7DDxEREQkeww8REREJHsMPERERCR7DDxEREQkeww8REREJHsMPERERCR7DDxEREQkeww8REREJHsMPERERCR7DDxEREQkeww8REREJHsMPERERCR7DDxEREQkeww8REREJHsMPERERCR7DDxEREQkeww8REREJHsMPERERCR7DDxEREQkeww8REREJHsMPERERCR7DDxEREQkeww8REREJHsMPERERCR7DDxEREQkeyYReG7fvo3bt29X2C8xMRExMTEoKioqdX1CQgIePHig7/KIiIiomjNa4BFCYPXq1ejWrRs8PDzw0ksvldv/6tWraNmyJVq1aoV79+6prTtz5gxatGiBtm3bwsXFBf3790dycrIhyyciIqJqxGiBp7CwEAcOHMD333+PqVOnlts3Pz8fr776Kl577TWNdTk5ORg2bBj69euHlJQUPHjwANnZ2Zg4caKhSiciIqJqxmiBx8rKCqtXr0aPHj0q7Dtr1ix06tSp1FGgnTt34v79+/jyyy9hbm4Oe3t7fPLJJ9i9e7dWb5MRERGR/JnEHJ7ybN++Hbt378YPP/xQ6vrIyEi4ubmhTp06UtuTEHXmzJkqqZGIiIhMm4WxCyjPnTt38NZbb2HHjh2ws7MrtU9KSgpq166t1ubo6Agz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QaVSqW1nb28Pc3NzZGVllbrfBQsWQKVSSQ9OcCYiIpI3kw48tra2uH//PubNm4dVq1Zh+fLlCA8Px19//YXw8HCpz7MjNFlZWSguLoatrW2p+w0KCkJ6err0SEhIMPi5EBERkfGYdOBp2bIlAKBXr15SW+fOnWFjY4OYmBgAgIeHB27fvo3CwkKpz/Xr16V1pVEqlXBwcFB7EBERkXyZdOB54YUXYGtrixMnTkht58+fR25uLlq1agUAGDZsGHJycrBlyxapz6pVq9C4ceNS5+8QERHRv49JT1p2cnLCjz/+iAkTJmDcuHGwtrbGmjVrMH78eAwYMAAA4Orqis8//xyBgYE4dOgQUlNTsX37dmzbtk3tk11ERET076UQQghjF1GR6Oho7Nq1C2ZmZvDy8kLv3r01+pw6dQoHDhyAUqlEQEAA3NzctN5/RkYGVCoV0tPT+fYW0TOafhSqthz39RAjVUJEpE6Xv98mPcLzhKenJzw9Pcvt4+3tDW9v7yqqiIiIiKoTvudDREREssfAQ0RERLLHwENERESyx8BDREREssfAQ0RERLLHwENERESyx8BDREREssfAQ0RERLLHwENERESyVy3utExEpuPZr5oA+HUTRGT6OMJDREREssfAQ0RERLLHwENERESyx8BDREREssfAQ0RERLLHwENERESyx8BDREREssfAQ0RERLLHwENERESyx8BDREREssfAQ0RERLLHwENERESyx8BDREREssfAQ0RERLLHwENERESyx8BDREREssfAQ0RERLLHwENERESyx8BDREREssfAQ0RERLLHwENERESyx8BDREREssfAQ0RERLJXrQJPTk4OHj16BCFEqesLCgpQXFxcxVURERGRqas2gefOnTtwcXGBo6MjEhMT1dZdv34dvXv3hq2tLWrUqIGxY8ciIyPDSJUSERGRqakWgae4uBjjxo2Dn5+fxrqCggK88MILqFu3Lh4+fIjr16/j3LlzePPNN41QKREREZmiahF45s2bBycnJwQGBmqsCw0Nxc2bN7F48WKoVCo0btwYn3/+OTZu3Ii7d+8aoVoiIiIyNSYfeA4fPoxVq1Zh5cqVpa4/deoU3Nzc0LBhQ6mtT58+EEIgMjKyqsokIiIiE2Zh7ALKk5KSgtdeew2rVq2Ck5NTqX2Sk5NRu3ZttbbatWvDzMwMycnJpW6T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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Ensure that matplotlib does not print warnings. Added to avoid failing on CI.\n", "import matplotlib; matplotlib.set_loglevel(\"critical\")\n", "import matplotlib.pyplot as plt\n", "import matplotlib.ticker as ticker\n", "\n", "shots = emulator.with_shots(500).run()\n", "\n", "fig, ax = plt.subplots(1, 1)\n", "ax.hist([shot.as_dict()[\"eigenvalue\"] for shot in shots], bins=100)\n", "ax.xaxis.set_major_locator(ticker.MultipleLocator(0.5))\n", "ax.set_title(\"Phase estimate [frequency / phase]\")\n", "ax.set_xlabel(\"Phase estimate\")\n", "ax.set_ylabel(\"Frequency\")\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "guppylang (3.13.11)", "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.12.12" } }, "nbformat": 4, "nbformat_minor": 5 }