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
cirq/ops/gateset.py CHANGED
@@ -14,20 +14,9 @@
14
14
 
15
15
  """Functionality for grouping and validating Cirq gates."""
16
16
 
17
- from typing import (
18
- Any,
19
- Callable,
20
- cast,
21
- Dict,
22
- FrozenSet,
23
- Hashable,
24
- List,
25
- Optional,
26
- Sequence,
27
- Type,
28
- TYPE_CHECKING,
29
- Union,
30
- )
17
+ from __future__ import annotations
18
+
19
+ from typing import Any, Callable, cast, Hashable, Sequence, TYPE_CHECKING
31
20
 
32
21
  from cirq import protocols, value
33
22
  from cirq.ops import global_phase_op, op_tree, raw_types
@@ -37,8 +26,7 @@ if TYPE_CHECKING:
37
26
 
38
27
 
39
28
  def _gate_str(
40
- gate: Union[raw_types.Gate, Type[raw_types.Gate], 'cirq.GateFamily'],
41
- gettr: Callable[[Any], str] = str,
29
+ gate: raw_types.Gate | type[raw_types.Gate] | cirq.GateFamily, gettr: Callable[[Any], str] = str
42
30
  ) -> str:
43
31
  return gettr(gate) if not isinstance(gate, type) else f'{gate.__module__}.{gate.__name__}'
44
32
 
@@ -112,10 +100,10 @@ class GateFamily:
112
100
 
113
101
  def __init__(
114
102
  self,
115
- gate: Union[Type[raw_types.Gate], raw_types.Gate],
103
+ gate: type[raw_types.Gate] | raw_types.Gate,
116
104
  *,
117
- name: Optional[str] = None,
118
- description: Optional[str] = None,
105
+ name: str | None = None,
106
+ description: str | None = None,
119
107
  ignore_global_phase: bool = True,
120
108
  tags_to_accept: Sequence[Hashable] = (),
121
109
  tags_to_ignore: Sequence[Hashable] = (),
@@ -164,7 +152,7 @@ class GateFamily:
164
152
  def _gate_str(self, gettr: Callable[[Any], str] = str) -> str:
165
153
  return _gate_str(self.gate, gettr)
166
154
 
167
- def _gate_json(self) -> Union[raw_types.Gate, str]:
155
+ def _gate_json(self) -> raw_types.Gate | str:
168
156
  return self.gate if not isinstance(self.gate, type) else protocols.json_cirq_type(self.gate)
169
157
 
170
158
  def _default_name(self) -> str:
@@ -186,7 +174,7 @@ class GateFamily:
186
174
  )
187
175
 
188
176
  @property
189
- def gate(self) -> Union[Type[raw_types.Gate], raw_types.Gate]:
177
+ def gate(self) -> type[raw_types.Gate] | raw_types.Gate:
190
178
  return self._gate
191
179
 
192
180
  @property
@@ -198,11 +186,11 @@ class GateFamily:
198
186
  return self._description
199
187
 
200
188
  @property
201
- def tags_to_accept(self) -> FrozenSet[Hashable]:
189
+ def tags_to_accept(self) -> frozenset[Hashable]:
202
190
  return self._tags_to_accept
203
191
 
204
192
  @property
205
- def tags_to_ignore(self) -> FrozenSet[Hashable]:
193
+ def tags_to_ignore(self) -> frozenset[Hashable]:
206
194
  return self._tags_to_ignore
207
195
 
208
196
  def _predicate(self, gate: raw_types.Gate) -> bool:
@@ -225,7 +213,7 @@ class GateFamily:
225
213
  )
226
214
  return isinstance(gate, self.gate)
227
215
 
228
- def __contains__(self, item: Union[raw_types.Gate, raw_types.Operation]) -> bool:
216
+ def __contains__(self, item: raw_types.Gate | raw_types.Operation) -> bool:
229
217
  if self._tags_to_accept and (
230
218
  not isinstance(item, raw_types.Operation) or self._tags_to_accept.isdisjoint(item.tags)
231
219
  ):
@@ -268,8 +256,8 @@ class GateFamily:
268
256
  self._tags_to_ignore,
269
257
  )
270
258
 
271
- def _json_dict_(self) -> Dict[str, Any]:
272
- d: Dict[str, Any] = {
259
+ def _json_dict_(self) -> dict[str, Any]:
260
+ d: dict[str, Any] = {
273
261
  'gate': self._gate_json(),
274
262
  'name': self.name,
275
263
  'description': self.description,
@@ -291,7 +279,7 @@ class GateFamily:
291
279
  tags_to_accept=(),
292
280
  tags_to_ignore=(),
293
281
  **kwargs,
294
- ) -> 'GateFamily':
282
+ ) -> GateFamily:
295
283
  if isinstance(gate, str):
296
284
  gate = protocols.cirq_type_from_json(gate)
297
285
  return cls(
@@ -319,8 +307,8 @@ class Gateset:
319
307
 
320
308
  def __init__(
321
309
  self,
322
- *gates: Union[Type[raw_types.Gate], raw_types.Gate, GateFamily],
323
- name: Optional[str] = None,
310
+ *gates: type[raw_types.Gate] | raw_types.Gate | GateFamily,
311
+ name: str | None = None,
324
312
  unroll_circuit_op: bool = True,
325
313
  ) -> None:
326
314
  """Init Gateset.
@@ -344,10 +332,10 @@ class Gateset:
344
332
  """
345
333
  self._name = name
346
334
  self._unroll_circuit_op = unroll_circuit_op
347
- self._instance_gate_families: Dict[raw_types.Gate, GateFamily] = {}
348
- self._type_gate_families: Dict[Type[raw_types.Gate], GateFamily] = {}
335
+ self._instance_gate_families: dict[raw_types.Gate, GateFamily] = {}
336
+ self._type_gate_families: dict[type[raw_types.Gate], GateFamily] = {}
349
337
  self._gates_repr_str = ", ".join([_gate_str(g, repr) for g in gates])
350
- unique_gate_list: List[GateFamily] = list(
338
+ unique_gate_list: list[GateFamily] = list(
351
339
  dict.fromkeys(g if isinstance(g, GateFamily) else GateFamily(gate=g) for g in gates)
352
340
  )
353
341
 
@@ -361,16 +349,16 @@ class Gateset:
361
349
  self._gates = frozenset(unique_gate_list)
362
350
 
363
351
  @property
364
- def name(self) -> Optional[str]:
352
+ def name(self) -> str | None:
365
353
  return self._name
366
354
 
367
355
  @property
368
- def gates(self) -> FrozenSet[GateFamily]:
356
+ def gates(self) -> frozenset[GateFamily]:
369
357
  return self._gates
370
358
 
371
359
  def with_params(
372
- self, *, name: Optional[str] = None, unroll_circuit_op: Optional[bool] = None
373
- ) -> 'Gateset':
360
+ self, *, name: str | None = None, unroll_circuit_op: bool | None = None
361
+ ) -> Gateset:
374
362
  """Returns a copy of this Gateset with identical gates and new values for named arguments.
375
363
 
376
364
  If a named argument is None then corresponding value of this Gateset is used instead.
@@ -395,7 +383,7 @@ class Gateset:
395
383
  gates = self.gates
396
384
  return Gateset(*gates, name=name, unroll_circuit_op=cast(bool, unroll_circuit_op))
397
385
 
398
- def __contains__(self, item: Union[raw_types.Gate, raw_types.Operation]) -> bool:
386
+ def __contains__(self, item: raw_types.Gate | raw_types.Operation) -> bool:
399
387
  r"""Check for containment of a given Gate/Operation in this Gateset.
400
388
 
401
389
  Containment checks are handled as follows:
@@ -445,7 +433,7 @@ class Gateset:
445
433
 
446
434
  return any(item in gate_family for gate_family in self._gates)
447
435
 
448
- def validate(self, circuit_or_optree: Union['cirq.AbstractCircuit', op_tree.OP_TREE]) -> bool:
436
+ def validate(self, circuit_or_optree: cirq.AbstractCircuit | op_tree.OP_TREE) -> bool:
449
437
  """Validates gates forming `circuit_or_optree` should be contained in Gateset.
450
438
 
451
439
  Args:
@@ -510,7 +498,7 @@ class Gateset:
510
498
  header += self.name
511
499
  return f'{header}\n' + "\n\n".join([str(g) for g in self._unique_gate_list])
512
500
 
513
- def _json_dict_(self) -> Dict[str, Any]:
501
+ def _json_dict_(self) -> dict[str, Any]:
514
502
  return {
515
503
  'gates': self._unique_gate_list,
516
504
  'name': self.name,
@@ -518,7 +506,7 @@ class Gateset:
518
506
  }
519
507
 
520
508
  @classmethod
521
- def _from_json_dict_(cls, gates, name, unroll_circuit_op, **kwargs) -> 'Gateset':
509
+ def _from_json_dict_(cls, gates, name, unroll_circuit_op, **kwargs) -> Gateset:
522
510
  # This parameter was deprecated in 0.16, but we keep this logic here for backwards
523
511
  # compatibility.
524
512
  if 'accept_global_phase_op' in kwargs:
cirq/ops/gateset_test.py CHANGED
@@ -12,8 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import re
16
- from typing import cast, List, Tuple
18
+ from typing import cast
17
19
 
18
20
  import numpy as np
19
21
  import pytest
@@ -24,7 +26,7 @@ from cirq._compat import proper_repr
24
26
 
25
27
 
26
28
  class CustomXPowGate(cirq.EigenGate):
27
- def _eigen_components(self) -> List[Tuple[float, np.ndarray]]:
29
+ def _eigen_components(self) -> list[tuple[float, np.ndarray]]:
28
30
  return [(0, np.array([[0.5, 0.5], [0.5, 0.5]])), (1, np.array([[0.5, -0.5], [-0.5, 0.5]]))]
29
31
 
30
32
  def __str__(self) -> str:
@@ -13,8 +13,10 @@
13
13
  # limitations under the License.
14
14
  """A no-qubit global phase operation."""
15
15
 
16
+ from __future__ import annotations
17
+
16
18
  from types import NotImplementedType
17
- from typing import AbstractSet, Any, cast, Collection, Dict, Optional, Sequence, Tuple, Union
19
+ from typing import AbstractSet, Any, cast, Collection, Sequence
18
20
 
19
21
  import numpy as np
20
22
  import sympy
@@ -27,14 +29,14 @@ from cirq.ops import control_values as cv, controlled_gate, raw_types
27
29
 
28
30
  @value.value_equality(approximate=True)
29
31
  class GlobalPhaseGate(raw_types.Gate):
30
- def __init__(self, coefficient: 'cirq.TParamValComplex', atol: float = 1e-8) -> None:
32
+ def __init__(self, coefficient: cirq.TParamValComplex, atol: float = 1e-8) -> None:
31
33
  if not isinstance(coefficient, sympy.Basic):
32
34
  if abs(1 - abs(coefficient)) > atol:
33
35
  raise ValueError(f'Coefficient is not unitary: {coefficient!r}')
34
36
  self._coefficient = coefficient
35
37
 
36
38
  @property
37
- def coefficient(self) -> 'cirq.TParamValComplex':
39
+ def coefficient(self) -> cirq.TParamValComplex:
38
40
  return self._coefficient
39
41
 
40
42
  def _value_equality_values_(self) -> Any:
@@ -43,19 +45,17 @@ class GlobalPhaseGate(raw_types.Gate):
43
45
  def _has_unitary_(self) -> bool:
44
46
  return not self._is_parameterized_()
45
47
 
46
- def __pow__(self, power) -> 'cirq.GlobalPhaseGate':
48
+ def __pow__(self, power) -> cirq.GlobalPhaseGate:
47
49
  if isinstance(power, (int, float)):
48
50
  return GlobalPhaseGate(self.coefficient**power)
49
51
  return NotImplemented
50
52
 
51
- def _unitary_(self) -> Union[np.ndarray, NotImplementedType]:
53
+ def _unitary_(self) -> np.ndarray | NotImplementedType:
52
54
  if not self._has_unitary_():
53
55
  return NotImplemented
54
56
  return np.array([[self.coefficient]])
55
57
 
56
- def _apply_unitary_(
57
- self, args: 'cirq.ApplyUnitaryArgs'
58
- ) -> Union[np.ndarray, NotImplementedType]:
58
+ def _apply_unitary_(self, args: cirq.ApplyUnitaryArgs) -> np.ndarray | NotImplementedType:
59
59
  if not self._has_unitary_():
60
60
  return NotImplemented
61
61
  assert not cirq.is_parameterized(self)
@@ -71,13 +71,13 @@ class GlobalPhaseGate(raw_types.Gate):
71
71
  def __repr__(self) -> str:
72
72
  return f'cirq.GlobalPhaseGate({proper_repr(self.coefficient)})'
73
73
 
74
- def _op_repr_(self, qubits: Sequence['cirq.Qid']) -> str:
74
+ def _op_repr_(self, qubits: Sequence[cirq.Qid]) -> str:
75
75
  return f'cirq.global_phase_operation({proper_repr(self.coefficient)})'
76
76
 
77
- def _json_dict_(self) -> Dict[str, Any]:
77
+ def _json_dict_(self) -> dict[str, Any]:
78
78
  return protocols.obj_to_dict_helper(self, ['coefficient'])
79
79
 
80
- def _qid_shape_(self) -> Tuple[int, ...]:
80
+ def _qid_shape_(self) -> tuple[int, ...]:
81
81
  return tuple()
82
82
 
83
83
  def _is_parameterized_(self) -> bool:
@@ -87,18 +87,23 @@ class GlobalPhaseGate(raw_types.Gate):
87
87
  return protocols.parameter_names(self.coefficient)
88
88
 
89
89
  def _resolve_parameters_(
90
- self, resolver: 'cirq.ParamResolver', recursive: bool
91
- ) -> 'cirq.GlobalPhaseGate':
90
+ self, resolver: cirq.ParamResolver, recursive: bool
91
+ ) -> cirq.GlobalPhaseGate:
92
92
  coefficient = protocols.resolve_parameters(self.coefficient, resolver, recursive)
93
93
  return GlobalPhaseGate(coefficient=coefficient)
94
94
 
95
+ def is_identity(self) -> bool:
96
+ """Checks if gate is equivalent to an identity.
97
+
98
+ Returns: True if the coefficient is within rounding error of 1.
99
+ """
100
+ return not protocols.is_parameterized(self._coefficient) and np.isclose(self.coefficient, 1)
101
+
95
102
  def controlled(
96
103
  self,
97
- num_controls: Optional[int] = None,
98
- control_values: Optional[
99
- Union[cv.AbstractControlValues, Sequence[Union[int, Collection[int]]]]
100
- ] = None,
101
- control_qid_shape: Optional[Tuple[int, ...]] = None,
104
+ num_controls: int | None = None,
105
+ control_values: cv.AbstractControlValues | Sequence[int | Collection[int]] | None = None,
106
+ control_qid_shape: tuple[int, ...] | None = None,
102
107
  ) -> raw_types.Gate:
103
108
  result = super().controlled(num_controls, control_values, control_qid_shape)
104
109
  if (
@@ -120,7 +125,27 @@ class GlobalPhaseGate(raw_types.Gate):
120
125
 
121
126
 
122
127
  def global_phase_operation(
123
- coefficient: 'cirq.TParamValComplex', atol: float = 1e-8
124
- ) -> 'cirq.GateOperation':
128
+ coefficient: cirq.TParamValComplex, atol: float = 1e-8
129
+ ) -> cirq.GateOperation:
125
130
  """Creates an operation that represents a global phase on the state."""
126
131
  return GlobalPhaseGate(coefficient, atol)()
132
+
133
+
134
+ def from_phase_and_exponent(
135
+ half_turns: cirq.TParamVal, exponent: cirq.TParamVal
136
+ ) -> cirq.GlobalPhaseGate:
137
+ """Creates a GlobalPhaseGate from the global phase and exponent.
138
+
139
+ Args:
140
+ half_turns: The number of half turns to rotate by.
141
+ exponent: The power to raise the phase to.
142
+
143
+ Returns: A `GlobalPhaseGate` with the corresponding coefficient.
144
+ """
145
+ coefficient = 1j ** (2 * half_turns * exponent)
146
+ coefficient = (
147
+ complex(coefficient)
148
+ if isinstance(coefficient, sympy.Expr) and coefficient.is_complex
149
+ else coefficient
150
+ )
151
+ return GlobalPhaseGate(coefficient)
@@ -12,16 +12,21 @@
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 pytest
17
19
  import sympy
18
20
 
19
21
  import cirq
22
+ from cirq.ops import global_phase_op
20
23
 
21
24
 
22
- def test_init():
25
+ def test_init() -> None:
23
26
  op = cirq.global_phase_operation(1j)
24
- assert op.gate.coefficient == 1j
27
+ gate = op.gate
28
+ assert isinstance(gate, cirq.GlobalPhaseGate)
29
+ assert gate.coefficient == 1j
25
30
  assert op.qubits == ()
26
31
  assert op.with_qubits() == op
27
32
  assert cirq.has_stabilizer_effect(op)
@@ -32,7 +37,7 @@ def test_init():
32
37
  _ = cirq.global_phase_operation(1j).with_qubits(cirq.LineQubit(0))
33
38
 
34
39
 
35
- def test_protocols():
40
+ def test_protocols() -> None:
36
41
  for p in [1, 1j, -1, sympy.Symbol('s')]:
37
42
  cirq.testing.assert_implements_consistent_protocols(cirq.global_phase_operation(p))
38
43
 
@@ -42,7 +47,7 @@ def test_protocols():
42
47
 
43
48
 
44
49
  @pytest.mark.parametrize('phase', [1, 1j, -1])
45
- def test_act_on_tableau(phase):
50
+ def test_act_on_tableau(phase) -> None:
46
51
  original_tableau = cirq.CliffordTableau(0)
47
52
  args = cirq.CliffordTableauSimulationState(original_tableau.copy(), np.random.RandomState())
48
53
  cirq.act_on(cirq.global_phase_operation(phase), args, allow_decompose=False)
@@ -50,7 +55,7 @@ def test_act_on_tableau(phase):
50
55
 
51
56
 
52
57
  @pytest.mark.parametrize('phase', [1, 1j, -1])
53
- def test_act_on_ch_form(phase):
58
+ def test_act_on_ch_form(phase) -> None:
54
59
  state = cirq.StabilizerStateChForm(0)
55
60
  args = cirq.StabilizerChFormSimulationState(
56
61
  qubits=[], prng=np.random.RandomState(), initial_state=state
@@ -59,16 +64,16 @@ def test_act_on_ch_form(phase):
59
64
  assert state.state_vector() == [[phase]]
60
65
 
61
66
 
62
- def test_str():
67
+ def test_str() -> None:
63
68
  assert str(cirq.global_phase_operation(1j)) == '1j'
64
69
 
65
70
 
66
- def test_repr():
71
+ def test_repr() -> None:
67
72
  op = cirq.global_phase_operation(1j)
68
73
  cirq.testing.assert_equivalent_repr(op)
69
74
 
70
75
 
71
- def test_diagram():
76
+ def test_diagram() -> None:
72
77
  a, b = cirq.LineQubit.range(2)
73
78
  x, y = cirq.LineQubit.range(10, 12)
74
79
 
@@ -200,7 +205,7 @@ global phase: -0.5π
200
205
  )
201
206
 
202
207
 
203
- def test_gate_init():
208
+ def test_gate_init() -> None:
204
209
  gate = cirq.GlobalPhaseGate(1j)
205
210
  assert gate.coefficient == 1j
206
211
  assert isinstance(gate.on(), cirq.GateOperation)
@@ -213,7 +218,7 @@ def test_gate_init():
213
218
  _ = gate.on(cirq.LineQubit(0))
214
219
 
215
220
 
216
- def test_gate_protocols():
221
+ def test_gate_protocols() -> None:
217
222
  for p in [1, 1j, -1]:
218
223
  cirq.testing.assert_implements_consistent_protocols(cirq.GlobalPhaseGate(p))
219
224
 
@@ -221,7 +226,7 @@ def test_gate_protocols():
221
226
 
222
227
 
223
228
  @pytest.mark.parametrize('phase', [1, 1j, -1])
224
- def test_gate_act_on_tableau(phase):
229
+ def test_gate_act_on_tableau(phase) -> None:
225
230
  original_tableau = cirq.CliffordTableau(0)
226
231
  args = cirq.CliffordTableauSimulationState(original_tableau.copy(), np.random.RandomState())
227
232
  cirq.act_on(cirq.GlobalPhaseGate(phase), args, qubits=(), allow_decompose=False)
@@ -229,7 +234,7 @@ def test_gate_act_on_tableau(phase):
229
234
 
230
235
 
231
236
  @pytest.mark.parametrize('phase', [1, 1j, -1])
232
- def test_gate_act_on_ch_form(phase):
237
+ def test_gate_act_on_ch_form(phase) -> None:
233
238
  state = cirq.StabilizerStateChForm(0)
234
239
  args = cirq.StabilizerChFormSimulationState(
235
240
  qubits=[], prng=np.random.RandomState(), initial_state=state
@@ -238,25 +243,25 @@ def test_gate_act_on_ch_form(phase):
238
243
  assert state.state_vector() == [[phase]]
239
244
 
240
245
 
241
- def test_gate_str():
246
+ def test_gate_str() -> None:
242
247
  assert str(cirq.GlobalPhaseGate(1j)) == '1j'
243
248
 
244
249
 
245
- def test_gate_repr():
250
+ def test_gate_repr() -> None:
246
251
  gate = cirq.GlobalPhaseGate(1j)
247
252
  cirq.testing.assert_equivalent_repr(gate)
248
253
 
249
254
 
250
- def test_gate_op_repr():
255
+ def test_gate_op_repr() -> None:
251
256
  gate = cirq.GlobalPhaseGate(1j)
252
257
  cirq.testing.assert_equivalent_repr(gate.on())
253
258
 
254
259
 
255
- def test_gate_global_phase_op_json_dict():
260
+ def test_gate_global_phase_op_json_dict() -> None:
256
261
  assert cirq.GlobalPhaseGate(-1j)._json_dict_() == {'coefficient': -1j}
257
262
 
258
263
 
259
- def test_parameterization():
264
+ def test_parameterization() -> None:
260
265
  t = sympy.Symbol('t')
261
266
  gpt = cirq.GlobalPhaseGate(coefficient=t)
262
267
  assert cirq.is_parameterized(gpt)
@@ -267,14 +272,14 @@ def test_parameterization():
267
272
 
268
273
 
269
274
  @pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
270
- def test_resolve(resolve_fn):
275
+ def test_resolve(resolve_fn) -> None:
271
276
  t = sympy.Symbol('t')
272
277
  gpt = cirq.GlobalPhaseGate(coefficient=t)
273
278
  assert resolve_fn(gpt, {'t': -1}) == cirq.GlobalPhaseGate(coefficient=-1)
274
279
 
275
280
 
276
281
  @pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
277
- def test_resolve_error(resolve_fn):
282
+ def test_resolve_error(resolve_fn) -> None:
278
283
  t = sympy.Symbol('t')
279
284
  gpt = cirq.GlobalPhaseGate(coefficient=t)
280
285
  with pytest.raises(ValueError, match='Coefficient is not unitary'):
@@ -284,7 +289,7 @@ def test_resolve_error(resolve_fn):
284
289
  @pytest.mark.parametrize(
285
290
  'coeff, exp', [(-1, 1), (1j, 0.5), (-1j, -0.5), (1 / np.sqrt(2) * (1 + 1j), 0.25)]
286
291
  )
287
- def test_global_phase_gate_controlled(coeff, exp):
292
+ def test_global_phase_gate_controlled(coeff, exp) -> None:
288
293
  g = cirq.GlobalPhaseGate(coeff)
289
294
  op = cirq.global_phase_operation(coeff)
290
295
  q = cirq.LineQubit.range(3)
@@ -300,3 +305,22 @@ def test_global_phase_gate_controlled(coeff, exp):
300
305
  assert g.controlled(control_values=xor_control_values) == cirq.ControlledGate(
301
306
  g, control_values=xor_control_values
302
307
  )
308
+
309
+
310
+ def test_is_identity() -> None:
311
+ g = cirq.GlobalPhaseGate(1)
312
+ assert g.is_identity()
313
+ g = cirq.GlobalPhaseGate(1j)
314
+ assert not g.is_identity()
315
+ g = cirq.GlobalPhaseGate(-1)
316
+ assert not g.is_identity()
317
+
318
+
319
+ def test_from_phase_and_exponent() -> None:
320
+ g = global_phase_op.from_phase_and_exponent(2.5, 0.5)
321
+ assert g.coefficient == np.exp(1.25j * np.pi)
322
+ a, b = sympy.symbols('a, b')
323
+ g = global_phase_op.from_phase_and_exponent(a, b)
324
+ assert g.coefficient == 1j ** (2 * a * b)
325
+ g = global_phase_op.from_phase_and_exponent(1 / a, a)
326
+ assert g.coefficient == -1
@@ -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 Iterable, List, Set, TYPE_CHECKING
15
+ from __future__ import annotations
16
+
17
+ from typing import Iterable, TYPE_CHECKING
16
18
 
17
19
  from cirq.ops import named_qubit, qid_util, qubit_manager
18
20
 
@@ -49,25 +51,25 @@ class GreedyQubitManager(qubit_manager.QubitManager):
49
51
  maximize_reuse: Flag to control a FIFO vs LIFO strategy, defaults to False (FIFO).
50
52
  """
51
53
  self._prefix = prefix
52
- self._used_qubits: Set['cirq.Qid'] = set()
53
- self._free_qubits: List['cirq.Qid'] = []
54
+ self._used_qubits: set[cirq.Qid] = set()
55
+ self._free_qubits: list[cirq.Qid] = []
54
56
  self._size = 0
55
57
  self.maximize_reuse = maximize_reuse
56
58
  self.resize(size)
57
59
 
58
- def _allocate_qid(self, name: str, dim: int) -> 'cirq.Qid':
60
+ def _allocate_qid(self, name: str, dim: int) -> cirq.Qid:
59
61
  return qid_util.q(name) if dim == 2 else named_qubit.NamedQid(name, dimension=dim)
60
62
 
61
63
  def resize(self, new_size: int, dim: int = 2) -> None:
62
64
  if new_size <= self._size:
63
65
  return
64
- new_qubits: List['cirq.Qid'] = [
66
+ new_qubits: list[cirq.Qid] = [
65
67
  self._allocate_qid(f'{self._prefix}_{s}', dim) for s in range(self._size, new_size)
66
68
  ]
67
69
  self._free_qubits = new_qubits + self._free_qubits
68
70
  self._size = new_size
69
71
 
70
- def qalloc(self, n: int, dim: int = 2) -> List['cirq.Qid']:
72
+ def qalloc(self, n: int, dim: int = 2) -> list[cirq.Qid]:
71
73
  if not n:
72
74
  return []
73
75
  self.resize(self._size + n - len(self._free_qubits), dim=dim)
@@ -76,11 +78,11 @@ class GreedyQubitManager(qubit_manager.QubitManager):
76
78
  self._used_qubits.update(ret_qubits)
77
79
  return ret_qubits
78
80
 
79
- def qfree(self, qubits: Iterable['cirq.Qid']) -> None:
81
+ def qfree(self, qubits: Iterable[cirq.Qid]) -> None:
80
82
  qs = list(dict(zip(qubits, qubits)).keys())
81
83
  assert self._used_qubits.issuperset(qs), "Only managed qubits currently in-use can be freed"
82
84
  self._used_qubits = self._used_qubits.difference(qs)
83
85
  self._free_qubits.extend(qs)
84
86
 
85
- def qborrow(self, n: int, dim: int = 2) -> List['cirq.Qid']:
87
+ def qborrow(self, n: int, dim: int = 2) -> list[cirq.Qid]:
86
88
  return self.qalloc(n, dim)
@@ -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 cirq
16
18
 
17
19
 
@@ -30,7 +32,7 @@ class GateAllocInDecompose(cirq.Gate):
30
32
  qm.qfree([q])
31
33
 
32
34
 
33
- def test_greedy_qubit_manager():
35
+ def test_greedy_qubit_manager() -> None:
34
36
  def make_circuit(qm: cirq.QubitManager):
35
37
  q = cirq.LineQubit.range(2)
36
38
  g = GateAllocInDecompose(1)
@@ -90,12 +92,12 @@ ancilla_1: ───X───X───
90
92
  )
91
93
 
92
94
 
93
- def test_empty_qubits():
95
+ def test_empty_qubits() -> None:
94
96
  qm = cirq.GreedyQubitManager(prefix="anc")
95
97
  assert qm.qalloc(0) == []
96
98
 
97
99
 
98
- def test_greedy_qubit_manager_preserves_order():
100
+ def test_greedy_qubit_manager_preserves_order() -> None:
99
101
  qm = cirq.GreedyQubitManager(prefix="anc")
100
102
  ancillae = [cirq.q(f"anc_{i}") for i in range(100)]
101
103
  assert qm.qalloc(100) == ancillae