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
@@ -14,6 +14,8 @@
14
14
 
15
15
  """Tests for `parity_gates.py`."""
16
16
 
17
+ from __future__ import annotations
18
+
17
19
  import numpy as np
18
20
  import pytest
19
21
  import sympy
@@ -22,17 +24,17 @@ import cirq
22
24
 
23
25
 
24
26
  @pytest.mark.parametrize('eigen_gate_type', [cirq.XXPowGate, cirq.YYPowGate, cirq.ZZPowGate])
25
- def test_eigen_gates_consistent_protocols(eigen_gate_type):
27
+ def test_eigen_gates_consistent_protocols(eigen_gate_type) -> None:
26
28
  cirq.testing.assert_eigengate_implements_consistent_protocols(eigen_gate_type)
27
29
 
28
30
 
29
- def test_xx_init():
31
+ def test_xx_init() -> None:
30
32
  assert cirq.XXPowGate(exponent=1).exponent == 1
31
33
  v = cirq.XXPowGate(exponent=0.5)
32
34
  assert v.exponent == 0.5
33
35
 
34
36
 
35
- def test_xx_eq():
37
+ def test_xx_eq() -> None:
36
38
  eq = cirq.testing.EqualsTester()
37
39
  eq.add_equality_group(
38
40
  cirq.XX,
@@ -49,24 +51,24 @@ def test_xx_eq():
49
51
  eq.add_equality_group(iXX**2.5, iXX**6.5)
50
52
 
51
53
 
52
- def test_xx_pow():
54
+ def test_xx_pow() -> None:
53
55
  assert cirq.XX**0.5 != cirq.XX**-0.5
54
56
  assert cirq.XX**-1 == cirq.XX
55
57
  assert (cirq.XX**-1) ** 0.5 == cirq.XX**-0.5
56
58
 
57
59
 
58
- def test_xx_str():
60
+ def test_xx_str() -> None:
59
61
  assert str(cirq.XX) == 'XX'
60
62
  assert str(cirq.XX**0.5) == 'XX**0.5'
61
63
  assert str(cirq.XXPowGate(global_shift=0.1)) == 'XX'
62
64
 
63
65
 
64
- def test_xx_repr():
66
+ def test_xx_repr() -> None:
65
67
  assert repr(cirq.XXPowGate()) == 'cirq.XX'
66
68
  assert repr(cirq.XXPowGate(exponent=0.5)) == '(cirq.XX**0.5)'
67
69
 
68
70
 
69
- def test_xx_matrix():
71
+ def test_xx_matrix() -> None:
70
72
  np.testing.assert_allclose(
71
73
  cirq.unitary(cirq.XX),
72
74
  np.array([[0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0], [1, 0, 0, 0]]),
@@ -82,7 +84,7 @@ def test_xx_matrix():
82
84
  )
83
85
 
84
86
 
85
- def test_xx_diagrams():
87
+ def test_xx_diagrams() -> None:
86
88
  a = cirq.NamedQubit('a')
87
89
  b = cirq.NamedQubit('b')
88
90
  circuit = cirq.Circuit(cirq.XX(a, b), cirq.XX(a, b) ** 3, cirq.XX(a, b) ** 0.5)
@@ -96,13 +98,13 @@ b: ───XX───XX───XX^0.5───
96
98
  )
97
99
 
98
100
 
99
- def test_yy_init():
101
+ def test_yy_init() -> None:
100
102
  assert cirq.YYPowGate(exponent=1).exponent == 1
101
103
  v = cirq.YYPowGate(exponent=0.5)
102
104
  assert v.exponent == 0.5
103
105
 
104
106
 
105
- def test_yy_eq():
107
+ def test_yy_eq() -> None:
106
108
  eq = cirq.testing.EqualsTester()
107
109
  eq.add_equality_group(
108
110
  cirq.YY,
@@ -118,13 +120,13 @@ def test_yy_eq():
118
120
  eq.add_equality_group(iYY**2.5, iYY**6.5)
119
121
 
120
122
 
121
- def test_yy_pow():
123
+ def test_yy_pow() -> None:
122
124
  assert cirq.YY**0.5 != cirq.YY**-0.5
123
125
  assert cirq.YY**-1 == cirq.YY
124
126
  assert (cirq.YY**-1) ** 0.5 == cirq.YY**-0.5
125
127
 
126
128
 
127
- def test_yy_str():
129
+ def test_yy_str() -> None:
128
130
  assert str(cirq.YY) == 'YY'
129
131
  assert str(cirq.YY**0.5) == 'YY**0.5'
130
132
  assert str(cirq.YYPowGate(global_shift=0.1)) == 'YY'
@@ -133,12 +135,12 @@ def test_yy_str():
133
135
  assert str(iYY) == 'YY'
134
136
 
135
137
 
136
- def test_yy_repr():
138
+ def test_yy_repr() -> None:
137
139
  assert repr(cirq.YYPowGate()) == 'cirq.YY'
138
140
  assert repr(cirq.YYPowGate(exponent=0.5)) == '(cirq.YY**0.5)'
139
141
 
140
142
 
141
- def test_yy_matrix():
143
+ def test_yy_matrix() -> None:
142
144
  np.testing.assert_allclose(
143
145
  cirq.unitary(cirq.YY),
144
146
  np.array([[0, 0, 0, -1], [0, 0, 1, 0], [0, 1, 0, 0], [-1, 0, 0, 0]]),
@@ -154,7 +156,7 @@ def test_yy_matrix():
154
156
  )
155
157
 
156
158
 
157
- def test_yy_diagrams():
159
+ def test_yy_diagrams() -> None:
158
160
  a = cirq.NamedQubit('a')
159
161
  b = cirq.NamedQubit('b')
160
162
  circuit = cirq.Circuit(cirq.YY(a, b), cirq.YY(a, b) ** 3, cirq.YY(a, b) ** 0.5)
@@ -168,13 +170,13 @@ b: ───YY───YY───YY^0.5───
168
170
  )
169
171
 
170
172
 
171
- def test_zz_init():
173
+ def test_zz_init() -> None:
172
174
  assert cirq.ZZPowGate(exponent=1).exponent == 1
173
175
  v = cirq.ZZPowGate(exponent=0.5)
174
176
  assert v.exponent == 0.5
175
177
 
176
178
 
177
- def test_zz_eq():
179
+ def test_zz_eq() -> None:
178
180
  eq = cirq.testing.EqualsTester()
179
181
  eq.add_equality_group(
180
182
  cirq.ZZ,
@@ -190,19 +192,19 @@ def test_zz_eq():
190
192
  eq.add_equality_group(iZZ**2.5, iZZ**6.5)
191
193
 
192
194
 
193
- def test_zz_pow():
195
+ def test_zz_pow() -> None:
194
196
  assert cirq.ZZ**0.5 != cirq.ZZ**-0.5
195
197
  assert cirq.ZZ**-1 == cirq.ZZ
196
198
  assert (cirq.ZZ**-1) ** 0.5 == cirq.ZZ**-0.5
197
199
 
198
200
 
199
- def test_zz_phase_by():
201
+ def test_zz_phase_by() -> None:
200
202
  assert cirq.phase_by(cirq.ZZ, 0.25, 0) == cirq.phase_by(cirq.ZZ, 0.25, 1) == cirq.ZZ
201
203
  assert cirq.phase_by(cirq.ZZ**0.5, 0.25, 0) == cirq.ZZ**0.5
202
204
  assert cirq.phase_by(cirq.ZZ**-0.5, 0.25, 1) == cirq.ZZ**-0.5
203
205
 
204
206
 
205
- def test_zz_str():
207
+ def test_zz_str() -> None:
206
208
  assert str(cirq.ZZ) == 'ZZ'
207
209
  assert str(cirq.ZZ**0.5) == 'ZZ**0.5'
208
210
  assert str(cirq.ZZPowGate(global_shift=0.1)) == 'ZZ'
@@ -211,12 +213,12 @@ def test_zz_str():
211
213
  assert str(iZZ) == 'ZZ'
212
214
 
213
215
 
214
- def test_zz_repr():
216
+ def test_zz_repr() -> None:
215
217
  assert repr(cirq.ZZPowGate()) == 'cirq.ZZ'
216
218
  assert repr(cirq.ZZPowGate(exponent=0.5)) == '(cirq.ZZ**0.5)'
217
219
 
218
220
 
219
- def test_zz_matrix():
221
+ def test_zz_matrix() -> None:
220
222
  np.testing.assert_allclose(
221
223
  cirq.unitary(cirq.ZZ),
222
224
  np.array([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]]),
@@ -232,7 +234,7 @@ def test_zz_matrix():
232
234
  )
233
235
 
234
236
 
235
- def test_zz_diagrams():
237
+ def test_zz_diagrams() -> None:
236
238
  a = cirq.NamedQubit('a')
237
239
  b = cirq.NamedQubit('b')
238
240
  circuit = cirq.Circuit(cirq.ZZ(a, b), cirq.ZZ(a, b) ** 3, cirq.ZZ(a, b) ** 0.5)
@@ -246,7 +248,7 @@ b: ───ZZ───ZZ───ZZ^0.5───
246
248
  )
247
249
 
248
250
 
249
- def test_trace_distance():
251
+ def test_trace_distance() -> None:
250
252
  foo = sympy.Symbol('foo')
251
253
  assert cirq.trace_distance_bound(cirq.XX**foo) == 1.0
252
254
  assert cirq.trace_distance_bound(cirq.YY**foo) == 1.0
@@ -256,7 +258,7 @@ def test_trace_distance():
256
258
  assert cirq.approx_eq(cirq.trace_distance_bound(cirq.ZZ ** (1 / 3)), np.sin(np.pi / 6))
257
259
 
258
260
 
259
- def test_ms_arguments():
261
+ def test_ms_arguments() -> None:
260
262
  eq_tester = cirq.testing.EqualsTester()
261
263
  eq_tester.add_equality_group(
262
264
  cirq.ms(np.pi / 2), cirq.MSGate(rads=np.pi / 2), cirq.XXPowGate(global_shift=-0.5)
@@ -268,7 +270,7 @@ def test_ms_arguments():
268
270
  eq_tester.add_equality_group(cirq.XX**0.5)
269
271
 
270
272
 
271
- def test_ms_equal_up_to_global_phase():
273
+ def test_ms_equal_up_to_global_phase() -> None:
272
274
  assert cirq.equal_up_to_global_phase(cirq.ms(np.pi / 2), cirq.XX)
273
275
  assert cirq.equal_up_to_global_phase(cirq.ms(np.pi / 4), cirq.XX**0.5)
274
276
  assert not cirq.equal_up_to_global_phase(cirq.ms(np.pi / 4), cirq.XX)
@@ -278,7 +280,7 @@ def test_ms_equal_up_to_global_phase():
278
280
  assert cirq.ms(np.pi / 4) not in cirq.GateFamily(cirq.XX)
279
281
 
280
282
 
281
- def test_ms_str():
283
+ def test_ms_str() -> None:
282
284
  ms = cirq.ms(np.pi / 2)
283
285
  assert str(ms) == 'MS(π/2)'
284
286
  assert str(cirq.ms(np.pi)) == 'MS(2.0π/2)'
@@ -287,7 +289,7 @@ def test_ms_str():
287
289
  assert str(ms**-1) == 'MS(-1.0π/2)'
288
290
 
289
291
 
290
- def test_ms_matrix():
292
+ def test_ms_matrix() -> None:
291
293
  s = np.sqrt(0.5)
292
294
  # yapf: disable
293
295
  np.testing.assert_allclose(cirq.unitary(cirq.ms(np.pi/4)),
@@ -300,7 +302,7 @@ def test_ms_matrix():
300
302
  np.testing.assert_allclose(cirq.unitary(cirq.ms(np.pi)), np.diag([-1, -1, -1, -1]), atol=1e-8)
301
303
 
302
304
 
303
- def test_ms_repr():
305
+ def test_ms_repr() -> None:
304
306
  assert repr(cirq.ms(np.pi / 2)) == 'cirq.ms(np.pi/2)'
305
307
  assert repr(cirq.ms(np.pi / 4)) == 'cirq.ms(0.5*np.pi/2)'
306
308
  cirq.testing.assert_equivalent_repr(cirq.ms(np.pi / 4))
@@ -309,7 +311,7 @@ def test_ms_repr():
309
311
  assert repr(ms**-0.5) == 'cirq.ms(-0.5*np.pi/2)'
310
312
 
311
313
 
312
- def test_ms_diagrams():
314
+ def test_ms_diagrams() -> None:
313
315
  a = cirq.NamedQubit('a')
314
316
  b = cirq.NamedQubit('b')
315
317
  circuit = cirq.Circuit(cirq.SWAP(a, b), cirq.X(a), cirq.Y(a), cirq.ms(np.pi).on(a, b))
@@ -323,7 +325,7 @@ b: ───×───────────MS(π)───
323
325
  )
324
326
 
325
327
 
326
- def test_json_serialization():
328
+ def test_json_serialization() -> None:
327
329
  assert cirq.read_json(json_text=cirq.to_json(cirq.ms(np.pi / 2))) == cirq.ms(np.pi / 2)
328
330
 
329
331
 
@@ -332,7 +334,9 @@ def test_json_serialization():
332
334
  'exponent,is_clifford',
333
335
  ((0, True), (0.5, True), (0.75, False), (1, True), (1.5, True), (-1.5, True)),
334
336
  )
335
- def test_clifford_protocols(gate_cls: type[cirq.EigenGate], exponent: float, is_clifford: bool):
337
+ def test_clifford_protocols(
338
+ gate_cls: type[cirq.EigenGate], exponent: float, is_clifford: bool
339
+ ) -> None:
336
340
  gate = gate_cls(exponent=exponent)
337
341
  assert hasattr(gate, '_decompose_into_clifford_with_qubits_')
338
342
  if is_clifford:
cirq/ops/pauli_gates.py CHANGED
@@ -11,9 +11,12 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
14
17
  import abc
15
18
  from types import NotImplementedType
16
- from typing import Any, cast, Dict, Tuple, TYPE_CHECKING, Union
19
+ from typing import Any, cast, TYPE_CHECKING
17
20
 
18
21
  from cirq._doc import document
19
22
  from cirq._import import LazyLoader
@@ -39,14 +42,14 @@ class Pauli(raw_types.Gate, metaclass=abc.ABCMeta):
39
42
  of private subclasses are the X, Y, or Z Pauli gates defined below.
40
43
  """
41
44
 
42
- _XYZ: Tuple['Pauli', 'Pauli', 'Pauli']
45
+ _XYZ: tuple[Pauli, Pauli, Pauli]
43
46
 
44
47
  @staticmethod
45
- def by_index(index: int) -> 'Pauli':
48
+ def by_index(index: int) -> Pauli:
46
49
  return Pauli._XYZ[index % 3]
47
50
 
48
51
  @staticmethod
49
- def by_relative_index(p: 'Pauli', relative_index: int) -> 'Pauli':
52
+ def by_relative_index(p: Pauli, relative_index: int) -> Pauli:
50
53
  return Pauli._XYZ[(p._index + relative_index) % 3]
51
54
 
52
55
  def __init__(self, index: int, name: str) -> None:
@@ -56,23 +59,21 @@ class Pauli(raw_types.Gate, metaclass=abc.ABCMeta):
56
59
  def num_qubits(self):
57
60
  return 1
58
61
 
59
- def _commutes_(
60
- self, other: Any, *, atol: float = 1e-8
61
- ) -> Union[bool, NotImplementedType, None]:
62
+ def _commutes_(self, other: Any, *, atol: float = 1e-8) -> bool | NotImplementedType | None:
62
63
  if not isinstance(other, Pauli):
63
64
  return NotImplemented
64
65
  return self is other
65
66
 
66
- def third(self, second: 'Pauli') -> 'Pauli':
67
+ def third(self, second: Pauli) -> Pauli:
67
68
  return Pauli._XYZ[(-self._index - second._index) % 3]
68
69
 
69
- def relative_index(self, second: 'Pauli') -> int:
70
+ def relative_index(self, second: Pauli) -> int:
70
71
  """Relative index of self w.r.t. second in the (X, Y, Z) cycle."""
71
72
  return (self._index - second._index + 1) % 3 - 1
72
73
 
73
74
  def phased_pauli_product(
74
- self, other: Union['cirq.Pauli', 'identity.IdentityGate']
75
- ) -> Tuple[complex, Union['cirq.Pauli', 'identity.IdentityGate']]:
75
+ self, other: cirq.Pauli | identity.IdentityGate
76
+ ) -> tuple[complex, cirq.Pauli | identity.IdentityGate]:
76
77
  if self == other:
77
78
  return 1, identity.I
78
79
  if other is identity.I:
@@ -89,7 +90,7 @@ class Pauli(raw_types.Gate, metaclass=abc.ABCMeta):
89
90
  return NotImplemented
90
91
  return (other._index - self._index) % 3 == 1
91
92
 
92
- def on(self, *qubits: 'cirq.Qid') -> 'SingleQubitPauliStringGateOperation':
93
+ def on(self, *qubits: cirq.Qid) -> SingleQubitPauliStringGateOperation:
93
94
  """Returns an application of this gate to the given qubits.
94
95
 
95
96
  Args:
@@ -109,10 +110,10 @@ class _PauliX(Pauli, common_gates.XPowGate):
109
110
  Pauli.__init__(self, index=0, name='X')
110
111
  common_gates.XPowGate.__init__(self, exponent=1.0)
111
112
 
112
- def __pow__(self, exponent: 'cirq.TParamVal') -> common_gates.XPowGate:
113
+ def __pow__(self, exponent: cirq.TParamVal) -> common_gates.XPowGate:
113
114
  return common_gates.XPowGate(exponent=exponent) if exponent != 1 else _PauliX()
114
115
 
115
- def _with_exponent(self, exponent: 'cirq.TParamVal') -> common_gates.XPowGate:
116
+ def _with_exponent(self, exponent: cirq.TParamVal) -> common_gates.XPowGate:
116
117
  return self.__pow__(exponent)
117
118
 
118
119
  @classmethod
@@ -122,7 +123,7 @@ class _PauliX(Pauli, common_gates.XPowGate):
122
123
  return Pauli._XYZ[0]
123
124
 
124
125
  @property
125
- def basis(self) -> Dict[int, '_XEigenState']:
126
+ def basis(self) -> dict[int, _XEigenState]:
126
127
  from cirq.value.product_state import _XEigenState
127
128
 
128
129
  return {+1: _XEigenState(+1), -1: _XEigenState(-1)}
@@ -133,10 +134,10 @@ class _PauliY(Pauli, common_gates.YPowGate):
133
134
  Pauli.__init__(self, index=1, name='Y')
134
135
  common_gates.YPowGate.__init__(self, exponent=1.0)
135
136
 
136
- def __pow__(self, exponent: 'cirq.TParamVal') -> common_gates.YPowGate:
137
+ def __pow__(self, exponent: cirq.TParamVal) -> common_gates.YPowGate:
137
138
  return common_gates.YPowGate(exponent=exponent) if exponent != 1 else _PauliY()
138
139
 
139
- def _with_exponent(self, exponent: 'cirq.TParamVal') -> common_gates.YPowGate:
140
+ def _with_exponent(self, exponent: cirq.TParamVal) -> common_gates.YPowGate:
140
141
  return self.__pow__(exponent)
141
142
 
142
143
  @classmethod
@@ -146,7 +147,7 @@ class _PauliY(Pauli, common_gates.YPowGate):
146
147
  return Pauli._XYZ[1]
147
148
 
148
149
  @property
149
- def basis(self) -> Dict[int, '_YEigenState']:
150
+ def basis(self) -> dict[int, _YEigenState]:
150
151
  from cirq.value.product_state import _YEigenState
151
152
 
152
153
  return {+1: _YEigenState(+1), -1: _YEigenState(-1)}
@@ -157,10 +158,10 @@ class _PauliZ(Pauli, common_gates.ZPowGate):
157
158
  Pauli.__init__(self, index=2, name='Z')
158
159
  common_gates.ZPowGate.__init__(self, exponent=1.0)
159
160
 
160
- def __pow__(self, exponent: 'cirq.TParamVal') -> common_gates.ZPowGate:
161
+ def __pow__(self, exponent: cirq.TParamVal) -> common_gates.ZPowGate:
161
162
  return common_gates.ZPowGate(exponent=exponent) if exponent != 1 else _PauliZ()
162
163
 
163
- def _with_exponent(self, exponent: 'cirq.TParamVal') -> common_gates.ZPowGate:
164
+ def _with_exponent(self, exponent: cirq.TParamVal) -> common_gates.ZPowGate:
164
165
  return self.__pow__(exponent)
165
166
 
166
167
  @classmethod
@@ -170,7 +171,7 @@ class _PauliZ(Pauli, common_gates.ZPowGate):
170
171
  return Pauli._XYZ[2]
171
172
 
172
173
  @property
173
- def basis(self) -> Dict[int, '_ZEigenState']:
174
+ def basis(self) -> dict[int, _ZEigenState]:
174
175
  from cirq.value.product_state import _ZEigenState
175
176
 
176
177
  return {+1: _ZEigenState(+1), -1: _ZEigenState(-1)}
@@ -12,6 +12,8 @@
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 itertools
16
18
 
17
19
  import numpy as np
@@ -20,14 +22,14 @@ import pytest
20
22
  import cirq
21
23
 
22
24
 
23
- def test_equals():
25
+ def test_equals() -> None:
24
26
  eq = cirq.testing.EqualsTester()
25
27
  eq.add_equality_group(cirq.X, cirq.ops.pauli_gates.X, cirq.XPowGate())
26
28
  eq.add_equality_group(cirq.Y, cirq.ops.pauli_gates.Y, cirq.YPowGate())
27
29
  eq.add_equality_group(cirq.Z, cirq.ops.pauli_gates.Z, cirq.ZPowGate())
28
30
 
29
31
 
30
- def test_phased_pauli_product():
32
+ def test_phased_pauli_product() -> None:
31
33
  assert cirq.X.phased_pauli_product(cirq.I) == (1, cirq.X)
32
34
  assert cirq.X.phased_pauli_product(cirq.X) == (1, cirq.I)
33
35
  assert cirq.X.phased_pauli_product(cirq.Y) == (1j, cirq.Z)
@@ -44,7 +46,7 @@ def test_phased_pauli_product():
44
46
  assert cirq.Z.phased_pauli_product(cirq.Z) == (1, cirq.I)
45
47
 
46
48
 
47
- def test_isinstance():
49
+ def test_isinstance() -> None:
48
50
  assert isinstance(cirq.X, cirq.XPowGate)
49
51
  assert isinstance(cirq.Y, cirq.YPowGate)
50
52
  assert isinstance(cirq.Z, cirq.ZPowGate)
@@ -59,14 +61,14 @@ def test_isinstance():
59
61
  assert not isinstance(cirq.Z, cirq.YPowGate)
60
62
 
61
63
 
62
- def test_by_index():
64
+ def test_by_index() -> None:
63
65
  eq = cirq.testing.EqualsTester()
64
66
  eq.add_equality_group(cirq.X, *[cirq.Pauli.by_index(i) for i in (-3, 0, 3, 6)])
65
67
  eq.add_equality_group(cirq.Y, *[cirq.Pauli.by_index(i) for i in (-2, 1, 4, 7)])
66
68
  eq.add_equality_group(cirq.Z, *[cirq.Pauli.by_index(i) for i in (-1, 2, 5, 8)])
67
69
 
68
70
 
69
- def test_relative_index():
71
+ def test_relative_index() -> None:
70
72
  assert cirq.X.relative_index(cirq.X) == 0
71
73
  assert cirq.X.relative_index(cirq.Y) == -1
72
74
  assert cirq.X.relative_index(cirq.Z) == 1
@@ -78,7 +80,7 @@ def test_relative_index():
78
80
  assert cirq.Z.relative_index(cirq.Z) == 0
79
81
 
80
82
 
81
- def test_by_relative_index():
83
+ def test_by_relative_index() -> None:
82
84
  assert cirq.Pauli.by_relative_index(cirq.X, -1) == cirq.Z
83
85
  assert cirq.Pauli.by_relative_index(cirq.X, 0) == cirq.X
84
86
  assert cirq.Pauli.by_relative_index(cirq.X, 1) == cirq.Y
@@ -96,7 +98,7 @@ def test_by_relative_index():
96
98
  assert cirq.Pauli.by_relative_index(cirq.Z, 3) == cirq.Z
97
99
 
98
100
 
99
- def test_too_many_qubits():
101
+ def test_too_many_qubits() -> None:
100
102
  a, b = cirq.LineQubit.range(2)
101
103
  with pytest.raises(ValueError, match='single qubit'):
102
104
  _ = cirq.X.on(a, b)
@@ -106,14 +108,14 @@ def test_too_many_qubits():
106
108
  _ = x.with_qubits(a, b)
107
109
 
108
110
 
109
- def test_relative_index_consistency():
111
+ def test_relative_index_consistency() -> None:
110
112
  for pauli_1 in (cirq.X, cirq.Y, cirq.Z):
111
113
  for pauli_2 in (cirq.X, cirq.Y, cirq.Z):
112
114
  shift = pauli_2.relative_index(pauli_1)
113
115
  assert cirq.Pauli.by_relative_index(pauli_1, shift) == pauli_2
114
116
 
115
117
 
116
- def test_gt():
118
+ def test_gt() -> None:
117
119
  assert not cirq.X > cirq.X
118
120
  assert not cirq.X > cirq.Y
119
121
  assert cirq.X > cirq.Z
@@ -125,12 +127,12 @@ def test_gt():
125
127
  assert not cirq.Z > cirq.Z
126
128
 
127
129
 
128
- def test_gt_other_type():
130
+ def test_gt_other_type() -> None:
129
131
  with pytest.raises(TypeError):
130
132
  _ = cirq.X > object()
131
133
 
132
134
 
133
- def test_lt():
135
+ def test_lt() -> None:
134
136
  assert not cirq.X < cirq.X
135
137
  assert cirq.X < cirq.Y
136
138
  assert not cirq.X < cirq.Z
@@ -142,24 +144,24 @@ def test_lt():
142
144
  assert not cirq.Z < cirq.Z
143
145
 
144
146
 
145
- def test_lt_other_type():
147
+ def test_lt_other_type() -> None:
146
148
  with pytest.raises(TypeError):
147
149
  _ = cirq.X < object()
148
150
 
149
151
 
150
- def test_str():
152
+ def test_str() -> None:
151
153
  assert str(cirq.X) == 'X'
152
154
  assert str(cirq.Y) == 'Y'
153
155
  assert str(cirq.Z) == 'Z'
154
156
 
155
157
 
156
- def test_repr():
158
+ def test_repr() -> None:
157
159
  assert repr(cirq.X) == 'cirq.X'
158
160
  assert repr(cirq.Y) == 'cirq.Y'
159
161
  assert repr(cirq.Z) == 'cirq.Z'
160
162
 
161
163
 
162
- def test_third():
164
+ def test_third() -> None:
163
165
  assert cirq.X.third(cirq.Y) == cirq.Z
164
166
  assert cirq.Y.third(cirq.X) == cirq.Z
165
167
  assert cirq.Y.third(cirq.Z) == cirq.X
@@ -172,7 +174,7 @@ def test_third():
172
174
  assert cirq.Z.third(cirq.Z) == cirq.Z
173
175
 
174
176
 
175
- def test_commutes():
177
+ def test_commutes() -> None:
176
178
  for A, B in itertools.product([cirq.X, cirq.Y, cirq.Z], repeat=2):
177
179
  assert cirq.commutes(A, B) == (A == B)
178
180
  with pytest.raises(TypeError):
@@ -181,19 +183,19 @@ def test_commutes():
181
183
  assert cirq.commutes(cirq.Z, cirq.read_json(json_text=cirq.to_json(cirq.Z)))
182
184
 
183
185
 
184
- def test_unitary():
186
+ def test_unitary() -> None:
185
187
  np.testing.assert_equal(cirq.unitary(cirq.X), cirq.unitary(cirq.X))
186
188
  np.testing.assert_equal(cirq.unitary(cirq.Y), cirq.unitary(cirq.Y))
187
189
  np.testing.assert_equal(cirq.unitary(cirq.Z), cirq.unitary(cirq.Z))
188
190
 
189
191
 
190
- def test_apply_unitary():
192
+ def test_apply_unitary() -> None:
191
193
  cirq.testing.assert_has_consistent_apply_unitary(cirq.X)
192
194
  cirq.testing.assert_has_consistent_apply_unitary(cirq.Y)
193
195
  cirq.testing.assert_has_consistent_apply_unitary(cirq.Z)
194
196
 
195
197
 
196
- def test_identity_multiplication():
198
+ def test_identity_multiplication() -> None:
197
199
  a, b, c = cirq.LineQubit.range(3)
198
200
  assert cirq.X(a) * cirq.I(a) == cirq.X(a)
199
201
  assert cirq.X(a) * cirq.I(b) == cirq.X(a)
@@ -207,7 +209,7 @@ def test_identity_multiplication():
207
209
  _ = cirq.I(a) * str(cirq.Y(b))
208
210
 
209
211
 
210
- def test_powers():
212
+ def test_powers() -> None:
211
213
  assert isinstance(cirq.X, cirq.Pauli)
212
214
  assert isinstance(cirq.Y, cirq.Pauli)
213
215
  assert isinstance(cirq.Z, cirq.Pauli)
@@ -221,3 +223,10 @@ def test_powers():
221
223
  assert isinstance(cirq.X**1, cirq.Pauli)
222
224
  assert isinstance(cirq.Y**1, cirq.Pauli)
223
225
  assert isinstance(cirq.Z**1, cirq.Pauli)
226
+
227
+ with pytest.raises(TypeError, match="Gate exponent must be a number or sympy expression."):
228
+ assert cirq.X ** 'text'
229
+ with pytest.raises(TypeError, match="Gate exponent must be a number or sympy expression."):
230
+ assert cirq.Y ** 'text'
231
+ with pytest.raises(TypeError, match="Gate exponent must be a number or sympy expression."):
232
+ assert cirq.Z ** 'text'
@@ -12,7 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Any, Dict, Iterator, List, Sequence, Tuple, TYPE_CHECKING
15
+ from __future__ import annotations
16
+
17
+ from typing import Any, Iterator, Sequence, TYPE_CHECKING
16
18
 
17
19
  import numpy as np
18
20
 
@@ -24,7 +26,7 @@ from cirq.ops.clifford_gate import SingleQubitCliffordGate
24
26
  if TYPE_CHECKING:
25
27
  import cirq
26
28
 
27
- PAULI_EIGEN_MAP: Dict[pauli_gates.Pauli, Tuple[np.ndarray, np.ndarray]] = {
29
+ PAULI_EIGEN_MAP: dict[pauli_gates.Pauli, tuple[np.ndarray, np.ndarray]] = {
28
30
  pauli_gates.X: (np.array([[0.5, 0.5], [0.5, 0.5]]), np.array([[0.5, -0.5], [-0.5, 0.5]])),
29
31
  pauli_gates.Y: (np.array([[0.5, -0.5j], [0.5j, 0.5]]), np.array([[0.5, 0.5j], [-0.5j, 0.5]])),
30
32
  pauli_gates.Z: (np.diag([1, 0]), np.diag([0, 1])),
@@ -35,8 +37,8 @@ PAULI_EIGEN_MAP: Dict[pauli_gates.Pauli, Tuple[np.ndarray, np.ndarray]] = {
35
37
  class PauliInteractionGate(gate_features.InterchangeableQubitsGate, eigen_gate.EigenGate):
36
38
  """A CZ conjugated by arbitrary single qubit Cliffords."""
37
39
 
38
- CZ: 'PauliInteractionGate'
39
- CNOT: 'PauliInteractionGate'
40
+ CZ: PauliInteractionGate
41
+ CNOT: PauliInteractionGate
40
42
 
41
43
  def __init__(
42
44
  self,
@@ -66,7 +68,7 @@ class PauliInteractionGate(gate_features.InterchangeableQubitsGate, eigen_gate.E
66
68
  self._invert1 = invert1
67
69
 
68
70
  @property
69
- def pauli0(self) -> 'cirq.Pauli':
71
+ def pauli0(self) -> cirq.Pauli:
70
72
  return self._pauli0
71
73
 
72
74
  @property
@@ -74,7 +76,7 @@ class PauliInteractionGate(gate_features.InterchangeableQubitsGate, eigen_gate.E
74
76
  return self._invert0
75
77
 
76
78
  @property
77
- def pauli1(self) -> 'cirq.Pauli':
79
+ def pauli1(self) -> cirq.Pauli:
78
80
  return self._pauli1
79
81
 
80
82
  @property
@@ -98,15 +100,15 @@ class PauliInteractionGate(gate_features.InterchangeableQubitsGate, eigen_gate.E
98
100
  return 0
99
101
  return index
100
102
 
101
- def _with_exponent(self, exponent: value.TParamVal) -> 'PauliInteractionGate':
103
+ def _with_exponent(self, exponent: value.TParamVal) -> PauliInteractionGate:
102
104
  return PauliInteractionGate(
103
105
  self.pauli0, self.invert0, self.pauli1, self.invert1, exponent=exponent
104
106
  )
105
107
 
106
- def _eigen_shifts(self) -> List[float]:
108
+ def _eigen_shifts(self) -> list[float]:
107
109
  return [0.0, 1.0]
108
110
 
109
- def _eigen_components(self) -> List[Tuple[float, np.ndarray]]:
111
+ def _eigen_components(self) -> list[tuple[float, np.ndarray]]:
110
112
  comp1 = np.kron(
111
113
  PAULI_EIGEN_MAP[self.pauli0][not self.invert0],
112
114
  PAULI_EIGEN_MAP[self.pauli1][not self.invert1],
@@ -114,7 +116,7 @@ class PauliInteractionGate(gate_features.InterchangeableQubitsGate, eigen_gate.E
114
116
  comp0 = np.eye(4) - comp1
115
117
  return [(0, comp0), (1, comp1)]
116
118
 
117
- def _decompose_(self, qubits: Sequence['cirq.Qid']) -> Iterator['cirq.OP_TREE']:
119
+ def _decompose_(self, qubits: Sequence[cirq.Qid]) -> Iterator[cirq.OP_TREE]:
118
120
  q0, q1 = qubits
119
121
  right_gate0 = SingleQubitCliffordGate.from_single_map(z_to=(self.pauli0, self.invert0))
120
122
  right_gate1 = SingleQubitCliffordGate.from_single_map(z_to=(self.pauli1, self.invert1))
@@ -127,14 +129,8 @@ class PauliInteractionGate(gate_features.InterchangeableQubitsGate, eigen_gate.E
127
129
  yield right_gate0(q0)
128
130
  yield right_gate1(q1)
129
131
 
130
- def _circuit_diagram_info_(
131
- self, args: 'cirq.CircuitDiagramInfoArgs'
132
- ) -> 'cirq.CircuitDiagramInfo':
133
- labels: Dict['cirq.Pauli', str] = {
134
- pauli_gates.X: 'X',
135
- pauli_gates.Y: 'Y',
136
- pauli_gates.Z: '@',
137
- }
132
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> cirq.CircuitDiagramInfo:
133
+ labels: dict[cirq.Pauli, str] = {pauli_gates.X: 'X', pauli_gates.Y: 'Y', pauli_gates.Z: '@'}
138
134
  l0 = labels[self.pauli0]
139
135
  l1 = labels[self.pauli1]
140
136
  # Add brackets around letter if inverted
@@ -153,7 +149,7 @@ class PauliInteractionGate(gate_features.InterchangeableQubitsGate, eigen_gate.E
153
149
  return base
154
150
  return f'({base}**{proper_repr(self._exponent)})'
155
151
 
156
- def _json_dict_(self) -> Dict[str, Any]:
152
+ def _json_dict_(self) -> dict[str, Any]:
157
153
  return protocols.obj_to_dict_helper(self, ["pauli0", "invert0", "pauli1", "invert1"])
158
154
 
159
155