@@ -107,7 +107,7 @@ def _check_set_k(self, operator: BaseOperator | PauliSumOp) -> None:
107
107
else :
108
108
self ._k = self ._in_k
109
109
110
- def _solve (self , operator : BaseOperator | PauliSumOp ) -> None :
110
+ def _solve (self , operator : BaseOperator | PauliSumOp ) -> tuple [ np . ndarray , np . ndarray ] :
111
111
if isinstance (operator , Operator ):
112
112
# Sparse SciPy matrix not supported, use dense NumPy computation.
113
113
op_matrix = operator .data
@@ -147,11 +147,7 @@ def _solve(self, operator: BaseOperator | PauliSumOp) -> None:
147
147
indices = np .argsort (eigval )[: self ._k ]
148
148
eigval = eigval [indices ]
149
149
eigvec = eigvec [:, indices ]
150
-
151
- result = NumPyEigensolverResult ()
152
- result .eigenvalues = eigval
153
- result .eigenstates = eigvec .T
154
- return result
150
+ return eigval , eigvec .T
155
151
156
152
@staticmethod
157
153
def _eval_aux_operators (
@@ -171,18 +167,20 @@ def _eval_aux_operators(
171
167
values = {}
172
168
key_op_iterator = aux_operators .items ()
173
169
for key , operator in key_op_iterator :
170
+ value = 0.0
171
+ op_matrix = None
174
172
if operator is None :
175
173
continue
176
- value = 0.0
177
- if isinstance (operator , Operator ):
174
+ elif isinstance (operator , Operator ):
178
175
value = Statevector (wavefn ).expectation_value (operator )
179
176
else :
180
177
if isinstance (operator , PauliSumOp ):
181
178
if operator .coeff != 0 :
182
179
op_matrix = operator .to_spmatrix ()
183
- value = op_matrix .dot (wavefn ).dot (np .conj (wavefn ))
184
180
else :
185
181
op_matrix = operator .to_matrix (sparse = True )
182
+
183
+ if op_matrix is not None :
186
184
value = op_matrix .dot (wavefn ).dot (np .conj (wavefn ))
187
185
188
186
value = value if np .abs (value ) > threshold else 0.0
@@ -221,48 +219,49 @@ def compute_eigenvalues(
221
219
# need to consider all elements if a filter is set
222
220
self ._k = 2 ** operator .num_qubits
223
221
224
- result = self ._solve (operator )
222
+ eigvals , eigvecs = self ._solve (operator )
225
223
226
224
# compute energies before filtering, as this also evaluates the aux operators
227
225
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
232
231
233
232
# if a filter is set, loop over the given values and only keep
234
233
if self ._filter_criterion :
235
234
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 ]
245
244
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 :
254
253
break
255
254
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
260
258
261
259
self ._k = k_orig
262
260
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
266
265
267
266
logger .debug ("NumpyEigensolverResult:\n %s" , result )
268
267
return result
0 commit comments