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,10 @@
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
+
17
+ from typing import Any, Hashable, Iterable
18
+
15
19
  import pytest
16
20
 
17
21
  import cirq
@@ -19,7 +23,7 @@ import cirq.contrib.graph_device as ccgd
19
23
  import cirq.contrib.graph_device.graph_device as ccgdgd
20
24
 
21
25
 
22
- def test_fixed_duration_undirected_graph_device_edge_eq():
26
+ def test_fixed_duration_undirected_graph_device_edge_eq() -> None:
23
27
  e = ccgd.FixedDurationUndirectedGraphDeviceEdge(cirq.Duration(picos=4))
24
28
  f = ccgd.FixedDurationUndirectedGraphDeviceEdge(cirq.Duration(picos=4))
25
29
  g = ccgd.FixedDurationUndirectedGraphDeviceEdge(cirq.Duration(picos=5))
@@ -28,15 +32,15 @@ def test_fixed_duration_undirected_graph_device_edge_eq():
28
32
  assert e != 4
29
33
 
30
34
 
31
- def test_unconstrained_undirected_graph_device_edge_eq():
35
+ def test_unconstrained_undirected_graph_device_edge_eq() -> None:
32
36
  e = ccgdgd._UnconstrainedUndirectedGraphDeviceEdge()
33
37
  f = ccgd.UnconstrainedUndirectedGraphDeviceEdge
34
38
  assert e == f
35
39
  assert e != 3
36
40
 
37
41
 
38
- def test_is_undirected_device_graph():
39
- assert not ccgd.is_undirected_device_graph('abc')
42
+ def test_is_undirected_device_graph() -> None:
43
+ assert not ccgd.is_undirected_device_graph('abc') # type: ignore[arg-type]
40
44
  graph = ccgd.UndirectedHypergraph()
41
45
  assert ccgd.is_undirected_device_graph(graph)
42
46
  a, b, c, d, e = cirq.LineQubit.range(5)
@@ -50,9 +54,9 @@ def test_is_undirected_device_graph():
50
54
  assert not ccgd.is_undirected_device_graph(graph)
51
55
 
52
56
 
53
- def test_is_crosstalk_graph():
57
+ def test_is_crosstalk_graph() -> None:
54
58
  a, b, c, d, e, f = cirq.LineQubit.range(6)
55
- assert not ccgd.is_crosstalk_graph('abc')
59
+ assert not ccgd.is_crosstalk_graph('abc') # type: ignore[arg-type]
56
60
  graph = ccgd.UndirectedHypergraph()
57
61
  graph.add_vertex('abc')
58
62
  assert not ccgd.is_crosstalk_graph(graph)
@@ -74,14 +78,14 @@ def test_is_crosstalk_graph():
74
78
  assert not ccgd.is_crosstalk_graph(graph)
75
79
 
76
80
 
77
- def test_unconstrained_undirected_graph_device_edge():
81
+ def test_unconstrained_undirected_graph_device_edge() -> None:
78
82
  edge = ccgd.UnconstrainedUndirectedGraphDeviceEdge
79
83
  qubits = cirq.LineQubit.range(2)
80
84
  assert edge.duration_of(cirq.X(qubits[0])) == cirq.Duration(picos=0)
81
85
  assert edge.duration_of(cirq.CZ(*qubits[:2])) == cirq.Duration(picos=0)
82
86
 
83
87
 
84
- def test_graph_device():
88
+ def test_graph_device() -> None:
85
89
  one_qubit_duration = cirq.Duration(picos=10)
86
90
  two_qubit_duration = cirq.Duration(picos=1)
87
91
  one_qubit_edge = ccgd.FixedDurationUndirectedGraphDeviceEdge(one_qubit_duration)
@@ -93,7 +97,7 @@ def test_graph_device():
93
97
 
94
98
  n_qubits = 4
95
99
  qubits = cirq.LineQubit.range(n_qubits)
96
- edges = {
100
+ edges: dict[Iterable[Hashable], Any] = {
97
101
  (cirq.LineQubit(i), cirq.LineQubit((i + 1) % n_qubits)): two_qubit_edge
98
102
  for i in range(n_qubits)
99
103
  }
@@ -109,8 +113,8 @@ def test_graph_device():
109
113
 
110
114
  assert ccgd.is_undirected_device_graph(device_graph)
111
115
  with pytest.raises(TypeError):
112
- ccgd.UndirectedGraphDevice('abc')
113
- constraint_edges = {
116
+ ccgd.UndirectedGraphDevice('abc') # type: ignore[arg-type]
117
+ constraint_edges: dict[Iterable[Hashable], Any] = {
114
118
  (frozenset(cirq.LineQubit.range(2)), frozenset(cirq.LineQubit.range(2, 4))): None,
115
119
  (
116
120
  frozenset(cirq.LineQubit.range(1, 3)),
@@ -121,7 +125,7 @@ def test_graph_device():
121
125
  assert ccgd.is_crosstalk_graph(crosstalk_graph)
122
126
 
123
127
  with pytest.raises(TypeError):
124
- ccgd.UndirectedGraphDevice(device_graph, crosstalk_graph='abc')
128
+ ccgd.UndirectedGraphDevice(device_graph, crosstalk_graph='abc') # type: ignore[arg-type]
125
129
 
126
130
  graph_device = ccgd.UndirectedGraphDevice(device_graph)
127
131
  assert graph_device.crosstalk_graph == ccgd.UndirectedHypergraph()
@@ -139,7 +143,7 @@ def test_graph_device():
139
143
  with pytest.raises(ValueError):
140
144
  graph_device.validate_operation(cirq.CNOT(qubits[0], qubits[2]))
141
145
  with pytest.raises(AttributeError):
142
- graph_device.validate_operation(list((2, 3)))
146
+ graph_device.validate_operation(list((2, 3))) # type: ignore[arg-type]
143
147
 
144
148
  moment = cirq.Moment([cirq.CNOT(*qubits[:2]), cirq.CNOT(*qubits[2:])])
145
149
  with pytest.raises(ValueError):
@@ -153,7 +157,7 @@ def test_graph_device():
153
157
  graph_device.validate_moment(moment)
154
158
 
155
159
 
156
- def test_graph_device_copy_and_add():
160
+ def test_graph_device_copy_and_add() -> None:
157
161
  a, b, c, d, e, f = cirq.LineQubit.range(6)
158
162
  device_graph = ccgd.UndirectedHypergraph(labelled_edges={(a, b): None, (c, d): None})
159
163
  crosstalk_graph = ccgd.UndirectedHypergraph(
@@ -12,19 +12,21 @@
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 itertools
16
18
  import random
17
- from typing import Any, Dict, FrozenSet, Hashable, Iterable, Mapping, Optional, Set, Tuple, Union
19
+ from typing import Any, Hashable, Iterable, Mapping
18
20
 
19
- AdjacencyList = Set[FrozenSet[Hashable]]
21
+ AdjacencyList = set[frozenset[Hashable]]
20
22
 
21
23
 
22
24
  class UndirectedHypergraph:
23
25
  def __init__(
24
26
  self,
25
27
  *,
26
- vertices: Optional[Iterable[Hashable]] = None,
27
- labelled_edges: Optional[Dict[Iterable[Hashable], Any]] = None,
28
+ vertices: Iterable[Hashable] | None = None,
29
+ labelled_edges: dict[Iterable[Hashable], Any] | None = None,
28
30
  ) -> None:
29
31
  """A labelled, undirected hypergraph.
30
32
 
@@ -35,23 +37,23 @@ class UndirectedHypergraph:
35
37
  automatically added.
36
38
  """
37
39
 
38
- self._adjacency_lists: Dict[Hashable, AdjacencyList] = {}
39
- self._labelled_edges: Dict[FrozenSet[Hashable], Any] = {}
40
+ self._adjacency_lists: dict[Hashable, AdjacencyList] = {}
41
+ self._labelled_edges: dict[frozenset[Hashable], Any] = {}
40
42
  if vertices is not None:
41
43
  self.add_vertices(vertices)
42
44
  if labelled_edges is not None:
43
45
  self.add_edges(labelled_edges)
44
46
 
45
47
  @property
46
- def vertices(self) -> Tuple[Hashable, ...]:
48
+ def vertices(self) -> tuple[Hashable, ...]:
47
49
  return tuple(self._adjacency_lists.keys())
48
50
 
49
51
  @property
50
- def edges(self) -> Tuple[FrozenSet[Hashable], ...]:
52
+ def edges(self) -> tuple[frozenset[Hashable], ...]:
51
53
  return tuple(self._labelled_edges.keys())
52
54
 
53
55
  @property
54
- def labelled_edges(self) -> Dict[FrozenSet, Any]:
56
+ def labelled_edges(self) -> dict[frozenset, Any]:
55
57
  return dict(self._labelled_edges)
56
58
 
57
59
  def add_vertex(self, vertex: Hashable) -> None:
@@ -69,7 +71,7 @@ class UndirectedHypergraph:
69
71
  self._adjacency_lists[neighbor].difference_update((edge,))
70
72
  del self._adjacency_lists[vertex]
71
73
 
72
- def remove_vertices(self, vertices):
74
+ def remove_vertices(self, vertices) -> None:
73
75
  for vertex in vertices:
74
76
  self.remove_vertex(vertex)
75
77
 
@@ -80,7 +82,7 @@ class UndirectedHypergraph:
80
82
  self._adjacency_lists[vertex].update((vertices,))
81
83
  self._labelled_edges[vertices] = label
82
84
 
83
- def add_edges(self, edges: Dict[Iterable[Hashable], Any]):
85
+ def add_edges(self, edges: dict[Iterable[Hashable], Any]) -> None:
84
86
  for vertices, label in edges.items():
85
87
  self.add_edge(vertices, label)
86
88
 
@@ -102,8 +104,8 @@ class UndirectedHypergraph:
102
104
 
103
105
  @classmethod
104
106
  def random(
105
- cls, vertices: Union[int, Iterable], edge_probs: Mapping[int, float]
106
- ) -> 'UndirectedHypergraph':
107
+ cls, vertices: int | Iterable, edge_probs: Mapping[int, float]
108
+ ) -> UndirectedHypergraph:
107
109
  """A random hypergraph.
108
110
 
109
111
  Every possible edge is included with probability edge_prob[len(edge)].
@@ -125,5 +127,5 @@ class UndirectedHypergraph:
125
127
  for potential_edge in itertools.combinations(vertices, edge_size):
126
128
  if random.random() < edge_prob:
127
129
  edges.append(potential_edge)
128
- labelled_edges: Dict[Iterable[Hashable], Any] = {edge: None for edge in edges}
130
+ labelled_edges: dict[Iterable[Hashable], Any] = {edge: None for edge in edges}
129
131
  return cls(vertices=vertices, labelled_edges=labelled_edges)
@@ -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 random
16
18
 
17
19
  import pytest
@@ -19,7 +21,7 @@ import pytest
19
21
  import cirq.contrib.graph_device as ccgd
20
22
 
21
23
 
22
- def test_update_edge_label():
24
+ def test_update_edge_label() -> None:
23
25
  edge = frozenset(range(3))
24
26
  graph = ccgd.UndirectedHypergraph(labelled_edges={edge: 'a'})
25
27
  assert graph.labelled_edges[edge] == 'a'
@@ -27,7 +29,7 @@ def test_update_edge_label():
27
29
  assert graph.labelled_edges[edge] == 'b'
28
30
 
29
31
 
30
- def test_hypergraph():
32
+ def test_hypergraph() -> None:
31
33
  vertices = range(4)
32
34
  graph = ccgd.UndirectedHypergraph(vertices=vertices)
33
35
  assert graph.vertices == tuple(vertices)
@@ -53,7 +55,7 @@ def test_hypergraph():
53
55
  for _ in range(10)
54
56
  ],
55
57
  )
56
- def test_eq(vertices, edges):
58
+ def test_eq(vertices, edges) -> None:
57
59
  vertices = set(vertices).union(*edges)
58
60
  graph_initialized = ccgd.UndirectedHypergraph(vertices=vertices, labelled_edges=edges)
59
61
  graph_added_parallel = ccgd.UndirectedHypergraph()
@@ -67,15 +69,15 @@ def test_eq(vertices, edges):
67
69
  assert graph_initialized == graph_added_parallel == graph_added_sequential
68
70
 
69
71
 
70
- def test_random_hypergraph():
72
+ def test_random_hypergraph() -> None:
71
73
  n_vertices = 4
72
74
  graph = ccgd.UndirectedHypergraph.random(n_vertices, {1: 1.0})
73
- assert sorted(graph.vertices) == sorted(range(n_vertices))
75
+ assert sorted(graph.vertices) == sorted(range(n_vertices)) # type: ignore[type-var]
74
76
  assert set(graph.labelled_edges.values()) == set((None,))
75
77
  assert tuple(len(edge) for edge in graph.edges) == (1,) * n_vertices
76
78
 
77
79
 
78
- def test_copy():
80
+ def test_copy() -> None:
79
81
  graph_original = ccgd.UndirectedHypergraph(labelled_edges={(0, 1): None})
80
82
  graph_copy = graph_original.__copy__()
81
83
  assert graph_copy == graph_original
@@ -83,20 +85,20 @@ def test_copy():
83
85
  assert graph_copy != graph_original
84
86
 
85
87
 
86
- def test_iadd():
88
+ def test_iadd() -> None:
87
89
  graph = ccgd.UndirectedHypergraph(labelled_edges={(0, 1): None})
88
90
  addend = ccgd.UndirectedHypergraph(labelled_edges={(1, 2): None})
89
91
  graph += addend
90
92
  assert set(graph.edges) == set(frozenset(e) for e in ((0, 1), (1, 2)))
91
- assert sorted(graph.vertices) == [0, 1, 2]
93
+ assert sorted(graph.vertices) == [0, 1, 2] # type: ignore[type-var]
92
94
 
93
95
 
94
- def test_add():
96
+ def test_add() -> None:
95
97
  first_addend = ccgd.UndirectedHypergraph(labelled_edges={('a', 'b'): None})
96
98
  second_addend = ccgd.UndirectedHypergraph(labelled_edges={('c', 'b'): None})
97
99
  graph_sum = first_addend + second_addend
98
- assert sorted(first_addend.vertices) == list('ab')
99
- assert sorted(second_addend.vertices) == list('bc')
100
+ assert sorted(first_addend.vertices) == list('ab') # type: ignore[type-var]
101
+ assert sorted(second_addend.vertices) == list('bc') # type: ignore[type-var]
100
102
  assert sorted(graph_sum.vertices) == list('abc')
101
103
  assert sorted(first_addend.edges) == [frozenset('ab')]
102
104
  assert sorted(second_addend.edges) == [frozenset('bc')]
@@ -12,7 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from typing import Any, Dict, Hashable, Iterable, Mapping, Optional
15
+ from __future__ import annotations
16
+
17
+ from typing import Any, Hashable, Iterable, Mapping
16
18
 
17
19
  from cirq import devices, ops
18
20
  from cirq.contrib.graph_device.graph_device import UndirectedGraphDevice, UndirectedGraphDeviceEdge
@@ -20,7 +22,7 @@ from cirq.contrib.graph_device.hypergraph import UndirectedHypergraph
20
22
 
21
23
 
22
24
  def uniform_undirected_graph_device(
23
- edges: Iterable[Iterable[ops.Qid]], edge_label: Optional[UndirectedGraphDeviceEdge] = None
25
+ edges: Iterable[Iterable[ops.Qid]], edge_label: UndirectedGraphDeviceEdge | None = None
24
26
  ) -> UndirectedGraphDevice:
25
27
  """An undirected graph device all of whose edges are the same.
26
28
 
@@ -29,13 +31,13 @@ def uniform_undirected_graph_device(
29
31
  edge_label: The label to apply to all edges. Defaults to None.
30
32
  """
31
33
 
32
- labelled_edges: Dict[Iterable[Hashable], Any] = {frozenset(edge): edge_label for edge in edges}
34
+ labelled_edges: dict[Iterable[Hashable], Any] = {frozenset(edge): edge_label for edge in edges}
33
35
  device_graph = UndirectedHypergraph(labelled_edges=labelled_edges)
34
36
  return UndirectedGraphDevice(device_graph=device_graph)
35
37
 
36
38
 
37
39
  def uniform_undirected_linear_device(
38
- n_qubits: int, edge_labels: Mapping[int, Optional[UndirectedGraphDeviceEdge]]
40
+ n_qubits: int, edge_labels: Mapping[int, UndirectedGraphDeviceEdge | None]
39
41
  ) -> UndirectedGraphDevice:
40
42
  """A uniform , undirected graph device whose qubits are arranged
41
43
  on a line.
@@ -12,21 +12,29 @@
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
+
17
+ from typing import TYPE_CHECKING
18
+
15
19
  import pytest
16
20
 
17
21
  import cirq
18
22
  import cirq.contrib.graph_device as ccgd
19
23
 
24
+ if TYPE_CHECKING:
25
+ from cirq.contrib.graph_device.graph_device import UndirectedGraphDeviceEdge
26
+
20
27
 
21
- def test_empty_uniform_undirected_linear_device():
28
+ def test_empty_uniform_undirected_linear_device() -> None:
22
29
  n_qubits = 4
30
+ edge_labels: dict[int, UndirectedGraphDeviceEdge | None]
23
31
  edge_labels = {}
24
32
  device = ccgd.uniform_undirected_linear_device(n_qubits, edge_labels)
25
33
  assert device.qubits == tuple()
26
34
  assert device.edges == tuple()
27
35
 
28
36
 
29
- def test_negative_arity_arg_uniform_undirected_linear_device():
37
+ def test_negative_arity_arg_uniform_undirected_linear_device() -> None:
30
38
  with pytest.raises(ValueError):
31
39
  ccgd.uniform_undirected_linear_device(5, {-1: None})
32
40
  with pytest.raises(ValueError):
@@ -34,7 +42,7 @@ def test_negative_arity_arg_uniform_undirected_linear_device():
34
42
 
35
43
 
36
44
  @pytest.mark.parametrize('arity', range(1, 5))
37
- def test_regular_uniform_undirected_linear_device(arity):
45
+ def test_regular_uniform_undirected_linear_device(arity) -> None:
38
46
  n_qubits = 10
39
47
  edge_labels = {arity: None}
40
48
  device = ccgd.uniform_undirected_linear_device(n_qubits, edge_labels)
@@ -14,11 +14,16 @@
14
14
 
15
15
  """Tools for disabling validation in circuit construction."""
16
16
 
17
+ from __future__ import annotations
18
+
17
19
  import contextlib
20
+ from collections.abc import Generator
18
21
 
19
22
 
20
23
  @contextlib.contextmanager
21
- def disable_op_validation(*, accept_debug_responsibility: bool = False):
24
+ def disable_op_validation(
25
+ *, accept_debug_responsibility: bool = False
26
+ ) -> Generator[None, None, None]:
22
27
  if not accept_debug_responsibility:
23
28
  raise ValueError(
24
29
  "WARNING! Using disable_op_validation with invalid ops can cause "
@@ -12,13 +12,15 @@
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 pytest
16
18
 
17
19
  import cirq
18
20
  from cirq.contrib.hacks.disable_validation import disable_op_validation
19
21
 
20
22
 
21
- def test_disable_op_validation():
23
+ def test_disable_op_validation() -> None:
22
24
  q0, q1 = cirq.LineQubit.range(2)
23
25
 
24
26
  # Fails normally.
cirq/contrib/json.py CHANGED
@@ -1,18 +1,44 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
2
  """Functions for JSON serialization and de-serialization for classes in Contrib."""
3
3
 
4
- from cirq.protocols.json_serialization import DEFAULT_RESOLVERS
4
+ from __future__ import annotations
5
5
 
6
+ import functools
6
7
 
7
- def contrib_class_resolver(cirq_type: str):
8
+ from cirq.protocols.json_serialization import _register_resolver, DEFAULT_RESOLVERS, ObjectFactory
9
+
10
+
11
+ def contrib_class_resolver(cirq_type: str) -> ObjectFactory | None:
8
12
  """Extend cirq's JSON API with resolvers for cirq contrib classes."""
13
+ return _class_resolver_dictionary().get(cirq_type, None)
14
+
15
+
16
+ @functools.cache
17
+ def _class_resolver_dictionary() -> dict[str, ObjectFactory]:
9
18
  from cirq.contrib.acquaintance import SwapPermutationGate
10
19
  from cirq.contrib.bayesian_network import BayesianNetworkGate
20
+ from cirq.contrib.noise_models import (
21
+ DampedReadoutNoiseModel,
22
+ DepolarizingNoiseModel,
23
+ DepolarizingWithDampedReadoutNoiseModel,
24
+ DepolarizingWithReadoutNoiseModel,
25
+ ReadoutNoiseModel,
26
+ )
11
27
  from cirq.contrib.quantum_volume import QuantumVolumeResult
12
28
 
13
- classes = [BayesianNetworkGate, QuantumVolumeResult, SwapPermutationGate]
14
- d = {cls.__name__: cls for cls in classes}
15
- return d.get(cirq_type, None)
29
+ classes = [
30
+ BayesianNetworkGate,
31
+ QuantumVolumeResult,
32
+ SwapPermutationGate,
33
+ DepolarizingNoiseModel,
34
+ ReadoutNoiseModel,
35
+ DampedReadoutNoiseModel,
36
+ DepolarizingWithReadoutNoiseModel,
37
+ DepolarizingWithDampedReadoutNoiseModel,
38
+ ]
39
+ return {cls.__name__: cls for cls in classes}
16
40
 
17
41
 
18
42
  DEFAULT_CONTRIB_RESOLVERS = [contrib_class_resolver] + DEFAULT_RESOLVERS
43
+
44
+ _register_resolver(_class_resolver_dictionary)
cirq/contrib/json_test.py CHANGED
@@ -1,4 +1,7 @@
1
1
  # pylint: disable=wrong-or-nonexistent-copyright-notice
2
+
3
+ from __future__ import annotations
4
+
2
5
  import cirq
3
6
  from cirq.contrib.acquaintance import SwapPermutationGate
4
7
  from cirq.contrib.bayesian_network import BayesianNetworkGate
@@ -7,14 +10,14 @@ from cirq.contrib.quantum_volume import QuantumVolumeResult
7
10
  from cirq.testing import assert_json_roundtrip_works
8
11
 
9
12
 
10
- def test_bayesian_network_gate():
13
+ def test_bayesian_network_gate() -> None:
11
14
  gate = BayesianNetworkGate(
12
15
  init_probs=[('q0', 0.125), ('q1', None)], arc_probs=[('q1', ('q0',), [0.25, 0.5])]
13
16
  )
14
17
  assert_json_roundtrip_works(gate, resolvers=DEFAULT_CONTRIB_RESOLVERS)
15
18
 
16
19
 
17
- def test_quantum_volume():
20
+ def test_quantum_volume() -> None:
18
21
  qubits = cirq.LineQubit.range(5)
19
22
  qvr = QuantumVolumeResult(
20
23
  model_circuit=cirq.Circuit(cirq.H.on_each(qubits)),
@@ -25,6 +28,6 @@ def test_quantum_volume():
25
28
  assert_json_roundtrip_works(qvr, resolvers=DEFAULT_CONTRIB_RESOLVERS)
26
29
 
27
30
 
28
- def test_swap_permutation_gate():
31
+ def test_swap_permutation_gate() -> None:
29
32
  gate = SwapPermutationGate(swap_gate=cirq.SWAP)
30
33
  assert_json_roundtrip_works(gate, resolvers=DEFAULT_CONTRIB_RESOLVERS)
@@ -0,0 +1,12 @@
1
+ [
2
+ {
3
+ "cirq_type": "DampedReadoutNoiseModel",
4
+ "decay_prob": 0.3,
5
+ "prepend": true
6
+ },
7
+ {
8
+ "cirq_type": "DampedReadoutNoiseModel",
9
+ "decay_prob": 0.4,
10
+ "prepend": false
11
+ }
12
+ ]
@@ -0,0 +1,4 @@
1
+ [
2
+ cirq.contrib.noise_models.DampedReadoutNoiseModel(0.3, prepend=True),
3
+ cirq.contrib.noise_models.DampedReadoutNoiseModel(0.4, prepend=False),
4
+ ]
@@ -0,0 +1,12 @@
1
+ [
2
+ {
3
+ "cirq_type": "DepolarizingNoiseModel",
4
+ "depol_prob": 0.1,
5
+ "prepend": false
6
+ },
7
+ {
8
+ "cirq_type": "DepolarizingNoiseModel",
9
+ "depol_prob": 0.15,
10
+ "prepend": true
11
+ }
12
+ ]
@@ -0,0 +1,4 @@
1
+ [
2
+ cirq.contrib.noise_models.DepolarizingNoiseModel(0.1, prepend=False),
3
+ cirq.contrib.noise_models.DepolarizingNoiseModel(0.15, prepend=True),
4
+ ]
@@ -0,0 +1,6 @@
1
+ {
2
+ "cirq_type": "DepolarizingWithDampedReadoutNoiseModel",
3
+ "depol_prob": 0.1,
4
+ "bitflip_prob": 0.2,
5
+ "decay_prob": 0.3
6
+ }
@@ -0,0 +1 @@
1
+ cirq.contrib.noise_models.DepolarizingWithDampedReadoutNoiseModel(0.1, 0.2, 0.3)
@@ -0,0 +1,5 @@
1
+ {
2
+ "cirq_type": "DepolarizingWithReadoutNoiseModel",
3
+ "depol_prob": 0.1,
4
+ "bitflip_prob": 0.2
5
+ }
@@ -0,0 +1 @@
1
+ cirq.contrib.noise_models.DepolarizingWithReadoutNoiseModel(0.1, 0.2)
@@ -0,0 +1,12 @@
1
+ [
2
+ {
3
+ "cirq_type": "ReadoutNoiseModel",
4
+ "bitflip_prob": 0.2,
5
+ "prepend": true
6
+ },
7
+ {
8
+ "cirq_type": "ReadoutNoiseModel",
9
+ "bitflip_prob": 0.23,
10
+ "prepend": false
11
+ }
12
+ ]
@@ -0,0 +1,4 @@
1
+ [
2
+ cirq.contrib.noise_models.ReadoutNoiseModel(0.2, prepend=True),
3
+ cirq.contrib.noise_models.ReadoutNoiseModel(0.23, prepend=False),
4
+ ]
@@ -0,0 +1,17 @@
1
+ # Copyright 2025 The Cirq Developers
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Test data for JSON serialization of :mod:`cirq.contrib` objects."""
16
+
17
+ from cirq.contrib.json_test_data.spec import TestSpec as TestSpec
@@ -0,0 +1,32 @@
1
+ # Copyright 2025 The Cirq Developers
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ import pathlib
17
+
18
+ import cirq
19
+ from cirq.contrib.json import _class_resolver_dictionary
20
+ from cirq.testing.json import ModuleJsonTestSpec
21
+
22
+ TestSpec = ModuleJsonTestSpec(
23
+ name="cirq.contrib",
24
+ packages=[cirq.contrib],
25
+ test_data_path=pathlib.Path(__file__).parent,
26
+ not_yet_serializable=[],
27
+ should_not_be_serialized=["Unique", "CircuitDag"],
28
+ resolver_cache=_class_resolver_dictionary(),
29
+ deprecated={},
30
+ # TODO: #7520 - create .json and .repr for these so they can be tested here
31
+ tested_elsewhere=["QuantumVolumeResult", "SwapPermutationGate", "BayesianNetworkGate"],
32
+ )