Skip to content

Commit 8f6f5b3

Browse files
committed
improve structure
1 parent c2a7ea6 commit 8f6f5b3

File tree

1 file changed

+37
-38
lines changed

1 file changed

+37
-38
lines changed

qiskit/algorithms/eigensolvers/numpy_eigensolver.py

+37-38
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ def _check_set_k(self, operator: BaseOperator | PauliSumOp) -> None:
107107
else:
108108
self._k = self._in_k
109109

110-
def _solve(self, operator: BaseOperator | PauliSumOp) -> None:
110+
def _solve(self, operator: BaseOperator | PauliSumOp) -> tuple[np.ndarray, np.ndarray]:
111111
if isinstance(operator, Operator):
112112
# Sparse SciPy matrix not supported, use dense NumPy computation.
113113
op_matrix = operator.data
@@ -147,11 +147,7 @@ def _solve(self, operator: BaseOperator | PauliSumOp) -> None:
147147
indices = np.argsort(eigval)[: self._k]
148148
eigval = eigval[indices]
149149
eigvec = eigvec[:, indices]
150-
151-
result = NumPyEigensolverResult()
152-
result.eigenvalues = eigval
153-
result.eigenstates = eigvec.T
154-
return result
150+
return eigval, eigvec.T
155151

156152
@staticmethod
157153
def _eval_aux_operators(
@@ -171,18 +167,20 @@ def _eval_aux_operators(
171167
values = {}
172168
key_op_iterator = aux_operators.items()
173169
for key, operator in key_op_iterator:
170+
value = 0.0
171+
op_matrix = None
174172
if operator is None:
175173
continue
176-
value = 0.0
177-
if isinstance(operator, Operator):
174+
elif isinstance(operator, Operator):
178175
value = Statevector(wavefn).expectation_value(operator)
179176
else:
180177
if isinstance(operator, PauliSumOp):
181178
if operator.coeff != 0:
182179
op_matrix = operator.to_spmatrix()
183-
value = op_matrix.dot(wavefn).dot(np.conj(wavefn))
184180
else:
185181
op_matrix = operator.to_matrix(sparse=True)
182+
183+
if op_matrix is not None:
186184
value = op_matrix.dot(wavefn).dot(np.conj(wavefn))
187185

188186
value = value if np.abs(value) > threshold else 0.0
@@ -221,48 +219,49 @@ def compute_eigenvalues(
221219
# need to consider all elements if a filter is set
222220
self._k = 2**operator.num_qubits
223221

224-
result = self._solve(operator)
222+
eigvals, eigvecs = self._solve(operator)
225223

226224
# compute energies before filtering, as this also evaluates the aux operators
227225
if aux_operators is not None:
228-
aux_op_vals = []
229-
for i in range(self._k):
230-
aux_op_vals.append(self._eval_aux_operators(aux_operators, result.eigenstates[i]))
231-
result.aux_operators_evaluated = aux_op_vals
226+
aux_op_vals = [
227+
self._eval_aux_operators(aux_operators, eigvecs[i]) for i in range(self._k)
228+
]
229+
else:
230+
aux_op_vals = None
232231

233232
# if a filter is set, loop over the given values and only keep
234233
if self._filter_criterion:
235234

236-
eigvecs = []
237-
eigvals = []
238-
aux_ops = []
239-
cnt = 0
240-
for i in range(len(result.eigenvalues)):
241-
eigvec = result.eigenstates[i]
242-
eigval = result.eigenvalues[i]
243-
if result.aux_operators_evaluated is not None:
244-
aux_op = result.aux_operators_evaluated[i]
235+
filt_eigvals = []
236+
filt_eigvecs = []
237+
filt_aux_op_vals = []
238+
count = 0
239+
for i in range(len(eigvals)):
240+
eigvec = eigvecs[i]
241+
eigval = eigvals[i]
242+
if aux_op_vals is not None:
243+
aux_op_val = aux_op_vals[i]
245244
else:
246-
aux_op = None
247-
if self._filter_criterion(eigvec, eigval, aux_op):
248-
cnt += 1
249-
eigvecs += [eigvec]
250-
eigvals += [eigval]
251-
if result.aux_operators_evaluated is not None:
252-
aux_ops += [aux_op]
253-
if cnt == k_orig:
245+
aux_op_val = None
246+
if self._filter_criterion(eigvec, eigval, aux_op_val):
247+
count += 1
248+
filt_eigvecs.append(eigvec)
249+
filt_eigvals.append(eigval)
250+
if aux_op_vals is not None:
251+
filt_aux_op_vals.append(aux_op_val)
252+
if count == k_orig:
254253
break
255254

256-
result.eigenstates = np.array(eigvecs)
257-
result.eigenvalues = np.array(eigvals)
258-
# conversion to np.array breaks in case of aux_ops
259-
result.aux_operators_evaluated = aux_ops
255+
eigvals = np.array(filt_eigvals)
256+
eigvecs = np.array(filt_eigvecs)
257+
aux_op_vals = filt_aux_op_vals
260258

261259
self._k = k_orig
262260

263-
if result.eigenstates is not None:
264-
# convert eigenstates from arrays to Statevectors
265-
result.eigenstates = [Statevector(vec) for vec in result.eigenstates]
261+
result = NumPyEigensolverResult()
262+
result.eigenvalues = eigvals
263+
result.eigenstates = [Statevector(vec) for vec in eigvecs]
264+
result.aux_operators_evaluated = aux_op_vals
266265

267266
logger.debug("NumpyEigensolverResult:\n%s", result)
268267
return result

0 commit comments

Comments
 (0)