qiskit 1.3.0b1__cp39-abi3-macosx_10_9_x86_64.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 (825) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +127 -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 +365 -0
  8. qiskit/assembler/disassemble.py +310 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +1270 -0
  11. qiskit/circuit/_classical_resource_map.py +148 -0
  12. qiskit/circuit/_standard_gates_commutations.py +3264 -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 +48 -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 +503 -0
  45. qiskit/circuit/controlflow/switch_case.py +417 -0
  46. qiskit/circuit/controlflow/while_loop.py +163 -0
  47. qiskit/circuit/controlledgate.py +274 -0
  48. qiskit/circuit/delay.py +106 -0
  49. qiskit/circuit/duration.py +95 -0
  50. qiskit/circuit/equivalence.py +295 -0
  51. qiskit/circuit/equivalence_library.py +18 -0
  52. qiskit/circuit/exceptions.py +19 -0
  53. qiskit/circuit/gate.py +261 -0
  54. qiskit/circuit/instruction.py +676 -0
  55. qiskit/circuit/instructionset.py +177 -0
  56. qiskit/circuit/library/__init__.py +572 -0
  57. qiskit/circuit/library/arithmetic/__init__.py +27 -0
  58. qiskit/circuit/library/arithmetic/adders/__init__.py +17 -0
  59. qiskit/circuit/library/arithmetic/adders/adder.py +58 -0
  60. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +159 -0
  61. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +116 -0
  62. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +165 -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 +16 -0
  69. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +138 -0
  70. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +101 -0
  71. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +101 -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 +331 -0
  80. qiskit/circuit/library/blueprintcircuit.py +216 -0
  81. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  82. qiskit/circuit/library/boolean_logic/inner_product.py +78 -0
  83. qiskit/circuit/library/boolean_logic/quantum_and.py +97 -0
  84. qiskit/circuit/library/boolean_logic/quantum_or.py +98 -0
  85. qiskit/circuit/library/boolean_logic/quantum_xor.py +71 -0
  86. qiskit/circuit/library/data_preparation/__init__.py +54 -0
  87. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  88. qiskit/circuit/library/data_preparation/pauli_feature_map.py +343 -0
  89. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  90. qiskit/circuit/library/data_preparation/z_feature_map.py +104 -0
  91. qiskit/circuit/library/data_preparation/zz_feature_map.py +118 -0
  92. qiskit/circuit/library/fourier_checking.py +97 -0
  93. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  94. qiskit/circuit/library/generalized_gates/diagonal.py +165 -0
  95. qiskit/circuit/library/generalized_gates/gms.py +121 -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 +312 -0
  99. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  100. qiskit/circuit/library/generalized_gates/mcmt.py +256 -0
  101. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  102. qiskit/circuit/library/generalized_gates/permutation.py +192 -0
  103. qiskit/circuit/library/generalized_gates/rv.py +97 -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 +86 -0
  111. qiskit/circuit/library/grover_operator.py +311 -0
  112. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  113. qiskit/circuit/library/hidden_linear_function.py +98 -0
  114. qiskit/circuit/library/iqp.py +96 -0
  115. qiskit/circuit/library/n_local/__init__.py +33 -0
  116. qiskit/circuit/library/n_local/efficient_su2.py +164 -0
  117. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +256 -0
  118. qiskit/circuit/library/n_local/excitation_preserving.py +173 -0
  119. qiskit/circuit/library/n_local/n_local.py +1071 -0
  120. qiskit/circuit/library/n_local/pauli_two_design.py +141 -0
  121. qiskit/circuit/library/n_local/qaoa_ansatz.py +287 -0
  122. qiskit/circuit/library/n_local/real_amplitudes.py +186 -0
  123. qiskit/circuit/library/n_local/two_local.py +282 -0
  124. qiskit/circuit/library/overlap.py +117 -0
  125. qiskit/circuit/library/pauli_evolution.py +184 -0
  126. qiskit/circuit/library/phase_estimation.py +99 -0
  127. qiskit/circuit/library/phase_oracle.py +153 -0
  128. qiskit/circuit/library/quantum_volume.py +115 -0
  129. qiskit/circuit/library/standard_gates/__init__.py +123 -0
  130. qiskit/circuit/library/standard_gates/dcx.py +77 -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 +257 -0
  135. qiskit/circuit/library/standard_gates/i.py +75 -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 +433 -0
  139. qiskit/circuit/library/standard_gates/r.py +117 -0
  140. qiskit/circuit/library/standard_gates/rx.py +302 -0
  141. qiskit/circuit/library/standard_gates/rxx.py +183 -0
  142. qiskit/circuit/library/standard_gates/ry.py +297 -0
  143. qiskit/circuit/library/standard_gates/ryy.py +183 -0
  144. qiskit/circuit/library/standard_gates/rz.py +318 -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 +314 -0
  150. qiskit/circuit/library/standard_gates/t.py +179 -0
  151. qiskit/circuit/library/standard_gates/u.py +395 -0
  152. qiskit/circuit/library/standard_gates/u1.py +451 -0
  153. qiskit/circuit/library/standard_gates/u2.py +146 -0
  154. qiskit/circuit/library/standard_gates/u3.py +408 -0
  155. qiskit/circuit/library/standard_gates/x.py +1527 -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 +261 -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 +33 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_2.py +34 -0
  164. qiskit/circuit/library/templates/clifford/clifford_2_3.py +32 -0
  165. qiskit/circuit/library/templates/clifford/clifford_2_4.py +33 -0
  166. qiskit/circuit/library/templates/clifford/clifford_3_1.py +34 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_1.py +37 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_2.py +36 -0
  169. qiskit/circuit/library/templates/clifford/clifford_4_3.py +37 -0
  170. qiskit/circuit/library/templates/clifford/clifford_4_4.py +36 -0
  171. qiskit/circuit/library/templates/clifford/clifford_5_1.py +39 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_1.py +39 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_2.py +39 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_3.py +39 -0
  175. qiskit/circuit/library/templates/clifford/clifford_6_4.py +37 -0
  176. qiskit/circuit/library/templates/clifford/clifford_6_5.py +39 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_1.py +41 -0
  178. qiskit/circuit/library/templates/clifford/clifford_8_2.py +41 -0
  179. qiskit/circuit/library/templates/clifford/clifford_8_3.py +40 -0
  180. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +32 -0
  182. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +33 -0
  183. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +35 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +39 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +37 -0
  187. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +39 -0
  188. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +37 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +38 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +38 -0
  191. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +38 -0
  192. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +37 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +38 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +39 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +39 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +39 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +39 -0
  198. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +39 -0
  199. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +39 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +41 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +41 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +41 -0
  203. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +41 -0
  204. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +41 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +43 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +41 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +42 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +42 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +42 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +42 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +42 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +42 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +42 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +42 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +42 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +42 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +42 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +41 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +42 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +42 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +42 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +42 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +42 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +42 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +42 -0
  226. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +42 -0
  227. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +42 -0
  228. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  229. qiskit/circuit/library/templates/rzx/rzx_cy.py +46 -0
  230. qiskit/circuit/library/templates/rzx/rzx_xz.py +53 -0
  231. qiskit/circuit/library/templates/rzx/rzx_yz.py +43 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz1.py +67 -0
  233. qiskit/circuit/library/templates/rzx/rzx_zz2.py +58 -0
  234. qiskit/circuit/library/templates/rzx/rzx_zz3.py +57 -0
  235. qiskit/circuit/measure.py +44 -0
  236. qiskit/circuit/operation.py +67 -0
  237. qiskit/circuit/parameter.py +174 -0
  238. qiskit/circuit/parameterexpression.py +559 -0
  239. qiskit/circuit/parametertable.py +119 -0
  240. qiskit/circuit/parametervector.py +120 -0
  241. qiskit/circuit/quantumcircuit.py +6793 -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 +604 -0
  249. qiskit/circuit/store.py +95 -0
  250. qiskit/circuit/tools/__init__.py +16 -0
  251. qiskit/circuit/tools/pi_check.py +190 -0
  252. qiskit/compiler/__init__.py +33 -0
  253. qiskit/compiler/assembler.py +668 -0
  254. qiskit/compiler/scheduler.py +107 -0
  255. qiskit/compiler/sequencer.py +69 -0
  256. qiskit/compiler/transpiler.py +478 -0
  257. qiskit/converters/__init__.py +74 -0
  258. qiskit/converters/circuit_to_dag.py +78 -0
  259. qiskit/converters/circuit_to_dagdependency.py +51 -0
  260. qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
  261. qiskit/converters/circuit_to_gate.py +107 -0
  262. qiskit/converters/circuit_to_instruction.py +155 -0
  263. qiskit/converters/dag_to_circuit.py +77 -0
  264. qiskit/converters/dag_to_dagdependency.py +55 -0
  265. qiskit/converters/dag_to_dagdependency_v2.py +44 -0
  266. qiskit/converters/dagdependency_to_circuit.py +42 -0
  267. qiskit/converters/dagdependency_to_dag.py +49 -0
  268. qiskit/dagcircuit/__init__.py +44 -0
  269. qiskit/dagcircuit/collect_blocks.py +391 -0
  270. qiskit/dagcircuit/dagcircuit.py +24 -0
  271. qiskit/dagcircuit/dagdependency.py +633 -0
  272. qiskit/dagcircuit/dagdependency_v2.py +641 -0
  273. qiskit/dagcircuit/dagdepnode.py +160 -0
  274. qiskit/dagcircuit/dagnode.py +176 -0
  275. qiskit/dagcircuit/exceptions.py +42 -0
  276. qiskit/exceptions.py +153 -0
  277. qiskit/passmanager/__init__.py +240 -0
  278. qiskit/passmanager/base_tasks.py +230 -0
  279. qiskit/passmanager/compilation_status.py +74 -0
  280. qiskit/passmanager/exceptions.py +19 -0
  281. qiskit/passmanager/flow_controllers.py +116 -0
  282. qiskit/passmanager/passmanager.py +333 -0
  283. qiskit/primitives/__init__.py +481 -0
  284. qiskit/primitives/backend_estimator.py +483 -0
  285. qiskit/primitives/backend_estimator_v2.py +434 -0
  286. qiskit/primitives/backend_sampler.py +222 -0
  287. qiskit/primitives/backend_sampler_v2.py +296 -0
  288. qiskit/primitives/base/__init__.py +20 -0
  289. qiskit/primitives/base/base_estimator.py +252 -0
  290. qiskit/primitives/base/base_primitive.py +45 -0
  291. qiskit/primitives/base/base_primitive_job.py +78 -0
  292. qiskit/primitives/base/base_result.py +65 -0
  293. qiskit/primitives/base/base_sampler.py +204 -0
  294. qiskit/primitives/base/estimator_result.py +46 -0
  295. qiskit/primitives/base/sampler_result.py +45 -0
  296. qiskit/primitives/base/validation.py +231 -0
  297. qiskit/primitives/containers/__init__.py +26 -0
  298. qiskit/primitives/containers/bindings_array.py +389 -0
  299. qiskit/primitives/containers/bit_array.py +741 -0
  300. qiskit/primitives/containers/data_bin.py +165 -0
  301. qiskit/primitives/containers/estimator_pub.py +222 -0
  302. qiskit/primitives/containers/object_array.py +94 -0
  303. qiskit/primitives/containers/observables_array.py +279 -0
  304. qiskit/primitives/containers/primitive_result.py +53 -0
  305. qiskit/primitives/containers/pub_result.py +51 -0
  306. qiskit/primitives/containers/sampler_pub.py +193 -0
  307. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  308. qiskit/primitives/containers/shape.py +129 -0
  309. qiskit/primitives/estimator.py +172 -0
  310. qiskit/primitives/primitive_job.py +81 -0
  311. qiskit/primitives/sampler.py +162 -0
  312. qiskit/primitives/statevector_estimator.py +174 -0
  313. qiskit/primitives/statevector_sampler.py +292 -0
  314. qiskit/primitives/utils.py +247 -0
  315. qiskit/providers/__init__.py +803 -0
  316. qiskit/providers/backend.py +656 -0
  317. qiskit/providers/backend_compat.py +452 -0
  318. qiskit/providers/basic_provider/__init__.py +45 -0
  319. qiskit/providers/basic_provider/basic_provider.py +101 -0
  320. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  321. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  322. qiskit/providers/basic_provider/basic_simulator.py +811 -0
  323. qiskit/providers/basic_provider/exceptions.py +30 -0
  324. qiskit/providers/exceptions.py +45 -0
  325. qiskit/providers/fake_provider/__init__.py +105 -0
  326. qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
  332. qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
  336. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
  341. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
  345. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
  350. qiskit/providers/fake_provider/fake_1q.py +91 -0
  351. qiskit/providers/fake_provider/fake_backend.py +165 -0
  352. qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
  353. qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
  354. qiskit/providers/fake_provider/fake_pulse_backend.py +44 -0
  355. qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
  356. qiskit/providers/fake_provider/generic_backend_v2.py +1019 -0
  357. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  358. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  359. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  360. qiskit/providers/job.py +147 -0
  361. qiskit/providers/jobstatus.py +30 -0
  362. qiskit/providers/models/__init__.py +89 -0
  363. qiskit/providers/models/backendconfiguration.py +1040 -0
  364. qiskit/providers/models/backendproperties.py +517 -0
  365. qiskit/providers/models/backendstatus.py +94 -0
  366. qiskit/providers/models/jobstatus.py +66 -0
  367. qiskit/providers/models/pulsedefaults.py +303 -0
  368. qiskit/providers/options.py +273 -0
  369. qiskit/providers/provider.py +95 -0
  370. qiskit/providers/providerutils.py +110 -0
  371. qiskit/pulse/__init__.py +158 -0
  372. qiskit/pulse/builder.py +2213 -0
  373. qiskit/pulse/calibration_entries.py +378 -0
  374. qiskit/pulse/channels.py +225 -0
  375. qiskit/pulse/configuration.py +245 -0
  376. qiskit/pulse/exceptions.py +43 -0
  377. qiskit/pulse/filters.py +309 -0
  378. qiskit/pulse/instruction_schedule_map.py +409 -0
  379. qiskit/pulse/instructions/__init__.py +67 -0
  380. qiskit/pulse/instructions/acquire.py +148 -0
  381. qiskit/pulse/instructions/delay.py +69 -0
  382. qiskit/pulse/instructions/directives.py +146 -0
  383. qiskit/pulse/instructions/frequency.py +132 -0
  384. qiskit/pulse/instructions/instruction.py +268 -0
  385. qiskit/pulse/instructions/phase.py +149 -0
  386. qiskit/pulse/instructions/play.py +97 -0
  387. qiskit/pulse/instructions/reference.py +98 -0
  388. qiskit/pulse/instructions/snapshot.py +80 -0
  389. qiskit/pulse/library/__init__.py +97 -0
  390. qiskit/pulse/library/continuous.py +430 -0
  391. qiskit/pulse/library/pulse.py +146 -0
  392. qiskit/pulse/library/samplers/__init__.py +15 -0
  393. qiskit/pulse/library/samplers/decorators.py +295 -0
  394. qiskit/pulse/library/samplers/strategies.py +71 -0
  395. qiskit/pulse/library/symbolic_pulses.py +1960 -0
  396. qiskit/pulse/library/waveform.py +134 -0
  397. qiskit/pulse/macros.py +262 -0
  398. qiskit/pulse/parameter_manager.py +445 -0
  399. qiskit/pulse/parser.py +314 -0
  400. qiskit/pulse/reference_manager.py +58 -0
  401. qiskit/pulse/schedule.py +1855 -0
  402. qiskit/pulse/transforms/__init__.py +106 -0
  403. qiskit/pulse/transforms/alignments.py +404 -0
  404. qiskit/pulse/transforms/base_transforms.py +71 -0
  405. qiskit/pulse/transforms/canonicalization.py +498 -0
  406. qiskit/pulse/transforms/dag.py +115 -0
  407. qiskit/pulse/utils.py +149 -0
  408. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  409. qiskit/qasm/libs/qelib1.inc +266 -0
  410. qiskit/qasm/libs/stdgates.inc +82 -0
  411. qiskit/qasm2/__init__.py +654 -0
  412. qiskit/qasm2/exceptions.py +27 -0
  413. qiskit/qasm2/export.py +370 -0
  414. qiskit/qasm2/parse.py +408 -0
  415. qiskit/qasm3/__init__.py +366 -0
  416. qiskit/qasm3/ast.py +630 -0
  417. qiskit/qasm3/exceptions.py +27 -0
  418. qiskit/qasm3/experimental.py +70 -0
  419. qiskit/qasm3/exporter.py +1273 -0
  420. qiskit/qasm3/printer.py +577 -0
  421. qiskit/qobj/__init__.py +75 -0
  422. qiskit/qobj/common.py +81 -0
  423. qiskit/qobj/converters/__init__.py +18 -0
  424. qiskit/qobj/converters/lo_config.py +177 -0
  425. qiskit/qobj/converters/pulse_instruction.py +895 -0
  426. qiskit/qobj/pulse_qobj.py +709 -0
  427. qiskit/qobj/qasm_qobj.py +708 -0
  428. qiskit/qobj/utils.py +46 -0
  429. qiskit/qpy/__init__.py +1641 -0
  430. qiskit/qpy/binary_io/__init__.py +36 -0
  431. qiskit/qpy/binary_io/circuits.py +1460 -0
  432. qiskit/qpy/binary_io/schedules.py +636 -0
  433. qiskit/qpy/binary_io/value.py +728 -0
  434. qiskit/qpy/common.py +306 -0
  435. qiskit/qpy/exceptions.py +53 -0
  436. qiskit/qpy/formats.py +394 -0
  437. qiskit/qpy/interface.py +341 -0
  438. qiskit/qpy/type_keys.py +572 -0
  439. qiskit/quantum_info/__init__.py +158 -0
  440. qiskit/quantum_info/analysis/__init__.py +17 -0
  441. qiskit/quantum_info/analysis/average.py +47 -0
  442. qiskit/quantum_info/analysis/distance.py +102 -0
  443. qiskit/quantum_info/analysis/make_observable.py +44 -0
  444. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  445. qiskit/quantum_info/operators/__init__.py +28 -0
  446. qiskit/quantum_info/operators/base_operator.py +145 -0
  447. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  448. qiskit/quantum_info/operators/channel/chi.py +191 -0
  449. qiskit/quantum_info/operators/channel/choi.py +218 -0
  450. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  451. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  452. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  453. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  454. qiskit/quantum_info/operators/channel/superop.py +377 -0
  455. qiskit/quantum_info/operators/channel/transformations.py +468 -0
  456. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  457. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  458. qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
  459. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  460. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  461. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  462. qiskit/quantum_info/operators/linear_op.py +25 -0
  463. qiskit/quantum_info/operators/measures.py +418 -0
  464. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  465. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  466. qiskit/quantum_info/operators/mixins/group.py +171 -0
  467. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  468. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  469. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  470. qiskit/quantum_info/operators/op_shape.py +525 -0
  471. qiskit/quantum_info/operators/operator.py +819 -0
  472. qiskit/quantum_info/operators/operator_utils.py +76 -0
  473. qiskit/quantum_info/operators/predicates.py +183 -0
  474. qiskit/quantum_info/operators/random.py +154 -0
  475. qiskit/quantum_info/operators/scalar_op.py +254 -0
  476. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  477. qiskit/quantum_info/operators/symplectic/base_pauli.py +727 -0
  478. qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
  479. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  480. qiskit/quantum_info/operators/symplectic/pauli.py +751 -0
  481. qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
  482. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  483. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  484. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1175 -0
  485. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  486. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  487. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  488. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  489. qiskit/quantum_info/quaternion.py +156 -0
  490. qiskit/quantum_info/random.py +26 -0
  491. qiskit/quantum_info/states/__init__.py +28 -0
  492. qiskit/quantum_info/states/densitymatrix.py +845 -0
  493. qiskit/quantum_info/states/measures.py +288 -0
  494. qiskit/quantum_info/states/quantum_state.py +503 -0
  495. qiskit/quantum_info/states/random.py +157 -0
  496. qiskit/quantum_info/states/stabilizerstate.py +773 -0
  497. qiskit/quantum_info/states/statevector.py +958 -0
  498. qiskit/quantum_info/states/utils.py +247 -0
  499. qiskit/result/__init__.py +73 -0
  500. qiskit/result/counts.py +189 -0
  501. qiskit/result/distributions/__init__.py +17 -0
  502. qiskit/result/distributions/probability.py +100 -0
  503. qiskit/result/distributions/quasi.py +154 -0
  504. qiskit/result/exceptions.py +40 -0
  505. qiskit/result/mitigation/__init__.py +13 -0
  506. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  507. qiskit/result/mitigation/correlated_readout_mitigator.py +269 -0
  508. qiskit/result/mitigation/local_readout_mitigator.py +320 -0
  509. qiskit/result/mitigation/utils.py +160 -0
  510. qiskit/result/models.py +234 -0
  511. qiskit/result/postprocess.py +239 -0
  512. qiskit/result/result.py +392 -0
  513. qiskit/result/sampled_expval.py +75 -0
  514. qiskit/result/utils.py +295 -0
  515. qiskit/scheduler/__init__.py +40 -0
  516. qiskit/scheduler/config.py +35 -0
  517. qiskit/scheduler/lowering.py +187 -0
  518. qiskit/scheduler/methods/__init__.py +15 -0
  519. qiskit/scheduler/methods/basic.py +137 -0
  520. qiskit/scheduler/schedule_circuit.py +67 -0
  521. qiskit/scheduler/sequence.py +102 -0
  522. qiskit/synthesis/__init__.py +195 -0
  523. qiskit/synthesis/clifford/__init__.py +19 -0
  524. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  525. qiskit/synthesis/clifford/clifford_decompose_bm.py +47 -0
  526. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  527. qiskit/synthesis/clifford/clifford_decompose_greedy.py +57 -0
  528. qiskit/synthesis/clifford/clifford_decompose_layers.py +446 -0
  529. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  530. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  531. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  532. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  533. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  534. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  535. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  536. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  537. qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
  538. qiskit/synthesis/evolution/__init__.py +20 -0
  539. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  540. qiskit/synthesis/evolution/lie_trotter.py +143 -0
  541. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  542. qiskit/synthesis/evolution/product_formula.py +384 -0
  543. qiskit/synthesis/evolution/qdrift.py +131 -0
  544. qiskit/synthesis/evolution/suzuki_trotter.py +155 -0
  545. qiskit/synthesis/linear/__init__.py +26 -0
  546. qiskit/synthesis/linear/cnot_synth.py +69 -0
  547. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  548. qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
  549. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  550. qiskit/synthesis/linear_phase/__init__.py +17 -0
  551. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  552. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  553. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  554. qiskit/synthesis/multi_controlled/__init__.py +23 -0
  555. qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
  556. qiskit/synthesis/one_qubit/__init__.py +15 -0
  557. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  558. qiskit/synthesis/permutation/__init__.py +18 -0
  559. qiskit/synthesis/permutation/permutation_full.py +78 -0
  560. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  561. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  562. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  563. qiskit/synthesis/qft/__init__.py +16 -0
  564. qiskit/synthesis/qft/qft_decompose_full.py +79 -0
  565. qiskit/synthesis/qft/qft_decompose_lnn.py +78 -0
  566. qiskit/synthesis/stabilizer/__init__.py +16 -0
  567. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  568. qiskit/synthesis/stabilizer/stabilizer_decompose.py +193 -0
  569. qiskit/synthesis/two_qubit/__init__.py +19 -0
  570. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  571. qiskit/synthesis/two_qubit/two_qubit_decompose.py +759 -0
  572. qiskit/synthesis/two_qubit/weyl.py +97 -0
  573. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  574. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  575. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  576. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  577. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  578. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  579. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  580. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  581. qiskit/synthesis/unitary/__init__.py +13 -0
  582. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  583. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  584. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  585. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  586. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  587. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  588. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  589. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  590. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  591. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  592. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  593. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  594. qiskit/synthesis/unitary/qsd.py +288 -0
  595. qiskit/transpiler/__init__.py +1283 -0
  596. qiskit/transpiler/basepasses.py +221 -0
  597. qiskit/transpiler/coupling.py +500 -0
  598. qiskit/transpiler/exceptions.py +59 -0
  599. qiskit/transpiler/instruction_durations.py +281 -0
  600. qiskit/transpiler/layout.py +737 -0
  601. qiskit/transpiler/passes/__init__.py +310 -0
  602. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  603. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  604. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  605. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  606. qiskit/transpiler/passes/analysis/depth.py +33 -0
  607. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  608. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  609. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  610. qiskit/transpiler/passes/analysis/size.py +36 -0
  611. qiskit/transpiler/passes/analysis/width.py +27 -0
  612. qiskit/transpiler/passes/basis/__init__.py +19 -0
  613. qiskit/transpiler/passes/basis/basis_translator.py +693 -0
  614. qiskit/transpiler/passes/basis/decompose.py +98 -0
  615. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  616. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
  617. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
  618. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  619. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  620. qiskit/transpiler/passes/calibration/builders.py +20 -0
  621. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  622. qiskit/transpiler/passes/calibration/pulse_gate.py +98 -0
  623. qiskit/transpiler/passes/calibration/rx_builder.py +160 -0
  624. qiskit/transpiler/passes/calibration/rzx_builder.py +395 -0
  625. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  626. qiskit/transpiler/passes/layout/__init__.py +26 -0
  627. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  628. qiskit/transpiler/passes/layout/apply_layout.py +123 -0
  629. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  630. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  631. qiskit/transpiler/passes/layout/disjoint_utils.py +217 -0
  632. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  633. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  634. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  635. qiskit/transpiler/passes/layout/sabre_layout.py +482 -0
  636. qiskit/transpiler/passes/layout/sabre_pre_layout.py +220 -0
  637. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  638. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  639. qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
  640. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  641. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  642. qiskit/transpiler/passes/optimization/__init__.py +42 -0
  643. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  644. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  645. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  646. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  647. qiskit/transpiler/passes/optimization/collect_cliffords.py +88 -0
  648. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  649. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  650. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  651. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  652. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  653. qiskit/transpiler/passes/optimization/consolidate_blocks.py +232 -0
  654. qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
  655. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +160 -0
  656. qiskit/transpiler/passes/optimization/elide_permutations.py +114 -0
  657. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  658. qiskit/transpiler/passes/optimization/inverse_cancellation.py +93 -0
  659. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  660. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  661. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +260 -0
  662. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  663. qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
  664. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  665. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  666. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  667. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  668. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  669. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  670. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
  671. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  672. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  673. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  674. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  675. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  676. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
  677. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  678. qiskit/transpiler/passes/routing/__init__.py +22 -0
  679. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  680. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  681. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  682. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  683. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  684. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  685. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  686. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
  687. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  688. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  689. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  690. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  691. qiskit/transpiler/passes/routing/sabre_swap.py +443 -0
  692. qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
  693. qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
  694. qiskit/transpiler/passes/routing/utils.py +35 -0
  695. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  696. qiskit/transpiler/passes/scheduling/alap.py +153 -0
  697. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  698. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
  699. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
  700. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +105 -0
  701. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
  702. qiskit/transpiler/passes/scheduling/asap.py +175 -0
  703. qiskit/transpiler/passes/scheduling/base_scheduler.py +308 -0
  704. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +307 -0
  705. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  706. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  707. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +441 -0
  708. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +79 -0
  709. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  710. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  711. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  712. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +90 -0
  713. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  714. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +160 -0
  715. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  716. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  717. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +691 -0
  718. qiskit/transpiler/passes/synthesis/hls_plugins.py +928 -0
  719. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  720. qiskit/transpiler/passes/synthesis/plugin.py +734 -0
  721. qiskit/transpiler/passes/synthesis/qubit_tracker.py +132 -0
  722. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
  723. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1055 -0
  724. qiskit/transpiler/passes/utils/__init__.py +33 -0
  725. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +95 -0
  726. qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
  727. qiskit/transpiler/passes/utils/check_map.py +78 -0
  728. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  729. qiskit/transpiler/passes/utils/control_flow.py +65 -0
  730. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +88 -0
  731. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  732. qiskit/transpiler/passes/utils/error.py +69 -0
  733. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  734. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  735. qiskit/transpiler/passes/utils/gate_direction.py +349 -0
  736. qiskit/transpiler/passes/utils/gates_basis.py +74 -0
  737. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +162 -0
  738. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  739. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  740. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  741. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  742. qiskit/transpiler/passmanager.py +490 -0
  743. qiskit/transpiler/passmanager_config.py +198 -0
  744. qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
  745. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1019 -0
  746. qiskit/transpiler/preset_passmanagers/common.py +647 -0
  747. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +543 -0
  748. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  749. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  750. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  751. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  752. qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
  753. qiskit/transpiler/target.py +1261 -0
  754. qiskit/transpiler/timing_constraints.py +59 -0
  755. qiskit/user_config.py +262 -0
  756. qiskit/utils/__init__.py +89 -0
  757. qiskit/utils/classtools.py +146 -0
  758. qiskit/utils/deprecation.py +490 -0
  759. qiskit/utils/lazy_tester.py +363 -0
  760. qiskit/utils/multiprocessing.py +56 -0
  761. qiskit/utils/optionals.py +347 -0
  762. qiskit/utils/parallel.py +191 -0
  763. qiskit/utils/units.py +143 -0
  764. qiskit/version.py +84 -0
  765. qiskit/visualization/__init__.py +288 -0
  766. qiskit/visualization/array.py +204 -0
  767. qiskit/visualization/bloch.py +778 -0
  768. qiskit/visualization/circuit/__init__.py +15 -0
  769. qiskit/visualization/circuit/_utils.py +675 -0
  770. qiskit/visualization/circuit/circuit_visualization.py +726 -0
  771. qiskit/visualization/circuit/latex.py +661 -0
  772. qiskit/visualization/circuit/matplotlib.py +2029 -0
  773. qiskit/visualization/circuit/qcstyle.py +278 -0
  774. qiskit/visualization/circuit/styles/__init__.py +13 -0
  775. qiskit/visualization/circuit/styles/bw.json +202 -0
  776. qiskit/visualization/circuit/styles/clifford.json +202 -0
  777. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  778. qiskit/visualization/circuit/styles/iqp.json +214 -0
  779. qiskit/visualization/circuit/styles/textbook.json +202 -0
  780. qiskit/visualization/circuit/text.py +1844 -0
  781. qiskit/visualization/circuit_visualization.py +19 -0
  782. qiskit/visualization/counts_visualization.py +481 -0
  783. qiskit/visualization/dag_visualization.py +316 -0
  784. qiskit/visualization/exceptions.py +21 -0
  785. qiskit/visualization/gate_map.py +1485 -0
  786. qiskit/visualization/library.py +37 -0
  787. qiskit/visualization/pass_manager_visualization.py +319 -0
  788. qiskit/visualization/pulse_v2/__init__.py +21 -0
  789. qiskit/visualization/pulse_v2/core.py +901 -0
  790. qiskit/visualization/pulse_v2/device_info.py +173 -0
  791. qiskit/visualization/pulse_v2/drawings.py +253 -0
  792. qiskit/visualization/pulse_v2/events.py +254 -0
  793. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  794. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  795. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  796. qiskit/visualization/pulse_v2/generators/frame.py +436 -0
  797. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  798. qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
  799. qiskit/visualization/pulse_v2/interface.py +456 -0
  800. qiskit/visualization/pulse_v2/layouts.py +387 -0
  801. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  802. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  803. qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
  804. qiskit/visualization/pulse_v2/stylesheet.py +312 -0
  805. qiskit/visualization/pulse_v2/types.py +242 -0
  806. qiskit/visualization/state_visualization.py +1518 -0
  807. qiskit/visualization/timeline/__init__.py +21 -0
  808. qiskit/visualization/timeline/core.py +457 -0
  809. qiskit/visualization/timeline/drawings.py +260 -0
  810. qiskit/visualization/timeline/generators.py +506 -0
  811. qiskit/visualization/timeline/interface.py +424 -0
  812. qiskit/visualization/timeline/layouts.py +115 -0
  813. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  814. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  815. qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
  816. qiskit/visualization/timeline/stylesheet.py +301 -0
  817. qiskit/visualization/timeline/types.py +148 -0
  818. qiskit/visualization/transition_visualization.py +369 -0
  819. qiskit/visualization/utils.py +49 -0
  820. qiskit-1.3.0b1.dist-info/LICENSE.txt +203 -0
  821. qiskit-1.3.0b1.dist-info/METADATA +221 -0
  822. qiskit-1.3.0b1.dist-info/RECORD +825 -0
  823. qiskit-1.3.0b1.dist-info/WHEEL +5 -0
  824. qiskit-1.3.0b1.dist-info/entry_points.txt +57 -0
  825. qiskit-1.3.0b1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,693 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2020.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+
14
+ """Translates gates to a target basis using a given equivalence library."""
15
+
16
+ import time
17
+ import logging
18
+
19
+ from functools import singledispatchmethod
20
+ from itertools import zip_longest
21
+ from collections import defaultdict
22
+
23
+ import rustworkx
24
+
25
+ from qiskit.circuit import (
26
+ Gate,
27
+ ParameterVector,
28
+ QuantumRegister,
29
+ ControlFlowOp,
30
+ QuantumCircuit,
31
+ ParameterExpression,
32
+ )
33
+ from qiskit.dagcircuit import DAGCircuit, DAGOpNode
34
+ from qiskit.converters import circuit_to_dag, dag_to_circuit
35
+ from qiskit.circuit.equivalence import Key, NodeData
36
+ from qiskit.transpiler.basepasses import TransformationPass
37
+ from qiskit.transpiler.exceptions import TranspilerError
38
+ from qiskit.circuit.controlflow import CONTROL_FLOW_OP_NAMES
39
+
40
+ logger = logging.getLogger(__name__)
41
+
42
+
43
+ class BasisTranslator(TransformationPass):
44
+ """Translates gates to a target basis by searching for a set of translations
45
+ from a given EquivalenceLibrary.
46
+
47
+ This pass operates in several steps:
48
+
49
+ * Determine the source basis from the input circuit.
50
+ * Perform a Dijkstra search over basis sets, starting from the device's
51
+ target_basis new gates are being generated using the rules from the provided
52
+ EquivalenceLibrary and the search stops if all gates in the source basis have
53
+ been generated.
54
+ * The found path, as a set of rules from the EquivalenceLibrary, is composed
55
+ into a set of gate replacement rules.
56
+ * The composed replacement rules are applied in-place to each op node which
57
+ is not already in the target_basis.
58
+
59
+ If the target keyword argument is specified and that
60
+ :class:`~qiskit.transpiler.Target` objects contains operations
61
+ which are non-global (i.e. they are defined only for a subset of qubits),
62
+ as calculated by :meth:`~qiskit.transpiler.Target.get_non_global_operation_names`,
63
+ this pass will attempt to match the output translation to those constraints.
64
+ For 1 qubit operations this is straightforward, the pass will perform a
65
+ search using the union of the set of global operations with the set of operations
66
+ defined solely on that qubit. For multi-qubit gates this is a bit more involved,
67
+ while the behavior is initially similar to the single qubit case, just using all
68
+ the qubits the operation is run on (where order is not significant) isn't sufficient.
69
+ We also need to consider any potential local qubits defined on subsets of the
70
+ quantum arguments for the multi-qubit operation. This means the target used for the
71
+ search of a non-global multi-qubit gate is the union of global operations, non-global
72
+ multi-qubit gates sharing the same qubits, and any non-global gates defined on
73
+ any subset of the qubits used.
74
+
75
+
76
+ .. note::
77
+
78
+ In the case of non-global operations it is possible for a single
79
+ execution of this pass to output an incomplete translation if any
80
+ non-global gates are defined on qubits that are a subset of a larger
81
+ multi-qubit gate. For example, if you have a ``u`` gate only defined on
82
+ qubit 0 and an ``x`` gate only on qubit 1 it is possible when
83
+ translating a 2 qubit operation on qubit 0 and 1 that the output might
84
+ have ``u`` on qubit 1 and ``x`` on qubit 0. Typically running this pass
85
+ a second time will correct these issues.
86
+
87
+ .. _translation_errors:
88
+
89
+ Translation Errors
90
+ ------------------
91
+
92
+ This pass will error if there is no path to translate an input gate to
93
+ the specified basis. However, during a typical/default preset passmanager
94
+ this pass gets run multiple times at different stages of the compilation
95
+ pipeline. This means that potentially the input gates that are getting
96
+ translated were not in the input circuit to :func:`~.transpile` as they
97
+ were generated by an intermediate transform in the circuit.
98
+
99
+ When this error occurs it typically means that either the target basis
100
+ is not universal or there are additional equivalence rules needed in the
101
+ :class:`~.EquivalenceLibrary` instance being used by the
102
+ :class:`~.BasisTranslator` pass. You can refer to
103
+ :ref:`custom_basis_gates` for details on adding custom equivalence rules.
104
+ """
105
+
106
+ def __init__(self, equivalence_library, target_basis, target=None, min_qubits=0):
107
+ """Initialize a BasisTranslator instance.
108
+
109
+ Args:
110
+ equivalence_library (EquivalenceLibrary): The equivalence library
111
+ which will be used by the BasisTranslator pass. (Instructions in
112
+ this library will not be unrolled by this pass.)
113
+ target_basis (list[str]): Target basis names to unroll to, e.g. ``['u3', 'cx']``.
114
+ target (Target): The backend compilation target
115
+ min_qubits (int): The minimum number of qubits for operations in the input
116
+ dag to translate.
117
+ """
118
+
119
+ super().__init__()
120
+ self._equiv_lib = equivalence_library
121
+ self._target_basis = target_basis
122
+ self._target = target
123
+ self._non_global_operations = None
124
+ self._qargs_with_non_global_operation = {}
125
+ self._min_qubits = min_qubits
126
+ if target is not None:
127
+ self._non_global_operations = self._target.get_non_global_operation_names()
128
+ self._qargs_with_non_global_operation = defaultdict(set)
129
+ for gate in self._non_global_operations:
130
+ for qarg in self._target[gate]:
131
+ self._qargs_with_non_global_operation[qarg].add(gate)
132
+
133
+ def run(self, dag):
134
+ """Translate an input DAGCircuit to the target basis.
135
+
136
+ Args:
137
+ dag (DAGCircuit): input dag
138
+
139
+ Raises:
140
+ TranspilerError: if the target basis cannot be reached
141
+
142
+ Returns:
143
+ DAGCircuit: translated circuit.
144
+ """
145
+ if self._target_basis is None and self._target is None:
146
+ return dag
147
+
148
+ qarg_indices = {qubit: index for index, qubit in enumerate(dag.qubits)}
149
+
150
+ # Names of instructions assumed to supported by any backend.
151
+ if self._target is None:
152
+ basic_instrs = ["measure", "reset", "barrier", "snapshot", "delay", "store"]
153
+ target_basis = set(self._target_basis)
154
+ source_basis = set(self._extract_basis(dag))
155
+ qargs_local_source_basis = {}
156
+ else:
157
+ basic_instrs = ["barrier", "snapshot", "store"]
158
+ target_basis = self._target.keys() - set(self._non_global_operations)
159
+ source_basis, qargs_local_source_basis = self._extract_basis_target(dag, qarg_indices)
160
+
161
+ target_basis = set(target_basis).union(basic_instrs)
162
+ # If the source basis is a subset of the target basis and we have no circuit
163
+ # instructions on qargs that have non-global operations there is nothing to
164
+ # translate and we can exit early.
165
+ source_basis_names = {x[0] for x in source_basis}
166
+ if source_basis_names.issubset(target_basis) and not qargs_local_source_basis:
167
+ return dag
168
+
169
+ logger.info(
170
+ "Begin BasisTranslator from source basis %s to target basis %s.",
171
+ source_basis,
172
+ target_basis,
173
+ )
174
+
175
+ # Search for a path from source to target basis.
176
+ search_start_time = time.time()
177
+ basis_transforms = _basis_search(self._equiv_lib, source_basis, target_basis)
178
+
179
+ qarg_local_basis_transforms = {}
180
+ for qarg, local_source_basis in qargs_local_source_basis.items():
181
+ expanded_target = set(target_basis)
182
+ # For any multiqubit operation that contains a subset of qubits that
183
+ # has a non-local operation, include that non-local operation in the
184
+ # search. This matches with the check we did above to include those
185
+ # subset non-local operations in the check here.
186
+ if len(qarg) > 1:
187
+ for non_local_qarg, local_basis in self._qargs_with_non_global_operation.items():
188
+ if qarg.issuperset(non_local_qarg):
189
+ expanded_target |= local_basis
190
+ else:
191
+ expanded_target |= self._qargs_with_non_global_operation[tuple(qarg)]
192
+
193
+ logger.info(
194
+ "Performing BasisTranslator search from source basis %s to target "
195
+ "basis %s on qarg %s.",
196
+ local_source_basis,
197
+ expanded_target,
198
+ qarg,
199
+ )
200
+ local_basis_transforms = _basis_search(
201
+ self._equiv_lib, local_source_basis, expanded_target
202
+ )
203
+
204
+ if local_basis_transforms is None:
205
+ raise TranspilerError(
206
+ "Unable to translate the operations in the circuit: "
207
+ f"{[x[0] for x in local_source_basis]} to the backend's (or manually "
208
+ f"specified) target basis: {list(expanded_target)}. This likely means the "
209
+ "target basis is not universal or there are additional equivalence rules "
210
+ "needed in the EquivalenceLibrary being used. For more details on this "
211
+ "error see: "
212
+ "https://docs.quantum.ibm.com/api/qiskit/qiskit.transpiler.passes."
213
+ "BasisTranslator#translation-errors"
214
+ )
215
+
216
+ qarg_local_basis_transforms[qarg] = local_basis_transforms
217
+
218
+ search_end_time = time.time()
219
+ logger.info(
220
+ "Basis translation path search completed in %.3fs.", search_end_time - search_start_time
221
+ )
222
+
223
+ if basis_transforms is None:
224
+ raise TranspilerError(
225
+ "Unable to translate the operations in the circuit: "
226
+ f"{[x[0] for x in source_basis]} to the backend's (or manually specified) target "
227
+ f"basis: {list(target_basis)}. This likely means the target basis is not universal "
228
+ "or there are additional equivalence rules needed in the EquivalenceLibrary being "
229
+ "used. For more details on this error see: "
230
+ "https://docs.quantum.ibm.com/api/qiskit/qiskit.transpiler.passes."
231
+ "BasisTranslator#translation-errors"
232
+ )
233
+
234
+ # Compose found path into a set of instruction substitution rules.
235
+
236
+ compose_start_time = time.time()
237
+ instr_map = _compose_transforms(basis_transforms, source_basis, dag)
238
+ extra_instr_map = {
239
+ qarg: _compose_transforms(transforms, qargs_local_source_basis[qarg], dag)
240
+ for qarg, transforms in qarg_local_basis_transforms.items()
241
+ }
242
+
243
+ compose_end_time = time.time()
244
+ logger.info(
245
+ "Basis translation paths composed in %.3fs.", compose_end_time - compose_start_time
246
+ )
247
+
248
+ # Replace source instructions with target translations.
249
+
250
+ replace_start_time = time.time()
251
+
252
+ def apply_translation(dag, wire_map):
253
+ is_updated = False
254
+ out_dag = dag.copy_empty_like()
255
+ for node in dag.topological_op_nodes():
256
+ node_qargs = tuple(wire_map[bit] for bit in node.qargs)
257
+ qubit_set = frozenset(node_qargs)
258
+ if node.name in target_basis or len(node.qargs) < self._min_qubits:
259
+ if node.name in CONTROL_FLOW_OP_NAMES:
260
+ flow_blocks = []
261
+ for block in node.op.blocks:
262
+ dag_block = circuit_to_dag(block)
263
+ updated_dag, is_updated = apply_translation(
264
+ dag_block,
265
+ {
266
+ inner: wire_map[outer]
267
+ for inner, outer in zip(block.qubits, node.qargs)
268
+ },
269
+ )
270
+ if is_updated:
271
+ flow_circ_block = dag_to_circuit(updated_dag)
272
+ else:
273
+ flow_circ_block = block
274
+ flow_blocks.append(flow_circ_block)
275
+ node.op = node.op.replace_blocks(flow_blocks)
276
+ out_dag.apply_operation_back(node.op, node.qargs, node.cargs, check=False)
277
+ continue
278
+ if (
279
+ node_qargs in self._qargs_with_non_global_operation
280
+ and node.name in self._qargs_with_non_global_operation[node_qargs]
281
+ ):
282
+ out_dag.apply_operation_back(node.op, node.qargs, node.cargs, check=False)
283
+ continue
284
+
285
+ if dag.has_calibration_for(node):
286
+ out_dag.apply_operation_back(node.op, node.qargs, node.cargs, check=False)
287
+ continue
288
+ if qubit_set in extra_instr_map:
289
+ self._replace_node(out_dag, node, extra_instr_map[qubit_set])
290
+ elif (node.name, node.num_qubits) in instr_map:
291
+ self._replace_node(out_dag, node, instr_map)
292
+ else:
293
+ raise TranspilerError(f"BasisTranslator did not map {node.name}.")
294
+ is_updated = True
295
+ return out_dag, is_updated
296
+
297
+ out_dag, _ = apply_translation(dag, qarg_indices)
298
+ replace_end_time = time.time()
299
+ logger.info(
300
+ "Basis translation instructions replaced in %.3fs.",
301
+ replace_end_time - replace_start_time,
302
+ )
303
+
304
+ return out_dag
305
+
306
+ def _replace_node(self, dag, node, instr_map):
307
+ target_params, target_dag = instr_map[node.name, node.num_qubits]
308
+ if len(node.params) != len(target_params):
309
+ raise TranspilerError(
310
+ "Translation num_params not equal to op num_params."
311
+ f"Op: {node.params} {node.name} Translation: {target_params}\n{target_dag}"
312
+ )
313
+ if node.params:
314
+ parameter_map = dict(zip(target_params, node.params))
315
+ for inner_node in target_dag.topological_op_nodes():
316
+ new_node = DAGOpNode.from_instruction(inner_node._to_circuit_instruction())
317
+ new_node.qargs = tuple(
318
+ node.qargs[target_dag.find_bit(x).index] for x in inner_node.qargs
319
+ )
320
+ new_node.cargs = tuple(
321
+ node.cargs[target_dag.find_bit(x).index] for x in inner_node.cargs
322
+ )
323
+
324
+ if not new_node.is_standard_gate():
325
+ new_node.op = new_node.op.copy()
326
+ if any(isinstance(x, ParameterExpression) for x in inner_node.params):
327
+ new_params = []
328
+ for param in new_node.params:
329
+ if not isinstance(param, ParameterExpression):
330
+ new_params.append(param)
331
+ else:
332
+ bind_dict = {x: parameter_map[x] for x in param.parameters}
333
+ if any(isinstance(x, ParameterExpression) for x in bind_dict.values()):
334
+ new_value = param
335
+ for x in bind_dict.items():
336
+ new_value = new_value.assign(*x)
337
+ else:
338
+ new_value = param.bind(bind_dict)
339
+ if not new_value.parameters:
340
+ new_value = new_value.numeric()
341
+ new_params.append(new_value)
342
+ new_node.params = new_params
343
+ if not new_node.is_standard_gate():
344
+ new_node.op.params = new_params
345
+ dag._apply_op_node_back(new_node)
346
+
347
+ if isinstance(target_dag.global_phase, ParameterExpression):
348
+ old_phase = target_dag.global_phase
349
+ bind_dict = {x: parameter_map[x] for x in old_phase.parameters}
350
+ if any(isinstance(x, ParameterExpression) for x in bind_dict.values()):
351
+ new_phase = old_phase
352
+ for x in bind_dict.items():
353
+ new_phase = new_phase.assign(*x)
354
+ else:
355
+ new_phase = old_phase.bind(bind_dict)
356
+ if not new_phase.parameters:
357
+ new_phase = new_phase.numeric()
358
+ if isinstance(new_phase, complex):
359
+ raise TranspilerError(f"Global phase must be real, but got '{new_phase}'")
360
+ dag.global_phase += new_phase
361
+
362
+ else:
363
+ for inner_node in target_dag.topological_op_nodes():
364
+ new_node = DAGOpNode.from_instruction(
365
+ inner_node._to_circuit_instruction(),
366
+ )
367
+ new_node.qargs = tuple(
368
+ node.qargs[target_dag.find_bit(x).index] for x in inner_node.qargs
369
+ )
370
+ new_node.cargs = tuple(
371
+ node.cargs[target_dag.find_bit(x).index] for x in inner_node.cargs
372
+ )
373
+ if not new_node.is_standard_gate:
374
+ new_node.op = new_node.op.copy()
375
+ # dag_op may be the same instance as other ops in the dag,
376
+ # so if there is a condition, need to copy
377
+ if getattr(node.op, "condition", None):
378
+ new_node_op = new_node.op.to_mutable()
379
+ new_node_op.condition = node.op.condition
380
+ new_node.op = new_node_op
381
+ dag._apply_op_node_back(new_node)
382
+ if target_dag.global_phase:
383
+ dag.global_phase += target_dag.global_phase
384
+
385
+ @singledispatchmethod
386
+ def _extract_basis(self, circuit):
387
+ return circuit
388
+
389
+ @_extract_basis.register
390
+ def _(self, dag: DAGCircuit):
391
+ for node in dag.op_nodes():
392
+ if not dag.has_calibration_for(node) and len(node.qargs) >= self._min_qubits:
393
+ yield (node.name, node.num_qubits)
394
+ if node.name in CONTROL_FLOW_OP_NAMES:
395
+ for block in node.op.blocks:
396
+ yield from self._extract_basis(block)
397
+
398
+ @_extract_basis.register
399
+ def _(self, circ: QuantumCircuit):
400
+ for instruction in circ.data:
401
+ operation = instruction.operation
402
+ if (
403
+ not circ.has_calibration_for(instruction)
404
+ and len(instruction.qubits) >= self._min_qubits
405
+ ):
406
+ yield (operation.name, operation.num_qubits)
407
+ if isinstance(operation, ControlFlowOp):
408
+ for block in operation.blocks:
409
+ yield from self._extract_basis(block)
410
+
411
+ def _extract_basis_target(
412
+ self, dag, qarg_indices, source_basis=None, qargs_local_source_basis=None
413
+ ):
414
+ if source_basis is None:
415
+ source_basis = set()
416
+ if qargs_local_source_basis is None:
417
+ qargs_local_source_basis = defaultdict(set)
418
+ for node in dag.op_nodes():
419
+ qargs = tuple(qarg_indices[bit] for bit in node.qargs)
420
+ if dag.has_calibration_for(node) or len(node.qargs) < self._min_qubits:
421
+ continue
422
+ # Treat the instruction as on an incomplete basis if the qargs are in the
423
+ # qargs_with_non_global_operation dictionary or if any of the qubits in qargs
424
+ # are a superset for a non-local operation. For example, if the qargs
425
+ # are (0, 1) and that's a global (ie no non-local operations on (0, 1)
426
+ # operation but there is a non-local operation on (1,) we need to
427
+ # do an extra non-local search for this op to ensure we include any
428
+ # single qubit operation for (1,) as valid. This pattern also holds
429
+ # true for > 2q ops too (so for 4q operations we need to check for 3q, 2q,
430
+ # and 1q operations in the same manner)
431
+ if qargs in self._qargs_with_non_global_operation or any(
432
+ frozenset(qargs).issuperset(incomplete_qargs)
433
+ for incomplete_qargs in self._qargs_with_non_global_operation
434
+ ):
435
+ qargs_local_source_basis[frozenset(qargs)].add((node.name, node.num_qubits))
436
+ else:
437
+ source_basis.add((node.name, node.num_qubits))
438
+ if node.name in CONTROL_FLOW_OP_NAMES:
439
+ for block in node.op.blocks:
440
+ block_dag = circuit_to_dag(block)
441
+ source_basis, qargs_local_source_basis = self._extract_basis_target(
442
+ block_dag,
443
+ {
444
+ inner: qarg_indices[outer]
445
+ for inner, outer in zip(block.qubits, node.qargs)
446
+ },
447
+ source_basis=source_basis,
448
+ qargs_local_source_basis=qargs_local_source_basis,
449
+ )
450
+ return source_basis, qargs_local_source_basis
451
+
452
+
453
+ class StopIfBasisRewritable(Exception):
454
+ """Custom exception that signals `rustworkx.dijkstra_search` to stop."""
455
+
456
+
457
+ class BasisSearchVisitor(rustworkx.visit.DijkstraVisitor):
458
+ """Handles events emitted during `rustworkx.dijkstra_search`."""
459
+
460
+ def __init__(self, graph, source_basis, target_basis):
461
+ self.graph = graph
462
+ self.target_basis = set(target_basis)
463
+ self._source_gates_remain = set(source_basis)
464
+ self._num_gates_remain_for_rule = {}
465
+ save_index = -1
466
+ for edata in self.graph.edges():
467
+ if save_index == edata.index:
468
+ continue
469
+ self._num_gates_remain_for_rule[edata.index] = edata.num_gates
470
+ save_index = edata.index
471
+
472
+ self._basis_transforms = []
473
+ self._predecessors = {}
474
+ self._opt_cost_map = {}
475
+
476
+ def discover_vertex(self, v, score):
477
+ gate = self.graph[v].key
478
+ self._source_gates_remain.discard(gate)
479
+ self._opt_cost_map[gate] = score
480
+ rule = self._predecessors.get(gate, None)
481
+ if rule is not None:
482
+ logger.debug(
483
+ "Gate %s generated using rule \n%s\n with total cost of %s.",
484
+ gate.name,
485
+ rule.circuit,
486
+ score,
487
+ )
488
+ self._basis_transforms.append((gate.name, gate.num_qubits, rule.params, rule.circuit))
489
+ # we can stop the search if we have found all gates in the original circuit.
490
+ if not self._source_gates_remain:
491
+ # if we start from source gates and apply `basis_transforms` in reverse order, we'll end
492
+ # up with gates in the target basis. Note though that `basis_transforms` may include
493
+ # additional transformations that are not required to map our source gates to the given
494
+ # target basis.
495
+ self._basis_transforms.reverse()
496
+ raise StopIfBasisRewritable
497
+
498
+ def examine_edge(self, edge):
499
+ _, target, edata = edge
500
+ if edata is None:
501
+ return
502
+
503
+ self._num_gates_remain_for_rule[edata.index] -= 1
504
+
505
+ target = self.graph[target].key
506
+ # if there are gates in this `rule` that we have not yet generated, we can't apply
507
+ # this `rule`. if `target` is already in basis, it's not beneficial to use this rule.
508
+ if self._num_gates_remain_for_rule[edata.index] > 0 or target in self.target_basis:
509
+ raise rustworkx.visit.PruneSearch
510
+
511
+ def edge_relaxed(self, edge):
512
+ _, target, edata = edge
513
+ if edata is not None:
514
+ gate = self.graph[target].key
515
+ self._predecessors[gate] = edata.rule
516
+
517
+ def edge_cost(self, edge_data):
518
+ """Returns the cost of an edge.
519
+
520
+ This function computes the cost of this edge rule by summing
521
+ the costs of all gates in the rule equivalence circuit. In the
522
+ end, we need to subtract the cost of the source since `dijkstra`
523
+ will later add it.
524
+ """
525
+
526
+ if edge_data is None:
527
+ # the target of the edge is a gate in the target basis,
528
+ # so we return a default value of 1.
529
+ return 1
530
+
531
+ cost_tot = 0
532
+ for instruction in edge_data.rule.circuit:
533
+ key = Key(name=instruction.name, num_qubits=len(instruction.qubits))
534
+ cost_tot += self._opt_cost_map[key]
535
+
536
+ return cost_tot - self._opt_cost_map[edge_data.source]
537
+
538
+ @property
539
+ def basis_transforms(self):
540
+ """Returns the gate basis transforms."""
541
+ return self._basis_transforms
542
+
543
+
544
+ def _basis_search(equiv_lib, source_basis, target_basis):
545
+ """Search for a set of transformations from source_basis to target_basis.
546
+
547
+ Args:
548
+ equiv_lib (EquivalenceLibrary): Source of valid translations
549
+ source_basis (Set[Tuple[gate_name: str, gate_num_qubits: int]]): Starting basis.
550
+ target_basis (Set[gate_name: str]): Target basis.
551
+
552
+ Returns:
553
+ Optional[List[Tuple[gate, equiv_params, equiv_circuit]]]: List of (gate,
554
+ equiv_params, equiv_circuit) tuples tuples which, if applied in order
555
+ will map from source_basis to target_basis. Returns None if no path
556
+ was found.
557
+ """
558
+
559
+ logger.debug("Begining basis search from %s to %s.", source_basis, target_basis)
560
+
561
+ source_basis = {
562
+ (gate_name, gate_num_qubits)
563
+ for gate_name, gate_num_qubits in source_basis
564
+ if gate_name not in target_basis
565
+ }
566
+
567
+ # if source basis is empty, no work to be done.
568
+ if not source_basis:
569
+ return []
570
+
571
+ # This is only necessary since gates in target basis are currently reported by
572
+ # their names and we need to have in addition the number of qubits they act on.
573
+ target_basis_keys = [key for key in equiv_lib.keys() if key.name in target_basis]
574
+
575
+ graph = equiv_lib.graph
576
+ vis = BasisSearchVisitor(graph, source_basis, target_basis_keys)
577
+
578
+ # we add a dummy node and connect it with gates in the target basis.
579
+ # we'll start the search from this dummy node.
580
+ dummy = graph.add_node(NodeData(key="key", equivs=[("dummy starting node", 0)]))
581
+
582
+ try:
583
+ graph.add_edges_from_no_data(
584
+ [(dummy, equiv_lib.node_index(key)) for key in target_basis_keys]
585
+ )
586
+ rtn = None
587
+ try:
588
+ rustworkx.digraph_dijkstra_search(graph, [dummy], vis.edge_cost, vis)
589
+ except StopIfBasisRewritable:
590
+ rtn = vis.basis_transforms
591
+
592
+ logger.debug("Transformation path:")
593
+ for gate_name, gate_num_qubits, params, equiv in rtn:
594
+ logger.debug("%s/%s => %s\n%s", gate_name, gate_num_qubits, params, equiv)
595
+ finally:
596
+ # Remove dummy node in order to return graph to original state
597
+ graph.remove_node(dummy)
598
+
599
+ return rtn
600
+
601
+
602
+ def _compose_transforms(basis_transforms, source_basis, source_dag):
603
+ """Compose a set of basis transforms into a set of replacements.
604
+
605
+ Args:
606
+ basis_transforms (List[Tuple[gate_name, params, equiv]]): List of
607
+ transforms to compose.
608
+ source_basis (Set[Tuple[gate_name: str, gate_num_qubits: int]]): Names
609
+ of gates which need to be translated.
610
+ source_dag (DAGCircuit): DAG with example gates from source_basis.
611
+ (Used to determine num_params for gate in source_basis.)
612
+
613
+ Returns:
614
+ Dict[gate_name, Tuple(params, dag)]: Dictionary mapping between each gate
615
+ in source_basis and a DAGCircuit instance to replace it. Gates in
616
+ source_basis but not affected by basis_transforms will be included
617
+ as a key mapping to itself.
618
+ """
619
+ example_gates = _get_example_gates(source_dag)
620
+ mapped_instrs = {}
621
+
622
+ for gate_name, gate_num_qubits in source_basis:
623
+ # Need to grab a gate instance to find num_qubits and num_params.
624
+ # Can be removed following https://github.com/Qiskit/qiskit-terra/pull/3947 .
625
+ example_gate = example_gates[gate_name, gate_num_qubits]
626
+ num_params = len(example_gate.params)
627
+
628
+ placeholder_params = ParameterVector(gate_name, num_params)
629
+ placeholder_gate = Gate(gate_name, gate_num_qubits, list(placeholder_params))
630
+ placeholder_gate.params = list(placeholder_params)
631
+
632
+ dag = DAGCircuit()
633
+ qr = QuantumRegister(gate_num_qubits)
634
+ dag.add_qreg(qr)
635
+ dag.apply_operation_back(placeholder_gate, qr, (), check=False)
636
+ mapped_instrs[gate_name, gate_num_qubits] = placeholder_params, dag
637
+
638
+ for gate_name, gate_num_qubits, equiv_params, equiv in basis_transforms:
639
+ logger.debug(
640
+ "Composing transform step: %s/%s %s =>\n%s",
641
+ gate_name,
642
+ gate_num_qubits,
643
+ equiv_params,
644
+ equiv,
645
+ )
646
+
647
+ for mapped_instr_name, (dag_params, dag) in mapped_instrs.items():
648
+ doomed_nodes = [
649
+ node
650
+ for node in dag.op_nodes()
651
+ if (node.name, node.num_qubits) == (gate_name, gate_num_qubits)
652
+ ]
653
+
654
+ if doomed_nodes and logger.isEnabledFor(logging.DEBUG):
655
+
656
+ logger.debug(
657
+ "Updating transform for mapped instr %s %s from \n%s",
658
+ mapped_instr_name,
659
+ dag_params,
660
+ dag_to_circuit(dag, copy_operations=False),
661
+ )
662
+
663
+ for node in doomed_nodes:
664
+
665
+ replacement = equiv.assign_parameters(dict(zip_longest(equiv_params, node.params)))
666
+
667
+ replacement_dag = circuit_to_dag(replacement)
668
+
669
+ dag.substitute_node_with_dag(node, replacement_dag)
670
+
671
+ if doomed_nodes and logger.isEnabledFor(logging.DEBUG):
672
+
673
+ logger.debug(
674
+ "Updated transform for mapped instr %s %s to\n%s",
675
+ mapped_instr_name,
676
+ dag_params,
677
+ dag_to_circuit(dag, copy_operations=False),
678
+ )
679
+
680
+ return mapped_instrs
681
+
682
+
683
+ def _get_example_gates(source_dag):
684
+ def recurse(dag, example_gates=None):
685
+ example_gates = example_gates or {}
686
+ for node in dag.op_nodes():
687
+ example_gates[(node.name, node.num_qubits)] = node
688
+ if node.name in CONTROL_FLOW_OP_NAMES:
689
+ for block in node.op.blocks:
690
+ example_gates = recurse(circuit_to_dag(block), example_gates)
691
+ return example_gates
692
+
693
+ return recurse(source_dag)