qiskit 1.3.0__cp39-abi3-macosx_11_0_arm64.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 (836) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +146 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/assembler/__init__.py +42 -0
  6. qiskit/assembler/assemble_circuits.py +451 -0
  7. qiskit/assembler/assemble_schedules.py +367 -0
  8. qiskit/assembler/disassemble.py +310 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +1313 -0
  11. qiskit/circuit/_classical_resource_map.py +148 -0
  12. qiskit/circuit/_standard_gates_commutations.py +3849 -0
  13. qiskit/circuit/_utils.py +167 -0
  14. qiskit/circuit/add_control.py +274 -0
  15. qiskit/circuit/annotated_operation.py +279 -0
  16. qiskit/circuit/barrier.py +50 -0
  17. qiskit/circuit/bit.py +94 -0
  18. qiskit/circuit/classical/__init__.py +41 -0
  19. qiskit/circuit/classical/expr/__init__.py +238 -0
  20. qiskit/circuit/classical/expr/constructors.py +556 -0
  21. qiskit/circuit/classical/expr/expr.py +397 -0
  22. qiskit/circuit/classical/expr/visitors.py +300 -0
  23. qiskit/circuit/classical/types/__init__.py +109 -0
  24. qiskit/circuit/classical/types/ordering.py +222 -0
  25. qiskit/circuit/classical/types/types.py +117 -0
  26. qiskit/circuit/classicalfunction/__init__.py +140 -0
  27. qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
  28. qiskit/circuit/classicalfunction/classical_element.py +54 -0
  29. qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
  30. qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
  31. qiskit/circuit/classicalfunction/exceptions.py +35 -0
  32. qiskit/circuit/classicalfunction/types.py +18 -0
  33. qiskit/circuit/classicalfunction/utils.py +91 -0
  34. qiskit/circuit/classicalregister.py +57 -0
  35. qiskit/circuit/commutation_checker.py +106 -0
  36. qiskit/circuit/commutation_library.py +20 -0
  37. qiskit/circuit/controlflow/__init__.py +28 -0
  38. qiskit/circuit/controlflow/_builder_utils.py +207 -0
  39. qiskit/circuit/controlflow/break_loop.py +56 -0
  40. qiskit/circuit/controlflow/builder.py +691 -0
  41. qiskit/circuit/controlflow/continue_loop.py +58 -0
  42. qiskit/circuit/controlflow/control_flow.py +84 -0
  43. qiskit/circuit/controlflow/for_loop.py +217 -0
  44. qiskit/circuit/controlflow/if_else.py +511 -0
  45. qiskit/circuit/controlflow/switch_case.py +417 -0
  46. qiskit/circuit/controlflow/while_loop.py +171 -0
  47. qiskit/circuit/controlledgate.py +274 -0
  48. qiskit/circuit/delay.py +123 -0
  49. qiskit/circuit/duration.py +95 -0
  50. qiskit/circuit/equivalence.py +94 -0
  51. qiskit/circuit/equivalence_library.py +18 -0
  52. qiskit/circuit/exceptions.py +19 -0
  53. qiskit/circuit/gate.py +263 -0
  54. qiskit/circuit/instruction.py +697 -0
  55. qiskit/circuit/instructionset.py +179 -0
  56. qiskit/circuit/library/__init__.py +668 -0
  57. qiskit/circuit/library/arithmetic/__init__.py +34 -0
  58. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  59. qiskit/circuit/library/arithmetic/adders/adder.py +210 -0
  60. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  61. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  62. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  63. qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
  64. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  65. qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
  66. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
  67. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
  68. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  69. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  70. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +192 -0
  71. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  72. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
  73. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
  74. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
  75. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
  76. qiskit/circuit/library/arithmetic/quadratic_form.py +198 -0
  77. qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
  78. qiskit/circuit/library/basis_change/__init__.py +15 -0
  79. qiskit/circuit/library/basis_change/qft.py +313 -0
  80. qiskit/circuit/library/blueprintcircuit.py +280 -0
  81. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  82. qiskit/circuit/library/boolean_logic/inner_product.py +155 -0
  83. qiskit/circuit/library/boolean_logic/quantum_and.py +200 -0
  84. qiskit/circuit/library/boolean_logic/quantum_or.py +202 -0
  85. qiskit/circuit/library/boolean_logic/quantum_xor.py +165 -0
  86. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  87. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  88. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  89. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  90. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  91. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  92. qiskit/circuit/library/fourier_checking.py +158 -0
  93. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  94. qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
  95. qiskit/circuit/library/generalized_gates/gms.py +174 -0
  96. qiskit/circuit/library/generalized_gates/gr.py +215 -0
  97. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  98. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  99. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  100. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  101. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  102. qiskit/circuit/library/generalized_gates/permutation.py +194 -0
  103. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  104. qiskit/circuit/library/generalized_gates/uc.py +213 -0
  105. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  106. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  107. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  108. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  109. qiskit/circuit/library/generalized_gates/unitary.py +215 -0
  110. qiskit/circuit/library/graph_state.py +169 -0
  111. qiskit/circuit/library/grover_operator.py +579 -0
  112. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  113. qiskit/circuit/library/hidden_linear_function.py +161 -0
  114. qiskit/circuit/library/iqp.py +175 -0
  115. qiskit/circuit/library/n_local/__init__.py +45 -0
  116. qiskit/circuit/library/n_local/efficient_su2.py +277 -0
  117. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +515 -0
  118. qiskit/circuit/library/n_local/excitation_preserving.py +297 -0
  119. qiskit/circuit/library/n_local/n_local.py +1472 -0
  120. qiskit/circuit/library/n_local/pauli_two_design.py +243 -0
  121. qiskit/circuit/library/n_local/qaoa_ansatz.py +366 -0
  122. qiskit/circuit/library/n_local/real_amplitudes.py +306 -0
  123. qiskit/circuit/library/n_local/two_local.py +289 -0
  124. qiskit/circuit/library/overlap.py +182 -0
  125. qiskit/circuit/library/pauli_evolution.py +186 -0
  126. qiskit/circuit/library/phase_estimation.py +175 -0
  127. qiskit/circuit/library/phase_oracle.py +153 -0
  128. qiskit/circuit/library/quantum_volume.py +167 -0
  129. qiskit/circuit/library/standard_gates/__init__.py +142 -0
  130. qiskit/circuit/library/standard_gates/dcx.py +78 -0
  131. qiskit/circuit/library/standard_gates/ecr.py +130 -0
  132. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  133. qiskit/circuit/library/standard_gates/global_phase.py +85 -0
  134. qiskit/circuit/library/standard_gates/h.py +258 -0
  135. qiskit/circuit/library/standard_gates/i.py +76 -0
  136. qiskit/circuit/library/standard_gates/iswap.py +134 -0
  137. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +405 -0
  138. qiskit/circuit/library/standard_gates/p.py +441 -0
  139. qiskit/circuit/library/standard_gates/r.py +117 -0
  140. qiskit/circuit/library/standard_gates/rx.py +303 -0
  141. qiskit/circuit/library/standard_gates/rxx.py +183 -0
  142. qiskit/circuit/library/standard_gates/ry.py +298 -0
  143. qiskit/circuit/library/standard_gates/ryy.py +183 -0
  144. qiskit/circuit/library/standard_gates/rz.py +319 -0
  145. qiskit/circuit/library/standard_gates/rzx.py +229 -0
  146. qiskit/circuit/library/standard_gates/rzz.py +196 -0
  147. qiskit/circuit/library/standard_gates/s.py +428 -0
  148. qiskit/circuit/library/standard_gates/swap.py +288 -0
  149. qiskit/circuit/library/standard_gates/sx.py +315 -0
  150. qiskit/circuit/library/standard_gates/t.py +179 -0
  151. qiskit/circuit/library/standard_gates/u.py +403 -0
  152. qiskit/circuit/library/standard_gates/u1.py +501 -0
  153. qiskit/circuit/library/standard_gates/u2.py +149 -0
  154. qiskit/circuit/library/standard_gates/u3.py +436 -0
  155. qiskit/circuit/library/standard_gates/x.py +1529 -0
  156. qiskit/circuit/library/standard_gates/xx_minus_yy.py +235 -0
  157. qiskit/circuit/library/standard_gates/xx_plus_yy.py +239 -0
  158. qiskit/circuit/library/standard_gates/y.py +262 -0
  159. qiskit/circuit/library/standard_gates/z.py +348 -0
  160. qiskit/circuit/library/templates/__init__.py +92 -0
  161. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  162. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  164. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  165. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  166. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  169. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  170. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  171. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  175. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  176. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  178. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  179. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  180. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  182. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  183. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  187. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  188. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  191. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  192. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  198. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  199. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  203. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  204. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  226. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  227. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  228. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  229. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  230. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  231. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  233. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  234. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  235. qiskit/circuit/measure.py +44 -0
  236. qiskit/circuit/operation.py +67 -0
  237. qiskit/circuit/parameter.py +178 -0
  238. qiskit/circuit/parameterexpression.py +692 -0
  239. qiskit/circuit/parametertable.py +119 -0
  240. qiskit/circuit/parametervector.py +120 -0
  241. qiskit/circuit/quantumcircuit.py +6829 -0
  242. qiskit/circuit/quantumcircuitdata.py +136 -0
  243. qiskit/circuit/quantumregister.py +75 -0
  244. qiskit/circuit/random/__init__.py +15 -0
  245. qiskit/circuit/random/utils.py +358 -0
  246. qiskit/circuit/register.py +233 -0
  247. qiskit/circuit/reset.py +34 -0
  248. qiskit/circuit/singleton.py +606 -0
  249. qiskit/circuit/store.py +97 -0
  250. qiskit/circuit/tools/__init__.py +16 -0
  251. qiskit/circuit/tools/pi_check.py +190 -0
  252. qiskit/circuit/twirling.py +145 -0
  253. qiskit/compiler/__init__.py +33 -0
  254. qiskit/compiler/assembler.py +681 -0
  255. qiskit/compiler/scheduler.py +109 -0
  256. qiskit/compiler/sequencer.py +71 -0
  257. qiskit/compiler/transpiler.py +533 -0
  258. qiskit/converters/__init__.py +74 -0
  259. qiskit/converters/circuit_to_dag.py +78 -0
  260. qiskit/converters/circuit_to_dagdependency.py +51 -0
  261. qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
  262. qiskit/converters/circuit_to_gate.py +107 -0
  263. qiskit/converters/circuit_to_instruction.py +155 -0
  264. qiskit/converters/dag_to_circuit.py +79 -0
  265. qiskit/converters/dag_to_dagdependency.py +55 -0
  266. qiskit/converters/dag_to_dagdependency_v2.py +44 -0
  267. qiskit/converters/dagdependency_to_circuit.py +46 -0
  268. qiskit/converters/dagdependency_to_dag.py +54 -0
  269. qiskit/dagcircuit/__init__.py +44 -0
  270. qiskit/dagcircuit/collect_blocks.py +391 -0
  271. qiskit/dagcircuit/dagcircuit.py +24 -0
  272. qiskit/dagcircuit/dagdependency.py +646 -0
  273. qiskit/dagcircuit/dagdependency_v2.py +641 -0
  274. qiskit/dagcircuit/dagdepnode.py +160 -0
  275. qiskit/dagcircuit/dagnode.py +176 -0
  276. qiskit/dagcircuit/exceptions.py +42 -0
  277. qiskit/exceptions.py +153 -0
  278. qiskit/passmanager/__init__.py +240 -0
  279. qiskit/passmanager/base_tasks.py +230 -0
  280. qiskit/passmanager/compilation_status.py +74 -0
  281. qiskit/passmanager/exceptions.py +19 -0
  282. qiskit/passmanager/flow_controllers.py +116 -0
  283. qiskit/passmanager/passmanager.py +333 -0
  284. qiskit/primitives/__init__.py +481 -0
  285. qiskit/primitives/backend_estimator.py +486 -0
  286. qiskit/primitives/backend_estimator_v2.py +434 -0
  287. qiskit/primitives/backend_sampler.py +222 -0
  288. qiskit/primitives/backend_sampler_v2.py +339 -0
  289. qiskit/primitives/base/__init__.py +20 -0
  290. qiskit/primitives/base/base_estimator.py +252 -0
  291. qiskit/primitives/base/base_primitive.py +45 -0
  292. qiskit/primitives/base/base_primitive_job.py +78 -0
  293. qiskit/primitives/base/base_result.py +65 -0
  294. qiskit/primitives/base/base_sampler.py +204 -0
  295. qiskit/primitives/base/estimator_result.py +46 -0
  296. qiskit/primitives/base/sampler_result.py +45 -0
  297. qiskit/primitives/base/validation.py +231 -0
  298. qiskit/primitives/containers/__init__.py +26 -0
  299. qiskit/primitives/containers/bindings_array.py +389 -0
  300. qiskit/primitives/containers/bit_array.py +741 -0
  301. qiskit/primitives/containers/data_bin.py +173 -0
  302. qiskit/primitives/containers/estimator_pub.py +222 -0
  303. qiskit/primitives/containers/object_array.py +94 -0
  304. qiskit/primitives/containers/observables_array.py +279 -0
  305. qiskit/primitives/containers/primitive_result.py +53 -0
  306. qiskit/primitives/containers/pub_result.py +51 -0
  307. qiskit/primitives/containers/sampler_pub.py +193 -0
  308. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  309. qiskit/primitives/containers/shape.py +129 -0
  310. qiskit/primitives/estimator.py +172 -0
  311. qiskit/primitives/primitive_job.py +81 -0
  312. qiskit/primitives/sampler.py +162 -0
  313. qiskit/primitives/statevector_estimator.py +174 -0
  314. qiskit/primitives/statevector_sampler.py +292 -0
  315. qiskit/primitives/utils.py +247 -0
  316. qiskit/providers/__init__.py +803 -0
  317. qiskit/providers/backend.py +667 -0
  318. qiskit/providers/backend_compat.py +472 -0
  319. qiskit/providers/basic_provider/__init__.py +45 -0
  320. qiskit/providers/basic_provider/basic_provider.py +101 -0
  321. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  322. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  323. qiskit/providers/basic_provider/basic_simulator.py +821 -0
  324. qiskit/providers/basic_provider/exceptions.py +30 -0
  325. qiskit/providers/exceptions.py +45 -0
  326. qiskit/providers/fake_provider/__init__.py +105 -0
  327. qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
  351. qiskit/providers/fake_provider/fake_1q.py +91 -0
  352. qiskit/providers/fake_provider/fake_backend.py +165 -0
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +49 -0
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
  357. qiskit/providers/fake_provider/generic_backend_v2.py +1035 -0
  358. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  359. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  360. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  361. qiskit/providers/job.py +147 -0
  362. qiskit/providers/jobstatus.py +30 -0
  363. qiskit/providers/models/__init__.py +89 -0
  364. qiskit/providers/models/backendconfiguration.py +1040 -0
  365. qiskit/providers/models/backendproperties.py +517 -0
  366. qiskit/providers/models/backendstatus.py +94 -0
  367. qiskit/providers/models/jobstatus.py +66 -0
  368. qiskit/providers/models/pulsedefaults.py +305 -0
  369. qiskit/providers/options.py +273 -0
  370. qiskit/providers/provider.py +95 -0
  371. qiskit/providers/providerutils.py +110 -0
  372. qiskit/pulse/__init__.py +158 -0
  373. qiskit/pulse/builder.py +2254 -0
  374. qiskit/pulse/calibration_entries.py +381 -0
  375. qiskit/pulse/channels.py +227 -0
  376. qiskit/pulse/configuration.py +245 -0
  377. qiskit/pulse/exceptions.py +45 -0
  378. qiskit/pulse/filters.py +309 -0
  379. qiskit/pulse/instruction_schedule_map.py +424 -0
  380. qiskit/pulse/instructions/__init__.py +67 -0
  381. qiskit/pulse/instructions/acquire.py +150 -0
  382. qiskit/pulse/instructions/delay.py +71 -0
  383. qiskit/pulse/instructions/directives.py +154 -0
  384. qiskit/pulse/instructions/frequency.py +135 -0
  385. qiskit/pulse/instructions/instruction.py +270 -0
  386. qiskit/pulse/instructions/phase.py +152 -0
  387. qiskit/pulse/instructions/play.py +99 -0
  388. qiskit/pulse/instructions/reference.py +100 -0
  389. qiskit/pulse/instructions/snapshot.py +82 -0
  390. qiskit/pulse/library/__init__.py +97 -0
  391. qiskit/pulse/library/continuous.py +430 -0
  392. qiskit/pulse/library/pulse.py +148 -0
  393. qiskit/pulse/library/samplers/__init__.py +15 -0
  394. qiskit/pulse/library/samplers/decorators.py +295 -0
  395. qiskit/pulse/library/samplers/strategies.py +71 -0
  396. qiskit/pulse/library/symbolic_pulses.py +1988 -0
  397. qiskit/pulse/library/waveform.py +136 -0
  398. qiskit/pulse/macros.py +262 -0
  399. qiskit/pulse/parameter_manager.py +445 -0
  400. qiskit/pulse/parser.py +314 -0
  401. qiskit/pulse/reference_manager.py +58 -0
  402. qiskit/pulse/schedule.py +1854 -0
  403. qiskit/pulse/transforms/__init__.py +106 -0
  404. qiskit/pulse/transforms/alignments.py +406 -0
  405. qiskit/pulse/transforms/base_transforms.py +71 -0
  406. qiskit/pulse/transforms/canonicalization.py +498 -0
  407. qiskit/pulse/transforms/dag.py +122 -0
  408. qiskit/pulse/utils.py +149 -0
  409. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  410. qiskit/qasm/libs/qelib1.inc +266 -0
  411. qiskit/qasm/libs/stdgates.inc +82 -0
  412. qiskit/qasm2/__init__.py +654 -0
  413. qiskit/qasm2/exceptions.py +27 -0
  414. qiskit/qasm2/export.py +372 -0
  415. qiskit/qasm2/parse.py +452 -0
  416. qiskit/qasm3/__init__.py +367 -0
  417. qiskit/qasm3/ast.py +738 -0
  418. qiskit/qasm3/exceptions.py +27 -0
  419. qiskit/qasm3/experimental.py +70 -0
  420. qiskit/qasm3/exporter.py +1299 -0
  421. qiskit/qasm3/printer.py +577 -0
  422. qiskit/qobj/__init__.py +75 -0
  423. qiskit/qobj/common.py +81 -0
  424. qiskit/qobj/converters/__init__.py +18 -0
  425. qiskit/qobj/converters/lo_config.py +177 -0
  426. qiskit/qobj/converters/pulse_instruction.py +897 -0
  427. qiskit/qobj/pulse_qobj.py +709 -0
  428. qiskit/qobj/qasm_qobj.py +708 -0
  429. qiskit/qobj/utils.py +46 -0
  430. qiskit/qpy/__init__.py +1822 -0
  431. qiskit/qpy/binary_io/__init__.py +36 -0
  432. qiskit/qpy/binary_io/circuits.py +1475 -0
  433. qiskit/qpy/binary_io/schedules.py +635 -0
  434. qiskit/qpy/binary_io/value.py +1025 -0
  435. qiskit/qpy/common.py +350 -0
  436. qiskit/qpy/exceptions.py +53 -0
  437. qiskit/qpy/formats.py +401 -0
  438. qiskit/qpy/interface.py +377 -0
  439. qiskit/qpy/type_keys.py +572 -0
  440. qiskit/quantum_info/__init__.py +162 -0
  441. qiskit/quantum_info/analysis/__init__.py +17 -0
  442. qiskit/quantum_info/analysis/average.py +47 -0
  443. qiskit/quantum_info/analysis/distance.py +102 -0
  444. qiskit/quantum_info/analysis/make_observable.py +44 -0
  445. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  446. qiskit/quantum_info/operators/__init__.py +28 -0
  447. qiskit/quantum_info/operators/base_operator.py +145 -0
  448. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  449. qiskit/quantum_info/operators/channel/chi.py +191 -0
  450. qiskit/quantum_info/operators/channel/choi.py +218 -0
  451. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  452. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  453. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  454. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  455. qiskit/quantum_info/operators/channel/superop.py +377 -0
  456. qiskit/quantum_info/operators/channel/transformations.py +475 -0
  457. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  458. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  459. qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
  460. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  461. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  462. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  463. qiskit/quantum_info/operators/linear_op.py +25 -0
  464. qiskit/quantum_info/operators/measures.py +418 -0
  465. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  466. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  467. qiskit/quantum_info/operators/mixins/group.py +171 -0
  468. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  469. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  470. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  471. qiskit/quantum_info/operators/op_shape.py +525 -0
  472. qiskit/quantum_info/operators/operator.py +865 -0
  473. qiskit/quantum_info/operators/operator_utils.py +76 -0
  474. qiskit/quantum_info/operators/predicates.py +183 -0
  475. qiskit/quantum_info/operators/random.py +154 -0
  476. qiskit/quantum_info/operators/scalar_op.py +254 -0
  477. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  478. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  479. qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
  480. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  481. qiskit/quantum_info/operators/symplectic/pauli.py +753 -0
  482. qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
  483. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  484. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  485. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1196 -0
  486. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  487. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  488. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  489. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  490. qiskit/quantum_info/quaternion.py +156 -0
  491. qiskit/quantum_info/random.py +26 -0
  492. qiskit/quantum_info/states/__init__.py +28 -0
  493. qiskit/quantum_info/states/densitymatrix.py +845 -0
  494. qiskit/quantum_info/states/measures.py +288 -0
  495. qiskit/quantum_info/states/quantum_state.py +503 -0
  496. qiskit/quantum_info/states/random.py +157 -0
  497. qiskit/quantum_info/states/stabilizerstate.py +773 -0
  498. qiskit/quantum_info/states/statevector.py +958 -0
  499. qiskit/quantum_info/states/utils.py +247 -0
  500. qiskit/result/__init__.py +73 -0
  501. qiskit/result/counts.py +189 -0
  502. qiskit/result/distributions/__init__.py +17 -0
  503. qiskit/result/distributions/probability.py +100 -0
  504. qiskit/result/distributions/quasi.py +154 -0
  505. qiskit/result/exceptions.py +40 -0
  506. qiskit/result/mitigation/__init__.py +13 -0
  507. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  508. qiskit/result/mitigation/correlated_readout_mitigator.py +277 -0
  509. qiskit/result/mitigation/local_readout_mitigator.py +328 -0
  510. qiskit/result/mitigation/utils.py +217 -0
  511. qiskit/result/models.py +234 -0
  512. qiskit/result/postprocess.py +239 -0
  513. qiskit/result/result.py +392 -0
  514. qiskit/result/sampled_expval.py +75 -0
  515. qiskit/result/utils.py +295 -0
  516. qiskit/scheduler/__init__.py +40 -0
  517. qiskit/scheduler/config.py +37 -0
  518. qiskit/scheduler/lowering.py +187 -0
  519. qiskit/scheduler/methods/__init__.py +15 -0
  520. qiskit/scheduler/methods/basic.py +140 -0
  521. qiskit/scheduler/schedule_circuit.py +69 -0
  522. qiskit/scheduler/sequence.py +104 -0
  523. qiskit/synthesis/__init__.py +220 -0
  524. qiskit/synthesis/arithmetic/__init__.py +16 -0
  525. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  526. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  527. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  528. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  529. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  530. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
  531. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
  532. qiskit/synthesis/clifford/__init__.py +19 -0
  533. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  534. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  535. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  536. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  537. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  538. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  539. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  540. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  541. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  542. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  543. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  544. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  545. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  546. qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
  547. qiskit/synthesis/evolution/__init__.py +21 -0
  548. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  549. qiskit/synthesis/evolution/lie_trotter.py +117 -0
  550. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  551. qiskit/synthesis/evolution/pauli_network.py +80 -0
  552. qiskit/synthesis/evolution/product_formula.py +311 -0
  553. qiskit/synthesis/evolution/qdrift.py +138 -0
  554. qiskit/synthesis/evolution/suzuki_trotter.py +215 -0
  555. qiskit/synthesis/linear/__init__.py +26 -0
  556. qiskit/synthesis/linear/cnot_synth.py +69 -0
  557. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  558. qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
  559. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  560. qiskit/synthesis/linear_phase/__init__.py +17 -0
  561. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  562. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  563. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  564. qiskit/synthesis/multi_controlled/__init__.py +24 -0
  565. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  566. qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
  567. qiskit/synthesis/one_qubit/__init__.py +15 -0
  568. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  569. qiskit/synthesis/permutation/__init__.py +18 -0
  570. qiskit/synthesis/permutation/permutation_full.py +78 -0
  571. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  572. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  573. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  574. qiskit/synthesis/qft/__init__.py +16 -0
  575. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  576. qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
  577. qiskit/synthesis/stabilizer/__init__.py +16 -0
  578. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  579. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  580. qiskit/synthesis/two_qubit/__init__.py +19 -0
  581. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  582. qiskit/synthesis/two_qubit/two_qubit_decompose.py +700 -0
  583. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  584. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  585. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  586. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  587. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  588. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  589. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  590. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  591. qiskit/synthesis/unitary/__init__.py +13 -0
  592. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  593. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  594. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  595. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  596. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  597. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  598. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  599. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  600. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  601. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  602. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  603. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  604. qiskit/synthesis/unitary/qsd.py +288 -0
  605. qiskit/transpiler/__init__.py +1290 -0
  606. qiskit/transpiler/basepasses.py +221 -0
  607. qiskit/transpiler/coupling.py +500 -0
  608. qiskit/transpiler/exceptions.py +59 -0
  609. qiskit/transpiler/instruction_durations.py +281 -0
  610. qiskit/transpiler/layout.py +737 -0
  611. qiskit/transpiler/passes/__init__.py +312 -0
  612. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  613. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  614. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  615. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  616. qiskit/transpiler/passes/analysis/depth.py +33 -0
  617. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  618. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  619. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  620. qiskit/transpiler/passes/analysis/size.py +36 -0
  621. qiskit/transpiler/passes/analysis/width.py +27 -0
  622. qiskit/transpiler/passes/basis/__init__.py +19 -0
  623. qiskit/transpiler/passes/basis/basis_translator.py +137 -0
  624. qiskit/transpiler/passes/basis/decompose.py +131 -0
  625. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  626. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
  627. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
  628. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  629. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  630. qiskit/transpiler/passes/calibration/builders.py +20 -0
  631. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  632. qiskit/transpiler/passes/calibration/pulse_gate.py +100 -0
  633. qiskit/transpiler/passes/calibration/rx_builder.py +164 -0
  634. qiskit/transpiler/passes/calibration/rzx_builder.py +411 -0
  635. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  636. qiskit/transpiler/passes/layout/__init__.py +26 -0
  637. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  638. qiskit/transpiler/passes/layout/apply_layout.py +123 -0
  639. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  640. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  641. qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
  642. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  643. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  644. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  645. qiskit/transpiler/passes/layout/sabre_layout.py +487 -0
  646. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  647. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  648. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  649. qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
  650. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  651. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  652. qiskit/transpiler/passes/optimization/__init__.py +43 -0
  653. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  654. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  655. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  656. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  657. qiskit/transpiler/passes/optimization/collect_cliffords.py +104 -0
  658. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  659. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  660. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  661. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  662. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  663. qiskit/transpiler/passes/optimization/consolidate_blocks.py +149 -0
  664. qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
  665. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +162 -0
  666. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  667. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  668. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  669. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  670. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  671. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +254 -0
  672. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  673. qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
  674. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  675. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  676. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  677. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  678. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
  679. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  680. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  681. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
  682. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  683. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  684. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  685. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  686. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  687. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
  688. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  689. qiskit/transpiler/passes/routing/__init__.py +22 -0
  690. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  691. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  692. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  693. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  694. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  695. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  696. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  697. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
  698. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  699. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  700. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  701. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  702. qiskit/transpiler/passes/routing/sabre_swap.py +447 -0
  703. qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
  704. qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
  705. qiskit/transpiler/passes/routing/utils.py +35 -0
  706. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  707. qiskit/transpiler/passes/scheduling/alap.py +153 -0
  708. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  709. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
  710. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
  711. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +107 -0
  712. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
  713. qiskit/transpiler/passes/scheduling/asap.py +175 -0
  714. qiskit/transpiler/passes/scheduling/base_scheduler.py +310 -0
  715. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +312 -0
  716. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  717. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  718. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +452 -0
  719. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +82 -0
  720. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  721. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  722. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  723. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +94 -0
  724. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  725. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +165 -0
  726. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  727. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  728. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +854 -0
  729. qiskit/transpiler/passes/synthesis/hls_plugins.py +1559 -0
  730. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  731. qiskit/transpiler/passes/synthesis/plugin.py +734 -0
  732. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
  733. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1076 -0
  734. qiskit/transpiler/passes/utils/__init__.py +33 -0
  735. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  736. qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
  737. qiskit/transpiler/passes/utils/check_map.py +78 -0
  738. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  739. qiskit/transpiler/passes/utils/control_flow.py +65 -0
  740. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +93 -0
  741. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  742. qiskit/transpiler/passes/utils/error.py +69 -0
  743. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  744. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  745. qiskit/transpiler/passes/utils/gate_direction.py +86 -0
  746. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  747. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  748. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  749. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  750. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  751. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  752. qiskit/transpiler/passmanager.py +490 -0
  753. qiskit/transpiler/passmanager_config.py +216 -0
  754. qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
  755. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1045 -0
  756. qiskit/transpiler/preset_passmanagers/common.py +649 -0
  757. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +626 -0
  758. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  759. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  760. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  761. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  762. qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
  763. qiskit/transpiler/target.py +1319 -0
  764. qiskit/transpiler/timing_constraints.py +59 -0
  765. qiskit/user_config.py +262 -0
  766. qiskit/utils/__init__.py +89 -0
  767. qiskit/utils/classtools.py +146 -0
  768. qiskit/utils/deprecate_pulse.py +119 -0
  769. qiskit/utils/deprecation.py +490 -0
  770. qiskit/utils/lazy_tester.py +363 -0
  771. qiskit/utils/multiprocessing.py +56 -0
  772. qiskit/utils/optionals.py +347 -0
  773. qiskit/utils/parallel.py +191 -0
  774. qiskit/utils/units.py +143 -0
  775. qiskit/version.py +84 -0
  776. qiskit/visualization/__init__.py +288 -0
  777. qiskit/visualization/array.py +204 -0
  778. qiskit/visualization/bloch.py +778 -0
  779. qiskit/visualization/circuit/__init__.py +15 -0
  780. qiskit/visualization/circuit/_utils.py +675 -0
  781. qiskit/visualization/circuit/circuit_visualization.py +727 -0
  782. qiskit/visualization/circuit/latex.py +661 -0
  783. qiskit/visualization/circuit/matplotlib.py +2029 -0
  784. qiskit/visualization/circuit/qcstyle.py +278 -0
  785. qiskit/visualization/circuit/styles/__init__.py +13 -0
  786. qiskit/visualization/circuit/styles/bw.json +202 -0
  787. qiskit/visualization/circuit/styles/clifford.json +202 -0
  788. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  789. qiskit/visualization/circuit/styles/iqp.json +214 -0
  790. qiskit/visualization/circuit/styles/textbook.json +202 -0
  791. qiskit/visualization/circuit/text.py +1844 -0
  792. qiskit/visualization/circuit_visualization.py +19 -0
  793. qiskit/visualization/counts_visualization.py +481 -0
  794. qiskit/visualization/dag_visualization.py +316 -0
  795. qiskit/visualization/exceptions.py +21 -0
  796. qiskit/visualization/gate_map.py +1485 -0
  797. qiskit/visualization/library.py +37 -0
  798. qiskit/visualization/pass_manager_visualization.py +308 -0
  799. qiskit/visualization/pulse_v2/__init__.py +21 -0
  800. qiskit/visualization/pulse_v2/core.py +901 -0
  801. qiskit/visualization/pulse_v2/device_info.py +173 -0
  802. qiskit/visualization/pulse_v2/drawings.py +253 -0
  803. qiskit/visualization/pulse_v2/events.py +254 -0
  804. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  805. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  806. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  807. qiskit/visualization/pulse_v2/generators/frame.py +436 -0
  808. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  809. qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
  810. qiskit/visualization/pulse_v2/interface.py +458 -0
  811. qiskit/visualization/pulse_v2/layouts.py +387 -0
  812. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  813. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  814. qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
  815. qiskit/visualization/pulse_v2/stylesheet.py +312 -0
  816. qiskit/visualization/pulse_v2/types.py +242 -0
  817. qiskit/visualization/state_visualization.py +1518 -0
  818. qiskit/visualization/timeline/__init__.py +21 -0
  819. qiskit/visualization/timeline/core.py +480 -0
  820. qiskit/visualization/timeline/drawings.py +260 -0
  821. qiskit/visualization/timeline/generators.py +506 -0
  822. qiskit/visualization/timeline/interface.py +436 -0
  823. qiskit/visualization/timeline/layouts.py +115 -0
  824. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  825. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  826. qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
  827. qiskit/visualization/timeline/stylesheet.py +301 -0
  828. qiskit/visualization/timeline/types.py +148 -0
  829. qiskit/visualization/transition_visualization.py +369 -0
  830. qiskit/visualization/utils.py +49 -0
  831. qiskit-1.3.0.dist-info/LICENSE.txt +203 -0
  832. qiskit-1.3.0.dist-info/METADATA +222 -0
  833. qiskit-1.3.0.dist-info/RECORD +836 -0
  834. qiskit-1.3.0.dist-info/WHEEL +5 -0
  835. qiskit-1.3.0.dist-info/entry_points.txt +76 -0
  836. qiskit-1.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,700 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 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
+ # pylint: disable=invalid-name
14
+
15
+ """
16
+ Expand 2-qubit Unitary operators into an equivalent
17
+ decomposition over SU(2)+fixed 2q basis gate, using the KAK method.
18
+
19
+ May be exact or approximate expansion. In either case uses the minimal
20
+ number of basis applications.
21
+
22
+ Method is described in Appendix B of Cross, A. W., Bishop, L. S., Sheldon, S., Nation, P. D. &
23
+ Gambetta, J. M. Validating quantum computers using randomized model circuits.
24
+ arXiv:1811.12926 [quant-ph] (2018).
25
+ """
26
+ from __future__ import annotations
27
+ import io
28
+ import base64
29
+ import warnings
30
+ from typing import Optional, Type, TYPE_CHECKING
31
+
32
+ import logging
33
+
34
+ import numpy as np
35
+
36
+ from qiskit.circuit import QuantumRegister, QuantumCircuit, Gate, CircuitInstruction
37
+ from qiskit.circuit.library.standard_gates import (
38
+ CXGate,
39
+ U3Gate,
40
+ U2Gate,
41
+ U1Gate,
42
+ UGate,
43
+ PhaseGate,
44
+ RXGate,
45
+ RYGate,
46
+ RZGate,
47
+ SXGate,
48
+ XGate,
49
+ RGate,
50
+ )
51
+ from qiskit.exceptions import QiskitError
52
+ from qiskit.quantum_info.operators import Operator
53
+ from qiskit.synthesis.one_qubit.one_qubit_decompose import (
54
+ OneQubitEulerDecomposer,
55
+ DEFAULT_ATOL,
56
+ )
57
+ from qiskit.utils.deprecation import deprecate_func
58
+ from qiskit._accelerate import two_qubit_decompose
59
+
60
+ if TYPE_CHECKING:
61
+ from qiskit.dagcircuit.dagcircuit import DAGCircuit, DAGOpNode
62
+
63
+ logger = logging.getLogger(__name__)
64
+
65
+
66
+ GATE_NAME_MAP = {
67
+ "cx": CXGate,
68
+ "rx": RXGate,
69
+ "sx": SXGate,
70
+ "x": XGate,
71
+ "rz": RZGate,
72
+ "u": UGate,
73
+ "p": PhaseGate,
74
+ "u1": U1Gate,
75
+ "u2": U2Gate,
76
+ "u3": U3Gate,
77
+ "ry": RYGate,
78
+ "r": RGate,
79
+ }
80
+
81
+
82
+ def decompose_two_qubit_product_gate(special_unitary_matrix: np.ndarray):
83
+ r"""Decompose :math:`U = U_l \otimes U_r` where :math:`U \in SU(4)`,
84
+ and :math:`U_l,~U_r \in SU(2)`.
85
+
86
+ Args:
87
+ special_unitary_matrix: special unitary matrix to decompose
88
+ Raises:
89
+ QiskitError: if decomposition isn't possible.
90
+ """
91
+ special_unitary_matrix = np.asarray(special_unitary_matrix, dtype=complex)
92
+ (L, R, phase) = two_qubit_decompose.decompose_two_qubit_product_gate(special_unitary_matrix)
93
+
94
+ temp = np.kron(L, R)
95
+ deviation = abs(abs(temp.conj().T.dot(special_unitary_matrix).trace()) - 4)
96
+
97
+ if deviation > 1.0e-13:
98
+ raise QiskitError(
99
+ "decompose_two_qubit_product_gate: decomposition failed: "
100
+ f"deviation too large: {deviation}"
101
+ )
102
+
103
+ return (L, R, phase)
104
+
105
+
106
+ class TwoQubitWeylDecomposition:
107
+ r"""Two-qubit Weyl decomposition.
108
+
109
+ Decompose two-qubit unitary
110
+
111
+ .. math::
112
+
113
+ U = ({K_1}^l \otimes {K_1}^r) e^{(i a XX + i b YY + i c ZZ)} ({K_2}^l \otimes {K_2}^r)
114
+
115
+ where
116
+
117
+ .. math::
118
+
119
+ U \in U(4),~
120
+ {K_1}^l, {K_1}^r, {K_2}^l, {K_2}^r \in SU(2)
121
+
122
+ and we stay in the "Weyl Chamber"
123
+
124
+ .. math::
125
+
126
+ \pi /4 \geq a \geq b \geq |c|
127
+
128
+ This class avoids some problems of numerical instability near high-symmetry loci within the Weyl
129
+ chamber. If there is a high-symmetry gate "nearby" (in terms of the requested average gate fidelity),
130
+ then it return a canonicalized decomposition of that high-symmetry gate.
131
+
132
+ References:
133
+ 1. Cross, A. W., Bishop, L. S., Sheldon, S., Nation, P. D. & Gambetta, J. M.,
134
+ *Validating quantum computers using randomized model circuits*,
135
+ `arXiv:1811.12926 [quant-ph] <https://arxiv.org/abs/1811.12926>`_
136
+ 2. B. Kraus, J. I. Cirac, *Optimal Creation of Entanglement Using a Two-Qubit Gate*,
137
+ `arXiv:0011050 [quant-ph] <https://arxiv.org/abs/quant-ph/0011050>`_
138
+ 3. B. Drury, P. J. Love, *Constructive Quantum Shannon Decomposition from Cartan
139
+ Involutions*, `arXiv:0806.4015 [quant-ph] <https://arxiv.org/abs/0806.4015>`_
140
+
141
+ """
142
+
143
+ # The parameters of the decomposition:
144
+ a: float
145
+ b: float
146
+ c: float
147
+ global_phase: float
148
+ K1l: np.ndarray
149
+ K2l: np.ndarray
150
+ K1r: np.ndarray
151
+ K2r: np.ndarray
152
+
153
+ unitary_matrix: np.ndarray # The unitary that was input
154
+ requested_fidelity: Optional[float] # None means no automatic specialization
155
+ calculated_fidelity: float # Fidelity after specialization
156
+
157
+ _specializations = two_qubit_decompose.Specialization
158
+
159
+ def __init__(
160
+ self,
161
+ unitary_matrix: np.ndarray,
162
+ fidelity: float | None = 1.0 - 1.0e-9,
163
+ *,
164
+ _specialization: two_qubit_decompose.Specialization | None = None,
165
+ ):
166
+ unitary_matrix = np.asarray(unitary_matrix, dtype=complex)
167
+ self._inner_decomposition = two_qubit_decompose.TwoQubitWeylDecomposition(
168
+ unitary_matrix, fidelity=fidelity, _specialization=_specialization
169
+ )
170
+ self.a = self._inner_decomposition.a
171
+ self.b = self._inner_decomposition.b
172
+ self.c = self._inner_decomposition.c
173
+ self.global_phase = self._inner_decomposition.global_phase
174
+ self.K1l = self._inner_decomposition.K1l
175
+ self.K1r = self._inner_decomposition.K1r
176
+ self.K2l = self._inner_decomposition.K2l
177
+ self.K2r = self._inner_decomposition.K2r
178
+ self.unitary_matrix = unitary_matrix
179
+ self.requested_fidelity = fidelity
180
+ self.calculated_fidelity = self._inner_decomposition.calculated_fidelity
181
+ if logger.isEnabledFor(logging.DEBUG):
182
+ actual_fidelity = self.actual_fidelity()
183
+ logger.debug(
184
+ "Requested fidelity: %s calculated fidelity: %s actual fidelity %s",
185
+ self.requested_fidelity,
186
+ self.calculated_fidelity,
187
+ actual_fidelity,
188
+ )
189
+ if abs(self.calculated_fidelity - actual_fidelity) > 1.0e-12:
190
+ logger.warning(
191
+ "Requested fidelity different from actual by %s",
192
+ self.calculated_fidelity - actual_fidelity,
193
+ )
194
+
195
+ @deprecate_func(since="1.1.0", removal_timeline="in the 2.0.0 release")
196
+ def specialize(self):
197
+ """Make changes to the decomposition to comply with any specializations.
198
+
199
+ This method will always raise a ``NotImplementedError`` because
200
+ there are no specializations to comply with in the current implementation.
201
+ """
202
+ raise NotImplementedError
203
+
204
+ def circuit(
205
+ self, *, euler_basis: str | None = None, simplify: bool = False, atol: float = DEFAULT_ATOL
206
+ ) -> QuantumCircuit:
207
+ """Returns Weyl decomposition in circuit form."""
208
+ circuit_data = self._inner_decomposition.circuit(
209
+ euler_basis=euler_basis, simplify=simplify, atol=atol
210
+ )
211
+ return QuantumCircuit._from_circuit_data(circuit_data, add_regs=True)
212
+
213
+ def actual_fidelity(self, **kwargs) -> float:
214
+ """Calculates the actual fidelity of the decomposed circuit to the input unitary."""
215
+ circ = self.circuit(**kwargs)
216
+ trace = np.trace(Operator(circ).data.T.conj() @ self.unitary_matrix)
217
+ return two_qubit_decompose.trace_to_fid(trace)
218
+
219
+ def __repr__(self):
220
+ """Represent with enough precision to allow copy-paste debugging of all corner cases"""
221
+ prefix = f"{type(self).__qualname__}.from_bytes("
222
+ with io.BytesIO() as f:
223
+ np.save(f, self.unitary_matrix, allow_pickle=False)
224
+ b64 = base64.encodebytes(f.getvalue()).splitlines()
225
+ b64ascii = [repr(x) for x in b64]
226
+ b64ascii[-1] += ","
227
+ pretty = [f"# {x.rstrip()}" for x in str(self).splitlines()]
228
+ indent = "\n" + " " * 4
229
+ specialization_variant = str(self._inner_decomposition.specialization).split(".")[1]
230
+ specialization_repr = f"{type(self).__qualname__}._specializations.{specialization_variant}"
231
+ lines = (
232
+ [prefix]
233
+ + pretty
234
+ + b64ascii
235
+ + [
236
+ f"requested_fidelity={self.requested_fidelity},",
237
+ f"_specialization={specialization_repr},",
238
+ f"calculated_fidelity={self.calculated_fidelity},",
239
+ f"actual_fidelity={self.actual_fidelity()},",
240
+ f"abc={(self.a, self.b, self.c)})",
241
+ ]
242
+ )
243
+ return indent.join(lines)
244
+
245
+ @classmethod
246
+ def from_bytes(
247
+ cls,
248
+ bytes_in: bytes,
249
+ *,
250
+ requested_fidelity: float,
251
+ _specialization: two_qubit_decompose.Specialization | None = None,
252
+ **kwargs,
253
+ ) -> "TwoQubitWeylDecomposition":
254
+ """Decode bytes into :class:`.TwoQubitWeylDecomposition`."""
255
+ # Used by __repr__
256
+ del kwargs # Unused (just for display)
257
+ b64 = base64.decodebytes(bytes_in)
258
+ with io.BytesIO(b64) as f:
259
+ arr = np.load(f, allow_pickle=False)
260
+ return cls(arr, fidelity=requested_fidelity, _specialization=_specialization)
261
+
262
+ def __str__(self):
263
+ specialization = str(self._inner_decomposition.specialization).split(".")[1]
264
+ pre = f"{self.__class__.__name__} [specialization={specialization}] (\n\t"
265
+ circ_indent = "\n\t".join(self.circuit(simplify=True).draw("text").lines(-1))
266
+ return f"{pre}{circ_indent}\n)"
267
+
268
+
269
+ class TwoQubitControlledUDecomposer:
270
+ r"""Decompose two-qubit unitary in terms of a desired
271
+ :math:`U \sim U_d(\alpha, 0, 0) \sim \text{Ctrl-U}`
272
+ gate that is locally equivalent to an :class:`.RXXGate`."""
273
+
274
+ def __init__(self, rxx_equivalent_gate: Type[Gate]):
275
+ r"""Initialize the KAK decomposition.
276
+
277
+ Args:
278
+ rxx_equivalent_gate: Gate that is locally equivalent to an :class:`.RXXGate`:
279
+ :math:`U \sim U_d(\alpha, 0, 0) \sim \text{Ctrl-U}` gate.
280
+ Raises:
281
+ QiskitError: If the gate is not locally equivalent to an :class:`.RXXGate`.
282
+ """
283
+ atol = DEFAULT_ATOL
284
+
285
+ scales, test_angles, scale = [], [0.2, 0.3, np.pi / 2], None
286
+
287
+ for test_angle in test_angles:
288
+ # Check that gate takes a single angle parameter
289
+ try:
290
+ rxx_equivalent_gate(test_angle, label="foo")
291
+ except TypeError as _:
292
+ raise QiskitError("Equivalent gate needs to take exactly 1 angle parameter.") from _
293
+ decomp = TwoQubitWeylDecomposition(rxx_equivalent_gate(test_angle))
294
+
295
+ circ = QuantumCircuit(2)
296
+ circ.rxx(test_angle, 0, 1)
297
+ decomposer_rxx = TwoQubitWeylDecomposition(
298
+ Operator(circ).data,
299
+ fidelity=None,
300
+ _specialization=two_qubit_decompose.Specialization.ControlledEquiv,
301
+ )
302
+
303
+ circ = QuantumCircuit(2)
304
+ circ.append(rxx_equivalent_gate(test_angle), qargs=[0, 1])
305
+ decomposer_equiv = TwoQubitWeylDecomposition(
306
+ Operator(circ).data,
307
+ fidelity=None,
308
+ _specialization=two_qubit_decompose.Specialization.ControlledEquiv,
309
+ )
310
+
311
+ scale = decomposer_rxx.a / decomposer_equiv.a
312
+
313
+ if abs(decomp.a * 2 - test_angle / scale) > atol:
314
+ raise QiskitError(
315
+ f"{rxx_equivalent_gate.__name__} is not equivalent to an RXXGate."
316
+ )
317
+
318
+ scales.append(scale)
319
+
320
+ # Check that all three tested angles give the same scale
321
+ if not np.allclose(scales, [scale] * len(test_angles)):
322
+ raise QiskitError(
323
+ f"Cannot initialize {self.__class__.__name__}: with gate {rxx_equivalent_gate}. "
324
+ "Inconsistent scaling parameters in checks."
325
+ )
326
+
327
+ self.scale = scales[0]
328
+
329
+ self.rxx_equivalent_gate = rxx_equivalent_gate
330
+
331
+ def __call__(self, unitary, *, atol=DEFAULT_ATOL) -> QuantumCircuit:
332
+ """Returns the Weyl decomposition in circuit form.
333
+
334
+ Note: atol ist passed to OneQubitEulerDecomposer.
335
+ """
336
+
337
+ # pylint: disable=attribute-defined-outside-init
338
+ self.decomposer = TwoQubitWeylDecomposition(unitary)
339
+
340
+ oneq_decompose = OneQubitEulerDecomposer("ZYZ")
341
+ c1l, c1r, c2l, c2r = (
342
+ oneq_decompose(k, atol=atol)
343
+ for k in (
344
+ self.decomposer.K1l,
345
+ self.decomposer.K1r,
346
+ self.decomposer.K2l,
347
+ self.decomposer.K2r,
348
+ )
349
+ )
350
+ circ = QuantumCircuit(2, global_phase=self.decomposer.global_phase)
351
+ circ.compose(c2r, [0], inplace=True)
352
+ circ.compose(c2l, [1], inplace=True)
353
+ self._weyl_gate(circ)
354
+ circ.compose(c1r, [0], inplace=True)
355
+ circ.compose(c1l, [1], inplace=True)
356
+ return circ
357
+
358
+ def _to_rxx_gate(self, angle: float) -> QuantumCircuit:
359
+ """
360
+ Takes an angle and returns the circuit equivalent to an RXXGate with the
361
+ RXX equivalent gate as the two-qubit unitary.
362
+
363
+ Args:
364
+ angle: Rotation angle (in this case one of the Weyl parameters a, b, or c)
365
+
366
+ Returns:
367
+ Circuit: Circuit equivalent to an RXXGate.
368
+
369
+ Raises:
370
+ QiskitError: If the circuit is not equivalent to an RXXGate.
371
+ """
372
+
373
+ # The user-provided RXXGate equivalent gate may be locally equivalent to the RXXGate
374
+ # but with some scaling in the rotation angle. For example, RXXGate(angle) has Weyl
375
+ # parameters (angle, 0, 0) for angle in [0, pi/2] but the user provided gate, i.e.
376
+ # :code:`self.rxx_equivalent_gate(angle)` might produce the Weyl parameters
377
+ # (scale * angle, 0, 0) where scale != 1. This is the case for the CPhaseGate.
378
+
379
+ circ = QuantumCircuit(2)
380
+ circ.append(self.rxx_equivalent_gate(self.scale * angle), qargs=[0, 1])
381
+ decomposer_inv = TwoQubitWeylDecomposition(Operator(circ).data)
382
+
383
+ oneq_decompose = OneQubitEulerDecomposer("ZYZ")
384
+
385
+ # Express the RXXGate in terms of the user-provided RXXGate equivalent gate.
386
+ rxx_circ = QuantumCircuit(2, global_phase=-decomposer_inv.global_phase)
387
+ rxx_circ.compose(oneq_decompose(decomposer_inv.K2r).inverse(), inplace=True, qubits=[0])
388
+ rxx_circ.compose(oneq_decompose(decomposer_inv.K2l).inverse(), inplace=True, qubits=[1])
389
+ rxx_circ.compose(circ, inplace=True)
390
+ rxx_circ.compose(oneq_decompose(decomposer_inv.K1r).inverse(), inplace=True, qubits=[0])
391
+ rxx_circ.compose(oneq_decompose(decomposer_inv.K1l).inverse(), inplace=True, qubits=[1])
392
+
393
+ return rxx_circ
394
+
395
+ def _weyl_gate(self, circ: QuantumCircuit, atol=1.0e-13):
396
+ """Appends U_d(a, b, c) to the circuit."""
397
+
398
+ circ_rxx = self._to_rxx_gate(-2 * self.decomposer.a)
399
+ circ.compose(circ_rxx, inplace=True)
400
+
401
+ # translate the RYYGate(b) into a circuit based on the desired Ctrl-U gate.
402
+ if abs(self.decomposer.b) > atol:
403
+ circ_ryy = QuantumCircuit(2)
404
+ circ_ryy.sdg(0)
405
+ circ_ryy.sdg(1)
406
+ circ_ryy.compose(self._to_rxx_gate(-2 * self.decomposer.b), inplace=True)
407
+ circ_ryy.s(0)
408
+ circ_ryy.s(1)
409
+ circ.compose(circ_ryy, inplace=True)
410
+
411
+ # translate the RZZGate(c) into a circuit based on the desired Ctrl-U gate.
412
+ if abs(self.decomposer.c) > atol:
413
+ # Since the Weyl chamber is here defined as a > b > |c| we may have
414
+ # negative c. This will cause issues in _to_rxx_gate
415
+ # as TwoQubitWeylControlledEquiv will map (c, 0, 0) to (|c|, 0, 0).
416
+ # We therefore produce RZZGate(|c|) and append its inverse to the
417
+ # circuit if c < 0.
418
+ gamma, invert = -2 * self.decomposer.c, False
419
+ if gamma > 0:
420
+ gamma *= -1
421
+ invert = True
422
+
423
+ circ_rzz = QuantumCircuit(2)
424
+ circ_rzz.h(0)
425
+ circ_rzz.h(1)
426
+ circ_rzz.compose(self._to_rxx_gate(gamma), inplace=True)
427
+ circ_rzz.h(0)
428
+ circ_rzz.h(1)
429
+
430
+ if invert:
431
+ circ.compose(circ_rzz.inverse(), inplace=True)
432
+ else:
433
+ circ.compose(circ_rzz, inplace=True)
434
+
435
+ return circ
436
+
437
+
438
+ class TwoQubitBasisDecomposer:
439
+ """A class for decomposing 2-qubit unitaries into minimal number of uses of a 2-qubit
440
+ basis gate.
441
+
442
+ Args:
443
+ gate: Two-qubit gate to be used in the KAK decomposition.
444
+ basis_fidelity: Fidelity to be assumed for applications of KAK Gate. Defaults to ``1.0``.
445
+ euler_basis: Basis string to be provided to :class:`.OneQubitEulerDecomposer` for 1Q synthesis.
446
+ Valid options are [``'ZYZ'``, ``'ZXZ'``, ``'XYX'``, ``'U'``, ``'U3'``, ``'U1X'``,
447
+ ``'PSX'``, ``'ZSX'``, ``'RR'``].
448
+ pulse_optimize: If ``True``, try to do decomposition which minimizes
449
+ local unitaries in between entangling gates. This will raise an exception if an
450
+ optimal decomposition is not implemented. Currently, only [{CX, SX, RZ}] is known.
451
+ If ``False``, don't attempt optimization. If ``None``, attempt optimization but don't raise
452
+ if unknown.
453
+
454
+
455
+ .. automethod:: __call__
456
+ """
457
+
458
+ def __init__(
459
+ self,
460
+ gate: Gate,
461
+ basis_fidelity: float = 1.0,
462
+ euler_basis: str = "U",
463
+ pulse_optimize: bool | None = None,
464
+ ):
465
+ self.gate = gate
466
+ self.basis_fidelity = basis_fidelity
467
+ self.pulse_optimize = pulse_optimize
468
+ # Use cx as gate name for pulse optimal decomposition detection
469
+ # otherwise use USER_GATE as a unique key to support custom gates
470
+ # including parameterized gates like UnitaryGate.
471
+ if isinstance(gate, CXGate):
472
+ gate_name = "cx"
473
+ else:
474
+ gate_name = "USER_GATE"
475
+
476
+ self._inner_decomposer = two_qubit_decompose.TwoQubitBasisDecomposer(
477
+ gate_name,
478
+ Operator(gate).data,
479
+ basis_fidelity=basis_fidelity,
480
+ euler_basis=euler_basis,
481
+ pulse_optimize=pulse_optimize,
482
+ )
483
+ self.is_supercontrolled = self._inner_decomposer.super_controlled
484
+ if not self.is_supercontrolled:
485
+ warnings.warn(
486
+ "Only know how to decompose properly for a supercontrolled basis gate.",
487
+ stacklevel=2,
488
+ )
489
+
490
+ def num_basis_gates(self, unitary):
491
+ """Computes the number of basis gates needed in
492
+ a decomposition of input unitary
493
+ """
494
+ unitary = np.asarray(unitary, dtype=complex)
495
+ return self._inner_decomposer.num_basis_gates(unitary)
496
+
497
+ @staticmethod
498
+ def decomp0(target):
499
+ r"""
500
+ Decompose target :math:`\sim U_d(x, y, z)` with :math:`0` uses of the basis gate.
501
+ Result :math:`U_r` has trace:
502
+
503
+ .. math::
504
+
505
+ \Big\vert\text{Tr}(U_r\cdot U_\text{target}^{\dag})\Big\vert =
506
+ 4\Big\vert (\cos(x)\cos(y)\cos(z)+ j \sin(x)\sin(y)\sin(z)\Big\vert
507
+
508
+ which is optimal for all targets and bases
509
+ """
510
+
511
+ return two_qubit_decompose.TwoQubitBasisDecomposer.decomp0(target)
512
+
513
+ def decomp1(self, target):
514
+ r"""Decompose target :math:`\sim U_d(x, y, z)` with :math:`1` use of the basis gate
515
+ :math:`\sim U_d(a, b, c)`.
516
+ Result :math:`U_r` has trace:
517
+
518
+ .. math::
519
+
520
+ \Big\vert\text{Tr}(U_r \cdot U_\text{target}^{\dag})\Big\vert =
521
+ 4\Big\vert \cos(x-a)\cos(y-b)\cos(z-c) + j \sin(x-a)\sin(y-b)\sin(z-c)\Big\vert
522
+
523
+ which is optimal for all targets and bases with ``z==0`` or ``c==0``.
524
+ """
525
+ return self._inner_decomposer.decomp1(target)
526
+
527
+ def decomp2_supercontrolled(self, target):
528
+ r"""
529
+ Decompose target :math:`\sim U_d(x, y, z)` with :math:`2` uses of the basis gate.
530
+
531
+ For supercontrolled basis :math:`\sim U_d(\pi/4, b, 0)`, all b, result :math:`U_r` has trace
532
+
533
+ .. math::
534
+
535
+ \Big\vert\text{Tr}(U_r \cdot U_\text{target}^\dag) \Big\vert = 4\cos(z)
536
+
537
+ which is the optimal approximation for basis of CNOT-class :math:`\sim U_d(\pi/4, 0, 0)`
538
+ or DCNOT-class :math:`\sim U_d(\pi/4, \pi/4, 0)` and any target. It may
539
+ be sub-optimal for :math:`b \neq 0` (i.e. there exists an exact decomposition for any target
540
+ using :math:`B \sim U_d(\pi/4, \pi/8, 0)`, but it may not be this decomposition).
541
+ This is an exact decomposition for supercontrolled basis and target :math:`\sim U_d(x, y, 0)`.
542
+ No guarantees for non-supercontrolled basis.
543
+ """
544
+ return self._inner_decomposer.decomp2_supercontrolled(target)
545
+
546
+ def decomp3_supercontrolled(self, target):
547
+ r"""
548
+ Decompose target with :math:`3` uses of the basis.
549
+ This is an exact decomposition for supercontrolled basis :math:`\sim U_d(\pi/4, b, 0)`, all b,
550
+ and any target. No guarantees for non-supercontrolled basis.
551
+ """
552
+ return self._inner_decomposer.decomp3_supercontrolled(target)
553
+
554
+ def __call__(
555
+ self,
556
+ unitary: Operator | np.ndarray,
557
+ basis_fidelity: float | None = None,
558
+ approximate: bool = True,
559
+ use_dag: bool = False,
560
+ *,
561
+ _num_basis_uses: int | None = None,
562
+ ) -> QuantumCircuit | DAGCircuit:
563
+ r"""Decompose a two-qubit ``unitary`` over fixed basis and :math:`SU(2)` using the best
564
+ approximation given that each basis application has a finite ``basis_fidelity``.
565
+
566
+ Args:
567
+ unitary (Operator or ndarray): :math:`4 \times 4` unitary to synthesize.
568
+ basis_fidelity (float or None): Fidelity to be assumed for applications of KAK Gate.
569
+ If given, overrides ``basis_fidelity`` given at init.
570
+ approximate (bool): Approximates if basis fidelities are less than 1.0.
571
+ use_dag (bool): If true a :class:`.DAGCircuit` is returned instead of a
572
+ :class:`QuantumCircuit` when this class is called.
573
+ _num_basis_uses (int): force a particular approximation by passing a number in [0, 3].
574
+
575
+ Returns:
576
+ QuantumCircuit: Synthesized quantum circuit.
577
+
578
+ Raises:
579
+ QiskitError: if ``pulse_optimize`` is True but we don't know how to do it.
580
+ """
581
+
582
+ if use_dag:
583
+ from qiskit.dagcircuit.dagcircuit import DAGCircuit
584
+ from qiskit.dagcircuit.dagnode import DAGOpNode
585
+
586
+ sequence = self._inner_decomposer(
587
+ np.asarray(unitary, dtype=complex),
588
+ basis_fidelity,
589
+ approximate,
590
+ _num_basis_uses=_num_basis_uses,
591
+ )
592
+ q = QuantumRegister(2)
593
+
594
+ dag = DAGCircuit()
595
+ dag.global_phase = sequence.global_phase
596
+ dag.add_qreg(q)
597
+ for gate, params, qubits in sequence:
598
+ if gate is None:
599
+ dag.apply_operation_back(self.gate, tuple(q[x] for x in qubits), check=False)
600
+ else:
601
+ op = CircuitInstruction.from_standard(
602
+ gate, qubits=tuple(q[x] for x in qubits), params=params
603
+ )
604
+ node = DAGOpNode.from_instruction(op)
605
+ dag._apply_op_node_back(node)
606
+ return dag
607
+ else:
608
+ if getattr(self.gate, "_standard_gate", None):
609
+ circ_data = self._inner_decomposer.to_circuit(
610
+ np.asarray(unitary, dtype=complex),
611
+ self.gate,
612
+ basis_fidelity,
613
+ approximate,
614
+ _num_basis_uses=_num_basis_uses,
615
+ )
616
+ return QuantumCircuit._from_circuit_data(circ_data, add_regs=True)
617
+ else:
618
+ sequence = self._inner_decomposer(
619
+ np.asarray(unitary, dtype=complex),
620
+ basis_fidelity,
621
+ approximate,
622
+ _num_basis_uses=_num_basis_uses,
623
+ )
624
+ q = QuantumRegister(2)
625
+ circ = QuantumCircuit(q, global_phase=sequence.global_phase)
626
+ for gate, params, qubits in sequence:
627
+ if gate is None:
628
+ circ._append(self.gate, qargs=tuple(q[x] for x in qubits))
629
+ else:
630
+ inst = CircuitInstruction.from_standard(
631
+ gate, qubits=tuple(q[x] for x in qubits), params=params
632
+ )
633
+ circ._append(inst)
634
+ return circ
635
+
636
+ def traces(self, target):
637
+ r"""
638
+ Give the expected traces :math:`\Big\vert\text{Tr}(U \cdot U_\text{target}^{\dag})\Big\vert`
639
+ for a different number of basis gates.
640
+ """
641
+ return self._inner_decomposer.traces(target._inner_decomposition)
642
+
643
+
644
+ # This weird duplicated lazy structure is for backwards compatibility; Qiskit has historically
645
+ # always made ``two_qubit_cnot_decompose`` available publicly immediately on import, but it's quite
646
+ # expensive to construct, and we want to defer the object's creation until it's actually used. We
647
+ # only need to pass through the public methods that take `self` as a parameter. Using `__getattr__`
648
+ # doesn't work because it is only called if the normal resolution methods fail. Using
649
+ # `__getattribute__` is too messy for a simple one-off use object.
650
+
651
+
652
+ class _LazyTwoQubitCXDecomposer(TwoQubitBasisDecomposer):
653
+ __slots__ = ("_inner",)
654
+
655
+ def __init__(self): # pylint: disable=super-init-not-called
656
+ self._inner = None
657
+
658
+ def _load(self):
659
+ if self._inner is None:
660
+ self._inner = TwoQubitBasisDecomposer(CXGate())
661
+
662
+ def __call__(self, *args, **kwargs) -> QuantumCircuit:
663
+ self._load()
664
+ return self._inner(*args, **kwargs)
665
+
666
+ def traces(self, target):
667
+ self._load()
668
+ return self._inner.traces(target)
669
+
670
+ def decomp1(self, target):
671
+ self._load()
672
+ return self._inner.decomp1(target)
673
+
674
+ def decomp2_supercontrolled(self, target):
675
+ self._load()
676
+ return self._inner.decomp2_supercontrolled(target)
677
+
678
+ def decomp3_supercontrolled(self, target):
679
+ self._load()
680
+ return self._inner.decomp3_supercontrolled(target)
681
+
682
+ def num_basis_gates(self, unitary):
683
+ self._load()
684
+ return self._inner.num_basis_gates(unitary)
685
+
686
+
687
+ two_qubit_cnot_decompose = _LazyTwoQubitCXDecomposer()
688
+ """
689
+ This is an instance of :class:`.TwoQubitBasisDecomposer` that always uses
690
+ ``cx`` as the KAK gate for the basis decomposition. You can use this function
691
+ as a quick access to ``cx``-based 2-qubit decompositions.
692
+
693
+ Args:
694
+ unitary (Operator or np.ndarray): The 4x4 unitary to synthesize.
695
+ basis_fidelity (float or None): If given the assumed fidelity for applications of :class:`.CXGate`.
696
+ approximate (bool): If ``True`` approximate if ``basis_fidelity`` is less than 1.0.
697
+
698
+ Returns:
699
+ QuantumCircuit: The synthesized circuit of the input unitary.
700
+ """