qiskit 1.4.1__cp39-abi3-win_amd64.whl → 2.0.0rc1__cp39-abi3-win_amd64.whl

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