{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# **Workshop: Quantum Computing 101 Part II**\n",
"\n",
"The second part of the workshop will focus on a hybrid quantum algorithm, the variational quantum eigensolver (VQE), giving a general description of how the algorithm works. We will implement the VQE algorithm for the Hydrogen molecule $H_2$. \n",
"\n",
"The $H_2$ system is one of the smallest systems one can imagine to begin using VQE with. The $H_2$ molecule is so small that it can be solved analytically and also extremely fast on your laptop. \n",
"\n",
"For this notebook, we will be following the work reported in [O'Malley etal 2015, *Scalable Quantum Simulation of Molecular Energies*, arXiv:1512.06860v2](https://arxiv.org/abs/1512.06860). The following figure given in the article summarizes the entire setup:\n",
"\n",
"\n",
"\n",
"Fig. 1. The variational quantum eigensolver circuit and hardware. Source: arXiv:1512.06860v2. \n",
"\n",
"The right part of the figure describes our \"qubit Hamiltonian\" of $H_2$. The top part of the figure describes the physical pulses with timings. \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## **VQE - In a nutshell** \n",
"\n",
"- Prepare some quantum state using a so-called variational form (ansatz)\n",
"- Gates in the ansatz have free parameters\n",
"- For each value of the parameters the resulting state has some mean energy\n",
"- Find the ground state variationally, that is, minimising over the parameters\n",
"\n",
"\n",
"\n",
"Source: Algorithmiq\n",
"\n",
"\n",
"The variational principle: \n",
"\n",
"$$ \\langle E \\rangle = \\langle \\psi (\\vec{\\theta}) | \\hat{H} | \\psi(\\vec{\\theta}) \\rangle \\geq E_{ground} $$\n",
"\n",
"\n",
"Firstly we will write our quantum circuit:\n",
"\n",
"1. Prepare our initial state\n",
"2. Create and applying our parametrized ansatz using parameterized gates\n",
"3. Measure our expectation values \n",
"\n",
"Then we apply our classic part which consists of\n",
"\n",
"1. Calculating the energy \n",
"2. Using a classical optimizer to suggest new parameters $\\theta$.\n",
"\n",
"\n",
"We will do this first for the simulator to see how the algorithm works, and then run a simplified version on the real quantum computer. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's first import some libraries and setup the backend connection"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"from iqm.qiskit_iqm import IQMFakeAdonis\n",
"from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister, execute\n",
"from qiskit.circuit import Parameter\n",
"from qiskit.compiler import transpile\n",
"from qiskit_aer import Aer"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"# provider = IQMProvider(\"https://qc.vtt.fi/helmi/cocos\")\n",
"# backend_helmi = provider.get_backend()\n",
"\n",
"backend_sim = Aer.get_backend(\"aer_simulator\")\n",
"\n",
"fake_backend = IQMFakeAdonis()"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"def create_ansatz_circuit(qreg, creg, parameter):\n",
" \"\"\"\n",
" Create H2 ansatz circuit given in O'Malley etal 2015.\n",
"\n",
" args\n",
" qreg - qubits\n",
" creg - classical bits\n",
" parameter - parameter for parameterized circuit\n",
"\n",
" returns\n",
" ansatz_circuit - a parameterized circuit\n",
" \"\"\"\n",
" ansatz_circuit = QuantumCircuit(qreg, creg)\n",
"\n",
" # H2 circuit\n",
" # 1 - create HF reference state\n",
" ansatz_circuit.rx(np.pi, qreg[0])\n",
" ansatz_circuit.barrier()\n",
" # 2 - ansatz: U(theta)\n",
" ansatz_circuit.rx(-np.pi / 2, qreg[0])\n",
" ansatz_circuit.ry(np.pi / 2, qreg[1])\n",
" # 3\n",
" ansatz_circuit.cx(qreg[1], qreg[0])\n",
" # 4 - parameterized Z-rotation\n",
" ansatz_circuit.rz(parameter, qreg[0])\n",
" # 5\n",
" ansatz_circuit.cx(qreg[1], qreg[0])\n",
" # 6\n",
" ansatz_circuit.rx(np.pi / 2, qreg[0])\n",
" ansatz_circuit.ry(-np.pi / 2, qreg[1])\n",
" ansatz_circuit.barrier()\n",
"\n",
" return ansatz_circuit"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAoEAAADuCAYAAABGbt0eAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAwCElEQVR4nO3dd3xTVf8H8M9NmnSkI13QUmYXrVKgoLKXoogylQcVFyrIcis8zp+PIg5AFGUIOBAQARUQZAmICjIUKJUChbbs0tLddLdJ7u+PYqG2pUma5Lb3ft6v1/N6bHLHN+Tcc74595xzBUNetggiIiIiUhSV1AEQERERkfMxCSQiIiJSICaBRERERArEJJCIiIhIgZgEEhERESkQk0AiIiIiBWISSERERKRATAKJiIiIFIhJIBEREZECMQkkIiIiUiAmgUREREQKxCSQiIiISIGYBBIREREpEJNAIiIiIgViEkhERESkQEwCiYiIiBSISSARERGRAjEJJCIiIlIgJoFERERECsQkkIiIiEiBmAQSERERKRCTQCIiIiIFYhJIREREpEBMAomIiIgUiEkgERERkQIxCSQiIiJSICaBRERERArkInUARFKIO/K3VdsXFBTg8OE4dOkSCy8vL4v2ie3c0ZbQiIjICZzRDgCNuy1gTyCRBQoLC/H77t0oLCyUOhQiIpKAHNsBJoFERERECsQkkIiIiEiBmAQSERERKRCTQCILuLm5o0OHDnBzc5c6FCIikoAc2wHODiaygK+vHiNHDJc6DCIikogc2wH2BBJZwGg0IicnB0ajUepQiIhIAnJsB5gEElkgMzMT8xcsRGZmptShEBGRBOTYDjAJJCIiIlIgjgmUEVEUUVwhSh2GVTw0AgRBkDoM2WAZIJYBYhkgSzEJlJHiChHBsxKlDsMqaVOjoNPywrcXlgFiGSCWAbIUbwcTERERKRB7AoksEBwcjDdef03qMIiISCJybAfYE0hERESkQEwCiSyQlZ2NL79aiqzsbKlDISIiCcixHeDtYCILVJSXIzU1FRXl5VKHQk4kFuZATE8CCrMBkxFQuwA6XwhBkRC8/KUOjxxMFEUg9xLEyylAqQEwmwEXDaAPhtA8AoKbTuoQyYnk2A4wCSQiuoaYdgrmwxshnj5YmfzVRecHoV0XqGKHACHRXN5CJkSzCWLKnxCPbIZ4IQEoK6p7Y98WECJ7QRU7BIJvsPOCJLITJoFERADMZ+Ng/vVLIO2kZTsU5UBM2AFTwg6geRhUfcdCFd7NsUGSw4iiGWLcJpj3rQYMGZbtlHsJ4oHvYDrwPYSwm6G6dTyEgDaODZTIjpgEEvqF+uDXiTHVXissM+FUVgmWH87Ap39cgsksUXDkFEouA2JZMcy7lkCM22T7QS6nwPzdGxBjbofqtokQ3L3sF6CTKLoM5KbBvHkOxPPxth4BYsqfMJ2Ng6rPIxC6jYKgUts1RkdT8vevZEwCqcrKuAxsTsyFIABBXlo80qUZPhoaiuhmHpjwQ7LU4UlKr9dj+PBh0Ov1UofiUEorA2JuGkyrXgHyLtnneEe3w3TuCNT3vwfBv7VdjulsSisD5tMHYV77NlBR2vCDmSpg/vULCKcPQjXqfxBcm96YQaV9/9aQYzvA2cFU5XBqEb6Jy8SKw5mY/Vsqus+Lx4W8Moy7uTkCdMr+veDu7o6OMTFwd3eXOhSHUlIZEHMvwbTiBbslgFUMmTAtfxFi1nn7HtdJlFQGzMkHYP7u/+yTAF5DPB8P07cvQywrtutxnUFJ37+15NgOMAmkOhVXmLH/fAFUKgFh/vIp9LYoKirCXwcPoqjoOoPEZUiuZUAsLYRp1cvXn/jRECX5MK16GWJxnmOO70SyLQNpp2BeNx0wGx1zgrSTMK99G6LYtO+hyvX7t4Uc2wFlp/X12L59B9Z8/wMSEhKQl5cPvd4HoaGh6N+vL8aPe0Lq8JwizN8NAJBTXCFxJNIyGAzYunUbWoaEQKdrerd4GkKOZcC84zMgL92qfbyeWgaVlz/MBdkomPdI/TsUZMG8bR7UI1+3McrGQ25lQDSWw/TTLMBo+VIfVn//AMSzhyEe2gDhphE2Rto4yO37t5Uc2wEmgbUoLy/HCy9Nw9at2wAArVq1QnRUMLKys3Dw4CGcOnlKlkmgh1YFfw+XqrEgE7sHoUuIJw6cL0BSln1vl1DjpIQyYE4+APHoz1bvp/Lyh8qnuVX7iIm/w3zid6ii+1p9PqkoogzsWQ5knbNqH1u+fwCVYwTDboHg28LqfaWghO+frmISWItXX3sDW7duQ98+ffDmm6+jTeurA7wNBgP+/OughNE5ztt3tMHbd1Rf3uCHo1mYsi5FoojI2eReBkRRhPmXJU49p3nXEgjtezWZ2aKyLwOF2RAPfO+8E1aUwfz711APf8V552wAuX//VB2TwH/ZvecPrP9xAzp16ojFixbAxaX6P5G3tzcG3narRNE51qL9afju7yxo1CrEBHngv/1boqWPK0qNV8e0aNUCDj/bGSuPZOLdXy5Wvf7V6Ag099Tgri+PSxE62Yncy4B4Ph7IdvKEjfzLEFP+ghDR3bnntZElZaB3W29seeLGGvtq1QLUKgEuL//hzJCtIh7ZAphNzj1n4m6IAydC0Pk69by2kHsdQNXJfmJITk4uPpg5C7cOHIQbOnRC774DMP2dd1FcXIyXX30N4ZHRWLb8m6rtv/rqawDAlMkTaySAcpeUVYqdyfnYejIXs35LxdClx3FzS098dk941TblJhGPrD6FV29thY7BlWMiht/oh6HRfnjie/kuH6B1dUVoaCi0rq5Sh+JQci8D4uGNEp13gyTntYUlZWDPWQO83thX7X+Rsw4hq7gCb2yz7jarM4lmE8wNWQ/SVmYjxPitzj+vDeReBzSEHNsBWSeBx4+fwN1Dh2HJ518iKysL4eFhMBqN+HrZcjz73AtISTkNALghOgoAUFpair379kGlUqF7t244Eh+PN/7vf3jk0ccwcdJT+GzREuTk5Er5kZxq37kCLD+cgfs7B6JHm6uL3x5OLcLs31Kx7L5IhPhosfjecExZn4I0g3yep/hv/n5+eHDMA/D385M6FKeSUxn453Fgkpz7bBxEKyYhNCZ1lYFradUC1j4chT1nDHhv18Vat2kULqc4bkZ4PczJByQ5b0PJqQ5oKDm2A7JNAnNycvHkxMnIzMzCE48/hr17fseG9Wuxf+9uTJv6Inb9+huOHk2AIAhoH9UeAHAiMRFGoxF6vR7LV3yD/4x+AN+uWo29+/Zjx86dmP3hHAy8407s2980L2ZbTN95AUaTWGOMyDs7L8BoFhH3bCx2peRjdXyWRBE6h9lsRllZGczmpr3cgy1kUwZyLgIVZdKc22wCMs5Ic247qKsM/OOze8LhplFh7JokJ0dmHTH9lHQnz0iB6OTb0PYimzqggeTYDsg2CZz+zgykp6fj4YcexCsvT4On59Xp3E+OH4foqCgYjUa0DAmBl6cnACAzIxNA5eSPWbPnoH+/vtiyeSOOJ8Rj08Yf0aN7dxgMBkx56hmkpVu3vERTlZJdilXxmRgYoUfvtt5VrxvNIvaeMyDQU4Ov/rosYYTOcfnyZcycNRuXL8v/s/6bXMqAmC5tgiL1+RuirjIAAE/3CsaQaD+M+PoESioad+Mo6XdQUQZkX5Du/A0glzqgoeTYDsgyCUxOTsGmzVvg6+uLl158vtZtbuxwAwAg6kovIAAUl5QAAIxGI1q3bo0F8z9FRHg4tFot2rePxOJFCxAYGACDwYClS5dVO96FCxfx5MTJ6BTbFV1u6oaXpv4XubnyuHU845cLMJlFvD3o6izp3m29MfamZvj0j0uYOzwUbi6yLEp0hSzKgCFT0tOLhgxJz99QtZWB/mE++OCutvjPikScy5Wol9Ua+SwDtpJFHUA1CIa8bFHqIOzt47mfYN78hRj76MN4/bVXa93mf29Nx4pvVuLpp6bg2WeeAgBs2boNTz/zHADgtVdfxmNjH62x36fz5mPuJ/MQERGOLZsqB5kXFhbh7qHD4OPjg+eefRqlpWWYOWs2AgICsGbVSqhUtl0YU6e9gty8PIu3NwouWNt6kk3nsoZOq0L887GY8/slLNyfht8mxuDgxUK8sNH62133nF8IF9FBK/ZfR4cOHazavqCgAHFxcYiNjYWXV+3jov4tISHBltAahGWgbkP0ORjiW/sPs38WAr4ewSsAgkpdObawoO7bXnUtJrw93wc/5ARYF7QNnFUG2vi64q+nO+OtHecxf29ag47lrDLwfFAq2rvXvtZdfWXA0u8fqLsMLLwchPhixy8y7IwyYM86AJCmLXBGOwA4vi3w1esxa+Z7Nu0ry+mv+/ZVjtnr1q1bndukp1d250Zf0xPo4321mzssLKzW/f55/eLF1KrXVq1eg8uXM/DtN8vRokXlgqBBQc0x+r4x2LnzF9x++0CbPkduXh5ycnIs3t6k0gBOeGb9h0Pa4UxOGRbsq6z4x65OwpHnO2NdQjZ2nzFYdazc3Fyozc5fhb6szLpei4qKiqr/t3Rfa747e2EZqFuhtgSoY4UOaxYCFlRqCDYsGlxYXOaUMuGMMuCuUWH9o9HYcDy7wQkg4LwyUOJnBOp48pmlZcDW7x8A8gyFyDE4vsfUGWXAnnUAIE1b4Ix2AJCmLbCULJPA1EuVD4QPaVH7Cu1GoxGHDh8GAERFRVW9HhoaWvXfGo2m1n1dr0wNN5muDvDd9euv6Nq1S1UCCABdYmPRqlUr7Ny1y+Yk0Fevt2p7o+D4r/PO9r64r1MgOn4UV/Xa6ZxSvLz5HL4aHYGOc+JQbMW4IF9fX0l6Al2tnOJfXl45402j0Vi8r58EM8hYBupmcs0HUHsvkLmg/hmj1vQE1np+rQ5+fnpLQm0QZ5SBe2P80bmFJyID3HFfp8Aa79/w4WFcyLO8kXRWGShXVwAorPW9+sqAtT2BtR7Dwwd+Lm4WxdoQji4D9q4DAGnaAme0A4Dj2wJrc4VryfJ2cNebuyM/Px9rVq9El9jYGu//uGEjXnxpGnQ6HY4c/guCIFS917f/rbh0KQ3vzpiO0f8ZVWPfr5Z+jRnvvo/WrVvjlx2Vj5Xr1qM3Bt85CP97841q2z45cTJycnLw/ZpVdv6EtSsqNyN4VqJTzmUvaVOjoNM6fxxJ3JG/rdreZDKhtLQUbm5uUKste/JDbOeOtoTWICwDdRMvnYTp66dt3t/nlU1Q+TSHOf8y8t+72+r9VWNmQdWmk83ntxTLQN3Mf34P887FNu3b0O8fKjXUL6yHoHH8GnMsA5ZxRjsASNMWWEqWozgDAirH3Rw7VnPV8oyMDHwwcxYAIKp9+2oJIADcNXgwAGDduvU19hVFEWvXVr7eo/vVW80GgwHe3jXHB+h9fJCfn2/TZ6DGRa1WQ6fTWXXhUyPTrB0g4aPbhObh9W9EDiUERUp38oA2TkkAyXHk2A7IMgns1bMHAGDxki9w5szVQap//30UDz08Frm5eQCA6OioGvuOH/c4PD098dfBQ5g3f0HVbV+j0YiZs2bjRGIitFptrZNGSL5ycnKxavUaRS0WLjeCixYIuUGakwdFQHBz/IQAqkdQBKCtY1CggwlO6AUmx5JjOyDLJHD8+Cfgq9cjLS0Ng+8ehruGDMNttw/CPaNGo1Wrluh+pRfv2uVh/uHv74+5H30IrVaLj+d+ih69+uLeUfehR88+WPL5l3BxccG7M6YjPPzqxBFvb28YDAU1jpWXnw8fHx/HfVBymrKyUiQlJaGsrPYxZdQ0qGKHKOq8VJ2gdYdw422SnFsVa8MtZGpU5NgOyDIJDA4KwrcrV2BA/35wddUiNTUVeh893nn7LXy+ZBHOnjkLAIiOqtkTCAD9+vXFhvVrMXzYULi4qHH8xAmoXVxw1+A78f13qzBi+LBq24eFhSI5JaXGcZKTUxBexyxjInI+Iao34KF37klddRBuHODcc1KdVF2HOv2cQttYCP5OmLZPZCVZzg4GgPDwMCxZ/FmN14uKinAxNRUqlQqRkRHX3f/D2TMtOtetA/rjwzkfIy09HcFBQQCAI/HxOH/+PF6e9pJN8ROR/QlqDVQ9H4B5x0KnnVPVfTQEjeNnhJJlhMB2EKL6QEzc7bRzqno96LRzEVlDlj2B15OUnAxRFNG2TRu4u9tnbMh9941GYGAAJk6agl927cKWrdvw/PMvoVPHjhg4UJpbD0RUO+Gm4UBL6xaJtVlQBITuo51zLgfqGKzDgac64fiLXbDliRsRoGva/QeqO54C3L3r39AOhK7DIbRuvLNDSdma9pVsg5MnKx8gXtt4QFt5eXpi+bKleOedd/Hc8y9BrVZjwID+eO3Vl21+Wgg1Ll5eXrh94ECrVolXgntj/HF3lB983V1wQ3MPlFSYkVFYjknrUpCS3TjHzQiCCuq7X4Tpy0lAheUx/rP2myVrCgIA1Bqoh7wEQcIZyfaydHQEHluThPi0Ijx2U3PMvrsdxq5pus9CFnS+UA16Gub1Myzex+rvHwD0LaDq/7i14TVq98b447ZwPZ7feBqrxkQ1meveHuTYDiguCTx1qrLiiqpjPKCt2rRuXevt56bMx02NhBe6wF2jwoX8MriqVQj1d8PywxkY/32y1OE5laenZ9WEIrpqZAd/rInPQoVZxJbEyhlzU3oG4/NRERiw6KjE0dVN8AuB6t7/wfzdG4DJsqcU1PYYsLpPoIJq5OsQAtvZGGHj0bmFDoXlJsSnFQEAvj50GR8OaQeNOhkVpqa7zKwquh+Qewnm376yaHurvn8A0PlCfd8MCBLNRnaUkR38sexQ5TOQF/+Z3qSu+4aSYzuguCTw5KnKnsBoO/YEylV+qQkrj2SioMyEd3ZewB2Rerx6ayvFJYAAUFJSgjNnzqJdu7Z2G0bQ2NX3I8BFJaBXG2+MXZ0Eo/lqMrD/fAFe6hsiYeSWUbXrAox6C+a1bwEVdnyUl1oD1YjXoIroYb9jSqidnxtignSIe65z1WseWhVCvLU4m+v4R6A5kqrnA4AgwPzrl/Y9sHcg1Pe/D8Gv8V8H/3a9637S2pRq1/w/CSDQdK77hpBjO6C4JHDFsqVSh9CkdG6hwyd/VD6Gr2uIJ+JSa3/kktzl5eXhh7VrMe6Jx2Vz8denvh8BA8J8sPecoVoCCADP9mqBH4833mdlXksVehOERz+B6afZQLodbm8Gtqu8BRxU96SzpujA+QLc+cWxqr8z/k8+vSGqHvcDAW1g3jIXKGp4uRUie0I16BkIns5/bKQ9XO+6vz1CX+s1DzSt695WcmwHFJcEknU6t9AhLrXyNlDXlp7YIPOLXEn2TumIiIDaK7LYj+NwMb/8uj8CRtzoj3UJ1cdHvTKgJcID3HDb4gTHBW5nQmA7qB+ZC3H/Gpj3rbJqnGAVFy2EW0ZB1ftBCOranzveVJ3OLkVr/dUnXXi5qqHTqpBqKJcwKvtSRfSA0PJGmHd8BvHYL4Bo3XNvAQA6X6humwDhhgE1nkTV1NR13dd2zQNN87qnSkwCqU4tvLUQReDSlcq+Y7AOM365IHFUZC8959f/3Mzr/QgY1F6PaZuvPpHnxb4huCfGHwMXJ6DEyofHS01Qu0DoNQZC1+EQj+2E+fBGIOtc/Tv6hkDVZSiEmNshuMtnsPi14tOKUGEWMTBCjx1JeZjcIxir47Oa9HjA2gju3lAPnQax76MwH9kM8cgWoDiv/h1bxVSWgfa9ZPMDoK7r/t/XPNC0r3tiEkjXERuiQ9yloqq/80qMmNwjWJFjApXoej8CbmnliRMZJSgqr6z0n+/TAg90DsTAJUeRX2qSLOaGEtx0ELoOg9BlKFCQBTH9FMS0JKAwG+LxXwFjGaB1h2rI1Mpbvt7NmnyvjyUe/PYkvhodgYUjw5CcXYqHvj0pdUgOI/g0h7rfYxD7PALkpFaWgcspEA//VPn9a1yh6jmmcvmfoEgIHs5ZasZZ6rru/33NA/K57pWMSSDVadOJXGw6cXXg7y2fxksYjbRcNBoEBTWHi0Yev/Qtcb0fASM7+GP9scrbQiE+WswZGoqU7BLsmhADACgziug+r+mWF0EQAO9ACN6BQGQvAIDxzCGgoAxw1UHVvrfEETpXQnoxbv6k6X6fthBUaiCgNYSA1kCHgTCe+K3y+3fzqpxQIlN1XfdZRRVV1zwgz+u+PnJsB5gEElkgMCAA48eNkzoMp7rej4Ch0X4YsKhy/E9qfjmEaXucHh8R2V9d133CC7FV1zygzOteju0Ak0AislqHOXFSh0BETsRrXp74OAsiC6Slp+Pd995HWnq61KEQEZEE5NgOMAkksoQowmQyAaK8ZkQSEZGFZNgOMAkkIiIiUiCOCZQRD42AtKn2fSayo3lo5L+8hjOxDBDLALEMkKWYBMqIIAjQaXkhKRnLALEMEMsAWYpJIJEFAgICMGHCk/DV66UOhYiIJCDHdoBJIJEFNBoNmgUGSh0GERFJRI7tACeGEFkgLy8fG3/6CXl5+VKHQkREEpBjO8AkkMgCJSXFOHIkHiUlxVKHQkREEpBjO8AkkIiIiEiBmAQSERERKRCTQCIiIiIFYhJIZAGdToeePXtCp9NJHQoREUlAju0Ak0AiCwiCABe1GoLABViJiJRIju0Ak0AiCxQWFuL33btRWFgodShERCQBObYDTAKJiIiIFIhJIBEREZECMQkkIiIiUiAmgUQWcHNzR4cOHeDm5i51KEREJAE5tgMuUgdA1BT4+uoxcsRwqcMgIiKJyLEdYE8gkQWMRiNycnJgNBqlDoWIiCQgx3aASSCRBTIzMzF/wUJkZmZKHQoREUlAju0AbwcTyYgoiiiuEKUOwyoeGkFWi68SSY31AFmKSSCRjBRXiAielSh1GFZJmxoFnZaVP5G9sB4gS/F2MBEREZECMQkkIiIiUiDeDiayQHBwMN54/TWpwyAiIonIsR1gTyARERGRAjEJJLJAVnY2vvxqKbKys6UOhYiIJCDHdoBJIJEFKsrLkZqaiorycqlDISIiCcixHWASSERERKRATAKJiIiIFIizg4kI/UJ98OvEmGqvFZaZcCqrBMsPZ+DTPy7BZJYoOCJyONYBysQkkMgCer0ew4cPg16vlzoUh1oZl4HNibkQBCDIS4tHujTDR0NDEd3MAxN+SJY6PCJyMNYBdZNjO8AkkMgC7u7u6BgTU/+GTdzh1CJ8E3f14egL9qYhcWpXjLu5OV7behZZRUYJoyMiR2MdUDc5tgMcE3gd27fvwPgJk9CjVx9E39gRPXr1wYMPP4oln38hdWjkZEVFRfjr4EEUFRVJHYpTFVeYsf98AVQqAWH+7lKHQ0ROxjrgKjm2A0wCa1FeXo6nnnkOk6Y8jV27foWbmzuio6Kg0Whw8OAhLF78udQhkpMZDAZs3boNBoNB6lCcLszfDQCQU1whcSREJAXWAZXk2A7wdnAtXn3tDWzdug19+/TBm2++jjatW1e9ZzAY8OdfByWMjshxPLQq+Hu4VI0Hmtg9CF1CPHHgfAGSskqlDk8SYmkRxLSTQEXZlRc4Ol5pREMGYLyyNpyxAqKpAoJaI21QDsI6QFmYBP7L7j1/YP2PG9CpU0csXrQALi7V/4m8vb0x8LZbJYqOyLHevqMN3r6jTbXXfjiahSnrUiSKSDpi1jmYD66HmLATqLim8SvMgWnTh1DdNAJC8zDpAiSHM585BPHQBojJB64m/yX5MM1/CEKnO6HqOgyCp7+0QdoZ6wBlkf3t4JycXHwwcxZuHTgIN3TohN59B2D6O++iuLgYL7/6GsIjo7Fs+TdV23/11dcAgCmTJ9ZIAInkbtH+NAxcfBSDvziGaZvOILuoAi19XFFqvNr79e2Y9lj9YPtq+/m6u+DS67dgTGygs0N2CHPi7zB9ORli3KbqCeAV4t/bYFr6FMxHd0gQHTmaKIow7foC5lWvQEzaV7P3tygX4t5vK8tIepI0QToI6wBlkXWWc/z4CTwx/klkZmbBw8MD4eFhyMjIxNfLluP8+fPIy88HANwQHQUAKC0txd59+6BSqdC9WzcciY/HDz+sw7lz5+DhoUPnzp0w+j+j4OfnK+XHIgloXV0RGhoKraur1KE4VFJWKXYmV14XW0/mYs9ZA/ZM6ojP7gnHAytPAgAmr0vB0RdicX/nAKw6kgUAmD8yDHvOGrDymlmFTZX59EGY179b/21fswnmn2YBWjeo2vd2TnDkFOIf30Dcv7r+DYtyYVr1CtSPzIXgF+L4wJyAdUDd5NgOyLYnMCcnF09OnIzMzCw88fhj2Lvnd2xYvxb79+7GtKkvYtevv+Ho0QQIgoD2UZW/aE4kJsJoNEKv12P5im/wn9EP4NtVq7F3337s2LkTsz+cg4F33Il9+w9I/OnI2fz9/PDgmAfg7+cndShOte9cAZYfzsD9nQPRo40XACC3xIgnvkvCvOFhCPbW4t4Yf/QP9cHEtU1/DTFRNMO87VMrxv2JMP88D6JJuctmyI2YfxnmPSss36HEAPOv8l0xQml1wPXIsR2QbRI4/Z0ZSE9Px8MPPYhXXp4GT09d1XtPjh+H6KgoGI1GtAwJgZenJwAgM6PyF4zBYMCs2XPQv19fbNm8EccT4rFp44/o0b07DAYDpjz1DNLS0yX5XCQNs9mMsrIymM3KmxQwfecFGE1itXFC207lYc3fWVhxfyQWjAzDuO+TkFPc9BMh8fQhIC/Nup0KcyAm7XVMQOR05iObrZ78I57aC7Egy0ERSU9JdcD1yLEdkGUSmJycgk2bt8DX1xcvvfh8rdvc2OEGAEBU1NVxDcUlJQAAo9GI1q1bY8H8TxERHg6tVov27SOxeNECBAYGwGAwYOnSZVX7paWn439vTcc9945G9I0dER4Z7cBPR1K4fPkyZs6ajcuXL0sditOlZJdiVXwmBkbo0butd9XrL/10BuH+btiSmIvNibkSRmg/4tGfbdxvu50jIamIf9tQBkQzxGO/2D+YRkJJdcD1yLEdkOWYwJ82bYLZbMbwYUOg0+lq3cbNtXLdo6ioqKrXXK+5z//wQ2Og0VRfAsDd3R1jHrgfcz+Zh99378YrL08DAJw7dx7bfv4ZMTEx6KiJwaHDh+3yOaZOewW5eXl2ORZV16FDB6u2LygoAAAcOhwHLy/LbnnMX7DQ6rgayii4AK0n2f24M365gAc6B+LtQa1x66IEAJWLyJ7OKcPR9OIGHXvK08/CRWwcPQhTg1MR5mb9fuePxWHGdvv/u5NzCRCxsF22TfvuXL8Gq7/cZeeIbOOIesCRdQAgTT3gjHYAcHxb4KvXY9bM92zaV5ZJ4L59lWP2unXrVuc26emVmXz0NT2BPt5Xf+GEhdW+9MM/r1+8mFr12i0334R9f+wGAMz9ZJ7dksDcvDzk5OTY5VhUXVlZmVXbV1RUVP2/pftK8d2ZVBqgdf3b/dtvp/MhTNtT5/uJGSVwefmPBkRWt9zcXKjNjWMR2opA2+Iwmky8VmVAgAi0s23f0rKyRlMGbKkHpKwDAGnqAWe0A4A0bYGlZJkEpl66BAAIadGi1veNRmNVonZtT2BoaGjVf/+7F/Af//QWmkymqtdUKsfcVfeV0UOqGxtXK2d3lZdXLhSr0Wgs3tdPgsHDRqHpXdK+vr6NpiewABUACq3ezyC6SvJ9k/3lGgvg62Kqf8N/KXbRNZqVI1gPWMYZ7QDg+LagIblC0yspFii5MravtKz21c03bd6C3Nxc6HQ6tGrVsur1oKDmaNEiGJcupeHChQvo0b1mT+L58+evbBvkgMirs7V7l+oXd+Rvq7ZPS0tDXFwcunaJRXBwsEX7PPfMFFtCa5CicjPWzkp0+nkbYv6nc6HTNo7hyebTB2Fe/arV+8U+/BI+5zIxsmD6bSnEvSut20mlxuj/m4/7vBrHwtGsByzjjHYAkKYtsFTjqHntLCAgAABw7NjxGu9lZGTgg5mzAABR7dtDEIRq7981eDAAYN269TX2FUURa9dWvl5bgkjy1axZM7zw/HNo1qyZ1KE0KgMWHcWHv6fWv2ETIbTrAvjWfgehTp7+ECJ6OCYgcjpV7F2AYF3TKET2gtBIEkBnk1sdcD1ybAdkmQT26llZIS9e8gXOnDlT9frffx/FQw+PRW5uHgAgOjqqxr7jxz0OT09P/HXwEObNX1B129doNGLmrNk4kZgIrVaLx8Y+6vgPQo2GWq2GTqeDWq2WOhRyIEFQQXXns4DKwu/5yvaCpdtToyd4N4OqrxX1u4cPVP2fcFxA1GjIsR2QZRI4fvwT8NXrkZaWhsF3D8NdQ4bhttsH4Z5Ro9GqVUt0v9KLd+3yMP/w9/fH3I8+hFarxcdzP0WPXn1x76j70KNnHyz5/Eu4uLjg3RnTER7OZ4YqSU5OLlatXoOcHPkvg6B0qraxUI18A3DRXn9DtQtUw/4LVUR35wRGTiP0uB9Crwfr39DTH+r734fga/mtQWq65NgOyDIJDA4KwrcrV2BA/35wddUiNTUVeh893nn7LXy+ZBHOnjkLAIiOqtkTCAD9+vXFhvVrMXzYULi4qHH8xAmoXVxw1+A78f13qzBi+DAnfhpqDMrKSpGUlISyOsaZkryoIntC/fhnELoOB7Qe1d/UuEGIvRvqxxZAdcMAaQIkhxIEAeq+j0I1ZhaE9r1r3h729IeqzyNQP74AQnN2CCiFHNsBWU4MAYDw8DAsWfxZjdeLiopwMTUVKpUKkZER193/w9kzHRkiETVign9LqO+YArH/40B6EsSyYgiuHkCzMAhuta8/SvKiatMJaNMJYkE2xOzzgLEcgpsXEBwJQS3b5pMURHGlOCk5GaIool3btnB3d7fbcbds3QYASE5JqfZ3y5AQxMRYtyAlETUegtYdaN0RQv2bkkwJXv6KnfhB8qa4JPDkyVMAah8P2BBPP/NcrX/fM3IEZn7ApV6o6bs3xh+3hevx/MbTWDUmCjc090BJhRkZheWYtC4FKdnyuUVCRJa7N8Yfd0f5wdfdhfVCE6O4JPDUqSQA1ReJtofkUyfsejxqXLy8vHD7wIHw8vKSOhTJjOzgj2WHMgAAi/9Mx5Yrzwqd0jMYn4+KwIBFR6UMj4gkMrKDP9bEZ6HCLMq6XpBjO6C4JPDkqcqewGg79wSSvHl6elbNKpcrHzc1El7oAneNChfyy+CqViHU3w3LD2dg0toU9GrjjbGrk2C8pqIHgP3nC/BS3xAJIyciR7levTD++2S4qIRqdcM/5FgvyLEdUFwSuGLZUqlDoCaopKQEZ86cRbt29h1L2pjkl5qw8kgmCspMeGfnBdwRqcert7bC+O+TcXuEHnvPGapV8v94tlcL/Hi88T4bk4hsd716AQAGhPnUWjfIsV6QYzuguCSQyBZ5eXn4Ye1ajHvicdlc/LXp3EKHT/6ofPZ21xBPxKVWPkd3xI3+WJeQXWP7Vwa0RHiAG25bnODUOInIPvZO6YiIgNrrtNiP43Axv7zOegGovW6Qa70gx3aASSARVencQoe41CIAQNeWnthw5Zf8oPZ6TNt8ptq2L/YNwT0x/hi4OAElFWanx0pEDddzfv3Pz62rXgBq1g2sF5oWWS4WTUTWa+GthSgClwzlAICOwTocTS/CLa08cSKjBEXlVyv05/u0wAOdA3H7kgTkl5qkCpmIHKyuegFAjbqB9ULTw55AIgIAxIboEHepqOrvvBIjJvcIRlZRBdYfu3q7J8RHizlDQ5GSXYJdE2IAAGVGEd3nxTs9ZiJyrLrqhfHfJ2NkB/+quoH1QtPEJJDIAi4aDYKCmsNFo5E6FIfZdCIXm05cnfV7y6eVlXfCC7EYsOjq2J7U/HII0/Y4PT4icr666gUAGBrtV1U3KKFekGM7wCSQyAKBAQEYP26c1GFIosOcOKlDIKJGSGl1gxzbAY4JJCIiIlIgJoFEFkhLT8e7772PtPR0qUMhIiIJyLEdYBJIZAlRhMlkAsSaiyUTEZECyLAd4JhAIhnx0AhIm2rf52I7modGkDoEIllhPUCWYhJIJCOCIECnZWVKpGSsB8hSvB1MREREpEDsCSSyQEBAACZMeBK+er3UoRARkQTk2A4wCSSygEajQbPAQKnDICIiicixHeDtYCIL5OXlY+NPPyEvL1/qUIiISAJybAeYBBJZoKSkGEeOxKOkpFjqUIiISAJybAeYBBIREREpEJNAIiIiIgViEkhERESkQJwdTIoU27mjVdu3adMKBoMB3bvfAj9fXwdFRUREzsJ2ABAMednyeQgeEREREVmEt4OJiIiIFIhJIBEREZECMQkkIiIiUiAmgUREREQKxCSQiIiISIGYBBIREREpEJNAIiIiIgViEkhERESkQEwCiYiIiBSISSARERGRAjEJJCIiIlIgJoFERERECuQidQBkuyWff4FtP2/H6dNnIIoiIiMiMHnyRPTr20fq0IiIiKiRY09gE7Zv3wGMuvcerFi2FGu/X40uXTrjyQmTcOjQYalDIyIiokZOMORli1IHQfZz99Dh6NWzJ1595b9Sh0JERESNGHsCZcRsNqOwsBAeHu5Sh0JERESNHJNAGVn42SIYDAW4777RUodCREREjRwnhsjEim9WYuFni7Fo4XwEBwVJHQ4RERE1ckwCZeDzL77E3E/mYdHC+ejVq6fU4RAREVETwCSwift47if4aunX+HzJZ+h2yy1Sh0NERERNBJPAJuydGe/i21Vr8PGc2Qht1w6ZmZkAADc3N3h5eUkcHRERETVmXCLGBhcvpqL/rQOvu83ddw3G3I/nODSO8MjoWl+/Z+QIzPzgPYeem4iIiJo29gQ2gFarRUyHDrW+Fxoa6vDzJ586YfG2J04kIjS0HVxdXR0YERERETUVTAIbIDAwAKtXfSN1GPUqKCjA9BnvwdXVFe+9Ox1BzZtLHRIRERFJjOsEKsCGjZtQWloKP19fNG/WTOpwiIiIqBFgT+A1TCYTNmz8Cet/3IDjx0+gsLAQAQEBCA8Pw52D7sCoe++BWq2WOkyrFBQUYNPmLQCA0aNHQRAEiSMiIiKixoBJ4BUFhYWYNPkp7N9/AADQvFkzREdF4XJGBvbs+QO7d+/B4DsHwdvbu2qfwsIivP7Gmzh//jw0Gg1at26N224bgN69ekn1MWr4pxewXdu2uOXmm6QOh4iIiBoJzg6+4qlnnsPWrdsQFBSEWTPfR4/u3arey8rKwprvfsDYRx+Gh4dHvbODe/bojo8/mgM/P98GxTR12ivIzcuzeX9RFJGbmwsA8PT0hFarbVA8RERE1Lj46vWYNdO2FUHYEwggIeEYtm7dBhcXF3z5+SJERkZWez8gIACTJ02o+lvtosbIEcMx5O67EB4ehsDAQGRlZ+Pnn7fjo48/wd59+zFh0mSsWrmiQbePc/PykJOTY/P+1yosLLTLcYiIiEgemAQC2L5jBwCgf79+NRLA2gRf6S28VovgYIx99BF07twJ9z/wEOLijmDjT5swYvgwm+Py1ett3pe9gERERPLXkFyBSSCA5OQUAEBsbKcGH6tzp064c9Ad+GnTZvz88/YGJYG2du8CwDcrV+GHtevQrm1bzJ71PieEEBERUTVMAnH1Vqm9HrXWJTYWP23ajLPnzjXoOLaOCby2FzAzKwvjJ0xuUBxERETUOHFMYAN5enoCqFxOxR5cNJX/rCajqUHHsceYQI4FJCIiotowCQQQERGObT9vR1xcvF2Ol5SUDAAICmrYkzlsuc/PsYBERETK0ZAxgVwiBsCx48cxfMS90Gg02PDjWkSEh9t8rMzMTAwaPAQGgwHTpr6IJ8ePs2Ok9eNYQCIiIrIEHxsH4MYbbsBdg+9ERUUFnhj3JA78+We197OysrDws8UoLi4GALz+xpvYvn0HysvLq22XkHAMj4x9HAaDAYGBAXjg/vuc9hkAPh2EiIiILMfbwVfMmDEd2Tk5OHDgTzz40KNo3rw5mjdrhozMTFy+fBmiKOLBMfcDAOLj/8aq1Wug0WjQtm0beHh4ICsrC6mplwAAzZoFYtHCBXabaGIpPh2EiIiILMUk8AovT08sW/ol1q5bj/U/bkBi4kmcSExEYGAA+vTujcGDB0Gn0wEAJk4Yj99370HCsWPIyMhEQcFZuLu7o1Onjrh1QH88OOYB6Btwj95W3t5e8PT0ZC8gERER1YtjAmWmpKQEbm5uTAKJiIjoutgTKDPu7u5Sh0BERERNACeGEBERESkQk0AiIiIiBWISSERERKRATAKJiIiIFIhJIBEREZECMQkkIiIiUiAmgUREREQKxCSQiIiISIGYBBIREREpEJNAIiIiIgViEkhERESkQEwCiYiIiBSISSARERGRAjEJJCIiIlIgJoFERERECsQkkIiIiEiBmAQSERERKRCTQCIiIiIFYhJIREREpEBMAomIiIgUiEkgERERkQIxCSQiIiJSICaBRERERArEJJCIiIhIgZgEEhERESkQk0AiIiIiBWISSERERKRATAKJiIiIFIhJIBEREZECMQkkIiIiUiAmgUREREQKxCSQiIiISIGYBBIREREpEJNAIiIiIgViEkhERESkQEwCiYiIiBSISSARERGRAjEJJCIiIlIgJoFERERECvT/2hSg+GKA6EUAAAAASUVORK5CYII=",
"text/plain": [
""
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"theta = Parameter(\"θ\")\n",
"q = QuantumRegister(2)\n",
"c = ClassicalRegister(2)\n",
"\n",
"ansatz_circuit = create_ansatz_circuit(q, c, theta)\n",
"\n",
"ansatz_circuit.draw(\"mpl\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Barriers are added for visualization purposes. \n",
"\n",
"One of the new features added here is the $R_z$ gate with parameter $\\theta$. This is a parametrized gate. Using this gate, this means that we only need to update the parameter $\\theta$ and do not need to re-create the whole circuit, saving time. This becomes a problem when you have large circuits. \n",
"\n",
"Now we have:\n",
"\n",
"1. The prepared initial state\n",
"2. The applied parameterized anzatz circuit\n",
"\n",
"Now we need to measure the expectation values. However this is not straight forward.\n",
"\n",
"## **Measure expectation values**\n",
"\n",
"The qubit Hamiltonian we need to measure is as follows\n",
"\n",
"$$ \n",
"H = g_0 \\mathbb{1} + g_1 Z_0 + g_2 Z_1 + g_3 Z_0 Z_1 + g_4 Y_0 Y_1 + g_5 X_0 X_1\n",
"$$\n",
"\n",
"where $g_i$ are (real valued) coefficients that have been computed classically. They are given in the Table 1 in the appendix of O'Malley etal 2015. The values of $g_i$ are functions of hydrogen-hydrogen bond length $R$. We will take the coefficients at bond length $R = 0.75$ (in units $10^{-10}$ m) where the energy is lowest (the actual bond length where the energy is lowest is $0.74$, which is close).\n",
"\n",
"Measurements are performed using the $Z$ basis through the Qiskit function `measure()`. This means that we cannot directly measure the Pauli $X$ or $Y$ operators for $X_0 X_1$ and $Y_0 Y_1$. In order to measure the latter, we have to use the following trick: \n",
"\n",
"- to measure $X$, perform basis transformation from the $X$ and $Z$\n",
"- then measure the qubits as usual (in the $Z$ basis) with `measure()`.\n",
"\n",
"The same applies to $Y$ measurements, in this case we need to perform basis transformation from $Y$ to $Z$.\n",
"\n",
"In order to compute the average value $\\langle H \\rangle$ of the (total) Hamiltonian we will use the fact that the total average is equal to the sum of averages of its terms,\n",
"\n",
"$$\n",
"\\langle H\\rangle = g_0 \\langle \\mathbb{1}\\rangle + g_1 \\langle Z_0\\rangle + g_2 \\langle Z_1\\rangle + g_3 \\langle Z_0 Z_1\\rangle + g_4 \\langle Y_0 Y_1\\rangle + g_5 \\langle X_0 X_1\\rangle.\n",
"$$\n",
"\n",
"So we need to compute the expectation value of each term, then multiply each with the respective coefficient $g_i$, and finally add averages of all terms. Note that $\\langle\\mathbb{1}\\rangle = 1$, so we can just add the coefficient $g_0$."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"def paulis_to_measure_circ(qreg, creg, hamlist):\n",
" \"\"\"\n",
" Generate measure circuits from hamiltonian pauli list\n",
" for measurements in different bases.\n",
"\n",
" args\n",
" qreg - qubits\n",
" creg - classical bits\n",
" hamlist - total hamiltonian, i.e. pauli strings\n",
"\n",
" returns\n",
" circuits - list of circuits that can be used to average over\n",
" \"\"\"\n",
" circuits = []\n",
"\n",
" for elem in hamlist:\n",
" minicirc = QuantumCircuit(qreg, creg)\n",
"\n",
" for qubitno, qubitop in elem:\n",
" if qubitop == \"Z\":\n",
" pass\n",
" elif qubitop == \"X\":\n",
" minicirc.h(qreg[qubitno])\n",
" elif qubitop == \"Y\":\n",
" minicirc.sdg(qreg[qubitno])\n",
" minicirc.h(qreg[qubitno])\n",
" else:\n",
" assert False, \"Error: INVALID qubit operation\"\n",
"\n",
" minicirc.measure(qreg, creg)\n",
" circuits.append(minicirc)\n",
"\n",
" return circuits"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[None, None, None, None, None]"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"theta = Parameter(\"θ\")\n",
"q = QuantumRegister(2)\n",
"c = ClassicalRegister(2)\n",
"hamiltonian = (\n",
" ((0, \"Z\"),),\n",
" ((1, \"Z\"),),\n",
" ((0, \"Z\"), (1, \"Z\")),\n",
" ((0, \"X\"), (1, \"X\")),\n",
" ((0, \"Y\"), (1, \"Y\")),\n",
")\n",
"\n",
"ham_mini_circuits = paulis_to_measure_circ(q, c, hamiltonian)\n",
"\n",
"# print result\n",
"[display(circ.draw(\"mpl\")) for circ in ham_mini_circuits]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This function takes the qubit Hamiltonian and creates the corresponding circuits. The smallest element has the form `(qubit_number, Pauli_matrix)`, where `qubit_number` is the index of the qubit for the Pauli observable.\n",
"\n",
"Let's summarize the computation of the average of the Hamiltonian. We need to compute the averages of terms. We do this by looping over terms, which are represented as mini-circuits. For each mini-circuit, we will take the ansatz, add to it the mini-circuit, and run the resulting circuit, collect measurement statistics and compute the average.\n",
"\n",
"## **Scan the parameter interval**\n",
"\n",
"We will not bother with classical optimization in this small implementation. The circuit has only one parameter—the angle $\\theta$ of the $R_z$ rotation—which ranges between $[-\\pi, \\pi]$. Instead of searching for the minimum value of $\\langle H\\rangle$, we will scan this interval and record the minimum energy.\n",
"\n",
"Let us add a loop to do this."
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [],
"source": [
"def get_paulistr_avg(counts, obs, shots):\n",
" \"\"\"\n",
" Calculate average of a Pauli string (e.g. IX, XX or YY).\n",
"\n",
" args\n",
" counts - result of simulation: {'00': 45, '01': 34, . . .}\n",
" obs - data for calculating probabilities\n",
" shots - number of repetitions\n",
"\n",
" returns\n",
" avg - the average value\n",
" \"\"\"\n",
" avg = 0\n",
" for c in counts:\n",
" for k, v in c.items():\n",
" avg += obs[k] * (v / shots)\n",
"\n",
" return avg\n",
"\n",
"\n",
"def get_ham_avg(\n",
" theta, theta_range, ansatz, coeffs, ham_mini_circuits, obs, shots, backend\n",
"):\n",
" \"\"\"\n",
" Compute average of the total qubit Hamiltonian.\n",
"\n",
" args\n",
" params - parameter value for the ansatz circuit\n",
" ansatz - ansatz circuit\n",
" ham_mini_ciruits - pre-built circuits to measure Hamiltonian terms\n",
" obs - data for observables\n",
" shots - number of shots\n",
"\n",
" returns\n",
" avg - average of Hamiltonian\n",
" \"\"\"\n",
" avg = 0\n",
"\n",
" for coeff, measure_circuit, obsval in zip(coeffs, ham_mini_circuits, obs):\n",
" total_circuit = ansatz.compose(measure_circuit)\n",
" qc_transpiled = transpile(\n",
" total_circuit, backend=backend, layout_method=\"sabre\", optimization_level=3\n",
" )\n",
" circuits = [qc_transpiled.assign_parameters({theta: n}) for n in theta_range]\n",
" job = execute(circuits, backend, shots=shots)\n",
" print(f\"Submitted job ID: {job.job_id()}.\")\n",
" counts = job.result().get_counts()\n",
" paulistring_avg = get_paulistr_avg(counts, obsval, shots)\n",
" avg += coeff * paulistring_avg\n",
"\n",
" return avg"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"0\n",
"\n"
]
}
],
"source": [
"shots = 1000\n",
"num_points = 40\n",
"param_range = np.arange(-np.pi, np.pi, np.pi / num_points)\n",
"\n",
"# record min val of hamiltonian\n",
"h_min = 100\n",
"\n",
"# g_i coeffs for R = 0.75\n",
"# Source: Table I https://arxiv.org/pdf/1512.06860\n",
"g_coeff = [0.3435, -0.4347, 0.5716, 0.091, 0.091]\n",
"g_coeff_id = 0.2252\n",
"\n",
"graph = []\n",
"obs = []\n",
"\n",
"for x in param_range:\n",
" h_avg = get_ham_avg(\n",
" theta,\n",
" param_range,\n",
" ansatz_circuit,\n",
" g_coeff,\n",
" ham_mini_circuits,\n",
" obs,\n",
" shots,\n",
" backend_sim,\n",
" )\n",
" print(h_avg)\n",
" # h_avg += g_coeff_id # add coeff of id term\n",
" # graph.append(h_avg) # collect data for plotting\n",
" # if h_avg < h_min: # record min value\n",
" # h_min = h_avg\n",
"\n",
"# result\n",
"# print(\"\\nH_min =\", h_min)\n",
"print()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we loop through the interval defined in the parameter range, $[-\\pi, \\pi]$ and find the minimum energy. A value of $0.2252$ or $g_0$ is calculated as this code doesn't yet implement the averaging. We don't do any classical optimization here in this simple example but in principle we could add it here. \n",
"\n",
"\n",
"## **Mapping outcome states to values**\n",
"\n",
"To actually compute the average of a Hamiltonian term, we need to know how the outcomes of the measurement $00, 01, 10, 11$ that Qiskit uses correspond to the actual real valued outcomes $+1, -1$ for a particular observable like $Z_0$ or $Z_0 Z_1$ we measure. Without discussing this at length here, we are going to introduce dictionaries that record the mapping for each observable. Of course, there are other ways to implement this."
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Submitted job ID: 1ae76011-9adb-42ad-b480-427ff6f2716c.\n",
"Submitted job ID: 0295dbc3-0bfe-43a8-bce3-2dd40b35d5ff.\n",
"Submitted job ID: e8ff1f6b-b88d-4577-b417-98c5973d6d50.\n",
"Submitted job ID: b109bb78-28aa-4610-a6f7-a3b17fb6c00d.\n",
"Submitted job ID: d438f5fe-0e79-4d36-8303-5c12354ee49e.\n",
"-45.786435000000004\n"
]
}
],
"source": [
"# map outcome states to outcome values\n",
"obs = [\n",
" {\"00\": 1, \"10\": 1, \"01\": -1, \"11\": -1}, # 1 x Z\n",
" {\"00\": 1, \"10\": -1, \"01\": 1, \"11\": -1}, # Z x 1\n",
" {\"00\": 1, \"10\": -1, \"01\": -1, \"11\": 1}, # Z x Z\n",
" {\"00\": 1, \"10\": -1, \"01\": -1, \"11\": 1}, # Y x Y\n",
" {\"00\": 1, \"10\": -1, \"01\": -1, \"11\": 1},\n",
"] # X x X\n",
"\n",
"ansatz_circuit = create_ansatz_circuit(q, c, theta)\n",
"ham_mini_circuits = paulis_to_measure_circ(q, c, hamiltonian)\n",
"\n",
"\n",
"h_avg = get_ham_avg(\n",
" theta,\n",
" param_range,\n",
" ansatz_circuit,\n",
" g_coeff,\n",
" ham_mini_circuits,\n",
" obs,\n",
" shots,\n",
" backend_sim,\n",
")\n",
"\n",
"print(h_avg)\n",
"\n",
"# scan theta domain [-pi, pi]\n",
"# for x in param_range:\n",
"# h_avg += g_coeff_id # add coeff of id term\n",
"# graph.append(h_avg) # collect data for plotting\n",
"# if h_avg < h_min: # record min value\n",
"# h_min = h_avg\n",
"\n",
"# print(\"\\nH_min =\", h_min)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The function to get the hamiltonian average iterates over all of the mini circuits we created before. Each mini circuit is combined with the ansatz circuit, running it, collecting the statistics and computing the average for the term.\n",
"\n",
"Also implemented is the function to calculate the Pauli string average energy. \n",
"\n",
"Running this code brings us a result that is close to the one obtained in the paper. It can be compared with Figure 3 with a Bond angle $R = 0.75$. \n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## **Using a pre-built function**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from qiskit.primitives import Estimator\n",
"from qiskit.quantum_info import SparsePauliOp\n",
"from qiskit_algorithms.optimizers import COBYLA\n",
"\n",
"estimator = Estimator(options={\"shots\": 1000})\n",
"\n",
"\n",
"theta = Parameter(\"θ\")\n",
"q = QuantumRegister(2)\n",
"c = ClassicalRegister(2)\n",
"\n",
"ansatz_circuit = create_ansatz_circuit(q, c, theta)\n",
"\n",
"\n",
"optimizer = COBYLA(maxiter=1000)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ansatz_circuit.draw(\"mpl\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"H2_op = SparsePauliOp.from_list(\n",
" [\n",
" (\"II\", 0.2252),\n",
" (\"IZ\", 0.3435),\n",
" (\"ZI\", -0.4347),\n",
" (\"ZZ\", 0.5716),\n",
" (\"XX\", 0.091),\n",
" (\"YY\", 0.091),\n",
" ]\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from qiskit_algorithms import VQE\n",
"\n",
"vqe = VQE(estimator, ansatz_circuit, optimizer)\n",
"result = vqe.compute_minimum_eigenvalue(H2_op)\n",
"print(result)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "helmi-cocos",
"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.10"
}
},
"nbformat": 4,
"nbformat_minor": 2
}