qiskit 1.4.2__cp39-abi3-win_amd64.whl → 2.0.0rc2__cp39-abi3-win_amd64.whl

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