In [1]:
# import common packages

import numpy as np
import qiskit
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit

# lib from Qiskit AQUA Chemistry
from qiskit_aqua_chemistry import FermionicOperator

# lib from optimizer and algorithm
from qiskit_aqua.operator import Operator
from qiskit_aqua import (get_algorithm_instance, get_optimizer_instance, get_variational_form_instance)

# lib for driver
from qiskit_aqua_chemistry.drivers import ConfigurationManager
from collections import OrderedDict

In [2]:
# using driver to get fermionic Hamiltonian
# PySCF example
cfg_mgr = ConfigurationManager()
pyscf_cfg = OrderedDict([('atom', 'H .0 .0 .0; H .0 .0 0.735'), ('unit', 'Angstrom'), ('charge', 0), ('spin', 0), ('basis', 'sto3g')])
section = {}
section['properties'] = pyscf_cfg
driver = cfg_mgr.get_driver_instance('PYSCF')
molecule = driver.run(section)

In [3]:
# get fermionic operator and mapping to qubit operator
ferOp = FermionicOperator(h1=molecule._one_body_integrals, h2=molecule._two_body_integrals)
qubitOp = ferOp.mapping(map_type='JORDAN_WIGNER', threshold=0.00000001)
qubitOp.convert('paulis','matrix')
qubitOp.chop(10**-10)

In [4]:
# if you do not install any driver and want like to start with random Hamiltonian
# SIZE=4
# matrix = np.random.random((SIZE,SIZE))
# qubitOp = Operator(matrix=matrix)

In [5]:
# Using exact eigensolver to get the smallest eigenvalue
exact_eigensolver = get_algorithm_instance('ExactEigensolver')
exact_eigensolver.init_args(qubitOp, k=1)
ret = exact_eigensolver.run()
print('The exact ground state energy is: {}'.format(ret['eigvals'][0].real))


The exact ground state energy is: -1.8572750302023784

In [6]:
# %timeit
# setup VQE 
# setup optimizer, use L_BFGS_B optimizer for example
lbfgs = get_optimizer_instance('L_BFGS_B')
lbfgs.set_options(maxfun=1000, factr=10, iprint=10)
# spsa = get_optimizer_instance('SPSA')
# lbfgs.print_options()

# setup variation form generator (generate trial circuits for VQE)
var_form = get_variational_form_instance('RYRZ')
var_form.init_args(qubitOp.num_qubits, 5, entangler_map = {0: [1], 1:[2], 2:[3]})

# setup VQE with operator, variation form, and optimzer
vqe_algorithm = get_algorithm_instance('VQE')
vqe_algorithm.setup_quantum_backend(backend='statevector_simulator', skip_transpiler=True)
vqe_algorithm.init_args(qubitOp, 'matrix', var_form, lbfgs)
results = vqe_algorithm.run()
print("Minimum value: {}".format(results['eigvals'][0].real))
print("Parameters: {}".format(results['opt_params']))


Minimum value: -1.8561457770882446
Parameters: [ 3.02820644  1.47014998  1.19845875  3.14159265 -2.51327155  2.53489165
  0.69310047 -2.62699062 -2.31484704  0.71715343  0.91447744 -1.00352516
 -0.7735549  -0.32130523 -1.68941855 -2.2976249   0.68602553 -0.84560077
 -0.3763706  -0.72044276 -2.55963077 -0.95826442 -0.02167944  0.60251991
 -1.52871136 -2.9734587   0.21359916 -2.27609593  3.13968575 -1.02984691
  0.36880623  2.26815822 -0.81645147  0.46205246  2.66458065  1.77250716
 -0.79082157 -2.65860629  3.14159265  0.49522769  2.49070312  1.25924913
 -3.14159265 -3.05236563 -1.16602236  0.76882443  2.12077842 -0.01455567]

In [ ]: