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

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

Potentially problematic release.


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

Files changed (732) hide show
  1. cirq/__init__.py +16 -17
  2. cirq/_compat.py +21 -20
  3. cirq/_compat_test.py +14 -34
  4. cirq/_doc.py +4 -2
  5. cirq/_import.py +8 -6
  6. cirq/_import_test.py +4 -2
  7. cirq/_version.py +6 -6
  8. cirq/_version_test.py +2 -2
  9. cirq/circuits/_block_diagram_drawer.py +11 -10
  10. cirq/circuits/_block_diagram_drawer_test.py +8 -6
  11. cirq/circuits/_box_drawing_character_data.py +8 -8
  12. cirq/circuits/_box_drawing_character_data_test.py +3 -1
  13. cirq/circuits/_bucket_priority_queue.py +9 -7
  14. cirq/circuits/_bucket_priority_queue_test.py +22 -20
  15. cirq/circuits/circuit.py +248 -172
  16. cirq/circuits/circuit_operation.py +73 -83
  17. cirq/circuits/circuit_operation_test.py +128 -90
  18. cirq/circuits/circuit_test.py +211 -151
  19. cirq/circuits/frozen_circuit.py +23 -60
  20. cirq/circuits/frozen_circuit_test.py +31 -8
  21. cirq/circuits/insert_strategy.py +7 -5
  22. cirq/circuits/insert_strategy_test.py +4 -2
  23. cirq/circuits/moment.py +88 -40
  24. cirq/circuits/moment_test.py +128 -51
  25. cirq/circuits/optimization_pass.py +5 -5
  26. cirq/circuits/optimization_pass_test.py +10 -10
  27. cirq/circuits/qasm_output.py +11 -11
  28. cirq/circuits/qasm_output_test.py +25 -22
  29. cirq/circuits/text_diagram_drawer.py +23 -38
  30. cirq/circuits/text_diagram_drawer_test.py +19 -17
  31. cirq/conftest.py +4 -3
  32. cirq/contrib/__init__.py +4 -4
  33. cirq/contrib/acquaintance/__init__.py +1 -1
  34. cirq/contrib/acquaintance/bipartite.py +5 -8
  35. cirq/contrib/acquaintance/bipartite_test.py +18 -13
  36. cirq/contrib/acquaintance/devices.py +2 -2
  37. cirq/contrib/acquaintance/devices_test.py +5 -3
  38. cirq/contrib/acquaintance/executor.py +5 -5
  39. cirq/contrib/acquaintance/executor_test.py +13 -9
  40. cirq/contrib/acquaintance/gates.py +18 -28
  41. cirq/contrib/acquaintance/gates_test.py +24 -20
  42. cirq/contrib/acquaintance/inspection_utils.py +8 -4
  43. cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
  44. cirq/contrib/acquaintance/mutation_utils.py +4 -4
  45. cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
  46. cirq/contrib/acquaintance/optimizers.py +4 -4
  47. cirq/contrib/acquaintance/optimizers_test.py +4 -1
  48. cirq/contrib/acquaintance/permutation.py +15 -27
  49. cirq/contrib/acquaintance/permutation_test.py +26 -17
  50. cirq/contrib/acquaintance/shift.py +4 -4
  51. cirq/contrib/acquaintance/shift_swap_network.py +4 -4
  52. cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
  53. cirq/contrib/acquaintance/shift_test.py +8 -6
  54. cirq/contrib/acquaintance/strategies/cubic.py +2 -2
  55. cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
  56. cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
  57. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
  58. cirq/contrib/acquaintance/testing.py +2 -0
  59. cirq/contrib/acquaintance/topological_sort.py +2 -2
  60. cirq/contrib/acquaintance/topological_sort_test.py +3 -1
  61. cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
  62. cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
  63. cirq/contrib/circuitdag/circuit_dag.py +4 -4
  64. cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
  65. cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
  66. cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
  67. cirq/contrib/graph_device/graph_device.py +12 -11
  68. cirq/contrib/graph_device/graph_device_test.py +18 -14
  69. cirq/contrib/graph_device/hypergraph.py +16 -14
  70. cirq/contrib/graph_device/hypergraph_test.py +13 -11
  71. cirq/contrib/graph_device/uniform_graph_device.py +6 -4
  72. cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
  73. cirq/contrib/hacks/disable_validation.py +6 -1
  74. cirq/contrib/hacks/disable_validation_test.py +3 -1
  75. cirq/contrib/json.py +31 -5
  76. cirq/contrib/json_test.py +6 -3
  77. cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
  78. cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
  79. cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
  80. cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
  81. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
  82. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
  83. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
  84. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
  85. cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
  86. cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
  87. cirq/contrib/json_test_data/__init__.py +17 -0
  88. cirq/contrib/json_test_data/spec.py +32 -0
  89. cirq/contrib/noise_models/noise_models.py +119 -5
  90. cirq/contrib/noise_models/noise_models_test.py +37 -9
  91. cirq/contrib/paulistring/clifford_optimize.py +6 -4
  92. cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
  93. cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
  94. cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
  95. cirq/contrib/paulistring/optimize.py +2 -0
  96. cirq/contrib/paulistring/optimize_test.py +4 -3
  97. cirq/contrib/paulistring/pauli_string_dag.py +2 -0
  98. cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
  99. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
  100. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
  101. cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
  102. cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
  103. cirq/contrib/paulistring/recombine.py +6 -4
  104. cirq/contrib/paulistring/recombine_test.py +3 -1
  105. cirq/contrib/paulistring/separate.py +9 -6
  106. cirq/contrib/paulistring/separate_test.py +3 -1
  107. cirq/contrib/qasm_import/_lexer.py +3 -2
  108. cirq/contrib/qasm_import/_lexer_test.py +49 -13
  109. cirq/contrib/qasm_import/_parser.py +547 -83
  110. cirq/contrib/qasm_import/_parser_test.py +988 -97
  111. cirq/contrib/qasm_import/exception.py +2 -0
  112. cirq/contrib/qasm_import/qasm.py +8 -2
  113. cirq/contrib/qasm_import/qasm_test.py +7 -4
  114. cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
  115. cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
  116. cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
  117. cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
  118. cirq/contrib/qcircuit/qcircuit_test.py +10 -8
  119. cirq/contrib/quantum_volume/quantum_volume.py +31 -27
  120. cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
  121. cirq/contrib/quimb/density_matrix.py +15 -14
  122. cirq/contrib/quimb/density_matrix_test.py +10 -7
  123. cirq/contrib/quimb/grid_circuits.py +5 -2
  124. cirq/contrib/quimb/grid_circuits_test.py +3 -0
  125. cirq/contrib/quimb/mps_simulator.py +20 -20
  126. cirq/contrib/quimb/mps_simulator_test.py +3 -0
  127. cirq/contrib/quimb/state_vector.py +12 -11
  128. cirq/contrib/quimb/state_vector_test.py +3 -0
  129. cirq/contrib/quirk/export_to_quirk.py +5 -3
  130. cirq/contrib/quirk/export_to_quirk_test.py +18 -16
  131. cirq/contrib/quirk/linearize_circuit.py +2 -0
  132. cirq/contrib/quirk/quirk_gate.py +18 -17
  133. cirq/contrib/routing/device.py +5 -3
  134. cirq/contrib/routing/device_test.py +2 -0
  135. cirq/contrib/routing/greedy.py +10 -21
  136. cirq/contrib/routing/greedy_test.py +4 -2
  137. cirq/contrib/routing/initialization.py +2 -2
  138. cirq/contrib/routing/initialization_test.py +5 -3
  139. cirq/contrib/routing/router.py +9 -5
  140. cirq/contrib/routing/router_test.py +2 -0
  141. cirq/contrib/routing/swap_network.py +3 -3
  142. cirq/contrib/routing/swap_network_test.py +3 -1
  143. cirq/contrib/routing/utils.py +2 -2
  144. cirq/contrib/routing/utils_test.py +3 -0
  145. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
  146. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
  147. cirq/contrib/svg/svg.py +3 -3
  148. cirq/contrib/svg/svg_test.py +8 -5
  149. cirq/devices/device.py +4 -4
  150. cirq/devices/device_test.py +7 -4
  151. cirq/devices/grid_device_metadata.py +10 -10
  152. cirq/devices/grid_device_metadata_test.py +3 -0
  153. cirq/devices/grid_qubit.py +29 -21
  154. cirq/devices/grid_qubit_test.py +3 -0
  155. cirq/devices/insertion_noise_model.py +7 -7
  156. cirq/devices/insertion_noise_model_test.py +7 -5
  157. cirq/devices/line_qubit.py +13 -13
  158. cirq/devices/line_qubit_test.py +2 -0
  159. cirq/devices/named_topologies.py +18 -29
  160. cirq/devices/named_topologies_test.py +13 -10
  161. cirq/devices/noise_model.py +3 -3
  162. cirq/devices/noise_model_test.py +19 -15
  163. cirq/devices/noise_properties.py +15 -6
  164. cirq/devices/noise_properties_test.py +34 -3
  165. cirq/devices/noise_utils.py +11 -9
  166. cirq/devices/noise_utils_test.py +2 -0
  167. cirq/devices/superconducting_qubits_noise_properties.py +23 -22
  168. cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
  169. cirq/devices/thermal_noise_model.py +107 -37
  170. cirq/devices/thermal_noise_model_test.py +21 -0
  171. cirq/devices/unconstrained_device.py +5 -3
  172. cirq/devices/unconstrained_device_test.py +2 -0
  173. cirq/experiments/__init__.py +4 -2
  174. cirq/experiments/benchmarking/__init__.py +17 -0
  175. cirq/experiments/benchmarking/parallel_xeb.py +677 -0
  176. cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
  177. cirq/experiments/fidelity_estimation.py +14 -8
  178. cirq/experiments/fidelity_estimation_test.py +3 -0
  179. cirq/experiments/n_qubit_tomography.py +17 -16
  180. cirq/experiments/n_qubit_tomography_test.py +8 -5
  181. cirq/experiments/purity_estimation.py +2 -0
  182. cirq/experiments/purity_estimation_test.py +2 -0
  183. cirq/experiments/qubit_characterizations.py +207 -103
  184. cirq/experiments/qubit_characterizations_test.py +40 -12
  185. cirq/experiments/random_quantum_circuit_generation.py +56 -70
  186. cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
  187. cirq/experiments/readout_confusion_matrix.py +24 -22
  188. cirq/experiments/readout_confusion_matrix_test.py +2 -0
  189. cirq/experiments/single_qubit_readout_calibration.py +30 -15
  190. cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
  191. cirq/experiments/t1_decay_experiment.py +9 -7
  192. cirq/experiments/t1_decay_experiment_test.py +13 -11
  193. cirq/experiments/t2_decay_experiment.py +16 -13
  194. cirq/experiments/t2_decay_experiment_test.py +2 -0
  195. cirq/experiments/two_qubit_xeb.py +64 -57
  196. cirq/experiments/two_qubit_xeb_test.py +10 -6
  197. cirq/experiments/xeb_fitting.py +39 -35
  198. cirq/experiments/xeb_sampling.py +37 -44
  199. cirq/experiments/xeb_sampling_test.py +3 -0
  200. cirq/experiments/xeb_simulation.py +14 -10
  201. cirq/experiments/xeb_simulation_test.py +5 -5
  202. cirq/experiments/z_phase_calibration.py +32 -29
  203. cirq/experiments/z_phase_calibration_test.py +3 -4
  204. cirq/interop/quirk/cells/__init__.py +1 -1
  205. cirq/interop/quirk/cells/all_cells.py +7 -2
  206. cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
  207. cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
  208. cirq/interop/quirk/cells/cell.py +19 -28
  209. cirq/interop/quirk/cells/cell_test.py +3 -0
  210. cirq/interop/quirk/cells/composite_cell.py +13 -28
  211. cirq/interop/quirk/cells/composite_cell_test.py +2 -0
  212. cirq/interop/quirk/cells/control_cells.py +15 -15
  213. cirq/interop/quirk/cells/control_cells_test.py +7 -5
  214. cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
  215. cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
  216. cirq/interop/quirk/cells/ignored_cells.py +3 -0
  217. cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
  218. cirq/interop/quirk/cells/input_cells.py +7 -5
  219. cirq/interop/quirk/cells/input_cells_test.py +7 -5
  220. cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
  221. cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
  222. cirq/interop/quirk/cells/measurement_cells.py +5 -2
  223. cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
  224. cirq/interop/quirk/cells/parse.py +22 -23
  225. cirq/interop/quirk/cells/parse_test.py +12 -10
  226. cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
  227. cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
  228. cirq/interop/quirk/cells/scalar_cells.py +4 -1
  229. cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
  230. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
  231. cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
  232. cirq/interop/quirk/cells/swap_cell.py +8 -6
  233. cirq/interop/quirk/cells/swap_cell_test.py +6 -4
  234. cirq/interop/quirk/cells/testing.py +6 -6
  235. cirq/interop/quirk/cells/testing_test.py +8 -6
  236. cirq/interop/quirk/cells/unsupported_cells.py +3 -0
  237. cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
  238. cirq/interop/quirk/url_to_circuit.py +23 -36
  239. cirq/interop/quirk/url_to_circuit_test.py +4 -1
  240. cirq/json_resolver_cache.py +14 -12
  241. cirq/linalg/__init__.py +4 -6
  242. cirq/linalg/combinators.py +7 -5
  243. cirq/linalg/combinators_test.py +10 -7
  244. cirq/linalg/decompositions.py +24 -35
  245. cirq/linalg/decompositions_test.py +3 -1
  246. cirq/linalg/diagonalize.py +6 -4
  247. cirq/linalg/diagonalize_test.py +15 -14
  248. cirq/linalg/operator_spaces.py +14 -14
  249. cirq/linalg/operator_spaces_test.py +13 -11
  250. cirq/linalg/predicates.py +18 -9
  251. cirq/linalg/predicates_test.py +5 -0
  252. cirq/linalg/tolerance.py +6 -3
  253. cirq/linalg/tolerance_test.py +6 -4
  254. cirq/linalg/transformations.py +23 -20
  255. cirq/linalg/transformations_test.py +73 -43
  256. cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
  257. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
  258. cirq/neutral_atoms/neutral_atom_devices.py +2 -0
  259. cirq/ops/__init__.py +2 -0
  260. cirq/ops/arithmetic_operation.py +21 -21
  261. cirq/ops/arithmetic_operation_test.py +7 -8
  262. cirq/ops/boolean_hamiltonian.py +23 -22
  263. cirq/ops/boolean_hamiltonian_test.py +12 -9
  264. cirq/ops/classically_controlled_operation.py +31 -36
  265. cirq/ops/classically_controlled_operation_test.py +121 -117
  266. cirq/ops/clifford_gate.py +98 -81
  267. cirq/ops/clifford_gate_test.py +72 -57
  268. cirq/ops/common_channels.py +44 -44
  269. cirq/ops/common_channels_test.py +83 -81
  270. cirq/ops/common_gate_families.py +9 -7
  271. cirq/ops/common_gate_families_test.py +11 -7
  272. cirq/ops/common_gates.py +164 -183
  273. cirq/ops/common_gates_test.py +135 -95
  274. cirq/ops/control_values.py +23 -26
  275. cirq/ops/control_values_test.py +22 -20
  276. cirq/ops/controlled_gate.py +64 -112
  277. cirq/ops/controlled_gate_test.py +130 -35
  278. cirq/ops/controlled_operation.py +24 -35
  279. cirq/ops/controlled_operation_test.py +8 -6
  280. cirq/ops/dense_pauli_string.py +38 -49
  281. cirq/ops/dense_pauli_string_test.py +4 -2
  282. cirq/ops/diagonal_gate.py +18 -31
  283. cirq/ops/diagonal_gate_test.py +13 -13
  284. cirq/ops/eigen_gate.py +29 -29
  285. cirq/ops/eigen_gate_test.py +45 -28
  286. cirq/ops/fourier_transform.py +14 -20
  287. cirq/ops/fourier_transform_test.py +15 -12
  288. cirq/ops/fsim_gate.py +43 -42
  289. cirq/ops/fsim_gate_test.py +29 -29
  290. cirq/ops/gate_features.py +2 -0
  291. cirq/ops/gate_features_test.py +5 -3
  292. cirq/ops/gate_operation.py +43 -65
  293. cirq/ops/gate_operation_test.py +46 -42
  294. cirq/ops/gateset.py +28 -40
  295. cirq/ops/gateset_test.py +4 -2
  296. cirq/ops/global_phase_op.py +45 -20
  297. cirq/ops/global_phase_op_test.py +44 -20
  298. cirq/ops/greedy_qubit_manager.py +10 -8
  299. cirq/ops/greedy_qubit_manager_test.py +5 -3
  300. cirq/ops/identity.py +14 -12
  301. cirq/ops/identity_test.py +24 -20
  302. cirq/ops/kraus_channel.py +11 -8
  303. cirq/ops/kraus_channel_test.py +14 -11
  304. cirq/ops/linear_combinations.py +65 -77
  305. cirq/ops/linear_combinations_test.py +14 -9
  306. cirq/ops/matrix_gates.py +21 -18
  307. cirq/ops/matrix_gates_test.py +16 -0
  308. cirq/ops/measure_util.py +15 -20
  309. cirq/ops/measure_util_test.py +2 -0
  310. cirq/ops/measurement_gate.py +26 -37
  311. cirq/ops/measurement_gate_test.py +2 -0
  312. cirq/ops/mixed_unitary_channel.py +12 -9
  313. cirq/ops/mixed_unitary_channel_test.py +14 -11
  314. cirq/ops/named_qubit.py +16 -13
  315. cirq/ops/named_qubit_test.py +15 -13
  316. cirq/ops/op_tree.py +9 -7
  317. cirq/ops/op_tree_test.py +22 -19
  318. cirq/ops/parallel_gate.py +15 -17
  319. cirq/ops/parallel_gate_test.py +18 -16
  320. cirq/ops/parity_gates.py +23 -25
  321. cirq/ops/parity_gates_test.py +36 -32
  322. cirq/ops/pauli_gates.py +22 -21
  323. cirq/ops/pauli_gates_test.py +29 -20
  324. cirq/ops/pauli_interaction_gate.py +15 -19
  325. cirq/ops/pauli_interaction_gate_test.py +10 -8
  326. cirq/ops/pauli_measurement_gate.py +23 -35
  327. cirq/ops/pauli_measurement_gate_test.py +2 -0
  328. cirq/ops/pauli_string.py +92 -120
  329. cirq/ops/pauli_string_phasor.py +52 -45
  330. cirq/ops/pauli_string_phasor_test.py +4 -5
  331. cirq/ops/pauli_string_raw_types.py +9 -7
  332. cirq/ops/pauli_string_raw_types_test.py +2 -0
  333. cirq/ops/pauli_string_test.py +31 -154
  334. cirq/ops/pauli_sum_exponential.py +12 -12
  335. cirq/ops/pauli_sum_exponential_test.py +12 -10
  336. cirq/ops/permutation_gate.py +8 -6
  337. cirq/ops/permutation_gate_test.py +10 -8
  338. cirq/ops/phased_iswap_gate.py +16 -16
  339. cirq/ops/phased_iswap_gate_test.py +17 -15
  340. cirq/ops/phased_x_gate.py +16 -17
  341. cirq/ops/phased_x_gate_test.py +18 -16
  342. cirq/ops/phased_x_z_gate.py +24 -22
  343. cirq/ops/phased_x_z_gate_test.py +17 -11
  344. cirq/ops/projector.py +16 -11
  345. cirq/ops/projector_test.py +19 -16
  346. cirq/ops/qid_util.py +7 -5
  347. cirq/ops/qid_util_test.py +2 -0
  348. cirq/ops/qubit_manager.py +11 -9
  349. cirq/ops/qubit_manager_test.py +6 -4
  350. cirq/ops/qubit_order.py +11 -14
  351. cirq/ops/qubit_order_or_list.py +4 -2
  352. cirq/ops/qubit_order_test.py +12 -10
  353. cirq/ops/random_gate_channel.py +12 -10
  354. cirq/ops/random_gate_channel_test.py +14 -11
  355. cirq/ops/raw_types.py +109 -129
  356. cirq/ops/raw_types_test.py +63 -57
  357. cirq/ops/state_preparation_channel.py +7 -7
  358. cirq/ops/state_preparation_channel_test.py +11 -9
  359. cirq/ops/swap_gates.py +13 -15
  360. cirq/ops/swap_gates_test.py +19 -17
  361. cirq/ops/tags.py +5 -3
  362. cirq/ops/tags_test.py +4 -2
  363. cirq/ops/three_qubit_gates.py +43 -76
  364. cirq/ops/three_qubit_gates_test.py +19 -17
  365. cirq/ops/two_qubit_diagonal_gate.py +13 -13
  366. cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
  367. cirq/ops/uniform_superposition_gate.py +5 -3
  368. cirq/ops/uniform_superposition_gate_test.py +5 -3
  369. cirq/ops/wait_gate.py +17 -14
  370. cirq/ops/wait_gate_test.py +9 -6
  371. cirq/protocols/__init__.py +0 -3
  372. cirq/protocols/act_on_protocol.py +8 -6
  373. cirq/protocols/act_on_protocol_test.py +15 -12
  374. cirq/protocols/apply_channel_protocol.py +10 -14
  375. cirq/protocols/apply_channel_protocol_test.py +2 -0
  376. cirq/protocols/apply_mixture_protocol.py +13 -42
  377. cirq/protocols/apply_mixture_protocol_test.py +7 -5
  378. cirq/protocols/apply_unitary_protocol.py +39 -34
  379. cirq/protocols/apply_unitary_protocol_test.py +4 -1
  380. cirq/protocols/approximate_equality_protocol.py +2 -0
  381. cirq/protocols/approximate_equality_protocol_test.py +2 -0
  382. cirq/protocols/circuit_diagram_info_protocol.py +58 -42
  383. cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
  384. cirq/protocols/commutes_protocol.py +8 -7
  385. cirq/protocols/commutes_protocol_test.py +2 -0
  386. cirq/protocols/control_key_protocol.py +6 -4
  387. cirq/protocols/control_key_protocol_test.py +3 -1
  388. cirq/protocols/decompose_protocol.py +49 -48
  389. cirq/protocols/decompose_protocol_test.py +27 -16
  390. cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
  391. cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
  392. cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
  393. cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
  394. cirq/protocols/has_unitary_protocol.py +10 -6
  395. cirq/protocols/has_unitary_protocol_test.py +13 -8
  396. cirq/protocols/hash_from_pickle_test.py +2 -11
  397. cirq/protocols/inverse_protocol.py +13 -16
  398. cirq/protocols/inverse_protocol_test.py +5 -3
  399. cirq/protocols/json_serialization.py +35 -54
  400. cirq/protocols/json_serialization_test.py +14 -21
  401. cirq/protocols/json_test_data/CXSWAP.json +46 -0
  402. cirq/protocols/json_test_data/CXSWAP.repr +13 -0
  403. cirq/protocols/json_test_data/CZSWAP.json +46 -0
  404. cirq/protocols/json_test_data/CZSWAP.repr +13 -0
  405. cirq/protocols/json_test_data/CircuitOperation.json +6 -3
  406. cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
  407. cirq/protocols/json_test_data/Moment.json +24 -1
  408. cirq/protocols/json_test_data/Moment.repr +6 -1
  409. cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
  410. cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
  411. cirq/protocols/json_test_data/spec.py +6 -2
  412. cirq/protocols/kraus_protocol.py +47 -7
  413. cirq/protocols/kraus_protocol_test.py +86 -12
  414. cirq/protocols/measurement_key_protocol.py +15 -16
  415. cirq/protocols/measurement_key_protocol_test.py +13 -11
  416. cirq/protocols/mixture_protocol.py +7 -5
  417. cirq/protocols/mixture_protocol_test.py +4 -2
  418. cirq/protocols/mul_protocol.py +2 -3
  419. cirq/protocols/mul_protocol_test.py +2 -0
  420. cirq/protocols/pauli_expansion_protocol.py +6 -3
  421. cirq/protocols/pauli_expansion_protocol_test.py +5 -3
  422. cirq/protocols/phase_protocol.py +2 -0
  423. cirq/protocols/phase_protocol_test.py +3 -1
  424. cirq/protocols/pow_protocol.py +11 -16
  425. cirq/protocols/pow_protocol_test.py +2 -0
  426. cirq/protocols/qasm.py +14 -20
  427. cirq/protocols/qasm_test.py +6 -3
  428. cirq/protocols/qid_shape_protocol.py +8 -8
  429. cirq/protocols/qid_shape_protocol_test.py +3 -1
  430. cirq/protocols/resolve_parameters.py +5 -3
  431. cirq/protocols/resolve_parameters_test.py +8 -7
  432. cirq/protocols/trace_distance_bound.py +6 -4
  433. cirq/protocols/trace_distance_bound_test.py +3 -1
  434. cirq/protocols/unitary_protocol.py +17 -7
  435. cirq/protocols/unitary_protocol_test.py +12 -2
  436. cirq/qis/channels.py +6 -2
  437. cirq/qis/channels_test.py +20 -16
  438. cirq/qis/clifford_tableau.py +21 -19
  439. cirq/qis/clifford_tableau_test.py +2 -2
  440. cirq/qis/entropy.py +14 -3
  441. cirq/qis/entropy_test.py +3 -1
  442. cirq/qis/measures.py +13 -13
  443. cirq/qis/measures_test.py +20 -14
  444. cirq/qis/noise_utils.py +2 -0
  445. cirq/qis/noise_utils_test.py +9 -7
  446. cirq/qis/quantum_state_representation.py +7 -8
  447. cirq/qis/states.py +58 -56
  448. cirq/qis/states_test.py +2 -0
  449. cirq/sim/classical_simulator.py +23 -22
  450. cirq/sim/classical_simulator_test.py +2 -0
  451. cirq/sim/clifford/clifford_simulator.py +23 -21
  452. cirq/sim/clifford/clifford_simulator_test.py +7 -4
  453. cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
  454. cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
  455. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
  456. cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
  457. cirq/sim/clifford/stabilizer_sampler.py +9 -7
  458. cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
  459. cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
  460. cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
  461. cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
  462. cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
  463. cirq/sim/density_matrix_simulation_state.py +26 -27
  464. cirq/sim/density_matrix_simulation_state_test.py +10 -8
  465. cirq/sim/density_matrix_simulator.py +30 -28
  466. cirq/sim/density_matrix_simulator_test.py +48 -48
  467. cirq/sim/density_matrix_utils.py +13 -11
  468. cirq/sim/density_matrix_utils_test.py +38 -36
  469. cirq/sim/mux.py +33 -31
  470. cirq/sim/mux_test.py +3 -0
  471. cirq/sim/simulation_product_state.py +15 -15
  472. cirq/sim/simulation_product_state_test.py +29 -26
  473. cirq/sim/simulation_state.py +29 -38
  474. cirq/sim/simulation_state_base.py +21 -32
  475. cirq/sim/simulation_state_test.py +15 -13
  476. cirq/sim/simulation_utils.py +5 -2
  477. cirq/sim/simulation_utils_test.py +5 -2
  478. cirq/sim/simulator.py +90 -106
  479. cirq/sim/simulator_base.py +33 -45
  480. cirq/sim/simulator_base_test.py +20 -15
  481. cirq/sim/simulator_test.py +23 -14
  482. cirq/sim/sparse_simulator.py +19 -17
  483. cirq/sim/sparse_simulator_test.py +41 -40
  484. cirq/sim/state_vector.py +15 -12
  485. cirq/sim/state_vector_simulation_state.py +31 -31
  486. cirq/sim/state_vector_simulation_state_test.py +16 -14
  487. cirq/sim/state_vector_simulator.py +17 -14
  488. cirq/sim/state_vector_simulator_test.py +2 -0
  489. cirq/sim/state_vector_test.py +6 -3
  490. cirq/study/flatten_expressions.py +16 -15
  491. cirq/study/flatten_expressions_test.py +13 -11
  492. cirq/study/resolver.py +18 -17
  493. cirq/study/resolver_test.py +22 -20
  494. cirq/study/result.py +17 -27
  495. cirq/study/result_test.py +2 -0
  496. cirq/study/sweepable.py +12 -10
  497. cirq/study/sweepable_test.py +3 -0
  498. cirq/study/sweeps.py +42 -61
  499. cirq/study/sweeps_test.py +33 -0
  500. cirq/testing/__init__.py +7 -11
  501. cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
  502. cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
  503. cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
  504. cirq/testing/circuit_compare.py +8 -17
  505. cirq/testing/circuit_compare_test.py +2 -0
  506. cirq/testing/consistent_act_on.py +13 -11
  507. cirq/testing/consistent_act_on_test.py +5 -3
  508. cirq/testing/consistent_channels.py +2 -0
  509. cirq/testing/consistent_channels_test.py +10 -8
  510. cirq/testing/consistent_controlled_gate_op.py +5 -5
  511. cirq/testing/consistent_controlled_gate_op_test.py +18 -18
  512. cirq/testing/consistent_decomposition.py +2 -2
  513. cirq/testing/consistent_decomposition_test.py +4 -2
  514. cirq/testing/consistent_pauli_expansion.py +2 -0
  515. cirq/testing/consistent_pauli_expansion_test.py +3 -1
  516. cirq/testing/consistent_phase_by.py +2 -0
  517. cirq/testing/consistent_phase_by_test.py +3 -1
  518. cirq/testing/consistent_protocols.py +14 -20
  519. cirq/testing/consistent_protocols_test.py +13 -11
  520. cirq/testing/consistent_qasm.py +6 -4
  521. cirq/testing/consistent_qasm_test.py +7 -7
  522. cirq/testing/consistent_resolve_parameters.py +2 -0
  523. cirq/testing/consistent_specified_has_unitary.py +2 -2
  524. cirq/testing/consistent_specified_has_unitary_test.py +6 -4
  525. cirq/testing/consistent_unitary.py +1 -0
  526. cirq/testing/consistent_unitary_test.py +4 -2
  527. cirq/testing/deprecation.py +5 -2
  528. cirq/testing/deprecation_test.py +5 -2
  529. cirq/testing/devices.py +7 -4
  530. cirq/testing/devices_test.py +7 -4
  531. cirq/testing/equals_tester.py +4 -2
  532. cirq/testing/equals_tester_test.py +21 -17
  533. cirq/testing/equivalent_basis_map.py +6 -4
  534. cirq/testing/equivalent_basis_map_test.py +6 -4
  535. cirq/testing/equivalent_repr_eval.py +6 -4
  536. cirq/testing/equivalent_repr_eval_test.py +5 -3
  537. cirq/testing/gate_features.py +2 -0
  538. cirq/testing/gate_features_test.py +7 -5
  539. cirq/testing/json.py +19 -15
  540. cirq/testing/json_test.py +5 -3
  541. cirq/testing/lin_alg_utils.py +10 -11
  542. cirq/testing/lin_alg_utils_test.py +14 -12
  543. cirq/testing/logs.py +7 -6
  544. cirq/testing/logs_test.py +9 -7
  545. cirq/testing/no_identifier_qubit.py +4 -2
  546. cirq/testing/no_identifier_qubit_test.py +5 -3
  547. cirq/testing/op_tree.py +2 -0
  548. cirq/testing/op_tree_test.py +4 -1
  549. cirq/testing/order_tester.py +2 -0
  550. cirq/testing/order_tester_test.py +8 -6
  551. cirq/testing/pytest_utils.py +2 -0
  552. cirq/testing/pytest_utils_test.py +4 -2
  553. cirq/testing/random_circuit.py +21 -20
  554. cirq/testing/random_circuit_test.py +12 -9
  555. cirq/testing/repr_pretty_tester.py +1 -0
  556. cirq/testing/repr_pretty_tester_test.py +5 -3
  557. cirq/testing/routing_devices.py +4 -1
  558. cirq/testing/routing_devices_test.py +9 -6
  559. cirq/testing/sample_circuits.py +4 -1
  560. cirq/testing/sample_circuits_test.py +3 -1
  561. cirq/testing/sample_gates.py +3 -0
  562. cirq/testing/sample_gates_test.py +5 -2
  563. cirq/transformers/__init__.py +11 -4
  564. cirq/transformers/align.py +9 -7
  565. cirq/transformers/align_test.py +2 -0
  566. cirq/transformers/analytical_decompositions/__init__.py +3 -6
  567. cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
  568. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
  569. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
  570. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  571. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
  572. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
  573. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
  574. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
  575. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
  576. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
  577. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
  578. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
  579. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
  580. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
  581. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
  582. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
  583. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
  584. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
  585. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
  586. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
  587. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
  588. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
  589. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
  590. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
  591. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
  592. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
  593. cirq/transformers/drop_empty_moments.py +5 -3
  594. cirq/transformers/drop_empty_moments_test.py +4 -2
  595. cirq/transformers/drop_negligible_operations.py +7 -5
  596. cirq/transformers/drop_negligible_operations_test.py +2 -0
  597. cirq/transformers/dynamical_decoupling.py +49 -42
  598. cirq/transformers/dynamical_decoupling_test.py +223 -205
  599. cirq/transformers/eject_phased_paulis.py +28 -26
  600. cirq/transformers/eject_phased_paulis_test.py +12 -9
  601. cirq/transformers/eject_z.py +12 -12
  602. cirq/transformers/eject_z_test.py +2 -2
  603. cirq/transformers/expand_composite.py +6 -4
  604. cirq/transformers/expand_composite_test.py +3 -1
  605. cirq/transformers/gauge_compiling/__init__.py +3 -1
  606. cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
  607. cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
  608. cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
  609. cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
  610. cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
  611. cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
  612. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
  613. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
  614. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
  615. cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
  616. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
  617. cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
  618. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
  619. cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
  620. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
  621. cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
  622. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
  623. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
  624. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
  625. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
  626. cirq/transformers/insertion_sort.py +8 -6
  627. cirq/transformers/insertion_sort_test.py +3 -1
  628. cirq/transformers/measurement_transformers.py +29 -29
  629. cirq/transformers/measurement_transformers_test.py +2 -0
  630. cirq/transformers/merge_k_qubit_gates.py +12 -10
  631. cirq/transformers/merge_k_qubit_gates_test.py +18 -18
  632. cirq/transformers/merge_single_qubit_gates.py +197 -20
  633. cirq/transformers/merge_single_qubit_gates_test.py +177 -5
  634. cirq/transformers/noise_adding.py +5 -3
  635. cirq/transformers/noise_adding_test.py +2 -0
  636. cirq/transformers/optimize_for_target_gateset.py +19 -17
  637. cirq/transformers/optimize_for_target_gateset_test.py +11 -8
  638. cirq/transformers/qubit_management_transformers.py +13 -11
  639. cirq/transformers/qubit_management_transformers_test.py +5 -3
  640. cirq/transformers/randomized_measurements.py +16 -14
  641. cirq/transformers/randomized_measurements_test.py +10 -4
  642. cirq/transformers/routing/initial_mapper.py +6 -4
  643. cirq/transformers/routing/initial_mapper_test.py +2 -0
  644. cirq/transformers/routing/line_initial_mapper.py +16 -14
  645. cirq/transformers/routing/line_initial_mapper_test.py +9 -7
  646. cirq/transformers/routing/mapping_manager.py +10 -10
  647. cirq/transformers/routing/mapping_manager_test.py +2 -0
  648. cirq/transformers/routing/route_circuit_cqc.py +33 -31
  649. cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
  650. cirq/transformers/routing/visualize_routed_circuit.py +8 -7
  651. cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
  652. cirq/transformers/stratify.py +17 -15
  653. cirq/transformers/stratify_test.py +3 -0
  654. cirq/transformers/symbolize.py +103 -0
  655. cirq/transformers/symbolize_test.py +62 -0
  656. cirq/transformers/synchronize_terminal_measurements.py +10 -10
  657. cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
  658. cirq/transformers/tag_transformers.py +97 -0
  659. cirq/transformers/tag_transformers_test.py +103 -0
  660. cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
  661. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
  662. cirq/transformers/target_gatesets/cz_gateset.py +7 -5
  663. cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
  664. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
  665. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
  666. cirq/transformers/transformer_api.py +34 -47
  667. cirq/transformers/transformer_api_test.py +9 -8
  668. cirq/transformers/transformer_primitives.py +39 -49
  669. cirq/transformers/transformer_primitives_test.py +10 -17
  670. cirq/value/abc_alt.py +6 -4
  671. cirq/value/abc_alt_test.py +5 -3
  672. cirq/value/angle.py +11 -12
  673. cirq/value/angle_test.py +5 -3
  674. cirq/value/classical_data.py +27 -27
  675. cirq/value/classical_data_test.py +11 -8
  676. cirq/value/condition.py +26 -24
  677. cirq/value/condition_test.py +2 -0
  678. cirq/value/digits.py +14 -11
  679. cirq/value/digits_test.py +2 -0
  680. cirq/value/duration.py +23 -20
  681. cirq/value/duration_test.py +2 -0
  682. cirq/value/linear_dict.py +25 -30
  683. cirq/value/linear_dict_test.py +10 -8
  684. cirq/value/measurement_key.py +12 -12
  685. cirq/value/measurement_key_test.py +2 -0
  686. cirq/value/periodic_value.py +4 -4
  687. cirq/value/periodic_value_test.py +11 -7
  688. cirq/value/probability.py +3 -1
  689. cirq/value/probability_test.py +4 -2
  690. cirq/value/product_state.py +15 -13
  691. cirq/value/product_state_test.py +4 -1
  692. cirq/value/random_state.py +2 -0
  693. cirq/value/random_state_test.py +5 -3
  694. cirq/value/timestamp.py +11 -7
  695. cirq/value/timestamp_test.py +14 -12
  696. cirq/value/type_alias.py +4 -4
  697. cirq/value/value_equality_attr.py +8 -9
  698. cirq/value/value_equality_attr_test.py +14 -11
  699. cirq/vis/density_matrix.py +3 -3
  700. cirq/vis/density_matrix_test.py +20 -17
  701. cirq/vis/heatmap.py +24 -37
  702. cirq/vis/heatmap_test.py +3 -0
  703. cirq/vis/histogram.py +9 -6
  704. cirq/vis/histogram_test.py +5 -2
  705. cirq/vis/state_histogram.py +10 -8
  706. cirq/vis/state_histogram_test.py +7 -5
  707. cirq/vis/vis_utils.py +4 -1
  708. cirq/vis/vis_utils_test.py +4 -1
  709. cirq/work/collector.py +12 -18
  710. cirq/work/collector_test.py +15 -10
  711. cirq/work/observable_grouping.py +6 -7
  712. cirq/work/observable_grouping_test.py +10 -9
  713. cirq/work/observable_measurement.py +47 -45
  714. cirq/work/observable_measurement_data.py +22 -17
  715. cirq/work/observable_measurement_data_test.py +4 -1
  716. cirq/work/observable_measurement_test.py +48 -29
  717. cirq/work/observable_readout_calibration.py +5 -2
  718. cirq/work/observable_readout_calibration_test.py +5 -2
  719. cirq/work/observable_settings.py +13 -22
  720. cirq/work/observable_settings_test.py +9 -7
  721. cirq/work/pauli_sum_collector.py +12 -10
  722. cirq/work/pauli_sum_collector_test.py +9 -9
  723. cirq/work/sampler.py +42 -43
  724. cirq/work/sampler_test.py +31 -24
  725. cirq/work/zeros_sampler.py +6 -4
  726. cirq/work/zeros_sampler_test.py +7 -5
  727. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
  728. cirq_core-1.6.0.dist-info/RECORD +1241 -0
  729. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409222543.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409222543.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
@@ -14,7 +14,7 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import cast, FrozenSet, List, Sequence, Set, TYPE_CHECKING
17
+ from typing import cast, Sequence, TYPE_CHECKING
18
18
 
19
19
  from cirq import circuits
20
20
  from cirq.contrib.acquaintance.executor import AcquaintanceOperation
@@ -36,11 +36,11 @@ def remove_redundant_acquaintance_opportunities(strategy: cirq.Circuit) -> int:
36
36
  annotated_strategy = strategy.copy()
37
37
  LogicalAnnotator(mapping)(annotated_strategy)
38
38
 
39
- new_moments: List[cirq.Moment] = []
40
- acquaintance_opps: Set[FrozenSet[int]] = set()
39
+ new_moments: list[cirq.Moment] = []
40
+ acquaintance_opps: set[frozenset[int]] = set()
41
41
  n_removed = 0
42
42
  for moment in annotated_strategy:
43
- new_moment: List[cirq.Operation] = []
43
+ new_moment: list[cirq.Operation] = []
44
44
  for op in moment:
45
45
  if isinstance(op, AcquaintanceOperation):
46
46
  opp = frozenset(cast(Sequence[int], op.logical_indices))
@@ -11,12 +11,15 @@
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 cirq
15
18
  import cirq.contrib.acquaintance as cca
16
19
  import cirq.testing as ct
17
20
 
18
21
 
19
- def test_remove_redundant_acquaintance_opportunities():
22
+ def test_remove_redundant_acquaintance_opportunities() -> None:
20
23
  a, b, c, d, e = cirq.LineQubit.range(5)
21
24
  swap = cca.SwapPermutationGate()
22
25
 
@@ -16,19 +16,7 @@ from __future__ import annotations
16
16
 
17
17
  import abc
18
18
  from types import NotImplementedType
19
- from typing import (
20
- Any,
21
- cast,
22
- Dict,
23
- Iterable,
24
- Iterator,
25
- Optional,
26
- Sequence,
27
- Tuple,
28
- TYPE_CHECKING,
29
- TypeVar,
30
- Union,
31
- )
19
+ from typing import Any, cast, Iterable, Iterator, Sequence, TYPE_CHECKING, TypeVar
32
20
 
33
21
  from cirq import circuits, ops, protocols, transformers, value
34
22
 
@@ -37,10 +25,10 @@ if TYPE_CHECKING:
37
25
 
38
26
 
39
27
  LogicalIndex = TypeVar('LogicalIndex', int, ops.Qid)
40
- LogicalIndexSequence = Union[Sequence[int], Sequence['cirq.Qid']]
41
- LogicalGates = Dict[Tuple[LogicalIndex, ...], ops.Gate]
28
+ LogicalIndexSequence = Sequence[int] | Sequence['cirq.Qid']
29
+ LogicalGates = dict[tuple[LogicalIndex, ...], ops.Gate]
42
30
  LogicalMappingKey = TypeVar('LogicalMappingKey', bound=ops.Qid)
43
- LogicalMapping = Dict[LogicalMappingKey, LogicalIndex]
31
+ LogicalMapping = dict[LogicalMappingKey, LogicalIndex]
44
32
 
45
33
 
46
34
  class PermutationGate(ops.Gate, metaclass=abc.ABCMeta):
@@ -61,12 +49,12 @@ class PermutationGate(ops.Gate, metaclass=abc.ABCMeta):
61
49
  return self._num_qubits
62
50
 
63
51
  @abc.abstractmethod
64
- def permutation(self) -> Dict[int, int]:
52
+ def permutation(self) -> dict[int, int]:
65
53
  """permutation = {i: s[i]} indicates that the i-th element is mapped to
66
54
  the s[i]-th element."""
67
55
 
68
56
  def update_mapping(
69
- self, mapping: Dict[ops.Qid, LogicalIndex], keys: Sequence[cirq.Qid]
57
+ self, mapping: dict[ops.Qid, LogicalIndex], keys: Sequence[cirq.Qid]
70
58
  ) -> None:
71
59
  """Updates a mapping (in place) from qubits to logical indices.
72
60
 
@@ -86,7 +74,7 @@ class PermutationGate(ops.Gate, metaclass=abc.ABCMeta):
86
74
  mapping[new_key] = old_element
87
75
 
88
76
  @staticmethod
89
- def validate_permutation(permutation: Dict[int, int], n_elements: Optional[int] = None) -> None:
77
+ def validate_permutation(permutation: dict[int, int], n_elements: int | None = None) -> None:
90
78
  if not permutation:
91
79
  return
92
80
  if set(permutation.values()) != set(permutation):
@@ -99,7 +87,7 @@ class PermutationGate(ops.Gate, metaclass=abc.ABCMeta):
99
87
 
100
88
  def _circuit_diagram_info_(
101
89
  self, args: cirq.CircuitDiagramInfoArgs
102
- ) -> Union[str, Iterable[str], cirq.CircuitDiagramInfo]:
90
+ ) -> str | Iterable[str] | cirq.CircuitDiagramInfo:
103
91
  if args.known_qubit_count is None:
104
92
  return NotImplemented
105
93
  permutation = self.permutation()
@@ -150,7 +138,7 @@ class SwapPermutationGate(PermutationGate):
150
138
  def __init__(self, swap_gate: cirq.Gate = ops.SWAP):
151
139
  super().__init__(2, swap_gate)
152
140
 
153
- def permutation(self) -> Dict[int, int]:
141
+ def permutation(self) -> dict[int, int]:
154
142
  return {0: 1, 1: 0}
155
143
 
156
144
  def _decompose_(self, qubits: Sequence[cirq.Qid]) -> Iterator[cirq.OP_TREE]:
@@ -166,7 +154,7 @@ class SwapPermutationGate(PermutationGate):
166
154
  def _value_equality_values_(self) -> Any:
167
155
  return (self.swap_gate,)
168
156
 
169
- def _commutes_(self, other: Any, *, atol: float = 1e-8) -> Union[bool, NotImplementedType]:
157
+ def _commutes_(self, other: Any, *, atol: float = 1e-8) -> bool | NotImplementedType:
170
158
  if (
171
159
  isinstance(other, ops.Gate)
172
160
  and isinstance(other, ops.InterchangeableQubitsGate)
@@ -176,7 +164,7 @@ class SwapPermutationGate(PermutationGate):
176
164
  return NotImplemented
177
165
 
178
166
 
179
- def _canonicalize_permutation(permutation: Dict[int, int]) -> Dict[int, int]:
167
+ def _canonicalize_permutation(permutation: dict[int, int]) -> dict[int, int]:
180
168
  return {i: j for i, j in permutation.items() if i != j}
181
169
 
182
170
 
@@ -186,7 +174,7 @@ class LinearPermutationGate(PermutationGate):
186
174
  sorting network."""
187
175
 
188
176
  def __init__(
189
- self, num_qubits: int, permutation: Dict[int, int], swap_gate: cirq.Gate = ops.SWAP
177
+ self, num_qubits: int, permutation: dict[int, int], swap_gate: cirq.Gate = ops.SWAP
190
178
  ) -> None:
191
179
  """Initializes a linear permutation gate.
192
180
 
@@ -199,7 +187,7 @@ class LinearPermutationGate(PermutationGate):
199
187
  PermutationGate.validate_permutation(permutation, num_qubits)
200
188
  self._permutation = permutation
201
189
 
202
- def permutation(self) -> Dict[int, int]:
190
+ def permutation(self) -> dict[int, int]:
203
191
  return self._permutation
204
192
 
205
193
  def _decompose_(self, qubits: Sequence[cirq.Qid]) -> Iterator[cirq.OP_TREE]:
@@ -238,7 +226,7 @@ class LinearPermutationGate(PermutationGate):
238
226
  return NotImplemented
239
227
 
240
228
 
241
- def update_mapping(mapping: Dict[ops.Qid, LogicalIndex], operations: cirq.OP_TREE) -> None:
229
+ def update_mapping(mapping: dict[ops.Qid, LogicalIndex], operations: cirq.OP_TREE) -> None:
242
230
  """Updates a mapping (in place) from qubits to logical indices according to
243
231
  a set of permutation gates. Any gates other than permutation gates are
244
232
  ignored.
@@ -253,7 +241,7 @@ def update_mapping(mapping: Dict[ops.Qid, LogicalIndex], operations: cirq.OP_TRE
253
241
 
254
242
 
255
243
  def get_logical_operations(
256
- operations: cirq.OP_TREE, initial_mapping: Dict[ops.Qid, ops.Qid]
244
+ operations: cirq.OP_TREE, initial_mapping: dict[ops.Qid, ops.Qid]
257
245
  ) -> Iterable[cirq.Operation]:
258
246
  """Gets the logical operations specified by the physical operations and
259
247
  initial mapping.
@@ -12,7 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import random
18
+ from typing import Iterator
16
19
 
17
20
  import pytest
18
21
 
@@ -21,7 +24,7 @@ import cirq.contrib.acquaintance as cca
21
24
  import cirq.testing as ct
22
25
 
23
26
 
24
- def test_swap_permutation_gate():
27
+ def test_swap_permutation_gate() -> None:
25
28
  no_decomp = lambda op: (isinstance(op, cirq.GateOperation) and op.gate == cirq.SWAP)
26
29
  a, b = cirq.NamedQubit('a'), cirq.NamedQubit('b')
27
30
  gate = cca.SwapPermutationGate()
@@ -40,7 +43,7 @@ def test_swap_permutation_gate():
40
43
  cirq.commutes(gate, cirq.CCZ)
41
44
 
42
45
 
43
- def test_validate_permutation_errors():
46
+ def test_validate_permutation_errors() -> None:
44
47
  validate_permutation = cca.PermutationGate.validate_permutation
45
48
  validate_permutation({})
46
49
 
@@ -57,7 +60,7 @@ def test_validate_permutation_errors():
57
60
  assert cirq.circuit_diagram_info(gate, default=None) is None
58
61
 
59
62
 
60
- def test_diagram():
63
+ def test_diagram() -> None:
61
64
  gate = cca.SwapPermutationGate()
62
65
  a, b = cirq.NamedQubit('a'), cirq.NamedQubit('b')
63
66
  circuit = cirq.Circuit([gate(a, b)])
@@ -70,17 +73,19 @@ b: ───1↦0───
70
73
  assert actual_text_diagram == expected_text_diagram
71
74
 
72
75
 
73
- def test_update_mapping():
76
+ def test_update_mapping() -> None:
74
77
  gate = cca.SwapPermutationGate()
75
78
  a, b, c = (cirq.NamedQubit(s) for s in 'abc')
79
+ mapping: dict[cirq.Qid, int]
76
80
  mapping = {s: i for i, s in enumerate((a, b, c))}
77
81
  ops = [gate(a, b), gate(b, c)]
78
82
  cca.update_mapping(mapping, ops)
79
83
  assert mapping == {a: 1, b: 2, c: 0}
80
84
 
81
85
 
82
- def test_get_logical_operations():
86
+ def test_get_logical_operations() -> None:
83
87
  a, b, c, d = qubits = cirq.LineQubit.range(4)
88
+ mapping: dict[cirq.Qid, cirq.Qid]
84
89
  mapping = dict(zip(qubits, qubits))
85
90
  operations = [
86
91
  cirq.ZZ(a, b),
@@ -104,7 +109,7 @@ def test_get_logical_operations():
104
109
  for n_elements in (random.randint(5, 20) for _ in range(20))
105
110
  ),
106
111
  )
107
- def test_linear_permutation_gate(n_elements, n_permuted):
112
+ def test_linear_permutation_gate(n_elements, n_permuted) -> None:
108
113
  qubits = cirq.LineQubit.range(n_elements)
109
114
  elements = tuple(range(n_elements))
110
115
  elements_to_permute = random.sample(elements, n_permuted)
@@ -114,16 +119,18 @@ def test_linear_permutation_gate(n_elements, n_permuted):
114
119
  gate = cca.LinearPermutationGate(n_elements, permutation)
115
120
  ct.assert_equivalent_repr(gate)
116
121
  assert gate.permutation() == permutation
122
+ mapping: dict[cirq.Qid, int]
117
123
  mapping = dict(zip(qubits, elements))
118
124
  for swap in cirq.flatten_op_tree(cirq.decompose_once_with_qubits(gate, qubits)):
119
125
  assert isinstance(swap, cirq.GateOperation)
126
+ assert isinstance(swap.gate, cca.PermutationGate)
120
127
  swap.gate.update_mapping(mapping, swap.qubits)
121
128
  for i in range(n_elements):
122
129
  p = permutation.get(elements[i], i)
123
130
  assert mapping.get(qubits[p], elements[i]) == i
124
131
 
125
132
 
126
- def random_equal_permutations(n_perms, n_items, prob):
133
+ def random_equal_permutations(n_perms, n_items, prob) -> list[dict[int, int]]:
127
134
  indices_to_permute = [i for i in range(n_items) if random.random() <= prob]
128
135
  permuted_indices = random.sample(indices_to_permute, len(indices_to_permute))
129
136
  base_permutation = dict(zip(indices_to_permute, permuted_indices))
@@ -136,7 +143,9 @@ def random_equal_permutations(n_perms, n_items, prob):
136
143
  return permutations
137
144
 
138
145
 
139
- def random_permutation_equality_groups(n_groups, n_perms_per_group, n_items, prob):
146
+ def random_permutation_equality_groups(
147
+ n_groups, n_perms_per_group, n_items, prob
148
+ ) -> Iterator[list[dict[int, int]]]:
140
149
  fingerprints = set()
141
150
  for _ in range(n_groups):
142
151
  perms = random_equal_permutations(n_perms_per_group, n_items, prob)
@@ -148,7 +157,7 @@ def random_permutation_equality_groups(n_groups, n_perms_per_group, n_items, pro
148
157
 
149
158
 
150
159
  @pytest.mark.parametrize('permutation_sets', [random_permutation_equality_groups(5, 3, 10, 0.5)])
151
- def test_linear_permutation_gate_equality(permutation_sets):
160
+ def test_linear_permutation_gate_equality(permutation_sets) -> None:
152
161
  swap_gates = [cirq.SWAP, cirq.CNOT]
153
162
  equals_tester = ct.EqualsTester()
154
163
  for swap_gate in swap_gates:
@@ -161,7 +170,7 @@ def test_linear_permutation_gate_equality(permutation_sets):
161
170
  )
162
171
 
163
172
 
164
- def test_linear_permutation_gate_pow_not_implemented():
173
+ def test_linear_permutation_gate_pow_not_implemented() -> None:
165
174
  permutation_gate = cca.LinearPermutationGate(3, {0: 1, 1: 2, 2: 0})
166
175
 
167
176
  assert permutation_gate.__pow__(0) is NotImplemented
@@ -181,7 +190,7 @@ def test_linear_permutation_gate_pow_not_implemented():
181
190
  (4, {0: 3, 1: 2, 2: 1, 3: 0}),
182
191
  ],
183
192
  )
184
- def test_linear_permutation_gate_pow_identity(num_qubits, permutation):
193
+ def test_linear_permutation_gate_pow_identity(num_qubits, permutation) -> None:
185
194
  permutation_gate = cca.LinearPermutationGate(num_qubits, permutation)
186
195
 
187
196
  assert permutation_gate**1 == permutation_gate
@@ -197,7 +206,7 @@ def test_linear_permutation_gate_pow_identity(num_qubits, permutation):
197
206
  (4, {0: 3, 1: 2, 2: 1, 3: 0}, {0: 3, 1: 2, 2: 1, 3: 0}),
198
207
  ],
199
208
  )
200
- def test_linear_permutation_gate_pow_inverse(num_qubits, permutation, inverse):
209
+ def test_linear_permutation_gate_pow_inverse(num_qubits, permutation, inverse) -> None:
201
210
  permutation_gate = cca.LinearPermutationGate(num_qubits, permutation)
202
211
  inverse_gate = cca.LinearPermutationGate(num_qubits, inverse)
203
212
 
@@ -205,7 +214,7 @@ def test_linear_permutation_gate_pow_inverse(num_qubits, permutation, inverse):
205
214
  assert cirq.inverse(permutation_gate) == inverse_gate
206
215
 
207
216
 
208
- def test_display_mapping():
217
+ def test_display_mapping() -> None:
209
218
  indices = [4, 2, 0, 1, 3]
210
219
  qubits = cirq.LineQubit.range(len(indices))
211
220
  circuit = cca.complete_acquaintance_strategy(qubits, 2)
@@ -236,7 +245,7 @@ def test_display_mapping():
236
245
  for _ in range(4)
237
246
  ],
238
247
  )
239
- def test_return_to_initial_mapping(circuit):
248
+ def test_return_to_initial_mapping(circuit) -> None:
240
249
  qubits = sorted(circuit.all_qubits())
241
250
  cca.return_to_initial_mapping(circuit)
242
251
  initial_mapping = {q: i for i, q in enumerate(qubits)}
@@ -245,7 +254,7 @@ def test_return_to_initial_mapping(circuit):
245
254
  assert mapping == initial_mapping
246
255
 
247
256
 
248
- def test_uses_consistent_swap_gate():
257
+ def test_uses_consistent_swap_gate() -> None:
249
258
  a, b = cirq.LineQubit.range(2)
250
259
  circuit = cirq.Circuit([cca.SwapPermutationGate()(a, b), cca.SwapPermutationGate()(a, b)])
251
260
  assert cca.uses_consistent_swap_gate(circuit, cirq.SWAP)
@@ -262,7 +271,7 @@ def test_uses_consistent_swap_gate():
262
271
  assert not cca.uses_consistent_swap_gate(circuit, cirq.CZ)
263
272
 
264
273
 
265
- def test_swap_gate_eq():
274
+ def test_swap_gate_eq() -> None:
266
275
  assert cca.SwapPermutationGate() == cca.SwapPermutationGate(cirq.SWAP)
267
276
  assert cca.SwapPermutationGate() != cca.SwapPermutationGate(cirq.CZ)
268
277
  assert cca.SwapPermutationGate(cirq.CZ) == cca.SwapPermutationGate(cirq.CZ)
@@ -276,5 +285,5 @@ def test_swap_gate_eq():
276
285
  cca.SwapPermutationGate(cirq.CZ),
277
286
  ],
278
287
  )
279
- def test_swap_gate_repr(gate):
288
+ def test_swap_gate_repr(gate) -> None:
280
289
  cirq.testing.assert_equivalent_repr(gate)
@@ -15,7 +15,7 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import itertools
18
- from typing import Any, Dict, Iterator, Sequence, Tuple, TYPE_CHECKING
18
+ from typing import Any, Iterator, Sequence, TYPE_CHECKING
19
19
 
20
20
  from cirq import ops, value
21
21
  from cirq.contrib.acquaintance.permutation import PermutationGate, SwapPermutationGate
@@ -36,7 +36,7 @@ class CircularShiftGate(PermutationGate):
36
36
  shift: The number of positions to circularly left shift the qubits.
37
37
  swap_gate: The gate to use when decomposing.
38
38
  """
39
- super(CircularShiftGate, self).__init__(num_qubits, swap_gate)
39
+ super().__init__(num_qubits, swap_gate)
40
40
  self.shift = shift
41
41
 
42
42
  def __repr__(self) -> str:
@@ -60,7 +60,7 @@ class CircularShiftGate(PermutationGate):
60
60
  for k in range(i, j, 2):
61
61
  yield swap_gate(*qubits[k : k + 2])
62
62
 
63
- def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> Tuple[str, ...]:
63
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> tuple[str, ...]:
64
64
  if args.known_qubit_count is None:
65
65
  return NotImplemented # pragma: no cover
66
66
  direction_symbols = ('╲', '╱') if args.use_unicode_characters else ('\\', '/')
@@ -72,7 +72,7 @@ class CircularShiftGate(PermutationGate):
72
72
  )
73
73
  return wire_symbols
74
74
 
75
- def permutation(self) -> Dict[int, int]:
75
+ def permutation(self) -> dict[int, int]:
76
76
  shift = self.shift % self.num_qubits()
77
77
  permuted_indices = itertools.chain(range(shift, self.num_qubits()), range(shift))
78
78
  return {s: i for i, s in enumerate(permuted_indices)}
@@ -16,7 +16,7 @@ from __future__ import annotations
16
16
 
17
17
  import functools
18
18
  import itertools
19
- from typing import Dict, Iterable, Iterator, Optional, Sequence, Tuple, TYPE_CHECKING
19
+ from typing import Iterable, Iterator, Sequence, TYPE_CHECKING
20
20
 
21
21
  from cirq import ops
22
22
  from cirq.contrib.acquaintance.gates import acquaint
@@ -93,7 +93,7 @@ class ShiftSwapNetworkGate(PermutationGate):
93
93
  parts[k] = parts_qubits[: len(right_part)]
94
94
  parts[k + 1] = parts_qubits[len(right_part) :]
95
95
 
96
- def qubit_count(self, side: Optional[str] = None) -> int:
96
+ def qubit_count(self, side: str | None = None) -> int:
97
97
  if side is None:
98
98
  return sum(self.qubit_count(side) for side in self.part_lens)
99
99
  return sum(self.part_lens[side])
@@ -101,7 +101,7 @@ class ShiftSwapNetworkGate(PermutationGate):
101
101
  def num_qubits(self) -> int:
102
102
  return self.qubit_count()
103
103
 
104
- def permutation(self) -> Dict[int, int]:
104
+ def permutation(self) -> dict[int, int]:
105
105
  return dict(
106
106
  zip(
107
107
  range(self.num_qubits()),
@@ -112,7 +112,7 @@ class ShiftSwapNetworkGate(PermutationGate):
112
112
  )
113
113
  )
114
114
 
115
- def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> Tuple[str, ...]:
115
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> tuple[str, ...]:
116
116
  qubit_count = self.qubit_count()
117
117
  assert args.known_qubit_count in (None, qubit_count)
118
118
 
@@ -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
  import random
17
19
 
@@ -21,7 +23,7 @@ import cirq
21
23
  import cirq.contrib.acquaintance as cca
22
24
 
23
25
 
24
- def random_part_lens(max_n_parts, max_part_size):
26
+ def random_part_lens(max_n_parts, max_part_size) -> tuple[int, ...]:
25
27
  return tuple(random.randint(1, max_part_size) for _ in range(random.randint(1, max_n_parts)))
26
28
 
27
29
 
@@ -29,7 +31,7 @@ def random_part_lens(max_n_parts, max_part_size):
29
31
  'left_part_lens,right_part_lens',
30
32
  [tuple(random_part_lens(7, 2) for _ in ('left', 'right')) for _ in range(5)],
31
33
  )
32
- def test_shift_swap_network_gate_acquaintance_opps(left_part_lens, right_part_lens):
34
+ def test_shift_swap_network_gate_acquaintance_opps(left_part_lens, right_part_lens) -> None:
33
35
 
34
36
  gate = cca.ShiftSwapNetworkGate(left_part_lens, right_part_lens)
35
37
  n_qubits = gate.qubit_count()
@@ -43,6 +45,7 @@ def test_shift_swap_network_gate_acquaintance_opps(left_part_lens, right_part_le
43
45
  # expected opps
44
46
  i = 0
45
47
  sides = ('left', 'right')
48
+ parts: dict[str, list[set[int]]]
46
49
  parts = {side: [] for side in sides}
47
50
  for side, part_lens in zip(sides, (left_part_lens, right_part_lens)):
48
51
  for part_len in part_lens:
@@ -203,7 +206,7 @@ circuit_diagrams = {
203
206
 
204
207
 
205
208
  @pytest.mark.parametrize('left_part_lens,right_part_lens', set(key[1:] for key in circuit_diagrams))
206
- def test_shift_swap_network_gate_diagrams(left_part_lens, right_part_lens):
209
+ def test_shift_swap_network_gate_diagrams(left_part_lens, right_part_lens) -> None:
207
210
 
208
211
  gate = cca.ShiftSwapNetworkGate(left_part_lens, right_part_lens)
209
212
  n_qubits = gate.qubit_count()
@@ -218,7 +221,7 @@ def test_shift_swap_network_gate_diagrams(left_part_lens, right_part_lens):
218
221
  cirq.testing.assert_has_diagram(circuit, diagram)
219
222
 
220
223
 
221
- def test_shift_swap_network_gate_bad_part_lens():
224
+ def test_shift_swap_network_gate_bad_part_lens() -> None:
222
225
  with pytest.raises(ValueError):
223
226
  cca.ShiftSwapNetworkGate((0, 1, 1), (2, 2))
224
227
  with pytest.raises(ValueError):
@@ -233,7 +236,7 @@ def test_shift_swap_network_gate_bad_part_lens():
233
236
  'left_part_lens,right_part_lens',
234
237
  [tuple(random_part_lens(2, 2) for _ in ('left', 'right')) for _ in range(5)],
235
238
  )
236
- def test_shift_swap_network_gate_repr(left_part_lens, right_part_lens):
239
+ def test_shift_swap_network_gate_repr(left_part_lens, right_part_lens) -> None:
237
240
  gate = cca.ShiftSwapNetworkGate(left_part_lens, right_part_lens)
238
241
  cirq.testing.assert_equivalent_repr(gate)
239
242
 
@@ -245,7 +248,7 @@ def test_shift_swap_network_gate_repr(left_part_lens, right_part_lens):
245
248
  'left_part_lens,right_part_lens',
246
249
  [tuple(random_part_lens(2, 2) for _ in ('left', 'right')) for _ in range(5)],
247
250
  )
248
- def test_shift_swap_network_gate_permutation(left_part_lens, right_part_lens):
251
+ def test_shift_swap_network_gate_permutation(left_part_lens, right_part_lens) -> None:
249
252
  gate = cca.ShiftSwapNetworkGate(left_part_lens, right_part_lens)
250
253
  n_qubits = gate.qubit_count()
251
254
  cca.testing.assert_permutation_decomposition_equivalence(gate, n_qubits)
@@ -12,11 +12,13 @@
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 cirq
16
18
  import cirq.contrib.acquaintance as cca
17
19
 
18
20
 
19
- def test_circular_shift_gate_init():
21
+ def test_circular_shift_gate_init() -> None:
20
22
  g = cca.CircularShiftGate(4, 2)
21
23
  assert g.num_qubits() == 4
22
24
  assert g.shift == 2
@@ -25,7 +27,7 @@ def test_circular_shift_gate_init():
25
27
  assert g.swap_gate == cirq.CZ
26
28
 
27
29
 
28
- def test_circular_shift_gate_eq():
30
+ def test_circular_shift_gate_eq() -> None:
29
31
  equals_tester = cirq.testing.EqualsTester()
30
32
  equals_tester.add_equality_group(cca.CircularShiftGate(4, 1), cca.CircularShiftGate(4, 1))
31
33
  equals_tester.add_equality_group(cca.CircularShiftGate(4, 1, swap_gate=cirq.CZ))
@@ -34,19 +36,19 @@ def test_circular_shift_gate_eq():
34
36
  equals_tester.add_equality_group(cca.CircularShiftGate(3, 2, swap_gate=cirq.CZ))
35
37
 
36
38
 
37
- def test_circular_shift_gate_permutation():
39
+ def test_circular_shift_gate_permutation() -> None:
38
40
  assert cca.CircularShiftGate(3, 4).permutation() == {0: 2, 1: 0, 2: 1}
39
41
  assert cca.CircularShiftGate(4, 0).permutation() == {0: 0, 1: 1, 2: 2, 3: 3}
40
42
 
41
43
  assert cca.CircularShiftGate(5, 2).permutation() == {0: 3, 1: 4, 2: 0, 3: 1, 4: 2}
42
44
 
43
45
 
44
- def test_circular_shift_gate_repr():
46
+ def test_circular_shift_gate_repr() -> None:
45
47
  g = cca.CircularShiftGate(3, 2)
46
48
  cirq.testing.assert_equivalent_repr(g)
47
49
 
48
50
 
49
- def test_circular_shift_gate_decomposition():
51
+ def test_circular_shift_gate_decomposition() -> None:
50
52
  qubits = [cirq.NamedQubit(q) for q in 'abcdef']
51
53
 
52
54
  circular_shift = cca.CircularShiftGate(2, 1, cirq.CZ)(*qubits[:2])
@@ -92,7 +94,7 @@ f: ───────────────×───────
92
94
  assert actual_text_diagram == expected_text_diagram
93
95
 
94
96
 
95
- def test_circular_shift_gate_wire_symbols():
97
+ def test_circular_shift_gate_wire_symbols() -> None:
96
98
  qubits = [cirq.NamedQubit(q) for q in 'xyz']
97
99
  circuit = cirq.Circuit(cca.CircularShiftGate(3, 2)(*qubits))
98
100
  actual_text_diagram = circuit.to_text_diagram().strip()
@@ -15,7 +15,7 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import itertools
18
- from typing import Iterable, Sequence, Tuple, TYPE_CHECKING, TypeVar
18
+ from typing import Iterable, Sequence, TYPE_CHECKING, TypeVar
19
19
 
20
20
  from cirq import circuits, ops
21
21
  from cirq.contrib.acquaintance.gates import acquaint
@@ -27,7 +27,7 @@ if TYPE_CHECKING:
27
27
  TItem = TypeVar('TItem')
28
28
 
29
29
 
30
- def skip_and_wrap_around(items: Sequence[TItem]) -> Tuple[TItem, ...]:
30
+ def skip_and_wrap_around(items: Sequence[TItem]) -> tuple[TItem, ...]:
31
31
  n_items = len(items)
32
32
  positions = {
33
33
  p: i
@@ -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
@@ -21,7 +23,7 @@ import cirq.contrib.acquaintance as cca
21
23
  import cirq.contrib.acquaintance.strategies.cubic as ccasc
22
24
 
23
25
 
24
- def test_skip_and_wrap_around():
26
+ def test_skip_and_wrap_around() -> None:
25
27
  assert ccasc.skip_and_wrap_around(range(3)) == (0, 2, 1)
26
28
  assert ccasc.skip_and_wrap_around(range(4)) == (0, 3, 1, 2)
27
29
  assert ccasc.skip_and_wrap_around('abcde') == tuple('aebdc')
@@ -29,7 +31,7 @@ def test_skip_and_wrap_around():
29
31
 
30
32
 
31
33
  @pytest.mark.parametrize('n_qubits', range(3, 9))
32
- def test_cubic_acquaintance_strategy(n_qubits):
34
+ def test_cubic_acquaintance_strategy(n_qubits) -> None:
33
35
  qubits = tuple(cirq.LineQubit.range(n_qubits))
34
36
  strategy = cca.cubic_acquaintance_strategy(qubits)
35
37
  initial_mapping = {q: i for i, q in enumerate(qubits)}
@@ -14,7 +14,7 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import cast, Iterable, List, Sequence, Tuple, TYPE_CHECKING
17
+ from typing import cast, Iterable, Sequence, TYPE_CHECKING
18
18
 
19
19
  from cirq import circuits
20
20
  from cirq.contrib.acquaintance.gates import acquaint, SwapNetworkGate
@@ -24,7 +24,7 @@ if TYPE_CHECKING:
24
24
  import cirq
25
25
 
26
26
 
27
- def qubit_pairs_to_qubit_order(qubit_pairs: Sequence[Sequence[cirq.Qid]]) -> List[cirq.Qid]:
27
+ def qubit_pairs_to_qubit_order(qubit_pairs: Sequence[Sequence[cirq.Qid]]) -> list[cirq.Qid]:
28
28
  """Takes a sequence of qubit pairs and returns a sequence in which every
29
29
  pair is at distance two.
30
30
 
@@ -35,7 +35,7 @@ def qubit_pairs_to_qubit_order(qubit_pairs: Sequence[Sequence[cirq.Qid]]) -> Lis
35
35
  if set(len(qubit_pair) for qubit_pair in qubit_pairs) != set((2,)):
36
36
  raise ValueError('set(len(qubit_pair) for qubit_pair in qubit_pairs) != set((2,))')
37
37
  n_pairs = len(qubit_pairs)
38
- qubits: List[cirq.Qid] = []
38
+ qubits: list[cirq.Qid] = []
39
39
  for i in range(0, 2 * (n_pairs // 2), 2):
40
40
  qubits += [
41
41
  qubit_pairs[i][0],
@@ -49,15 +49,15 @@ def qubit_pairs_to_qubit_order(qubit_pairs: Sequence[Sequence[cirq.Qid]]) -> Lis
49
49
 
50
50
 
51
51
  def quartic_paired_acquaintance_strategy(
52
- qubit_pairs: Iterable[Tuple[cirq.Qid, cirq.Qid]],
53
- ) -> Tuple[cirq.Circuit, Sequence[cirq.Qid]]:
52
+ qubit_pairs: Iterable[tuple[cirq.Qid, cirq.Qid]],
53
+ ) -> tuple[cirq.Circuit, Sequence[cirq.Qid]]:
54
54
  """Acquaintance strategy for pairs of pairs.
55
55
 
56
56
  Implements UpCCGSD ansatz from arXiv:1810.02327.
57
57
  """
58
58
 
59
59
  qubit_pairs = tuple(
60
- cast(Tuple['cirq.Qid', 'cirq.Qid'], tuple(qubit_pair)) for qubit_pair in qubit_pairs
60
+ cast(tuple['cirq.Qid', 'cirq.Qid'], tuple(qubit_pair)) for qubit_pair in qubit_pairs
61
61
  )
62
62
  qubits = qubit_pairs_to_qubit_order(qubit_pairs)
63
63
  n_qubits = len(qubits)