0
# Transformers and Circuit Optimization
1
2
The transformers module provides tools for transforming and optimizing quantum circuits, including analytical decompositions, target gateset compilation, and circuit structure manipulation.
3
4
## Analytical Decompositions
5
6
### Single-Qubit Decompositions
7
8
```python { .api }
9
def single_qubit_matrix_to_gates(matrix: np.ndarray, tolerance: float = 1e-10) -> List['cirq.Operation']:
10
"""Decompose single-qubit unitary matrix into elementary gates.
11
12
Args:
13
matrix: 2x2 unitary matrix to decompose
14
tolerance: Numerical tolerance for decomposition
15
16
Returns:
17
List of single-qubit operations implementing the matrix
18
"""
19
20
def single_qubit_matrix_to_pauli_rotations(matrix: np.ndarray, tolerance: float = 1e-10) -> List['cirq.Operation']:
21
"""Decompose single-qubit matrix into Pauli rotations."""
22
23
def single_qubit_matrix_to_phased_x_z(matrix: np.ndarray, tolerance: float = 1e-10) -> List['cirq.Operation']:
24
"""Decompose into phased X and Z rotations."""
25
26
def single_qubit_matrix_to_phxz(matrix: np.ndarray, tolerance: float = 1e-10) -> 'cirq.PhasedXZGate':
27
"""Decompose into single PhasedXZ gate."""
28
29
def single_qubit_op_to_framed_phase_form(op: 'cirq.Operation') -> List['cirq.Operation']:
30
"""Convert single-qubit operation to framed phase form."""
31
```
32
33
### Two-Qubit Decompositions
34
35
```python { .api }
36
def two_qubit_matrix_to_cz_operations(matrix: np.ndarray,
37
qubits: Sequence['cirq.Qid'],
38
tolerance: float = 1e-10) -> List['cirq.Operation']:
39
"""Decompose two-qubit unitary into CZ-based operations.
40
41
Args:
42
matrix: 4x4 unitary matrix
43
qubits: Target qubits for decomposition
44
tolerance: Numerical tolerance
45
46
Returns:
47
List of operations using single-qubit gates and CZ
48
"""
49
50
def two_qubit_matrix_to_sqrt_iswap_operations(
51
q0: 'cirq.Qid',
52
q1: 'cirq.Qid',
53
mat: np.ndarray,
54
*,
55
required_sqrt_iswap_count: int = None,
56
use_sqrt_iswap_inv: bool = False,
57
atol: float = 1e-8,
58
check_preconditions: bool = True,
59
clean_operations: bool = False,
60
) -> Sequence['cirq.Operation']:
61
"""Decompose two-qubit unitary into √iSWAP-based operations.
62
63
Args:
64
q0: First qubit
65
q1: Second qubit
66
mat: 4x4 unitary matrix to decompose
67
required_sqrt_iswap_count: Required number of √iSWAP gates (optional)
68
use_sqrt_iswap_inv: Whether to use √iSWAP† gates
69
atol: Absolute tolerance for decomposition
70
check_preconditions: Whether to validate input matrix
71
clean_operations: Whether to clean up negligible operations
72
73
Returns:
74
Sequence of operations implementing the matrix
75
"""
76
77
def two_qubit_matrix_to_ion_operations(matrix: np.ndarray,
78
qubits: Sequence['cirq.Qid'],
79
tolerance: float = 1e-10) -> List['cirq.Operation']:
80
"""Decompose for ion trap quantum computers using MS gates."""
81
82
def parameterized_2q_op_to_sqrt_iswap_operations(op: 'cirq.Operation',
83
tolerance: float = 1e-10) -> List['cirq.Operation']:
84
"""Decompose parameterized two-qubit operation to √iSWAP gates."""
85
```
86
87
### Multi-Qubit Decompositions
88
89
```python { .api }
90
def three_qubit_matrix_to_operations(matrix: np.ndarray,
91
qubits: Sequence['cirq.Qid'],
92
tolerance: float = 1e-10) -> List['cirq.Operation']:
93
"""Decompose three-qubit unitary matrix.
94
95
Args:
96
matrix: 8x8 unitary matrix
97
qubits: Target qubits
98
tolerance: Numerical tolerance
99
100
Returns:
101
Decomposed operations
102
"""
103
104
def decompose_multi_controlled_x(qubits: Sequence['cirq.Qid'],
105
control_values: Sequence[int] = None,
106
work_qubits: Sequence['cirq.Qid'] = None) -> List['cirq.Operation']:
107
"""Decompose multi-controlled X gate."""
108
109
def decompose_multi_controlled_rotation(angles: Sequence[float],
110
qubits: Sequence['cirq.Qid'],
111
control_values: Sequence[int] = None) -> List['cirq.Operation']:
112
"""Decompose multi-controlled rotation gate."""
113
```
114
115
## Target Gatesets and Compilation
116
117
### Target Gateset Classes
118
119
```python { .api }
120
class CompilationTargetGateset:
121
"""Base class for target gatesets in compilation."""
122
123
def __init__(self, *, name: str = None,
124
unroll_circuit_op: bool = True) -> None:
125
"""Initialize compilation target gateset."""
126
127
def decompose_to_target_gateset(self, op: 'cirq.Operation',
128
moment_index: int) -> 'cirq.OP_TREE':
129
"""Decompose operation to target gateset."""
130
131
def preprocess_transformers(self) -> List['cirq.TRANSFORMER']:
132
"""Get preprocessing transformers."""
133
134
def postprocess_transformers(self) -> List['cirq.TRANSFORMER']:
135
"""Get postprocessing transformers."""
136
137
class TwoQubitCompilationTargetGateset(CompilationTargetGateset):
138
"""Target gateset for two-qubit gate compilation."""
139
140
def __init__(self, gate: 'cirq.Gate', **kwargs) -> None:
141
"""Initialize with specific two-qubit gate."""
142
143
class CZTargetGateset(TwoQubitCompilationTargetGateset):
144
"""Target gateset using CZ gates."""
145
146
def __init__(self, *, atol: float = 1e-8, **kwargs) -> None:
147
"""Initialize CZ target gateset."""
148
149
class SqrtIswapTargetGateset(TwoQubitCompilationTargetGateset):
150
"""Target gateset using √iSWAP gates."""
151
152
def __init__(self, *, atol: float = 1e-8, **kwargs) -> None:
153
"""Initialize √iSWAP target gateset."""
154
```
155
156
### Compilation Functions
157
158
```python { .api }
159
def optimize_for_target_gateset(circuit: 'cirq.Circuit',
160
gateset: CompilationTargetGateset,
161
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
162
"""Optimize circuit for target gateset.
163
164
Args:
165
circuit: Input circuit to optimize
166
gateset: Target gateset for compilation
167
context: Transformation context
168
169
Returns:
170
Optimized circuit using only target gateset
171
"""
172
173
def create_transformer_with_kwargs(transformer: 'cirq.TRANSFORMER', **kwargs) -> 'cirq.TRANSFORMER':
174
"""Create transformer with additional keyword arguments."""
175
```
176
177
## Circuit Structure Transformations
178
179
### Alignment and Organization
180
181
```python { .api }
182
def align_left(circuit: 'cirq.Circuit', context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
183
"""Align circuit operations to the left (earliest possible moments).
184
185
Args:
186
circuit: Circuit to align
187
context: Transformation context
188
189
Returns:
190
Left-aligned circuit
191
"""
192
193
def align_right(circuit: 'cirq.Circuit', context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
194
"""Align circuit operations to the right (latest possible moments)."""
195
196
def stratified_circuit(circuit: 'cirq.Circuit',
197
categories: Sequence[Callable[['cirq.Operation'], bool]] = None,
198
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
199
"""Create stratified circuit organizing operations by categories."""
200
```
201
202
### Moment Manipulation
203
204
```python { .api }
205
def drop_empty_moments(circuit: 'cirq.Circuit', context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
206
"""Remove empty moments from circuit.
207
208
Args:
209
circuit: Input circuit
210
context: Transformation context
211
212
Returns:
213
Circuit with empty moments removed
214
"""
215
216
def merge_moments(circuit: 'cirq.Circuit', context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
217
"""Merge adjacent compatible moments."""
218
219
def drop_negligible_operations(circuit: 'cirq.Circuit',
220
atol: float = 1e-8,
221
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
222
"""Remove operations with negligible effect."""
223
224
def is_negligible_turn(turn: Union[float, sympy.Expr], atol: float = 1e-8) -> bool:
225
"""Check if rotation angle is negligible."""
226
```
227
228
### Circuit Expansion and Composition
229
230
```python { .api }
231
def expand_composite(circuit: 'cirq.Circuit', context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
232
"""Expand composite operations in circuit.
233
234
Args:
235
circuit: Circuit with composite operations
236
context: Transformation context
237
238
Returns:
239
Circuit with composite operations expanded
240
"""
241
242
def unroll_circuit_op(circuit: 'cirq.Circuit',
243
context: 'cirq.TransformerContext' = None,
244
deep: bool = True,
245
tags_to_check: Sequence = ()) -> 'cirq.Circuit':
246
"""Unroll CircuitOperation instances in circuit."""
247
248
def unroll_circuit_op_greedy_earliest(circuit: 'cirq.Circuit',
249
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
250
"""Unroll circuit operations using greedy earliest strategy."""
251
252
def unroll_circuit_op_greedy_frontier(circuit: 'cirq.Circuit',
253
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
254
"""Unroll circuit operations using greedy frontier strategy."""
255
```
256
257
## Gate Merging and Optimization
258
259
### Single-Qubit Gate Merging
260
261
```python { .api }
262
def merge_single_qubit_gates_to_phased_x_and_z(circuit: 'cirq.Circuit',
263
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
264
"""Merge adjacent single-qubit gates into PhasedX and Z rotations.
265
266
Args:
267
circuit: Input circuit
268
context: Transformation context
269
270
Returns:
271
Circuit with merged single-qubit gates
272
"""
273
274
def merge_single_qubit_gates_to_phxz(circuit: 'cirq.Circuit',
275
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
276
"""Merge single-qubit gates into PhasedXZ gates."""
277
278
def merge_single_qubit_moments_to_phxz(circuit: 'cirq.Circuit',
279
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
280
"""Merge single-qubit gates across moments into PhasedXZ."""
281
282
def merge_single_qubit_gates_to_phxz_symbolized(circuit: 'cirq.Circuit',
283
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
284
"""Symbolic merging of single-qubit gates."""
285
```
286
287
### Multi-Qubit Gate Merging
288
289
```python { .api }
290
def merge_k_qubit_unitaries(circuit: 'cirq.Circuit',
291
k: int = 2,
292
context: 'cirq.TransformerContext' = None,
293
merged_gate_tolerance: float = 1e-10) -> 'cirq.Circuit':
294
"""Merge adjacent k-qubit unitary operations.
295
296
Args:
297
circuit: Input circuit
298
k: Number of qubits for unitary merging
299
context: Transformation context
300
merged_gate_tolerance: Tolerance for gate merging
301
302
Returns:
303
Circuit with merged k-qubit unitaries
304
"""
305
306
def merge_k_qubit_unitaries_to_circuit_op(circuit: 'cirq.Circuit',
307
k: int = 2,
308
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
309
"""Merge k-qubit unitaries into CircuitOperations."""
310
311
def merge_operations(circuit: 'cirq.Circuit',
312
merge_func: Callable = None,
313
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
314
"""Merge operations using custom merge function."""
315
316
def merge_operations_to_circuit_op(circuit: 'cirq.Circuit',
317
merge_func: Callable = None,
318
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
319
"""Merge operations into CircuitOperations."""
320
```
321
322
## Measurement Transformations
323
324
### Measurement Manipulation
325
326
```python { .api }
327
def defer_measurements(circuit: 'cirq.Circuit', context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
328
"""Defer all measurements to the end of the circuit.
329
330
Args:
331
circuit: Circuit with measurements
332
context: Transformation context
333
334
Returns:
335
Circuit with measurements moved to end
336
"""
337
338
def dephase_measurements(circuit: 'cirq.Circuit', context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
339
"""Add dephasing before measurements."""
340
341
def drop_terminal_measurements(circuit: 'cirq.Circuit', context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
342
"""Remove measurements at the end of circuit."""
343
344
def synchronize_terminal_measurements(circuit: 'cirq.Circuit',
345
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
346
"""Synchronize all terminal measurements to same moment."""
347
```
348
349
## Pauli Gate Transformations
350
351
### Pauli Ejection
352
353
```python { .api }
354
def eject_phased_paulis(circuit: 'cirq.Circuit',
355
eject_parameterized: bool = False,
356
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
357
"""Eject phased Pauli gates to the end of the circuit.
358
359
Args:
360
circuit: Input circuit
361
eject_parameterized: Whether to eject parameterized Paulis
362
context: Transformation context
363
364
Returns:
365
Circuit with Pauli gates ejected
366
"""
367
368
def eject_z(circuit: 'cirq.Circuit',
369
eject_parameterized: bool = False,
370
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
371
"""Eject Z gates to the end of circuit."""
372
```
373
374
## Transformer Framework
375
376
### Transformer Types and Context
377
378
```python { .api }
379
TRANSFORMER = Callable[['cirq.Circuit', 'cirq.TransformerContext'], 'cirq.Circuit']
380
"""Type for circuit transformer functions."""
381
382
def transformer(func: TRANSFORMER) -> TRANSFORMER:
383
"""Decorator to mark function as transformer."""
384
385
class TransformerContext:
386
"""Context for circuit transformations."""
387
388
def __init__(self, *, logger: 'TransformerLogger' = None,
389
deep: bool = False,
390
tags_to_ignore: Sequence = ()) -> None:
391
"""Initialize transformer context."""
392
393
@property
394
def logger(self) -> 'TransformerLogger':
395
"""Logger for transformation steps."""
396
397
def with_deep(self, deep: bool) -> 'TransformerContext':
398
"""Return context with different deep setting."""
399
400
class TransformerLogger:
401
"""Logger for circuit transformations."""
402
403
def __init__(self, *, print_out: bool = True) -> None:
404
"""Initialize transformer logger."""
405
406
def log(self, message: str, level: 'LogLevel' = 'LogLevel.INFO') -> None:
407
"""Log transformation message."""
408
409
class LogLevel(enum.Enum):
410
"""Logging levels for transformers."""
411
DEBUG = 0
412
INFO = 1
413
WARNING = 2
414
ERROR = 3
415
```
416
417
## Primitive Operations
418
419
### Operation Mapping
420
421
```python { .api }
422
def map_moments(circuit: 'cirq.Circuit',
423
map_func: Callable[['cirq.Moment', int], 'cirq.OP_TREE'],
424
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
425
"""Apply function to each moment in circuit.
426
427
Args:
428
circuit: Input circuit
429
map_func: Function to apply to each moment
430
context: Transformation context
431
432
Returns:
433
Transformed circuit
434
"""
435
436
def map_operations(circuit: 'cirq.Circuit',
437
map_func: Callable[['cirq.Operation', int], 'cirq.OP_TREE'],
438
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
439
"""Apply function to each operation in circuit."""
440
441
def map_operations_and_unroll(circuit: 'cirq.Circuit',
442
map_func: Callable[['cirq.Operation', int], 'cirq.OP_TREE'],
443
context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit':
444
"""Map operations and unroll results."""
445
```
446
447
## Usage Examples
448
449
### Basic Circuit Transformations
450
451
```python
452
import cirq
453
import numpy as np
454
455
print("=== Circuit Alignment ===")
456
# Create circuit with operations that can be rearranged
457
qubits = cirq.LineQubit.range(3)
458
circuit = cirq.Circuit([
459
cirq.X(qubits[0]),
460
cirq.Y(qubits[1]),
461
cirq.Z(qubits[2]),
462
cirq.H(qubits[0]),
463
cirq.CNOT(qubits[0], qubits[1])
464
])
465
466
print("Original circuit:")
467
print(circuit)
468
469
# Align left (earliest possible moments)
470
left_aligned = cirq.align_left(circuit)
471
print("\nLeft-aligned circuit:")
472
print(left_aligned)
473
474
# Align right (latest possible moments)
475
right_aligned = cirq.align_right(circuit)
476
print("\nRight-aligned circuit:")
477
print(right_aligned)
478
```
479
480
### Single-Qubit Gate Optimization
481
482
```python
483
import cirq
484
import numpy as np
485
486
print("=== Single-Qubit Gate Merging ===")
487
# Create circuit with many single-qubit gates
488
qubit = cirq.LineQubit(0)
489
circuit = cirq.Circuit([
490
cirq.H(qubit),
491
cirq.X(qubit)**0.5,
492
cirq.Z(qubit)**0.25,
493
cirq.Y(qubit)**0.1,
494
cirq.S(qubit)
495
])
496
497
print(f"Original circuit ({len(circuit)} moments):")
498
print(circuit)
499
500
# Merge into PhasedXZ gates
501
merged_circuit = cirq.merge_single_qubit_gates_to_phxz(circuit)
502
print(f"\nMerged circuit ({len(merged_circuit)} moments):")
503
print(merged_circuit)
504
505
# Verify circuits are equivalent
506
simulator = cirq.Simulator()
507
original_state = simulator.simulate(circuit).final_state_vector
508
merged_state = simulator.simulate(merged_circuit).final_state_vector
509
print(f"States equivalent: {np.allclose(original_state, merged_state)}")
510
```
511
512
### Target Gateset Compilation
513
514
```python
515
import cirq
516
517
print("=== Target Gateset Compilation ===")
518
# Create circuit with various two-qubit gates
519
qubits = cirq.LineQubit.range(2)
520
circuit = cirq.Circuit([
521
cirq.H(qubits[0]),
522
cirq.CNOT(qubits[0], qubits[1]),
523
cirq.SWAP(qubits[0], qubits[1]),
524
cirq.CZ(qubits[0], qubits[1])**0.5
525
])
526
527
print("Original circuit:")
528
print(circuit)
529
530
# Compile to CZ target gateset
531
cz_gateset = cirq.CZTargetGateset()
532
cz_circuit = cirq.optimize_for_target_gateset(circuit, cz_gateset)
533
print("\nCompiled to CZ gateset:")
534
print(cz_circuit)
535
536
# Compile to √iSWAP target gateset
537
iswap_gateset = cirq.SqrtIswapTargetGateset()
538
iswap_circuit = cirq.optimize_for_target_gateset(circuit, iswap_gateset)
539
print("\nCompiled to √iSWAP gateset:")
540
print(iswap_circuit)
541
```
542
543
### Matrix Decomposition
544
545
```python
546
import cirq
547
import numpy as np
548
549
print("=== Matrix Decomposition ===")
550
# Create arbitrary two-qubit unitary
551
theta = np.pi / 3
552
phi = np.pi / 4
553
matrix = np.array([
554
[np.cos(theta), -np.sin(theta), 0, 0],
555
[np.sin(theta), np.cos(theta), 0, 0],
556
[0, 0, np.cos(phi), -np.sin(phi)],
557
[0, 0, np.sin(phi), np.cos(phi)]
558
])
559
560
qubits = cirq.LineQubit.range(2)
561
562
# Decompose to CZ operations
563
cz_ops = cirq.two_qubit_matrix_to_cz_operations(matrix, qubits)
564
print(f"CZ decomposition ({len(cz_ops)} operations):")
565
for op in cz_ops:
566
print(f" {op}")
567
568
# Decompose to √iSWAP operations
569
iswap_ops = cirq.two_qubit_matrix_to_sqrt_iswap_operations(matrix, qubits)
570
print(f"\n√iSWAP decomposition ({len(iswap_ops)} operations):")
571
for op in iswap_ops:
572
print(f" {op}")
573
574
# Verify decomposition
575
circuit_cz = cirq.Circuit(cz_ops)
576
circuit_iswap = cirq.Circuit(iswap_ops)
577
578
print(f"\nCZ decomposition unitary matches: {np.allclose(matrix, cirq.unitary(circuit_cz))}")
579
print(f"√iSWAP decomposition unitary matches: {np.allclose(matrix, cirq.unitary(circuit_iswap))}")
580
```
581
582
### Measurement Transformations
583
584
```python
585
import cirq
586
587
print("=== Measurement Transformations ===")
588
# Create circuit with measurements throughout
589
qubits = cirq.LineQubit.range(3)
590
circuit = cirq.Circuit([
591
cirq.H(qubits[0]),
592
cirq.measure(qubits[0], key='early'),
593
cirq.CNOT(qubits[0], qubits[1]),
594
cirq.H(qubits[1]),
595
cirq.measure(qubits[1], key='middle'),
596
cirq.CNOT(qubits[1], qubits[2]),
597
cirq.measure(qubits[2], key='late')
598
])
599
600
print("Original circuit:")
601
print(circuit)
602
603
# Defer measurements to end
604
deferred_circuit = cirq.defer_measurements(circuit)
605
print("\nDeferred measurements:")
606
print(deferred_circuit)
607
608
# Drop terminal measurements
609
no_measure_circuit = cirq.drop_terminal_measurements(deferred_circuit)
610
print("\nWithout terminal measurements:")
611
print(no_measure_circuit)
612
```
613
614
## Circuit Routing and Qubit Mapping
615
616
Transform logical circuits to physical hardware by mapping logical qubits to physical qubits and inserting SWAP operations as needed.
617
618
### Routing Algorithms
619
620
```python { .api }
621
class RouteCQC:
622
"""Route circuits using the Configurable Quantum Computer (CQC) routing algorithm."""
623
def __init__(self, router_class: type, router_args: dict = None) -> None: ...
624
def __call__(self, circuit: 'cirq.Circuit', device_graph: 'networkx.Graph') -> 'cirq.Circuit': ...
625
626
def routed_circuit_with_mapping(
627
circuit: 'cirq.Circuit',
628
device_graph: 'networkx.Graph',
629
initial_mapper: 'AbstractInitialMapper' = None,
630
router: 'RouteCQC' = None
631
) -> Tuple['cirq.Circuit', Dict['cirq.Qid', 'cirq.Qid']]:
632
"""Route a circuit and return both the routed circuit and the qubit mapping."""
633
```
634
635
### Initial Mapping Strategies
636
637
```python { .api }
638
class AbstractInitialMapper:
639
"""Abstract base for initial qubit mapping strategies."""
640
def initial_mapping(self, circuit: 'cirq.Circuit', device_graph: 'networkx.Graph') -> Dict['cirq.Qid', 'cirq.Qid']: ...
641
642
class HardCodedInitialMapper(AbstractInitialMapper):
643
"""Use a pre-defined mapping between logical and physical qubits."""
644
def __init__(self, initial_mapping: Dict['cirq.Qid', 'cirq.Qid']) -> None: ...
645
646
class LineInitialMapper(AbstractInitialMapper):
647
"""Map logical qubits to a line of physical qubits."""
648
```
649
650
### Mapping Management
651
652
```python { .api }
653
class MappingManager:
654
"""Manage the mapping between logical and physical qubits during routing."""
655
def __init__(self, device_graph: 'networkx.Graph', initial_mapping: Dict['cirq.Qid', 'cirq.Qid'] = None) -> None: ...
656
def current_mapping(self) -> Dict['cirq.Qid', 'cirq.Qid']: ...
657
def apply_swap(self, swap_op: 'cirq.Operation') -> None: ...
658
659
def map_clean_and_borrowable_qubits(
660
circuit: 'cirq.Circuit',
661
qubit_map: Dict['cirq.Qid', 'cirq.Qid'],
662
clean_qubits: Set['cirq.Qid'] = None,
663
borrowable_qubits: Set['cirq.Qid'] = None
664
) -> 'cirq.Circuit':
665
"""Map qubits in a circuit, distinguishing between clean and borrowable ancilla qubits."""
666
```
667
668
## Gauge Compiling and Advanced Transformations
669
670
Advanced gauge-based transformations for two-qubit gate optimization and error mitigation.
671
672
### Gauge Framework
673
674
```python { .api }
675
class Gauge:
676
"""Abstract gauge transformation."""
677
def weight(self) -> float: ...
678
def sample(self, gate: 'cirq.Gate', prng: np.random.Generator) -> 'cirq.Gate': ...
679
680
class ConstantGauge(Gauge):
681
"""Gauge that always applies the same transformation."""
682
def __init__(self, gauge_map: Dict['cirq.Gate', 'cirq.Gate']) -> None: ...
683
684
class GaugeSelector:
685
"""Select gauges based on various criteria."""
686
def __init__(self, gauges: List[Gauge], selection_strategy: str = 'uniform') -> None: ...
687
688
class GaugeTransformer:
689
"""Apply gauge transformations to circuits."""
690
def __init__(self, gauge_selector: GaugeSelector, num_gauge_selections: int = 1) -> None: ...
691
```
692
693
### Specialized Gauge Transformers
694
695
```python { .api }
696
class CZGaugeTransformer(GaugeTransformer):
697
"""Gauge transformer for CZ-based circuits."""
698
699
class ISWAPGaugeTransformer(GaugeTransformer):
700
"""Gauge transformer for iSWAP-based circuits."""
701
702
class SqrtCZGaugeTransformer(GaugeTransformer):
703
"""Gauge transformer for √CZ-based circuits."""
704
705
class SqrtISWAPGaugeTransformer(GaugeTransformer):
706
"""Gauge transformer for √iSWAP-based circuits."""
707
708
class SpinInversionGaugeTransformer(GaugeTransformer):
709
"""Apply spin inversion gauge transformations."""
710
711
class CPhaseGaugeTransformer(GaugeTransformer):
712
"""Gauge transformer for controlled-phase gates."""
713
```
714
715
## Noise and Error Mitigation Transformers
716
717
Advanced transformers for noise modeling and error mitigation techniques.
718
719
```python { .api }
720
class DepolarizingNoiseTransformer:
721
"""Add depolarizing noise to circuit operations."""
722
def __init__(self, p_single: float = 0.001, p_two: float = 0.01) -> None: ...
723
def __call__(self, circuit: 'cirq.Circuit', context: 'cirq.TransformerContext' = None) -> 'cirq.Circuit': ...
724
725
class RandomizedMeasurements:
726
"""Implement randomized measurement protocols for error mitigation."""
727
def __init__(self, randomization_type: str = 'pauli') -> None: ...
728
729
def add_dynamical_decoupling(
730
circuit: 'cirq.Circuit',
731
decoupling_gates: List['cirq.Gate'] = None,
732
insertion_strategy: str = 'periodic'
733
) -> 'cirq.Circuit':
734
"""Add dynamical decoupling sequences to idle periods in the circuit."""
735
```
736
737
## Tag and Symbol Transformers
738
739
Utilities for managing operation tags and symbolic parameters.
740
741
```python { .api }
742
def index_tags(circuit: 'cirq.Circuit', tag_class: type = None) -> 'cirq.Circuit':
743
"""Add index tags to operations for tracking and analysis."""
744
745
def remove_tags(circuit: 'cirq.Circuit', tag_classes: List[type] = None) -> 'cirq.Circuit':
746
"""Remove specified tags from all operations in the circuit."""
747
748
def toggle_tags(circuit: 'cirq.Circuit', tag_class: type, condition: Callable = None) -> 'cirq.Circuit':
749
"""Toggle tags on operations based on a condition function."""
750
751
class SymbolizeTag:
752
"""Tag for marking operations that should be symbolized."""
753
754
def symbolize_single_qubit_gates_by_indexed_tags(circuit: 'cirq.Circuit') -> 'cirq.Circuit':
755
"""Convert single-qubit gates with indexed tags to symbolic parameters."""
756
```
757
758
This comprehensive transformation framework enables circuit optimization, compilation to target hardware, routing for physical devices, advanced gauge transformations, noise modeling, and symbolic manipulation for improved performance and hardware compatibility.