diff --git a/quick/circuit/circuit.py b/quick/circuit/circuit.py index b0de8e0..80ac95e 100644 --- a/quick/circuit/circuit.py +++ b/quick/circuit/circuit.py @@ -536,7 +536,7 @@ def _gate_mapping( self, gate: GATES, target_indices: int | Sequence[int], - control_indices: int | Sequence[int] = [], + control_indices: int | Sequence[int] | None = None, angles: Sequence[float] = (0, 0, 0) ) -> None: """ Apply a gate to the circuit. @@ -551,7 +551,7 @@ def _gate_mapping( The gate to apply to the circuit. `target_indices` : int | Sequence[int] The index of the target qubit(s). - `control_indices` : int | Sequence[int], optional, default=[] + `control_indices` : int | Sequence[int], optional, default=None The index of the control qubit(s). `angles` : Sequence[float], optional, default=(0, 0, 0) The rotation angles in radians. diff --git a/quick/circuit/cirqcircuit.py b/quick/circuit/cirqcircuit.py index ec49b23..69123ff 100644 --- a/quick/circuit/cirqcircuit.py +++ b/quick/circuit/cirqcircuit.py @@ -159,12 +159,16 @@ def _gate_mapping( self, gate: GATES, target_indices: int | Sequence[int], - control_indices: int | Sequence[int] = [], + control_indices: int | Sequence[int] | None = None, angles: Sequence[float] = (0, 0, 0) ) -> None: targets = [target_indices] if isinstance(target_indices, int) else list(target_indices) - controls = [control_indices] if isinstance(control_indices, int) else list(control_indices) + + if control_indices is None: + controls: list[int] = [] + else: + controls = [control_indices] if isinstance(control_indices, int) else list(control_indices) # Given Cirq uses MSB convention, we will explicitly # convert the qubit indices to LSB convention diff --git a/quick/circuit/pennylanecircuit.py b/quick/circuit/pennylanecircuit.py index fc75bee..c5f79cf 100644 --- a/quick/circuit/pennylanecircuit.py +++ b/quick/circuit/pennylanecircuit.py @@ -128,12 +128,16 @@ def _gate_mapping( self, gate: GATES, target_indices: int | Sequence[int], - control_indices: int | Sequence[int] = [], + control_indices: int | Sequence[int] | None = None, angles: Sequence[float] = (0, 0, 0) ) -> None: targets = [target_indices] if isinstance(target_indices, int) else list(target_indices) - controls = [control_indices] if isinstance(control_indices, int) else list(control_indices) + + if control_indices is None: + controls: list[int] = [] + else: + controls = [control_indices] if isinstance(control_indices, int) else list(control_indices) # Given Pennylane uses MSB convention, we will explicitly # convert the qubit indices to LSB convention diff --git a/quick/circuit/qiskitcircuit.py b/quick/circuit/qiskitcircuit.py index d795454..c091b37 100644 --- a/quick/circuit/qiskitcircuit.py +++ b/quick/circuit/qiskitcircuit.py @@ -137,23 +137,27 @@ def _gate_mapping( self, gate: GATES, target_indices: int | Sequence[int], - control_indices: int | Sequence[int] = [], + control_indices: int | Sequence[int] | None = None, angles: Sequence[float] = (0, 0, 0) ) -> None: - target_indices = [target_indices] if isinstance(target_indices, int) else target_indices - control_indices = [control_indices] if isinstance(control_indices, int) else control_indices + targets = [target_indices] if isinstance(target_indices, int) else list(target_indices) + + if control_indices is None: + controls: list[int] = [] + else: + controls = [control_indices] if isinstance(control_indices, int) else list(control_indices) # Lazily extract the value of the gate from the mapping to avoid # creating all the gates at once, and to maintain the abstraction gate_operation = self.gate_mapping[gate](angles) - if control_indices: - for target_index in target_indices: - self.circuit.append(gate_operation.control(len(control_indices)), [*control_indices[:], target_index]) + if controls: + for target_index in targets: + self.circuit.append(gate_operation.control(len(controls)), [*controls[:], target_index]) return - for target_index in target_indices: + for target_index in targets: self.circuit.append(gate_operation, [target_index]) def GlobalPhase( diff --git a/quick/circuit/quimbcircuit.py b/quick/circuit/quimbcircuit.py index f1119b1..f9b448d 100644 --- a/quick/circuit/quimbcircuit.py +++ b/quick/circuit/quimbcircuit.py @@ -129,12 +129,16 @@ def _gate_mapping( self, gate: GATES, target_indices: int | Sequence[int], - control_indices: int | Sequence[int] = [], + control_indices: int | Sequence[int] | None = None, angles: Sequence[float] = (0, 0, 0) ) -> None: targets = [target_indices] if isinstance(target_indices, int) else list(target_indices) - controls = [control_indices] if isinstance(control_indices, int) else list(control_indices) + + if control_indices is None: + controls: list[int] = [] + else: + controls = [control_indices] if isinstance(control_indices, int) else list(control_indices) # Given Quimb uses MSB convention, we will explicitly # convert the qubit indices to LSB convention diff --git a/quick/circuit/tketcircuit.py b/quick/circuit/tketcircuit.py index 111948f..be61183 100644 --- a/quick/circuit/tketcircuit.py +++ b/quick/circuit/tketcircuit.py @@ -130,12 +130,16 @@ def _gate_mapping( self, gate: GATES, target_indices: int | Sequence[int], - control_indices: int | Sequence[int] = [], + control_indices: int | Sequence[int] | None = None, angles: Sequence[float] = (0, 0, 0) ) -> None: targets = [target_indices] if isinstance(target_indices, int) else list(target_indices) - controls = [control_indices] if isinstance(control_indices, int) else list(control_indices) + + if control_indices is None: + controls: list[int] = [] + else: + controls = [control_indices] if isinstance(control_indices, int) else list(control_indices) # Given TKET uses MSB convention, we will explicitly # convert the qubit indices to LSB convention diff --git a/tests/circuit/test_ansatz.py b/tests/circuit/test_ansatz.py index db960b9..c2d397e 100644 --- a/tests/circuit/test_ansatz.py +++ b/tests/circuit/test_ansatz.py @@ -18,7 +18,6 @@ import pytest from quick.circuit import Ansatz, Circuit -from typing import Type from tests.circuit import CIRCUIT_FRAMEWORKS diff --git a/tests/circuit/test_circuit_base.py b/tests/circuit/test_circuit_base.py index 298b2ba..c3634c8 100644 --- a/tests/circuit/test_circuit_base.py +++ b/tests/circuit/test_circuit_base.py @@ -19,7 +19,6 @@ import numpy as np from numpy.testing import assert_almost_equal import pytest -from typing import Type from quick.circuit import Circuit from quick.random import generate_random_state, generate_random_unitary @@ -1313,7 +1312,7 @@ def test_eq( @pytest.mark.parametrize("circuit_framework", CIRCUIT_FRAMEWORKS) def test_eq_fail( self, - circuit_framework: Type[Circuit] + circuit_framework: type[Circuit] ) -> None: """ Test the `__eq__` dunder method failure. @@ -1360,7 +1359,7 @@ def test_eq_fail( @pytest.mark.parametrize("circuit_framework", CIRCUIT_FRAMEWORKS) def test_eq_invalid_type( self, - circuit_framework: Type[Circuit] + circuit_framework: type[Circuit] ) -> None: """ Test the `__eq__` dunder method failure with invalid type. @@ -1377,7 +1376,7 @@ def test_eq_invalid_type( @pytest.mark.parametrize("circuit_framework", CIRCUIT_FRAMEWORKS) def test_is_equivalent( self, - circuit_framework: Type[Circuit] + circuit_framework: type[Circuit] ) -> None: """ Test the `is_equivalent` method. diff --git a/tests/circuit/test_circuit_decompose.py b/tests/circuit/test_circuit_decompose.py index 9ac4a88..305208b 100644 --- a/tests/circuit/test_circuit_decompose.py +++ b/tests/circuit/test_circuit_decompose.py @@ -18,7 +18,6 @@ import numpy as np import pytest -from typing import Type from quick.circuit import Circuit diff --git a/tests/circuit/test_circuit_to_controlled.py b/tests/circuit/test_circuit_to_controlled.py index f2c9a96..b65553e 100644 --- a/tests/circuit/test_circuit_to_controlled.py +++ b/tests/circuit/test_circuit_to_controlled.py @@ -17,7 +17,6 @@ __all__ = ["TestControlled"] import pytest -from typing import Type from quick.circuit import Circuit diff --git a/tests/circuit/test_control_state.py b/tests/circuit/test_control_state.py index 2e121e3..3e2cbe2 100644 --- a/tests/circuit/test_control_state.py +++ b/tests/circuit/test_control_state.py @@ -18,7 +18,6 @@ import numpy as np import pytest -from typing import Type from quick.circuit import Circuit from quick.circuit.gate_matrix import RX diff --git a/tests/circuit/test_qft_circuit.py b/tests/circuit/test_qft_circuit.py index 5cff27b..4c4325c 100644 --- a/tests/circuit/test_qft_circuit.py +++ b/tests/circuit/test_qft_circuit.py @@ -20,7 +20,6 @@ from numpy.testing import assert_almost_equal from numpy.typing import NDArray import pytest -from typing import Type from quick.circuit import Circuit, CirqCircuit, PennylaneCircuit, QiskitCircuit, TKETCircuit diff --git a/tests/synthesis/unitarypreparation/test_diffusion.py b/tests/synthesis/unitarypreparation/test_diffusion.py index b1d698a..5f51f62 100644 --- a/tests/synthesis/unitarypreparation/test_diffusion.py +++ b/tests/synthesis/unitarypreparation/test_diffusion.py @@ -19,7 +19,6 @@ from numpy.testing import assert_almost_equal import pytest import random -from typing import Type from quick.circuit import Circuit, QiskitCircuit from quick.primitives import Operator