Skip to content

Commit 2fd64d3

Browse files
authored
Modernize type hints (#676)
Modernize type hints with support of ruff. typing module is not necessary in most cases since Python 3.9. https://typing.python.org/en/latest/guides/modernizing.html
1 parent 1cc7725 commit 2fd64d3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+530
-561
lines changed

qiskit_optimization/algorithms/admm_optimizer.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import copy
1818
import logging
1919
import time
20-
from typing import List, Optional, Tuple, cast
20+
from typing import cast
2121

2222
import numpy as np
2323

@@ -182,7 +182,7 @@ def __init__( # pylint: disable=too-many-positional-arguments
182182
self,
183183
x: np.ndarray,
184184
fval: float,
185-
variables: List[Variable],
185+
variables: list[Variable],
186186
state: ADMMState,
187187
status: OptimizationResultStatus,
188188
) -> None:
@@ -215,9 +215,9 @@ class ADMMOptimizer(OptimizationAlgorithm):
215215

216216
def __init__(
217217
self,
218-
qubo_optimizer: Optional[OptimizationAlgorithm] = None,
219-
continuous_optimizer: Optional[OptimizationAlgorithm] = None,
220-
params: Optional[ADMMParameters] = None,
218+
qubo_optimizer: OptimizationAlgorithm | None = None,
219+
continuous_optimizer: OptimizationAlgorithm | None = None,
220+
params: ADMMParameters | None = None,
221221
) -> None:
222222
"""
223223
Args:
@@ -400,7 +400,7 @@ def solve(self, problem: QuadraticProgram) -> ADMMOptimizationResult:
400400
)
401401

402402
@staticmethod
403-
def _get_variable_indices(op: QuadraticProgram, var_type: VarType) -> List[int]:
403+
def _get_variable_indices(op: QuadraticProgram, var_type: VarType) -> list[int]:
404404
"""Returns a list of indices of the variables of the specified type.
405405
406406
Args:
@@ -483,7 +483,7 @@ def _convert_problem_representation(self) -> None:
483483
# equality constraints with binary vars only
484484
self._state.a0, self._state.b0 = self._get_a0_b0()
485485

486-
def _get_step1_indices(self) -> Tuple[List[int], List[int]]:
486+
def _get_step1_indices(self) -> tuple[list[int], list[int]]:
487487
"""
488488
Constructs two arrays of absolute (pointing to the original problem) and relative (pointing
489489
to the list of all binary variables) indices of the variables considered
@@ -550,7 +550,7 @@ def _get_step1_indices(self) -> Tuple[List[int], List[int]]:
550550

551551
return step1_absolute_indices, step1_relative_indices
552552

553-
def _get_q(self, variable_indices: List[int]) -> np.ndarray:
553+
def _get_q(self, variable_indices: list[int]) -> np.ndarray:
554554
"""Constructs a quadratic matrix for the variables with the specified indices
555555
from the quadratic terms in the objective.
556556
@@ -573,7 +573,7 @@ def _get_q(self, variable_indices: List[int]) -> np.ndarray:
573573

574574
return q
575575

576-
def _get_a0_b0(self) -> Tuple[np.ndarray, np.ndarray]:
576+
def _get_a0_b0(self) -> tuple[np.ndarray, np.ndarray]:
577577
"""Constructs a matrix and a vector from the constraints in a form of Ax = b, where
578578
x is a vector of binary variables.
579579
@@ -705,7 +705,7 @@ def _update_x0(self, op1: QuadraticProgram) -> np.ndarray:
705705
x0_all_binaries[self._state.step1_relative_indices] = x0_qubo
706706
return x0_all_binaries
707707

708-
def _update_x1(self, op2: QuadraticProgram) -> Tuple[np.ndarray, np.ndarray]:
708+
def _update_x1(self, op2: QuadraticProgram) -> tuple[np.ndarray, np.ndarray]:
709709
"""Solves the Step2 QuadraticProgram via the continuous optimizer.
710710
711711
Args:
@@ -734,7 +734,7 @@ def _update_y(self, op3: QuadraticProgram) -> np.ndarray:
734734
"""
735735
return np.asarray(self._continuous_optimizer.solve(op3).x)
736736

737-
def _get_best_merit_solution(self) -> Tuple[np.ndarray, np.ndarray, float]:
737+
def _get_best_merit_solution(self) -> tuple[np.ndarray, np.ndarray, float]:
738738
"""The ADMM solution is that for which the merit value is the min
739739
* sol: Iterate with the min merit value
740740
* sol_val: Value of sol, according to the original objective
@@ -825,7 +825,7 @@ def _get_objective_value(self) -> float:
825825
"""
826826
return self._state.op.objective.evaluate(self._get_current_solution())
827827

828-
def _get_solution_residuals(self, iteration: int) -> Tuple[float, float]:
828+
def _get_solution_residuals(self, iteration: int) -> tuple[float, float]:
829829
"""Compute primal and dual residual.
830830
831831
Args:

qiskit_optimization/algorithms/amplitude_amplifiers/amplification_problem.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from __future__ import annotations
1515

1616
from collections.abc import Callable
17-
from typing import Any, List, cast
17+
from typing import Any, cast
1818

1919
from qiskit.circuit import QuantumCircuit
2020
from qiskit.circuit.library import GroverOperator
@@ -168,10 +168,10 @@ def is_good_state(self) -> Callable[[str], bool]:
168168
return self._is_good_state # returns None if no is_good_state arg has been set
169169
elif isinstance(self._is_good_state, list):
170170
if all(isinstance(good_bitstr, str) for good_bitstr in self._is_good_state):
171-
return lambda bitstr: bitstr in cast(List[str], self._is_good_state)
171+
return lambda bitstr: bitstr in cast(list[str], self._is_good_state)
172172
else:
173173
return lambda bitstr: all(
174-
bitstr[good_index] == "1" for good_index in cast(List[int], self._is_good_state)
174+
bitstr[good_index] == "1" for good_index in cast(list[int], self._is_good_state)
175175
)
176176

177177
return lambda bitstr: bitstr in cast(Statevector, self._is_good_state).probabilities_dict()

qiskit_optimization/algorithms/cobyla_optimizer.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@
1111
# that they have been altered from the originals.
1212

1313
"""The COBYLA optimizer wrapped to be used within Qiskit optimization module."""
14+
from __future__ import annotations
1415

15-
from typing import Optional, cast, List, Tuple, Any
16+
from typing import cast, Any
1617

1718
import numpy as np
1819
from scipy.optimize import fmin_cobyla
@@ -48,7 +49,7 @@ def __init__( # pylint: disable=too-many-positional-arguments
4849
rhobeg: float = 1.0,
4950
rhoend: float = 1e-4,
5051
maxfun: int = 1000,
51-
disp: Optional[int] = None,
52+
disp: int | None = None,
5253
catol: float = 2e-4,
5354
trials: int = 1,
5455
clip: float = 100.0,
@@ -145,8 +146,8 @@ def ub_constraint(x, u_b=upperbound, j=i):
145146

146147
# pylint: disable=no-member
147148
# add linear and quadratic constraints
148-
for constraint in cast(List[Constraint], problem.linear_constraints) + cast(
149-
List[Constraint], problem.quadratic_constraints
149+
for constraint in cast(list[Constraint], problem.linear_constraints) + cast(
150+
list[Constraint], problem.quadratic_constraints
150151
):
151152
rhs = constraint.rhs
152153
sense = constraint.sense
@@ -164,7 +165,7 @@ def ub_constraint(x, u_b=upperbound, j=i):
164165
raise QiskitOptimizationError("Unsupported constraint type!")
165166

166167
# actual minimization function to be called by multi_start_solve
167-
def _minimize(x_0: np.ndarray) -> Tuple[np.ndarray, Any]:
168+
def _minimize(x_0: np.ndarray) -> tuple[np.ndarray, Any]:
168169
x = fmin_cobyla(
169170
problem.objective.evaluate,
170171
x_0,

qiskit_optimization/algorithms/cplex_optimizer.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@
1111
# that they have been altered from the originals.
1212

1313
"""The CPLEX optimizer wrapped to be used within Qiskit optimization module."""
14+
from __future__ import annotations
1415

15-
from typing import Any, Dict, Optional
16+
from typing import Any
1617
from warnings import warn
1718

1819
from qiskit_optimization.problems.quadratic_program import QuadraticProgram
@@ -41,9 +42,7 @@ class CplexOptimizer(OptimizationAlgorithm):
4142
>>> if optimizer: result = optimizer.solve(problem)
4243
"""
4344

44-
def __init__(
45-
self, disp: bool = False, cplex_parameters: Optional[Dict[str, Any]] = None
46-
) -> None:
45+
def __init__(self, disp: bool = False, cplex_parameters: dict[str, Any] | None = None) -> None:
4746
"""Initializes the CplexOptimizer.
4847
4948
Args:
@@ -77,12 +76,12 @@ def disp(self, disp: bool):
7776
self._disp = disp
7877

7978
@property
80-
def cplex_parameters(self) -> Optional[Dict[str, Any]]:
79+
def cplex_parameters(self) -> dict[str, Any] | None:
8180
"""Returns parameters for CPLEX"""
8281
return self._cplex_parameters
8382

8483
@cplex_parameters.setter
85-
def cplex_parameters(self, parameters: Optional[Dict[str, Any]]):
84+
def cplex_parameters(self, parameters: dict[str, Any] | None):
8685
"""Set parameters for CPLEX
8786
Args:
8887
parameters: The parameters for CPLEX

qiskit_optimization/algorithms/goemans_williamson_optimizer.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
Implementation of the Goemans-Williamson algorithm as an optimizer.
1515
Requires CVXPY to run.
1616
"""
17+
from __future__ import annotations
1718
import logging
18-
from typing import Optional, List, Tuple, Union, cast
19+
from typing import cast
1920

2021
import numpy as np
2122

@@ -41,12 +42,12 @@ class GoemansWilliamsonOptimizationResult(OptimizationResult):
4142

4243
def __init__( # pylint: disable=too-many-positional-arguments
4344
self,
44-
x: Optional[Union[List[float], np.ndarray]],
45+
x: list[float] | np.ndarray | None,
4546
fval: float,
46-
variables: List[Variable],
47+
variables: list[Variable],
4748
status: OptimizationResultStatus,
48-
samples: Optional[List[SolutionSample]],
49-
sdp_solution: Optional[np.ndarray] = None,
49+
samples: list[SolutionSample] | None,
50+
sdp_solution: np.ndarray | None = None,
5051
) -> None:
5152
"""
5253
Args:
@@ -61,7 +62,7 @@ def __init__( # pylint: disable=too-many-positional-arguments
6162
self._sdp_solution = sdp_solution
6263

6364
@property
64-
def sdp_solution(self) -> Optional[np.ndarray]:
65+
def sdp_solution(self) -> np.ndarray | None:
6566
"""
6667
Returns:
6768
Returns an SDP solution of the problem.
@@ -188,8 +189,8 @@ def solve(self, problem: QuadraticProgram) -> OptimizationResult:
188189
)
189190

190191
def _get_unique_cuts(
191-
self, solutions: List[Tuple[np.ndarray, float]]
192-
) -> List[Tuple[np.ndarray, float]]:
192+
self, solutions: list[tuple[np.ndarray, float]]
193+
) -> list[tuple[np.ndarray, float]]:
193194
"""
194195
Returns:
195196
Unique Goemans-Williamson cuts.

qiskit_optimization/algorithms/grover_optimizer.py

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@
1111
# that they have been altered from the originals.
1212

1313
"""GroverOptimizer module"""
14+
from __future__ import annotations
1415

1516
import logging
1617
import math
1718
import warnings
1819
from copy import deepcopy
19-
from typing import Dict, List, Optional, Union, cast
20+
from typing import cast
2021

2122
import numpy as np
2223
from qiskit import QuantumCircuit, QuantumRegister
@@ -46,12 +47,10 @@ def __init__( # pylint: disable=too-many-positional-arguments
4647
self,
4748
num_value_qubits: int,
4849
num_iterations: int = 3,
49-
converters: Optional[
50-
Union[QuadraticProgramConverter, List[QuadraticProgramConverter]]
51-
] = None,
52-
penalty: Optional[float] = None,
53-
sampler: Optional[Union[BaseSamplerV1, BaseSamplerV2]] = None,
54-
pass_manager: Optional[BasePassManager] = None,
50+
converters: QuadraticProgramConverter | list[QuadraticProgramConverter] | None = None,
51+
penalty: float | None = None,
52+
sampler: BaseSamplerV1 | BaseSamplerV2 | None = None,
53+
pass_manager: BasePassManager | None = None,
5554
) -> None:
5655
"""
5756
Args:
@@ -303,7 +302,7 @@ def _measure(self, circuit: QuantumCircuit) -> str:
303302
# Pick a random outcome.
304303
return algorithm_globals.random.choice(list(probs.keys()), 1, p=list(probs.values()))[0]
305304

306-
def _get_prob_dist(self, qc: QuantumCircuit) -> Dict[str, float]:
305+
def _get_prob_dist(self, qc: QuantumCircuit) -> dict[str, float]:
307306
"""Gets probabilities from a given backend."""
308307
if self._pass_manager:
309308
qc = self._pass_manager.run(qc)
@@ -345,17 +344,17 @@ class GroverOptimizationResult(OptimizationResult):
345344

346345
def __init__( # pylint: disable=too-many-positional-arguments
347346
self,
348-
x: Union[List[float], np.ndarray],
347+
x: list[float] | np.ndarray,
349348
fval: float,
350-
variables: List[Variable],
351-
operation_counts: Dict[int, Dict[str, int]],
349+
variables: list[Variable],
350+
operation_counts: dict[int, dict[str, int]],
352351
n_input_qubits: int,
353352
n_output_qubits: int,
354353
intermediate_fval: float,
355354
threshold: float,
356355
status: OptimizationResultStatus,
357-
samples: Optional[List[SolutionSample]] = None,
358-
raw_samples: Optional[List[SolutionSample]] = None,
356+
samples: list[SolutionSample] | None = None,
357+
raw_samples: list[SolutionSample] | None = None,
359358
) -> None:
360359
"""
361360
Constructs a result object with the specific Grover properties.
@@ -392,7 +391,7 @@ def __init__( # pylint: disable=too-many-positional-arguments
392391
self._threshold = threshold
393392

394393
@property
395-
def operation_counts(self) -> Dict[int, Dict[str, int]]:
394+
def operation_counts(self) -> dict[int, dict[str, int]]:
396395
"""Get the operation counts.
397396
398397
Returns:
@@ -437,7 +436,7 @@ def threshold(self) -> float:
437436
return self._threshold
438437

439438
@property
440-
def raw_samples(self) -> Optional[List[SolutionSample]]:
439+
def raw_samples(self) -> list[SolutionSample] | None:
441440
"""Returns the list of raw solution samples of ``GroverOptimizer``.
442441
443442
Returns:

qiskit_optimization/algorithms/minimum_eigen_optimizer.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
# that they have been altered from the originals.
1212

1313
"""A wrapper for minimum eigen solvers to be used within the optimization module."""
14-
from typing import List, Optional, Union, cast
14+
from __future__ import annotations
15+
from typing import Union, cast
1516

1617
import numpy as np
1718
from qiskit.quantum_info import SparsePauliOp
@@ -41,13 +42,13 @@ class MinimumEigenOptimizationResult(OptimizationResult):
4142

4243
def __init__( # pylint: disable=too-many-positional-arguments
4344
self,
44-
x: Optional[Union[List[float], np.ndarray]],
45-
fval: Optional[float],
46-
variables: List[Variable],
45+
x: list[float] | np.ndarray | None,
46+
fval: float | None,
47+
variables: list[Variable],
4748
status: OptimizationResultStatus,
48-
samples: Optional[List[SolutionSample]] = None,
49-
min_eigen_solver_result: Optional[MinimumEigensolverResult] = None,
50-
raw_samples: Optional[List[SolutionSample]] = None,
49+
samples: list[SolutionSample] | None = None,
50+
min_eigen_solver_result: MinimumEigensolverResult | None = None,
51+
raw_samples: list[SolutionSample] | None = None,
5152
) -> None:
5253
"""
5354
Args:
@@ -79,7 +80,7 @@ def min_eigen_solver_result(self) -> MinimumEigensolverResult:
7980
return self._min_eigen_solver_result
8081

8182
@property
82-
def raw_samples(self) -> Optional[List[SolutionSample]]:
83+
def raw_samples(self) -> list[SolutionSample] | None:
8384
"""Returns the list of raw solution samples of
8485
``SamplingMinimumEigensolver`` or ``NumPyMinimumEigensolver``.
8586
@@ -123,10 +124,8 @@ class MinimumEigenOptimizer(OptimizationAlgorithm):
123124
def __init__(
124125
self,
125126
min_eigen_solver: MinimumEigensolver,
126-
penalty: Optional[float] = None,
127-
converters: Optional[
128-
Union[QuadraticProgramConverter, List[QuadraticProgramConverter]]
129-
] = None,
127+
penalty: float | None = None,
128+
converters: QuadraticProgramConverter | list[QuadraticProgramConverter] | None = None,
130129
) -> None:
131130
"""
132131
This initializer takes the minimum eigen solver to be used to approximate the ground state
@@ -212,7 +211,7 @@ def _solve_internal(
212211
original_problem: QuadraticProgram,
213212
):
214213
# only try to solve non-empty Ising Hamiltonians
215-
eigen_result: Optional[MinimumEigensolverResult] = None
214+
eigen_result: MinimumEigensolverResult | None = None
216215
if operator.num_qubits > 0:
217216
# approximate ground state of operator using min eigen solver
218217
eigen_result = self._min_eigen_solver.compute_minimum_eigenvalue(operator)

0 commit comments

Comments
 (0)