cirq-core 1.7.0.dev20250825174419__py3-none-any.whl → 1.7.0.dev20251203004401__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.
Files changed (426) hide show
  1. cirq/__init__.py +1 -0
  2. cirq/_compat.py +3 -2
  3. cirq/_compat_test.py +16 -15
  4. cirq/_doc.py +4 -3
  5. cirq/_import.py +2 -1
  6. cirq/_version.py +1 -1
  7. cirq/_version_test.py +1 -1
  8. cirq/circuits/_bucket_priority_queue.py +2 -1
  9. cirq/circuits/circuit.py +19 -17
  10. cirq/circuits/circuit_operation.py +2 -1
  11. cirq/circuits/circuit_operation_test.py +19 -0
  12. cirq/circuits/circuit_test.py +31 -12
  13. cirq/circuits/frozen_circuit.py +3 -2
  14. cirq/circuits/moment.py +3 -15
  15. cirq/circuits/optimization_pass.py +2 -1
  16. cirq/circuits/qasm_output.py +39 -10
  17. cirq/circuits/qasm_output_test.py +51 -2
  18. cirq/circuits/text_diagram_drawer.py +2 -1
  19. cirq/contrib/acquaintance/bipartite.py +2 -1
  20. cirq/contrib/acquaintance/devices.py +1 -1
  21. cirq/contrib/acquaintance/executor.py +4 -5
  22. cirq/contrib/acquaintance/executor_test.py +2 -1
  23. cirq/contrib/acquaintance/gates.py +2 -1
  24. cirq/contrib/acquaintance/gates_test.py +1 -1
  25. cirq/contrib/acquaintance/inspection_utils.py +2 -1
  26. cirq/contrib/acquaintance/mutation_utils.py +2 -1
  27. cirq/contrib/acquaintance/optimizers.py +2 -1
  28. cirq/contrib/acquaintance/permutation.py +2 -1
  29. cirq/contrib/acquaintance/permutation_test.py +1 -1
  30. cirq/contrib/acquaintance/shift.py +2 -1
  31. cirq/contrib/acquaintance/shift_swap_network.py +2 -1
  32. cirq/contrib/acquaintance/strategies/complete.py +3 -2
  33. cirq/contrib/acquaintance/strategies/cubic.py +2 -1
  34. cirq/contrib/acquaintance/strategies/quartic_paired.py +2 -1
  35. cirq/contrib/acquaintance/strategies/quartic_paired_test.py +1 -1
  36. cirq/contrib/acquaintance/testing.py +2 -1
  37. cirq/contrib/acquaintance/topological_sort.py +2 -1
  38. cirq/contrib/bayesian_network/bayesian_network_gate.py +3 -2
  39. cirq/contrib/circuitdag/circuit_dag.py +4 -2
  40. cirq/contrib/custom_simulators/custom_state_simulator.py +2 -1
  41. cirq/contrib/custom_simulators/custom_state_simulator_test.py +1 -1
  42. cirq/contrib/graph_device/graph_device.py +2 -1
  43. cirq/contrib/graph_device/graph_device_test.py +2 -1
  44. cirq/contrib/graph_device/hypergraph.py +2 -1
  45. cirq/contrib/graph_device/uniform_graph_device.py +2 -1
  46. cirq/contrib/json.py +14 -2
  47. cirq/contrib/json_test_data/BayesianNetworkGate.json +10 -0
  48. cirq/contrib/json_test_data/BayesianNetworkGate.repr +3 -0
  49. cirq/contrib/json_test_data/QuantumVolumeResult.json +169 -0
  50. cirq/contrib/json_test_data/QuantumVolumeResult.repr +22 -0
  51. cirq/contrib/json_test_data/SwapPermutationGate.json +3 -0
  52. cirq/contrib/json_test_data/SwapPermutationGate.repr +1 -0
  53. cirq/contrib/json_test_data/spec.py +0 -2
  54. cirq/contrib/noise_models/noise_models.py +2 -1
  55. cirq/contrib/paulistring/clifford_optimize.py +20 -2
  56. cirq/contrib/paulistring/optimize.py +1 -1
  57. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py +146 -35
  58. cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py +81 -178
  59. cirq/contrib/paulistring/recombine.py +5 -2
  60. cirq/contrib/paulistring/separate.py +1 -1
  61. cirq/contrib/qasm_import/_lexer.py +6 -1
  62. cirq/contrib/qasm_import/_lexer_test.py +1 -1
  63. cirq/contrib/qasm_import/_parser.py +24 -8
  64. cirq/contrib/qasm_import/_parser_test.py +44 -6
  65. cirq/contrib/qcircuit/qcircuit_pdf_test.py +6 -9
  66. cirq/contrib/quantikz/__init__.py +21 -0
  67. cirq/contrib/quantikz/circuit_to_latex_quantikz.py +680 -0
  68. cirq/contrib/quantikz/circuit_to_latex_quantikz_test.py +253 -0
  69. cirq/contrib/quantikz/circuit_to_latex_render.py +424 -0
  70. cirq/contrib/quantikz/circuit_to_latex_render_test.py +44 -0
  71. cirq/contrib/quantum_volume/quantum_volume.py +2 -1
  72. cirq/contrib/quimb/density_matrix.py +1 -1
  73. cirq/contrib/quimb/grid_circuits.py +2 -1
  74. cirq/contrib/quimb/grid_circuits_test.py +1 -1
  75. cirq/contrib/quimb/mps_simulator.py +4 -3
  76. cirq/contrib/quimb/state_vector.py +2 -1
  77. cirq/contrib/quirk/export_to_quirk.py +2 -1
  78. cirq/contrib/quirk/linearize_circuit.py +1 -1
  79. cirq/contrib/quirk/quirk_gate.py +2 -1
  80. cirq/contrib/routing/device.py +1 -1
  81. cirq/contrib/routing/greedy.py +2 -1
  82. cirq/contrib/routing/initialization.py +2 -1
  83. cirq/contrib/routing/router.py +2 -1
  84. cirq/contrib/routing/swap_network.py +2 -1
  85. cirq/contrib/routing/utils.py +2 -1
  86. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking.py +7 -5
  87. cirq/contrib/shuffle_circuits/shuffle_circuits_with_readout_benchmarking_test.py +6 -6
  88. cirq/devices/device.py +2 -1
  89. cirq/devices/grid_device_metadata.py +2 -1
  90. cirq/devices/grid_qubit.py +7 -6
  91. cirq/devices/insertion_noise_model.py +2 -1
  92. cirq/devices/line_qubit.py +2 -1
  93. cirq/devices/named_topologies.py +2 -1
  94. cirq/devices/noise_model.py +2 -1
  95. cirq/devices/noise_model_test.py +1 -1
  96. cirq/devices/noise_properties.py +2 -1
  97. cirq/devices/superconducting_qubits_noise_properties_test.py +2 -1
  98. cirq/devices/thermal_noise_model.py +2 -1
  99. cirq/experiments/__init__.py +2 -0
  100. cirq/experiments/benchmarking/parallel_xeb.py +2 -1
  101. cirq/experiments/benchmarking/parallel_xeb_test.py +1 -1
  102. cirq/experiments/fidelity_estimation.py +2 -1
  103. cirq/experiments/fidelity_estimation_test.py +1 -1
  104. cirq/experiments/ghz_2d.py +150 -0
  105. cirq/experiments/ghz_2d_test.py +155 -0
  106. cirq/experiments/n_qubit_tomography.py +2 -1
  107. cirq/experiments/n_qubit_tomography_test.py +1 -1
  108. cirq/experiments/purity_estimation.py +1 -1
  109. cirq/experiments/qubit_characterizations.py +33 -4
  110. cirq/experiments/qubit_characterizations_test.py +16 -0
  111. cirq/experiments/random_quantum_circuit_generation.py +2 -1
  112. cirq/experiments/random_quantum_circuit_generation_test.py +2 -1
  113. cirq/experiments/readout_confusion_matrix.py +2 -1
  114. cirq/experiments/readout_confusion_matrix_test.py +1 -1
  115. cirq/experiments/single_qubit_readout_calibration.py +2 -1
  116. cirq/experiments/single_qubit_readout_calibration_test.py +1 -1
  117. cirq/experiments/t1_decay_experiment.py +2 -1
  118. cirq/experiments/two_qubit_xeb.py +2 -1
  119. cirq/experiments/two_qubit_xeb_test.py +1 -1
  120. cirq/experiments/xeb_fitting.py +2 -1
  121. cirq/experiments/xeb_fitting_test.py +1 -1
  122. cirq/experiments/xeb_sampling.py +5 -3
  123. cirq/experiments/xeb_sampling_test.py +1 -1
  124. cirq/experiments/xeb_simulation.py +2 -1
  125. cirq/experiments/xeb_simulation_test.py +2 -1
  126. cirq/experiments/z_phase_calibration.py +2 -1
  127. cirq/experiments/z_phase_calibration_test.py +18 -3
  128. cirq/interop/quirk/cells/__init__.py +1 -2
  129. cirq/interop/quirk/cells/all_cells.py +2 -1
  130. cirq/interop/quirk/cells/arithmetic_cells.py +2 -1
  131. cirq/interop/quirk/cells/cell.py +2 -1
  132. cirq/interop/quirk/cells/composite_cell.py +2 -1
  133. cirq/interop/quirk/cells/composite_cell_test.py +1 -1
  134. cirq/interop/quirk/cells/control_cells.py +2 -1
  135. cirq/interop/quirk/cells/frequency_space_cells.py +1 -1
  136. cirq/interop/quirk/cells/ignored_cells.py +1 -1
  137. cirq/interop/quirk/cells/input_cells.py +2 -1
  138. cirq/interop/quirk/cells/input_rotation_cells.py +2 -1
  139. cirq/interop/quirk/cells/measurement_cells.py +2 -1
  140. cirq/interop/quirk/cells/parse.py +2 -11
  141. cirq/interop/quirk/cells/qubit_permutation_cells.py +2 -1
  142. cirq/interop/quirk/cells/scalar_cells.py +2 -1
  143. cirq/interop/quirk/cells/single_qubit_rotation_cells.py +2 -1
  144. cirq/interop/quirk/cells/swap_cell.py +2 -1
  145. cirq/interop/quirk/cells/unsupported_cells.py +1 -1
  146. cirq/interop/quirk/url_to_circuit.py +2 -1
  147. cirq/json_resolver_cache.py +0 -2
  148. cirq/linalg/decompositions.py +6 -2
  149. cirq/linalg/decompositions_test.py +1 -0
  150. cirq/linalg/diagonalize.py +1 -1
  151. cirq/linalg/predicates.py +2 -1
  152. cirq/linalg/tolerance.py +2 -1
  153. cirq/linalg/transformations.py +3 -2
  154. cirq/ops/arithmetic_operation.py +4 -3
  155. cirq/ops/arithmetic_operation_test.py +1 -1
  156. cirq/ops/boolean_hamiltonian.py +4 -3
  157. cirq/ops/classically_controlled_operation.py +11 -11
  158. cirq/ops/classically_controlled_operation_test.py +26 -2
  159. cirq/ops/clifford_gate.py +3 -2
  160. cirq/ops/clifford_gate_test.py +1 -2
  161. cirq/ops/common_channels.py +2 -1
  162. cirq/ops/common_gates.py +3 -2
  163. cirq/ops/control_values.py +2 -1
  164. cirq/ops/controlled_gate.py +3 -2
  165. cirq/ops/controlled_gate_test.py +2 -1
  166. cirq/ops/controlled_operation.py +3 -2
  167. cirq/ops/controlled_operation_test.py +2 -1
  168. cirq/ops/dense_pauli_string.py +44 -81
  169. cirq/ops/dense_pauli_string_test.py +21 -0
  170. cirq/ops/diagonal_gate.py +3 -2
  171. cirq/ops/eigen_gate.py +9 -7
  172. cirq/ops/fourier_transform.py +3 -2
  173. cirq/ops/fourier_transform_test.py +2 -4
  174. cirq/ops/fsim_gate.py +3 -2
  175. cirq/ops/gate_operation.py +23 -12
  176. cirq/ops/gateset.py +22 -2
  177. cirq/ops/global_phase_op.py +3 -2
  178. cirq/ops/greedy_qubit_manager.py +2 -1
  179. cirq/ops/identity.py +2 -1
  180. cirq/ops/kraus_channel.py +2 -1
  181. cirq/ops/linear_combinations.py +12 -17
  182. cirq/ops/linear_combinations_test.py +23 -1
  183. cirq/ops/matrix_gates.py +2 -1
  184. cirq/ops/measure_util.py +8 -6
  185. cirq/ops/measurement_gate.py +2 -1
  186. cirq/ops/mixed_unitary_channel.py +2 -1
  187. cirq/ops/named_qubit.py +2 -2
  188. cirq/ops/op_tree.py +2 -1
  189. cirq/ops/parallel_gate.py +3 -2
  190. cirq/ops/parity_gates.py +2 -1
  191. cirq/ops/parity_gates_test.py +35 -0
  192. cirq/ops/pauli_interaction_gate.py +2 -1
  193. cirq/ops/pauli_measurement_gate.py +2 -1
  194. cirq/ops/pauli_string.py +37 -57
  195. cirq/ops/pauli_string_phasor.py +6 -5
  196. cirq/ops/pauli_string_raw_types.py +2 -1
  197. cirq/ops/pauli_string_test.py +49 -6
  198. cirq/ops/pauli_sum_exponential.py +2 -1
  199. cirq/ops/permutation_gate.py +2 -1
  200. cirq/ops/phased_iswap_gate.py +3 -2
  201. cirq/ops/phased_x_gate.py +5 -4
  202. cirq/ops/phased_x_z_gate.py +12 -5
  203. cirq/ops/projector.py +2 -1
  204. cirq/ops/qubit_manager.py +2 -1
  205. cirq/ops/qubit_order.py +2 -1
  206. cirq/ops/qubit_order_or_list.py +1 -1
  207. cirq/ops/random_gate_channel.py +3 -2
  208. cirq/ops/raw_types.py +33 -16
  209. cirq/ops/raw_types_test.py +4 -3
  210. cirq/ops/state_preparation_channel.py +2 -1
  211. cirq/ops/three_qubit_gates.py +3 -2
  212. cirq/ops/two_qubit_diagonal_gate.py +3 -2
  213. cirq/ops/uniform_superposition_gate.py +2 -1
  214. cirq/ops/wait_gate.py +10 -4
  215. cirq/protocols/act_on_protocol.py +2 -1
  216. cirq/protocols/act_on_protocol_test.py +2 -1
  217. cirq/protocols/apply_channel_protocol.py +2 -1
  218. cirq/protocols/apply_mixture_protocol.py +2 -1
  219. cirq/protocols/apply_mixture_protocol_test.py +2 -1
  220. cirq/protocols/apply_unitary_protocol.py +2 -1
  221. cirq/protocols/apply_unitary_protocol_test.py +2 -0
  222. cirq/protocols/approximate_equality_protocol.py +2 -1
  223. cirq/protocols/circuit_diagram_info_protocol.py +2 -1
  224. cirq/protocols/control_key_protocol.py +7 -0
  225. cirq/protocols/decompose_protocol.py +2 -12
  226. cirq/protocols/has_stabilizer_effect_protocol.py +1 -1
  227. cirq/protocols/has_stabilizer_effect_protocol_test.py +11 -9
  228. cirq/protocols/has_unitary_protocol_test.py +3 -3
  229. cirq/protocols/hash_from_pickle_test.py +2 -2
  230. cirq/protocols/inverse_protocol.py +2 -1
  231. cirq/protocols/json_serialization.py +5 -4
  232. cirq/protocols/json_serialization_test.py +31 -31
  233. cirq/protocols/kraus_protocol.py +4 -3
  234. cirq/protocols/kraus_protocol_test.py +7 -7
  235. cirq/protocols/measurement_key_protocol.py +32 -8
  236. cirq/protocols/mixture_protocol.py +3 -2
  237. cirq/protocols/mixture_protocol_test.py +7 -7
  238. cirq/protocols/mul_protocol_test.py +4 -4
  239. cirq/protocols/phase_protocol.py +13 -4
  240. cirq/protocols/pow_protocol.py +2 -1
  241. cirq/protocols/pow_protocol_test.py +5 -5
  242. cirq/protocols/qasm.py +2 -1
  243. cirq/protocols/qid_shape_protocol.py +2 -1
  244. cirq/protocols/resolve_parameters.py +17 -15
  245. cirq/protocols/trace_distance_bound.py +2 -1
  246. cirq/protocols/unitary_protocol.py +21 -21
  247. cirq/protocols/unitary_protocol_test.py +31 -19
  248. cirq/qis/channels.py +1 -1
  249. cirq/qis/channels_test.py +1 -1
  250. cirq/qis/clifford_tableau.py +16 -15
  251. cirq/qis/clifford_tableau_test.py +17 -17
  252. cirq/qis/entropy.py +3 -3
  253. cirq/qis/entropy_test.py +1 -1
  254. cirq/qis/quantum_state_representation.py +2 -1
  255. cirq/qis/states.py +7 -2
  256. cirq/qis/states_test.py +54 -54
  257. cirq/sim/classical_simulator.py +25 -14
  258. cirq/sim/classical_simulator_test.py +85 -30
  259. cirq/sim/clifford/clifford_simulator.py +7 -6
  260. cirq/sim/clifford/clifford_simulator_test.py +51 -50
  261. cirq/sim/clifford/clifford_tableau_simulation_state.py +2 -1
  262. cirq/sim/clifford/stabilizer_ch_form_simulation_state.py +2 -1
  263. cirq/sim/clifford/stabilizer_sampler.py +1 -1
  264. cirq/sim/clifford/stabilizer_simulation_state.py +2 -1
  265. cirq/sim/clifford/stabilizer_state_ch_form.py +16 -15
  266. cirq/sim/clifford/stabilizer_state_ch_form_test.py +0 -1
  267. cirq/sim/density_matrix_simulation_state.py +7 -6
  268. cirq/sim/density_matrix_simulator.py +3 -2
  269. cirq/sim/density_matrix_simulator_test.py +94 -84
  270. cirq/sim/density_matrix_utils.py +2 -1
  271. cirq/sim/density_matrix_utils_test.py +1 -1
  272. cirq/sim/mux.py +35 -8
  273. cirq/sim/mux_test.py +39 -26
  274. cirq/sim/simulation_product_state.py +2 -1
  275. cirq/sim/simulation_product_state_test.py +8 -7
  276. cirq/sim/simulation_state.py +6 -5
  277. cirq/sim/simulation_state_base.py +3 -2
  278. cirq/sim/simulation_state_test.py +7 -6
  279. cirq/sim/simulation_utils.py +2 -1
  280. cirq/sim/simulator.py +4 -3
  281. cirq/sim/simulator_base.py +2 -1
  282. cirq/sim/simulator_base_test.py +51 -36
  283. cirq/sim/simulator_test.py +41 -36
  284. cirq/sim/sparse_simulator.py +3 -2
  285. cirq/sim/sparse_simulator_test.py +92 -82
  286. cirq/sim/state_vector.py +5 -6
  287. cirq/sim/state_vector_simulation_state.py +10 -9
  288. cirq/sim/state_vector_simulator.py +2 -1
  289. cirq/sim/state_vector_simulator_test.py +9 -9
  290. cirq/sim/state_vector_test.py +40 -39
  291. cirq/study/__init__.py +1 -0
  292. cirq/study/flatten_expressions.py +2 -1
  293. cirq/study/resolver.py +31 -18
  294. cirq/study/resolver_test.py +1 -1
  295. cirq/study/result.py +2 -1
  296. cirq/study/result_test.py +20 -20
  297. cirq/study/sweepable.py +2 -1
  298. cirq/study/sweepable_test.py +20 -20
  299. cirq/study/sweeps.py +26 -1
  300. cirq/study/sweeps_test.py +67 -43
  301. cirq/testing/_compat_test_data/__init__.py +3 -3
  302. cirq/testing/circuit_compare.py +2 -1
  303. cirq/testing/circuit_compare_test.py +16 -14
  304. cirq/testing/consistent_act_on_test.py +1 -1
  305. cirq/testing/consistent_channels.py +2 -2
  306. cirq/testing/consistent_controlled_gate_op.py +2 -2
  307. cirq/testing/consistent_controlled_gate_op_test.py +2 -1
  308. cirq/testing/consistent_decomposition.py +4 -2
  309. cirq/testing/consistent_phase_by.py +1 -1
  310. cirq/testing/consistent_protocols.py +2 -1
  311. cirq/testing/consistent_protocols_test.py +3 -3
  312. cirq/testing/consistent_qasm.py +4 -3
  313. cirq/testing/consistent_qasm_test.py +3 -3
  314. cirq/testing/consistent_resolve_parameters.py +1 -1
  315. cirq/testing/consistent_unitary.py +1 -1
  316. cirq/testing/consistent_unitary_test.py +1 -1
  317. cirq/testing/deprecation.py +1 -1
  318. cirq/testing/devices.py +3 -2
  319. cirq/testing/equals_tester.py +4 -3
  320. cirq/testing/equivalent_basis_map.py +4 -2
  321. cirq/testing/json.py +3 -2
  322. cirq/testing/lin_alg_utils.py +1 -1
  323. cirq/testing/logs.py +1 -1
  324. cirq/testing/op_tree.py +1 -1
  325. cirq/testing/order_tester.py +2 -2
  326. cirq/testing/pytest_utils.py +2 -1
  327. cirq/testing/random_circuit.py +2 -1
  328. cirq/testing/random_circuit_test.py +2 -1
  329. cirq/testing/repr_pretty_tester.py +3 -3
  330. cirq/transformers/__init__.py +1 -0
  331. cirq/transformers/_connected_component.py +231 -0
  332. cirq/transformers/_connected_component_test.py +200 -0
  333. cirq/transformers/align_test.py +13 -13
  334. cirq/transformers/analytical_decompositions/clifford_decomposition.py +8 -7
  335. cirq/transformers/analytical_decompositions/clifford_decomposition_test.py +5 -5
  336. cirq/transformers/analytical_decompositions/controlled_gate_decomposition.py +11 -10
  337. cirq/transformers/analytical_decompositions/controlled_gate_decomposition_test.py +6 -6
  338. cirq/transformers/analytical_decompositions/cphase_to_fsim.py +3 -2
  339. cirq/transformers/analytical_decompositions/cphase_to_fsim_test.py +11 -10
  340. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition.py +8 -7
  341. cirq/transformers/analytical_decompositions/quantum_shannon_decomposition_test.py +17 -20
  342. cirq/transformers/analytical_decompositions/single_qubit_decompositions_test.py +33 -27
  343. cirq/transformers/analytical_decompositions/single_to_two_qubit_isometry_test.py +1 -1
  344. cirq/transformers/analytical_decompositions/three_qubit_decomposition.py +1 -1
  345. cirq/transformers/analytical_decompositions/two_qubit_state_preparation_test.py +12 -11
  346. cirq/transformers/analytical_decompositions/two_qubit_to_cz.py +5 -2
  347. cirq/transformers/analytical_decompositions/two_qubit_to_cz_test.py +3 -3
  348. cirq/transformers/analytical_decompositions/two_qubit_to_fsim.py +2 -1
  349. cirq/transformers/analytical_decompositions/two_qubit_to_ms.py +2 -1
  350. cirq/transformers/analytical_decompositions/two_qubit_to_ms_test.py +2 -2
  351. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap.py +2 -1
  352. cirq/transformers/analytical_decompositions/two_qubit_to_sqrt_iswap_test.py +32 -30
  353. cirq/transformers/drop_negligible_operations_test.py +7 -7
  354. cirq/transformers/dynamical_decoupling.py +185 -112
  355. cirq/transformers/dynamical_decoupling_test.py +195 -201
  356. cirq/transformers/eject_phased_paulis.py +2 -1
  357. cirq/transformers/eject_phased_paulis_test.py +3 -2
  358. cirq/transformers/eject_z.py +5 -3
  359. cirq/transformers/eject_z_test.py +23 -25
  360. cirq/transformers/expand_composite.py +3 -2
  361. cirq/transformers/expand_composite_test.py +14 -14
  362. cirq/transformers/gauge_compiling/__init__.py +13 -0
  363. cirq/transformers/gauge_compiling/gauge_compiling.py +3 -2
  364. cirq/transformers/gauge_compiling/gauge_compiling_test.py +14 -12
  365. cirq/transformers/gauge_compiling/gauge_compiling_test_utils.py +3 -3
  366. cirq/transformers/gauge_compiling/idle_moments_gauge.py +225 -0
  367. cirq/transformers/gauge_compiling/idle_moments_gauge_test.py +193 -0
  368. cirq/transformers/gauge_compiling/multi_moment_cphase_gauge.py +242 -0
  369. cirq/transformers/gauge_compiling/multi_moment_cphase_gauge_test.py +243 -0
  370. cirq/transformers/gauge_compiling/multi_moment_gauge_compiling.py +151 -0
  371. cirq/transformers/gauge_compiling/sqrt_cz_gauge.py +2 -1
  372. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils.py +1 -1
  373. cirq/transformers/heuristic_decompositions/gate_tabulation_math_utils_test.py +6 -6
  374. cirq/transformers/heuristic_decompositions/two_qubit_gate_tabulation.py +3 -2
  375. cirq/transformers/measurement_transformers.py +2 -1
  376. cirq/transformers/measurement_transformers_test.py +45 -39
  377. cirq/transformers/merge_k_qubit_gates.py +2 -1
  378. cirq/transformers/merge_k_qubit_gates_test.py +1 -1
  379. cirq/transformers/merge_single_qubit_gates.py +9 -5
  380. cirq/transformers/merge_single_qubit_gates_test.py +22 -22
  381. cirq/transformers/noise_adding_test.py +2 -2
  382. cirq/transformers/optimize_for_target_gateset.py +2 -1
  383. cirq/transformers/optimize_for_target_gateset_test.py +11 -9
  384. cirq/transformers/qubit_management_transformers_test.py +6 -2
  385. cirq/transformers/routing/mapping_manager.py +2 -1
  386. cirq/transformers/routing/route_circuit_cqc.py +2 -1
  387. cirq/transformers/stratify.py +2 -1
  388. cirq/transformers/symbolize.py +2 -1
  389. cirq/transformers/tag_transformers.py +2 -1
  390. cirq/transformers/target_gatesets/compilation_target_gateset.py +2 -1
  391. cirq/transformers/target_gatesets/cz_gateset.py +2 -1
  392. cirq/transformers/target_gatesets/cz_gateset_test.py +1 -1
  393. cirq/transformers/target_gatesets/sqrt_iswap_gateset.py +2 -1
  394. cirq/transformers/transformer_api.py +2 -1
  395. cirq/transformers/transformer_primitives.py +271 -145
  396. cirq/transformers/transformer_primitives_test.py +185 -1
  397. cirq/value/abc_alt.py +2 -1
  398. cirq/value/classical_data.py +2 -1
  399. cirq/value/condition.py +2 -1
  400. cirq/value/digits.py +9 -2
  401. cirq/value/duration.py +6 -5
  402. cirq/value/linear_dict.py +4 -9
  403. cirq/value/measurement_key.py +2 -1
  404. cirq/value/periodic_value.py +3 -2
  405. cirq/value/product_state.py +2 -1
  406. cirq/value/value_equality_attr.py +2 -1
  407. cirq/vis/density_matrix.py +1 -1
  408. cirq/vis/heatmap.py +2 -1
  409. cirq/vis/histogram.py +2 -1
  410. cirq/vis/state_histogram.py +2 -1
  411. cirq/work/collector.py +2 -1
  412. cirq/work/observable_grouping.py +2 -1
  413. cirq/work/observable_measurement.py +2 -1
  414. cirq/work/observable_measurement_data.py +2 -1
  415. cirq/work/observable_measurement_test.py +1 -1
  416. cirq/work/observable_readout_calibration.py +2 -1
  417. cirq/work/observable_readout_calibration_test.py +1 -1
  418. cirq/work/observable_settings.py +2 -1
  419. cirq/work/sampler.py +2 -1
  420. cirq/work/sampler_test.py +1 -1
  421. {cirq_core-1.7.0.dev20250825174419.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/METADATA +5 -6
  422. {cirq_core-1.7.0.dev20250825174419.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/RECORD +425 -406
  423. cirq/contrib/json_test.py +0 -33
  424. {cirq_core-1.7.0.dev20250825174419.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/WHEEL +0 -0
  425. {cirq_core-1.7.0.dev20250825174419.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/licenses/LICENSE +0 -0
  426. {cirq_core-1.7.0.dev20250825174419.dist-info → cirq_core-1.7.0.dev20251203004401.dist-info}/top_level.txt +0 -0
cirq/qis/states_test.py CHANGED
@@ -21,15 +21,15 @@ import cirq
21
21
  import cirq.testing
22
22
 
23
23
 
24
- def assert_dirac_notation_numpy(vec, expected, decimals=2):
24
+ def assert_dirac_notation_numpy(vec, expected, decimals=2) -> None:
25
25
  assert cirq.dirac_notation(np.array(vec), decimals=decimals) == expected
26
26
 
27
27
 
28
- def assert_dirac_notation_python(vec, expected, decimals=2):
28
+ def assert_dirac_notation_python(vec, expected, decimals=2) -> None:
29
29
  assert cirq.dirac_notation(vec, decimals=decimals) == expected
30
30
 
31
31
 
32
- def assert_valid_density_matrix(matrix, num_qubits=None, qid_shape=None):
32
+ def assert_valid_density_matrix(matrix, num_qubits=None, qid_shape=None) -> None:
33
33
  if qid_shape is None and num_qubits is None:
34
34
  num_qubits = 1
35
35
  np.testing.assert_almost_equal(
@@ -40,7 +40,7 @@ def assert_valid_density_matrix(matrix, num_qubits=None, qid_shape=None):
40
40
  )
41
41
 
42
42
 
43
- def test_quantum_state():
43
+ def test_quantum_state() -> None:
44
44
  state_vector_1 = cirq.one_hot(shape=(4,), dtype=np.complex128)
45
45
  state_tensor_1 = np.reshape(state_vector_1, (2, 2))
46
46
  density_matrix_1 = np.outer(state_vector_1, np.conj(state_vector_1))
@@ -73,7 +73,7 @@ def test_quantum_state():
73
73
  np.testing.assert_array_equal(state.state_vector_or_density_matrix(), density_matrix_1)
74
74
 
75
75
 
76
- def test_quantum_state_quantum_state():
76
+ def test_quantum_state_quantum_state() -> None:
77
77
  state_vector_1 = cirq.one_hot(shape=(4,), dtype=np.complex128)
78
78
  quantum_state = cirq.QuantumState(state_vector_1)
79
79
 
@@ -96,7 +96,7 @@ def test_quantum_state_quantum_state():
96
96
  state = cirq.quantum_state(quantum_state, qid_shape=(4,))
97
97
 
98
98
 
99
- def test_quantum_state_computational_basis_state():
99
+ def test_quantum_state_computational_basis_state() -> None:
100
100
  state = cirq.quantum_state(7, qid_shape=(3, 4))
101
101
  np.testing.assert_allclose(state.data, cirq.one_hot(index=7, shape=(12,), dtype=np.complex64))
102
102
  assert state.qid_shape == (3, 4)
@@ -125,7 +125,7 @@ def test_quantum_state_computational_basis_state():
125
125
  _ = cirq.quantum_state((0, 0, 1, 1), qid_shape=(1, 1, 2, 2))
126
126
 
127
127
 
128
- def test_quantum_state_state_vector_state_tensor():
128
+ def test_quantum_state_state_vector_state_tensor() -> None:
129
129
  state_vector_1 = cirq.one_hot(shape=(4,), dtype=np.complex128)
130
130
  state_tensor_1 = np.reshape(state_vector_1, (2, 2))
131
131
 
@@ -146,7 +146,7 @@ def test_quantum_state_state_vector_state_tensor():
146
146
  _ = cirq.quantum_state(state_tensor_1, qid_shape=(2, 3))
147
147
 
148
148
 
149
- def test_quantum_state_density_matrix():
149
+ def test_quantum_state_density_matrix() -> None:
150
150
  density_matrix_1 = np.eye(4, dtype=np.complex64) / 4
151
151
 
152
152
  state = cirq.quantum_state(density_matrix_1, qid_shape=(4,), copy=True)
@@ -159,7 +159,7 @@ def test_quantum_state_density_matrix():
159
159
  _ = cirq.quantum_state(density_matrix_1, qid_shape=(8,))
160
160
 
161
161
 
162
- def test_quantum_state_product_state():
162
+ def test_quantum_state_product_state() -> None:
163
163
  q0, q1, q2 = cirq.LineQubit.range(3)
164
164
  product_state_1 = cirq.KET_PLUS(q0) * cirq.KET_PLUS(q1) * cirq.KET_ONE(q2)
165
165
 
@@ -172,7 +172,7 @@ def test_quantum_state_product_state():
172
172
  _ = cirq.quantum_state(product_state_1, qid_shape=(2, 2))
173
173
 
174
174
 
175
- def test_density_matrix():
175
+ def test_density_matrix() -> None:
176
176
  density_matrix_1 = np.eye(4, dtype=np.complex64) / 4
177
177
  state_vector_1 = cirq.one_hot(shape=(4,), dtype=np.complex64)
178
178
 
@@ -185,7 +185,7 @@ def test_density_matrix():
185
185
  _ = cirq.density_matrix(state_vector_1)
186
186
 
187
187
 
188
- def test_infer_qid_shape():
188
+ def test_infer_qid_shape() -> None:
189
189
  computational_basis_state_1 = [0, 0, 0, 1]
190
190
  computational_basis_state_2 = [0, 1, 2, 3]
191
191
  computational_basis_state_3 = [0, 1, 2, 4]
@@ -261,7 +261,7 @@ def test_infer_qid_shape():
261
261
 
262
262
 
263
263
  @pytest.mark.parametrize('global_phase', (1, 1j, np.exp(1j)))
264
- def test_bloch_vector_zero_state(global_phase):
264
+ def test_bloch_vector_zero_state(global_phase) -> None:
265
265
  zero_state = global_phase * np.array([1, 0])
266
266
 
267
267
  bloch = cirq.bloch_vector_from_state_vector(zero_state, 0)
@@ -270,7 +270,7 @@ def test_bloch_vector_zero_state(global_phase):
270
270
 
271
271
 
272
272
  @pytest.mark.parametrize('global_phase', (1, 1j, np.exp(1j)))
273
- def test_bloch_vector_one_state(global_phase):
273
+ def test_bloch_vector_one_state(global_phase) -> None:
274
274
  one_state = global_phase * np.array([0, 1])
275
275
 
276
276
  bloch = cirq.bloch_vector_from_state_vector(one_state, 0)
@@ -279,7 +279,7 @@ def test_bloch_vector_one_state(global_phase):
279
279
 
280
280
 
281
281
  @pytest.mark.parametrize('global_phase', (1, 1j, np.exp(1j)))
282
- def test_bloch_vector_plus_state(global_phase):
282
+ def test_bloch_vector_plus_state(global_phase) -> None:
283
283
  sqrt = np.sqrt(0.5)
284
284
  plus_state = global_phase * np.array([sqrt, sqrt])
285
285
 
@@ -289,7 +289,7 @@ def test_bloch_vector_plus_state(global_phase):
289
289
 
290
290
 
291
291
  @pytest.mark.parametrize('global_phase', (1, 1j, np.exp(1j)))
292
- def test_bloch_vector_minus_state(global_phase):
292
+ def test_bloch_vector_minus_state(global_phase) -> None:
293
293
  sqrt = np.sqrt(0.5)
294
294
  minus_state = np.array([-1.0j * sqrt, 1.0j * sqrt])
295
295
  bloch = cirq.bloch_vector_from_state_vector(minus_state, 0)
@@ -299,7 +299,7 @@ def test_bloch_vector_minus_state(global_phase):
299
299
 
300
300
 
301
301
  @pytest.mark.parametrize('global_phase', (1, 1j, np.exp(1j)))
302
- def test_bloch_vector_iplus_state(global_phase):
302
+ def test_bloch_vector_iplus_state(global_phase) -> None:
303
303
  sqrt = np.sqrt(0.5)
304
304
  iplus_state = global_phase * np.array([sqrt, 1j * sqrt])
305
305
 
@@ -309,7 +309,7 @@ def test_bloch_vector_iplus_state(global_phase):
309
309
 
310
310
 
311
311
  @pytest.mark.parametrize('global_phase', (1, 1j, np.exp(1j)))
312
- def test_bloch_vector_iminus_state(global_phase):
312
+ def test_bloch_vector_iminus_state(global_phase) -> None:
313
313
  sqrt = np.sqrt(0.5)
314
314
  iminus_state = global_phase * np.array([sqrt, -1j * sqrt])
315
315
 
@@ -318,7 +318,7 @@ def test_bloch_vector_iminus_state(global_phase):
318
318
  np.testing.assert_array_almost_equal(bloch, desired_simple)
319
319
 
320
320
 
321
- def test_bloch_vector_simple_th_zero():
321
+ def test_bloch_vector_simple_th_zero() -> None:
322
322
  sqrt = np.sqrt(0.5)
323
323
  # State TH|0>.
324
324
  th_state = np.array([sqrt, 0.5 + 0.5j])
@@ -328,7 +328,7 @@ def test_bloch_vector_simple_th_zero():
328
328
  np.testing.assert_array_almost_equal(bloch, desired_simple)
329
329
 
330
330
 
331
- def test_bloch_vector_equal_sqrt3():
331
+ def test_bloch_vector_equal_sqrt3() -> None:
332
332
  sqrt3 = 1 / np.sqrt(3)
333
333
  test_state = np.array([0.888074, 0.325058 + 0.325058j])
334
334
  bloch = cirq.bloch_vector_from_state_vector(test_state, 0)
@@ -337,7 +337,7 @@ def test_bloch_vector_equal_sqrt3():
337
337
  np.testing.assert_array_almost_equal(bloch, desired_simple)
338
338
 
339
339
 
340
- def test_bloch_vector_multi_pure():
340
+ def test_bloch_vector_multi_pure() -> None:
341
341
  plus_plus_state = np.array([0.5, 0.5, 0.5, 0.5])
342
342
 
343
343
  bloch_0 = cirq.bloch_vector_from_state_vector(plus_plus_state, 0)
@@ -348,7 +348,7 @@ def test_bloch_vector_multi_pure():
348
348
  np.testing.assert_array_almost_equal(bloch_0, desired_simple)
349
349
 
350
350
 
351
- def test_bloch_vector_multi_mixed():
351
+ def test_bloch_vector_multi_mixed() -> None:
352
352
  sqrt = np.sqrt(0.5)
353
353
  # Bell state 1/sqrt(2)(|00>+|11>)
354
354
  phi_plus = np.array([sqrt, 0.0, 0.0, sqrt])
@@ -371,7 +371,7 @@ def test_bloch_vector_multi_mixed():
371
371
  np.testing.assert_array_almost_equal(true_mixed_1, bloch_mixed_1)
372
372
 
373
373
 
374
- def test_bloch_vector_multi_big():
374
+ def test_bloch_vector_multi_big() -> None:
375
375
  five_qubit_plus_state = np.array([0.1767767] * 32)
376
376
  desired_simple = np.array([1, 0, 0])
377
377
  for qubit in range(5):
@@ -379,7 +379,7 @@ def test_bloch_vector_multi_big():
379
379
  np.testing.assert_array_almost_equal(bloch_i, desired_simple)
380
380
 
381
381
 
382
- def test_bloch_vector_invalid():
382
+ def test_bloch_vector_invalid() -> None:
383
383
  with pytest.raises(ValueError):
384
384
  _ = cirq.bloch_vector_from_state_vector(np.array([0.5, 0.5, 0.5]), 0)
385
385
  with pytest.raises(IndexError):
@@ -388,7 +388,7 @@ def test_bloch_vector_invalid():
388
388
  _ = cirq.bloch_vector_from_state_vector(np.array([0.5, 0.5, 0.5, 0.5]), 2)
389
389
 
390
390
 
391
- def test_density_matrix_from_state_vector():
391
+ def test_density_matrix_from_state_vector() -> None:
392
392
  test_state = np.array(
393
393
  [
394
394
  0.0 - 0.35355339j,
@@ -428,7 +428,7 @@ def test_density_matrix_from_state_vector():
428
428
  np.testing.assert_array_almost_equal(rho_zero, true_two)
429
429
 
430
430
 
431
- def test_density_matrix_invalid():
431
+ def test_density_matrix_invalid() -> None:
432
432
  bad_state = np.array([0.5, 0.5, 0.5])
433
433
  good_state = np.array([0.5, 0.5, 0.5, 0.5])
434
434
  with pytest.raises(ValueError):
@@ -441,7 +441,7 @@ def test_density_matrix_invalid():
441
441
  _ = cirq.density_matrix_from_state_vector(good_state, [-1])
442
442
 
443
443
 
444
- def test_dirac_notation():
444
+ def test_dirac_notation() -> None:
445
445
  sqrt = np.sqrt(0.5)
446
446
  exp_pi_2 = 0.5 + 0.5j
447
447
  assert_dirac_notation_numpy([0, 0], "0")
@@ -458,7 +458,7 @@ def test_dirac_notation():
458
458
  assert_dirac_notation_python([0.71j, 0.71j], "0.71j|0⟩ + 0.71j|1⟩")
459
459
 
460
460
 
461
- def test_dirac_notation_partial_state():
461
+ def test_dirac_notation_partial_state() -> None:
462
462
  sqrt = np.sqrt(0.5)
463
463
  exp_pi_2 = 0.5 + 0.5j
464
464
  assert_dirac_notation_numpy([1, 0], "|0⟩")
@@ -471,20 +471,20 @@ def test_dirac_notation_partial_state():
471
471
  assert_dirac_notation_python([0, 0, 0, 1], "|11⟩")
472
472
 
473
473
 
474
- def test_dirac_notation_precision():
474
+ def test_dirac_notation_precision() -> None:
475
475
  sqrt = np.sqrt(0.5)
476
476
  assert_dirac_notation_numpy([sqrt, sqrt], "0.7|0⟩ + 0.7|1⟩", decimals=1)
477
477
  assert_dirac_notation_python([sqrt, sqrt], "0.707|0⟩ + 0.707|1⟩", decimals=3)
478
478
 
479
479
 
480
- def test_dirac_notation_invalid():
480
+ def test_dirac_notation_invalid() -> None:
481
481
  with pytest.raises(ValueError, match='state_vector has incorrect size'):
482
- _ = cirq.dirac_notation([0.0, 0.0, 1.0])
482
+ _ = cirq.dirac_notation(np.array([0.0, 0.0, 1.0]))
483
483
  with pytest.raises(ValueError, match='state_vector has incorrect size'):
484
- _ = cirq.dirac_notation([1.0, 1.0], qid_shape=(3,))
484
+ _ = cirq.dirac_notation(np.array([1.0, 1.0]), qid_shape=(3,))
485
485
 
486
486
 
487
- def test_to_valid_state_vector():
487
+ def test_to_valid_state_vector() -> None:
488
488
  with pytest.raises(ValueError, match='Computational basis state is out of range'):
489
489
  cirq.to_valid_state_vector(2, 1)
490
490
  np.testing.assert_almost_equal(
@@ -515,13 +515,13 @@ def test_to_valid_state_vector():
515
515
  assert v[0] == 1
516
516
 
517
517
 
518
- def test_to_valid_state_vector_creates_new_copy():
518
+ def test_to_valid_state_vector_creates_new_copy() -> None:
519
519
  state = np.array([1.0, 0.0, 0.0, 0.0], dtype=np.complex64)
520
520
  out = cirq.to_valid_state_vector(state, 2)
521
521
  assert out is not state
522
522
 
523
523
 
524
- def test_invalid_to_valid_state_vector():
524
+ def test_invalid_to_valid_state_vector() -> None:
525
525
  with pytest.raises(ValueError, match="Please specify"):
526
526
  _ = cirq.to_valid_state_vector(np.array([1]))
527
527
 
@@ -532,9 +532,9 @@ def test_invalid_to_valid_state_vector():
532
532
  with pytest.raises(ValueError):
533
533
  _ = cirq.to_valid_state_vector(5, 2)
534
534
  with pytest.raises(ValueError, match='Invalid quantum state'):
535
- _ = cirq.to_valid_state_vector('0000', 2)
535
+ _ = cirq.to_valid_state_vector('0000', 2) # type: ignore[arg-type]
536
536
  with pytest.raises(ValueError, match='Invalid quantum state'):
537
- _ = cirq.to_valid_state_vector('not an int', 2)
537
+ _ = cirq.to_valid_state_vector('not an int', 2) # type: ignore[arg-type]
538
538
  with pytest.raises(ValueError, match=r'num_qubits != len\(qid_shape\)'):
539
539
  _ = cirq.to_valid_state_vector(0, 5, qid_shape=(1, 2, 3))
540
540
 
@@ -552,7 +552,7 @@ def test_invalid_to_valid_state_vector():
552
552
  _ = cirq.to_valid_state_vector(np.array([1, 0], dtype=np.int64), qid_shape=(2, 1))
553
553
 
554
554
 
555
- def test_validate_normalized_state():
555
+ def test_validate_normalized_state() -> None:
556
556
  cirq.validate_normalized_state_vector(cirq.testing.random_superposition(2), qid_shape=(2,))
557
557
  cirq.validate_normalized_state_vector(
558
558
  np.array([0.5, 0.5, 0.5, 0.5], dtype=np.complex64), qid_shape=(2, 2)
@@ -571,7 +571,7 @@ def test_validate_normalized_state():
571
571
  )
572
572
 
573
573
 
574
- def test_validate_density_matrix():
574
+ def test_validate_density_matrix() -> None:
575
575
  cirq.validate_density_matrix(cirq.testing.random_density_matrix(2), qid_shape=(2,))
576
576
  with pytest.raises(ValueError, match='dtype'):
577
577
  cirq.to_valid_density_matrix(
@@ -589,7 +589,7 @@ def test_validate_density_matrix():
589
589
  )
590
590
 
591
591
 
592
- def test_to_valid_density_matrix_from_density_matrix():
592
+ def test_to_valid_density_matrix_from_density_matrix() -> None:
593
593
  assert_valid_density_matrix(np.array([[1, 0], [0, 0]]))
594
594
  assert_valid_density_matrix(np.array([[0.5, 0], [0, 0.5]]))
595
595
  assert_valid_density_matrix(np.array([[0.5, 0.5], [0.5, 0.5]]))
@@ -615,7 +615,7 @@ def test_to_valid_density_matrix_from_density_matrix():
615
615
  assert_valid_density_matrix(np.diag([0.2, 0.8, 0, 0]), qid_shape=(4,))
616
616
 
617
617
 
618
- def test_to_valid_density_matrix_from_density_matrix_tensor():
618
+ def test_to_valid_density_matrix_from_density_matrix_tensor() -> None:
619
619
  np.testing.assert_almost_equal(
620
620
  cirq.to_valid_density_matrix(
621
621
  cirq.one_hot(shape=(2, 2, 2, 2, 2, 2), dtype=np.complex64), num_qubits=3
@@ -630,19 +630,19 @@ def test_to_valid_density_matrix_from_density_matrix_tensor():
630
630
  )
631
631
 
632
632
 
633
- def test_to_valid_density_matrix_not_square():
633
+ def test_to_valid_density_matrix_not_square() -> None:
634
634
  with pytest.raises(ValueError, match='shape'):
635
635
  cirq.to_valid_density_matrix(np.array([[1], [0]]), num_qubits=1)
636
636
 
637
637
 
638
- def test_to_valid_density_matrix_size_mismatch_num_qubits():
638
+ def test_to_valid_density_matrix_size_mismatch_num_qubits() -> None:
639
639
  with pytest.raises(ValueError, match='shape'):
640
640
  cirq.to_valid_density_matrix(np.array([[[1, 0], [0, 0]], [[0, 0], [0, 0]]]), num_qubits=2)
641
641
  with pytest.raises(ValueError, match='shape'):
642
642
  cirq.to_valid_density_matrix(np.eye(4) / 4.0, num_qubits=1)
643
643
 
644
644
 
645
- def test_to_valid_density_matrix_not_hermitian():
645
+ def test_to_valid_density_matrix_not_hermitian() -> None:
646
646
  with pytest.raises(ValueError, match='hermitian'):
647
647
  cirq.to_valid_density_matrix(np.array([[0.5, 0.5j], [0.5, 0.5j]]), num_qubits=1)
648
648
  with pytest.raises(ValueError, match='hermitian'):
@@ -654,7 +654,7 @@ def test_to_valid_density_matrix_not_hermitian():
654
654
  )
655
655
 
656
656
 
657
- def test_to_valid_density_matrix_mismatched_qid_shape():
657
+ def test_to_valid_density_matrix_mismatched_qid_shape() -> None:
658
658
  with pytest.raises(ValueError, match=r'num_qubits != len\(qid_shape\)'):
659
659
  cirq.to_valid_density_matrix(np.eye(4) / 4, num_qubits=1, qid_shape=(2, 2))
660
660
  with pytest.raises(ValueError, match=r'num_qubits != len\(qid_shape\)'):
@@ -663,28 +663,28 @@ def test_to_valid_density_matrix_mismatched_qid_shape():
663
663
  cirq.to_valid_density_matrix(np.eye(4) / 4)
664
664
 
665
665
 
666
- def test_to_valid_density_matrix_not_unit_trace():
666
+ def test_to_valid_density_matrix_not_unit_trace() -> None:
667
667
  with pytest.raises(ValueError, match='trace 1'):
668
668
  cirq.to_valid_density_matrix(np.array([[1, 0], [0, -0.1]]), num_qubits=1)
669
669
  with pytest.raises(ValueError, match='trace 1'):
670
670
  cirq.to_valid_density_matrix(np.zeros([2, 2]), num_qubits=1)
671
671
 
672
672
 
673
- def test_to_valid_density_matrix_not_positive_semidefinite():
673
+ def test_to_valid_density_matrix_not_positive_semidefinite() -> None:
674
674
  with pytest.raises(ValueError, match='positive semidefinite'):
675
675
  cirq.to_valid_density_matrix(
676
676
  np.array([[0.6, 0.5], [0.5, 0.4]], dtype=np.complex64), num_qubits=1
677
677
  )
678
678
 
679
679
 
680
- def test_to_valid_density_matrix_wrong_dtype():
680
+ def test_to_valid_density_matrix_wrong_dtype() -> None:
681
681
  with pytest.raises(ValueError, match='dtype'):
682
682
  cirq.to_valid_density_matrix(
683
683
  np.array([[1, 0], [0, 0]], dtype=np.complex64), num_qubits=1, dtype=np.complex128
684
684
  )
685
685
 
686
686
 
687
- def test_to_valid_density_matrix_from_state_vector():
687
+ def test_to_valid_density_matrix_from_state_vector() -> None:
688
688
  np.testing.assert_almost_equal(
689
689
  cirq.to_valid_density_matrix(
690
690
  density_matrix_rep=np.array([1, 0], dtype=np.complex64), num_qubits=1
@@ -713,7 +713,7 @@ def test_to_valid_density_matrix_from_state_vector():
713
713
  )
714
714
 
715
715
 
716
- def test_to_valid_density_matrix_from_state_vector_tensor():
716
+ def test_to_valid_density_matrix_from_state_vector_tensor() -> None:
717
717
  np.testing.assert_almost_equal(
718
718
  cirq.to_valid_density_matrix(
719
719
  density_matrix_rep=np.array(np.full((2, 2), 0.5), dtype=np.complex64), num_qubits=2
@@ -722,12 +722,12 @@ def test_to_valid_density_matrix_from_state_vector_tensor():
722
722
  )
723
723
 
724
724
 
725
- def test_to_valid_density_matrix_from_state_invalid_state():
725
+ def test_to_valid_density_matrix_from_state_invalid_state() -> None:
726
726
  with pytest.raises(ValueError, match="Invalid quantum state"):
727
727
  cirq.to_valid_density_matrix(np.array([1, 0, 0]), num_qubits=2)
728
728
 
729
729
 
730
- def test_to_valid_density_matrix_from_computational_basis():
730
+ def test_to_valid_density_matrix_from_computational_basis() -> None:
731
731
  np.testing.assert_almost_equal(
732
732
  cirq.to_valid_density_matrix(density_matrix_rep=0, num_qubits=1), np.array([[1, 0], [0, 0]])
733
733
  )
@@ -743,12 +743,12 @@ def test_to_valid_density_matrix_from_computational_basis():
743
743
  )
744
744
 
745
745
 
746
- def test_to_valid_density_matrix_from_state_invalid_computational_basis():
746
+ def test_to_valid_density_matrix_from_state_invalid_computational_basis() -> None:
747
747
  with pytest.raises(ValueError, match="out of range"):
748
748
  cirq.to_valid_density_matrix(-1, num_qubits=2)
749
749
 
750
750
 
751
- def test_one_hot():
751
+ def test_one_hot() -> None:
752
752
  result = cirq.one_hot(shape=4, dtype=np.int32)
753
753
  assert result.dtype == np.int32
754
754
  np.testing.assert_array_equal(result, [1, 0, 0, 0])
@@ -766,7 +766,7 @@ def test_one_hot():
766
766
  )
767
767
 
768
768
 
769
- def test_eye_tensor():
769
+ def test_eye_tensor() -> None:
770
770
  assert np.all(cirq.eye_tensor((), dtype=int) == np.array(1))
771
771
  assert np.all(cirq.eye_tensor((1,), dtype=int) == np.array([[1]]))
772
772
  assert np.all(cirq.eye_tensor((2,), dtype=int) == np.array([[1, 0], [0, 1]])) # yapf: disable
@@ -14,8 +14,9 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
+ from collections.abc import Sequence
17
18
  from copy import copy, deepcopy
18
- from typing import Any, Generic, Sequence, TYPE_CHECKING
19
+ from typing import Any, Generic, TYPE_CHECKING
19
20
 
20
21
  import numpy as np
21
22
 
@@ -77,7 +78,7 @@ class ClassicalBasisSimState(SimulationState[ClassicalBasisState]):
77
78
 
78
79
  def __init__(
79
80
  self,
80
- initial_state: int | list[int] = 0,
81
+ initial_state: int | Sequence[int] = 0,
81
82
  qubits: Sequence[cirq.Qid] | None = None,
82
83
  classical_data: cirq.ClassicalDataStore | None = None,
83
84
  ):
@@ -85,25 +86,32 @@ class ClassicalBasisSimState(SimulationState[ClassicalBasisState]):
85
86
 
86
87
  Args:
87
88
  qubits: The qubits to simulate.
88
- initial_state: The initial state for the simulation.
89
+ initial_state: The initial state for the simulation. Accepts int or Sequence[int].
89
90
  classical_data: The classical data container for the simulation.
90
91
 
91
92
  Raises:
92
93
  ValueError: If qubits not provided and initial_state is int.
93
- If initial_state is not an int, list[int], or np.ndarray.
94
+ If initial_state is not an int or Sequence[int].
95
+ If initial_state is a np.ndarray and its shape is not 1-dimensional.
94
96
 
95
97
  An initial_state value of type integer is parsed in big endian order.
96
98
  """
97
99
  if isinstance(initial_state, int):
98
100
  if qubits is None:
99
- raise ValueError('qubits must be provided if initial_state is not list[int]')
101
+ raise ValueError('qubits must be provided if initial_state is not Sequence[int]')
100
102
  state = ClassicalBasisState(
101
103
  big_endian_int_to_bits(initial_state, bit_count=len(qubits))
102
104
  )
103
- elif isinstance(initial_state, (list, np.ndarray)):
104
- state = ClassicalBasisState(initial_state)
105
+ elif isinstance(initial_state, np.ndarray):
106
+ if initial_state.ndim != 1:
107
+ raise ValueError(
108
+ f'initial_state must be 1-dimensional, got shape {initial_state.shape}'
109
+ )
110
+ state = ClassicalBasisState(list(initial_state))
111
+ elif isinstance(initial_state, Sequence) and not isinstance(initial_state, (str, bytes)):
112
+ state = ClassicalBasisState(list(initial_state))
105
113
  else:
106
- raise ValueError('initial_state must be an int or list[int] or np.ndarray')
114
+ raise ValueError('initial_state must be an int or Sequence[int]')
107
115
  super().__init__(state=state, qubits=qubits, classical_data=classical_data)
108
116
 
109
117
  def _act_on_fallback_(self, action, qubits: Sequence[cirq.Qid], allow_decompose: bool = True):
@@ -118,12 +126,9 @@ class ClassicalBasisSimState(SimulationState[ClassicalBasisState]):
118
126
  True if the operation was applied successfully.
119
127
 
120
128
  Raises:
121
- ValueError: If initial_state shape for type np.ndarray is not equal to 1.
122
- If gate is not one of X, SWAP, a controlled version of X or SWAP,
123
- or a measurement.
129
+ ValueError: If gate is not one of X, SWAP, QubitPermutationGate, a controlled version
130
+ of X or SWAP, or a measurement.
124
131
  """
125
- if isinstance(self._state.basis, np.ndarray) and len(self._state.basis.shape) != 1:
126
- raise ValueError('initial_state shape for type np.ndarray is not equal to 1')
127
132
  gate = action.gate if isinstance(action, ops.Operation) else action
128
133
  mapped_qubits = [self.qubit_map[i] for i in qubits]
129
134
 
@@ -152,9 +157,15 @@ class ClassicalBasisSimState(SimulationState[ClassicalBasisState]):
152
157
  elif gate == ops.TOFFOLI:
153
158
  c1, c2, q = mapped_qubits
154
159
  self._state.basis[q] ^= self._state.basis[c1] & self._state.basis[c2]
160
+ elif isinstance(gate, ops.QubitPermutationGate):
161
+ perm = gate.permutation
162
+ basis = self._state.basis
163
+ original_values = [basis[q] for q in mapped_qubits]
164
+ for i, q in enumerate(mapped_qubits):
165
+ basis[perm[i]] = original_values[i]
155
166
  else:
156
167
  raise ValueError(
157
- f'{gate} is not one of X, SWAP; a controlled version '
168
+ f'{gate} is not one of X, SWAP, QubitPermutationGate; a controlled version '
158
169
  'of X or SWAP; or a measurement'
159
170
  )
160
171
  return True