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
@@ -1,4 +1,16 @@
1
- # pylint: disable=wrong-or-nonexistent-copyright-notice
1
+ # Copyright 2025 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.
2
14
  import itertools
3
15
 
4
16
  import numpy as np
@@ -91,12 +103,17 @@ def test_simulate_initial_state():
91
103
  circuit.append(cirq.X(q1))
92
104
  circuit.append(cirq.measure(q0, q1))
93
105
 
94
- result = simulator.simulate(circuit, initial_state=1)
95
- expected_state = np.zeros(shape=(2, 2))
96
- expected_state[b0][1 - b1] = 1.0
97
- np.testing.assert_almost_equal(
98
- result.final_state.to_numpy(), np.reshape(expected_state, 4)
99
- )
106
+ for initial_state in [
107
+ cirq.StabilizerChFormSimulationState(
108
+ qubits=cirq.LineQubit.range(2), initial_state=1
109
+ )
110
+ ]:
111
+ result = simulator.simulate(circuit, initial_state=initial_state)
112
+ expected_state = np.zeros(shape=(2, 2))
113
+ expected_state[b0][1 - b1] = 1.0
114
+ np.testing.assert_almost_equal(
115
+ result.final_state.to_numpy(), np.reshape(expected_state, 4)
116
+ )
100
117
 
101
118
 
102
119
  def test_simulation_state():
@@ -208,6 +225,8 @@ def test_clifford_state_initial_state():
208
225
  state = cirq.CliffordState(qubit_map={q0: 0}, initial_state=1)
209
226
  np.testing.assert_allclose(state.state_vector(), [0, 1])
210
227
 
228
+ assert state.copy() == state
229
+
211
230
 
212
231
  def test_clifford_trial_result_repr():
213
232
  q0 = cirq.LineQubit(0)
@@ -476,10 +495,10 @@ def test_is_supported_operation():
476
495
  raise NotImplementedError()
477
496
 
478
497
  def _has_unitary_(self):
479
- return True
498
+ return True # pragma: no cover
480
499
 
481
500
  def _unitary_(self):
482
- assert False
501
+ assert False # pragma: no cover
483
502
 
484
503
  q1, q2 = cirq.LineQubit.range(2)
485
504
  assert cirq.CliffordSimulator.is_supported_operation(cirq.X(q1))
@@ -548,6 +567,10 @@ def test_valid_apply_measurement():
548
567
  q0 = cirq.LineQubit(0)
549
568
  state = cirq.CliffordState(qubit_map={q0: 0}, initial_state=1)
550
569
  measurements = {}
570
+ _ = state.apply_measurement(
571
+ cirq.measure(q0), measurements, np.random.RandomState(), collapse_state_vector=False
572
+ )
573
+ assert measurements == {'q(0)': [1]}
551
574
  state.apply_measurement(cirq.measure(q0), measurements, np.random.RandomState())
552
575
  assert measurements == {'q(0)': [1]}
553
576
 
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
  """A protocol for implementing high performance clifford tableau evolutions
15
- for Clifford Simulator."""
15
+ for Clifford Simulator."""
16
16
 
17
17
  from typing import Optional, Sequence, TYPE_CHECKING
18
18
 
@@ -13,6 +13,7 @@
13
13
  # limitations under the License.
14
14
 
15
15
  import abc
16
+ from types import NotImplementedType
16
17
  from typing import Any, cast, Generic, Optional, Sequence, TYPE_CHECKING, TypeVar, Union
17
18
 
18
19
  import numpy as np
@@ -23,7 +24,6 @@ from cirq.ops import common_gates, global_phase_op, matrix_gates, swap_gates
23
24
  from cirq.ops.clifford_gate import SingleQubitCliffordGate
24
25
  from cirq.protocols import has_unitary, num_qubits, unitary
25
26
  from cirq.sim.simulation_state import SimulationState
26
- from cirq.type_workarounds import NotImplementedType
27
27
 
28
28
  if TYPE_CHECKING:
29
29
  import cirq
@@ -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
- from typing import Any, Dict, List, Sequence, Union
15
+ from typing import Any, Dict, List, Sequence
16
+
16
17
  import numpy as np
17
18
 
18
19
  import cirq
@@ -20,7 +21,7 @@ from cirq import protocols, qis, value
20
21
  from cirq.value import big_endian_int_to_digits, random_state
21
22
 
22
23
 
23
- @value.value_equality
24
+ @value.value_equality(unhashable=True)
24
25
  class StabilizerStateChForm(qis.StabilizerState):
25
26
  r"""A representation of stabilizer states using the CH form,
26
27
 
@@ -101,7 +102,7 @@ class StabilizerStateChForm(qis.StabilizerState):
101
102
  """Return the CH form representation of the state."""
102
103
  return f'StabilizerStateChForm(num_qubits={self.n!r})'
103
104
 
104
- def inner_product_of_state_and_x(self, x: int) -> Union[float, complex]:
105
+ def inner_product_of_state_and_x(self, x: int) -> complex:
105
106
  """Returns the amplitude of x'th element of
106
107
  the state vector, i.e. <x|psi>"""
107
108
  if type(x) == int:
@@ -18,7 +18,7 @@ import numpy as np
18
18
 
19
19
  from cirq import ops, protocols, study, value
20
20
  from cirq._compat import proper_repr
21
- from cirq.sim import simulator, density_matrix_simulation_state, simulator_base
21
+ from cirq.sim import density_matrix_simulation_state, simulator, simulator_base
22
22
 
23
23
  if TYPE_CHECKING:
24
24
  import cirq
@@ -168,7 +168,8 @@ class DensityMatrixSimulator(
168
168
  DensityMatrixSimulationState for the circuit.
169
169
  """
170
170
  if isinstance(initial_state, density_matrix_simulation_state.DensityMatrixSimulationState):
171
- return initial_state
171
+ # Instances of SimulationStateBase usually returned before this point
172
+ return initial_state # pragma: no cover
172
173
 
173
174
  return density_matrix_simulation_state.DensityMatrixSimulationState(
174
175
  qubits=qubits,
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
  import itertools
15
15
  import random
16
- from typing import Type
16
+ from typing import Type, Union
17
17
  from unittest import mock
18
18
 
19
19
  import numpy as np
@@ -402,10 +402,10 @@ def test_run_param_resolver(dtype: Type[np.complexfloating], split: bool):
402
402
  cirq.measure(q1),
403
403
  )
404
404
  param_resolver = {'b0': b0, 'b1': b1}
405
- result = simulator.run(circuit, param_resolver=param_resolver) # type: ignore
405
+ result = simulator.run(circuit, param_resolver=param_resolver)
406
406
  np.testing.assert_equal(result.measurements, {'q(0)': [[b0]], 'q(1)': [[b1]]})
407
407
  # pylint: disable=line-too-long
408
- np.testing.assert_equal(result.params, cirq.ParamResolver(param_resolver)) # type: ignore
408
+ np.testing.assert_equal(result.params, cirq.ParamResolver(param_resolver))
409
409
 
410
410
 
411
411
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
@@ -584,7 +584,15 @@ def test_simulate_qudit_increments(dtype: Type[np.complexfloating], split: bool)
584
584
 
585
585
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
586
586
  @pytest.mark.parametrize('split', [True, False])
587
- def test_simulate_initial_state(dtype: Type[np.complexfloating], split: bool):
587
+ @pytest.mark.parametrize(
588
+ 'initial_state',
589
+ [1, cirq.DensityMatrixSimulationState(initial_state=1, qubits=cirq.LineQubit.range(2))],
590
+ )
591
+ def test_simulate_initial_state(
592
+ dtype: Type[np.complexfloating],
593
+ split: bool,
594
+ initial_state: Union[int, cirq.DensityMatrixSimulationState],
595
+ ):
588
596
  q0, q1 = cirq.LineQubit.range(2)
589
597
  simulator = cirq.DensityMatrixSimulator(dtype=dtype, split_untangled_states=split)
590
598
  for b0 in [0, 1]:
@@ -14,7 +14,7 @@
14
14
 
15
15
  """Code to handle density matrices."""
16
16
 
17
- from typing import List, Optional, TYPE_CHECKING, Tuple, Sequence
17
+ from typing import List, Optional, Sequence, Tuple, TYPE_CHECKING
18
18
 
19
19
  import numpy as np
20
20
 
cirq/sim/mux.py CHANGED
@@ -21,9 +21,9 @@ from typing import List, Optional, Sequence, Type, TYPE_CHECKING, Union
21
21
 
22
22
  import numpy as np
23
23
 
24
- from cirq import circuits, protocols, study, devices, ops, value
24
+ from cirq import circuits, devices, ops, protocols, study, value
25
25
  from cirq._doc import document
26
- from cirq.sim import sparse_simulator, density_matrix_simulator
26
+ from cirq.sim import density_matrix_simulator, sparse_simulator
27
27
  from cirq.sim.clifford import clifford_simulator
28
28
  from cirq.transformers import measurement_transformers
29
29
 
@@ -24,16 +24,15 @@ from typing import (
24
24
  Optional,
25
25
  Sequence,
26
26
  Set,
27
- TypeVar,
28
- TYPE_CHECKING,
29
27
  Tuple,
28
+ TYPE_CHECKING,
29
+ TypeVar,
30
30
  )
31
- from typing_extensions import Self
32
31
 
33
32
  import numpy as np
33
+ from typing_extensions import Self
34
34
 
35
35
  from cirq import ops, protocols, value
36
-
37
36
  from cirq.sim.simulation_state_base import SimulationStateBase
38
37
 
39
38
  TState = TypeVar('TState', bound='cirq.QuantumStateRepresentation')
@@ -337,7 +336,7 @@ def strat_act_on_from_apply_decompose(
337
336
  curr_ancilla = tuple(q for q in operation.qubits if q not in args.qubits)
338
337
  args = args.add_qubits(curr_ancilla)
339
338
  if args is NotImplemented:
340
- return NotImplemented
339
+ return NotImplemented # pragma: no cover
341
340
  all_ancilla.update(curr_ancilla)
342
341
  protocols.act_on(operation, args)
343
342
  args = args.remove_qubits(tuple(all_ancilla))
@@ -13,6 +13,7 @@
13
13
  # limitations under the License.
14
14
  """An interface for quantum states as targets for operations."""
15
15
  import abc
16
+ from types import NotImplementedType
16
17
  from typing import (
17
18
  Any,
18
19
  Dict,
@@ -27,12 +28,11 @@ from typing import (
27
28
  TypeVar,
28
29
  Union,
29
30
  )
30
- from typing_extensions import Self
31
31
 
32
32
  import numpy as np
33
+ from typing_extensions import Self
33
34
 
34
35
  from cirq import protocols, value
35
- from cirq.type_workarounds import NotImplementedType
36
36
 
37
37
  if TYPE_CHECKING:
38
38
  import cirq
@@ -66,7 +66,7 @@ class DelegatingAncillaZ(cirq.Gate):
66
66
 
67
67
  class Composite(cirq.Gate):
68
68
  def num_qubits(self) -> int:
69
- return 1
69
+ return 1 # pragma: no cover
70
70
 
71
71
  def _decompose_(self, qubits):
72
72
  yield cirq.X(*qubits)
@@ -56,4 +56,6 @@ def state_probabilities_by_indices(
56
56
  probs = np.sum(probs, axis=-1)
57
57
 
58
58
  # To deal with rounding issues, ensure that the probabilities sum to 1.
59
- return probs / np.sum(probs)
59
+ probs = np.clip(probs, 0, None)
60
+ probs /= probs.sum()
61
+ return probs
@@ -11,12 +11,11 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
- import pytest
15
-
16
14
  import numpy as np
15
+ import pytest
17
16
 
18
- from cirq.sim import simulation_utils
19
17
  from cirq import testing
18
+ from cirq.sim import simulation_utils
20
19
 
21
20
 
22
21
  @pytest.mark.parametrize('n,m', [(n, m) for n in range(1, 4) for m in range(1, n + 1)])
cirq/sim/simulator.py CHANGED
@@ -912,7 +912,7 @@ class SimulationTrialResult(Generic[TSimulatorState]):
912
912
  def __str__(self) -> str:
913
913
  def bitstring(vals):
914
914
  separator = ' ' if np.max(vals) >= 10 else ''
915
- return separator.join(str(int(v)) for v in vals)
915
+ return separator.join(str(v.item()) for v in vals)
916
916
 
917
917
  results = sorted([(key, bitstring(val)) for key, val in self.measurements.items()])
918
918
  if not results:
@@ -973,9 +973,10 @@ def split_into_matching_protocol_then_general(
973
973
  qubit A will cause later operations on A to be part of the non-matching
974
974
  suffix, but later operations on other qubits will continue to be put into
975
975
  the matching part (as long as those qubits have had no non-matching operation
976
- up to that point).
976
+ up to that point). Measurement keys are handled equivalently.
977
977
  """
978
978
  blocked_qubits: Set[cirq.Qid] = set()
979
+ blocked_keys: Set[cirq.MeasurementKey] = set()
979
980
  matching_prefix = circuits.Circuit()
980
981
  general_suffix = circuits.Circuit()
981
982
  for moment in circuit:
@@ -983,12 +984,12 @@ def split_into_matching_protocol_then_general(
983
984
  general_part = []
984
985
  for op in moment:
985
986
  qs = set(op.qubits)
986
- if not predicate(op) or not qs.isdisjoint(blocked_qubits):
987
- blocked_qubits |= qs
988
-
989
- if qs.isdisjoint(blocked_qubits):
987
+ keys = protocols.measurement_keys_touched(op)
988
+ if predicate(op) and qs.isdisjoint(blocked_qubits) and keys.isdisjoint(blocked_keys):
990
989
  matching_part.append(op)
991
990
  else:
991
+ blocked_qubits |= qs
992
+ blocked_keys |= keys
992
993
  general_part.append(op)
993
994
  if matching_part:
994
995
  matching_prefix.append(circuits.Moment(matching_part))
@@ -20,15 +20,15 @@ from typing import (
20
20
  Any,
21
21
  cast,
22
22
  Dict,
23
- Iterator,
24
23
  Generic,
24
+ Iterator,
25
25
  List,
26
26
  Optional,
27
27
  Sequence,
28
28
  Tuple,
29
29
  Type,
30
- TypeVar,
31
30
  TYPE_CHECKING,
31
+ TypeVar,
32
32
  )
33
33
 
34
34
  import numpy as np
@@ -38,13 +38,13 @@ from cirq.sim.simulation_product_state import SimulationProductState
38
38
  from cirq.sim.simulation_state import TSimulationState
39
39
  from cirq.sim.simulation_state_base import SimulationStateBase
40
40
  from cirq.sim.simulator import (
41
- TSimulationTrialResult,
41
+ check_all_resolved,
42
42
  SimulatesIntermediateState,
43
43
  SimulatesSamples,
44
- StepResult,
45
44
  SimulationTrialResult,
46
- check_all_resolved,
47
45
  split_into_matching_protocol_then_general,
46
+ StepResult,
47
+ TSimulationTrialResult,
48
48
  )
49
49
 
50
50
  if TYPE_CHECKING:
@@ -13,7 +13,7 @@
13
13
  # limitations under the License.
14
14
  """Tests for simulator.py"""
15
15
  import abc
16
- from typing import Generic, Dict, Any, List, Sequence, Union
16
+ from typing import Any, Dict, Generic, List, Sequence, Union
17
17
  from unittest import mock
18
18
 
19
19
  import duet
@@ -24,13 +24,13 @@ import cirq
24
24
  from cirq import study
25
25
  from cirq.sim.simulation_state import TSimulationState
26
26
  from cirq.sim.simulator import (
27
- TStepResult,
28
27
  SimulatesAmplitudes,
29
28
  SimulatesExpectationValues,
30
29
  SimulatesFinalState,
31
30
  SimulatesIntermediateState,
32
31
  SimulatesSamples,
33
32
  SimulationTrialResult,
33
+ TStepResult,
34
34
  )
35
35
 
36
36
 
@@ -50,7 +50,7 @@ class FakeStepResult(cirq.StepResult):
50
50
  self._final_state = final_state
51
51
 
52
52
  def _simulator_state(self):
53
- return self._final_state
53
+ return self._final_state # pragma: no cover
54
54
 
55
55
  def state_vector(self):
56
56
  pass
@@ -399,6 +399,17 @@ def test_sample_repeated_measurement_keys():
399
399
  assert len(result.records['b'][0]) == 2
400
400
 
401
401
 
402
+ def test_classical_controls_go_to_suffix_if_corresponding_measurement_does():
403
+ subcircuit = cirq.CircuitOperation(cirq.FrozenCircuit()).with_classical_controls('a')
404
+ m = cirq.measure(cirq.LineQubit(0), key='a')
405
+ circuit = cirq.Circuit(m, subcircuit)
406
+ prefix, suffix = cirq.sim.simulator.split_into_matching_protocol_then_general(
407
+ circuit, lambda op: op != m # any op but m goes into prefix
408
+ )
409
+ assert not prefix
410
+ assert suffix == circuit
411
+
412
+
402
413
  def test_simulate_with_invert_mask():
403
414
  q0, q1, q2, q3, q4 = cirq.LineQid.for_qid_shape((2, 3, 3, 3, 4))
404
415
  c = cirq.Circuit(
@@ -14,12 +14,12 @@
14
14
 
15
15
  """A simulator that uses numpy's einsum for sparse matrix operations."""
16
16
 
17
- from typing import Any, Iterator, List, TYPE_CHECKING, Union, Sequence, Type, Optional
17
+ from typing import Any, Iterator, List, Optional, Sequence, Type, TYPE_CHECKING, Union
18
18
 
19
19
  import numpy as np
20
20
 
21
21
  from cirq import ops
22
- from cirq.sim import simulator, state_vector, state_vector_simulator, state_vector_simulation_state
22
+ from cirq.sim import simulator, state_vector, state_vector_simulation_state, state_vector_simulator
23
23
 
24
24
  if TYPE_CHECKING:
25
25
  import cirq
@@ -171,7 +171,8 @@ class Simulator(
171
171
  StateVectorSimulationState for the circuit.
172
172
  """
173
173
  if isinstance(initial_state, state_vector_simulation_state.StateVectorSimulationState):
174
- return initial_state
174
+ # Instances of SimulationStateBase usually returned before this point
175
+ return initial_state # pragma: no cover
175
176
 
176
177
  return state_vector_simulation_state.StateVectorSimulationState(
177
178
  qubits=qubits,
@@ -13,9 +13,9 @@
13
13
  # limitations under the License.
14
14
  import itertools
15
15
  import random
16
- from typing import Type
17
-
16
+ from typing import Type, Union
18
17
  from unittest import mock
18
+
19
19
  import numpy as np
20
20
  import pytest
21
21
  import sympy
@@ -115,7 +115,7 @@ def test_run_repetitions_terminal_measurement_stochastic():
115
115
  q = cirq.LineQubit(0)
116
116
  c = cirq.Circuit(cirq.H(q), cirq.measure(q, key='q'))
117
117
  results = cirq.Simulator().run(c, repetitions=10000)
118
- assert 1000 <= sum(v[0] for v in results.measurements['q']) < 9000
118
+ assert 1000 <= np.count_nonzero(results.measurements['q']) < 9000
119
119
 
120
120
 
121
121
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
@@ -255,7 +255,7 @@ def test_run_mixture(dtype: Type[np.complexfloating], split: bool):
255
255
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
256
256
  circuit = cirq.Circuit(cirq.bit_flip(0.5)(q0), cirq.measure(q0))
257
257
  result = simulator.run(circuit, repetitions=100)
258
- assert 20 < sum(result.measurements['q(0)'])[0] < 80
258
+ assert 20 < np.count_nonzero(result.measurements['q(0)']) < 80
259
259
 
260
260
 
261
261
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
@@ -265,8 +265,8 @@ def test_run_mixture_with_gates(dtype: Type[np.complexfloating], split: bool):
265
265
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split, seed=23)
266
266
  circuit = cirq.Circuit(cirq.H(q0), cirq.phase_flip(0.5)(q0), cirq.H(q0), cirq.measure(q0))
267
267
  result = simulator.run(circuit, repetitions=100)
268
- assert sum(result.measurements['q(0)'])[0] < 80
269
- assert sum(result.measurements['q(0)'])[0] > 20
268
+ assert np.count_nonzero(result.measurements['q(0)']) < 80
269
+ assert np.count_nonzero(result.measurements['q(0)']) > 20
270
270
 
271
271
 
272
272
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
@@ -446,7 +446,15 @@ def test_simulate_bit_flips(dtype: Type[np.complexfloating], split: bool):
446
446
 
447
447
  @pytest.mark.parametrize('dtype', [np.complex64, np.complex128])
448
448
  @pytest.mark.parametrize('split', [True, False])
449
- def test_simulate_initial_state(dtype: Type[np.complexfloating], split: bool):
449
+ @pytest.mark.parametrize(
450
+ 'initial_state',
451
+ [1, cirq.StateVectorSimulationState(initial_state=1, qubits=cirq.LineQubit.range(2))],
452
+ )
453
+ def test_simulate_initial_state(
454
+ dtype: Type[np.complexfloating],
455
+ split: bool,
456
+ initial_state: Union[int, cirq.StateVectorSimulationState],
457
+ ):
450
458
  q0, q1 = cirq.LineQubit.range(2)
451
459
  simulator = cirq.Simulator(dtype=dtype, split_untangled_states=split)
452
460
  for b0 in [0, 1]:
@@ -498,11 +506,11 @@ def test_simulate_param_resolver(dtype: Type[np.complexfloating], split: bool):
498
506
  (cirq.X ** sympy.Symbol('b0'))(q0), (cirq.X ** sympy.Symbol('b1'))(q1)
499
507
  )
500
508
  resolver = {'b0': b0, 'b1': b1}
501
- result = simulator.simulate(circuit, param_resolver=resolver) # type: ignore
509
+ result = simulator.simulate(circuit, param_resolver=resolver)
502
510
  expected_state = np.zeros(shape=(2, 2))
503
511
  expected_state[b0][b1] = 1.0
504
512
  np.testing.assert_equal(result.final_state_vector, np.reshape(expected_state, 4))
505
- assert result.params == cirq.ParamResolver(resolver) # type: ignore
513
+ assert result.params == cirq.ParamResolver(resolver)
506
514
  assert len(result.measurements) == 0
507
515
 
508
516
 
cirq/sim/state_vector.py CHANGED
@@ -14,12 +14,12 @@
14
14
  """Helpers for handling quantum state vectors."""
15
15
 
16
16
  import abc
17
- from typing import List, Mapping, Optional, Tuple, TYPE_CHECKING, Sequence
17
+ from typing import List, Mapping, Optional, Sequence, Tuple, TYPE_CHECKING
18
18
 
19
19
  import numpy as np
20
20
 
21
21
  from cirq import linalg, qis, value
22
- from cirq.sim import simulator, simulation_utils
22
+ from cirq.sim import simulation_utils, simulator
23
23
 
24
24
  if TYPE_CHECKING:
25
25
  import cirq
@@ -63,7 +63,7 @@ def test_shallow_copy_buffers():
63
63
  def test_decomposed_fallback():
64
64
  class Composite(cirq.Gate):
65
65
  def num_qubits(self) -> int:
66
- return 1
66
+ return 1 # pragma: no cover
67
67
 
68
68
  def _decompose_(self, qubits):
69
69
  yield cirq.X(*qubits)
@@ -14,15 +14,15 @@
14
14
  """Abstract classes for simulations which keep track of state vector."""
15
15
 
16
16
  import abc
17
- from functools import cached_property
18
- from typing import Any, Dict, Iterator, Sequence, Type, TYPE_CHECKING, Generic, TypeVar
19
17
  import warnings
18
+ from functools import cached_property
19
+ from typing import Any, Dict, Generic, Iterator, Sequence, Type, TYPE_CHECKING, TypeVar
20
20
 
21
21
  import numpy as np
22
22
 
23
- from cirq import _compat, ops, value, qis
24
- from cirq.sim import simulator, state_vector, simulator_base
23
+ from cirq import _compat, ops, qis, value
25
24
  from cirq.protocols import qid_shape
25
+ from cirq.sim import simulator, simulator_base, state_vector
26
26
 
27
27
  if TYPE_CHECKING:
28
28
  import cirq