cirq-core 1.5.0.dev20250409222543__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.dev20250409222543.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.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409222543.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
cirq/ops/clifford_gate.py CHANGED
@@ -12,10 +12,12 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import functools
16
18
  from dataclasses import dataclass
17
19
  from types import NotImplementedType
18
- from typing import Any, Dict, List, Optional, Sequence, Tuple, TYPE_CHECKING, Union
20
+ from typing import Any, Sequence, TYPE_CHECKING
19
21
 
20
22
  import numpy as np
21
23
 
@@ -34,7 +36,7 @@ sim = LazyLoader("sim", globals(), "cirq.sim")
34
36
  transformers = LazyLoader("transformers", globals(), "cirq.transformers")
35
37
 
36
38
 
37
- def _to_pauli_tuple(matrix: np.ndarray) -> Optional[Tuple[Pauli, bool]]:
39
+ def _to_pauli_tuple(matrix: np.ndarray) -> tuple[Pauli, bool] | None:
38
40
  """Converts matrix to Pauli gate.
39
41
 
40
42
  If matrix is not ±Pauli matrix, returns None.
@@ -49,10 +51,10 @@ def _to_pauli_tuple(matrix: np.ndarray) -> Optional[Tuple[Pauli, bool]]:
49
51
 
50
52
 
51
53
  def _to_clifford_tableau(
52
- rotation_map: Optional[Dict[Pauli, Tuple[Pauli, bool]]] = None,
54
+ rotation_map: dict[Pauli, tuple[Pauli, bool]] | None = None,
53
55
  *,
54
- x_to: Optional[Tuple[Pauli, bool]] = None,
55
- z_to: Optional[Tuple[Pauli, bool]] = None,
56
+ x_to: tuple[Pauli, bool] | None = None,
57
+ z_to: tuple[Pauli, bool] | None = None,
56
58
  ) -> qis.CliffordTableau:
57
59
  """Transfer the rotation map to clifford tableau representation"""
58
60
  if x_to is None and z_to is None and rotation_map is None:
@@ -79,11 +81,11 @@ def _to_clifford_tableau(
79
81
 
80
82
  def _validate_map_input(
81
83
  required_transform_count: int,
82
- pauli_map_to: Optional[Dict[Pauli, Tuple[Pauli, bool]]],
83
- x_to: Optional[Tuple[Pauli, bool]],
84
- y_to: Optional[Tuple[Pauli, bool]],
85
- z_to: Optional[Tuple[Pauli, bool]],
86
- ) -> Dict[Pauli, Tuple[Pauli, bool]]:
84
+ pauli_map_to: dict[Pauli, tuple[Pauli, bool]] | None,
85
+ x_to: tuple[Pauli, bool] | None,
86
+ y_to: tuple[Pauli, bool] | None,
87
+ z_to: tuple[Pauli, bool] | None,
88
+ ) -> dict[Pauli, tuple[Pauli, bool]]:
87
89
  if pauli_map_to is None:
88
90
  xyz_to = {pauli_gates.X: x_to, pauli_gates.Y: y_to, pauli_gates.Z: z_to}
89
91
  pauli_map_to = {p: trans for p, trans in xyz_to.items() if trans is not None}
@@ -108,7 +110,7 @@ def _validate_map_input(
108
110
 
109
111
 
110
112
  def _pad_tableau(
111
- clifford_tableau: qis.CliffordTableau, num_qubits_after_padding: int, axes: List[int]
113
+ clifford_tableau: qis.CliffordTableau, num_qubits_after_padding: int, axes: list[int]
112
114
  ) -> qis.CliffordTableau:
113
115
  """Roughly, this function copies self.tableau into the "identity" matrix."""
114
116
  # Sanity check
@@ -136,7 +138,7 @@ class CommonCliffordGateMetaClass(value.ABCMetaImplementAnyOneOf):
136
138
  # These are class properties so we define them as properties on a metaclass.
137
139
 
138
140
  @property
139
- def all_single_qubit_cliffords(cls) -> Sequence['cirq.SingleQubitCliffordGate']:
141
+ def all_single_qubit_cliffords(cls) -> Sequence[cirq.SingleQubitCliffordGate]:
140
142
  """All 24 single-qubit Clifford gates."""
141
143
  if not hasattr(cls, '_all_single_qubit_cliffords'):
142
144
  pX = (pauli_gates.X, False)
@@ -187,31 +189,31 @@ class CommonCliffordGateMetaClass(value.ABCMetaImplementAnyOneOf):
187
189
  return cls._all_single_qubit_cliffords
188
190
 
189
191
  @property
190
- def I(cls) -> 'cirq.SingleQubitCliffordGate':
192
+ def I(cls) -> cirq.SingleQubitCliffordGate:
191
193
  return cls.all_single_qubit_cliffords[0]
192
194
 
193
195
  @property
194
- def X(cls) -> 'cirq.SingleQubitCliffordGate':
196
+ def X(cls) -> cirq.SingleQubitCliffordGate:
195
197
  return cls.all_single_qubit_cliffords[1]
196
198
 
197
199
  @property
198
- def Y(cls) -> 'cirq.SingleQubitCliffordGate':
200
+ def Y(cls) -> cirq.SingleQubitCliffordGate:
199
201
  return cls.all_single_qubit_cliffords[2]
200
202
 
201
203
  @property
202
- def Z(cls) -> 'cirq.SingleQubitCliffordGate':
204
+ def Z(cls) -> cirq.SingleQubitCliffordGate:
203
205
  return cls.all_single_qubit_cliffords[3]
204
206
 
205
207
  @property
206
- def H(cls) -> 'cirq.SingleQubitCliffordGate':
208
+ def H(cls) -> cirq.SingleQubitCliffordGate:
207
209
  return cls.all_single_qubit_cliffords[10]
208
210
 
209
211
  @property
210
- def S(cls) -> 'cirq.SingleQubitCliffordGate':
212
+ def S(cls) -> cirq.SingleQubitCliffordGate:
211
213
  return cls.all_single_qubit_cliffords[6]
212
214
 
213
215
  @property
214
- def CNOT(cls) -> 'cirq.CliffordGate':
216
+ def CNOT(cls) -> cirq.CliffordGate:
215
217
  if not hasattr(cls, '_CNOT'):
216
218
  t = qis.CliffordTableau(num_qubits=2)
217
219
  t.xs = np.array([[1, 1], [0, 1], [0, 0], [0, 0]])
@@ -220,7 +222,7 @@ class CommonCliffordGateMetaClass(value.ABCMetaImplementAnyOneOf):
220
222
  return cls._CNOT
221
223
 
222
224
  @property
223
- def CZ(cls) -> 'cirq.CliffordGate':
225
+ def CZ(cls) -> cirq.CliffordGate:
224
226
  if not hasattr(cls, '_CZ'):
225
227
  t = qis.CliffordTableau(num_qubits=2)
226
228
  t.xs = np.array([[1, 0], [0, 1], [0, 0], [0, 0]])
@@ -229,7 +231,7 @@ class CommonCliffordGateMetaClass(value.ABCMetaImplementAnyOneOf):
229
231
  return cls._CZ
230
232
 
231
233
  @property
232
- def SWAP(cls) -> 'cirq.CliffordGate':
234
+ def SWAP(cls) -> cirq.CliffordGate:
233
235
  if not hasattr(cls, '_SWAP'):
234
236
  t = qis.CliffordTableau(num_qubits=2)
235
237
  t.xs = np.array([[0, 1], [1, 0], [0, 0], [0, 0]])
@@ -238,33 +240,33 @@ class CommonCliffordGateMetaClass(value.ABCMetaImplementAnyOneOf):
238
240
  return cls._SWAP
239
241
 
240
242
  @property
241
- def X_sqrt(cls) -> 'cirq.SingleQubitCliffordGate':
243
+ def X_sqrt(cls) -> cirq.SingleQubitCliffordGate:
242
244
  return cls.all_single_qubit_cliffords[4]
243
245
 
244
246
  @property
245
- def X_nsqrt(cls) -> 'cirq.SingleQubitCliffordGate':
247
+ def X_nsqrt(cls) -> cirq.SingleQubitCliffordGate:
246
248
  return cls.all_single_qubit_cliffords[7]
247
249
 
248
250
  @property
249
- def Y_sqrt(cls) -> 'cirq.SingleQubitCliffordGate':
251
+ def Y_sqrt(cls) -> cirq.SingleQubitCliffordGate:
250
252
  return cls.all_single_qubit_cliffords[5]
251
253
 
252
254
  @property
253
- def Y_nsqrt(cls) -> 'cirq.SingleQubitCliffordGate':
255
+ def Y_nsqrt(cls) -> cirq.SingleQubitCliffordGate:
254
256
  return cls.all_single_qubit_cliffords[8]
255
257
 
256
258
  @property
257
- def Z_sqrt(cls) -> 'cirq.SingleQubitCliffordGate':
259
+ def Z_sqrt(cls) -> cirq.SingleQubitCliffordGate:
258
260
  return cls.all_single_qubit_cliffords[6]
259
261
 
260
262
  @property
261
- def Z_nsqrt(cls) -> 'cirq.SingleQubitCliffordGate':
263
+ def Z_nsqrt(cls) -> cirq.SingleQubitCliffordGate:
262
264
  return cls.all_single_qubit_cliffords[9]
263
265
 
264
266
 
265
267
  class CommonCliffordGates(metaclass=CommonCliffordGateMetaClass):
266
268
  @classmethod
267
- def from_clifford_tableau(cls, tableau: qis.CliffordTableau) -> 'CliffordGate':
269
+ def from_clifford_tableau(cls, tableau: qis.CliffordTableau) -> CliffordGate:
268
270
  """Create the CliffordGate instance from Clifford Tableau.
269
271
 
270
272
  Args:
@@ -293,7 +295,7 @@ class CommonCliffordGates(metaclass=CommonCliffordGateMetaClass):
293
295
  @classmethod
294
296
  def from_op_list(
295
297
  cls, operations: Sequence[raw_types.Operation], qubit_order: Sequence[raw_types.Qid]
296
- ) -> 'CliffordGate':
298
+ ) -> CliffordGate:
297
299
  """Construct a new Clifford gates from several known operations.
298
300
 
299
301
  Args:
@@ -332,9 +334,7 @@ class CommonCliffordGates(metaclass=CommonCliffordGateMetaClass):
332
334
  return cls(_clifford_tableau=_clifford_tableau)
333
335
 
334
336
  @classmethod
335
- def _get_sqrt_map(
336
- cls,
337
- ) -> Dict[float, Dict['SingleQubitCliffordGate', 'SingleQubitCliffordGate']]:
337
+ def _get_sqrt_map(cls) -> dict[float, dict[SingleQubitCliffordGate, SingleQubitCliffordGate]]:
338
338
  """Returns a map containing two keys 0.5 and -0.5 for the sqrt mapping of Pauli gates."""
339
339
  return {
340
340
  0.5: {cls.X: cls.X_sqrt, cls.Y: cls.Y_sqrt, cls.Z: cls.Z_sqrt},
@@ -377,7 +377,7 @@ class CliffordGate(raw_types.Gate, CommonCliffordGates):
377
377
  def clifford_tableau(self):
378
378
  return self._clifford_tableau
379
379
 
380
- def _json_dict_(self) -> Dict[str, Any]:
380
+ def _json_dict_(self) -> dict[str, Any]:
381
381
  json_dict = self._clifford_tableau._json_dict_()
382
382
  return json_dict
383
383
 
@@ -387,11 +387,11 @@ class CliffordGate(raw_types.Gate, CommonCliffordGates):
387
387
  def _num_qubits_(self):
388
388
  return self.clifford_tableau.n
389
389
 
390
- def _has_stabilizer_effect_(self) -> Optional[bool]:
390
+ def _has_stabilizer_effect_(self) -> bool | None:
391
391
  # By definition, Clifford Gate should always return True.
392
392
  return True
393
393
 
394
- def __pow__(self, exponent: float) -> 'CliffordGate':
394
+ def __pow__(self, exponent: float) -> CliffordGate:
395
395
  if exponent != int(exponent):
396
396
  return NotImplemented # pragma: no cover
397
397
  exponent = int(exponent)
@@ -426,9 +426,7 @@ class CliffordGate(raw_types.Gate, CommonCliffordGates):
426
426
  def __repr__(self) -> str:
427
427
  return f"Clifford Gate with Tableau:\n{self.clifford_tableau._str_full_()}"
428
428
 
429
- def _commutes_(
430
- self, other: Any, *, atol: float = 1e-8
431
- ) -> Union[bool, NotImplementedType, None]:
429
+ def _commutes_(self, other: Any, *, atol: float = 1e-8) -> bool | NotImplementedType | None:
432
430
  # Note even if we assume two gates define the tableau based on the same qubit order,
433
431
  # the following approach cannot judge it:
434
432
  # self.clifford_tableau.then(other.clifford_tableau) == other.clifford_tableau.then(
@@ -438,14 +436,14 @@ class CliffordGate(raw_types.Gate, CommonCliffordGates):
438
436
  # it is because Clifford tableau ignores the global phase information.
439
437
  return NotImplemented # pragma: no cover
440
438
 
441
- def _decompose_(self, qubits: Sequence['cirq.Qid']) -> 'cirq.OP_TREE':
439
+ def _decompose_(self, qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
442
440
  return transformers.analytical_decompositions.decompose_clifford_tableau_to_operations(
443
441
  list(qubits), self.clifford_tableau
444
442
  )
445
443
 
446
444
  def _act_on_(
447
- self, sim_state: 'cirq.SimulationStateBase', qubits: Sequence['cirq.Qid']
448
- ) -> Union[NotImplementedType, bool]:
445
+ self, sim_state: cirq.SimulationStateBase, qubits: Sequence[cirq.Qid]
446
+ ) -> NotImplementedType | bool:
449
447
  # Note the computation complexity difference between _decompose_ and _act_on_.
450
448
  # Suppose this Gate has `m` qubits, args has `n` qubits, and the decomposition of
451
449
  # this operation into `k` operations:
@@ -481,7 +479,7 @@ class SingleQubitCliffordGate(CliffordGate):
481
479
 
482
480
  @staticmethod
483
481
  @functools.cache
484
- def from_clifford_tableau(tableau: qis.CliffordTableau) -> 'SingleQubitCliffordGate':
482
+ def from_clifford_tableau(tableau: qis.CliffordTableau) -> SingleQubitCliffordGate:
485
483
  if not isinstance(tableau, qis.CliffordTableau):
486
484
  raise ValueError('Input argument has to be a CliffordTableau instance.')
487
485
  if not tableau._validate():
@@ -493,9 +491,7 @@ class SingleQubitCliffordGate(CliffordGate):
493
491
  return SingleQubitCliffordGate(_clifford_tableau=tableau)
494
492
 
495
493
  @staticmethod
496
- def from_xz_map(
497
- x_to: Tuple[Pauli, bool], z_to: Tuple[Pauli, bool]
498
- ) -> 'SingleQubitCliffordGate':
494
+ def from_xz_map(x_to: tuple[Pauli, bool], z_to: tuple[Pauli, bool]) -> SingleQubitCliffordGate:
499
495
  """Returns a SingleQubitCliffordGate for the specified transforms.
500
496
  The Y transform is derived from the X and Z.
501
497
 
@@ -509,12 +505,12 @@ class SingleQubitCliffordGate(CliffordGate):
509
505
 
510
506
  @staticmethod
511
507
  def from_single_map(
512
- pauli_map_to: Optional[Dict[Pauli, Tuple[Pauli, bool]]] = None,
508
+ pauli_map_to: dict[Pauli, tuple[Pauli, bool]] | None = None,
513
509
  *,
514
- x_to: Optional[Tuple[Pauli, bool]] = None,
515
- y_to: Optional[Tuple[Pauli, bool]] = None,
516
- z_to: Optional[Tuple[Pauli, bool]] = None,
517
- ) -> 'SingleQubitCliffordGate':
510
+ x_to: tuple[Pauli, bool] | None = None,
511
+ y_to: tuple[Pauli, bool] | None = None,
512
+ z_to: tuple[Pauli, bool] | None = None,
513
+ ) -> SingleQubitCliffordGate:
518
514
  """Returns a SingleQubitCliffordGate for the
519
515
  specified transform with a 90 or 180 degree rotation.
520
516
 
@@ -542,12 +538,12 @@ class SingleQubitCliffordGate(CliffordGate):
542
538
 
543
539
  @staticmethod
544
540
  def from_double_map(
545
- pauli_map_to: Optional[Dict[Pauli, Tuple[Pauli, bool]]] = None,
541
+ pauli_map_to: dict[Pauli, tuple[Pauli, bool]] | None = None,
546
542
  *,
547
- x_to: Optional[Tuple[Pauli, bool]] = None,
548
- y_to: Optional[Tuple[Pauli, bool]] = None,
549
- z_to: Optional[Tuple[Pauli, bool]] = None,
550
- ) -> 'SingleQubitCliffordGate':
543
+ x_to: tuple[Pauli, bool] | None = None,
544
+ y_to: tuple[Pauli, bool] | None = None,
545
+ z_to: tuple[Pauli, bool] | None = None,
546
+ ) -> SingleQubitCliffordGate:
551
547
  """Returns a SingleQubitCliffordGate for the
552
548
  specified transform with a 90 or 180 degree rotation.
553
549
 
@@ -570,7 +566,7 @@ class SingleQubitCliffordGate(CliffordGate):
570
566
  return SingleQubitCliffordGate.from_clifford_tableau(_to_clifford_tableau(rotation_map))
571
567
 
572
568
  @staticmethod
573
- def from_pauli(pauli: Pauli, sqrt: bool = False) -> 'SingleQubitCliffordGate':
569
+ def from_pauli(pauli: Pauli, sqrt: bool = False) -> SingleQubitCliffordGate:
574
570
  prev_pauli = Pauli.by_relative_index(pauli, -1)
575
571
  next_pauli = Pauli.by_relative_index(pauli, 1)
576
572
  if sqrt:
@@ -588,7 +584,7 @@ class SingleQubitCliffordGate(CliffordGate):
588
584
  return SingleQubitCliffordGate.from_clifford_tableau(_to_clifford_tableau(rotation_map))
589
585
 
590
586
  @staticmethod
591
- def from_quarter_turns(pauli: Pauli, quarter_turns: int) -> 'SingleQubitCliffordGate':
587
+ def from_quarter_turns(pauli: Pauli, quarter_turns: int) -> SingleQubitCliffordGate:
592
588
  quarter_turns = quarter_turns % 4
593
589
  if quarter_turns == 0:
594
590
  return SingleQubitCliffordGate.I
@@ -600,7 +596,7 @@ class SingleQubitCliffordGate(CliffordGate):
600
596
  return SingleQubitCliffordGate.from_pauli(pauli, True) ** -1
601
597
 
602
598
  @staticmethod
603
- def from_unitary(u: np.ndarray) -> Optional['SingleQubitCliffordGate']:
599
+ def from_unitary(u: np.ndarray) -> SingleQubitCliffordGate | None:
604
600
  """Creates Clifford gate with given unitary (up to global phase).
605
601
 
606
602
  Args:
@@ -626,7 +622,7 @@ class SingleQubitCliffordGate(CliffordGate):
626
622
  @classmethod
627
623
  def from_unitary_with_global_phase(
628
624
  cls, u: np.ndarray
629
- ) -> Optional[Tuple['SingleQubitCliffordGate', complex]]:
625
+ ) -> tuple[SingleQubitCliffordGate, complex] | None:
630
626
  """Creates Clifford gate with given unitary, including global phase.
631
627
 
632
628
  Args:
@@ -646,7 +642,7 @@ class SingleQubitCliffordGate(CliffordGate):
646
642
  k = max(np.ndindex(*u.shape), key=lambda t: abs(u[t]))
647
643
  return gate, u[k] / protocols.unitary(gate)[k]
648
644
 
649
- def pauli_tuple(self, pauli: Pauli) -> Tuple[Pauli, bool]:
645
+ def pauli_tuple(self, pauli: Pauli) -> tuple[Pauli, bool]:
650
646
  """Returns a tuple of a Pauli operator and a boolean.
651
647
 
652
648
  The pauli is the operator of the transform and the boolean
@@ -667,7 +663,7 @@ class SingleQubitCliffordGate(CliffordGate):
667
663
  to_gate = Pauli._XYZ[to.pauli_mask[0] - 1]
668
664
  return (to_gate, bool(to.coefficient != 1.0))
669
665
 
670
- def dense_pauli_string(self, pauli: Pauli) -> 'cirq.DensePauliString':
666
+ def dense_pauli_string(self, pauli: Pauli) -> cirq.DensePauliString:
671
667
  from cirq.ops import dense_pauli_string
672
668
 
673
669
  pauli_tuple = self.pauli_tuple(pauli)
@@ -733,7 +729,7 @@ class SingleQubitCliffordGate(CliffordGate):
733
729
  z = -0.5 if x_to_flip else 0.5
734
730
  return phased_x_z_gate.PhasedXZGate(x_exponent=x, z_exponent=z, axis_phase_exponent=a)
735
731
 
736
- def __pow__(self, exponent: float) -> 'SingleQubitCliffordGate':
732
+ def __pow__(self, exponent: float) -> SingleQubitCliffordGate:
737
733
  if int(exponent) == exponent:
738
734
  # The single qubit Clifford gates are a group of size 24
739
735
  exp = int(exponent) % 24
@@ -751,29 +747,23 @@ class SingleQubitCliffordGate(CliffordGate):
751
747
 
752
748
  return NotImplemented
753
749
 
754
- def _act_on_(
755
- self,
756
- sim_state: 'cirq.SimulationStateBase', # pylint: disable=unused-argument
757
- qubits: Sequence['cirq.Qid'], # pylint: disable=unused-argument
758
- ):
750
+ def _act_on_(self, sim_state: cirq.SimulationStateBase, qubits: Sequence[cirq.Qid]):
759
751
  # TODO(#5256) Add the implementation of _act_on_ with CliffordTableauSimulationState.
760
752
  return NotImplemented
761
753
 
762
754
  # Single Clifford Gate decomposition is more efficient than the general Tableau decomposition.
763
- def _decompose_(self, qubits: Sequence['cirq.Qid']) -> 'cirq.OP_TREE':
755
+ def _decompose_(self, qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
764
756
  (qubit,) = qubits
765
757
  return tuple(gate.on(qubit) for gate in self.decompose_gate())
766
758
 
767
- def _commutes_(
768
- self, other: Any, *, atol: float = 1e-8
769
- ) -> Union[bool, NotImplementedType, None]:
759
+ def _commutes_(self, other: Any, *, atol: float = 1e-8) -> bool | NotImplementedType | None:
770
760
  if isinstance(other, SingleQubitCliffordGate):
771
761
  return self.commutes_with_single_qubit_gate(other)
772
762
  if isinstance(other, Pauli):
773
763
  return self.commutes_with_pauli(other)
774
764
  return NotImplemented
775
765
 
776
- def commutes_with_single_qubit_gate(self, gate: 'SingleQubitCliffordGate') -> bool:
766
+ def commutes_with_single_qubit_gate(self, gate: SingleQubitCliffordGate) -> bool:
777
767
  """Tests if the two circuits would be equivalent up to global phase:
778
768
  --self--gate-- and --gate--self--"""
779
769
  self_then_gate = self.clifford_tableau.then(gate.clifford_tableau)
@@ -785,7 +775,7 @@ class SingleQubitCliffordGate(CliffordGate):
785
775
  return to == pauli and not flip
786
776
 
787
777
  @cached_method
788
- def merged_with(self, second: 'SingleQubitCliffordGate') -> 'SingleQubitCliffordGate':
778
+ def merged_with(self, second: SingleQubitCliffordGate) -> SingleQubitCliffordGate:
789
779
  """Returns a SingleQubitCliffordGate such that the circuits
790
780
  --output-- and --self--second--
791
781
  are equivalent up to global phase."""
@@ -807,7 +797,7 @@ class SingleQubitCliffordGate(CliffordGate):
807
797
  mat = protocols.unitary(op).dot(mat)
808
798
  return mat
809
799
 
810
- def decompose_gate(self) -> Sequence['cirq.Gate']:
800
+ def decompose_gate(self) -> Sequence[cirq.Gate]:
811
801
  """Decomposes this clifford into a series of H and pauli rotation gates.
812
802
 
813
803
  Returns:
@@ -818,13 +808,13 @@ class SingleQubitCliffordGate(CliffordGate):
818
808
  return self._decompose_gate
819
809
 
820
810
  @functools.cached_property
821
- def _decompose_gate(self) -> Sequence['cirq.Gate']:
811
+ def _decompose_gate(self) -> Sequence[cirq.Gate]:
822
812
  if self == SingleQubitCliffordGate.H:
823
813
  return [common_gates.H]
824
814
  rotations = self.decompose_rotation()
825
815
  return [r ** (qt / 2) for r, qt in rotations]
826
816
 
827
- def decompose_rotation(self) -> Sequence[Tuple[Pauli, int]]:
817
+ def decompose_rotation(self) -> Sequence[tuple[Pauli, int]]:
828
818
  """Decomposes this clifford into a series of pauli rotations.
829
819
 
830
820
  Each rotation is given as a tuple of (axis, quarter_turns),
@@ -837,7 +827,7 @@ class SingleQubitCliffordGate(CliffordGate):
837
827
  return self._decompose_rotation
838
828
 
839
829
  @functools.cached_property
840
- def _decompose_rotation(self) -> Sequence[Tuple[Pauli, int]]:
830
+ def _decompose_rotation(self) -> Sequence[tuple[Pauli, int]]:
841
831
  x_rot = self.pauli_tuple(pauli_gates.X)
842
832
  y_rot = self.pauli_tuple(pauli_gates.Y)
843
833
  z_rot = self.pauli_tuple(pauli_gates.Z)
@@ -887,7 +877,7 @@ class SingleQubitCliffordGate(CliffordGate):
887
877
  False
888
878
  ), 'Impossible condition where this gate only rotates one Pauli to a different Pauli.'
889
879
 
890
- def equivalent_gate_before(self, after: 'SingleQubitCliffordGate') -> 'SingleQubitCliffordGate':
880
+ def equivalent_gate_before(self, after: SingleQubitCliffordGate) -> SingleQubitCliffordGate:
891
881
  """Returns a SingleQubitCliffordGate such that the circuits
892
882
  --output--self-- and --self--gate--
893
883
  are equivalent up to global phase."""
@@ -901,9 +891,7 @@ class SingleQubitCliffordGate(CliffordGate):
901
891
  f'zs=np.array({self._clifford_tableau.zs.tolist()!r})))'
902
892
  )
903
893
 
904
- def _circuit_diagram_info_(
905
- self, args: 'cirq.CircuitDiagramInfoArgs'
906
- ) -> 'cirq.CircuitDiagramInfo':
894
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
907
895
  well_known_map = {
908
896
  SingleQubitCliffordGate.I: 'I',
909
897
  SingleQubitCliffordGate.H: 'H',
@@ -945,3 +933,32 @@ class SingleQubitCliffordGate(CliffordGate):
945
933
  def _value_equality_values_cls_(self):
946
934
  """To make it with compatible to compare with clifford gate."""
947
935
  return CliffordGate
936
+
937
+
938
+ CXSWAP = CliffordGate.from_clifford_tableau(
939
+ qis.CliffordTableau(
940
+ 2,
941
+ rs=np.array([False, False, False, False], dtype=np.dtype('bool')),
942
+ xs=np.array(
943
+ [[True, True], [True, False], [False, False], [False, False]], dtype=np.dtype('bool')
944
+ ),
945
+ zs=np.array(
946
+ [[False, False], [False, False], [False, True], [True, True]], dtype=np.dtype('bool')
947
+ ),
948
+ initial_state=0,
949
+ )
950
+ )
951
+
952
+ CZSWAP = CliffordGate.from_clifford_tableau(
953
+ qis.CliffordTableau(
954
+ 2,
955
+ rs=np.array([False, False, False, False], dtype=np.dtype('bool')),
956
+ xs=np.array(
957
+ [[False, True], [True, False], [False, False], [False, False]], dtype=np.dtype('bool')
958
+ ),
959
+ zs=np.array(
960
+ [[True, False], [False, True], [False, True], [True, False]], dtype=np.dtype('bool')
961
+ ),
962
+ initial_state=0,
963
+ )
964
+ )