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
@@ -0,0 +1 @@
1
+ sympy.Indexed(sympy.IndexedBase(sympy.Symbol('s')),sympy.Integer(1))
@@ -0,0 +1,9 @@
1
+ {
2
+ "cirq_type": "sympy.IndexedBase",
3
+ "args": [
4
+ {
5
+ "cirq_type": "sympy.Symbol",
6
+ "name": "s"
7
+ }
8
+ ]
9
+ }
@@ -0,0 +1 @@
1
+ sympy.IndexedBase(sympy.Symbol('s'))
@@ -0,0 +1,9 @@
1
+ {
2
+ "cirq_type": "sympy.Not",
3
+ "args": [
4
+ {
5
+ "cirq_type": "sympy.Symbol",
6
+ "name": "s"
7
+ }
8
+ ]
9
+ }
@@ -0,0 +1 @@
1
+ sympy.Not(sympy.Symbol('s'))
@@ -0,0 +1,13 @@
1
+ {
2
+ "cirq_type": "sympy.Or",
3
+ "args": [
4
+ {
5
+ "cirq_type": "sympy.Symbol",
6
+ "name": "s"
7
+ },
8
+ {
9
+ "cirq_type": "sympy.Symbol",
10
+ "name": "t"
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1 @@
1
+ sympy.Or(sympy.Symbol('s'), sympy.Symbol('t'))
@@ -0,0 +1,13 @@
1
+ {
2
+ "cirq_type": "sympy.Xor",
3
+ "args": [
4
+ {
5
+ "cirq_type": "sympy.Symbol",
6
+ "name": "s"
7
+ },
8
+ {
9
+ "cirq_type": "sympy.Symbol",
10
+ "name": "t"
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1 @@
1
+ sympy.Xor(sympy.Symbol('s'), sympy.Symbol('t'))
@@ -14,8 +14,9 @@
14
14
 
15
15
  """Protocol and methods for obtaining Kraus representation of quantum channels."""
16
16
 
17
- from typing import Any, Sequence, Tuple, TypeVar, Union
18
17
  import warnings
18
+ from types import NotImplementedType
19
+ from typing import Any, Sequence, Tuple, TypeVar, Union
19
20
 
20
21
  import numpy as np
21
22
  from typing_extensions import Protocol
@@ -23,10 +24,7 @@ from typing_extensions import Protocol
23
24
  from cirq._doc import doc_private
24
25
  from cirq.protocols.decompose_protocol import _try_decompose_into_operations_and_qubits
25
26
  from cirq.protocols.mixture_protocol import has_mixture
26
-
27
-
28
- from cirq.type_workarounds import NotImplementedType
29
-
27
+ from cirq.protocols.unitary_protocol import unitary
30
28
 
31
29
  # This is a special indicator value used by the channel method to determine
32
30
  # whether or not the caller provided a 'default' argument. It must be of type
@@ -135,7 +133,7 @@ def kraus(
135
133
  """
136
134
  channel_getter = getattr(val, '_channel_', None)
137
135
  if channel_getter is not None:
138
- warnings.warn(
136
+ warnings.warn( # pragma: no cover
139
137
  '_channel_ is deprecated and will be removed in cirq 0.13, rename to _kraus_',
140
138
  DeprecationWarning,
141
139
  )
@@ -148,7 +146,9 @@ def kraus(
148
146
  mixture_getter = getattr(val, '_mixture_', None)
149
147
  mixture_result = NotImplemented if mixture_getter is None else mixture_getter()
150
148
  if mixture_result is not NotImplemented and mixture_result is not None:
151
- return tuple(np.sqrt(p) * u for p, u in mixture_result)
149
+ return tuple(
150
+ np.sqrt(p) * (u if isinstance(u, np.ndarray) else unitary(u)) for p, u in mixture_result
151
+ )
152
152
 
153
153
  unitary_getter = getattr(val, '_unitary_', None)
154
154
  unitary_result = NotImplemented if unitary_getter is None else unitary_getter()
@@ -157,7 +157,7 @@ def kraus(
157
157
 
158
158
  channel_result = NotImplemented if channel_getter is None else channel_getter()
159
159
  if channel_result is not NotImplemented:
160
- return tuple(channel_result)
160
+ return tuple(channel_result) # pragma: no cover
161
161
 
162
162
  if default is not RaiseTypeErrorIfNotProvided:
163
163
  return default
@@ -21,7 +21,6 @@ import pytest
21
21
 
22
22
  import cirq
23
23
 
24
-
25
24
  LOCAL_DEFAULT: List[np.ndarray] = [np.array([])]
26
25
 
27
26
 
@@ -13,13 +13,13 @@
13
13
  # limitations under the License.
14
14
  """Protocol for object that have measurement keys."""
15
15
 
16
+ from types import NotImplementedType
16
17
  from typing import Any, FrozenSet, Mapping, Optional, Tuple, TYPE_CHECKING, Union
17
18
 
18
19
  from typing_extensions import Protocol
19
20
 
20
21
  from cirq import value
21
22
  from cirq._doc import doc_private
22
- from cirq.type_workarounds import NotImplementedType
23
23
 
24
24
  if TYPE_CHECKING:
25
25
  import cirq
@@ -104,7 +104,7 @@ def test_is_measurement():
104
104
 
105
105
  @property
106
106
  def qubits(self):
107
- return cirq.LineQubit.range(2)
107
+ return cirq.LineQubit.range(2) # pragma: no cover
108
108
 
109
109
  assert not cirq.is_measurement(NotImplementedOperation())
110
110
 
@@ -123,27 +123,27 @@ def test_measurement_without_key():
123
123
  def test_non_measurement_with_key():
124
124
  class NonMeasurementGate(cirq.Gate):
125
125
  def _is_measurement_(self):
126
- return False
126
+ return False # pragma: no cover
127
127
 
128
128
  def _decompose_(self, qubits):
129
129
  # Decompose should not be called by `is_measurement`
130
- assert False
130
+ assert False # pragma: no cover
131
131
 
132
132
  def _measurement_key_name_(self):
133
133
  # `measurement_key_name`` should not be called by `is_measurement`
134
- assert False
134
+ assert False # pragma: no cover
135
135
 
136
136
  def _measurement_key_names_(self):
137
137
  # `measurement_key_names`` should not be called by `is_measurement`
138
- assert False
138
+ assert False # pragma: no cover
139
139
 
140
140
  def _measurement_key_obj_(self):
141
141
  # `measurement_key_obj`` should not be called by `is_measurement`
142
- assert False
142
+ assert False # pragma: no cover
143
143
 
144
144
  def _measurement_key_objs_(self):
145
145
  # `measurement_key_objs`` should not be called by `is_measurement`
146
- assert False
146
+ assert False # pragma: no cover
147
147
 
148
148
  def num_qubits(self) -> int:
149
149
  return 2 # pragma: no cover
@@ -13,6 +13,8 @@
13
13
  # limitations under the License.
14
14
 
15
15
  """Protocol for objects that are mixtures (probabilistic combinations)."""
16
+
17
+ from types import NotImplementedType
16
18
  from typing import Any, Sequence, Tuple, Union
17
19
 
18
20
  import numpy as np
@@ -21,7 +23,7 @@ from typing_extensions import Protocol
21
23
  from cirq._doc import doc_private
22
24
  from cirq.protocols.decompose_protocol import _try_decompose_into_operations_and_qubits
23
25
  from cirq.protocols.has_unitary_protocol import has_unitary
24
- from cirq.type_workarounds import NotImplementedType
26
+ from cirq.protocols.unitary_protocol import unitary
25
27
 
26
28
  # This is a special indicator value used by the inverse method to determine
27
29
  # whether or not the caller provided a 'default' argument.
@@ -83,14 +85,14 @@ def mixture(
83
85
  with that probability in the mixture. The probabilities will sum to 1.0.
84
86
 
85
87
  Raises:
86
- TypeError: If `val` has no `_mixture_` or `_unitary_` mehod, or if it
88
+ TypeError: If `val` has no `_mixture_` or `_unitary_` method, or if it
87
89
  does and this method returned `NotImplemented`.
88
90
  """
89
91
 
90
92
  mixture_getter = getattr(val, '_mixture_', None)
91
93
  result = NotImplemented if mixture_getter is None else mixture_getter()
92
- if result is not NotImplemented:
93
- return result
94
+ if result is not NotImplemented and result is not None:
95
+ return tuple((p, u if isinstance(u, np.ndarray) else unitary(u)) for p, u in result)
94
96
 
95
97
  unitary_getter = getattr(val, '_unitary_', None)
96
98
  result = NotImplemented if unitary_getter is None else unitary_getter()
@@ -12,12 +12,14 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- import pytest
16
-
17
15
  import numpy as np
16
+ import pytest
18
17
 
19
18
  import cirq
20
19
 
20
+ a = np.array([1])
21
+ b = np.array([1j])
22
+
21
23
 
22
24
  class NoMethod:
23
25
  pass
@@ -33,7 +35,7 @@ class ReturnsNotImplemented:
33
35
 
34
36
  class ReturnsValidTuple(cirq.SupportsMixture):
35
37
  def _mixture_(self):
36
- return ((0.4, 'a'), (0.6, 'b'))
38
+ return ((0.4, a), (0.6, b))
37
39
 
38
40
  def _has_mixture_(self):
39
41
  return True
@@ -41,27 +43,27 @@ class ReturnsValidTuple(cirq.SupportsMixture):
41
43
 
42
44
  class ReturnsNonnormalizedTuple:
43
45
  def _mixture_(self):
44
- return ((0.4, 'a'), (0.4, 'b'))
46
+ return ((0.4, a), (0.4, b))
45
47
 
46
48
 
47
49
  class ReturnsNegativeProbability:
48
50
  def _mixture_(self):
49
- return ((0.4, 'a'), (-0.4, 'b'))
51
+ return ((0.4, a), (-0.4, b))
50
52
 
51
53
 
52
54
  class ReturnsGreaterThanUnityProbability:
53
55
  def _mixture_(self):
54
- return ((1.2, 'a'), (0.4, 'b'))
56
+ return ((1.2, a), (0.4, b))
55
57
 
56
58
 
57
59
  class ReturnsMixtureButNoHasMixture:
58
60
  def _mixture_(self):
59
- return ((0.4, 'a'), (0.6, 'b'))
61
+ return ((0.4, a), (0.6, b))
60
62
 
61
63
 
62
64
  class ReturnsUnitary:
63
65
  def _unitary_(self):
64
- return np.ones((2, 2))
66
+ return np.eye(2)
65
67
 
66
68
  def _has_unitary_(self):
67
69
  return True
@@ -75,12 +77,18 @@ class ReturnsNotImplementedUnitary:
75
77
  return NotImplemented
76
78
 
77
79
 
80
+ class ReturnsMixtureOfReturnsUnitary:
81
+ def _mixture_(self):
82
+ return ((0.4, ReturnsUnitary()), (0.6, ReturnsUnitary()))
83
+
84
+
78
85
  @pytest.mark.parametrize(
79
86
  'val,mixture',
80
87
  (
81
- (ReturnsValidTuple(), ((0.4, 'a'), (0.6, 'b'))),
82
- (ReturnsNonnormalizedTuple(), ((0.4, 'a'), (0.4, 'b'))),
83
- (ReturnsUnitary(), ((1.0, np.ones((2, 2))),)),
88
+ (ReturnsValidTuple(), ((0.4, a), (0.6, b))),
89
+ (ReturnsNonnormalizedTuple(), ((0.4, a), (0.4, b))),
90
+ (ReturnsUnitary(), ((1.0, np.eye(2)),)),
91
+ (ReturnsMixtureOfReturnsUnitary(), ((0.4, np.eye(2)), (0.6, np.eye(2)))),
84
92
  ),
85
93
  )
86
94
  def test_objects_with_mixture(val, mixture):
@@ -89,7 +97,7 @@ def test_objects_with_mixture(val, mixture):
89
97
  np.testing.assert_almost_equal(keys, expected_keys)
90
98
  np.testing.assert_equal(values, expected_values)
91
99
 
92
- keys, values = zip(*cirq.mixture(val, ((0.3, 'a'), (0.7, 'b'))))
100
+ keys, values = zip(*cirq.mixture(val, ((0.3, a), (0.7, b))))
93
101
  np.testing.assert_almost_equal(keys, expected_keys)
94
102
  np.testing.assert_equal(values, expected_values)
95
103
 
@@ -102,7 +110,7 @@ def test_objects_with_no_mixture(val):
102
110
  _ = cirq.mixture(val)
103
111
  assert cirq.mixture(val, None) is None
104
112
  assert cirq.mixture(val, NotImplemented) is NotImplemented
105
- default = ((0.4, 'a'), (0.6, 'b'))
113
+ default = ((0.4, a), (0.6, b))
106
114
  assert cirq.mixture(val, default) == default
107
115
 
108
116
 
@@ -14,6 +14,7 @@
14
14
  """Protocol for obtaining expansion of linear operators in Pauli basis."""
15
15
 
16
16
  from typing import Any, TypeVar, Union
17
+
17
18
  from typing_extensions import Protocol
18
19
 
19
20
  from cirq import value
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Any, Callable, Optional, overload, TypeVar, TYPE_CHECKING, Union
15
+ from typing import Any, Callable, Optional, overload, TYPE_CHECKING, TypeVar, Union
16
16
 
17
17
  if TYPE_CHECKING:
18
18
  import cirq
cirq/protocols/qasm.py CHANGED
@@ -13,13 +13,13 @@
13
13
  # limitations under the License.
14
14
 
15
15
  import string
16
- from typing import TYPE_CHECKING, Union, Any, Tuple, TypeVar, Optional, Dict, Iterable
16
+ from types import NotImplementedType
17
+ from typing import Any, Dict, Iterable, Optional, Tuple, TYPE_CHECKING, TypeVar, Union
17
18
 
18
19
  from typing_extensions import Protocol
19
20
 
20
21
  from cirq import ops
21
22
  from cirq._doc import doc_private
22
- from cirq.type_workarounds import NotImplementedType
23
23
 
24
24
  if TYPE_CHECKING:
25
25
  import cirq
@@ -38,6 +38,7 @@ class QasmArgs(string.Formatter):
38
38
  version: str = '2.0',
39
39
  qubit_id_map: Optional[Dict['cirq.Qid', str]] = None,
40
40
  meas_key_id_map: Optional[Dict[str, str]] = None,
41
+ meas_key_bitcount: Optional[Dict[str, int]] = None,
41
42
  ) -> None:
42
43
  """Inits QasmArgs.
43
44
 
@@ -49,11 +50,21 @@ class QasmArgs(string.Formatter):
49
50
  qubit_id_map: A dictionary mapping qubits to qreg QASM identifiers.
50
51
  meas_key_id_map: A dictionary mapping measurement keys to creg QASM
51
52
  identifiers.
53
+ meas_key_bitcount: A dictionary with of bits for each measurement
54
+ key.
52
55
  """
53
56
  self.precision = precision
54
57
  self.version = version
55
58
  self.qubit_id_map = {} if qubit_id_map is None else qubit_id_map
56
59
  self.meas_key_id_map = {} if meas_key_id_map is None else meas_key_id_map
60
+ self.meas_key_bitcount = {} if meas_key_bitcount is None else meas_key_bitcount
61
+
62
+ def _format_number(self, value) -> str:
63
+ """OpenQASM 2.0 does not support '1e-5' and wants '1.0e-5'"""
64
+ s = f'{value}'
65
+ if 'e' in s and not '.' in s:
66
+ return s.replace('e', '.0e')
67
+ return s
57
68
 
58
69
  def format_field(self, value: Any, spec: str) -> str:
59
70
  """Method of string.Formatter that specifies the output of format()."""
@@ -61,8 +72,10 @@ class QasmArgs(string.Formatter):
61
72
  if isinstance(value, float):
62
73
  value = round(value, self.precision)
63
74
  if spec == 'half_turns':
64
- value = f'pi*{value}' if value != 0 else '0'
75
+ value = f'pi*{self._format_number(value)}' if value != 0 else '0'
65
76
  spec = ''
77
+ else:
78
+ value = self._format_number(value)
66
79
  elif isinstance(value, ops.Qid):
67
80
  value = self.qubit_id_map[value]
68
81
  elif isinstance(value, str) and spec == 'meas':
@@ -138,7 +151,7 @@ def qasm(
138
151
  involving qubits that the operation wouldn't otherwise know about.
139
152
  qubits: A list of qubits that the value is being applied to. This is
140
153
  needed for `cirq.Gate` values, which otherwise wouldn't know what
141
- qubits to talk about.
154
+ qubits to talk about. It should generally not be specified otherwise.
142
155
  default: A default result to use if the value doesn't have a
143
156
  `_qasm_` method or that method returns `NotImplemented` or `None`.
144
157
  If not specified, non-decomposable values cause a `TypeError`.
@@ -159,10 +172,16 @@ def qasm(
159
172
  kwargs: Dict[str, Any] = {}
160
173
  if args is not None:
161
174
  kwargs['args'] = args
175
+ # pylint: disable=not-callable
162
176
  if qubits is not None:
163
177
  kwargs['qubits'] = tuple(qubits)
164
- # pylint: disable=not-callable
165
- result = method(**kwargs)
178
+ try:
179
+ result = method(**kwargs)
180
+ except TypeError as error:
181
+ raise TypeError(
182
+ "cirq.qasm does not expect qubits or args to be specified"
183
+ f"for the given value of type {type(val)}."
184
+ ) from error
166
185
  # pylint: enable=not-callable
167
186
  if result is not None and result is not NotImplemented:
168
187
  return result
@@ -52,3 +52,20 @@ def test_qasm():
52
52
 
53
53
  assert cirq.qasm(ExpectsArgs(), args=cirq.QasmArgs()) == 'text'
54
54
  assert cirq.qasm(ExpectsArgsQubits(), args=cirq.QasmArgs(), qubits=()) == 'text'
55
+
56
+
57
+ def test_qasm_qubits_improperly_supplied():
58
+ with pytest.raises(TypeError, match="does not expect qubits or args to be specified"):
59
+ _ = cirq.qasm(cirq.Circuit(), qubits=[cirq.LineQubit(1)])
60
+
61
+
62
+ def test_qasm_args_formatting():
63
+ args = cirq.QasmArgs()
64
+ assert args.format_field(0.01, '') == '0.01'
65
+ assert args.format_field(0.01, 'half_turns') == 'pi*0.01'
66
+ assert args.format_field(0.00001, '') == '1.0e-05'
67
+ assert args.format_field(0.00001, 'half_turns') == 'pi*1.0e-05'
68
+ assert args.format_field(1e-10, 'half_turns') == 'pi*1.0e-10'
69
+ args = cirq.QasmArgs(precision=6)
70
+ assert args.format_field(0.00001234, '') == '1.2e-05'
71
+ assert args.format_field(0.00001234, 'half_turns') == 'pi*1.2e-05'
@@ -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 types import NotImplementedType
15
16
  from typing import Any, Sequence, Tuple, TypeVar, Union
16
17
 
17
18
  from typing_extensions import Protocol
18
19
 
19
20
  from cirq import ops
20
- from cirq._doc import document, doc_private
21
- from cirq.type_workarounds import NotImplementedType
21
+ from cirq._doc import doc_private, document
22
22
 
23
23
  # This is a special indicator value used by the methods to determine whether or
24
24
  # not the caller provided a 'default' argument. It must be of type
@@ -14,10 +14,9 @@
14
14
 
15
15
  import numbers
16
16
  from typing import AbstractSet, Any, cast, TYPE_CHECKING, TypeVar
17
- from typing_extensions import Self
18
17
 
19
18
  import sympy
20
- from typing_extensions import Protocol
19
+ from typing_extensions import Protocol, Self
21
20
 
22
21
  from cirq import study
23
22
  from cirq._doc import doc_private
@@ -68,7 +67,7 @@ def is_parameterized(val: Any) -> bool:
68
67
 
69
68
  A value is parameterized when it has an `_is_parameterized_` method and
70
69
  that method returns a truthy value, or if the value is an instance of
71
- sympy.Basic.
70
+ sympy.Basic. Note this covers sympy constants such as `sympy.pi`.
72
71
 
73
72
  Returns:
74
73
  True if the gate has any unresolved Symbols
@@ -12,7 +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, sympy
15
+ import pytest
16
+ import sympy
16
17
 
17
18
  import cirq
18
19
  from cirq.study import ParamResolver
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Any, TypeVar, Optional, Sequence, Union
15
+ from typing import Any, Optional, Sequence, TypeVar, Union
16
16
 
17
17
  import numpy as np
18
18
  from typing_extensions import Protocol
@@ -13,6 +13,7 @@
13
13
  # limitations under the License.
14
14
 
15
15
  import numpy as np
16
+
16
17
  import cirq
17
18
 
18
19
 
@@ -12,16 +12,16 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Any, TypeVar, Union, Optional
15
+ from types import NotImplementedType
16
+ from typing import Any, Optional, TypeVar, Union
16
17
 
17
18
  import numpy as np
18
19
  from typing_extensions import Protocol
19
20
 
20
21
  from cirq._doc import doc_private
21
22
  from cirq.protocols import qid_shape_protocol
22
- from cirq.protocols.apply_unitary_protocol import ApplyUnitaryArgs, apply_unitaries
23
+ from cirq.protocols.apply_unitary_protocol import apply_unitaries, ApplyUnitaryArgs
23
24
  from cirq.protocols.decompose_protocol import _try_decompose_into_operations_and_qubits
24
- from cirq.type_workarounds import NotImplementedType
25
25
 
26
26
  # This is a special indicator value used by the unitary method to determine
27
27
  # whether or not the caller provided a 'default' argument. It must be of type
@@ -286,7 +286,7 @@ def test_unitary_from_apply_unitary():
286
286
 
287
287
  class UnknownType:
288
288
  def _apply_unitary_(self, args):
289
- assert False
289
+ assert False # pragma: no cover
290
290
 
291
291
  class ApplyGateNotUnitary(cirq.Gate):
292
292
  def num_qubits(self):
cirq/qis/__init__.py CHANGED
@@ -15,48 +15,61 @@
15
15
  """Tools and methods for primitives used in quantum information science."""
16
16
 
17
17
  from cirq.qis.channels import (
18
- choi_to_kraus,
19
- choi_to_superoperator,
20
- kraus_to_choi,
21
- kraus_to_superoperator,
22
- operation_to_choi,
23
- operation_to_superoperator,
24
- superoperator_to_choi,
25
- superoperator_to_kraus,
18
+ choi_to_kraus as choi_to_kraus,
19
+ choi_to_superoperator as choi_to_superoperator,
20
+ kraus_to_choi as kraus_to_choi,
21
+ kraus_to_superoperator as kraus_to_superoperator,
22
+ operation_to_choi as operation_to_choi,
23
+ operation_to_superoperator as operation_to_superoperator,
24
+ superoperator_to_choi as superoperator_to_choi,
25
+ superoperator_to_kraus as superoperator_to_kraus,
26
26
  )
27
27
 
28
- from cirq.qis.clifford_tableau import CliffordTableau, StabilizerState
28
+ from cirq.qis.clifford_tableau import (
29
+ CliffordTableau as CliffordTableau,
30
+ StabilizerState as StabilizerState,
31
+ )
29
32
 
30
- from cirq.qis.measures import entanglement_fidelity, fidelity, von_neumann_entropy
33
+ from cirq.qis.measures import (
34
+ entanglement_fidelity as entanglement_fidelity,
35
+ fidelity as fidelity,
36
+ von_neumann_entropy as von_neumann_entropy,
37
+ )
31
38
 
32
- from cirq.qis.quantum_state_representation import QuantumStateRepresentation
39
+ from cirq.qis.quantum_state_representation import (
40
+ QuantumStateRepresentation as QuantumStateRepresentation,
41
+ )
33
42
 
34
43
  from cirq.qis.states import (
35
- bloch_vector_from_state_vector,
36
- density_matrix,
37
- density_matrix_from_state_vector,
38
- dirac_notation,
39
- eye_tensor,
40
- infer_qid_shape,
41
- one_hot,
42
- QUANTUM_STATE_LIKE,
43
- QuantumState,
44
- quantum_state,
45
- STATE_VECTOR_LIKE,
46
- to_valid_density_matrix,
47
- to_valid_state_vector,
48
- validate_density_matrix,
49
- validate_indices,
50
- validate_qid_shape,
51
- validate_normalized_state_vector,
44
+ bloch_vector_from_state_vector as bloch_vector_from_state_vector,
45
+ density_matrix as density_matrix,
46
+ density_matrix_from_state_vector as density_matrix_from_state_vector,
47
+ dirac_notation as dirac_notation,
48
+ eye_tensor as eye_tensor,
49
+ infer_qid_shape as infer_qid_shape,
50
+ one_hot as one_hot,
51
+ QUANTUM_STATE_LIKE as QUANTUM_STATE_LIKE,
52
+ QuantumState as QuantumState,
53
+ quantum_state as quantum_state,
54
+ STATE_VECTOR_LIKE as STATE_VECTOR_LIKE,
55
+ to_valid_density_matrix as to_valid_density_matrix,
56
+ to_valid_state_vector as to_valid_state_vector,
57
+ validate_density_matrix as validate_density_matrix,
58
+ validate_indices as validate_indices,
59
+ validate_qid_shape as validate_qid_shape,
60
+ validate_normalized_state_vector as validate_normalized_state_vector,
52
61
  )
53
62
 
54
63
  from cirq.qis.noise_utils import (
55
- decay_constant_to_xeb_fidelity,
56
- decay_constant_to_pauli_error,
57
- pauli_error_to_decay_constant,
58
- xeb_fidelity_to_decay_constant,
59
- pauli_error_from_t1,
60
- average_error,
61
- decoherence_pauli_error,
64
+ decay_constant_to_xeb_fidelity as decay_constant_to_xeb_fidelity,
65
+ decay_constant_to_pauli_error as decay_constant_to_pauli_error,
66
+ pauli_error_to_decay_constant as pauli_error_to_decay_constant,
67
+ xeb_fidelity_to_decay_constant as xeb_fidelity_to_decay_constant,
68
+ pauli_error_from_t1 as pauli_error_from_t1,
69
+ average_error as average_error,
70
+ decoherence_pauli_error as decoherence_pauli_error,
71
+ )
72
+
73
+ from cirq.qis.entropy import (
74
+ process_renyi_entropy_from_bitstrings as process_renyi_entropy_from_bitstrings,
62
75
  )
cirq/qis/channels_test.py CHANGED
@@ -51,15 +51,6 @@ def compute_choi(channel: cirq.SupportsKraus) -> np.ndarray:
51
51
  return c
52
52
 
53
53
 
54
- def compute_superoperator(channel: cirq.SupportsKraus) -> np.ndarray:
55
- ks = cirq.kraus(channel)
56
- d_out, d_in = ks[0].shape
57
- m = np.zeros((d_out * d_out, d_in * d_in), dtype=np.complex128)
58
- for k, e_in in enumerate(generate_standard_operator_basis(d_in, d_in)):
59
- m[:, k] = np.reshape(apply_channel(channel, e_in), d_out * d_out)
60
- return m
61
-
62
-
63
54
  @pytest.mark.parametrize(
64
55
  'kraus_operators, expected_choi',
65
56
  (