qiskit-community / qiskit-aqua

Quantum Algorithms & Applications (**DEPRECATED** since April 2021 - see readme for more info)
https://qiskit.org/aqua
Apache License 2.0
573 stars 376 forks source link

VQE.run() only does one function evaluation with qasm_simulator backend #151

Closed ss2165 closed 6 years ago

ss2165 commented 6 years ago

Informations

What is the current behavior?

Ground state energy evaluation with VQE succeeds with statevector_simulator backend but with qasm_simulator evaluates to 0 once and then terminates.

Steps to reproduce the problem

import numpy as np
from qiskit.tools.qi.pauli import Pauli

# lib from Qiskit AQUA Chemistry
from qiskit_aqua_chemistry import FermionicOperator

from qiskit_aqua.operator import Operator
from qiskit_aqua import (get_algorithm_instance, get_optimizer_instance, get_variational_form_instance)
from qiskit_aqua.algorithms.components.initial_states.hartree_fock import HartreeFock

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

# 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)

n_electrons = 2
# print(molecule._nuclear_repulsion_energy)

n_qubits = molecule._one_body_integrals.shape[0]
# print(molecule._one_body_integrals)

# 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)
# print(qubitOp)
qubitOp.convert('paulis','matrix')
qubitOp.chop(10**-10)

# 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)
# setup variation form generator (generate trial circuits for VQE)
initial_hf = HartreeFock()
initial_hf.init_args(num_qubits=n_qubits, num_orbitals=n_qubits, 
                     qubit_mapping='jordan_wigner', two_qubit_reduction=False, num_particles= n_electrons)

var_form = get_variational_form_instance('UCCSD')
var_form.init_args(num_qubits=n_qubits, num_orbitals=n_qubits, 
                   num_particles=n_electrons, depth=1, initial_state=initial_hf, qubit_mapping='jordan_wigner')

number_amplitudes = len(var_form._single_excitations)+ len(var_form._double_excitations)
amplitudes_0 = np.ndarray(shape=(number_amplitudes,), dtype=float, order='F')
for i in range(len(amplitudes_0)):
    amplitudes_0[i] = 0.000001

# setup VQE with operator, variation form, and optimzer
vqe_algorithm = get_algorithm_instance('VQE')

backend_name = 'qasm_simulator'

vqe_algorithm.setup_quantum_backend(backend=backend_name, skip_transpiler=True)
vqe_algorithm.init_args(qubitOp, 'matrix', var_form, lbfgs, opt_init_point=amplitudes_0)
results = vqe_algorithm.run()
results['eigvals'][0] = results['eigvals'][0] + molecule._nuclear_repulsion_energy
print("Minimum value: {}".format(results['eigvals'][0].real))
print("Parameters: {}".format(results['opt_params']))

What is the expected behavior?

same as statevector_simulator

Suggested solutions

chunfuchen commented 6 years ago

Hi, the qasm_simulator does not work with matrix operator_mode, please use paulis or grouped_paulis mode. (the second paramter in the vqe init_args)

We will update the parameter validation in the VQE. Thanks.

chunfuchen commented 6 years ago

@ss2165 do you still encounter this issue after you change the operator_mode?

ss2165 commented 6 years ago

No, that has solved it, thank you