Source code for qiskit.algorithms.minimum_eigen_solvers.numpy_minimum_eigen_solver
# This code is part of Qiskit.
#
# (C) Copyright IBM 2020, 2022.
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.
"""The Numpy Minimum Eigensolver algorithm."""
from __future__ import annotations
import logging
import warnings
from collections.abc import Callable
import numpy as np
from qiskit.opflow import OperatorBase
from qiskit.utils.deprecation import deprecate_func
from ..eigen_solvers.numpy_eigen_solver import NumPyEigensolver
from .minimum_eigen_solver import MinimumEigensolver, MinimumEigensolverResult
from ..list_or_dict import ListOrDict
logger = logging.getLogger(__name__)
[docs]class NumPyMinimumEigensolver(MinimumEigensolver):
"""
Deprecated: Numpy Minimum Eigensolver algorithm.
The NumPyMinimumEigensolver class has been superseded by the
:class:`qiskit.algorithms.minimum_eigensolvers.NumPyMinimumEigensolver` class.
This class will be deprecated in a future release and subsequently
removed after that.
"""
@deprecate_func(
additional_msg=(
"Instead, use the class "
"``qiskit.algorithms.minimum_eigensolvers.NumPyMinimumEigensolver``. "
"See https://qisk.it/algo_migration for a migration guide."
),
since="0.24.0",
package_name="qiskit-terra",
)
def __init__(
self,
filter_criterion: Callable[
[list | np.ndarray, float, ListOrDict[float] | None], bool
] = None,
) -> None:
"""
Args:
filter_criterion: callable that allows to filter eigenvalues/eigenstates. The minimum
eigensolver is only searching over feasible states and returns an eigenstate that
has the smallest eigenvalue among feasible states. The callable has the signature
`filter(eigenstate, eigenvalue, aux_values)` and must return a boolean to indicate
whether to consider this value or not. If there is no
feasible element, the result can even be empty.
"""
with warnings.catch_warnings():
warnings.simplefilter("ignore")
super().__init__()
self._ces = NumPyEigensolver(filter_criterion=filter_criterion)
self._ret = MinimumEigensolverResult()
@property
def filter_criterion(
self,
) -> Callable[[list | np.ndarray, float, ListOrDict[float] | None], bool] | None:
"""returns the filter criterion if set"""
return self._ces.filter_criterion
@filter_criterion.setter
def filter_criterion(
self,
filter_criterion: Callable[[list | np.ndarray, float, ListOrDict[float] | None], bool]
| None,
) -> None:
"""set the filter criterion"""
self._ces.filter_criterion = filter_criterion
[docs] @classmethod
def supports_aux_operators(cls) -> bool:
return NumPyEigensolver.supports_aux_operators()
[docs] def compute_minimum_eigenvalue(
self, operator: OperatorBase, aux_operators: ListOrDict[OperatorBase] | None = None
) -> MinimumEigensolverResult:
super().compute_minimum_eigenvalue(operator, aux_operators)
result_ces = self._ces.compute_eigenvalues(operator, aux_operators)
self._ret = MinimumEigensolverResult()
if result_ces.eigenvalues is not None and len(result_ces.eigenvalues) > 0:
self._ret.eigenvalue = result_ces.eigenvalues[0]
self._ret.eigenstate = result_ces.eigenstates[0]
if result_ces.aux_operator_eigenvalues:
self._ret.aux_operator_eigenvalues = result_ces.aux_operator_eigenvalues[0]
logger.debug("MinimumEigensolver:\n%s", self._ret)
return self._ret