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,161 +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 Classical Addition."""
14
-
15
- from __future__ import annotations
16
- from qiskit.circuit.bit import Bit
17
-
18
- from qiskit.circuit.quantumcircuit import QuantumCircuit
19
- from qiskit.circuit.quantumregister import QuantumRegister, AncillaRegister
20
-
21
-
22
- def adder_ripple_v95(num_state_qubits: int, kind: str = "half") -> QuantumCircuit:
23
- r"""The VBE ripple carry adder [1].
24
-
25
- This method uses :math:`4n + O(1)` CCX gates and :math:`4n + 1` CX gates at a depth
26
- of :math:`6n - 2` [2].
27
-
28
- This circuit performs inplace addition of two equally-sized quantum registers.
29
- As an example, a classical adder circuit that performs full addition (i.e. including
30
- a carry-in bit) on two 2-qubit sized registers is as follows:
31
-
32
- .. parsed-literal::
33
-
34
- ┌────────┐ ┌───────────┐┌──────┐
35
- cin_0: ┤0 ├───────────────────────┤0 ├┤0 ├
36
- │ │ │ ││ │
37
- a_0: ┤1 ├───────────────────────┤1 ├┤1 ├
38
- │ │┌────────┐ ┌──────┐│ ││ Sum │
39
- a_1: ┤ ├┤1 ├──■──┤1 ├┤ ├┤ ├
40
- │ ││ │ │ │ ││ ││ │
41
- b_0: ┤2 Carry ├┤ ├──┼──┤ ├┤2 Carry_dg ├┤2 ├
42
- │ ││ │┌─┴─┐│ ││ │└──────┘
43
- b_1: ┤ ├┤2 Carry ├┤ X ├┤2 Sum ├┤ ├────────
44
- │ ││ │└───┘│ ││ │
45
- cout_0: ┤ ├┤3 ├─────┤ ├┤ ├────────
46
- │ ││ │ │ ││ │
47
- helper_0: ┤3 ├┤0 ├─────┤0 ├┤3 ├────────
48
- └────────┘└────────┘ └──────┘└───────────┘
49
-
50
-
51
- Here *Carry* and *Sum* gates correspond to the gates introduced in [1].
52
- *Carry_dg* correspond to the inverse of the *Carry* gate. Note that
53
- in this implementation the input register qubits are ordered as all qubits from
54
- the first input register, followed by all qubits from the second input register.
55
- This is different ordering as compared to Figure 2 in [1], which leads to a different
56
- drawing of the circuit.
57
-
58
- Args:
59
- num_state_qubits: The size of the register.
60
- kind: The kind of adder, can be ``"full"`` for a full adder, ``"half"`` for a half
61
- adder, or ``"fixed"`` for a fixed-sized adder. A full adder includes both carry-in
62
- and carry-out, a half only carry-out, and a fixed-sized adder neither carry-in
63
- nor carry-out.
64
-
65
- Raises:
66
- ValueError: If ``num_state_qubits`` is lower than 1.
67
-
68
- **References:**
69
-
70
- [1] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995.
71
- `arXiv:quant-ph/9511018 <https://arxiv.org/pdf/quant-ph/9511018.pdf>`_
72
-
73
- [2] Cuccaro et al., A new quantum ripple-carry addition circuit, 2004.
74
- `arXiv:quant-ph/0410184 <https://arxiv.org/pdf/quant-ph/0410184.pdf>`_
75
-
76
- """
77
- if num_state_qubits < 1:
78
- raise ValueError("The number of qubits must be at least 1.")
79
-
80
- # define the input registers
81
- registers: list[QuantumRegister | list[Bit]] = []
82
- if kind == "full":
83
- qr_cin = QuantumRegister(1, name="cin")
84
- registers.append(qr_cin)
85
- else:
86
- qr_cin = QuantumRegister(0)
87
-
88
- qr_a = QuantumRegister(num_state_qubits, name="a")
89
- qr_b = QuantumRegister(num_state_qubits, name="b")
90
-
91
- registers += [qr_a, qr_b]
92
-
93
- if kind in ["half", "full"]:
94
- qr_cout = QuantumRegister(1, name="cout")
95
- registers.append(qr_cout)
96
- else:
97
- qr_cout = QuantumRegister(0)
98
-
99
- if num_state_qubits > 1:
100
- qr_help = AncillaRegister(num_state_qubits - 1, name="helper")
101
- registers.append(qr_help)
102
- else:
103
- qr_help = AncillaRegister(0)
104
-
105
- circuit = QuantumCircuit(*registers)
106
-
107
- # the code is simplified a lot if we create a list of all carries and helpers
108
- carries = qr_cin[:] + qr_help[:] + qr_cout[:]
109
-
110
- # corresponds to Carry gate in [1]
111
- qc_carry = QuantumCircuit(4, name="Carry")
112
- qc_carry.ccx(1, 2, 3)
113
- qc_carry.cx(1, 2)
114
- qc_carry.ccx(0, 2, 3)
115
- carry_gate = qc_carry.to_gate()
116
- carry_gate_dg = carry_gate.inverse()
117
-
118
- # corresponds to Sum gate in [1]
119
- qc_sum = QuantumCircuit(3, name="Sum")
120
- qc_sum.cx(1, 2)
121
- qc_sum.cx(0, 2)
122
- sum_gate = qc_sum.to_gate()
123
-
124
- # handle all cases for the first qubits, depending on whether cin is available
125
- i = 0
126
- if kind == "half":
127
- i += 1
128
- circuit.ccx(qr_a[0], qr_b[0], carries[0])
129
- elif kind == "fixed":
130
- i += 1
131
- if num_state_qubits == 1:
132
- circuit.cx(qr_a[0], qr_b[0])
133
- else:
134
- circuit.ccx(qr_a[0], qr_b[0], carries[0])
135
-
136
- for inp, out in zip(carries[:-1], carries[1:]):
137
- circuit.append(carry_gate, [inp, qr_a[i], qr_b[i], out])
138
- i += 1
139
-
140
- if kind in ["full", "half"]: # final CX (cancels for the 'fixed' case)
141
- circuit.cx(qr_a[-1], qr_b[-1])
142
-
143
- if len(carries) > 1:
144
- circuit.append(sum_gate, [carries[-2], qr_a[-1], qr_b[-1]])
145
-
146
- i -= 2
147
- for j, (inp, out) in enumerate(zip(reversed(carries[:-1]), reversed(carries[1:]))):
148
- if j == 0:
149
- if kind == "fixed":
150
- i += 1
151
- else:
152
- continue
153
- circuit.append(carry_gate_dg, [inp, qr_a[i], qr_b[i], out])
154
- circuit.append(sum_gate, [inp, qr_a[i], qr_b[i]])
155
- i -= 1
156
-
157
- if kind in ["half", "fixed"] and num_state_qubits > 1:
158
- circuit.ccx(qr_a[0], qr_b[0], carries[0])
159
- circuit.cx(qr_a[0], qr_b[0])
160
-
161
- return circuit
@@ -1,16 +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
- """The multiplier circuit library."""
14
-
15
- from .hrs_cumulative_multiplier import multiplier_cumulative_h18
16
- from .rg_qft_multiplier import multiplier_qft_r17
@@ -1,102 +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 product of two qubit registers using classical multiplication approach."""
14
-
15
- from __future__ import annotations
16
-
17
- from qiskit.circuit.quantumcircuit import QuantumCircuit
18
- from qiskit.circuit.quantumregister import QuantumRegister
19
-
20
-
21
- def multiplier_cumulative_h18(
22
- num_state_qubits: int, num_result_qubits: int | None = None
23
- ) -> QuantumCircuit:
24
- r"""A multiplication circuit to store product of two input registers out-of-place.
25
-
26
- The circuit uses the approach from Ref. [1]. As an example, a multiplier circuit that
27
- performs a non-modular multiplication on two 3-qubit sized registers is:
28
-
29
- .. plot::
30
- :include-source:
31
-
32
- from qiskit.synthesis.arithmetic import multiplier_cumulative_h18
33
-
34
- num_state_qubits = 3
35
- circuit = multiplier_cumulative_h18(num_state_qubits)
36
- circuit.draw("mpl")
37
-
38
- Multiplication in this circuit is implemented in a classical approach by performing
39
- a series of shifted additions using one of the input registers while the qubits
40
- from the other input register act as control qubits for the adders.
41
-
42
- Args:
43
- num_state_qubits: The number of qubits in either input register for
44
- state :math:`|a\rangle` or :math:`|b\rangle`. The two input
45
- registers must have the same number of qubits.
46
- num_result_qubits: The number of result qubits to limit the output to.
47
- If number of result qubits is :math:`n`, multiplication modulo :math:`2^n` is performed
48
- to limit the output to the specified number of qubits. Default
49
- value is ``2 * num_state_qubits`` to represent any possible
50
- result from the multiplication of the two inputs.
51
-
52
- Raises:
53
- ValueError: If ``num_result_qubits`` is given and not valid, meaning not
54
- in ``[num_state_qubits, 2 * num_state_qubits]``.
55
-
56
- **References:**
57
-
58
- [1] Häner et al., Optimizing Quantum Circuits for Arithmetic, 2018.
59
- `arXiv:1805.12445 <https://arxiv.org/pdf/1805.12445.pdf>`_
60
-
61
- """
62
- if num_result_qubits is None:
63
- num_result_qubits = 2 * num_state_qubits
64
- elif num_result_qubits < num_state_qubits or num_result_qubits > 2 * num_state_qubits:
65
- raise ValueError(
66
- f"num_result_qubits ({num_result_qubits}) must be in between num_state_qubits "
67
- f"({num_state_qubits}) and 2 * num_state_qubits ({2 * num_state_qubits})"
68
- )
69
-
70
- # define the registers
71
- qr_a = QuantumRegister(num_state_qubits, name="a")
72
- qr_b = QuantumRegister(num_state_qubits, name="b")
73
- qr_out = QuantumRegister(num_result_qubits, name="out")
74
-
75
- circuit = QuantumCircuit(qr_a, qr_b, qr_out)
76
-
77
- # prepare adder as controlled gate
78
- # pylint: disable=cyclic-import
79
- from qiskit.circuit.library.arithmetic import HalfAdderGate, ModularAdderGate
80
-
81
- adder = HalfAdderGate(num_state_qubits)
82
- controlled_adder = adder.control(annotated=True)
83
-
84
- # build multiplication circuit
85
- for i in range(num_state_qubits):
86
- excess_qubits = max(0, num_state_qubits + i + 1 - num_result_qubits)
87
- if excess_qubits == 0:
88
- num_adder_qubits = num_state_qubits
89
- this_controlled = controlled_adder
90
- else:
91
- num_adder_qubits = num_state_qubits - excess_qubits + 1
92
- modular = ModularAdderGate(num_adder_qubits)
93
- this_controlled = modular.control(annotated=True)
94
-
95
- qr_list = (
96
- [qr_a[i]]
97
- + qr_b[:num_adder_qubits]
98
- + qr_out[i : num_state_qubits + i + 1 - excess_qubits]
99
- )
100
- circuit.append(this_controlled, qr_list)
101
-
102
- return circuit
@@ -1,99 +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 product of two qubit registers using QFT."""
14
-
15
- from __future__ import annotations
16
-
17
- import numpy as np
18
-
19
- from qiskit.circuit.quantumcircuit import QuantumCircuit
20
- from qiskit.circuit.quantumregister import QuantumRegister
21
- from qiskit.circuit.library.standard_gates import PhaseGate
22
- from qiskit.circuit.library.basis_change import QFTGate
23
-
24
-
25
- def multiplier_qft_r17(
26
- num_state_qubits: int, num_result_qubits: int | None = None
27
- ) -> QuantumCircuit:
28
- r"""A QFT multiplication circuit to store product of two input registers out-of-place.
29
-
30
- Multiplication in this circuit is implemented using the procedure of Fig. 3 in [1], where
31
- weighted sum rotations are implemented as given in Fig. 5 in [1]. QFT is used on the output
32
- register and is followed by rotations controlled by input registers. The rotations
33
- transform the state into the product of two input registers in QFT base, which is
34
- reverted from QFT base using inverse QFT.
35
- For example, on 3 state qubits, a full multiplier is given by:
36
-
37
- .. plot::
38
- :include-source:
39
-
40
- from qiskit.synthesis.arithmetic import multiplier_qft_r17
41
-
42
- num_state_qubits = 3
43
- circuit = multiplier_qft_r17(num_state_qubits)
44
- circuit.draw("mpl")
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
- num_result_qubits: The number of result qubits to limit the output to.
51
- If number of result qubits is :math:`n`, multiplication modulo :math:`2^n` is performed
52
- to limit the output to the specified number of qubits. Default
53
- value is ``2 * num_state_qubits`` to represent any possible
54
- result from the multiplication of the two inputs.
55
-
56
- Raises:
57
- ValueError: If ``num_result_qubits`` is given and not valid, meaning not
58
- in ``[num_state_qubits, 2 * num_state_qubits]``.
59
-
60
- **References:**
61
-
62
- [1] Ruiz-Perez et al., Quantum arithmetic with the Quantum Fourier Transform, 2017.
63
- `arXiv:1411.5949 <https://arxiv.org/pdf/1411.5949.pdf>`_
64
-
65
- """
66
- # define the registers
67
- if num_result_qubits is None:
68
- num_result_qubits = 2 * num_state_qubits
69
- elif num_result_qubits < num_state_qubits or num_result_qubits > 2 * num_state_qubits:
70
- raise ValueError(
71
- f"num_result_qubits ({num_result_qubits}) must be in between num_state_qubits "
72
- f"({num_state_qubits}) and 2 * num_state_qubits ({2 * num_state_qubits})"
73
- )
74
-
75
- qr_a = QuantumRegister(num_state_qubits, name="a")
76
- qr_b = QuantumRegister(num_state_qubits, name="b")
77
- qr_out = QuantumRegister(num_result_qubits, name="out")
78
-
79
- # build multiplication circuit
80
- circuit = QuantumCircuit(qr_a, qr_b, qr_out)
81
- qft = QFTGate(num_result_qubits)
82
-
83
- circuit.append(qft, qr_out[:])
84
-
85
- for j in range(1, num_state_qubits + 1):
86
- for i in range(1, num_state_qubits + 1):
87
- for k in range(1, num_result_qubits + 1):
88
- lam = (2 * np.pi) / (2 ** (i + j + k - 2 * num_state_qubits))
89
-
90
- # note: if we can synthesize the QFT without swaps, we can implement this circuit
91
- # more efficiently and just apply phase gate on qr_out[(k - 1)] instead
92
- circuit.append(
93
- PhaseGate(lam).control(2),
94
- [qr_a[num_state_qubits - j], qr_b[num_state_qubits - i], qr_out[~(k - 1)]],
95
- )
96
-
97
- circuit.append(qft.inverse(), qr_out[:])
98
-
99
- return circuit
@@ -1,80 +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
- """Circuit synthesis for pauli evolution gates."""
14
-
15
- from __future__ import annotations
16
-
17
- from qiskit.circuit import QuantumCircuit
18
-
19
- from qiskit._accelerate.synthesis.evolution import (
20
- pauli_network_synthesis as pauli_network_synthesis_inner,
21
- )
22
-
23
-
24
- def synth_pauli_network_rustiq(
25
- num_qubits: int,
26
- pauli_network: list,
27
- optimize_count: bool = True,
28
- preserve_order: bool = True,
29
- upto_clifford: bool = False,
30
- upto_phase: bool = False,
31
- resynth_clifford_method: int = 0,
32
- ) -> QuantumCircuit:
33
- """
34
- Calls Rustiq's pauli network synthesis algorithm.
35
-
36
- The algorithm is described in [1]. The source code (in Rust) is available at
37
- https://github.com/smartiel/rustiq-core.
38
-
39
- Args:
40
- num_qubits: the number of qubits over which the pauli network is defined.
41
- pauli_network: a list of pauli rotations, represented in sparse format: a list of
42
- triples such as `[("XX", [0, 3], theta), ("ZZ", [0, 1], 0.1)]`.
43
- optimize_count: if `True` the synthesis algorithm will try to optimize the 2-qubit
44
- gate count; and if `False` then the 2-qubit depth.
45
- preserve_order: whether the order of paulis should be preserved, up to
46
- commutativity. If the order is not preserved, the returned circuit will
47
- generally not be equivalent to the given pauli network.
48
- upto_clifford: if `True`, the final Clifford operator is not synthesized
49
- and the returned circuit will generally not be equivalent to the given
50
- pauli network. In addition, the argument `upto_phase` would be ignored.
51
- upto_phase: if `True`, the global phase of the returned circuit may differ
52
- from the global phase of the given pauli network. The argument is ignored
53
- when `upto_clifford` is `True`.
54
- resynth_clifford_method: describes the strategy to synthesize the final Clifford
55
- operator. If `0` a naive approach is used, which doubles the number of gates
56
- but preserves the global phase of the circuit. If `1`, the Clifford is
57
- resynthesized using Qiskit's greedy Clifford synthesis algorithm. If `2`, it
58
- is resynthesized by Rustiq itself. If `upto_phase` is `False`, the naive
59
- approach is used, as neither synthesis method preserves the global phase.
60
-
61
- Returns:
62
- A circuit implementation of the pauli network.
63
-
64
- References:
65
- 1. Timothée Goubault de Brugière and Simon Martiel,
66
- *Faster and shorter synthesis of Hamiltonian simulation circuits*,
67
- `arXiv:2404.03280 [quant-ph] <https://arxiv.org/abs/2404.03280>`_
68
-
69
- """
70
- out = pauli_network_synthesis_inner(
71
- num_qubits=num_qubits,
72
- pauli_network=pauli_network,
73
- optimize_count=optimize_count,
74
- preserve_order=preserve_order,
75
- upto_clifford=upto_clifford,
76
- upto_phase=upto_phase,
77
- resynth_clifford_method=resynth_clifford_method,
78
- )
79
- circuit = QuantumCircuit._from_circuit_data(out, add_regs=True)
80
- return circuit
@@ -1,52 +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
- """Synthesis for multiple-control, multiple-target Gate."""
14
-
15
- from __future__ import annotations
16
-
17
- from qiskit.circuit import QuantumCircuit, Gate
18
- from qiskit._accelerate.synthesis.multi_controlled import mcmt_v_chain
19
-
20
-
21
- def synth_mcmt_vchain(
22
- gate: Gate, num_ctrl_qubits: int, num_target_qubits: int, ctrl_state: int | None = None
23
- ) -> QuantumCircuit:
24
- """Synthesize MCMT using a V-chain.
25
-
26
- This uses a chain of CCX gates, using ``num_ctrl_qubits - 1`` auxiliary qubits.
27
-
28
- For example, a 3-control and 2-target H gate will be synthesized as::
29
-
30
- q_0: ──■────────────────────────■──
31
- │ │
32
- q_1: ──■────────────────────────■──
33
- │ │
34
- q_2: ──┼────■──────────────■────┼──
35
- │ │ ┌───┐ │ │
36
- q_3: ──┼────┼──┤ H ├───────┼────┼──
37
- │ │ └─┬─┘┌───┐ │ │
38
- q_4: ──┼────┼────┼──┤ H ├──┼────┼──
39
- ┌─┴─┐ │ │ └─┬─┘ │ ┌─┴─┐
40
- q_5: ┤ X ├──■────┼────┼────■──┤ X ├
41
- └───┘┌─┴─┐ │ │ ┌─┴─┐└───┘
42
- q_6: ─────┤ X ├──■────■──┤ X ├─────
43
- └───┘ └───┘
44
-
45
- """
46
- if gate.num_qubits != 1:
47
- raise ValueError("Only single qubit gates are supported as input.")
48
-
49
- circ = QuantumCircuit._from_circuit_data(
50
- mcmt_v_chain(gate.control(), num_ctrl_qubits, num_target_qubits, ctrl_state)
51
- )
52
- return circ
@@ -1,69 +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
- """Transpiler pass to drop gates with negligible effects."""
14
-
15
- from __future__ import annotations
16
-
17
- from qiskit.dagcircuit import DAGCircuit
18
- from qiskit.transpiler.target import Target
19
- from qiskit.transpiler.basepasses import TransformationPass
20
- from qiskit._accelerate.remove_identity_equiv import remove_identity_equiv
21
-
22
-
23
- class RemoveIdentityEquivalent(TransformationPass):
24
- r"""Remove gates with negligible effects.
25
-
26
- Removes gates whose effect is close to an identity operation, up to the specified
27
- tolerance. Zero qubit gates such as :class:`.GlobalPhaseGate` are not considered
28
- by this pass.
29
-
30
- For a cutoff fidelity :math:`f`, this pass removes gates whose average
31
- gate fidelity with respect to the identity is below :math:`f`. Concretely,
32
- a gate :math:`G` is removed if :math:`\bar F < f` where
33
-
34
- .. math::
35
-
36
- \bar{F} = \frac{1 + F_{\text{process}}}{1 + d},\
37
-
38
- F_{\text{process}} = \frac{|\mathrm{Tr}(G)|^2}{d^2}
39
-
40
- where :math:`d = 2^n` is the dimension of the gate for :math:`n` qubits.
41
- """
42
-
43
- def __init__(
44
- self, *, approximation_degree: float | None = 1.0, target: None | Target = None
45
- ) -> None:
46
- """Initialize the transpiler pass.
47
-
48
- Args:
49
- approximation_degree: The degree to approximate for the equivalence check. This can be a
50
- floating point value between 0 and 1, or ``None``. If the value is 1 this does not
51
- approximate above floating point precision. For a value < 1 this is used as a scaling
52
- factor for the cutoff fidelity. If the value is ``None`` this approximates up to the
53
- fidelity for the gate specified in ``target``.
54
-
55
- target: If ``approximation_degree`` is set to ``None`` and a :class:`.Target` is provided
56
- for this field the tolerance for determining whether an operation is equivalent to
57
- identity will be set to the reported error rate in the target. If
58
- ``approximation_degree`` (the default) this has no effect, if
59
- ``approximation_degree=None`` it uses the error rate specified in the ``Target`` for
60
- the gate being evaluated, and a numeric value other than 1 with ``target`` set is
61
- used as a scaling factor of the target's error rate.
62
- """
63
- super().__init__()
64
- self._approximation_degree = approximation_degree
65
- self._target = target
66
-
67
- def run(self, dag: DAGCircuit) -> DAGCircuit:
68
- remove_identity_equiv(dag, self._approximation_degree, self._target)
69
- return dag