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
@@ -23,6 +23,7 @@ if TYPE_CHECKING:
23
23
  import cirq
24
24
 
25
25
 
26
+ @value.value_equality()
26
27
  class DepolarizingNoiseModel(devices.NoiseModel):
27
28
  """Applies depolarizing noise to each qubit individually at the end of
28
29
  every moment.
@@ -39,10 +40,25 @@ class DepolarizingNoiseModel(devices.NoiseModel):
39
40
  prepend: If True, put noise before affected gates. Default: False.
40
41
  """
41
42
  value.validate_probability(depol_prob, 'depol prob')
43
+ self._depol_prob = depol_prob
42
44
  self.qubit_noise_gate = ops.DepolarizingChannel(depol_prob)
43
45
  self._prepend = prepend
44
46
 
45
- def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]):
47
+ @property
48
+ def depol_prob(self):
49
+ """The depolarizing probability."""
50
+ return self._depol_prob
51
+
52
+ def _value_equality_values_(self):
53
+ return self.depol_prob, self._prepend
54
+
55
+ def __repr__(self) -> str:
56
+ return (
57
+ f'cirq.contrib.noise_models.DepolarizingNoiseModel('
58
+ f'{self.depol_prob!r}, prepend={self._prepend!r})'
59
+ )
60
+
61
+ def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
46
62
  if validate_all_measurements(moment) or self.is_virtual_moment(moment): # pragma: no cover
47
63
  return moment
48
64
 
@@ -54,7 +70,11 @@ class DepolarizingNoiseModel(devices.NoiseModel):
54
70
  ]
55
71
  return output[::-1] if self._prepend else output
56
72
 
73
+ def _json_dict_(self) -> dict[str, object]:
74
+ return {'depol_prob': self.depol_prob, 'prepend': self._prepend}
57
75
 
76
+
77
+ @value.value_equality()
58
78
  class ReadoutNoiseModel(devices.NoiseModel):
59
79
  """NoiseModel with probabilistic bit flips preceding measurement.
60
80
 
@@ -75,10 +95,23 @@ class ReadoutNoiseModel(devices.NoiseModel):
75
95
  prepend: If True, put noise before affected gates. Default: True.
76
96
  """
77
97
  value.validate_probability(bitflip_prob, 'bitflip prob')
98
+ self._bitflip_prob = bitflip_prob
78
99
  self.readout_noise_gate = ops.BitFlipChannel(bitflip_prob)
79
100
  self._prepend = prepend
80
101
 
81
- def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]):
102
+ @property
103
+ def bitflip_prob(self):
104
+ """The probability of a bit-flip during measurement."""
105
+ return self._bitflip_prob
106
+
107
+ def _value_equality_values_(self):
108
+ return self.bitflip_prob, self._prepend
109
+
110
+ def __repr__(self) -> str:
111
+ p = self.bitflip_prob
112
+ return f'cirq.contrib.noise_models.ReadoutNoiseModel({p!r}, prepend={self._prepend!r})'
113
+
114
+ def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
82
115
  if self.is_virtual_moment(moment):
83
116
  return moment
84
117
  if validate_all_measurements(moment):
@@ -91,7 +124,11 @@ class ReadoutNoiseModel(devices.NoiseModel):
91
124
  return output if self._prepend else output[::-1]
92
125
  return moment
93
126
 
127
+ def _json_dict_(self) -> dict[str, object]:
128
+ return {'bitflip_prob': self.bitflip_prob, 'prepend': self._prepend}
129
+
94
130
 
131
+ @value.value_equality()
95
132
  class DampedReadoutNoiseModel(devices.NoiseModel):
96
133
  """NoiseModel with T1 decay preceding measurement.
97
134
 
@@ -112,10 +149,25 @@ class DampedReadoutNoiseModel(devices.NoiseModel):
112
149
  prepend: If True, put noise before affected gates. Default: True.
113
150
  """
114
151
  value.validate_probability(decay_prob, 'decay_prob')
152
+ self._decay_prob = decay_prob
115
153
  self.readout_decay_gate = ops.AmplitudeDampingChannel(decay_prob)
116
154
  self._prepend = prepend
117
155
 
118
- def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]):
156
+ @property
157
+ def decay_prob(self):
158
+ """The probability of T1 decay during measurement."""
159
+ return self._decay_prob
160
+
161
+ def _value_equality_values_(self):
162
+ return self.decay_prob, self._prepend
163
+
164
+ def __repr__(self) -> str:
165
+ return (
166
+ f'cirq.contrib.noise_models.DampedReadoutNoiseModel('
167
+ f'{self.decay_prob!r}, prepend={self._prepend!r})'
168
+ )
169
+
170
+ def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
119
171
  if self.is_virtual_moment(moment):
120
172
  return moment
121
173
  if validate_all_measurements(moment):
@@ -128,7 +180,11 @@ class DampedReadoutNoiseModel(devices.NoiseModel):
128
180
  return output if self._prepend else output[::-1]
129
181
  return moment
130
182
 
183
+ def _json_dict_(self) -> dict[str, object]:
184
+ return {'decay_prob': self.decay_prob, 'prepend': self._prepend}
185
+
131
186
 
187
+ @value.value_equality()
132
188
  class DepolarizingWithReadoutNoiseModel(devices.NoiseModel):
133
189
  """DepolarizingNoiseModel with probabilistic bit flips preceding
134
190
  measurement.
@@ -145,15 +201,39 @@ class DepolarizingWithReadoutNoiseModel(devices.NoiseModel):
145
201
  """
146
202
  value.validate_probability(depol_prob, 'depol prob')
147
203
  value.validate_probability(bitflip_prob, 'bitflip prob')
204
+ self._depol_prob = depol_prob
205
+ self._bitflip_prob = bitflip_prob
148
206
  self.qubit_noise_gate = ops.DepolarizingChannel(depol_prob)
149
207
  self.readout_noise_gate = ops.BitFlipChannel(bitflip_prob)
150
208
 
151
- def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]):
209
+ @property
210
+ def depol_prob(self):
211
+ """The depolarizing probability."""
212
+ return self._depol_prob
213
+
214
+ @property
215
+ def bitflip_prob(self):
216
+ """The probability of a bit-flip during measurement."""
217
+ return self._bitflip_prob
218
+
219
+ def _value_equality_values_(self):
220
+ return self.depol_prob, self.bitflip_prob
221
+
222
+ def __repr__(self) -> str:
223
+ p = self.depol_prob
224
+ b = self.bitflip_prob
225
+ return f'cirq.contrib.noise_models.DepolarizingWithReadoutNoiseModel({p!r}, {b!r})'
226
+
227
+ def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
152
228
  if validate_all_measurements(moment):
153
229
  return [circuits.Moment(self.readout_noise_gate(q) for q in system_qubits), moment]
154
230
  return [moment, circuits.Moment(self.qubit_noise_gate(q) for q in system_qubits)]
155
231
 
232
+ def _json_dict_(self) -> dict[str, object]:
233
+ return {'depol_prob': self.depol_prob, 'bitflip_prob': self.bitflip_prob}
234
+
156
235
 
236
+ @value.value_equality()
157
237
  class DepolarizingWithDampedReadoutNoiseModel(devices.NoiseModel):
158
238
  """DepolarizingWithReadoutNoiseModel with T1 decay preceding
159
239
  measurement.
@@ -174,11 +254,38 @@ class DepolarizingWithDampedReadoutNoiseModel(devices.NoiseModel):
174
254
  value.validate_probability(depol_prob, 'depol prob')
175
255
  value.validate_probability(bitflip_prob, 'bitflip prob')
176
256
  value.validate_probability(decay_prob, 'decay_prob')
257
+ self._depol_prob = depol_prob
258
+ self._bitflip_prob = bitflip_prob
259
+ self._decay_prob = decay_prob
177
260
  self.qubit_noise_gate = ops.DepolarizingChannel(depol_prob)
178
261
  self.readout_noise_gate = ops.BitFlipChannel(bitflip_prob)
179
262
  self.readout_decay_gate = ops.AmplitudeDampingChannel(decay_prob)
180
263
 
181
- def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]):
264
+ @property
265
+ def depol_prob(self):
266
+ """The depolarizing probability."""
267
+ return self._depol_prob
268
+
269
+ @property
270
+ def bitflip_prob(self):
271
+ """Probability of a bit-flip during measurement."""
272
+ return self._bitflip_prob
273
+
274
+ @property
275
+ def decay_prob(self):
276
+ """The probability of T1 decay during measurement."""
277
+ return self._decay_prob
278
+
279
+ def _value_equality_values_(self):
280
+ return self.depol_prob, self.bitflip_prob, self.decay_prob
281
+
282
+ def __repr__(self) -> str:
283
+ return (
284
+ 'cirq.contrib.noise_models.DepolarizingWithDampedReadoutNoiseModel('
285
+ f'{self.depol_prob!r}, {self.bitflip_prob!r}, {self.decay_prob!r})'
286
+ )
287
+
288
+ def noisy_moment(self, moment: cirq.Moment, system_qubits: Sequence[cirq.Qid]) -> cirq.OP_TREE:
182
289
  if validate_all_measurements(moment):
183
290
  return [
184
291
  circuits.Moment(self.readout_decay_gate(q) for q in system_qubits),
@@ -187,3 +294,10 @@ class DepolarizingWithDampedReadoutNoiseModel(devices.NoiseModel):
187
294
  ]
188
295
  else:
189
296
  return [moment, circuits.Moment(self.qubit_noise_gate(q) for q in system_qubits)]
297
+
298
+ def _json_dict_(self) -> dict[str, object]:
299
+ return {
300
+ 'depol_prob': self.depol_prob,
301
+ 'bitflip_prob': self.bitflip_prob,
302
+ 'decay_prob': self.decay_prob,
303
+ }
@@ -12,28 +12,34 @@
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
+
17
+ import pytest
18
+
15
19
  import cirq
16
20
  import cirq.contrib.noise_models as ccn
17
21
  from cirq import ops
18
- from cirq.testing import assert_equivalent_op_tree
22
+ from cirq.testing import assert_equivalent_op_tree, assert_equivalent_repr
19
23
 
20
24
 
21
- def test_depol_noise():
25
+ def test_depol_noise() -> None:
22
26
  noise_model = ccn.DepolarizingNoiseModel(depol_prob=0.005)
23
27
  qubits = cirq.LineQubit.range(2)
24
28
  moment = cirq.Moment([cirq.X(qubits[0]), cirq.Y(qubits[1])])
25
29
  noisy_mom = noise_model.noisy_moment(moment, system_qubits=qubits)
30
+ assert isinstance(noisy_mom, list)
26
31
  assert len(noisy_mom) == 2
27
32
  assert noisy_mom[0] == moment
28
33
  for g in noisy_mom[1]:
29
34
  assert isinstance(g.gate, cirq.DepolarizingChannel)
30
35
 
31
36
 
32
- def test_depol_noise_prepend():
37
+ def test_depol_noise_prepend() -> None:
33
38
  noise_model = ccn.DepolarizingNoiseModel(depol_prob=0.005, prepend=True)
34
39
  qubits = cirq.LineQubit.range(2)
35
40
  moment = cirq.Moment([cirq.X(qubits[0]), cirq.Y(qubits[1])])
36
41
  noisy_mom = noise_model.noisy_moment(moment, system_qubits=qubits)
42
+ assert isinstance(noisy_mom, list)
37
43
  assert len(noisy_mom) == 2
38
44
  assert noisy_mom[1] == moment
39
45
  for g in noisy_mom[0]:
@@ -41,7 +47,7 @@ def test_depol_noise_prepend():
41
47
 
42
48
 
43
49
  # Composes depolarization noise with readout noise.
44
- def test_readout_noise_after_moment():
50
+ def test_readout_noise_after_moment() -> None:
45
51
  program = cirq.Circuit()
46
52
  qubits = cirq.LineQubit.range(3)
47
53
  program.append(
@@ -92,11 +98,32 @@ def test_readout_noise_after_moment():
92
98
  assert_equivalent_op_tree(true_noisy_program, noisy_circuit)
93
99
 
94
100
 
95
- def test_readout_noise_no_prepend():
101
+ @pytest.mark.parametrize(
102
+ 'model',
103
+ [
104
+ ccn.DepolarizingNoiseModel(0.1),
105
+ ccn.DepolarizingNoiseModel(0.1, prepend=False),
106
+ ccn.DepolarizingNoiseModel(0.1, prepend=True),
107
+ ccn.ReadoutNoiseModel(0.2),
108
+ ccn.ReadoutNoiseModel(0.2, prepend=False),
109
+ ccn.ReadoutNoiseModel(0.2, prepend=True),
110
+ ccn.DampedReadoutNoiseModel(0.3),
111
+ ccn.DampedReadoutNoiseModel(0.3, prepend=False),
112
+ ccn.DampedReadoutNoiseModel(0.3, prepend=True),
113
+ ccn.DepolarizingWithReadoutNoiseModel(0.1, 0.2),
114
+ ccn.DepolarizingWithDampedReadoutNoiseModel(0.1, 0.2, 0.3),
115
+ ],
116
+ )
117
+ def test_repr(model) -> None:
118
+ assert_equivalent_repr(model)
119
+
120
+
121
+ def test_readout_noise_no_prepend() -> None:
96
122
  noise_model = ccn.ReadoutNoiseModel(bitflip_prob=0.005, prepend=False)
97
123
  qubits = cirq.LineQubit.range(2)
98
124
  moment = cirq.Moment([cirq.measure(*qubits, key="meas")])
99
125
  noisy_mom = noise_model.noisy_moment(moment, system_qubits=qubits)
126
+ assert isinstance(noisy_mom, list)
100
127
  assert len(noisy_mom) == 2
101
128
  assert noisy_mom[0] == moment
102
129
  for g in noisy_mom[1]:
@@ -104,7 +131,7 @@ def test_readout_noise_no_prepend():
104
131
 
105
132
 
106
133
  # Composes depolarization, damping, and readout noise (in that order).
107
- def test_decay_noise_after_moment():
134
+ def test_decay_noise_after_moment() -> None:
108
135
  program = cirq.Circuit()
109
136
  qubits = cirq.LineQubit.range(3)
110
137
  program.append(
@@ -160,11 +187,12 @@ def test_decay_noise_after_moment():
160
187
  assert_equivalent_op_tree(true_noisy_program, noisy_circuit)
161
188
 
162
189
 
163
- def test_damped_readout_noise_no_prepend():
190
+ def test_damped_readout_noise_no_prepend() -> None:
164
191
  noise_model = ccn.DampedReadoutNoiseModel(decay_prob=0.005, prepend=False)
165
192
  qubits = cirq.LineQubit.range(2)
166
193
  moment = cirq.Moment([cirq.measure(*qubits, key="meas")])
167
194
  noisy_mom = noise_model.noisy_moment(moment, system_qubits=qubits)
195
+ assert isinstance(noisy_mom, list)
168
196
  assert len(noisy_mom) == 2
169
197
  assert noisy_mom[0] == moment
170
198
  for g in noisy_mom[1]:
@@ -172,7 +200,7 @@ def test_damped_readout_noise_no_prepend():
172
200
 
173
201
 
174
202
  # Test the aggregate noise models.
175
- def test_aggregate_readout_noise_after_moment():
203
+ def test_aggregate_readout_noise_after_moment() -> None:
176
204
  program = cirq.Circuit()
177
205
  qubits = cirq.LineQubit.range(3)
178
206
  program.append(
@@ -219,7 +247,7 @@ def test_aggregate_readout_noise_after_moment():
219
247
  assert_equivalent_op_tree(true_noisy_program, noisy_circuit)
220
248
 
221
249
 
222
- def test_aggregate_decay_noise_after_moment():
250
+ def test_aggregate_decay_noise_after_moment() -> None:
223
251
  program = cirq.Circuit()
224
252
  qubits = cirq.LineQubit.range(3)
225
253
  program.append(
@@ -12,7 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import cast, Tuple
15
+ from __future__ import annotations
16
+
17
+ from typing import cast
16
18
 
17
19
  from cirq import circuits, ops, protocols, transformers
18
20
  from cirq.contrib.paulistring.clifford_target_gateset import CliffordTargetGateset
@@ -29,7 +31,7 @@ def clifford_optimized_circuit(circuit: circuits.Circuit, atol: float = 1e-8) ->
29
31
 
30
32
  def find_merge_point(
31
33
  start_i: int, string_op: ops.PauliStringPhasor, stop_at_cz: bool
32
- ) -> Tuple[int, ops.PauliStringPhasor, int]:
34
+ ) -> tuple[int, ops.PauliStringPhasor, int]:
33
35
  STOP = 0
34
36
  CONTINUE = 1
35
37
  SKIP = 2
@@ -65,7 +67,7 @@ def clifford_optimized_circuit(circuit: circuits.Circuit, atol: float = 1e-8) ->
65
67
  furthest_i = i
66
68
  break
67
69
  if cont_cond == CONTINUE:
68
- modified_op = modified_op.pass_operations_over([op], after_to_before=True)
70
+ modified_op = modified_op.conjugated_by(protocols.inverse(op))
69
71
  num_passed_over += 1
70
72
  if len(modified_op.pauli_string) == 1:
71
73
  furthest_op = modified_op
@@ -122,7 +124,7 @@ def clifford_optimized_circuit(circuit: circuits.Circuit, atol: float = 1e-8) ->
122
124
  all_ops.insert(merge_i + 1, part_cliff_gate(qubit))
123
125
  elif isinstance(other_op, ops.PauliStringPhasor):
124
126
  # Pass over a non-Clifford gate
125
- mod_op = other_op.pass_operations_over([part_cliff_gate(qubit)])
127
+ mod_op = other_op.conjugated_by([part_cliff_gate(qubit)])
126
128
  all_ops[merge_i] = mod_op
127
129
  all_ops.insert(merge_i + 1, part_cliff_gate(qubit))
128
130
  elif merge_i > start_i + 1 and num_passed > 0:
@@ -12,12 +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
15
16
 
16
17
  import cirq
17
18
  from cirq.contrib.paulistring import clifford_optimized_circuit, CliffordTargetGateset
18
19
 
19
20
 
20
- def test_optimize():
21
+ def test_optimize() -> None:
21
22
  q0, q1 = cirq.LineQubit.range(2)
22
23
  c_orig = cirq.Circuit(
23
24
  cirq.X(q1) ** 0.5,
@@ -49,7 +50,7 @@ def test_optimize():
49
50
  )
50
51
 
51
52
 
52
- def test_remove_czs():
53
+ def test_remove_czs() -> None:
53
54
  q0, q1 = cirq.LineQubit.range(2)
54
55
  c_orig = cirq.Circuit(cirq.CZ(q0, q1), cirq.Z(q0) ** 0.5, cirq.CZ(q0, q1))
55
56
  c_expected = cirq.optimize_for_target_gateset(
@@ -72,7 +73,7 @@ def test_remove_czs():
72
73
  )
73
74
 
74
75
 
75
- def test_remove_staggered_czs():
76
+ def test_remove_staggered_czs() -> None:
76
77
  q0, q1, q2 = cirq.LineQubit.range(3)
77
78
  c_orig = cirq.Circuit(cirq.CZ(q0, q1), cirq.CZ(q1, q2), cirq.CZ(q0, q1))
78
79
  c_expected = cirq.optimize_for_target_gateset(
@@ -97,7 +98,7 @@ def test_remove_staggered_czs():
97
98
  )
98
99
 
99
100
 
100
- def test_with_measurements():
101
+ def test_with_measurements() -> None:
101
102
  q0, q1 = cirq.LineQubit.range(2)
102
103
  c_orig = cirq.Circuit(cirq.X(q0), cirq.CZ(q0, q1), cirq.measure(q0, q1, key='m'))
103
104
  c_expected = cirq.optimize_for_target_gateset(
@@ -121,7 +122,7 @@ def test_with_measurements():
121
122
  )
122
123
 
123
124
 
124
- def test_optimize_large_circuit():
125
+ def test_optimize_large_circuit() -> None:
125
126
  q0, q1, q2 = cirq.LineQubit.range(3)
126
127
  c_orig = cirq.testing.nonoptimal_toffoli_circuit(q0, q1, q2)
127
128
 
@@ -16,19 +16,19 @@ from __future__ import annotations
16
16
 
17
17
  from enum import Enum
18
18
  from types import NotImplementedType
19
- from typing import cast, List, Type, TYPE_CHECKING, Union
20
-
21
- import numpy as np
19
+ from typing import cast, TYPE_CHECKING
22
20
 
23
21
  from cirq import linalg, ops, protocols, transformers
24
22
 
25
23
  if TYPE_CHECKING:
24
+ import numpy as np
25
+
26
26
  import cirq
27
27
 
28
28
 
29
29
  def _matrix_to_clifford_op(
30
30
  mat: np.ndarray, qubit: cirq.Qid, *, atol: float
31
- ) -> Union[ops.Operation, NotImplementedType]:
31
+ ) -> ops.Operation | NotImplementedType:
32
32
  rotations = transformers.single_qubit_matrix_to_pauli_rotations(mat, atol)
33
33
  clifford_gate = ops.SingleQubitCliffordGate.I
34
34
  for pauli, half_turns in rotations:
@@ -48,7 +48,7 @@ def _matrix_to_pauli_string_phasors(
48
48
  mat: np.ndarray, qubit: cirq.Qid, *, keep_clifford: bool, atol: float
49
49
  ) -> ops.OP_TREE:
50
50
  rotations = transformers.single_qubit_matrix_to_pauli_rotations(mat, atol)
51
- out_ops: List[ops.GateOperation] = []
51
+ out_ops: list[ops.GateOperation] = []
52
52
  for pauli, half_turns in rotations:
53
53
  if keep_clifford and linalg.all_near_zero_mod(half_turns, 0.5):
54
54
  cliff_gate = ops.SingleQubitCliffordGate.from_quarter_turns(
@@ -79,7 +79,7 @@ class CliffordTargetGateset(transformers.TwoQubitCompilationTargetGateset):
79
79
  def __init__(
80
80
  self,
81
81
  *,
82
- single_qubit_target: SingleQubitTarget = SingleQubitTarget.PAULI_STRING_PHASORS_AND_CLIFFORDS, # pylint: disable=line-too-long
82
+ single_qubit_target: SingleQubitTarget = SingleQubitTarget.PAULI_STRING_PHASORS_AND_CLIFFORDS, # noqa: E501
83
83
  atol: float = 1e-8,
84
84
  ):
85
85
  """Initializes CliffordTargetGateset
@@ -97,7 +97,7 @@ class CliffordTargetGateset(transformers.TwoQubitCompilationTargetGateset):
97
97
  """
98
98
  self.atol = atol
99
99
  self.single_qubit_target = single_qubit_target
100
- gates: List[Union[cirq.Gate, Type[cirq.Gate]]] = [ops.CZ, ops.MeasurementGate]
100
+ gates: list[cirq.Gate | type[cirq.Gate]] = [ops.CZ, ops.MeasurementGate]
101
101
  if single_qubit_target in [
102
102
  self.SingleQubitTarget.SINGLE_QUBIT_CLIFFORDS,
103
103
  self.SingleQubitTarget.PAULI_STRING_PHASORS_AND_CLIFFORDS,
@@ -112,7 +112,7 @@ class CliffordTargetGateset(transformers.TwoQubitCompilationTargetGateset):
112
112
 
113
113
  def _decompose_single_qubit_operation(
114
114
  self, op: cirq.Operation, _
115
- ) -> Union[NotImplementedType, cirq.OP_TREE]:
115
+ ) -> NotImplementedType | cirq.OP_TREE:
116
116
  if not protocols.has_unitary(op):
117
117
  return NotImplemented
118
118
  mat = protocols.unitary(op)
@@ -129,7 +129,7 @@ class CliffordTargetGateset(transformers.TwoQubitCompilationTargetGateset):
129
129
 
130
130
  def _decompose_two_qubit_operation(
131
131
  self, op: cirq.Operation, _
132
- ) -> Union[NotImplementedType, cirq.OP_TREE]:
132
+ ) -> NotImplementedType | cirq.OP_TREE:
133
133
  if not protocols.has_unitary(op):
134
134
  return NotImplemented
135
135
  return transformers.two_qubit_matrix_to_cz_operations(
@@ -141,7 +141,7 @@ class CliffordTargetGateset(transformers.TwoQubitCompilationTargetGateset):
141
141
  )
142
142
 
143
143
  @property
144
- def postprocess_transformers(self) -> List[cirq.TRANSFORMER]:
144
+ def postprocess_transformers(self) -> list[cirq.TRANSFORMER]:
145
145
  """List of transformers which should be run after decomposing individual operations."""
146
146
 
147
147
  def rewriter(o: cirq.CircuitOperation):
@@ -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
  import sympy
17
19
 
@@ -41,7 +43,7 @@ from cirq.contrib.paulistring.clifford_target_gateset import CliffordTargetGates
41
43
  )
42
44
  )(cirq.LineQubit(0), cirq.LineQubit(1)),
43
45
  )
44
- def test_converts_various_ops(op, expected_ops):
46
+ def test_converts_various_ops(op, expected_ops) -> None:
45
47
  before = cirq.Circuit(op)
46
48
  expected = cirq.Circuit(expected_ops, strategy=cirq.InsertStrategy.EARLIEST)
47
49
  after = cirq.optimize_for_target_gateset(
@@ -58,7 +60,7 @@ def test_converts_various_ops(op, expected_ops):
58
60
  )
59
61
 
60
62
 
61
- def test_degenerate_single_qubit_decompose():
63
+ def test_degenerate_single_qubit_decompose() -> None:
62
64
  q0 = cirq.LineQubit(0)
63
65
 
64
66
  before = cirq.Circuit(cirq.Z(q0) ** 0.1, cirq.X(q0) ** 1.0000000001, cirq.Z(q0) ** 0.1)
@@ -72,7 +74,7 @@ def test_degenerate_single_qubit_decompose():
72
74
  cirq.testing.assert_allclose_up_to_global_phase(after.unitary(), expected.unitary(), atol=1e-7)
73
75
 
74
76
 
75
- def test_converts_single_qubit_series():
77
+ def test_converts_single_qubit_series() -> None:
76
78
  q0 = cirq.LineQubit(0)
77
79
 
78
80
  before = cirq.Circuit(
@@ -96,7 +98,7 @@ def test_converts_single_qubit_series():
96
98
  cirq.testing.assert_allclose_up_to_global_phase(before.unitary(), after.unitary(), atol=1e-7)
97
99
 
98
100
 
99
- def test_converts_single_qubit_then_two():
101
+ def test_converts_single_qubit_then_two() -> None:
100
102
  q0, q1 = cirq.LineQubit.range(2)
101
103
 
102
104
  before = cirq.Circuit(cirq.X(q0), cirq.Y(q0), cirq.CZ(q0, q1))
@@ -107,7 +109,7 @@ def test_converts_single_qubit_then_two():
107
109
  cirq.testing.assert_allclose_up_to_global_phase(before.unitary(), after.unitary(), atol=1e-7)
108
110
 
109
111
 
110
- def test_converts_large_circuit():
112
+ def test_converts_large_circuit() -> None:
111
113
  q0, q1, q2 = cirq.LineQubit.range(3)
112
114
 
113
115
  before = cirq.Circuit(
@@ -147,7 +149,7 @@ def test_converts_large_circuit():
147
149
  )
148
150
 
149
151
 
150
- def test_convert_to_pauli_string_phasors():
152
+ def test_convert_to_pauli_string_phasors() -> None:
151
153
  q0, q1 = cirq.LineQubit.range(2)
152
154
  c_orig = cirq.Circuit(cirq.X(q0), cirq.Y(q1) ** 0.25, cirq.Z(q0) ** 0.125, cirq.H(q1))
153
155
  c_new = cirq.optimize_for_target_gateset(
@@ -168,7 +170,7 @@ def test_convert_to_pauli_string_phasors():
168
170
  )
169
171
 
170
172
 
171
- def test_already_converted():
173
+ def test_already_converted() -> None:
172
174
  q0 = cirq.LineQubit(0)
173
175
  c_orig = cirq.Circuit(cirq.PauliStringPhasor(cirq.X.on(q0)))
174
176
  c_new = cirq.optimize_for_target_gateset(
@@ -181,7 +183,7 @@ def test_already_converted():
181
183
  assert c_new == c_orig
182
184
 
183
185
 
184
- def test_ignore_unsupported_gate():
186
+ def test_ignore_unsupported_gate() -> None:
185
187
  class UnsupportedGate(cirq.testing.TwoQubitGate):
186
188
  pass
187
189
 
@@ -193,7 +195,7 @@ def test_ignore_unsupported_gate():
193
195
  assert c_new == c_orig
194
196
 
195
197
 
196
- def test_fail_unsupported_gate():
198
+ def test_fail_unsupported_gate() -> None:
197
199
  class UnsupportedGate(cirq.testing.TwoQubitGate):
198
200
  pass
199
201
 
@@ -205,7 +207,7 @@ def test_fail_unsupported_gate():
205
207
  )
206
208
 
207
209
 
208
- def test_convert_to_single_qubit_cliffords():
210
+ def test_convert_to_single_qubit_cliffords() -> None:
209
211
  q0, q1 = cirq.LineQubit.range(2)
210
212
  c_orig = cirq.Circuit(
211
213
  cirq.X(q0), cirq.Y(q1) ** 0.5, cirq.Z(q0) ** -0.5, cirq.Z(q1) ** 0, cirq.H(q0)
@@ -232,7 +234,7 @@ def test_convert_to_single_qubit_cliffords():
232
234
  )
233
235
 
234
236
 
235
- def test_convert_to_single_qubit_cliffords_ignores_non_clifford():
237
+ def test_convert_to_single_qubit_cliffords_ignores_non_clifford() -> None:
236
238
  q0 = cirq.LineQubit(0)
237
239
  c_orig = cirq.Circuit(cirq.Z(q0) ** 0.25)
238
240
  c_new = cirq.optimize_for_target_gateset(
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  from typing import Callable
16
18
 
17
19
  from cirq import circuits, ops, transformers
@@ -12,12 +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
15
16
 
16
17
  import cirq
17
18
  from cirq.contrib.paulistring import optimized_circuit
18
19
 
19
20
 
20
- def test_optimize():
21
+ def test_optimize() -> None:
21
22
  q0, q1, q2 = cirq.LineQubit.range(3)
22
23
  c_orig = cirq.Circuit(
23
24
  cirq.X(q0) ** 0.5,
@@ -61,7 +62,7 @@ def test_optimize():
61
62
  )
62
63
 
63
64
 
64
- def test_optimize_large_circuit():
65
+ def test_optimize_large_circuit() -> None:
65
66
  q0, q1, q2 = cirq.LineQubit.range(3)
66
67
  c_orig = cirq.testing.nonoptimal_toffoli_circuit(q0, q1, q2)
67
68
 
@@ -79,7 +80,7 @@ def test_optimize_large_circuit():
79
80
  )
80
81
 
81
82
 
82
- def test_repeat_limit():
83
+ def test_repeat_limit() -> None:
83
84
  q0, q1, q2 = cirq.LineQubit.range(3)
84
85
  c_orig = cirq.testing.nonoptimal_toffoli_circuit(q0, q1, q2)
85
86
 
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  from typing import cast
16
18
 
17
19
  from cirq import circuits, ops, protocols
@@ -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
  from cirq.contrib.paulistring import convert_and_separate_circuit, pauli_string_dag_from_circuit
17
19
 
18
20
 
19
- def test_pauli_string_dag_from_circuit():
21
+ def test_pauli_string_dag_from_circuit() -> None:
20
22
  q0, q1, q2 = cirq.LineQubit.range(3)
21
23
  c_orig = cirq.testing.nonoptimal_toffoli_circuit(q0, q1, q2)
22
24
  c_left, _ = convert_and_separate_circuit(c_orig)