cirq-core 1.5.0.dev20250409225226__py3-none-any.whl → 1.6.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 (732) hide show
  1. cirq/__init__.py +16 -17
  2. cirq/_compat.py +21 -20
  3. cirq/_compat_test.py +14 -34
  4. cirq/_doc.py +4 -2
  5. cirq/_import.py +8 -6
  6. cirq/_import_test.py +4 -2
  7. cirq/_version.py +6 -6
  8. cirq/_version_test.py +2 -2
  9. cirq/circuits/_block_diagram_drawer.py +11 -10
  10. cirq/circuits/_block_diagram_drawer_test.py +8 -6
  11. cirq/circuits/_box_drawing_character_data.py +8 -8
  12. cirq/circuits/_box_drawing_character_data_test.py +3 -1
  13. cirq/circuits/_bucket_priority_queue.py +9 -7
  14. cirq/circuits/_bucket_priority_queue_test.py +22 -20
  15. cirq/circuits/circuit.py +248 -172
  16. cirq/circuits/circuit_operation.py +73 -83
  17. cirq/circuits/circuit_operation_test.py +128 -90
  18. cirq/circuits/circuit_test.py +211 -151
  19. cirq/circuits/frozen_circuit.py +23 -60
  20. cirq/circuits/frozen_circuit_test.py +31 -8
  21. cirq/circuits/insert_strategy.py +7 -5
  22. cirq/circuits/insert_strategy_test.py +4 -2
  23. cirq/circuits/moment.py +88 -40
  24. cirq/circuits/moment_test.py +128 -51
  25. cirq/circuits/optimization_pass.py +5 -5
  26. cirq/circuits/optimization_pass_test.py +10 -10
  27. cirq/circuits/qasm_output.py +11 -11
  28. cirq/circuits/qasm_output_test.py +25 -22
  29. cirq/circuits/text_diagram_drawer.py +23 -38
  30. cirq/circuits/text_diagram_drawer_test.py +19 -17
  31. cirq/conftest.py +4 -3
  32. cirq/contrib/__init__.py +4 -4
  33. cirq/contrib/acquaintance/__init__.py +1 -1
  34. cirq/contrib/acquaintance/bipartite.py +5 -8
  35. cirq/contrib/acquaintance/bipartite_test.py +18 -13
  36. cirq/contrib/acquaintance/devices.py +2 -2
  37. cirq/contrib/acquaintance/devices_test.py +5 -3
  38. cirq/contrib/acquaintance/executor.py +5 -5
  39. cirq/contrib/acquaintance/executor_test.py +13 -9
  40. cirq/contrib/acquaintance/gates.py +18 -28
  41. cirq/contrib/acquaintance/gates_test.py +24 -20
  42. cirq/contrib/acquaintance/inspection_utils.py +8 -4
  43. cirq/contrib/acquaintance/inspection_utils_test.py +4 -2
  44. cirq/contrib/acquaintance/mutation_utils.py +4 -4
  45. cirq/contrib/acquaintance/mutation_utils_test.py +4 -2
  46. cirq/contrib/acquaintance/optimizers.py +4 -4
  47. cirq/contrib/acquaintance/optimizers_test.py +4 -1
  48. cirq/contrib/acquaintance/permutation.py +15 -27
  49. cirq/contrib/acquaintance/permutation_test.py +26 -17
  50. cirq/contrib/acquaintance/shift.py +4 -4
  51. cirq/contrib/acquaintance/shift_swap_network.py +4 -4
  52. cirq/contrib/acquaintance/shift_swap_network_test.py +9 -6
  53. cirq/contrib/acquaintance/shift_test.py +8 -6
  54. cirq/contrib/acquaintance/strategies/cubic.py +2 -2
  55. cirq/contrib/acquaintance/strategies/cubic_test.py +4 -2
  56. cirq/contrib/acquaintance/strategies/quartic_paired.py +6 -6
  57. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +10 -6
  58. cirq/contrib/acquaintance/testing.py +2 -0
  59. cirq/contrib/acquaintance/topological_sort.py +2 -2
  60. cirq/contrib/acquaintance/topological_sort_test.py +3 -1
  61. cirq/contrib/bayesian_network/bayesian_network_gate.py +9 -10
  62. cirq/contrib/bayesian_network/bayesian_network_gate_test.py +14 -9
  63. cirq/contrib/circuitdag/circuit_dag.py +4 -4
  64. cirq/contrib/circuitdag/circuit_dag_test.py +17 -15
  65. cirq/contrib/custom_simulators/custom_state_simulator.py +5 -5
  66. cirq/contrib/custom_simulators/custom_state_simulator_test.py +22 -17
  67. cirq/contrib/graph_device/graph_device.py +12 -11
  68. cirq/contrib/graph_device/graph_device_test.py +18 -14
  69. cirq/contrib/graph_device/hypergraph.py +16 -14
  70. cirq/contrib/graph_device/hypergraph_test.py +13 -11
  71. cirq/contrib/graph_device/uniform_graph_device.py +6 -4
  72. cirq/contrib/graph_device/uniform_graph_device_test.py +11 -3
  73. cirq/contrib/hacks/disable_validation.py +6 -1
  74. cirq/contrib/hacks/disable_validation_test.py +3 -1
  75. cirq/contrib/json.py +31 -5
  76. cirq/contrib/json_test.py +6 -3
  77. cirq/contrib/json_test_data/DampedReadoutNoiseModel.json +12 -0
  78. cirq/contrib/json_test_data/DampedReadoutNoiseModel.repr +4 -0
  79. cirq/contrib/json_test_data/DepolarizingNoiseModel.json +12 -0
  80. cirq/contrib/json_test_data/DepolarizingNoiseModel.repr +4 -0
  81. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.json +6 -0
  82. cirq/contrib/json_test_data/DepolarizingWithDampedReadoutNoiseModel.repr +1 -0
  83. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.json +5 -0
  84. cirq/contrib/json_test_data/DepolarizingWithReadoutNoiseModel.repr +1 -0
  85. cirq/contrib/json_test_data/ReadoutNoiseModel.json +12 -0
  86. cirq/contrib/json_test_data/ReadoutNoiseModel.repr +4 -0
  87. cirq/contrib/json_test_data/__init__.py +17 -0
  88. cirq/contrib/json_test_data/spec.py +32 -0
  89. cirq/contrib/noise_models/noise_models.py +119 -5
  90. cirq/contrib/noise_models/noise_models_test.py +37 -9
  91. cirq/contrib/paulistring/clifford_optimize.py +6 -4
  92. cirq/contrib/paulistring/clifford_optimize_test.py +6 -5
  93. cirq/contrib/paulistring/clifford_target_gateset.py +10 -10
  94. cirq/contrib/paulistring/clifford_target_gateset_test.py +13 -11
  95. cirq/contrib/paulistring/optimize.py +2 -0
  96. cirq/contrib/paulistring/optimize_test.py +4 -3
  97. cirq/contrib/paulistring/pauli_string_dag.py +2 -0
  98. cirq/contrib/paulistring/pauli_string_dag_test.py +3 -1
  99. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +255 -120
  100. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +398 -19
  101. cirq/contrib/paulistring/pauli_string_optimize.py +7 -1
  102. cirq/contrib/paulistring/pauli_string_optimize_test.py +5 -3
  103. cirq/contrib/paulistring/recombine.py +6 -4
  104. cirq/contrib/paulistring/recombine_test.py +3 -1
  105. cirq/contrib/paulistring/separate.py +9 -6
  106. cirq/contrib/paulistring/separate_test.py +3 -1
  107. cirq/contrib/qasm_import/_lexer.py +3 -2
  108. cirq/contrib/qasm_import/_lexer_test.py +49 -13
  109. cirq/contrib/qasm_import/_parser.py +547 -83
  110. cirq/contrib/qasm_import/_parser_test.py +988 -97
  111. cirq/contrib/qasm_import/exception.py +2 -0
  112. cirq/contrib/qasm_import/qasm.py +8 -2
  113. cirq/contrib/qasm_import/qasm_test.py +7 -4
  114. cirq/contrib/qcircuit/qcircuit_diagram_info.py +5 -5
  115. cirq/contrib/qcircuit/qcircuit_diagram_info_test.py +4 -1
  116. cirq/contrib/qcircuit/qcircuit_pdf.py +7 -3
  117. cirq/contrib/qcircuit/qcircuit_pdf_test.py +3 -1
  118. cirq/contrib/qcircuit/qcircuit_test.py +10 -8
  119. cirq/contrib/quantum_volume/quantum_volume.py +31 -27
  120. cirq/contrib/quantum_volume/quantum_volume_test.py +19 -16
  121. cirq/contrib/quimb/density_matrix.py +15 -14
  122. cirq/contrib/quimb/density_matrix_test.py +10 -7
  123. cirq/contrib/quimb/grid_circuits.py +5 -2
  124. cirq/contrib/quimb/grid_circuits_test.py +3 -0
  125. cirq/contrib/quimb/mps_simulator.py +20 -20
  126. cirq/contrib/quimb/mps_simulator_test.py +3 -0
  127. cirq/contrib/quimb/state_vector.py +12 -11
  128. cirq/contrib/quimb/state_vector_test.py +3 -0
  129. cirq/contrib/quirk/export_to_quirk.py +5 -3
  130. cirq/contrib/quirk/export_to_quirk_test.py +18 -16
  131. cirq/contrib/quirk/linearize_circuit.py +2 -0
  132. cirq/contrib/quirk/quirk_gate.py +18 -17
  133. cirq/contrib/routing/device.py +5 -3
  134. cirq/contrib/routing/device_test.py +2 -0
  135. cirq/contrib/routing/greedy.py +10 -21
  136. cirq/contrib/routing/greedy_test.py +4 -2
  137. cirq/contrib/routing/initialization.py +2 -2
  138. cirq/contrib/routing/initialization_test.py +5 -3
  139. cirq/contrib/routing/router.py +9 -5
  140. cirq/contrib/routing/router_test.py +2 -0
  141. cirq/contrib/routing/swap_network.py +3 -3
  142. cirq/contrib/routing/swap_network_test.py +3 -1
  143. cirq/contrib/routing/utils.py +2 -2
  144. cirq/contrib/routing/utils_test.py +3 -0
  145. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +15 -9
  146. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +3 -0
  147. cirq/contrib/svg/svg.py +3 -3
  148. cirq/contrib/svg/svg_test.py +8 -5
  149. cirq/devices/device.py +4 -4
  150. cirq/devices/device_test.py +7 -4
  151. cirq/devices/grid_device_metadata.py +10 -10
  152. cirq/devices/grid_device_metadata_test.py +3 -0
  153. cirq/devices/grid_qubit.py +29 -21
  154. cirq/devices/grid_qubit_test.py +3 -0
  155. cirq/devices/insertion_noise_model.py +7 -7
  156. cirq/devices/insertion_noise_model_test.py +7 -5
  157. cirq/devices/line_qubit.py +13 -13
  158. cirq/devices/line_qubit_test.py +2 -0
  159. cirq/devices/named_topologies.py +18 -29
  160. cirq/devices/named_topologies_test.py +13 -10
  161. cirq/devices/noise_model.py +3 -3
  162. cirq/devices/noise_model_test.py +19 -15
  163. cirq/devices/noise_properties.py +15 -6
  164. cirq/devices/noise_properties_test.py +34 -3
  165. cirq/devices/noise_utils.py +11 -9
  166. cirq/devices/noise_utils_test.py +2 -0
  167. cirq/devices/superconducting_qubits_noise_properties.py +23 -22
  168. cirq/devices/superconducting_qubits_noise_properties_test.py +6 -6
  169. cirq/devices/thermal_noise_model.py +107 -37
  170. cirq/devices/thermal_noise_model_test.py +21 -0
  171. cirq/devices/unconstrained_device.py +5 -3
  172. cirq/devices/unconstrained_device_test.py +2 -0
  173. cirq/experiments/__init__.py +4 -2
  174. cirq/experiments/benchmarking/__init__.py +17 -0
  175. cirq/experiments/benchmarking/parallel_xeb.py +677 -0
  176. cirq/experiments/benchmarking/parallel_xeb_test.py +447 -0
  177. cirq/experiments/fidelity_estimation.py +14 -8
  178. cirq/experiments/fidelity_estimation_test.py +3 -0
  179. cirq/experiments/n_qubit_tomography.py +17 -16
  180. cirq/experiments/n_qubit_tomography_test.py +8 -5
  181. cirq/experiments/purity_estimation.py +2 -0
  182. cirq/experiments/purity_estimation_test.py +2 -0
  183. cirq/experiments/qubit_characterizations.py +207 -103
  184. cirq/experiments/qubit_characterizations_test.py +40 -12
  185. cirq/experiments/random_quantum_circuit_generation.py +56 -70
  186. cirq/experiments/random_quantum_circuit_generation_test.py +11 -8
  187. cirq/experiments/readout_confusion_matrix.py +24 -22
  188. cirq/experiments/readout_confusion_matrix_test.py +2 -0
  189. cirq/experiments/single_qubit_readout_calibration.py +30 -15
  190. cirq/experiments/single_qubit_readout_calibration_test.py +5 -2
  191. cirq/experiments/t1_decay_experiment.py +9 -7
  192. cirq/experiments/t1_decay_experiment_test.py +13 -11
  193. cirq/experiments/t2_decay_experiment.py +16 -13
  194. cirq/experiments/t2_decay_experiment_test.py +2 -0
  195. cirq/experiments/two_qubit_xeb.py +64 -57
  196. cirq/experiments/two_qubit_xeb_test.py +10 -6
  197. cirq/experiments/xeb_fitting.py +39 -35
  198. cirq/experiments/xeb_sampling.py +37 -44
  199. cirq/experiments/xeb_sampling_test.py +3 -0
  200. cirq/experiments/xeb_simulation.py +14 -10
  201. cirq/experiments/xeb_simulation_test.py +5 -5
  202. cirq/experiments/z_phase_calibration.py +32 -29
  203. cirq/experiments/z_phase_calibration_test.py +3 -4
  204. cirq/interop/quirk/cells/__init__.py +1 -1
  205. cirq/interop/quirk/cells/all_cells.py +7 -2
  206. cirq/interop/quirk/cells/arithmetic_cells.py +29 -41
  207. cirq/interop/quirk/cells/arithmetic_cells_test.py +17 -14
  208. cirq/interop/quirk/cells/cell.py +19 -28
  209. cirq/interop/quirk/cells/cell_test.py +3 -0
  210. cirq/interop/quirk/cells/composite_cell.py +13 -28
  211. cirq/interop/quirk/cells/composite_cell_test.py +2 -0
  212. cirq/interop/quirk/cells/control_cells.py +15 -15
  213. cirq/interop/quirk/cells/control_cells_test.py +7 -5
  214. cirq/interop/quirk/cells/frequency_space_cells.py +4 -3
  215. cirq/interop/quirk/cells/frequency_space_cells_test.py +3 -1
  216. cirq/interop/quirk/cells/ignored_cells.py +3 -0
  217. cirq/interop/quirk/cells/ignored_cells_test.py +3 -1
  218. cirq/interop/quirk/cells/input_cells.py +7 -5
  219. cirq/interop/quirk/cells/input_cells_test.py +7 -5
  220. cirq/interop/quirk/cells/input_rotation_cells.py +15 -13
  221. cirq/interop/quirk/cells/input_rotation_cells_test.py +9 -7
  222. cirq/interop/quirk/cells/measurement_cells.py +5 -2
  223. cirq/interop/quirk/cells/measurement_cells_test.py +3 -1
  224. cirq/interop/quirk/cells/parse.py +22 -23
  225. cirq/interop/quirk/cells/parse_test.py +12 -10
  226. cirq/interop/quirk/cells/qubit_permutation_cells.py +5 -3
  227. cirq/interop/quirk/cells/qubit_permutation_cells_test.py +9 -7
  228. cirq/interop/quirk/cells/scalar_cells.py +4 -1
  229. cirq/interop/quirk/cells/scalar_cells_test.py +3 -1
  230. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +5 -2
  231. cirq/interop/quirk/cells/single_qubit_rotation_cells_test.py +5 -3
  232. cirq/interop/quirk/cells/swap_cell.py +8 -6
  233. cirq/interop/quirk/cells/swap_cell_test.py +6 -4
  234. cirq/interop/quirk/cells/testing.py +6 -6
  235. cirq/interop/quirk/cells/testing_test.py +8 -6
  236. cirq/interop/quirk/cells/unsupported_cells.py +3 -0
  237. cirq/interop/quirk/cells/unsupported_cells_test.py +4 -2
  238. cirq/interop/quirk/url_to_circuit.py +23 -36
  239. cirq/interop/quirk/url_to_circuit_test.py +4 -1
  240. cirq/json_resolver_cache.py +14 -12
  241. cirq/linalg/__init__.py +4 -6
  242. cirq/linalg/combinators.py +7 -5
  243. cirq/linalg/combinators_test.py +10 -7
  244. cirq/linalg/decompositions.py +24 -35
  245. cirq/linalg/decompositions_test.py +3 -1
  246. cirq/linalg/diagonalize.py +6 -4
  247. cirq/linalg/diagonalize_test.py +15 -14
  248. cirq/linalg/operator_spaces.py +14 -14
  249. cirq/linalg/operator_spaces_test.py +13 -11
  250. cirq/linalg/predicates.py +18 -9
  251. cirq/linalg/predicates_test.py +5 -0
  252. cirq/linalg/tolerance.py +6 -3
  253. cirq/linalg/tolerance_test.py +6 -4
  254. cirq/linalg/transformations.py +23 -20
  255. cirq/linalg/transformations_test.py +73 -43
  256. cirq/neutral_atoms/convert_to_neutral_atom_gates.py +9 -3
  257. cirq/neutral_atoms/convert_to_neutral_atom_gates_test.py +3 -1
  258. cirq/neutral_atoms/neutral_atom_devices.py +2 -0
  259. cirq/ops/__init__.py +2 -0
  260. cirq/ops/arithmetic_operation.py +21 -21
  261. cirq/ops/arithmetic_operation_test.py +7 -8
  262. cirq/ops/boolean_hamiltonian.py +23 -22
  263. cirq/ops/boolean_hamiltonian_test.py +12 -9
  264. cirq/ops/classically_controlled_operation.py +31 -36
  265. cirq/ops/classically_controlled_operation_test.py +121 -117
  266. cirq/ops/clifford_gate.py +98 -81
  267. cirq/ops/clifford_gate_test.py +72 -57
  268. cirq/ops/common_channels.py +44 -44
  269. cirq/ops/common_channels_test.py +83 -81
  270. cirq/ops/common_gate_families.py +9 -7
  271. cirq/ops/common_gate_families_test.py +11 -7
  272. cirq/ops/common_gates.py +164 -183
  273. cirq/ops/common_gates_test.py +135 -95
  274. cirq/ops/control_values.py +23 -26
  275. cirq/ops/control_values_test.py +22 -20
  276. cirq/ops/controlled_gate.py +64 -112
  277. cirq/ops/controlled_gate_test.py +130 -35
  278. cirq/ops/controlled_operation.py +24 -35
  279. cirq/ops/controlled_operation_test.py +8 -6
  280. cirq/ops/dense_pauli_string.py +38 -49
  281. cirq/ops/dense_pauli_string_test.py +4 -2
  282. cirq/ops/diagonal_gate.py +18 -31
  283. cirq/ops/diagonal_gate_test.py +13 -13
  284. cirq/ops/eigen_gate.py +29 -29
  285. cirq/ops/eigen_gate_test.py +45 -28
  286. cirq/ops/fourier_transform.py +14 -20
  287. cirq/ops/fourier_transform_test.py +15 -12
  288. cirq/ops/fsim_gate.py +43 -42
  289. cirq/ops/fsim_gate_test.py +29 -29
  290. cirq/ops/gate_features.py +2 -0
  291. cirq/ops/gate_features_test.py +5 -3
  292. cirq/ops/gate_operation.py +43 -65
  293. cirq/ops/gate_operation_test.py +46 -42
  294. cirq/ops/gateset.py +28 -40
  295. cirq/ops/gateset_test.py +4 -2
  296. cirq/ops/global_phase_op.py +45 -20
  297. cirq/ops/global_phase_op_test.py +44 -20
  298. cirq/ops/greedy_qubit_manager.py +10 -8
  299. cirq/ops/greedy_qubit_manager_test.py +5 -3
  300. cirq/ops/identity.py +14 -12
  301. cirq/ops/identity_test.py +24 -20
  302. cirq/ops/kraus_channel.py +11 -8
  303. cirq/ops/kraus_channel_test.py +14 -11
  304. cirq/ops/linear_combinations.py +65 -77
  305. cirq/ops/linear_combinations_test.py +14 -9
  306. cirq/ops/matrix_gates.py +21 -18
  307. cirq/ops/matrix_gates_test.py +16 -0
  308. cirq/ops/measure_util.py +15 -20
  309. cirq/ops/measure_util_test.py +2 -0
  310. cirq/ops/measurement_gate.py +26 -37
  311. cirq/ops/measurement_gate_test.py +2 -0
  312. cirq/ops/mixed_unitary_channel.py +12 -9
  313. cirq/ops/mixed_unitary_channel_test.py +14 -11
  314. cirq/ops/named_qubit.py +16 -13
  315. cirq/ops/named_qubit_test.py +15 -13
  316. cirq/ops/op_tree.py +9 -7
  317. cirq/ops/op_tree_test.py +22 -19
  318. cirq/ops/parallel_gate.py +15 -17
  319. cirq/ops/parallel_gate_test.py +18 -16
  320. cirq/ops/parity_gates.py +23 -25
  321. cirq/ops/parity_gates_test.py +36 -32
  322. cirq/ops/pauli_gates.py +22 -21
  323. cirq/ops/pauli_gates_test.py +29 -20
  324. cirq/ops/pauli_interaction_gate.py +15 -19
  325. cirq/ops/pauli_interaction_gate_test.py +10 -8
  326. cirq/ops/pauli_measurement_gate.py +23 -35
  327. cirq/ops/pauli_measurement_gate_test.py +2 -0
  328. cirq/ops/pauli_string.py +92 -120
  329. cirq/ops/pauli_string_phasor.py +52 -45
  330. cirq/ops/pauli_string_phasor_test.py +4 -5
  331. cirq/ops/pauli_string_raw_types.py +9 -7
  332. cirq/ops/pauli_string_raw_types_test.py +2 -0
  333. cirq/ops/pauli_string_test.py +31 -154
  334. cirq/ops/pauli_sum_exponential.py +12 -12
  335. cirq/ops/pauli_sum_exponential_test.py +12 -10
  336. cirq/ops/permutation_gate.py +8 -6
  337. cirq/ops/permutation_gate_test.py +10 -8
  338. cirq/ops/phased_iswap_gate.py +16 -16
  339. cirq/ops/phased_iswap_gate_test.py +17 -15
  340. cirq/ops/phased_x_gate.py +16 -17
  341. cirq/ops/phased_x_gate_test.py +18 -16
  342. cirq/ops/phased_x_z_gate.py +24 -22
  343. cirq/ops/phased_x_z_gate_test.py +17 -11
  344. cirq/ops/projector.py +16 -11
  345. cirq/ops/projector_test.py +19 -16
  346. cirq/ops/qid_util.py +7 -5
  347. cirq/ops/qid_util_test.py +2 -0
  348. cirq/ops/qubit_manager.py +11 -9
  349. cirq/ops/qubit_manager_test.py +6 -4
  350. cirq/ops/qubit_order.py +11 -14
  351. cirq/ops/qubit_order_or_list.py +4 -2
  352. cirq/ops/qubit_order_test.py +12 -10
  353. cirq/ops/random_gate_channel.py +12 -10
  354. cirq/ops/random_gate_channel_test.py +14 -11
  355. cirq/ops/raw_types.py +109 -129
  356. cirq/ops/raw_types_test.py +63 -57
  357. cirq/ops/state_preparation_channel.py +7 -7
  358. cirq/ops/state_preparation_channel_test.py +11 -9
  359. cirq/ops/swap_gates.py +13 -15
  360. cirq/ops/swap_gates_test.py +19 -17
  361. cirq/ops/tags.py +5 -3
  362. cirq/ops/tags_test.py +4 -2
  363. cirq/ops/three_qubit_gates.py +43 -76
  364. cirq/ops/three_qubit_gates_test.py +19 -17
  365. cirq/ops/two_qubit_diagonal_gate.py +13 -13
  366. cirq/ops/two_qubit_diagonal_gate_test.py +10 -8
  367. cirq/ops/uniform_superposition_gate.py +5 -3
  368. cirq/ops/uniform_superposition_gate_test.py +5 -3
  369. cirq/ops/wait_gate.py +17 -14
  370. cirq/ops/wait_gate_test.py +9 -6
  371. cirq/protocols/__init__.py +0 -3
  372. cirq/protocols/act_on_protocol.py +8 -6
  373. cirq/protocols/act_on_protocol_test.py +15 -12
  374. cirq/protocols/apply_channel_protocol.py +10 -14
  375. cirq/protocols/apply_channel_protocol_test.py +2 -0
  376. cirq/protocols/apply_mixture_protocol.py +13 -42
  377. cirq/protocols/apply_mixture_protocol_test.py +7 -5
  378. cirq/protocols/apply_unitary_protocol.py +39 -34
  379. cirq/protocols/apply_unitary_protocol_test.py +4 -1
  380. cirq/protocols/approximate_equality_protocol.py +2 -0
  381. cirq/protocols/approximate_equality_protocol_test.py +2 -0
  382. cirq/protocols/circuit_diagram_info_protocol.py +58 -42
  383. cirq/protocols/circuit_diagram_info_protocol_test.py +70 -12
  384. cirq/protocols/commutes_protocol.py +8 -7
  385. cirq/protocols/commutes_protocol_test.py +2 -0
  386. cirq/protocols/control_key_protocol.py +6 -4
  387. cirq/protocols/control_key_protocol_test.py +3 -1
  388. cirq/protocols/decompose_protocol.py +49 -48
  389. cirq/protocols/decompose_protocol_test.py +27 -16
  390. cirq/protocols/equal_up_to_global_phase_protocol.py +2 -0
  391. cirq/protocols/equal_up_to_global_phase_protocol_test.py +9 -6
  392. cirq/protocols/has_stabilizer_effect_protocol.py +7 -5
  393. cirq/protocols/has_stabilizer_effect_protocol_test.py +7 -5
  394. cirq/protocols/has_unitary_protocol.py +10 -6
  395. cirq/protocols/has_unitary_protocol_test.py +13 -8
  396. cirq/protocols/hash_from_pickle_test.py +2 -11
  397. cirq/protocols/inverse_protocol.py +13 -16
  398. cirq/protocols/inverse_protocol_test.py +5 -3
  399. cirq/protocols/json_serialization.py +35 -54
  400. cirq/protocols/json_serialization_test.py +14 -21
  401. cirq/protocols/json_test_data/CXSWAP.json +46 -0
  402. cirq/protocols/json_test_data/CXSWAP.repr +13 -0
  403. cirq/protocols/json_test_data/CZSWAP.json +46 -0
  404. cirq/protocols/json_test_data/CZSWAP.repr +13 -0
  405. cirq/protocols/json_test_data/CircuitOperation.json +6 -3
  406. cirq/protocols/json_test_data/CircuitOperation.repr_inward +4 -2
  407. cirq/protocols/json_test_data/Moment.json +24 -1
  408. cirq/protocols/json_test_data/Moment.repr +6 -1
  409. cirq/protocols/json_test_data/ThermalNoiseModel.json +32 -0
  410. cirq/protocols/json_test_data/ThermalNoiseModel.repr +1 -0
  411. cirq/protocols/json_test_data/spec.py +6 -2
  412. cirq/protocols/kraus_protocol.py +47 -7
  413. cirq/protocols/kraus_protocol_test.py +86 -12
  414. cirq/protocols/measurement_key_protocol.py +15 -16
  415. cirq/protocols/measurement_key_protocol_test.py +13 -11
  416. cirq/protocols/mixture_protocol.py +7 -5
  417. cirq/protocols/mixture_protocol_test.py +4 -2
  418. cirq/protocols/mul_protocol.py +2 -3
  419. cirq/protocols/mul_protocol_test.py +2 -0
  420. cirq/protocols/pauli_expansion_protocol.py +6 -3
  421. cirq/protocols/pauli_expansion_protocol_test.py +5 -3
  422. cirq/protocols/phase_protocol.py +2 -0
  423. cirq/protocols/phase_protocol_test.py +3 -1
  424. cirq/protocols/pow_protocol.py +11 -16
  425. cirq/protocols/pow_protocol_test.py +2 -0
  426. cirq/protocols/qasm.py +14 -20
  427. cirq/protocols/qasm_test.py +6 -3
  428. cirq/protocols/qid_shape_protocol.py +8 -8
  429. cirq/protocols/qid_shape_protocol_test.py +3 -1
  430. cirq/protocols/resolve_parameters.py +5 -3
  431. cirq/protocols/resolve_parameters_test.py +8 -7
  432. cirq/protocols/trace_distance_bound.py +6 -4
  433. cirq/protocols/trace_distance_bound_test.py +3 -1
  434. cirq/protocols/unitary_protocol.py +17 -7
  435. cirq/protocols/unitary_protocol_test.py +12 -2
  436. cirq/qis/channels.py +6 -2
  437. cirq/qis/channels_test.py +20 -16
  438. cirq/qis/clifford_tableau.py +21 -19
  439. cirq/qis/clifford_tableau_test.py +2 -2
  440. cirq/qis/entropy.py +14 -3
  441. cirq/qis/entropy_test.py +3 -1
  442. cirq/qis/measures.py +13 -13
  443. cirq/qis/measures_test.py +20 -14
  444. cirq/qis/noise_utils.py +2 -0
  445. cirq/qis/noise_utils_test.py +9 -7
  446. cirq/qis/quantum_state_representation.py +7 -8
  447. cirq/qis/states.py +58 -56
  448. cirq/qis/states_test.py +2 -0
  449. cirq/sim/classical_simulator.py +23 -22
  450. cirq/sim/classical_simulator_test.py +2 -0
  451. cirq/sim/clifford/clifford_simulator.py +23 -21
  452. cirq/sim/clifford/clifford_simulator_test.py +7 -4
  453. cirq/sim/clifford/clifford_tableau_simulation_state.py +10 -7
  454. cirq/sim/clifford/clifford_tableau_simulation_state_test.py +5 -5
  455. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +8 -6
  456. cirq/sim/clifford/stabilizer_ch_form_simulation_state_test.py +8 -6
  457. cirq/sim/clifford/stabilizer_sampler.py +9 -7
  458. cirq/sim/clifford/stabilizer_sampler_test.py +4 -2
  459. cirq/sim/clifford/stabilizer_simulation_state.py +14 -13
  460. cirq/sim/clifford/stabilizer_simulation_state_test.py +6 -4
  461. cirq/sim/clifford/stabilizer_state_ch_form.py +13 -11
  462. cirq/sim/clifford/stabilizer_state_ch_form_test.py +4 -2
  463. cirq/sim/density_matrix_simulation_state.py +26 -27
  464. cirq/sim/density_matrix_simulation_state_test.py +10 -8
  465. cirq/sim/density_matrix_simulator.py +30 -28
  466. cirq/sim/density_matrix_simulator_test.py +48 -48
  467. cirq/sim/density_matrix_utils.py +13 -11
  468. cirq/sim/density_matrix_utils_test.py +38 -36
  469. cirq/sim/mux.py +33 -31
  470. cirq/sim/mux_test.py +3 -0
  471. cirq/sim/simulation_product_state.py +15 -15
  472. cirq/sim/simulation_product_state_test.py +29 -26
  473. cirq/sim/simulation_state.py +29 -38
  474. cirq/sim/simulation_state_base.py +21 -32
  475. cirq/sim/simulation_state_test.py +15 -13
  476. cirq/sim/simulation_utils.py +5 -2
  477. cirq/sim/simulation_utils_test.py +5 -2
  478. cirq/sim/simulator.py +90 -106
  479. cirq/sim/simulator_base.py +33 -45
  480. cirq/sim/simulator_base_test.py +20 -15
  481. cirq/sim/simulator_test.py +23 -14
  482. cirq/sim/sparse_simulator.py +19 -17
  483. cirq/sim/sparse_simulator_test.py +41 -40
  484. cirq/sim/state_vector.py +15 -12
  485. cirq/sim/state_vector_simulation_state.py +31 -31
  486. cirq/sim/state_vector_simulation_state_test.py +16 -14
  487. cirq/sim/state_vector_simulator.py +17 -14
  488. cirq/sim/state_vector_simulator_test.py +2 -0
  489. cirq/sim/state_vector_test.py +6 -3
  490. cirq/study/flatten_expressions.py +16 -15
  491. cirq/study/flatten_expressions_test.py +13 -11
  492. cirq/study/resolver.py +18 -17
  493. cirq/study/resolver_test.py +22 -20
  494. cirq/study/result.py +17 -27
  495. cirq/study/result_test.py +2 -0
  496. cirq/study/sweepable.py +12 -10
  497. cirq/study/sweepable_test.py +3 -0
  498. cirq/study/sweeps.py +42 -61
  499. cirq/study/sweeps_test.py +33 -0
  500. cirq/testing/__init__.py +7 -11
  501. cirq/testing/_compat_test_data/module_a/__init__.py +1 -0
  502. cirq/testing/_compat_test_data/module_a/module_b/__init__.py +1 -0
  503. cirq/testing/_compat_test_data/module_a/sub/__init__.py +1 -0
  504. cirq/testing/circuit_compare.py +8 -17
  505. cirq/testing/circuit_compare_test.py +2 -0
  506. cirq/testing/consistent_act_on.py +13 -11
  507. cirq/testing/consistent_act_on_test.py +5 -3
  508. cirq/testing/consistent_channels.py +2 -0
  509. cirq/testing/consistent_channels_test.py +10 -8
  510. cirq/testing/consistent_controlled_gate_op.py +5 -5
  511. cirq/testing/consistent_controlled_gate_op_test.py +18 -18
  512. cirq/testing/consistent_decomposition.py +2 -2
  513. cirq/testing/consistent_decomposition_test.py +4 -2
  514. cirq/testing/consistent_pauli_expansion.py +2 -0
  515. cirq/testing/consistent_pauli_expansion_test.py +3 -1
  516. cirq/testing/consistent_phase_by.py +2 -0
  517. cirq/testing/consistent_phase_by_test.py +3 -1
  518. cirq/testing/consistent_protocols.py +14 -20
  519. cirq/testing/consistent_protocols_test.py +13 -11
  520. cirq/testing/consistent_qasm.py +6 -4
  521. cirq/testing/consistent_qasm_test.py +7 -7
  522. cirq/testing/consistent_resolve_parameters.py +2 -0
  523. cirq/testing/consistent_specified_has_unitary.py +2 -2
  524. cirq/testing/consistent_specified_has_unitary_test.py +6 -4
  525. cirq/testing/consistent_unitary.py +1 -0
  526. cirq/testing/consistent_unitary_test.py +4 -2
  527. cirq/testing/deprecation.py +5 -2
  528. cirq/testing/deprecation_test.py +5 -2
  529. cirq/testing/devices.py +7 -4
  530. cirq/testing/devices_test.py +7 -4
  531. cirq/testing/equals_tester.py +4 -2
  532. cirq/testing/equals_tester_test.py +21 -17
  533. cirq/testing/equivalent_basis_map.py +6 -4
  534. cirq/testing/equivalent_basis_map_test.py +6 -4
  535. cirq/testing/equivalent_repr_eval.py +6 -4
  536. cirq/testing/equivalent_repr_eval_test.py +5 -3
  537. cirq/testing/gate_features.py +2 -0
  538. cirq/testing/gate_features_test.py +7 -5
  539. cirq/testing/json.py +19 -15
  540. cirq/testing/json_test.py +5 -3
  541. cirq/testing/lin_alg_utils.py +10 -11
  542. cirq/testing/lin_alg_utils_test.py +14 -12
  543. cirq/testing/logs.py +7 -6
  544. cirq/testing/logs_test.py +9 -7
  545. cirq/testing/no_identifier_qubit.py +4 -2
  546. cirq/testing/no_identifier_qubit_test.py +5 -3
  547. cirq/testing/op_tree.py +2 -0
  548. cirq/testing/op_tree_test.py +4 -1
  549. cirq/testing/order_tester.py +2 -0
  550. cirq/testing/order_tester_test.py +8 -6
  551. cirq/testing/pytest_utils.py +2 -0
  552. cirq/testing/pytest_utils_test.py +4 -2
  553. cirq/testing/random_circuit.py +21 -20
  554. cirq/testing/random_circuit_test.py +12 -9
  555. cirq/testing/repr_pretty_tester.py +1 -0
  556. cirq/testing/repr_pretty_tester_test.py +5 -3
  557. cirq/testing/routing_devices.py +4 -1
  558. cirq/testing/routing_devices_test.py +9 -6
  559. cirq/testing/sample_circuits.py +4 -1
  560. cirq/testing/sample_circuits_test.py +3 -1
  561. cirq/testing/sample_gates.py +3 -0
  562. cirq/testing/sample_gates_test.py +5 -2
  563. cirq/transformers/__init__.py +11 -4
  564. cirq/transformers/align.py +9 -7
  565. cirq/transformers/align_test.py +2 -0
  566. cirq/transformers/analytical_decompositions/__init__.py +3 -6
  567. cirq/transformers/analytical_decompositions/clifford_decomposition.py +18 -16
  568. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +2 -0
  569. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +19 -16
  570. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +2 -0
  571. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +11 -9
  572. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +5 -3
  573. cirq/transformers/analytical_decompositions/pauli_string_decomposition.py +5 -3
  574. cirq/transformers/analytical_decompositions/pauli_string_decomposition_test.py +5 -3
  575. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +141 -44
  576. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +35 -1
  577. cirq/transformers/analytical_decompositions/single_qubit_decompositions.py +8 -7
  578. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +2 -0
  579. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry.py +7 -4
  580. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +3 -0
  581. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +11 -19
  582. cirq/transformers/analytical_decompositions/three_qubit_decomposition_test.py +8 -33
  583. cirq/transformers/analytical_decompositions/two_qubit_state_preparation.py +9 -11
  584. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +2 -0
  585. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +91 -27
  586. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +36 -7
  587. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +20 -21
  588. cirq/transformers/analytical_decompositions/two_qubit_to_fsim_test.py +8 -6
  589. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +13 -15
  590. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +3 -1
  591. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +39 -41
  592. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +2 -0
  593. cirq/transformers/drop_empty_moments.py +5 -3
  594. cirq/transformers/drop_empty_moments_test.py +4 -2
  595. cirq/transformers/drop_negligible_operations.py +7 -5
  596. cirq/transformers/drop_negligible_operations_test.py +2 -0
  597. cirq/transformers/dynamical_decoupling.py +49 -42
  598. cirq/transformers/dynamical_decoupling_test.py +223 -205
  599. cirq/transformers/eject_phased_paulis.py +28 -26
  600. cirq/transformers/eject_phased_paulis_test.py +12 -9
  601. cirq/transformers/eject_z.py +12 -12
  602. cirq/transformers/eject_z_test.py +2 -2
  603. cirq/transformers/expand_composite.py +6 -4
  604. cirq/transformers/expand_composite_test.py +3 -1
  605. cirq/transformers/gauge_compiling/__init__.py +3 -1
  606. cirq/transformers/gauge_compiling/cphase_gauge.py +2 -0
  607. cirq/transformers/gauge_compiling/cphase_gauge_test.py +2 -0
  608. cirq/transformers/gauge_compiling/cz_gauge.py +2 -0
  609. cirq/transformers/gauge_compiling/cz_gauge_test.py +1 -0
  610. cirq/transformers/gauge_compiling/gauge_compiling.py +45 -41
  611. cirq/transformers/gauge_compiling/gauge_compiling_test.py +2 -0
  612. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +1 -0
  613. cirq/transformers/gauge_compiling/gauge_compiling_test_utils_test.py +5 -1
  614. cirq/transformers/gauge_compiling/iswap_gauge.py +2 -0
  615. cirq/transformers/gauge_compiling/iswap_gauge_test.py +1 -0
  616. cirq/transformers/gauge_compiling/spin_inversion_gauge.py +2 -0
  617. cirq/transformers/gauge_compiling/spin_inversion_gauge_test.py +2 -0
  618. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +7 -6
  619. cirq/transformers/gauge_compiling/sqrt_cz_gauge_test.py +2 -0
  620. cirq/transformers/gauge_compiling/sqrt_iswap_gauge.py +2 -0
  621. cirq/transformers/gauge_compiling/sqrt_iswap_gauge_test.py +2 -0
  622. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +6 -3
  623. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +3 -0
  624. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +12 -9
  625. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation_test.py +9 -7
  626. cirq/transformers/insertion_sort.py +8 -6
  627. cirq/transformers/insertion_sort_test.py +3 -1
  628. cirq/transformers/measurement_transformers.py +29 -29
  629. cirq/transformers/measurement_transformers_test.py +2 -0
  630. cirq/transformers/merge_k_qubit_gates.py +12 -10
  631. cirq/transformers/merge_k_qubit_gates_test.py +18 -18
  632. cirq/transformers/merge_single_qubit_gates.py +197 -20
  633. cirq/transformers/merge_single_qubit_gates_test.py +177 -5
  634. cirq/transformers/noise_adding.py +5 -3
  635. cirq/transformers/noise_adding_test.py +2 -0
  636. cirq/transformers/optimize_for_target_gateset.py +19 -17
  637. cirq/transformers/optimize_for_target_gateset_test.py +11 -8
  638. cirq/transformers/qubit_management_transformers.py +13 -11
  639. cirq/transformers/qubit_management_transformers_test.py +5 -3
  640. cirq/transformers/randomized_measurements.py +16 -14
  641. cirq/transformers/randomized_measurements_test.py +10 -4
  642. cirq/transformers/routing/initial_mapper.py +6 -4
  643. cirq/transformers/routing/initial_mapper_test.py +2 -0
  644. cirq/transformers/routing/line_initial_mapper.py +16 -14
  645. cirq/transformers/routing/line_initial_mapper_test.py +9 -7
  646. cirq/transformers/routing/mapping_manager.py +10 -10
  647. cirq/transformers/routing/mapping_manager_test.py +2 -0
  648. cirq/transformers/routing/route_circuit_cqc.py +33 -31
  649. cirq/transformers/routing/route_circuit_cqc_test.py +15 -13
  650. cirq/transformers/routing/visualize_routed_circuit.py +8 -7
  651. cirq/transformers/routing/visualize_routed_circuit_test.py +4 -2
  652. cirq/transformers/stratify.py +17 -15
  653. cirq/transformers/stratify_test.py +3 -0
  654. cirq/transformers/symbolize.py +103 -0
  655. cirq/transformers/symbolize_test.py +62 -0
  656. cirq/transformers/synchronize_terminal_measurements.py +10 -10
  657. cirq/transformers/synchronize_terminal_measurements_test.py +12 -10
  658. cirq/transformers/tag_transformers.py +97 -0
  659. cirq/transformers/tag_transformers_test.py +103 -0
  660. cirq/transformers/target_gatesets/compilation_target_gateset.py +21 -19
  661. cirq/transformers/target_gatesets/compilation_target_gateset_test.py +20 -16
  662. cirq/transformers/target_gatesets/cz_gateset.py +7 -5
  663. cirq/transformers/target_gatesets/cz_gateset_test.py +21 -19
  664. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +9 -7
  665. cirq/transformers/target_gatesets/sqrt_iswap_gateset_test.py +25 -25
  666. cirq/transformers/transformer_api.py +34 -47
  667. cirq/transformers/transformer_api_test.py +9 -8
  668. cirq/transformers/transformer_primitives.py +39 -49
  669. cirq/transformers/transformer_primitives_test.py +10 -17
  670. cirq/value/abc_alt.py +6 -4
  671. cirq/value/abc_alt_test.py +5 -3
  672. cirq/value/angle.py +11 -12
  673. cirq/value/angle_test.py +5 -3
  674. cirq/value/classical_data.py +27 -27
  675. cirq/value/classical_data_test.py +11 -8
  676. cirq/value/condition.py +26 -24
  677. cirq/value/condition_test.py +2 -0
  678. cirq/value/digits.py +14 -11
  679. cirq/value/digits_test.py +2 -0
  680. cirq/value/duration.py +23 -20
  681. cirq/value/duration_test.py +2 -0
  682. cirq/value/linear_dict.py +25 -30
  683. cirq/value/linear_dict_test.py +10 -8
  684. cirq/value/measurement_key.py +12 -12
  685. cirq/value/measurement_key_test.py +2 -0
  686. cirq/value/periodic_value.py +4 -4
  687. cirq/value/periodic_value_test.py +11 -7
  688. cirq/value/probability.py +3 -1
  689. cirq/value/probability_test.py +4 -2
  690. cirq/value/product_state.py +15 -13
  691. cirq/value/product_state_test.py +4 -1
  692. cirq/value/random_state.py +2 -0
  693. cirq/value/random_state_test.py +5 -3
  694. cirq/value/timestamp.py +11 -7
  695. cirq/value/timestamp_test.py +14 -12
  696. cirq/value/type_alias.py +4 -4
  697. cirq/value/value_equality_attr.py +8 -9
  698. cirq/value/value_equality_attr_test.py +14 -11
  699. cirq/vis/density_matrix.py +3 -3
  700. cirq/vis/density_matrix_test.py +20 -17
  701. cirq/vis/heatmap.py +24 -37
  702. cirq/vis/heatmap_test.py +3 -0
  703. cirq/vis/histogram.py +9 -6
  704. cirq/vis/histogram_test.py +5 -2
  705. cirq/vis/state_histogram.py +10 -8
  706. cirq/vis/state_histogram_test.py +7 -5
  707. cirq/vis/vis_utils.py +4 -1
  708. cirq/vis/vis_utils_test.py +4 -1
  709. cirq/work/collector.py +12 -18
  710. cirq/work/collector_test.py +15 -10
  711. cirq/work/observable_grouping.py +6 -7
  712. cirq/work/observable_grouping_test.py +10 -9
  713. cirq/work/observable_measurement.py +47 -45
  714. cirq/work/observable_measurement_data.py +22 -17
  715. cirq/work/observable_measurement_data_test.py +4 -1
  716. cirq/work/observable_measurement_test.py +48 -29
  717. cirq/work/observable_readout_calibration.py +5 -2
  718. cirq/work/observable_readout_calibration_test.py +5 -2
  719. cirq/work/observable_settings.py +13 -22
  720. cirq/work/observable_settings_test.py +9 -7
  721. cirq/work/pauli_sum_collector.py +12 -10
  722. cirq/work/pauli_sum_collector_test.py +9 -9
  723. cirq/work/sampler.py +42 -43
  724. cirq/work/sampler_test.py +31 -24
  725. cirq/work/zeros_sampler.py +6 -4
  726. cirq/work/zeros_sampler_test.py +7 -5
  727. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/METADATA +7 -8
  728. cirq_core-1.6.0.dist-info/RECORD +1241 -0
  729. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/WHEEL +1 -1
  730. cirq_core-1.5.0.dev20250409225226.dist-info/RECORD +0 -1216
  731. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/licenses/LICENSE +0 -0
  732. {cirq_core-1.5.0.dev20250409225226.dist-info → cirq_core-1.6.0.dist-info}/top_level.txt +0 -0
@@ -12,6 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from __future__ import annotations
16
+
15
17
  import numpy as np
16
18
  import pytest
17
19
  import sympy
@@ -22,7 +24,7 @@ import cirq
22
24
  ALL_SIMULATORS = (cirq.Simulator(), cirq.DensityMatrixSimulator(), cirq.CliffordSimulator())
23
25
 
24
26
 
25
- def test_diagram():
27
+ def test_diagram() -> None:
26
28
  q0, q1 = cirq.LineQubit.range(2)
27
29
  circuit = cirq.Circuit(cirq.measure(q0, key='a'), cirq.X(q1).with_classical_controls('a'))
28
30
 
@@ -39,7 +41,7 @@ a: ═══@═══^═══
39
41
  )
40
42
 
41
43
 
42
- def test_diagram_pauli():
44
+ def test_diagram_pauli() -> None:
43
45
  q0, q1 = cirq.LineQubit.range(2)
44
46
  circuit = cirq.Circuit(
45
47
  cirq.measure_single_paulistring(cirq.X(q0), key='a'),
@@ -59,7 +61,7 @@ a: ═══@══════^═══
59
61
  )
60
62
 
61
63
 
62
- def test_diagram_extra_measurements():
64
+ def test_diagram_extra_measurements() -> None:
63
65
  q0, q1 = cirq.LineQubit.range(2)
64
66
  circuit = cirq.Circuit(
65
67
  cirq.measure(q0, key='a'),
@@ -80,7 +82,7 @@ a: ═══@═══^════════
80
82
  )
81
83
 
82
84
 
83
- def test_diagram_extra_controlled_bits():
85
+ def test_diagram_extra_controlled_bits() -> None:
84
86
  q0, q1 = cirq.LineQubit.range(2)
85
87
  circuit = cirq.Circuit(cirq.measure(q0, key='a'), cirq.CX(q0, q1).with_classical_controls('a'))
86
88
 
@@ -97,7 +99,7 @@ a: ═══@═══^═══
97
99
  )
98
100
 
99
101
 
100
- def test_diagram_extra_control_bits():
102
+ def test_diagram_extra_control_bits() -> None:
101
103
  q0, q1 = cirq.LineQubit.range(2)
102
104
  circuit = cirq.Circuit(
103
105
  cirq.measure(q0, key='a'),
@@ -120,7 +122,7 @@ b: ═══════@═══^═══
120
122
  )
121
123
 
122
124
 
123
- def test_diagram_multiple_ops_single_moment():
125
+ def test_diagram_multiple_ops_single_moment() -> None:
124
126
  q0, q1 = cirq.LineQubit.range(2)
125
127
  circuit = cirq.Circuit(
126
128
  cirq.measure(q0, key='a'),
@@ -146,7 +148,7 @@ b: ═════@══════^════
146
148
  )
147
149
 
148
150
 
149
- def test_diagram_subcircuit():
151
+ def test_diagram_subcircuit() -> None:
150
152
  q0, q1 = cirq.LineQubit.range(2)
151
153
  circuit = cirq.Circuit(
152
154
  cirq.CircuitOperation(
@@ -169,7 +171,7 @@ def test_diagram_subcircuit():
169
171
  )
170
172
 
171
173
 
172
- def test_diagram_subcircuit_layered():
174
+ def test_diagram_subcircuit_layered() -> None:
173
175
  q0, q1 = cirq.LineQubit.range(2)
174
176
  circuit = cirq.Circuit(
175
177
  cirq.measure(q0, key='a'),
@@ -196,7 +198,7 @@ a: ═══@═══╩══════════════════
196
198
  )
197
199
 
198
200
 
199
- def test_qasm_sympy_condition():
201
+ def test_qasm_sympy_condition() -> None:
200
202
  q0, q1 = cirq.LineQubit.range(2)
201
203
  circuit = cirq.Circuit(
202
204
  cirq.measure(q0, key='a'),
@@ -222,7 +224,7 @@ if (m_a==0) x q[1];
222
224
  )
223
225
 
224
226
 
225
- def test_qasm_key_condition():
227
+ def test_qasm_key_condition() -> None:
226
228
  q0, q1 = cirq.LineQubit.range(2)
227
229
  circuit = cirq.Circuit(cirq.measure(q0, key='a'), cirq.X(q1).with_classical_controls('a'))
228
230
  qasm = cirq.qasm(circuit)
@@ -245,7 +247,7 @@ if (m_a==1) x q[1];
245
247
  )
246
248
 
247
249
 
248
- def test_qasm_no_conditions():
250
+ def test_qasm_no_conditions() -> None:
249
251
  q0, q1 = cirq.LineQubit.range(2)
250
252
  circuit = cirq.Circuit(
251
253
  cirq.measure(q0, key='a'), cirq.ClassicallyControlledOperation(cirq.X(q1), [])
@@ -270,7 +272,7 @@ x q[1];
270
272
  )
271
273
 
272
274
 
273
- def test_qasm_multiple_conditions():
275
+ def test_qasm_multiple_conditions() -> None:
274
276
  q0, q1 = cirq.LineQubit.range(2)
275
277
  circuit = cirq.Circuit(
276
278
  cirq.measure(q0, key='a'),
@@ -284,7 +286,7 @@ def test_qasm_multiple_conditions():
284
286
 
285
287
 
286
288
  @pytest.mark.parametrize('sim', ALL_SIMULATORS)
287
- def test_key_unset(sim):
289
+ def test_key_unset(sim) -> None:
288
290
  q0, q1 = cirq.LineQubit.range(2)
289
291
  circuit = cirq.Circuit(
290
292
  cirq.measure(q0, key='a'),
@@ -297,7 +299,7 @@ def test_key_unset(sim):
297
299
 
298
300
 
299
301
  @pytest.mark.parametrize('sim', ALL_SIMULATORS)
300
- def test_key_set(sim):
302
+ def test_key_set(sim) -> None:
301
303
  q0, q1 = cirq.LineQubit.range(2)
302
304
  circuit = cirq.Circuit(
303
305
  cirq.X(q0),
@@ -311,7 +313,7 @@ def test_key_set(sim):
311
313
 
312
314
 
313
315
  @pytest.mark.parametrize('sim', ALL_SIMULATORS)
314
- def test_repeated_measurement_unset(sim):
316
+ def test_repeated_measurement_unset(sim) -> None:
315
317
  q0, q1 = cirq.LineQubit.range(2)
316
318
  circuit = cirq.Circuit(
317
319
  cirq.measure(q0, key='a'),
@@ -330,7 +332,7 @@ def test_repeated_measurement_unset(sim):
330
332
 
331
333
 
332
334
  @pytest.mark.parametrize('sim', ALL_SIMULATORS)
333
- def test_repeated_measurement_set(sim):
335
+ def test_repeated_measurement_set(sim) -> None:
334
336
  q0, q1 = cirq.LineQubit.range(2)
335
337
  circuit = cirq.Circuit(
336
338
  cirq.X(q0),
@@ -350,7 +352,7 @@ def test_repeated_measurement_set(sim):
350
352
 
351
353
 
352
354
  @pytest.mark.parametrize('sim', ALL_SIMULATORS)
353
- def test_subcircuit_key_unset(sim):
355
+ def test_subcircuit_key_unset(sim) -> None:
354
356
  q0, q1 = cirq.LineQubit.range(2)
355
357
  inner = cirq.Circuit(
356
358
  cirq.measure(q0, key='c'),
@@ -358,7 +360,9 @@ def test_subcircuit_key_unset(sim):
358
360
  cirq.measure(q1, key='b'),
359
361
  )
360
362
  circuit = cirq.Circuit(
361
- cirq.CircuitOperation(inner.freeze(), repetitions=2, measurement_key_map={'c': 'a'})
363
+ cirq.CircuitOperation(
364
+ inner.freeze(), repetitions=2, use_repetition_ids=True, measurement_key_map={'c': 'a'}
365
+ )
362
366
  )
363
367
  result = sim.run(circuit)
364
368
  assert result.measurements['0:a'] == 0
@@ -368,7 +372,7 @@ def test_subcircuit_key_unset(sim):
368
372
 
369
373
 
370
374
  @pytest.mark.parametrize('sim', ALL_SIMULATORS)
371
- def test_subcircuit_key_set(sim):
375
+ def test_subcircuit_key_set(sim) -> None:
372
376
  q0, q1 = cirq.LineQubit.range(2)
373
377
  inner = cirq.Circuit(
374
378
  cirq.X(q0),
@@ -377,7 +381,9 @@ def test_subcircuit_key_set(sim):
377
381
  cirq.measure(q1, key='b'),
378
382
  )
379
383
  circuit = cirq.Circuit(
380
- cirq.CircuitOperation(inner.freeze(), repetitions=4, measurement_key_map={'c': 'a'})
384
+ cirq.CircuitOperation(
385
+ inner.freeze(), repetitions=4, use_repetition_ids=True, measurement_key_map={'c': 'a'}
386
+ )
381
387
  )
382
388
  result = sim.run(circuit)
383
389
  assert result.measurements['0:a'] == 1
@@ -390,7 +396,7 @@ def test_subcircuit_key_set(sim):
390
396
  assert result.measurements['3:b'] == 0
391
397
 
392
398
 
393
- def test_key_unset_in_subcircuit_outer_scope():
399
+ def test_key_unset_in_subcircuit_outer_scope() -> None:
394
400
  q0, q1 = cirq.LineQubit.range(2)
395
401
  circuit = cirq.Circuit(
396
402
  cirq.measure(q0, key='a'),
@@ -402,7 +408,7 @@ def test_key_unset_in_subcircuit_outer_scope():
402
408
  assert result.measurements['b'] == 0
403
409
 
404
410
 
405
- def test_key_set_in_subcircuit_outer_scope():
411
+ def test_key_set_in_subcircuit_outer_scope() -> None:
406
412
  q0, q1 = cirq.LineQubit.range(2)
407
413
  circuit = cirq.Circuit(
408
414
  cirq.X(q0),
@@ -415,21 +421,21 @@ def test_key_set_in_subcircuit_outer_scope():
415
421
  assert result.measurements['b'] == 1
416
422
 
417
423
 
418
- def test_condition_types():
424
+ def test_condition_types() -> None:
419
425
  q0 = cirq.LineQubit(0)
420
426
  sympy_cond = sympy_parser.parse_expr('a >= 2')
421
427
  op = cirq.X(q0).with_classical_controls(cirq.MeasurementKey('a'), 'b', 'a > b', sympy_cond)
422
428
  assert set(map(str, op.classical_controls)) == {'a', 'b', 'a > b', 'a >= 2'}
423
429
 
424
430
 
425
- def test_condition_flattening():
431
+ def test_condition_flattening() -> None:
426
432
  q0 = cirq.LineQubit(0)
427
433
  op = cirq.X(q0).with_classical_controls('a').with_classical_controls('b')
428
434
  assert set(map(str, op.classical_controls)) == {'a', 'b'}
429
435
  assert isinstance(op._sub_operation, cirq.GateOperation)
430
436
 
431
437
 
432
- def test_condition_stacking():
438
+ def test_condition_stacking() -> None:
433
439
  q0 = cirq.LineQubit(0)
434
440
  op = cirq.X(q0).with_classical_controls('a').with_tags('t').with_classical_controls('b')
435
441
  assert set(map(str, cirq.control_keys(op))) == {'a', 'b'}
@@ -437,7 +443,7 @@ def test_condition_stacking():
437
443
  assert not op.tags
438
444
 
439
445
 
440
- def test_condition_removal():
446
+ def test_condition_removal() -> None:
441
447
  q0 = cirq.LineQubit(0)
442
448
  op = (
443
449
  cirq.X(q0)
@@ -452,13 +458,13 @@ def test_condition_removal():
452
458
  assert not op.tags
453
459
 
454
460
 
455
- def test_qubit_mapping():
461
+ def test_qubit_mapping() -> None:
456
462
  q0, q1 = cirq.LineQubit.range(2)
457
463
  op = cirq.X(q0).with_classical_controls('a')
458
464
  assert op.with_qubits(q1).qubits == (q1,)
459
465
 
460
466
 
461
- def test_parameterizable():
467
+ def test_parameterizable() -> None:
462
468
  s = sympy.Symbol('s')
463
469
  q0 = cirq.LineQubit(0)
464
470
  op = cirq.X(q0).with_classical_controls('a')
@@ -468,7 +474,7 @@ def test_parameterizable():
468
474
  assert cirq.resolve_parameters(opa, cirq.ParamResolver({'s': 1})) == op
469
475
 
470
476
 
471
- def test_decompose():
477
+ def test_decompose() -> None:
472
478
  q0 = cirq.LineQubit(0)
473
479
  op = cirq.H(q0).with_classical_controls('a')
474
480
  assert cirq.decompose(op) == [
@@ -477,17 +483,21 @@ def test_decompose():
477
483
  ]
478
484
 
479
485
 
480
- def test_str():
486
+ def test_str() -> None:
481
487
  q0 = cirq.LineQubit(0)
482
488
  op = cirq.X(q0).with_classical_controls('a')
483
489
  assert str(op) == 'X(q(0)).with_classical_controls(a)'
484
490
 
485
491
 
486
- def test_scope_local():
492
+ def test_scope_local() -> None:
487
493
  q = cirq.LineQubit(0)
488
494
  inner = cirq.Circuit(cirq.measure(q, key='a'), cirq.X(q).with_classical_controls('a'))
489
- middle = cirq.Circuit(cirq.CircuitOperation(inner.freeze(), repetitions=2))
490
- outer_subcircuit = cirq.CircuitOperation(middle.freeze(), repetitions=2)
495
+ middle = cirq.Circuit(
496
+ cirq.CircuitOperation(inner.freeze(), repetitions=2, use_repetition_ids=True)
497
+ )
498
+ outer_subcircuit = cirq.CircuitOperation(
499
+ middle.freeze(), repetitions=2, use_repetition_ids=True
500
+ )
491
501
  circuit = outer_subcircuit.mapped_circuit(deep=True)
492
502
  internal_control_keys = [
493
503
  str(condition) for op in circuit.all_operations() for condition in cirq.control_keys(op)
@@ -498,10 +508,10 @@ def test_scope_local():
498
508
  cirq.testing.assert_has_diagram(
499
509
  cirq.Circuit(outer_subcircuit),
500
510
  """
501
- [ [ 0: ───M───X─── ] ]
502
- 0: ───[ 0: ───[ ║ ║ ]──────────── ]────────────
503
- [ [ a: ═══@═══^═══ ](loops=2) ](loops=2)
504
- """,
511
+ [ [ 0: ───M───X─── ] ]
512
+ 0: ───[ 0: ───[ ║ ║ ]───────────────────────────────────── ]─────────────────────────────────────
513
+ [ [ a: ═══@═══^═══ ](loops=2, use_repetition_ids=True) ](loops=2, use_repetition_ids=True)
514
+ """, # noqa: E501
505
515
  use_unicode_characters=True,
506
516
  )
507
517
  cirq.testing.assert_has_diagram(
@@ -522,7 +532,7 @@ def test_scope_local():
522
532
  assert circuit == cirq.Circuit(cirq.decompose(outer_subcircuit))
523
533
 
524
534
 
525
- def test_scope_flatten_both():
535
+ def test_scope_flatten_both() -> None:
526
536
  q = cirq.LineQubit(0)
527
537
  inner = cirq.Circuit(cirq.measure(q, key='a'), cirq.X(q).with_classical_controls('a'))
528
538
  middle = cirq.Circuit(
@@ -541,9 +551,9 @@ def test_scope_flatten_both():
541
551
  cirq.testing.assert_has_diagram(
542
552
  cirq.Circuit(outer_subcircuit),
543
553
  """
544
- [ [ 0: ───M───X─── ] ]
545
- 0: ───[ 0: ───[ ║ ║ ]──────────────────────── ]────────────────────────
546
- [ [ a: ═══@═══^═══ ](loops=2, no_rep_ids) ](loops=2, no_rep_ids)
554
+ [ [ 0: ───M───X─── ] ]
555
+ 0: ───[ 0: ───[ ║ ║ ]──────────── ]────────────
556
+ [ [ a: ═══@═══^═══ ](loops=2) ](loops=2)
547
557
  """,
548
558
  use_unicode_characters=True,
549
559
  )
@@ -558,13 +568,13 @@ a: ═══@═══^═══@═══^═══@═══^═══@══
558
568
  )
559
569
 
560
570
 
561
- def test_scope_flatten_inner():
571
+ def test_scope_flatten_inner() -> None:
562
572
  q = cirq.LineQubit(0)
563
573
  inner = cirq.Circuit(cirq.measure(q, key='a'), cirq.X(q).with_classical_controls('a'))
564
- middle = cirq.Circuit(
565
- cirq.CircuitOperation(inner.freeze(), repetitions=2, use_repetition_ids=False)
574
+ middle = cirq.Circuit(cirq.CircuitOperation(inner.freeze(), repetitions=2))
575
+ outer_subcircuit = cirq.CircuitOperation(
576
+ middle.freeze(), repetitions=2, use_repetition_ids=True
566
577
  )
567
- outer_subcircuit = cirq.CircuitOperation(middle.freeze(), repetitions=2)
568
578
  circuit = outer_subcircuit.mapped_circuit(deep=True)
569
579
  internal_control_keys = [
570
580
  str(condition) for op in circuit.all_operations() for condition in cirq.control_keys(op)
@@ -575,9 +585,9 @@ def test_scope_flatten_inner():
575
585
  cirq.testing.assert_has_diagram(
576
586
  cirq.Circuit(outer_subcircuit),
577
587
  """
578
- [ [ 0: ───M───X─── ] ]
579
- 0: ───[ 0: ───[ ║ ║ ]──────────────────────── ]────────────
580
- [ [ a: ═══@═══^═══ ](loops=2, no_rep_ids) ](loops=2)
588
+ [ [ 0: ───M───X─── ] ]
589
+ 0: ───[ 0: ───[ ║ ║ ]──────────── ]─────────────────────────────────────
590
+ [ [ a: ═══@═══^═══ ](loops=2) ](loops=2, use_repetition_ids=True)
581
591
  """,
582
592
  use_unicode_characters=True,
583
593
  )
@@ -594,13 +604,13 @@ def test_scope_flatten_inner():
594
604
  )
595
605
 
596
606
 
597
- def test_scope_flatten_outer():
607
+ def test_scope_flatten_outer() -> None:
598
608
  q = cirq.LineQubit(0)
599
609
  inner = cirq.Circuit(cirq.measure(q, key='a'), cirq.X(q).with_classical_controls('a'))
600
- middle = cirq.Circuit(cirq.CircuitOperation(inner.freeze(), repetitions=2))
601
- outer_subcircuit = cirq.CircuitOperation(
602
- middle.freeze(), repetitions=2, use_repetition_ids=False
610
+ middle = cirq.Circuit(
611
+ cirq.CircuitOperation(inner.freeze(), repetitions=2, use_repetition_ids=True)
603
612
  )
613
+ outer_subcircuit = cirq.CircuitOperation(middle.freeze(), repetitions=2)
604
614
  circuit = outer_subcircuit.mapped_circuit(deep=True)
605
615
  internal_control_keys = [
606
616
  str(condition) for op in circuit.all_operations() for condition in cirq.control_keys(op)
@@ -611,9 +621,9 @@ def test_scope_flatten_outer():
611
621
  cirq.testing.assert_has_diagram(
612
622
  cirq.Circuit(outer_subcircuit),
613
623
  """
614
- [ [ 0: ───M───X─── ] ]
615
- 0: ───[ 0: ───[ ║ ║ ]──────────── ]────────────────────────
616
- [ [ a: ═══@═══^═══ ](loops=2) ](loops=2, no_rep_ids)
624
+ [ [ 0: ───M───X─── ] ]
625
+ 0: ───[ 0: ───[ ║ ║ ]───────────────────────────────────── ]────────────
626
+ [ [ a: ═══@═══^═══ ](loops=2, use_repetition_ids=True) ](loops=2)
617
627
  """,
618
628
  use_unicode_characters=True,
619
629
  )
@@ -630,14 +640,16 @@ def test_scope_flatten_outer():
630
640
  )
631
641
 
632
642
 
633
- def test_scope_extern():
643
+ def test_scope_extern() -> None:
634
644
  q = cirq.LineQubit(0)
635
645
  inner = cirq.Circuit(cirq.measure(q, key='a'), cirq.X(q).with_classical_controls('b'))
636
646
  middle = cirq.Circuit(
637
647
  cirq.measure(q, key=cirq.MeasurementKey('b')),
638
- cirq.CircuitOperation(inner.freeze(), repetitions=2),
648
+ cirq.CircuitOperation(inner.freeze(), repetitions=2, use_repetition_ids=True),
649
+ )
650
+ outer_subcircuit = cirq.CircuitOperation(
651
+ middle.freeze(), repetitions=2, use_repetition_ids=True
639
652
  )
640
- outer_subcircuit = cirq.CircuitOperation(middle.freeze(), repetitions=2)
641
653
  circuit = outer_subcircuit.mapped_circuit(deep=True)
642
654
  internal_control_keys = [
643
655
  str(condition) for op in circuit.all_operations() for condition in cirq.control_keys(op)
@@ -648,12 +660,12 @@ def test_scope_extern():
648
660
  cirq.testing.assert_has_diagram(
649
661
  cirq.Circuit(outer_subcircuit),
650
662
  """
651
- [ [ 0: ───M('a')───X─── ] ]
652
- [ 0: ───M───[ ║ ]──────────── ]
653
- 0: ───[ ║ [ b: ════════════^═══ ](loops=2) ]────────────
654
- [ ║ ║ ]
655
- [ b: ═══@═══╩══════════════════════════════════ ](loops=2)
656
- """,
663
+ [ [ 0: ───M('a')───X─── ] ]
664
+ [ 0: ───M───[ ║ ]───────────────────────────────────── ]
665
+ 0: ───[ ║ [ b: ════════════^═══ ](loops=2, use_repetition_ids=True) ]─────────────────────────────────────
666
+ [ ║ ║ ]
667
+ [ b: ═══@═══╩═══════════════════════════════════════════════════════════ ](loops=2, use_repetition_ids=True)
668
+ """, # noqa: E501
657
669
  use_unicode_characters=True,
658
670
  )
659
671
  cirq.testing.assert_has_diagram(
@@ -670,7 +682,7 @@ def test_scope_extern():
670
682
  assert circuit == cirq.Circuit(cirq.decompose(outer_subcircuit))
671
683
 
672
684
 
673
- def test_scope_extern_wrapping_with_non_repeating_subcircuits():
685
+ def test_scope_extern_wrapping_with_non_repeating_subcircuits() -> None:
674
686
  def wrap(*ops):
675
687
  return cirq.CircuitOperation(cirq.FrozenCircuit(*ops))
676
688
 
@@ -683,9 +695,9 @@ def test_scope_extern_wrapping_with_non_repeating_subcircuits():
683
695
  )
684
696
  middle = wrap_frozen(
685
697
  wrap(cirq.measure(q, key=cirq.MeasurementKey('b'))),
686
- wrap(cirq.CircuitOperation(inner, repetitions=2)),
698
+ wrap(cirq.CircuitOperation(inner, repetitions=2, use_repetition_ids=True)),
687
699
  )
688
- outer_subcircuit = cirq.CircuitOperation(middle, repetitions=2)
700
+ outer_subcircuit = cirq.CircuitOperation(middle, repetitions=2, use_repetition_ids=True)
689
701
  circuit = outer_subcircuit.mapped_circuit(deep=True)
690
702
  internal_control_keys = [
691
703
  str(condition) for op in circuit.all_operations() for condition in cirq.control_keys(op)
@@ -707,7 +719,7 @@ def test_scope_extern_wrapping_with_non_repeating_subcircuits():
707
719
  assert circuit == cirq.Circuit(cirq.decompose(outer_subcircuit))
708
720
 
709
721
 
710
- def test_scope_root():
722
+ def test_scope_root() -> None:
711
723
  q = cirq.LineQubit(0)
712
724
  inner = cirq.Circuit(cirq.measure(q, key='a'), cirq.X(q).with_classical_controls('b'))
713
725
  middle = cirq.Circuit(
@@ -738,23 +750,25 @@ b: ═══╩═════════════════════
738
750
  cirq.testing.assert_has_diagram(
739
751
  circuit,
740
752
  """
741
- 0: ───M('0:c')───M('0:0:a')───X───M('0:1:a')───X───M('1:c')───M('1:0:a')───X───M('1:1:a')───X───
742
-
743
- b: ═══════════════════════════^════════════════^═══════════════════════════^════════════════^═══
753
+ 0: ───M('c')───M('a')───X───M('a')───X───M('c')───M('a')───X───M('a')───X───
754
+
755
+ b: ═════════════════════^════════════^═════════════════════^════════════^═══
744
756
  """,
745
757
  use_unicode_characters=True,
746
758
  )
747
759
  assert circuit == cirq.Circuit(cirq.decompose(outer_subcircuit))
748
760
 
749
761
 
750
- def test_scope_extern_mismatch():
762
+ def test_scope_extern_mismatch() -> None:
751
763
  q = cirq.LineQubit(0)
752
764
  inner = cirq.Circuit(cirq.measure(q, key='a'), cirq.X(q).with_classical_controls('b'))
753
765
  middle = cirq.Circuit(
754
766
  cirq.measure(q, key=cirq.MeasurementKey('b', ('0',))),
755
- cirq.CircuitOperation(inner.freeze(), repetitions=2),
767
+ cirq.CircuitOperation(inner.freeze(), repetitions=2, use_repetition_ids=True),
768
+ )
769
+ outer_subcircuit = cirq.CircuitOperation(
770
+ middle.freeze(), repetitions=2, use_repetition_ids=True
756
771
  )
757
- outer_subcircuit = cirq.CircuitOperation(middle.freeze(), repetitions=2)
758
772
  circuit = outer_subcircuit.mapped_circuit(deep=True)
759
773
  internal_control_keys = [
760
774
  str(condition) for op in circuit.all_operations() for condition in cirq.control_keys(op)
@@ -765,14 +779,14 @@ def test_scope_extern_mismatch():
765
779
  cirq.testing.assert_has_diagram(
766
780
  cirq.Circuit(outer_subcircuit),
767
781
  """
768
- [ [ 0: ───M('a')───X─── ] ]
769
- [ 0: ───M('0:b')───[ ║ ]──────────── ]
770
- 0: ───[ [ b: ════════════^═══ ](loops=2) ]────────────
771
- [ ║ ]
772
- [ b: ══════════════╩══════════════════════════════════ ](loops=2)
782
+ [ [ 0: ───M('a')───X─── ] ]
783
+ [ 0: ───M('0:b')───[ ║ ]───────────────────────────────────── ]
784
+ 0: ───[ [ b: ════════════^═══ ](loops=2, use_repetition_ids=True) ]─────────────────────────────────────
785
+ [ ║ ]
786
+ [ b: ══════════════╩═══════════════════════════════════════════════════════════ ](loops=2, use_repetition_ids=True)
773
787
 
774
- b: ═══╩═══════════════════════════════════════════════════════════════════
775
- """,
788
+ b: ═══╩═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
789
+ """, # noqa: E501
776
790
  use_unicode_characters=True,
777
791
  )
778
792
  cirq.testing.assert_has_diagram(
@@ -787,7 +801,7 @@ b: ═════════════════════════
787
801
  assert circuit == cirq.Circuit(cirq.decompose(outer_subcircuit))
788
802
 
789
803
 
790
- def test_repr():
804
+ def test_repr() -> None:
791
805
  q0 = cirq.LineQubit(0)
792
806
  op = cirq.X(q0).with_classical_controls('a')
793
807
  assert repr(op) == (
@@ -797,13 +811,13 @@ def test_repr():
797
811
  )
798
812
 
799
813
 
800
- def test_no_measurement_gates():
814
+ def test_no_measurement_gates() -> None:
801
815
  q0 = cirq.LineQubit(0)
802
816
  with pytest.raises(ValueError, match='with measurements'):
803
817
  _ = cirq.measure(q0).with_classical_controls('a')
804
818
 
805
819
 
806
- def test_unmeasured_condition():
820
+ def test_unmeasured_condition() -> None:
807
821
  q0 = cirq.LineQubit(0)
808
822
  bad_circuit = cirq.Circuit(cirq.X(q0).with_classical_controls('a'))
809
823
  with pytest.raises(
@@ -812,7 +826,7 @@ def test_unmeasured_condition():
812
826
  _ = cirq.Simulator().simulate(bad_circuit)
813
827
 
814
828
 
815
- def test_layered_circuit_operations_with_controls_in_between():
829
+ def test_layered_circuit_operations_with_controls_in_between() -> None:
816
830
  q = cirq.LineQubit(0)
817
831
  outer_subcircuit = cirq.CircuitOperation(
818
832
  cirq.Circuit(
@@ -853,7 +867,7 @@ m: ═══^═══^═══
853
867
  )
854
868
 
855
869
 
856
- def test_sympy():
870
+ def test_sympy() -> None:
857
871
  q0, q1, q2, q3, q_result = cirq.LineQubit.range(5)
858
872
  for i in range(4):
859
873
  for j in range(4):
@@ -878,7 +892,7 @@ def test_sympy():
878
892
  assert result.measurements['m_result'][0][0] == (j > i)
879
893
 
880
894
 
881
- def test_sympy_qudits():
895
+ def test_sympy_qudits() -> None:
882
896
  q0 = cirq.LineQid(0, 3)
883
897
  q1 = cirq.LineQid(1, 5)
884
898
  q_result = cirq.LineQubit(2)
@@ -912,14 +926,14 @@ def test_sympy_qudits():
912
926
  assert result.measurements['m_result'][0][0] == (i % 4 <= 1)
913
927
 
914
928
 
915
- def test_sympy_path_prefix():
929
+ def test_sympy_path_prefix() -> None:
916
930
  q = cirq.LineQubit(0)
917
931
  op = cirq.X(q).with_classical_controls(sympy.Symbol('b'))
918
932
  prefixed = cirq.with_key_path_prefix(op, ('0',))
919
933
  assert cirq.control_keys(prefixed) == {'0:b'}
920
934
 
921
935
 
922
- def test_sympy_scope():
936
+ def test_sympy_scope() -> None:
923
937
  q = cirq.LineQubit(0)
924
938
  a, b, c, d = sympy.symbols('a b c d')
925
939
  inner = cirq.Circuit(
@@ -934,7 +948,7 @@ def test_sympy_scope():
934
948
  outer_subcircuit = cirq.CircuitOperation(middle.freeze(), repetitions=2)
935
949
  circuit = outer_subcircuit.mapped_circuit(deep=True)
936
950
  internal_controls = [str(k) for op in circuit.all_operations() for k in cirq.control_keys(op)]
937
- assert set(internal_controls) == {'0:0:a', '0:1:a', '1:0:a', '1:1:a', '0:b', '1:b', 'c', 'd'}
951
+ assert set(internal_controls) == {'a', 'b', 'c', 'd'}
938
952
  assert cirq.control_keys(outer_subcircuit) == {'c', 'd'}
939
953
  assert cirq.control_keys(circuit) == {'c', 'd'}
940
954
  assert circuit == cirq.Circuit(cirq.decompose(outer_subcircuit))
@@ -964,34 +978,24 @@ d: ═══╩═════════════════════
964
978
  use_unicode_characters=True,
965
979
  )
966
980
 
967
- # pylint: disable=line-too-long
968
981
  cirq.testing.assert_has_diagram(
969
982
  circuit,
970
983
  """
971
- 0: ───────M───M('0:0:c')───M───X(conditions=[c | d, 0:0:a & 0:b])───M───X(conditions=[c | d, 0:1:a & 0:b])───M───M('1:0:c')───M───X(conditions=[c | d, 1:0:a & 1:b])───M───X(conditions=[c | d, 1:1:a & 1:b])───
972
- ║ ║ ║ ║ ║ ║ ║ ║
973
- 0:0:a: ═══╬════════════════@═══^════════════════════════════════════╬═══╬════════════════════════════════════╬════════════════╬═══╬════════════════════════════════════╬═══╬════════════════════════════════════
974
- ║ ║ ║
975
- 0:1:a: ═══╬════════════════════╬════════════════════════════════════@═══^════════════════════════════════════╬════════════════╬═══╬════════════════════════════════════╬═══╬════════════════════════════════════
976
- ║ ║ ║ ║
977
- 0:b: ═════@════════════════════^════════════════════════════════════════^════════════════════════════════════╬════════════════╬═══╬════════════════════════════════════╬═══╬════════════════════════════════════
978
- ║ ║ ║
979
- 1:0:a: ════════════════════════╬════════════════════════════════════════╬════════════════════════════════════╬════════════════@═══^════════════════════════════════════╬═══╬════════════════════════════════════
980
- ║ ║ ║ ║ ║ ║
981
- 1:1:a: ════════════════════════╬════════════════════════════════════════╬════════════════════════════════════╬════════════════════╬════════════════════════════════════@═══^════════════════════════════════════
982
- ║ ║ ║ ║ ║
983
- 1:b: ══════════════════════════╬════════════════════════════════════════╬════════════════════════════════════@════════════════════^════════════════════════════════════════^════════════════════════════════════
984
- ║ ║ ║ ║
985
- c: ════════════════════════════^════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════^════════════════════════════════════
986
- ║ ║ ║ ║
987
- d: ════════════════════════════^════════════════════════════════════════^═════════════════════════════════════════════════════════^════════════════════════════════════════^════════════════════════════════════
988
- """,
984
+ 0: ───M───M('0:c')───M───X(conditions=[c | d, a & b])───M───X(conditions=[c | d, a & b])───M───M('0:c')───M───X(conditions=[c | d, a & b])───M───X(conditions=[c | d, a & b])───
985
+ ║ ║ ║ ║ ║ ║ ║ ║
986
+ a: ═══╬══════════════@═══^══════════════════════════════@═══^══════════════════════════════╬══════════════@═══^══════════════════════════════@═══^══════════════════════════════
987
+
988
+ b: ═══@══════════════════^══════════════════════════════════^══════════════════════════════@══════════════════^══════════════════════════════════^══════════════════════════════
989
+
990
+ c: ══════════════════════^══════════════════════════════════^═════════════════════════════════════════════════^══════════════════════════════════^══════════════════════════════
991
+
992
+ d: ══════════════════════^══════════════════════════════════^═════════════════════════════════════════════════^══════════════════════════════════^══════════════════════════════
993
+ """, # noqa: E501
989
994
  use_unicode_characters=True,
990
995
  )
991
- # pylint: enable=line-too-long
992
996
 
993
997
 
994
- def test_sympy_scope_simulation():
998
+ def test_sympy_scope_simulation() -> None:
995
999
  q0, q1, q2, q3, q_ignored, q_result = cirq.LineQubit.range(6)
996
1000
  condition = sympy_parser.parse_expr('a & b | c & d')
997
1001
  # We set up condition (a & b | c & d) plus an ignored measurement key, and run through the
@@ -1025,7 +1029,7 @@ def test_sympy_scope_simulation():
1025
1029
  )
1026
1030
 
1027
1031
 
1028
- def test_commutes():
1032
+ def test_commutes() -> None:
1029
1033
  q0, q1 = cirq.LineQubit.range(2)
1030
1034
  assert cirq.commutes(cirq.measure(q0, key='a'), cirq.X(q1).with_classical_controls('b'))
1031
1035
  assert cirq.commutes(cirq.X(q1).with_classical_controls('b'), cirq.measure(q0, key='a'))
@@ -1042,7 +1046,7 @@ def test_commutes():
1042
1046
  )
1043
1047
 
1044
1048
 
1045
- def test_moment_diagram():
1049
+ def test_moment_diagram() -> None:
1046
1050
  a, _, c, d = cirq.GridQubit.rect(2, 2)
1047
1051
  m = cirq.Moment(cirq.CZ(a, d), cirq.X(c).with_classical_controls('m'))
1048
1052
  assert (
@@ -1058,7 +1062,7 @@ def test_moment_diagram():
1058
1062
  )
1059
1063
 
1060
1064
 
1061
- def test_diagram_exponents():
1065
+ def test_diagram_exponents() -> None:
1062
1066
  q0, q1 = cirq.LineQubit.range(2)
1063
1067
  circuit = cirq.Circuit(
1064
1068
  cirq.measure(q0, key='m'), (cirq.X(q1) ** 0.5).with_classical_controls('m')
@@ -1075,7 +1079,7 @@ m: ═══@═══^═══════
1075
1079
  )
1076
1080
 
1077
1081
 
1078
- def test_diagram_exponents_cx():
1082
+ def test_diagram_exponents_cx() -> None:
1079
1083
  q0, q1, q2 = cirq.LineQubit.range(3)
1080
1084
  circuit = cirq.Circuit(
1081
1085
  cirq.measure(q0, key='m'), (cirq.CX(q2, q1) ** 0.5).with_classical_controls('m')
@@ -1094,7 +1098,7 @@ m: ═══@═══^═══════
1094
1098
  )
1095
1099
 
1096
1100
 
1097
- def test_diagram_exponents_multiple_keys():
1101
+ def test_diagram_exponents_multiple_keys() -> None:
1098
1102
  q0, q1, q2 = cirq.LineQubit.range(3)
1099
1103
  circuit = cirq.Circuit(
1100
1104
  cirq.measure(q0, key='m0'),
@@ -1119,7 +1123,7 @@ m1: ═════@════^═══════
1119
1123
  )
1120
1124
 
1121
1125
 
1122
- def test_sympy_indexed_condition_circuit():
1126
+ def test_sympy_indexed_condition_circuit() -> None:
1123
1127
  a = sympy.IndexedBase('a')
1124
1128
  # XOR the 2nd and 3rd bits of the measurement (big-endian)
1125
1129
  cond = cirq.SympyCondition(sympy.Xor(a[1], a[2]))