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 itertools
16
18
 
17
19
  import pytest
@@ -162,9 +164,11 @@ circuit_diagrams = {
162
164
  │ │ │ │
163
165
  3: ─────────────█───1↦0───────█───1↦0─────────────
164
166
  """,
165
- ('decomposed', cca.BipartiteGraphType.COMPLETE, 3):
166
- # pylint: disable=line-too-long
167
- """
167
+ (
168
+ 'decomposed',
169
+ cca.BipartiteGraphType.COMPLETE,
170
+ 3,
171
+ ): """
168
172
  0: ───────────────────────█───0↦1───────────────────────────█───0↦1───────────────────────
169
173
  │ │ │ │
170
174
  1: ─────────────█───0↦1───█───1↦0───█───0↦1───────█───0↦1───█───1↦0───█───0↦1─────────────
@@ -199,8 +203,7 @@ circuit_diagrams = {
199
203
  │ │ │ │
200
204
  7: ─────────────────────────────────█───1↦0───────────────────────────────────────────────█───1↦0─────────────────────────────────
201
205
 
202
- """,
203
- # pylint: enable=line-too-long
206
+ """, # noqa: E501
204
207
  (
205
208
  'decomposed',
206
209
  cca.BipartiteGraphType.MATCHING,
@@ -267,7 +270,7 @@ circuit_diagrams = {
267
270
  @pytest.mark.parametrize(
268
271
  'subgraph,part_size', itertools.product(cca.BipartiteGraphType, range(1, 5))
269
272
  )
270
- def test_circuit_diagrams(part_size, subgraph):
273
+ def test_circuit_diagrams(part_size, subgraph) -> None:
271
274
  qubits = cirq.LineQubit.range(2 * part_size)
272
275
  gate = cca.BipartiteSwapNetworkGate(subgraph, part_size)
273
276
  circuit = cirq.Circuit(gate(*qubits))
@@ -282,10 +285,10 @@ def test_circuit_diagrams(part_size, subgraph):
282
285
  cirq.testing.assert_has_diagram(circuit, diagram)
283
286
 
284
287
 
285
- def test_bad_args():
288
+ def test_bad_args() -> None:
286
289
  gate = cca.BipartiteSwapNetworkGate(cca.BipartiteGraphType.COMPLETE, 2)
287
290
  qubits = cirq.LineQubit.range(4)
288
- gate.subgraph = 'not a subgraph'
291
+ gate.subgraph = 'not a subgraph' # type: ignore[assignment]
289
292
  args = cirq.CircuitDiagramInfoArgs(
290
293
  known_qubits=None,
291
294
  known_qubit_count=None,
@@ -303,7 +306,7 @@ def test_bad_args():
303
306
  with pytest.raises(ValueError):
304
307
  gate._decompose_(qubits[:3])
305
308
 
306
- gate.subgraph = 'unimplemented subgraph'
309
+ gate.subgraph = 'unimplemented subgraph' # type: ignore[assignment]
307
310
  with pytest.raises(NotImplementedError):
308
311
  gate._decompose_(qubits)
309
312
 
@@ -312,7 +315,7 @@ def test_bad_args():
312
315
  gate._circuit_diagram_info_(args)
313
316
 
314
317
 
315
- def test_bipartite_swap_network_acquaintance_size():
318
+ def test_bipartite_swap_network_acquaintance_size() -> None:
316
319
  qubits = cirq.LineQubit.range(4)
317
320
  gate = cca.BipartiteSwapNetworkGate(cca.BipartiteGraphType.COMPLETE, 2)
318
321
  assert cca.get_acquaintance_size(gate(*qubits)) == 2
@@ -321,7 +324,7 @@ def test_bipartite_swap_network_acquaintance_size():
321
324
  @pytest.mark.parametrize(
322
325
  'subgraph,part_size', itertools.product(cca.BipartiteGraphType, range(1, 3))
323
326
  )
324
- def test_repr(subgraph, part_size):
327
+ def test_repr(subgraph, part_size) -> None:
325
328
  gate = cca.BipartiteSwapNetworkGate(subgraph, part_size)
326
329
  cirq.testing.assert_equivalent_repr(gate)
327
330
 
@@ -332,18 +335,20 @@ def test_repr(subgraph, part_size):
332
335
  @pytest.mark.parametrize(
333
336
  'subgraph,part_size', itertools.product(cca.BipartiteGraphType, range(1, 6))
334
337
  )
335
- def test_decomposition_permutation_consistency(part_size, subgraph):
338
+ def test_decomposition_permutation_consistency(part_size, subgraph) -> None:
336
339
  gate = cca.BipartiteSwapNetworkGate(subgraph, part_size)
337
340
  qubits = cirq.LineQubit.range(2 * part_size)
341
+ mapping: dict[cirq.Qid, int]
338
342
  mapping = {q: i for i, q in enumerate(qubits)}
339
343
  cca.update_mapping(mapping, gate._decompose_(qubits))
340
344
  permutation = gate.permutation()
341
345
  assert {qubits[i]: j for i, j in permutation.items()} == mapping
342
346
 
343
347
 
344
- def test_bad_number_of_qubits():
348
+ def test_bad_number_of_qubits() -> None:
345
349
  gate = cca.BipartiteSwapNetworkGate(cca.BipartiteGraphType.COMPLETE, 6)
346
350
  qubits = cirq.LineQubit.range(6)
351
+ mapping: dict[cirq.Qid, int]
347
352
  mapping = {q: i for i, q in enumerate(qubits)}
348
353
  with pytest.raises(ValueError, match='len'):
349
354
  cca.update_mapping(mapping, gate._decompose_(qubits))
@@ -15,7 +15,7 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import abc
18
- from typing import TYPE_CHECKING, Union
18
+ from typing import TYPE_CHECKING
19
19
 
20
20
  from cirq import circuits, devices, ops
21
21
  from cirq.contrib.acquaintance.bipartite import BipartiteSwapNetworkGate
@@ -42,7 +42,7 @@ class AcquaintanceDevice(devices.Device, metaclass=abc.ABCMeta):
42
42
  )
43
43
 
44
44
 
45
- def get_acquaintance_size(obj: Union[circuits.Circuit, ops.Operation]) -> int:
45
+ def get_acquaintance_size(obj: circuits.Circuit | ops.Operation) -> int:
46
46
  """The maximum number of qubits to be acquainted with each other."""
47
47
  if isinstance(obj, circuits.Circuit):
48
48
  return max(tuple(get_acquaintance_size(op) for op in obj.all_operations()) or (0,))
@@ -12,13 +12,15 @@
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
18
20
  import cirq.contrib.acquaintance as cca
19
21
 
20
22
 
21
- def test_acquaintance_device():
23
+ def test_acquaintance_device() -> None:
22
24
  with pytest.raises(ValueError):
23
25
  op = cirq.X(cirq.NamedQubit('q'))
24
26
  cca.UnconstrainedAcquaintanceDevice.validate_operation(op)
@@ -29,6 +31,6 @@ def test_acquaintance_device():
29
31
  cca.UnconstrainedAcquaintanceDevice.validate_operation(swap_network(*qubits))
30
32
 
31
33
 
32
- def test_not_operation():
34
+ def test_not_operation() -> None:
33
35
  with pytest.raises(TypeError):
34
- _ = cca.get_acquaintance_size(cirq.LineQubit(1))
36
+ _ = cca.get_acquaintance_size(cirq.LineQubit(1)) # type: ignore[arg-type]
@@ -16,7 +16,7 @@ from __future__ import annotations
16
16
 
17
17
  import abc
18
18
  from collections import defaultdict
19
- from typing import DefaultDict, Dict, Iterator, Optional, Sequence, TYPE_CHECKING
19
+ from typing import Iterator, Sequence, TYPE_CHECKING
20
20
 
21
21
  from cirq import circuits, devices, ops, protocols, transformers
22
22
  from cirq.contrib.acquaintance.gates import AcquaintanceOpportunityGate
@@ -99,7 +99,7 @@ class StrategyExecutorTransformer:
99
99
  self._mapping = execution_strategy.initial_mapping.copy()
100
100
 
101
101
  def __call__(
102
- self, circuit: circuits.AbstractCircuit, context: Optional[cirq.TransformerContext] = None
102
+ self, circuit: circuits.AbstractCircuit, context: cirq.TransformerContext | None = None
103
103
  ) -> circuits.Circuit:
104
104
  """Executes an acquaintance strategy using cirq.map_operations_and_unroll and
105
105
  mutates initial mapping.
@@ -174,7 +174,7 @@ class GreedyExecutionStrategy(ExecutionStrategy):
174
174
  self,
175
175
  gates: LogicalGates,
176
176
  initial_mapping: LogicalMapping,
177
- device: Optional[cirq.Device] = None,
177
+ device: cirq.Device | None = None,
178
178
  ) -> None:
179
179
  """Inits GreedyExecutionStrategy.
180
180
 
@@ -214,13 +214,13 @@ class GreedyExecutionStrategy(ExecutionStrategy):
214
214
  yield gate(*[index_to_qubit[i] for i in gate_indices])
215
215
 
216
216
  @staticmethod
217
- def canonicalize_gates(gates: LogicalGates) -> Dict[frozenset, LogicalGates]:
217
+ def canonicalize_gates(gates: LogicalGates) -> dict[frozenset, LogicalGates]:
218
218
  """Canonicalizes a set of gates by the qubits they act on.
219
219
 
220
220
  Takes a set of gates specified by ordered sequences of logical
221
221
  indices, and groups those that act on the same qubits regardless of
222
222
  order."""
223
- canonicalized_gates: DefaultDict[frozenset, LogicalGates] = defaultdict(dict)
223
+ canonicalized_gates: defaultdict[frozenset, LogicalGates] = defaultdict(dict)
224
224
  for indices, gate in gates.items():
225
225
  indices = tuple(indices)
226
226
  canonicalized_gates[frozenset(indices)][indices] = gate
@@ -12,9 +12,11 @@
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 itertools import combinations
16
18
  from string import ascii_lowercase
17
- from typing import Dict, Sequence, Tuple
19
+ from typing import Any, Sequence
18
20
 
19
21
  import numpy as np
20
22
  import pytest
@@ -36,11 +38,12 @@ class ExampleGate(cirq.Gate):
36
38
  return self._wire_symbols
37
39
 
38
40
 
39
- def test_executor_explicit():
41
+ def test_executor_explicit() -> None:
40
42
  num_qubits = 8
41
43
  qubits = cirq.LineQubit.range(num_qubits)
42
44
  circuit = cca.complete_acquaintance_strategy(qubits, 2)
43
45
 
46
+ gates: dict[tuple[Any, ...], cirq.Gate]
44
47
  gates = {
45
48
  (i, j): ExampleGate([str(k) for k in ij])
46
49
  for ij in combinations(range(num_qubits), 2)
@@ -51,10 +54,11 @@ def test_executor_explicit():
51
54
  assert execution_strategy.device == cirq.UNCONSTRAINED_DEVICE
52
55
 
53
56
  with pytest.raises(ValueError):
54
- executor = cca.StrategyExecutorTransformer(None)
57
+ executor = cca.StrategyExecutorTransformer(None) # type: ignore[arg-type]
55
58
  executor = cca.StrategyExecutorTransformer(execution_strategy)
56
59
 
57
60
  with pytest.raises(NotImplementedError):
61
+ bad_gates: dict[tuple[Any, ...], cirq.Gate]
58
62
  bad_gates = {(0,): ExampleGate(['0']), (0, 1): ExampleGate(['0', '1'])}
59
63
  cca.GreedyExecutionStrategy(bad_gates, initial_mapping)
60
64
 
@@ -79,13 +83,13 @@ def test_executor_explicit():
79
83
  6: ───6───7───╲0╱───7───4───╱1╲───4───6───╲0╱───6───2───╱1╲───2───4───╲0╱───4───0───╱1╲───0───2───╲0╱───2───1───╱1╲───
80
84
  │ │ │ │ │ │ │ │ │ │ │ │
81
85
  7: ───7───6───╱1╲─────────────────6───4───╱1╲─────────────────4───2───╱1╲─────────────────2───0───╱1╲─────────────────
82
- """.strip()
86
+ """.strip() # noqa: E501
83
87
  ct.assert_has_diagram(circuit, expected_text_diagram)
84
88
 
85
89
 
86
90
  def random_diagonal_gates(
87
91
  num_qubits: int, acquaintance_size: int
88
- ) -> Dict[Tuple[cirq.Qid, ...], cirq.Gate]:
92
+ ) -> dict[tuple[cirq.Qid, ...], cirq.Gate]:
89
93
 
90
94
  return {
91
95
  Q: cirq.DiagonalGate(np.random.random(2**acquaintance_size))
@@ -104,8 +108,8 @@ def random_diagonal_gates(
104
108
  ],
105
109
  )
106
110
  def test_executor_random(
107
- num_qubits: int, acquaintance_size: int, gates: Dict[Tuple[cirq.Qid, ...], cirq.Gate]
108
- ):
111
+ num_qubits: int, acquaintance_size: int, gates: dict[tuple[cirq.Qid, ...], cirq.Gate]
112
+ ) -> None:
109
113
  qubits = cirq.LineQubit.range(num_qubits)
110
114
  circuit = cca.complete_acquaintance_strategy(qubits, acquaintance_size)
111
115
 
@@ -124,7 +128,7 @@ def test_executor_random(
124
128
  np.testing.assert_allclose(actual=actual_unitary, desired=expected_unitary, verbose=True)
125
129
 
126
130
 
127
- def test_acquaintance_operation():
131
+ def test_acquaintance_operation() -> None:
128
132
  n = 5
129
133
  physical_qubits = tuple(cirq.LineQubit.range(n))
130
134
  logical_qubits = tuple(cirq.NamedQubit(s) for s in ascii_lowercase[:n])
@@ -132,7 +136,7 @@ def test_acquaintance_operation():
132
136
  with pytest.raises(ValueError):
133
137
  cca.AcquaintanceOperation(physical_qubits[:3], int_indices[:4])
134
138
  for logical_indices in (logical_qubits, int_indices):
135
- op = cca.AcquaintanceOperation(physical_qubits, logical_indices)
139
+ op = cca.AcquaintanceOperation(physical_qubits, logical_indices) # type: ignore[type-var]
136
140
  assert op.logical_indices == logical_indices
137
141
  assert op.qubits == physical_qubits
138
142
  wire_symbols = tuple(f'({i})' for i in logical_indices)
@@ -18,17 +18,7 @@ import functools
18
18
  import itertools
19
19
  import math
20
20
  import operator
21
- from typing import (
22
- Dict,
23
- Iterable,
24
- Iterator,
25
- List,
26
- NamedTuple,
27
- Optional,
28
- Sequence,
29
- Tuple,
30
- TYPE_CHECKING,
31
- )
21
+ from typing import Iterable, Iterator, NamedTuple, Sequence, TYPE_CHECKING
32
22
 
33
23
  from cirq import ops, protocols, value
34
24
  from cirq.contrib.acquaintance.permutation import (
@@ -44,14 +34,14 @@ if TYPE_CHECKING:
44
34
 
45
35
  def operations_to_part_lens(
46
36
  qubit_order: Sequence[cirq.Qid], op_tree: cirq.OP_TREE
47
- ) -> Tuple[int, ...]:
37
+ ) -> tuple[int, ...]:
48
38
  qubit_sort_key = functools.partial(operator.indexOf, qubit_order)
49
39
  op_parts = [tuple(sorted(op.qubits, key=qubit_sort_key)) for op in ops.flatten_op_tree(op_tree)]
50
- singletons: List[Tuple[cirq.Qid, ...]] = [(q,) for q in set(qubit_order).difference(*op_parts)]
40
+ singletons: list[tuple[cirq.Qid, ...]] = [(q,) for q in set(qubit_order).difference(*op_parts)]
51
41
  part_sort_key = lambda p: min(qubit_sort_key(q) for q in p)
52
42
  parts = tuple(tuple(part) for part in sorted(singletons + op_parts, key=part_sort_key))
53
43
 
54
- if sum(parts, ()) != tuple(qubit_order):
44
+ if tuple(itertools.chain.from_iterable(parts)) != tuple(qubit_order):
55
45
  raise ValueError('sum(parts, ()) != tuple(qubit_order)')
56
46
 
57
47
  return tuple(len(part) for part in parts)
@@ -87,16 +77,16 @@ def acquaint(*qubits) -> cirq.Operation:
87
77
  Layers = NamedTuple(
88
78
  'Layers',
89
79
  [
90
- ('prior_interstitial', List['cirq.Operation']),
91
- ('pre', List['cirq.Operation']),
92
- ('intra', List['cirq.Operation']),
93
- ('post', List['cirq.Operation']),
94
- ('posterior_interstitial', List['cirq.Operation']),
80
+ ('prior_interstitial', list['cirq.Operation']),
81
+ ('pre', list['cirq.Operation']),
82
+ ('intra', list['cirq.Operation']),
83
+ ('post', list['cirq.Operation']),
84
+ ('posterior_interstitial', list['cirq.Operation']),
95
85
  ],
96
86
  )
97
87
 
98
88
 
99
- def new_layers(**kwargs: List[cirq.Operation]) -> Layers:
89
+ def new_layers(**kwargs: list[cirq.Operation]) -> Layers:
100
90
  return Layers._make(kwargs.get(field, []) for field in Layers._fields)
101
91
 
102
92
 
@@ -106,7 +96,7 @@ def acquaint_insides(
106
96
  qubits: Sequence[cirq.Qid],
107
97
  before: bool,
108
98
  layers: Layers,
109
- mapping: Dict[ops.Qid, int],
99
+ mapping: dict[ops.Qid, int],
110
100
  ) -> None:
111
101
  """Acquaints each of the qubits with another set specified by an
112
102
  acquaintance gate.
@@ -153,12 +143,12 @@ def _get_max_reach(size: int, round_up: bool = True) -> int:
153
143
 
154
144
 
155
145
  def acquaint_and_shift(
156
- parts: Tuple[List[cirq.Qid], List[cirq.Qid]],
146
+ parts: tuple[list[cirq.Qid], list[cirq.Qid]],
157
147
  layers: Layers,
158
- acquaintance_size: Optional[int],
148
+ acquaintance_size: int | None,
159
149
  swap_gate: cirq.Gate,
160
- mapping: Dict[ops.Qid, int],
161
- ):
150
+ mapping: dict[ops.Qid, int],
151
+ ) -> None:
162
152
  """Acquaints and shifts a pair of lists of qubits. The first part is
163
153
  acquainted with every qubit individually in the second part, and vice
164
154
  versa. Operations are grouped into several layers:
@@ -276,7 +266,7 @@ class SwapNetworkGate(PermutationGate):
276
266
  def __init__(
277
267
  self,
278
268
  part_lens: Sequence[int],
279
- acquaintance_size: Optional[int] = 0,
269
+ acquaintance_size: int | None = 0,
280
270
  swap_gate: cirq.Gate = ops.SWAP,
281
271
  ) -> None:
282
272
  super().__init__(sum(part_lens), swap_gate)
@@ -346,13 +336,13 @@ class SwapNetworkGate(PermutationGate):
346
336
  def from_operations(
347
337
  qubit_order: Sequence[cirq.Qid],
348
338
  operations: Sequence[cirq.Operation],
349
- acquaintance_size: Optional[int] = 0,
339
+ acquaintance_size: int | None = 0,
350
340
  swap_gate: cirq.Gate = ops.SWAP,
351
341
  ) -> SwapNetworkGate:
352
342
  part_sizes = operations_to_part_lens(qubit_order, operations)
353
343
  return SwapNetworkGate(part_sizes, acquaintance_size, swap_gate)
354
344
 
355
- def permutation(self) -> Dict[int, int]:
345
+ def permutation(self) -> dict[int, int]:
356
346
  return {i: j for i, j in enumerate(reversed(range(sum(self.part_lens))))}
357
347
 
358
348
  def __repr__(self) -> str:
@@ -12,10 +12,12 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  from itertools import combinations, product
16
18
  from random import randint
17
19
  from string import ascii_lowercase as alphabet
18
- from typing import Optional, Sequence, Tuple
20
+ from typing import Sequence
19
21
 
20
22
  import numpy
21
23
  import pytest
@@ -25,7 +27,7 @@ import cirq.contrib.acquaintance as cca
25
27
  import cirq.testing as ct
26
28
 
27
29
 
28
- def test_acquaintance_gate_repr():
30
+ def test_acquaintance_gate_repr() -> None:
29
31
  assert (
30
32
  repr(cca.AcquaintanceOpportunityGate(2))
31
33
  == 'cirq.contrib.acquaintance.AcquaintanceOpportunityGate'
@@ -33,7 +35,7 @@ def test_acquaintance_gate_repr():
33
35
  )
34
36
 
35
37
 
36
- def test_acquaintance_gate_text_diagram_info():
38
+ def test_acquaintance_gate_text_diagram_info() -> None:
37
39
  qubits = [cirq.NamedQubit(s) for s in 'xyz']
38
40
  circuit = cirq.Circuit([cirq.Moment([cca.acquaint(*qubits)])])
39
41
  actual_text_diagram = circuit.to_text_diagram().strip()
@@ -47,11 +49,11 @@ z: ───█───
47
49
  assert actual_text_diagram == expected_text_diagram
48
50
 
49
51
 
50
- def test_acquaintance_gate_unknown_qubit_count():
52
+ def test_acquaintance_gate_unknown_qubit_count() -> None:
51
53
  assert cirq.circuit_diagram_info(cca.acquaint, default=None) is None
52
54
 
53
55
 
54
- def test_swap_network_gate():
56
+ def test_swap_network_gate() -> None:
55
57
  qubits = tuple(cirq.NamedQubit(s) for s in alphabet)
56
58
 
57
59
  acquaintance_size = 3
@@ -123,7 +125,7 @@ f: ───╱1╲─────────╱1╲─────────
123
125
  @pytest.mark.parametrize(
124
126
  'part_lens', [tuple(randint(1, 3) for _ in range(randint(2, 10))) for _ in range(3)]
125
127
  )
126
- def test_acquaint_part_pairs(part_lens):
128
+ def test_acquaint_part_pairs(part_lens) -> None:
127
129
  parts = []
128
130
  n_qubits = 0
129
131
  for part_len in part_lens:
@@ -139,7 +141,7 @@ def test_acquaint_part_pairs(part_lens):
139
141
  assert expected_opps == actual_opps
140
142
 
141
143
 
142
- acquaintance_sizes: Tuple[Optional[int], ...] = (None,)
144
+ acquaintance_sizes: tuple[int | None, ...] = (None,)
143
145
  acquaintance_sizes += tuple(range(5))
144
146
 
145
147
 
@@ -152,13 +154,13 @@ acquaintance_sizes += tuple(range(5))
152
154
  )
153
155
  ),
154
156
  )
155
- def test_swap_network_gate_permutation(part_lens, acquaintance_size):
157
+ def test_swap_network_gate_permutation(part_lens, acquaintance_size) -> None:
156
158
  n_qubits = sum(part_lens)
157
159
  swap_network_gate = cca.SwapNetworkGate(part_lens, acquaintance_size)
158
160
  cca.testing.assert_permutation_decomposition_equivalence(swap_network_gate, n_qubits)
159
161
 
160
162
 
161
- def test_swap_network_gate_from_ops():
163
+ def test_swap_network_gate_from_ops() -> None:
162
164
  n_qubits = 10
163
165
  qubits = cirq.LineQubit.range(n_qubits)
164
166
  part_lens = (1, 2, 1, 3, 3)
@@ -196,7 +198,7 @@ def test_swap_network_gate_from_ops():
196
198
  cirq.testing.assert_has_diagram(circuit, expected_diagram)
197
199
 
198
200
 
199
- def test_swap_network_decomposition():
201
+ def test_swap_network_decomposition() -> None:
200
202
  qubits = cirq.LineQubit.range(8)
201
203
  swap_network_gate = cca.SwapNetworkGate((4, 4), 5)
202
204
  operations = cirq.decompose_once_with_qubits(swap_network_gate, qubits)
@@ -221,7 +223,7 @@ def test_swap_network_decomposition():
221
223
  ct.assert_has_diagram(circuit, expected_text_diagram)
222
224
 
223
225
 
224
- def test_swap_network_init_error():
226
+ def test_swap_network_init_error() -> None:
225
227
  with pytest.raises(ValueError):
226
228
  cca.SwapNetworkGate(())
227
229
  with pytest.raises(ValueError):
@@ -235,7 +237,7 @@ part_lens_and_acquaintance_sizes = [
235
237
 
236
238
 
237
239
  @pytest.mark.parametrize('part_lens, acquaintance_size', part_lens_and_acquaintance_sizes)
238
- def test_swap_network_permutation(part_lens, acquaintance_size):
240
+ def test_swap_network_permutation(part_lens, acquaintance_size) -> None:
239
241
  n_qubits = sum(part_lens)
240
242
  gate = cca.SwapNetworkGate(part_lens, acquaintance_size)
241
243
 
@@ -244,7 +246,7 @@ def test_swap_network_permutation(part_lens, acquaintance_size):
244
246
 
245
247
 
246
248
  @pytest.mark.parametrize('part_lens, acquaintance_size', part_lens_and_acquaintance_sizes)
247
- def test_swap_network_repr(part_lens, acquaintance_size):
249
+ def test_swap_network_repr(part_lens, acquaintance_size) -> None:
248
250
  gate = cca.SwapNetworkGate(part_lens, acquaintance_size)
249
251
  ct.assert_equivalent_repr(gate)
250
252
 
@@ -254,20 +256,22 @@ class OtherOperation(cirq.Operation):
254
256
  self._qubits = tuple(qubits)
255
257
 
256
258
  @property
257
- def qubits(self) -> Tuple[cirq.Qid, ...]:
259
+ def qubits(self) -> tuple[cirq.Qid, ...]:
258
260
  return self._qubits
259
261
 
260
- def with_qubits(self, *new_qubits: cirq.Qid) -> 'OtherOperation':
261
- return type(self)(self._qubits)
262
+ def with_qubits(self, *new_qubits: cirq.Qid) -> OtherOperation:
263
+ return type(self)(new_qubits)
262
264
 
263
265
  def __eq__(self, other):
264
266
  return isinstance(other, type(self)) and self.qubits == other.qubits
265
267
 
266
268
 
267
- def test_get_acquaintance_size():
269
+ def test_get_acquaintance_size() -> None:
270
+ qubits: Sequence[cirq.Qid]
268
271
  qubits = cirq.LineQubit.range(8)
272
+ op: cirq.Operation
269
273
  op = OtherOperation(qubits)
270
- assert op.with_qubits(qubits) == op
274
+ assert op.with_qubits(*qubits) == op
271
275
  assert cca.get_acquaintance_size(op) == 0
272
276
 
273
277
  for s, _ in enumerate(qubits):
@@ -299,7 +303,7 @@ def test_get_acquaintance_size():
299
303
  assert cca.get_acquaintance_size(op) == 0
300
304
 
301
305
 
302
- def test_operations_to_part_lens():
306
+ def test_operations_to_part_lens() -> None:
303
307
  qubits = cirq.LineQubit.range(6)
304
308
  ops = [cirq.CZ(*qubits[1:3]), cirq.XX(*qubits[3:5])]
305
309
  part_lens = cca.gates.operations_to_part_lens(qubits, ops)
@@ -317,7 +321,7 @@ def test_operations_to_part_lens():
317
321
  @pytest.mark.parametrize(
318
322
  'part_len_sets', [set(tuple(randint(1, 5) for _ in range(randint(2, 7))) for _ in range(5))]
319
323
  )
320
- def test_swap_network_gate_equality(part_len_sets):
324
+ def test_swap_network_gate_equality(part_len_sets) -> None:
321
325
  acquaintance_sizes = [None, 0, 1, 2, 3]
322
326
  swap_gates = [cirq.SWAP, cirq.CNOT]
323
327
  equals_tester = ct.EqualsTester()
@@ -14,7 +14,7 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import FrozenSet, Iterator, Sequence, Set, TYPE_CHECKING
17
+ from typing import Iterator, Sequence, TYPE_CHECKING
18
18
 
19
19
  from cirq import devices
20
20
  from cirq.contrib import circuitdag
@@ -51,7 +51,9 @@ class LogicalAnnotator(ExecutionStrategy):
51
51
  yield AcquaintanceOperation(qubits, indices)
52
52
 
53
53
 
54
- def get_acquaintance_dag(strategy: cirq.Circuit, initial_mapping: LogicalMapping):
54
+ def get_acquaintance_dag(
55
+ strategy: cirq.Circuit, initial_mapping: LogicalMapping
56
+ ) -> circuitdag.CircuitDag:
55
57
  strategy = strategy.copy()
56
58
  expose_acquaintance_gates(strategy)
57
59
  LogicalAnnotator(initial_mapping)(strategy)
@@ -66,9 +68,11 @@ def get_acquaintance_dag(strategy: cirq.Circuit, initial_mapping: LogicalMapping
66
68
 
67
69
  def get_logical_acquaintance_opportunities(
68
70
  strategy: cirq.Circuit, initial_mapping: LogicalMapping
69
- ) -> Set[FrozenSet[LogicalIndex]]:
71
+ ) -> set[frozenset[int]] | set[frozenset[cirq.Qid]]:
70
72
  acquaintance_dag = get_acquaintance_dag(strategy, initial_mapping)
71
73
  logical_acquaintance_opportunities = set()
72
74
  for op in acquaintance_dag.all_operations():
73
- logical_acquaintance_opportunities.add(frozenset(op.logical_indices))
75
+ logical_acquaintance_opportunities.add(
76
+ frozenset(op.logical_indices) # type: ignore[attr-defined]
77
+ )
74
78
  return logical_acquaintance_opportunities
@@ -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 itertools import combinations, product
16
18
 
17
19
  import pytest
@@ -22,7 +24,7 @@ import cirq.contrib.acquaintance.inspection_utils as inspection_utils
22
24
 
23
25
 
24
26
  @pytest.mark.parametrize('n_qubits, acquaintance_size', product(range(2, 6), range(2, 5)))
25
- def test_get_logical_acquaintance_opportunities(n_qubits, acquaintance_size):
27
+ def test_get_logical_acquaintance_opportunities(n_qubits, acquaintance_size) -> None:
26
28
  qubits = cirq.LineQubit.range(n_qubits)
27
29
  acquaintance_strategy = cca.complete_acquaintance_strategy(qubits, acquaintance_size)
28
30
  initial_mapping = {q: i for i, q in enumerate(qubits)}
@@ -30,5 +32,5 @@ def test_get_logical_acquaintance_opportunities(n_qubits, acquaintance_size):
30
32
  assert opps == set(frozenset(s) for s in combinations(range(n_qubits), acquaintance_size))
31
33
 
32
34
 
33
- def test_device():
35
+ def test_device() -> None:
34
36
  assert inspection_utils.LogicalAnnotator({}).device == cirq.UNCONSTRAINED_DEVICE
@@ -15,7 +15,7 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import collections
18
- from typing import cast, Dict, List, Optional, Sequence, TYPE_CHECKING, Union
18
+ from typing import cast, Sequence, TYPE_CHECKING
19
19
 
20
20
  from cirq import circuits, ops, transformers
21
21
  from cirq.contrib.acquaintance.devices import get_acquaintance_size
@@ -25,7 +25,7 @@ from cirq.contrib.acquaintance.permutation import PermutationGate
25
25
  if TYPE_CHECKING:
26
26
  import cirq
27
27
 
28
- STRATEGY_GATE = Union[AcquaintanceOpportunityGate, PermutationGate]
28
+ STRATEGY_GATE = AcquaintanceOpportunityGate | PermutationGate
29
29
 
30
30
 
31
31
  def rectify_acquaintance_strategy(circuit: cirq.Circuit, acquaint_first: bool = True) -> None:
@@ -43,7 +43,7 @@ def rectify_acquaintance_strategy(circuit: cirq.Circuit, acquaint_first: bool =
43
43
  """
44
44
  rectified_moments = []
45
45
  for moment in circuit:
46
- gate_type_to_ops: Dict[bool, List[ops.GateOperation]] = collections.defaultdict(list)
46
+ gate_type_to_ops: dict[bool, list[ops.GateOperation]] = collections.defaultdict(list)
47
47
  for op in moment.operations:
48
48
  gate_op = cast(ops.GateOperation, op)
49
49
  is_acquaintance = isinstance(gate_op.gate, AcquaintanceOpportunityGate)
@@ -59,7 +59,7 @@ def rectify_acquaintance_strategy(circuit: cirq.Circuit, acquaint_first: bool =
59
59
  def replace_acquaintance_with_swap_network(
60
60
  circuit: cirq.Circuit,
61
61
  qubit_order: Sequence[cirq.Qid],
62
- acquaintance_size: Optional[int] = 0,
62
+ acquaintance_size: int | None = 0,
63
63
  swap_gate: cirq.Gate = ops.SWAP,
64
64
  ) -> bool:
65
65
  """Replace every rectified moment with acquaintance gates with a generalized swap network.
@@ -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 string import ascii_lowercase as alphabet
16
18
 
17
19
  import pytest
@@ -20,7 +22,7 @@ import cirq
20
22
  import cirq.contrib.acquaintance as cca
21
23
 
22
24
 
23
- def test_complete_acquaintance_strategy():
25
+ def test_complete_acquaintance_strategy() -> None:
24
26
  qubits = [cirq.NamedQubit(s) for s in alphabet]
25
27
 
26
28
  with pytest.raises(ValueError):
@@ -136,7 +138,7 @@ a b c d
136
138
  assert cca.get_acquaintance_size(cubic_strategy) == 3
137
139
 
138
140
 
139
- def test_rectification():
141
+ def test_rectification() -> None:
140
142
  qubits = cirq.LineQubit.range(4)
141
143
 
142
144
  perm_gate = cca.SwapPermutationGate()