I am trying to measure the number operator, together with the ground state energy with the built-in VQE on Qiskit. However, if I pick the backend to be Aer.get_backend('qasm_simulator')
, it seems to give an error 'numpy.float64' object is not iterable
. Please see the minimal working code and the error message below. This is rather confusing, because the backend BasicAer.get_backend('statevector_simulator')
works perfectly fine. Thanks for the help!
from qiskit.aqua.algorithms import VQE, NumPyEigensolver
from qiskit.chemistry.components.variational_forms import UCCSD
from qiskit.chemistry.components.initial_states import HartreeFock
from qiskit.chemistry.drivers import PySCFDriver, UnitsType
from qiskit import Aer, BasicAer
from qiskit.chemistry import FermionicOperator
from qiskit.aqua.operators import Z2Symmetries
from qiskit.aqua.components.optimizers import L_BFGS_B
optimizer = L_BFGS_B()
backend = Aer.get_backend('qasm_simulator')
# backend = BasicAer.get_backend('statevector_simulator')
atom='H .0 .0 .0; H .0 .0 0.74'
map_type = 'parity'
driver = PySCFDriver(atom=atom, unit=UnitsType.ANGSTROM, basis='sto3g')
molecule = driver.run()
num_alpha = molecule.num_alpha
num_beta = molecule.num_beta
# num_particles = molecule.num_alpha + molecule.num_beta
num_particles = [ num_alpha , num_beta ]
num_spin_orbitals = molecule.num_orbitals * 2
ferOp = FermionicOperator(h1=molecule.one_body_integrals, h2=molecule.two_body_integrals)
numOp = ferOp.total_particle_number()
qubitOp = ferOp.mapping(map_type=map_type)
qubitNumOp = numOp.mapping(map_type=map_type )
qubitOp = Z2Symmetries.two_qubit_reduction(qubitOp, num_particles)
qubitNumOp = Z2Symmetries.two_qubit_reduction(qubitNumOp, num_particles)
print('Ground state energy without shift is ' , NumPyEigensolver( qubitOp , k=2 ).run().eigenvalues.real )
init_state = HartreeFock( num_spin_orbitals , num_particles , map_type )
print( 'HF = ' , init_state.bitstr )
# setup the variational form for VQE
var_form_vqe = UCCSD(
num_orbitals=num_spin_orbitals,
num_particles=num_particles,
initial_state=init_state,
qubit_mapping=map_type ,
two_qubit_reduction = True ,
)
algorithm_vqe = VQE(qubitOp, var_form_vqe, optimizer , aux_operators = [qubitNumOp] )
result_vqe = algorithm_vqe.run(backend)
print( 'para_vqe = ' , result_vqe['optimal_point' ] )
print( 'eigenvalue_vqe = ' , result_vqe['eigenvalue' ].real )
print( result_vqe )
error message is attached below
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-5fb4d9ac0b3c> in <module>
59 algorithm_vqe = VQE(qubitOp, var_form_vqe, optimizer , aux_operators = [qubitNumOp] )
60
---> 61 result_vqe = algorithm_vqe.run(backend)
62
63
~/<redacted>/qiskit/aqua/algorithms/quantum_algorithm.py in run(self, quantum_instance, **kwargs)
68 self.quantum_instance = quantum_instance
69
---> 70 return self._run()
71
72 @abstractmethod
~/<redacted>/qiskit/aqua/algorithms/minimum_eigen_solvers/vqe.py in _run(self)
425
426 if self.aux_operators:
--> 427 self._eval_aux_ops()
428 # TODO remove when ._ret is deprecated
429 result.aux_operator_eigenvalues = self._ret['aux_ops'][0]
~/<redacted>/qiskit/aqua/algorithms/minimum_eigen_solvers/vqe.py in _eval_aux_ops(self, threshold)
445 # Deal with the aux_op behavior where there can be Nones or Zero qubit Paulis in the list
446 self._ret['aux_ops'] = [None if is_none else [result]
--> 447 for (is_none, result) in zip(self._aux_op_nones, aux_op_results)]
448 self._ret['aux_ops'] = np.array([self._ret['aux_ops']])
449
TypeError: 'numpy.float64' object is not iterable
```