qiskit 1.4.1__cp39-abi3-win_amd64.whl → 2.0.0rc1__cp39-abi3-win_amd64.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 (456) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +2 -5
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/circuit/__init__.py +24 -5
  5. qiskit/circuit/{add_control.py → _add_control.py} +32 -12
  6. qiskit/circuit/_classical_resource_map.py +5 -3
  7. qiskit/circuit/barrier.py +3 -7
  8. qiskit/circuit/classical/expr/__init__.py +31 -3
  9. qiskit/circuit/classical/expr/constructors.py +248 -28
  10. qiskit/circuit/classical/expr/expr.py +104 -3
  11. qiskit/circuit/classical/expr/visitors.py +75 -0
  12. qiskit/circuit/classical/types/__init__.py +12 -8
  13. qiskit/circuit/classical/types/ordering.py +14 -7
  14. qiskit/circuit/classical/types/types.py +36 -0
  15. qiskit/circuit/commutation_checker.py +34 -7
  16. qiskit/circuit/controlflow/__init__.py +32 -1
  17. qiskit/circuit/controlflow/_builder_utils.py +9 -5
  18. qiskit/circuit/controlflow/box.py +163 -0
  19. qiskit/circuit/controlflow/break_loop.py +1 -1
  20. qiskit/circuit/controlflow/builder.py +139 -39
  21. qiskit/circuit/controlflow/continue_loop.py +1 -3
  22. qiskit/circuit/controlflow/control_flow.py +10 -0
  23. qiskit/circuit/controlflow/for_loop.py +2 -1
  24. qiskit/circuit/controlflow/if_else.py +3 -16
  25. qiskit/circuit/controlflow/switch_case.py +2 -8
  26. qiskit/circuit/controlflow/while_loop.py +2 -7
  27. qiskit/circuit/controlledgate.py +2 -4
  28. qiskit/circuit/delay.py +40 -11
  29. qiskit/circuit/duration.py +0 -15
  30. qiskit/circuit/gate.py +2 -4
  31. qiskit/circuit/instruction.py +2 -141
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +34 -5
  34. qiskit/circuit/library/arithmetic/__init__.py +16 -10
  35. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  36. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
  37. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
  38. qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
  39. qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
  40. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
  41. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
  42. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
  43. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
  44. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
  45. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
  46. qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
  47. qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
  48. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  49. qiskit/circuit/library/blueprintcircuit.py +52 -16
  50. qiskit/circuit/library/data_preparation/initializer.py +1 -1
  51. qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
  52. qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
  53. qiskit/circuit/library/generalized_gates/gms.py +1 -1
  54. qiskit/circuit/library/generalized_gates/isometry.py +1 -1
  55. qiskit/circuit/library/generalized_gates/pauli.py +1 -2
  56. qiskit/circuit/library/generalized_gates/uc.py +97 -7
  57. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
  58. qiskit/circuit/library/generalized_gates/unitary.py +4 -2
  59. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  60. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  61. qiskit/circuit/library/n_local/n_local.py +1 -1
  62. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  63. qiskit/circuit/library/overlap.py +2 -2
  64. qiskit/circuit/library/pauli_evolution.py +39 -24
  65. qiskit/circuit/library/phase_oracle.py +130 -51
  66. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  67. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  68. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  69. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  70. qiskit/circuit/library/standard_gates/h.py +4 -9
  71. qiskit/circuit/library/standard_gates/i.py +2 -2
  72. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  73. qiskit/circuit/library/standard_gates/p.py +15 -34
  74. qiskit/circuit/library/standard_gates/r.py +2 -6
  75. qiskit/circuit/library/standard_gates/rx.py +5 -15
  76. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  77. qiskit/circuit/library/standard_gates/ry.py +5 -17
  78. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  79. qiskit/circuit/library/standard_gates/rz.py +5 -17
  80. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  81. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  82. qiskit/circuit/library/standard_gates/s.py +6 -15
  83. qiskit/circuit/library/standard_gates/swap.py +4 -11
  84. qiskit/circuit/library/standard_gates/sx.py +7 -12
  85. qiskit/circuit/library/standard_gates/t.py +6 -7
  86. qiskit/circuit/library/standard_gates/u.py +2 -10
  87. qiskit/circuit/library/standard_gates/u1.py +5 -16
  88. qiskit/circuit/library/standard_gates/u2.py +2 -6
  89. qiskit/circuit/library/standard_gates/u3.py +3 -11
  90. qiskit/circuit/library/standard_gates/x.py +13 -60
  91. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  92. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/y.py +4 -9
  94. qiskit/circuit/library/standard_gates/z.py +5 -15
  95. qiskit/circuit/measure.py +11 -2
  96. qiskit/circuit/parameterexpression.py +4 -0
  97. qiskit/circuit/quantumcircuit.py +881 -555
  98. qiskit/circuit/random/utils.py +12 -6
  99. qiskit/circuit/reset.py +5 -2
  100. qiskit/circuit/singleton.py +5 -11
  101. qiskit/circuit/store.py +0 -8
  102. qiskit/compiler/__init__.py +1 -7
  103. qiskit/compiler/transpiler.py +38 -196
  104. qiskit/converters/circuit_to_dag.py +4 -2
  105. qiskit/converters/circuit_to_dagdependency.py +0 -2
  106. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  107. qiskit/converters/circuit_to_gate.py +1 -1
  108. qiskit/converters/circuit_to_instruction.py +16 -29
  109. qiskit/converters/dag_to_circuit.py +5 -5
  110. qiskit/converters/dag_to_dagdependency.py +0 -1
  111. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  112. qiskit/converters/dagdependency_to_circuit.py +0 -6
  113. qiskit/converters/dagdependency_to_dag.py +0 -6
  114. qiskit/dagcircuit/collect_blocks.py +32 -20
  115. qiskit/dagcircuit/dagdependency.py +3 -37
  116. qiskit/dagcircuit/dagdependency_v2.py +2 -80
  117. qiskit/dagcircuit/dagnode.py +14 -2
  118. qiskit/passmanager/__init__.py +24 -6
  119. qiskit/passmanager/passmanager.py +26 -24
  120. qiskit/primitives/__init__.py +44 -35
  121. qiskit/primitives/backend_estimator_v2.py +102 -23
  122. qiskit/primitives/backend_sampler_v2.py +5 -20
  123. qiskit/primitives/base/__init__.py +4 -4
  124. qiskit/primitives/base/base_estimator.py +77 -82
  125. qiskit/primitives/base/base_primitive_job.py +2 -2
  126. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  127. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  128. qiskit/primitives/base/base_sampler.py +52 -60
  129. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  130. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  131. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  132. qiskit/primitives/containers/bindings_array.py +3 -1
  133. qiskit/primitives/containers/bit_array.py +23 -0
  134. qiskit/primitives/containers/data_bin.py +3 -1
  135. qiskit/primitives/containers/observables_array.py +19 -2
  136. qiskit/primitives/statevector_sampler.py +6 -8
  137. qiskit/primitives/utils.py +14 -189
  138. qiskit/providers/__init__.py +4 -130
  139. qiskit/providers/backend.py +11 -314
  140. qiskit/providers/basic_provider/__init__.py +3 -1
  141. qiskit/providers/basic_provider/basic_provider.py +29 -9
  142. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  143. qiskit/providers/exceptions.py +0 -33
  144. qiskit/providers/fake_provider/__init__.py +0 -37
  145. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  146. qiskit/qasm2/__init__.py +21 -6
  147. qiskit/qasm2/export.py +2 -10
  148. qiskit/qasm2/parse.py +11 -25
  149. qiskit/qasm3/__init__.py +5 -1
  150. qiskit/qasm3/ast.py +44 -0
  151. qiskit/qasm3/exporter.py +65 -27
  152. qiskit/qasm3/printer.py +35 -4
  153. qiskit/qpy/__init__.py +141 -19
  154. qiskit/qpy/binary_io/__init__.py +0 -1
  155. qiskit/qpy/binary_io/circuits.py +91 -116
  156. qiskit/qpy/binary_io/schedules.py +61 -388
  157. qiskit/qpy/binary_io/value.py +154 -28
  158. qiskit/qpy/common.py +10 -7
  159. qiskit/qpy/formats.py +41 -0
  160. qiskit/qpy/interface.py +29 -62
  161. qiskit/qpy/type_keys.py +58 -221
  162. qiskit/quantum_info/analysis/distance.py +3 -1
  163. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  164. qiskit/quantum_info/operators/operator.py +6 -2
  165. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  166. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  167. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  168. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  169. qiskit/quantum_info/states/densitymatrix.py +16 -6
  170. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  171. qiskit/quantum_info/states/statevector.py +16 -6
  172. qiskit/result/__init__.py +5 -17
  173. qiskit/result/models.py +18 -10
  174. qiskit/result/result.py +28 -126
  175. qiskit/result/sampled_expval.py +1 -2
  176. qiskit/result/utils.py +3 -4
  177. qiskit/synthesis/__init__.py +21 -1
  178. qiskit/synthesis/arithmetic/__init__.py +3 -1
  179. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  180. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  182. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  183. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  184. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  185. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  186. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  188. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  189. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  190. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  191. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  192. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
  193. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  194. qiskit/synthesis/evolution/product_formula.py +44 -35
  195. qiskit/synthesis/evolution/qdrift.py +17 -24
  196. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  197. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  198. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  199. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  200. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  201. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  202. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  203. qiskit/synthesis/two_qubit/__init__.py +1 -0
  204. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  205. qiskit/transpiler/__init__.py +32 -232
  206. qiskit/transpiler/basepasses.py +20 -51
  207. qiskit/transpiler/layout.py +1 -1
  208. qiskit/transpiler/passes/__init__.py +2 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +4 -3
  210. qiskit/transpiler/passes/basis/decompose.py +1 -15
  211. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  212. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  213. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  214. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  215. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +4 -4
  216. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  217. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  218. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  219. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  220. qiskit/transpiler/passes/optimization/__init__.py +1 -3
  221. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  222. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  223. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  224. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  225. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  226. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  227. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  228. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  229. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  230. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  231. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  232. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  233. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  234. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  235. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
  236. qiskit/transpiler/passes/routing/__init__.py +0 -1
  237. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  238. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  239. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  240. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  241. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  242. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  243. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  244. qiskit/transpiler/passes/scheduling/padding/base_padding.py +30 -2
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
  247. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  248. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  249. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  250. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +127 -59
  251. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  252. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  253. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  254. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  255. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  256. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  257. qiskit/transpiler/passes/utils/__init__.py +0 -1
  258. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  259. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  260. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  261. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  262. qiskit/transpiler/passmanager.py +13 -0
  263. qiskit/transpiler/passmanager_config.py +5 -81
  264. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  265. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  266. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +101 -322
  267. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  268. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  269. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  270. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  272. qiskit/transpiler/target.py +67 -524
  273. qiskit/user_config.py +8 -4
  274. qiskit/utils/__init__.py +13 -12
  275. qiskit/utils/deprecation.py +4 -112
  276. qiskit/utils/optionals.py +11 -4
  277. qiskit/utils/parallel.py +214 -87
  278. qiskit/utils/units.py +4 -1
  279. qiskit/visualization/__init__.py +3 -7
  280. qiskit/visualization/array.py +4 -1
  281. qiskit/visualization/bloch.py +1 -1
  282. qiskit/visualization/circuit/_utils.py +19 -19
  283. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  284. qiskit/visualization/circuit/matplotlib.py +13 -23
  285. qiskit/visualization/circuit/text.py +7 -3
  286. qiskit/visualization/dag_visualization.py +2 -1
  287. qiskit/visualization/gate_map.py +39 -154
  288. qiskit/visualization/pass_manager_visualization.py +6 -2
  289. qiskit/visualization/state_visualization.py +6 -0
  290. qiskit/visualization/timeline/core.py +18 -12
  291. qiskit/visualization/timeline/interface.py +19 -18
  292. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
  293. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
  294. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +1 -1
  295. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/entry_points.txt +8 -2
  296. qiskit/assembler/__init__.py +0 -42
  297. qiskit/assembler/assemble_circuits.py +0 -451
  298. qiskit/assembler/assemble_schedules.py +0 -367
  299. qiskit/assembler/disassemble.py +0 -310
  300. qiskit/assembler/run_config.py +0 -77
  301. qiskit/circuit/bit.py +0 -106
  302. qiskit/circuit/classicalfunction/__init__.py +0 -152
  303. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  304. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  305. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  306. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  307. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  308. qiskit/circuit/classicalfunction/types.py +0 -18
  309. qiskit/circuit/classicalfunction/utils.py +0 -91
  310. qiskit/circuit/classicalregister.py +0 -57
  311. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  312. qiskit/circuit/quantumregister.py +0 -75
  313. qiskit/circuit/register.py +0 -246
  314. qiskit/compiler/assembler.py +0 -689
  315. qiskit/compiler/scheduler.py +0 -109
  316. qiskit/compiler/sequencer.py +0 -71
  317. qiskit/primitives/backend_estimator.py +0 -486
  318. qiskit/primitives/backend_sampler.py +0 -222
  319. qiskit/primitives/estimator.py +0 -172
  320. qiskit/primitives/sampler.py +0 -162
  321. qiskit/providers/backend_compat.py +0 -507
  322. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  323. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  324. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  325. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  330. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  332. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  333. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  337. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  338. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  341. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/fake_1q.py +0 -91
  346. qiskit/providers/fake_provider/fake_backend.py +0 -165
  347. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  348. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  349. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  350. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  351. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  352. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  353. qiskit/providers/models/__init__.py +0 -89
  354. qiskit/providers/models/backendconfiguration.py +0 -1040
  355. qiskit/providers/models/backendproperties.py +0 -535
  356. qiskit/providers/models/backendstatus.py +0 -104
  357. qiskit/providers/models/jobstatus.py +0 -77
  358. qiskit/providers/models/pulsedefaults.py +0 -305
  359. qiskit/providers/provider.py +0 -95
  360. qiskit/pulse/__init__.py +0 -158
  361. qiskit/pulse/builder.py +0 -2262
  362. qiskit/pulse/calibration_entries.py +0 -381
  363. qiskit/pulse/channels.py +0 -227
  364. qiskit/pulse/configuration.py +0 -245
  365. qiskit/pulse/exceptions.py +0 -45
  366. qiskit/pulse/filters.py +0 -309
  367. qiskit/pulse/instruction_schedule_map.py +0 -424
  368. qiskit/pulse/instructions/__init__.py +0 -67
  369. qiskit/pulse/instructions/acquire.py +0 -150
  370. qiskit/pulse/instructions/delay.py +0 -71
  371. qiskit/pulse/instructions/directives.py +0 -154
  372. qiskit/pulse/instructions/frequency.py +0 -135
  373. qiskit/pulse/instructions/instruction.py +0 -270
  374. qiskit/pulse/instructions/phase.py +0 -152
  375. qiskit/pulse/instructions/play.py +0 -99
  376. qiskit/pulse/instructions/reference.py +0 -100
  377. qiskit/pulse/instructions/snapshot.py +0 -82
  378. qiskit/pulse/library/__init__.py +0 -97
  379. qiskit/pulse/library/continuous.py +0 -430
  380. qiskit/pulse/library/pulse.py +0 -148
  381. qiskit/pulse/library/samplers/__init__.py +0 -15
  382. qiskit/pulse/library/samplers/decorators.py +0 -295
  383. qiskit/pulse/library/samplers/strategies.py +0 -71
  384. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  385. qiskit/pulse/library/waveform.py +0 -136
  386. qiskit/pulse/macros.py +0 -262
  387. qiskit/pulse/parameter_manager.py +0 -445
  388. qiskit/pulse/parser.py +0 -314
  389. qiskit/pulse/reference_manager.py +0 -58
  390. qiskit/pulse/schedule.py +0 -1854
  391. qiskit/pulse/transforms/__init__.py +0 -106
  392. qiskit/pulse/transforms/alignments.py +0 -406
  393. qiskit/pulse/transforms/base_transforms.py +0 -71
  394. qiskit/pulse/transforms/canonicalization.py +0 -498
  395. qiskit/pulse/transforms/dag.py +0 -122
  396. qiskit/pulse/utils.py +0 -149
  397. qiskit/qobj/__init__.py +0 -75
  398. qiskit/qobj/common.py +0 -81
  399. qiskit/qobj/converters/__init__.py +0 -18
  400. qiskit/qobj/converters/lo_config.py +0 -177
  401. qiskit/qobj/converters/pulse_instruction.py +0 -897
  402. qiskit/qobj/pulse_qobj.py +0 -709
  403. qiskit/qobj/qasm_qobj.py +0 -708
  404. qiskit/qobj/utils.py +0 -46
  405. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  406. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  407. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  408. qiskit/result/mitigation/utils.py +0 -217
  409. qiskit/scheduler/__init__.py +0 -40
  410. qiskit/scheduler/config.py +0 -37
  411. qiskit/scheduler/lowering.py +0 -187
  412. qiskit/scheduler/methods/__init__.py +0 -15
  413. qiskit/scheduler/methods/basic.py +0 -140
  414. qiskit/scheduler/schedule_circuit.py +0 -69
  415. qiskit/scheduler/sequence.py +0 -104
  416. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  417. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  418. qiskit/transpiler/passes/calibration/builders.py +0 -20
  419. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  420. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  421. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  422. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  423. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  424. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  425. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  426. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  427. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  428. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  429. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  430. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  431. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  432. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  433. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  434. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  435. qiskit/utils/deprecate_pulse.py +0 -119
  436. qiskit/utils/multiprocessing.py +0 -56
  437. qiskit/visualization/pulse_v2/__init__.py +0 -21
  438. qiskit/visualization/pulse_v2/core.py +0 -901
  439. qiskit/visualization/pulse_v2/device_info.py +0 -173
  440. qiskit/visualization/pulse_v2/drawings.py +0 -253
  441. qiskit/visualization/pulse_v2/events.py +0 -254
  442. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  443. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  444. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  445. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  446. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  447. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  448. qiskit/visualization/pulse_v2/interface.py +0 -459
  449. qiskit/visualization/pulse_v2/layouts.py +0 -387
  450. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  451. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  452. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  453. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  454. qiskit/visualization/pulse_v2/types.py +0 -242
  455. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
  456. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -19,7 +19,7 @@ from abc import ABC
19
19
  from qiskit.providers import Options
20
20
 
21
21
 
22
- class BasePrimitive(ABC):
22
+ class BasePrimitiveV1(ABC):
23
23
  """Primitive V1 abstract base class."""
24
24
 
25
25
  def __init__(self, options: dict | None = None):
@@ -25,7 +25,7 @@ from numpy import ndarray
25
25
  ExperimentData = Dict[str, Any]
26
26
 
27
27
 
28
- class _BasePrimitiveResult(ABC):
28
+ class _BasePrimitiveResultV1(ABC):
29
29
  """
30
30
  Base class for deprecated Primitive V1 result methods.
31
31
  """
@@ -21,19 +21,60 @@ 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
25
24
 
26
25
  from ..containers.primitive_result import PrimitiveResult
27
26
  from ..containers.sampler_pub import SamplerPubLike
28
27
  from ..containers.sampler_pub_result import SamplerPubResult
29
- from . import validation
30
- from .base_primitive import BasePrimitive
28
+ from .validation_v1 import _validate_sampler_args
29
+ from .base_primitive_v1 import BasePrimitiveV1
31
30
  from .base_primitive_job import BasePrimitiveJob
32
31
 
33
32
  T = TypeVar("T", bound=Job)
34
33
 
35
34
 
36
- class BaseSamplerV1(BasePrimitive, Generic[T]):
35
+ class BaseSamplerV2(ABC):
36
+ r"""Base class for ``SamplerV2`` implementations.
37
+
38
+ A Sampler returns samples of quantum circuit outputs. Implementations of this
39
+ :class:`.BaseSamplerV2` interface must define their own :meth:`.run` method,
40
+ which is designed to take the following inputs:
41
+
42
+ * pubs: list of pubs (Primitive Unified Blocs). A sampler pub is a list or tuple
43
+ of two to three elements that define the unit of work for the sampler. These are:
44
+
45
+ * A single :class:`~qiskit.circuit.QuantumCircuit`, possibly parameterized.
46
+
47
+ * A collection parameter value sets to bind the circuit against if it is parametric.
48
+
49
+ * Optionally, the number of shots to sample.
50
+
51
+ * shots: the number of shots to sample. This specification is optional and will be overriden by
52
+ the pub-wise shots if provided.
53
+
54
+ All sampler implementations must implement default value for the ``shots`` in the
55
+ :meth:`.run` method. This default value will be used any time ``shots=None`` is specified, which
56
+ can take place in the :meth:`.run` kwargs or at the pub level.
57
+ """
58
+
59
+ @abstractmethod
60
+ def run(
61
+ self, pubs: Iterable[SamplerPubLike], *, shots: int | None = None
62
+ ) -> BasePrimitiveJob[PrimitiveResult[SamplerPubResult]]:
63
+ """Run and collect samples from each pub.
64
+
65
+ Args:
66
+ pubs: An iterable of pub-like objects. For example, a list of circuits
67
+ or tuples ``(circuit, parameter_values)``.
68
+ shots: The total number of shots to sample for each sampler pub that does
69
+ not specify its own shots. If ``None``, the primitive's default
70
+ shots value will be used, which can vary by implementation.
71
+
72
+ Returns:
73
+ The job object of Sampler's result.
74
+ """
75
+
76
+
77
+ class BaseSamplerV1(BasePrimitiveV1, Generic[T]):
37
78
  r"""Sampler V1 base class
38
79
 
39
80
  Base class of Sampler that calculates quasi-probabilities of bitstrings from quantum circuits.
@@ -58,7 +99,9 @@ class BaseSamplerV1(BasePrimitive, Generic[T]):
58
99
 
59
100
  .. code-block:: python
60
101
 
61
- from qiskit.primitives import Sampler
102
+ # This is a fictional import path.
103
+ # There are currently no Sampler implementations in Qiskit.
104
+ from sampler_v1_location import SamplerV1
62
105
  from qiskit import QuantumCircuit
63
106
  from qiskit.circuit.library import RealAmplitudes
64
107
 
@@ -103,6 +146,8 @@ class BaseSamplerV1(BasePrimitive, Generic[T]):
103
146
  options: dict | None = None,
104
147
  ):
105
148
  """
149
+ Initialize ``SamplerV1``.
150
+
106
151
  Args:
107
152
  options: Default options.
108
153
  """
@@ -129,7 +174,7 @@ class BaseSamplerV1(BasePrimitive, Generic[T]):
129
174
  ValueError: Invalid arguments are given.
130
175
  """
131
176
  # Validation
132
- circuits, parameter_values = validation._validate_sampler_args(circuits, parameter_values)
177
+ circuits, parameter_values = _validate_sampler_args(circuits, parameter_values)
133
178
 
134
179
  # Options
135
180
  run_opts = copy(self.options)
@@ -148,57 +193,4 @@ class BaseSamplerV1(BasePrimitive, Generic[T]):
148
193
  parameter_values: tuple[tuple[float, ...], ...],
149
194
  **run_options,
150
195
  ) -> T:
151
- raise NotImplementedError("The subclass of BaseSampler must implement `_run` method.")
152
-
153
-
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)
178
-
179
-
180
- class BaseSamplerV2(ABC):
181
- r"""Sampler V2 base class.
182
-
183
- A Sampler returns samples of quantum circuit outputs.
184
-
185
- All sampler implementations must implement default value for the ``shots`` in the
186
- :meth:`.run` method if ``None`` is given both as a ``kwarg`` and in all of the pubs.
187
- """
188
-
189
- @abstractmethod
190
- def run(
191
- self, pubs: Iterable[SamplerPubLike], *, shots: int | None = None
192
- ) -> BasePrimitiveJob[PrimitiveResult[SamplerPubResult]]:
193
- """Run and collect samples from each pub.
194
-
195
- Args:
196
- pubs: An iterable of pub-like objects. For example, a list of circuits
197
- or tuples ``(circuit, parameter_values)``.
198
- shots: The total number of shots to sample for each sampler pub that does
199
- not specify its own shots. If ``None``, the primitive's default
200
- shots value will be used, which can vary by implementation.
201
-
202
- Returns:
203
- The job object of Sampler's result.
204
- """
196
+ raise NotImplementedError("The subclass of BaseSamplerV1 must implement `_run` method.")
@@ -18,14 +18,14 @@ from __future__ import annotations
18
18
  from dataclasses import dataclass
19
19
  from typing import TYPE_CHECKING, Any
20
20
 
21
- from .base_result import _BasePrimitiveResult
21
+ from .base_result_v1 import _BasePrimitiveResultV1
22
22
 
23
23
  if TYPE_CHECKING:
24
24
  import numpy as np
25
25
 
26
26
 
27
27
  @dataclass(frozen=True)
28
- class EstimatorResult(_BasePrimitiveResult):
28
+ class EstimatorResult(_BasePrimitiveResultV1):
29
29
  """Result of Estimator V1.
30
30
 
31
31
  .. code-block:: python
@@ -20,11 +20,11 @@ from typing import Any
20
20
 
21
21
  from qiskit.result import QuasiDistribution
22
22
 
23
- from .base_result import _BasePrimitiveResult
23
+ from .base_result_v1 import _BasePrimitiveResultV1
24
24
 
25
25
 
26
26
  @dataclass(frozen=True)
27
- class SamplerResult(_BasePrimitiveResult):
27
+ class SamplerResult(_BasePrimitiveResultV1):
28
28
  """Result of Sampler V1.
29
29
 
30
30
  .. code-block:: python
@@ -10,34 +10,30 @@
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 validation methods.
13
+ """Primitive V1 validation methods.
14
14
 
15
15
  Note that these are not intended to be part of the public API of base primitives
16
- but are here for backwards compatibility with deprecated functions.
16
+ but are here for backward compatibility with BaseSamplerV1 and BaseEstimatorV1 classes.
17
17
  """
18
18
 
19
19
  from __future__ import annotations
20
20
 
21
21
  from collections.abc import Sequence
22
- import typing
23
22
  import numpy as np
24
23
 
25
24
  from qiskit.circuit import QuantumCircuit, ControlFlowOp, Measure
26
- from qiskit.quantum_info.operators import SparsePauliOp
25
+ from qiskit.exceptions import QiskitError
26
+ from qiskit.quantum_info import PauliList, SparsePauliOp
27
27
  from qiskit.quantum_info.operators.base_operator import BaseOperator
28
-
29
- from ..utils import init_observable
30
-
31
- if typing.TYPE_CHECKING:
32
- from qiskit.opflow import PauliSumOp
28
+ from qiskit.quantum_info.operators.symplectic.base_pauli import BasePauli
33
29
 
34
30
 
35
31
  def _validate_estimator_args(
36
32
  circuits: Sequence[QuantumCircuit] | QuantumCircuit,
37
- observables: Sequence[BaseOperator | PauliSumOp | str] | BaseOperator | PauliSumOp | str,
33
+ observables: Sequence[BaseOperator | str] | BaseOperator | str,
38
34
  parameter_values: Sequence[Sequence[float]] | Sequence[float] | float | None = None,
39
35
  ) -> tuple[tuple[QuantumCircuit], tuple[BaseOperator], tuple[tuple[float]]]:
40
- """Validate run arguments for a reference Estimator.
36
+ """Validate run arguments for BaseEstimatorV1.
41
37
 
42
38
  Args:
43
39
  circuits: one or more circuit objects.
@@ -70,7 +66,7 @@ def _validate_sampler_args(
70
66
  circuits: Sequence[QuantumCircuit] | QuantumCircuit,
71
67
  parameter_values: Sequence[Sequence[float]] | Sequence[float] | float | None = None,
72
68
  ) -> tuple[tuple[QuantumCircuit], tuple[BaseOperator], tuple[tuple[float]]]:
73
- """Validate run arguments for a reference Sampler.
69
+ """Validate run arguments for BaseSamplerV1.
74
70
 
75
71
  Args:
76
72
  circuits: one or more circuit objects.
@@ -96,6 +92,29 @@ def _validate_sampler_args(
96
92
  return circuits, parameter_values
97
93
 
98
94
 
95
+ def _init_observable(observable: BaseOperator | str) -> SparsePauliOp:
96
+ """Initialize observable by converting the input to a :class:`~qiskit.quantum_info.SparsePauliOp`.
97
+
98
+ Args:
99
+ observable: The observable.
100
+
101
+ Returns:
102
+ The observable as :class:`~qiskit.quantum_info.SparsePauliOp`.
103
+
104
+ Raises:
105
+ QiskitError: when observable type cannot be converted to SparsePauliOp.
106
+ """
107
+
108
+ if isinstance(observable, SparsePauliOp):
109
+ return observable
110
+ elif isinstance(observable, BaseOperator) and not isinstance(observable, BasePauli):
111
+ raise QiskitError(f"observable type not supported: {type(observable)}")
112
+ else:
113
+ if isinstance(observable, PauliList):
114
+ raise QiskitError(f"observable type not supported: {type(observable)}")
115
+ return SparsePauliOp(observable)
116
+
117
+
99
118
  def _validate_circuits(
100
119
  circuits: Sequence[QuantumCircuit] | QuantumCircuit,
101
120
  requires_measure: bool = False,
@@ -166,13 +185,13 @@ def _validate_parameter_values(
166
185
 
167
186
 
168
187
  def _validate_observables(
169
- observables: Sequence[BaseOperator | PauliSumOp | str] | BaseOperator | PauliSumOp | str,
188
+ observables: Sequence[BaseOperator | str] | BaseOperator | str,
170
189
  ) -> tuple[SparsePauliOp, ...]:
171
190
  if isinstance(observables, str) or not isinstance(observables, Sequence):
172
191
  observables = (observables,)
173
192
  if len(observables) == 0:
174
193
  raise ValueError("No observables were provided.")
175
- return tuple(init_observable(obs) for obs in observables)
194
+ return tuple(_init_observable(obs) for obs in observables)
176
195
 
177
196
 
178
197
  def _cross_validate_circuits_parameter_values(
@@ -192,7 +211,7 @@ def _cross_validate_circuits_parameter_values(
192
211
 
193
212
 
194
213
  def _cross_validate_circuits_observables(
195
- circuits: tuple[QuantumCircuit, ...], observables: tuple[BaseOperator | PauliSumOp, ...]
214
+ circuits: tuple[QuantumCircuit, ...], observables: tuple[BaseOperator, ...]
196
215
  ) -> None:
197
216
  if len(circuits) != len(observables):
198
217
  raise ValueError(
@@ -67,7 +67,9 @@ class BindingsArray(ShapedMixin):
67
67
  allows flexibility about whether values for different parameters are stored in one big array, or
68
68
  across several smaller arrays.
69
69
 
70
- .. code-block:: python
70
+ .. plot::
71
+ :include-source:
72
+ :nofigs:
71
73
 
72
74
  # 0-d array (i.e. only one binding)
73
75
  BindingsArray({"a": 4, ("b", "c"): [5, 6]})
@@ -314,6 +314,29 @@ class BitArray(ShapedMixin):
314
314
  array = np.frombuffer(data, dtype=np.uint8, count=len(data))
315
315
  return BitArray(array.reshape(-1, num_bytes), num_bits)
316
316
 
317
+ def to_bool_array(self, order: Literal["big", "little"] = "big") -> NDArray[np.bool_]:
318
+ """Convert this :class:`~BitArray` to a boolean array.
319
+
320
+ Args:
321
+ order: One of ``"big"`` or ``"little"``, respectively indicating whether the most significant
322
+ bit or the least significant bit of each bitstring should be placed at ``[..., 0]``.
323
+
324
+ Returns:
325
+ A NumPy array of bools.
326
+
327
+ Raises:
328
+ ValueError: If the order is not one of ``"big"`` or ``"little"``.
329
+ """
330
+ if order not in ("big", "little"):
331
+ raise ValueError(
332
+ f"Invalid value for order: '{order}'. Valid values are 'big' and 'little'."
333
+ )
334
+
335
+ arr = np.unpackbits(self.array, axis=-1)[..., -self.num_bits :]
336
+ if order == "little":
337
+ arr = arr[..., ::-1]
338
+ return arr.astype(np.bool_)
339
+
317
340
  def get_counts(self, loc: int | tuple[int, ...] | None = None) -> dict[str, int]:
318
341
  """Return a counts dictionary with bitstring keys.
319
342
 
@@ -32,7 +32,9 @@ def _value_repr(value: Any) -> str:
32
32
  class DataBin(ShapedMixin):
33
33
  """Namespace for storing data.
34
34
 
35
- .. code-block:: python
35
+ .. plot::
36
+ :include-source:
37
+ :nofigs:
36
38
 
37
39
  import numpy as np
38
40
  from qiskit.primitives import DataBin, BitArray
@@ -97,8 +97,25 @@ class ObservablesArray(ShapedMixin):
97
97
  array = np.array2string(self._array, prefix=prefix, suffix=suffix, threshold=50)
98
98
  return prefix + array + suffix
99
99
 
100
- def tolist(self) -> list:
101
- """Convert to a nested list"""
100
+ def tolist(self) -> list | ObservableLike:
101
+ """Convert to a nested list.
102
+
103
+ Similar to Numpy's ``tolist`` method, the level of nesting
104
+ depends on the dimension of the observables array. In the
105
+ case of dimension 0 the method returns a single observable
106
+ (``dict`` in the case of a weighted sum of Paulis) instead of a list.
107
+
108
+ Examples::
109
+ Return values for a one-element list vs one element:
110
+
111
+ >>> from qiskit.primitives.containers.observables_array import ObservablesArray
112
+ >>> oa = ObservablesArray.coerce(["Z"])
113
+ >>> print(type(oa.tolist()))
114
+ <class 'list'>
115
+ >>> oa = ObservablesArray.coerce("Z")
116
+ >>> print(type(oa.tolist()))
117
+ <class 'dict'>
118
+ """
102
119
  return self._array.tolist()
103
120
 
104
121
  def __array__(self, dtype=None, copy=None):
@@ -23,11 +23,10 @@ import numpy as np
23
23
  from numpy.typing import NDArray
24
24
 
25
25
  from qiskit import ClassicalRegister, QiskitError, QuantumCircuit
26
- from qiskit.circuit import ControlFlowOp
27
26
  from qiskit.quantum_info import Statevector
28
27
 
29
28
  from .base import BaseSamplerV2
30
- from .base.validation import _has_measure
29
+ from .base.validation_v1 import _has_measure
31
30
  from .containers import (
32
31
  BitArray,
33
32
  DataBin,
@@ -64,7 +63,9 @@ class StatevectorSampler(BaseSamplerV2):
64
63
  primitive unified bloc (PUB), produces its own array-valued result. The :meth:`~run` method can
65
64
  be given many pubs at once.
66
65
 
67
- .. code-block:: python
66
+ .. plot::
67
+ :include-source:
68
+ :nofigs:
68
69
 
69
70
  from qiskit.circuit import (
70
71
  Parameter, QuantumCircuit, ClassicalRegister, QuantumRegister
@@ -210,7 +211,7 @@ def _preprocess_circuit(circuit: QuantumCircuit):
210
211
  qargs_index = {v: k for k, v in enumerate(qargs)}
211
212
  circuit = circuit.remove_final_measurements(inplace=False)
212
213
  if _has_control_flow(circuit):
213
- raise QiskitError("StatevectorSampler cannot handle ControlFlowOp and c_if")
214
+ raise QiskitError("StatevectorSampler cannot handle ControlFlowOp")
214
215
  if _has_measure(circuit):
215
216
  raise QiskitError("StatevectorSampler cannot handle mid-circuit measurements")
216
217
  # num_qubits is used as sentinel to fill 0 in _samples_to_packed_array
@@ -286,7 +287,4 @@ def _final_measurement_mapping(circuit: QuantumCircuit) -> dict[tuple[ClassicalR
286
287
 
287
288
 
288
289
  def _has_control_flow(circuit: QuantumCircuit) -> bool:
289
- return any(
290
- isinstance((op := instruction.operation), ControlFlowOp) or op._condition
291
- for instruction in circuit
292
- )
290
+ return any(instruction.is_control_flow() for instruction in circuit)
@@ -14,185 +14,30 @@ Utility functions for primitives
14
14
  """
15
15
  from __future__ import annotations
16
16
 
17
- from collections.abc import Iterable
18
-
19
17
  import numpy as np
20
18
 
21
19
  from qiskit.circuit import Instruction, QuantumCircuit
22
- from qiskit.circuit.bit import Bit
23
- from qiskit.circuit.library.data_preparation import Initialize
24
- from qiskit.exceptions import QiskitError
25
- from qiskit.quantum_info import PauliList, SparsePauliOp, Statevector
26
- from qiskit.quantum_info.operators.base_operator import BaseOperator
27
- from qiskit.quantum_info.operators.symplectic.base_pauli import BasePauli
28
- from qiskit.utils.deprecation import deprecate_func
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
- )
36
- def init_circuit(state: QuantumCircuit | Statevector) -> QuantumCircuit:
37
- """Initialize state by converting the input to a quantum circuit.
38
-
39
- Args:
40
- state: The state as quantum circuit or statevector.
41
-
42
- Returns:
43
- The state as quantum circuit.
44
- """
45
- if isinstance(state, QuantumCircuit):
46
- return state
47
- if not isinstance(state, Statevector):
48
- state = Statevector(state)
49
- qc = QuantumCircuit(state.num_qubits)
50
- qc.append(Initialize(state), qargs=range(state.num_qubits))
51
- return qc
52
-
53
-
54
- @deprecate_func(
55
- since="1.2",
56
- additional_msg="Use the constructor of ``SparsePauliOp`` instead.",
57
- )
58
- def init_observable(observable: BaseOperator | str) -> SparsePauliOp:
59
- """Initialize observable by converting the input to a :class:`~qiskit.quantum_info.SparsePauliOp`.
60
-
61
- Args:
62
- observable: The observable.
63
-
64
- Returns:
65
- The observable as :class:`~qiskit.quantum_info.SparsePauliOp`.
66
-
67
- Raises:
68
- QiskitError: when observable type cannot be converted to SparsePauliOp.
69
- """
70
-
71
- if isinstance(observable, SparsePauliOp):
72
- return observable
73
- elif isinstance(observable, BaseOperator) and not isinstance(observable, BasePauli):
74
- raise QiskitError(f"observable type not supported: {type(observable)}")
75
- else:
76
- if isinstance(observable, PauliList):
77
- raise QiskitError(f"observable type not supported: {type(observable)}")
78
- return SparsePauliOp(observable)
79
-
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.github.io/qiskit-addon-mthree/apidocs/utils> for details.",
86
- )
87
- def final_measurement_mapping(circuit: QuantumCircuit) -> dict[int, int]:
88
- """Return the final measurement mapping for the circuit.
20
+ from qiskit.quantum_info import Statevector
89
21
 
90
- Dict keys label measured qubits, whereas the values indicate the
91
- classical bit onto which that qubits measurement result is stored.
92
22
 
93
- Parameters:
94
- circuit: Input quantum circuit.
95
-
96
- Returns:
97
- Mapping of qubits to classical bits for final measurements.
98
- """
99
- active_qubits = list(range(circuit.num_qubits))
100
- active_cbits = list(range(circuit.num_clbits))
101
-
102
- # Find final measurements starting in back
103
- mapping = {}
104
- for item in circuit._data[::-1]:
105
- if item.operation.name == "measure":
106
- cbit = circuit.find_bit(item.clbits[0]).index
107
- qbit = circuit.find_bit(item.qubits[0]).index
108
- if cbit in active_cbits and qbit in active_qubits:
109
- mapping[qbit] = cbit
110
- active_cbits.remove(cbit)
111
- active_qubits.remove(qbit)
112
- elif item.operation.name not in ["barrier", "delay"]:
113
- for qq in item.qubits:
114
- _temp_qubit = circuit.find_bit(qq).index
115
- if _temp_qubit in active_qubits:
116
- active_qubits.remove(_temp_qubit)
117
-
118
- if not active_cbits or not active_qubits:
119
- break
120
-
121
- # Sort so that classical bits are in numeric order low->high.
122
- mapping = dict(sorted(mapping.items(), key=lambda item: item[1]))
123
- return mapping
124
-
125
-
126
- def _bits_key(bits: tuple[Bit, ...], circuit: QuantumCircuit) -> tuple:
127
- return tuple(
128
- (
129
- circuit.find_bit(bit).index,
130
- tuple((reg[0].size, reg[0].name, reg[1]) for reg in circuit.find_bit(bit).registers),
131
- )
132
- for bit in bits
133
- )
134
-
135
-
136
- def _format_params(param):
137
- if isinstance(param, np.ndarray):
138
- return param.data.tobytes()
139
- elif isinstance(param, QuantumCircuit):
140
- return _circuit_key(param)
141
- elif isinstance(param, Iterable):
142
- return tuple(param)
143
- return param
144
-
145
-
146
- def _circuit_key(circuit: QuantumCircuit, functional: bool = True) -> tuple:
147
- """Private key function for QuantumCircuit.
148
-
149
- This is the workaround until :meth:`QuantumCircuit.__hash__` will be introduced.
150
- If key collision is found, please add elements to avoid it.
151
-
152
- Args:
153
- circuit: Input quantum circuit.
154
- functional: If True, the returned key only includes functional data (i.e. execution related).
23
+ def _statevector_from_circuit(
24
+ circuit: QuantumCircuit, rng: np.random.Generator | None
25
+ ) -> Statevector:
26
+ """Generate a statevector from a circuit. Used in StatevectorEstimator class.
155
27
 
156
- Returns:
157
- Composite key for circuit.
158
- """
159
- functional_key: tuple = (
160
- circuit.num_qubits,
161
- circuit.num_clbits,
162
- circuit.num_parameters,
163
- tuple( # circuit.data
164
- (
165
- _bits_key(data.qubits, circuit), # qubits
166
- _bits_key(data.clbits, circuit), # clbits
167
- data.operation.name, # operation.name
168
- tuple(_format_params(param) for param in data.operation.params), # operation.params
169
- )
170
- for data in circuit.data
171
- ),
172
- None if circuit._op_start_times is None else tuple(circuit._op_start_times),
173
- )
174
- if functional:
175
- return functional_key
176
- return (
177
- circuit.name,
178
- *functional_key,
179
- )
28
+ If the input circuit includes any resets for a some subsystem,
29
+ :meth:`.Statevector.reset` behaves in a stochastic way in :meth:`.Statevector.evolve`.
30
+ This function sets a random number generator to be reproducible.
180
31
 
32
+ See :meth:`.Statevector.reset` for details.
181
33
 
182
- def _observable_key(observable: SparsePauliOp) -> tuple:
183
- """Private key function for SparsePauliOp.
184
34
  Args:
185
- observable: Input operator.
186
-
187
- Returns:
188
- Key for observables.
35
+ circuit: The quantum circuit.
36
+ seed: The random number generator or None.
189
37
  """
190
- return (
191
- observable.paulis.z.tobytes(),
192
- observable.paulis.x.tobytes(),
193
- observable.paulis.phase.tobytes(),
194
- observable.coeffs.tobytes(),
195
- )
38
+ sv = Statevector.from_int(0, 2**circuit.num_qubits)
39
+ sv.seed(rng)
40
+ return sv.evolve(bound_circuit_to_instruction(circuit))
196
41
 
197
42
 
198
43
  def bound_circuit_to_instruction(circuit: QuantumCircuit) -> Instruction:
@@ -225,23 +70,3 @@ def bound_circuit_to_instruction(circuit: QuantumCircuit) -> Instruction:
225
70
  )
226
71
  inst.definition = circuit
227
72
  return inst
228
-
229
-
230
- def _statevector_from_circuit(
231
- circuit: QuantumCircuit, rng: np.random.Generator | None
232
- ) -> Statevector:
233
- """Generate a statevector from a circuit
234
-
235
- If the input circuit includes any resets for a some subsystem,
236
- :meth:`.Statevector.reset` behaves in a stochastic way in :meth:`.Statevector.evolve`.
237
- This function sets a random number generator to be reproducible.
238
-
239
- See :meth:`.Statevector.reset` for details.
240
-
241
- Args:
242
- circuit: The quantum circuit.
243
- seed: The random number generator or None.
244
- """
245
- sv = Statevector.from_int(0, 2**circuit.num_qubits)
246
- sv.seed(rng)
247
- return sv.evolve(bound_circuit_to_instruction(circuit))