cirq-core 1.5.0.dev20250409225226__py3-none-any.whl → 1.6.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of cirq-core might be problematic. Click here for more details.

Files changed (732) hide show
  1. cirq/__init__.py +16 -17
  2. cirq/_compat.py +21 -20
  3. cirq/_compat_test.py +14 -34
  4. cirq/_doc.py +4 -2
  5. cirq/_import.py +8 -6
  6. cirq/_import_test.py +4 -2
  7. cirq/_version.py +6 -6
  8. cirq/_version_test.py +2 -2
  9. cirq/circuits/_block_diagram_drawer.py +11 -10
  10. cirq/circuits/_block_diagram_drawer_test.py +8 -6
  11. cirq/circuits/_box_drawing_character_data.py +8 -8
  12. cirq/circuits/_box_drawing_character_data_test.py +3 -1
  13. cirq/circuits/_bucket_priority_queue.py +9 -7
  14. cirq/circuits/_bucket_priority_queue_test.py +22 -20
  15. cirq/circuits/circuit.py +248 -172
  16. cirq/circuits/circuit_operation.py +73 -83
  17. cirq/circuits/circuit_operation_test.py +128 -90
  18. cirq/circuits/circuit_test.py +211 -151
  19. cirq/circuits/frozen_circuit.py +23 -60
  20. cirq/circuits/frozen_circuit_test.py +31 -8
  21. cirq/circuits/insert_strategy.py +7 -5
  22. cirq/circuits/insert_strategy_test.py +4 -2
  23. cirq/circuits/moment.py +88 -40
  24. cirq/circuits/moment_test.py +128 -51
  25. cirq/circuits/optimization_pass.py +5 -5
  26. cirq/circuits/optimization_pass_test.py +10 -10
  27. cirq/circuits/qasm_output.py +11 -11
  28. cirq/circuits/qasm_output_test.py +25 -22
  29. cirq/circuits/text_diagram_drawer.py +23 -38
  30. cirq/circuits/text_diagram_drawer_test.py +19 -17
  31. cirq/conftest.py +4 -3
  32. cirq/contrib/__init__.py +4 -4
  33. cirq/contrib/acquaintance/__init__.py +1 -1
  34. cirq/contrib/acquaintance/bipartite.py +5 -8
  35. cirq/contrib/acquaintance/bipartite_test.py +18 -13
  36. cirq/contrib/acquaintance/devices.py +2 -2
  37. cirq/contrib/acquaintance/devices_test.py +5 -3
  38. cirq/contrib/acquaintance/executor.py +5 -5
  39. cirq/contrib/acquaintance/executor_test.py +13 -9
  40. cirq/contrib/acquaintance/gates.py +18 -28
  41. cirq/contrib/acquaintance/gates_test.py +24 -20
  42. cirq/contrib/acquaintance/inspection_utils.py +8 -4
  43. cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
  44. cirq/contrib/acquaintance/mutation_utils.py +4 -4
  45. cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
  46. cirq/contrib/acquaintance/optimizers.py +4 -4
  47. cirq/contrib/acquaintance/optimizers_test.py +4 -1
  48. cirq/contrib/acquaintance/permutation.py +15 -27
  49. cirq/contrib/acquaintance/permutation_test.py +26 -17
  50. cirq/contrib/acquaintance/shift.py +4 -4
  51. cirq/contrib/acquaintance/shift_swap_network.py +4 -4
  52. cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
  53. cirq/contrib/acquaintance/shift_test.py +8 -6
  54. cirq/contrib/acquaintance/strategies/cubic.py +2 -2
  55. cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
  56. cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
  57. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
  58. cirq/contrib/acquaintance/testing.py +2 -0
  59. cirq/contrib/acquaintance/topological_sort.py +2 -2
  60. cirq/contrib/acquaintance/topological_sort_test.py +3 -1
  61. cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
  62. cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
  63. cirq/contrib/circuitdag/circuit_dag.py +4 -4
  64. cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
  65. cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
  66. cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
  67. cirq/contrib/graph_device/graph_device.py +12 -11
  68. cirq/contrib/graph_device/graph_device_test.py +18 -14
  69. cirq/contrib/graph_device/hypergraph.py +16 -14
  70. cirq/contrib/graph_device/hypergraph_test.py +13 -11
  71. cirq/contrib/graph_device/uniform_graph_device.py +6 -4
  72. cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
  73. cirq/contrib/hacks/disable_validation.py +6 -1
  74. cirq/contrib/hacks/disable_validation_test.py +3 -1
  75. cirq/contrib/json.py +31 -5
  76. cirq/contrib/json_test.py +6 -3
  77. cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
  78. cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
  79. cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
  80. cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
  81. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
  82. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
  83. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
  84. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
  85. cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
  86. cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
  87. cirq/contrib/json_test_data/__init__.py +17 -0
  88. cirq/contrib/json_test_data/spec.py +32 -0
  89. cirq/contrib/noise_models/noise_models.py +119 -5
  90. cirq/contrib/noise_models/noise_models_test.py +37 -9
  91. cirq/contrib/paulistring/clifford_optimize.py +6 -4
  92. cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
  93. cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
  94. cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
  95. cirq/contrib/paulistring/optimize.py +2 -0
  96. cirq/contrib/paulistring/optimize_test.py +4 -3
  97. cirq/contrib/paulistring/pauli_string_dag.py +2 -0
  98. cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
  99. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
  100. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
  101. cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
  102. cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
  103. cirq/contrib/paulistring/recombine.py +6 -4
  104. cirq/contrib/paulistring/recombine_test.py +3 -1
  105. cirq/contrib/paulistring/separate.py +9 -6
  106. cirq/contrib/paulistring/separate_test.py +3 -1
  107. cirq/contrib/qasm_import/_lexer.py +3 -2
  108. cirq/contrib/qasm_import/_lexer_test.py +49 -13
  109. cirq/contrib/qasm_import/_parser.py +547 -83
  110. cirq/contrib/qasm_import/_parser_test.py +988 -97
  111. cirq/contrib/qasm_import/exception.py +2 -0
  112. cirq/contrib/qasm_import/qasm.py +8 -2
  113. cirq/contrib/qasm_import/qasm_test.py +7 -4
  114. cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
  115. cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
  116. cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
  117. cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
  118. cirq/contrib/qcircuit/qcircuit_test.py +10 -8
  119. cirq/contrib/quantum_volume/quantum_volume.py +31 -27
  120. cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
  121. cirq/contrib/quimb/density_matrix.py +15 -14
  122. cirq/contrib/quimb/density_matrix_test.py +10 -7
  123. cirq/contrib/quimb/grid_circuits.py +5 -2
  124. cirq/contrib/quimb/grid_circuits_test.py +3 -0
  125. cirq/contrib/quimb/mps_simulator.py +20 -20
  126. cirq/contrib/quimb/mps_simulator_test.py +3 -0
  127. cirq/contrib/quimb/state_vector.py +12 -11
  128. cirq/contrib/quimb/state_vector_test.py +3 -0
  129. cirq/contrib/quirk/export_to_quirk.py +5 -3
  130. cirq/contrib/quirk/export_to_quirk_test.py +18 -16
  131. cirq/contrib/quirk/linearize_circuit.py +2 -0
  132. cirq/contrib/quirk/quirk_gate.py +18 -17
  133. cirq/contrib/routing/device.py +5 -3
  134. cirq/contrib/routing/device_test.py +2 -0
  135. cirq/contrib/routing/greedy.py +10 -21
  136. cirq/contrib/routing/greedy_test.py +4 -2
  137. cirq/contrib/routing/initialization.py +2 -2
  138. cirq/contrib/routing/initialization_test.py +5 -3
  139. cirq/contrib/routing/router.py +9 -5
  140. cirq/contrib/routing/router_test.py +2 -0
  141. cirq/contrib/routing/swap_network.py +3 -3
  142. cirq/contrib/routing/swap_network_test.py +3 -1
  143. cirq/contrib/routing/utils.py +2 -2
  144. cirq/contrib/routing/utils_test.py +3 -0
  145. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
  146. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
  147. cirq/contrib/svg/svg.py +3 -3
  148. cirq/contrib/svg/svg_test.py +8 -5
  149. cirq/devices/device.py +4 -4
  150. cirq/devices/device_test.py +7 -4
  151. cirq/devices/grid_device_metadata.py +10 -10
  152. cirq/devices/grid_device_metadata_test.py +3 -0
  153. cirq/devices/grid_qubit.py +29 -21
  154. cirq/devices/grid_qubit_test.py +3 -0
  155. cirq/devices/insertion_noise_model.py +7 -7
  156. cirq/devices/insertion_noise_model_test.py +7 -5
  157. cirq/devices/line_qubit.py +13 -13
  158. cirq/devices/line_qubit_test.py +2 -0
  159. cirq/devices/named_topologies.py +18 -29
  160. cirq/devices/named_topologies_test.py +13 -10
  161. cirq/devices/noise_model.py +3 -3
  162. cirq/devices/noise_model_test.py +19 -15
  163. cirq/devices/noise_properties.py +15 -6
  164. cirq/devices/noise_properties_test.py +34 -3
  165. cirq/devices/noise_utils.py +11 -9
  166. cirq/devices/noise_utils_test.py +2 -0
  167. cirq/devices/superconducting_qubits_noise_properties.py +23 -22
  168. cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
  169. cirq/devices/thermal_noise_model.py +107 -37
  170. cirq/devices/thermal_noise_model_test.py +21 -0
  171. cirq/devices/unconstrained_device.py +5 -3
  172. cirq/devices/unconstrained_device_test.py +2 -0
  173. cirq/experiments/__init__.py +4 -2
  174. cirq/experiments/benchmarking/__init__.py +17 -0
  175. cirq/experiments/benchmarking/parallel_xeb.py +677 -0
  176. cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
  177. cirq/experiments/fidelity_estimation.py +14 -8
  178. cirq/experiments/fidelity_estimation_test.py +3 -0
  179. cirq/experiments/n_qubit_tomography.py +17 -16
  180. cirq/experiments/n_qubit_tomography_test.py +8 -5
  181. cirq/experiments/purity_estimation.py +2 -0
  182. cirq/experiments/purity_estimation_test.py +2 -0
  183. cirq/experiments/qubit_characterizations.py +207 -103
  184. cirq/experiments/qubit_characterizations_test.py +40 -12
  185. cirq/experiments/random_quantum_circuit_generation.py +56 -70
  186. cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
  187. cirq/experiments/readout_confusion_matrix.py +24 -22
  188. cirq/experiments/readout_confusion_matrix_test.py +2 -0
  189. cirq/experiments/single_qubit_readout_calibration.py +30 -15
  190. cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
  191. cirq/experiments/t1_decay_experiment.py +9 -7
  192. cirq/experiments/t1_decay_experiment_test.py +13 -11
  193. cirq/experiments/t2_decay_experiment.py +16 -13
  194. cirq/experiments/t2_decay_experiment_test.py +2 -0
  195. cirq/experiments/two_qubit_xeb.py +64 -57
  196. cirq/experiments/two_qubit_xeb_test.py +10 -6
  197. cirq/experiments/xeb_fitting.py +39 -35
  198. cirq/experiments/xeb_sampling.py +37 -44
  199. cirq/experiments/xeb_sampling_test.py +3 -0
  200. cirq/experiments/xeb_simulation.py +14 -10
  201. cirq/experiments/xeb_simulation_test.py +5 -5
  202. cirq/experiments/z_phase_calibration.py +32 -29
  203. cirq/experiments/z_phase_calibration_test.py +3 -4
  204. cirq/interop/quirk/cells/__init__.py +1 -1
  205. cirq/interop/quirk/cells/all_cells.py +7 -2
  206. cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
  207. cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
  208. cirq/interop/quirk/cells/cell.py +19 -28
  209. cirq/interop/quirk/cells/cell_test.py +3 -0
  210. cirq/interop/quirk/cells/composite_cell.py +13 -28
  211. cirq/interop/quirk/cells/composite_cell_test.py +2 -0
  212. cirq/interop/quirk/cells/control_cells.py +15 -15
  213. cirq/interop/quirk/cells/control_cells_test.py +7 -5
  214. cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
  215. cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
  216. cirq/interop/quirk/cells/ignored_cells.py +3 -0
  217. cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
  218. cirq/interop/quirk/cells/input_cells.py +7 -5
  219. cirq/interop/quirk/cells/input_cells_test.py +7 -5
  220. cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
  221. cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
  222. cirq/interop/quirk/cells/measurement_cells.py +5 -2
  223. cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
  224. cirq/interop/quirk/cells/parse.py +22 -23
  225. cirq/interop/quirk/cells/parse_test.py +12 -10
  226. cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
  227. cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
  228. cirq/interop/quirk/cells/scalar_cells.py +4 -1
  229. cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
  230. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
  231. cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
  232. cirq/interop/quirk/cells/swap_cell.py +8 -6
  233. cirq/interop/quirk/cells/swap_cell_test.py +6 -4
  234. cirq/interop/quirk/cells/testing.py +6 -6
  235. cirq/interop/quirk/cells/testing_test.py +8 -6
  236. cirq/interop/quirk/cells/unsupported_cells.py +3 -0
  237. cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
  238. cirq/interop/quirk/url_to_circuit.py +23 -36
  239. cirq/interop/quirk/url_to_circuit_test.py +4 -1
  240. cirq/json_resolver_cache.py +14 -12
  241. cirq/linalg/__init__.py +4 -6
  242. cirq/linalg/combinators.py +7 -5
  243. cirq/linalg/combinators_test.py +10 -7
  244. cirq/linalg/decompositions.py +24 -35
  245. cirq/linalg/decompositions_test.py +3 -1
  246. cirq/linalg/diagonalize.py +6 -4
  247. cirq/linalg/diagonalize_test.py +15 -14
  248. cirq/linalg/operator_spaces.py +14 -14
  249. cirq/linalg/operator_spaces_test.py +13 -11
  250. cirq/linalg/predicates.py +18 -9
  251. cirq/linalg/predicates_test.py +5 -0
  252. cirq/linalg/tolerance.py +6 -3
  253. cirq/linalg/tolerance_test.py +6 -4
  254. cirq/linalg/transformations.py +23 -20
  255. cirq/linalg/transformations_test.py +73 -43
  256. cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
  257. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
  258. cirq/neutral_atoms/neutral_atom_devices.py +2 -0
  259. cirq/ops/__init__.py +2 -0
  260. cirq/ops/arithmetic_operation.py +21 -21
  261. cirq/ops/arithmetic_operation_test.py +7 -8
  262. cirq/ops/boolean_hamiltonian.py +23 -22
  263. cirq/ops/boolean_hamiltonian_test.py +12 -9
  264. cirq/ops/classically_controlled_operation.py +31 -36
  265. cirq/ops/classically_controlled_operation_test.py +121 -117
  266. cirq/ops/clifford_gate.py +98 -81
  267. cirq/ops/clifford_gate_test.py +72 -57
  268. cirq/ops/common_channels.py +44 -44
  269. cirq/ops/common_channels_test.py +83 -81
  270. cirq/ops/common_gate_families.py +9 -7
  271. cirq/ops/common_gate_families_test.py +11 -7
  272. cirq/ops/common_gates.py +164 -183
  273. cirq/ops/common_gates_test.py +135 -95
  274. cirq/ops/control_values.py +23 -26
  275. cirq/ops/control_values_test.py +22 -20
  276. cirq/ops/controlled_gate.py +64 -112
  277. cirq/ops/controlled_gate_test.py +130 -35
  278. cirq/ops/controlled_operation.py +24 -35
  279. cirq/ops/controlled_operation_test.py +8 -6
  280. cirq/ops/dense_pauli_string.py +38 -49
  281. cirq/ops/dense_pauli_string_test.py +4 -2
  282. cirq/ops/diagonal_gate.py +18 -31
  283. cirq/ops/diagonal_gate_test.py +13 -13
  284. cirq/ops/eigen_gate.py +29 -29
  285. cirq/ops/eigen_gate_test.py +45 -28
  286. cirq/ops/fourier_transform.py +14 -20
  287. cirq/ops/fourier_transform_test.py +15 -12
  288. cirq/ops/fsim_gate.py +43 -42
  289. cirq/ops/fsim_gate_test.py +29 -29
  290. cirq/ops/gate_features.py +2 -0
  291. cirq/ops/gate_features_test.py +5 -3
  292. cirq/ops/gate_operation.py +43 -65
  293. cirq/ops/gate_operation_test.py +46 -42
  294. cirq/ops/gateset.py +28 -40
  295. cirq/ops/gateset_test.py +4 -2
  296. cirq/ops/global_phase_op.py +45 -20
  297. cirq/ops/global_phase_op_test.py +44 -20
  298. cirq/ops/greedy_qubit_manager.py +10 -8
  299. cirq/ops/greedy_qubit_manager_test.py +5 -3
  300. cirq/ops/identity.py +14 -12
  301. cirq/ops/identity_test.py +24 -20
  302. cirq/ops/kraus_channel.py +11 -8
  303. cirq/ops/kraus_channel_test.py +14 -11
  304. cirq/ops/linear_combinations.py +65 -77
  305. cirq/ops/linear_combinations_test.py +14 -9
  306. cirq/ops/matrix_gates.py +21 -18
  307. cirq/ops/matrix_gates_test.py +16 -0
  308. cirq/ops/measure_util.py +15 -20
  309. cirq/ops/measure_util_test.py +2 -0
  310. cirq/ops/measurement_gate.py +26 -37
  311. cirq/ops/measurement_gate_test.py +2 -0
  312. cirq/ops/mixed_unitary_channel.py +12 -9
  313. cirq/ops/mixed_unitary_channel_test.py +14 -11
  314. cirq/ops/named_qubit.py +16 -13
  315. cirq/ops/named_qubit_test.py +15 -13
  316. cirq/ops/op_tree.py +9 -7
  317. cirq/ops/op_tree_test.py +22 -19
  318. cirq/ops/parallel_gate.py +15 -17
  319. cirq/ops/parallel_gate_test.py +18 -16
  320. cirq/ops/parity_gates.py +23 -25
  321. cirq/ops/parity_gates_test.py +36 -32
  322. cirq/ops/pauli_gates.py +22 -21
  323. cirq/ops/pauli_gates_test.py +29 -20
  324. cirq/ops/pauli_interaction_gate.py +15 -19
  325. cirq/ops/pauli_interaction_gate_test.py +10 -8
  326. cirq/ops/pauli_measurement_gate.py +23 -35
  327. cirq/ops/pauli_measurement_gate_test.py +2 -0
  328. cirq/ops/pauli_string.py +92 -120
  329. cirq/ops/pauli_string_phasor.py +52 -45
  330. cirq/ops/pauli_string_phasor_test.py +4 -5
  331. cirq/ops/pauli_string_raw_types.py +9 -7
  332. cirq/ops/pauli_string_raw_types_test.py +2 -0
  333. cirq/ops/pauli_string_test.py +31 -154
  334. cirq/ops/pauli_sum_exponential.py +12 -12
  335. cirq/ops/pauli_sum_exponential_test.py +12 -10
  336. cirq/ops/permutation_gate.py +8 -6
  337. cirq/ops/permutation_gate_test.py +10 -8
  338. cirq/ops/phased_iswap_gate.py +16 -16
  339. cirq/ops/phased_iswap_gate_test.py +17 -15
  340. cirq/ops/phased_x_gate.py +16 -17
  341. cirq/ops/phased_x_gate_test.py +18 -16
  342. cirq/ops/phased_x_z_gate.py +24 -22
  343. cirq/ops/phased_x_z_gate_test.py +17 -11
  344. cirq/ops/projector.py +16 -11
  345. cirq/ops/projector_test.py +19 -16
  346. cirq/ops/qid_util.py +7 -5
  347. cirq/ops/qid_util_test.py +2 -0
  348. cirq/ops/qubit_manager.py +11 -9
  349. cirq/ops/qubit_manager_test.py +6 -4
  350. cirq/ops/qubit_order.py +11 -14
  351. cirq/ops/qubit_order_or_list.py +4 -2
  352. cirq/ops/qubit_order_test.py +12 -10
  353. cirq/ops/random_gate_channel.py +12 -10
  354. cirq/ops/random_gate_channel_test.py +14 -11
  355. cirq/ops/raw_types.py +109 -129
  356. cirq/ops/raw_types_test.py +63 -57
  357. cirq/ops/state_preparation_channel.py +7 -7
  358. cirq/ops/state_preparation_channel_test.py +11 -9
  359. cirq/ops/swap_gates.py +13 -15
  360. cirq/ops/swap_gates_test.py +19 -17
  361. cirq/ops/tags.py +5 -3
  362. cirq/ops/tags_test.py +4 -2
  363. cirq/ops/three_qubit_gates.py +43 -76
  364. cirq/ops/three_qubit_gates_test.py +19 -17
  365. cirq/ops/two_qubit_diagonal_gate.py +13 -13
  366. cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
  367. cirq/ops/uniform_superposition_gate.py +5 -3
  368. cirq/ops/uniform_superposition_gate_test.py +5 -3
  369. cirq/ops/wait_gate.py +17 -14
  370. cirq/ops/wait_gate_test.py +9 -6
  371. cirq/protocols/__init__.py +0 -3
  372. cirq/protocols/act_on_protocol.py +8 -6
  373. cirq/protocols/act_on_protocol_test.py +15 -12
  374. cirq/protocols/apply_channel_protocol.py +10 -14
  375. cirq/protocols/apply_channel_protocol_test.py +2 -0
  376. cirq/protocols/apply_mixture_protocol.py +13 -42
  377. cirq/protocols/apply_mixture_protocol_test.py +7 -5
  378. cirq/protocols/apply_unitary_protocol.py +39 -34
  379. cirq/protocols/apply_unitary_protocol_test.py +4 -1
  380. cirq/protocols/approximate_equality_protocol.py +2 -0
  381. cirq/protocols/approximate_equality_protocol_test.py +2 -0
  382. cirq/protocols/circuit_diagram_info_protocol.py +58 -42
  383. cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
  384. cirq/protocols/commutes_protocol.py +8 -7
  385. cirq/protocols/commutes_protocol_test.py +2 -0
  386. cirq/protocols/control_key_protocol.py +6 -4
  387. cirq/protocols/control_key_protocol_test.py +3 -1
  388. cirq/protocols/decompose_protocol.py +49 -48
  389. cirq/protocols/decompose_protocol_test.py +27 -16
  390. cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
  391. cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
  392. cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
  393. cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
  394. cirq/protocols/has_unitary_protocol.py +10 -6
  395. cirq/protocols/has_unitary_protocol_test.py +13 -8
  396. cirq/protocols/hash_from_pickle_test.py +2 -11
  397. cirq/protocols/inverse_protocol.py +13 -16
  398. cirq/protocols/inverse_protocol_test.py +5 -3
  399. cirq/protocols/json_serialization.py +35 -54
  400. cirq/protocols/json_serialization_test.py +14 -21
  401. cirq/protocols/json_test_data/CXSWAP.json +46 -0
  402. cirq/protocols/json_test_data/CXSWAP.repr +13 -0
  403. cirq/protocols/json_test_data/CZSWAP.json +46 -0
  404. cirq/protocols/json_test_data/CZSWAP.repr +13 -0
  405. cirq/protocols/json_test_data/CircuitOperation.json +6 -3
  406. cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
  407. cirq/protocols/json_test_data/Moment.json +24 -1
  408. cirq/protocols/json_test_data/Moment.repr +6 -1
  409. cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
  410. cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
  411. cirq/protocols/json_test_data/spec.py +6 -2
  412. cirq/protocols/kraus_protocol.py +47 -7
  413. cirq/protocols/kraus_protocol_test.py +86 -12
  414. cirq/protocols/measurement_key_protocol.py +15 -16
  415. cirq/protocols/measurement_key_protocol_test.py +13 -11
  416. cirq/protocols/mixture_protocol.py +7 -5
  417. cirq/protocols/mixture_protocol_test.py +4 -2
  418. cirq/protocols/mul_protocol.py +2 -3
  419. cirq/protocols/mul_protocol_test.py +2 -0
  420. cirq/protocols/pauli_expansion_protocol.py +6 -3
  421. cirq/protocols/pauli_expansion_protocol_test.py +5 -3
  422. cirq/protocols/phase_protocol.py +2 -0
  423. cirq/protocols/phase_protocol_test.py +3 -1
  424. cirq/protocols/pow_protocol.py +11 -16
  425. cirq/protocols/pow_protocol_test.py +2 -0
  426. cirq/protocols/qasm.py +14 -20
  427. cirq/protocols/qasm_test.py +6 -3
  428. cirq/protocols/qid_shape_protocol.py +8 -8
  429. cirq/protocols/qid_shape_protocol_test.py +3 -1
  430. cirq/protocols/resolve_parameters.py +5 -3
  431. cirq/protocols/resolve_parameters_test.py +8 -7
  432. cirq/protocols/trace_distance_bound.py +6 -4
  433. cirq/protocols/trace_distance_bound_test.py +3 -1
  434. cirq/protocols/unitary_protocol.py +17 -7
  435. cirq/protocols/unitary_protocol_test.py +12 -2
  436. cirq/qis/channels.py +6 -2
  437. cirq/qis/channels_test.py +20 -16
  438. cirq/qis/clifford_tableau.py +21 -19
  439. cirq/qis/clifford_tableau_test.py +2 -2
  440. cirq/qis/entropy.py +14 -3
  441. cirq/qis/entropy_test.py +3 -1
  442. cirq/qis/measures.py +13 -13
  443. cirq/qis/measures_test.py +20 -14
  444. cirq/qis/noise_utils.py +2 -0
  445. cirq/qis/noise_utils_test.py +9 -7
  446. cirq/qis/quantum_state_representation.py +7 -8
  447. cirq/qis/states.py +58 -56
  448. cirq/qis/states_test.py +2 -0
  449. cirq/sim/classical_simulator.py +23 -22
  450. cirq/sim/classical_simulator_test.py +2 -0
  451. cirq/sim/clifford/clifford_simulator.py +23 -21
  452. cirq/sim/clifford/clifford_simulator_test.py +7 -4
  453. cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
  454. cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
  455. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
  456. cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
  457. cirq/sim/clifford/stabilizer_sampler.py +9 -7
  458. cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
  459. cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
  460. cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
  461. cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
  462. cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
  463. cirq/sim/density_matrix_simulation_state.py +26 -27
  464. cirq/sim/density_matrix_simulation_state_test.py +10 -8
  465. cirq/sim/density_matrix_simulator.py +30 -28
  466. cirq/sim/density_matrix_simulator_test.py +48 -48
  467. cirq/sim/density_matrix_utils.py +13 -11
  468. cirq/sim/density_matrix_utils_test.py +38 -36
  469. cirq/sim/mux.py +33 -31
  470. cirq/sim/mux_test.py +3 -0
  471. cirq/sim/simulation_product_state.py +15 -15
  472. cirq/sim/simulation_product_state_test.py +29 -26
  473. cirq/sim/simulation_state.py +29 -38
  474. cirq/sim/simulation_state_base.py +21 -32
  475. cirq/sim/simulation_state_test.py +15 -13
  476. cirq/sim/simulation_utils.py +5 -2
  477. cirq/sim/simulation_utils_test.py +5 -2
  478. cirq/sim/simulator.py +90 -106
  479. cirq/sim/simulator_base.py +33 -45
  480. cirq/sim/simulator_base_test.py +20 -15
  481. cirq/sim/simulator_test.py +23 -14
  482. cirq/sim/sparse_simulator.py +19 -17
  483. cirq/sim/sparse_simulator_test.py +41 -40
  484. cirq/sim/state_vector.py +15 -12
  485. cirq/sim/state_vector_simulation_state.py +31 -31
  486. cirq/sim/state_vector_simulation_state_test.py +16 -14
  487. cirq/sim/state_vector_simulator.py +17 -14
  488. cirq/sim/state_vector_simulator_test.py +2 -0
  489. cirq/sim/state_vector_test.py +6 -3
  490. cirq/study/flatten_expressions.py +16 -15
  491. cirq/study/flatten_expressions_test.py +13 -11
  492. cirq/study/resolver.py +18 -17
  493. cirq/study/resolver_test.py +22 -20
  494. cirq/study/result.py +17 -27
  495. cirq/study/result_test.py +2 -0
  496. cirq/study/sweepable.py +12 -10
  497. cirq/study/sweepable_test.py +3 -0
  498. cirq/study/sweeps.py +42 -61
  499. cirq/study/sweeps_test.py +33 -0
  500. cirq/testing/__init__.py +7 -11
  501. cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
  502. cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
  503. cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
  504. cirq/testing/circuit_compare.py +8 -17
  505. cirq/testing/circuit_compare_test.py +2 -0
  506. cirq/testing/consistent_act_on.py +13 -11
  507. cirq/testing/consistent_act_on_test.py +5 -3
  508. cirq/testing/consistent_channels.py +2 -0
  509. cirq/testing/consistent_channels_test.py +10 -8
  510. cirq/testing/consistent_controlled_gate_op.py +5 -5
  511. cirq/testing/consistent_controlled_gate_op_test.py +18 -18
  512. cirq/testing/consistent_decomposition.py +2 -2
  513. cirq/testing/consistent_decomposition_test.py +4 -2
  514. cirq/testing/consistent_pauli_expansion.py +2 -0
  515. cirq/testing/consistent_pauli_expansion_test.py +3 -1
  516. cirq/testing/consistent_phase_by.py +2 -0
  517. cirq/testing/consistent_phase_by_test.py +3 -1
  518. cirq/testing/consistent_protocols.py +14 -20
  519. cirq/testing/consistent_protocols_test.py +13 -11
  520. cirq/testing/consistent_qasm.py +6 -4
  521. cirq/testing/consistent_qasm_test.py +7 -7
  522. cirq/testing/consistent_resolve_parameters.py +2 -0
  523. cirq/testing/consistent_specified_has_unitary.py +2 -2
  524. cirq/testing/consistent_specified_has_unitary_test.py +6 -4
  525. cirq/testing/consistent_unitary.py +1 -0
  526. cirq/testing/consistent_unitary_test.py +4 -2
  527. cirq/testing/deprecation.py +5 -2
  528. cirq/testing/deprecation_test.py +5 -2
  529. cirq/testing/devices.py +7 -4
  530. cirq/testing/devices_test.py +7 -4
  531. cirq/testing/equals_tester.py +4 -2
  532. cirq/testing/equals_tester_test.py +21 -17
  533. cirq/testing/equivalent_basis_map.py +6 -4
  534. cirq/testing/equivalent_basis_map_test.py +6 -4
  535. cirq/testing/equivalent_repr_eval.py +6 -4
  536. cirq/testing/equivalent_repr_eval_test.py +5 -3
  537. cirq/testing/gate_features.py +2 -0
  538. cirq/testing/gate_features_test.py +7 -5
  539. cirq/testing/json.py +19 -15
  540. cirq/testing/json_test.py +5 -3
  541. cirq/testing/lin_alg_utils.py +10 -11
  542. cirq/testing/lin_alg_utils_test.py +14 -12
  543. cirq/testing/logs.py +7 -6
  544. cirq/testing/logs_test.py +9 -7
  545. cirq/testing/no_identifier_qubit.py +4 -2
  546. cirq/testing/no_identifier_qubit_test.py +5 -3
  547. cirq/testing/op_tree.py +2 -0
  548. cirq/testing/op_tree_test.py +4 -1
  549. cirq/testing/order_tester.py +2 -0
  550. cirq/testing/order_tester_test.py +8 -6
  551. cirq/testing/pytest_utils.py +2 -0
  552. cirq/testing/pytest_utils_test.py +4 -2
  553. cirq/testing/random_circuit.py +21 -20
  554. cirq/testing/random_circuit_test.py +12 -9
  555. cirq/testing/repr_pretty_tester.py +1 -0
  556. cirq/testing/repr_pretty_tester_test.py +5 -3
  557. cirq/testing/routing_devices.py +4 -1
  558. cirq/testing/routing_devices_test.py +9 -6
  559. cirq/testing/sample_circuits.py +4 -1
  560. cirq/testing/sample_circuits_test.py +3 -1
  561. cirq/testing/sample_gates.py +3 -0
  562. cirq/testing/sample_gates_test.py +5 -2
  563. cirq/transformers/__init__.py +11 -4
  564. cirq/transformers/align.py +9 -7
  565. cirq/transformers/align_test.py +2 -0
  566. cirq/transformers/analytical_decompositions/__init__.py +3 -6
  567. cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
  568. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
  569. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
  570. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  571. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
  572. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
  573. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
  574. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
  575. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
  576. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
  577. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
  578. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
  579. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
  580. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
  581. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
  582. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
  583. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
  584. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
  585. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
  586. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
  587. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
  588. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
  589. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
  590. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
  591. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
  592. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
  593. cirq/transformers/drop_empty_moments.py +5 -3
  594. cirq/transformers/drop_empty_moments_test.py +4 -2
  595. cirq/transformers/drop_negligible_operations.py +7 -5
  596. cirq/transformers/drop_negligible_operations_test.py +2 -0
  597. cirq/transformers/dynamical_decoupling.py +49 -42
  598. cirq/transformers/dynamical_decoupling_test.py +223 -205
  599. cirq/transformers/eject_phased_paulis.py +28 -26
  600. cirq/transformers/eject_phased_paulis_test.py +12 -9
  601. cirq/transformers/eject_z.py +12 -12
  602. cirq/transformers/eject_z_test.py +2 -2
  603. cirq/transformers/expand_composite.py +6 -4
  604. cirq/transformers/expand_composite_test.py +3 -1
  605. cirq/transformers/gauge_compiling/__init__.py +3 -1
  606. cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
  607. cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
  608. cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
  609. cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
  610. cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
  611. cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
  612. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
  613. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
  614. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
  615. cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
  616. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
  617. cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
  618. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
  619. cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
  620. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
  621. cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
  622. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
  623. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
  624. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
  625. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
  626. cirq/transformers/insertion_sort.py +8 -6
  627. cirq/transformers/insertion_sort_test.py +3 -1
  628. cirq/transformers/measurement_transformers.py +29 -29
  629. cirq/transformers/measurement_transformers_test.py +2 -0
  630. cirq/transformers/merge_k_qubit_gates.py +12 -10
  631. cirq/transformers/merge_k_qubit_gates_test.py +18 -18
  632. cirq/transformers/merge_single_qubit_gates.py +197 -20
  633. cirq/transformers/merge_single_qubit_gates_test.py +177 -5
  634. cirq/transformers/noise_adding.py +5 -3
  635. cirq/transformers/noise_adding_test.py +2 -0
  636. cirq/transformers/optimize_for_target_gateset.py +19 -17
  637. cirq/transformers/optimize_for_target_gateset_test.py +11 -8
  638. cirq/transformers/qubit_management_transformers.py +13 -11
  639. cirq/transformers/qubit_management_transformers_test.py +5 -3
  640. cirq/transformers/randomized_measurements.py +16 -14
  641. cirq/transformers/randomized_measurements_test.py +10 -4
  642. cirq/transformers/routing/initial_mapper.py +6 -4
  643. cirq/transformers/routing/initial_mapper_test.py +2 -0
  644. cirq/transformers/routing/line_initial_mapper.py +16 -14
  645. cirq/transformers/routing/line_initial_mapper_test.py +9 -7
  646. cirq/transformers/routing/mapping_manager.py +10 -10
  647. cirq/transformers/routing/mapping_manager_test.py +2 -0
  648. cirq/transformers/routing/route_circuit_cqc.py +33 -31
  649. cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
  650. cirq/transformers/routing/visualize_routed_circuit.py +8 -7
  651. cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
  652. cirq/transformers/stratify.py +17 -15
  653. cirq/transformers/stratify_test.py +3 -0
  654. cirq/transformers/symbolize.py +103 -0
  655. cirq/transformers/symbolize_test.py +62 -0
  656. cirq/transformers/synchronize_terminal_measurements.py +10 -10
  657. cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
  658. cirq/transformers/tag_transformers.py +97 -0
  659. cirq/transformers/tag_transformers_test.py +103 -0
  660. cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
  661. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
  662. cirq/transformers/target_gatesets/cz_gateset.py +7 -5
  663. cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
  664. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
  665. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
  666. cirq/transformers/transformer_api.py +34 -47
  667. cirq/transformers/transformer_api_test.py +9 -8
  668. cirq/transformers/transformer_primitives.py +39 -49
  669. cirq/transformers/transformer_primitives_test.py +10 -17
  670. cirq/value/abc_alt.py +6 -4
  671. cirq/value/abc_alt_test.py +5 -3
  672. cirq/value/angle.py +11 -12
  673. cirq/value/angle_test.py +5 -3
  674. cirq/value/classical_data.py +27 -27
  675. cirq/value/classical_data_test.py +11 -8
  676. cirq/value/condition.py +26 -24
  677. cirq/value/condition_test.py +2 -0
  678. cirq/value/digits.py +14 -11
  679. cirq/value/digits_test.py +2 -0
  680. cirq/value/duration.py +23 -20
  681. cirq/value/duration_test.py +2 -0
  682. cirq/value/linear_dict.py +25 -30
  683. cirq/value/linear_dict_test.py +10 -8
  684. cirq/value/measurement_key.py +12 -12
  685. cirq/value/measurement_key_test.py +2 -0
  686. cirq/value/periodic_value.py +4 -4
  687. cirq/value/periodic_value_test.py +11 -7
  688. cirq/value/probability.py +3 -1
  689. cirq/value/probability_test.py +4 -2
  690. cirq/value/product_state.py +15 -13
  691. cirq/value/product_state_test.py +4 -1
  692. cirq/value/random_state.py +2 -0
  693. cirq/value/random_state_test.py +5 -3
  694. cirq/value/timestamp.py +11 -7
  695. cirq/value/timestamp_test.py +14 -12
  696. cirq/value/type_alias.py +4 -4
  697. cirq/value/value_equality_attr.py +8 -9
  698. cirq/value/value_equality_attr_test.py +14 -11
  699. cirq/vis/density_matrix.py +3 -3
  700. cirq/vis/density_matrix_test.py +20 -17
  701. cirq/vis/heatmap.py +24 -37
  702. cirq/vis/heatmap_test.py +3 -0
  703. cirq/vis/histogram.py +9 -6
  704. cirq/vis/histogram_test.py +5 -2
  705. cirq/vis/state_histogram.py +10 -8
  706. cirq/vis/state_histogram_test.py +7 -5
  707. cirq/vis/vis_utils.py +4 -1
  708. cirq/vis/vis_utils_test.py +4 -1
  709. cirq/work/collector.py +12 -18
  710. cirq/work/collector_test.py +15 -10
  711. cirq/work/observable_grouping.py +6 -7
  712. cirq/work/observable_grouping_test.py +10 -9
  713. cirq/work/observable_measurement.py +47 -45
  714. cirq/work/observable_measurement_data.py +22 -17
  715. cirq/work/observable_measurement_data_test.py +4 -1
  716. cirq/work/observable_measurement_test.py +48 -29
  717. cirq/work/observable_readout_calibration.py +5 -2
  718. cirq/work/observable_readout_calibration_test.py +5 -2
  719. cirq/work/observable_settings.py +13 -22
  720. cirq/work/observable_settings_test.py +9 -7
  721. cirq/work/pauli_sum_collector.py +12 -10
  722. cirq/work/pauli_sum_collector_test.py +9 -9
  723. cirq/work/sampler.py +42 -43
  724. cirq/work/sampler_test.py +31 -24
  725. cirq/work/zeros_sampler.py +6 -4
  726. cirq/work/zeros_sampler_test.py +7 -5
  727. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
  728. cirq_core-1.6.0.dist-info/RECORD +1241 -0
  729. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Optional
15
+ from __future__ import annotations
16
16
 
17
17
  import numpy as np
18
18
  import pytest
@@ -38,7 +38,7 @@ def assert_optimizes(before: cirq.Circuit, expected: cirq.Circuit, **kwargs):
38
38
 
39
39
 
40
40
  def assert_optimization_not_broken(
41
- circuit: cirq.Circuit, required_sqrt_iswap_count: Optional[int] = None
41
+ circuit: cirq.Circuit, required_sqrt_iswap_count: int | None = None
42
42
  ):
43
43
  c_new = cirq.optimize_for_target_gateset(
44
44
  circuit,
@@ -60,7 +60,7 @@ def assert_optimization_not_broken(
60
60
  )
61
61
 
62
62
 
63
- def test_convert_to_sqrt_iswap_preserving_moment_structure():
63
+ def test_convert_to_sqrt_iswap_preserving_moment_structure() -> None:
64
64
  q = cirq.LineQubit.range(5)
65
65
  op = lambda q0, q1: cirq.H(q1).controlled_by(q0)
66
66
  c_orig = cirq.Circuit(
@@ -112,7 +112,7 @@ def test_convert_to_sqrt_iswap_preserving_moment_structure():
112
112
  ],
113
113
  )
114
114
  @pytest.mark.parametrize('use_sqrt_iswap_inv', [True, False])
115
- def test_two_qubit_gates_with_symbols(gate: cirq.Gate, use_sqrt_iswap_inv: bool):
115
+ def test_two_qubit_gates_with_symbols(gate: cirq.Gate, use_sqrt_iswap_inv: bool) -> None:
116
116
  # Note that even though these gates are not natively supported by
117
117
  # `cirq.parameterized_2q_op_to_sqrt_iswap_operations`, the transformation succeeds because
118
118
  # `cirq.optimize_for_target_gateset` also relies on `cirq.decompose` as a fallback.
@@ -142,12 +142,12 @@ def test_two_qubit_gates_with_symbols(gate: cirq.Gate, use_sqrt_iswap_inv: bool)
142
142
  )
143
143
 
144
144
 
145
- def test_sqrt_iswap_gateset_raises():
145
+ def test_sqrt_iswap_gateset_raises() -> None:
146
146
  with pytest.raises(ValueError, match="`required_sqrt_iswap_count` must be 0, 1, 2, or 3"):
147
147
  _ = cirq.SqrtIswapTargetGateset(required_sqrt_iswap_count=4)
148
148
 
149
149
 
150
- def test_sqrt_iswap_gateset_eq():
150
+ def test_sqrt_iswap_gateset_eq() -> None:
151
151
  eq = cirq.testing.EqualsTester()
152
152
  eq.add_equality_group(
153
153
  cirq.SqrtIswapTargetGateset(), cirq.SqrtIswapTargetGateset(use_sqrt_iswap_inv=False)
@@ -179,11 +179,11 @@ def test_sqrt_iswap_gateset_eq():
179
179
  cirq.SqrtIswapTargetGateset(additional_gates=()),
180
180
  ],
181
181
  )
182
- def test_sqrt_iswap_gateset_repr(gateset):
182
+ def test_sqrt_iswap_gateset_repr(gateset) -> None:
183
183
  cirq.testing.assert_equivalent_repr(gateset)
184
184
 
185
185
 
186
- def test_simplifies_sqrt_iswap():
186
+ def test_simplifies_sqrt_iswap() -> None:
187
187
  a, b = cirq.LineQubit.range(2)
188
188
  assert_optimizes(
189
189
  before=cirq.Circuit(
@@ -204,7 +204,7 @@ def test_simplifies_sqrt_iswap():
204
204
  )
205
205
 
206
206
 
207
- def test_simplifies_sqrt_iswap_inv():
207
+ def test_simplifies_sqrt_iswap_inv() -> None:
208
208
  a, b = cirq.LineQubit.range(2)
209
209
  assert_optimizes(
210
210
  use_sqrt_iswap_inv=True,
@@ -226,7 +226,7 @@ def test_simplifies_sqrt_iswap_inv():
226
226
  )
227
227
 
228
228
 
229
- def test_works_with_tags():
229
+ def test_works_with_tags() -> None:
230
230
  a, b = cirq.LineQubit.range(2)
231
231
  assert_optimizes(
232
232
  before=cirq.Circuit(
@@ -240,7 +240,7 @@ def test_works_with_tags():
240
240
  )
241
241
 
242
242
 
243
- def test_no_touch_single_sqrt_iswap():
243
+ def test_no_touch_single_sqrt_iswap() -> None:
244
244
  a, b = cirq.LineQubit.range(2)
245
245
  circuit = cirq.Circuit(
246
246
  [
@@ -252,7 +252,7 @@ def test_no_touch_single_sqrt_iswap():
252
252
  assert_optimizes(before=circuit, expected=circuit)
253
253
 
254
254
 
255
- def test_no_touch_single_sqrt_iswap_inv():
255
+ def test_no_touch_single_sqrt_iswap_inv() -> None:
256
256
  a, b = cirq.LineQubit.range(2)
257
257
  circuit = cirq.Circuit(
258
258
  [
@@ -264,19 +264,19 @@ def test_no_touch_single_sqrt_iswap_inv():
264
264
  assert_optimizes(before=circuit, expected=circuit, use_sqrt_iswap_inv=True)
265
265
 
266
266
 
267
- def test_cnots_separated_by_single_gates_correct():
267
+ def test_cnots_separated_by_single_gates_correct() -> None:
268
268
  a, b = cirq.LineQubit.range(2)
269
269
  assert_optimization_not_broken(cirq.Circuit(cirq.CNOT(a, b), cirq.H(b), cirq.CNOT(a, b)))
270
270
 
271
271
 
272
- def test_czs_separated_by_single_gates_correct():
272
+ def test_czs_separated_by_single_gates_correct() -> None:
273
273
  a, b = cirq.LineQubit.range(2)
274
274
  assert_optimization_not_broken(
275
275
  cirq.Circuit(cirq.CZ(a, b), cirq.X(b), cirq.X(b), cirq.X(b), cirq.CZ(a, b))
276
276
  )
277
277
 
278
278
 
279
- def test_inefficient_circuit_correct():
279
+ def test_inefficient_circuit_correct() -> None:
280
280
  t = 0.1
281
281
  v = 0.11
282
282
  a, b = cirq.LineQubit.range(2)
@@ -301,7 +301,7 @@ def test_inefficient_circuit_correct():
301
301
  )
302
302
 
303
303
 
304
- def test_optimizes_single_iswap():
304
+ def test_optimizes_single_iswap() -> None:
305
305
  a, b = cirq.LineQubit.range(2)
306
306
  c = cirq.Circuit(cirq.ISWAP(a, b))
307
307
  assert_optimization_not_broken(c)
@@ -311,7 +311,7 @@ def test_optimizes_single_iswap():
311
311
  assert len([1 for op in c.all_operations() if len(op.qubits) == 2]) == 2
312
312
 
313
313
 
314
- def test_optimizes_single_inv_sqrt_iswap():
314
+ def test_optimizes_single_inv_sqrt_iswap() -> None:
315
315
  a, b = cirq.LineQubit.range(2)
316
316
  c = cirq.Circuit(cirq.SQRT_ISWAP_INV(a, b))
317
317
  assert_optimization_not_broken(c)
@@ -321,7 +321,7 @@ def test_optimizes_single_inv_sqrt_iswap():
321
321
  assert len([1 for op in c.all_operations() if len(op.qubits) == 2]) == 1
322
322
 
323
323
 
324
- def test_optimizes_single_iswap_require0():
324
+ def test_optimizes_single_iswap_require0() -> None:
325
325
  a, b = cirq.LineQubit.range(2)
326
326
  c = cirq.Circuit(cirq.CNOT(a, b), cirq.CNOT(a, b)) # Minimum 0 sqrt-iSWAP
327
327
  assert_optimization_not_broken(c, required_sqrt_iswap_count=0)
@@ -331,7 +331,7 @@ def test_optimizes_single_iswap_require0():
331
331
  assert len([1 for op in c.all_operations() if len(op.qubits) == 2]) == 0
332
332
 
333
333
 
334
- def test_optimizes_single_iswap_require0_raises():
334
+ def test_optimizes_single_iswap_require0_raises() -> None:
335
335
  a, b = cirq.LineQubit.range(2)
336
336
  c = cirq.Circuit(cirq.CNOT(a, b)) # Minimum 2 sqrt-iSWAP
337
337
  with pytest.raises(ValueError, match='cannot be decomposed into exactly 0 sqrt-iSWAP gates'):
@@ -342,7 +342,7 @@ def test_optimizes_single_iswap_require0_raises():
342
342
  )
343
343
 
344
344
 
345
- def test_optimizes_single_iswap_require1():
345
+ def test_optimizes_single_iswap_require1() -> None:
346
346
  a, b = cirq.LineQubit.range(2)
347
347
  c = cirq.Circuit(cirq.SQRT_ISWAP_INV(a, b)) # Minimum 1 sqrt-iSWAP
348
348
  assert_optimization_not_broken(c, required_sqrt_iswap_count=1)
@@ -352,7 +352,7 @@ def test_optimizes_single_iswap_require1():
352
352
  assert len([1 for op in c.all_operations() if len(op.qubits) == 2]) == 1
353
353
 
354
354
 
355
- def test_optimizes_single_iswap_require1_raises():
355
+ def test_optimizes_single_iswap_require1_raises() -> None:
356
356
  a, b = cirq.LineQubit.range(2)
357
357
  c = cirq.Circuit(cirq.CNOT(a, b)) # Minimum 2 sqrt-iSWAP
358
358
  with pytest.raises(ValueError, match='cannot be decomposed into exactly 1 sqrt-iSWAP gates'):
@@ -363,7 +363,7 @@ def test_optimizes_single_iswap_require1_raises():
363
363
  )
364
364
 
365
365
 
366
- def test_optimizes_single_iswap_require2():
366
+ def test_optimizes_single_iswap_require2() -> None:
367
367
  a, b = cirq.LineQubit.range(2)
368
368
  c = cirq.Circuit(cirq.SQRT_ISWAP_INV(a, b)) # Minimum 1 sqrt-iSWAP but 2 possible
369
369
  assert_optimization_not_broken(c, required_sqrt_iswap_count=2)
@@ -373,7 +373,7 @@ def test_optimizes_single_iswap_require2():
373
373
  assert len([1 for op in c.all_operations() if len(op.qubits) == 2]) == 2
374
374
 
375
375
 
376
- def test_optimizes_single_iswap_require2_raises():
376
+ def test_optimizes_single_iswap_require2_raises() -> None:
377
377
  a, b = cirq.LineQubit.range(2)
378
378
  c = cirq.Circuit(cirq.SWAP(a, b)) # Minimum 3 sqrt-iSWAP
379
379
  with pytest.raises(ValueError, match='cannot be decomposed into exactly 2 sqrt-iSWAP gates'):
@@ -384,7 +384,7 @@ def test_optimizes_single_iswap_require2_raises():
384
384
  )
385
385
 
386
386
 
387
- def test_optimizes_single_iswap_require3():
387
+ def test_optimizes_single_iswap_require3() -> None:
388
388
  a, b = cirq.LineQubit.range(2)
389
389
  c = cirq.Circuit(cirq.ISWAP(a, b)) # Minimum 2 sqrt-iSWAP but 3 possible
390
390
  assert_optimization_not_broken(c, required_sqrt_iswap_count=3)
@@ -394,7 +394,7 @@ def test_optimizes_single_iswap_require3():
394
394
  assert len([1 for op in c.all_operations() if len(op.qubits) == 2]) == 3
395
395
 
396
396
 
397
- def test_optimizes_single_inv_sqrt_iswap_require3():
397
+ def test_optimizes_single_inv_sqrt_iswap_require3() -> None:
398
398
  a, b = cirq.LineQubit.range(2)
399
399
  c = cirq.Circuit(cirq.SQRT_ISWAP_INV(a, b))
400
400
  assert_optimization_not_broken(c, required_sqrt_iswap_count=3)
@@ -14,25 +14,14 @@
14
14
 
15
15
  """Defines the API for circuit transformers in Cirq."""
16
16
 
17
+ from __future__ import annotations
18
+
17
19
  import dataclasses
18
20
  import enum
19
21
  import functools
20
22
  import inspect
21
23
  import textwrap
22
- from typing import (
23
- Any,
24
- Callable,
25
- cast,
26
- Hashable,
27
- List,
28
- Optional,
29
- overload,
30
- Tuple,
31
- Type,
32
- TYPE_CHECKING,
33
- TypeVar,
34
- Union,
35
- )
24
+ from typing import Any, Callable, cast, Hashable, overload, TYPE_CHECKING, TypeVar
36
25
 
37
26
  from typing_extensions import Protocol
38
27
 
@@ -83,10 +72,10 @@ class _LoggerNode:
83
72
 
84
73
  transformer_id: int
85
74
  transformer_name: str
86
- initial_circuit: 'cirq.AbstractCircuit'
87
- final_circuit: 'cirq.AbstractCircuit'
88
- logs: List[Tuple[LogLevel, Tuple[str, ...]]] = dataclasses.field(default_factory=list)
89
- nested_loggers: List[int] = dataclasses.field(default_factory=list)
75
+ initial_circuit: cirq.AbstractCircuit
76
+ final_circuit: cirq.AbstractCircuit
77
+ logs: list[tuple[LogLevel, tuple[str, ...]]] = dataclasses.field(default_factory=list)
78
+ nested_loggers: list[int] = dataclasses.field(default_factory=list)
90
79
 
91
80
 
92
81
  class TransformerLogger:
@@ -99,8 +88,8 @@ class TransformerLogger:
99
88
 
100
89
  The logger assumes that
101
90
  - Transformers are run sequentially.
102
- - Nested transformers are allowed, in which case the behavior would be similar to a
103
- doing a depth first search on the graph of transformers -- i.e. the top level transformer
91
+ - Nested transformers are allowed, in which case the behavior would be similar to
92
+ doing a depth-first search on the graph of transformers -- i.e. the top level transformer
104
93
  would end (i.e. receive a `register_final` call) once all nested transformers (i.e. all
105
94
  `register_initial` calls received while the top level transformer was active) have
106
95
  finished (i.e. corresponding `register_final` calls have also been received).
@@ -113,10 +102,10 @@ class TransformerLogger:
113
102
  def __init__(self) -> None:
114
103
  """Initializes TransformerLogger."""
115
104
  self._curr_id: int = 0
116
- self._logs: List[_LoggerNode] = []
117
- self._stack: List[int] = []
105
+ self._logs: list[_LoggerNode] = []
106
+ self._stack: list[int] = []
118
107
 
119
- def register_initial(self, circuit: 'cirq.AbstractCircuit', transformer_name: str) -> None:
108
+ def register_initial(self, circuit: cirq.AbstractCircuit, transformer_name: str) -> None:
120
109
  """Register the beginning of a new transformer stage.
121
110
 
122
111
  Args:
@@ -143,7 +132,7 @@ class TransformerLogger:
143
132
  raise ValueError('No active transformer found.')
144
133
  self._logs[self._stack[-1]].logs.append((level, args))
145
134
 
146
- def register_final(self, circuit: 'cirq.AbstractCircuit', transformer_name: str) -> None:
135
+ def register_final(self, circuit: cirq.AbstractCircuit, transformer_name: str) -> None:
147
136
  """Register the end of the currently active transformer stage.
148
137
 
149
138
  Args:
@@ -195,13 +184,13 @@ class TransformerLogger:
195
184
  class NoOpTransformerLogger(TransformerLogger):
196
185
  """All calls to this logger are a no-op"""
197
186
 
198
- def register_initial(self, circuit: 'cirq.AbstractCircuit', transformer_name: str) -> None:
187
+ def register_initial(self, circuit: cirq.AbstractCircuit, transformer_name: str) -> None:
199
188
  pass
200
189
 
201
190
  def log(self, *args: str, level: LogLevel = LogLevel.INFO) -> None:
202
191
  pass
203
192
 
204
- def register_final(self, circuit: 'cirq.AbstractCircuit', transformer_name: str) -> None:
193
+ def register_final(self, circuit: cirq.AbstractCircuit, transformer_name: str) -> None:
205
194
  pass
206
195
 
207
196
  def show(self, level: LogLevel = LogLevel.INFO) -> None:
@@ -225,7 +214,7 @@ class TransformerContext:
225
214
  """
226
215
 
227
216
  logger: TransformerLogger = NoOpTransformerLogger()
228
- tags_to_ignore: Tuple[Hashable, ...] = ()
217
+ tags_to_ignore: tuple[Hashable, ...] = ()
229
218
  deep: bool = False
230
219
 
231
220
 
@@ -242,7 +231,7 @@ class TRANSFORMER(Protocol):
242
231
  >>> def convert_to_cz(
243
232
  ... circuit: cirq.AbstractCircuit,
244
233
  ... *,
245
- ... context: 'Optional[cirq.TransformerContext]' = None,
234
+ ... context: cirq.TransformerContext | None = None,
246
235
  ... atol: float = 1e-8,
247
236
  ... ) -> cirq.Circuit:
248
237
  ... ...
@@ -256,21 +245,19 @@ class TRANSFORMER(Protocol):
256
245
  ... self,
257
246
  ... circuit: cirq.AbstractCircuit,
258
247
  ... *,
259
- ... context: 'Optional[cirq.TransformerContext]' = None,
248
+ ... context: cirq.TransformerContext | None = None,
260
249
  ... ) -> cirq.AbstractCircuit:
261
250
  ... ...
262
251
  """
263
252
 
264
253
  def __call__(
265
- self, circuit: 'cirq.AbstractCircuit', *, context: Optional[TransformerContext] = None
266
- ) -> 'cirq.AbstractCircuit': ...
254
+ self, circuit: cirq.AbstractCircuit, *, context: TransformerContext | None = None
255
+ ) -> cirq.AbstractCircuit: ...
267
256
 
268
257
 
269
258
  _TRANSFORMER_T = TypeVar('_TRANSFORMER_T', bound=TRANSFORMER)
270
- _TRANSFORMER_CLS_T = TypeVar('_TRANSFORMER_CLS_T', bound=Type[TRANSFORMER])
271
- _TRANSFORMER_OR_CLS_T = TypeVar(
272
- '_TRANSFORMER_OR_CLS_T', bound=Union[TRANSFORMER, Type[TRANSFORMER]]
273
- )
259
+ _TRANSFORMER_CLS_T = TypeVar('_TRANSFORMER_CLS_T', bound=type[TRANSFORMER])
260
+ _TRANSFORMER_OR_CLS_T = TypeVar('_TRANSFORMER_OR_CLS_T', bound=TRANSFORMER | type[TRANSFORMER])
274
261
 
275
262
 
276
263
  @overload
@@ -301,7 +288,7 @@ def transformer(cls_or_func: Any = None, *, add_deep_support: bool = False) -> A
301
288
 
302
289
  >>> @cirq.transformer
303
290
  ... def convert_to_cz(
304
- ... circuit: cirq.AbstractCircuit, *, context: 'Optional[cirq.TransformerContext]' = None
291
+ ... circuit: cirq.AbstractCircuit, *, context: cirq.TransformerContext | None = None
305
292
  ... ) -> cirq.Circuit:
306
293
  ... ...
307
294
 
@@ -315,7 +302,7 @@ def transformer(cls_or_func: Any = None, *, add_deep_support: bool = False) -> A
315
302
  ... self,
316
303
  ... circuit: cirq.AbstractCircuit,
317
304
  ... *,
318
- ... context: 'Optional[cirq.TransformerContext]' = None,
305
+ ... context: cirq.TransformerContext | None = None,
319
306
  ... ) -> cirq.Circuit:
320
307
  ... ...
321
308
 
@@ -326,7 +313,7 @@ def transformer(cls_or_func: Any = None, *, add_deep_support: bool = False) -> A
326
313
  ... def convert_to_sqrt_iswap(
327
314
  ... circuit: cirq.AbstractCircuit,
328
315
  ... *,
329
- ... context: 'Optional[cirq.TransformerContext]' = None,
316
+ ... context: cirq.TransformerContext | None = None,
330
317
  ... atol: float = 1e-8,
331
318
  ... sqrt_iswap_gate: cirq.ISwapPowGate = cirq.SQRT_ISWAP_INV,
332
319
  ... cleanup_operations: bool = True,
@@ -357,8 +344,8 @@ def transformer(cls_or_func: Any = None, *, add_deep_support: bool = False) -> A
357
344
 
358
345
  @functools.wraps(method)
359
346
  def method_with_logging(
360
- self, circuit: 'cirq.AbstractCircuit', **kwargs
361
- ) -> 'cirq.AbstractCircuit':
347
+ self, circuit: cirq.AbstractCircuit, **kwargs
348
+ ) -> cirq.AbstractCircuit:
362
349
  return _transform_and_log(
363
350
  add_deep_support,
364
351
  lambda circuit, **kwargs: method(self, circuit, **kwargs),
@@ -376,7 +363,7 @@ def transformer(cls_or_func: Any = None, *, add_deep_support: bool = False) -> A
376
363
  default_context = _get_default_context(func)
377
364
 
378
365
  @functools.wraps(func)
379
- def func_with_logging(circuit: 'cirq.AbstractCircuit', **kwargs) -> 'cirq.AbstractCircuit':
366
+ def func_with_logging(circuit: cirq.AbstractCircuit, **kwargs) -> cirq.AbstractCircuit:
380
367
  return _transform_and_log(
381
368
  add_deep_support,
382
369
  func,
@@ -401,10 +388,10 @@ def _get_default_context(func: TRANSFORMER) -> TransformerContext:
401
388
  def _run_transformer_on_circuit(
402
389
  add_deep_support: bool,
403
390
  func: TRANSFORMER,
404
- circuit: 'cirq.AbstractCircuit',
405
- extracted_context: Optional[TransformerContext],
391
+ circuit: cirq.AbstractCircuit,
392
+ extracted_context: TransformerContext | None,
406
393
  **kwargs,
407
- ) -> 'cirq.AbstractCircuit':
394
+ ) -> cirq.AbstractCircuit:
408
395
  mutable_circuit = None
409
396
  if extracted_context and extracted_context.deep and add_deep_support:
410
397
  batch_replace = []
@@ -429,10 +416,10 @@ def _transform_and_log(
429
416
  add_deep_support: bool,
430
417
  func: TRANSFORMER,
431
418
  transformer_name: str,
432
- circuit: 'cirq.AbstractCircuit',
433
- extracted_context: Optional[TransformerContext],
419
+ circuit: cirq.AbstractCircuit,
420
+ extracted_context: TransformerContext | None,
434
421
  **kwargs,
435
- ) -> 'cirq.AbstractCircuit':
422
+ ) -> cirq.AbstractCircuit:
436
423
  """Helper to log initial and final circuits before and after calling the transformer."""
437
424
  if extracted_context:
438
425
  extracted_context.logger.register_initial(circuit, transformer_name)
@@ -12,7 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Optional
15
+ from __future__ import annotations
16
+
16
17
  from unittest import mock
17
18
 
18
19
  import pytest
@@ -27,7 +28,7 @@ class MockTransformerClass:
27
28
  self.mock = mock.Mock()
28
29
 
29
30
  def __call__(
30
- self, circuit: cirq.AbstractCircuit, *, context: Optional[cirq.TransformerContext] = None
31
+ self, circuit: cirq.AbstractCircuit, *, context: cirq.TransformerContext | None = None
31
32
  ) -> cirq.Circuit:
32
33
  self.mock(circuit, context)
33
34
  return circuit.unfreeze()
@@ -51,7 +52,7 @@ class MockTransformerClassWithDefaults:
51
52
  self,
52
53
  circuit: cirq.AbstractCircuit,
53
54
  *,
54
- context: Optional[cirq.TransformerContext] = cirq.TransformerContext(),
55
+ context: cirq.TransformerContext | None = cirq.TransformerContext(),
55
56
  atol: float = 1e-4,
56
57
  custom_arg: CustomArg = CustomArg(),
57
58
  ) -> cirq.AbstractCircuit:
@@ -71,7 +72,7 @@ def make_transformer_func_with_defaults() -> cirq.TRANSFORMER:
71
72
  def func(
72
73
  circuit: cirq.AbstractCircuit,
73
74
  *,
74
- context: Optional[cirq.TransformerContext] = cirq.TransformerContext(),
75
+ context: cirq.TransformerContext | None = cirq.TransformerContext(),
75
76
  atol: float = 1e-4,
76
77
  custom_arg: CustomArg = CustomArg(),
77
78
  ) -> cirq.FrozenCircuit:
@@ -87,7 +88,7 @@ def make_transformer_func(add_deep_support: bool = False) -> cirq.TRANSFORMER:
87
88
 
88
89
  @cirq.transformer(add_deep_support=add_deep_support)
89
90
  def mock_tranformer_func(
90
- circuit: cirq.AbstractCircuit, *, context: Optional[cirq.TransformerContext] = None
91
+ circuit: cirq.AbstractCircuit, *, context: cirq.TransformerContext | None = None
91
92
  ) -> cirq.Circuit:
92
93
  my_mock(circuit, context)
93
94
  return circuit.unfreeze()
@@ -177,7 +178,7 @@ def test_transformer_decorator_adds_support_for_deep(transformer, supports_deep)
177
178
  @cirq.transformer
178
179
  class T1:
179
180
  def __call__(
180
- self, circuit: cirq.AbstractCircuit, context: Optional[cirq.TransformerContext] = None
181
+ self, circuit: cirq.AbstractCircuit, context: cirq.TransformerContext | None = None
181
182
  ) -> cirq.AbstractCircuit:
182
183
  assert context is not None
183
184
  context.logger.log("First Verbose Log", "of T1", level=LogLevel.DEBUG)
@@ -191,7 +192,7 @@ t1 = T1()
191
192
 
192
193
  @cirq.transformer
193
194
  def t2(
194
- circuit: cirq.AbstractCircuit, context: Optional[cirq.TransformerContext] = None
195
+ circuit: cirq.AbstractCircuit, context: cirq.TransformerContext | None = None
195
196
  ) -> cirq.FrozenCircuit:
196
197
  assert context is not None
197
198
  context.logger.log("First INFO Log", "of T2 Start")
@@ -202,7 +203,7 @@ def t2(
202
203
 
203
204
  @cirq.transformer
204
205
  def t3(
205
- circuit: cirq.AbstractCircuit, context: Optional[cirq.TransformerContext] = None
206
+ circuit: cirq.AbstractCircuit, context: cirq.TransformerContext | None = None
206
207
  ) -> cirq.Circuit:
207
208
  assert context is not None
208
209
  context.logger.log("First INFO Log", "of T3 Start")