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,9 +12,10 @@
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
  import itertools
17
- from typing import Tuple, Type
18
19
 
19
20
  import numpy as np
20
21
  import pytest
@@ -59,7 +60,7 @@ def _all_rotation_pairs():
59
60
 
60
61
 
61
62
  @functools.lru_cache()
62
- def _all_clifford_gates() -> Tuple['cirq.SingleQubitCliffordGate', ...]:
63
+ def _all_clifford_gates() -> tuple[cirq.SingleQubitCliffordGate, ...]:
63
64
  return tuple(
64
65
  cirq.SingleQubitCliffordGate.from_xz_map(trans_x, trans_z)
65
66
  for trans_x, trans_z in _all_rotation_pairs()
@@ -67,13 +68,13 @@ def _all_clifford_gates() -> Tuple['cirq.SingleQubitCliffordGate', ...]:
67
68
 
68
69
 
69
70
  @pytest.mark.parametrize('pauli,flip_x,flip_z', itertools.product(_paulis, _bools, _bools))
70
- def test_init_value_error(pauli, flip_x, flip_z):
71
+ def test_init_value_error(pauli, flip_x, flip_z) -> None:
71
72
  with pytest.raises(ValueError):
72
73
  cirq.SingleQubitCliffordGate.from_xz_map((pauli, flip_x), (pauli, flip_z))
73
74
 
74
75
 
75
76
  @pytest.mark.parametrize('trans_x,trans_z', _all_rotation_pairs())
76
- def test_init_from_xz(trans_x, trans_z):
77
+ def test_init_from_xz(trans_x, trans_z) -> None:
77
78
  gate = cirq.SingleQubitCliffordGate.from_xz_map(trans_x, trans_z)
78
79
  assert gate.pauli_tuple(cirq.X) == trans_x
79
80
  assert gate.pauli_tuple(cirq.Z) == trans_z
@@ -81,7 +82,7 @@ def test_init_from_xz(trans_x, trans_z):
81
82
  _assert_no_collision(gate)
82
83
 
83
84
 
84
- def test_dense_pauli_string():
85
+ def test_dense_pauli_string() -> None:
85
86
  gate = cirq.SingleQubitCliffordGate.from_xz_map((cirq.X, True), (cirq.Y, False))
86
87
  assert gate.dense_pauli_string(cirq.X) == cirq.DensePauliString('X', coefficient=-1)
87
88
  assert gate.dense_pauli_string(cirq.Z) == cirq.DensePauliString('Y')
@@ -95,7 +96,7 @@ def test_dense_pauli_string():
95
96
  if trans1[0] != trans2[0]
96
97
  ),
97
98
  )
98
- def test_init_from_double_map_vs_kwargs(trans1, trans2, from1):
99
+ def test_init_from_double_map_vs_kwargs(trans1, trans2, from1) -> None:
99
100
  from2 = cirq.Pauli.by_relative_index(from1, 1)
100
101
  from1_str, from2_str = (str(frm).lower() + '_to' for frm in (from1, from2))
101
102
  gate_kw = cirq.SingleQubitCliffordGate.from_double_map(**{from1_str: trans1, from2_str: trans2})
@@ -114,7 +115,7 @@ def test_init_from_double_map_vs_kwargs(trans1, trans2, from1):
114
115
  'trans1,from1',
115
116
  ((trans1, from1) for trans1, from1 in itertools.product(_all_rotations(), _paulis)),
116
117
  )
117
- def test_init_from_double_invalid(trans1, from1):
118
+ def test_init_from_double_invalid(trans1, from1) -> None:
118
119
  from2 = cirq.Pauli.by_relative_index(from1, 1)
119
120
  # Test throws on invalid arguments
120
121
  with pytest.raises(ValueError):
@@ -122,9 +123,8 @@ def test_init_from_double_invalid(trans1, from1):
122
123
 
123
124
 
124
125
  @pytest.mark.parametrize('trans,frm', itertools.product(_all_rotations(), _paulis))
125
- def test_init_from_single_map_vs_kwargs(trans, frm):
126
+ def test_init_from_single_map_vs_kwargs(trans, frm) -> None:
126
127
  from_str = str(frm).lower() + '_to'
127
- # pylint: disable=unexpected-keyword-arg
128
128
  gate_kw = cirq.SingleQubitCliffordGate.from_single_map(**{from_str: trans})
129
129
  gate_map = cirq.SingleQubitCliffordGate.from_single_map({frm: trans})
130
130
  assert gate_kw == gate_map
@@ -138,7 +138,7 @@ def test_init_from_single_map_vs_kwargs(trans, frm):
138
138
  if trans[0] != frm
139
139
  ),
140
140
  )
141
- def test_init_90rot_from_single(trans, frm):
141
+ def test_init_90rot_from_single(trans, frm) -> None:
142
142
  gate = cirq.SingleQubitCliffordGate.from_single_map({frm: trans})
143
143
  assert gate.pauli_tuple(frm) == trans
144
144
  _assert_not_mirror(gate)
@@ -163,7 +163,7 @@ def test_init_90rot_from_single(trans, frm):
163
163
  if trans[0] == frm and trans[1]
164
164
  ),
165
165
  )
166
- def test_init_180rot_from_single(trans, frm):
166
+ def test_init_180rot_from_single(trans, frm) -> None:
167
167
  gate = cirq.SingleQubitCliffordGate.from_single_map({frm: trans})
168
168
  assert gate.pauli_tuple(frm) == trans
169
169
  _assert_not_mirror(gate)
@@ -182,7 +182,7 @@ def test_init_180rot_from_single(trans, frm):
182
182
  if trans[0] == frm and not trans[1]
183
183
  ),
184
184
  )
185
- def test_init_ident_from_single(trans, frm):
185
+ def test_init_ident_from_single(trans, frm) -> None:
186
186
  gate = cirq.SingleQubitCliffordGate.from_single_map({frm: trans})
187
187
  assert gate.pauli_tuple(frm) == trans
188
188
  _assert_not_mirror(gate)
@@ -204,12 +204,12 @@ def test_init_ident_from_single(trans, frm):
204
204
  (cirq.Z, True, cirq.SingleQubitCliffordGate.Z_sqrt),
205
205
  ),
206
206
  )
207
- def test_init_from_pauli(pauli, sqrt, expected):
207
+ def test_init_from_pauli(pauli, sqrt, expected) -> None:
208
208
  gate = cirq.SingleQubitCliffordGate.from_pauli(pauli, sqrt=sqrt)
209
209
  assert gate == expected
210
210
 
211
211
 
212
- def test_pow():
212
+ def test_pow() -> None:
213
213
  assert cirq.SingleQubitCliffordGate.X**-1 == cirq.SingleQubitCliffordGate.X
214
214
  assert cirq.SingleQubitCliffordGate.H**-1 == cirq.SingleQubitCliffordGate.H
215
215
  assert cirq.SingleQubitCliffordGate.X_sqrt == cirq.SingleQubitCliffordGate.X**0.5
@@ -228,7 +228,7 @@ def test_pow():
228
228
  _ = cirq.SingleQubitCliffordGate.Z**0.25
229
229
 
230
230
 
231
- def test_init_from_quarter_turns():
231
+ def test_init_from_quarter_turns() -> None:
232
232
  eq = cirq.testing.EqualsTester()
233
233
  eq.add_equality_group(
234
234
  cirq.SingleQubitCliffordGate.from_quarter_turns(cirq.X, 0),
@@ -273,7 +273,7 @@ def test_init_from_quarter_turns():
273
273
 
274
274
 
275
275
  @pytest.mark.parametrize('gate', _all_clifford_gates())
276
- def test_init_from_quarter_turns_reconstruct(gate):
276
+ def test_init_from_quarter_turns_reconstruct(gate) -> None:
277
277
  new_gate = functools.reduce(
278
278
  cirq.SingleQubitCliffordGate.merged_with,
279
279
  (
@@ -285,7 +285,7 @@ def test_init_from_quarter_turns_reconstruct(gate):
285
285
  assert gate == new_gate
286
286
 
287
287
 
288
- def test_init_invalid():
288
+ def test_init_invalid() -> None:
289
289
  with pytest.raises(ValueError):
290
290
  cirq.SingleQubitCliffordGate.from_single_map()
291
291
  with pytest.raises(ValueError):
@@ -316,7 +316,7 @@ def test_init_invalid():
316
316
  )
317
317
 
318
318
 
319
- def test_eq_ne_and_hash():
319
+ def test_eq_ne_and_hash() -> None:
320
320
  eq = EqualsTester()
321
321
  for trans_x, trans_z in _all_rotation_pairs():
322
322
  gate_gen = lambda: cirq.SingleQubitCliffordGate.from_xz_map(trans_x, trans_z)
@@ -332,11 +332,11 @@ def test_eq_ne_and_hash():
332
332
  cirq.SingleQubitCliffordGate.X_sqrt,
333
333
  ),
334
334
  )
335
- def test_repr_gate(gate):
335
+ def test_repr_gate(gate) -> None:
336
336
  cirq.testing.assert_equivalent_repr(gate)
337
337
 
338
338
 
339
- def test_repr_operation():
339
+ def test_repr_operation() -> None:
340
340
  cirq.testing.assert_equivalent_repr(
341
341
  cirq.SingleQubitCliffordGate.from_pauli(cirq.Z).on(cirq.LineQubit(2))
342
342
  )
@@ -358,7 +358,7 @@ def test_repr_operation():
358
358
  (cirq.SingleQubitCliffordGate.Z_nsqrt, (cirq.X, False)),
359
359
  ),
360
360
  )
361
- def test_y_rotation(gate, trans_y):
361
+ def test_y_rotation(gate, trans_y) -> None:
362
362
  assert gate.pauli_tuple(cirq.Y) == trans_y
363
363
 
364
364
 
@@ -378,7 +378,7 @@ def test_y_rotation(gate, trans_y):
378
378
  (cirq.SingleQubitCliffordGate.Z_nsqrt, cirq.Z**-0.5),
379
379
  ),
380
380
  )
381
- def test_decompose(gate, gate_equiv):
381
+ def test_decompose(gate, gate_equiv) -> None:
382
382
  q0 = cirq.NamedQubit('q0')
383
383
  mat = cirq.Circuit(gate(q0)).unitary()
384
384
  mat_check = cirq.Circuit(gate_equiv(q0)).unitary()
@@ -401,7 +401,7 @@ def test_decompose(gate, gate_equiv):
401
401
  (cirq.SingleQubitCliffordGate.Z_nsqrt, cirq.Z**-0.5),
402
402
  ),
403
403
  )
404
- def test_known_matrix(gate, gate_equiv):
404
+ def test_known_matrix(gate, gate_equiv) -> None:
405
405
  assert cirq.has_unitary(gate)
406
406
  mat = cirq.unitary(gate)
407
407
  mat_check = cirq.unitary(gate_equiv)
@@ -428,25 +428,25 @@ def test_known_matrix(gate, gate_equiv):
428
428
  ('SWAP', cirq.CliffordGate),
429
429
  ],
430
430
  )
431
- def test_common_clifford_types(name: str, expected_cls: Type) -> None:
431
+ def test_common_clifford_types(name: str, expected_cls: type) -> None:
432
432
  assert isinstance(getattr(cirq.CliffordGate, name), expected_cls)
433
433
  assert isinstance(getattr(cirq.SingleQubitCliffordGate, name), expected_cls)
434
434
 
435
435
 
436
436
  @pytest.mark.parametrize('gate', _all_clifford_gates())
437
- def test_inverse(gate):
437
+ def test_inverse(gate) -> None:
438
438
  assert gate == cirq.inverse(cirq.inverse(gate))
439
439
 
440
440
 
441
441
  @pytest.mark.parametrize('gate', _all_clifford_gates())
442
- def test_inverse_matrix(gate):
442
+ def test_inverse_matrix(gate) -> None:
443
443
  q0 = cirq.NamedQubit('q0')
444
444
  mat = cirq.Circuit(gate(q0)).unitary()
445
445
  mat_inv = cirq.Circuit(cirq.inverse(gate)(q0)).unitary()
446
446
  assert_allclose_up_to_global_phase(mat, mat_inv.T.conj(), rtol=1e-7, atol=1e-7)
447
447
 
448
448
 
449
- def test_commutes_notimplemented_type():
449
+ def test_commutes_notimplemented_type() -> None:
450
450
  with pytest.raises(TypeError):
451
451
  cirq.commutes(cirq.SingleQubitCliffordGate.X, 'X')
452
452
  assert cirq.commutes(cirq.SingleQubitCliffordGate.X, 'X', default='default') == 'default'
@@ -457,7 +457,7 @@ def test_commutes_notimplemented_type():
457
457
 
458
458
 
459
459
  @pytest.mark.parametrize('gate,other', itertools.combinations(_all_clifford_gates(), r=2))
460
- def test_commutes_single_qubit_gate(gate, other):
460
+ def test_commutes_single_qubit_gate(gate, other) -> None:
461
461
  q0 = cirq.NamedQubit('q0')
462
462
  gate_op = gate(q0)
463
463
  other_op = other(q0)
@@ -473,7 +473,7 @@ def test_commutes_single_qubit_gate(gate, other):
473
473
 
474
474
 
475
475
  @pytest.mark.parametrize('gate', _all_clifford_gates())
476
- def test_parses_single_qubit_gate(gate):
476
+ def test_parses_single_qubit_gate(gate) -> None:
477
477
  assert gate == cirq.read_json(json_text=(cirq.to_json(gate)))
478
478
 
479
479
 
@@ -481,7 +481,7 @@ def test_parses_single_qubit_gate(gate):
481
481
  'gate,pauli,half_turns',
482
482
  itertools.product(_all_clifford_gates(), _paulis, (1.0, 0.25, 0.5, -0.5)),
483
483
  )
484
- def test_commutes_pauli(gate, pauli, half_turns):
484
+ def test_commutes_pauli(gate, pauli, half_turns) -> None:
485
485
  pauli_gate = pauli if half_turns == 1 else pauli**half_turns
486
486
  q0 = cirq.NamedQubit('q0')
487
487
  mat = cirq.Circuit(gate(q0), pauli_gate(q0)).unitary()
@@ -491,7 +491,7 @@ def test_commutes_pauli(gate, pauli, half_turns):
491
491
  assert commutes == commutes_check, f"gate: {gate}, pauli {pauli}"
492
492
 
493
493
 
494
- def test_to_clifford_tableau_util_function():
494
+ def test_to_clifford_tableau_util_function() -> None:
495
495
  tableau = cirq.ops.clifford_gate._to_clifford_tableau(
496
496
  x_to=(cirq.X, False), z_to=(cirq.Z, False)
497
497
  )
@@ -529,35 +529,39 @@ def test_to_clifford_tableau_util_function():
529
529
  ),
530
530
  ),
531
531
  )
532
- def test_text_diagram_info(gate, sym, exp):
532
+ def test_text_diagram_info(gate, sym, exp) -> None:
533
533
  assert cirq.circuit_diagram_info(gate) == cirq.CircuitDiagramInfo(
534
534
  wire_symbols=(sym,), exponent=exp
535
535
  )
536
536
 
537
537
 
538
538
  @pytest.mark.parametrize("clifford_gate", cirq.SingleQubitCliffordGate.all_single_qubit_cliffords)
539
- def test_from_unitary(clifford_gate):
539
+ def test_from_unitary(clifford_gate) -> None:
540
540
  u = cirq.unitary(clifford_gate)
541
541
  result_gate = cirq.SingleQubitCliffordGate.from_unitary(u)
542
542
  assert result_gate == clifford_gate
543
543
 
544
- result_gate2, global_phase = cirq.SingleQubitCliffordGate.from_unitary_with_global_phase(u)
544
+ result = cirq.SingleQubitCliffordGate.from_unitary_with_global_phase(u)
545
+ assert result is not None
546
+ result_gate2, global_phase = result
545
547
  assert result_gate2 == result_gate
546
548
  assert np.allclose(cirq.unitary(result_gate2) * global_phase, u)
547
549
 
548
550
 
549
- def test_from_unitary_with_phase_shift():
551
+ def test_from_unitary_with_phase_shift() -> None:
550
552
  u = np.exp(0.42j) * cirq.unitary(cirq.SingleQubitCliffordGate.Y_sqrt)
551
553
  gate = cirq.SingleQubitCliffordGate.from_unitary(u)
552
554
 
553
555
  assert gate == cirq.SingleQubitCliffordGate.Y_sqrt
554
556
 
555
- gate2, global_phase = cirq.SingleQubitCliffordGate.from_unitary_with_global_phase(u)
557
+ result = cirq.SingleQubitCliffordGate.from_unitary_with_global_phase(u)
558
+ assert result is not None
559
+ gate2, global_phase = result
556
560
  assert gate2 == gate
557
561
  assert np.allclose(cirq.unitary(gate2) * global_phase, u)
558
562
 
559
563
 
560
- def test_from_unitary_not_clifford():
564
+ def test_from_unitary_not_clifford() -> None:
561
565
  # Not a single-qubit gate.
562
566
  u = cirq.unitary(cirq.CNOT)
563
567
  assert cirq.SingleQubitCliffordGate.from_unitary(u) is None
@@ -575,14 +579,14 @@ def test_from_unitary_not_clifford():
575
579
 
576
580
 
577
581
  @pytest.mark.parametrize("clifford_gate", cirq.SingleQubitCliffordGate.all_single_qubit_cliffords)
578
- def test_decompose_gate(clifford_gate):
582
+ def test_decompose_gate(clifford_gate) -> None:
579
583
  gates = clifford_gate.decompose_gate()
580
584
  u = functools.reduce(np.dot, [np.eye(2), *(cirq.unitary(gate) for gate in reversed(gates))])
581
585
  assert np.allclose(u, cirq.unitary(clifford_gate)) # No global phase difference.
582
586
 
583
587
 
584
588
  @pytest.mark.parametrize('trans_x,trans_z', _all_rotation_pairs())
585
- def test_to_phased_xz_gate(trans_x, trans_z):
589
+ def test_to_phased_xz_gate(trans_x, trans_z) -> None:
586
590
  gate = cirq.SingleQubitCliffordGate.from_xz_map(trans_x, trans_z)
587
591
  actual_phased_xz_gate = gate.to_phased_xz_gate()._canonical()
588
592
  expect_phased_xz_gates = cirq.PhasedXZGate.from_matrix(cirq.unitary(gate))
@@ -594,7 +598,7 @@ def test_to_phased_xz_gate(trans_x, trans_z):
594
598
  )
595
599
 
596
600
 
597
- def test_from_xz_to_clifford_tableau():
601
+ def test_from_xz_to_clifford_tableau() -> None:
598
602
  seen_tableau = []
599
603
  for trans_x, trans_z in _all_rotation_pairs():
600
604
  tableau = cirq.SingleQubitCliffordGate.from_xz_map(trans_x, trans_z).clifford_tableau
@@ -622,7 +626,7 @@ def test_from_xz_to_clifford_tableau():
622
626
  (cirq.CliffordGate.SWAP, cirq.SWAP),
623
627
  ],
624
628
  )
625
- def test_common_clifford_gate(clifford_gate, standard_gate):
629
+ def test_common_clifford_gate(clifford_gate, standard_gate) -> None:
626
630
  # cirq.unitary is relied on the _decompose_ methods.
627
631
  u_c = cirq.unitary(clifford_gate)
628
632
  u_s = cirq.unitary(standard_gate)
@@ -630,7 +634,7 @@ def test_common_clifford_gate(clifford_gate, standard_gate):
630
634
 
631
635
 
632
636
  @pytest.mark.parametrize('property_name', ("all_single_qubit_cliffords", "CNOT", "CZ", "SWAP"))
633
- def test_common_clifford_gate_caching(property_name):
637
+ def test_common_clifford_gate_caching(property_name) -> None:
634
638
  cache_name = f"_{property_name}"
635
639
  delattr(cirq.CliffordGate, cache_name)
636
640
  assert not hasattr(cirq.CliffordGate, cache_name)
@@ -638,7 +642,7 @@ def test_common_clifford_gate_caching(property_name):
638
642
  assert hasattr(cirq.CliffordGate, cache_name)
639
643
 
640
644
 
641
- def test_multi_qubit_clifford_pow():
645
+ def test_multi_qubit_clifford_pow() -> None:
642
646
  assert cirq.CliffordGate.X**-1 == cirq.CliffordGate.X
643
647
  assert cirq.CliffordGate.H**-1 == cirq.CliffordGate.H
644
648
  assert cirq.CliffordGate.S**2 == cirq.CliffordGate.Z
@@ -650,7 +654,7 @@ def test_multi_qubit_clifford_pow():
650
654
  _ = cirq.CliffordGate.Z**0.25
651
655
 
652
656
 
653
- def test_stabilizer_effec():
657
+ def test_stabilizer_effec() -> None:
654
658
  assert cirq.has_stabilizer_effect(cirq.CliffordGate.X)
655
659
  assert cirq.has_stabilizer_effect(cirq.CliffordGate.H)
656
660
  assert cirq.has_stabilizer_effect(cirq.CliffordGate.S)
@@ -663,7 +667,7 @@ def test_stabilizer_effec():
663
667
  assert cirq.has_stabilizer_effect(gate)
664
668
 
665
669
 
666
- def test_clifford_gate_from_op_list():
670
+ def test_clifford_gate_from_op_list() -> None:
667
671
  # Since from_op_list() ==> _act_on_() ==> tableau.then() and then() has already covered
668
672
  # lots of random circuit cases, here we just test a few well-known relationships.
669
673
  qubit = cirq.NamedQubit('test')
@@ -708,7 +712,7 @@ def test_clifford_gate_from_op_list():
708
712
  cirq.CliffordGate.from_op_list([cirq.T(qubit)], [qubit])
709
713
 
710
714
 
711
- def test_clifford_gate_from_tableau():
715
+ def test_clifford_gate_from_tableau() -> None:
712
716
  t = cirq.CliffordGate.X.clifford_tableau
713
717
  assert cirq.CliffordGate.from_clifford_tableau(t) == cirq.CliffordGate.X
714
718
 
@@ -732,10 +736,10 @@ def test_clifford_gate_from_tableau():
732
736
  cirq.CliffordGate.from_clifford_tableau(t)
733
737
 
734
738
  with pytest.raises(ValueError, match="Input argument has to be a CliffordTableau instance."):
735
- cirq.CliffordGate.from_clifford_tableau(1)
739
+ cirq.CliffordGate.from_clifford_tableau(1) # type: ignore[arg-type]
736
740
 
737
741
 
738
- def test_multi_clifford_decompose_by_unitary():
742
+ def test_multi_clifford_decompose_by_unitary() -> None:
739
743
  # Construct a random clifford gate:
740
744
  n, num_ops = 5, 20 # because we relied on unitary cannot test large-scale qubits
741
745
  gate_candidate = [cirq.X, cirq.Y, cirq.Z, cirq.H, cirq.S, cirq.CNOT, cirq.CZ]
@@ -755,7 +759,7 @@ def test_multi_clifford_decompose_by_unitary():
755
759
  )
756
760
 
757
761
 
758
- def test_pad_tableau_bad_input():
762
+ def test_pad_tableau_bad_input() -> None:
759
763
  with pytest.raises(
760
764
  ValueError, match="Input axes of padding should match with the number of qubits"
761
765
  ):
@@ -769,7 +773,7 @@ def test_pad_tableau_bad_input():
769
773
  cirq.ops.clifford_gate._pad_tableau(tableau, num_qubits_after_padding=2, axes=[0, 1, 2])
770
774
 
771
775
 
772
- def test_pad_tableau():
776
+ def test_pad_tableau() -> None:
773
777
  tableau = cirq.CliffordTableau(num_qubits=1)
774
778
  padded_tableau = cirq.ops.clifford_gate._pad_tableau(
775
779
  tableau, num_qubits_after_padding=2, axes=[0]
@@ -810,7 +814,7 @@ def test_pad_tableau():
810
814
  np.testing.assert_equal(padded_tableau.rs.astype(np.int64), np.zeros(4))
811
815
 
812
816
 
813
- def test_clifford_gate_act_on_small_case():
817
+ def test_clifford_gate_act_on_small_case() -> None:
814
818
  # Note this is also covered by the `from_op_list` one, etc.
815
819
 
816
820
  qubits = cirq.LineQubit.range(5)
@@ -841,7 +845,7 @@ def test_clifford_gate_act_on_small_case():
841
845
  assert args.tableau == expected_args.tableau
842
846
 
843
847
 
844
- def test_clifford_gate_act_on_large_case():
848
+ def test_clifford_gate_act_on_large_case() -> None:
845
849
  n, num_ops = 50, 1000 # because we don't need unitary, it is fast.
846
850
  gate_candidate = [cirq.X, cirq.Y, cirq.Z, cirq.H, cirq.S, cirq.CNOT, cirq.CZ]
847
851
  for seed in range(10):
@@ -865,7 +869,7 @@ def test_clifford_gate_act_on_large_case():
865
869
  assert args1.tableau == args2.tableau
866
870
 
867
871
 
868
- def test_clifford_gate_act_on_ch_form():
872
+ def test_clifford_gate_act_on_ch_form() -> None:
869
873
  # Although we don't support CH_form from the _act_on_, it will fall back
870
874
  # to the decomposititon method and apply it through decomposed ops.
871
875
  # Here we run it for the coverage only.
@@ -878,12 +882,12 @@ def test_clifford_gate_act_on_ch_form():
878
882
  np.testing.assert_allclose(args.state.state_vector(), np.array([0, 0, 0, 1]))
879
883
 
880
884
 
881
- def test_clifford_gate_act_on_fail():
885
+ def test_clifford_gate_act_on_fail() -> None:
882
886
  with pytest.raises(TypeError, match="Failed to act"):
883
887
  cirq.act_on(cirq.CliffordGate.X, ExampleSimulationState(), qubits=())
884
888
 
885
889
 
886
- def test_all_single_qubit_clifford_unitaries():
890
+ def test_all_single_qubit_clifford_unitaries() -> None:
887
891
  i = np.eye(2)
888
892
  x = np.array([[0, 1], [1, 0]])
889
893
  y = np.array([[0, -1j], [1j, 0]])
@@ -923,7 +927,7 @@ def test_all_single_qubit_clifford_unitaries():
923
927
  assert cirq.equal_up_to_global_phase(cs[23], (i - 1j * (-x - y - z)) / 2)
924
928
 
925
929
 
926
- def test_clifford_gate_repr():
930
+ def test_clifford_gate_repr() -> None:
927
931
  q0, q1, q2 = cirq.LineQubit.range(3)
928
932
  assert (
929
933
  repr(cirq.ops.CliffordGate.from_op_list([cirq.ops.X(q0), cirq.CZ(q1, q2)], [q0, q1, q2]))
@@ -946,7 +950,7 @@ stable | destable
946
950
  )
947
951
 
948
952
 
949
- def test_single_qubit_clifford_gate_repr():
953
+ def test_single_qubit_clifford_gate_repr() -> None:
950
954
  # Common gates
951
955
  assert repr(cirq.ops.SingleQubitCliffordGate.X) == (
952
956
  'cirq.ops.SingleQubitCliffordGate(_clifford_tableau=cirq.CliffordTableau(1, '
@@ -993,3 +997,14 @@ def test_single_qubit_clifford_gate_repr():
993
997
  'rs=np.array([False, True]), xs=np.array([[True], [False]]), '
994
998
  'zs=np.array([[True], [True]])))'
995
999
  )
1000
+
1001
+
1002
+ def test_cxswap_czswap() -> None:
1003
+
1004
+ # cirq unitary for CNOT then SWAP (big endian)
1005
+ cxswap_expected = np.asarray([[1, 0, 0, 0], [0, 0, 0, 1], [0, 1, 0, 0], [0, 0, 1, 0]])
1006
+ print(cirq.unitary(cirq.CXSWAP))
1007
+ assert np.allclose(cirq.unitary(cirq.CXSWAP), cxswap_expected)
1008
+
1009
+ czswap_expected = np.asarray([[1, 0, 0, 0], [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 0, -1]])
1010
+ assert np.allclose(cirq.unitary(cirq.CZSWAP), czswap_expected)