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

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

Potentially problematic release.


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

Files changed (732) hide show
  1. cirq/__init__.py +16 -17
  2. cirq/_compat.py +21 -20
  3. cirq/_compat_test.py +14 -34
  4. cirq/_doc.py +4 -2
  5. cirq/_import.py +8 -6
  6. cirq/_import_test.py +4 -2
  7. cirq/_version.py +6 -6
  8. cirq/_version_test.py +2 -2
  9. cirq/circuits/_block_diagram_drawer.py +11 -10
  10. cirq/circuits/_block_diagram_drawer_test.py +8 -6
  11. cirq/circuits/_box_drawing_character_data.py +8 -8
  12. cirq/circuits/_box_drawing_character_data_test.py +3 -1
  13. cirq/circuits/_bucket_priority_queue.py +9 -7
  14. cirq/circuits/_bucket_priority_queue_test.py +22 -20
  15. cirq/circuits/circuit.py +248 -172
  16. cirq/circuits/circuit_operation.py +73 -83
  17. cirq/circuits/circuit_operation_test.py +128 -90
  18. cirq/circuits/circuit_test.py +211 -151
  19. cirq/circuits/frozen_circuit.py +23 -60
  20. cirq/circuits/frozen_circuit_test.py +31 -8
  21. cirq/circuits/insert_strategy.py +7 -5
  22. cirq/circuits/insert_strategy_test.py +4 -2
  23. cirq/circuits/moment.py +88 -40
  24. cirq/circuits/moment_test.py +128 -51
  25. cirq/circuits/optimization_pass.py +5 -5
  26. cirq/circuits/optimization_pass_test.py +10 -10
  27. cirq/circuits/qasm_output.py +11 -11
  28. cirq/circuits/qasm_output_test.py +25 -22
  29. cirq/circuits/text_diagram_drawer.py +23 -38
  30. cirq/circuits/text_diagram_drawer_test.py +19 -17
  31. cirq/conftest.py +4 -3
  32. cirq/contrib/__init__.py +4 -4
  33. cirq/contrib/acquaintance/__init__.py +1 -1
  34. cirq/contrib/acquaintance/bipartite.py +5 -8
  35. cirq/contrib/acquaintance/bipartite_test.py +18 -13
  36. cirq/contrib/acquaintance/devices.py +2 -2
  37. cirq/contrib/acquaintance/devices_test.py +5 -3
  38. cirq/contrib/acquaintance/executor.py +5 -5
  39. cirq/contrib/acquaintance/executor_test.py +13 -9
  40. cirq/contrib/acquaintance/gates.py +18 -28
  41. cirq/contrib/acquaintance/gates_test.py +24 -20
  42. cirq/contrib/acquaintance/inspection_utils.py +8 -4
  43. cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
  44. cirq/contrib/acquaintance/mutation_utils.py +4 -4
  45. cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
  46. cirq/contrib/acquaintance/optimizers.py +4 -4
  47. cirq/contrib/acquaintance/optimizers_test.py +4 -1
  48. cirq/contrib/acquaintance/permutation.py +15 -27
  49. cirq/contrib/acquaintance/permutation_test.py +26 -17
  50. cirq/contrib/acquaintance/shift.py +4 -4
  51. cirq/contrib/acquaintance/shift_swap_network.py +4 -4
  52. cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
  53. cirq/contrib/acquaintance/shift_test.py +8 -6
  54. cirq/contrib/acquaintance/strategies/cubic.py +2 -2
  55. cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
  56. cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
  57. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
  58. cirq/contrib/acquaintance/testing.py +2 -0
  59. cirq/contrib/acquaintance/topological_sort.py +2 -2
  60. cirq/contrib/acquaintance/topological_sort_test.py +3 -1
  61. cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
  62. cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
  63. cirq/contrib/circuitdag/circuit_dag.py +4 -4
  64. cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
  65. cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
  66. cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
  67. cirq/contrib/graph_device/graph_device.py +12 -11
  68. cirq/contrib/graph_device/graph_device_test.py +18 -14
  69. cirq/contrib/graph_device/hypergraph.py +16 -14
  70. cirq/contrib/graph_device/hypergraph_test.py +13 -11
  71. cirq/contrib/graph_device/uniform_graph_device.py +6 -4
  72. cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
  73. cirq/contrib/hacks/disable_validation.py +6 -1
  74. cirq/contrib/hacks/disable_validation_test.py +3 -1
  75. cirq/contrib/json.py +31 -5
  76. cirq/contrib/json_test.py +6 -3
  77. cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
  78. cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
  79. cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
  80. cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
  81. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
  82. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
  83. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
  84. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
  85. cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
  86. cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
  87. cirq/contrib/json_test_data/__init__.py +17 -0
  88. cirq/contrib/json_test_data/spec.py +32 -0
  89. cirq/contrib/noise_models/noise_models.py +119 -5
  90. cirq/contrib/noise_models/noise_models_test.py +37 -9
  91. cirq/contrib/paulistring/clifford_optimize.py +6 -4
  92. cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
  93. cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
  94. cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
  95. cirq/contrib/paulistring/optimize.py +2 -0
  96. cirq/contrib/paulistring/optimize_test.py +4 -3
  97. cirq/contrib/paulistring/pauli_string_dag.py +2 -0
  98. cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
  99. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
  100. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
  101. cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
  102. cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
  103. cirq/contrib/paulistring/recombine.py +6 -4
  104. cirq/contrib/paulistring/recombine_test.py +3 -1
  105. cirq/contrib/paulistring/separate.py +9 -6
  106. cirq/contrib/paulistring/separate_test.py +3 -1
  107. cirq/contrib/qasm_import/_lexer.py +3 -2
  108. cirq/contrib/qasm_import/_lexer_test.py +49 -13
  109. cirq/contrib/qasm_import/_parser.py +547 -83
  110. cirq/contrib/qasm_import/_parser_test.py +988 -97
  111. cirq/contrib/qasm_import/exception.py +2 -0
  112. cirq/contrib/qasm_import/qasm.py +8 -2
  113. cirq/contrib/qasm_import/qasm_test.py +7 -4
  114. cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
  115. cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
  116. cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
  117. cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
  118. cirq/contrib/qcircuit/qcircuit_test.py +10 -8
  119. cirq/contrib/quantum_volume/quantum_volume.py +31 -27
  120. cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
  121. cirq/contrib/quimb/density_matrix.py +15 -14
  122. cirq/contrib/quimb/density_matrix_test.py +10 -7
  123. cirq/contrib/quimb/grid_circuits.py +5 -2
  124. cirq/contrib/quimb/grid_circuits_test.py +3 -0
  125. cirq/contrib/quimb/mps_simulator.py +20 -20
  126. cirq/contrib/quimb/mps_simulator_test.py +3 -0
  127. cirq/contrib/quimb/state_vector.py +12 -11
  128. cirq/contrib/quimb/state_vector_test.py +3 -0
  129. cirq/contrib/quirk/export_to_quirk.py +5 -3
  130. cirq/contrib/quirk/export_to_quirk_test.py +18 -16
  131. cirq/contrib/quirk/linearize_circuit.py +2 -0
  132. cirq/contrib/quirk/quirk_gate.py +18 -17
  133. cirq/contrib/routing/device.py +5 -3
  134. cirq/contrib/routing/device_test.py +2 -0
  135. cirq/contrib/routing/greedy.py +10 -21
  136. cirq/contrib/routing/greedy_test.py +4 -2
  137. cirq/contrib/routing/initialization.py +2 -2
  138. cirq/contrib/routing/initialization_test.py +5 -3
  139. cirq/contrib/routing/router.py +9 -5
  140. cirq/contrib/routing/router_test.py +2 -0
  141. cirq/contrib/routing/swap_network.py +3 -3
  142. cirq/contrib/routing/swap_network_test.py +3 -1
  143. cirq/contrib/routing/utils.py +2 -2
  144. cirq/contrib/routing/utils_test.py +3 -0
  145. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
  146. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
  147. cirq/contrib/svg/svg.py +3 -3
  148. cirq/contrib/svg/svg_test.py +8 -5
  149. cirq/devices/device.py +4 -4
  150. cirq/devices/device_test.py +7 -4
  151. cirq/devices/grid_device_metadata.py +10 -10
  152. cirq/devices/grid_device_metadata_test.py +3 -0
  153. cirq/devices/grid_qubit.py +29 -21
  154. cirq/devices/grid_qubit_test.py +3 -0
  155. cirq/devices/insertion_noise_model.py +7 -7
  156. cirq/devices/insertion_noise_model_test.py +7 -5
  157. cirq/devices/line_qubit.py +13 -13
  158. cirq/devices/line_qubit_test.py +2 -0
  159. cirq/devices/named_topologies.py +18 -29
  160. cirq/devices/named_topologies_test.py +13 -10
  161. cirq/devices/noise_model.py +3 -3
  162. cirq/devices/noise_model_test.py +19 -15
  163. cirq/devices/noise_properties.py +15 -6
  164. cirq/devices/noise_properties_test.py +34 -3
  165. cirq/devices/noise_utils.py +11 -9
  166. cirq/devices/noise_utils_test.py +2 -0
  167. cirq/devices/superconducting_qubits_noise_properties.py +23 -22
  168. cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
  169. cirq/devices/thermal_noise_model.py +107 -37
  170. cirq/devices/thermal_noise_model_test.py +21 -0
  171. cirq/devices/unconstrained_device.py +5 -3
  172. cirq/devices/unconstrained_device_test.py +2 -0
  173. cirq/experiments/__init__.py +4 -2
  174. cirq/experiments/benchmarking/__init__.py +17 -0
  175. cirq/experiments/benchmarking/parallel_xeb.py +677 -0
  176. cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
  177. cirq/experiments/fidelity_estimation.py +14 -8
  178. cirq/experiments/fidelity_estimation_test.py +3 -0
  179. cirq/experiments/n_qubit_tomography.py +17 -16
  180. cirq/experiments/n_qubit_tomography_test.py +8 -5
  181. cirq/experiments/purity_estimation.py +2 -0
  182. cirq/experiments/purity_estimation_test.py +2 -0
  183. cirq/experiments/qubit_characterizations.py +207 -103
  184. cirq/experiments/qubit_characterizations_test.py +40 -12
  185. cirq/experiments/random_quantum_circuit_generation.py +56 -70
  186. cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
  187. cirq/experiments/readout_confusion_matrix.py +24 -22
  188. cirq/experiments/readout_confusion_matrix_test.py +2 -0
  189. cirq/experiments/single_qubit_readout_calibration.py +30 -15
  190. cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
  191. cirq/experiments/t1_decay_experiment.py +9 -7
  192. cirq/experiments/t1_decay_experiment_test.py +13 -11
  193. cirq/experiments/t2_decay_experiment.py +16 -13
  194. cirq/experiments/t2_decay_experiment_test.py +2 -0
  195. cirq/experiments/two_qubit_xeb.py +64 -57
  196. cirq/experiments/two_qubit_xeb_test.py +10 -6
  197. cirq/experiments/xeb_fitting.py +39 -35
  198. cirq/experiments/xeb_sampling.py +37 -44
  199. cirq/experiments/xeb_sampling_test.py +3 -0
  200. cirq/experiments/xeb_simulation.py +14 -10
  201. cirq/experiments/xeb_simulation_test.py +5 -5
  202. cirq/experiments/z_phase_calibration.py +32 -29
  203. cirq/experiments/z_phase_calibration_test.py +3 -4
  204. cirq/interop/quirk/cells/__init__.py +1 -1
  205. cirq/interop/quirk/cells/all_cells.py +7 -2
  206. cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
  207. cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
  208. cirq/interop/quirk/cells/cell.py +19 -28
  209. cirq/interop/quirk/cells/cell_test.py +3 -0
  210. cirq/interop/quirk/cells/composite_cell.py +13 -28
  211. cirq/interop/quirk/cells/composite_cell_test.py +2 -0
  212. cirq/interop/quirk/cells/control_cells.py +15 -15
  213. cirq/interop/quirk/cells/control_cells_test.py +7 -5
  214. cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
  215. cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
  216. cirq/interop/quirk/cells/ignored_cells.py +3 -0
  217. cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
  218. cirq/interop/quirk/cells/input_cells.py +7 -5
  219. cirq/interop/quirk/cells/input_cells_test.py +7 -5
  220. cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
  221. cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
  222. cirq/interop/quirk/cells/measurement_cells.py +5 -2
  223. cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
  224. cirq/interop/quirk/cells/parse.py +22 -23
  225. cirq/interop/quirk/cells/parse_test.py +12 -10
  226. cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
  227. cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
  228. cirq/interop/quirk/cells/scalar_cells.py +4 -1
  229. cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
  230. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
  231. cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
  232. cirq/interop/quirk/cells/swap_cell.py +8 -6
  233. cirq/interop/quirk/cells/swap_cell_test.py +6 -4
  234. cirq/interop/quirk/cells/testing.py +6 -6
  235. cirq/interop/quirk/cells/testing_test.py +8 -6
  236. cirq/interop/quirk/cells/unsupported_cells.py +3 -0
  237. cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
  238. cirq/interop/quirk/url_to_circuit.py +23 -36
  239. cirq/interop/quirk/url_to_circuit_test.py +4 -1
  240. cirq/json_resolver_cache.py +14 -12
  241. cirq/linalg/__init__.py +4 -6
  242. cirq/linalg/combinators.py +7 -5
  243. cirq/linalg/combinators_test.py +10 -7
  244. cirq/linalg/decompositions.py +24 -35
  245. cirq/linalg/decompositions_test.py +3 -1
  246. cirq/linalg/diagonalize.py +6 -4
  247. cirq/linalg/diagonalize_test.py +15 -14
  248. cirq/linalg/operator_spaces.py +14 -14
  249. cirq/linalg/operator_spaces_test.py +13 -11
  250. cirq/linalg/predicates.py +18 -9
  251. cirq/linalg/predicates_test.py +5 -0
  252. cirq/linalg/tolerance.py +6 -3
  253. cirq/linalg/tolerance_test.py +6 -4
  254. cirq/linalg/transformations.py +23 -20
  255. cirq/linalg/transformations_test.py +73 -43
  256. cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
  257. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
  258. cirq/neutral_atoms/neutral_atom_devices.py +2 -0
  259. cirq/ops/__init__.py +2 -0
  260. cirq/ops/arithmetic_operation.py +21 -21
  261. cirq/ops/arithmetic_operation_test.py +7 -8
  262. cirq/ops/boolean_hamiltonian.py +23 -22
  263. cirq/ops/boolean_hamiltonian_test.py +12 -9
  264. cirq/ops/classically_controlled_operation.py +31 -36
  265. cirq/ops/classically_controlled_operation_test.py +121 -117
  266. cirq/ops/clifford_gate.py +98 -81
  267. cirq/ops/clifford_gate_test.py +72 -57
  268. cirq/ops/common_channels.py +44 -44
  269. cirq/ops/common_channels_test.py +83 -81
  270. cirq/ops/common_gate_families.py +9 -7
  271. cirq/ops/common_gate_families_test.py +11 -7
  272. cirq/ops/common_gates.py +164 -183
  273. cirq/ops/common_gates_test.py +135 -95
  274. cirq/ops/control_values.py +23 -26
  275. cirq/ops/control_values_test.py +22 -20
  276. cirq/ops/controlled_gate.py +64 -112
  277. cirq/ops/controlled_gate_test.py +130 -35
  278. cirq/ops/controlled_operation.py +24 -35
  279. cirq/ops/controlled_operation_test.py +8 -6
  280. cirq/ops/dense_pauli_string.py +38 -49
  281. cirq/ops/dense_pauli_string_test.py +4 -2
  282. cirq/ops/diagonal_gate.py +18 -31
  283. cirq/ops/diagonal_gate_test.py +13 -13
  284. cirq/ops/eigen_gate.py +29 -29
  285. cirq/ops/eigen_gate_test.py +45 -28
  286. cirq/ops/fourier_transform.py +14 -20
  287. cirq/ops/fourier_transform_test.py +15 -12
  288. cirq/ops/fsim_gate.py +43 -42
  289. cirq/ops/fsim_gate_test.py +29 -29
  290. cirq/ops/gate_features.py +2 -0
  291. cirq/ops/gate_features_test.py +5 -3
  292. cirq/ops/gate_operation.py +43 -65
  293. cirq/ops/gate_operation_test.py +46 -42
  294. cirq/ops/gateset.py +28 -40
  295. cirq/ops/gateset_test.py +4 -2
  296. cirq/ops/global_phase_op.py +45 -20
  297. cirq/ops/global_phase_op_test.py +44 -20
  298. cirq/ops/greedy_qubit_manager.py +10 -8
  299. cirq/ops/greedy_qubit_manager_test.py +5 -3
  300. cirq/ops/identity.py +14 -12
  301. cirq/ops/identity_test.py +24 -20
  302. cirq/ops/kraus_channel.py +11 -8
  303. cirq/ops/kraus_channel_test.py +14 -11
  304. cirq/ops/linear_combinations.py +65 -77
  305. cirq/ops/linear_combinations_test.py +14 -9
  306. cirq/ops/matrix_gates.py +21 -18
  307. cirq/ops/matrix_gates_test.py +16 -0
  308. cirq/ops/measure_util.py +15 -20
  309. cirq/ops/measure_util_test.py +2 -0
  310. cirq/ops/measurement_gate.py +26 -37
  311. cirq/ops/measurement_gate_test.py +2 -0
  312. cirq/ops/mixed_unitary_channel.py +12 -9
  313. cirq/ops/mixed_unitary_channel_test.py +14 -11
  314. cirq/ops/named_qubit.py +16 -13
  315. cirq/ops/named_qubit_test.py +15 -13
  316. cirq/ops/op_tree.py +9 -7
  317. cirq/ops/op_tree_test.py +22 -19
  318. cirq/ops/parallel_gate.py +15 -17
  319. cirq/ops/parallel_gate_test.py +18 -16
  320. cirq/ops/parity_gates.py +23 -25
  321. cirq/ops/parity_gates_test.py +36 -32
  322. cirq/ops/pauli_gates.py +22 -21
  323. cirq/ops/pauli_gates_test.py +29 -20
  324. cirq/ops/pauli_interaction_gate.py +15 -19
  325. cirq/ops/pauli_interaction_gate_test.py +10 -8
  326. cirq/ops/pauli_measurement_gate.py +23 -35
  327. cirq/ops/pauli_measurement_gate_test.py +2 -0
  328. cirq/ops/pauli_string.py +92 -120
  329. cirq/ops/pauli_string_phasor.py +52 -45
  330. cirq/ops/pauli_string_phasor_test.py +4 -5
  331. cirq/ops/pauli_string_raw_types.py +9 -7
  332. cirq/ops/pauli_string_raw_types_test.py +2 -0
  333. cirq/ops/pauli_string_test.py +31 -154
  334. cirq/ops/pauli_sum_exponential.py +12 -12
  335. cirq/ops/pauli_sum_exponential_test.py +12 -10
  336. cirq/ops/permutation_gate.py +8 -6
  337. cirq/ops/permutation_gate_test.py +10 -8
  338. cirq/ops/phased_iswap_gate.py +16 -16
  339. cirq/ops/phased_iswap_gate_test.py +17 -15
  340. cirq/ops/phased_x_gate.py +16 -17
  341. cirq/ops/phased_x_gate_test.py +18 -16
  342. cirq/ops/phased_x_z_gate.py +24 -22
  343. cirq/ops/phased_x_z_gate_test.py +17 -11
  344. cirq/ops/projector.py +16 -11
  345. cirq/ops/projector_test.py +19 -16
  346. cirq/ops/qid_util.py +7 -5
  347. cirq/ops/qid_util_test.py +2 -0
  348. cirq/ops/qubit_manager.py +11 -9
  349. cirq/ops/qubit_manager_test.py +6 -4
  350. cirq/ops/qubit_order.py +11 -14
  351. cirq/ops/qubit_order_or_list.py +4 -2
  352. cirq/ops/qubit_order_test.py +12 -10
  353. cirq/ops/random_gate_channel.py +12 -10
  354. cirq/ops/random_gate_channel_test.py +14 -11
  355. cirq/ops/raw_types.py +109 -129
  356. cirq/ops/raw_types_test.py +63 -57
  357. cirq/ops/state_preparation_channel.py +7 -7
  358. cirq/ops/state_preparation_channel_test.py +11 -9
  359. cirq/ops/swap_gates.py +13 -15
  360. cirq/ops/swap_gates_test.py +19 -17
  361. cirq/ops/tags.py +5 -3
  362. cirq/ops/tags_test.py +4 -2
  363. cirq/ops/three_qubit_gates.py +43 -76
  364. cirq/ops/three_qubit_gates_test.py +19 -17
  365. cirq/ops/two_qubit_diagonal_gate.py +13 -13
  366. cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
  367. cirq/ops/uniform_superposition_gate.py +5 -3
  368. cirq/ops/uniform_superposition_gate_test.py +5 -3
  369. cirq/ops/wait_gate.py +17 -14
  370. cirq/ops/wait_gate_test.py +9 -6
  371. cirq/protocols/__init__.py +0 -3
  372. cirq/protocols/act_on_protocol.py +8 -6
  373. cirq/protocols/act_on_protocol_test.py +15 -12
  374. cirq/protocols/apply_channel_protocol.py +10 -14
  375. cirq/protocols/apply_channel_protocol_test.py +2 -0
  376. cirq/protocols/apply_mixture_protocol.py +13 -42
  377. cirq/protocols/apply_mixture_protocol_test.py +7 -5
  378. cirq/protocols/apply_unitary_protocol.py +39 -34
  379. cirq/protocols/apply_unitary_protocol_test.py +4 -1
  380. cirq/protocols/approximate_equality_protocol.py +2 -0
  381. cirq/protocols/approximate_equality_protocol_test.py +2 -0
  382. cirq/protocols/circuit_diagram_info_protocol.py +58 -42
  383. cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
  384. cirq/protocols/commutes_protocol.py +8 -7
  385. cirq/protocols/commutes_protocol_test.py +2 -0
  386. cirq/protocols/control_key_protocol.py +6 -4
  387. cirq/protocols/control_key_protocol_test.py +3 -1
  388. cirq/protocols/decompose_protocol.py +49 -48
  389. cirq/protocols/decompose_protocol_test.py +27 -16
  390. cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
  391. cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
  392. cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
  393. cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
  394. cirq/protocols/has_unitary_protocol.py +10 -6
  395. cirq/protocols/has_unitary_protocol_test.py +13 -8
  396. cirq/protocols/hash_from_pickle_test.py +2 -11
  397. cirq/protocols/inverse_protocol.py +13 -16
  398. cirq/protocols/inverse_protocol_test.py +5 -3
  399. cirq/protocols/json_serialization.py +35 -54
  400. cirq/protocols/json_serialization_test.py +14 -21
  401. cirq/protocols/json_test_data/CXSWAP.json +46 -0
  402. cirq/protocols/json_test_data/CXSWAP.repr +13 -0
  403. cirq/protocols/json_test_data/CZSWAP.json +46 -0
  404. cirq/protocols/json_test_data/CZSWAP.repr +13 -0
  405. cirq/protocols/json_test_data/CircuitOperation.json +6 -3
  406. cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
  407. cirq/protocols/json_test_data/Moment.json +24 -1
  408. cirq/protocols/json_test_data/Moment.repr +6 -1
  409. cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
  410. cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
  411. cirq/protocols/json_test_data/spec.py +6 -2
  412. cirq/protocols/kraus_protocol.py +47 -7
  413. cirq/protocols/kraus_protocol_test.py +86 -12
  414. cirq/protocols/measurement_key_protocol.py +15 -16
  415. cirq/protocols/measurement_key_protocol_test.py +13 -11
  416. cirq/protocols/mixture_protocol.py +7 -5
  417. cirq/protocols/mixture_protocol_test.py +4 -2
  418. cirq/protocols/mul_protocol.py +2 -3
  419. cirq/protocols/mul_protocol_test.py +2 -0
  420. cirq/protocols/pauli_expansion_protocol.py +6 -3
  421. cirq/protocols/pauli_expansion_protocol_test.py +5 -3
  422. cirq/protocols/phase_protocol.py +2 -0
  423. cirq/protocols/phase_protocol_test.py +3 -1
  424. cirq/protocols/pow_protocol.py +11 -16
  425. cirq/protocols/pow_protocol_test.py +2 -0
  426. cirq/protocols/qasm.py +14 -20
  427. cirq/protocols/qasm_test.py +6 -3
  428. cirq/protocols/qid_shape_protocol.py +8 -8
  429. cirq/protocols/qid_shape_protocol_test.py +3 -1
  430. cirq/protocols/resolve_parameters.py +5 -3
  431. cirq/protocols/resolve_parameters_test.py +8 -7
  432. cirq/protocols/trace_distance_bound.py +6 -4
  433. cirq/protocols/trace_distance_bound_test.py +3 -1
  434. cirq/protocols/unitary_protocol.py +17 -7
  435. cirq/protocols/unitary_protocol_test.py +12 -2
  436. cirq/qis/channels.py +6 -2
  437. cirq/qis/channels_test.py +20 -16
  438. cirq/qis/clifford_tableau.py +21 -19
  439. cirq/qis/clifford_tableau_test.py +2 -2
  440. cirq/qis/entropy.py +14 -3
  441. cirq/qis/entropy_test.py +3 -1
  442. cirq/qis/measures.py +13 -13
  443. cirq/qis/measures_test.py +20 -14
  444. cirq/qis/noise_utils.py +2 -0
  445. cirq/qis/noise_utils_test.py +9 -7
  446. cirq/qis/quantum_state_representation.py +7 -8
  447. cirq/qis/states.py +58 -56
  448. cirq/qis/states_test.py +2 -0
  449. cirq/sim/classical_simulator.py +23 -22
  450. cirq/sim/classical_simulator_test.py +2 -0
  451. cirq/sim/clifford/clifford_simulator.py +23 -21
  452. cirq/sim/clifford/clifford_simulator_test.py +7 -4
  453. cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
  454. cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
  455. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
  456. cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
  457. cirq/sim/clifford/stabilizer_sampler.py +9 -7
  458. cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
  459. cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
  460. cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
  461. cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
  462. cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
  463. cirq/sim/density_matrix_simulation_state.py +26 -27
  464. cirq/sim/density_matrix_simulation_state_test.py +10 -8
  465. cirq/sim/density_matrix_simulator.py +30 -28
  466. cirq/sim/density_matrix_simulator_test.py +48 -48
  467. cirq/sim/density_matrix_utils.py +13 -11
  468. cirq/sim/density_matrix_utils_test.py +38 -36
  469. cirq/sim/mux.py +33 -31
  470. cirq/sim/mux_test.py +3 -0
  471. cirq/sim/simulation_product_state.py +15 -15
  472. cirq/sim/simulation_product_state_test.py +29 -26
  473. cirq/sim/simulation_state.py +29 -38
  474. cirq/sim/simulation_state_base.py +21 -32
  475. cirq/sim/simulation_state_test.py +15 -13
  476. cirq/sim/simulation_utils.py +5 -2
  477. cirq/sim/simulation_utils_test.py +5 -2
  478. cirq/sim/simulator.py +90 -106
  479. cirq/sim/simulator_base.py +33 -45
  480. cirq/sim/simulator_base_test.py +20 -15
  481. cirq/sim/simulator_test.py +23 -14
  482. cirq/sim/sparse_simulator.py +19 -17
  483. cirq/sim/sparse_simulator_test.py +41 -40
  484. cirq/sim/state_vector.py +15 -12
  485. cirq/sim/state_vector_simulation_state.py +31 -31
  486. cirq/sim/state_vector_simulation_state_test.py +16 -14
  487. cirq/sim/state_vector_simulator.py +17 -14
  488. cirq/sim/state_vector_simulator_test.py +2 -0
  489. cirq/sim/state_vector_test.py +6 -3
  490. cirq/study/flatten_expressions.py +16 -15
  491. cirq/study/flatten_expressions_test.py +13 -11
  492. cirq/study/resolver.py +18 -17
  493. cirq/study/resolver_test.py +22 -20
  494. cirq/study/result.py +17 -27
  495. cirq/study/result_test.py +2 -0
  496. cirq/study/sweepable.py +12 -10
  497. cirq/study/sweepable_test.py +3 -0
  498. cirq/study/sweeps.py +42 -61
  499. cirq/study/sweeps_test.py +33 -0
  500. cirq/testing/__init__.py +7 -11
  501. cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
  502. cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
  503. cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
  504. cirq/testing/circuit_compare.py +8 -17
  505. cirq/testing/circuit_compare_test.py +2 -0
  506. cirq/testing/consistent_act_on.py +13 -11
  507. cirq/testing/consistent_act_on_test.py +5 -3
  508. cirq/testing/consistent_channels.py +2 -0
  509. cirq/testing/consistent_channels_test.py +10 -8
  510. cirq/testing/consistent_controlled_gate_op.py +5 -5
  511. cirq/testing/consistent_controlled_gate_op_test.py +18 -18
  512. cirq/testing/consistent_decomposition.py +2 -2
  513. cirq/testing/consistent_decomposition_test.py +4 -2
  514. cirq/testing/consistent_pauli_expansion.py +2 -0
  515. cirq/testing/consistent_pauli_expansion_test.py +3 -1
  516. cirq/testing/consistent_phase_by.py +2 -0
  517. cirq/testing/consistent_phase_by_test.py +3 -1
  518. cirq/testing/consistent_protocols.py +14 -20
  519. cirq/testing/consistent_protocols_test.py +13 -11
  520. cirq/testing/consistent_qasm.py +6 -4
  521. cirq/testing/consistent_qasm_test.py +7 -7
  522. cirq/testing/consistent_resolve_parameters.py +2 -0
  523. cirq/testing/consistent_specified_has_unitary.py +2 -2
  524. cirq/testing/consistent_specified_has_unitary_test.py +6 -4
  525. cirq/testing/consistent_unitary.py +1 -0
  526. cirq/testing/consistent_unitary_test.py +4 -2
  527. cirq/testing/deprecation.py +5 -2
  528. cirq/testing/deprecation_test.py +5 -2
  529. cirq/testing/devices.py +7 -4
  530. cirq/testing/devices_test.py +7 -4
  531. cirq/testing/equals_tester.py +4 -2
  532. cirq/testing/equals_tester_test.py +21 -17
  533. cirq/testing/equivalent_basis_map.py +6 -4
  534. cirq/testing/equivalent_basis_map_test.py +6 -4
  535. cirq/testing/equivalent_repr_eval.py +6 -4
  536. cirq/testing/equivalent_repr_eval_test.py +5 -3
  537. cirq/testing/gate_features.py +2 -0
  538. cirq/testing/gate_features_test.py +7 -5
  539. cirq/testing/json.py +19 -15
  540. cirq/testing/json_test.py +5 -3
  541. cirq/testing/lin_alg_utils.py +10 -11
  542. cirq/testing/lin_alg_utils_test.py +14 -12
  543. cirq/testing/logs.py +7 -6
  544. cirq/testing/logs_test.py +9 -7
  545. cirq/testing/no_identifier_qubit.py +4 -2
  546. cirq/testing/no_identifier_qubit_test.py +5 -3
  547. cirq/testing/op_tree.py +2 -0
  548. cirq/testing/op_tree_test.py +4 -1
  549. cirq/testing/order_tester.py +2 -0
  550. cirq/testing/order_tester_test.py +8 -6
  551. cirq/testing/pytest_utils.py +2 -0
  552. cirq/testing/pytest_utils_test.py +4 -2
  553. cirq/testing/random_circuit.py +21 -20
  554. cirq/testing/random_circuit_test.py +12 -9
  555. cirq/testing/repr_pretty_tester.py +1 -0
  556. cirq/testing/repr_pretty_tester_test.py +5 -3
  557. cirq/testing/routing_devices.py +4 -1
  558. cirq/testing/routing_devices_test.py +9 -6
  559. cirq/testing/sample_circuits.py +4 -1
  560. cirq/testing/sample_circuits_test.py +3 -1
  561. cirq/testing/sample_gates.py +3 -0
  562. cirq/testing/sample_gates_test.py +5 -2
  563. cirq/transformers/__init__.py +11 -4
  564. cirq/transformers/align.py +9 -7
  565. cirq/transformers/align_test.py +2 -0
  566. cirq/transformers/analytical_decompositions/__init__.py +3 -6
  567. cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
  568. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
  569. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
  570. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  571. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
  572. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
  573. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
  574. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
  575. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
  576. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
  577. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
  578. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
  579. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
  580. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
  581. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
  582. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
  583. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
  584. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
  585. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
  586. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
  587. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
  588. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
  589. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
  590. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
  591. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
  592. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
  593. cirq/transformers/drop_empty_moments.py +5 -3
  594. cirq/transformers/drop_empty_moments_test.py +4 -2
  595. cirq/transformers/drop_negligible_operations.py +7 -5
  596. cirq/transformers/drop_negligible_operations_test.py +2 -0
  597. cirq/transformers/dynamical_decoupling.py +49 -42
  598. cirq/transformers/dynamical_decoupling_test.py +223 -205
  599. cirq/transformers/eject_phased_paulis.py +28 -26
  600. cirq/transformers/eject_phased_paulis_test.py +12 -9
  601. cirq/transformers/eject_z.py +12 -12
  602. cirq/transformers/eject_z_test.py +2 -2
  603. cirq/transformers/expand_composite.py +6 -4
  604. cirq/transformers/expand_composite_test.py +3 -1
  605. cirq/transformers/gauge_compiling/__init__.py +3 -1
  606. cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
  607. cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
  608. cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
  609. cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
  610. cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
  611. cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
  612. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
  613. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
  614. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
  615. cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
  616. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
  617. cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
  618. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
  619. cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
  620. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
  621. cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
  622. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
  623. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
  624. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
  625. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
  626. cirq/transformers/insertion_sort.py +8 -6
  627. cirq/transformers/insertion_sort_test.py +3 -1
  628. cirq/transformers/measurement_transformers.py +29 -29
  629. cirq/transformers/measurement_transformers_test.py +2 -0
  630. cirq/transformers/merge_k_qubit_gates.py +12 -10
  631. cirq/transformers/merge_k_qubit_gates_test.py +18 -18
  632. cirq/transformers/merge_single_qubit_gates.py +197 -20
  633. cirq/transformers/merge_single_qubit_gates_test.py +177 -5
  634. cirq/transformers/noise_adding.py +5 -3
  635. cirq/transformers/noise_adding_test.py +2 -0
  636. cirq/transformers/optimize_for_target_gateset.py +19 -17
  637. cirq/transformers/optimize_for_target_gateset_test.py +11 -8
  638. cirq/transformers/qubit_management_transformers.py +13 -11
  639. cirq/transformers/qubit_management_transformers_test.py +5 -3
  640. cirq/transformers/randomized_measurements.py +16 -14
  641. cirq/transformers/randomized_measurements_test.py +10 -4
  642. cirq/transformers/routing/initial_mapper.py +6 -4
  643. cirq/transformers/routing/initial_mapper_test.py +2 -0
  644. cirq/transformers/routing/line_initial_mapper.py +16 -14
  645. cirq/transformers/routing/line_initial_mapper_test.py +9 -7
  646. cirq/transformers/routing/mapping_manager.py +10 -10
  647. cirq/transformers/routing/mapping_manager_test.py +2 -0
  648. cirq/transformers/routing/route_circuit_cqc.py +33 -31
  649. cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
  650. cirq/transformers/routing/visualize_routed_circuit.py +8 -7
  651. cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
  652. cirq/transformers/stratify.py +17 -15
  653. cirq/transformers/stratify_test.py +3 -0
  654. cirq/transformers/symbolize.py +103 -0
  655. cirq/transformers/symbolize_test.py +62 -0
  656. cirq/transformers/synchronize_terminal_measurements.py +10 -10
  657. cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
  658. cirq/transformers/tag_transformers.py +97 -0
  659. cirq/transformers/tag_transformers_test.py +103 -0
  660. cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
  661. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
  662. cirq/transformers/target_gatesets/cz_gateset.py +7 -5
  663. cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
  664. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
  665. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
  666. cirq/transformers/transformer_api.py +34 -47
  667. cirq/transformers/transformer_api_test.py +9 -8
  668. cirq/transformers/transformer_primitives.py +39 -49
  669. cirq/transformers/transformer_primitives_test.py +10 -17
  670. cirq/value/abc_alt.py +6 -4
  671. cirq/value/abc_alt_test.py +5 -3
  672. cirq/value/angle.py +11 -12
  673. cirq/value/angle_test.py +5 -3
  674. cirq/value/classical_data.py +27 -27
  675. cirq/value/classical_data_test.py +11 -8
  676. cirq/value/condition.py +26 -24
  677. cirq/value/condition_test.py +2 -0
  678. cirq/value/digits.py +14 -11
  679. cirq/value/digits_test.py +2 -0
  680. cirq/value/duration.py +23 -20
  681. cirq/value/duration_test.py +2 -0
  682. cirq/value/linear_dict.py +25 -30
  683. cirq/value/linear_dict_test.py +10 -8
  684. cirq/value/measurement_key.py +12 -12
  685. cirq/value/measurement_key_test.py +2 -0
  686. cirq/value/periodic_value.py +4 -4
  687. cirq/value/periodic_value_test.py +11 -7
  688. cirq/value/probability.py +3 -1
  689. cirq/value/probability_test.py +4 -2
  690. cirq/value/product_state.py +15 -13
  691. cirq/value/product_state_test.py +4 -1
  692. cirq/value/random_state.py +2 -0
  693. cirq/value/random_state_test.py +5 -3
  694. cirq/value/timestamp.py +11 -7
  695. cirq/value/timestamp_test.py +14 -12
  696. cirq/value/type_alias.py +4 -4
  697. cirq/value/value_equality_attr.py +8 -9
  698. cirq/value/value_equality_attr_test.py +14 -11
  699. cirq/vis/density_matrix.py +3 -3
  700. cirq/vis/density_matrix_test.py +20 -17
  701. cirq/vis/heatmap.py +24 -37
  702. cirq/vis/heatmap_test.py +3 -0
  703. cirq/vis/histogram.py +9 -6
  704. cirq/vis/histogram_test.py +5 -2
  705. cirq/vis/state_histogram.py +10 -8
  706. cirq/vis/state_histogram_test.py +7 -5
  707. cirq/vis/vis_utils.py +4 -1
  708. cirq/vis/vis_utils_test.py +4 -1
  709. cirq/work/collector.py +12 -18
  710. cirq/work/collector_test.py +15 -10
  711. cirq/work/observable_grouping.py +6 -7
  712. cirq/work/observable_grouping_test.py +10 -9
  713. cirq/work/observable_measurement.py +47 -45
  714. cirq/work/observable_measurement_data.py +22 -17
  715. cirq/work/observable_measurement_data_test.py +4 -1
  716. cirq/work/observable_measurement_test.py +48 -29
  717. cirq/work/observable_readout_calibration.py +5 -2
  718. cirq/work/observable_readout_calibration_test.py +5 -2
  719. cirq/work/observable_settings.py +13 -22
  720. cirq/work/observable_settings_test.py +9 -7
  721. cirq/work/pauli_sum_collector.py +12 -10
  722. cirq/work/pauli_sum_collector_test.py +9 -9
  723. cirq/work/sampler.py +42 -43
  724. cirq/work/sampler_test.py +31 -24
  725. cirq/work/zeros_sampler.py +6 -4
  726. cirq/work/zeros_sampler_test.py +7 -5
  727. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
  728. cirq_core-1.6.0.dist-info/RECORD +1241 -0
  729. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409222543.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
cirq/__init__.py CHANGED
@@ -14,6 +14,8 @@
14
14
 
15
15
  """Cirq is a framework for creating, editing, and invoking quantum circuits."""
16
16
 
17
+ # ruff: noqa: F401
18
+
17
19
  from cirq import _import
18
20
 
19
21
  from cirq._compat import __cirq_debug__ as __cirq_debug__, with_debug as with_debug
@@ -121,20 +123,19 @@ from cirq.interop import (
121
123
  )
122
124
 
123
125
  from cirq.linalg import (
124
- # pylint: disable=line-too-long
125
126
  all_near_zero as all_near_zero,
126
127
  all_near_zero_mod as all_near_zero_mod,
127
128
  allclose_up_to_global_phase as allclose_up_to_global_phase,
128
129
  apply_matrix_to_slices as apply_matrix_to_slices,
129
130
  axis_angle as axis_angle,
130
131
  AxisAngleDecomposition as AxisAngleDecomposition,
131
- bidiagonalize_real_matrix_pair_with_symmetric_products as bidiagonalize_real_matrix_pair_with_symmetric_products,
132
- bidiagonalize_unitary_with_special_orthogonals as bidiagonalize_unitary_with_special_orthogonals,
132
+ bidiagonalize_real_matrix_pair_with_symmetric_products as bidiagonalize_real_matrix_pair_with_symmetric_products, # noqa: E501
133
+ bidiagonalize_unitary_with_special_orthogonals as bidiagonalize_unitary_with_special_orthogonals, # noqa: E501
133
134
  block_diag as block_diag,
134
135
  CONTROL_TAG as CONTROL_TAG,
135
136
  deconstruct_single_qubit_matrix_into_angles as deconstruct_single_qubit_matrix_into_angles,
136
137
  density_matrix_kronecker_product as density_matrix_kronecker_product,
137
- diagonalize_real_symmetric_and_sorted_diagonal_matrices as diagonalize_real_symmetric_and_sorted_diagonal_matrices,
138
+ diagonalize_real_symmetric_and_sorted_diagonal_matrices as diagonalize_real_symmetric_and_sorted_diagonal_matrices, # noqa: E501
138
139
  diagonalize_real_symmetric_matrix as diagonalize_real_symmetric_matrix,
139
140
  dot as dot,
140
141
  expand_matrix_in_orthogonal_basis as expand_matrix_in_orthogonal_basis,
@@ -163,7 +164,7 @@ from cirq.linalg import (
163
164
  partial_trace as partial_trace,
164
165
  partial_trace_of_state_vector_as_mixture as partial_trace_of_state_vector_as_mixture,
165
166
  PAULI_BASIS as PAULI_BASIS,
166
- scatter_plot_normalized_kak_interaction_coefficients as scatter_plot_normalized_kak_interaction_coefficients,
167
+ scatter_plot_normalized_kak_interaction_coefficients as scatter_plot_normalized_kak_interaction_coefficients, # noqa: E501
167
168
  pow_pauli_combination as pow_pauli_combination,
168
169
  reflection_matrix_pow as reflection_matrix_pow,
169
170
  slice_for_qubits_equal_to as slice_for_qubits_equal_to,
@@ -205,7 +206,9 @@ from cirq.ops import (
205
206
  CSwapGate as CSwapGate,
206
207
  CX as CX,
207
208
  CXPowGate as CXPowGate,
209
+ CXSWAP as CXSWAP,
208
210
  CZ as CZ,
211
+ CZSWAP as CZSWAP,
209
212
  CZPowGate as CZPowGate,
210
213
  DensePauliString as DensePauliString,
211
214
  depolarize as depolarize,
@@ -340,20 +343,19 @@ from cirq.ops import (
340
343
 
341
344
 
342
345
  from cirq.transformers import (
343
- # pylint: disable=line-too-long
344
346
  AbstractInitialMapper as AbstractInitialMapper,
345
347
  add_dynamical_decoupling as add_dynamical_decoupling,
346
348
  align_left as align_left,
347
349
  align_right as align_right,
348
350
  CompilationTargetGateset as CompilationTargetGateset,
349
351
  CZTargetGateset as CZTargetGateset,
350
- compute_cphase_exponents_for_fsim_decomposition as compute_cphase_exponents_for_fsim_decomposition,
352
+ compute_cphase_exponents_for_fsim_decomposition as compute_cphase_exponents_for_fsim_decomposition, # noqa: E501
351
353
  create_transformer_with_kwargs as create_transformer_with_kwargs,
352
354
  decompose_clifford_tableau_to_operations as decompose_clifford_tableau_to_operations,
353
355
  decompose_cphase_into_two_fsim as decompose_cphase_into_two_fsim,
354
356
  decompose_multi_controlled_x as decompose_multi_controlled_x,
355
357
  decompose_multi_controlled_rotation as decompose_multi_controlled_rotation,
356
- decompose_two_qubit_interaction_into_four_fsim_gates as decompose_two_qubit_interaction_into_four_fsim_gates,
358
+ decompose_two_qubit_interaction_into_four_fsim_gates as decompose_two_qubit_interaction_into_four_fsim_gates, # noqa: E501
357
359
  defer_measurements as defer_measurements,
358
360
  dephase_measurements as dephase_measurements,
359
361
  drop_empty_moments as drop_empty_moments,
@@ -363,6 +365,7 @@ from cirq.transformers import (
363
365
  eject_z as eject_z,
364
366
  expand_composite as expand_composite,
365
367
  HardCodedInitialMapper as HardCodedInitialMapper,
368
+ index_tags as index_tags,
366
369
  is_negligible_turn as is_negligible_turn,
367
370
  LineInitialMapper as LineInitialMapper,
368
371
  MappingManager as MappingManager,
@@ -377,6 +380,7 @@ from cirq.transformers import (
377
380
  merge_operations_to_circuit_op as merge_operations_to_circuit_op,
378
381
  merge_single_qubit_gates_to_phased_x_and_z as merge_single_qubit_gates_to_phased_x_and_z,
379
382
  merge_single_qubit_gates_to_phxz as merge_single_qubit_gates_to_phxz,
383
+ merge_single_qubit_gates_to_phxz_symbolized as merge_single_qubit_gates_to_phxz_symbolized,
380
384
  merge_single_qubit_moments_to_phxz as merge_single_qubit_moments_to_phxz,
381
385
  optimize_for_target_gateset as optimize_for_target_gateset,
382
386
  parameterized_2q_op_to_sqrt_iswap_operations as parameterized_2q_op_to_sqrt_iswap_operations,
@@ -385,6 +389,7 @@ from cirq.transformers import (
385
389
  prepare_two_qubit_state_using_sqrt_iswap as prepare_two_qubit_state_using_sqrt_iswap,
386
390
  quantum_shannon_decomposition as quantum_shannon_decomposition,
387
391
  RouteCQC as RouteCQC,
392
+ remove_tags as remove_tags,
388
393
  routed_circuit_with_mapping as routed_circuit_with_mapping,
389
394
  SqrtIswapTargetGateset as SqrtIswapTargetGateset,
390
395
  single_qubit_matrix_to_gates as single_qubit_matrix_to_gates,
@@ -393,6 +398,7 @@ from cirq.transformers import (
393
398
  single_qubit_matrix_to_phxz as single_qubit_matrix_to_phxz,
394
399
  single_qubit_op_to_framed_phase_form as single_qubit_op_to_framed_phase_form,
395
400
  stratified_circuit as stratified_circuit,
401
+ symbolize_single_qubit_gates_by_indexed_tags as symbolize_single_qubit_gates_by_indexed_tags,
396
402
  synchronize_terminal_measurements as synchronize_terminal_measurements,
397
403
  TRANSFORMER as TRANSFORMER,
398
404
  TransformerContext as TransformerContext,
@@ -401,7 +407,7 @@ from cirq.transformers import (
401
407
  transformer as transformer,
402
408
  two_qubit_matrix_to_cz_isometry as two_qubit_matrix_to_cz_isometry,
403
409
  two_qubit_matrix_to_cz_operations as two_qubit_matrix_to_cz_operations,
404
- two_qubit_matrix_to_diagonal_and_cz_operations as two_qubit_matrix_to_diagonal_and_cz_operations,
410
+ two_qubit_matrix_to_diagonal_and_cz_operations as two_qubit_matrix_to_diagonal_and_cz_operations, # noqa: E501
405
411
  two_qubit_matrix_to_ion_operations as two_qubit_matrix_to_ion_operations,
406
412
  two_qubit_matrix_to_sqrt_iswap_operations as two_qubit_matrix_to_sqrt_iswap_operations,
407
413
  two_qubit_gate_product_tabulation as two_qubit_gate_product_tabulation,
@@ -565,7 +571,6 @@ from cirq.value import (
565
571
  ProductState as ProductState,
566
572
  )
567
573
 
568
- # pylint: disable=redefined-builtin
569
574
  from cirq.protocols import (
570
575
  act_on as act_on,
571
576
  apply_channel as apply_channel,
@@ -687,14 +692,10 @@ from cirq.work import (
687
692
  ZerosSampler as ZerosSampler,
688
693
  )
689
694
 
690
- # pylint: enable=redefined-builtin
691
695
 
692
696
  # Unflattened sub-modules.
693
697
 
694
- from cirq import testing
695
-
696
698
  # Registers cirq-core's public classes for JSON serialization.
697
- # pylint: disable=wrong-import-position
698
699
  from cirq.protocols.json_serialization import _register_resolver
699
700
  from cirq.json_resolver_cache import _class_resolver_dictionary
700
701
 
@@ -703,6 +704,4 @@ _register_resolver(_class_resolver_dictionary)
703
704
 
704
705
  # contrib's json resolver cache depends on cirq.DEFAULT_RESOLVER
705
706
 
706
- from cirq import contrib
707
-
708
- # pylint: enable=wrong-import-position
707
+ from cirq import contrib # noqa: E402
cirq/_compat.py CHANGED
@@ -13,6 +13,9 @@
13
13
  # limitations under the License.
14
14
 
15
15
  """Workarounds for compatibility issues between versions and libraries."""
16
+
17
+ from __future__ import annotations
18
+
16
19
  import contextlib
17
20
  import contextvars
18
21
  import dataclasses
@@ -25,7 +28,7 @@ import sys
25
28
  import traceback
26
29
  import warnings
27
30
  from types import ModuleType
28
- from typing import Any, Callable, Dict, Iterator, Optional, overload, Set, Tuple, Type, TypeVar
31
+ from typing import Any, Callable, Iterator, overload, TypeVar
29
32
 
30
33
  import numpy as np
31
34
  import pandas as pd
@@ -76,7 +79,7 @@ def cached_method(__func: TFunc) -> TFunc: ...
76
79
  def cached_method(*, maxsize: int = 128) -> Callable[[TFunc], TFunc]: ...
77
80
 
78
81
 
79
- def cached_method(method: Optional[TFunc] = None, *, maxsize: int = 128) -> Any:
82
+ def cached_method(method: TFunc | None = None, *, maxsize: int = 128) -> Any:
80
83
  """Decorator that adds a per-instance LRU cache for a method.
81
84
 
82
85
  Can be applied with or without parameters to customize the underlying cache:
@@ -192,7 +195,7 @@ def proper_repr(value: Any) -> str:
192
195
  f'\n)'
193
196
  )
194
197
 
195
- if isinstance(value, Dict):
198
+ if isinstance(value, dict):
196
199
  return '{' + ','.join(f"{proper_repr(k)}: {proper_repr(v)}" for k, v in value.items()) + '}'
197
200
 
198
201
  if hasattr(value, "__qualname__"):
@@ -285,7 +288,7 @@ def _validate_deadline(deadline: str):
285
288
 
286
289
 
287
290
  def deprecated(
288
- *, deadline: str, fix: str, name: Optional[str] = None
291
+ *, deadline: str, fix: str, name: str | None = None
289
292
  ) -> Callable[[Callable], Callable]:
290
293
  """Marks a function as deprecated.
291
294
 
@@ -326,9 +329,7 @@ def deprecated(
326
329
  return decorator
327
330
 
328
331
 
329
- def deprecated_class(
330
- *, deadline: str, fix: str, name: Optional[str] = None
331
- ) -> Callable[[Type], Type]:
332
+ def deprecated_class(*, deadline: str, fix: str, name: str | None = None) -> Callable[[type], type]:
332
333
  """Marks a class as deprecated.
333
334
 
334
335
  Args:
@@ -345,7 +346,7 @@ def deprecated_class(
345
346
 
346
347
  _validate_deadline(deadline)
347
348
 
348
- def decorator(clazz: Type) -> Type:
349
+ def decorator(clazz: type) -> type:
349
350
  clazz_new = clazz.__new__
350
351
 
351
352
  def patched_new(cls, *args, **kwargs):
@@ -375,12 +376,12 @@ def deprecated_parameter(
375
376
  *,
376
377
  deadline: str,
377
378
  fix: str,
378
- func_name: Optional[str] = None,
379
+ func_name: str | None = None,
379
380
  parameter_desc: str,
380
- match: Callable[[Tuple[Any, ...], Dict[str, Any]], bool],
381
- rewrite: Optional[
382
- Callable[[Tuple[Any, ...], Dict[str, Any]], Tuple[Tuple[Any, ...], Dict[str, Any]]]
383
- ] = None,
381
+ match: Callable[[tuple[Any, ...], dict[str, Any]], bool],
382
+ rewrite: (
383
+ Callable[[tuple[Any, ...], dict[str, Any]], tuple[tuple[Any, ...], dict[str, Any]]] | None
384
+ ) = None,
384
385
  ) -> Callable[[Callable], Callable]:
385
386
  """Marks a function parameter as deprecated.
386
387
 
@@ -444,7 +445,7 @@ def deprecated_parameter(
444
445
  return decorator
445
446
 
446
447
 
447
- def deprecate_attributes(module_name: str, deprecated_attributes: Dict[str, Tuple[str, str]]):
448
+ def deprecate_attributes(module_name: str, deprecated_attributes: dict[str, tuple[str, str]]):
448
449
  """Replace module with a wrapper that gives warnings for deprecated attributes.
449
450
 
450
451
  Args:
@@ -468,7 +469,7 @@ def deprecate_attributes(module_name: str, deprecated_attributes: Dict[str, Tupl
468
469
  __dict__ = module.__dict__
469
470
 
470
471
  # Workaround for: https://github.com/python/mypy/issues/8083
471
- __spec__ = _make_proxy_spec_property(module) # type: ignore
472
+ __spec__ = _make_proxy_spec_property(module)
472
473
 
473
474
  def __getattr__(self, name):
474
475
  if name in deprecated_attributes:
@@ -534,7 +535,7 @@ class DeprecatedModuleLoader(importlib.abc.Loader):
534
535
  sys.modules[self.old_module_name] = sys.modules[self.new_module_name]
535
536
  return sys.modules[self.old_module_name]
536
537
  method(self.new_module_name)
537
- # https://docs.python.org/3.5/library/importlib.html#importlib.abc.Loader.load_module
538
+ # https://docs.python.org/3.11/library/importlib.html#importlib.abc.Loader.load_module
538
539
  assert self.new_module_name in sys.modules, (
539
540
  f"Wrapped loader {self.loader} was "
540
541
  f"expected to insert "
@@ -583,7 +584,7 @@ def _is_internal(filename: str) -> bool:
583
584
  return 'importlib' in filename and '_bootstrap' in filename
584
585
 
585
586
 
586
- _warned: Set[str] = set()
587
+ _warned: set[str] = set()
587
588
 
588
589
 
589
590
  def _called_from_test() -> bool:
@@ -632,7 +633,7 @@ class DeprecatedModuleFinder(importlib.abc.MetaPathFinder):
632
633
  new_module_name: str,
633
634
  old_module_name: str,
634
635
  deadline: str,
635
- broken_module_exception: Optional[BaseException],
636
+ broken_module_exception: BaseException | None,
636
637
  ):
637
638
  """An aliasing module finder that uses existing module finders to find a python
638
639
  module spec and intercept the execution of matching modules.
@@ -760,7 +761,7 @@ def _setup_deprecated_submodule_attribute(
760
761
  old_parent: str,
761
762
  old_child: str,
762
763
  deadline: str,
763
- new_module: Optional[ModuleType],
764
+ new_module: ModuleType | None,
764
765
  ):
765
766
  parent_module = sys.modules[old_parent]
766
767
  setattr(parent_module, old_child, new_module)
@@ -769,7 +770,7 @@ def _setup_deprecated_submodule_attribute(
769
770
  __dict__ = parent_module.__dict__
770
771
 
771
772
  # Workaround for: https://github.com/python/mypy/issues/8083
772
- __spec__ = _make_proxy_spec_property(parent_module) # type: ignore
773
+ __spec__ = _make_proxy_spec_property(parent_module)
773
774
 
774
775
  def __getattr__(self, name):
775
776
  if name == old_child:
cirq/_compat_test.py CHANGED
@@ -11,6 +11,9 @@
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 collections
15
18
  import dataclasses
16
19
  import importlib.metadata
@@ -24,7 +27,7 @@ import types
24
27
  import warnings
25
28
  from importlib.machinery import ModuleSpec
26
29
  from types import ModuleType
27
- from typing import Any, Callable, Dict, Optional, Tuple
30
+ from typing import Any, Callable
28
31
  from unittest import mock
29
32
 
30
33
  import duet
@@ -199,13 +202,11 @@ def test_deprecated():
199
202
  old_func(1, 2)
200
203
 
201
204
  with pytest.raises(AssertionError, match='deadline should match vX.Y'):
202
- # pylint: disable=unused-variable
205
+
203
206
  @deprecated(deadline='invalid', fix='Roll some dice.')
204
207
  def badly_deprecated_func(*args, **kwargs): # pragma: no cover
205
208
  return new_func(*args, **kwargs)
206
209
 
207
- # pylint: enable=unused-variable
208
-
209
210
 
210
211
  def test_deprecated_parameter():
211
212
  @deprecated_parameter(
@@ -231,20 +232,16 @@ def test_deprecated_parameter():
231
232
  'Double it yourself.',
232
233
  deadline='v1.2',
233
234
  ):
234
- # pylint: disable=unexpected-keyword-arg
235
235
  # pylint: disable=no-value-for-parameter
236
236
  assert f(double_count=1) == 2
237
237
  # pylint: enable=no-value-for-parameter
238
- # pylint: enable=unexpected-keyword-arg
239
238
 
240
239
  with pytest.raises(
241
240
  ValueError, match='During testing using Cirq deprecated functionality is not allowed'
242
241
  ):
243
- # pylint: disable=unexpected-keyword-arg
244
242
  # pylint: disable=no-value-for-parameter
245
243
  f(double_count=1)
246
244
  # pylint: enable=no-value-for-parameter
247
- # pylint: enable=unexpected-keyword-arg
248
245
 
249
246
  with pytest.raises(AssertionError, match='deadline should match vX.Y'):
250
247
 
@@ -256,12 +253,9 @@ def test_deprecated_parameter():
256
253
  match=lambda args, kwargs: 'double_count' in kwargs,
257
254
  rewrite=lambda args, kwargs: (args, {'new_count': kwargs['double_count'] * 2}),
258
255
  )
259
- # pylint: disable=unused-variable
260
256
  def f_with_badly_deprecated_param(new_count): # pragma: no cover
261
257
  return new_count
262
258
 
263
- # pylint: enable=unused-variable
264
-
265
259
 
266
260
  @duet.sync
267
261
  async def test_deprecated_parameter_async_function():
@@ -290,11 +284,9 @@ async def test_deprecated_parameter_async_function():
290
284
  'Double it yourself.',
291
285
  deadline='v1.2',
292
286
  ):
293
- # pylint: disable=unexpected-keyword-arg
294
287
  # pylint: disable=no-value-for-parameter
295
288
  assert await f(double_count=1) == 2
296
289
  # pylint: enable=no-value-for-parameter
297
- # pylint: enable=unexpected-keyword-arg
298
290
 
299
291
 
300
292
  def test_wrap_module():
@@ -402,13 +394,11 @@ def test_deprecated_class():
402
394
  OldClass('1')
403
395
 
404
396
  with pytest.raises(AssertionError, match='deadline should match vX.Y'):
405
- # pylint: disable=unused-variable
397
+
406
398
  @deprecated_class(deadline='invalid', fix='theFix', name='foo')
407
399
  class BadlyDeprecatedClass(NewClass): # pragma: no cover
408
400
  ...
409
401
 
410
- # pylint: enable=unused-variable
411
-
412
402
 
413
403
  def _from_parent_import_deprecated():
414
404
  from cirq.testing._compat_test_data import fake_a
@@ -574,8 +564,7 @@ def _import_top_level_deprecated():
574
564
  def _repeated_import_path():
575
565
  """to ensure that the highly unlikely repeated subpath import doesn't interfere"""
576
566
 
577
- # pylint: disable=line-too-long
578
- from cirq.testing._compat_test_data.repeated_child.cirq.testing._compat_test_data.repeated_child import ( # type: ignore
567
+ from cirq.testing._compat_test_data.repeated_child.cirq.testing._compat_test_data.repeated_child import ( # type: ignore # noqa: E501
579
568
  child,
580
569
  )
581
570
 
@@ -584,7 +573,6 @@ def _repeated_import_path():
584
573
 
585
574
  def _type_repr_in_deprecated_module():
586
575
  # initialize the DeprecatedModuleFinders
587
- # pylint: disable=unused-import
588
576
  import cirq.testing._compat_test_data.fake_a as mod_a
589
577
 
590
578
  expected_repr = "<class 'cirq.testing._compat_test_data.module_a.types.SampleType'>"
@@ -635,7 +623,7 @@ _repeated_child_deprecation_msg = [
635
623
  ] + _deprecation_origin
636
624
 
637
625
 
638
- def _trace_unhandled_exceptions(*args, queue: 'multiprocessing.Queue', func: Callable):
626
+ def _trace_unhandled_exceptions(*args, queue: multiprocessing.Queue, func: Callable):
639
627
  try:
640
628
  func(*args)
641
629
  queue.put(None)
@@ -760,9 +748,6 @@ def test_metadata_search_path():
760
748
 
761
749
  def _test_metadata_search_path_inner(): # pragma: no cover
762
750
  # initialize the DeprecatedModuleFinders
763
- # pylint: disable=unused-import
764
- import cirq.testing._compat_test_data.module_a
765
-
766
751
  assert importlib.metadata.metadata('numpy')
767
752
 
768
753
 
@@ -803,7 +788,6 @@ def test_type_repr_in_new_module():
803
788
 
804
789
  def _test_type_repr_in_new_module_inner():
805
790
  # initialize the DeprecatedModuleFinders
806
- # pylint: disable=unused-import
807
791
  import cirq.testing._compat_test_data.module_a as mod_a
808
792
 
809
793
  expected_repr = "<class 'cirq.testing._compat_test_data.module_a.types.SampleType'>"
@@ -825,8 +809,7 @@ def _test_broken_module_1_inner():
825
809
  with pytest.raises(
826
810
  DeprecatedModuleImportError, match="missing_module cannot be imported. The typical reasons"
827
811
  ):
828
- # pylint: disable=unused-import
829
- import cirq.testing._compat_test_data.broken_ref as br # type: ignore
812
+ import cirq.testing._compat_test_data.broken_ref as br # type: ignore # noqa: F401
830
813
 
831
814
 
832
815
  def _test_broken_module_2_inner():
@@ -873,14 +856,11 @@ def test_new_module_is_top_level():
873
856
 
874
857
  def _test_new_module_is_top_level_inner():
875
858
  # sets up the DeprecationFinders
876
- # pylint: disable=unused-import
877
859
  import time
878
860
 
879
861
  # imports a top level module that was also deprecated
880
862
  from freezegun import api
881
863
 
882
- import cirq.testing._compat_test_data
883
-
884
864
  assert api.real_time == time.time
885
865
 
886
866
 
@@ -922,7 +902,7 @@ def test_loader_create_module():
922
902
  fake_mod = ModuleType('hello')
923
903
 
924
904
  class CreateModuleLoader(importlib.abc.Loader):
925
- def create_module(self, spec: ModuleSpec) -> Optional[ModuleType]:
905
+ def create_module(self, spec: ModuleSpec) -> ModuleType | None:
926
906
  return fake_mod
927
907
 
928
908
  assert (
@@ -1014,16 +994,16 @@ def test_block_overlapping_deprecation():
1014
994
 
1015
995
  class Bar:
1016
996
  def __init__(self) -> None:
1017
- self.foo_calls: Dict[int, int] = collections.Counter()
1018
- self.bar_calls: Dict[int, int] = collections.Counter()
997
+ self.foo_calls: dict[int, int] = collections.Counter()
998
+ self.bar_calls: dict[int, int] = collections.Counter()
1019
999
 
1020
1000
  @cached_method
1021
- def foo(self, n: int) -> Tuple[int, int]:
1001
+ def foo(self, n: int) -> tuple[int, int]:
1022
1002
  self.foo_calls[n] += 1
1023
1003
  return (id(self), n)
1024
1004
 
1025
1005
  @cached_method(maxsize=1)
1026
- def bar(self, n: int) -> Tuple[int, int]:
1006
+ def bar(self, n: int) -> tuple[int, int]:
1027
1007
  self.bar_calls[n] += 1
1028
1008
  return (id(self), 2 * n)
1029
1009
 
cirq/_doc.py CHANGED
@@ -13,9 +13,11 @@
13
13
  # limitations under the License.
14
14
  """Workaround for associating docstrings with public constants."""
15
15
 
16
- from typing import Any, Dict
16
+ from __future__ import annotations
17
17
 
18
- RECORDED_CONST_DOCS: Dict[int, str] = {}
18
+ from typing import Any
19
+
20
+ RECORDED_CONST_DOCS: dict[int, str] = {}
19
21
 
20
22
 
21
23
  def document(value: Any, doc_string: str = ''):
cirq/_import.py CHANGED
@@ -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 importlib
16
18
  import sys
17
19
  from contextlib import contextmanager
@@ -19,7 +21,7 @@ from importlib import abc
19
21
  from importlib.abc import Loader
20
22
  from importlib.machinery import ModuleSpec
21
23
  from types import ModuleType
22
- from typing import Any, Callable, cast, List, Optional
24
+ from typing import Any, Callable, cast
23
25
 
24
26
 
25
27
  class InstrumentedFinder(abc.MetaPathFinder):
@@ -29,7 +31,7 @@ class InstrumentedFinder(abc.MetaPathFinder):
29
31
  self,
30
32
  finder: Any,
31
33
  module_name: str,
32
- wrap_module: Callable[[ModuleType], Optional[ModuleType]],
34
+ wrap_module: Callable[[ModuleType], ModuleType | None],
33
35
  after_exec: Callable[[ModuleType], None],
34
36
  ):
35
37
  """A module finder that uses an existing module finder to find a python
@@ -54,7 +56,7 @@ class InstrumentedFinder(abc.MetaPathFinder):
54
56
 
55
57
  self.finder = finder
56
58
  self.module_name = module_name
57
- self.match_components: List[str] = []
59
+ self.match_components: list[str] = []
58
60
  if self.module_name:
59
61
  self.match_components = self.module_name.split('.')
60
62
  self.wrap_module = wrap_module
@@ -80,7 +82,7 @@ class InstrumentedLoader(abc.Loader):
80
82
  def __init__(
81
83
  self,
82
84
  loader: Any,
83
- wrap_module: Callable[[ModuleType], Optional[ModuleType]],
85
+ wrap_module: Callable[[ModuleType], ModuleType | None],
84
86
  after_exec: Callable[[ModuleType], None],
85
87
  ):
86
88
  """A module loader that uses an existing module loader and intercepts
@@ -119,7 +121,7 @@ class InstrumentedLoader(abc.Loader):
119
121
  @contextmanager
120
122
  def wrap_module_executions(
121
123
  module_name: str,
122
- wrap_func: Callable[[ModuleType], Optional[ModuleType]],
124
+ wrap_func: Callable[[ModuleType], ModuleType | None],
123
125
  after_exec: Callable[[ModuleType], None] = lambda m: None,
124
126
  assert_meta_path_unchanged: bool = True,
125
127
  ):
@@ -155,7 +157,7 @@ def delay_import(module_name: str):
155
157
  delay = True
156
158
  execute_list = []
157
159
 
158
- def wrap_func(module: ModuleType) -> Optional[ModuleType]:
160
+ def wrap_func(module: ModuleType) -> ModuleType | None:
159
161
  if delay:
160
162
  execute_list.append(module)
161
163
  return None # Don't allow the module to be executed yet
cirq/_import_test.py CHANGED
@@ -12,12 +12,14 @@
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 _import
16
18
 
17
19
 
18
- def test_lazy_loader():
20
+ def test_lazy_loader() -> None:
19
21
  linalg = _import.LazyLoader("linalg", globals(), "scipy.linalg")
20
- linalg.fun = 1
22
+ linalg.fun = 1 # type: ignore[attr-defined]
21
23
  assert linalg._module is None
22
24
  assert "linalg" not in linalg.__dict__
23
25
 
cirq/_version.py CHANGED
@@ -13,19 +13,19 @@
13
13
  # limitations under the License.
14
14
 
15
15
  """Define version number here, read it from setup.py automatically,
16
- and warn users that the latest version of cirq uses python 3.10+"""
16
+ and warn users that the latest version of Cirq uses Python 3.11+"""
17
17
 
18
18
  import sys
19
19
 
20
- if sys.version_info < (3, 10, 0): # pragma: no cover
20
+ if sys.version_info < (3, 11, 0): # pragma: no cover
21
21
  raise SystemError(
22
- "You installed the latest version of cirq but aren't on python 3.10+.\n"
22
+ "You installed the latest version of Cirq but aren't on Python 3.11+.\n"
23
23
  'To fix this error, you need to either:\n'
24
24
  '\n'
25
- 'A) Update to python 3.10 or later.\n'
25
+ 'A) Update to Python 3.11 or later.\n'
26
26
  '- OR -\n'
27
27
  'B) Explicitly install an older deprecated-but-compatible version '
28
- 'of cirq (e.g. "python -m pip install cirq==1.1.*")'
28
+ 'of Cirq (e.g. "python -m pip install cirq==1.5.0")'
29
29
  )
30
30
 
31
- __version__ = "1.5.0.dev20250409222543"
31
+ __version__ = "1.6.0"
cirq/_version_test.py CHANGED
@@ -2,5 +2,5 @@
2
2
  import cirq
3
3
 
4
4
 
5
- def test_version():
6
- assert cirq.__version__ == "1.5.0.dev20250409222543"
5
+ def test_version() -> None:
6
+ assert cirq.__version__ == "1.6.0"
@@ -12,8 +12,9 @@
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 collections
16
- from typing import Dict, List, Optional, Tuple
17
18
 
18
19
  from cirq.circuits._box_drawing_character_data import box_draw_character, BoxDrawCharacterSet
19
20
 
@@ -55,7 +56,7 @@ class Block:
55
56
  left: bool = False,
56
57
  right: bool = False,
57
58
  bottom: bool = False,
58
- crossing_char: Optional[str] = None,
59
+ crossing_char: str | None = None,
59
60
  ):
60
61
  """Draws lines in the box using the given character set.
61
62
 
@@ -105,7 +106,7 @@ class Block:
105
106
 
106
107
  self._prev_curve_grid_chars = grid_characters
107
108
 
108
- def render(self, width: int, height: int) -> List[str]:
109
+ def render(self, width: int, height: int) -> list[str]:
109
110
  """Returns a list of text lines representing the block's contents.
110
111
 
111
112
  Args:
@@ -157,9 +158,9 @@ class BlockDiagramDrawer:
157
158
  """Aligns text and curve data placed onto an abstract 2d grid of blocks."""
158
159
 
159
160
  def __init__(self) -> None:
160
- self._blocks: Dict[Tuple[int, int], Block] = collections.defaultdict(Block)
161
- self._min_widths: Dict[int, int] = collections.defaultdict(lambda: 0)
162
- self._min_heights: Dict[int, int] = collections.defaultdict(lambda: 0)
161
+ self._blocks: dict[tuple[int, int], Block] = collections.defaultdict(Block)
162
+ self._min_widths: dict[int, int] = collections.defaultdict(lambda: 0)
163
+ self._min_heights: dict[int, int] = collections.defaultdict(lambda: 0)
163
164
 
164
165
  # Populate the origin.
165
166
  _ = self._blocks[(0, 0)]
@@ -187,8 +188,8 @@ class BlockDiagramDrawer:
187
188
  def render(
188
189
  self,
189
190
  *,
190
- block_span_x: Optional[int] = None,
191
- block_span_y: Optional[int] = None,
191
+ block_span_x: int | None = None,
192
+ block_span_y: int | None = None,
192
193
  min_block_width: int = 0,
193
194
  min_block_height: int = 0,
194
195
  ) -> str:
@@ -250,10 +251,10 @@ class BlockDiagramDrawer:
250
251
  }
251
252
 
252
253
  # Paste together all of the rows of rendered block content.
253
- out_lines: List[str] = []
254
+ out_lines: list[str] = []
254
255
  for y in range(block_span_y):
255
256
  for by in range(heights[y]):
256
- out_line_chunks: List[str] = []
257
+ out_line_chunks: list[str] = []
257
258
  for x in range(block_span_x):
258
259
  out_line_chunks.extend(block_renders[x, y][by])
259
260
  out_lines.append(''.join(out_line_chunks).rstrip())