qiskit 1.3.0__cp39-abi3-win32.whl → 1.3.0b1__cp39-abi3-win32.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 (361) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +1 -20
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/assembler/assemble_schedules.py +0 -2
  5. qiskit/circuit/__init__.py +1 -44
  6. qiskit/circuit/_standard_gates_commutations.py +0 -585
  7. qiskit/circuit/barrier.py +0 -2
  8. qiskit/circuit/controlflow/builder.py +3 -3
  9. qiskit/circuit/controlflow/if_else.py +5 -13
  10. qiskit/circuit/controlflow/while_loop.py +2 -10
  11. qiskit/circuit/delay.py +3 -20
  12. qiskit/circuit/equivalence.py +214 -13
  13. qiskit/circuit/gate.py +1 -3
  14. qiskit/circuit/instruction.py +11 -32
  15. qiskit/circuit/instructionset.py +0 -2
  16. qiskit/circuit/library/__init__.py +14 -110
  17. qiskit/circuit/library/arithmetic/__init__.py +2 -9
  18. qiskit/circuit/library/arithmetic/adders/__init__.py +0 -1
  19. qiskit/circuit/library/arithmetic/adders/adder.py +2 -154
  20. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +56 -20
  21. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +1 -14
  22. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +91 -21
  23. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
  24. qiskit/circuit/library/arithmetic/multipliers/__init__.py +0 -1
  25. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -8
  26. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +3 -94
  27. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +1 -8
  28. qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
  29. qiskit/circuit/library/basis_change/qft.py +38 -20
  30. qiskit/circuit/library/blueprintcircuit.py +0 -64
  31. qiskit/circuit/library/boolean_logic/__init__.py +4 -4
  32. qiskit/circuit/library/boolean_logic/inner_product.py +4 -81
  33. qiskit/circuit/library/boolean_logic/quantum_and.py +4 -107
  34. qiskit/circuit/library/boolean_logic/quantum_or.py +3 -107
  35. qiskit/circuit/library/boolean_logic/quantum_xor.py +3 -97
  36. qiskit/circuit/library/data_preparation/__init__.py +3 -6
  37. qiskit/circuit/library/data_preparation/pauli_feature_map.py +29 -342
  38. qiskit/circuit/library/data_preparation/{_z_feature_map.py → z_feature_map.py} +34 -45
  39. qiskit/circuit/library/data_preparation/zz_feature_map.py +118 -0
  40. qiskit/circuit/library/fourier_checking.py +11 -72
  41. qiskit/circuit/library/generalized_gates/__init__.py +1 -1
  42. qiskit/circuit/library/generalized_gates/diagonal.py +51 -45
  43. qiskit/circuit/library/generalized_gates/gms.py +14 -67
  44. qiskit/circuit/library/generalized_gates/gr.py +4 -4
  45. qiskit/circuit/library/generalized_gates/isometry.py +2 -2
  46. qiskit/circuit/library/generalized_gates/linear_function.py +6 -12
  47. qiskit/circuit/library/generalized_gates/mcmt.py +107 -167
  48. qiskit/circuit/library/generalized_gates/permutation.py +6 -8
  49. qiskit/circuit/library/generalized_gates/rv.py +9 -8
  50. qiskit/circuit/library/graph_state.py +10 -93
  51. qiskit/circuit/library/grover_operator.py +2 -270
  52. qiskit/circuit/library/hidden_linear_function.py +20 -83
  53. qiskit/circuit/library/iqp.py +20 -99
  54. qiskit/circuit/library/n_local/__init__.py +7 -19
  55. qiskit/circuit/library/n_local/efficient_su2.py +5 -118
  56. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +0 -259
  57. qiskit/circuit/library/n_local/excitation_preserving.py +6 -130
  58. qiskit/circuit/library/n_local/n_local.py +5 -406
  59. qiskit/circuit/library/n_local/pauli_two_design.py +4 -106
  60. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -80
  61. qiskit/circuit/library/n_local/real_amplitudes.py +7 -127
  62. qiskit/circuit/library/n_local/two_local.py +7 -14
  63. qiskit/circuit/library/overlap.py +26 -91
  64. qiskit/circuit/library/pauli_evolution.py +15 -17
  65. qiskit/circuit/library/phase_estimation.py +4 -80
  66. qiskit/circuit/library/quantum_volume.py +20 -72
  67. qiskit/circuit/library/standard_gates/__init__.py +1 -20
  68. qiskit/circuit/library/standard_gates/dcx.py +1 -2
  69. qiskit/circuit/library/standard_gates/ecr.py +2 -2
  70. qiskit/circuit/library/standard_gates/h.py +3 -4
  71. qiskit/circuit/library/standard_gates/i.py +1 -2
  72. qiskit/circuit/library/standard_gates/iswap.py +2 -2
  73. qiskit/circuit/library/standard_gates/p.py +12 -20
  74. qiskit/circuit/library/standard_gates/r.py +1 -1
  75. qiskit/circuit/library/standard_gates/rx.py +3 -4
  76. qiskit/circuit/library/standard_gates/rxx.py +2 -2
  77. qiskit/circuit/library/standard_gates/ry.py +3 -4
  78. qiskit/circuit/library/standard_gates/ryy.py +2 -2
  79. qiskit/circuit/library/standard_gates/rz.py +12 -13
  80. qiskit/circuit/library/standard_gates/rzx.py +6 -6
  81. qiskit/circuit/library/standard_gates/rzz.py +1 -1
  82. qiskit/circuit/library/standard_gates/s.py +4 -4
  83. qiskit/circuit/library/standard_gates/swap.py +3 -3
  84. qiskit/circuit/library/standard_gates/sx.py +3 -4
  85. qiskit/circuit/library/standard_gates/t.py +2 -2
  86. qiskit/circuit/library/standard_gates/u.py +3 -11
  87. qiskit/circuit/library/standard_gates/u1.py +15 -65
  88. qiskit/circuit/library/standard_gates/u2.py +1 -4
  89. qiskit/circuit/library/standard_gates/u3.py +3 -31
  90. qiskit/circuit/library/standard_gates/x.py +5 -7
  91. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -2
  92. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -2
  93. qiskit/circuit/library/standard_gates/y.py +3 -4
  94. qiskit/circuit/library/standard_gates/z.py +3 -3
  95. qiskit/circuit/library/templates/clifford/clifford_2_1.py +8 -9
  96. qiskit/circuit/library/templates/clifford/clifford_2_2.py +9 -10
  97. qiskit/circuit/library/templates/clifford/clifford_2_3.py +7 -9
  98. qiskit/circuit/library/templates/clifford/clifford_2_4.py +8 -9
  99. qiskit/circuit/library/templates/clifford/clifford_3_1.py +8 -9
  100. qiskit/circuit/library/templates/clifford/clifford_4_1.py +9 -10
  101. qiskit/circuit/library/templates/clifford/clifford_4_2.py +9 -10
  102. qiskit/circuit/library/templates/clifford/clifford_4_3.py +9 -10
  103. qiskit/circuit/library/templates/clifford/clifford_4_4.py +9 -10
  104. qiskit/circuit/library/templates/clifford/clifford_5_1.py +9 -10
  105. qiskit/circuit/library/templates/clifford/clifford_6_1.py +9 -10
  106. qiskit/circuit/library/templates/clifford/clifford_6_2.py +9 -10
  107. qiskit/circuit/library/templates/clifford/clifford_6_3.py +9 -10
  108. qiskit/circuit/library/templates/clifford/clifford_6_4.py +8 -9
  109. qiskit/circuit/library/templates/clifford/clifford_6_5.py +9 -10
  110. qiskit/circuit/library/templates/clifford/clifford_8_1.py +9 -10
  111. qiskit/circuit/library/templates/clifford/clifford_8_2.py +9 -10
  112. qiskit/circuit/library/templates/clifford/clifford_8_3.py +9 -10
  113. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +7 -9
  114. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +8 -10
  115. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +10 -12
  116. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +14 -16
  117. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +12 -14
  118. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +10 -12
  119. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +12 -14
  120. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +10 -12
  121. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +10 -12
  122. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +10 -12
  123. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +10 -12
  124. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +9 -11
  125. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +9 -11
  126. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +10 -12
  127. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +10 -12
  128. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +10 -12
  129. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +10 -12
  130. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +10 -12
  131. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +10 -12
  132. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +11 -13
  133. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +11 -13
  134. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +11 -13
  135. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +11 -13
  136. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +11 -13
  137. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +11 -13
  138. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +9 -11
  139. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +10 -12
  140. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +10 -12
  141. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +10 -12
  142. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +10 -12
  143. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +10 -12
  144. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +10 -12
  145. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +10 -12
  146. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +10 -12
  147. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +10 -12
  148. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +10 -12
  149. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +10 -12
  150. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +9 -11
  151. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +10 -12
  152. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +10 -12
  153. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +10 -12
  154. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +10 -12
  155. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +10 -12
  156. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +10 -12
  157. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +10 -12
  158. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +10 -12
  159. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +10 -12
  160. qiskit/circuit/library/templates/rzx/rzx_cy.py +10 -11
  161. qiskit/circuit/library/templates/rzx/rzx_xz.py +15 -16
  162. qiskit/circuit/library/templates/rzx/rzx_yz.py +10 -12
  163. qiskit/circuit/library/templates/rzx/rzx_zz1.py +20 -22
  164. qiskit/circuit/library/templates/rzx/rzx_zz2.py +15 -16
  165. qiskit/circuit/library/templates/rzx/rzx_zz3.py +15 -17
  166. qiskit/circuit/parameter.py +0 -4
  167. qiskit/circuit/parameterexpression.py +34 -167
  168. qiskit/circuit/quantumcircuit.py +126 -162
  169. qiskit/circuit/singleton.py +0 -2
  170. qiskit/circuit/store.py +0 -2
  171. qiskit/compiler/assembler.py +4 -17
  172. qiskit/compiler/scheduler.py +0 -2
  173. qiskit/compiler/sequencer.py +0 -2
  174. qiskit/compiler/transpiler.py +26 -81
  175. qiskit/converters/circuit_to_dag.py +2 -2
  176. qiskit/converters/circuit_to_dagdependency.py +1 -1
  177. qiskit/converters/circuit_to_dagdependency_v2.py +1 -1
  178. qiskit/converters/circuit_to_instruction.py +1 -1
  179. qiskit/converters/dag_to_circuit.py +5 -7
  180. qiskit/converters/dag_to_dagdependency.py +1 -1
  181. qiskit/converters/dag_to_dagdependency_v2.py +1 -1
  182. qiskit/converters/dagdependency_to_circuit.py +1 -5
  183. qiskit/converters/dagdependency_to_dag.py +1 -6
  184. qiskit/dagcircuit/collect_blocks.py +3 -3
  185. qiskit/dagcircuit/dagdependency.py +5 -18
  186. qiskit/dagcircuit/dagdependency_v2.py +1 -1
  187. qiskit/dagcircuit/dagnode.py +2 -2
  188. qiskit/passmanager/__init__.py +2 -2
  189. qiskit/primitives/backend_estimator.py +2 -5
  190. qiskit/primitives/backend_sampler_v2.py +18 -61
  191. qiskit/primitives/base/base_estimator.py +2 -2
  192. qiskit/primitives/containers/data_bin.py +1 -9
  193. qiskit/primitives/statevector_sampler.py +1 -1
  194. qiskit/primitives/utils.py +1 -1
  195. qiskit/providers/__init__.py +3 -3
  196. qiskit/providers/backend.py +1 -12
  197. qiskit/providers/backend_compat.py +3 -23
  198. qiskit/providers/basic_provider/basic_simulator.py +2 -12
  199. qiskit/providers/fake_provider/fake_pulse_backend.py +1 -6
  200. qiskit/providers/fake_provider/generic_backend_v2.py +30 -46
  201. qiskit/providers/models/pulsedefaults.py +0 -2
  202. qiskit/pulse/builder.py +18 -59
  203. qiskit/pulse/calibration_entries.py +1 -4
  204. qiskit/pulse/channels.py +0 -2
  205. qiskit/pulse/exceptions.py +0 -2
  206. qiskit/pulse/instruction_schedule_map.py +6 -21
  207. qiskit/pulse/instructions/acquire.py +0 -2
  208. qiskit/pulse/instructions/delay.py +0 -2
  209. qiskit/pulse/instructions/directives.py +0 -8
  210. qiskit/pulse/instructions/frequency.py +0 -3
  211. qiskit/pulse/instructions/instruction.py +0 -2
  212. qiskit/pulse/instructions/phase.py +0 -3
  213. qiskit/pulse/instructions/play.py +0 -2
  214. qiskit/pulse/instructions/reference.py +0 -2
  215. qiskit/pulse/instructions/snapshot.py +0 -2
  216. qiskit/pulse/library/pulse.py +0 -2
  217. qiskit/pulse/library/symbolic_pulses.py +0 -28
  218. qiskit/pulse/library/waveform.py +0 -2
  219. qiskit/pulse/macros.py +1 -1
  220. qiskit/pulse/schedule.py +13 -12
  221. qiskit/pulse/transforms/alignments.py +3 -5
  222. qiskit/pulse/transforms/dag.py +0 -7
  223. qiskit/qasm2/export.py +3 -5
  224. qiskit/qasm2/parse.py +2 -46
  225. qiskit/qasm3/__init__.py +0 -1
  226. qiskit/qasm3/ast.py +15 -123
  227. qiskit/qasm3/exporter.py +77 -103
  228. qiskit/qobj/converters/pulse_instruction.py +4 -6
  229. qiskit/qpy/__init__.py +0 -181
  230. qiskit/qpy/binary_io/circuits.py +5 -20
  231. qiskit/qpy/binary_io/schedules.py +4 -3
  232. qiskit/qpy/binary_io/value.py +13 -310
  233. qiskit/qpy/common.py +2 -46
  234. qiskit/qpy/formats.py +0 -7
  235. qiskit/qpy/interface.py +4 -40
  236. qiskit/quantum_info/__init__.py +0 -4
  237. qiskit/quantum_info/operators/channel/transformations.py +21 -28
  238. qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
  239. qiskit/quantum_info/operators/operator.py +8 -54
  240. qiskit/quantum_info/operators/symplectic/base_pauli.py +19 -11
  241. qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
  242. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +1 -1
  243. qiskit/quantum_info/operators/symplectic/pauli.py +0 -2
  244. qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
  245. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +2 -23
  246. qiskit/quantum_info/states/densitymatrix.py +5 -5
  247. qiskit/quantum_info/states/stabilizerstate.py +1 -1
  248. qiskit/quantum_info/states/statevector.py +6 -6
  249. qiskit/result/mitigation/base_readout_mitigator.py +1 -1
  250. qiskit/result/mitigation/correlated_readout_mitigator.py +1 -9
  251. qiskit/result/mitigation/local_readout_mitigator.py +1 -9
  252. qiskit/result/mitigation/utils.py +0 -57
  253. qiskit/scheduler/config.py +0 -2
  254. qiskit/scheduler/methods/basic.py +0 -3
  255. qiskit/scheduler/schedule_circuit.py +0 -2
  256. qiskit/scheduler/sequence.py +0 -2
  257. qiskit/synthesis/__init__.py +0 -25
  258. qiskit/synthesis/clifford/clifford_decompose_bm.py +2 -1
  259. qiskit/synthesis/clifford/clifford_decompose_greedy.py +2 -3
  260. qiskit/synthesis/clifford/clifford_decompose_layers.py +1 -2
  261. qiskit/synthesis/evolution/__init__.py +0 -1
  262. qiskit/synthesis/evolution/lie_trotter.py +42 -16
  263. qiskit/synthesis/evolution/product_formula.py +238 -165
  264. qiskit/synthesis/evolution/qdrift.py +29 -36
  265. qiskit/synthesis/evolution/suzuki_trotter.py +27 -87
  266. qiskit/synthesis/multi_controlled/__init__.py +0 -1
  267. qiskit/synthesis/qft/qft_decompose_full.py +1 -19
  268. qiskit/synthesis/qft/qft_decompose_lnn.py +1 -2
  269. qiskit/synthesis/stabilizer/stabilizer_decompose.py +1 -2
  270. qiskit/synthesis/two_qubit/two_qubit_decompose.py +63 -4
  271. qiskit/synthesis/two_qubit/weyl.py +97 -0
  272. qiskit/synthesis/unitary/qsd.py +5 -5
  273. qiskit/transpiler/__init__.py +14 -21
  274. qiskit/transpiler/basepasses.py +1 -1
  275. qiskit/transpiler/passes/__init__.py +0 -2
  276. qiskit/transpiler/passes/basis/basis_translator.py +565 -9
  277. qiskit/transpiler/passes/basis/decompose.py +12 -45
  278. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  279. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
  280. qiskit/transpiler/passes/calibration/pulse_gate.py +2 -4
  281. qiskit/transpiler/passes/calibration/rx_builder.py +7 -11
  282. qiskit/transpiler/passes/calibration/rzx_builder.py +30 -46
  283. qiskit/transpiler/passes/layout/disjoint_utils.py +13 -15
  284. qiskit/transpiler/passes/layout/sabre_layout.py +2 -7
  285. qiskit/transpiler/passes/layout/sabre_pre_layout.py +0 -5
  286. qiskit/transpiler/passes/optimization/__init__.py +0 -1
  287. qiskit/transpiler/passes/optimization/collect_cliffords.py +3 -19
  288. qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
  289. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
  290. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
  291. qiskit/transpiler/passes/optimization/consolidate_blocks.py +131 -48
  292. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +2 -4
  293. qiskit/transpiler/passes/optimization/elide_permutations.py +32 -9
  294. qiskit/transpiler/passes/optimization/inverse_cancellation.py +0 -2
  295. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +11 -5
  296. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
  297. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
  298. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
  299. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
  300. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
  301. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
  302. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
  303. qiskit/transpiler/passes/routing/sabre_swap.py +3 -7
  304. qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
  305. qiskit/transpiler/passes/scheduling/alap.py +1 -1
  306. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
  307. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
  308. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -2
  309. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
  310. qiskit/transpiler/passes/scheduling/asap.py +1 -1
  311. qiskit/transpiler/passes/scheduling/base_scheduler.py +12 -14
  312. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +4 -9
  313. qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
  314. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +5 -16
  315. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +1 -4
  316. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +2 -6
  317. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -9
  318. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +99 -262
  319. qiskit/transpiler/passes/synthesis/hls_plugins.py +7 -638
  320. qiskit/transpiler/passes/synthesis/qubit_tracker.py +132 -0
  321. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
  322. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -55
  323. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +56 -2
  324. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -5
  325. qiskit/transpiler/passes/utils/gate_direction.py +275 -12
  326. qiskit/transpiler/passes/utils/gates_basis.py +30 -7
  327. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +1 -2
  328. qiskit/transpiler/passmanager_config.py +4 -22
  329. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +14 -40
  330. qiskit/transpiler/preset_passmanagers/common.py +3 -5
  331. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +42 -125
  332. qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
  333. qiskit/transpiler/target.py +16 -74
  334. qiskit/visualization/circuit/_utils.py +2 -2
  335. qiskit/visualization/circuit/circuit_visualization.py +2 -3
  336. qiskit/visualization/circuit/matplotlib.py +1 -1
  337. qiskit/visualization/dag_visualization.py +1 -1
  338. qiskit/visualization/pass_manager_visualization.py +14 -3
  339. qiskit/visualization/pulse_v2/interface.py +1 -3
  340. qiskit/visualization/timeline/core.py +2 -25
  341. qiskit/visualization/timeline/interface.py +0 -12
  342. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/METADATA +19 -20
  343. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/RECORD +347 -358
  344. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/WHEEL +1 -1
  345. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/entry_points.txt +0 -19
  346. qiskit/circuit/library/data_preparation/_zz_feature_map.py +0 -150
  347. qiskit/circuit/twirling.py +0 -145
  348. qiskit/synthesis/arithmetic/__init__.py +0 -16
  349. qiskit/synthesis/arithmetic/adders/__init__.py +0 -17
  350. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +0 -154
  351. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +0 -103
  352. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +0 -161
  353. qiskit/synthesis/arithmetic/multipliers/__init__.py +0 -16
  354. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +0 -102
  355. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +0 -99
  356. qiskit/synthesis/evolution/pauli_network.py +0 -80
  357. qiskit/synthesis/multi_controlled/mcmt_vchain.py +0 -52
  358. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +0 -69
  359. qiskit/utils/deprecate_pulse.py +0 -119
  360. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/LICENSE.txt +0 -0
  361. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,132 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2024.
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
+ """A qubit state tracker for synthesizing operations with auxiliary qubits."""
14
+
15
+ from __future__ import annotations
16
+ from collections.abc import Iterable
17
+ from dataclasses import dataclass
18
+
19
+
20
+ @dataclass
21
+ class QubitTracker:
22
+ """Track qubits (by global index) and their state.
23
+
24
+ The states are distinguished into clean (meaning in state :math:`|0\rangle`) or dirty (an
25
+ unknown state).
26
+ """
27
+
28
+ # This could in future be extended to track different state types, if necessary.
29
+ # However, using sets of integers here is much faster than e.g. storing a dictionary with
30
+ # {index: state} entries.
31
+ qubits: tuple[int]
32
+ clean: set[int]
33
+ dirty: set[int]
34
+
35
+ def num_clean(self, active_qubits: Iterable[int] | None = None):
36
+ """Return the number of clean qubits, not considering the active qubits."""
37
+ # this could be cached if getting the set length becomes a performance bottleneck
38
+ return len(self.clean.difference(active_qubits or set()))
39
+
40
+ def num_dirty(self, active_qubits: Iterable[int] | None = None):
41
+ """Return the number of dirty qubits, not considering the active qubits."""
42
+ return len(self.dirty.difference(active_qubits or set()))
43
+
44
+ def borrow(self, num_qubits: int, active_qubits: Iterable[int] | None = None) -> list[int]:
45
+ """Get ``num_qubits`` qubits, excluding ``active_qubits``."""
46
+ active_qubits = set(active_qubits or [])
47
+ available_qubits = [qubit for qubit in self.qubits if qubit not in active_qubits]
48
+
49
+ if num_qubits > (available := len(available_qubits)):
50
+ raise RuntimeError(f"Cannot borrow {num_qubits} qubits, only {available} available.")
51
+
52
+ # for now, prioritize returning clean qubits
53
+ available_clean = [qubit for qubit in available_qubits if qubit in self.clean]
54
+ available_dirty = [qubit for qubit in available_qubits if qubit in self.dirty]
55
+
56
+ borrowed = available_clean[:num_qubits]
57
+ return borrowed + available_dirty[: (num_qubits - len(borrowed))]
58
+
59
+ def used(self, qubits: Iterable[int], check: bool = True) -> None:
60
+ """Set the state of ``qubits`` to used (i.e. False)."""
61
+ qubits = set(qubits)
62
+
63
+ if check:
64
+ if len(untracked := qubits.difference(self.qubits)) > 0:
65
+ raise ValueError(f"Setting state of untracked qubits: {untracked}. Tracker: {self}")
66
+
67
+ self.clean -= qubits
68
+ self.dirty |= qubits
69
+
70
+ def reset(self, qubits: Iterable[int], check: bool = True) -> None:
71
+ """Set the state of ``qubits`` to 0 (i.e. True)."""
72
+ qubits = set(qubits)
73
+
74
+ if check:
75
+ if len(untracked := qubits.difference(self.qubits)) > 0:
76
+ raise ValueError(f"Setting state of untracked qubits: {untracked}. Tracker: {self}")
77
+
78
+ self.clean |= qubits
79
+ self.dirty -= qubits
80
+
81
+ def drop(self, qubits: Iterable[int], check: bool = True) -> None:
82
+ """Drop qubits from the tracker, meaning that they are no longer available."""
83
+ qubits = set(qubits)
84
+
85
+ if check:
86
+ if len(untracked := qubits.difference(self.qubits)) > 0:
87
+ raise ValueError(f"Dropping untracked qubits: {untracked}. Tracker: {self}")
88
+
89
+ self.qubits = tuple(qubit for qubit in self.qubits if qubit not in qubits)
90
+ self.clean -= qubits
91
+ self.dirty -= qubits
92
+
93
+ def copy(
94
+ self, qubit_map: dict[int, int] | None = None, drop: Iterable[int] | None = None
95
+ ) -> "QubitTracker":
96
+ """Copy self.
97
+
98
+ Args:
99
+ qubit_map: If provided, apply the mapping ``{old_qubit: new_qubit}`` to
100
+ the qubits in the tracker. Only those old qubits in the mapping will be
101
+ part of the new one.
102
+ drop: If provided, drop these qubits in the copied tracker. This argument is ignored
103
+ if ``qubit_map`` is given, since the qubits can then just be dropped in the map.
104
+ """
105
+ if qubit_map is None and drop is not None:
106
+ remaining_qubits = [qubit for qubit in self.qubits if qubit not in drop]
107
+ qubit_map = dict(zip(remaining_qubits, remaining_qubits))
108
+
109
+ if qubit_map is None:
110
+ clean = self.clean.copy()
111
+ dirty = self.dirty.copy()
112
+ qubits = self.qubits # tuple is immutable, no need to copy
113
+ else:
114
+ clean, dirty = set(), set()
115
+ for old_index, new_index in qubit_map.items():
116
+ if old_index in self.clean:
117
+ clean.add(new_index)
118
+ elif old_index in self.dirty:
119
+ dirty.add(new_index)
120
+ else:
121
+ raise ValueError(f"Unknown old qubit index: {old_index}. Tracker: {self}")
122
+
123
+ qubits = tuple(qubit_map.values())
124
+
125
+ return QubitTracker(qubits, clean=clean, dirty=dirty)
126
+
127
+ def __str__(self) -> str:
128
+ return (
129
+ f"QubitTracker({len(self.qubits)}, clean: {self.num_clean()}, dirty: {self.num_dirty()})"
130
+ + f"\n\tclean: {self.clean}"
131
+ + f"\n\tdirty: {self.dirty}"
132
+ )
@@ -52,7 +52,7 @@ class SolovayKitaev(TransformationPass):
52
52
 
53
53
  For example, the following circuit
54
54
 
55
- .. code-block:: text
55
+ .. parsed-literal::
56
56
 
57
57
  ┌─────────┐
58
58
  q_0: ┤ RX(0.8) ├
@@ -60,7 +60,7 @@ class SolovayKitaev(TransformationPass):
60
60
 
61
61
  can be decomposed into
62
62
 
63
- .. code-block:: text
63
+ .. parsed-literal::
64
64
 
65
65
  global phase: 7π/8
66
66
  ┌───┐┌───┐┌───┐
@@ -95,7 +95,7 @@ class SolovayKitaev(TransformationPass):
95
95
 
96
96
  print("Error:", np.linalg.norm(Operator(circuit).data - Operator(discretized).data))
97
97
 
98
- .. code-block:: text
98
+ .. parsed-literal::
99
99
 
100
100
  Original circuit:
101
101
  ┌─────────┐
@@ -73,7 +73,6 @@ from qiskit.transpiler.passes.optimization.optimize_1q_decomposition import (
73
73
  from qiskit.transpiler.passes.synthesis import plugin
74
74
  from qiskit.transpiler.target import Target
75
75
 
76
- from qiskit._accelerate.unitary_synthesis import run_default_main_loop
77
76
 
78
77
  GATE_NAME_MAP = {
79
78
  "cx": CXGate._standard_gate,
@@ -457,6 +456,37 @@ class UnitarySynthesis(TransformationPass):
457
456
  default_kwargs = {}
458
457
  method_list = [(plugin_method, plugin_kwargs), (default_method, default_kwargs)]
459
458
 
459
+ for method, kwargs in method_list:
460
+ if method.supports_basis_gates:
461
+ kwargs["basis_gates"] = self._basis_gates
462
+ if method.supports_natural_direction:
463
+ kwargs["natural_direction"] = self._natural_direction
464
+ if method.supports_pulse_optimize:
465
+ kwargs["pulse_optimize"] = self._pulse_optimize
466
+ if method.supports_gate_lengths:
467
+ _gate_lengths = _gate_lengths or _build_gate_lengths(
468
+ self._backend_props, self._target
469
+ )
470
+ kwargs["gate_lengths"] = _gate_lengths
471
+ if method.supports_gate_errors:
472
+ _gate_errors = _gate_errors or _build_gate_errors(self._backend_props, self._target)
473
+ kwargs["gate_errors"] = _gate_errors
474
+ if method.supports_gate_lengths_by_qubit:
475
+ _gate_lengths_by_qubit = _gate_lengths_by_qubit or _build_gate_lengths_by_qubit(
476
+ self._backend_props, self._target
477
+ )
478
+ kwargs["gate_lengths_by_qubit"] = _gate_lengths_by_qubit
479
+ if method.supports_gate_errors_by_qubit:
480
+ _gate_errors_by_qubit = _gate_errors_by_qubit or _build_gate_errors_by_qubit(
481
+ self._backend_props, self._target
482
+ )
483
+ kwargs["gate_errors_by_qubit"] = _gate_errors_by_qubit
484
+ supported_bases = method.supported_bases
485
+ if supported_bases is not None:
486
+ kwargs["matched_basis"] = _choose_bases(self._basis_gates, supported_bases)
487
+ if method.supports_target:
488
+ kwargs["target"] = self._target
489
+
460
490
  # Handle approximation degree as a special case for backwards compatibility, it's
461
491
  # not part of the plugin interface and only something needed for the default
462
492
  # pass.
@@ -471,60 +501,9 @@ class UnitarySynthesis(TransformationPass):
471
501
  if plugin_method.supports_coupling_map or default_method.supports_coupling_map
472
502
  else {}
473
503
  )
474
-
475
- if self.method == "default" and self._target is not None:
476
- _coupling_edges = (
477
- set(self._coupling_map.get_edges()) if self._coupling_map is not None else set()
478
- )
479
-
480
- out = run_default_main_loop(
481
- dag,
482
- list(qubit_indices.values()),
483
- self._min_qubits,
484
- self._target,
485
- _coupling_edges,
486
- self._approximation_degree,
487
- self._natural_direction,
488
- )
489
- return out
490
- else:
491
- for method, kwargs in method_list:
492
- if method.supports_basis_gates:
493
- kwargs["basis_gates"] = self._basis_gates
494
- if method.supports_natural_direction:
495
- kwargs["natural_direction"] = self._natural_direction
496
- if method.supports_pulse_optimize:
497
- kwargs["pulse_optimize"] = self._pulse_optimize
498
- if method.supports_gate_lengths:
499
- _gate_lengths = _gate_lengths or _build_gate_lengths(
500
- self._backend_props, self._target
501
- )
502
- kwargs["gate_lengths"] = _gate_lengths
503
- if method.supports_gate_errors:
504
- _gate_errors = _gate_errors or _build_gate_errors(
505
- self._backend_props, self._target
506
- )
507
- kwargs["gate_errors"] = _gate_errors
508
- if method.supports_gate_lengths_by_qubit:
509
- _gate_lengths_by_qubit = _gate_lengths_by_qubit or _build_gate_lengths_by_qubit(
510
- self._backend_props, self._target
511
- )
512
- kwargs["gate_lengths_by_qubit"] = _gate_lengths_by_qubit
513
- if method.supports_gate_errors_by_qubit:
514
- _gate_errors_by_qubit = _gate_errors_by_qubit or _build_gate_errors_by_qubit(
515
- self._backend_props, self._target
516
- )
517
- kwargs["gate_errors_by_qubit"] = _gate_errors_by_qubit
518
- supported_bases = method.supported_bases
519
- if supported_bases is not None:
520
- kwargs["matched_basis"] = _choose_bases(self._basis_gates, supported_bases)
521
- if method.supports_target:
522
- kwargs["target"] = self._target
523
-
524
- out = self._run_main_loop(
525
- dag, qubit_indices, plugin_method, plugin_kwargs, default_method, default_kwargs
526
- )
527
- return out
504
+ return self._run_main_loop(
505
+ dag, qubit_indices, plugin_method, plugin_kwargs, default_method, default_kwargs
506
+ )
528
507
 
529
508
  def _run_main_loop(
530
509
  self, dag, qubit_indices, plugin_method, plugin_kwargs, default_method, default_kwargs
@@ -13,8 +13,9 @@
13
13
 
14
14
  """Add a barrier before final measurements."""
15
15
 
16
- from qiskit._accelerate.barrier_before_final_measurement import barrier_before_final_measurements
16
+ from qiskit.circuit.barrier import Barrier
17
17
  from qiskit.transpiler.basepasses import TransformationPass
18
+ from qiskit.dagcircuit import DAGCircuit, DAGOpNode
18
19
  from .merge_adjacent_barriers import MergeAdjacentBarriers
19
20
 
20
21
 
@@ -32,7 +33,60 @@ class BarrierBeforeFinalMeasurements(TransformationPass):
32
33
 
33
34
  def run(self, dag):
34
35
  """Run the BarrierBeforeFinalMeasurements pass on `dag`."""
35
- barrier_before_final_measurements(dag, self.label)
36
+ # Collect DAG nodes which are followed only by barriers or other measures.
37
+ final_op_types = ["measure", "barrier"]
38
+ final_ops = []
39
+ for candidate_node in dag.named_nodes(*final_op_types):
40
+ is_final_op = True
41
+
42
+ for _, child_successors in dag.bfs_successors(candidate_node):
43
+
44
+ if any(
45
+ isinstance(suc, DAGOpNode) and suc.name not in final_op_types
46
+ for suc in child_successors
47
+ ):
48
+ is_final_op = False
49
+ break
50
+
51
+ if is_final_op:
52
+ final_ops.append(candidate_node)
53
+
54
+ if not final_ops:
55
+ return dag
56
+
57
+ # Create a layer with the barrier and add both bits and registers from the original dag.
58
+ barrier_layer = DAGCircuit()
59
+ barrier_layer.add_qubits(dag.qubits)
60
+ for qreg in dag.qregs.values():
61
+ barrier_layer.add_qreg(qreg)
62
+ barrier_layer.add_clbits(dag.clbits)
63
+ for creg in dag.cregs.values():
64
+ barrier_layer.add_creg(creg)
65
+
66
+ # Add a barrier across all qubits so swap mapper doesn't add a swap
67
+ # from an unmeasured qubit after a measure.
68
+ final_qubits = dag.qubits
69
+
70
+ barrier_layer.apply_operation_back(
71
+ Barrier(len(final_qubits), label=self.label), final_qubits, (), check=False
72
+ )
73
+
74
+ # Preserve order of final ops collected earlier from the original DAG.
75
+ ordered_final_nodes = [
76
+ node for node in dag.topological_op_nodes() if node in set(final_ops)
77
+ ]
78
+
79
+ # Move final ops to the new layer and append the new layer to the DAG.
80
+ for final_node in ordered_final_nodes:
81
+ barrier_layer.apply_operation_back(
82
+ final_node.op, final_node.qargs, final_node.cargs, check=False
83
+ )
84
+
85
+ for final_op in final_ops:
86
+ dag.remove_op_node(final_op)
87
+
88
+ dag.compose(barrier_layer)
89
+
36
90
  if self.label is None:
37
91
  # Merge the new barrier into any other barriers
38
92
  adjacent_pass = MergeAdjacentBarriers()
@@ -22,7 +22,6 @@ from qiskit.circuit import (
22
22
  )
23
23
  from qiskit.dagcircuit import DAGCircuit
24
24
  from qiskit.transpiler.basepasses import TransformationPass
25
- from qiskit.utils import deprecate_func
26
25
 
27
26
 
28
27
  class ConvertConditionsToIfOps(TransformationPass):
@@ -32,10 +31,6 @@ class ConvertConditionsToIfOps(TransformationPass):
32
31
  This is a simple pass aimed at easing the conversion from the old style of using
33
32
  :meth:`.InstructionSet.c_if` into the new style of using more complex conditional logic."""
34
33
 
35
- @deprecate_func(since="1.3.0", removal_timeline="in Qiskit 2.0.0")
36
- def __init__(self):
37
- super().__init__()
38
-
39
34
  def _run_inner(self, dag):
40
35
  """Run the pass on one :class:`.DAGCircuit`, mutating it. Returns ``True`` if the circuit
41
36
  was modified and ``False`` if not."""