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
@@ -14,10 +14,11 @@
14
14
 
15
15
  import abc
16
16
  from typing import Any, Dict, List, Optional, Sequence, TYPE_CHECKING
17
+
17
18
  import numpy as np
18
19
 
19
20
  from cirq import protocols
20
- from cirq._compat import proper_repr, cached_method
21
+ from cirq._compat import _method_cache_name, cached_method, proper_repr
21
22
  from cirq.qis import quantum_state_representation
22
23
  from cirq.value import big_endian_int_to_digits, linear_dict, random_state
23
24
 
@@ -326,32 +327,42 @@ class CliffordTableau(StabilizerState):
326
327
  return string
327
328
 
328
329
  def _str_full_(self) -> str:
329
- string = ''
330
-
331
- string += 'stable' + ' ' * max(self.n * 2 - 3, 1)
332
- string += '| destable\n'
333
- string += '-' * max(7, self.n * 2 + 3) + '+' + '-' * max(10, self.n * 2 + 4) + '\n'
334
-
335
- for j in range(self.n):
336
- for i in [j + self.n, j]:
337
- string += '- ' if self.rs[i] else '+ '
338
-
339
- for k in range(self.n):
340
- if self.xs[i, k] & (not self.zs[i, k]):
341
- string += f'X{k}'
342
- elif (not self.xs[i, k]) & self.zs[i, k]:
343
- string += f'Z{k}'
344
- elif self.xs[i, k] & self.zs[i, k]:
345
- string += f'Y{k}'
346
- else:
347
- string += ' '
348
-
349
- if i == j + self.n:
350
- string += ' ' * max(0, 4 - self.n * 2) + ' | '
351
-
352
- string += '\n'
330
+ left_col_width = max(7, self.n * 2 + 3)
331
+ right_col_width = max(10, self.n * 2 + 4)
332
+
333
+ def _fill_row(left: str, right: str, mid='|', fill=' ') -> str:
334
+ """Builds a left-aligned fixed-width row with 2 columns."""
335
+ return f"{left:{fill}<{left_col_width}}{mid}{right:{fill}<{right_col_width}}".rstrip()
336
+
337
+ def _pauli_from_matrix(r: int, c: int) -> str:
338
+ match (bool(self.xs[r, c]), bool(self.zs[r, c])):
339
+ case (True, False):
340
+ return f'X{c}'
341
+ case (False, True):
342
+ return f'Z{c}'
343
+ case (True, True):
344
+ return f'Y{c}'
345
+ case _:
346
+ # (False, False) is the only leftover option
347
+ return ' '
348
+
349
+ title_row = _fill_row('stable', ' destable')
350
+ divider = _fill_row('', '', mid='+', fill='-')
351
+ contents = [
352
+ _fill_row(
353
+ left=(
354
+ f"{'-' if self.rs[i + self.n] else '+'} "
355
+ f"{''.join(_pauli_from_matrix(i + self.n, j) for j in range(self.n))}"
356
+ ),
357
+ right=(
358
+ f" {'-' if self.rs[i] else '+'} "
359
+ f"{''.join(_pauli_from_matrix(i, j) for j in range(self.n))}"
360
+ ),
361
+ )
362
+ for i in range(self.n)
363
+ ]
353
364
 
354
- return string
365
+ return '\n'.join([title_row, divider, *contents]) + '\n'
355
366
 
356
367
  def then(self, second: 'CliffordTableau') -> 'CliffordTableau':
357
368
  """Returns a composed CliffordTableau of this tableau and the second tableau.
@@ -658,3 +669,12 @@ class CliffordTableau(StabilizerState):
658
669
  @cached_method
659
670
  def __hash__(self) -> int:
660
671
  return hash(self.matrix().tobytes() + self.rs.tobytes())
672
+
673
+ def __getstate__(self) -> Dict[str, Any]:
674
+ # clear cached hash value when pickling, see #6674
675
+ state = self.__dict__
676
+ hash_attr = _method_cache_name(self.__hash__)
677
+ if hash_attr in state:
678
+ state = state.copy()
679
+ del state[hash_attr]
680
+ return state
@@ -13,6 +13,7 @@
13
13
  # limitations under the License.
14
14
 
15
15
  """Tests for clifford tableau."""
16
+
16
17
  import numpy as np
17
18
  import pytest
18
19
 
@@ -308,7 +309,7 @@ def test_str_full():
308
309
  t = cirq.CliffordTableau(num_qubits=2)
309
310
  expected_str = r"""stable | destable
310
311
  -------+----------
311
- + Z0 | + X0
312
+ + Z0 | + X0
312
313
  + Z1 | + X1
313
314
  """
314
315
  assert t._str_full_() == expected_str
cirq/qis/entropy.py ADDED
@@ -0,0 +1,115 @@
1
+ # Copyright 2024 The Cirq Developers
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from collections.abc import Sequence
16
+ from concurrent.futures import ThreadPoolExecutor
17
+ from itertools import product
18
+ from typing import Any, Optional
19
+
20
+ import numpy as np
21
+ import numpy.typing as npt
22
+
23
+
24
+ def _get_hamming_distance(
25
+ bitstring_1: npt.NDArray[np.int8], bitstring_2: npt.NDArray[np.int8]
26
+ ) -> int:
27
+ """Calculates the Hamming distance between two bitstrings.
28
+ Args:
29
+ bitstring_1: Bitstring 1
30
+ bitstring_2: Bitstring 2
31
+ Returns: The Hamming distance
32
+ """
33
+ return (bitstring_1 ^ bitstring_2).sum().item()
34
+
35
+
36
+ def _bitstrings_to_probs(
37
+ bitstrings: npt.NDArray[np.int8],
38
+ ) -> tuple[npt.NDArray[np.int8], npt.NDArray[Any]]:
39
+ """Given a list of bitstrings from different measurements returns a probability distribution.
40
+ Args:
41
+ bitstrings: The bitstring
42
+ Returns:
43
+ A tuple of bitstrings and their corresponding probabilities.
44
+ """
45
+
46
+ num_shots = bitstrings.shape[0]
47
+ unique_bitstrings, counts = np.unique(bitstrings, return_counts=True, axis=0)
48
+ probs = counts / num_shots
49
+
50
+ return (unique_bitstrings, probs)
51
+
52
+
53
+ def _bitstring_format_helper(
54
+ measured_bitstrings: npt.NDArray[np.int8], subsystem: Sequence[int] | None = None
55
+ ) -> npt.NDArray[np.int8]:
56
+ """Formats the bitstring for analysis based on the selected subsystem.
57
+ Args:
58
+ measured_bitstrings: List of sampled measurement outcomes as a numpy array of bitstrings.
59
+ subsystem: Subsystem of interest
60
+ Returns: The bitstring string for the subsystem
61
+ """
62
+ if subsystem is None:
63
+ return measured_bitstrings
64
+
65
+ return measured_bitstrings[:, :, subsystem]
66
+
67
+
68
+ def _compute_bitstrings_contribution_to_purity(bitstrings: npt.NDArray[np.int8]) -> float:
69
+ """Computes the contribution to the purity of the bitstrings.
70
+ Args:
71
+ bitstrings: The bitstrings measured using the same unitary operators
72
+ Returns: The purity of the bitstring
73
+ """
74
+
75
+ bitstrings, probs = _bitstrings_to_probs(bitstrings)
76
+ purity = 0
77
+ for (s, p), (s_prime, p_prime) in product(zip(bitstrings, probs), repeat=2):
78
+ purity += (-2.0) ** float(-_get_hamming_distance(s, s_prime)) * p * p_prime
79
+
80
+ return purity * 2 ** (bitstrings.shape[-1])
81
+
82
+
83
+ def process_renyi_entropy_from_bitstrings(
84
+ measured_bitstrings: npt.NDArray[np.int8],
85
+ subsystem: tuple[int] | None = None,
86
+ pool: Optional[ThreadPoolExecutor] = None,
87
+ ) -> float:
88
+ """Compute the Rényi entropy of an array of bitstrings.
89
+ Args:
90
+ measured_bitstrings: List of sampled measurement outcomes as a numpy array of bitstrings.
91
+ subsystem: Subsystem of interest
92
+ pool: ThreadPoolExecutor used to paralelleize the computation.
93
+
94
+ Returns:
95
+ A float indicating the computed entropy.
96
+ """
97
+ bitstrings = _bitstring_format_helper(measured_bitstrings, subsystem)
98
+ num_shots = bitstrings.shape[1]
99
+ num_qubits = bitstrings.shape[-1]
100
+
101
+ if num_shots == 1:
102
+ return 0
103
+
104
+ if pool is not None:
105
+ purities = list(pool.map(_compute_bitstrings_contribution_to_purity, list(bitstrings)))
106
+ purity = np.mean(purities)
107
+
108
+ else:
109
+ purity = np.mean(
110
+ [_compute_bitstrings_contribution_to_purity(bitstring) for bitstring in bitstrings]
111
+ )
112
+
113
+ purity_unbiased = purity * num_shots / (num_shots - 1) - (2**num_qubits) / (num_shots - 1)
114
+
115
+ return -np.log2(purity_unbiased)
@@ -0,0 +1,43 @@
1
+ # Copyright 2024 The Cirq Developers
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from concurrent.futures import ThreadPoolExecutor
16
+
17
+ import numpy as np
18
+ import pytest
19
+
20
+ from cirq.qis.entropy import process_renyi_entropy_from_bitstrings
21
+
22
+
23
+ @pytest.mark.parametrize('pool', [None, ThreadPoolExecutor(max_workers=1)])
24
+ def test_process_renyi_entropy_from_bitstrings(pool):
25
+ bitstrings = np.array(
26
+ [
27
+ [[0, 1, 1, 0], [1, 0, 0, 0], [0, 0, 0, 1], [0, 1, 1, 1]],
28
+ [[0, 1, 1, 0], [0, 1, 1, 0], [1, 1, 0, 0], [1, 1, 0, 1]],
29
+ [[0, 0, 1, 1], [0, 0, 0, 0], [0, 1, 1, 1], [0, 1, 1, 1]],
30
+ [[1, 0, 1, 1], [0, 1, 0, 0], [0, 1, 0, 1], [0, 1, 0, 0]],
31
+ [[1, 0, 1, 1], [0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 0, 1]],
32
+ ]
33
+ )
34
+ substsytem = (0, 1)
35
+ entropy = process_renyi_entropy_from_bitstrings(bitstrings, substsytem, pool)
36
+ assert entropy == 0.5145731728297583
37
+
38
+
39
+ def test_process_renyi_entropy_from_bitstrings_safeguards_against_divide_by_0_error():
40
+ bitstrings = np.array([[[0, 1, 1, 0]], [[0, 1, 1, 0]], [[0, 0, 1, 1]]])
41
+
42
+ entropy = process_renyi_entropy_from_bitstrings(bitstrings)
43
+ assert entropy == 0
cirq/qis/measures.py CHANGED
@@ -14,15 +14,15 @@
14
14
  """Measures on and between quantum states and operations."""
15
15
 
16
16
 
17
- from typing import Optional, TYPE_CHECKING, Tuple
17
+ from typing import Optional, Tuple, TYPE_CHECKING
18
18
 
19
19
  import numpy as np
20
20
 
21
- from cirq import protocols, value, _import
21
+ from cirq import _import, protocols, value
22
22
  from cirq.qis.states import (
23
- QuantumState,
24
23
  infer_qid_shape,
25
24
  quantum_state,
25
+ QuantumState,
26
26
  validate_density_matrix,
27
27
  validate_normalized_state_vector,
28
28
  )
@@ -247,7 +247,8 @@ def _fidelity_state_vectors_or_density_matrices(state1: np.ndarray, state2: np.n
247
247
  eigs = linalg.eigvalsh(state1_sqrt @ state2 @ state1_sqrt)
248
248
  trace = np.sum(np.sqrt(np.abs(eigs)))
249
249
  return trace**2
250
- raise ValueError(
250
+ # matrix is reshaped before this point
251
+ raise ValueError( # pragma: no cover
251
252
  'The given arrays must be one- or two-dimensional. '
252
253
  f'Got shapes {state1.shape} and {state2.shape}.'
253
254
  )
cirq/qis/measures_test.py CHANGED
@@ -34,6 +34,13 @@ def test_fidelity_symmetric():
34
34
  )
35
35
 
36
36
 
37
+ def test_bad_fidelity():
38
+ arr = np.asarray([[[1j, 0], [0, 0]], [[0, 0], [0, 0]]])
39
+ assert arr.ndim > 2
40
+ assert arr.dtype.kind == 'c'
41
+ _ = cirq.fidelity(arr, arr)
42
+
43
+
37
44
  def test_fidelity_between_zero_and_one():
38
45
  assert 0 <= cirq.fidelity(VEC1, VEC2) <= 1
39
46
  assert 0 <= cirq.fidelity(VEC1, MAT1) <= 1
@@ -16,13 +16,13 @@ import numpy as np
16
16
  import pytest
17
17
 
18
18
  from cirq.qis.noise_utils import (
19
- decay_constant_to_xeb_fidelity,
19
+ average_error,
20
20
  decay_constant_to_pauli_error,
21
+ decay_constant_to_xeb_fidelity,
22
+ decoherence_pauli_error,
23
+ pauli_error_from_t1,
21
24
  pauli_error_to_decay_constant,
22
25
  xeb_fidelity_to_decay_constant,
23
- pauli_error_from_t1,
24
- average_error,
25
- decoherence_pauli_error,
26
26
  )
27
27
 
28
28
 
@@ -14,9 +14,9 @@
14
14
 
15
15
  import abc
16
16
  from typing import List, Sequence, Tuple, TYPE_CHECKING
17
- from typing_extensions import Self
18
17
 
19
18
  import numpy as np
19
+ from typing_extensions import Self
20
20
 
21
21
  from cirq import value
22
22
 
cirq/qis/states.py CHANGED
@@ -14,8 +14,8 @@
14
14
 
15
15
  """Classes and methods for quantum states."""
16
16
 
17
- from typing import Any, cast, Iterable, List, Optional, Sequence, Set, TYPE_CHECKING, Tuple, Union
18
17
  import itertools
18
+ from typing import Any, cast, Iterable, List, Optional, Sequence, Set, Tuple, TYPE_CHECKING, Union
19
19
 
20
20
  import numpy as np
21
21
 
@@ -23,9 +23,10 @@ from cirq import value
23
23
  from cirq._doc import document
24
24
 
25
25
  if TYPE_CHECKING:
26
- import cirq
27
26
  from numpy.typing import DTypeLike
28
27
 
28
+ import cirq
29
+
29
30
  DEFAULT_COMPLEX_DTYPE = np.complex64
30
31
 
31
32
  STATE_VECTOR_LIKE = Union[
@@ -35,7 +36,7 @@ STATE_VECTOR_LIKE = Union[
35
36
  Sequence[int],
36
37
  # Explicit state vector or state tensor.
37
38
  np.ndarray,
38
- Sequence[Union[int, float, complex]],
39
+ Sequence[complex],
39
40
  # Product state object
40
41
  'cirq.ProductState',
41
42
  ]
@@ -264,7 +265,7 @@ def quantum_state(
264
265
  dtype = DEFAULT_COMPLEX_DTYPE
265
266
  data = one_hot(index=state, shape=(dim,), dtype=dtype)
266
267
  else:
267
- data = np.array(state, copy=False)
268
+ data = np.asarray(state)
268
269
  if qid_shape is None:
269
270
  qid_shape = infer_qid_shape(state)
270
271
  if data.ndim == 1 and data.dtype.kind != 'c':
@@ -341,7 +342,7 @@ _NON_INT_STATE_LIKE = Union[
341
342
  Sequence[int],
342
343
  # Explicit state vector or state tensor.
343
344
  np.ndarray,
344
- Sequence[Union[int, float, complex]],
345
+ Sequence[complex],
345
346
  # Product state object
346
347
  'cirq.ProductState',
347
348
  # Quantum state object
@@ -677,7 +678,6 @@ def density_matrix_from_state_vector(
677
678
  sum_inds = np.array(range(n_qubits))
678
679
  sum_inds[indices] += n_qubits
679
680
 
680
- # TODO(#5757): remove type ignore when numpy has proper override signature.
681
681
  rho = np.einsum(
682
682
  state_vector,
683
683
  list(range(n_qubits)),
@@ -845,7 +845,7 @@ def _qudit_values_to_state_tensor(
845
845
  )
846
846
 
847
847
  if state_vector.dtype.kind[0] not in '?bBiu':
848
- raise ValueError(
848
+ raise ValueError( # pragma: no cover
849
849
  f'Expected a bool or int entry for each qudit in '
850
850
  f'`state`, because len(state) == len(qid_shape), '
851
851
  f'but got dtype {state_vector.dtype}.'
cirq/sim/__init__.py CHANGED
@@ -15,63 +15,81 @@
15
15
  """Classes for circuit simulators and base implementations of these classes."""
16
16
 
17
17
  from cirq.sim.clifford import (
18
- CliffordSimulator,
19
- CliffordSimulatorStepResult,
20
- CliffordState,
21
- CliffordTrialResult,
22
- CliffordTableauSimulationState,
23
- StabilizerChFormSimulationState,
24
- StabilizerSampler,
25
- StabilizerSimulationState,
26
- StabilizerStateChForm,
18
+ CliffordSimulator as CliffordSimulator,
19
+ CliffordSimulatorStepResult as CliffordSimulatorStepResult,
20
+ CliffordState as CliffordState,
21
+ CliffordTrialResult as CliffordTrialResult,
22
+ CliffordTableauSimulationState as CliffordTableauSimulationState,
23
+ StabilizerChFormSimulationState as StabilizerChFormSimulationState,
24
+ StabilizerSampler as StabilizerSampler,
25
+ StabilizerSimulationState as StabilizerSimulationState,
26
+ StabilizerStateChForm as StabilizerStateChForm,
27
27
  )
28
28
 
29
- from cirq.sim.density_matrix_simulation_state import DensityMatrixSimulationState
29
+ from cirq.sim.density_matrix_simulation_state import (
30
+ DensityMatrixSimulationState as DensityMatrixSimulationState,
31
+ )
30
32
 
31
33
  from cirq.sim.density_matrix_simulator import (
32
- DensityMatrixSimulator,
33
- DensityMatrixStepResult,
34
- DensityMatrixTrialResult,
34
+ DensityMatrixSimulator as DensityMatrixSimulator,
35
+ DensityMatrixStepResult as DensityMatrixStepResult,
36
+ DensityMatrixTrialResult as DensityMatrixTrialResult,
35
37
  )
36
38
 
37
- from cirq.sim.density_matrix_utils import measure_density_matrix, sample_density_matrix
39
+ from cirq.sim.density_matrix_utils import (
40
+ measure_density_matrix as measure_density_matrix,
41
+ sample_density_matrix as sample_density_matrix,
42
+ )
38
43
 
39
44
  from cirq.sim.mux import (
40
- CIRCUIT_LIKE,
41
- final_density_matrix,
42
- final_state_vector,
43
- sample,
44
- sample_sweep,
45
+ CIRCUIT_LIKE as CIRCUIT_LIKE,
46
+ final_density_matrix as final_density_matrix,
47
+ final_state_vector as final_state_vector,
48
+ sample as sample,
49
+ sample_sweep as sample_sweep,
45
50
  )
46
51
 
47
- from cirq.sim.simulation_product_state import SimulationProductState
52
+ from cirq.sim.simulation_product_state import SimulationProductState as SimulationProductState
48
53
 
49
- from cirq.sim.simulation_state import SimulationState
54
+ from cirq.sim.simulation_state import SimulationState as SimulationState
50
55
 
51
- from cirq.sim.simulation_state_base import SimulationStateBase
56
+ from cirq.sim.simulation_state_base import SimulationStateBase as SimulationStateBase
52
57
 
53
58
  from cirq.sim.simulator import (
54
- SimulatesAmplitudes,
55
- SimulatesExpectationValues,
56
- SimulatesFinalState,
57
- SimulatesIntermediateState,
58
- SimulatesSamples,
59
- SimulationTrialResult,
60
- StepResult,
59
+ SimulatesAmplitudes as SimulatesAmplitudes,
60
+ SimulatesExpectationValues as SimulatesExpectationValues,
61
+ SimulatesFinalState as SimulatesFinalState,
62
+ SimulatesIntermediateState as SimulatesIntermediateState,
63
+ SimulatesSamples as SimulatesSamples,
64
+ SimulationTrialResult as SimulationTrialResult,
65
+ StepResult as StepResult,
61
66
  )
62
67
 
63
- from cirq.sim.simulator_base import SimulationTrialResultBase, SimulatorBase, StepResultBase
68
+ from cirq.sim.simulator_base import (
69
+ SimulationTrialResultBase as SimulationTrialResultBase,
70
+ SimulatorBase as SimulatorBase,
71
+ StepResultBase as StepResultBase,
72
+ )
64
73
 
65
- from cirq.sim.sparse_simulator import Simulator, SparseSimulatorStep
74
+ from cirq.sim.sparse_simulator import (
75
+ Simulator as Simulator,
76
+ SparseSimulatorStep as SparseSimulatorStep,
77
+ )
66
78
 
67
- from cirq.sim.state_vector import measure_state_vector, sample_state_vector, StateVectorMixin
79
+ from cirq.sim.state_vector import (
80
+ measure_state_vector as measure_state_vector,
81
+ sample_state_vector as sample_state_vector,
82
+ StateVectorMixin as StateVectorMixin,
83
+ )
68
84
 
69
- from cirq.sim.state_vector_simulation_state import StateVectorSimulationState
85
+ from cirq.sim.state_vector_simulation_state import (
86
+ StateVectorSimulationState as StateVectorSimulationState,
87
+ )
70
88
 
71
- from cirq.sim.classical_simulator import ClassicalStateSimulator
89
+ from cirq.sim.classical_simulator import ClassicalStateSimulator as ClassicalStateSimulator
72
90
 
73
91
  from cirq.sim.state_vector_simulator import (
74
- SimulatesIntermediateStateVector,
75
- StateVectorStepResult,
76
- StateVectorTrialResult,
92
+ SimulatesIntermediateStateVector as SimulatesIntermediateStateVector,
93
+ StateVectorStepResult as StateVectorStepResult,
94
+ StateVectorTrialResult as StateVectorTrialResult,
77
95
  )
@@ -13,14 +13,15 @@
13
13
  # limitations under the License.
14
14
 
15
15
 
16
- from typing import Dict, Generic, Any, Sequence, List, Optional, Union, TYPE_CHECKING
17
- from copy import deepcopy, copy
18
- from cirq import ops, qis
19
- from cirq.value import big_endian_int_to_bits
20
- from cirq import sim
21
- from cirq.sim.simulation_state import TSimulationState, SimulationState
16
+ from copy import copy, deepcopy
17
+ from typing import Any, Dict, Generic, List, Optional, Sequence, TYPE_CHECKING, Union
18
+
22
19
  import numpy as np
23
20
 
21
+ from cirq import ops, qis, sim
22
+ from cirq.sim.simulation_state import SimulationState, TSimulationState
23
+ from cirq.value import big_endian_int_to_bits
24
+
24
25
  if TYPE_CHECKING:
25
26
  import cirq
26
27
 
@@ -13,11 +13,13 @@
13
13
  # limitations under the License.
14
14
 
15
15
  from itertools import product
16
+
16
17
  import numpy as np
17
18
  import pytest
18
- import cirq
19
19
  import sympy
20
20
 
21
+ import cirq
22
+
21
23
 
22
24
  def test_x_gate():
23
25
  q0, q1 = cirq.LineQubit.range(2)
@@ -1,18 +1,26 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
2
 
3
3
  from cirq.sim.clifford.clifford_simulator import (
4
- CliffordSimulator,
5
- CliffordSimulatorStepResult,
6
- CliffordState,
7
- CliffordTrialResult,
4
+ CliffordSimulator as CliffordSimulator,
5
+ CliffordSimulatorStepResult as CliffordSimulatorStepResult,
6
+ CliffordState as CliffordState,
7
+ CliffordTrialResult as CliffordTrialResult,
8
8
  )
9
9
 
10
- from cirq.sim.clifford.clifford_tableau_simulation_state import CliffordTableauSimulationState
10
+ from cirq.sim.clifford.clifford_tableau_simulation_state import (
11
+ CliffordTableauSimulationState as CliffordTableauSimulationState,
12
+ )
11
13
 
12
- from cirq.sim.clifford.stabilizer_ch_form_simulation_state import StabilizerChFormSimulationState
14
+ from cirq.sim.clifford.stabilizer_ch_form_simulation_state import (
15
+ StabilizerChFormSimulationState as StabilizerChFormSimulationState,
16
+ )
13
17
 
14
- from cirq.sim.clifford.stabilizer_sampler import StabilizerSampler
18
+ from cirq.sim.clifford.stabilizer_sampler import StabilizerSampler as StabilizerSampler
15
19
 
16
- from cirq.sim.clifford.stabilizer_simulation_state import StabilizerSimulationState
20
+ from cirq.sim.clifford.stabilizer_simulation_state import (
21
+ StabilizerSimulationState as StabilizerSimulationState,
22
+ )
17
23
 
18
- from cirq.sim.clifford.stabilizer_state_ch_form import StabilizerStateChForm
24
+ from cirq.sim.clifford.stabilizer_state_ch_form import (
25
+ StabilizerStateChForm as StabilizerStateChForm,
26
+ )
@@ -15,8 +15,8 @@
15
15
  """An efficient simulator for Clifford circuits.
16
16
 
17
17
  Allowed operations include:
18
- - X,Y,Z,H,S,CNOT,CZ
19
- - measurements in the computational basis
18
+ - X,Y,Z,H,S,CNOT,CZ
19
+ - measurements in the computational basis
20
20
 
21
21
  The quantum state is specified in two forms:
22
22
  1. In terms of stabilizer generators. These are a set of n Pauli operators
@@ -90,7 +90,8 @@ class CliffordSimulator(
90
90
  StabilizerChFormSimulationState for the circuit.
91
91
  """
92
92
  if isinstance(initial_state, clifford.StabilizerChFormSimulationState):
93
- return initial_state
93
+ # Instances of SimulationStateBase usually returned before this point
94
+ return initial_state # pragma: no cover
94
95
 
95
96
  return clifford.StabilizerChFormSimulationState(
96
97
  prng=self._prng,
@@ -188,7 +189,7 @@ class CliffordSimulatorStepResult(
188
189
  return self._clifford_state
189
190
 
190
191
 
191
- @value.value_equality
192
+ @value.value_equality(unhashable=True)
192
193
  class CliffordState:
193
194
  """A state of the Clifford simulation.
194
195