cirq-core 1.5.0.dev20250409225226__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.dev20250409225226.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.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import numpy as np
16
18
  import pandas as pd
17
19
  import pytest
@@ -72,10 +74,7 @@ class _TestSimulator(cirq.Simulator):
72
74
  self.replacement = replacement
73
75
 
74
76
  def _core_iterator(
75
- self,
76
- circuit: 'cirq.AbstractCircuit',
77
- sim_state,
78
- all_measurements_are_terminal: bool = False,
77
+ self, circuit: cirq.AbstractCircuit, sim_state, all_measurements_are_terminal: bool = False
79
78
  ):
80
79
  new_circuit = cirq.Circuit(
81
80
  [
@@ -37,4 +37,4 @@ from cirq.interop.quirk.cells.input_rotation_cells import (
37
37
  )
38
38
 
39
39
  import cirq.interop.quirk.cells.swap_cell
40
- import cirq.interop.quirk.cells.control_cells
40
+ import cirq.interop.quirk.cells.control_cells # noqa: F401
@@ -11,10 +11,12 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
- from typing import Iterator
14
+
15
+ from __future__ import annotations
16
+
17
+ from typing import Iterator, TYPE_CHECKING
15
18
 
16
19
  from cirq.interop.quirk.cells.arithmetic_cells import generate_all_arithmetic_cell_makers
17
- from cirq.interop.quirk.cells.cell import CellMaker
18
20
  from cirq.interop.quirk.cells.control_cells import generate_all_control_cell_makers
19
21
  from cirq.interop.quirk.cells.frequency_space_cells import generate_all_frequency_space_cell_makers
20
22
  from cirq.interop.quirk.cells.ignored_cells import generate_all_ignored_cell_makers
@@ -31,6 +33,9 @@ from cirq.interop.quirk.cells.single_qubit_rotation_cells import (
31
33
  from cirq.interop.quirk.cells.swap_cell import generate_all_swap_cell_makers
32
34
  from cirq.interop.quirk.cells.unsupported_cells import generate_all_unsupported_cell_makers
33
35
 
36
+ if TYPE_CHECKING:
37
+ from cirq.interop.quirk.cells.cell import CellMaker
38
+
34
39
 
35
40
  def generate_all_quirk_cell_makers() -> Iterator[CellMaker]:
36
41
  """Yields a `CellMaker` for every known Quirk gate, display, etc."""
@@ -11,21 +11,11 @@
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 inspect
15
- from typing import (
16
- Any,
17
- Callable,
18
- cast,
19
- Dict,
20
- Iterable,
21
- Iterator,
22
- List,
23
- Optional,
24
- Sequence,
25
- Tuple,
26
- TYPE_CHECKING,
27
- Union,
28
- )
18
+ from typing import Any, Callable, cast, Iterable, Iterator, Sequence, TYPE_CHECKING
29
19
 
30
20
  from cirq import ops, value
31
21
  from cirq.interop.quirk.cells.cell import Cell, CELL_SIZES, CellMaker
@@ -49,7 +39,7 @@ class QuirkArithmeticGate(ops.ArithmeticGate):
49
39
  """
50
40
 
51
41
  def __init__(
52
- self, identifier: str, target: Sequence[int], inputs: Sequence[Union[Sequence[int], int]]
42
+ self, identifier: str, target: Sequence[int], inputs: Sequence[Sequence[int] | int]
53
43
  ):
54
44
  """Inits QuirkArithmeticGate.
55
45
 
@@ -65,8 +55,8 @@ class QuirkArithmeticGate(ops.ArithmeticGate):
65
55
  too small modulus.
66
56
  """
67
57
  self.identifier = identifier
68
- self.target: Tuple[int, ...] = tuple(target)
69
- self.inputs: Tuple[Union[Sequence[int], int], ...] = tuple(
58
+ self.target: tuple[int, ...] = tuple(target)
59
+ self.inputs: tuple[Sequence[int] | int, ...] = tuple(
70
60
  e if isinstance(e, int) else tuple(e) for e in inputs
71
61
  )
72
62
 
@@ -80,16 +70,16 @@ class QuirkArithmeticGate(ops.ArithmeticGate):
80
70
  raise ValueError(f'Target too small for modulus.\nTarget: {target}\nModulus: {r}')
81
71
 
82
72
  @property
83
- def operation(self) -> '_QuirkArithmeticCallable':
73
+ def operation(self) -> _QuirkArithmeticCallable:
84
74
  return ARITHMETIC_OP_TABLE[self.identifier]
85
75
 
86
76
  def _value_equality_values_(self) -> Any:
87
77
  return self.identifier, self.target, self.inputs
88
78
 
89
- def registers(self) -> Sequence[Union[int, Sequence[int]]]:
79
+ def registers(self) -> Sequence[int | Sequence[int]]:
90
80
  return [self.target, *self.inputs]
91
81
 
92
- def with_registers(self, *new_registers: Union[int, Sequence[int]]) -> 'QuirkArithmeticGate':
82
+ def with_registers(self, *new_registers: int | Sequence[int]) -> QuirkArithmeticGate:
93
83
  if len(new_registers) != len(self.inputs) + 1:
94
84
  raise ValueError(
95
85
  'Wrong number of registers.\n'
@@ -106,13 +96,13 @@ class QuirkArithmeticGate(ops.ArithmeticGate):
106
96
 
107
97
  return QuirkArithmeticGate(self.identifier, new_registers[0], new_registers[1:])
108
98
 
109
- def apply(self, *registers: int) -> Union[int, Iterable[int]]:
99
+ def apply(self, *registers: int) -> int | Iterable[int]:
110
100
  return self.operation(*registers)
111
101
 
112
- def _circuit_diagram_info_(self, args: 'cirq.CircuitDiagramInfoArgs') -> List[str]:
102
+ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs) -> list[str]:
113
103
  lettered_args = list(zip(self.operation.letters, self.inputs))
114
104
 
115
- result: List[str] = []
105
+ result: list[str] = []
116
106
 
117
107
  # Target register labels.
118
108
  consts = ''.join(
@@ -138,12 +128,12 @@ class QuirkArithmeticGate(ops.ArithmeticGate):
138
128
  )
139
129
 
140
130
 
141
- _IntsToIntCallable = Union[
142
- Callable[[int], int],
143
- Callable[[int, int], int],
144
- Callable[[int, int, int], int],
145
- Callable[[int, int, int, int], int],
146
- ]
131
+ _IntsToIntCallable = (
132
+ Callable[[int], int]
133
+ | Callable[[int, int], int]
134
+ | Callable[[int, int, int], int]
135
+ | Callable[[int, int, int, int], int]
136
+ )
147
137
 
148
138
 
149
139
  class _QuirkArithmeticCallable:
@@ -158,7 +148,7 @@ class _QuirkArithmeticCallable:
158
148
  self.func = func
159
149
 
160
150
  # The lambda parameter names indicate the input letter to match.
161
- letters: List[str] = list(inspect.signature(self.func).parameters)
151
+ letters: list[str] = list(inspect.signature(self.func).parameters)
162
152
  # The target is always first, and should be ignored.
163
153
  assert letters and letters[0] == 'x'
164
154
  self.letters = tuple(letters[1:])
@@ -183,8 +173,8 @@ class ArithmeticCell(Cell):
183
173
  def __init__(
184
174
  self,
185
175
  identifier: str,
186
- target: Sequence['cirq.Qid'],
187
- inputs: Sequence[Union[None, Sequence['cirq.Qid'], int]],
176
+ target: Sequence[cirq.Qid],
177
+ inputs: Sequence[None | Sequence[cirq.Qid] | int],
188
178
  ):
189
179
  self.identifier = identifier
190
180
  self.target = tuple(target)
@@ -204,7 +194,7 @@ class ArithmeticCell(Cell):
204
194
  f'\n {self.inputs!r})'
205
195
  )
206
196
 
207
- def with_line_qubits_mapped_to(self, qubits: List['cirq.Qid']) -> 'Cell':
197
+ def with_line_qubits_mapped_to(self, qubits: list[cirq.Qid]) -> Cell:
208
198
  return ArithmeticCell(
209
199
  identifier=self.identifier,
210
200
  target=Cell._replace_qubits(self.target, qubits),
@@ -218,23 +208,21 @@ class ArithmeticCell(Cell):
218
208
  def operation(self):
219
209
  return ARITHMETIC_OP_TABLE[self.identifier]
220
210
 
221
- def with_input(
222
- self, letter: str, register: Union[Sequence['cirq.Qid'], int]
223
- ) -> 'ArithmeticCell':
211
+ def with_input(self, letter: str, register: Sequence[cirq.Qid] | int) -> ArithmeticCell:
224
212
  new_inputs = [
225
213
  reg if letter != reg_letter else register
226
214
  for reg, reg_letter in zip(self.inputs, self.operation.letters)
227
215
  ]
228
216
  return ArithmeticCell(self.identifier, self.target, new_inputs)
229
217
 
230
- def operations(self) -> 'cirq.OP_TREE':
218
+ def operations(self) -> cirq.OP_TREE:
231
219
  missing_inputs = [
232
220
  letter for reg, letter in zip(self.inputs, self.operation.letters) if reg is None
233
221
  ]
234
222
  if missing_inputs:
235
223
  raise ValueError(f'Missing input: {sorted(missing_inputs)}')
236
224
 
237
- inputs = cast(Sequence[Union[Sequence['cirq.Qid'], int]], self.inputs)
225
+ inputs = cast(Sequence[Sequence['cirq.Qid'] | int], self.inputs)
238
226
  qubits = self.target + tuple(q for i in self.inputs if isinstance(i, Sequence) for q in i)
239
227
  return QuirkArithmeticGate(
240
228
  self.identifier,
@@ -303,7 +291,7 @@ def _generate_helper() -> Iterator[CellMaker]:
303
291
  )
304
292
 
305
293
 
306
- def _extended_gcd(a: int, b: int) -> Tuple[int, int, int]:
294
+ def _extended_gcd(a: int, b: int) -> tuple[int, int, int]:
307
295
  if a == 0:
308
296
  return b, 0, 1
309
297
  gcd, y, x = _extended_gcd(b % a, a)
@@ -359,9 +347,9 @@ def _arithmetic_gate(identifier: str, size: int, func: _IntsToIntCallable) -> Ce
359
347
  )
360
348
 
361
349
 
362
- ARITHMETIC_OP_TABLE: Dict[str, _QuirkArithmeticCallable] = {}
350
+ ARITHMETIC_OP_TABLE: dict[str, _QuirkArithmeticCallable] = {}
363
351
  # Caching is necessary in order to avoid overwriting entries in the table.
364
- _cached_cells: Optional[Tuple[CellMaker, ...]] = None
352
+ _cached_cells: tuple[CellMaker, ...] | None = None
365
353
 
366
354
 
367
355
  def generate_all_arithmetic_cell_makers() -> Iterable[CellMaker]:
@@ -11,6 +11,9 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
14
17
  from typing import cast
15
18
 
16
19
  import numpy as np
@@ -22,7 +25,7 @@ from cirq.interop.quirk.cells import arithmetic_cells
22
25
  from cirq.interop.quirk.cells.testing import assert_url_to_circuit_returns
23
26
 
24
27
 
25
- def test_arithmetic_comparison_gates():
28
+ def test_arithmetic_comparison_gates() -> None:
26
29
  with pytest.raises(ValueError, match='Missing input'):
27
30
  _ = quirk_url_to_circuit('https://algassert.com/quirk#circuit={"cols":[["^A<B"]]}')
28
31
  assert_url_to_circuit_returns(
@@ -73,7 +76,7 @@ def test_arithmetic_comparison_gates():
73
76
  )
74
77
 
75
78
 
76
- def test_arithmetic_unlisted_misc_gates():
79
+ def test_arithmetic_unlisted_misc_gates() -> None:
77
80
  assert_url_to_circuit_returns(
78
81
  '{"cols":[["^=A3",1,1,"inputA2"]]}',
79
82
  maps={
@@ -141,7 +144,7 @@ def test_arithmetic_unlisted_misc_gates():
141
144
  )
142
145
 
143
146
 
144
- def test_arithmetic_addition_gates():
147
+ def test_arithmetic_addition_gates() -> None:
145
148
  assert_url_to_circuit_returns(
146
149
  '{"cols":[["inc3"]]}',
147
150
  diagram="""
@@ -164,7 +167,7 @@ def test_arithmetic_addition_gates():
164
167
  )
165
168
 
166
169
 
167
- def test_arithmetic_multiply_accumulate_gates():
170
+ def test_arithmetic_multiply_accumulate_gates() -> None:
168
171
  assert_url_to_circuit_returns(
169
172
  '{"cols":[["+=AA4",1,1,1,"inputA2"]]}',
170
173
  maps={0b_0000_00: 0b_0000_00, 0b_0100_10: 0b_1000_10, 0b_1000_11: 0b_0001_11},
@@ -186,7 +189,7 @@ def test_arithmetic_multiply_accumulate_gates():
186
189
  )
187
190
 
188
191
 
189
- def test_modular_arithmetic_modulus_size():
192
+ def test_modular_arithmetic_modulus_size() -> None:
190
193
  with pytest.raises(ValueError, match='too small for modulus'):
191
194
  _ = quirk_url_to_circuit(
192
195
  'https://algassert.com/quirk#circuit={"cols":['
@@ -208,7 +211,7 @@ def test_modular_arithmetic_modulus_size():
208
211
  assert_url_to_circuit_returns('{"cols":[["incmodR2",1,"inputR2"]]}')
209
212
 
210
213
 
211
- def test_arithmetic_modular_addition_gates():
214
+ def test_arithmetic_modular_addition_gates() -> None:
212
215
  assert_url_to_circuit_returns(
213
216
  '{"cols":[[{"id":"setR","arg":16}],["incmodR4"]]}',
214
217
  diagram="""
@@ -242,7 +245,7 @@ def test_arithmetic_modular_addition_gates():
242
245
  )
243
246
 
244
247
 
245
- def test_arithmetic_modular_multiply_accumulate_gates():
248
+ def test_arithmetic_modular_multiply_accumulate_gates() -> None:
246
249
  assert_url_to_circuit_returns(
247
250
  '{"cols":[[{"id":"setR","arg":5},{"id":"setA","arg":3},'
248
251
  '{"id":"setB","arg":4}],["+ABmodR4"]]}',
@@ -256,7 +259,7 @@ def test_arithmetic_modular_multiply_accumulate_gates():
256
259
  )
257
260
 
258
261
 
259
- def test_arithmetic_multiply_gates():
262
+ def test_arithmetic_multiply_gates() -> None:
260
263
  assert_url_to_circuit_returns(
261
264
  '{"cols":[[{"id":"setA","arg":3}],["*A4"]]}', maps={0: 0, 1: 3, 3: 9, 9: 11, 11: 1}
262
265
  )
@@ -273,7 +276,7 @@ def test_arithmetic_multiply_gates():
273
276
  )
274
277
 
275
278
 
276
- def test_arithmetic_modular_multiply_gates():
279
+ def test_arithmetic_modular_multiply_gates() -> None:
277
280
  assert_url_to_circuit_returns(
278
281
  '{"cols":[[{"id":"setA","arg":3},{"id":"setR","arg":7}],["*AmodR4"]]}',
279
282
  maps={0: 0, 1: 3, 3: 2, 2: 6, 6: 4, 4: 5, 5: 1, 7: 7, 15: 15},
@@ -294,7 +297,7 @@ def test_arithmetic_modular_multiply_gates():
294
297
  )
295
298
 
296
299
 
297
- def test_arithmetic_modular_exponentiation_gates():
300
+ def test_arithmetic_modular_exponentiation_gates() -> None:
298
301
  assert_url_to_circuit_returns(
299
302
  '{"cols":[[{"id":"setA","arg":5},{"id":"setB","arg":3},'
300
303
  '{"id":"setR","arg":7}],["*BToAmodR4"]]}',
@@ -318,7 +321,7 @@ def test_arithmetic_modular_exponentiation_gates():
318
321
  )
319
322
 
320
323
 
321
- def test_repr():
324
+ def test_repr() -> None:
322
325
  circuit = quirk_url_to_circuit(
323
326
  'https://algassert.com/quirk#circuit={"cols":'
324
327
  '['
@@ -336,7 +339,7 @@ def test_repr():
336
339
  )
337
340
 
338
341
 
339
- def test_with_registers():
342
+ def test_with_registers() -> None:
340
343
  circuit = quirk_url_to_circuit(
341
344
  'https://algassert.com/quirk#circuit={"cols":'
342
345
  '['
@@ -363,7 +366,7 @@ def test_with_registers():
363
366
  )
364
367
 
365
368
 
366
- def test_helpers():
369
+ def test_helpers() -> None:
367
370
  f = arithmetic_cells._popcnt
368
371
  assert f(0) == 0
369
372
  assert f(1) == 1
@@ -414,7 +417,7 @@ def test_helpers():
414
417
  assert h(7, 16) == 7
415
418
 
416
419
 
417
- def test_with_line_qubits_mapped_to():
420
+ def test_with_line_qubits_mapped_to() -> None:
418
421
  a, b, c, d, e = cirq.LineQubit.range(5)
419
422
  a2, b2, c2, d2, e2 = cirq.NamedQubit.range(5, prefix='p')
420
423
 
@@ -11,20 +11,11 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
14
17
  import abc
15
- from typing import (
16
- Any,
17
- Callable,
18
- Dict,
19
- Iterable,
20
- List,
21
- NamedTuple,
22
- Optional,
23
- Sequence,
24
- Tuple,
25
- TYPE_CHECKING,
26
- Union,
27
- )
18
+ from typing import Any, Callable, Iterable, NamedTuple, Sequence, TYPE_CHECKING, Union
28
19
 
29
20
  from cirq import devices, ops, value
30
21
 
@@ -41,7 +32,7 @@ class Cell(metaclass=abc.ABCMeta):
41
32
  """
42
33
 
43
34
  @classmethod
44
- def _replace_qubit(cls, old_qubit: 'cirq.Qid', qubits: List['cirq.Qid']) -> 'cirq.Qid':
35
+ def _replace_qubit(cls, old_qubit: cirq.Qid, qubits: list[cirq.Qid]) -> cirq.Qid:
45
36
  if not isinstance(old_qubit, devices.LineQubit):
46
37
  raise ValueError(f'Can only map from line qubits, but got {old_qubit!r}.')
47
38
  if not 0 <= old_qubit.x < len(qubits):
@@ -50,12 +41,12 @@ class Cell(metaclass=abc.ABCMeta):
50
41
 
51
42
  @classmethod
52
43
  def _replace_qubits(
53
- cls, old_qubits: Iterable['cirq.Qid'], qubits: List['cirq.Qid']
54
- ) -> Tuple['cirq.Qid', ...]:
44
+ cls, old_qubits: Iterable[cirq.Qid], qubits: list[cirq.Qid]
45
+ ) -> tuple[cirq.Qid, ...]:
55
46
  return tuple(Cell._replace_qubit(e, qubits) for e in old_qubits)
56
47
 
57
48
  @abc.abstractmethod
58
- def with_line_qubits_mapped_to(self, qubits: List['cirq.Qid']) -> 'Cell':
49
+ def with_line_qubits_mapped_to(self, qubits: list[cirq.Qid]) -> Cell:
59
50
  """Returns the same cell, but targeting different qubits.
60
51
 
61
52
  It is assumed that the cell is currently targeting `LineQubit`
@@ -84,7 +75,7 @@ class Cell(metaclass=abc.ABCMeta):
84
75
  extremely adversarial conditions.
85
76
  """
86
77
 
87
- def with_input(self, letter: str, register: Union[Sequence['cirq.Qid'], int]) -> 'Cell':
78
+ def with_input(self, letter: str, register: Sequence[cirq.Qid] | int) -> Cell:
88
79
  """The same cell, but linked to an explicit input register or constant.
89
80
 
90
81
  If the cell doesn't need the input, it is returned unchanged.
@@ -99,7 +90,7 @@ class Cell(metaclass=abc.ABCMeta):
99
90
  """
100
91
  return self
101
92
 
102
- def controlled_by(self, qubit: 'cirq.Qid') -> 'Cell':
93
+ def controlled_by(self, qubit: cirq.Qid) -> Cell:
103
94
  """The same cell, but with an explicit control on its main operations.
104
95
 
105
96
  Cells with effects that do not need to be controlled are permitted to
@@ -113,7 +104,7 @@ class Cell(metaclass=abc.ABCMeta):
113
104
  """
114
105
  return self
115
106
 
116
- def operations(self) -> 'cirq.OP_TREE':
107
+ def operations(self) -> cirq.OP_TREE:
117
108
  """Returns operations that implement the cell's main action.
118
109
 
119
110
  Returns:
@@ -126,7 +117,7 @@ class Cell(metaclass=abc.ABCMeta):
126
117
  """
127
118
  return ()
128
119
 
129
- def basis_change(self) -> 'cirq.OP_TREE':
120
+ def basis_change(self) -> cirq.OP_TREE:
130
121
  """Operations to conjugate a column with.
131
122
 
132
123
  The main distinctions between operations performed during the body of a
@@ -143,7 +134,7 @@ class Cell(metaclass=abc.ABCMeta):
143
134
  """
144
135
  return ()
145
136
 
146
- def modify_column(self, column: List[Optional['Cell']]) -> None:
137
+ def modify_column(self, column: list[Cell | None]) -> None:
147
138
  """Applies this cell's modification to its column.
148
139
 
149
140
  For example, a control cell will add a control qubit to other operations
@@ -159,7 +150,7 @@ class Cell(metaclass=abc.ABCMeta):
159
150
  Nothing. The `column` argument is mutated in place.
160
151
  """
161
152
 
162
- def persistent_modifiers(self) -> Dict[str, Callable[['Cell'], 'Cell']]:
153
+ def persistent_modifiers(self) -> dict[str, Callable[[Cell], Cell]]:
163
154
  """Overridable modifications to apply to the rest of the circuit.
164
155
 
165
156
  Persistent modifiers apply to all cells in the same column and also to
@@ -186,7 +177,7 @@ class ExplicitOperationsCell(Cell):
186
177
  def gate_count(self) -> int:
187
178
  return len(self._operations) + 2 * len(self._basis_change)
188
179
 
189
- def with_line_qubits_mapped_to(self, qubits: List['cirq.Qid']) -> 'Cell':
180
+ def with_line_qubits_mapped_to(self, qubits: list[cirq.Qid]) -> Cell:
190
181
  return ExplicitOperationsCell(
191
182
  operations=tuple(
192
183
  op.with_qubits(*Cell._replace_qubits(op.qubits, qubits)) for op in self._operations
@@ -200,13 +191,13 @@ class ExplicitOperationsCell(Cell):
200
191
  def _value_equality_values_(self):
201
192
  return self._operations, self._basis_change
202
193
 
203
- def basis_change(self) -> 'cirq.OP_TREE':
194
+ def basis_change(self) -> cirq.OP_TREE:
204
195
  return self._basis_change
205
196
 
206
- def operations(self) -> 'cirq.OP_TREE':
197
+ def operations(self) -> cirq.OP_TREE:
207
198
  return self._operations
208
199
 
209
- def controlled_by(self, qubit: 'cirq.Qid') -> 'ExplicitOperationsCell':
200
+ def controlled_by(self, qubit: cirq.Qid) -> ExplicitOperationsCell:
210
201
  return ExplicitOperationsCell(
211
202
  [op.controlled_by(qubit) for op in self._operations], self._basis_change
212
203
  )
@@ -223,7 +214,7 @@ CellMaker = NamedTuple(
223
214
  [
224
215
  ('identifier', str),
225
216
  ('size', int),
226
- ('maker', Callable[[CellMakerArgs], Union[None, 'Cell', 'cirq.Operation']]),
217
+ ('maker', Callable[[CellMakerArgs], Union[None, Cell, 'cirq.Operation']]),
227
218
  ],
228
219
  )
229
220
  CellMaker.__doc__ = """Turns Quirk identifiers into Cirq operations.
@@ -11,6 +11,9 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
14
17
  import pytest
15
18
 
16
19
  import cirq
@@ -12,18 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import (
16
- Callable,
17
- cast,
18
- Iterable,
19
- Iterator,
20
- List,
21
- Optional,
22
- Sequence,
23
- TYPE_CHECKING,
24
- TypeVar,
25
- Union,
26
- )
15
+ from __future__ import annotations
16
+
17
+ from typing import Callable, cast, Iterable, Iterator, Sequence, TYPE_CHECKING, TypeVar
27
18
 
28
19
  from cirq import circuits
29
20
  from cirq.interop.quirk.cells.cell import Cell
@@ -39,11 +30,7 @@ class CompositeCell(Cell):
39
30
  """
40
31
 
41
32
  def __init__(
42
- self,
43
- height: int,
44
- sub_cell_cols_generator: Iterable[List[Optional[Cell]]],
45
- *,
46
- gate_count: int,
33
+ self, height: int, sub_cell_cols_generator: Iterable[list[Cell | None]], *, gate_count: int
47
34
  ):
48
35
  """Inits CompositeCell.
49
36
 
@@ -79,7 +66,7 @@ class CompositeCell(Cell):
79
66
  def gate_count(self) -> int:
80
67
  return self._gate_count
81
68
 
82
- def _transform_cells(self, func: Callable[[Cell], Cell]) -> 'CompositeCell':
69
+ def _transform_cells(self, func: Callable[[Cell], Cell]) -> CompositeCell:
83
70
  return CompositeCell(
84
71
  height=self.height,
85
72
  # It is important that this is a generator instead of a list!
@@ -91,23 +78,21 @@ class CompositeCell(Cell):
91
78
  gate_count=self._gate_count,
92
79
  )
93
80
 
94
- def _sub_cell_cols_sealed(self) -> List[List[Optional[Cell]]]:
81
+ def _sub_cell_cols_sealed(self) -> list[list[Cell | None]]:
95
82
  if not isinstance(self._sub_cell_cols_generator, list):
96
83
  self._sub_cell_cols_generator = list(self._sub_cell_cols_generator)
97
- return cast(List[List[Optional[Cell]]], self._sub_cell_cols_generator)
84
+ return cast(list[list[Cell | None]], self._sub_cell_cols_generator)
98
85
 
99
- def with_line_qubits_mapped_to(self, qubits: List['cirq.Qid']) -> 'Cell':
86
+ def with_line_qubits_mapped_to(self, qubits: list[cirq.Qid]) -> Cell:
100
87
  return self._transform_cells(lambda cell: cell.with_line_qubits_mapped_to(qubits))
101
88
 
102
- def with_input(
103
- self, letter: str, register: Union[Sequence['cirq.Qid'], int]
104
- ) -> 'CompositeCell':
89
+ def with_input(self, letter: str, register: Sequence[cirq.Qid] | int) -> CompositeCell:
105
90
  return self._transform_cells(lambda cell: cell.with_input(letter, register))
106
91
 
107
- def controlled_by(self, qubit: 'cirq.Qid') -> 'CompositeCell':
92
+ def controlled_by(self, qubit: cirq.Qid) -> CompositeCell:
108
93
  return self._transform_cells(lambda cell: cell.controlled_by(qubit))
109
94
 
110
- def circuit(self) -> 'cirq.Circuit':
95
+ def circuit(self) -> cirq.Circuit:
111
96
  result = circuits.Circuit()
112
97
  for col in self._sub_cell_cols_sealed():
113
98
  body = circuits.Circuit(cell.operations() for cell in col if cell is not None)
@@ -120,7 +105,7 @@ class CompositeCell(Cell):
120
105
  result += basis_change**-1
121
106
  return result
122
107
 
123
- def operations(self) -> 'cirq.OP_TREE':
108
+ def operations(self) -> cirq.OP_TREE:
124
109
  return self.circuit()
125
110
 
126
111
 
@@ -129,7 +114,7 @@ T = TypeVar('T')
129
114
 
130
115
  def _iterator_to_iterable(iterator: Iterator[T]) -> Iterable[T]:
131
116
  done = False
132
- items: List[T] = []
117
+ items: list[T] = []
133
118
 
134
119
  class IterIntoItems:
135
120
  def __iter__(self):
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import pytest
16
18
 
17
19
  import cirq