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
@@ -14,14 +14,14 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- import warnings
18
17
  from collections.abc import Callable
19
18
 
20
19
  from qiskit import circuit
21
- from qiskit.circuit import ControlledGate, Gate, QuantumCircuit
22
- from qiskit.circuit._utils import _ctrl_state_to_int
23
- from qiskit.utils.deprecation import deprecate_func
24
- from ..standard_gates import get_standard_gate_name_mapping
20
+ from qiskit.circuit import ControlledGate, Gate, QuantumRegister, QuantumCircuit
21
+ from qiskit.exceptions import QiskitError
22
+
23
+ # pylint: disable=cyclic-import
24
+ from ..standard_gates import XGate, YGate, ZGate, HGate, TGate, TdgGate, SGate, SdgGate
25
25
 
26
26
 
27
27
  class MCMT(QuantumCircuit):
@@ -29,7 +29,7 @@ class MCMT(QuantumCircuit):
29
29
 
30
30
  For example, the H gate controlled on 3 qubits and acting on 2 target qubit is represented as:
31
31
 
32
- .. code-block:: text
32
+ .. parsed-literal::
33
33
 
34
34
  ───■────
35
35
 
@@ -49,7 +49,6 @@ class MCMT(QuantumCircuit):
49
49
  :class:`~qiskit.circuit.library.MCMTVChain`.
50
50
  """
51
51
 
52
- @deprecate_func(since="1.3", additional_msg="Use MCMTGate instead.", pending=True)
53
52
  def __init__(
54
53
  self,
55
54
  gate: Gate | Callable[[QuantumCircuit, circuit.Qubit, circuit.Qubit], circuit.Instruction],
@@ -72,41 +71,77 @@ class MCMT(QuantumCircuit):
72
71
  if num_ctrl_qubits == 0 or num_target_qubits == 0:
73
72
  raise AttributeError("Need at least one control and one target qubit.")
74
73
 
75
- if callable(gate):
76
- warnings.warn(
77
- "Passing a callable to MCMT is pending deprecation since Qiskit 1.3. Pass a "
78
- "gate instance or the gate name instead, e.g. pass 'h' instead of QuantumCircuit.h.",
79
- category=PendingDeprecationWarning,
80
- stacklevel=2,
81
- )
82
- gate = gate.__name__
83
- elif isinstance(gate, QuantumCircuit):
84
- warnings.warn(
85
- "Passing a QuantumCircuit is pending deprecation since Qiskit 1.3. Pass a gate "
86
- "or turn the circuit into a gate using the ``to_gate`` method, instead.",
87
- category=PendingDeprecationWarning,
88
- stacklevel=2,
89
- )
90
- gate = gate.to_gate()
91
-
92
- self.gate = MCMTGate._identify_base_gate(gate)
74
+ # set the internal properties and determine the number of qubits
75
+ self.gate = self._identify_gate(gate)
93
76
  self.num_ctrl_qubits = num_ctrl_qubits
94
77
  self.num_target_qubits = num_target_qubits
78
+ num_qubits = num_ctrl_qubits + num_target_qubits + self.num_ancilla_qubits
95
79
 
96
80
  # initialize the circuit object
97
- num_qubits = num_ctrl_qubits + num_target_qubits + self.num_ancilla_qubits
98
81
  super().__init__(num_qubits, name="mcmt")
82
+ self._label = f"{num_target_qubits}-{self.gate.name.capitalize()}"
83
+
84
+ # build the circuit
99
85
  self._build()
100
86
 
101
87
  def _build(self):
102
- gate = MCMTGate(self.gate, self.num_ctrl_qubits, self.num_target_qubits)
103
- self.append(gate, self.qubits)
88
+ """Define the MCMT gate without ancillas."""
89
+ if self.num_target_qubits == 1:
90
+ # no broadcasting needed (makes for better circuit diagrams)
91
+ broadcasted_gate = self.gate
92
+ else:
93
+ broadcasted = QuantumCircuit(self.num_target_qubits, name=self._label)
94
+ for target in list(range(self.num_target_qubits)):
95
+ broadcasted.append(self.gate, [target], [])
96
+ broadcasted_gate = broadcasted.to_gate()
97
+
98
+ mcmt_gate = broadcasted_gate.control(self.num_ctrl_qubits)
99
+ self.append(mcmt_gate, self.qubits, [])
104
100
 
105
101
  @property
106
102
  def num_ancilla_qubits(self):
107
103
  """Return the number of ancillas."""
108
104
  return 0
109
105
 
106
+ def _identify_gate(self, gate):
107
+ """Case the gate input to a gate."""
108
+ valid_gates = {
109
+ "ch": HGate(),
110
+ "cx": XGate(),
111
+ "cy": YGate(),
112
+ "cz": ZGate(),
113
+ "h": HGate(),
114
+ "s": SGate(),
115
+ "sdg": SdgGate(),
116
+ "x": XGate(),
117
+ "y": YGate(),
118
+ "z": ZGate(),
119
+ "t": TGate(),
120
+ "tdg": TdgGate(),
121
+ }
122
+ if isinstance(gate, ControlledGate):
123
+ base_gate = gate.base_gate
124
+ elif isinstance(gate, Gate):
125
+ if gate.num_qubits != 1:
126
+ raise AttributeError("Base gate must act on one qubit only.")
127
+ base_gate = gate
128
+ elif isinstance(gate, QuantumCircuit):
129
+ if gate.num_qubits != 1:
130
+ raise AttributeError(
131
+ "The circuit you specified as control gate can only have one qubit!"
132
+ )
133
+ base_gate = gate.to_gate() # raises error if circuit contains non-unitary instructions
134
+ else:
135
+ if callable(gate): # identify via name of the passed function
136
+ name = gate.__name__
137
+ elif isinstance(gate, str):
138
+ name = gate
139
+ else:
140
+ raise AttributeError(f"Invalid gate specified: {gate}")
141
+ base_gate = valid_gates[name]
142
+
143
+ return base_gate
144
+
110
145
  def control(self, num_ctrl_qubits=1, label=None, ctrl_state=None, annotated=False):
111
146
  """Return the controlled version of the MCMT circuit."""
112
147
  if not annotated and ctrl_state is None:
@@ -156,161 +191,66 @@ class MCMTVChain(MCMT):
156
191
  └───┘ └───┘
157
192
  """
158
193
 
159
- @deprecate_func(
160
- since="1.3",
161
- additional_msg="Use MCMTGate with the V-chain synthesis plugin instead.",
162
- pending=True,
163
- )
164
- def __init__(
165
- self,
166
- gate: Gate | Callable[[QuantumCircuit, circuit.Qubit, circuit.Qubit], circuit.Instruction],
167
- num_ctrl_qubits: int,
168
- num_target_qubits: int,
169
- ) -> None:
170
- super().__init__(gate, num_ctrl_qubits, num_target_qubits)
171
-
172
194
  def _build(self):
173
- # pylint: disable=cyclic-import
174
- from qiskit.synthesis.multi_controlled import synth_mcmt_vchain
195
+ """Define the MCMT gate."""
196
+ control_qubits = self.qubits[: self.num_ctrl_qubits]
197
+ target_qubits = self.qubits[
198
+ self.num_ctrl_qubits : self.num_ctrl_qubits + self.num_target_qubits
199
+ ]
200
+ ancilla_qubits = self.qubits[self.num_ctrl_qubits + self.num_target_qubits :]
201
+
202
+ if len(ancilla_qubits) > 0:
203
+ master_control = ancilla_qubits[-1]
204
+ else:
205
+ master_control = control_qubits[0]
175
206
 
176
- synthesized = synth_mcmt_vchain(self.gate, self.num_ctrl_qubits, self.num_target_qubits)
177
- self.compose(synthesized, inplace=True, copy=False)
207
+ self._ccx_v_chain_rule(control_qubits, ancilla_qubits, reverse=False)
208
+ for qubit in target_qubits:
209
+ self.append(self.gate.control(), [master_control, qubit], [])
210
+ self._ccx_v_chain_rule(control_qubits, ancilla_qubits, reverse=True)
178
211
 
179
212
  @property
180
213
  def num_ancilla_qubits(self):
181
214
  """Return the number of ancilla qubits required."""
182
215
  return max(0, self.num_ctrl_qubits - 1)
183
216
 
184
- def inverse(self, annotated: bool = False):
185
- return MCMTVChain(self.gate, self.num_ctrl_qubits, self.num_target_qubits)
186
-
187
-
188
- class MCMTGate(ControlledGate):
189
- """The multi-controlled multi-target gate, for an arbitrary singly controlled target gate.
190
-
191
- For example, the H gate controlled on 3 qubits and acting on 2 target qubit is represented as:
192
-
193
- .. parsed-literal::
194
-
195
- ───■────
196
-
197
- ───■────
198
-
199
- ───■────
200
- ┌──┴───┐
201
- ┤0 ├
202
- │ 2-H │
203
- ┤1 ├
204
- └──────┘
205
-
206
- Depending on the number of available auxiliary qubits, this operation can be synthesized
207
- using different methods. For example, if :math:`n - 1` clean auxiliary qubits are available
208
- (where :math:`n` is the number of control qubits), a V-chain decomposition can be used whose
209
- depth is linear in :math:`n`. See also :func:`.synth_mcmt_chain`.
210
- """
211
-
212
- def __init__(
217
+ def _ccx_v_chain_rule(
213
218
  self,
214
- gate: Gate,
215
- num_ctrl_qubits: int,
216
- num_target_qubits: int,
217
- ctrl_state: int | str | None = None,
218
- label: str | None = None,
219
+ control_qubits: QuantumRegister | list[circuit.Qubit],
220
+ ancilla_qubits: QuantumRegister | list[circuit.Qubit],
221
+ reverse: bool = False,
219
222
  ) -> None:
220
- """
221
- Args:
222
- gate: The base gate to apply on multiple target qubits, controlled by other qubits.
223
- This must be a single-qubit gate or a controlled single-qubit gate.
224
- num_ctrl_qubits: The number of control qubits.
225
- num_target_qubits: The number of target qubits.
226
- ctrl_state: The control state of the control qubits. Defaults to all closed controls.
227
- label: The gate label.
228
- """
229
- if num_target_qubits < 1:
230
- raise ValueError("Need at least one target qubit.")
223
+ """Get the rule for the CCX V-chain.
231
224
 
232
- if num_ctrl_qubits < 1:
233
- raise ValueError("Need at least one control qubit.")
225
+ The CCX V-chain progressively computes the CCX of the control qubits and puts the final
226
+ result in the last ancillary qubit.
234
227
 
235
- self.num_target_qubits = num_target_qubits
236
-
237
- base_gate = self._identify_base_gate(gate)
238
- num_qubits = num_ctrl_qubits + num_target_qubits
239
-
240
- if label is None:
241
- label = f"{num_target_qubits}-{gate.name.capitalize()}"
242
-
243
- super().__init__(
244
- "mcmt",
245
- base_gate=base_gate,
246
- num_qubits=num_qubits,
247
- params=gate.params,
248
- num_ctrl_qubits=num_ctrl_qubits,
249
- ctrl_state=ctrl_state,
250
- label=label,
251
- )
252
-
253
- def _define(self):
254
- """Default definition relying on gate.control. Control state is handled by superclass."""
255
- # pylint: disable=cyclic-import
256
- from qiskit.transpiler.passes.synthesis.hls_plugins import MCMTSynthesisDefault
257
-
258
- self.definition = MCMTSynthesisDefault().run(self)
259
-
260
- @staticmethod
261
- def _identify_base_gate(gate):
262
- """Get the control base gate. Note this must be a single qubit gate."""
263
-
264
- # try getting the standard name from the string
265
- if isinstance(gate, str):
266
- standard_gates = get_standard_gate_name_mapping()
267
- if gate in standard_gates:
268
- gate = standard_gates[gate]
269
- else:
270
- raise AttributeError(
271
- f"Unknown gate {gate}. Available: {list(get_standard_gate_name_mapping.keys())}"
272
- )
228
+ Args:
229
+ control_qubits: The control qubits.
230
+ ancilla_qubits: The ancilla qubits.
231
+ reverse: If True, compute the chain down to the qubit. If False, compute upwards.
273
232
 
274
- # extract the base gate
275
- if isinstance(gate, ControlledGate):
276
- warnings.warn(
277
- "Passing a controlled gate to MCMT is pending deprecation since Qiskit 1.3. Pass a "
278
- "single-qubit gate instance or the gate name instead, e.g. pass 'h' instead of 'ch'.",
279
- category=PendingDeprecationWarning,
280
- stacklevel=2,
281
- )
282
- base_gate = gate.base_gate
283
- elif isinstance(gate, Gate):
284
- base_gate = gate
285
- else:
286
- raise TypeError(f"Invalid gate type {type(gate)}.")
233
+ Returns:
234
+ The rule for the (reversed) CCX V-chain.
287
235
 
288
- if base_gate.num_qubits != 1:
289
- raise ValueError(
290
- f"MCMTGate requires a base gate with a single qubit, but got {base_gate.num_qubits}."
291
- )
236
+ Raises:
237
+ QiskitError: If an insufficient number of ancilla qubits was provided.
238
+ """
239
+ if len(ancilla_qubits) == 0:
240
+ return
292
241
 
293
- return base_gate
242
+ if len(ancilla_qubits) < len(control_qubits) - 1:
243
+ raise QiskitError("Insufficient number of ancilla qubits.")
294
244
 
295
- def control(self, num_ctrl_qubits=1, label=None, ctrl_state=None, annotated=False):
296
- """Return the controlled version of the MCMT circuit."""
297
- if not annotated:
298
- ctrl_state = _ctrl_state_to_int(ctrl_state, num_ctrl_qubits)
299
- new_ctrl_state = (self.ctrl_state << num_ctrl_qubits) | ctrl_state
300
-
301
- gate = MCMTGate(
302
- self.base_gate,
303
- self.num_ctrl_qubits + num_ctrl_qubits,
304
- self.num_target_qubits,
305
- ctrl_state=new_ctrl_state,
306
- )
245
+ iterations = list(enumerate(range(2, len(control_qubits))))
246
+ if not reverse:
247
+ self.ccx(control_qubits[0], control_qubits[1], ancilla_qubits[0])
248
+ for i, j in iterations:
249
+ self.ccx(control_qubits[j], ancilla_qubits[i], ancilla_qubits[i + 1])
307
250
  else:
308
- gate = super().control(num_ctrl_qubits, label, ctrl_state, annotated=annotated)
309
-
310
- return gate
251
+ for i, j in reversed(iterations):
252
+ self.ccx(control_qubits[j], ancilla_qubits[i], ancilla_qubits[i + 1])
253
+ self.ccx(control_qubits[0], control_qubits[1], ancilla_qubits[0])
311
254
 
312
255
  def inverse(self, annotated: bool = False):
313
- """Return the inverse MCMT circuit."""
314
- return MCMTGate(
315
- self.base_gate.inverse(), self.num_ctrl_qubits, self.num_target_qubits, self.ctrl_state
316
- )
256
+ return MCMTVChain(self.gate, self.num_ctrl_qubits, self.num_target_qubits)
@@ -22,13 +22,11 @@ import numpy as np
22
22
  from qiskit.circuit.quantumcircuit import QuantumCircuit
23
23
  from qiskit.circuit.quantumcircuit import Gate
24
24
  from qiskit.circuit.exceptions import CircuitError
25
- from qiskit.utils.deprecation import deprecate_func
26
25
 
27
26
 
28
27
  class Permutation(QuantumCircuit):
29
28
  """An n_qubit circuit that permutes qubits."""
30
29
 
31
- @deprecate_func(since="1.3", pending=True, additional_msg="Use PermutationGate instead.")
32
30
  def __init__(
33
31
  self,
34
32
  num_qubits: int,
@@ -119,11 +117,11 @@ class PermutationGate(Gate):
119
117
 
120
118
  from qiskit.circuit.quantumcircuit import QuantumCircuit
121
119
  from qiskit.circuit.library import PermutationGate
122
- A = [2, 4, 3, 0, 1]
120
+ A = [2,4,3,0,1]
123
121
  permutation = PermutationGate(A)
124
122
  circuit = QuantumCircuit(5)
125
123
  circuit.append(permutation, [0, 1, 2, 3, 4])
126
- circuit.draw("mpl")
124
+ circuit.draw('mpl')
127
125
 
128
126
  Expanded Circuit:
129
127
  .. plot::
@@ -131,7 +129,7 @@ class PermutationGate(Gate):
131
129
  from qiskit.circuit.quantumcircuit import QuantumCircuit
132
130
  from qiskit.circuit.library import PermutationGate
133
131
  from qiskit.visualization.library import _generate_circuit_library_visualization
134
- A = [2, 4, 3, 0, 1]
132
+ A = [2,4,3,0,1]
135
133
  permutation = PermutationGate(A)
136
134
  circuit = QuantumCircuit(5)
137
135
  circuit.append(permutation, [0, 1, 2, 3, 4])
@@ -143,7 +141,7 @@ class PermutationGate(Gate):
143
141
  raise CircuitError(
144
142
  "Permutation pattern must be some ordering of 0..num_qubits-1 in a list."
145
143
  )
146
- pattern = np.array(pattern, dtype=np.int32)
144
+ pattern = np.array(pattern)
147
145
 
148
146
  super().__init__(name="permutation", num_qubits=num_qubits, params=[pattern])
149
147
 
@@ -170,11 +168,11 @@ class PermutationGate(Gate):
170
168
  return parameter
171
169
 
172
170
  @property
173
- def pattern(self) -> np.ndarray[bool]:
171
+ def pattern(self):
174
172
  """Returns the permutation pattern defining this permutation."""
175
173
  return self.params[0]
176
174
 
177
- def inverse(self, annotated: bool = False) -> PermutationGate:
175
+ def inverse(self, annotated: bool = False):
178
176
  """Returns the inverse of the permutation."""
179
177
 
180
178
  # pylint: disable=cyclic-import
@@ -27,7 +27,7 @@ class RVGate(Gate):
27
27
 
28
28
  **Circuit symbol:**
29
29
 
30
- .. code-block:: text
30
+ .. parsed-literal::
31
31
 
32
32
  ┌─────────────────┐
33
33
  q_0: ┤ RV(v_x,v_y,v_z) ├
@@ -51,13 +51,14 @@ class RVGate(Gate):
51
51
  \end{pmatrix}
52
52
  """
53
53
 
54
- def __init__(self, v_x: float, v_y: float, v_z: float, basis: str = "U"):
55
- """
54
+ def __init__(self, v_x, v_y, v_z, basis="U"):
55
+ """Create new rv single-qubit gate.
56
+
56
57
  Args:
57
- v_x: x-component
58
- v_y: y-component
59
- v_z: z-component
60
- basis: basis (see
58
+ v_x (float): x-component
59
+ v_y (float): y-component
60
+ v_z (float): z-component
61
+ basis (str, optional): basis (see
61
62
  :class:`~qiskit.synthesis.one_qubit.one_qubit_decompose.OneQubitEulerDecomposer`)
62
63
  """
63
64
  # pylint: disable=cyclic-import
@@ -79,7 +80,7 @@ class RVGate(Gate):
79
80
  vx, vy, vz = self.params
80
81
  return RVGate(-vx, -vy, -vz)
81
82
 
82
- def to_matrix(self) -> numpy.ndarray:
83
+ def to_matrix(self):
83
84
  """Return a numpy.array for the R(v) gate."""
84
85
  v = numpy.asarray(self.params, dtype=float)
85
86
  angle = math.sqrt(v.dot(v))
@@ -1,6 +1,6 @@
1
1
  # This code is part of Qiskit.
2
2
  #
3
- # (C) Copyright IBM 2017, 2024.
3
+ # (C) Copyright IBM 2017, 2020.
4
4
  #
5
5
  # This code is licensed under the Apache License, Version 2.0. You may
6
6
  # obtain a copy of this license in the LICENSE.txt file in the root directory
@@ -10,14 +10,13 @@
10
10
  # copyright notice, and modified files need to carry a notice indicating
11
11
  # that they have been altered from the originals.
12
12
 
13
- """Graph State circuit and gate."""
13
+ """Graph State circuit."""
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
17
  import numpy as np
18
- from qiskit.circuit.quantumcircuit import QuantumCircuit, Gate
18
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
19
19
  from qiskit.circuit.exceptions import CircuitError
20
- from qiskit.utils.deprecation import deprecate_func
21
20
 
22
21
 
23
22
  class GraphState(QuantumCircuit):
@@ -57,11 +56,6 @@ class GraphState(QuantumCircuit):
57
56
  `arXiv:1512.07892 <https://arxiv.org/pdf/1512.07892.pdf>`_
58
57
  """
59
58
 
60
- @deprecate_func(
61
- since="1.3",
62
- additional_msg="Use qiskit.circuit.library.GraphStateGate instead.",
63
- pending=True,
64
- )
65
59
  def __init__(self, adjacency_matrix: list | np.ndarray) -> None:
66
60
  """Create graph state preparation circuit.
67
61
 
@@ -79,91 +73,14 @@ class GraphState(QuantumCircuit):
79
73
  if not np.allclose(adjacency_matrix, adjacency_matrix.transpose()):
80
74
  raise CircuitError("The adjacency matrix must be symmetric.")
81
75
 
82
- graph_state_gate = GraphStateGate(adjacency_matrix)
83
- super().__init__(graph_state_gate.num_qubits, name=f"graph: {adjacency_matrix}")
84
- self.compose(graph_state_gate, qubits=self.qubits, inplace=True)
85
-
86
-
87
- class GraphStateGate(Gate):
88
- r"""A gate representing a graph state.
89
-
90
- Given a graph G = (V, E), with the set of vertices V and the set of edges E,
91
- the corresponding graph state is defined as
92
-
93
- .. math::
94
-
95
- |G\rangle = \prod_{(a,b) \in E} CZ_{(a,b)} {|+\rangle}^{\otimes V}
96
-
97
- Such a state can be prepared by first preparing all qubits in the :math:`+`
98
- state, then applying a :math:`CZ` gate for each corresponding graph edge.
99
-
100
- Graph state preparation circuits are Clifford circuits, and thus
101
- easy to simulate classically. However, by adding a layer of measurements
102
- in a product basis at the end, there is evidence that the circuit becomes
103
- hard to simulate [2].
104
-
105
- **Reference Circuit:**
106
-
107
- .. plot::
108
- :include-source:
109
-
110
- from qiskit.circuit import QuantumCircuit
111
- from qiskit.circuit.library import GraphStateGate
112
- import rustworkx as rx
113
-
114
- G = rx.generators.cycle_graph(5)
115
- circuit = QuantumCircuit(5)
116
- circuit.append(GraphStateGate(rx.adjacency_matrix(G)), [0, 1, 2, 3, 4])
117
- circuit.decompose().draw('mpl')
118
-
119
- **References:**
120
-
121
- [1] M. Hein, J. Eisert, H.J. Briegel, Multi-party Entanglement in Graph States,
122
- `arXiv:0307130 <https://arxiv.org/pdf/quant-ph/0307130.pdf>`_
123
- [2] D. Koh, Further Extensions of Clifford Circuits & their Classical Simulation Complexities.
124
- `arXiv:1512.07892 <https://arxiv.org/pdf/1512.07892.pdf>`_
125
- """
126
-
127
- def __init__(self, adjacency_matrix: list | np.ndarray) -> None:
128
- """
129
- Args:
130
- adjacency_matrix: input graph as n-by-n list of 0-1 lists
131
-
132
- Raises:
133
- CircuitError: If adjacency_matrix is not symmetric.
134
-
135
- The gate represents a graph state with the given adjacency matrix.
136
- """
137
-
138
- adjacency_matrix = np.asarray(adjacency_matrix)
139
- if not np.allclose(adjacency_matrix, adjacency_matrix.transpose()):
140
- raise CircuitError("The adjacency matrix must be symmetric.")
141
76
  num_qubits = len(adjacency_matrix)
77
+ circuit = QuantumCircuit(num_qubits, name=f"graph: {adjacency_matrix}")
142
78
 
143
- super().__init__(name="graph_state", num_qubits=num_qubits, params=[adjacency_matrix])
144
-
145
- def _define(self):
146
- adjacency_matrix = self.adjacency_matrix
147
- circuit = QuantumCircuit(self.num_qubits, name=self.name)
148
- circuit.h(range(self.num_qubits))
149
- for i in range(self.num_qubits):
150
- for j in range(i + 1, self.num_qubits):
79
+ circuit.h(range(num_qubits))
80
+ for i in range(num_qubits):
81
+ for j in range(i + 1, num_qubits):
151
82
  if adjacency_matrix[i][j] == 1:
152
83
  circuit.cz(i, j)
153
- self.definition = circuit
154
-
155
- def validate_parameter(self, parameter):
156
- """Parameter validation"""
157
- return parameter
158
-
159
- @property
160
- def adjacency_matrix(self):
161
- """Returns the adjacency matrix."""
162
- return self.params[0]
163
-
164
- def __eq__(self, other):
165
- return (
166
- isinstance(other, GraphStateGate)
167
- and self.num_qubits == other.num_qubits
168
- and np.all(self.adjacency_matrix == other.adjacency_matrix)
169
- )
84
+
85
+ super().__init__(*circuit.qregs, name=circuit.name)
86
+ self.compose(circuit.to_gate(), qubits=self.qubits, inplace=True)