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
cirq/ops/__init__.py CHANGED
@@ -11,211 +11,251 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
- """Gates (unitary and non-unitary), operations, base types, and gate sets.
15
- """
14
+ """Gates (unitary and non-unitary), operations, base types, and gate sets."""
16
15
 
17
- from cirq.ops.arithmetic_operation import ArithmeticGate
16
+ from cirq.ops.arithmetic_operation import ArithmeticGate as ArithmeticGate
18
17
 
19
- from cirq.ops.clifford_gate import CliffordGate, SingleQubitCliffordGate
18
+ from cirq.ops.clifford_gate import (
19
+ CliffordGate as CliffordGate,
20
+ SingleQubitCliffordGate as SingleQubitCliffordGate,
21
+ )
20
22
 
21
23
  from cirq.ops.dense_pauli_string import (
22
- BaseDensePauliString,
23
- DensePauliString,
24
- MutableDensePauliString,
24
+ BaseDensePauliString as BaseDensePauliString,
25
+ DensePauliString as DensePauliString,
26
+ MutableDensePauliString as MutableDensePauliString,
25
27
  )
26
28
 
27
- from cirq.ops.boolean_hamiltonian import BooleanHamiltonianGate
29
+ from cirq.ops.boolean_hamiltonian import BooleanHamiltonianGate as BooleanHamiltonianGate
28
30
 
29
31
  from cirq.ops.common_channels import (
30
- amplitude_damp,
31
- AmplitudeDampingChannel,
32
- asymmetric_depolarize,
33
- AsymmetricDepolarizingChannel,
34
- bit_flip,
35
- BitFlipChannel,
36
- depolarize,
37
- DepolarizingChannel,
38
- generalized_amplitude_damp,
39
- GeneralizedAmplitudeDampingChannel,
40
- phase_damp,
41
- phase_flip,
42
- PhaseDampingChannel,
43
- PhaseFlipChannel,
44
- R,
45
- reset,
46
- reset_each,
47
- ResetChannel,
32
+ amplitude_damp as amplitude_damp,
33
+ AmplitudeDampingChannel as AmplitudeDampingChannel,
34
+ asymmetric_depolarize as asymmetric_depolarize,
35
+ AsymmetricDepolarizingChannel as AsymmetricDepolarizingChannel,
36
+ bit_flip as bit_flip,
37
+ BitFlipChannel as BitFlipChannel,
38
+ depolarize as depolarize,
39
+ DepolarizingChannel as DepolarizingChannel,
40
+ generalized_amplitude_damp as generalized_amplitude_damp,
41
+ GeneralizedAmplitudeDampingChannel as GeneralizedAmplitudeDampingChannel,
42
+ phase_damp as phase_damp,
43
+ phase_flip as phase_flip,
44
+ PhaseDampingChannel as PhaseDampingChannel,
45
+ PhaseFlipChannel as PhaseFlipChannel,
46
+ R as R,
47
+ reset as reset,
48
+ reset_each as reset_each,
49
+ ResetChannel as ResetChannel,
48
50
  )
49
51
 
50
52
  from cirq.ops.common_gates import (
51
- CNOT,
52
- CNotPowGate,
53
- cphase,
54
- CX,
55
- CXPowGate,
56
- CZ,
57
- CZPowGate,
58
- H,
59
- HPowGate,
60
- Rx,
61
- Ry,
62
- Rz,
63
- rx,
64
- ry,
65
- rz,
66
- S,
67
- T,
68
- XPowGate,
69
- YPowGate,
70
- ZPowGate,
53
+ CNOT as CNOT,
54
+ CNotPowGate as CNotPowGate,
55
+ cphase as cphase,
56
+ CX as CX,
57
+ CXPowGate as CXPowGate,
58
+ CZ as CZ,
59
+ CZPowGate as CZPowGate,
60
+ H as H,
61
+ HPowGate as HPowGate,
62
+ Rx as Rx,
63
+ Ry as Ry,
64
+ Rz as Rz,
65
+ rx as rx,
66
+ ry as ry,
67
+ rz as rz,
68
+ S as S,
69
+ T as T,
70
+ XPowGate as XPowGate,
71
+ YPowGate as YPowGate,
72
+ ZPowGate as ZPowGate,
71
73
  )
72
74
 
73
75
  from cirq.ops.common_gate_families import (
74
- AnyUnitaryGateFamily,
75
- AnyIntegerPowerGateFamily,
76
- ParallelGateFamily,
76
+ AnyUnitaryGateFamily as AnyUnitaryGateFamily,
77
+ AnyIntegerPowerGateFamily as AnyIntegerPowerGateFamily,
78
+ ParallelGateFamily as ParallelGateFamily,
77
79
  )
78
80
 
79
- from cirq.ops.classically_controlled_operation import ClassicallyControlledOperation
81
+ from cirq.ops.classically_controlled_operation import (
82
+ ClassicallyControlledOperation as ClassicallyControlledOperation,
83
+ )
80
84
 
81
- from cirq.ops.controlled_gate import ControlledGate
85
+ from cirq.ops.controlled_gate import ControlledGate as ControlledGate
82
86
 
83
- from cirq.ops.diagonal_gate import DiagonalGate
87
+ from cirq.ops.diagonal_gate import DiagonalGate as DiagonalGate
84
88
 
85
- from cirq.ops.eigen_gate import EigenGate
89
+ from cirq.ops.eigen_gate import EigenGate as EigenGate
86
90
 
87
- from cirq.ops.fourier_transform import PhaseGradientGate, qft, QuantumFourierTransformGate
91
+ from cirq.ops.fourier_transform import (
92
+ PhaseGradientGate as PhaseGradientGate,
93
+ qft as qft,
94
+ QuantumFourierTransformGate as QuantumFourierTransformGate,
95
+ )
88
96
 
89
- from cirq.ops.fsim_gate import FSimGate, PhasedFSimGate
97
+ from cirq.ops.fsim_gate import FSimGate as FSimGate, PhasedFSimGate as PhasedFSimGate
90
98
 
91
- from cirq.ops.gate_features import InterchangeableQubitsGate
99
+ from cirq.ops.gate_features import InterchangeableQubitsGate as InterchangeableQubitsGate
92
100
 
93
- from cirq.ops.gate_operation import GateOperation
101
+ from cirq.ops.gate_operation import GateOperation as GateOperation
94
102
 
95
- from cirq.ops.gateset import GateFamily, Gateset
103
+ from cirq.ops.gateset import GateFamily as GateFamily, Gateset as Gateset
96
104
 
97
- from cirq.ops.identity import I, identity_each, IdentityGate
105
+ from cirq.ops.identity import I as I, identity_each as identity_each, IdentityGate as IdentityGate
98
106
 
99
- from cirq.ops.global_phase_op import GlobalPhaseGate, global_phase_operation
107
+ from cirq.ops.global_phase_op import (
108
+ GlobalPhaseGate as GlobalPhaseGate,
109
+ global_phase_operation as global_phase_operation,
110
+ )
100
111
 
101
- from cirq.ops.kraus_channel import KrausChannel
112
+ from cirq.ops.kraus_channel import KrausChannel as KrausChannel
102
113
 
103
114
  from cirq.ops.linear_combinations import (
104
- LinearCombinationOfGates,
105
- LinearCombinationOfOperations,
106
- PauliSum,
107
- PauliSumLike,
108
- ProjectorSum,
115
+ LinearCombinationOfGates as LinearCombinationOfGates,
116
+ LinearCombinationOfOperations as LinearCombinationOfOperations,
117
+ PauliSum as PauliSum,
118
+ PauliSumLike as PauliSumLike,
119
+ ProjectorSum as ProjectorSum,
109
120
  )
110
121
 
111
- from cirq.ops.mixed_unitary_channel import MixedUnitaryChannel
122
+ from cirq.ops.mixed_unitary_channel import MixedUnitaryChannel as MixedUnitaryChannel
112
123
 
113
- from cirq.ops.pauli_sum_exponential import PauliSumExponential
124
+ from cirq.ops.pauli_sum_exponential import PauliSumExponential as PauliSumExponential
114
125
 
115
- from cirq.ops.pauli_measurement_gate import PauliMeasurementGate
126
+ from cirq.ops.pauli_measurement_gate import PauliMeasurementGate as PauliMeasurementGate
116
127
 
117
- from cirq.ops.parallel_gate import ParallelGate, parallel_gate_op
128
+ from cirq.ops.parallel_gate import (
129
+ ParallelGate as ParallelGate,
130
+ parallel_gate_op as parallel_gate_op,
131
+ )
118
132
 
119
- from cirq.ops.projector import ProjectorString
133
+ from cirq.ops.projector import ProjectorString as ProjectorString
120
134
 
121
- from cirq.ops.controlled_operation import ControlledOperation
135
+ from cirq.ops.controlled_operation import ControlledOperation as ControlledOperation
122
136
 
123
- from cirq.ops.qubit_manager import BorrowableQubit, CleanQubit, QubitManager, SimpleQubitManager
137
+ from cirq.ops.qubit_manager import (
138
+ BorrowableQubit as BorrowableQubit,
139
+ CleanQubit as CleanQubit,
140
+ QubitManager as QubitManager,
141
+ SimpleQubitManager as SimpleQubitManager,
142
+ )
124
143
 
125
- from cirq.ops.greedy_qubit_manager import GreedyQubitManager
144
+ from cirq.ops.greedy_qubit_manager import GreedyQubitManager as GreedyQubitManager
126
145
 
127
- from cirq.ops.qubit_order import QubitOrder
146
+ from cirq.ops.qubit_order import QubitOrder as QubitOrder
128
147
 
129
- from cirq.ops.qubit_order_or_list import QubitOrderOrList
148
+ from cirq.ops.qubit_order_or_list import QubitOrderOrList as QubitOrderOrList
130
149
 
131
- from cirq.ops.matrix_gates import MatrixGate
150
+ from cirq.ops.matrix_gates import MatrixGate as MatrixGate
132
151
 
133
152
  from cirq.ops.measure_util import (
134
- M,
135
- measure,
136
- measure_each,
137
- measure_paulistring_terms,
138
- measure_single_paulistring,
153
+ M as M,
154
+ measure as measure,
155
+ measure_each as measure_each,
156
+ measure_paulistring_terms as measure_paulistring_terms,
157
+ measure_single_paulistring as measure_single_paulistring,
139
158
  )
140
159
 
141
- from cirq.ops.measurement_gate import MeasurementGate
160
+ from cirq.ops.measurement_gate import MeasurementGate as MeasurementGate
142
161
 
143
- from cirq.ops.named_qubit import NamedQubit, NamedQid
162
+ from cirq.ops.named_qubit import NamedQubit as NamedQubit, NamedQid as NamedQid
144
163
 
145
164
  from cirq.ops.op_tree import (
146
- flatten_op_tree,
147
- freeze_op_tree,
148
- flatten_to_ops,
149
- flatten_to_ops_or_moments,
150
- OP_TREE,
151
- transform_op_tree,
165
+ flatten_op_tree as flatten_op_tree,
166
+ freeze_op_tree as freeze_op_tree,
167
+ flatten_to_ops as flatten_to_ops,
168
+ flatten_to_ops_or_moments as flatten_to_ops_or_moments,
169
+ OP_TREE as OP_TREE,
170
+ transform_op_tree as transform_op_tree,
152
171
  )
153
172
 
154
- from cirq.ops.parity_gates import XX, XXPowGate, YY, YYPowGate, ZZ, ZZPowGate, MSGate, ms
173
+ from cirq.ops.parity_gates import (
174
+ XX as XX,
175
+ XXPowGate as XXPowGate,
176
+ YY as YY,
177
+ YYPowGate as YYPowGate,
178
+ ZZ as ZZ,
179
+ ZZPowGate as ZZPowGate,
180
+ MSGate as MSGate,
181
+ ms as ms,
182
+ )
155
183
 
156
- from cirq.ops.pauli_gates import Pauli, X, Y, Z
184
+ from cirq.ops.pauli_gates import Pauli as Pauli, X as X, Y as Y, Z as Z
157
185
 
158
- from cirq.ops.pauli_interaction_gate import PauliInteractionGate
186
+ from cirq.ops.pauli_interaction_gate import PauliInteractionGate as PauliInteractionGate
159
187
 
160
188
  from cirq.ops.pauli_string import (
161
- MutablePauliString,
162
- PAULI_GATE_LIKE,
163
- PAULI_STRING_LIKE,
164
- PauliString,
165
- SingleQubitPauliStringGateOperation,
189
+ MutablePauliString as MutablePauliString,
190
+ PAULI_GATE_LIKE as PAULI_GATE_LIKE,
191
+ PAULI_STRING_LIKE as PAULI_STRING_LIKE,
192
+ PauliString as PauliString,
193
+ SingleQubitPauliStringGateOperation as SingleQubitPauliStringGateOperation,
166
194
  )
167
195
 
168
- from cirq.ops.pauli_string_phasor import PauliStringPhasor, PauliStringPhasorGate
196
+ from cirq.ops.pauli_string_phasor import (
197
+ PauliStringPhasor as PauliStringPhasor,
198
+ PauliStringPhasorGate as PauliStringPhasorGate,
199
+ )
169
200
 
170
- from cirq.ops.pauli_string_raw_types import PauliStringGateOperation
201
+ from cirq.ops.pauli_string_raw_types import PauliStringGateOperation as PauliStringGateOperation
171
202
 
172
- from cirq.ops.permutation_gate import QubitPermutationGate
203
+ from cirq.ops.permutation_gate import QubitPermutationGate as QubitPermutationGate
173
204
 
174
- from cirq.ops.phased_iswap_gate import givens, PhasedISwapPowGate
205
+ from cirq.ops.phased_iswap_gate import givens as givens, PhasedISwapPowGate as PhasedISwapPowGate
175
206
 
176
- from cirq.ops.phased_x_gate import PhasedXPowGate
207
+ from cirq.ops.phased_x_gate import PhasedXPowGate as PhasedXPowGate
177
208
 
178
- from cirq.ops.phased_x_z_gate import PhasedXZGate
209
+ from cirq.ops.phased_x_z_gate import PhasedXZGate as PhasedXZGate
179
210
 
180
- from cirq.ops.qid_util import q
211
+ from cirq.ops.qid_util import q as q
181
212
 
182
- from cirq.ops.random_gate_channel import RandomGateChannel
213
+ from cirq.ops.random_gate_channel import RandomGateChannel as RandomGateChannel
183
214
 
184
- from cirq.ops.raw_types import Gate, Operation, Qid, TaggedOperation
215
+ from cirq.ops.raw_types import (
216
+ Gate as Gate,
217
+ Operation as Operation,
218
+ Qid as Qid,
219
+ TaggedOperation as TaggedOperation,
220
+ )
185
221
 
186
222
  from cirq.ops.swap_gates import (
187
- ISWAP,
188
- ISwapPowGate,
189
- ISWAP_INV,
190
- riswap,
191
- SQRT_ISWAP,
192
- SQRT_ISWAP_INV,
193
- SWAP,
194
- SwapPowGate,
223
+ ISWAP as ISWAP,
224
+ ISwapPowGate as ISwapPowGate,
225
+ ISWAP_INV as ISWAP_INV,
226
+ riswap as riswap,
227
+ SQRT_ISWAP as SQRT_ISWAP,
228
+ SQRT_ISWAP_INV as SQRT_ISWAP_INV,
229
+ SWAP as SWAP,
230
+ SwapPowGate as SwapPowGate,
195
231
  )
196
232
 
197
- from cirq.ops.tags import RoutingSwapTag, VirtualTag
233
+ from cirq.ops.tags import RoutingSwapTag as RoutingSwapTag, VirtualTag as VirtualTag
198
234
 
199
235
  from cirq.ops.three_qubit_gates import (
200
- CCNOT,
201
- CCNotPowGate,
202
- CCX,
203
- CCXPowGate,
204
- CCZ,
205
- CCZPowGate,
206
- CSWAP,
207
- CSwapGate,
208
- FREDKIN,
209
- ThreeQubitDiagonalGate,
210
- TOFFOLI,
236
+ CCNOT as CCNOT,
237
+ CCNotPowGate as CCNotPowGate,
238
+ CCX as CCX,
239
+ CCXPowGate as CCXPowGate,
240
+ CCZ as CCZ,
241
+ CCZPowGate as CCZPowGate,
242
+ CSWAP as CSWAP,
243
+ CSwapGate as CSwapGate,
244
+ FREDKIN as FREDKIN,
245
+ ThreeQubitDiagonalGate as ThreeQubitDiagonalGate,
246
+ TOFFOLI as TOFFOLI,
211
247
  )
212
248
 
213
- from cirq.ops.two_qubit_diagonal_gate import TwoQubitDiagonalGate
249
+ from cirq.ops.two_qubit_diagonal_gate import TwoQubitDiagonalGate as TwoQubitDiagonalGate
214
250
 
215
- from cirq.ops.wait_gate import wait, WaitGate
251
+ from cirq.ops.wait_gate import wait as wait, WaitGate as WaitGate
216
252
 
217
- from cirq.ops.state_preparation_channel import StatePreparationChannel
253
+ from cirq.ops.state_preparation_channel import StatePreparationChannel as StatePreparationChannel
218
254
 
219
- from cirq.ops.control_values import AbstractControlValues, ProductOfSums, SumOfProducts
255
+ from cirq.ops.control_values import (
256
+ AbstractControlValues as AbstractControlValues,
257
+ ProductOfSums as ProductOfSums,
258
+ SumOfProducts as SumOfProducts,
259
+ )
220
260
 
221
- from cirq.ops.uniform_superposition_gate import UniformSuperpositionGate
261
+ from cirq.ops.uniform_superposition_gate import UniformSuperpositionGate as UniformSuperpositionGate
@@ -15,10 +15,10 @@
15
15
 
16
16
  import abc
17
17
  import itertools
18
- from typing import Union, Iterable, List, Sequence, cast, Tuple, TYPE_CHECKING
19
- from typing_extensions import Self
18
+ from typing import cast, Iterable, List, Sequence, Tuple, TYPE_CHECKING, Union
20
19
 
21
20
  import numpy as np
21
+ from typing_extensions import Self
22
22
 
23
23
  from cirq.ops.raw_types import Gate
24
24
 
@@ -12,10 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Union, Sequence
15
+ from typing import Sequence, Union
16
16
 
17
- import pytest
18
17
  import numpy as np
18
+ import pytest
19
19
 
20
20
  import cirq
21
21
 
@@ -31,7 +31,8 @@ import sympy.parsing.sympy_parser as sympy_parser
31
31
  import cirq
32
32
  from cirq import value
33
33
  from cirq.ops import raw_types
34
- from cirq.ops.linear_combinations import PauliSum, PauliString
34
+ from cirq.ops.linear_combinations import PauliSum
35
+ from cirq.ops.pauli_string import PauliString
35
36
 
36
37
 
37
38
  @value.value_equality
@@ -80,7 +81,7 @@ class BooleanHamiltonianGate(raw_types.Gate):
80
81
  return (2,) * len(self._parameter_names)
81
82
 
82
83
  def _value_equality_values_(self) -> Any:
83
- return self._parameter_names, self._boolean_strs, self._theta
84
+ return tuple(self._parameter_names), tuple(self._boolean_strs), self._theta
84
85
 
85
86
  def _json_dict_(self) -> Dict[str, Any]:
86
87
  return {
@@ -14,14 +14,14 @@
14
14
  from typing import (
15
15
  AbstractSet,
16
16
  Any,
17
- Mapping,
18
17
  Dict,
19
18
  FrozenSet,
20
19
  List,
20
+ Mapping,
21
21
  Optional,
22
22
  Sequence,
23
- TYPE_CHECKING,
24
23
  Tuple,
24
+ TYPE_CHECKING,
25
25
  Union,
26
26
  )
27
27
 
@@ -45,6 +45,36 @@ class ClassicallyControlledOperation(raw_types.Operation):
45
45
 
46
46
  This object is typically created via
47
47
  `operation.with_classical_controls(*conditions)`.
48
+
49
+ Examples:
50
+
51
+ >>> import cirq
52
+ >>> a, b, c = cirq.LineQubit.range(3)
53
+ >>> circuit1 = cirq.Circuit(
54
+ ... cirq.measure(a, key='control_key'),
55
+ ... cirq.X(b).with_classical_controls('control_key'))
56
+ >>> print(circuit1)
57
+ 0: ─────────────M───────
58
+
59
+ 1: ─────────────╫───X───
60
+ ║ ║
61
+ control_key: ═══@═══^═══
62
+ >>> circuit2 = cirq.Circuit([
63
+ ... cirq.measure(a, key='control_key1'),
64
+ ... cirq.measure(b, key='control_key2'),
65
+ ... cirq.X(c).with_classical_controls('control_key1', 'control_key2')])
66
+ >>> print(circuit2)
67
+ ┌──┐
68
+ 0: ───────────────M─────────
69
+
70
+ 1: ───────────────╫M────────
71
+ ║║
72
+ 2: ───────────────╫╫────X───
73
+ ║║ ║
74
+ control_key1: ════@╬════^═══
75
+ ║ ║
76
+ control_key2: ═════@════^═══
77
+ └──┘
48
78
  """
49
79
 
50
80
  def __init__(
@@ -169,15 +199,12 @@ class ClassicallyControlledOperation(raw_types.Operation):
169
199
  + ', '.join(str(c) for c in self._conditions)
170
200
  + '])',
171
201
  ) + wire_symbols[1:]
172
- exponent_qubit_index = None
173
- if sub_info.exponent_qubit_index is not None:
174
- exponent_qubit_index = sub_info.exponent_qubit_index + control_label_count
175
- elif sub_info.exponent is not None:
176
- exponent_qubit_index = control_label_count
202
+ exp_index = sub_info.exponent_qubit_index
203
+ if exp_index is None:
204
+ # None means at bottom, which means the last of the original wire symbols
205
+ exp_index = len(sub_info.wire_symbols) - 1
177
206
  return protocols.CircuitDiagramInfo(
178
- wire_symbols=wire_symbols,
179
- exponent=sub_info.exponent,
180
- exponent_qubit_index=exponent_qubit_index,
207
+ wire_symbols=wire_symbols, exponent=sub_info.exponent, exponent_qubit_index=exp_index
181
208
  )
182
209
 
183
210
  def _json_dict_(self) -> Dict[str, Any]:
@@ -216,10 +243,10 @@ class ClassicallyControlledOperation(raw_types.Operation):
216
243
  return local_keys.union(protocols.control_keys(self._sub_operation))
217
244
 
218
245
  def _qasm_(self, args: 'cirq.QasmArgs') -> Optional[str]:
219
- args.validate_version('2.0')
246
+ args.validate_version('2.0', '3.0')
220
247
  if len(self._conditions) > 1:
221
248
  raise ValueError('QASM does not support multiple conditions.')
222
249
  subop_qasm = protocols.qasm(self._sub_operation, args=args)
223
250
  if not self._conditions:
224
251
  return subop_qasm
225
- return f'if ({self._conditions[0].qasm}) {subop_qasm}'
252
+ return f'if ({protocols.qasm(self._conditions[0], args=args)}) {subop_qasm}'
@@ -196,7 +196,7 @@ a: ═══@═══╩══════════════════
196
196
  )
197
197
 
198
198
 
199
- def test_qasm():
199
+ def test_qasm_sympy_condition():
200
200
  q0, q1 = cirq.LineQubit.range(2)
201
201
  circuit = cirq.Circuit(
202
202
  cirq.measure(q0, key='a'),
@@ -222,6 +222,29 @@ if (m_a==0) x q[1];
222
222
  )
223
223
 
224
224
 
225
+ def test_qasm_key_condition():
226
+ q0, q1 = cirq.LineQubit.range(2)
227
+ circuit = cirq.Circuit(cirq.measure(q0, key='a'), cirq.X(q1).with_classical_controls('a'))
228
+ qasm = cirq.qasm(circuit)
229
+ assert (
230
+ qasm
231
+ == f"""// Generated from Cirq v{cirq.__version__}
232
+
233
+ OPENQASM 2.0;
234
+ include "qelib1.inc";
235
+
236
+
237
+ // Qubits: [q(0), q(1)]
238
+ qreg q[2];
239
+ creg m_a[1];
240
+
241
+
242
+ measure q[0] -> m_a[0];
243
+ if (m_a==1) x q[1];
244
+ """
245
+ )
246
+
247
+
225
248
  def test_qasm_no_conditions():
226
249
  q0, q1 = cirq.LineQubit.range(2)
227
250
  circuit = cirq.Circuit(
@@ -1033,3 +1056,126 @@ def test_moment_diagram():
1033
1056
 
1034
1057
  """.strip()
1035
1058
  )
1059
+
1060
+
1061
+ def test_diagram_exponents():
1062
+ q0, q1 = cirq.LineQubit.range(2)
1063
+ circuit = cirq.Circuit(
1064
+ cirq.measure(q0, key='m'), (cirq.X(q1) ** 0.5).with_classical_controls('m')
1065
+ )
1066
+ cirq.testing.assert_has_diagram(
1067
+ circuit,
1068
+ """
1069
+ 0: ───M───────────
1070
+
1071
+ 1: ───╫───X^0.5───
1072
+ ║ ║
1073
+ m: ═══@═══^═══════
1074
+ """,
1075
+ )
1076
+
1077
+
1078
+ def test_diagram_exponents_cx():
1079
+ q0, q1, q2 = cirq.LineQubit.range(3)
1080
+ circuit = cirq.Circuit(
1081
+ cirq.measure(q0, key='m'), (cirq.CX(q2, q1) ** 0.5).with_classical_controls('m')
1082
+ )
1083
+ cirq.testing.assert_has_diagram(
1084
+ circuit,
1085
+ """
1086
+ 0: ───M───────────
1087
+
1088
+ 1: ───╫───X^0.5───
1089
+ ║ ║
1090
+ 2: ───╫───@───────
1091
+ ║ ║
1092
+ m: ═══@═══^═══════
1093
+ """,
1094
+ )
1095
+
1096
+
1097
+ def test_diagram_exponents_multiple_keys():
1098
+ q0, q1, q2 = cirq.LineQubit.range(3)
1099
+ circuit = cirq.Circuit(
1100
+ cirq.measure(q0, key='m0'),
1101
+ cirq.measure(q1, key='m1'),
1102
+ (cirq.X(q2) ** 0.5).with_classical_controls('m0', 'm1'),
1103
+ )
1104
+ cirq.testing.assert_has_diagram(
1105
+ circuit,
1106
+ """
1107
+ ┌──┐
1108
+ 0: ─────M─────────────
1109
+
1110
+ 1: ─────╫M────────────
1111
+ ║║
1112
+ 2: ─────╫╫────X^0.5───
1113
+ ║║ ║
1114
+ m0: ════@╬════^═══════
1115
+ ║ ║
1116
+ m1: ═════@════^═══════
1117
+ └──┘
1118
+ """,
1119
+ )
1120
+
1121
+
1122
+ def test_sympy_indexed_condition_circuit():
1123
+ a = sympy.IndexedBase('a')
1124
+ # XOR the 2nd and 3rd bits of the measurement (big-endian)
1125
+ cond = cirq.SympyCondition(sympy.Xor(a[1], a[2]))
1126
+ q0, q1, q2, q3 = cirq.LineQubit.range(4)
1127
+ sim = cirq.Simulator()
1128
+ circuit = cirq.Circuit(
1129
+ cirq.measure(q0, q1, q2, key='a'),
1130
+ cirq.X(q3).with_classical_controls(cond),
1131
+ cirq.measure(q3, key='b'),
1132
+ )
1133
+ cirq.testing.assert_has_diagram(
1134
+ circuit,
1135
+ """
1136
+ 0: ───M──────────────────────────────────────────
1137
+
1138
+ 1: ───M──────────────────────────────────────────
1139
+
1140
+ 2: ───M──────────────────────────────────────────
1141
+
1142
+ 3: ───╫───X(conditions=[a[1] ^ a[2]])───M('b')───
1143
+ ║ ║
1144
+ a: ═══@═══^══════════════════════════════════════
1145
+ """,
1146
+ )
1147
+ result = sim.sample(circuit)
1148
+ assert result['a'][0] == 0b000
1149
+ assert result['b'][0] == 0
1150
+ circuit.insert(0, cirq.X(q2))
1151
+ result = sim.sample(circuit)
1152
+ assert result['a'][0] == 0b001
1153
+ assert result['b'][0] == 1
1154
+ circuit.insert(0, cirq.X(q1))
1155
+ circuit.insert(0, cirq.X(q2))
1156
+ result = sim.sample(circuit)
1157
+ assert result['a'][0] == 0b010
1158
+ assert result['b'][0] == 1
1159
+ circuit.insert(0, cirq.X(q2))
1160
+ result = sim.sample(circuit)
1161
+ assert result['a'][0] == 0b011
1162
+ assert result['b'][0] == 0
1163
+ circuit.insert(0, cirq.X(q0))
1164
+ circuit.insert(0, cirq.X(q1))
1165
+ circuit.insert(0, cirq.X(q2))
1166
+ result = sim.sample(circuit)
1167
+ assert result['a'][0] == 0b100
1168
+ assert result['b'][0] == 0
1169
+ circuit.insert(0, cirq.X(q2))
1170
+ result = sim.sample(circuit)
1171
+ assert result['a'][0] == 0b101
1172
+ assert result['b'][0] == 1
1173
+ circuit.insert(0, cirq.X(q1))
1174
+ circuit.insert(0, cirq.X(q2))
1175
+ result = sim.sample(circuit)
1176
+ assert result['a'][0] == 0b110
1177
+ assert result['b'][0] == 1
1178
+ circuit.insert(0, cirq.X(q2))
1179
+ result = sim.sample(circuit)
1180
+ assert result['a'][0] == 0b111
1181
+ assert result['b'][0] == 0