class NumPyMinimumEigensolver(ClassicalAlgorithm, MinimumEigensolver):
    """
    The Numpy Minimum Eigensolver algorithm.
    """
    def __init__(
        self,
        operator: Optional[Union[OperatorBase, LegacyBaseOperator]] = None,
        aux_operators: Optional[List[Optional[Union[
            OperatorBase, LegacyBaseOperator]]]] = None,
        filter_criterion: Callable[
            [Union[List,
                   np.ndarray], float, Optional[List[float]]], bool] = None
    ) -> None:
        """
        Args:
            operator: Operator instance
            aux_operators: Auxiliary operators to be evaluated at minimum eigenvalue
            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.
        """
        self._ces = NumPyEigensolver(operator=operator,
                                     k=1,
                                     aux_operators=aux_operators,
                                     filter_criterion=filter_criterion)
        # TODO remove
        self._ret = {}  # type: Dict[str, Any]

    @property
    def operator(self) -> Optional[OperatorBase]:
        return self._ces.operator

    @operator.setter
    def operator(self, operator: Union[OperatorBase,
                                       LegacyBaseOperator]) -> None:
        self._ces.operator = operator

    @property
    def aux_operators(self) -> Optional[List[Optional[OperatorBase]]]:
        return self._ces.aux_operators

    @aux_operators.setter
    def aux_operators(
        self,
        aux_operators: Optional[List[Optional[Union[OperatorBase,
                                                    LegacyBaseOperator]]]]
    ) -> None:
        self._ces.aux_operators = aux_operators

    @property
    def filter_criterion(
        self
    ) -> Optional[Callable[
        [Union[List, np.ndarray], float, Optional[List[float]]], bool]]:
        """ returns the filter criterion if set """
        return self._ces.filter_criterion

    @filter_criterion.setter
    def filter_criterion(
        self, filter_criterion: Optional[Callable[
            [Union[List, np.ndarray], float, Optional[List[float]]], bool]]
    ) -> None:
        """ set the filter criterion """
        self._ces.filter_criterion = filter_criterion

    def supports_aux_operators(self) -> bool:
        return self._ces.supports_aux_operators()

    def compute_minimum_eigenvalue(
        self,
        operator: Optional[Union[OperatorBase, LegacyBaseOperator]] = None,
        aux_operators: Optional[List[Optional[Union[
            OperatorBase, LegacyBaseOperator]]]] = None
    ) -> MinimumEigensolverResult:
        super().compute_minimum_eigenvalue(operator, aux_operators)
        return self._run()

    def _run(self) -> MinimumEigensolverResult:
        """
        Run the algorithm to compute up to the minimum eigenvalue.
        Returns:
            dict: Dictionary of results
        """
        result_ces = self._ces.run()
        self._ret = self._ces._ret  # TODO remove

        result = MinimumEigensolverResult()
        if len(result_ces.eigenvalues) > 0:
            result.eigenvalue = result_ces.eigenvalues[0]
            result.eigenstate = result_ces.eigenstates[0]
            if result_ces.aux_operator_eigenvalues is not None:
                if len(result_ces.aux_operator_eigenvalues) > 0:
                    result.aux_operator_eigenvalues = result_ces.aux_operator_eigenvalues[
                        0]
        else:
            result.eigenvalue = None
            result.eigenstate = None
            result.aux_operator_eigenvalues = None

        logger.debug('NumPyMinimumEigensolver dict:\n%s',
                     pprint.pformat(result.data, indent=4))

        return result
Exemplo n.º 2
0
class NumPyMinimumEigensolver(ClassicalAlgorithm, MinimumEigensolver):
    """
    The Numpy Minimum Eigensolver algorithm.
    """
    def __init__(
        self,
        operator: Optional[Union[OperatorBase, LegacyBaseOperator]] = None,
        aux_operators: Optional[List[Optional[Union[
            OperatorBase, LegacyBaseOperator]]]] = None
    ) -> None:
        """
        Args:
            operator: Operator instance
            aux_operators: Auxiliary operators to be evaluated at minimum eigenvalue
        """
        self._ces = NumPyEigensolver(operator, 1, aux_operators)
        # TODO remove
        self._ret = {}  # type: Dict[str, Any]

    @property
    def operator(self) -> Optional[OperatorBase]:
        return self._ces.operator

    @operator.setter
    def operator(self, operator: Union[OperatorBase,
                                       LegacyBaseOperator]) -> None:
        self._ces.operator = operator

    @property
    def aux_operators(self) -> Optional[List[Optional[OperatorBase]]]:
        return self._ces.aux_operators

    @aux_operators.setter
    def aux_operators(
        self,
        aux_operators: Optional[List[Optional[Union[OperatorBase,
                                                    LegacyBaseOperator]]]]
    ) -> None:
        self._ces.aux_operators = aux_operators

    def supports_aux_operators(self) -> bool:
        return self._ces.supports_aux_operators()

    def compute_minimum_eigenvalue(
        self,
        operator: Optional[Union[OperatorBase, LegacyBaseOperator]] = None,
        aux_operators: Optional[List[Optional[Union[
            OperatorBase, LegacyBaseOperator]]]] = None
    ) -> MinimumEigensolverResult:
        super().compute_minimum_eigenvalue(operator, aux_operators)
        return self._run()

    def _run(self) -> MinimumEigensolverResult:
        """
        Run the algorithm to compute up to the minimum eigenvalue.
        Returns:
            dict: Dictionary of results
        """
        result_ces = self._ces.run()
        self._ret = self._ces._ret  # TODO remove

        result = MinimumEigensolverResult()
        result.eigenvalue = result_ces.eigenvalues[0]
        result.eigenstate = result_ces.eigenstates[0]
        if result_ces.aux_operator_eigenvalues is not None:
            if len(result_ces.aux_operator_eigenvalues) > 0:
                result.aux_operator_eigenvalues = result_ces.aux_operator_eigenvalues[
                    0]

        logger.debug('NumPyMinimumEigensolver dict:\n%s',
                     pprint.pformat(result.data, indent=4))

        return result
 def supports_aux_operators(cls) -> bool:
     return NumPyEigensolver.supports_aux_operators()