qiskit 1.1.2__cp38-abi3-win32.whl → 1.2.0__cp38-abi3-win32.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 (343) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +27 -24
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/_numpy_compat.py +1 -1
  5. qiskit/assembler/assemble_circuits.py +107 -64
  6. qiskit/assembler/assemble_schedules.py +5 -12
  7. qiskit/assembler/disassemble.py +10 -1
  8. qiskit/circuit/__init__.py +6 -3
  9. qiskit/circuit/_classical_resource_map.py +5 -5
  10. qiskit/circuit/_utils.py +0 -13
  11. qiskit/circuit/add_control.py +1 -1
  12. qiskit/circuit/annotated_operation.py +23 -1
  13. qiskit/circuit/classical/expr/expr.py +4 -4
  14. qiskit/circuit/classical/expr/visitors.py +1 -1
  15. qiskit/circuit/classical/types/__init__.py +1 -1
  16. qiskit/circuit/classical/types/types.py +2 -2
  17. qiskit/circuit/classicalfunction/boolean_expression.py +1 -1
  18. qiskit/circuit/classicalfunction/classical_function_visitor.py +5 -5
  19. qiskit/circuit/classicalfunction/utils.py +1 -1
  20. qiskit/circuit/classicalregister.py +1 -1
  21. qiskit/circuit/commutation_checker.py +83 -35
  22. qiskit/circuit/controlflow/_builder_utils.py +1 -1
  23. qiskit/circuit/controlflow/builder.py +10 -6
  24. qiskit/circuit/controlflow/if_else.py +2 -2
  25. qiskit/circuit/controlflow/switch_case.py +1 -1
  26. qiskit/circuit/delay.py +1 -1
  27. qiskit/circuit/duration.py +2 -2
  28. qiskit/circuit/equivalence.py +5 -7
  29. qiskit/circuit/gate.py +11 -8
  30. qiskit/circuit/instruction.py +31 -13
  31. qiskit/circuit/instructionset.py +2 -5
  32. qiskit/circuit/library/__init__.py +2 -1
  33. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +1 -1
  34. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
  35. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +1 -1
  36. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +1 -1
  37. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +3 -3
  38. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +1 -1
  39. qiskit/circuit/library/basis_change/__init__.py +1 -1
  40. qiskit/circuit/library/basis_change/qft.py +40 -6
  41. qiskit/circuit/library/blueprintcircuit.py +3 -5
  42. qiskit/circuit/library/data_preparation/__init__.py +9 -2
  43. qiskit/circuit/library/data_preparation/initializer.py +8 -0
  44. qiskit/circuit/library/data_preparation/state_preparation.py +98 -178
  45. qiskit/circuit/library/generalized_gates/isometry.py +8 -8
  46. qiskit/circuit/library/generalized_gates/linear_function.py +3 -2
  47. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +4 -4
  48. qiskit/circuit/library/generalized_gates/permutation.py +8 -9
  49. qiskit/circuit/library/generalized_gates/uc.py +3 -3
  50. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +2 -2
  51. qiskit/circuit/library/generalized_gates/unitary.py +13 -11
  52. qiskit/circuit/library/graph_state.py +1 -1
  53. qiskit/circuit/library/hamiltonian_gate.py +1 -2
  54. qiskit/circuit/library/hidden_linear_function.py +1 -1
  55. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +3 -2
  56. qiskit/circuit/library/n_local/n_local.py +4 -5
  57. qiskit/circuit/library/n_local/pauli_two_design.py +1 -1
  58. qiskit/circuit/library/n_local/qaoa_ansatz.py +6 -8
  59. qiskit/circuit/library/n_local/two_local.py +1 -1
  60. qiskit/circuit/library/overlap.py +11 -5
  61. qiskit/circuit/library/pauli_evolution.py +7 -3
  62. qiskit/circuit/library/standard_gates/dcx.py +3 -0
  63. qiskit/circuit/library/standard_gates/ecr.py +3 -0
  64. qiskit/circuit/library/standard_gates/global_phase.py +3 -0
  65. qiskit/circuit/library/standard_gates/h.py +13 -5
  66. qiskit/circuit/library/standard_gates/i.py +3 -0
  67. qiskit/circuit/library/standard_gates/iswap.py +3 -0
  68. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +19 -10
  69. qiskit/circuit/library/standard_gates/p.py +14 -9
  70. qiskit/circuit/library/standard_gates/r.py +3 -0
  71. qiskit/circuit/library/standard_gates/rx.py +21 -6
  72. qiskit/circuit/library/standard_gates/rxx.py +40 -1
  73. qiskit/circuit/library/standard_gates/ry.py +21 -6
  74. qiskit/circuit/library/standard_gates/ryy.py +40 -1
  75. qiskit/circuit/library/standard_gates/rz.py +22 -6
  76. qiskit/circuit/library/standard_gates/rzx.py +40 -1
  77. qiskit/circuit/library/standard_gates/rzz.py +41 -2
  78. qiskit/circuit/library/standard_gates/s.py +77 -0
  79. qiskit/circuit/library/standard_gates/swap.py +12 -5
  80. qiskit/circuit/library/standard_gates/sx.py +14 -5
  81. qiskit/circuit/library/standard_gates/t.py +5 -0
  82. qiskit/circuit/library/standard_gates/u.py +22 -7
  83. qiskit/circuit/library/standard_gates/u1.py +8 -3
  84. qiskit/circuit/library/standard_gates/u2.py +3 -0
  85. qiskit/circuit/library/standard_gates/u3.py +22 -7
  86. qiskit/circuit/library/standard_gates/x.py +156 -92
  87. qiskit/circuit/library/standard_gates/xx_minus_yy.py +40 -1
  88. qiskit/circuit/library/standard_gates/xx_plus_yy.py +52 -11
  89. qiskit/circuit/library/standard_gates/y.py +6 -1
  90. qiskit/circuit/library/standard_gates/z.py +8 -1
  91. qiskit/circuit/operation.py +1 -1
  92. qiskit/circuit/parameter.py +9 -10
  93. qiskit/circuit/parameterexpression.py +16 -13
  94. qiskit/circuit/parametertable.py +1 -190
  95. qiskit/circuit/parametervector.py +1 -1
  96. qiskit/circuit/quantumcircuit.py +395 -387
  97. qiskit/circuit/quantumcircuitdata.py +3 -5
  98. qiskit/circuit/quantumregister.py +1 -1
  99. qiskit/circuit/random/__init__.py +1 -1
  100. qiskit/circuit/random/utils.py +175 -26
  101. qiskit/circuit/register.py +5 -7
  102. qiskit/circuit/singleton.py +3 -3
  103. qiskit/circuit/tools/pi_check.py +4 -4
  104. qiskit/compiler/assembler.py +95 -24
  105. qiskit/compiler/scheduler.py +2 -2
  106. qiskit/compiler/transpiler.py +42 -128
  107. qiskit/converters/circuit_to_dag.py +4 -6
  108. qiskit/converters/circuit_to_gate.py +4 -8
  109. qiskit/converters/circuit_to_instruction.py +5 -17
  110. qiskit/converters/dag_to_circuit.py +2 -6
  111. qiskit/dagcircuit/collect_blocks.py +2 -2
  112. qiskit/dagcircuit/dagcircuit.py +190 -187
  113. qiskit/dagcircuit/dagdependency.py +4 -4
  114. qiskit/dagcircuit/dagdependency_v2.py +4 -4
  115. qiskit/dagcircuit/dagdepnode.py +1 -1
  116. qiskit/dagcircuit/dagnode.py +66 -157
  117. qiskit/passmanager/flow_controllers.py +1 -1
  118. qiskit/passmanager/passmanager.py +3 -3
  119. qiskit/primitives/__init__.py +1 -5
  120. qiskit/primitives/backend_estimator.py +25 -15
  121. qiskit/primitives/backend_estimator_v2.py +31 -7
  122. qiskit/primitives/backend_sampler.py +21 -12
  123. qiskit/primitives/backend_sampler_v2.py +12 -3
  124. qiskit/primitives/base/base_estimator.py +31 -4
  125. qiskit/primitives/base/base_primitive.py +2 -2
  126. qiskit/primitives/base/base_result.py +2 -2
  127. qiskit/primitives/base/base_sampler.py +26 -2
  128. qiskit/primitives/base/estimator_result.py +2 -2
  129. qiskit/primitives/base/sampler_result.py +2 -2
  130. qiskit/primitives/containers/__init__.py +0 -1
  131. qiskit/primitives/containers/bindings_array.py +2 -2
  132. qiskit/primitives/containers/bit_array.py +108 -10
  133. qiskit/primitives/containers/shape.py +3 -3
  134. qiskit/primitives/estimator.py +9 -2
  135. qiskit/primitives/primitive_job.py +1 -1
  136. qiskit/primitives/sampler.py +10 -3
  137. qiskit/primitives/statevector_estimator.py +5 -3
  138. qiskit/primitives/statevector_sampler.py +11 -5
  139. qiskit/primitives/utils.py +16 -0
  140. qiskit/providers/backend.py +15 -6
  141. qiskit/providers/backend_compat.py +7 -4
  142. qiskit/providers/basic_provider/basic_provider_tools.py +1 -1
  143. qiskit/providers/basic_provider/basic_simulator.py +33 -25
  144. qiskit/providers/fake_provider/fake_backend.py +10 -3
  145. qiskit/providers/fake_provider/fake_openpulse_2q.py +157 -149
  146. qiskit/providers/fake_provider/fake_openpulse_3q.py +228 -220
  147. qiskit/providers/fake_provider/fake_pulse_backend.py +2 -1
  148. qiskit/providers/fake_provider/fake_qasm_backend.py +7 -2
  149. qiskit/providers/fake_provider/generic_backend_v2.py +514 -68
  150. qiskit/providers/models/__init__.py +48 -11
  151. qiskit/providers/models/backendconfiguration.py +50 -4
  152. qiskit/providers/models/backendproperties.py +13 -2
  153. qiskit/providers/models/pulsedefaults.py +10 -11
  154. qiskit/providers/options.py +13 -13
  155. qiskit/providers/providerutils.py +3 -1
  156. qiskit/pulse/configuration.py +8 -12
  157. qiskit/pulse/instruction_schedule_map.py +3 -5
  158. qiskit/pulse/instructions/acquire.py +7 -8
  159. qiskit/pulse/instructions/instruction.py +2 -3
  160. qiskit/pulse/library/samplers/decorators.py +5 -9
  161. qiskit/pulse/library/symbolic_pulses.py +4 -7
  162. qiskit/pulse/library/waveform.py +2 -5
  163. qiskit/pulse/macros.py +11 -6
  164. qiskit/pulse/parser.py +8 -10
  165. qiskit/pulse/schedule.py +9 -17
  166. qiskit/pulse/transforms/alignments.py +1 -3
  167. qiskit/pulse/utils.py +1 -2
  168. qiskit/qasm/libs/stdgates.inc +35 -28
  169. qiskit/qasm2/__init__.py +7 -7
  170. qiskit/qasm2/export.py +5 -9
  171. qiskit/qasm2/parse.py +1 -1
  172. qiskit/qasm3/ast.py +9 -25
  173. qiskit/qasm3/exporter.py +582 -479
  174. qiskit/qasm3/printer.py +7 -16
  175. qiskit/qobj/common.py +10 -0
  176. qiskit/qobj/converters/lo_config.py +9 -0
  177. qiskit/qobj/converters/pulse_instruction.py +13 -6
  178. qiskit/qobj/pulse_qobj.py +69 -15
  179. qiskit/qobj/qasm_qobj.py +72 -20
  180. qiskit/qobj/utils.py +9 -0
  181. qiskit/qpy/__init__.py +1 -1
  182. qiskit/qpy/binary_io/circuits.py +8 -5
  183. qiskit/qpy/binary_io/schedules.py +1 -1
  184. qiskit/qpy/binary_io/value.py +3 -3
  185. qiskit/qpy/interface.py +3 -2
  186. qiskit/qpy/type_keys.py +2 -2
  187. qiskit/quantum_info/operators/channel/quantum_channel.py +3 -6
  188. qiskit/quantum_info/operators/channel/superop.py +2 -2
  189. qiskit/quantum_info/operators/channel/transformations.py +1 -1
  190. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -4
  191. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +1 -3
  192. qiskit/quantum_info/operators/dihedral/random.py +6 -3
  193. qiskit/quantum_info/operators/measures.py +2 -2
  194. qiskit/quantum_info/operators/op_shape.py +12 -20
  195. qiskit/quantum_info/operators/operator.py +14 -21
  196. qiskit/quantum_info/operators/predicates.py +1 -0
  197. qiskit/quantum_info/operators/symplectic/base_pauli.py +7 -11
  198. qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
  199. qiskit/quantum_info/operators/symplectic/pauli.py +3 -3
  200. qiskit/quantum_info/operators/symplectic/pauli_list.py +9 -10
  201. qiskit/quantum_info/operators/symplectic/random.py +1 -1
  202. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +15 -17
  203. qiskit/quantum_info/quaternion.py +1 -1
  204. qiskit/quantum_info/states/densitymatrix.py +5 -8
  205. qiskit/quantum_info/states/stabilizerstate.py +128 -37
  206. qiskit/quantum_info/states/statevector.py +4 -8
  207. qiskit/result/counts.py +2 -2
  208. qiskit/result/mitigation/correlated_readout_mitigator.py +2 -2
  209. qiskit/result/mitigation/local_readout_mitigator.py +2 -2
  210. qiskit/result/mitigation/utils.py +1 -3
  211. qiskit/result/models.py +17 -16
  212. qiskit/result/result.py +15 -20
  213. qiskit/scheduler/lowering.py +2 -2
  214. qiskit/synthesis/__init__.py +2 -1
  215. qiskit/synthesis/clifford/__init__.py +1 -1
  216. qiskit/synthesis/clifford/clifford_decompose_ag.py +2 -2
  217. qiskit/synthesis/clifford/clifford_decompose_bm.py +10 -240
  218. qiskit/synthesis/clifford/clifford_decompose_greedy.py +9 -303
  219. qiskit/synthesis/clifford/clifford_decompose_layers.py +25 -23
  220. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +1 -1
  221. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +1 -1
  222. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +1 -1
  223. qiskit/synthesis/discrete_basis/solovay_kitaev.py +2 -2
  224. qiskit/synthesis/evolution/evolution_synthesis.py +4 -2
  225. qiskit/synthesis/evolution/lie_trotter.py +46 -19
  226. qiskit/synthesis/evolution/product_formula.py +111 -55
  227. qiskit/synthesis/evolution/qdrift.py +40 -10
  228. qiskit/synthesis/evolution/suzuki_trotter.py +43 -33
  229. qiskit/synthesis/linear/__init__.py +1 -0
  230. qiskit/synthesis/linear/cnot_synth.py +22 -96
  231. qiskit/synthesis/linear/linear_depth_lnn.py +8 -8
  232. qiskit/synthesis/linear/linear_matrix_utils.py +13 -161
  233. qiskit/synthesis/linear_phase/cnot_phase_synth.py +1 -1
  234. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +3 -3
  235. qiskit/synthesis/linear_phase/cz_depth_lnn.py +1 -1
  236. qiskit/synthesis/one_qubit/one_qubit_decompose.py +29 -29
  237. qiskit/synthesis/permutation/permutation_full.py +5 -29
  238. qiskit/synthesis/permutation/permutation_lnn.py +2 -24
  239. qiskit/synthesis/permutation/permutation_utils.py +2 -59
  240. qiskit/synthesis/qft/__init__.py +1 -0
  241. qiskit/synthesis/qft/qft_decompose_full.py +79 -0
  242. qiskit/synthesis/qft/qft_decompose_lnn.py +17 -9
  243. qiskit/synthesis/stabilizer/stabilizer_circuit.py +6 -6
  244. qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -2
  245. qiskit/synthesis/two_qubit/local_invariance.py +8 -38
  246. qiskit/synthesis/two_qubit/two_qubit_decompose.py +48 -129
  247. qiskit/synthesis/unitary/aqc/cnot_structures.py +1 -1
  248. qiskit/synthesis/unitary/qsd.py +5 -3
  249. qiskit/transpiler/__init__.py +1 -0
  250. qiskit/transpiler/basepasses.py +1 -1
  251. qiskit/transpiler/coupling.py +3 -3
  252. qiskit/transpiler/instruction_durations.py +1 -2
  253. qiskit/transpiler/layout.py +3 -3
  254. qiskit/transpiler/passes/__init__.py +2 -0
  255. qiskit/transpiler/passes/basis/basis_translator.py +84 -64
  256. qiskit/transpiler/passes/basis/translate_parameterized.py +3 -5
  257. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  258. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +10 -10
  259. qiskit/transpiler/passes/calibration/rx_builder.py +3 -3
  260. qiskit/transpiler/passes/calibration/rzx_builder.py +3 -3
  261. qiskit/transpiler/passes/layout/apply_layout.py +13 -3
  262. qiskit/transpiler/passes/layout/sabre_layout.py +10 -8
  263. qiskit/transpiler/passes/layout/sabre_pre_layout.py +4 -1
  264. qiskit/transpiler/passes/layout/set_layout.py +2 -2
  265. qiskit/transpiler/passes/layout/vf2_layout.py +1 -1
  266. qiskit/transpiler/passes/layout/vf2_utils.py +3 -3
  267. qiskit/transpiler/passes/optimization/__init__.py +1 -0
  268. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
  269. qiskit/transpiler/passes/optimization/commutation_analysis.py +7 -10
  270. qiskit/transpiler/passes/optimization/commutative_cancellation.py +35 -19
  271. qiskit/transpiler/passes/optimization/consolidate_blocks.py +17 -8
  272. qiskit/transpiler/passes/optimization/inverse_cancellation.py +6 -6
  273. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +64 -41
  274. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
  275. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +83 -0
  276. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +1 -1
  277. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +2 -2
  278. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -1
  279. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -2
  280. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
  281. qiskit/transpiler/passes/routing/layout_transformation.py +2 -1
  282. qiskit/transpiler/passes/routing/sabre_swap.py +35 -26
  283. qiskit/transpiler/passes/routing/star_prerouting.py +80 -105
  284. qiskit/transpiler/passes/routing/stochastic_swap.py +1 -3
  285. qiskit/transpiler/passes/scheduling/alap.py +1 -2
  286. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -2
  287. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
  288. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -2
  289. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +1 -1
  290. qiskit/transpiler/passes/scheduling/asap.py +1 -2
  291. qiskit/transpiler/passes/scheduling/base_scheduler.py +5 -5
  292. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +3 -3
  293. qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
  294. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -14
  295. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +7 -6
  296. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -3
  297. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +211 -36
  298. qiskit/transpiler/passes/synthesis/plugin.py +2 -2
  299. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +80 -40
  300. qiskit/transpiler/passes/utils/__init__.py +0 -1
  301. qiskit/transpiler/passes/utils/check_gate_direction.py +4 -4
  302. qiskit/transpiler/passes/utils/check_map.py +3 -6
  303. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +3 -4
  304. qiskit/transpiler/passes/utils/error.py +2 -2
  305. qiskit/transpiler/passes/utils/fixed_point.py +3 -3
  306. qiskit/transpiler/passes/utils/gate_direction.py +1 -1
  307. qiskit/transpiler/passes/utils/gates_basis.py +1 -2
  308. qiskit/transpiler/passmanager.py +7 -6
  309. qiskit/transpiler/preset_passmanagers/__init__.py +4 -228
  310. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +73 -18
  311. qiskit/transpiler/preset_passmanagers/common.py +3 -6
  312. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +518 -0
  313. qiskit/transpiler/preset_passmanagers/level0.py +1 -1
  314. qiskit/transpiler/target.py +27 -8
  315. qiskit/user_config.py +29 -6
  316. qiskit/utils/classtools.py +3 -3
  317. qiskit/utils/deprecation.py +3 -2
  318. qiskit/utils/lazy_tester.py +2 -2
  319. qiskit/utils/optionals.py +8 -8
  320. qiskit/visualization/bloch.py +18 -23
  321. qiskit/visualization/circuit/_utils.py +34 -10
  322. qiskit/visualization/circuit/circuit_visualization.py +23 -16
  323. qiskit/visualization/circuit/latex.py +29 -27
  324. qiskit/visualization/circuit/matplotlib.py +4 -2
  325. qiskit/visualization/circuit/qcstyle.py +2 -2
  326. qiskit/visualization/circuit/text.py +9 -15
  327. qiskit/visualization/dag_visualization.py +2 -2
  328. qiskit/visualization/pulse_v2/core.py +1 -1
  329. qiskit/visualization/pulse_v2/events.py +1 -1
  330. qiskit/visualization/pulse_v2/generators/frame.py +3 -4
  331. qiskit/visualization/pulse_v2/generators/waveform.py +5 -9
  332. qiskit/visualization/pulse_v2/layouts.py +1 -5
  333. qiskit/visualization/pulse_v2/plotters/matplotlib.py +1 -2
  334. qiskit/visualization/state_visualization.py +5 -6
  335. qiskit/visualization/timeline/plotters/matplotlib.py +1 -2
  336. qiskit/visualization/transition_visualization.py +7 -2
  337. {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/METADATA +12 -12
  338. {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/RECORD +342 -340
  339. {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/entry_points.txt +3 -0
  340. qiskit/transpiler/passes/utils/block_to_matrix.py +0 -47
  341. {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/LICENSE.txt +0 -0
  342. {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/WHEEL +0 -0
  343. {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/top_level.txt +0 -0
@@ -155,7 +155,7 @@ class BackendSamplerV2(BaseSamplerV2):
155
155
  # reconstruct the result of pubs
156
156
  for i, pub_result in zip(lst, pub_results):
157
157
  results[i] = pub_result
158
- return PrimitiveResult(results)
158
+ return PrimitiveResult(results, metadata={"version": 2})
159
159
 
160
160
  def _run_pubs(self, pubs: list[SamplerPub], shots: int) -> list[SamplerPubResult]:
161
161
  """Compute results for pubs that all require the same value of ``shots``."""
@@ -183,7 +183,12 @@ class BackendSamplerV2(BaseSamplerV2):
183
183
  end = start + bound.size
184
184
  results.append(
185
185
  self._postprocess_pub(
186
- result_memory[start:end], shots, bound.shape, meas_info, max_num_bytes
186
+ result_memory[start:end],
187
+ shots,
188
+ bound.shape,
189
+ meas_info,
190
+ max_num_bytes,
191
+ pub.circuit.metadata,
187
192
  )
188
193
  )
189
194
  start = end
@@ -197,6 +202,7 @@ class BackendSamplerV2(BaseSamplerV2):
197
202
  shape: tuple[int, ...],
198
203
  meas_info: list[_MeasureInfo],
199
204
  max_num_bytes: int,
205
+ circuit_metadata: dict,
200
206
  ) -> SamplerPubResult:
201
207
  """Converts the memory data into an array of bit arrays with the shape of the pub."""
202
208
  arrays = {
@@ -213,7 +219,10 @@ class BackendSamplerV2(BaseSamplerV2):
213
219
  meas = {
214
220
  item.creg_name: BitArray(arrays[item.creg_name], item.num_bits) for item in meas_info
215
221
  }
216
- return SamplerPubResult(DataBin(**meas, shape=shape), metadata={})
222
+ return SamplerPubResult(
223
+ DataBin(**meas, shape=shape),
224
+ metadata={"shots": shots, "circuit_metadata": circuit_metadata},
225
+ )
217
226
 
218
227
 
219
228
  def _analyze_circuit(circuit: QuantumCircuit) -> tuple[list[_MeasureInfo], int]:
@@ -10,7 +10,7 @@
10
10
  # copyright notice, and modified files need to carry a notice indicating
11
11
  # that they have been altered from the originals.
12
12
 
13
- r"""Base Estimator Classes"""
13
+ """Base Estimator V1 and V2 classes"""
14
14
 
15
15
  from __future__ import annotations
16
16
 
@@ -23,6 +23,7 @@ from qiskit.circuit import QuantumCircuit
23
23
  from qiskit.providers import JobV1 as Job
24
24
  from qiskit.quantum_info.operators import SparsePauliOp
25
25
  from qiskit.quantum_info.operators.base_operator import BaseOperator
26
+ from qiskit.utils.deprecation import deprecate_func
26
27
 
27
28
  from ..containers import (
28
29
  DataBin,
@@ -109,7 +110,7 @@ class BaseEstimatorV1(BasePrimitive, Generic[T]):
109
110
  options: dict | None = None,
110
111
  ):
111
112
  """
112
- Creating an instance of an Estimator, or using one in a ``with`` context opens a session that
113
+ Creating an instance of an Estimator V1, or using one in a ``with`` context opens a session that
113
114
  holds resources until the instance is ``close()`` ed or the context is exited.
114
115
 
115
116
  Args:
@@ -187,7 +188,33 @@ class BaseEstimatorV1(BasePrimitive, Generic[T]):
187
188
  raise NotImplementedError("The subclass of BaseEstimator must implement `_run` method.")
188
189
 
189
190
 
190
- BaseEstimator = BaseEstimatorV1
191
+ class BaseEstimator(BaseEstimatorV1[T]):
192
+ """DEPRECATED. Type alias for Estimator V1 base class.
193
+
194
+ See :class:`.BaseEstimatorV1` for details.
195
+ """
196
+
197
+ @deprecate_func(
198
+ since="1.2",
199
+ additional_msg="The `BaseEstimator` class is a type alias for the `BaseEstimatorV1` "
200
+ "interface that has been deprecated in favor of explicitly versioned interface classes. "
201
+ "It is recommended to migrate all implementations to use `BaseEstimatorV2`. "
202
+ "However, for implementations incompatible with `BaseEstimatorV2`, `BaseEstimator` can "
203
+ "be replaced with the explicitly versioned `BaseEstimatorV1` class.",
204
+ )
205
+ def __init__(
206
+ self,
207
+ *,
208
+ options: dict | None = None,
209
+ ):
210
+ """
211
+ Creating an instance of an Estimator, or using one in a ``with`` context opens a session that
212
+ holds resources until the instance is ``close()`` ed or the context is exited.
213
+
214
+ Args:
215
+ options: Default options.
216
+ """
217
+ super().__init__(options=options)
191
218
 
192
219
 
193
220
  class BaseEstimatorV2(ABC):
@@ -203,7 +230,7 @@ class BaseEstimatorV2(ABC):
203
230
 
204
231
  @staticmethod
205
232
  def _make_data_bin(_: EstimatorPub) -> type[DataBin]:
206
- # this method is present for backwards compat. new primitive implementatinos
233
+ # this method is present for backwards compat. new primitive implementations
207
234
  # should avoid it.
208
235
  return DataBin
209
236
 
@@ -10,7 +10,7 @@
10
10
  # copyright notice, and modified files need to carry a notice indicating
11
11
  # that they have been altered from the originals.
12
12
 
13
- """Primitive abstract base class."""
13
+ """Primitive V1 abstract base class."""
14
14
 
15
15
  from __future__ import annotations
16
16
 
@@ -20,7 +20,7 @@ from qiskit.providers import Options
20
20
 
21
21
 
22
22
  class BasePrimitive(ABC):
23
- """Primitive abstract base class."""
23
+ """Primitive V1 abstract base class."""
24
24
 
25
25
  def __init__(self, options: dict | None = None):
26
26
  self._run_options = Options()
@@ -10,7 +10,7 @@
10
10
  # copyright notice, and modified files need to carry a notice indicating
11
11
  # that they have been altered from the originals.
12
12
  """
13
- Primitive result abstract base class
13
+ Primitive V1 result abstract base class
14
14
  """
15
15
 
16
16
  from __future__ import annotations
@@ -27,7 +27,7 @@ ExperimentData = Dict[str, Any]
27
27
 
28
28
  class _BasePrimitiveResult(ABC):
29
29
  """
30
- Base class for deprecated Primitive result methods.
30
+ Base class for deprecated Primitive V1 result methods.
31
31
  """
32
32
 
33
33
  def __post_init__(self) -> None:
@@ -10,7 +10,7 @@
10
10
  # copyright notice, and modified files need to carry a notice indicating
11
11
  # that they have been altered from the originals.
12
12
 
13
- """Base Sampler Classes"""
13
+ """Base Sampler V1 and V2 classes"""
14
14
 
15
15
  from __future__ import annotations
16
16
 
@@ -21,6 +21,7 @@ from typing import Generic, TypeVar
21
21
 
22
22
  from qiskit.circuit import QuantumCircuit
23
23
  from qiskit.providers import JobV1 as Job
24
+ from qiskit.utils.deprecation import deprecate_func
24
25
 
25
26
  from ..containers.primitive_result import PrimitiveResult
26
27
  from ..containers.sampler_pub import SamplerPubLike
@@ -150,7 +151,30 @@ class BaseSamplerV1(BasePrimitive, Generic[T]):
150
151
  raise NotImplementedError("The subclass of BaseSampler must implement `_run` method.")
151
152
 
152
153
 
153
- BaseSampler = BaseSamplerV1
154
+ class BaseSampler(BaseSamplerV1[T]):
155
+ """DEPRECATED. Type alias for Sampler V1 base class
156
+
157
+ See :class:`.BaseSamplerV1` for details.
158
+ """
159
+
160
+ @deprecate_func(
161
+ since="1.2",
162
+ additional_msg="The `BaseSampler` class is a type alias for the `BaseSamplerV1` "
163
+ "interface that has been deprecated in favor of explicitly versioned interface classes. "
164
+ "It is recommended to migrate all implementations to use `BaseSamplerV2`. "
165
+ "However, for implementations incompatible with `BaseSamplerV2`, `BaseSampler` can "
166
+ "be replaced with the explicitly versioned `BaseSamplerV1` class.",
167
+ )
168
+ def __init__(
169
+ self,
170
+ *,
171
+ options: dict | None = None,
172
+ ):
173
+ """
174
+ Args:
175
+ options: Default options.
176
+ """
177
+ super().__init__(options=options)
154
178
 
155
179
 
156
180
  class BaseSamplerV2(ABC):
@@ -10,7 +10,7 @@
10
10
  # copyright notice, and modified files need to carry a notice indicating
11
11
  # that they have been altered from the originals.
12
12
  """
13
- Estimator result class
13
+ Estimator V1 result class
14
14
  """
15
15
 
16
16
  from __future__ import annotations
@@ -26,7 +26,7 @@ if TYPE_CHECKING:
26
26
 
27
27
  @dataclass(frozen=True)
28
28
  class EstimatorResult(_BasePrimitiveResult):
29
- """Result of Estimator.
29
+ """Result of Estimator V1.
30
30
 
31
31
  .. code-block:: python
32
32
 
@@ -10,7 +10,7 @@
10
10
  # copyright notice, and modified files need to carry a notice indicating
11
11
  # that they have been altered from the originals.
12
12
  """
13
- Sampler result class
13
+ Sampler V1 result class
14
14
  """
15
15
 
16
16
  from __future__ import annotations
@@ -25,7 +25,7 @@ from .base_result import _BasePrimitiveResult
25
25
 
26
26
  @dataclass(frozen=True)
27
27
  class SamplerResult(_BasePrimitiveResult):
28
- """Result of Sampler.
28
+ """Result of Sampler V1.
29
29
 
30
30
  .. code-block:: python
31
31
 
@@ -24,4 +24,3 @@ from .primitive_result import PrimitiveResult
24
24
  from .pub_result import PubResult
25
25
  from .sampler_pub import SamplerPubLike
26
26
  from .sampler_pub_result import SamplerPubResult
27
- from .shape import Shaped
@@ -95,7 +95,7 @@ class BindingsArray(ShapedMixin):
95
95
  be inferred from the provided arrays. Ambiguity arises whenever the key of an entry of
96
96
  ``data`` contains only one parameter and the corresponding array's shape ends in a one.
97
97
  In this case, it can't be decided whether that one is an index over parameters, or whether
98
- it should be encorporated in :attr:`~shape`.
98
+ it should be incorporated in :attr:`~shape`.
99
99
 
100
100
  Since :class:`~.Parameter` objects are only allowed to represent float values, this
101
101
  class casts all given values to float. If an incompatible dtype is given, such as complex
@@ -131,7 +131,7 @@ class BindingsArray(ShapedMixin):
131
131
 
132
132
  def __getitem__(self, args) -> BindingsArray:
133
133
  # because the parameters live on the last axis, we don't need to do anything special to
134
- # accomodate them because there will always be an implicit slice(None, None, None)
134
+ # accommodate them because there will always be an implicit slice(None, None, None)
135
135
  # on all unspecified trailing dimensions
136
136
  # separately, we choose to not disallow args which touch the last dimension, even though it
137
137
  # would not be a particularly friendly way to chop parameters
@@ -130,11 +130,15 @@ class BitArray(ShapedMixin):
130
130
  return f"BitArray({desc})"
131
131
 
132
132
  def __getitem__(self, indices):
133
- """Slices the array along an existing axis of the array."""
134
- if isinstance(indices, tuple) and len(indices) >= self.ndim + 2:
135
- raise ValueError(
136
- "BitArrays cannot be sliced along the bits axis, see slice_bits() instead."
137
- )
133
+ if isinstance(indices, tuple):
134
+ if len(indices) == self.ndim + 1:
135
+ raise IndexError(
136
+ "BitArray cannot be sliced along the shots axis, use slice_shots() instead."
137
+ )
138
+ if len(indices) >= self.ndim + 2:
139
+ raise IndexError(
140
+ "BitArray cannot be sliced along the bits axis, use slice_bits() instead."
141
+ )
138
142
  return BitArray(self._array[indices], self.num_bits)
139
143
 
140
144
  @property
@@ -208,7 +212,10 @@ class BitArray(ShapedMixin):
208
212
  if order == "little":
209
213
  # np.unpackbits assumes "big"
210
214
  array = array[..., ::-1]
211
-
215
+ elif order != "big":
216
+ raise ValueError(
217
+ f"unknown value for order: '{order}'. Valid values are 'big' and 'little'."
218
+ )
212
219
  num_bits = array.shape[-1]
213
220
  if remainder := (-num_bits) % 8:
214
221
  # unpackbits pads with zeros on the wrong side with respect to what we want, so
@@ -428,13 +435,13 @@ class BitArray(ShapedMixin):
428
435
  A bit array sliced along the bit axis.
429
436
 
430
437
  Raises:
431
- ValueError: If there are any invalid indices of the bit axis.
438
+ IndexError: If there are any invalid indices of the bit axis.
432
439
  """
433
440
  if isinstance(indices, int):
434
441
  indices = (indices,)
435
442
  for index in indices:
436
443
  if index < 0 or index >= self.num_bits:
437
- raise ValueError(
444
+ raise IndexError(
438
445
  f"index {index} is out of bounds for the number of bits {self.num_bits}."
439
446
  )
440
447
  # This implementation introduces a temporary 8x memory overhead due to bit
@@ -455,19 +462,110 @@ class BitArray(ShapedMixin):
455
462
  A bit array sliced along the shots axis.
456
463
 
457
464
  Raises:
458
- ValueError: If there are any invalid indices of the shots axis.
465
+ IndexError: If there are any invalid indices of the shots axis.
459
466
  """
460
467
  if isinstance(indices, int):
461
468
  indices = (indices,)
462
469
  for index in indices:
463
470
  if index < 0 or index >= self.num_shots:
464
- raise ValueError(
471
+ raise IndexError(
465
472
  f"index {index} is out of bounds for the number of shots {self.num_shots}."
466
473
  )
467
474
  arr = self._array
468
475
  arr = arr[..., indices, :]
469
476
  return BitArray(arr, self.num_bits)
470
477
 
478
+ def postselect(
479
+ self,
480
+ indices: Sequence[int] | int,
481
+ selection: Sequence[bool | int] | bool | int,
482
+ ) -> BitArray:
483
+ """Post-select this bit array based on sliced equality with a given bitstring.
484
+
485
+ .. note::
486
+ If this bit array contains any shape axes, it is first flattened into a long list of shots
487
+ before applying post-selection. This is done because :class:`~BitArray` cannot handle
488
+ ragged numbers of shots across axes.
489
+
490
+ Args:
491
+ indices: A list of the indices of the cbits on which to postselect.
492
+ If this bit array was produced by a sampler, then an index ``i`` corresponds to the
493
+ :class:`~.ClassicalRegister` location ``creg[i]`` (as in :meth:`~slice_bits`).
494
+ Negative indices are allowed.
495
+
496
+ selection: A list of binary values (will be cast to ``bool``) of length matching
497
+ ``indices``, with ``indices[i]`` corresponding to ``selection[i]``. Shots will be
498
+ discarded unless all cbits specified by ``indices`` have the values given by
499
+ ``selection``.
500
+
501
+ Returns:
502
+ A new bit array with ``shape=(), num_bits=data.num_bits, num_shots<=data.num_shots``.
503
+
504
+ Raises:
505
+ IndexError: If ``max(indices)`` is greater than or equal to :attr:`num_bits`.
506
+ IndexError: If ``min(indices)`` is less than negative :attr:`num_bits`.
507
+ ValueError: If the lengths of ``selection`` and ``indices`` do not match.
508
+ """
509
+ if isinstance(indices, int):
510
+ indices = (indices,)
511
+ if isinstance(selection, (bool, int)):
512
+ selection = (selection,)
513
+ selection = np.asarray(selection, dtype=bool)
514
+
515
+ num_indices = len(indices)
516
+
517
+ if len(selection) != num_indices:
518
+ raise ValueError("Lengths of indices and selection do not match.")
519
+
520
+ num_bytes = self._array.shape[-1]
521
+ indices = np.asarray(indices)
522
+
523
+ if num_indices > 0:
524
+ if indices.max() >= self.num_bits:
525
+ raise IndexError(
526
+ f"index {int(indices.max())} out of bounds for the number of bits {self.num_bits}."
527
+ )
528
+ if indices.min() < -self.num_bits:
529
+ raise IndexError(
530
+ f"index {int(indices.min())} out of bounds for the number of bits {self.num_bits}."
531
+ )
532
+
533
+ flattened = self.reshape((), self.size * self.num_shots)
534
+
535
+ # If no conditions, keep all data, but flatten as promised:
536
+ if num_indices == 0:
537
+ return flattened
538
+
539
+ # Make negative bit indices positive:
540
+ indices %= self.num_bits
541
+
542
+ # Handle special-case of contradictory conditions:
543
+ if np.intersect1d(indices[selection], indices[np.logical_not(selection)]).size > 0:
544
+ return BitArray(np.empty((0, num_bytes), dtype=np.uint8), num_bits=self.num_bits)
545
+
546
+ # Recall that creg[0] is the LSb:
547
+ byte_significance, bit_significance = np.divmod(indices, 8)
548
+ # least-significant byte is at last position:
549
+ byte_idx = (num_bytes - 1) - byte_significance
550
+ # least-significant bit is at position 0:
551
+ bit_offset = bit_significance.astype(np.uint8)
552
+
553
+ # Get bitpacked representation of `indices` (bitmask):
554
+ bitmask = np.zeros(num_bytes, dtype=np.uint8)
555
+ np.bitwise_or.at(bitmask, byte_idx, np.uint8(1) << bit_offset)
556
+
557
+ # Get bitpacked representation of `selection` (desired bitstring):
558
+ selection_bytes = np.zeros(num_bytes, dtype=np.uint8)
559
+ ## This assumes no contradictions present, since those were already checked for:
560
+ np.bitwise_or.at(
561
+ selection_bytes, byte_idx, np.asarray(selection, dtype=np.uint8) << bit_offset
562
+ )
563
+
564
+ return BitArray(
565
+ flattened._array[((flattened._array & bitmask) == selection_bytes).all(axis=-1)],
566
+ num_bits=self.num_bits,
567
+ )
568
+
471
569
  def expectation_values(self, observables: ObservablesArrayLike) -> NDArray[np.float64]:
472
570
  """Compute the expectation values of the provided observables, broadcasted against
473
571
  this bit array.
@@ -59,15 +59,15 @@ class ShapedMixin(Shaped):
59
59
  return f"{type(self).__name__}(<{self.shape}>)"
60
60
 
61
61
  @property
62
- def shape(self) -> tuple[int, ...]:
62
+ def shape(self):
63
63
  return self._shape
64
64
 
65
65
  @property
66
- def ndim(self) -> int:
66
+ def ndim(self):
67
67
  return len(self._shape)
68
68
 
69
69
  @property
70
- def size(self) -> int:
70
+ def size(self):
71
71
  return int(np.prod(self._shape, dtype=int))
72
72
 
73
73
 
@@ -10,7 +10,7 @@
10
10
  # copyright notice, and modified files need to carry a notice indicating
11
11
  # that they have been altered from the originals.
12
12
  """
13
- Estimator class
13
+ Estimator V1 reference implementation
14
14
  """
15
15
 
16
16
  from __future__ import annotations
@@ -24,6 +24,7 @@ from qiskit.circuit import QuantumCircuit
24
24
  from qiskit.exceptions import QiskitError
25
25
  from qiskit.quantum_info import Statevector
26
26
  from qiskit.quantum_info.operators.base_operator import BaseOperator
27
+ from qiskit.utils.deprecation import deprecate_func
27
28
 
28
29
  from .base import BaseEstimator, EstimatorResult
29
30
  from .primitive_job import PrimitiveJob
@@ -37,7 +38,7 @@ from .utils import (
37
38
 
38
39
  class Estimator(BaseEstimator[PrimitiveJob[EstimatorResult]]):
39
40
  """
40
- Reference implementation of :class:`BaseEstimator`.
41
+ Reference implementation of :class:`BaseEstimator` (V1).
41
42
 
42
43
  :Run Options:
43
44
 
@@ -51,6 +52,12 @@ class Estimator(BaseEstimator[PrimitiveJob[EstimatorResult]]):
51
52
  this option is ignored.
52
53
  """
53
54
 
55
+ @deprecate_func(
56
+ since="1.2",
57
+ additional_msg="All implementations of the `BaseEstimatorV1` interface "
58
+ "have been deprecated in favor of their V2 counterparts. "
59
+ "The V2 alternative for the `Estimator` class is `StatevectorEstimator`.",
60
+ )
54
61
  def __init__(self, *, options: dict | None = None):
55
62
  """
56
63
  Args:
@@ -10,7 +10,7 @@
10
10
  # copyright notice, and modified files need to carry a notice indicating
11
11
  # that they have been altered from the originals.
12
12
  """
13
- Job implementation for the reference implementations of Primitives.
13
+ Job for the reference implementations of Primitives V1 and V2.
14
14
  """
15
15
 
16
16
  import uuid
@@ -10,7 +10,7 @@
10
10
  # copyright notice, and modified files need to carry a notice indicating
11
11
  # that they have been altered from the originals.
12
12
  """
13
- Sampler class
13
+ Sampler V1 reference implementation
14
14
  """
15
15
 
16
16
  from __future__ import annotations
@@ -24,6 +24,7 @@ from qiskit.circuit import QuantumCircuit
24
24
  from qiskit.exceptions import QiskitError
25
25
  from qiskit.quantum_info import Statevector
26
26
  from qiskit.result import QuasiDistribution
27
+ from qiskit.utils.deprecation import deprecate_func
27
28
 
28
29
  from .base import BaseSampler, SamplerResult
29
30
  from .primitive_job import PrimitiveJob
@@ -37,9 +38,9 @@ from .utils import (
37
38
 
38
39
  class Sampler(BaseSampler[PrimitiveJob[SamplerResult]]):
39
40
  """
40
- Sampler class.
41
+ Sampler V1 class.
41
42
 
42
- :class:`~Sampler` is a reference implementation of :class:`~BaseSampler`.
43
+ :class:`~Sampler` is a reference implementation of :class:`~BaseSampler` (V1).
43
44
 
44
45
  :Run Options:
45
46
 
@@ -52,6 +53,12 @@ class Sampler(BaseSampler[PrimitiveJob[SamplerResult]]):
52
53
  option is ignored.
53
54
  """
54
55
 
56
+ @deprecate_func(
57
+ since="1.2",
58
+ additional_msg="All implementations of the `BaseSamplerV1` interface "
59
+ "have been deprecated in favor of their V2 counterparts. "
60
+ "The V2 alternative for the `Sampler` class is `StatevectorSampler`.",
61
+ )
55
62
  def __init__(self, *, options: dict | None = None):
56
63
  """
57
64
  Args:
@@ -10,7 +10,7 @@
10
10
  # copyright notice, and modified files need to carry a notice indicating
11
11
  # that they have been altered from the originals.
12
12
  """
13
- Estimator class
13
+ Statevector Estimator V2 class
14
14
  """
15
15
 
16
16
  from __future__ import annotations
@@ -136,7 +136,7 @@ class StatevectorEstimator(BaseEstimatorV2):
136
136
  return job
137
137
 
138
138
  def _run(self, pubs: list[EstimatorPub]) -> PrimitiveResult[PubResult]:
139
- return PrimitiveResult([self._run_pub(pub) for pub in pubs])
139
+ return PrimitiveResult([self._run_pub(pub) for pub in pubs], metadata={"version": 2})
140
140
 
141
141
  def _run_pub(self, pub: EstimatorPub) -> PubResult:
142
142
  rng = np.random.default_rng(self._seed)
@@ -162,4 +162,6 @@ class StatevectorEstimator(BaseEstimatorV2):
162
162
  evs[index] = expectation_value
163
163
 
164
164
  data = DataBin(evs=evs, stds=stds, shape=evs.shape)
165
- return PubResult(data, metadata={"precision": precision})
165
+ return PubResult(
166
+ data, metadata={"target_precision": precision, "circuit_metadata": pub.circuit.metadata}
167
+ )
@@ -10,7 +10,7 @@
10
10
  # copyright notice, and modified files need to carry a notice indicating
11
11
  # that they have been altered from the originals.
12
12
  """
13
- Statevector Sampler class
13
+ Statevector Sampler V2 class
14
14
  """
15
15
 
16
16
  from __future__ import annotations
@@ -171,7 +171,7 @@ class StatevectorSampler(BaseSamplerV2):
171
171
 
172
172
  def _run(self, pubs: Iterable[SamplerPub]) -> PrimitiveResult[SamplerPubResult]:
173
173
  results = [self._run_pub(pub) for pub in pubs]
174
- return PrimitiveResult(results)
174
+ return PrimitiveResult(results, metadata={"version": 2})
175
175
 
176
176
  def _run_pub(self, pub: SamplerPub) -> SamplerPubResult:
177
177
  circuit, qargs, meas_info = _preprocess_circuit(pub.circuit)
@@ -197,7 +197,10 @@ class StatevectorSampler(BaseSamplerV2):
197
197
  meas = {
198
198
  item.creg_name: BitArray(arrays[item.creg_name], item.num_bits) for item in meas_info
199
199
  }
200
- return SamplerPubResult(DataBin(**meas, shape=pub.shape), metadata={"shots": pub.shots})
200
+ return SamplerPubResult(
201
+ DataBin(**meas, shape=pub.shape),
202
+ metadata={"shots": pub.shots, "circuit_metadata": pub.circuit.metadata},
203
+ )
201
204
 
202
205
 
203
206
  def _preprocess_circuit(circuit: QuantumCircuit):
@@ -207,7 +210,7 @@ def _preprocess_circuit(circuit: QuantumCircuit):
207
210
  qargs_index = {v: k for k, v in enumerate(qargs)}
208
211
  circuit = circuit.remove_final_measurements(inplace=False)
209
212
  if _has_control_flow(circuit):
210
- raise QiskitError("StatevectorSampler cannot handle ControlFlowOp")
213
+ raise QiskitError("StatevectorSampler cannot handle ControlFlowOp and c_if")
211
214
  if _has_measure(circuit):
212
215
  raise QiskitError("StatevectorSampler cannot handle mid-circuit measurements")
213
216
  # num_qubits is used as sentinel to fill 0 in _samples_to_packed_array
@@ -283,4 +286,7 @@ def _final_measurement_mapping(circuit: QuantumCircuit) -> dict[tuple[ClassicalR
283
286
 
284
287
 
285
288
  def _has_control_flow(circuit: QuantumCircuit) -> bool:
286
- return any(isinstance(instruction.operation, ControlFlowOp) for instruction in circuit)
289
+ return any(
290
+ isinstance((op := instruction.operation), ControlFlowOp) or op.condition
291
+ for instruction in circuit
292
+ )
@@ -25,8 +25,14 @@ from qiskit.exceptions import QiskitError
25
25
  from qiskit.quantum_info import PauliList, SparsePauliOp, Statevector
26
26
  from qiskit.quantum_info.operators.base_operator import BaseOperator
27
27
  from qiskit.quantum_info.operators.symplectic.base_pauli import BasePauli
28
+ from qiskit.utils.deprecation import deprecate_func
28
29
 
29
30
 
31
+ @deprecate_func(
32
+ since="1.2",
33
+ additional_msg="To initialize a circuit from a ``Statevector`` instance, "
34
+ + "use ``QuantumCircuit.initialize`` instead.",
35
+ )
30
36
  def init_circuit(state: QuantumCircuit | Statevector) -> QuantumCircuit:
31
37
  """Initialize state by converting the input to a quantum circuit.
32
38
 
@@ -45,6 +51,10 @@ def init_circuit(state: QuantumCircuit | Statevector) -> QuantumCircuit:
45
51
  return qc
46
52
 
47
53
 
54
+ @deprecate_func(
55
+ since="1.2",
56
+ additional_msg="Use the constructor of ``SparsePauliOp`` instead.",
57
+ )
48
58
  def init_observable(observable: BaseOperator | str) -> SparsePauliOp:
49
59
  """Initialize observable by converting the input to a :class:`~qiskit.quantum_info.SparsePauliOp`.
50
60
 
@@ -68,6 +78,12 @@ def init_observable(observable: BaseOperator | str) -> SparsePauliOp:
68
78
  return SparsePauliOp(observable)
69
79
 
70
80
 
81
+ @deprecate_func(
82
+ since="1.2",
83
+ additional_msg="Use ``QuantumCircuit.layout`` and ``SparsePauliOp.apply_layout`` "
84
+ + "to adjust an operator for a layout. Otherwise, use ``mthree.utils.final_measurement_mapping``. "
85
+ + "See https://qiskit-extensions.github.io/mthree/apidocs/utils.html for details.",
86
+ )
71
87
  def final_measurement_mapping(circuit: QuantumCircuit) -> dict[int, int]:
72
88
  """Return the final measurement mapping for the circuit.
73
89