cirq-core 1.4.1__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 +1 -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.1.dist-info → cirq_core-1.5.0.dist-info}/RECORD +586 -552
  584. {cirq_core-1.4.1.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.1.dist-info/METADATA +0 -45
  589. {cirq_core-1.4.1.dist-info → cirq_core-1.5.0.dist-info}/LICENSE +0 -0
  590. {cirq_core-1.4.1.dist-info → cirq_core-1.5.0.dist-info}/top_level.txt +0 -0
cirq/ops/identity.py CHANGED
@@ -13,7 +13,9 @@
13
13
  # limitations under the License.
14
14
  """IdentityGate."""
15
15
 
16
- from typing import Any, Dict, Optional, Tuple, TYPE_CHECKING, Sequence
16
+ import numbers
17
+ from types import NotImplementedType
18
+ from typing import Any, Dict, Optional, Sequence, Tuple, TYPE_CHECKING, Union
17
19
 
18
20
  import numpy as np
19
21
  import sympy
@@ -71,10 +73,16 @@ class IdentityGate(raw_types.Gate):
71
73
  return len(self._qid_shape)
72
74
 
73
75
  def __pow__(self, power: Any) -> Any:
74
- if isinstance(power, (int, float, complex, sympy.Basic)):
76
+ if isinstance(power, (numbers.Complex, sympy.Basic)):
75
77
  return self
76
78
  return NotImplemented
77
79
 
80
+ def _commutes_(self, other: Any, *, atol: float = 1e-8) -> Union[bool, NotImplementedType]:
81
+ """The identity gate commutes with all other gates."""
82
+ if not isinstance(other, raw_types.Gate):
83
+ return NotImplemented
84
+ return True
85
+
78
86
  def _has_unitary_(self) -> bool:
79
87
  return True
80
88
 
@@ -119,7 +127,7 @@ class IdentityGate(raw_types.Gate):
119
127
  def _mul_with_qubits(self, qubits: Tuple['cirq.Qid', ...], other):
120
128
  if isinstance(other, raw_types.Operation):
121
129
  return other
122
- if isinstance(other, (complex, float, int)):
130
+ if isinstance(other, numbers.Complex):
123
131
  from cirq.ops.pauli_string import PauliString
124
132
 
125
133
  return PauliString(coefficient=other)
@@ -128,10 +136,12 @@ class IdentityGate(raw_types.Gate):
128
136
  _rmul_with_qubits = _mul_with_qubits
129
137
 
130
138
  def _circuit_diagram_info_(self, args) -> Tuple[str, ...]:
139
+ if self.num_qubits() <= 0:
140
+ return NotImplemented
131
141
  return ('I',) * self.num_qubits()
132
142
 
133
143
  def _qasm_(self, args: 'cirq.QasmArgs', qubits: Tuple['cirq.Qid', ...]) -> Optional[str]:
134
- args.validate_version('2.0')
144
+ args.validate_version('2.0', '3.0')
135
145
  return ''.join([args.format('id {0};\n', qubit) for qubit in qubits])
136
146
 
137
147
  @classmethod
cirq/ops/identity_test.py CHANGED
@@ -208,3 +208,27 @@ def test_identity_short_circuits_act_on():
208
208
  args = mock.Mock(cirq.SimulationState)
209
209
  args._act_on_fallback_.side_effect = mock.Mock(side_effect=Exception('No!'))
210
210
  cirq.act_on(cirq.IdentityGate(1)(cirq.LineQubit(0)), args)
211
+
212
+
213
+ def test_identity_commutes():
214
+ assert cirq.commutes(cirq.I, cirq.X)
215
+ with pytest.raises(TypeError):
216
+ cirq.commutes(cirq.I, "Gate")
217
+
218
+
219
+ def test_identity_diagram():
220
+ cirq.testing.assert_has_diagram(
221
+ cirq.Circuit(cirq.IdentityGate(3).on_each(cirq.LineQubit.range(3))),
222
+ """
223
+ 0: ───I───
224
+
225
+ 1: ───I───
226
+
227
+ 2: ───I───
228
+ """,
229
+ )
230
+ cirq.testing.assert_has_diagram(
231
+ cirq.Circuit(cirq.IdentityGate(0)()),
232
+ """
233
+ I(0)""",
234
+ )
cirq/ops/kraus_channel.py CHANGED
@@ -1,5 +1,6 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
2
  from typing import Any, Dict, FrozenSet, Iterable, Mapping, Tuple, TYPE_CHECKING, Union
3
+
3
4
  import numpy as np
4
5
 
5
6
  from cirq import linalg, protocols, value
@@ -1,8 +1,9 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
- import cirq
3
2
  import numpy as np
4
3
  import pytest
5
4
 
5
+ import cirq
6
+
6
7
 
7
8
  def test_kraus_channel_from_channel():
8
9
  q0 = cirq.LineQubit(0)
@@ -53,6 +54,7 @@ def test_kraus_channel_remap_keys():
53
54
  kc_x = cirq.KrausChannel.from_channel(dp, key='x')
54
55
  assert cirq.with_measurement_key_mapping(kc_x, {'a': 'b'}) is kc_x
55
56
  assert cirq.measurement_key_name(cirq.with_key_path(kc_x, ('path',))) == 'path:x'
57
+ assert cirq.measurement_key_name(cirq.with_key_path_prefix(kc_x, ('path',))) == 'path:x'
56
58
 
57
59
  kc_a = cirq.KrausChannel.from_channel(dp, key='a')
58
60
  kc_b = cirq.KrausChannel.from_channel(dp, key='b')
@@ -12,34 +12,34 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ import numbers
15
16
  from collections import defaultdict
16
17
  from typing import (
17
18
  AbstractSet,
18
19
  Any,
20
+ DefaultDict,
19
21
  Dict,
22
+ FrozenSet,
20
23
  Iterable,
24
+ List,
21
25
  Mapping,
22
26
  Optional,
23
27
  Tuple,
24
- Union,
25
- List,
26
- FrozenSet,
27
- DefaultDict,
28
28
  TYPE_CHECKING,
29
+ Union,
29
30
  )
30
- import numbers
31
31
 
32
32
  import numpy as np
33
- from sympy.logic.boolalg import And, Not, Or, Xor
33
+ from scipy.sparse import csr_matrix
34
34
  from sympy.core.expr import Expr
35
35
  from sympy.core.symbol import Symbol
36
- from scipy.sparse import csr_matrix
36
+ from sympy.logic.boolalg import And, Not, Or, Xor
37
37
 
38
38
  from cirq import linalg, protocols, qis, value
39
39
  from cirq._doc import document
40
40
  from cirq.linalg import operator_spaces
41
- from cirq.ops import identity, raw_types, pauli_gates, pauli_string
42
- from cirq.ops.pauli_string import PauliString, _validate_qubit_mapping
41
+ from cirq.ops import identity, pauli_gates, pauli_string, raw_types
42
+ from cirq.ops.pauli_string import _validate_qubit_mapping, PauliString
43
43
  from cirq.ops.projector import ProjectorString
44
44
  from cirq.value.linear_dict import _format_terms
45
45
 
@@ -48,7 +48,7 @@ if TYPE_CHECKING:
48
48
 
49
49
  UnitPauliStringT = FrozenSet[Tuple[raw_types.Qid, pauli_gates.Pauli]]
50
50
  PauliSumLike = Union[
51
- int, float, complex, PauliString, 'PauliSum', pauli_string.SingleQubitPauliStringGateOperation
51
+ complex, PauliString, 'PauliSum', pauli_string.SingleQubitPauliStringGateOperation
52
52
  ]
53
53
  document(
54
54
  PauliSumLike,
@@ -81,7 +81,7 @@ class LinearCombinationOfGates(value.LinearDict[raw_types.Gate]):
81
81
  2 * cirq.X - 2 * cirq.Z
82
82
  """
83
83
 
84
- def __init__(self, terms: Mapping[raw_types.Gate, value.Scalar]) -> None:
84
+ def __init__(self, terms: Mapping[raw_types.Gate, 'cirq.TParamValComplex']) -> None:
85
85
  """Initializes linear combination from a collection of terms.
86
86
 
87
87
  Args:
@@ -149,17 +149,19 @@ class LinearCombinationOfGates(value.LinearDict[raw_types.Gate]):
149
149
  )
150
150
 
151
151
  def _is_parameterized_(self) -> bool:
152
- return any(protocols.is_parameterized(gate) for gate in self.keys())
152
+ return any(protocols.is_parameterized(item) for item in self.items())
153
153
 
154
154
  def _parameter_names_(self) -> AbstractSet[str]:
155
- return {name for gate in self.keys() for name in protocols.parameter_names(gate)}
155
+ return {name for item in self.items() for name in protocols.parameter_names(item)}
156
156
 
157
157
  def _resolve_parameters_(
158
158
  self, resolver: 'cirq.ParamResolver', recursive: bool
159
159
  ) -> 'LinearCombinationOfGates':
160
160
  return self.__class__(
161
161
  {
162
- protocols.resolve_parameters(gate, resolver, recursive): coeff
162
+ protocols.resolve_parameters(
163
+ gate, resolver, recursive
164
+ ): protocols.resolve_parameters(coeff, resolver, recursive)
163
165
  for gate, coeff in self.items()
164
166
  }
165
167
  )
@@ -222,7 +224,7 @@ class LinearCombinationOfOperations(value.LinearDict[raw_types.Operation]):
222
224
  by the identity operator. Note that A may not be unitary or even normal.
223
225
  """
224
226
 
225
- def __init__(self, terms: Mapping[raw_types.Operation, value.Scalar]) -> None:
227
+ def __init__(self, terms: Mapping[raw_types.Operation, 'cirq.TParamValComplex']) -> None:
226
228
  """Initializes linear combination from a collection of terms.
227
229
 
228
230
  Args:
@@ -264,17 +266,19 @@ class LinearCombinationOfOperations(value.LinearDict[raw_types.Operation]):
264
266
  return LinearCombinationOfOperations({i: bi, x: bx, y: by, z: bz})
265
267
 
266
268
  def _is_parameterized_(self) -> bool:
267
- return any(protocols.is_parameterized(op) for op in self.keys())
269
+ return any(protocols.is_parameterized(item) for item in self.items())
268
270
 
269
271
  def _parameter_names_(self) -> AbstractSet[str]:
270
- return {name for op in self.keys() for name in protocols.parameter_names(op)}
272
+ return {name for item in self.items() for name in protocols.parameter_names(item)}
271
273
 
272
274
  def _resolve_parameters_(
273
275
  self, resolver: 'cirq.ParamResolver', recursive: bool
274
276
  ) -> 'LinearCombinationOfOperations':
275
277
  return self.__class__(
276
278
  {
277
- protocols.resolve_parameters(op, resolver, recursive): coeff
279
+ protocols.resolve_parameters(op, resolver, recursive): protocols.resolve_parameters(
280
+ coeff, resolver, recursive
281
+ )
278
282
  for op, coeff in self.items()
279
283
  }
280
284
  )
@@ -353,7 +357,9 @@ def _is_linear_dict_of_unit_pauli_string(linear_dict: value.LinearDict[UnitPauli
353
357
  return True
354
358
 
355
359
 
356
- def _pauli_string_from_unit(unit: UnitPauliStringT, coefficient: Union[int, float, complex] = 1):
360
+ def _pauli_string_from_unit(
361
+ unit: UnitPauliStringT, coefficient: Union[int, float, 'cirq.TParamValComplex'] = 1
362
+ ):
357
363
  return PauliString(qubit_pauli_map=dict(unit), coefficient=coefficient)
358
364
 
359
365
 
@@ -805,7 +811,7 @@ class PauliSum:
805
811
  if not isinstance(other, (numbers.Complex, PauliString, PauliSum)):
806
812
  return NotImplemented
807
813
  if isinstance(other, numbers.Complex):
808
- self._linear_dict *= other
814
+ self._linear_dict *= complex(other)
809
815
  elif isinstance(other, PauliString):
810
816
  temp = PauliSum.from_pauli_strings([term * other for term in self])
811
817
  self._linear_dict = temp._linear_dict
@@ -870,7 +876,7 @@ def _projector_string_from_projector_dict(projector_dict, coefficient=1.0):
870
876
  return ProjectorString(dict(projector_dict), coefficient)
871
877
 
872
878
 
873
- @value.value_equality(approximate=True)
879
+ @value.value_equality(approximate=True, unhashable=True)
874
880
  class ProjectorSum:
875
881
  """List of mappings representing a sum of projector operators."""
876
882
 
@@ -153,6 +153,10 @@ def test_non_unitary_linear_combination_of_gates_has_no_unitary(terms):
153
153
  ),
154
154
  ({cirq.X: 2, cirq.H: 1}, {'X': 2 + np.sqrt(0.5), 'Z': np.sqrt(0.5)}),
155
155
  ({cirq.XX: -2, cirq.YY: 3j, cirq.ZZ: 4}, {'XX': -2, 'YY': 3j, 'ZZ': 4}),
156
+ (
157
+ {cirq.X: sympy.Symbol('x'), cirq.Y: -sympy.Symbol('y')},
158
+ {'X': sympy.Symbol('x'), 'Y': -sympy.Symbol('y')},
159
+ ),
156
160
  ),
157
161
  )
158
162
  def test_linear_combination_of_gates_has_correct_pauli_expansion(terms, expected_expansion):
@@ -206,7 +210,11 @@ def test_linear_combinations_of_gates_invalid_powers(terms, exponent):
206
210
 
207
211
  @pytest.mark.parametrize(
208
212
  'terms, is_parameterized, parameter_names',
209
- [({cirq.H: 1}, False, set()), ({cirq.X ** sympy.Symbol('t'): 1}, True, {'t'})],
213
+ [
214
+ ({cirq.H: 1}, False, set()),
215
+ ({cirq.X ** sympy.Symbol('t'): 1}, True, {'t'}),
216
+ ({cirq.X: sympy.Symbol('t')}, True, {'t'}),
217
+ ],
210
218
  )
211
219
  @pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
212
220
  def test_parameterized_linear_combination_of_gates(
@@ -225,7 +233,7 @@ def get_matrix(
225
233
  cirq.GateOperation,
226
234
  cirq.LinearCombinationOfGates,
227
235
  cirq.LinearCombinationOfOperations,
228
- ]
236
+ ],
229
237
  ) -> np.ndarray:
230
238
  if isinstance(operator, (cirq.LinearCombinationOfGates, cirq.LinearCombinationOfOperations)):
231
239
  return operator.matrix()
@@ -243,13 +251,13 @@ def assert_linear_combinations_are_equal(
243
251
 
244
252
  actual_matrix = get_matrix(actual)
245
253
  expected_matrix = get_matrix(expected)
246
- assert np.allclose(actual_matrix, expected_matrix)
254
+ assert cirq.approx_eq(actual_matrix, expected_matrix)
247
255
 
248
256
  actual_expansion = cirq.pauli_expansion(actual)
249
257
  expected_expansion = cirq.pauli_expansion(expected)
250
258
  assert set(actual_expansion.keys()) == set(expected_expansion.keys())
251
259
  for name in actual_expansion.keys():
252
- assert abs(actual_expansion[name] - expected_expansion[name]) < 1e-12
260
+ assert cirq.approx_eq(actual_expansion[name], expected_expansion[name])
253
261
 
254
262
 
255
263
  @pytest.mark.parametrize(
@@ -279,6 +287,8 @@ def assert_linear_combinations_are_equal(
279
287
  ),
280
288
  ((cirq.X + cirq.Y + cirq.Z) ** 0, cirq.I),
281
289
  ((cirq.X - 1j * cirq.Y) ** 0, cirq.I),
290
+ (cirq.Y - sympy.Symbol('s') * cirq.Y, (1 - sympy.Symbol('s')) * cirq.Y),
291
+ ((cirq.X + cirq.Z) * sympy.Symbol('s') / np.sqrt(2), cirq.H * sympy.Symbol('s')),
282
292
  ),
283
293
  )
284
294
  def test_gate_expressions(expression, expected_result):
@@ -659,6 +669,10 @@ def test_non_unitary_linear_combination_of_operations_has_no_unitary(terms):
659
669
  {'IIZI': 1, 'IZII': 1, 'IZZI': -1},
660
670
  ),
661
671
  ({cirq.CNOT(q0, q1): 2, cirq.Z(q0): -1, cirq.X(q1): -1}, {'II': 1, 'ZX': -1}),
672
+ (
673
+ {cirq.X(q0): -sympy.Symbol('x'), cirq.Y(q0): sympy.Symbol('y')},
674
+ {'X': -sympy.Symbol('x'), 'Y': sympy.Symbol('y')},
675
+ ),
662
676
  ),
663
677
  )
664
678
  def test_linear_combination_of_operations_has_correct_pauli_expansion(terms, expected_expansion):
@@ -716,6 +730,7 @@ def test_linear_combinations_of_operations_invalid_powers(terms, exponent):
716
730
  [
717
731
  ({cirq.H(cirq.LineQubit(0)): 1}, False, set()),
718
732
  ({cirq.X(cirq.LineQubit(0)) ** sympy.Symbol('t'): 1}, True, {'t'}),
733
+ ({cirq.X(cirq.LineQubit(0)): sympy.Symbol('t')}, True, {'t'}),
719
734
  ],
720
735
  )
721
736
  @pytest.mark.parametrize('resolve_fn', [cirq.resolve_parameters, cirq.resolve_parameters_once])
@@ -788,6 +803,10 @@ def test_parameterized_linear_combination_of_ops(
788
803
  cirq.LinearCombinationOfOperations({cirq.X(q1): 2, cirq.Z(q1): 3}) ** 0,
789
804
  cirq.LinearCombinationOfOperations({cirq.I(q1): 1}),
790
805
  ),
806
+ (
807
+ cirq.LinearCombinationOfOperations({cirq.X(q0): sympy.Symbol('s')}) ** 2,
808
+ cirq.LinearCombinationOfOperations({cirq.I(q0): sympy.Symbol('s') ** 2}),
809
+ ),
791
810
  ),
792
811
  )
793
812
  def test_operation_expressions(expression, expected_result):
cirq/ops/matrix_gates.py CHANGED
@@ -14,13 +14,13 @@
14
14
 
15
15
  """Quantum gates defined by a matrix."""
16
16
 
17
- from typing import Any, Dict, Iterable, Optional, Tuple, TYPE_CHECKING
17
+ from typing import Any, Dict, Iterable, List, Optional, Tuple, TYPE_CHECKING
18
18
 
19
19
  import numpy as np
20
20
 
21
- from cirq import linalg, protocols, _import
21
+ from cirq import _import, linalg, protocols
22
22
  from cirq._compat import proper_repr
23
- from cirq.ops import raw_types, phased_x_z_gate
23
+ from cirq.ops import global_phase_op, identity, phased_x_z_gate, raw_types
24
24
 
25
25
  if TYPE_CHECKING:
26
26
  import cirq
@@ -148,18 +148,34 @@ class MatrixGate(raw_types.Gate):
148
148
  return MatrixGate(matrix=result.reshape(self._matrix.shape), qid_shape=self._qid_shape)
149
149
 
150
150
  def _decompose_(self, qubits: Tuple['cirq.Qid', ...]) -> 'cirq.OP_TREE':
151
+ from cirq.circuits import Circuit
152
+
153
+ decomposed: List['cirq.Operation'] = NotImplemented
151
154
  if self._qid_shape == (2,):
152
- return [
155
+ decomposed = [
153
156
  g.on(qubits[0])
154
157
  for g in single_qubit_decompositions.single_qubit_matrix_to_gates(self._matrix)
155
158
  ]
156
159
  if self._qid_shape == (2,) * 2:
157
- return two_qubit_to_cz.two_qubit_matrix_to_cz_operations(
160
+ decomposed = two_qubit_to_cz.two_qubit_matrix_to_cz_operations(
158
161
  *qubits, self._matrix, allow_partial_czs=True
159
162
  )
160
163
  if self._qid_shape == (2,) * 3:
161
- return three_qubit_decomposition.three_qubit_matrix_to_operations(*qubits, self._matrix)
162
- return NotImplemented
164
+ decomposed = three_qubit_decomposition.three_qubit_matrix_to_operations(
165
+ *qubits, self._matrix
166
+ )
167
+ if decomposed is NotImplemented:
168
+ return NotImplemented
169
+ # The above algorithms ignore phase, but phase is important to maintain if the gate is
170
+ # controlled. Here, we add it back in with a global phase op.
171
+ ident = identity.IdentityGate(qid_shape=self._qid_shape).on(*qubits) # Preserve qid order
172
+ u = protocols.unitary(Circuit(ident, *decomposed)).reshape(self._matrix.shape)
173
+ phase_delta = linalg.phase_delta(u, self._matrix)
174
+ # Phase delta is on the complex unit circle, so if real(phase_delta) >= 1, that means
175
+ # no phase delta. (>1 is rounding error).
176
+ if phase_delta.real < 1:
177
+ decomposed.append(global_phase_op.global_phase_operation(phase_delta))
178
+ return decomposed
163
179
 
164
180
  def _has_unitary_(self) -> bool:
165
181
  return True
@@ -181,7 +197,7 @@ class MatrixGate(raw_types.Gate):
181
197
  return protocols.CircuitDiagramInfo(wire_symbols=[main, *rest])
182
198
 
183
199
  def _qasm_(self, args: 'cirq.QasmArgs', qubits: Tuple['cirq.Qid', ...]) -> Optional[str]:
184
- args.validate_version('2.0')
200
+ args.validate_version('2.0', '3.0')
185
201
  if self._qid_shape == (2,):
186
202
  return protocols.qasm(
187
203
  phased_x_z_gate.PhasedXZGate.from_matrix(self._matrix), args=args, qubits=qubits
cirq/ops/measure_util.py CHANGED
@@ -12,12 +12,12 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Callable, Dict, Iterable, List, overload, Optional, Tuple, TYPE_CHECKING, Union
15
+ from typing import Callable, Dict, Iterable, List, Optional, overload, Tuple, TYPE_CHECKING, Union
16
16
 
17
17
  import numpy as np
18
18
 
19
19
  from cirq import protocols
20
- from cirq.ops import raw_types, pauli_string
20
+ from cirq.ops import pauli_string, raw_types
21
21
  from cirq.ops.measurement_gate import MeasurementGate
22
22
  from cirq.ops.pauli_measurement_gate import PauliMeasurementGate
23
23
 
@@ -19,8 +19,8 @@ from typing import (
19
19
  Iterable,
20
20
  Mapping,
21
21
  Optional,
22
- Tuple,
23
22
  Sequence,
23
+ Tuple,
24
24
  TYPE_CHECKING,
25
25
  Union,
26
26
  )
@@ -227,7 +227,7 @@ class MeasurementGate(raw_types.Gate):
227
227
  def _qasm_(self, args: 'cirq.QasmArgs', qubits: Tuple['cirq.Qid', ...]) -> Optional[str]:
228
228
  if self.confusion_map or not all(d == 2 for d in self._qid_shape):
229
229
  return NotImplemented
230
- args.validate_version('2.0')
230
+ args.validate_version('2.0', '3.0')
231
231
  invert_mask = self.invert_mask
232
232
  if len(invert_mask) < len(qubits):
233
233
  invert_mask = invert_mask + (False,) * (len(qubits) - len(invert_mask))
@@ -235,7 +235,10 @@ class MeasurementGate(raw_types.Gate):
235
235
  for i, (qubit, inv) in enumerate(zip(qubits, invert_mask)):
236
236
  if inv:
237
237
  lines.append(args.format('x {0}; // Invert the following measurement\n', qubit))
238
- lines.append(args.format('measure {0} -> {1:meas}[{2}];\n', qubit, self.key, i))
238
+ if args.version == '2.0':
239
+ lines.append(args.format('measure {0} -> {1:meas}[{2}];\n', qubit, self.key, i))
240
+ else:
241
+ lines.append(args.format('{1:meas}[{2}] = measure {0};\n', qubit, self.key, i))
239
242
  if inv:
240
243
  lines.append(args.format('x {0}; // Undo the inversion\n', qubit))
241
244
  return ''.join(lines)
@@ -270,7 +273,7 @@ class MeasurementGate(raw_types.Gate):
270
273
  (idxs, tuple(v for _, v in np.ndenumerate(cmap)))
271
274
  for idxs, cmap in self._confusion_map.items()
272
275
  )
273
- return self.key, self.invert_mask, self._qid_shape, hashable_cmap
276
+ return self.key, self.full_invert_mask(), self._qid_shape, hashable_cmap
274
277
 
275
278
  def _json_dict_(self) -> Dict[str, Any]:
276
279
  other: Dict[str, Any] = {}
@@ -13,6 +13,7 @@
13
13
  # limitations under the License.
14
14
 
15
15
  from typing import cast
16
+
16
17
  import numpy as np
17
18
  import pytest
18
19
 
@@ -74,11 +75,11 @@ def test_measurement_eq():
74
75
  eq.make_equality_group(
75
76
  lambda: cirq.MeasurementGate(1, 'a'),
76
77
  lambda: cirq.MeasurementGate(1, 'a', invert_mask=()),
78
+ lambda: cirq.MeasurementGate(1, 'a', invert_mask=(False,)),
77
79
  lambda: cirq.MeasurementGate(1, 'a', qid_shape=(2,)),
78
80
  lambda: cirq.MeasurementGate(1, 'a', confusion_map={}),
79
81
  )
80
82
  eq.add_equality_group(cirq.MeasurementGate(1, 'a', invert_mask=(True,)))
81
- eq.add_equality_group(cirq.MeasurementGate(1, 'a', invert_mask=(False,)))
82
83
  eq.add_equality_group(
83
84
  cirq.MeasurementGate(1, 'a', confusion_map={(0,): np.array([[0, 1], [1, 0]])})
84
85
  )
@@ -1,5 +1,6 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
2
  from typing import Any, Dict, FrozenSet, Iterable, Mapping, Tuple, TYPE_CHECKING, Union
3
+
3
4
  import numpy as np
4
5
 
5
6
  from cirq import linalg, protocols, value
@@ -1,8 +1,9 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
- import cirq
3
2
  import numpy as np
4
3
  import pytest
5
4
 
5
+ import cirq
6
+
6
7
 
7
8
  def test_matrix_mixture_from_mixture():
8
9
  q0 = cirq.LineQubit(0)
@@ -54,6 +55,7 @@ def test_matrix_mixture_remap_keys():
54
55
  mm_x = cirq.MixedUnitaryChannel.from_mixture(dp, key='x')
55
56
  assert cirq.with_measurement_key_mapping(mm_x, {'a': 'b'}) is mm_x
56
57
  assert cirq.measurement_key_name(cirq.with_key_path(mm_x, ('path',))) == 'path:x'
58
+ assert cirq.measurement_key_name(cirq.with_key_path_prefix(mm_x, ('path',))) == 'path:x'
57
59
 
58
60
  mm_a = cirq.MixedUnitaryChannel.from_mixture(dp, key='a')
59
61
  mm_b = cirq.MixedUnitaryChannel.from_mixture(dp, key='b')
cirq/ops/named_qubit.py CHANGED
@@ -18,7 +18,6 @@ from typing import Any, Dict, List, Optional, Tuple, TYPE_CHECKING
18
18
  from cirq import protocols
19
19
  from cirq.ops import raw_types
20
20
 
21
-
22
21
  if TYPE_CHECKING:
23
22
  import cirq
24
23
 
@@ -134,6 +133,10 @@ class NamedQid(_BaseNamedQid):
134
133
  """Returns a tuple of args to pass to __new__ when unpickling."""
135
134
  return (self._name, self._dimension)
136
135
 
136
+ # avoid pickling the _hash value, attributes are already stored with __getnewargs__
137
+ def __getstate__(self) -> Dict[str, Any]:
138
+ return {}
139
+
137
140
  def __repr__(self) -> str:
138
141
  return f'cirq.NamedQid({self._name!r}, dimension={self._dimension})'
139
142
 
@@ -202,6 +205,10 @@ class NamedQubit(_BaseNamedQid):
202
205
  """Returns a tuple of args to pass to __new__ when unpickling."""
203
206
  return (self._name,)
204
207
 
208
+ # avoid pickling the _hash value, attributes are already stored with __getnewargs__
209
+ def __getstate__(self) -> Dict[str, Any]:
210
+ return {}
211
+
205
212
  def __str__(self) -> str:
206
213
  return self._name
207
214
 
cirq/ops/op_tree.py CHANGED
@@ -12,11 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- """A recursive type describing trees of operations, and utility methods for it.
16
- """
15
+ """A recursive type describing trees of operations, and utility methods for it."""
17
16
 
18
- from typing import Callable, Iterable, Iterator, NoReturn, Union, TYPE_CHECKING
19
- from typing_extensions import Protocol
17
+ from typing import Callable, Iterable, Iterator, NoReturn, TYPE_CHECKING, Union
20
18
 
21
19
  from cirq._doc import document
22
20
  from cirq._import import LazyLoader
@@ -28,32 +26,7 @@ if TYPE_CHECKING:
28
26
  moment = LazyLoader("moment", globals(), "cirq.circuits.moment")
29
27
 
30
28
 
31
- class OpTree(Protocol):
32
- """The recursive type consumed by circuit builder methods.
33
-
34
- An OpTree is a type protocol, satisfied by anything that can be recursively
35
- flattened into Operations. We also define the Union type OP_TREE which
36
- can be an OpTree or just a single Operation.
37
-
38
- For example:
39
- - An Operation is an OP_TREE all by itself.
40
- - A list of operations is an OP_TREE.
41
- - A list of tuples of operations is an OP_TREE.
42
- - A list with a mix of operations and lists of operations is an OP_TREE.
43
- - A generator yielding operations is an OP_TREE.
44
-
45
- Note: once mypy supports recursive types this could be defined as an alias:
46
-
47
- OP_TREE = Union[Operation, Iterable['OP_TREE']]
48
-
49
- See: https://github.com/python/mypy/issues/731
50
- """
51
-
52
- def __iter__(self) -> Iterator[Union[Operation, 'OpTree']]:
53
- pass
54
-
55
-
56
- OP_TREE = Union[Operation, OpTree]
29
+ OP_TREE = Union[Operation, Iterable['OP_TREE']]
57
30
  document(
58
31
  OP_TREE,
59
32
  """An operation or nested collections of operations.
cirq/ops/op_tree_test.py CHANGED
@@ -135,6 +135,10 @@ def test_transform_leaves():
135
135
  # Just an item.
136
136
  assert move_tree_left_freeze(operations[0]) == expected[0]
137
137
 
138
+ # Just a moment
139
+ m = cirq.Moment(cirq.X(cirq.q(1)))
140
+ assert cirq.transform_op_tree(m, preserve_moments=True) is m
141
+
138
142
  # Flat list.
139
143
  assert move_tree_left_freeze(operations) == tuple(expected)
140
144
 
cirq/ops/parallel_gate.py CHANGED
@@ -12,14 +12,13 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
-
16
- from typing import AbstractSet, Union, Any, Optional, Tuple, TYPE_CHECKING, Dict
15
+ from types import NotImplementedType
16
+ from typing import AbstractSet, Any, Dict, Optional, Tuple, TYPE_CHECKING, Union
17
17
 
18
18
  import numpy as np
19
19
 
20
20
  from cirq import protocols, value
21
21
  from cirq.ops import raw_types
22
- from cirq.type_workarounds import NotImplementedType
23
22
 
24
23
  if TYPE_CHECKING:
25
24
  import cirq
@@ -12,9 +12,10 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- import pytest
16
15
  import numpy as np
16
+ import pytest
17
17
  import sympy
18
+
18
19
  import cirq
19
20
 
20
21