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
@@ -11,9 +11,11 @@
11
11
  # that they have been altered from the originals.
12
12
 
13
13
  """Compute the sum of two qubit registers using Classical Addition."""
14
-
15
14
  from __future__ import annotations
16
- from qiskit.synthesis.arithmetic import adder_ripple_v95
15
+ from qiskit.circuit.bit import Bit
16
+
17
+ from qiskit.circuit import QuantumCircuit, QuantumRegister, AncillaRegister
18
+
17
19
  from .adder import Adder
18
20
 
19
21
 
@@ -24,7 +26,7 @@ class VBERippleCarryAdder(Adder):
24
26
  As an example, a classical adder circuit that performs full addition (i.e. including
25
27
  a carry-in bit) on two 2-qubit sized registers is as follows:
26
28
 
27
- .. code-block:: text
29
+ .. parsed-literal::
28
30
 
29
31
  ┌────────┐ ┌───────────┐┌──────┐
30
32
  cin_0: ┤0 ├───────────────────────┤0 ├┤0 ├
@@ -50,22 +52,6 @@ class VBERippleCarryAdder(Adder):
50
52
  This is different ordering as compared to Figure 2 in [1], which leads to a different
51
53
  drawing of the circuit.
52
54
 
53
- .. seealso::
54
-
55
- The following generic gate objects perform additions, like this circuit class,
56
- but allow the compiler to select the optimal decomposition based on the context.
57
- Specific implementations can be set via the :class:`.HLSConfig`, e.g. this circuit
58
- can be chosen via ``Adder=["ripple_v95"]``.
59
-
60
- :class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
61
- is functionally equivalent to ``kind="fixed"``.
62
-
63
- :class:`.HalfAdderGate`: A generic inplace adder. This
64
- is functionally equivalent to ``kind="half"``.
65
-
66
- :class:`.FullAdderGate`: A generic inplace adder, with a carry-in bit. This
67
- is functionally equivalent to ``kind="full"``.
68
-
69
55
  **References:**
70
56
 
71
57
  [1] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995.
@@ -88,8 +74,92 @@ class VBERippleCarryAdder(Adder):
88
74
  Raises:
89
75
  ValueError: If ``num_state_qubits`` is lower than 1.
90
76
  """
77
+ if num_state_qubits < 1:
78
+ raise ValueError("The number of qubits must be at least 1.")
79
+
91
80
  super().__init__(num_state_qubits, name=name)
92
- circuit = adder_ripple_v95(num_state_qubits, kind)
93
81
 
94
- self.add_register(*circuit.qregs)
82
+ # define the input registers
83
+ registers: list[QuantumRegister | list[Bit]] = []
84
+ if kind == "full":
85
+ qr_cin = QuantumRegister(1, name="cin")
86
+ registers.append(qr_cin)
87
+ else:
88
+ qr_cin = QuantumRegister(0)
89
+
90
+ qr_a = QuantumRegister(num_state_qubits, name="a")
91
+ qr_b = QuantumRegister(num_state_qubits, name="b")
92
+
93
+ registers += [qr_a, qr_b]
94
+
95
+ if kind in ["half", "full"]:
96
+ qr_cout = QuantumRegister(1, name="cout")
97
+ registers.append(qr_cout)
98
+ else:
99
+ qr_cout = QuantumRegister(0)
100
+
101
+ self.add_register(*registers)
102
+
103
+ if num_state_qubits > 1:
104
+ qr_help = AncillaRegister(num_state_qubits - 1, name="helper")
105
+ self.add_register(qr_help)
106
+ else:
107
+ qr_help = AncillaRegister(0)
108
+
109
+ # the code is simplified a lot if we create a list of all carries and helpers
110
+ carries = qr_cin[:] + qr_help[:] + qr_cout[:]
111
+
112
+ # corresponds to Carry gate in [1]
113
+ qc_carry = QuantumCircuit(4, name="Carry")
114
+ qc_carry.ccx(1, 2, 3)
115
+ qc_carry.cx(1, 2)
116
+ qc_carry.ccx(0, 2, 3)
117
+ carry_gate = qc_carry.to_gate()
118
+ carry_gate_dg = carry_gate.inverse()
119
+
120
+ # corresponds to Sum gate in [1]
121
+ qc_sum = QuantumCircuit(3, name="Sum")
122
+ qc_sum.cx(1, 2)
123
+ qc_sum.cx(0, 2)
124
+ sum_gate = qc_sum.to_gate()
125
+
126
+ circuit = QuantumCircuit(*self.qregs, name=name)
127
+
128
+ # handle all cases for the first qubits, depending on whether cin is available
129
+ i = 0
130
+ if kind == "half":
131
+ i += 1
132
+ circuit.ccx(qr_a[0], qr_b[0], carries[0])
133
+ elif kind == "fixed":
134
+ i += 1
135
+ if num_state_qubits == 1:
136
+ circuit.cx(qr_a[0], qr_b[0])
137
+ else:
138
+ circuit.ccx(qr_a[0], qr_b[0], carries[0])
139
+
140
+ for inp, out in zip(carries[:-1], carries[1:]):
141
+ circuit.append(carry_gate, [inp, qr_a[i], qr_b[i], out])
142
+ i += 1
143
+
144
+ if kind in ["full", "half"]: # final CX (cancels for the 'fixed' case)
145
+ circuit.cx(qr_a[-1], qr_b[-1])
146
+
147
+ if len(carries) > 1:
148
+ circuit.append(sum_gate, [carries[-2], qr_a[-1], qr_b[-1]])
149
+
150
+ i -= 2
151
+ for j, (inp, out) in enumerate(zip(reversed(carries[:-1]), reversed(carries[1:]))):
152
+ if j == 0:
153
+ if kind == "fixed":
154
+ i += 1
155
+ else:
156
+ continue
157
+ circuit.append(carry_gate_dg, [inp, qr_a[i], qr_b[i], out])
158
+ circuit.append(sum_gate, [inp, qr_a[i], qr_b[i]])
159
+ i -= 1
160
+
161
+ if kind in ["half", "fixed"] and num_state_qubits > 1:
162
+ circuit.ccx(qr_a[0], qr_b[0], carries[0])
163
+ circuit.cx(qr_a[0], qr_b[0])
164
+
95
165
  self.append(circuit.to_gate(), self.qubits)
@@ -27,7 +27,7 @@ class LinearPauliRotations(FunctionalPauliRotations):
27
27
  For a register of state qubits :math:`|x\rangle`, a target qubit :math:`|0\rangle` and the
28
28
  basis ``'Y'`` this circuit acts as:
29
29
 
30
- .. code-block:: text
30
+ .. parsed-literal::
31
31
 
32
32
  q_0: ─────────────────────────■───────── ... ──────────────────────
33
33
 
@@ -14,4 +14,3 @@
14
14
 
15
15
  from .hrs_cumulative_multiplier import HRSCumulativeMultiplier
16
16
  from .rg_qft_multiplier import RGQFTMultiplier
17
- from .multiplier import MultiplierGate
@@ -26,7 +26,7 @@ class HRSCumulativeMultiplier(Multiplier):
26
26
  the default adder is as follows (where ``Adder`` denotes the
27
27
  ``CDKMRippleCarryAdder``):
28
28
 
29
- .. code-block:: text
29
+ .. parsed-literal::
30
30
 
31
31
  a_0: ────■─────────────────────────
32
32
 
@@ -59,13 +59,6 @@ class HRSCumulativeMultiplier(Multiplier):
59
59
  a series of shifted additions using one of the input registers while the qubits
60
60
  from the other input register act as control qubits for the adders.
61
61
 
62
- .. seealso::
63
-
64
- The :class:`.MultiplierGate` objects represents a multiplication, like this circuit class,
65
- but allows the compiler to select the optimal decomposition based on the context.
66
- Specific implementations can be set via the :class:`.HLSConfig`, e.g. this circuit
67
- can be chosen via ``Multiplier=["cumulative_h18"]``.
68
-
69
62
  **References:**
70
63
 
71
64
  [1] Häner et al., Optimizing Quantum Circuits for Arithmetic, 2018.
@@ -12,10 +12,9 @@
12
12
 
13
13
  """Compute the product of two equally sized qubit registers."""
14
14
 
15
- from __future__ import annotations
15
+ from typing import Optional
16
16
 
17
- from qiskit.circuit import QuantumCircuit, Gate
18
- from qiskit.utils.deprecation import deprecate_func
17
+ from qiskit.circuit import QuantumCircuit
19
18
 
20
19
 
21
20
  class Multiplier(QuantumCircuit):
@@ -46,19 +45,10 @@ class Multiplier(QuantumCircuit):
46
45
 
47
46
  """
48
47
 
49
- @deprecate_func(
50
- since="1.3",
51
- additional_msg=(
52
- "Use the MultiplierGate provided in qiskit.circuit.library.arithmetic instead. "
53
- "For different multiplier implementations, see "
54
- "https://docs.quantum.ibm.com/api/qiskit/synthesis.",
55
- ),
56
- pending=True,
57
- )
58
48
  def __init__(
59
49
  self,
60
50
  num_state_qubits: int,
61
- num_result_qubits: int | None = None,
51
+ num_result_qubits: Optional[int] = None,
62
52
  name: str = "Multiplier",
63
53
  ) -> None:
64
54
  """
@@ -109,84 +99,3 @@ class Multiplier(QuantumCircuit):
109
99
  The number of result qubits.
110
100
  """
111
101
  return self._num_result_qubits
112
-
113
-
114
- class MultiplierGate(Gate):
115
- r"""Compute the product of two equally sized qubit registers into a new register.
116
-
117
- For two input registers :math:`|a\rangle_n`, :math:`|b\rangle_n` with :math:`n` qubits each
118
- and an output register with :math:`2n` qubits, a multiplier performs the following operation
119
-
120
- .. math::
121
-
122
- |a\rangle_n |b\rangle_n |0\rangle_{t} \mapsto |a\rangle_n |b\rangle_n |a \cdot b\rangle_t
123
-
124
- where :math:`t` is the number of bits used to represent the result. To completely store the result
125
- of the multiplication without overflow we need :math:`t = 2n` bits.
126
-
127
- The quantum register :math:`|a\rangle_n` (analogously :math:`|b\rangle_n` and
128
- output register)
129
-
130
- .. math::
131
-
132
- |a\rangle_n = |a_0\rangle \otimes \cdots \otimes |a_{n - 1}\rangle,
133
-
134
- for :math:`a_i \in \{0, 1\}`, is associated with the integer value
135
-
136
- .. math::
137
-
138
- a = 2^{0}a_{0} + 2^{1}a_{1} + \cdots + 2^{n - 1}a_{n - 1}.
139
-
140
- """
141
-
142
- def __init__(
143
- self,
144
- num_state_qubits: int,
145
- num_result_qubits: int | None = None,
146
- label: str | None = None,
147
- ) -> None:
148
- """
149
- Args:
150
- num_state_qubits: The number of qubits in each of the input registers.
151
- num_result_qubits: The number of result qubits to limit the output to.
152
- Default value is ``2 * num_state_qubits`` to represent any possible
153
- result from the multiplication of the two inputs.
154
- name: The name of the circuit.
155
- Raises:
156
- ValueError: If ``num_state_qubits`` is smaller than 1.
157
- ValueError: If ``num_result_qubits`` is smaller than ``num_state_qubits``.
158
- ValueError: If ``num_result_qubits`` is larger than ``2 * num_state_qubits``.
159
- """
160
- if num_state_qubits < 1:
161
- raise ValueError("The number of state qubits must be at least 1.")
162
-
163
- if num_result_qubits is None:
164
- num_result_qubits = 2 * num_state_qubits
165
- elif num_result_qubits < num_state_qubits or num_result_qubits > 2 * num_state_qubits:
166
- raise ValueError(
167
- f"num_result_qubits ({num_result_qubits}) must be in between num_state_qubits "
168
- f"({num_state_qubits}) and 2 * num_state_qubits ({2 * num_state_qubits})"
169
- )
170
-
171
- super().__init__("Multiplier", 2 * num_state_qubits + num_result_qubits, [], label=label)
172
-
173
- self._num_state_qubits = num_state_qubits
174
- self._num_result_qubits = num_result_qubits
175
-
176
- @property
177
- def num_state_qubits(self) -> int:
178
- """The number of state qubits, i.e. the number of bits in each input register.
179
-
180
- Returns:
181
- The number of state qubits.
182
- """
183
- return self._num_state_qubits
184
-
185
- @property
186
- def num_result_qubits(self) -> int:
187
- """The number of result qubits to limit the output to.
188
-
189
- Returns:
190
- The number of result qubits.
191
- """
192
- return self._num_result_qubits
@@ -33,7 +33,7 @@ class RGQFTMultiplier(Multiplier):
33
33
  As an example, a circuit that performs a modular QFT multiplication on two 2-qubit
34
34
  sized input registers with an output register of 2 qubits, is as follows:
35
35
 
36
- .. code-block:: text
36
+ .. parsed-literal::
37
37
 
38
38
  a_0: ────────────────────────────────────────■───────■──────■──────■────────────────
39
39
  │ │ │ │
@@ -48,13 +48,6 @@ class RGQFTMultiplier(Multiplier):
48
48
  out_1: ┤1 ├─────────■───────────────■──────────────■─────────────■───────┤1 ├
49
49
  └──────┘ └───────┘
50
50
 
51
- .. seealso::
52
-
53
- The :class:`.MultiplierGate` objects represents a multiplication, like this circuit class,
54
- but allows the compiler to select the optimal decomposition based on the context.
55
- Specific implementations can be set via the :class:`.HLSConfig`, e.g. this circuit
56
- can be chosen via ``Multiplier=["qft_r17"]``.
57
-
58
51
  **References:**
59
52
 
60
53
  [1] Ruiz-Perez et al., Quantum arithmetic with the Quantum Fourier Transform, 2017.
@@ -45,7 +45,7 @@ class WeightedAdder(BlueprintCircuit):
45
45
  For an example where the state of 4 qubits is added into a sum register, the circuit can
46
46
  be schematically drawn as
47
47
 
48
- .. code-block:: text
48
+ .. parsed-literal::
49
49
 
50
50
  ┌────────┐
51
51
  state_0: ┤0 ├ | state_0 * weights[0]
@@ -13,10 +13,10 @@
13
13
  """Define a Quantum Fourier Transform circuit (QFT) and a native gate (QFTGate)."""
14
14
 
15
15
  from __future__ import annotations
16
+ import warnings
16
17
  import numpy as np
17
18
 
18
- from qiskit.circuit.quantumcircuit import QuantumRegister, CircuitInstruction, Gate
19
- from qiskit.utils.deprecation import deprecate_func
19
+ from qiskit.circuit.quantumcircuit import QuantumCircuit, QuantumRegister, CircuitInstruction, Gate
20
20
  from ..blueprintcircuit import BlueprintCircuit
21
21
 
22
22
 
@@ -72,14 +72,6 @@ class QFT(BlueprintCircuit):
72
72
 
73
73
  """
74
74
 
75
- @deprecate_func(
76
- since="1.3",
77
- additional_msg=(
78
- "Use qiskit.circuit.library.QFTGate or qiskit.synthesis.qft.synth_qft_full instead, "
79
- "for access to all previous arguments.",
80
- ),
81
- pending=True,
82
- )
83
75
  def __init__(
84
76
  self,
85
77
  num_qubits: int | None = None,
@@ -240,6 +232,22 @@ class QFT(BlueprintCircuit):
240
232
  inverted._inverse = not self._inverse
241
233
  return inverted
242
234
 
235
+ def _warn_if_precision_loss(self):
236
+ """Issue a warning if constructing the circuit will lose precision.
237
+
238
+ If we need an angle smaller than ``pi * 2**-1022``, we start to lose precision by going into
239
+ the subnormal numbers. We won't lose _all_ precision until an exponent of about 1075, but
240
+ beyond 1022 we're using fractional bits to represent leading zeros."""
241
+ max_num_entanglements = self.num_qubits - self.approximation_degree - 1
242
+ if max_num_entanglements > -np.finfo(float).minexp: # > 1022 for doubles.
243
+ warnings.warn(
244
+ "precision loss in QFT."
245
+ f" The rotation needed to represent {max_num_entanglements} entanglements"
246
+ " is smaller than the smallest normal floating-point number.",
247
+ category=RuntimeWarning,
248
+ stacklevel=3,
249
+ )
250
+
243
251
  def _check_configuration(self, raise_on_failure: bool = True) -> bool:
244
252
  """Check if the current configuration is valid."""
245
253
  valid = True
@@ -247,6 +255,7 @@ class QFT(BlueprintCircuit):
247
255
  valid = False
248
256
  if raise_on_failure:
249
257
  raise AttributeError("The number of qubits has not been set.")
258
+ self._warn_if_precision_loss()
250
259
  return valid
251
260
 
252
261
  def _build(self) -> None:
@@ -261,16 +270,25 @@ class QFT(BlueprintCircuit):
261
270
  if num_qubits == 0:
262
271
  return
263
272
 
264
- from qiskit.synthesis.qft import synth_qft_full
265
-
266
- circuit = synth_qft_full(
267
- num_qubits,
268
- do_swaps=self._do_swaps,
269
- insert_barriers=self._insert_barriers,
270
- approximation_degree=self._approximation_degree,
271
- inverse=self._inverse,
272
- name=self.name,
273
- )
273
+ circuit = QuantumCircuit(*self.qregs, name=self.name)
274
+ for j in reversed(range(num_qubits)):
275
+ circuit.h(j)
276
+ num_entanglements = max(0, j - max(0, self.approximation_degree - (num_qubits - j - 1)))
277
+ for k in reversed(range(j - num_entanglements, j)):
278
+ # Use negative exponents so that the angle safely underflows to zero, rather than
279
+ # using a temporary variable that overflows to infinity in the worst case.
280
+ lam = np.pi * (2.0 ** (k - j))
281
+ circuit.cp(lam, j, k)
282
+
283
+ if self.insert_barriers:
284
+ circuit.barrier()
285
+
286
+ if self._do_swaps:
287
+ for i in range(num_qubits // 2):
288
+ circuit.swap(i, num_qubits - i - 1)
289
+
290
+ if self._inverse:
291
+ circuit = circuit.inverse()
274
292
 
275
293
  wrapped = circuit.to_instruction() if self.insert_barriers else circuit.to_gate()
276
294
  self.compose(wrapped, qubits=self.qubits, inplace=True)
@@ -94,12 +94,6 @@ class BlueprintCircuit(QuantumCircuit, ABC):
94
94
 
95
95
  @property
96
96
  def data(self):
97
- """The circuit data (instructions and context).
98
-
99
- Returns:
100
- QuantumCircuitData: a list-like object containing the :class:`.CircuitInstruction`\\ s
101
- for each instruction.
102
- """
103
97
  if not self._is_built:
104
98
  self._build()
105
99
  return super().data
@@ -116,70 +110,12 @@ class BlueprintCircuit(QuantumCircuit, ABC):
116
110
 
117
111
  @property
118
112
  def num_parameters(self) -> int:
119
- """The number of parameter objects in the circuit."""
120
113
  if not self._is_built:
121
114
  self._build()
122
115
  return super().num_parameters
123
116
 
124
117
  @property
125
118
  def parameters(self) -> ParameterView:
126
- """The parameters defined in the circuit.
127
-
128
- This attribute returns the :class:`.Parameter` objects in the circuit sorted
129
- alphabetically. Note that parameters instantiated with a :class:`.ParameterVector`
130
- are still sorted numerically.
131
-
132
- Examples:
133
-
134
- The snippet below shows that insertion order of parameters does not matter.
135
-
136
- .. code-block:: python
137
-
138
- >>> from qiskit.circuit import QuantumCircuit, Parameter
139
- >>> a, b, elephant = Parameter("a"), Parameter("b"), Parameter("elephant")
140
- >>> circuit = QuantumCircuit(1)
141
- >>> circuit.rx(b, 0)
142
- >>> circuit.rz(elephant, 0)
143
- >>> circuit.ry(a, 0)
144
- >>> circuit.parameters # sorted alphabetically!
145
- ParameterView([Parameter(a), Parameter(b), Parameter(elephant)])
146
-
147
- Bear in mind that alphabetical sorting might be unintuitive when it comes to numbers.
148
- The literal "10" comes before "2" in strict alphabetical sorting.
149
-
150
- .. code-block:: python
151
-
152
- >>> from qiskit.circuit import QuantumCircuit, Parameter
153
- >>> angles = [Parameter("angle_1"), Parameter("angle_2"), Parameter("angle_10")]
154
- >>> circuit = QuantumCircuit(1)
155
- >>> circuit.u(*angles, 0)
156
- >>> circuit.draw()
157
- ┌─────────────────────────────┐
158
- q: ┤ U(angle_1,angle_2,angle_10) ├
159
- └─────────────────────────────┘
160
- >>> circuit.parameters
161
- ParameterView([Parameter(angle_1), Parameter(angle_10), Parameter(angle_2)])
162
-
163
- To respect numerical sorting, a :class:`.ParameterVector` can be used.
164
-
165
- .. code-block:: python
166
-
167
- >>> from qiskit.circuit import QuantumCircuit, Parameter, ParameterVector
168
- >>> x = ParameterVector("x", 12)
169
- >>> circuit = QuantumCircuit(1)
170
- >>> for x_i in x:
171
- ... circuit.rx(x_i, 0)
172
- >>> circuit.parameters
173
- ParameterView([
174
- ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
175
- ParameterVectorElement(x[2]), ParameterVectorElement(x[3]),
176
- ..., ParameterVectorElement(x[11])
177
- ])
178
-
179
-
180
- Returns:
181
- The sorted :class:`.Parameter` objects in the circuit.
182
- """
183
119
  if not self._is_built:
184
120
  self._build()
185
121
  return super().parameters
@@ -12,7 +12,7 @@
12
12
 
13
13
  """The Boolean logic circuit library."""
14
14
 
15
- from .quantum_and import AND, AndGate
16
- from .quantum_or import OR, OrGate
17
- from .quantum_xor import XOR, BitwiseXorGate, random_bitwise_xor
18
- from .inner_product import InnerProduct, InnerProductGate
15
+ from .quantum_and import AND
16
+ from .quantum_or import OR
17
+ from .quantum_xor import XOR
18
+ from .inner_product import InnerProduct
@@ -1,6 +1,6 @@
1
1
  # This code is part of Qiskit.
2
2
  #
3
- # (C) Copyright IBM 2020, 2024.
3
+ # (C) Copyright IBM 2020.
4
4
  #
5
5
  # This code is licensed under the Apache License, Version 2.0. You may
6
6
  # obtain a copy of this license in the LICENSE.txt file in the root directory
@@ -11,11 +11,10 @@
11
11
  # that they have been altered from the originals.
12
12
 
13
13
 
14
- """InnerProduct circuit and gate."""
14
+ """InnerProduct circuit."""
15
15
 
16
16
 
17
- from qiskit.circuit import QuantumRegister, QuantumCircuit, Gate
18
- from qiskit.utils.deprecation import deprecate_func
17
+ from qiskit.circuit import QuantumRegister, QuantumCircuit
19
18
 
20
19
 
21
20
  class InnerProduct(QuantumCircuit):
@@ -33,7 +32,7 @@ class InnerProduct(QuantumCircuit):
33
32
  where the inner product of the top and bottom registers is 1. Otherwise it keeps
34
33
  the input intact.
35
34
 
36
- .. code-block:: text
35
+ .. parsed-literal::
37
36
 
38
37
 
39
38
  q0_0: ─■──────────
@@ -62,11 +61,6 @@ class InnerProduct(QuantumCircuit):
62
61
  _generate_circuit_library_visualization(circuit)
63
62
  """
64
63
 
65
- @deprecate_func(
66
- since="1.3",
67
- additional_msg="Use qiskit.circuit.library.InnerProductGate instead.",
68
- pending=True,
69
- )
70
64
  def __init__(self, num_qubits: int) -> None:
71
65
  """Return a circuit to compute the inner product of 2 n-qubit registers.
72
66
 
@@ -82,74 +76,3 @@ class InnerProduct(QuantumCircuit):
82
76
 
83
77
  super().__init__(*inner.qregs, name="inner_product")
84
78
  self.compose(inner.to_gate(), qubits=self.qubits, inplace=True)
85
-
86
-
87
- class InnerProductGate(Gate):
88
- r"""A 2n-qubit Boolean function that computes the inner product of
89
- two n-qubit vectors over :math:`F_2`.
90
-
91
- This implementation is a phase oracle which computes the following transform.
92
-
93
- .. math::
94
-
95
- \mathcal{IP}_{2n} : F_2^{2n} \rightarrow {-1, 1}
96
- \mathcal{IP}_{2n}(x_1, \cdots, x_n, y_1, \cdots, y_n) = (-1)^{x.y}
97
-
98
- The corresponding unitary is a diagonal, which induces a -1 phase on any inputs
99
- where the inner product of the top and bottom registers is 1. Otherwise, it keeps
100
- the input intact.
101
-
102
- .. parsed-literal::
103
-
104
-
105
- q0_0: ─■──────────
106
-
107
- q0_1: ─┼──■───────
108
- │ │
109
- q0_2: ─┼──┼──■────
110
- │ │ │
111
- q0_3: ─┼──┼──┼──■─
112
- │ │ │ │
113
- q1_0: ─■──┼──┼──┼─
114
- │ │ │
115
- q1_1: ────■──┼──┼─
116
- │ │
117
- q1_2: ───────■──┼─
118
-
119
- q1_3: ──────────■─
120
-
121
-
122
- Reference Circuit:
123
- .. plot::
124
-
125
- from qiskit.circuit import QuantumCircuit
126
- from qiskit.circuit.library import InnerProductGate
127
- from qiskit.visualization.library import _generate_circuit_library_visualization
128
- circuit = QuantumCircuit(8)
129
- circuit.append(InnerProductGate(4), [0, 1, 2, 3, 4, 5, 6, 7])
130
- _generate_circuit_library_visualization(circuit)
131
- """
132
-
133
- def __init__(
134
- self,
135
- num_qubits: int,
136
- ) -> None:
137
- """
138
- Args:
139
- num_qubits: width of top and bottom registers (half total number of qubits).
140
- """
141
- super().__init__("inner_product", 2 * num_qubits, [])
142
-
143
- def _define(self):
144
- num_qubits = self.num_qubits // 2
145
- qr_a = QuantumRegister(num_qubits, name="x")
146
- qr_b = QuantumRegister(num_qubits, name="y")
147
-
148
- circuit = QuantumCircuit(qr_a, qr_b, name="inner_product")
149
- for i in range(num_qubits):
150
- circuit.cz(qr_a[i], qr_b[i])
151
-
152
- self.definition = circuit
153
-
154
- def __eq__(self, other):
155
- return isinstance(other, InnerProductGate) and self.num_qubits == other.num_qubits