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
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.6.0)
2
+ Generator: bdist_wheel (0.44.0)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp39-abi3-win32
5
5
 
@@ -1,20 +1,4 @@
1
1
  [qiskit.synthesis]
2
- FullAdder.default = qiskit.transpiler.passes.synthesis.hls_plugins:FullAdderSynthesisC04
3
- FullAdder.ripple_c04 = qiskit.transpiler.passes.synthesis.hls_plugins:FullAdderSynthesisC04
4
- FullAdder.ripple_v95 = qiskit.transpiler.passes.synthesis.hls_plugins:FullAdderSynthesisV95
5
- HalfAdder.default = qiskit.transpiler.passes.synthesis.hls_plugins:HalfAdderSynthesisDefault
6
- HalfAdder.qft_d00 = qiskit.transpiler.passes.synthesis.hls_plugins:HalfAdderSynthesisD00
7
- HalfAdder.ripple_c04 = qiskit.transpiler.passes.synthesis.hls_plugins:HalfAdderSynthesisC04
8
- HalfAdder.ripple_v95 = qiskit.transpiler.passes.synthesis.hls_plugins:HalfAdderSynthesisV95
9
- ModularAdder.default = qiskit.transpiler.passes.synthesis.hls_plugins:ModularAdderSynthesisDefault
10
- ModularAdder.qft_d00 = qiskit.transpiler.passes.synthesis.hls_plugins:ModularAdderSynthesisD00
11
- ModularAdder.ripple_c04 = qiskit.transpiler.passes.synthesis.hls_plugins:ModularAdderSynthesisC04
12
- ModularAdder.ripple_v95 = qiskit.transpiler.passes.synthesis.hls_plugins:ModularAdderSynthesisV95
13
- Multiplier.cumulative_h18 = qiskit.transpiler.passes.synthesis.hls_plugins:MultiplierSynthesisH18
14
- Multiplier.default = qiskit.transpiler.passes.synthesis.hls_plugins:MultiplierSynthesisR17
15
- Multiplier.qft_r17 = qiskit.transpiler.passes.synthesis.hls_plugins:MultiplierSynthesisR17
16
- PauliEvolution.default = qiskit.transpiler.passes.synthesis.hls_plugins:PauliEvolutionSynthesisDefault
17
- PauliEvolution.rustiq = qiskit.transpiler.passes.synthesis.hls_plugins:PauliEvolutionSynthesisRustiq
18
2
  clifford.ag = qiskit.transpiler.passes.synthesis.hls_plugins:AGSynthesisClifford
19
3
  clifford.bm = qiskit.transpiler.passes.synthesis.hls_plugins:BMSynthesisClifford
20
4
  clifford.default = qiskit.transpiler.passes.synthesis.hls_plugins:DefaultSynthesisClifford
@@ -24,9 +8,6 @@ clifford.lnn = qiskit.transpiler.passes.synthesis.hls_plugins:LayerLnnSynthesisC
24
8
  linear_function.default = qiskit.transpiler.passes.synthesis.hls_plugins:DefaultSynthesisLinearFunction
25
9
  linear_function.kms = qiskit.transpiler.passes.synthesis.hls_plugins:KMSSynthesisLinearFunction
26
10
  linear_function.pmh = qiskit.transpiler.passes.synthesis.hls_plugins:PMHSynthesisLinearFunction
27
- mcmt.default = qiskit.transpiler.passes.synthesis.hls_plugins:MCMTSynthesisDefault
28
- mcmt.noaux = qiskit.transpiler.passes.synthesis.hls_plugins:MCMTSynthesisNoAux
29
- mcmt.vchain = qiskit.transpiler.passes.synthesis.hls_plugins:MCMTSynthesisVChain
30
11
  mcx.1_clean_b95 = qiskit.transpiler.passes.synthesis.hls_plugins:MCXSynthesis1CleanB95
31
12
  mcx.default = qiskit.transpiler.passes.synthesis.hls_plugins:MCXSynthesisDefault
32
13
  mcx.gray_code = qiskit.transpiler.passes.synthesis.hls_plugins:MCXSynthesisGrayCode
@@ -1,150 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2017, 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
- """Second-order Pauli-Z expansion circuit."""
14
-
15
- from typing import Callable, List, Union, Optional, Dict, Tuple
16
- import numpy as np
17
- from qiskit.utils.deprecation import deprecate_func
18
- from .pauli_feature_map import PauliFeatureMap
19
-
20
-
21
- class ZZFeatureMap(PauliFeatureMap):
22
- r"""Second-order Pauli-Z evolution circuit.
23
-
24
- For 3 qubits and 1 repetition and linear entanglement the circuit is represented by:
25
-
26
- .. code-block:: text
27
-
28
- ┌───┐┌────────────────┐
29
- ┤ H ├┤ P(2.0*φ(x[0])) ├──■───────────────────────────■───────────────────────────────────
30
- ├───┤├────────────────┤┌─┴─┐┌─────────────────────┐┌─┴─┐
31
- ┤ H ├┤ P(2.0*φ(x[1])) ├┤ X ├┤ P(2.0*φ(x[0],x[1])) ├┤ X ├──■───────────────────────────■──
32
- ├───┤├────────────────┤└───┘└─────────────────────┘└───┘┌─┴─┐┌─────────────────────┐┌─┴─┐
33
- ┤ H ├┤ P(2.0*φ(x[2])) ├─────────────────────────────────┤ X ├┤ P(2.0*φ(x[1],x[2])) ├┤ X ├
34
- └───┘└────────────────┘ └───┘└─────────────────────┘└───┘
35
-
36
- where :math:`\varphi` is a classical non-linear function, which defaults to :math:`\varphi(x) = x`
37
- if and :math:`\varphi(x,y) = (\pi - x)(\pi - y)`.
38
-
39
- Examples:
40
-
41
- .. code-block::
42
-
43
- from qiskit.circuit.library import ZZFeatureMap
44
- prep = ZZFeatureMap(2, reps=1)
45
- print(prep.decompose())
46
-
47
- .. code-block:: text
48
-
49
- ┌───┐┌─────────────┐
50
- q_0: ┤ H ├┤ P(2.0*x[0]) ├──■──────────────────────────────────────■──
51
- ├───┤├─────────────┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐
52
- q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
53
- └───┘└─────────────┘└───┘└────────────────────────────────┘└───┘
54
-
55
- .. code-block::
56
-
57
- from qiskit.circuit.library import EfficientSU2
58
- classifier = ZZFeatureMap(3).compose(EfficientSU2(3))
59
- classifier.num_parameters
60
-
61
- .. code-block:: text
62
-
63
- 27
64
-
65
- .. code-block::
66
-
67
- classifier.parameters # 'x' for the data preparation, 'θ' for the SU2 parameters
68
-
69
- .. code-block:: text
70
-
71
- ParameterView([
72
- ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
73
- ParameterVectorElement(x[2]), ParameterVectorElement(θ[0]),
74
- ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]),
75
- ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]),
76
- ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]),
77
- ParameterVectorElement(θ[7]), ParameterVectorElement(θ[8]),
78
- ParameterVectorElement(θ[9]), ParameterVectorElement(θ[10]),
79
- ParameterVectorElement(θ[11]), ParameterVectorElement(θ[12]),
80
- ParameterVectorElement(θ[13]), ParameterVectorElement(θ[14]),
81
- ParameterVectorElement(θ[15]), ParameterVectorElement(θ[16]),
82
- ParameterVectorElement(θ[17]), ParameterVectorElement(θ[18]),
83
- ParameterVectorElement(θ[19]), ParameterVectorElement(θ[20]),
84
- ParameterVectorElement(θ[21]), ParameterVectorElement(θ[22]),
85
- ParameterVectorElement(θ[23])
86
- ])
87
-
88
- .. code-block::
89
-
90
- classifier.count_ops()
91
-
92
- .. code-block:: text
93
-
94
- OrderedDict([('ZZFeatureMap', 1), ('EfficientSU2', 1)])
95
-
96
- """
97
-
98
- @deprecate_func(
99
- since="1.3",
100
- additional_msg=(
101
- "Use the z_feature_map function as a replacement. Note that this will no longer "
102
- "return a BlueprintCircuit, but just a plain QuantumCircuit."
103
- ),
104
- pending=True,
105
- )
106
- def __init__(
107
- self,
108
- feature_dimension: int,
109
- reps: int = 2,
110
- entanglement: Union[
111
- str,
112
- Dict[int, List[Tuple[int]]],
113
- Callable[[int], Union[str, Dict[int, List[Tuple[int]]]]],
114
- ] = "full",
115
- data_map_func: Optional[Callable[[np.ndarray], float]] = None,
116
- parameter_prefix: str = "x",
117
- insert_barriers: bool = False,
118
- name: str = "ZZFeatureMap",
119
- ) -> None:
120
- """Create a new second-order Pauli-Z expansion.
121
-
122
- Args:
123
- feature_dimension: Number of features.
124
- reps: The number of repeated circuits, has a min. value of 1.
125
- entanglement: Specifies the entanglement structure. Refer to
126
- :class:`~qiskit.circuit.library.PauliFeatureMap` for detail.
127
- data_map_func: A mapping function for data x.
128
- parameter_prefix: The prefix used if default parameters are generated.
129
- insert_barriers: If True, barriers are inserted in between the evolution instructions
130
- and hadamard layers.
131
-
132
- Raises:
133
- ValueError: If the feature dimension is smaller than 2.
134
- """
135
- if feature_dimension < 2:
136
- raise ValueError(
137
- "The ZZFeatureMap contains 2-local interactions and cannot be "
138
- f"defined for less than 2 qubits. You provided {feature_dimension}."
139
- )
140
-
141
- super().__init__(
142
- feature_dimension=feature_dimension,
143
- reps=reps,
144
- entanglement=entanglement,
145
- paulis=["Z", "ZZ"],
146
- data_map_func=data_map_func,
147
- parameter_prefix=parameter_prefix,
148
- insert_barriers=insert_barriers,
149
- name=name,
150
- )
@@ -1,145 +0,0 @@
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
- """The twirling module."""
14
-
15
- from __future__ import annotations
16
- import typing
17
-
18
- from qiskit._accelerate.twirling import twirl_circuit as twirl_rs
19
- from qiskit.circuit.quantumcircuit import QuantumCircuit, _copy_metadata
20
- from qiskit.circuit.gate import Gate
21
- from qiskit.circuit.library.standard_gates import CXGate, ECRGate, CZGate, iSwapGate
22
- from qiskit.exceptions import QiskitError
23
-
24
- if typing.TYPE_CHECKING:
25
- from qiskit.transpiler.target import Target
26
-
27
-
28
- NAME_TO_CLASS = {
29
- "cx": CXGate._standard_gate,
30
- "ecr": ECRGate._standard_gate,
31
- "cz": CZGate._standard_gate,
32
- "iswap": iSwapGate._standard_gate,
33
- }
34
-
35
-
36
- def pauli_twirl_2q_gates(
37
- circuit: QuantumCircuit,
38
- twirling_gate: None | str | Gate | list[str] | list[Gate] = None,
39
- seed: int | None = None,
40
- num_twirls: int | None = None,
41
- target: Target | None = None,
42
- ) -> QuantumCircuit | list[QuantumCircuit]:
43
- """Create copies of a given circuit with Pauli twirling applied around specified two qubit
44
- gates.
45
-
46
- If you're running this function with the intent to twirl a circuit to run on hardware this
47
- may not be the most efficient way to perform twirling. Especially if the hardware vendor
48
- has implemented the :mod:`.primitives` execution interface with :class:`.SamplerV2` and
49
- :class:`.EstimatorV2` this most likely is not the best way to apply twirling to your
50
- circuit and you'll want to refer to the implementation of :class:`.SamplerV2` and/or
51
- :class:`.EstimatorV2` for the specified hardware vendor.
52
-
53
- If the intent of this function is to be run after :func:`.transpile` or
54
- :meth:`.PassManager.run` the optional ``target`` argument can be used
55
- so that the inserted 1 qubit Pauli gates are synthesized to be
56
- compatible with the given :class:`.Target` so the output circuit(s) are
57
- still compatible.
58
-
59
- Args:
60
- circuit: The circuit to twirl
61
- twirling_gate: The gate to twirl, defaults to `None` which means twirl all default gates:
62
- :class:`.CXGate`, :class:`.CZGate`, :class:`.ECRGate`, and :class:`.iSwapGate`.
63
- If supplied it can either be a single gate or a list of gates either as either a gate
64
- object or its string name. Currently only the names `"cx"`, `"cz"`, `"ecr"`, and
65
- `"iswap"` are supported. If a gate object is provided outside the default gates it must
66
- have a matrix defined from its :class:`~.Gate.to_matrix` method for the gate to potentially
67
- be twirled. If a valid twirling configuration can't be computed that particular gate will
68
- be silently ignored and not twirled.
69
- seed: An integer seed for the random number generator used internally by this function.
70
- If specified this must be between 0 and 18,446,744,073,709,551,615.
71
- num_twirls: The number of twirling circuits to build. This defaults to ``None`` and will return
72
- a single circuit. If it is an integer a list of circuits with `num_twirls` circuits
73
- will be returned.
74
- target: If specified an :class:`.Target` instance to use for running single qubit decomposition
75
- as part of the Pauli twirling to optimize and map the pauli gates added to the circuit
76
- to the specified target.
77
-
78
- Returns:
79
- A copy of the given circuit with Pauli twirling applied to each
80
- instance of the specified twirling gate.
81
- """
82
- custom_gates = None
83
- if isinstance(twirling_gate, str):
84
- gate = NAME_TO_CLASS.get(twirling_gate, None)
85
- if gate is None:
86
- raise QiskitError(f"The specified gate name {twirling_gate} is not supported")
87
- twirling_std_gate = [gate]
88
- elif isinstance(twirling_gate, list):
89
- custom_gates = []
90
- twirling_std_gate = []
91
- for gate in twirling_gate:
92
- if isinstance(gate, str):
93
- gate = NAME_TO_CLASS.get(gate, None)
94
- if gate is None:
95
- raise QiskitError(f"The specified gate name {twirling_gate} is not supported")
96
- twirling_std_gate.append(gate)
97
- else:
98
- twirling_gate = getattr(gate, "_standard_gate", None)
99
-
100
- if twirling_gate is None:
101
- custom_gates.append(gate)
102
- else:
103
- if twirling_gate in NAME_TO_CLASS.values():
104
- twirling_std_gate.append(twirling_gate)
105
- else:
106
- custom_gates.append(gate)
107
- if not custom_gates:
108
- custom_gates = None
109
- if not twirling_std_gate:
110
- twirling_std_gate = None
111
- elif twirling_gate is not None:
112
- std_gate = getattr(twirling_gate, "_standard_gate", None)
113
- if std_gate is None:
114
- twirling_std_gate = None
115
- custom_gates = [twirling_gate]
116
- else:
117
- if std_gate in NAME_TO_CLASS.values():
118
- twirling_std_gate = [std_gate]
119
- else:
120
- twirling_std_gate = None
121
- custom_gates = [twirling_gate]
122
- else:
123
- twirling_std_gate = twirling_gate
124
- out_twirls = num_twirls
125
- if out_twirls is None:
126
- out_twirls = 1
127
- new_data = twirl_rs(
128
- circuit._data,
129
- twirling_std_gate,
130
- custom_gates,
131
- seed,
132
- out_twirls,
133
- target,
134
- )
135
- if num_twirls is not None:
136
- out_list = []
137
- for circ in new_data:
138
- new_circ = QuantumCircuit._from_circuit_data(circ)
139
- _copy_metadata(circuit, new_circ, "alike")
140
- out_list.append(new_circ)
141
- return out_list
142
- else:
143
- out_circ = QuantumCircuit._from_circuit_data(new_data[0])
144
- _copy_metadata(circuit, out_circ, "alike")
145
- return out_circ
@@ -1,16 +0,0 @@
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
- """Module containing multi-controlled circuits synthesis"""
14
-
15
- from .adders import adder_qft_d00, adder_ripple_c04, adder_ripple_v95
16
- from .multipliers import multiplier_cumulative_h18, multiplier_qft_r17
@@ -1,17 +0,0 @@
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
- """Module containing multi-controlled circuits synthesis"""
14
-
15
- from .cdkm_ripple_carry_adder import adder_ripple_c04
16
- from .vbe_ripple_carry_adder import adder_ripple_v95
17
- from .draper_qft_adder import adder_qft_d00
@@ -1,154 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2017, 2021.
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
- """Compute the sum of two qubit registers using ripple-carry approach."""
14
-
15
- from qiskit.circuit.quantumcircuit import QuantumCircuit
16
- from qiskit.circuit.quantumregister import QuantumRegister, AncillaRegister
17
-
18
-
19
- def adder_ripple_c04(num_state_qubits: int, kind: str = "half") -> QuantumCircuit:
20
- r"""A ripple-carry circuit to perform in-place addition on two qubit registers.
21
-
22
- This circuit uses :math:`2n + O(1)` CCX gates and :math:`5n + O(1)` CX gates,
23
- at a depth of :math:`2n + O(1)` [1]. The constant depends on the kind
24
- of adder implemented.
25
-
26
- As an example, a ripple-carry adder circuit that performs addition on two 3-qubit sized
27
- registers with a carry-in bit (``kind="full"``) is as follows:
28
-
29
- .. parsed-literal::
30
-
31
- ┌──────┐ ┌──────┐
32
- cin_0: ┤2 ├─────────────────────────────────────┤2 ├
33
- │ │┌──────┐ ┌──────┐│ │
34
- a_0: ┤0 ├┤2 ├─────────────────────┤2 ├┤0 ├
35
- │ ││ │┌──────┐ ┌──────┐│ ││ │
36
- a_1: ┤ MAJ ├┤0 ├┤2 ├─────┤2 ├┤0 ├┤ UMA ├
37
- │ ││ ││ │ │ ││ ││ │
38
- a_2: ┤ ├┤ MAJ ├┤0 ├──■──┤0 ├┤ UMA ├┤ ├
39
- │ ││ ││ │ │ │ ││ ││ │
40
- b_0: ┤1 ├┤ ├┤ MAJ ├──┼──┤ UMA ├┤ ├┤1 ├
41
- └──────┘│ ││ │ │ │ ││ │└──────┘
42
- b_1: ────────┤1 ├┤ ├──┼──┤ ├┤1 ├────────
43
- └──────┘│ │ │ │ │└──────┘
44
- b_2: ────────────────┤1 ├──┼──┤1 ├────────────────
45
- └──────┘┌─┴─┐└──────┘
46
- cout_0: ────────────────────────┤ X ├────────────────────────
47
- └───┘
48
-
49
- Here *MAJ* and *UMA* gates correspond to the gates introduced in [1]. Note that
50
- in this implementation the input register qubits are ordered as all qubits from
51
- the first input register, followed by all qubits from the second input register.
52
-
53
- Two different kinds of adders are supported. By setting the ``kind`` argument, you can also
54
- choose a half-adder, which doesn't have a carry-in, and a fixed-sized-adder, which has neither
55
- carry-in nor carry-out, and thus acts on fixed register sizes. Unlike the full-adder,
56
- these circuits need one additional helper qubit.
57
-
58
- The circuit diagram for the fixed-point adder (``kind="fixed"``) on 3-qubit sized inputs is
59
-
60
- .. parsed-literal::
61
-
62
- ┌──────┐┌──────┐ ┌──────┐┌──────┐
63
- a_0: ┤0 ├┤2 ├────────────────┤2 ├┤0 ├
64
- │ ││ │┌──────┐┌──────┐│ ││ │
65
- a_1: ┤ ├┤0 ├┤2 ├┤2 ├┤0 ├┤ ├
66
- │ ││ ││ ││ ││ ││ │
67
- a_2: ┤ ├┤ MAJ ├┤0 ├┤0 ├┤ UMA ├┤ ├
68
- │ ││ ││ ││ ││ ││ │
69
- b_0: ┤1 MAJ ├┤ ├┤ MAJ ├┤ UMA ├┤ ├┤1 UMA ├
70
- │ ││ ││ ││ ││ ││ │
71
- b_1: ┤ ├┤1 ├┤ ├┤ ├┤1 ├┤ ├
72
- │ │└──────┘│ ││ │└──────┘│ │
73
- b_2: ┤ ├────────┤1 ├┤1 ├────────┤ ├
74
- │ │ └──────┘└──────┘ │ │
75
- help_0: ┤2 ├────────────────────────────────┤2 ├
76
- └──────┘ └──────┘
77
-
78
- It has one less qubit than the full-adder since it doesn't have the carry-out, but uses
79
- a helper qubit instead of the carry-in, so it only has one less qubit, not two.
80
-
81
- Args:
82
- num_state_qubits: The number of qubits in either input register for
83
- state :math:`|a\rangle` or :math:`|b\rangle`. The two input
84
- registers must have the same number of qubits.
85
- kind: The kind of adder, can be ``"full"`` for a full adder, ``"half"`` for a half
86
- adder, or ``"fixed"`` for a fixed-sized adder. A full adder includes both carry-in
87
- and carry-out, a half only carry-out, and a fixed-sized adder neither carry-in
88
- nor carry-out.
89
-
90
- Raises:
91
- ValueError: If ``num_state_qubits`` is lower than 1.
92
-
93
- **References:**
94
-
95
- [1] Cuccaro et al., A new quantum ripple-carry addition circuit, 2004.
96
- `arXiv:quant-ph/0410184 <https://arxiv.org/pdf/quant-ph/0410184.pdf>`_
97
-
98
- [2] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995.
99
- `arXiv:quant-ph/9511018 <https://arxiv.org/pdf/quant-ph/9511018.pdf>`_
100
-
101
- """
102
- if num_state_qubits < 1:
103
- raise ValueError("The number of qubits must be at least 1.")
104
-
105
- circuit = QuantumCircuit()
106
-
107
- if kind == "full":
108
- qr_c = QuantumRegister(1, name="cin")
109
- circuit.add_register(qr_c)
110
- else:
111
- qr_c = AncillaRegister(1, name="help")
112
-
113
- qr_a = QuantumRegister(num_state_qubits, name="a")
114
- qr_b = QuantumRegister(num_state_qubits, name="b")
115
- circuit.add_register(qr_a, qr_b)
116
-
117
- if kind in ["full", "half"]:
118
- qr_z = QuantumRegister(1, name="cout")
119
- circuit.add_register(qr_z)
120
-
121
- if kind != "full":
122
- circuit.add_register(qr_c)
123
-
124
- # build carry circuit for majority of 3 bits in-place
125
- # corresponds to MAJ gate in [1]
126
- qc_maj = QuantumCircuit(3, name="MAJ")
127
- qc_maj.cx(0, 1)
128
- qc_maj.cx(0, 2)
129
- qc_maj.ccx(2, 1, 0)
130
- maj_gate = qc_maj.to_gate()
131
-
132
- # build circuit for reversing carry operation
133
- # corresponds to UMA gate in [1]
134
- qc_uma = QuantumCircuit(3, name="UMA")
135
- qc_uma.ccx(2, 1, 0)
136
- qc_uma.cx(0, 2)
137
- qc_uma.cx(2, 1)
138
- uma_gate = qc_uma.to_gate()
139
-
140
- # build ripple-carry adder circuit
141
- circuit.append(maj_gate, [qr_a[0], qr_b[0], qr_c[0]])
142
-
143
- for i in range(num_state_qubits - 1):
144
- circuit.append(maj_gate, [qr_a[i + 1], qr_b[i + 1], qr_a[i]])
145
-
146
- if kind in ["full", "half"]:
147
- circuit.cx(qr_a[-1], qr_z[0])
148
-
149
- for i in reversed(range(num_state_qubits - 1)):
150
- circuit.append(uma_gate, [qr_a[i + 1], qr_b[i + 1], qr_a[i]])
151
-
152
- circuit.append(uma_gate, [qr_a[0], qr_b[0], qr_c[0]])
153
-
154
- return circuit
@@ -1,103 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2017, 2021.
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
- """Compute the sum of two qubit registers using QFT."""
14
-
15
- import numpy as np
16
-
17
- from qiskit.circuit.quantumcircuit import QuantumCircuit
18
- from qiskit.circuit.quantumregister import QuantumRegister
19
- from qiskit.circuit.library.basis_change import QFTGate
20
-
21
-
22
- def adder_qft_d00(num_state_qubits: int, kind: str = "half") -> QuantumCircuit:
23
- r"""A circuit that uses QFT to perform in-place addition on two qubit registers.
24
-
25
- For registers with :math:`n` qubits, the QFT adder can perform addition modulo
26
- :math:`2^n` (with ``kind="fixed"``) or ordinary addition by adding a carry qubits (with
27
- ``kind="half"``). The fixed adder uses :math:`(3n^2 - n)/2` :class:`.CPhaseGate` operators,
28
- with an additional :math:`n` for the half adder.
29
-
30
- As an example, a non-fixed_point QFT adder circuit that performs addition on two 2-qubit sized
31
- registers is as follows:
32
-
33
- .. parsed-literal::
34
-
35
- a_0: ─────────■──────■────────■──────────────────────────────────
36
- │ │ │
37
- a_1: ─────────┼──────┼────────┼────────■──────■──────────────────
38
- ┌──────┐ │ │ │P(π/4) │ │P(π/2) ┌─────────┐
39
- b_0: ┤0 ├─┼──────┼────────■────────┼──────■───────┤0 ├
40
- │ │ │ │P(π/2) │P(π) │ │
41
- b_1: ┤1 Qft ├─┼──────■─────────────────■──────────────┤1 qft_dg ├
42
- │ │ │P(π) │ │
43
- cout: ┤2 ├─■───────────────────────────────────────┤2 ├
44
- └──────┘ └─────────┘
45
-
46
- Args:
47
- num_state_qubits: The number of qubits in either input register for
48
- state :math:`|a\rangle` or :math:`|b\rangle`. The two input
49
- registers must have the same number of qubits.
50
- kind: The kind of adder, can be ``"half"`` for a half adder or
51
- ``"fixed"`` for a fixed-sized adder. A half adder contains a carry-out to represent
52
- the most-significant bit, but the fixed-sized adder doesn't and hence performs
53
- addition modulo ``2 ** num_state_qubits``.
54
-
55
- **References:**
56
-
57
- [1] T. G. Draper, Addition on a Quantum Computer, 2000.
58
- `arXiv:quant-ph/0008033 <https://arxiv.org/pdf/quant-ph/0008033.pdf>`_
59
-
60
- [2] Ruiz-Perez et al., Quantum arithmetic with the Quantum Fourier Transform, 2017.
61
- `arXiv:1411.5949 <https://arxiv.org/pdf/1411.5949.pdf>`_
62
-
63
- [3] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995.
64
- `arXiv:quant-ph/9511018 <https://arxiv.org/pdf/quant-ph/9511018.pdf>`_
65
-
66
- """
67
-
68
- if kind == "full":
69
- raise ValueError("The DraperQFTAdder only supports 'half' and 'fixed' as ``kind``.")
70
-
71
- if num_state_qubits < 1:
72
- raise ValueError("The number of qubits must be at least 1.")
73
-
74
- qr_a = QuantumRegister(num_state_qubits, name="a")
75
- qr_b = QuantumRegister(num_state_qubits, name="b")
76
- qr_list = [qr_a, qr_b]
77
-
78
- if kind == "half":
79
- qr_z = QuantumRegister(1, name="cout")
80
- qr_list.append(qr_z)
81
-
82
- # add registers
83
- circuit = QuantumCircuit(*qr_list)
84
-
85
- # define register containing the sum and number of qubits for QFT circuit
86
- qr_sum = qr_b[:] if kind == "fixed" else qr_b[:] + qr_z[:]
87
- num_sum = num_state_qubits if kind == "fixed" else num_state_qubits + 1
88
-
89
- # build QFT adder circuit
90
- qft = QFTGate(num_sum)
91
- circuit.append(qft, qr_sum[:])
92
-
93
- for j in range(num_state_qubits):
94
- for k in range(num_sum - j):
95
- lam = np.pi / (2**k)
96
- # note: if we were able to remove the final swaps from the QFTGate, we could
97
- # simply use qr_sum[(j + k)] here and avoid synthesizing two swap networks, which
98
- # can be elided and cancelled by the compiler
99
- circuit.cp(lam, qr_a[j], qr_sum[~(j + k)])
100
-
101
- circuit.append(qft.inverse(), qr_sum[:])
102
-
103
- return circuit