qiskit 1.4.1__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 (462) 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 +11 -0
  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/circuit/tools/pi_check.py +3 -0
  104. qiskit/compiler/__init__.py +1 -7
  105. qiskit/compiler/transpiler.py +38 -196
  106. qiskit/converters/circuit_to_dag.py +6 -4
  107. qiskit/converters/circuit_to_dagdependency.py +0 -2
  108. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  109. qiskit/converters/circuit_to_gate.py +1 -1
  110. qiskit/converters/circuit_to_instruction.py +16 -29
  111. qiskit/converters/dag_to_circuit.py +7 -8
  112. qiskit/converters/dag_to_dagdependency.py +0 -1
  113. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  114. qiskit/converters/dagdependency_to_circuit.py +0 -6
  115. qiskit/converters/dagdependency_to_dag.py +0 -6
  116. qiskit/dagcircuit/collect_blocks.py +32 -20
  117. qiskit/dagcircuit/dagdependency.py +3 -37
  118. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  119. qiskit/dagcircuit/dagnode.py +14 -2
  120. qiskit/passmanager/__init__.py +24 -6
  121. qiskit/passmanager/passmanager.py +26 -24
  122. qiskit/primitives/__init__.py +44 -35
  123. qiskit/primitives/backend_estimator_v2.py +102 -23
  124. qiskit/primitives/backend_sampler_v2.py +5 -20
  125. qiskit/primitives/base/__init__.py +4 -4
  126. qiskit/primitives/base/base_estimator.py +77 -82
  127. qiskit/primitives/base/base_primitive_job.py +2 -2
  128. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  129. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  130. qiskit/primitives/base/base_sampler.py +52 -60
  131. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  132. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  133. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  134. qiskit/primitives/containers/bindings_array.py +3 -1
  135. qiskit/primitives/containers/bit_array.py +23 -0
  136. qiskit/primitives/containers/data_bin.py +3 -1
  137. qiskit/primitives/containers/observables_array.py +19 -2
  138. qiskit/primitives/statevector_sampler.py +6 -8
  139. qiskit/primitives/utils.py +14 -189
  140. qiskit/providers/__init__.py +4 -130
  141. qiskit/providers/backend.py +11 -314
  142. qiskit/providers/basic_provider/__init__.py +3 -1
  143. qiskit/providers/basic_provider/basic_provider.py +29 -9
  144. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  145. qiskit/providers/exceptions.py +0 -33
  146. qiskit/providers/fake_provider/__init__.py +0 -37
  147. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  148. qiskit/qasm2/__init__.py +21 -6
  149. qiskit/qasm2/export.py +2 -10
  150. qiskit/qasm2/parse.py +11 -25
  151. qiskit/qasm3/__init__.py +5 -1
  152. qiskit/qasm3/ast.py +44 -0
  153. qiskit/qasm3/exporter.py +65 -27
  154. qiskit/qasm3/printer.py +35 -4
  155. qiskit/qpy/__init__.py +162 -19
  156. qiskit/qpy/binary_io/__init__.py +0 -1
  157. qiskit/qpy/binary_io/circuits.py +96 -116
  158. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  159. qiskit/qpy/binary_io/schedules.py +61 -388
  160. qiskit/qpy/binary_io/value.py +159 -33
  161. qiskit/qpy/common.py +10 -7
  162. qiskit/qpy/formats.py +41 -0
  163. qiskit/qpy/interface.py +29 -62
  164. qiskit/qpy/type_keys.py +58 -221
  165. qiskit/quantum_info/analysis/distance.py +3 -1
  166. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  167. qiskit/quantum_info/operators/operator.py +6 -2
  168. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  169. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  170. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  171. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  172. qiskit/quantum_info/states/densitymatrix.py +16 -6
  173. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  174. qiskit/quantum_info/states/statevector.py +16 -6
  175. qiskit/result/__init__.py +5 -17
  176. qiskit/result/models.py +18 -11
  177. qiskit/result/result.py +38 -134
  178. qiskit/result/sampled_expval.py +1 -2
  179. qiskit/result/utils.py +3 -4
  180. qiskit/synthesis/__init__.py +21 -1
  181. qiskit/synthesis/arithmetic/__init__.py +3 -1
  182. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  183. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  184. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  185. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  186. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  187. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  188. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  189. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  190. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  191. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  192. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  193. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  194. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  195. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
  196. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  197. qiskit/synthesis/evolution/product_formula.py +44 -35
  198. qiskit/synthesis/evolution/qdrift.py +17 -24
  199. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  200. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  201. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  202. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  203. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  204. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  205. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  206. qiskit/synthesis/two_qubit/__init__.py +1 -0
  207. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  208. qiskit/transpiler/__init__.py +32 -232
  209. qiskit/transpiler/basepasses.py +20 -51
  210. qiskit/transpiler/layout.py +1 -1
  211. qiskit/transpiler/passes/__init__.py +4 -40
  212. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  213. qiskit/transpiler/passes/basis/decompose.py +1 -15
  214. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  215. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  216. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  217. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  218. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
  219. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  220. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  221. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  222. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  223. qiskit/transpiler/passes/optimization/__init__.py +2 -3
  224. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  225. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  226. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  227. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  228. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  229. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  230. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  231. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  232. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  233. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  234. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  235. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  236. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  237. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  238. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +3 -2
  239. qiskit/transpiler/passes/routing/__init__.py +0 -1
  240. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  241. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  242. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  243. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  244. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  245. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  246. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  247. qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
  248. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  249. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  250. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  251. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  252. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  253. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
  254. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  255. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  256. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  257. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  258. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  259. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  260. qiskit/transpiler/passes/utils/__init__.py +0 -1
  261. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  262. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  263. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  264. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  265. qiskit/transpiler/passmanager.py +13 -0
  266. qiskit/transpiler/passmanager_config.py +5 -81
  267. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  268. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  269. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
  270. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  272. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  273. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  274. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  275. qiskit/transpiler/target.py +78 -524
  276. qiskit/user_config.py +8 -4
  277. qiskit/utils/__init__.py +13 -12
  278. qiskit/utils/deprecation.py +4 -112
  279. qiskit/utils/optionals.py +11 -4
  280. qiskit/utils/parallel.py +214 -87
  281. qiskit/utils/units.py +4 -1
  282. qiskit/visualization/__init__.py +3 -7
  283. qiskit/visualization/array.py +4 -1
  284. qiskit/visualization/bloch.py +1 -1
  285. qiskit/visualization/circuit/_utils.py +19 -19
  286. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  287. qiskit/visualization/circuit/matplotlib.py +13 -23
  288. qiskit/visualization/circuit/text.py +7 -3
  289. qiskit/visualization/counts_visualization.py +4 -0
  290. qiskit/visualization/dag_visualization.py +2 -1
  291. qiskit/visualization/gate_map.py +39 -154
  292. qiskit/visualization/library.py +4 -1
  293. qiskit/visualization/pass_manager_visualization.py +6 -2
  294. qiskit/visualization/state_visualization.py +19 -2
  295. qiskit/visualization/timeline/core.py +19 -13
  296. qiskit/visualization/timeline/interface.py +19 -18
  297. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  298. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  299. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
  300. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
  301. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  302. qiskit/assembler/__init__.py +0 -42
  303. qiskit/assembler/assemble_circuits.py +0 -451
  304. qiskit/assembler/assemble_schedules.py +0 -367
  305. qiskit/assembler/disassemble.py +0 -310
  306. qiskit/assembler/run_config.py +0 -77
  307. qiskit/circuit/bit.py +0 -106
  308. qiskit/circuit/classicalfunction/__init__.py +0 -152
  309. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  310. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  311. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  312. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  313. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  314. qiskit/circuit/classicalfunction/types.py +0 -18
  315. qiskit/circuit/classicalfunction/utils.py +0 -91
  316. qiskit/circuit/classicalregister.py +0 -57
  317. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  318. qiskit/circuit/quantumregister.py +0 -75
  319. qiskit/circuit/register.py +0 -246
  320. qiskit/compiler/assembler.py +0 -689
  321. qiskit/compiler/scheduler.py +0 -109
  322. qiskit/compiler/sequencer.py +0 -71
  323. qiskit/primitives/backend_estimator.py +0 -486
  324. qiskit/primitives/backend_sampler.py +0 -222
  325. qiskit/primitives/estimator.py +0 -172
  326. qiskit/primitives/sampler.py +0 -162
  327. qiskit/providers/backend_compat.py +0 -507
  328. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  333. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  351. qiskit/providers/fake_provider/fake_1q.py +0 -91
  352. qiskit/providers/fake_provider/fake_backend.py +0 -165
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  357. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  358. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  359. qiskit/providers/models/__init__.py +0 -89
  360. qiskit/providers/models/backendconfiguration.py +0 -1040
  361. qiskit/providers/models/backendproperties.py +0 -535
  362. qiskit/providers/models/backendstatus.py +0 -104
  363. qiskit/providers/models/jobstatus.py +0 -77
  364. qiskit/providers/models/pulsedefaults.py +0 -305
  365. qiskit/providers/provider.py +0 -95
  366. qiskit/pulse/__init__.py +0 -158
  367. qiskit/pulse/builder.py +0 -2262
  368. qiskit/pulse/calibration_entries.py +0 -381
  369. qiskit/pulse/channels.py +0 -227
  370. qiskit/pulse/configuration.py +0 -245
  371. qiskit/pulse/exceptions.py +0 -45
  372. qiskit/pulse/filters.py +0 -309
  373. qiskit/pulse/instruction_schedule_map.py +0 -424
  374. qiskit/pulse/instructions/__init__.py +0 -67
  375. qiskit/pulse/instructions/acquire.py +0 -150
  376. qiskit/pulse/instructions/delay.py +0 -71
  377. qiskit/pulse/instructions/directives.py +0 -154
  378. qiskit/pulse/instructions/frequency.py +0 -135
  379. qiskit/pulse/instructions/instruction.py +0 -270
  380. qiskit/pulse/instructions/phase.py +0 -152
  381. qiskit/pulse/instructions/play.py +0 -99
  382. qiskit/pulse/instructions/reference.py +0 -100
  383. qiskit/pulse/instructions/snapshot.py +0 -82
  384. qiskit/pulse/library/__init__.py +0 -97
  385. qiskit/pulse/library/continuous.py +0 -430
  386. qiskit/pulse/library/pulse.py +0 -148
  387. qiskit/pulse/library/samplers/__init__.py +0 -15
  388. qiskit/pulse/library/samplers/decorators.py +0 -295
  389. qiskit/pulse/library/samplers/strategies.py +0 -71
  390. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  391. qiskit/pulse/library/waveform.py +0 -136
  392. qiskit/pulse/macros.py +0 -262
  393. qiskit/pulse/parameter_manager.py +0 -445
  394. qiskit/pulse/parser.py +0 -314
  395. qiskit/pulse/reference_manager.py +0 -58
  396. qiskit/pulse/schedule.py +0 -1854
  397. qiskit/pulse/transforms/__init__.py +0 -106
  398. qiskit/pulse/transforms/alignments.py +0 -406
  399. qiskit/pulse/transforms/base_transforms.py +0 -71
  400. qiskit/pulse/transforms/canonicalization.py +0 -498
  401. qiskit/pulse/transforms/dag.py +0 -122
  402. qiskit/pulse/utils.py +0 -149
  403. qiskit/qobj/__init__.py +0 -75
  404. qiskit/qobj/common.py +0 -81
  405. qiskit/qobj/converters/__init__.py +0 -18
  406. qiskit/qobj/converters/lo_config.py +0 -177
  407. qiskit/qobj/converters/pulse_instruction.py +0 -897
  408. qiskit/qobj/pulse_qobj.py +0 -709
  409. qiskit/qobj/qasm_qobj.py +0 -708
  410. qiskit/qobj/utils.py +0 -46
  411. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  412. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  413. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  414. qiskit/result/mitigation/utils.py +0 -217
  415. qiskit/scheduler/__init__.py +0 -40
  416. qiskit/scheduler/config.py +0 -37
  417. qiskit/scheduler/lowering.py +0 -187
  418. qiskit/scheduler/methods/__init__.py +0 -15
  419. qiskit/scheduler/methods/basic.py +0 -140
  420. qiskit/scheduler/schedule_circuit.py +0 -69
  421. qiskit/scheduler/sequence.py +0 -104
  422. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  423. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  424. qiskit/transpiler/passes/calibration/builders.py +0 -20
  425. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  426. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  427. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  428. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  429. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  430. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  431. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  432. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  433. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  434. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  435. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  436. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  437. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  438. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  439. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  440. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  441. qiskit/utils/deprecate_pulse.py +0 -119
  442. qiskit/utils/multiprocessing.py +0 -56
  443. qiskit/visualization/pulse_v2/__init__.py +0 -21
  444. qiskit/visualization/pulse_v2/core.py +0 -901
  445. qiskit/visualization/pulse_v2/device_info.py +0 -173
  446. qiskit/visualization/pulse_v2/drawings.py +0 -253
  447. qiskit/visualization/pulse_v2/events.py +0 -254
  448. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  449. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  450. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  451. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  452. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  453. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  454. qiskit/visualization/pulse_v2/interface.py +0 -459
  455. qiskit/visualization/pulse_v2/layouts.py +0 -387
  456. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  457. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  458. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  459. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  460. qiskit/visualization/pulse_v2/types.py +0 -242
  461. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  462. {qiskit-1.4.1.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