{ "cells": [ { "cell_type": "markdown", "id": "296ff522-3172-4347-b148-e3e88d753095", "metadata": {}, "source": [ "# Example 3: oo-VQE run on methanimine using Qiskit IBM Runtime Service and a noisy simulator.\n", "\n", "In this example, we use `qc2` and the `IBM Quantum Runtime Service` to conduct a oo-VQE calculation on methanimine (CH$_{2}$NH). We utilize the `EstimatorV1` primitive as implemented in the `qiskit-ibm-runtime` package, in conjunction with a noisy simulator." ] }, { "cell_type": "markdown", "id": "b1f5d21a-fbab-40f6-98bc-e7cc625551de", "metadata": {}, "source": [ "### Import required packages" ] }, { "cell_type": "code", "execution_count": 1, "id": "9a6303c0-283f-42e9-9c87-8b21eb994f08", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "# ASE Atoms object\n", "from ase import Atoms\n", "\n", "# IBMQ runtime service packages\n", "from qiskit_ibm_runtime import (\n", " QiskitRuntimeService,\n", " EstimatorV1 as Estimator,\n", " Options,\n", " Session\n", ")\n", "\n", "# Qiskit-related packages\n", "from qiskit_aer import AerSimulator\n", "from qiskit_algorithms.optimizers import COBYLA, SLSQP\n", "\n", "# ignore package import warnings\n", "import warnings\n", "warnings.filterwarnings('ignore')\n", "\n", "# qc2 packages\n", "from qc2.data import qc2Data\n", "from qc2.ase import PySCF\n", "from qc2.algorithms.utils import ActiveSpace\n", "from qc2.algorithms.qiskit import oo_VQE, VQE\n", "\n", "# calculated qchem energies with sto-3g basis\n", "CH2NH_HF_ENERGY = -92.82304270237677\n", "CH2NH_CASCI_ENERGY = -92.87111994151458\n", "CH2NH_CASSCF_ENERGY = -92.87254983967073" ] }, { "cell_type": "markdown", "id": "3d0474e0-ef1a-4438-a1a9-7d1406a63551", "metadata": {}, "source": [ "### Initiate IBM runtime service & prepare `Estimator`\n", "\n", "In the following steps, we assume that you have already created an __[IBM Quantum account](https://quantum.ibm.com/)__ and saved your accound credentials (via your personal token) on disk; for further info click __[here](https://github.com/Qiskit/qiskit-ibm-runtime/blob/main/README.md)__." ] }, { "cell_type": "code", "execution_count": 2, "id": "6fc4456c-96d2-4d89-ad06-5452fe58ad43", "metadata": {}, "outputs": [], "source": [ "# instantiating `QiskitRuntimeService`\n", "service = QiskitRuntimeService()\n", "\n", "# create a noisy simulator with the same specs of a real backend\n", "real_backend = service.backend(\"ibm_kyoto\")\n", "backend = AerSimulator.from_backend(real_backend)\n", "\n", "# Use the following line if you want to run on a real quantum backend\n", "# backend = service.least_busy(simulator=False)\n", "\n", "options = Options()\n", "\n", "# set seed for reproducible runs\n", "options.simulator.seed_simulator = 42\n", "\n", "# error supression options\n", "options.optimization_level = 3\n", "\n", "# error mitigation options\n", "options.resilience_level = 2 # ZNE\n", "\n", "# execution options\n", "options.execution.shots = 6000\n", "\n", "# instantiate the Estimator to calculate expectation values\n", "estimator = Estimator(backend=backend, options=options)" ] }, { "cell_type": "markdown", "id": "6c57a140-6a65-4b95-840c-5ea8c27fa8a0", "metadata": {}, "source": [ "### Instantiate `qc2Data` class and run qc2-ASE calculator" ] }, { "cell_type": "code", "execution_count": 3, "id": "e263182f-a351-4816-b30a-2af628d77159", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "* Reference energy (Hartree): -92.82304270237677\n", "* Saving qchem data in CH2NH.hdf5\n", "\n" ] } ], "source": [ "# set Atoms object\n", "mol = Atoms(\n", " 'CH2NH',\n", " positions=[\n", " [ 0.058, 0.585, 0.000],\n", " [-0.831, 1.217, 0.000],\n", " [-0.932, -1.031, 0.000],\n", " [ 0.058, -0.688, 0.000],\n", " [ 1.009, 1.115, 0.000], \n", " ]\n", ")\n", "\n", "# instantiate qc2Data class\n", "qc2data = qc2Data(\n", " molecule=mol,\n", " filename='CH2NH.hdf5',\n", " schema='qcschema'\n", ")\n", "\n", "# specify the qchem calculator\n", "qc2data.molecule.calc = PySCF(method='scf.RHF', basis='sto-3g')\n", "\n", "# run calculation and save qchem data in the hdf5 file\n", "qc2data.run()" ] }, { "cell_type": "markdown", "id": "bf75ab5c-0066-4ab4-9b68-e480d9c21ee2", "metadata": {}, "source": [ "### Instantiate `qc2.algorithms.oo_VQE` class" ] }, { "cell_type": "code", "execution_count": 4, "id": "2c3e56b4-48d3-4c5e-aafa-10fad1ce8b26", "metadata": { "scrolled": true }, "outputs": [], "source": [ "init_circuit_params = [\n", " 1.46194392e-02, 3.18688670e-07, 1.46198850e-02, -4.16826068e-08,\n", " -2.48379903e-01, 8.69403138e-08, 1.46800730e-07, -4.14487403e-02\n", "]\n", "\n", "init_orbital_params = [\n", " -3.121019529045726e-16, 2.3936560531586324e-16, -2.512908891659351e-15,\n", " 9.63495665121923e-15, -3.322688177851631e-15, 1.6929996259238916e-15,\n", " -0.042430832969354224, 0.037788537159730795, -0.6402388305542434,\n", " 1.9747778672836942, -0.42241657801780785, 0.6653997390308073,\n", " 1.8049427015233007e-14, -9.909986054999737e-17, 6.984155203809811e-17,\n", " -5.740096436152435e-16, 2.9001323479774723e-15, -8.641983286294291e-16,\n", " 1.0876576621088035e-15, -0.022177643413708235, -4.7117310163774974e-17,\n", " -1.1300943909203134e-05, 4.06199740895308e-06, -3.482280484373978e-05,\n", " -0.0005134543053396985, -5.2073631321601226e-05, -0.00010725841504334843,\n", " 3.713374803648559e-16, 8.895232986125907e-05, 2.3996887484890763e-16,\n", " 4.100235652869602e-06, -2.886209500963695e-05, 0.001235361499165538,\n", " 0.0004530121939473705, 9.649997855549563e-05, -0.00021739150881453442,\n", " -3.0049276154810977e-16, 0.00041820453123261165, -8.444748735732234e-16,\n", " 1.330143080213958e-05, 9.479772806843338e-06, -0.0004383044737212205,\n", " 0.000336222549677801, 0.0006018865000642227, -0.0013993665930059293,\n", " 1.1108355579962116e-17, 0.0009727324063734195, -1.7282621334956625e-17,\n", " 7.521744312574251e-06, 6.085143278202279e-05, -0.001335223060730951,\n", " 0.0006296885084617651, -0.0018965057185801933, -0.0023584488500398293,\n", " -7.391431921310791e-16, 0.0011667046958250059, -1.4475093325379303e-15\n", "]\n", "\n", "# instantiate oo-VQE class\n", "qc2data.algorithm = oo_VQE(\n", " active_space=ActiveSpace(\n", " num_active_electrons=(2, 2),\n", " num_active_spatial_orbitals=3\n", " ),\n", " mapper=\"jw\",\n", " optimizer=SLSQP(),\n", " estimator=estimator,\n", " max_iterations=100,\n", " init_circuit_params=init_circuit_params,\n", " init_orbital_params=init_orbital_params\n", ")" ] }, { "cell_type": "markdown", "id": "6631cb5e-7486-4f47-bc34-990890246c3a", "metadata": {}, "source": [ "### Run oo-VQE within a `Session`" ] }, { "cell_type": "code", "execution_count": 5, "id": "ae70eced-8ba9-4b91-b4e6-8bc16c1a291c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ">>> Optimizing circuit and orbital parameters...\n", "iter = 000, energy = -92.876207149442 Ha\n", "iter = 001, energy = -92.876734375183 Ha\n", "iter = 002, energy = -92.876925783922 Ha\n", "iter = 003, energy = -92.877010716404 Ha\n", "iter = 004, energy = -92.877054187221 Ha\n", "iter = 005, energy = -92.877077144958 Ha\n", "iter = 006, energy = -92.877087800441 Ha\n", "iter = 007, energy = -92.877092102492 Ha\n", "iter = 008, energy = -92.877095354281 Ha\n", "iter = 009, energy = -92.877098120179 Ha\n", "iter = 010, energy = -92.877098529436 Ha\n", "iter = 011, energy = -92.877097940409 Ha\n", "iter = 012, energy = -92.877098939063 Ha\n", "iter = 013, energy = -92.877100242573 Ha\n", "iter = 014, energy = -92.877099509000 Ha\n", "iter = 015, energy = -92.877098362466 Ha\n", "iter = 016, energy = -92.877099155649 Ha\n", "iter = 017, energy = -92.877100190114 Ha\n", "iter = 018, energy = -92.877099341453 Ha\n", "iter = 019, energy = -92.877098524989 Ha\n", "iter = 020, energy = -92.877099633845 Ha\n", "iter = 021, energy = -92.877100445689 Ha\n", "iter = 022, energy = -92.877099198612 Ha\n", "iter = 023, energy = -92.877098310807 Ha\n", "iter = 024, energy = -92.877099433566 Ha\n", "iter = 025, energy = -92.877100095336 Ha\n", "iter = 026, energy = -92.877098911411 Ha\n", "iter = 027, energy = -92.877098478068 Ha\n", "iter = 028, energy = -92.877099853173 Ha\n", "iter = 029, energy = -92.877100204316 Ha\n", "iter = 030, energy = -92.877098682070 Ha\n", "iter = 031, energy = -92.877098252094 Ha\n", "iter = 032, energy = -92.877099610098 Ha\n", "iter = 033, energy = -92.877099811727 Ha\n", "iter = 034, energy = -92.877098460672 Ha\n", "iter = 035, energy = -92.877098521455 Ha\n", "optimization finished.\n", "\n", "=== QISKIT oo-VQE RESULTS ===\n", "* Total ground state energy (Hartree): -92.877098521455\n" ] } ], "source": [ "with Session(service=service, backend=backend) as session:\n", " results = qc2data.algorithm.run()" ] }, { "cell_type": "code", "execution_count": 7, "id": "d1153716-8176-464f-9b9c-f380f0999466", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "* Optimized circuit parameters:\n", "[ 1.46194392e-02 3.18688670e-07 1.46198850e-02 -4.16826068e-08\n", " -2.48379903e-01 8.69403138e-08 1.46800730e-07 -4.14487403e-02] \n", "\n", "* Optimized orbital parameters:\n", "[-5.648939194371491e-16, 2.285287159083651e-16, -1.2437415338176084e-14, 1.237880041685819e-14, -4.157188439017333e-15, 1.0979762487595165e-14, -0.04897276627456993, 0.02146896632922398, -1.3089836301242603, 1.4308754844897145, -0.3307408958371843, 1.2631149350530646, 4.76634583444305e-16, 1.65688064711046e-16, -8.189732432435754e-17, 5.581599831555647e-15, -6.200341302141554e-15, 1.1768513763881652e-15, -4.9403599176053935e-15, -0.023244452209662852, -3.931653823813387e-15, 2.8934381218294275e-05, -1.9818451943157152e-05, 0.0011205290775414783, -0.001986404712297885, -0.00011363458996496923, -0.0012469580754804193, 3.5083059513840073e-16, -0.002166270317236903, 2.332358927912693e-16, 1.1629361077227735e-05, -2.6334478602676668e-05, 0.001296312944253889, 0.00025007944717095706, 0.0001282770572183464, -0.00019734886908562144, -3.1015507761953954e-16, -0.0007677686473740156, -8.385736431603426e-16, 4.2722439864292846e-05, 3.1946900160868517e-06, 0.0005322703168923394, -0.0003913616514054158, 0.0005627257628086311, -0.0018660787676443667, 2.2605250751161915e-17, 0.001527207132250635, -3.505494787028611e-17, -8.165563060683426e-06, 7.063180968484792e-05, -0.0013830005968207715, 0.001054538436211436, -0.0017542412383251816, -0.00194571937288568, -7.360842575944504e-16, 0.0013173280731528486, -1.4461468873100117e-15] \n", "\n", "* oo-VQE energy (Hartree):\n", "-92.8770985214549 \n", "\n", "* CASSCF/sto-3g energy (Hartree):\n", "-92.87254983967073 \n", "\n" ] } ], "source": [ "# print optimized circuit parameters\n", "print(f'* Optimized circuit parameters:')\n", "print(results.optimal_circuit_params, \"\\n\")\n", "\n", "# orbital parameters\n", "print(f'* Optimized orbital parameters:')\n", "print(results.optimal_orbital_params, \"\\n\")\n", "\n", "print(f'* oo-VQE energy (Hartree):')\n", "print(results.optimal_energy, \"\\n\")\n", "\n", "print(f'* CASSCF/sto-3g energy (Hartree):')\n", "print(CH2NH_CASSCF_ENERGY, \"\\n\")" ] } ], "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.11.8" } }, "nbformat": 4, "nbformat_minor": 5 }