qiskit 1.4.2__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0__cp39-abi3-macosx_11_0_arm64.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 (459) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +3 -9
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/circuit/__init__.py +35 -10
  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 +236 -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 +469 -154
  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/graph_state.py +1 -0
  60. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  61. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  62. qiskit/circuit/library/n_local/n_local.py +1 -1
  63. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  64. qiskit/circuit/library/overlap.py +2 -2
  65. qiskit/circuit/library/pauli_evolution.py +39 -24
  66. qiskit/circuit/library/phase_oracle.py +130 -51
  67. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  69. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  70. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  71. qiskit/circuit/library/standard_gates/h.py +4 -9
  72. qiskit/circuit/library/standard_gates/i.py +2 -2
  73. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  74. qiskit/circuit/library/standard_gates/p.py +15 -34
  75. qiskit/circuit/library/standard_gates/r.py +7 -10
  76. qiskit/circuit/library/standard_gates/rx.py +5 -15
  77. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  78. qiskit/circuit/library/standard_gates/ry.py +5 -17
  79. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  80. qiskit/circuit/library/standard_gates/rz.py +5 -17
  81. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  82. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  83. qiskit/circuit/library/standard_gates/s.py +6 -15
  84. qiskit/circuit/library/standard_gates/swap.py +4 -11
  85. qiskit/circuit/library/standard_gates/sx.py +7 -12
  86. qiskit/circuit/library/standard_gates/t.py +6 -7
  87. qiskit/circuit/library/standard_gates/u.py +2 -10
  88. qiskit/circuit/library/standard_gates/u1.py +5 -16
  89. qiskit/circuit/library/standard_gates/u2.py +2 -6
  90. qiskit/circuit/library/standard_gates/u3.py +3 -11
  91. qiskit/circuit/library/standard_gates/x.py +14 -62
  92. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  94. qiskit/circuit/library/standard_gates/y.py +4 -9
  95. qiskit/circuit/library/standard_gates/z.py +5 -15
  96. qiskit/circuit/measure.py +11 -2
  97. qiskit/circuit/parameterexpression.py +7 -1
  98. qiskit/circuit/quantumcircuit.py +890 -564
  99. qiskit/circuit/random/utils.py +12 -6
  100. qiskit/circuit/reset.py +5 -2
  101. qiskit/circuit/singleton.py +5 -11
  102. qiskit/circuit/store.py +0 -8
  103. qiskit/compiler/__init__.py +1 -7
  104. qiskit/compiler/transpiler.py +38 -196
  105. qiskit/converters/circuit_to_dag.py +6 -4
  106. qiskit/converters/circuit_to_dagdependency.py +0 -2
  107. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  108. qiskit/converters/circuit_to_gate.py +1 -1
  109. qiskit/converters/circuit_to_instruction.py +16 -29
  110. qiskit/converters/dag_to_circuit.py +7 -8
  111. qiskit/converters/dag_to_dagdependency.py +0 -1
  112. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  113. qiskit/converters/dagdependency_to_circuit.py +0 -6
  114. qiskit/converters/dagdependency_to_dag.py +0 -6
  115. qiskit/dagcircuit/collect_blocks.py +32 -20
  116. qiskit/dagcircuit/dagdependency.py +3 -37
  117. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  118. qiskit/dagcircuit/dagnode.py +14 -2
  119. qiskit/passmanager/__init__.py +24 -6
  120. qiskit/passmanager/passmanager.py +26 -24
  121. qiskit/primitives/__init__.py +44 -35
  122. qiskit/primitives/backend_estimator_v2.py +102 -23
  123. qiskit/primitives/backend_sampler_v2.py +5 -20
  124. qiskit/primitives/base/__init__.py +4 -4
  125. qiskit/primitives/base/base_estimator.py +77 -82
  126. qiskit/primitives/base/base_primitive_job.py +2 -2
  127. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  128. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  129. qiskit/primitives/base/base_sampler.py +52 -60
  130. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  131. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  132. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  133. qiskit/primitives/containers/bindings_array.py +3 -1
  134. qiskit/primitives/containers/bit_array.py +23 -0
  135. qiskit/primitives/containers/data_bin.py +3 -1
  136. qiskit/primitives/containers/observables_array.py +19 -2
  137. qiskit/primitives/statevector_sampler.py +6 -8
  138. qiskit/primitives/utils.py +14 -189
  139. qiskit/providers/__init__.py +4 -130
  140. qiskit/providers/backend.py +11 -314
  141. qiskit/providers/basic_provider/__init__.py +3 -1
  142. qiskit/providers/basic_provider/basic_provider.py +29 -9
  143. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  144. qiskit/providers/exceptions.py +0 -33
  145. qiskit/providers/fake_provider/__init__.py +0 -37
  146. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  147. qiskit/qasm2/__init__.py +21 -6
  148. qiskit/qasm2/export.py +2 -10
  149. qiskit/qasm2/parse.py +11 -25
  150. qiskit/qasm3/__init__.py +5 -1
  151. qiskit/qasm3/ast.py +44 -0
  152. qiskit/qasm3/exporter.py +65 -27
  153. qiskit/qasm3/printer.py +35 -4
  154. qiskit/qpy/__init__.py +162 -19
  155. qiskit/qpy/binary_io/__init__.py +0 -1
  156. qiskit/qpy/binary_io/circuits.py +98 -130
  157. qiskit/qpy/binary_io/schedules.py +69 -439
  158. qiskit/qpy/binary_io/value.py +154 -31
  159. qiskit/qpy/common.py +10 -7
  160. qiskit/qpy/formats.py +41 -0
  161. qiskit/qpy/interface.py +34 -81
  162. qiskit/qpy/type_keys.py +58 -221
  163. qiskit/quantum_info/analysis/distance.py +3 -1
  164. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  165. qiskit/quantum_info/operators/operator.py +6 -2
  166. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  167. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  168. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  169. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  170. qiskit/quantum_info/states/densitymatrix.py +16 -6
  171. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  172. qiskit/quantum_info/states/statevector.py +16 -6
  173. qiskit/result/__init__.py +5 -17
  174. qiskit/result/models.py +18 -11
  175. qiskit/result/result.py +38 -134
  176. qiskit/result/sampled_expval.py +1 -2
  177. qiskit/result/utils.py +3 -4
  178. qiskit/synthesis/__init__.py +21 -1
  179. qiskit/synthesis/arithmetic/__init__.py +3 -1
  180. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  182. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  183. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  184. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  185. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  186. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  188. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  189. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  190. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  191. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  192. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -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 +4 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  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 +3 -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 +2 -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 +32 -4
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  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 +134 -62
  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 +107 -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 +78 -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/counts_visualization.py +4 -0
  287. qiskit/visualization/dag_visualization.py +2 -1
  288. qiskit/visualization/gate_map.py +39 -154
  289. qiskit/visualization/library.py +4 -1
  290. qiskit/visualization/pass_manager_visualization.py +6 -2
  291. qiskit/visualization/state_visualization.py +19 -2
  292. qiskit/visualization/timeline/core.py +19 -13
  293. qiskit/visualization/timeline/interface.py +19 -18
  294. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  295. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  296. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/RECORD +300 -447
  297. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
  298. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  299. qiskit/assembler/__init__.py +0 -42
  300. qiskit/assembler/assemble_circuits.py +0 -451
  301. qiskit/assembler/assemble_schedules.py +0 -367
  302. qiskit/assembler/disassemble.py +0 -310
  303. qiskit/assembler/run_config.py +0 -77
  304. qiskit/circuit/bit.py +0 -106
  305. qiskit/circuit/classicalfunction/__init__.py +0 -152
  306. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  307. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  308. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  309. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  310. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  311. qiskit/circuit/classicalfunction/types.py +0 -18
  312. qiskit/circuit/classicalfunction/utils.py +0 -91
  313. qiskit/circuit/classicalregister.py +0 -57
  314. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  315. qiskit/circuit/quantumregister.py +0 -75
  316. qiskit/circuit/register.py +0 -246
  317. qiskit/compiler/assembler.py +0 -689
  318. qiskit/compiler/scheduler.py +0 -109
  319. qiskit/compiler/sequencer.py +0 -71
  320. qiskit/primitives/backend_estimator.py +0 -486
  321. qiskit/primitives/backend_sampler.py +0 -222
  322. qiskit/primitives/estimator.py +0 -172
  323. qiskit/primitives/sampler.py +0 -162
  324. qiskit/providers/backend_compat.py +0 -507
  325. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  340. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  341. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/fake_1q.py +0 -91
  349. qiskit/providers/fake_provider/fake_backend.py +0 -165
  350. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  351. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  352. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  353. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  354. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  355. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  356. qiskit/providers/models/__init__.py +0 -89
  357. qiskit/providers/models/backendconfiguration.py +0 -1040
  358. qiskit/providers/models/backendproperties.py +0 -535
  359. qiskit/providers/models/backendstatus.py +0 -104
  360. qiskit/providers/models/jobstatus.py +0 -77
  361. qiskit/providers/models/pulsedefaults.py +0 -305
  362. qiskit/providers/provider.py +0 -95
  363. qiskit/pulse/__init__.py +0 -158
  364. qiskit/pulse/builder.py +0 -2262
  365. qiskit/pulse/calibration_entries.py +0 -381
  366. qiskit/pulse/channels.py +0 -227
  367. qiskit/pulse/configuration.py +0 -245
  368. qiskit/pulse/exceptions.py +0 -45
  369. qiskit/pulse/filters.py +0 -309
  370. qiskit/pulse/instruction_schedule_map.py +0 -424
  371. qiskit/pulse/instructions/__init__.py +0 -67
  372. qiskit/pulse/instructions/acquire.py +0 -150
  373. qiskit/pulse/instructions/delay.py +0 -71
  374. qiskit/pulse/instructions/directives.py +0 -154
  375. qiskit/pulse/instructions/frequency.py +0 -135
  376. qiskit/pulse/instructions/instruction.py +0 -270
  377. qiskit/pulse/instructions/phase.py +0 -152
  378. qiskit/pulse/instructions/play.py +0 -99
  379. qiskit/pulse/instructions/reference.py +0 -100
  380. qiskit/pulse/instructions/snapshot.py +0 -82
  381. qiskit/pulse/library/__init__.py +0 -97
  382. qiskit/pulse/library/continuous.py +0 -430
  383. qiskit/pulse/library/pulse.py +0 -148
  384. qiskit/pulse/library/samplers/__init__.py +0 -15
  385. qiskit/pulse/library/samplers/decorators.py +0 -295
  386. qiskit/pulse/library/samplers/strategies.py +0 -71
  387. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  388. qiskit/pulse/library/waveform.py +0 -136
  389. qiskit/pulse/macros.py +0 -262
  390. qiskit/pulse/parameter_manager.py +0 -445
  391. qiskit/pulse/parser.py +0 -314
  392. qiskit/pulse/reference_manager.py +0 -58
  393. qiskit/pulse/schedule.py +0 -1854
  394. qiskit/pulse/transforms/__init__.py +0 -106
  395. qiskit/pulse/transforms/alignments.py +0 -406
  396. qiskit/pulse/transforms/base_transforms.py +0 -71
  397. qiskit/pulse/transforms/canonicalization.py +0 -498
  398. qiskit/pulse/transforms/dag.py +0 -122
  399. qiskit/pulse/utils.py +0 -149
  400. qiskit/qobj/__init__.py +0 -75
  401. qiskit/qobj/common.py +0 -81
  402. qiskit/qobj/converters/__init__.py +0 -18
  403. qiskit/qobj/converters/lo_config.py +0 -177
  404. qiskit/qobj/converters/pulse_instruction.py +0 -897
  405. qiskit/qobj/pulse_qobj.py +0 -709
  406. qiskit/qobj/qasm_qobj.py +0 -708
  407. qiskit/qobj/utils.py +0 -46
  408. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  409. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  410. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  411. qiskit/result/mitigation/utils.py +0 -217
  412. qiskit/scheduler/__init__.py +0 -40
  413. qiskit/scheduler/config.py +0 -37
  414. qiskit/scheduler/lowering.py +0 -187
  415. qiskit/scheduler/methods/__init__.py +0 -15
  416. qiskit/scheduler/methods/basic.py +0 -140
  417. qiskit/scheduler/schedule_circuit.py +0 -69
  418. qiskit/scheduler/sequence.py +0 -104
  419. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  420. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  421. qiskit/transpiler/passes/calibration/builders.py +0 -20
  422. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  423. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  424. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  425. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  426. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  427. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  428. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  429. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  430. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  431. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  432. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  433. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  434. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  435. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  436. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  437. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  438. qiskit/utils/deprecate_pulse.py +0 -119
  439. qiskit/utils/multiprocessing.py +0 -56
  440. qiskit/visualization/pulse_v2/__init__.py +0 -21
  441. qiskit/visualization/pulse_v2/core.py +0 -901
  442. qiskit/visualization/pulse_v2/device_info.py +0 -173
  443. qiskit/visualization/pulse_v2/drawings.py +0 -253
  444. qiskit/visualization/pulse_v2/events.py +0 -254
  445. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  446. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  447. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  448. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  449. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  450. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  451. qiskit/visualization/pulse_v2/interface.py +0 -459
  452. qiskit/visualization/pulse_v2/layouts.py +0 -387
  453. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  454. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  455. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  456. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  457. qiskit/visualization/pulse_v2/types.py +0 -242
  458. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  459. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -1,109 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2019.
4
- #
5
- # This code is licensed under the Apache License, Version 2.0. You may
6
- # obtain a copy of this license in the LICENSE.txt file in the root directory
7
- # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
- #
9
- # Any modifications or derivative works of this code must retain this
10
- # copyright notice, and modified files need to carry a notice indicating
11
- # that they have been altered from the originals.
12
-
13
- """
14
- Convenience entry point into pulse scheduling, requiring only a circuit and a backend. For more
15
- control over pulse scheduling, look at `qiskit.scheduler.schedule_circuit`.
16
- """
17
- import logging
18
-
19
- from time import time
20
- from typing import List, Optional, Union
21
-
22
- from qiskit.circuit.quantumcircuit import QuantumCircuit
23
- from qiskit.exceptions import QiskitError
24
- from qiskit.pulse import InstructionScheduleMap, Schedule
25
- from qiskit.providers.backend import Backend
26
- from qiskit.scheduler.config import ScheduleConfig
27
- from qiskit.scheduler.schedule_circuit import schedule_circuit
28
- from qiskit.utils.parallel import parallel_map
29
- from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
30
-
31
- logger = logging.getLogger(__name__)
32
-
33
-
34
- def _log_schedule_time(start_time, end_time):
35
- log_msg = f"Total Scheduling Time - {((end_time - start_time) * 1000):.5f} (ms)"
36
- logger.info(log_msg)
37
-
38
-
39
- @deprecate_pulse_dependency(moving_to_dynamics=True)
40
- def schedule(
41
- circuits: Union[QuantumCircuit, List[QuantumCircuit]],
42
- backend: Optional[Backend] = None,
43
- inst_map: Optional[InstructionScheduleMap] = None,
44
- meas_map: Optional[List[List[int]]] = None,
45
- dt: Optional[float] = None,
46
- method: Optional[Union[str, List[str]]] = None,
47
- ) -> Union[Schedule, List[Schedule]]:
48
- """
49
- Schedule a circuit to a pulse ``Schedule``, using the backend, according to any specified
50
- methods. Supported methods are documented in :py:mod:`qiskit.scheduler.schedule_circuit`.
51
-
52
- Args:
53
- circuits: The quantum circuit or circuits to translate
54
- backend: A backend instance, which contains hardware-specific data required for scheduling
55
- inst_map: Mapping of circuit operations to pulse schedules. If ``None``, defaults to the
56
- ``backend``\'s ``instruction_schedule_map``
57
- meas_map: List of sets of qubits that must be measured together. If ``None``, defaults to
58
- the ``backend``\'s ``meas_map``
59
- dt: The output sample rate of backend control electronics. For scheduled circuits
60
- which contain time information, dt is required. If not provided, it will be
61
- obtained from the backend configuration
62
- method: Optionally specify a particular scheduling method
63
-
64
- Returns:
65
- A pulse ``Schedule`` that implements the input circuit
66
-
67
- Raises:
68
- QiskitError: If ``inst_map`` and ``meas_map`` are not passed and ``backend`` is not passed
69
- """
70
- arg_circuits_list = isinstance(circuits, list)
71
- start_time = time()
72
- if backend and getattr(backend, "version", 0) > 1:
73
- if inst_map is None:
74
- inst_map = backend.instruction_schedule_map
75
- if meas_map is None:
76
- meas_map = backend.meas_map
77
- if dt is None:
78
- dt = backend.dt
79
- else:
80
- if inst_map is None:
81
- if backend is None:
82
- raise QiskitError(
83
- "Must supply either a backend or InstructionScheduleMap for scheduling passes."
84
- )
85
- defaults = backend.defaults()
86
- if defaults is None:
87
- raise QiskitError(
88
- "The backend defaults are unavailable. The backend may not support pulse."
89
- )
90
- inst_map = defaults.instruction_schedule_map
91
- if meas_map is None:
92
- if backend is None:
93
- raise QiskitError(
94
- "Must supply either a backend or a meas_map for scheduling passes."
95
- )
96
- meas_map = backend.configuration().meas_map
97
- if dt is None:
98
- if backend is not None:
99
- dt = backend.configuration().dt
100
-
101
- schedule_config = ScheduleConfig(inst_map=inst_map, meas_map=meas_map, dt=dt)
102
- circuits = circuits if isinstance(circuits, list) else [circuits]
103
- schedules = parallel_map(schedule_circuit, circuits, (schedule_config, method, backend))
104
- end_time = time()
105
- _log_schedule_time(start_time, end_time)
106
- if arg_circuits_list:
107
- return schedules
108
- else:
109
- return schedules[0]
@@ -1,71 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2020.
4
- #
5
- # This code is licensed under the Apache License, Version 2.0. You may
6
- # obtain a copy of this license in the LICENSE.txt file in the root directory
7
- # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
- #
9
- # Any modifications or derivative works of this code must retain this
10
- # copyright notice, and modified files need to carry a notice indicating
11
- # that they have been altered from the originals.
12
-
13
- """
14
- Mapping a scheduled ``QuantumCircuit`` to a pulse ``Schedule``.
15
- """
16
- from typing import List, Optional, Union
17
-
18
- from qiskit.circuit.quantumcircuit import QuantumCircuit
19
- from qiskit.exceptions import QiskitError
20
- from qiskit.providers.backend import Backend
21
- from qiskit.pulse import InstructionScheduleMap, Schedule
22
- from qiskit.scheduler import ScheduleConfig
23
- from qiskit.scheduler.sequence import sequence as _sequence
24
- from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
25
-
26
-
27
- @deprecate_pulse_dependency(moving_to_dynamics=True)
28
- def sequence(
29
- scheduled_circuits: Union[QuantumCircuit, List[QuantumCircuit]],
30
- backend: Optional[Backend] = None,
31
- inst_map: Optional[InstructionScheduleMap] = None,
32
- meas_map: Optional[List[List[int]]] = None,
33
- dt: Optional[float] = None,
34
- ) -> Union[Schedule, List[Schedule]]:
35
- """
36
- Schedule a scheduled circuit to a pulse ``Schedule``, using the backend.
37
-
38
- Args:
39
- scheduled_circuits: Scheduled circuit(s) to be translated
40
- backend: A backend instance, which contains hardware-specific data required for scheduling
41
- inst_map: Mapping of circuit operations to pulse schedules. If ``None``, defaults to the
42
- ``backend``\'s ``instruction_schedule_map``
43
- meas_map: List of sets of qubits that must be measured together. If ``None``, defaults to
44
- the ``backend``\'s ``meas_map``
45
- dt: The output sample rate of backend control electronics. For scheduled circuits
46
- which contain time information, dt is required. If not provided, it will be
47
- obtained from the backend configuration
48
-
49
- Returns:
50
- A pulse ``Schedule`` that implements the input circuit
51
-
52
- Raises:
53
- QiskitError: If ``inst_map`` and ``meas_map`` are not passed and ``backend`` is not passed
54
- """
55
- if inst_map is None:
56
- if backend is None:
57
- raise QiskitError("Must supply either a backend or inst_map for sequencing.")
58
- inst_map = backend.defaults().instruction_schedule_map
59
- if meas_map is None:
60
- if backend is None:
61
- raise QiskitError("Must supply either a backend or a meas_map for sequencing.")
62
- meas_map = backend.configuration().meas_map
63
- if dt is None:
64
- if backend is None:
65
- raise QiskitError("Must supply either a backend or a dt for sequencing.")
66
- dt = backend.configuration().dt
67
-
68
- schedule_config = ScheduleConfig(inst_map=inst_map, meas_map=meas_map, dt=dt)
69
- circuits = scheduled_circuits if isinstance(scheduled_circuits, list) else [scheduled_circuits]
70
- schedules = [_sequence(circuit, schedule_config) for circuit in circuits]
71
- return schedules[0] if len(schedules) == 1 else schedules
@@ -1,486 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2022.
4
- #
5
- # This code is licensed under the Apache License, Version 2.0. You may
6
- # obtain a copy of this license in the LICENSE.txt file in the root directory
7
- # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
- #
9
- # Any modifications or derivative works of this code must retain this
10
- # copyright notice, and modified files need to carry a notice indicating
11
- # that they have been altered from the originals.
12
-
13
- """Estimator V1 implementation for an arbitrary Backend object."""
14
-
15
- from __future__ import annotations
16
-
17
- from collections.abc import Sequence
18
- from itertools import accumulate
19
-
20
- import numpy as np
21
-
22
- from qiskit.circuit import ClassicalRegister, QuantumCircuit, QuantumRegister
23
- from qiskit.compiler import transpile
24
- from qiskit.exceptions import QiskitError
25
- from qiskit.providers import BackendV1, BackendV2, Options
26
- from qiskit.quantum_info import Pauli, PauliList
27
- from qiskit.quantum_info.operators.base_operator import BaseOperator
28
- from qiskit.result import Counts, Result
29
- from qiskit.transpiler import CouplingMap, PassManager
30
- from qiskit.transpiler.passes import (
31
- ApplyLayout,
32
- EnlargeWithAncilla,
33
- FullAncillaAllocation,
34
- Optimize1qGatesDecomposition,
35
- SetLayout,
36
- )
37
- from qiskit.utils.deprecation import deprecate_func
38
-
39
- from .base import BaseEstimator, EstimatorResult
40
- from .primitive_job import PrimitiveJob
41
- from .utils import _circuit_key, _observable_key, init_observable
42
-
43
-
44
- def _run_circuits(
45
- circuits: QuantumCircuit | list[QuantumCircuit],
46
- backend: BackendV1 | BackendV2,
47
- clear_metadata: bool = True,
48
- **run_options,
49
- ) -> tuple[list[Result], list[dict]]:
50
- """Remove metadata of circuits and run the circuits on a backend.
51
- Args:
52
- circuits: The circuits
53
- backend: The backend
54
- clear_metadata: Clear circuit metadata before passing to backend.run if
55
- True.
56
- **run_options: run_options
57
- Returns:
58
- The result and the metadata of the circuits
59
- """
60
- if isinstance(circuits, QuantumCircuit):
61
- circuits = [circuits]
62
- metadata = []
63
- for circ in circuits:
64
- metadata.append(circ.metadata)
65
- if clear_metadata:
66
- circ.metadata = {}
67
- if isinstance(backend, BackendV1):
68
- max_circuits = getattr(backend.configuration(), "max_experiments", None)
69
- elif isinstance(backend, BackendV2):
70
- max_circuits = backend.max_circuits
71
- else:
72
- raise RuntimeError("Backend version not supported")
73
- if max_circuits:
74
- jobs = [
75
- backend.run(circuits[pos : pos + max_circuits], **run_options)
76
- for pos in range(0, len(circuits), max_circuits)
77
- ]
78
- result = [x.result() for x in jobs]
79
- else:
80
- result = [backend.run(circuits, **run_options).result()]
81
- return result, metadata
82
-
83
-
84
- def _prepare_counts(results: list[Result]):
85
- counts = []
86
- for res in results:
87
- count = res.get_counts()
88
- if not isinstance(count, list):
89
- count = [count]
90
- counts.extend(count)
91
- return counts
92
-
93
-
94
- class BackendEstimator(BaseEstimator[PrimitiveJob[EstimatorResult]]):
95
- """Evaluates expectation value using Pauli rotation gates.
96
-
97
- The :class:`~.BackendEstimator` class is a generic implementation of the
98
- :class:`~.BaseEstimator` (V1) interface that is used to wrap a :class:`~.BackendV2`
99
- (or :class:`~.BackendV1`) object in the :class:`~.BaseEstimator` V1 API. It
100
- facilitates using backends that do not provide a native
101
- :class:`~.BaseEstimator` V1 implementation in places that work with
102
- :class:`~.BaseEstimator` V1.
103
- However, if you're using a provider that has a native implementation of
104
- :class:`~.BaseEstimatorV1` ( :class:`~.BaseEstimator`) or
105
- :class:`~.BaseEstimatorV2`, it is a better
106
- choice to leverage that native implementation as it will likely include
107
- additional optimizations and be a more efficient implementation.
108
- The generic nature of this class precludes doing any provider- or
109
- backend-specific optimizations.
110
- """
111
-
112
- @deprecate_func(
113
- since="1.2",
114
- additional_msg="All implementations of the `BaseEstimatorV1` interface "
115
- "have been deprecated in favor of their V2 counterparts. "
116
- "The V2 alternative for the `BackendEstimator` class is `BackendEstimatorV2`.",
117
- )
118
- def __init__(
119
- self,
120
- backend: BackendV1 | BackendV2,
121
- options: dict | None = None,
122
- abelian_grouping: bool = True,
123
- bound_pass_manager: PassManager | None = None,
124
- skip_transpilation: bool = False,
125
- ):
126
- """Initialize a new BackendEstimator (V1) instance
127
-
128
- Args:
129
- backend: (required) the backend to run the primitive on
130
- options: Default options.
131
- abelian_grouping: Whether the observable should be grouped into
132
- commuting
133
- bound_pass_manager: An optional pass manager to run after
134
- parameter binding.
135
- skip_transpilation: If this is set to True the internal compilation
136
- of the input circuits is skipped and the circuit objects
137
- will be directly executed when this object is called.
138
- """
139
- super().__init__(options=options)
140
- self._circuits = []
141
- self._parameters = []
142
- self._observables = []
143
-
144
- self._abelian_grouping = abelian_grouping
145
-
146
- self._backend = backend
147
-
148
- self._transpile_options = Options()
149
- self._bound_pass_manager = bound_pass_manager
150
-
151
- self._preprocessed_circuits: list[tuple[QuantumCircuit, list[QuantumCircuit]]] | None = None
152
- self._transpiled_circuits: list[QuantumCircuit] | None = None
153
-
154
- self._grouping = list(zip(range(len(self._circuits)), range(len(self._observables))))
155
- self._skip_transpilation = skip_transpilation
156
-
157
- self._circuit_ids = {}
158
- self._observable_ids = {}
159
-
160
- @property
161
- def transpile_options(self) -> Options:
162
- """Return the transpiler options for transpiling the circuits."""
163
- return self._transpile_options
164
-
165
- def set_transpile_options(self, **fields):
166
- """Set the transpiler options for transpiler.
167
- Args:
168
- **fields: The fields to update the options
169
- """
170
- self._transpiled_circuits = None
171
- self._transpile_options.update_options(**fields)
172
-
173
- @property
174
- def preprocessed_circuits(
175
- self,
176
- ) -> list[tuple[QuantumCircuit, list[QuantumCircuit]]]:
177
- """
178
- Transpiled quantum circuits produced by preprocessing
179
- Returns:
180
- List of the transpiled quantum circuit
181
- """
182
- self._preprocessed_circuits = self._preprocessing()
183
- return self._preprocessed_circuits
184
-
185
- @property
186
- def transpiled_circuits(self) -> list[QuantumCircuit]:
187
- """
188
- Transpiled quantum circuits.
189
- Returns:
190
- List of the transpiled quantum circuit
191
- Raises:
192
- QiskitError: if the instance has been closed.
193
- """
194
- self._transpile()
195
- return self._transpiled_circuits
196
-
197
- @property
198
- def backend(self) -> BackendV1 | BackendV2:
199
- """
200
- Returns:
201
- The backend which this estimator object based on
202
- """
203
- return self._backend
204
-
205
- def _transpile(self):
206
- """Split Transpile"""
207
- self._transpiled_circuits = []
208
- for common_circuit, diff_circuits in self.preprocessed_circuits:
209
- # 1. transpile a common circuit
210
- if self._skip_transpilation:
211
- transpiled_circuit = common_circuit.copy()
212
- final_index_layout = list(range(common_circuit.num_qubits))
213
- else:
214
- transpiled_circuit = transpile( # pylint:disable=unexpected-keyword-arg
215
- common_circuit, self.backend, **self.transpile_options.__dict__
216
- )
217
- if transpiled_circuit.layout is not None:
218
- final_index_layout = transpiled_circuit.layout.final_index_layout()
219
- else:
220
- final_index_layout = list(range(transpiled_circuit.num_qubits))
221
-
222
- # 2. transpile diff circuits
223
- passmanager = _passmanager_for_measurement_circuits(final_index_layout, self.backend)
224
- diff_circuits = passmanager.run(diff_circuits)
225
- # 3. combine
226
- transpiled_circuits = []
227
- for diff_circuit in diff_circuits:
228
- transpiled_circuit_copy = transpiled_circuit.copy()
229
- # diff_circuit is supposed to have a classical register whose name is different from
230
- # those of the transpiled_circuit
231
- clbits = diff_circuit.cregs[0]
232
- for creg in transpiled_circuit_copy.cregs:
233
- if clbits.name == creg.name:
234
- raise QiskitError(
235
- "Classical register for measurements conflict with those of the input "
236
- f"circuit: {clbits}. "
237
- "Recommended to avoid register names starting with '__'."
238
- )
239
- transpiled_circuit_copy.add_register(clbits)
240
- transpiled_circuit_copy.compose(diff_circuit, clbits=clbits, inplace=True)
241
- transpiled_circuit_copy.metadata = diff_circuit.metadata
242
- transpiled_circuits.append(transpiled_circuit_copy)
243
- self._transpiled_circuits += transpiled_circuits
244
-
245
- def _call(
246
- self,
247
- circuits: Sequence[int],
248
- observables: Sequence[int],
249
- parameter_values: Sequence[Sequence[float]],
250
- **run_options,
251
- ) -> EstimatorResult:
252
-
253
- # Transpile
254
- self._grouping = list(zip(circuits, observables))
255
- transpiled_circuits = self.transpiled_circuits
256
- num_observables = [len(m) for (_, m) in self.preprocessed_circuits]
257
- accum = [0] + list(accumulate(num_observables))
258
-
259
- # Bind parameters
260
- parameter_dicts = [
261
- dict(zip(self._parameters[i], value)) for i, value in zip(circuits, parameter_values)
262
- ]
263
- bound_circuits = [
264
- (
265
- transpiled_circuits[circuit_index]
266
- if len(p) == 0
267
- else transpiled_circuits[circuit_index].assign_parameters(p)
268
- )
269
- for i, (p, n) in enumerate(zip(parameter_dicts, num_observables))
270
- for circuit_index in range(accum[i], accum[i] + n)
271
- ]
272
- bound_circuits = self._bound_pass_manager_run(bound_circuits)
273
-
274
- # Run
275
- result, metadata = _run_circuits(bound_circuits, self._backend, **run_options)
276
-
277
- return self._postprocessing(result, accum, metadata)
278
-
279
- def _run(
280
- self,
281
- circuits: tuple[QuantumCircuit, ...],
282
- observables: tuple[BaseOperator, ...],
283
- parameter_values: tuple[tuple[float, ...], ...],
284
- **run_options,
285
- ):
286
- circuit_indices = []
287
- for circuit in circuits:
288
- index = self._circuit_ids.get(_circuit_key(circuit))
289
- if index is not None:
290
- circuit_indices.append(index)
291
- else:
292
- circuit_indices.append(len(self._circuits))
293
- self._circuit_ids[_circuit_key(circuit)] = len(self._circuits)
294
- self._circuits.append(circuit)
295
- self._parameters.append(circuit.parameters)
296
- observable_indices = []
297
- for observable in observables:
298
- observable = init_observable(observable)
299
- index = self._observable_ids.get(_observable_key(observable))
300
- if index is not None:
301
- observable_indices.append(index)
302
- else:
303
- observable_indices.append(len(self._observables))
304
- self._observable_ids[_observable_key(observable)] = len(self._observables)
305
- self._observables.append(observable)
306
- job = PrimitiveJob(
307
- self._call, circuit_indices, observable_indices, parameter_values, **run_options
308
- )
309
- job._submit()
310
- return job
311
-
312
- @staticmethod
313
- def _measurement_circuit(num_qubits: int, pauli: Pauli):
314
- # Note: if pauli is I for all qubits, this function generates a circuit to measure only
315
- # the first qubit.
316
- # Although such an operator can be optimized out by interpreting it as a constant (1),
317
- # this optimization requires changes in various methods. So it is left as future work.
318
- qubit_indices = np.arange(pauli.num_qubits)[pauli.z | pauli.x]
319
- if not np.any(qubit_indices):
320
- qubit_indices = [0]
321
- meas_circuit = QuantumCircuit(
322
- QuantumRegister(num_qubits, "q"), ClassicalRegister(len(qubit_indices), f"__c_{pauli}")
323
- )
324
- for clbit, i in enumerate(qubit_indices):
325
- if pauli.x[i]:
326
- if pauli.z[i]:
327
- meas_circuit.sdg(i)
328
- meas_circuit.h(i)
329
- meas_circuit.measure(i, clbit)
330
- return meas_circuit, qubit_indices
331
-
332
- def _preprocessing(self) -> list[tuple[QuantumCircuit, list[QuantumCircuit]]]:
333
- """
334
- Preprocessing for evaluation of expectation value using pauli rotation gates.
335
- """
336
- preprocessed_circuits = []
337
- for group in self._grouping:
338
- circuit = self._circuits[group[0]]
339
- observable = self._observables[group[1]]
340
- diff_circuits: list[QuantumCircuit] = []
341
- if self._abelian_grouping:
342
- for obs in observable.group_commuting(qubit_wise=True):
343
- basis = Pauli(
344
- (np.logical_or.reduce(obs.paulis.z), np.logical_or.reduce(obs.paulis.x))
345
- )
346
- meas_circuit, indices = self._measurement_circuit(circuit.num_qubits, basis)
347
- paulis = PauliList.from_symplectic(
348
- obs.paulis.z[:, indices],
349
- obs.paulis.x[:, indices],
350
- obs.paulis.phase,
351
- )
352
- meas_circuit.metadata = {
353
- "paulis": paulis,
354
- "coeffs": np.real_if_close(obs.coeffs),
355
- }
356
- diff_circuits.append(meas_circuit)
357
- else:
358
- for basis, obs in zip(observable.paulis, observable):
359
- meas_circuit, indices = self._measurement_circuit(circuit.num_qubits, basis)
360
- paulis = PauliList.from_symplectic(
361
- obs.paulis.z[:, indices],
362
- obs.paulis.x[:, indices],
363
- obs.paulis.phase,
364
- )
365
- meas_circuit.metadata = {
366
- "paulis": paulis,
367
- "coeffs": np.real_if_close(obs.coeffs),
368
- }
369
- diff_circuits.append(meas_circuit)
370
-
371
- preprocessed_circuits.append((circuit.copy(), diff_circuits))
372
- return preprocessed_circuits
373
-
374
- def _postprocessing(
375
- self, result: list[Result], accum: list[int], metadata: list[dict]
376
- ) -> EstimatorResult:
377
- """
378
- Postprocessing for evaluation of expectation value using pauli rotation gates.
379
- """
380
- counts = _prepare_counts(result)
381
- expval_list = []
382
- var_list = []
383
- shots_list = []
384
-
385
- for i, j in zip(accum, accum[1:]):
386
-
387
- combined_expval = 0.0
388
- combined_var = 0.0
389
-
390
- for k in range(i, j):
391
- meta = metadata[k]
392
- paulis = meta["paulis"]
393
- coeffs = meta["coeffs"]
394
-
395
- count = counts[k]
396
-
397
- expvals, variances = _pauli_expval_with_variance(count, paulis)
398
-
399
- # Accumulate
400
- combined_expval += np.dot(expvals, coeffs)
401
- combined_var += np.dot(variances, coeffs**2)
402
-
403
- expval_list.append(combined_expval)
404
- var_list.append(combined_var)
405
- shots_list.append(sum(counts[i].values()))
406
-
407
- metadata = [{"variance": var, "shots": shots} for var, shots in zip(var_list, shots_list)]
408
-
409
- return EstimatorResult(np.real_if_close(expval_list), metadata)
410
-
411
- def _bound_pass_manager_run(self, circuits):
412
- if self._bound_pass_manager is None:
413
- return circuits
414
- else:
415
- output = self._bound_pass_manager.run(circuits)
416
- if not isinstance(output, list):
417
- output = [output]
418
- return output
419
-
420
-
421
- def _paulis2inds(paulis: PauliList) -> list[int]:
422
- """Convert PauliList to diagonal integers.
423
- These are integer representations of the binary string with a
424
- 1 where there are Paulis, and 0 where there are identities.
425
- """
426
- # Treat Z, X, Y the same
427
- nonid = paulis.z | paulis.x
428
-
429
- # bits are packed into uint8 in little endian
430
- # e.g., i-th bit corresponds to coefficient 2^i
431
- packed_vals = np.packbits(nonid, axis=1, bitorder="little")
432
- power_uint8 = 1 << (8 * np.arange(packed_vals.shape[1], dtype=object))
433
- inds = packed_vals @ power_uint8
434
- return inds.tolist()
435
-
436
-
437
- def _parity(integer: int) -> int:
438
- """Return the parity of an integer"""
439
- return bin(integer).count("1") % 2
440
-
441
-
442
- def _pauli_expval_with_variance(counts: Counts, paulis: PauliList) -> tuple[np.ndarray, np.ndarray]:
443
- """Return array of expval and variance pairs for input Paulis.
444
- Note: All non-identity Pauli's are treated as Z-paulis, assuming
445
- that basis rotations have been applied to convert them to the
446
- diagonal basis.
447
- """
448
- # Diag indices
449
- size = len(paulis)
450
- diag_inds = _paulis2inds(paulis)
451
-
452
- expvals = np.zeros(size, dtype=float)
453
- denom = 0 # Total shots for counts dict
454
- for bin_outcome, freq in counts.items():
455
- split_outcome = bin_outcome.split(" ", 1)[0] if " " in bin_outcome else bin_outcome
456
- outcome = int(split_outcome, 2)
457
- denom += freq
458
- for k in range(size):
459
- coeff = (-1) ** _parity(diag_inds[k] & outcome)
460
- expvals[k] += freq * coeff
461
-
462
- # Divide by total shots
463
- expvals /= denom
464
-
465
- # Compute variance
466
- variances = 1 - expvals**2
467
- return expvals, variances
468
-
469
-
470
- def _passmanager_for_measurement_circuits(layout, backend) -> PassManager:
471
- passmanager = PassManager([SetLayout(layout)])
472
- if isinstance(backend, BackendV2):
473
- opt1q = Optimize1qGatesDecomposition(target=backend.target)
474
- else:
475
- opt1q = Optimize1qGatesDecomposition(basis=backend.configuration().basis_gates)
476
- passmanager.append(opt1q)
477
- if isinstance(backend, BackendV2) and isinstance(backend.coupling_map, CouplingMap):
478
- coupling_map = backend.coupling_map
479
- passmanager.append(FullAncillaAllocation(coupling_map))
480
- passmanager.append(EnlargeWithAncilla())
481
- elif isinstance(backend, BackendV1) and backend.configuration().coupling_map is not None:
482
- coupling_map = CouplingMap(backend.configuration().coupling_map)
483
- passmanager.append(FullAncillaAllocation(coupling_map))
484
- passmanager.append(EnlargeWithAncilla())
485
- passmanager.append(ApplyLayout())
486
- return passmanager