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
@@ -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 numpy as np
16
18
  import pytest
17
19
 
@@ -19,8 +21,10 @@ import cirq
19
21
  import cirq.testing
20
22
  from cirq import linalg
21
23
 
24
+ _DEFAULT_ARRAY = np.asarray([1])
25
+
22
26
 
23
- def test_reflection_matrix_pow_consistent_results():
27
+ def test_reflection_matrix_pow_consistent_results() -> None:
24
28
  x = np.array([[0, 1], [1, 0]])
25
29
  sqrt_x = cirq.reflection_matrix_pow(x, 0.5)
26
30
  np.testing.assert_allclose(np.dot(sqrt_x, sqrt_x), x, atol=1e-10)
@@ -40,7 +44,7 @@ def test_reflection_matrix_pow_consistent_results():
40
44
  np.testing.assert_allclose(np.dot(sqrt_yh, sqrt_yh), yh, atol=1e-10)
41
45
 
42
46
 
43
- def test_reflection_matrix_sign_preference_under_perturbation():
47
+ def test_reflection_matrix_sign_preference_under_perturbation() -> None:
44
48
  x = np.array([[0, 1], [1, 0]])
45
49
  sqrt_x = np.array([[1, -1j], [-1j, 1]]) * (1 + 1j) / 2
46
50
  np.testing.assert_allclose(cirq.reflection_matrix_pow(x, 0.5), sqrt_x, atol=1e-8)
@@ -55,7 +59,7 @@ def test_reflection_matrix_sign_preference_under_perturbation():
55
59
  np.testing.assert_allclose(sqrt_px, expected_sqrt_px, atol=1e-10)
56
60
 
57
61
 
58
- def test_match_global_phase():
62
+ def test_match_global_phase() -> None:
59
63
  a = np.array([[5, 4], [3, -2]])
60
64
  b = np.array([[0.000001, 0], [0, 1j]])
61
65
  c, d = cirq.match_global_phase(a, b)
@@ -63,7 +67,7 @@ def test_match_global_phase():
63
67
  np.testing.assert_allclose(d, b * -1j, atol=1e-10)
64
68
 
65
69
 
66
- def test_match_global_phase_incompatible_shape():
70
+ def test_match_global_phase_incompatible_shape() -> None:
67
71
  a = np.array([1])
68
72
  b = np.array([1, 2])
69
73
  c, d = cirq.match_global_phase(a, b)
@@ -85,7 +89,7 @@ def test_match_global_phase_incompatible_shape():
85
89
  assert np.allclose(d, b)
86
90
 
87
91
 
88
- def test_match_global_phase_zeros():
92
+ def test_match_global_phase_zeros() -> None:
89
93
  z = np.array([[0, 0], [0, 0]])
90
94
  b = np.array([[1, 1], [1, 1]])
91
95
 
@@ -102,7 +106,7 @@ def test_match_global_phase_zeros():
102
106
  np.testing.assert_allclose(z, z4, atol=1e-10)
103
107
 
104
108
 
105
- def test_match_global_no_float_error_when_axis_aligned():
109
+ def test_match_global_no_float_error_when_axis_aligned() -> None:
106
110
  a = np.array([[1, 1.1], [-1.3, np.pi]])
107
111
  a2, _ = cirq.match_global_phase(a, a)
108
112
  a3, _ = cirq.match_global_phase(a * 1j, a * 1j)
@@ -115,7 +119,7 @@ def test_match_global_no_float_error_when_axis_aligned():
115
119
  assert np.all(a5 == a)
116
120
 
117
121
 
118
- def test_targeted_left_multiply_matches_kron_then_dot():
122
+ def test_targeted_left_multiply_matches_kron_then_dot() -> None:
119
123
  t = np.array([1, 2, 3, 4, 5, 6, 7, 8])
120
124
  m = np.array([[2, 3], [5, 7]])
121
125
  i = np.eye(2)
@@ -159,7 +163,7 @@ def test_targeted_left_multiply_matches_kron_then_dot():
159
163
  cirq.targeted_left_multiply(left_matrix=m, right_target=common, out=m, target_axes=[2])
160
164
 
161
165
 
162
- def test_targeted_left_multiply_reorders_matrices():
166
+ def test_targeted_left_multiply_reorders_matrices() -> None:
163
167
  t = np.eye(4).reshape((2, 2, 2, 2))
164
168
  m = np.array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0]).reshape((2, 2, 2, 2))
165
169
 
@@ -174,7 +178,7 @@ def test_targeted_left_multiply_reorders_matrices():
174
178
  )
175
179
 
176
180
 
177
- def test_targeted_left_multiply_out():
181
+ def test_targeted_left_multiply_out() -> None:
178
182
  left = np.array([[2, 3], [5, 7]])
179
183
  right = np.array([1, -1])
180
184
  out = np.zeros(2)
@@ -186,7 +190,7 @@ def test_targeted_left_multiply_out():
186
190
  np.testing.assert_allclose(result, np.array([-1, -2]), atol=1e-8)
187
191
 
188
192
 
189
- def test_targeted_conjugate_simple():
193
+ def test_targeted_conjugate_simple() -> None:
190
194
  a = np.array([[0, 1j], [0, 0]])
191
195
  # yapf: disable
192
196
  b = np.reshape(
@@ -210,7 +214,7 @@ def test_targeted_conjugate_simple():
210
214
  np.testing.assert_almost_equal(result, expected)
211
215
 
212
216
 
213
- def test_targeted_conjugate():
217
+ def test_targeted_conjugate() -> None:
214
218
  a = np.reshape([0, 1, 2j, 3j], (2, 2))
215
219
  b = np.reshape(np.arange(16), (2,) * 4)
216
220
  result = cirq.targeted_conjugate_about(a, b, [0])
@@ -222,7 +226,7 @@ def test_targeted_conjugate():
222
226
  np.testing.assert_almost_equal(result, expected)
223
227
 
224
228
 
225
- def test_targeted_conjugate_multiple_indices():
229
+ def test_targeted_conjugate_multiple_indices() -> None:
226
230
  a = np.reshape(np.arange(16) + 1j, (2, 2, 2, 2))
227
231
  b = np.reshape(np.arange(16), (2,) * 4)
228
232
  result = cirq.targeted_conjugate_about(a, b, [0, 1])
@@ -230,7 +234,7 @@ def test_targeted_conjugate_multiple_indices():
230
234
  np.testing.assert_almost_equal(result, expected)
231
235
 
232
236
 
233
- def test_targeted_conjugate_multiple_indices_flip_order():
237
+ def test_targeted_conjugate_multiple_indices_flip_order() -> None:
234
238
  a = np.reshape(np.arange(16) + 1j, (2, 2, 2, 2))
235
239
  b = np.reshape(np.arange(16), (2,) * 4)
236
240
  result = cirq.targeted_conjugate_about(a, b, [1, 0], [3, 2])
@@ -238,7 +242,7 @@ def test_targeted_conjugate_multiple_indices_flip_order():
238
242
  np.testing.assert_almost_equal(result, expected)
239
243
 
240
244
 
241
- def test_targeted_conjugate_out():
245
+ def test_targeted_conjugate_out() -> None:
242
246
  a = np.reshape([0, 1, 2j, 3j], (2, 2))
243
247
  b = np.reshape(np.arange(16), (2,) * 4)
244
248
  buffer = np.empty((2,) * 4, dtype=a.dtype)
@@ -249,7 +253,7 @@ def test_targeted_conjugate_out():
249
253
  np.testing.assert_almost_equal(result, expected)
250
254
 
251
255
 
252
- def test_apply_matrix_to_slices():
256
+ def test_apply_matrix_to_slices() -> None:
253
257
  # Output is input.
254
258
  with pytest.raises(ValueError, match='out'):
255
259
  target = np.eye(2)
@@ -301,7 +305,7 @@ def test_apply_matrix_to_slices():
301
305
  np.testing.assert_allclose(actual, np.array([1, 13, 31, 4]))
302
306
 
303
307
 
304
- def test_partial_trace():
308
+ def test_partial_trace() -> None:
305
309
  a = np.reshape(np.arange(4), (2, 2))
306
310
  b = np.reshape(np.arange(9) + 4, (3, 3))
307
311
  c = np.reshape(np.arange(16) + 13, (4, 4))
@@ -335,21 +339,21 @@ def test_partial_trace():
335
339
  )
336
340
 
337
341
 
338
- def test_partial_trace_non_kron():
342
+ def test_partial_trace_non_kron() -> None:
339
343
  tensor = np.zeros((2, 2, 2, 2))
340
344
  tensor[0, 0, 0, 0] = 1
341
345
  tensor[1, 1, 1, 1] = 4
342
346
  np.testing.assert_almost_equal(cirq.partial_trace(tensor, [0]), np.array([[1, 0], [0, 4]]))
343
347
 
344
348
 
345
- def test_partial_trace_invalid_inputs():
349
+ def test_partial_trace_invalid_inputs() -> None:
346
350
  with pytest.raises(ValueError, match='2, 3, 2, 2'):
347
351
  cirq.partial_trace(np.reshape(np.arange(2 * 3 * 2 * 2), (2, 3, 2, 2)), [1])
348
352
  with pytest.raises(ValueError, match='2'):
349
353
  cirq.partial_trace(np.reshape(np.arange(2 * 2 * 2 * 2), (2,) * 4), [2])
350
354
 
351
355
 
352
- def test_sub_state_vector():
356
+ def test_sub_state_vector() -> None:
353
357
  a = np.arange(4) / np.linalg.norm(np.arange(4))
354
358
  b = (np.arange(8) + 3) / np.linalg.norm(np.arange(8) + 3)
355
359
  c = (np.arange(16) + 1) / np.linalg.norm(np.arange(16) + 1)
@@ -382,40 +386,66 @@ def test_sub_state_vector():
382
386
  )
383
387
 
384
388
  # Reject factoring for very tight tolerance.
385
- assert cirq.sub_state_vector(state, [0, 1], default=None, atol=1e-16) is None
386
- assert cirq.sub_state_vector(state, [2, 3, 4], default=None, atol=1e-16) is None
387
- assert cirq.sub_state_vector(state, [5, 6, 7, 8], default=None, atol=1e-16) is None
389
+ assert (
390
+ cirq.sub_state_vector(state, [0, 1], default=_DEFAULT_ARRAY, atol=1e-16) is _DEFAULT_ARRAY
391
+ )
392
+ assert (
393
+ cirq.sub_state_vector(state, [2, 3, 4], default=_DEFAULT_ARRAY, atol=1e-16)
394
+ is _DEFAULT_ARRAY
395
+ )
396
+ assert (
397
+ cirq.sub_state_vector(state, [5, 6, 7, 8], default=_DEFAULT_ARRAY, atol=1e-16)
398
+ is _DEFAULT_ARRAY
399
+ )
388
400
 
389
401
  # Permit invalid factoring for loose tolerance.
390
402
  for q1 in range(9):
391
- assert cirq.sub_state_vector(state, [q1], default=None, atol=1) is not None
403
+ assert (
404
+ cirq.sub_state_vector(state, [q1], default=_DEFAULT_ARRAY, atol=1) is not _DEFAULT_ARRAY
405
+ )
392
406
 
393
407
 
394
- def test_sub_state_vector_bad_subset():
408
+ def test_sub_state_vector_bad_subset() -> None:
395
409
  a = cirq.testing.random_superposition(4)
396
410
  b = cirq.testing.random_superposition(8)
397
411
  state = np.kron(a, b).reshape((2, 2, 2, 2, 2))
398
412
 
399
413
  for q1 in range(5):
400
- assert cirq.sub_state_vector(state, [q1], default=None, atol=1e-8) is None
414
+ assert (
415
+ cirq.sub_state_vector(state, [q1], default=_DEFAULT_ARRAY, atol=1e-8) is _DEFAULT_ARRAY
416
+ )
401
417
  for q1 in range(2):
402
418
  for q2 in range(2, 5):
403
- assert cirq.sub_state_vector(state, [q1, q2], default=None, atol=1e-8) is None
419
+ assert (
420
+ cirq.sub_state_vector(state, [q1, q2], default=_DEFAULT_ARRAY, atol=1e-8)
421
+ is _DEFAULT_ARRAY
422
+ )
404
423
  for q3 in range(2, 5):
405
- assert cirq.sub_state_vector(state, [0, 1, q3], default=None, atol=1e-8) is None
424
+ assert (
425
+ cirq.sub_state_vector(state, [0, 1, q3], default=_DEFAULT_ARRAY, atol=1e-8)
426
+ is _DEFAULT_ARRAY
427
+ )
406
428
  for q4 in range(2):
407
- assert cirq.sub_state_vector(state, [2, 3, 4, q4], default=None, atol=1e-8) is None
429
+ assert (
430
+ cirq.sub_state_vector(state, [2, 3, 4, q4], default=_DEFAULT_ARRAY, atol=1e-8)
431
+ is _DEFAULT_ARRAY
432
+ )
408
433
 
409
434
 
410
- def test_sub_state_vector_non_kron():
435
+ def test_sub_state_vector_non_kron() -> None:
411
436
  a = np.array([1, 0, 0, 0, 0, 0, 0, 1]) / np.sqrt(2)
412
437
  b = np.array([1, 1]) / np.sqrt(2)
413
438
  state = np.kron(a, b).reshape((2, 2, 2, 2))
414
439
 
415
440
  for q1 in [0, 1, 2]:
416
- assert cirq.sub_state_vector(state, [q1], default=None, atol=1e-8) is None
441
+ assert (
442
+ cirq.sub_state_vector(state, [q1], default=_DEFAULT_ARRAY, atol=1e-8) is _DEFAULT_ARRAY
443
+ )
417
444
  for q1 in [0, 1, 2]:
418
- assert cirq.sub_state_vector(state, [q1, 3], default=None, atol=1e-8) is None
445
+ assert (
446
+ cirq.sub_state_vector(state, [q1, 3], default=_DEFAULT_ARRAY, atol=1e-8)
447
+ is _DEFAULT_ARRAY
448
+ )
419
449
 
420
450
  with pytest.raises(ValueError, match='factored'):
421
451
  _ = cirq.sub_state_vector(a, [0], atol=1e-8)
@@ -423,7 +453,7 @@ def test_sub_state_vector_non_kron():
423
453
  assert cirq.equal_up_to_global_phase(cirq.sub_state_vector(state, [3]), b, atol=1e-8)
424
454
 
425
455
 
426
- def test_sub_state_vector_invalid_inputs():
456
+ def test_sub_state_vector_invalid_inputs() -> None:
427
457
 
428
458
  # State cannot be expressed as a separable pure state.
429
459
  with pytest.raises(ValueError, match='7'):
@@ -450,7 +480,7 @@ def test_sub_state_vector_invalid_inputs():
450
480
  cirq.sub_state_vector(state, [0, 1, 2], atol=1e-8)
451
481
 
452
482
 
453
- def test_partial_trace_of_state_vector_as_mixture_invalid_input():
483
+ def test_partial_trace_of_state_vector_as_mixture_invalid_input() -> None:
454
484
 
455
485
  with pytest.raises(ValueError, match='7'):
456
486
  cirq.partial_trace_of_state_vector_as_mixture(np.arange(7), [1, 2], atol=1e-8)
@@ -469,7 +499,7 @@ def test_partial_trace_of_state_vector_as_mixture_invalid_input():
469
499
  cirq.partial_trace_of_state_vector_as_mixture(state, [0, 1, 2], atol=1e-8)
470
500
 
471
501
 
472
- def mixtures_equal(m1, m2, atol=1e-7):
502
+ def mixtures_equal(m1, m2, atol=1e-7) -> bool:
473
503
  for (p1, v1), (p2, v2) in zip(m1, m2):
474
504
  if not (
475
505
  cirq.approx_eq(p1, p2, atol=atol) and cirq.equal_up_to_global_phase(v1, v2, atol=atol)
@@ -478,7 +508,7 @@ def mixtures_equal(m1, m2, atol=1e-7):
478
508
  return True
479
509
 
480
510
 
481
- def test_partial_trace_of_state_vector_as_mixture_pure_result():
511
+ def test_partial_trace_of_state_vector_as_mixture_pure_result() -> None:
482
512
  a = cirq.testing.random_superposition(4)
483
513
  b = cirq.testing.random_superposition(8)
484
514
  c = cirq.testing.random_superposition(16)
@@ -532,7 +562,7 @@ def test_partial_trace_of_state_vector_as_mixture_pure_result():
532
562
  )
533
563
 
534
564
 
535
- def test_partial_trace_of_state_vector_as_mixture_pure_result_qudits():
565
+ def test_partial_trace_of_state_vector_as_mixture_pure_result_qudits() -> None:
536
566
  a = cirq.testing.random_superposition(2)
537
567
  b = cirq.testing.random_superposition(3)
538
568
  c = cirq.testing.random_superposition(4)
@@ -561,7 +591,7 @@ def test_partial_trace_of_state_vector_as_mixture_pure_result_qudits():
561
591
  )
562
592
 
563
593
 
564
- def test_partial_trace_of_state_vector_as_mixture_mixed_result():
594
+ def test_partial_trace_of_state_vector_as_mixture_mixed_result() -> None:
565
595
  state = np.array([1, 0, 0, 1]) / np.sqrt(2)
566
596
  truth = ((0.5, np.array([1, 0])), (0.5, np.array([0, 1])))
567
597
  for q1 in [0, 1]:
@@ -589,7 +619,7 @@ def test_partial_trace_of_state_vector_as_mixture_mixed_result():
589
619
  assert mixtures_equal(mixture, truth)
590
620
 
591
621
 
592
- def test_partial_trace_of_state_vector_as_mixture_mixed_result_qudits():
622
+ def test_partial_trace_of_state_vector_as_mixture_mixed_result_qudits() -> None:
593
623
  state = np.array([[1, 0, 0], [0, 0, 0], [0, 0, 1]]) / np.sqrt(2)
594
624
  truth = ((0.5, np.array([1, 0, 0])), (0.5, np.array([0, 0, 1])))
595
625
  for q1 in [0, 1]:
@@ -597,14 +627,14 @@ def test_partial_trace_of_state_vector_as_mixture_mixed_result_qudits():
597
627
  assert mixtures_equal(mixture, truth)
598
628
 
599
629
 
600
- def test_to_special():
630
+ def test_to_special() -> None:
601
631
  u = cirq.testing.random_unitary(4)
602
632
  su = cirq.to_special(u)
603
633
  assert not cirq.is_special_unitary(u)
604
634
  assert cirq.is_special_unitary(su)
605
635
 
606
636
 
607
- def test_default_tolerance():
637
+ def test_default_tolerance() -> None:
608
638
  a, b = cirq.LineQubit.range(2)
609
639
  final_state_vector = (
610
640
  cirq.Simulator()
@@ -618,7 +648,7 @@ def test_default_tolerance():
618
648
 
619
649
  @pytest.mark.parametrize('state_1', [0, 1])
620
650
  @pytest.mark.parametrize('state_2', [0, 1])
621
- def test_factor_state_vector(state_1: int, state_2: int):
651
+ def test_factor_state_vector(state_1: int, state_2: int) -> None:
622
652
  # Kron two state vectors and apply a phase. Factoring should produce the expected results.
623
653
  n = 12
624
654
  for i in range(n):
@@ -636,7 +666,7 @@ def test_factor_state_vector(state_1: int, state_2: int):
636
666
 
637
667
 
638
668
  @pytest.mark.parametrize('num_dimensions', [*range(1, 7)])
639
- def test_transpose_flattened_array(num_dimensions):
669
+ def test_transpose_flattened_array(num_dimensions) -> None:
640
670
  np.random.seed(0)
641
671
  for _ in range(10):
642
672
  shape = np.random.randint(1, 5, (num_dimensions,)).tolist()
@@ -656,7 +686,7 @@ def test_can_numpy_support_shape(shape: tuple[int, ...], result: bool) -> None:
656
686
 
657
687
 
658
688
  @pytest.mark.parametrize('coeff', [1, 1j, -1, -1j, 1j**0.5, 1j**0.3])
659
- def test_phase_delta(coeff):
689
+ def test_phase_delta(coeff) -> None:
660
690
  u1 = cirq.testing.random_unitary(4)
661
691
  u2 = u1 * coeff
662
692
  np.testing.assert_almost_equal(linalg.phase_delta(u1, u2), coeff)
@@ -12,15 +12,21 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from cirq import ops
15
+ from __future__ import annotations
16
+
17
+ from typing import TYPE_CHECKING
18
+
16
19
  from cirq.neutral_atoms import neutral_atom_devices
17
20
 
21
+ if TYPE_CHECKING:
22
+ import cirq
23
+
18
24
 
19
- def is_native_neutral_atom_op(operation: ops.Operation) -> bool:
25
+ def is_native_neutral_atom_op(operation: cirq.Operation) -> bool:
20
26
  """Returns true if the operation is in the default neutral atom gateset."""
21
27
  return operation in neutral_atom_devices.neutral_atom_gateset()
22
28
 
23
29
 
24
- def is_native_neutral_atom_gate(gate: ops.Gate) -> bool:
30
+ def is_native_neutral_atom_gate(gate: cirq.Gate) -> bool:
25
31
  """Returns true if the gate is in the default neutral atom gateset."""
26
32
  return gate in neutral_atom_devices.neutral_atom_gateset()
@@ -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 pytest
16
18
 
17
19
  import cirq
@@ -43,7 +45,7 @@ Q, Q2, Q3 = cirq.LineQubit.range(3)
43
45
  (cirq.ZPowGate(exponent=0.5)(Q).controlled_by(Q2, Q3), False),
44
46
  ],
45
47
  )
46
- def test_gateset(op: cirq.Operation, expected: bool):
48
+ def test_gateset(op: cirq.Operation, expected: bool) -> None:
47
49
  assert cirq.is_native_neutral_atom_op(op) == expected
48
50
  if op.gate is not None:
49
51
  assert cirq.is_native_neutral_atom_gate(op.gate) == expected
@@ -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
  from cirq import ops
16
18
 
17
19
 
cirq/ops/__init__.py CHANGED
@@ -17,6 +17,8 @@ from cirq.ops.arithmetic_operation import ArithmeticGate as ArithmeticGate
17
17
 
18
18
  from cirq.ops.clifford_gate import (
19
19
  CliffordGate as CliffordGate,
20
+ CXSWAP as CXSWAP,
21
+ CZSWAP as CZSWAP,
20
22
  SingleQubitCliffordGate as SingleQubitCliffordGate,
21
23
  )
22
24
 
@@ -13,9 +13,11 @@
13
13
  # limitations under the License.
14
14
  """Helper class for implementing classical arithmetic operations."""
15
15
 
16
+ from __future__ import annotations
17
+
16
18
  import abc
17
19
  import itertools
18
- from typing import cast, Iterable, List, Sequence, Tuple, TYPE_CHECKING, Union
20
+ from typing import cast, Iterable, Sequence, TYPE_CHECKING
19
21
 
20
22
  import numpy as np
21
23
  from typing_extensions import Self
@@ -42,21 +44,21 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
42
44
  >>> class Add(cirq.ArithmeticGate):
43
45
  ... def __init__(
44
46
  ... self,
45
- ... target_register: '[int, Sequence[int]]',
46
- ... input_register: 'Union[int, Sequence[int]]',
47
+ ... target_register: int | Sequence[int],
48
+ ... input_register: int | Sequence[int],
47
49
  ... ):
48
50
  ... self.target_register = target_register
49
51
  ... self.input_register = input_register
50
52
  ...
51
- ... def registers(self) -> 'Sequence[Union[int, Sequence[int]]]':
53
+ ... def registers(self) -> Sequence[int | Sequence[int]]:
52
54
  ... return self.target_register, self.input_register
53
55
  ...
54
56
  ... def with_registers(
55
- ... self, *new_registers: 'Union[int, Sequence[int]]'
57
+ ... self, *new_registers: int | Sequence[int]
56
58
  ... ) -> 'Add':
57
59
  ... return Add(*new_registers)
58
60
  ...
59
- ... def apply(self, *register_values: int) -> 'Union[int, Iterable[int]]':
61
+ ... def apply(self, *register_values: int) -> int | Iterable[int]:
60
62
  ... return sum(register_values)
61
63
  >>> cirq.unitary(
62
64
  ... Add(target_register=[2, 2],
@@ -86,7 +88,7 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
86
88
  """
87
89
 
88
90
  @abc.abstractmethod
89
- def registers(self) -> Sequence[Union[int, Sequence[int]]]:
91
+ def registers(self) -> Sequence[int | Sequence[int]]:
90
92
  """The data acted upon by the arithmetic gate.
91
93
 
92
94
  Each register in the list can either be a classical constant (an `int`),
@@ -103,7 +105,7 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
103
105
  raise NotImplementedError()
104
106
 
105
107
  @abc.abstractmethod
106
- def with_registers(self, *new_registers: Union[int, Sequence[int]]) -> Self:
108
+ def with_registers(self, *new_registers: int | Sequence[int]) -> Self:
107
109
  """Returns the same fate targeting different registers.
108
110
 
109
111
  Args:
@@ -117,7 +119,7 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
117
119
  raise NotImplementedError()
118
120
 
119
121
  @abc.abstractmethod
120
- def apply(self, *register_values: int) -> Union[int, Iterable[int]]:
122
+ def apply(self, *register_values: int) -> int | Iterable[int]:
121
123
  """Returns the result of the gate operating on classical values.
122
124
 
123
125
  For example, an addition takes two values (the target and the source),
@@ -162,7 +164,7 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
162
164
  """
163
165
  raise NotImplementedError()
164
166
 
165
- def _qid_shape_(self) -> Tuple[int, ...]:
167
+ def _qid_shape_(self) -> tuple[int, ...]:
166
168
  shape = []
167
169
  for r in self.registers():
168
170
  if isinstance(r, Sequence):
@@ -170,11 +172,11 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
170
172
  shape.append(i)
171
173
  return tuple(shape)
172
174
 
173
- def _apply_unitary_(self, args: 'cirq.ApplyUnitaryArgs'):
175
+ def _apply_unitary_(self, args: cirq.ApplyUnitaryArgs):
174
176
  registers = self.registers()
175
- input_ranges: List[Sequence[int]] = []
176
- shape: List[int] = []
177
- overflow_sizes: List[int] = []
177
+ input_ranges: list[Sequence[int]] = []
178
+ shape: list[int] = []
179
+ overflow_sizes: list[int] = []
178
180
  for register in registers:
179
181
  if isinstance(register, int):
180
182
  input_ranges.append([register])
@@ -196,8 +198,8 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
196
198
  output = self.apply(*input_seq)
197
199
 
198
200
  # Wrap into list.
199
- inputs: List[int] = list(input_seq)
200
- outputs: List[int] = [output] if isinstance(output, int) else list(output)
201
+ inputs: list[int] = list(input_seq)
202
+ outputs: list[int] = [output] if isinstance(output, int) else list(output)
201
203
 
202
204
  # Omitted tail values default to the corresponding input value.
203
205
  if len(outputs) < len(inputs):
@@ -219,8 +221,8 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
219
221
  outputs[i] %= overflow_sizes[i]
220
222
 
221
223
  # Copy amplitude to new location.
222
- cast(List[Union[int, slice]], outputs).append(slice(None))
223
- cast(List[Union[int, slice]], inputs).append(slice(None))
224
+ cast(list[int | slice], outputs).append(slice(None))
225
+ cast(list[int | slice], inputs).append(slice(None))
224
226
  dst[tuple(outputs)] = src[tuple(inputs)]
225
227
 
226
228
  # In case the reshaped arrays were copies instead of views.
@@ -231,9 +233,7 @@ class ArithmeticGate(Gate, metaclass=abc.ABCMeta):
231
233
 
232
234
 
233
235
  def _describe_bad_arithmetic_changed_const(
234
- registers: Sequence[Union[int, Sequence[Union['cirq.Qid', int]]]],
235
- inputs: List[int],
236
- outputs: List[int],
236
+ registers: Sequence[int | Sequence[cirq.Qid | int]], inputs: list[int], outputs: list[int]
237
237
  ) -> str:
238
238
  from cirq.circuits import TextDiagramDrawer
239
239
 
@@ -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 Sequence, Union
15
+ from __future__ import annotations
16
+
17
+ from typing import Sequence
16
18
 
17
19
  import numpy as np
18
20
  import pytest
@@ -32,11 +34,10 @@ def adder_matrix(target_width: int, source_width: int) -> np.ndarray:
32
34
  result = np.zeros((t, s, t, s))
33
35
  for k in range(s):
34
36
  result[:, k, :, k] = shift_matrix(t, k)
35
- result.shape = (t * s, t * s)
36
- return result
37
+ return result.reshape(t * s, t * s)
37
38
 
38
39
 
39
- def test_the_tests():
40
+ def test_the_tests() -> None:
40
41
  # fmt: off
41
42
  np.testing.assert_allclose(
42
43
  shift_matrix(4, 1),
@@ -85,12 +86,10 @@ def test_the_tests():
85
86
  )
86
87
 
87
88
 
88
- def test_arithmetic_gate_apply_unitary():
89
+ def test_arithmetic_gate_apply_unitary() -> None:
89
90
  class Add(cirq.ArithmeticGate):
90
91
  def __init__(
91
- self,
92
- target_register: Union[int, Sequence[int]],
93
- input_register: Union[int, Sequence[int]],
92
+ self, target_register: int | Sequence[int], input_register: int | Sequence[int]
94
93
  ):
95
94
  self.target_register = target_register
96
95
  self.input_register = input_register