Skip to content

Commit 7bca3d1

Browse files
tanujkhattarMichaelBroughton
authored andcommitted
Move optimizers/decompositions.py to transformers/analytical_decompositions/single_qubit_decompositions.py (quantumlib#4799)
Moves the following file from `cirq/optimizers/` to `cirq/transformers/analytical_decompositions/` using `deprecated_submodule`: - decompositions.py --> single_qubit_decompositions.py Part of quantumlib#4722
1 parent fadd14f commit 7bca3d1

17 files changed

+71
-42
lines changed

cirq-core/cirq/__init__.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -334,17 +334,11 @@
334334
EjectPhasedPaulis,
335335
EjectZ,
336336
ExpandComposite,
337-
is_negligible_turn,
338337
merge_single_qubit_gates_into_phased_x_z,
339338
merge_single_qubit_gates_into_phxz,
340339
MergeInteractions,
341340
MergeInteractionsToSqrtIswap,
342341
MergeSingleQubitGates,
343-
single_qubit_matrix_to_gates,
344-
single_qubit_matrix_to_pauli_rotations,
345-
single_qubit_matrix_to_phased_x_z,
346-
single_qubit_matrix_to_phxz,
347-
single_qubit_op_to_framed_phase_form,
348342
stratified_circuit,
349343
SynchronizeTerminalMeasurements,
350344
two_qubit_matrix_to_operations,
@@ -359,13 +353,19 @@
359353
decompose_cphase_into_two_fsim,
360354
decompose_multi_controlled_x,
361355
decompose_multi_controlled_rotation,
356+
is_negligible_turn,
362357
map_moments,
363358
map_operations,
364359
map_operations_and_unroll,
365360
merge_moments,
366361
merge_operations,
367362
prepare_two_qubit_state_using_cz,
368363
prepare_two_qubit_state_using_sqrt_iswap,
364+
single_qubit_matrix_to_gates,
365+
single_qubit_matrix_to_pauli_rotations,
366+
single_qubit_matrix_to_phased_x_z,
367+
single_qubit_matrix_to_phxz,
368+
single_qubit_op_to_framed_phase_form,
369369
unroll_circuit_op,
370370
unroll_circuit_op_greedy_earliest,
371371
unroll_circuit_op_greedy_frontier,

cirq-core/cirq/contrib/paulistring/convert_to_clifford_gates.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
import numpy as np
1818

19-
from cirq import ops, protocols, optimizers, linalg
19+
from cirq import ops, protocols, transformers, linalg
2020
from cirq.circuits.circuit import Circuit
2121
from cirq.circuits.optimization_pass import (
2222
PointOptimizationSummary,
@@ -67,7 +67,7 @@ def _rotation_to_clifford_gate(
6767
return ops.SingleQubitCliffordGate.I
6868

6969
def _matrix_to_clifford_op(self, mat: np.ndarray, qubit: 'cirq.Qid') -> Optional[ops.Operation]:
70-
rotations = optimizers.single_qubit_matrix_to_pauli_rotations(mat, self.atol)
70+
rotations = transformers.single_qubit_matrix_to_pauli_rotations(mat, self.atol)
7171
clifford_gate = ops.SingleQubitCliffordGate.I
7272
for pauli, half_turns in rotations:
7373
if linalg.all_near_zero_mod(half_turns, 0.5):

cirq-core/cirq/contrib/paulistring/convert_to_pauli_string_phasors.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
import numpy as np
1818

19-
from cirq import ops, optimizers, protocols, linalg
19+
from cirq import ops, protocols, linalg, transformers
2020
from cirq.circuits.circuit import Circuit
2121
from cirq.circuits.optimization_pass import (
2222
PointOptimizationSummary,
@@ -56,7 +56,7 @@ def __init__(
5656
self.atol = atol
5757

5858
def _matrix_to_pauli_string_phasors(self, mat: np.ndarray, qubit: 'cirq.Qid') -> ops.OP_TREE:
59-
rotations = optimizers.single_qubit_matrix_to_pauli_rotations(mat, self.atol)
59+
rotations = transformers.single_qubit_matrix_to_pauli_rotations(mat, self.atol)
6060
out_ops: List[ops.Operation] = []
6161
for pauli, half_turns in rotations:
6262
if self.keep_clifford and linalg.all_near_zero_mod(half_turns, 0.5):

cirq-core/cirq/ion/convert_to_ion_gates.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
import numpy as np
1616

17-
from cirq import ops, protocols, optimizers, circuits
17+
from cirq import ops, protocols, optimizers, circuits, transformers
1818
from cirq.ion import ms, two_qubit_matrix_to_ion_operations, ion_device
1919

2020

@@ -66,7 +66,7 @@ def convert_one(self, op: ops.Operation) -> ops.OP_TREE:
6666
# Known matrix
6767
mat = protocols.unitary(op, None) if len(op.qubits) <= 2 else None
6868
if mat is not None and len(op.qubits) == 1:
69-
gates = optimizers.single_qubit_matrix_to_phased_x_z(mat)
69+
gates = transformers.single_qubit_matrix_to_phased_x_z(mat)
7070
return [g.on(op.qubits[0]) for g in gates]
7171
if mat is not None and len(op.qubits) == 2:
7272
return two_qubit_matrix_to_ion_operations(op.qubits[0], op.qubits[1], mat)

cirq-core/cirq/ion/ion_decomposition.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
import numpy as np
2525

26-
from cirq import ops, linalg, protocols, optimizers, circuits
26+
from cirq import ops, linalg, protocols, optimizers, circuits, transformers
2727
from cirq.ion import ms
2828

2929
if TYPE_CHECKING:
@@ -83,7 +83,7 @@ def _kak_decomposition_to_operations(
8383

8484

8585
def _do_single_on(u: np.ndarray, q: 'cirq.Qid', atol: float = 1e-8):
86-
for gate in optimizers.single_qubit_matrix_to_gates(u, atol):
86+
for gate in transformers.single_qubit_matrix_to_gates(u, atol):
8787
yield gate(q)
8888

8989

cirq-core/cirq/neutral_atoms/convert_to_neutral_atom_gates.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
PointOptimizer,
2020
)
2121
from cirq.neutral_atoms import neutral_atom_devices
22-
from cirq import optimizers
22+
from cirq import optimizers, transformers
2323

2424
if TYPE_CHECKING:
2525
import cirq
@@ -57,7 +57,7 @@ def _convert_one(self, op: ops.Operation) -> ops.OP_TREE:
5757
# Known matrix?
5858
mat = protocols.unitary(op, None) if len(op.qubits) <= 2 else None
5959
if mat is not None and len(op.qubits) == 1:
60-
gates = optimizers.single_qubit_matrix_to_phased_x_z(mat)
60+
gates = transformers.single_qubit_matrix_to_phased_x_z(mat)
6161
return [g.on(op.qubits[0]) for g in gates]
6262
if mat is not None and len(op.qubits) == 2:
6363
return optimizers.two_qubit_matrix_to_operations(

cirq-core/cirq/optimizers/__init__.py

+8-9
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,6 @@
6060
MergeSingleQubitGates,
6161
)
6262

63-
from cirq.optimizers.decompositions import (
64-
is_negligible_turn,
65-
single_qubit_matrix_to_gates,
66-
single_qubit_matrix_to_pauli_rotations,
67-
single_qubit_matrix_to_phased_x_z,
68-
single_qubit_matrix_to_phxz,
69-
single_qubit_op_to_framed_phase_form,
70-
)
71-
7263
from cirq.optimizers.stratify import (
7364
stratified_circuit,
7465
)
@@ -119,3 +110,11 @@
119110
deadline="v0.16",
120111
create_attribute=True,
121112
)
113+
114+
_compat.deprecated_submodule(
115+
new_module_name="cirq.transformers.analytical_decompositions.single_qubit_decompositions",
116+
old_parent="cirq.optimizers",
117+
old_child="decompositions",
118+
deadline="v0.16",
119+
create_attribute=True,
120+
)

cirq-core/cirq/optimizers/eject_phased_paulis.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import sympy
2020

2121
from cirq import circuits, ops, value, protocols
22-
from cirq.optimizers import decompositions
22+
from cirq.transformers.analytical_decompositions import single_qubit_decompositions
2323

2424
if TYPE_CHECKING:
2525
import cirq
@@ -69,7 +69,9 @@ def optimize_circuit(self, circuit: circuits.Circuit):
6969
# Collect, phase, and merge Ws.
7070
w = _try_get_known_phased_pauli(op, no_symbolic=not self.eject_parameterized)
7171
if w is not None:
72-
if decompositions.is_negligible_turn((w[0] - 1) / 2, self.tolerance):
72+
if single_qubit_decompositions.is_negligible_turn(
73+
(w[0] - 1) / 2, self.tolerance
74+
):
7375
_potential_cross_whole_w(moment_index, op, self.tolerance, state)
7476
else:
7577
_potential_cross_partial_w(moment_index, op, state)
@@ -180,7 +182,7 @@ def _potential_cross_whole_w(
180182
# Cancel the gate.
181183
del state.held_w_phases[q]
182184
t = 2 * (b - a)
183-
if not decompositions.is_negligible_turn(t / 2, tolerance):
185+
if not single_qubit_decompositions.is_negligible_turn(t / 2, tolerance):
184186
leftover_phase = ops.Z(q) ** t
185187
state.inline_intos.append((moment_index, leftover_phase))
186188

cirq-core/cirq/optimizers/eject_z.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import sympy
2121

2222
from cirq import circuits, ops, protocols
23-
from cirq.optimizers import decompositions
23+
from cirq.transformers.analytical_decompositions import single_qubit_decompositions
2424

2525

2626
def _is_integer(n):
@@ -74,7 +74,7 @@ def dump_tracked_phase(qubits: Iterable[ops.Qid], index: int) -> None:
7474
for q in qubits:
7575
p = qubit_phase[q]
7676
qubit_phase[q] = 0
77-
if decompositions.is_negligible_turn(p, self.tolerance):
77+
if single_qubit_decompositions.is_negligible_turn(p, self.tolerance):
7878
continue
7979
dumped = False
8080
moment_index = circuit.prev_moment_operating_on([q], index)
@@ -111,7 +111,8 @@ def dump_tracked_phase(qubits: Iterable[ops.Qid], index: int) -> None:
111111
# If there's no tracked phase, we can move on.
112112
phases = [qubit_phase[q] for q in op.qubits]
113113
if not isinstance(op.gate, ops.PhasedXZGate) and all(
114-
decompositions.is_negligible_turn(p, self.tolerance) for p in phases
114+
single_qubit_decompositions.is_negligible_turn(p, self.tolerance)
115+
for p in phases
115116
):
116117
continue
117118

@@ -123,7 +124,7 @@ def dump_tracked_phase(qubits: Iterable[ops.Qid], index: int) -> None:
123124
# Try to move the tracked phasing over the operation.
124125
phased_op = op
125126
for i, p in enumerate(phases):
126-
if not decompositions.is_negligible_turn(p, self.tolerance):
127+
if not single_qubit_decompositions.is_negligible_turn(p, self.tolerance):
127128
phased_op = protocols.phase_by(phased_op, -p, i, default=None)
128129
if phased_op is not None:
129130
gate = phased_op.gate

cirq-core/cirq/optimizers/merge_single_qubit_gates.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import numpy as np
2020

2121
from cirq import ops, linalg, protocols, circuits
22-
from cirq.optimizers import decompositions
22+
from cirq.transformers.analytical_decompositions import single_qubit_decompositions
2323

2424
if TYPE_CHECKING:
2525
import cirq
@@ -115,7 +115,7 @@ def merge_single_qubit_gates_into_phased_x_z(circuit: circuits.Circuit, atol: fl
115115
"""
116116

117117
def synth(qubit: 'cirq.Qid', matrix: np.ndarray) -> List[ops.Operation]:
118-
out_gates = decompositions.single_qubit_matrix_to_phased_x_z(matrix, atol)
118+
out_gates = single_qubit_decompositions.single_qubit_matrix_to_phased_x_z(matrix, atol)
119119
return [gate(qubit) for gate in out_gates]
120120

121121
MergeSingleQubitGates(synthesizer=synth).optimize_circuit(circuit)
@@ -137,7 +137,7 @@ def merge_single_qubit_gates_into_phxz(
137137
"""
138138

139139
def synth(qubit: 'cirq.Qid', matrix: np.ndarray) -> List[ops.Operation]:
140-
gate = decompositions.single_qubit_matrix_to_phxz(matrix, atol)
140+
gate = single_qubit_decompositions.single_qubit_matrix_to_phxz(matrix, atol)
141141
return [gate(qubit)] if gate else []
142142

143143
MergeSingleQubitGates(synthesizer=synth).optimize_circuit(circuit)

cirq-core/cirq/optimizers/two_qubit_decompositions.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
from cirq.linalg.decompositions import num_cnots_required, extract_right_diag
2323

2424
from cirq import ops, linalg, protocols, circuits
25+
from cirq.transformers.analytical_decompositions import single_qubit_decompositions
2526
from cirq.optimizers import (
26-
decompositions,
2727
eject_z,
2828
eject_phased_paulis,
2929
merge_single_qubit_gates,
@@ -236,7 +236,7 @@ def _parity_interaction(
236236

237237

238238
def _do_single_on(u: np.ndarray, q: 'cirq.Qid', atol: float = 1e-8):
239-
for gate in decompositions.single_qubit_matrix_to_gates(u, atol):
239+
for gate in single_qubit_decompositions.single_qubit_matrix_to_gates(u, atol):
240240
yield gate(q)
241241

242242

cirq-core/cirq/optimizers/two_qubit_to_sqrt_iswap.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import numpy as np
1313

1414
from cirq import ops, linalg, protocols
15-
from cirq.optimizers import decompositions
15+
from cirq.transformers.analytical_decompositions import single_qubit_decompositions
1616

1717
if TYPE_CHECKING:
1818
import cirq
@@ -144,7 +144,7 @@ def append(matrix0, matrix1, final_layer=False):
144144
nonlocal prev_commute
145145
# Commute previous Z(q0)**a, Z(q1)**a through earlier sqrt-iSWAP
146146
rots1 = list(
147-
decompositions.single_qubit_matrix_to_pauli_rotations(
147+
single_qubit_decompositions.single_qubit_matrix_to_pauli_rotations(
148148
np.dot(matrix1, prev_commute), atol=atol
149149
)
150150
)
@@ -163,7 +163,7 @@ def append(matrix0, matrix1, final_layer=False):
163163
new_commute = new_commute @ p_unitary
164164
matrix0 = p_unitary.T.conj() @ matrix0
165165
rots0 = list(
166-
decompositions.single_qubit_matrix_to_pauli_rotations(
166+
single_qubit_decompositions.single_qubit_matrix_to_pauli_rotations(
167167
np.dot(matrix0, prev_commute), atol=atol
168168
)
169169
)

cirq-core/cirq/transformers/__init__.py

+6
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,14 @@
2020
decompose_clifford_tableau_to_operations,
2121
decompose_multi_controlled_x,
2222
decompose_multi_controlled_rotation,
23+
is_negligible_turn,
2324
prepare_two_qubit_state_using_cz,
2425
prepare_two_qubit_state_using_sqrt_iswap,
26+
single_qubit_matrix_to_gates,
27+
single_qubit_matrix_to_pauli_rotations,
28+
single_qubit_matrix_to_phased_x_z,
29+
single_qubit_matrix_to_phxz,
30+
single_qubit_op_to_framed_phase_form,
2531
)
2632

2733
from cirq.transformers.transformer_primitives import (

cirq-core/cirq/transformers/analytical_decompositions/__init__.py

+9
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,15 @@
2828
decompose_cphase_into_two_fsim,
2929
)
3030

31+
from cirq.transformers.analytical_decompositions.single_qubit_decompositions import (
32+
is_negligible_turn,
33+
single_qubit_matrix_to_gates,
34+
single_qubit_matrix_to_pauli_rotations,
35+
single_qubit_matrix_to_phased_x_z,
36+
single_qubit_matrix_to_phxz,
37+
single_qubit_op_to_framed_phase_form,
38+
)
39+
3140
from cirq.transformers.analytical_decompositions.two_qubit_state_preparation import (
3241
prepare_two_qubit_state_using_cz,
3342
prepare_two_qubit_state_using_sqrt_iswap,

cirq-core/cirq/optimizers/decompositions_test.py renamed to cirq-core/cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py

+10
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,16 @@
2121

2222
import cirq
2323

24+
ALLOW_DEPRECATION_IN_TEST = 'ALLOW_DEPRECATION_IN_TEST'
25+
26+
27+
def test_deprecated_submodule():
28+
with cirq.testing.assert_deprecated(
29+
"Use cirq.transformers.analytical_decompositions.single_qubit_decompositions instead",
30+
deadline="v0.16",
31+
):
32+
_ = cirq.optimizers.decompositions.single_qubit_matrix_to_phxz
33+
2434

2535
def assert_gates_implement_unitary(
2636
gates: Sequence[cirq.SingleQubitGate], intended_effect: np.ndarray, atol: float

cirq-core/cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,17 @@
1818
import numpy as np
1919

2020
from cirq import ops, qis, circuits
21-
from cirq.optimizers import decompositions
21+
from cirq.transformers.analytical_decompositions import single_qubit_decompositions
2222

2323
if TYPE_CHECKING:
2424
import cirq
2525

2626

2727
def _1q_matrices_to_ops(g0, g1, q0, q1, include_identity=False):
2828
ret = []
29-
for g, q in zip(map(decompositions.single_qubit_matrix_to_phxz, [g0, g1]), [q0, q1]):
29+
for g, q in zip(
30+
map(single_qubit_decompositions.single_qubit_matrix_to_phxz, [g0, g1]), [q0, q1]
31+
):
3032
if g is not None:
3133
ret.append(g.on(q))
3234
elif include_identity:

0 commit comments

Comments
 (0)