cirq-core 1.4.0.dev20240529225110__py3-none-any.whl → 1.5.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 (590) hide show
  1. cirq/__init__.py +587 -569
  2. cirq/_compat.py +9 -0
  3. cirq/_compat_test.py +11 -9
  4. cirq/_import.py +7 -8
  5. cirq/_version.py +31 -1
  6. cirq/_version_test.py +1 -1
  7. cirq/circuits/__init__.py +15 -9
  8. cirq/circuits/_block_diagram_drawer.py +1 -2
  9. cirq/circuits/_block_diagram_drawer_test.py +3 -3
  10. cirq/circuits/_box_drawing_character_data.py +0 -1
  11. cirq/circuits/_box_drawing_character_data_test.py +2 -2
  12. cirq/circuits/_bucket_priority_queue.py +0 -1
  13. cirq/circuits/_bucket_priority_queue_test.py +1 -1
  14. cirq/circuits/circuit.py +336 -234
  15. cirq/circuits/circuit_operation.py +102 -52
  16. cirq/circuits/circuit_operation_test.py +85 -4
  17. cirq/circuits/circuit_test.py +101 -32
  18. cirq/circuits/frozen_circuit.py +36 -32
  19. cirq/circuits/insert_strategy.py +10 -0
  20. cirq/circuits/insert_strategy_test.py +20 -0
  21. cirq/circuits/moment.py +79 -80
  22. cirq/circuits/moment_test.py +105 -2
  23. cirq/circuits/optimization_pass.py +15 -15
  24. cirq/circuits/optimization_pass_test.py +8 -9
  25. cirq/circuits/qasm_output.py +64 -33
  26. cirq/circuits/qasm_output_test.py +63 -2
  27. cirq/circuits/text_diagram_drawer.py +26 -56
  28. cirq/circuits/text_diagram_drawer_test.py +5 -4
  29. cirq/contrib/__init__.py +2 -2
  30. cirq/contrib/acquaintance/__init__.py +44 -29
  31. cirq/contrib/acquaintance/bipartite.py +8 -7
  32. cirq/contrib/acquaintance/bipartite_test.py +11 -1
  33. cirq/contrib/acquaintance/devices.py +5 -4
  34. cirq/contrib/acquaintance/devices_test.py +5 -1
  35. cirq/contrib/acquaintance/executor.py +18 -21
  36. cirq/contrib/acquaintance/executor_test.py +3 -2
  37. cirq/contrib/acquaintance/gates.py +36 -27
  38. cirq/contrib/acquaintance/gates_test.py +1 -1
  39. cirq/contrib/acquaintance/inspection_utils.py +10 -9
  40. cirq/contrib/acquaintance/inspection_utils_test.py +6 -1
  41. cirq/contrib/acquaintance/mutation_utils.py +10 -10
  42. cirq/contrib/acquaintance/optimizers.py +7 -6
  43. cirq/contrib/acquaintance/optimizers_test.py +1 -1
  44. cirq/contrib/acquaintance/permutation.py +22 -21
  45. cirq/contrib/acquaintance/permutation_test.py +1 -1
  46. cirq/contrib/acquaintance/shift.py +8 -6
  47. cirq/contrib/acquaintance/shift_swap_network.py +6 -4
  48. cirq/contrib/acquaintance/strategies/__init__.py +9 -3
  49. cirq/contrib/acquaintance/strategies/complete.py +4 -3
  50. cirq/contrib/acquaintance/strategies/cubic.py +5 -3
  51. cirq/contrib/acquaintance/strategies/quartic_paired.py +8 -6
  52. cirq/contrib/acquaintance/topological_sort.py +4 -2
  53. cirq/contrib/bayesian_network/__init__.py +3 -1
  54. cirq/contrib/bayesian_network/bayesian_network_gate.py +5 -3
  55. cirq/contrib/circuitdag/__init__.py +1 -1
  56. cirq/contrib/circuitdag/circuit_dag.py +24 -24
  57. cirq/contrib/circuitdag/circuit_dag_test.py +1 -1
  58. cirq/contrib/custom_simulators/custom_state_simulator.py +10 -8
  59. cirq/contrib/custom_simulators/custom_state_simulator_test.py +15 -11
  60. cirq/contrib/graph_device/__init__.py +8 -8
  61. cirq/contrib/graph_device/graph_device.py +8 -8
  62. cirq/contrib/graph_device/graph_device_test.py +0 -1
  63. cirq/contrib/graph_device/hypergraph_test.py +1 -0
  64. cirq/contrib/json.py +1 -2
  65. cirq/contrib/json_test.py +2 -2
  66. cirq/contrib/noise_models/__init__.py +5 -6
  67. cirq/contrib/noise_models/noise_models.py +8 -6
  68. cirq/contrib/paulistring/__init__.py +22 -10
  69. cirq/contrib/paulistring/clifford_optimize.py +1 -1
  70. cirq/contrib/paulistring/clifford_optimize_test.py +0 -1
  71. cirq/contrib/paulistring/clifford_target_gateset.py +15 -12
  72. cirq/contrib/paulistring/optimize.py +2 -2
  73. cirq/contrib/paulistring/optimize_test.py +0 -1
  74. cirq/contrib/paulistring/pauli_string_dag_test.py +0 -1
  75. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +379 -0
  76. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +523 -0
  77. cirq/contrib/paulistring/pauli_string_optimize.py +3 -1
  78. cirq/contrib/paulistring/pauli_string_optimize_test.py +1 -3
  79. cirq/contrib/paulistring/recombine.py +2 -2
  80. cirq/contrib/paulistring/recombine_test.py +2 -2
  81. cirq/contrib/paulistring/separate.py +3 -4
  82. cirq/contrib/qasm_import/__init__.py +2 -2
  83. cirq/contrib/qasm_import/_lexer.py +21 -26
  84. cirq/contrib/qasm_import/_lexer_test.py +90 -6
  85. cirq/contrib/qasm_import/_parser.py +238 -47
  86. cirq/contrib/qasm_import/_parser_test.py +514 -59
  87. cirq/contrib/qasm_import/qasm_test.py +1 -1
  88. cirq/contrib/qcircuit/__init__.py +6 -4
  89. cirq/contrib/qcircuit/qcircuit_diagram.py +5 -2
  90. cirq/contrib/qcircuit/qcircuit_pdf.py +1 -2
  91. cirq/{experiments/grid_parallel_two_qubit_xeb_test.py → contrib/qcircuit/qcircuit_pdf_test.py} +13 -12
  92. cirq/contrib/qcircuit/qcircuit_test.py +1 -1
  93. cirq/contrib/quantum_volume/__init__.py +7 -7
  94. cirq/contrib/quantum_volume/quantum_volume.py +6 -11
  95. cirq/contrib/quantum_volume/quantum_volume_test.py +3 -1
  96. cirq/contrib/quimb/__init__.py +16 -13
  97. cirq/contrib/quimb/density_matrix.py +1 -1
  98. cirq/contrib/quimb/mps_simulator.py +27 -28
  99. cirq/contrib/quimb/mps_simulator_test.py +5 -0
  100. cirq/contrib/quimb/state_vector.py +3 -10
  101. cirq/contrib/quirk/__init__.py +1 -1
  102. cirq/contrib/quirk/export_to_quirk.py +3 -3
  103. cirq/contrib/routing/__init__.py +12 -9
  104. cirq/contrib/routing/device.py +1 -1
  105. cirq/contrib/routing/device_test.py +1 -2
  106. cirq/contrib/routing/greedy.py +7 -5
  107. cirq/contrib/routing/greedy_test.py +5 -3
  108. cirq/contrib/routing/initialization.py +3 -1
  109. cirq/contrib/routing/initialization_test.py +1 -1
  110. cirq/contrib/routing/swap_network.py +6 -6
  111. cirq/contrib/routing/utils.py +6 -4
  112. cirq/contrib/routing/utils_test.py +1 -2
  113. cirq/{type_workarounds.py → contrib/shuffle_circuits/__init__.py} +5 -10
  114. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +250 -0
  115. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +363 -0
  116. cirq/contrib/svg/__init__.py +1 -1
  117. cirq/contrib/svg/svg.py +12 -10
  118. cirq/contrib/svg/svg_test.py +3 -2
  119. cirq/devices/__init__.py +34 -25
  120. cirq/devices/device.py +16 -12
  121. cirq/devices/device_test.py +1 -0
  122. cirq/devices/grid_device_metadata.py +16 -12
  123. cirq/devices/grid_device_metadata_test.py +2 -1
  124. cirq/devices/grid_qubit.py +31 -26
  125. cirq/devices/grid_qubit_test.py +30 -1
  126. cirq/devices/insertion_noise_model.py +6 -6
  127. cirq/devices/insertion_noise_model_test.py +1 -1
  128. cirq/devices/line_qubit.py +28 -20
  129. cirq/devices/line_qubit_test.py +26 -0
  130. cirq/devices/named_topologies.py +12 -10
  131. cirq/devices/named_topologies_test.py +5 -4
  132. cirq/devices/noise_model.py +29 -33
  133. cirq/devices/noise_properties.py +2 -2
  134. cirq/devices/noise_properties_test.py +2 -2
  135. cirq/devices/noise_utils.py +3 -3
  136. cirq/devices/superconducting_qubits_noise_properties.py +2 -2
  137. cirq/devices/superconducting_qubits_noise_properties_test.py +3 -3
  138. cirq/devices/thermal_noise_model.py +2 -1
  139. cirq/devices/unconstrained_device.py +1 -1
  140. cirq/devices/unconstrained_device_test.py +6 -0
  141. cirq/experiments/__init__.py +51 -34
  142. cirq/experiments/qubit_characterizations.py +17 -15
  143. cirq/experiments/qubit_characterizations_test.py +4 -6
  144. cirq/experiments/random_quantum_circuit_generation.py +10 -9
  145. cirq/experiments/random_quantum_circuit_generation_test.py +21 -4
  146. cirq/experiments/readout_confusion_matrix.py +73 -8
  147. cirq/experiments/readout_confusion_matrix_test.py +104 -1
  148. cirq/experiments/single_qubit_readout_calibration.py +8 -6
  149. cirq/experiments/single_qubit_readout_calibration_test.py +1 -1
  150. cirq/experiments/t1_decay_experiment.py +4 -5
  151. cirq/experiments/t1_decay_experiment_test.py +1 -2
  152. cirq/experiments/t2_decay_experiment.py +0 -1
  153. cirq/experiments/t2_decay_experiment_test.py +1 -2
  154. cirq/experiments/two_qubit_xeb.py +157 -33
  155. cirq/experiments/two_qubit_xeb_test.py +38 -22
  156. cirq/experiments/xeb_fitting.py +99 -19
  157. cirq/experiments/xeb_fitting_test.py +64 -25
  158. cirq/experiments/xeb_sampling.py +14 -18
  159. cirq/experiments/xeb_simulation.py +4 -3
  160. cirq/experiments/xeb_simulation_test.py +20 -14
  161. cirq/experiments/z_phase_calibration.py +368 -0
  162. cirq/experiments/z_phase_calibration_test.py +241 -0
  163. cirq/interop/__init__.py +4 -1
  164. cirq/interop/quirk/__init__.py +7 -4
  165. cirq/interop/quirk/cells/__init__.py +17 -6
  166. cirq/interop/quirk/cells/arithmetic_cells.py +8 -8
  167. cirq/interop/quirk/cells/arithmetic_cells_test.py +1 -1
  168. cirq/interop/quirk/cells/cell.py +6 -6
  169. cirq/interop/quirk/cells/composite_cell.py +5 -5
  170. cirq/interop/quirk/cells/composite_cell_test.py +1 -1
  171. cirq/interop/quirk/cells/control_cells.py +1 -1
  172. cirq/interop/quirk/cells/frequency_space_cells.py +2 -2
  173. cirq/interop/quirk/cells/ignored_cells.py +1 -1
  174. cirq/interop/quirk/cells/input_cells.py +1 -1
  175. cirq/interop/quirk/cells/input_cells_test.py +1 -1
  176. cirq/interop/quirk/cells/input_rotation_cells.py +1 -1
  177. cirq/interop/quirk/cells/input_rotation_cells_test.py +1 -1
  178. cirq/interop/quirk/cells/measurement_cells.py +1 -1
  179. cirq/interop/quirk/cells/parse.py +8 -7
  180. cirq/interop/quirk/cells/parse_test.py +2 -2
  181. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +1 -1
  182. cirq/interop/quirk/cells/swap_cell_test.py +1 -1
  183. cirq/interop/quirk/cells/unsupported_cells.py +1 -1
  184. cirq/interop/quirk/url_to_circuit.py +7 -7
  185. cirq/interop/quirk/url_to_circuit_test.py +1 -1
  186. cirq/ion/__init__.py +4 -2
  187. cirq/json_resolver_cache.py +15 -7
  188. cirq/linalg/__init__.py +62 -51
  189. cirq/linalg/combinators.py +4 -4
  190. cirq/linalg/combinators_test.py +4 -1
  191. cirq/linalg/decompositions.py +15 -40
  192. cirq/linalg/decompositions_test.py +16 -22
  193. cirq/linalg/diagonalize.py +1 -1
  194. cirq/linalg/diagonalize_test.py +1 -1
  195. cirq/linalg/operator_spaces.py +20 -4
  196. cirq/linalg/operator_spaces_test.py +15 -2
  197. cirq/linalg/predicates.py +3 -3
  198. cirq/linalg/predicates_test.py +1 -0
  199. cirq/linalg/tolerance.py +2 -2
  200. cirq/linalg/transformations.py +30 -12
  201. cirq/linalg/transformations_test.py +13 -0
  202. cirq/neutral_atoms/__init__.py +2 -2
  203. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +0 -1
  204. cirq/ops/__init__.py +172 -132
  205. cirq/ops/arithmetic_operation.py +2 -2
  206. cirq/ops/arithmetic_operation_test.py +2 -2
  207. cirq/ops/boolean_hamiltonian.py +3 -2
  208. cirq/ops/classically_controlled_operation.py +39 -12
  209. cirq/ops/classically_controlled_operation_test.py +147 -1
  210. cirq/ops/clifford_gate.py +38 -36
  211. cirq/ops/clifford_gate_test.py +75 -1
  212. cirq/ops/common_channels.py +16 -45
  213. cirq/ops/common_channels_test.py +10 -0
  214. cirq/ops/common_gate_families.py +1 -1
  215. cirq/ops/common_gate_families_test.py +1 -0
  216. cirq/ops/common_gates.py +48 -49
  217. cirq/ops/common_gates_test.py +18 -2
  218. cirq/ops/control_values.py +3 -3
  219. cirq/ops/control_values_test.py +2 -1
  220. cirq/ops/controlled_gate.py +36 -23
  221. cirq/ops/controlled_gate_test.py +70 -3
  222. cirq/ops/controlled_operation.py +6 -5
  223. cirq/ops/controlled_operation_test.py +7 -3
  224. cirq/ops/dense_pauli_string.py +11 -11
  225. cirq/ops/diagonal_gate.py +2 -2
  226. cirq/ops/diagonal_gate_test.py +1 -0
  227. cirq/ops/eigen_gate.py +16 -36
  228. cirq/ops/eigen_gate_test.py +60 -10
  229. cirq/ops/fourier_transform.py +1 -3
  230. cirq/ops/fourier_transform_test.py +2 -1
  231. cirq/ops/fsim_gate.py +42 -3
  232. cirq/ops/fsim_gate_test.py +21 -0
  233. cirq/ops/gate_operation.py +8 -8
  234. cirq/ops/gate_operation_test.py +4 -2
  235. cirq/ops/gateset_test.py +11 -2
  236. cirq/ops/global_phase_op.py +8 -7
  237. cirq/ops/global_phase_op_test.py +1 -1
  238. cirq/ops/greedy_qubit_manager_test.py +5 -0
  239. cirq/ops/identity.py +14 -4
  240. cirq/ops/identity_test.py +24 -0
  241. cirq/ops/kraus_channel.py +1 -0
  242. cirq/ops/kraus_channel_test.py +3 -1
  243. cirq/ops/linear_combinations.py +27 -21
  244. cirq/ops/linear_combinations_test.py +23 -4
  245. cirq/ops/matrix_gates.py +24 -8
  246. cirq/ops/measure_util.py +2 -2
  247. cirq/ops/measurement_gate.py +7 -4
  248. cirq/ops/measurement_gate_test.py +2 -1
  249. cirq/ops/mixed_unitary_channel.py +1 -0
  250. cirq/ops/mixed_unitary_channel_test.py +3 -1
  251. cirq/ops/named_qubit.py +8 -1
  252. cirq/ops/op_tree.py +3 -30
  253. cirq/ops/op_tree_test.py +4 -0
  254. cirq/ops/parallel_gate.py +2 -3
  255. cirq/ops/parallel_gate_test.py +2 -1
  256. cirq/ops/parity_gates.py +7 -8
  257. cirq/ops/parity_gates_test.py +1 -0
  258. cirq/ops/pauli_gates.py +5 -11
  259. cirq/ops/pauli_gates_test.py +1 -0
  260. cirq/ops/pauli_interaction_gate.py +11 -5
  261. cirq/ops/pauli_interaction_gate_test.py +2 -3
  262. cirq/ops/pauli_measurement_gate.py +6 -5
  263. cirq/ops/pauli_measurement_gate_test.py +1 -0
  264. cirq/ops/pauli_string.py +115 -130
  265. cirq/ops/pauli_string_phasor.py +21 -20
  266. cirq/ops/pauli_string_phasor_test.py +13 -3
  267. cirq/ops/pauli_string_raw_types.py +1 -0
  268. cirq/ops/pauli_string_test.py +192 -55
  269. cirq/ops/pauli_sum_exponential.py +3 -4
  270. cirq/ops/pauli_sum_exponential_test.py +0 -1
  271. cirq/ops/permutation_gate.py +2 -2
  272. cirq/ops/permutation_gate_test.py +1 -1
  273. cirq/ops/phased_iswap_gate.py +6 -7
  274. cirq/ops/phased_iswap_gate_test.py +21 -5
  275. cirq/ops/phased_x_gate.py +11 -25
  276. cirq/ops/phased_x_gate_test.py +19 -3
  277. cirq/ops/phased_x_z_gate.py +12 -11
  278. cirq/ops/projector.py +4 -5
  279. cirq/ops/qubit_manager.py +2 -1
  280. cirq/ops/qubit_manager_test.py +2 -1
  281. cirq/ops/qubit_order.py +1 -1
  282. cirq/ops/random_gate_channel.py +1 -1
  283. cirq/ops/random_gate_channel_test.py +0 -6
  284. cirq/ops/raw_types.py +146 -50
  285. cirq/ops/raw_types_test.py +37 -3
  286. cirq/ops/state_preparation_channel.py +2 -2
  287. cirq/ops/state_preparation_channel_test.py +2 -1
  288. cirq/ops/swap_gates.py +9 -4
  289. cirq/ops/three_qubit_gates.py +8 -8
  290. cirq/ops/three_qubit_gates_test.py +1 -0
  291. cirq/ops/two_qubit_diagonal_gate.py +4 -3
  292. cirq/ops/uniform_superposition_gate.py +4 -4
  293. cirq/ops/uniform_superposition_gate_test.py +1 -0
  294. cirq/ops/wait_gate.py +6 -8
  295. cirq/protocols/__init__.py +135 -83
  296. cirq/protocols/act_on_protocol.py +1 -1
  297. cirq/protocols/act_on_protocol_test.py +1 -1
  298. cirq/protocols/apply_channel_protocol.py +3 -3
  299. cirq/protocols/apply_mixture_protocol.py +15 -9
  300. cirq/protocols/apply_mixture_protocol_test.py +11 -0
  301. cirq/protocols/apply_unitary_protocol.py +2 -2
  302. cirq/protocols/apply_unitary_protocol_test.py +2 -1
  303. cirq/protocols/approximate_equality_protocol.py +7 -8
  304. cirq/protocols/approximate_equality_protocol_test.py +3 -1
  305. cirq/protocols/circuit_diagram_info_protocol.py +8 -6
  306. cirq/protocols/circuit_diagram_info_protocol_test.py +5 -0
  307. cirq/protocols/commutes_protocol.py +6 -6
  308. cirq/protocols/control_key_protocol.py +1 -1
  309. cirq/protocols/decompose_protocol.py +4 -5
  310. cirq/protocols/decompose_protocol_test.py +2 -1
  311. cirq/protocols/equal_up_to_global_phase_protocol.py +3 -3
  312. cirq/protocols/equal_up_to_global_phase_protocol_test.py +7 -0
  313. cirq/protocols/has_stabilizer_effect_protocol.py +5 -5
  314. cirq/protocols/has_unitary_protocol.py +1 -1
  315. cirq/protocols/has_unitary_protocol_test.py +8 -7
  316. cirq/protocols/hash_from_pickle_test.py +120 -0
  317. cirq/protocols/inverse_protocol.py +1 -1
  318. cirq/protocols/json_serialization.py +14 -1
  319. cirq/protocols/json_serialization_test.py +28 -7
  320. cirq/protocols/json_test_data/BitMaskKeyCondition.json +86 -0
  321. cirq/protocols/json_test_data/BitMaskKeyCondition.repr +7 -0
  322. cirq/protocols/json_test_data/Concat.json +19 -0
  323. cirq/protocols/json_test_data/Concat.repr +1 -0
  324. cirq/protocols/json_test_data/README.md +4 -2
  325. cirq/protocols/json_test_data/SympyCondition.json +60 -15
  326. cirq/protocols/json_test_data/SympyCondition.repr +4 -1
  327. cirq/protocols/json_test_data/_InverseCompositeGate.json +10 -0
  328. cirq/protocols/json_test_data/_InverseCompositeGate.repr +1 -0
  329. cirq/protocols/json_test_data/__init__.py +1 -1
  330. cirq/protocols/json_test_data/sympy.And.json +13 -0
  331. cirq/protocols/json_test_data/sympy.And.repr +1 -0
  332. cirq/protocols/json_test_data/sympy.Indexed.json +18 -0
  333. cirq/protocols/json_test_data/sympy.Indexed.repr +1 -0
  334. cirq/protocols/json_test_data/sympy.IndexedBase.json +9 -0
  335. cirq/protocols/json_test_data/sympy.IndexedBase.repr +1 -0
  336. cirq/protocols/json_test_data/sympy.Not.json +9 -0
  337. cirq/protocols/json_test_data/sympy.Not.repr +1 -0
  338. cirq/protocols/json_test_data/sympy.Or.json +13 -0
  339. cirq/protocols/json_test_data/sympy.Or.repr +1 -0
  340. cirq/protocols/json_test_data/sympy.Xor.json +13 -0
  341. cirq/protocols/json_test_data/sympy.Xor.repr +1 -0
  342. cirq/protocols/kraus_protocol.py +8 -8
  343. cirq/protocols/kraus_protocol_test.py +0 -1
  344. cirq/protocols/measurement_key_protocol.py +1 -1
  345. cirq/protocols/measurement_key_protocol_test.py +7 -7
  346. cirq/protocols/mixture_protocol.py +6 -4
  347. cirq/protocols/mixture_protocol_test.py +21 -13
  348. cirq/protocols/pauli_expansion_protocol.py +1 -0
  349. cirq/protocols/pow_protocol.py +1 -1
  350. cirq/protocols/qasm.py +25 -6
  351. cirq/protocols/qasm_test.py +17 -0
  352. cirq/protocols/qid_shape_protocol.py +2 -2
  353. cirq/protocols/resolve_parameters.py +2 -3
  354. cirq/protocols/resolve_parameters_test.py +2 -1
  355. cirq/protocols/trace_distance_bound.py +1 -1
  356. cirq/protocols/trace_distance_bound_test.py +1 -0
  357. cirq/protocols/unitary_protocol.py +3 -3
  358. cirq/protocols/unitary_protocol_test.py +1 -1
  359. cirq/qis/__init__.py +48 -35
  360. cirq/qis/channels_test.py +0 -9
  361. cirq/qis/clifford_tableau.py +46 -26
  362. cirq/qis/clifford_tableau_test.py +2 -1
  363. cirq/qis/entropy.py +115 -0
  364. cirq/qis/entropy_test.py +43 -0
  365. cirq/qis/measures.py +5 -4
  366. cirq/qis/measures_test.py +7 -0
  367. cirq/qis/noise_utils_test.py +4 -4
  368. cirq/qis/quantum_state_representation.py +1 -1
  369. cirq/qis/states.py +7 -7
  370. cirq/sim/__init__.py +55 -37
  371. cirq/sim/classical_simulator.py +7 -6
  372. cirq/sim/classical_simulator_test.py +3 -1
  373. cirq/sim/clifford/__init__.py +17 -9
  374. cirq/sim/clifford/clifford_simulator.py +5 -4
  375. cirq/sim/clifford/clifford_simulator_test.py +32 -9
  376. cirq/sim/clifford/clifford_tableau_simulation_state.py +1 -1
  377. cirq/sim/clifford/stabilizer_simulation_state.py +1 -1
  378. cirq/sim/clifford/stabilizer_state_ch_form.py +4 -3
  379. cirq/sim/density_matrix_simulator.py +3 -2
  380. cirq/sim/density_matrix_simulator_test.py +12 -4
  381. cirq/sim/density_matrix_utils.py +1 -1
  382. cirq/sim/mux.py +2 -2
  383. cirq/sim/simulation_state.py +4 -5
  384. cirq/sim/simulation_state_base.py +2 -2
  385. cirq/sim/simulation_state_test.py +1 -1
  386. cirq/sim/simulation_utils.py +3 -1
  387. cirq/sim/simulation_utils_test.py +2 -3
  388. cirq/sim/simulator.py +7 -6
  389. cirq/sim/simulator_base.py +5 -5
  390. cirq/sim/simulator_test.py +14 -3
  391. cirq/sim/sparse_simulator.py +4 -3
  392. cirq/sim/sparse_simulator_test.py +17 -9
  393. cirq/sim/state_vector.py +2 -2
  394. cirq/sim/state_vector_simulation_state_test.py +1 -1
  395. cirq/sim/state_vector_simulator.py +4 -4
  396. cirq/sim/state_vector_test.py +27 -32
  397. cirq/study/__init__.py +27 -21
  398. cirq/study/flatten_expressions.py +5 -6
  399. cirq/study/flatten_expressions_test.py +1 -1
  400. cirq/study/resolver.py +14 -11
  401. cirq/study/resolver_test.py +10 -1
  402. cirq/study/result.py +3 -3
  403. cirq/study/sweepable.py +15 -9
  404. cirq/study/sweepable_test.py +27 -0
  405. cirq/study/sweeps.py +65 -10
  406. cirq/study/sweeps_test.py +123 -0
  407. cirq/testing/__init__.py +86 -57
  408. cirq/testing/_compat_test_data/module_a/__init__.py +2 -2
  409. cirq/testing/_compat_test_data/module_a/sub/subsub/__init__.py +1 -1
  410. cirq/testing/circuit_compare.py +3 -4
  411. cirq/testing/circuit_compare_test.py +7 -8
  412. cirq/testing/consistent_act_on.py +3 -3
  413. cirq/testing/consistent_channels_test.py +2 -1
  414. cirq/testing/consistent_controlled_gate_op.py +3 -2
  415. cirq/testing/consistent_controlled_gate_op_test.py +2 -3
  416. cirq/testing/consistent_decomposition.py +1 -1
  417. cirq/testing/consistent_decomposition_test.py +1 -2
  418. cirq/testing/consistent_pauli_expansion_test.py +1 -1
  419. cirq/testing/consistent_phase_by.py +1 -1
  420. cirq/testing/consistent_phase_by_test.py +1 -2
  421. cirq/testing/consistent_protocols.py +11 -11
  422. cirq/testing/consistent_protocols_test.py +4 -5
  423. cirq/testing/consistent_qasm.py +8 -12
  424. cirq/testing/consistent_qasm_test.py +1 -1
  425. cirq/testing/consistent_resolve_parameters.py +2 -1
  426. cirq/testing/consistent_specified_has_unitary_test.py +1 -1
  427. cirq/testing/consistent_unitary.py +3 -1
  428. cirq/testing/consistent_unitary_test.py +3 -3
  429. cirq/testing/devices.py +1 -1
  430. cirq/testing/devices_test.py +1 -0
  431. cirq/testing/equals_tester.py +2 -4
  432. cirq/testing/equals_tester_test.py +6 -5
  433. cirq/testing/equivalent_basis_map.py +1 -0
  434. cirq/testing/equivalent_basis_map_test.py +0 -1
  435. cirq/testing/gate_features_test.py +5 -0
  436. cirq/testing/json.py +4 -4
  437. cirq/testing/lin_alg_utils_test.py +1 -1
  438. cirq/testing/order_tester.py +1 -1
  439. cirq/testing/order_tester_test.py +1 -1
  440. cirq/testing/pytest_utils.py +57 -0
  441. cirq/testing/pytest_utils_test.py +35 -0
  442. cirq/testing/random_circuit.py +2 -2
  443. cirq/testing/random_circuit_test.py +2 -2
  444. cirq/testing/routing_devices_test.py +2 -1
  445. cirq/testing/sample_circuits.py +1 -1
  446. cirq/testing/sample_gates.py +5 -4
  447. cirq/testing/sample_gates_test.py +2 -2
  448. cirq/transformers/__init__.py +101 -82
  449. cirq/transformers/align.py +12 -1
  450. cirq/transformers/align_test.py +13 -0
  451. cirq/transformers/analytical_decompositions/__init__.py +27 -24
  452. cirq/transformers/analytical_decompositions/clifford_decomposition.py +2 -1
  453. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +1 -1
  454. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +1 -1
  455. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  456. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +1 -1
  457. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +1 -1
  458. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +2 -2
  459. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +4 -4
  460. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +99 -24
  461. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +105 -14
  462. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +1 -1
  463. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +1 -1
  464. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +1 -0
  465. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +3 -4
  466. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +1 -1
  467. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +2 -1
  468. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -1
  469. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +5 -6
  470. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +2 -2
  471. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +1 -1
  472. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +1 -2
  473. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +2 -2
  474. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +2 -2
  475. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -1
  476. cirq/transformers/drop_empty_moments.py +1 -0
  477. cirq/transformers/drop_negligible_operations.py +1 -0
  478. cirq/transformers/dynamical_decoupling.py +255 -43
  479. cirq/transformers/dynamical_decoupling_test.py +730 -17
  480. cirq/transformers/eject_phased_paulis.py +29 -15
  481. cirq/transformers/eject_phased_paulis_test.py +3 -8
  482. cirq/transformers/eject_z.py +3 -2
  483. cirq/transformers/eject_z_test.py +3 -3
  484. cirq/transformers/gauge_compiling/__init__.py +25 -9
  485. cirq/transformers/gauge_compiling/cphase_gauge.py +146 -0
  486. cirq/transformers/gauge_compiling/cphase_gauge_test.py +42 -0
  487. cirq/transformers/gauge_compiling/cz_gauge.py +4 -4
  488. cirq/transformers/gauge_compiling/gauge_compiling.py +245 -6
  489. cirq/transformers/gauge_compiling/gauge_compiling_test.py +107 -2
  490. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +39 -2
  491. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +10 -1
  492. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -2
  493. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -2
  494. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +23 -5
  495. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +3 -2
  496. cirq/transformers/heuristic_decompositions/__init__.py +3 -3
  497. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +2 -1
  498. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +1 -1
  499. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +4 -4
  500. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +4 -4
  501. cirq/transformers/insertion_sort.py +64 -0
  502. cirq/transformers/insertion_sort_test.py +34 -0
  503. cirq/transformers/measurement_transformers.py +14 -1
  504. cirq/transformers/measurement_transformers_test.py +35 -0
  505. cirq/transformers/merge_k_qubit_gates.py +2 -2
  506. cirq/transformers/merge_single_qubit_gates.py +1 -1
  507. cirq/transformers/merge_single_qubit_gates_test.py +1 -1
  508. cirq/transformers/noise_adding.py +115 -0
  509. cirq/transformers/noise_adding_test.py +54 -0
  510. cirq/transformers/optimize_for_target_gateset.py +1 -1
  511. cirq/transformers/optimize_for_target_gateset_test.py +3 -2
  512. cirq/transformers/qubit_management_transformers.py +1 -1
  513. cirq/transformers/randomized_measurements.py +171 -0
  514. cirq/transformers/randomized_measurements_test.py +68 -0
  515. cirq/transformers/routing/__init__.py +14 -5
  516. cirq/transformers/routing/initial_mapper.py +1 -1
  517. cirq/transformers/routing/initial_mapper_test.py +1 -0
  518. cirq/transformers/routing/line_initial_mapper.py +3 -2
  519. cirq/transformers/routing/mapping_manager.py +2 -2
  520. cirq/transformers/routing/mapping_manager_test.py +2 -2
  521. cirq/transformers/routing/route_circuit_cqc.py +3 -2
  522. cirq/transformers/routing/route_circuit_cqc_test.py +2 -1
  523. cirq/transformers/routing/visualize_routed_circuit.py +1 -0
  524. cirq/transformers/routing/visualize_routed_circuit_test.py +1 -0
  525. cirq/transformers/stratify.py +2 -2
  526. cirq/transformers/synchronize_terminal_measurements.py +2 -1
  527. cirq/transformers/target_gatesets/__init__.py +7 -5
  528. cirq/transformers/target_gatesets/compilation_target_gateset.py +16 -3
  529. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +2 -0
  530. cirq/transformers/target_gatesets/cz_gateset.py +5 -1
  531. cirq/transformers/target_gatesets/cz_gateset_test.py +23 -2
  532. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +1 -1
  533. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +3 -2
  534. cirq/transformers/transformer_api.py +5 -4
  535. cirq/transformers/transformer_api_test.py +11 -3
  536. cirq/transformers/transformer_primitives.py +9 -31
  537. cirq/transformers/transformer_primitives_test.py +6 -5
  538. cirq/value/__init__.py +51 -30
  539. cirq/value/abc_alt.py +1 -2
  540. cirq/value/angle.py +2 -0
  541. cirq/value/classical_data.py +1 -0
  542. cirq/value/condition.py +149 -3
  543. cirq/value/condition_test.py +254 -0
  544. cirq/value/digits.py +1 -1
  545. cirq/value/duration.py +4 -4
  546. cirq/value/duration_test.py +2 -1
  547. cirq/value/linear_dict.py +85 -24
  548. cirq/value/linear_dict_test.py +94 -3
  549. cirq/value/measurement_key.py +9 -2
  550. cirq/value/periodic_value.py +2 -3
  551. cirq/value/periodic_value_test.py +5 -0
  552. cirq/value/probability.py +1 -0
  553. cirq/value/random_state.py +1 -1
  554. cirq/value/timestamp.py +2 -4
  555. cirq/value/timestamp_test.py +2 -1
  556. cirq/value/type_alias.py +2 -2
  557. cirq/value/value_equality_attr.py +14 -2
  558. cirq/value/value_equality_attr_test.py +1 -1
  559. cirq/vis/__init__.py +9 -6
  560. cirq/vis/density_matrix.py +1 -1
  561. cirq/vis/density_matrix_test.py +2 -5
  562. cirq/vis/heatmap.py +49 -12
  563. cirq/vis/heatmap_test.py +168 -4
  564. cirq/vis/histogram.py +1 -1
  565. cirq/vis/histogram_test.py +1 -2
  566. cirq/vis/state_histogram.py +7 -5
  567. cirq/vis/state_histogram_test.py +2 -2
  568. cirq/work/__init__.py +19 -13
  569. cirq/work/collector.py +2 -2
  570. cirq/work/observable_grouping.py +2 -2
  571. cirq/work/observable_measurement.py +3 -3
  572. cirq/work/observable_measurement_data.py +5 -2
  573. cirq/work/observable_measurement_test.py +8 -8
  574. cirq/work/observable_readout_calibration.py +2 -2
  575. cirq/work/observable_readout_calibration_test.py +2 -1
  576. cirq/work/observable_settings.py +8 -7
  577. cirq/work/observable_settings_test.py +3 -2
  578. cirq/work/pauli_sum_collector.py +1 -1
  579. cirq/work/sampler.py +8 -20
  580. cirq/work/sampler_test.py +4 -3
  581. cirq/work/zeros_sampler.py +1 -1
  582. cirq_core-1.5.0.dist-info/METADATA +125 -0
  583. {cirq_core-1.4.0.dev20240529225110.dist-info → cirq_core-1.5.0.dist-info}/RECORD +586 -552
  584. {cirq_core-1.4.0.dev20240529225110.dist-info → cirq_core-1.5.0.dist-info}/WHEEL +1 -1
  585. cirq/experiments/grid_parallel_two_qubit_xeb.py +0 -62
  586. cirq/protocols/json_test_data/GridParallelXEBMetadata.json +0 -119
  587. cirq/protocols/json_test_data/GridParallelXEBMetadata.repr +0 -1
  588. cirq_core-1.4.0.dev20240529225110.dist-info/METADATA +0 -50
  589. {cirq_core-1.4.0.dev20240529225110.dist-info → cirq_core-1.5.0.dist-info}/LICENSE +0 -0
  590. {cirq_core-1.4.0.dev20240529225110.dist-info → cirq_core-1.5.0.dist-info}/top_level.txt +0 -0
@@ -15,122 +15,141 @@
15
15
  """Classes and methods for transforming circuits."""
16
16
 
17
17
  from cirq.transformers.analytical_decompositions import (
18
- compute_cphase_exponents_for_fsim_decomposition,
19
- decompose_cphase_into_two_fsim,
20
- decompose_clifford_tableau_to_operations,
21
- decompose_multi_controlled_x,
22
- decompose_multi_controlled_rotation,
23
- decompose_two_qubit_interaction_into_four_fsim_gates,
24
- is_negligible_turn,
25
- parameterized_2q_op_to_sqrt_iswap_operations,
26
- prepare_two_qubit_state_using_cz,
27
- prepare_two_qubit_state_using_iswap,
28
- prepare_two_qubit_state_using_sqrt_iswap,
29
- quantum_shannon_decomposition,
30
- single_qubit_matrix_to_gates,
31
- single_qubit_matrix_to_pauli_rotations,
32
- single_qubit_matrix_to_phased_x_z,
33
- single_qubit_matrix_to_phxz,
34
- single_qubit_op_to_framed_phase_form,
35
- three_qubit_matrix_to_operations,
36
- two_qubit_matrix_to_cz_isometry,
37
- two_qubit_matrix_to_cz_operations,
38
- two_qubit_matrix_to_diagonal_and_cz_operations,
39
- two_qubit_matrix_to_ion_operations,
40
- two_qubit_matrix_to_sqrt_iswap_operations,
41
- unitary_to_pauli_string,
18
+ # pylint: disable=line-too-long
19
+ compute_cphase_exponents_for_fsim_decomposition as compute_cphase_exponents_for_fsim_decomposition,
20
+ decompose_cphase_into_two_fsim as decompose_cphase_into_two_fsim,
21
+ decompose_clifford_tableau_to_operations as decompose_clifford_tableau_to_operations,
22
+ decompose_multi_controlled_x as decompose_multi_controlled_x,
23
+ decompose_multi_controlled_rotation as decompose_multi_controlled_rotation,
24
+ decompose_two_qubit_interaction_into_four_fsim_gates as decompose_two_qubit_interaction_into_four_fsim_gates,
25
+ is_negligible_turn as is_negligible_turn,
26
+ parameterized_2q_op_to_sqrt_iswap_operations as parameterized_2q_op_to_sqrt_iswap_operations,
27
+ prepare_two_qubit_state_using_cz as prepare_two_qubit_state_using_cz,
28
+ prepare_two_qubit_state_using_iswap as prepare_two_qubit_state_using_iswap,
29
+ prepare_two_qubit_state_using_sqrt_iswap as prepare_two_qubit_state_using_sqrt_iswap,
30
+ quantum_shannon_decomposition as quantum_shannon_decomposition,
31
+ single_qubit_matrix_to_gates as single_qubit_matrix_to_gates,
32
+ single_qubit_matrix_to_pauli_rotations as single_qubit_matrix_to_pauli_rotations,
33
+ single_qubit_matrix_to_phased_x_z as single_qubit_matrix_to_phased_x_z,
34
+ single_qubit_matrix_to_phxz as single_qubit_matrix_to_phxz,
35
+ single_qubit_op_to_framed_phase_form as single_qubit_op_to_framed_phase_form,
36
+ three_qubit_matrix_to_operations as three_qubit_matrix_to_operations,
37
+ two_qubit_matrix_to_cz_isometry as two_qubit_matrix_to_cz_isometry,
38
+ two_qubit_matrix_to_cz_operations as two_qubit_matrix_to_cz_operations,
39
+ two_qubit_matrix_to_diagonal_and_cz_operations as two_qubit_matrix_to_diagonal_and_cz_operations,
40
+ two_qubit_matrix_to_ion_operations as two_qubit_matrix_to_ion_operations,
41
+ two_qubit_matrix_to_sqrt_iswap_operations as two_qubit_matrix_to_sqrt_iswap_operations,
42
+ unitary_to_pauli_string as unitary_to_pauli_string,
42
43
  )
43
44
 
44
45
  from cirq.transformers.heuristic_decompositions import (
45
- TwoQubitGateTabulation,
46
- TwoQubitGateTabulationResult,
47
- two_qubit_gate_product_tabulation,
46
+ TwoQubitGateTabulation as TwoQubitGateTabulation,
47
+ TwoQubitGateTabulationResult as TwoQubitGateTabulationResult,
48
+ two_qubit_gate_product_tabulation as two_qubit_gate_product_tabulation,
48
49
  )
49
50
 
50
51
  from cirq.transformers.routing import (
51
- AbstractInitialMapper,
52
- HardCodedInitialMapper,
53
- LineInitialMapper,
54
- MappingManager,
55
- RouteCQC,
56
- routed_circuit_with_mapping,
52
+ AbstractInitialMapper as AbstractInitialMapper,
53
+ HardCodedInitialMapper as HardCodedInitialMapper,
54
+ LineInitialMapper as LineInitialMapper,
55
+ MappingManager as MappingManager,
56
+ RouteCQC as RouteCQC,
57
+ routed_circuit_with_mapping as routed_circuit_with_mapping,
57
58
  )
58
59
 
59
60
  from cirq.transformers.target_gatesets import (
60
- create_transformer_with_kwargs,
61
- CompilationTargetGateset,
62
- CZTargetGateset,
63
- SqrtIswapTargetGateset,
64
- TwoQubitCompilationTargetGateset,
61
+ create_transformer_with_kwargs as create_transformer_with_kwargs,
62
+ CompilationTargetGateset as CompilationTargetGateset,
63
+ CZTargetGateset as CZTargetGateset,
64
+ SqrtIswapTargetGateset as SqrtIswapTargetGateset,
65
+ TwoQubitCompilationTargetGateset as TwoQubitCompilationTargetGateset,
65
66
  )
66
67
 
67
- from cirq.transformers.align import align_left, align_right
68
+ from cirq.transformers.align import align_left as align_left, align_right as align_right
68
69
 
69
- from cirq.transformers.stratify import stratified_circuit
70
+ from cirq.transformers.stratify import stratified_circuit as stratified_circuit
70
71
 
71
- from cirq.transformers.expand_composite import expand_composite
72
+ from cirq.transformers.expand_composite import expand_composite as expand_composite
72
73
 
73
- from cirq.transformers.eject_phased_paulis import eject_phased_paulis
74
+ from cirq.transformers.eject_phased_paulis import eject_phased_paulis as eject_phased_paulis
74
75
 
75
- from cirq.transformers.optimize_for_target_gateset import optimize_for_target_gateset
76
+ from cirq.transformers.optimize_for_target_gateset import (
77
+ optimize_for_target_gateset as optimize_for_target_gateset,
78
+ )
76
79
 
77
- from cirq.transformers.drop_empty_moments import drop_empty_moments
80
+ from cirq.transformers.drop_empty_moments import drop_empty_moments as drop_empty_moments
78
81
 
79
- from cirq.transformers.drop_negligible_operations import drop_negligible_operations
82
+ from cirq.transformers.drop_negligible_operations import (
83
+ drop_negligible_operations as drop_negligible_operations,
84
+ )
80
85
 
81
- from cirq.transformers.dynamical_decoupling import add_dynamical_decoupling
86
+ from cirq.transformers.dynamical_decoupling import (
87
+ add_dynamical_decoupling as add_dynamical_decoupling,
88
+ )
82
89
 
83
- from cirq.transformers.eject_z import eject_z
90
+ from cirq.transformers.eject_z import eject_z as eject_z
84
91
 
85
92
  from cirq.transformers.measurement_transformers import (
86
- defer_measurements,
87
- dephase_measurements,
88
- drop_terminal_measurements,
93
+ defer_measurements as defer_measurements,
94
+ dephase_measurements as dephase_measurements,
95
+ drop_terminal_measurements as drop_terminal_measurements,
89
96
  )
90
97
 
91
- from cirq.transformers.merge_k_qubit_gates import merge_k_qubit_unitaries
98
+ from cirq.transformers.merge_k_qubit_gates import merge_k_qubit_unitaries as merge_k_qubit_unitaries
92
99
 
93
100
  from cirq.transformers.merge_single_qubit_gates import (
94
- merge_single_qubit_gates_to_phased_x_and_z,
95
- merge_single_qubit_gates_to_phxz,
96
- merge_single_qubit_moments_to_phxz,
101
+ merge_single_qubit_gates_to_phased_x_and_z as merge_single_qubit_gates_to_phased_x_and_z,
102
+ merge_single_qubit_gates_to_phxz as merge_single_qubit_gates_to_phxz,
103
+ merge_single_qubit_moments_to_phxz as merge_single_qubit_moments_to_phxz,
97
104
  )
98
105
 
99
- from cirq.transformers.qubit_management_transformers import map_clean_and_borrowable_qubits
106
+ from cirq.transformers.qubit_management_transformers import (
107
+ map_clean_and_borrowable_qubits as map_clean_and_borrowable_qubits,
108
+ )
100
109
 
101
- from cirq.transformers.synchronize_terminal_measurements import synchronize_terminal_measurements
110
+ from cirq.transformers.synchronize_terminal_measurements import (
111
+ synchronize_terminal_measurements as synchronize_terminal_measurements,
112
+ )
102
113
 
103
114
  from cirq.transformers.transformer_api import (
104
- LogLevel,
105
- TRANSFORMER,
106
- TransformerContext,
107
- TransformerLogger,
108
- transformer,
115
+ LogLevel as LogLevel,
116
+ TRANSFORMER as TRANSFORMER,
117
+ TransformerContext as TransformerContext,
118
+ TransformerLogger as TransformerLogger,
119
+ transformer as transformer,
109
120
  )
110
121
 
111
122
  from cirq.transformers.transformer_primitives import (
112
- map_moments,
113
- map_operations,
114
- map_operations_and_unroll,
115
- merge_k_qubit_unitaries_to_circuit_op,
116
- merge_moments,
117
- merge_operations,
118
- merge_operations_to_circuit_op,
119
- toggle_tags,
120
- unroll_circuit_op,
121
- unroll_circuit_op_greedy_earliest,
122
- unroll_circuit_op_greedy_frontier,
123
+ map_moments as map_moments,
124
+ map_operations as map_operations,
125
+ map_operations_and_unroll as map_operations_and_unroll,
126
+ merge_k_qubit_unitaries_to_circuit_op as merge_k_qubit_unitaries_to_circuit_op,
127
+ merge_moments as merge_moments,
128
+ merge_operations as merge_operations,
129
+ merge_operations_to_circuit_op as merge_operations_to_circuit_op,
130
+ toggle_tags as toggle_tags,
131
+ unroll_circuit_op as unroll_circuit_op,
132
+ unroll_circuit_op_greedy_earliest as unroll_circuit_op_greedy_earliest,
133
+ unroll_circuit_op_greedy_frontier as unroll_circuit_op_greedy_frontier,
123
134
  )
124
135
 
125
-
126
136
  from cirq.transformers.gauge_compiling import (
127
- CZGaugeTransformer,
128
- ConstantGauge,
129
- Gauge,
130
- GaugeSelector,
131
- GaugeTransformer,
132
- ISWAPGaugeTransformer,
133
- SpinInversionGaugeTransformer,
134
- SqrtCZGaugeTransformer,
135
- SqrtISWAPGaugeTransformer,
137
+ CZGaugeTransformer as CZGaugeTransformer,
138
+ ConstantGauge as ConstantGauge,
139
+ Gauge as Gauge,
140
+ GaugeSelector as GaugeSelector,
141
+ GaugeTransformer as GaugeTransformer,
142
+ ISWAPGaugeTransformer as ISWAPGaugeTransformer,
143
+ SpinInversionGaugeTransformer as SpinInversionGaugeTransformer,
144
+ SqrtCZGaugeTransformer as SqrtCZGaugeTransformer,
145
+ SqrtISWAPGaugeTransformer as SqrtISWAPGaugeTransformer,
146
+ )
147
+
148
+ from cirq.transformers.randomized_measurements import (
149
+ RandomizedMeasurements as RandomizedMeasurements,
150
+ )
151
+
152
+
153
+ from cirq.transformers.insertion_sort import (
154
+ insertion_sort_transformer as insertion_sort_transformer,
136
155
  )
@@ -16,6 +16,7 @@
16
16
 
17
17
  import dataclasses
18
18
  from typing import Optional, TYPE_CHECKING
19
+
19
20
  from cirq import circuits, ops
20
21
  from cirq.transformers import transformer_api
21
22
 
@@ -73,4 +74,14 @@ def align_right(
73
74
  """
74
75
  if context is not None and context.deep is True:
75
76
  context = dataclasses.replace(context, deep=False)
76
- return align_left(circuit[::-1], context=context)[::-1]
77
+ # Reverse the circuit, align left, and reverse again. Note each moment also has to have its ops
78
+ # reversed internally, to avoid edge conditions where non-commuting but can-be-in-same-moment
79
+ # ops (measurements and classical controls, particularly) could end up getting swapped.
80
+ backwards = []
81
+ for moment in circuit[::-1]:
82
+ backwards.append(circuits.Moment(reversed(moment.operations)))
83
+ aligned_backwards = align_left(circuits.Circuit(backwards), context=context)
84
+ forwards = []
85
+ for moment in aligned_backwards[::-1]:
86
+ forwards.append(circuits.Moment(reversed(moment.operations)))
87
+ return circuits.Circuit(forwards)
@@ -208,3 +208,16 @@ def test_classical_control():
208
208
  )
209
209
  cirq.testing.assert_same_circuits(cirq.align_left(circuit), circuit)
210
210
  cirq.testing.assert_same_circuits(cirq.align_right(circuit), circuit)
211
+
212
+
213
+ def test_measurement_and_classical_control_same_moment_preserve_order():
214
+ q0, q1 = cirq.LineQubit.range(2)
215
+ circuit = cirq.Circuit()
216
+ op_measure = cirq.measure(q0, key='m')
217
+ op_controlled = cirq.X(q1).with_classical_controls('m')
218
+ circuit.append(op_measure)
219
+ circuit.append(op_controlled, cirq.InsertStrategy.INLINE)
220
+ circuit = cirq.align_right(circuit)
221
+ ops_in_order = list(circuit.all_operations())
222
+ assert ops_in_order[0] == op_measure
223
+ assert ops_in_order[1] == op_controlled
@@ -15,64 +15,67 @@
15
15
  """Utilities for analytical decomposition of cirq gates."""
16
16
 
17
17
  from cirq.transformers.analytical_decompositions.clifford_decomposition import (
18
- decompose_clifford_tableau_to_operations,
18
+ decompose_clifford_tableau_to_operations as decompose_clifford_tableau_to_operations,
19
19
  )
20
20
 
21
21
  from cirq.transformers.analytical_decompositions.controlled_gate_decomposition import (
22
- decompose_multi_controlled_x,
23
- decompose_multi_controlled_rotation,
22
+ decompose_multi_controlled_x as decompose_multi_controlled_x,
23
+ decompose_multi_controlled_rotation as decompose_multi_controlled_rotation,
24
24
  )
25
25
 
26
26
  from cirq.transformers.analytical_decompositions.cphase_to_fsim import (
27
- compute_cphase_exponents_for_fsim_decomposition,
28
- decompose_cphase_into_two_fsim,
27
+ # pylint: disable=line-too-long
28
+ compute_cphase_exponents_for_fsim_decomposition as compute_cphase_exponents_for_fsim_decomposition,
29
+ decompose_cphase_into_two_fsim as decompose_cphase_into_two_fsim,
29
30
  )
30
31
 
31
32
  from cirq.transformers.analytical_decompositions.quantum_shannon_decomposition import (
32
- quantum_shannon_decomposition,
33
+ quantum_shannon_decomposition as quantum_shannon_decomposition,
33
34
  )
34
35
 
35
36
  from cirq.transformers.analytical_decompositions.single_qubit_decompositions import (
36
- is_negligible_turn,
37
- single_qubit_matrix_to_gates,
38
- single_qubit_matrix_to_pauli_rotations,
39
- single_qubit_matrix_to_phased_x_z,
40
- single_qubit_matrix_to_phxz,
41
- single_qubit_op_to_framed_phase_form,
37
+ is_negligible_turn as is_negligible_turn,
38
+ single_qubit_matrix_to_gates as single_qubit_matrix_to_gates,
39
+ single_qubit_matrix_to_pauli_rotations as single_qubit_matrix_to_pauli_rotations,
40
+ single_qubit_matrix_to_phased_x_z as single_qubit_matrix_to_phased_x_z,
41
+ single_qubit_matrix_to_phxz as single_qubit_matrix_to_phxz,
42
+ single_qubit_op_to_framed_phase_form as single_qubit_op_to_framed_phase_form,
42
43
  )
43
44
 
44
45
  from cirq.transformers.analytical_decompositions.three_qubit_decomposition import (
45
- three_qubit_matrix_to_operations,
46
+ three_qubit_matrix_to_operations as three_qubit_matrix_to_operations,
46
47
  )
47
48
 
48
49
  from cirq.transformers.analytical_decompositions.two_qubit_to_cz import (
49
- two_qubit_matrix_to_cz_operations,
50
- two_qubit_matrix_to_diagonal_and_cz_operations,
50
+ # pylint: disable=line-too-long
51
+ two_qubit_matrix_to_cz_operations as two_qubit_matrix_to_cz_operations,
52
+ two_qubit_matrix_to_diagonal_and_cz_operations as two_qubit_matrix_to_diagonal_and_cz_operations,
51
53
  )
52
54
 
53
55
  from cirq.transformers.analytical_decompositions.two_qubit_to_fsim import (
54
- decompose_two_qubit_interaction_into_four_fsim_gates,
56
+ # pylint: disable=line-too-long
57
+ decompose_two_qubit_interaction_into_four_fsim_gates as decompose_two_qubit_interaction_into_four_fsim_gates,
55
58
  )
56
59
 
57
60
  from cirq.transformers.analytical_decompositions.two_qubit_to_ms import (
58
- two_qubit_matrix_to_ion_operations,
61
+ two_qubit_matrix_to_ion_operations as two_qubit_matrix_to_ion_operations,
59
62
  )
60
63
 
61
64
  from cirq.transformers.analytical_decompositions.two_qubit_to_sqrt_iswap import (
62
- parameterized_2q_op_to_sqrt_iswap_operations,
63
- two_qubit_matrix_to_sqrt_iswap_operations,
65
+ parameterized_2q_op_to_sqrt_iswap_operations as parameterized_2q_op_to_sqrt_iswap_operations,
66
+ two_qubit_matrix_to_sqrt_iswap_operations as two_qubit_matrix_to_sqrt_iswap_operations,
64
67
  )
65
68
 
66
69
  from cirq.transformers.analytical_decompositions.two_qubit_state_preparation import (
67
- prepare_two_qubit_state_using_cz,
68
- prepare_two_qubit_state_using_sqrt_iswap,
69
- prepare_two_qubit_state_using_iswap,
70
+ prepare_two_qubit_state_using_cz as prepare_two_qubit_state_using_cz,
71
+ prepare_two_qubit_state_using_sqrt_iswap as prepare_two_qubit_state_using_sqrt_iswap,
72
+ prepare_two_qubit_state_using_iswap as prepare_two_qubit_state_using_iswap,
70
73
  )
71
74
 
72
75
  from cirq.transformers.analytical_decompositions.single_to_two_qubit_isometry import (
73
- two_qubit_matrix_to_cz_isometry,
76
+ two_qubit_matrix_to_cz_isometry as two_qubit_matrix_to_cz_isometry,
74
77
  )
75
78
 
76
79
  from cirq.transformers.analytical_decompositions.pauli_string_decomposition import (
77
- unitary_to_pauli_string,
80
+ unitary_to_pauli_string as unitary_to_pauli_string,
78
81
  )
@@ -14,10 +14,11 @@
14
14
 
15
15
  """Utility methods to decompose Clifford gates into circuits."""
16
16
 
17
- from typing import List, TYPE_CHECKING
18
17
  import functools
18
+ from typing import List, TYPE_CHECKING
19
19
 
20
20
  import numpy as np
21
+
21
22
  from cirq import ops, protocols, qis, sim
22
23
 
23
24
  if TYPE_CHECKING:
@@ -12,8 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- import pytest
16
15
  import numpy as np
16
+ import pytest
17
17
 
18
18
  import cirq
19
19
  from cirq.testing import assert_allclose_up_to_global_phase
@@ -17,7 +17,7 @@ from typing import List, Tuple, TYPE_CHECKING
17
17
  import numpy as np
18
18
 
19
19
  from cirq import ops
20
- from cirq.linalg import is_unitary, is_special_unitary, map_eigenvalues
20
+ from cirq.linalg import is_special_unitary, is_unitary, map_eigenvalues
21
21
  from cirq.protocols import unitary
22
22
 
23
23
  if TYPE_CHECKING:
@@ -87,6 +87,7 @@ def test_decompose_specific_matrices():
87
87
  _test_decompose(cirq.unitary(gate), controls_count)
88
88
 
89
89
 
90
+ @cirq.testing.retry_once_with_later_random_values
90
91
  def test_decompose_random_unitary():
91
92
  for controls_count in range(5):
92
93
  for _ in range(10):
@@ -95,6 +96,7 @@ def test_decompose_random_unitary():
95
96
  _test_decompose(_random_unitary(), controls_count)
96
97
 
97
98
 
99
+ @cirq.testing.retry_once_with_later_random_values
98
100
  def test_decompose_random_special_unitary():
99
101
  for controls_count in range(5):
100
102
  for _ in range(10):
@@ -56,7 +56,7 @@ def compute_cphase_exponents_for_fsim_decomposition(
56
56
  """
57
57
 
58
58
  def nonempty_intervals(
59
- intervals: Sequence[Tuple[float, float]]
59
+ intervals: Sequence[Tuple[float, float]],
60
60
  ) -> Sequence[Tuple[float, float]]:
61
61
  return tuple((a, b) for a, b in intervals if a < b)
62
62
 
@@ -12,9 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ import itertools
15
16
  from typing import List, Sequence, Tuple
16
17
 
17
- import itertools
18
18
  import numpy as np
19
19
  import pytest
20
20
  import sympy
@@ -12,13 +12,13 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Optional, Tuple, cast
15
+ from typing import cast, Optional, Tuple
16
16
 
17
17
  import numpy as np
18
18
  import numpy.typing as npt
19
19
 
20
- from cirq.ops import DensePauliString
21
20
  from cirq import protocols
21
+ from cirq.ops import DensePauliString
22
22
 
23
23
 
24
24
  def _argmax(V: npt.NDArray) -> Tuple[int, float]:
@@ -12,15 +12,15 @@
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
16
- import itertools
17
15
  import cmath
18
- import pytest
16
+ import itertools
17
+ from typing import cast
19
18
 
20
19
  import numpy as np
20
+ import pytest
21
21
 
22
- from cirq.ops import DensePauliString, T
23
22
  from cirq import protocols
23
+ from cirq.ops import DensePauliString, T
24
24
  from cirq.transformers.analytical_decompositions import unitary_to_pauli_string
25
25
 
26
26