Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/tutorials/01_algorithms_introduction.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@
"source": [
"def callback(**kwargs):\n",
" if kwargs[\"count\"] == 0:\n",
" print(f\"Callback function has been called!\")"
" print(\"Callback function has been called!\")"
]
},
{
Expand Down
3 changes: 1 addition & 2 deletions docs/tutorials/05_qaoa.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,6 @@
],
"source": [
"from qiskit.primitives import StatevectorSampler\n",
"from qiskit.quantum_info import Pauli\n",
"from qiskit.result import QuasiDistribution\n",
"\n",
"from qiskit_algorithms import QAOA\n",
Expand Down Expand Up @@ -375,7 +374,7 @@
"source": [
"def callback(**kwargs):\n",
" if kwargs[\"count\"] == 0:\n",
" print(f\"Callback function has been called!\")"
" print(\"Callback function has been called!\")"
]
},
{
Expand Down
2 changes: 1 addition & 1 deletion docs/tutorials/06_grover.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -747,7 +747,7 @@
"source": [
"def callback(**kwargs):\n",
" if kwargs[\"count\"] == 0:\n",
" print(f\"Callback function has been called!\")"
" print(\"Callback function has been called!\")"
]
},
{
Expand Down
3 changes: 1 addition & 2 deletions docs/tutorials/10_pvqd.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -692,7 +692,7 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -701,7 +701,6 @@
"\n",
"def exact(final_time, timestep, hamiltonian, initial_state):\n",
" \"\"\"Get the exact values for energy and the observable.\"\"\"\n",
" O = observable.to_matrix()\n",
" H = hamiltonian.to_matrix()\n",
"\n",
" energ, magn = [], [] # list of energies and magnetizations evaluated at timesteps timestep\n",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from __future__ import annotations

from collections.abc import Callable
from typing import Any, List, cast
from typing import Any, cast

from qiskit.circuit import QuantumCircuit, Gate
from qiskit.circuit.library import GroverOperator
Expand Down Expand Up @@ -177,10 +177,10 @@ def is_good_state(self) -> Callable[[str], bool]:
return self._is_good_state # returns None if no is_good_state arg has been set
elif isinstance(self._is_good_state, list):
if all(isinstance(good_bitstr, str) for good_bitstr in self._is_good_state):
return lambda bitstr: bitstr in cast(List[str], self._is_good_state)
return lambda bitstr: bitstr in cast(list[str], self._is_good_state)
else:
return lambda bitstr: all(
bitstr[good_index] == "1" for good_index in cast(List[int], self._is_good_state)
bitstr[good_index] == "1" for good_index in cast(list[int], self._is_good_state)
)

return lambda bitstr: bitstr in cast(Statevector, self._is_good_state).probabilities_dict()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This code is part of a Qiskit project.
#
# (C) Copyright IBM 2021, 2023.
# (C) Copyright IBM 2021, 2025.
#
# 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
Expand All @@ -24,7 +24,7 @@ class AmplitudeAmplifier(ABC):
"""The interface for amplification algorithms."""

@abstractmethod
def amplify(self, amplification_problem: AmplificationProblem) -> "AmplitudeAmplifierResult":
def amplify(self, amplification_problem: AmplificationProblem) -> AmplitudeAmplifierResult:
"""Run the amplification algorithm.

Args:
Expand Down
2 changes: 1 addition & 1 deletion qiskit_algorithms/amplitude_amplifiers/grover.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ def sampler(self, sampler: BaseSamplerV2) -> None:
"""
self._sampler = sampler

def amplify(self, amplification_problem: AmplificationProblem) -> "GroverResult":
def amplify(self, amplification_problem: AmplificationProblem) -> GroverResult:
"""Run the Grover algorithm.

Args:
Expand Down
6 changes: 3 additions & 3 deletions qiskit_algorithms/amplitude_estimators/ae.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ def _evaluate_count_results(self, counts) -> tuple[dict[float, float], dict[int,

@staticmethod
def compute_mle(
result: "AmplitudeEstimationResult", apply_post_processing: bool = False
result: AmplitudeEstimationResult, apply_post_processing: bool = False
) -> float:
"""Compute the Maximum Likelihood Estimator (MLE).

Expand Down Expand Up @@ -285,7 +285,7 @@ def loglikelihood(a):

return a_opt

def estimate(self, estimation_problem: EstimationProblem) -> "AmplitudeEstimationResult":
def estimate(self, estimation_problem: EstimationProblem) -> AmplitudeEstimationResult:
"""Run the amplitude estimation algorithm on provided estimation problem.

Args:
Expand Down Expand Up @@ -379,7 +379,7 @@ def estimate(self, estimation_problem: EstimationProblem) -> "AmplitudeEstimatio

@staticmethod
def compute_confidence_interval(
result: "AmplitudeEstimationResult",
result: AmplitudeEstimationResult,
alpha: float = 0.05,
kind: str = "likelihood_ratio",
) -> tuple[float, float]:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This code is part of a Qiskit project.
#
# (C) Copyright IBM 2018, 2023.
# (C) Copyright IBM 2018, 2025.
#
# 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
Expand All @@ -24,7 +24,7 @@ class AmplitudeEstimator(ABC):
"""The Amplitude Estimation interface."""

@abstractmethod
def estimate(self, estimation_problem: EstimationProblem) -> "AmplitudeEstimatorResult":
def estimate(self, estimation_problem: EstimationProblem) -> AmplitudeEstimatorResult:
"""Run the amplitude estimation algorithm.

Args:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This code is part of a Qiskit project.
#
# (C) Copyright IBM 2020, 2024.
# (C) Copyright IBM 2020, 2025.
#
# 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
Expand Down Expand Up @@ -202,7 +202,7 @@ def grover_operator(self, grover_operator: QuantumCircuit | None) -> None:
"""
self._grover_operator = grover_operator

def rescale(self, scaling_factor: float) -> "EstimationProblem":
def rescale(self, scaling_factor: float) -> EstimationProblem:
"""Rescale the good state amplitude in the estimation problem.

Args:
Expand Down
6 changes: 3 additions & 3 deletions qiskit_algorithms/amplitude_estimators/fae.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"""Faster Amplitude Estimation."""

from __future__ import annotations
from typing import cast, Tuple, Any
from typing import cast, Any
import warnings
import numpy as np

Expand Down Expand Up @@ -182,7 +182,7 @@ def construct_circuit(

return circuit

def estimate(self, estimation_problem: EstimationProblem) -> "FasterAmplitudeEstimationResult":
def estimate(self, estimation_problem: EstimationProblem) -> FasterAmplitudeEstimationResult:
"""Run the amplitude estimation algorithm on provided estimation problem.

Args:
Expand Down Expand Up @@ -264,7 +264,7 @@ def cos_estimate(power, shots):
result.estimation_processed = problem.post_processing(value) # type: ignore[assignment]
result.confidence_interval = value_ci
result.confidence_interval_processed = cast(
Tuple[float, float], (problem.post_processing(x) for x in value_ci)
tuple[float, float], (problem.post_processing(x) for x in value_ci)
)
result.theta_intervals = theta_cis

Expand Down
9 changes: 4 additions & 5 deletions qiskit_algorithms/amplitude_estimators/iae.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
"""The Iterative Quantum Amplitude Estimation Algorithm."""

from __future__ import annotations
from typing import cast, Callable, Tuple, Any
from typing import cast, Any
from collections.abc import Callable
import warnings
import numpy as np
from scipy.stats import beta
Expand Down Expand Up @@ -268,9 +269,7 @@ def _good_state_probability(

return int(one_counts), one_counts / sum(counts_dict.values())

def estimate(
self, estimation_problem: EstimationProblem
) -> "IterativeAmplitudeEstimationResult":
def estimate(self, estimation_problem: EstimationProblem) -> IterativeAmplitudeEstimationResult:
"""Run the amplitude estimation algorithm on provided estimation problem.

Args:
Expand Down Expand Up @@ -384,7 +383,7 @@ def estimate(
a_intervals.append([a_l, a_u])

# get the latest confidence interval for the estimate of a
confidence_interval = cast(Tuple[float, float], a_intervals[-1])
confidence_interval = cast(tuple[float, float], a_intervals[-1])

# the final estimate is the mean of the confidence interval
estimation = np.mean(confidence_interval)
Expand Down
18 changes: 9 additions & 9 deletions qiskit_algorithms/amplitude_estimators/mlae.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,13 @@
"""The Maximum Likelihood Amplitude Estimation algorithm."""

from __future__ import annotations
from collections.abc import Sequence
from typing import Callable, List, Tuple, cast, Any
from collections.abc import Callable, Sequence
from typing import cast, Any
import warnings

import numpy as np
from scipy.optimize import brute
from scipy.stats import norm, chi2

from qiskit import ClassicalRegister, QuantumRegister, QuantumCircuit
from qiskit.primitives import BaseSamplerV2, StatevectorSampler

Expand All @@ -29,7 +28,8 @@
from ..custom_types import Transpiler
from ..exceptions import AlgorithmError

MINIMIZER = Callable[[Callable[[float], float], List[Tuple[float, float]]], float]

MINIMIZER = Callable[[Callable[[float], float], list[tuple[float, float]]], float]


class MaximumLikelihoodAmplitudeEstimation(AmplitudeEstimator):
Expand Down Expand Up @@ -181,7 +181,7 @@ def construct_circuits(

@staticmethod
def compute_confidence_interval(
result: "MaximumLikelihoodAmplitudeEstimationResult",
result: MaximumLikelihoodAmplitudeEstimationResult,
alpha: float,
kind: str = "fisher",
apply_post_processing: bool = False,
Expand Down Expand Up @@ -269,7 +269,7 @@ def loglikelihood(theta):

def estimate(
self, estimation_problem: EstimationProblem
) -> "MaximumLikelihoodAmplitudeEstimationResult":
) -> MaximumLikelihoodAmplitudeEstimationResult:
"""Run the amplitude estimation algorithm on provided estimation problem.

Args:
Expand Down Expand Up @@ -320,7 +320,7 @@ def estimate(
num_state_qubits = circuits[0].num_qubits - circuits[0].num_ancillas

theta, good_counts = cast(
Tuple[float, List[float]],
tuple[float, list[float]],
self.compute_mle(result.circuit_results, estimation_problem, num_state_qubits, True),
)

Expand Down Expand Up @@ -424,7 +424,7 @@ def _safe_max(


def _compute_fisher_information(
result: "MaximumLikelihoodAmplitudeEstimationResult",
result: MaximumLikelihoodAmplitudeEstimationResult,
num_sum_terms: int | None = None,
observed: bool = False,
) -> float:
Expand Down Expand Up @@ -558,7 +558,7 @@ def loglikelihood(theta, one_counts, all_counts):
# then yield [0, pi/2]
confint = [_safe_min(above_thres, default=0), _safe_max(above_thres, default=np.pi / 2)]
mapped_confint = cast(
Tuple[float, float], tuple(result.post_processing(np.sin(bound) ** 2) for bound in confint)
tuple[float, float], tuple(result.post_processing(np.sin(bound) ** 2) for bound in confint)
)

return mapped_confint
Expand Down
19 changes: 16 additions & 3 deletions qiskit_algorithms/custom_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,29 @@
"""Types used by the qiskit-algorithms package."""
from __future__ import annotations

from typing import Any, Protocol, Union
from typing import Any, Protocol, TypeAlias, TypeVar, overload

from qiskit import QuantumCircuit

_Circuits = Union[list[QuantumCircuit], QuantumCircuit]
_T = TypeVar("_T") # Pylint does not allow single character class names.
ListOrDict = list[_T | None] | dict[str, _T]

_Circuits: TypeAlias = list[QuantumCircuit] | QuantumCircuit


class Transpiler(Protocol):
"""A Generic type to represent a transpiler."""

def run(self, circuits: _Circuits, **options: Any) -> _Circuits:
@overload
def run(self, circuits: list[QuantumCircuit], /, **options: Any) -> list[QuantumCircuit]:
"""Transpile a list of quantum circuits."""
...

@overload
def run(self, circuits: QuantumCircuit, /, **options: Any) -> QuantumCircuit:
"""Transpile a single quantum circuit."""
...

def run(self, circuits: _Circuits, /, **options: Any) -> _Circuits:
"""Transpile a circuit or a list of quantum circuits."""
pass
6 changes: 3 additions & 3 deletions qiskit_algorithms/eigensolvers/eigensolver.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This code is part of a Qiskit project.
#
# (C) Copyright IBM 2022, 2023.
# (C) Copyright IBM 2022, 2025.
#
# 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
Expand All @@ -21,7 +21,7 @@
from qiskit.quantum_info.operators.base_operator import BaseOperator

from ..algorithm_result import AlgorithmResult
from ..list_or_dict import ListOrDict
from ..custom_types import ListOrDict


class Eigensolver(ABC):
Expand All @@ -37,7 +37,7 @@ def compute_eigenvalues(
self,
operator: BaseOperator,
aux_operators: ListOrDict[BaseOperator] | None = None,
) -> "EigensolverResult":
) -> EigensolverResult:
"""
Computes the minimum eigenvalue. The ``operator`` and ``aux_operators`` are supplied here.
While an ``operator`` is required by algorithms, ``aux_operators`` are optional.
Expand Down
14 changes: 7 additions & 7 deletions qiskit_algorithms/eigensolvers/numpy_eigensolver.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This code is part of a Qiskit project.
#
# (C) Copyright IBM 2022, 2024.
# (C) Copyright IBM 2022, 2025.
#
# 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
Expand All @@ -14,8 +14,8 @@

from __future__ import annotations

from collections.abc import Iterable
from typing import Callable, Union, Tuple, Dict, List, Optional, cast
from collections.abc import Callable, Iterable
from typing import cast
import logging
import numpy as np
from scipy import sparse as scisparse
Expand All @@ -26,12 +26,12 @@
from qiskit_algorithms.utils.validation import validate_min
from .eigensolver import Eigensolver, EigensolverResult
from ..exceptions import AlgorithmError
from ..list_or_dict import ListOrDict
from ..custom_types import ListOrDict

logger = logging.getLogger(__name__)

FilterType = Callable[
[Union[List, np.ndarray], float, Optional[ListOrDict[Tuple[float, Dict[str, float]]]]], bool
[list | np.ndarray, float, ListOrDict[tuple[float, dict[str, float]]] | None], bool
]


Expand Down Expand Up @@ -162,9 +162,9 @@ def _solve_sparse(op_matrix: scisparse.csr_matrix, k: int) -> tuple[np.ndarray,
def _solve_dense(op_matrix: np.ndarray) -> tuple[np.ndarray, np.ndarray]:
if op_matrix.all() == op_matrix.conj().T.all():
# Operator is Hermitian
return cast(Tuple[np.ndarray, np.ndarray], np.linalg.eigh(op_matrix))
return cast(tuple[np.ndarray, np.ndarray], np.linalg.eigh(op_matrix))
else:
return cast(Tuple[np.ndarray, np.ndarray], np.linalg.eig(op_matrix))
return cast(tuple[np.ndarray, np.ndarray], np.linalg.eig(op_matrix))

@staticmethod
def _eval_aux_operators(
Expand Down
Loading
Loading