Example 3: oo-VQE run on methanimine using Qiskit IBM Runtime Service and a noisy simulator.

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.

Import required packages

[1]:
import numpy as np

# ASE Atoms object
from ase import Atoms

# IBMQ runtime service packages
from qiskit_ibm_runtime import (
    QiskitRuntimeService,
    EstimatorV1 as Estimator,
    Options,
    Session
)

# Qiskit-related packages
from qiskit_aer import AerSimulator
from qiskit_algorithms.optimizers import COBYLA, SLSQP

# ignore package import warnings
import warnings
warnings.filterwarnings('ignore')

# qc2 packages
from qc2.data import qc2Data
from qc2.ase import PySCF
from qc2.algorithms.utils import ActiveSpace
from qc2.algorithms.qiskit import oo_VQE, VQE

# calculated qchem energies with sto-3g basis
CH2NH_HF_ENERGY = -92.82304270237677
CH2NH_CASCI_ENERGY = -92.87111994151458
CH2NH_CASSCF_ENERGY = -92.87254983967073

Initiate IBM runtime service & prepare Estimator

In the following steps, we assume that you have already created an IBM Quantum account and saved your accound credentials (via your personal token) on disk; for further info click here.

[2]:
# instantiating `QiskitRuntimeService`
service = QiskitRuntimeService()

# create a noisy simulator with the same specs of a real backend
real_backend = service.backend("ibm_kyoto")
backend = AerSimulator.from_backend(real_backend)

# Use the following line if you want to run on a real quantum backend
# backend = service.least_busy(simulator=False)

options = Options()

# set seed for reproducible runs
options.simulator.seed_simulator = 42

# error supression options
options.optimization_level = 3

# error mitigation options
options.resilience_level = 2  # ZNE

# execution options
options.execution.shots = 6000

# instantiate the Estimator to calculate expectation values
estimator = Estimator(backend=backend, options=options)

Instantiate qc2Data class and run qc2-ASE calculator

[3]:
# set Atoms object
mol = Atoms(
    'CH2NH',
    positions=[
        [ 0.058,  0.585, 0.000],
        [-0.831,  1.217, 0.000],
        [-0.932, -1.031, 0.000],
        [ 0.058, -0.688, 0.000],
        [ 1.009,  1.115, 0.000],
    ]
)

# instantiate qc2Data class
qc2data = qc2Data(
    molecule=mol,
    filename='CH2NH.hdf5',
    schema='qcschema'
)

# specify the qchem calculator
qc2data.molecule.calc = PySCF(method='scf.RHF', basis='sto-3g')

# run calculation and save qchem data in the hdf5 file
qc2data.run()
* Reference energy (Hartree): -92.82304270237677
* Saving qchem data in CH2NH.hdf5

Instantiate qc2.algorithms.oo_VQE class

[4]:
init_circuit_params = [
    1.46194392e-02, 3.18688670e-07, 1.46198850e-02, -4.16826068e-08,
    -2.48379903e-01, 8.69403138e-08, 1.46800730e-07, -4.14487403e-02
]

init_orbital_params = [
    -3.121019529045726e-16, 2.3936560531586324e-16, -2.512908891659351e-15,
    9.63495665121923e-15, -3.322688177851631e-15, 1.6929996259238916e-15,
    -0.042430832969354224, 0.037788537159730795, -0.6402388305542434,
    1.9747778672836942, -0.42241657801780785, 0.6653997390308073,
    1.8049427015233007e-14, -9.909986054999737e-17, 6.984155203809811e-17,
    -5.740096436152435e-16, 2.9001323479774723e-15, -8.641983286294291e-16,
    1.0876576621088035e-15, -0.022177643413708235, -4.7117310163774974e-17,
    -1.1300943909203134e-05, 4.06199740895308e-06, -3.482280484373978e-05,
    -0.0005134543053396985, -5.2073631321601226e-05, -0.00010725841504334843,
    3.713374803648559e-16, 8.895232986125907e-05, 2.3996887484890763e-16,
    4.100235652869602e-06, -2.886209500963695e-05, 0.001235361499165538,
    0.0004530121939473705, 9.649997855549563e-05, -0.00021739150881453442,
    -3.0049276154810977e-16, 0.00041820453123261165, -8.444748735732234e-16,
    1.330143080213958e-05, 9.479772806843338e-06, -0.0004383044737212205,
    0.000336222549677801, 0.0006018865000642227, -0.0013993665930059293,
    1.1108355579962116e-17, 0.0009727324063734195, -1.7282621334956625e-17,
    7.521744312574251e-06, 6.085143278202279e-05, -0.001335223060730951,
    0.0006296885084617651, -0.0018965057185801933, -0.0023584488500398293,
    -7.391431921310791e-16, 0.0011667046958250059, -1.4475093325379303e-15
]

# instantiate oo-VQE class
qc2data.algorithm = oo_VQE(
    active_space=ActiveSpace(
        num_active_electrons=(2, 2),
        num_active_spatial_orbitals=3
    ),
    mapper="jw",
    optimizer=SLSQP(),
    estimator=estimator,
    max_iterations=100,
    init_circuit_params=init_circuit_params,
    init_orbital_params=init_orbital_params
)

Run oo-VQE within a Session

[5]:
with Session(service=service, backend=backend) as session:
    results = qc2data.algorithm.run()
>>> Optimizing circuit and orbital parameters...
iter = 000, energy = -92.876207149442 Ha
iter = 001, energy = -92.876734375183 Ha
iter = 002, energy = -92.876925783922 Ha
iter = 003, energy = -92.877010716404 Ha
iter = 004, energy = -92.877054187221 Ha
iter = 005, energy = -92.877077144958 Ha
iter = 006, energy = -92.877087800441 Ha
iter = 007, energy = -92.877092102492 Ha
iter = 008, energy = -92.877095354281 Ha
iter = 009, energy = -92.877098120179 Ha
iter = 010, energy = -92.877098529436 Ha
iter = 011, energy = -92.877097940409 Ha
iter = 012, energy = -92.877098939063 Ha
iter = 013, energy = -92.877100242573 Ha
iter = 014, energy = -92.877099509000 Ha
iter = 015, energy = -92.877098362466 Ha
iter = 016, energy = -92.877099155649 Ha
iter = 017, energy = -92.877100190114 Ha
iter = 018, energy = -92.877099341453 Ha
iter = 019, energy = -92.877098524989 Ha
iter = 020, energy = -92.877099633845 Ha
iter = 021, energy = -92.877100445689 Ha
iter = 022, energy = -92.877099198612 Ha
iter = 023, energy = -92.877098310807 Ha
iter = 024, energy = -92.877099433566 Ha
iter = 025, energy = -92.877100095336 Ha
iter = 026, energy = -92.877098911411 Ha
iter = 027, energy = -92.877098478068 Ha
iter = 028, energy = -92.877099853173 Ha
iter = 029, energy = -92.877100204316 Ha
iter = 030, energy = -92.877098682070 Ha
iter = 031, energy = -92.877098252094 Ha
iter = 032, energy = -92.877099610098 Ha
iter = 033, energy = -92.877099811727 Ha
iter = 034, energy = -92.877098460672 Ha
iter = 035, energy = -92.877098521455 Ha
optimization finished.

=== QISKIT oo-VQE RESULTS ===
* Total ground state energy (Hartree): -92.877098521455
[7]:
# print optimized circuit parameters
print(f'* Optimized circuit parameters:')
print(results.optimal_circuit_params, "\n")

# orbital parameters
print(f'* Optimized orbital parameters:')
print(results.optimal_orbital_params, "\n")

print(f'* oo-VQE energy (Hartree):')
print(results.optimal_energy, "\n")

print(f'* CASSCF/sto-3g energy (Hartree):')
print(CH2NH_CASSCF_ENERGY, "\n")
* Optimized circuit parameters:
[ 1.46194392e-02  3.18688670e-07  1.46198850e-02 -4.16826068e-08
 -2.48379903e-01  8.69403138e-08  1.46800730e-07 -4.14487403e-02]

* Optimized orbital parameters:
[-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]

* oo-VQE energy (Hartree):
-92.8770985214549

* CASSCF/sto-3g energy (Hartree):
-92.87254983967073