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,819 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2019.
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
+ Matrix Operator class.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import copy as _copy
20
+ import re
21
+ from numbers import Number
22
+ from typing import TYPE_CHECKING
23
+
24
+ import numpy as np
25
+
26
+ from qiskit import _numpy_compat
27
+ from qiskit.circuit.instruction import Instruction
28
+ from qiskit.circuit.library.standard_gates import HGate, IGate, SGate, TGate, XGate, YGate, ZGate
29
+ from qiskit.circuit.operation import Operation
30
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
31
+ from qiskit.exceptions import QiskitError
32
+ from qiskit.quantum_info.operators.base_operator import BaseOperator
33
+ from qiskit.quantum_info.operators.linear_op import LinearOp
34
+ from qiskit.quantum_info.operators.mixins import generate_apidocs
35
+ from qiskit.quantum_info.operators.predicates import is_unitary_matrix, matrix_equal
36
+
37
+ if TYPE_CHECKING:
38
+ from qiskit.transpiler.layout import Layout
39
+
40
+
41
+ class Operator(LinearOp):
42
+ r"""Matrix operator class
43
+
44
+ This represents a matrix operator :math:`M` that will
45
+ :meth:`~Statevector.evolve` a :class:`Statevector` :math:`|\psi\rangle`
46
+ by matrix-vector multiplication
47
+
48
+ .. math::
49
+
50
+ |\psi\rangle \mapsto M|\psi\rangle,
51
+
52
+ and will :meth:`~DensityMatrix.evolve` a :class:`DensityMatrix` :math:`\rho`
53
+ by left and right multiplication
54
+
55
+ .. math::
56
+
57
+ \rho \mapsto M \rho M^\dagger.
58
+
59
+ For example, the following operator :math:`M = X` applied to the zero state
60
+ :math:`|\psi\rangle=|0\rangle (\rho = |0\rangle\langle 0|)` changes it to the
61
+ one state :math:`|\psi\rangle=|1\rangle (\rho = |1\rangle\langle 1|)`:
62
+
63
+ .. code-block:: python
64
+
65
+ >>> import numpy as np
66
+ >>> from qiskit.quantum_info import Operator
67
+ >>> op = Operator(np.array([[0.0, 1.0], [1.0, 0.0]])) # Represents Pauli X operator
68
+
69
+ >>> from qiskit.quantum_info import Statevector
70
+ >>> sv = Statevector(np.array([1.0, 0.0]))
71
+ >>> sv.evolve(op)
72
+ Statevector([0.+0.j, 1.+0.j],
73
+ dims=(2,))
74
+
75
+ >>> from qiskit.quantum_info import DensityMatrix
76
+ >>> dm = DensityMatrix(np.array([[1.0, 0.0], [0.0, 0.0]]))
77
+ >>> dm.evolve(op)
78
+ DensityMatrix([[0.+0.j, 0.+0.j],
79
+ [0.+0.j, 1.+0.j]],
80
+ dims=(2,))
81
+
82
+ """
83
+
84
+ def __init__(
85
+ self,
86
+ data: QuantumCircuit | Operation | BaseOperator | np.ndarray,
87
+ input_dims: tuple | None = None,
88
+ output_dims: tuple | None = None,
89
+ ):
90
+ """Initialize an operator object.
91
+
92
+ Args:
93
+ data (QuantumCircuit or Operation or BaseOperator or matrix):
94
+ data to initialize operator.
95
+ input_dims (tuple): the input subsystem dimensions.
96
+ [Default: None]
97
+ output_dims (tuple): the output subsystem dimensions.
98
+ [Default: None]
99
+
100
+ Raises:
101
+ QiskitError: if input data cannot be initialized as an operator.
102
+
103
+ Additional Information:
104
+ If the input or output dimensions are None, they will be
105
+ automatically determined from the input data. If the input data is
106
+ a Numpy array of shape (2**N, 2**N) qubit systems will be used. If
107
+ the input operator is not an N-qubit operator, it will assign a
108
+ single subsystem with dimension specified by the shape of the input.
109
+ Note that two operators initialized via this method are only considered equivalent if they
110
+ match up to their canonical qubit order (or: permutation). See :meth:`.Operator.from_circuit`
111
+ to specify a different qubit permutation.
112
+ """
113
+ op_shape = None
114
+ if isinstance(data, (list, np.ndarray)):
115
+ # Default initialization from list or numpy array matrix
116
+ self._data = np.asarray(data, dtype=complex)
117
+ elif isinstance(data, (QuantumCircuit, Operation)):
118
+ # If the input is a Terra QuantumCircuit or Operation we
119
+ # perform a simulation to construct the unitary operator.
120
+ # This will only work if the circuit or instruction can be
121
+ # defined in terms of unitary gate instructions which have a
122
+ # 'to_matrix' method defined. Any other instructions such as
123
+ # conditional gates, measure, or reset will cause an
124
+ # exception to be raised.
125
+ self._data = self._init_instruction(data).data
126
+ elif hasattr(data, "to_operator"):
127
+ # If the data object has a 'to_operator' attribute this is given
128
+ # higher preference than the 'to_matrix' method for initializing
129
+ # an Operator object.
130
+ data = data.to_operator()
131
+ self._data = data.data
132
+ op_shape = data._op_shape
133
+ elif hasattr(data, "to_matrix"):
134
+ # If no 'to_operator' attribute exists we next look for a
135
+ # 'to_matrix' attribute to a matrix that will be cast into
136
+ # a complex numpy matrix.
137
+ self._data = np.asarray(data.to_matrix(), dtype=complex)
138
+ else:
139
+ raise QiskitError("Invalid input data format for Operator")
140
+
141
+ super().__init__(
142
+ op_shape=op_shape,
143
+ input_dims=input_dims,
144
+ output_dims=output_dims,
145
+ shape=self._data.shape,
146
+ )
147
+
148
+ def __array__(self, dtype=None, copy=_numpy_compat.COPY_ONLY_IF_NEEDED):
149
+ dtype = self.data.dtype if dtype is None else dtype
150
+ return np.array(self.data, dtype=dtype, copy=copy)
151
+
152
+ def __repr__(self):
153
+ prefix = "Operator("
154
+ pad = len(prefix) * " "
155
+ return (
156
+ f"{prefix}{np.array2string(self.data, separator=', ', prefix=prefix)},\n"
157
+ f"{pad}input_dims={self.input_dims()}, output_dims={self.output_dims()})"
158
+ )
159
+
160
+ def __eq__(self, other):
161
+ """Test if two Operators are equal."""
162
+ if not super().__eq__(other):
163
+ return False
164
+ return np.allclose(self.data, other.data, rtol=self.rtol, atol=self.atol)
165
+
166
+ @property
167
+ def data(self):
168
+ """The underlying Numpy array."""
169
+ return self._data
170
+
171
+ @property
172
+ def settings(self):
173
+ """Return operator settings."""
174
+ return {
175
+ "data": self._data,
176
+ "input_dims": self.input_dims(),
177
+ "output_dims": self.output_dims(),
178
+ }
179
+
180
+ def draw(self, output=None, **drawer_args):
181
+ """Return a visualization of the Operator.
182
+
183
+ **repr**: String of the state's ``__repr__``.
184
+
185
+ **text**: ASCII TextMatrix that can be printed in the console.
186
+
187
+ **latex**: An IPython Latex object for displaying in Jupyter Notebooks.
188
+
189
+ **latex_source**: Raw, uncompiled ASCII source to generate array using LaTeX.
190
+
191
+ Args:
192
+ output (str): Select the output method to use for drawing the
193
+ state. Valid choices are `repr`, `text`, `latex`, `latex_source`,
194
+ Default is `repr`.
195
+ drawer_args: Arguments to be passed directly to the relevant drawing
196
+ function or constructor (`TextMatrix()`, `array_to_latex()`).
197
+ See the relevant function under `qiskit.visualization` for that function's
198
+ documentation.
199
+
200
+ Returns:
201
+ :class:`str` or :class:`TextMatrix` or :class:`IPython.display.Latex`:
202
+ Drawing of the Operator.
203
+
204
+ Raises:
205
+ ValueError: when an invalid output method is selected.
206
+
207
+ """
208
+ # pylint: disable=cyclic-import
209
+ from qiskit.visualization import array_to_latex
210
+
211
+ default_output = "repr"
212
+ if output is None:
213
+ output = default_output
214
+
215
+ if output == "repr":
216
+ return self.__repr__()
217
+
218
+ elif output == "text":
219
+ from qiskit.visualization.state_visualization import TextMatrix
220
+
221
+ return TextMatrix(self, **drawer_args)
222
+
223
+ elif output == "latex":
224
+ return array_to_latex(self, **drawer_args)
225
+
226
+ elif output == "latex_source":
227
+ return array_to_latex(self, source=True, **drawer_args)
228
+
229
+ else:
230
+ raise ValueError(
231
+ f"""'{output}' is not a valid option for drawing {type(self).__name__} objects.
232
+ Please choose from: 'text', 'latex', or 'latex_source'."""
233
+ )
234
+
235
+ def _ipython_display_(self):
236
+ out = self.draw()
237
+ if isinstance(out, str):
238
+ print(out)
239
+ else:
240
+ from IPython.display import display
241
+
242
+ display(out)
243
+
244
+ @classmethod
245
+ def from_label(cls, label: str) -> Operator:
246
+ """Return a tensor product of single-qubit operators.
247
+
248
+ Args:
249
+ label (string): single-qubit operator string.
250
+
251
+ Returns:
252
+ Operator: The N-qubit operator.
253
+
254
+ Raises:
255
+ QiskitError: if the label contains invalid characters, or the
256
+ length of the label is larger than an explicitly
257
+ specified num_qubits.
258
+
259
+ Additional Information:
260
+ The labels correspond to the single-qubit matrices:
261
+ 'I': [[1, 0], [0, 1]]
262
+ 'X': [[0, 1], [1, 0]]
263
+ 'Y': [[0, -1j], [1j, 0]]
264
+ 'Z': [[1, 0], [0, -1]]
265
+ 'H': [[1, 1], [1, -1]] / sqrt(2)
266
+ 'S': [[1, 0], [0 , 1j]]
267
+ 'T': [[1, 0], [0, (1+1j) / sqrt(2)]]
268
+ '0': [[1, 0], [0, 0]]
269
+ '1': [[0, 0], [0, 1]]
270
+ '+': [[0.5, 0.5], [0.5 , 0.5]]
271
+ '-': [[0.5, -0.5], [-0.5 , 0.5]]
272
+ 'r': [[0.5, -0.5j], [0.5j , 0.5]]
273
+ 'l': [[0.5, 0.5j], [-0.5j , 0.5]]
274
+ """
275
+ # Check label is valid
276
+ label_mats = {
277
+ "I": IGate().to_matrix(),
278
+ "X": XGate().to_matrix(),
279
+ "Y": YGate().to_matrix(),
280
+ "Z": ZGate().to_matrix(),
281
+ "H": HGate().to_matrix(),
282
+ "S": SGate().to_matrix(),
283
+ "T": TGate().to_matrix(),
284
+ "0": np.array([[1, 0], [0, 0]], dtype=complex),
285
+ "1": np.array([[0, 0], [0, 1]], dtype=complex),
286
+ "+": np.array([[0.5, 0.5], [0.5, 0.5]], dtype=complex),
287
+ "-": np.array([[0.5, -0.5], [-0.5, 0.5]], dtype=complex),
288
+ "r": np.array([[0.5, -0.5j], [0.5j, 0.5]], dtype=complex),
289
+ "l": np.array([[0.5, 0.5j], [-0.5j, 0.5]], dtype=complex),
290
+ }
291
+ if re.match(r"^[IXYZHST01rl\-+]+$", label) is None:
292
+ raise QiskitError("Label contains invalid characters.")
293
+ # Initialize an identity matrix and apply each gate
294
+ num_qubits = len(label)
295
+ op = Operator(np.eye(2**num_qubits, dtype=complex))
296
+ for qubit, char in enumerate(reversed(label)):
297
+ if char != "I":
298
+ op = op.compose(label_mats[char], qargs=[qubit])
299
+ return op
300
+
301
+ def apply_permutation(self, perm: list, front: bool = False) -> Operator:
302
+ """Modifies operator's data by composing it with a permutation.
303
+
304
+ Args:
305
+ perm (list): permutation pattern, describing which qubits
306
+ occupy the positions 0, 1, 2, etc. after applying the permutation.
307
+ front (bool): When set to ``True`` the permutation is applied before the
308
+ operator, when set to ``False`` the permutation is applied after the
309
+ operator.
310
+ Returns:
311
+ Operator: The modified operator.
312
+
313
+ Raises:
314
+ QiskitError: if the size of the permutation pattern does not match the
315
+ dimensions of the operator.
316
+ """
317
+
318
+ # See https://github.com/Qiskit/qiskit-terra/pull/9403 for the math
319
+ # behind the following code.
320
+
321
+ inv_perm = np.argsort(perm)
322
+ raw_shape_l = self._op_shape.dims_l()
323
+ n_dims_l = len(raw_shape_l)
324
+ raw_shape_r = self._op_shape.dims_r()
325
+ n_dims_r = len(raw_shape_r)
326
+
327
+ if front:
328
+ # The permutation is applied first, the operator is applied after;
329
+ # however, in terms of matrices, we compute [O][P].
330
+
331
+ if len(perm) != n_dims_r:
332
+ raise QiskitError(
333
+ "The size of the permutation pattern does not match dimensions of the operator."
334
+ )
335
+
336
+ # shape: original on left, permuted on right
337
+ shape_l = self._op_shape.dims_l()
338
+ shape_r = tuple(raw_shape_r[n_dims_r - n - 1] for n in reversed(perm))
339
+
340
+ # axes order: id on left, inv-permuted on right
341
+ axes_l = tuple(x for x in range(self._op_shape._num_qargs_l))
342
+ axes_r = tuple(self._op_shape._num_qargs_l + x for x in (np.argsort(perm[::-1]))[::-1])
343
+
344
+ # updated shape: original on left, permuted on right
345
+ new_shape_l = self._op_shape.dims_l()
346
+ new_shape_r = tuple(raw_shape_r[n_dims_r - n - 1] for n in reversed(inv_perm))
347
+
348
+ else:
349
+ # The operator is applied first, the permutation is applied after;
350
+ # however, in terms of matrices, we compute [P][O].
351
+
352
+ if len(perm) != n_dims_l:
353
+ raise QiskitError(
354
+ "The size of the permutation pattern does not match dimensions of the operator."
355
+ )
356
+
357
+ # shape: inv-permuted on left, original on right
358
+ shape_l = tuple(raw_shape_l[n_dims_l - n - 1] for n in reversed(inv_perm))
359
+ shape_r = self._op_shape.dims_r()
360
+
361
+ # axes order: permuted on left, id on right
362
+ axes_l = tuple((np.argsort(inv_perm[::-1]))[::-1])
363
+ axes_r = tuple(
364
+ self._op_shape._num_qargs_l + x for x in range(self._op_shape._num_qargs_r)
365
+ )
366
+
367
+ # updated shape: permuted on left, original on right
368
+ new_shape_l = tuple(raw_shape_l[n_dims_l - n - 1] for n in reversed(perm))
369
+ new_shape_r = self._op_shape.dims_r()
370
+
371
+ # Computing the new operator
372
+ split_shape = shape_l + shape_r
373
+ axes_order = axes_l + axes_r
374
+ new_mat = (
375
+ self._data.reshape(split_shape).transpose(axes_order).reshape(self._op_shape.shape)
376
+ )
377
+ new_op = Operator(new_mat, input_dims=new_shape_r, output_dims=new_shape_l)
378
+ return new_op
379
+
380
+ @classmethod
381
+ def from_circuit(
382
+ cls,
383
+ circuit: QuantumCircuit,
384
+ ignore_set_layout: bool = False,
385
+ layout: Layout | None = None,
386
+ final_layout: Layout | None = None,
387
+ ) -> Operator:
388
+ """Create a new Operator object from a :class:`.QuantumCircuit`
389
+
390
+ While a :class:`~.QuantumCircuit` object can passed directly as ``data``
391
+ to the class constructor this provides no options on how the circuit
392
+ is used to create an :class:`.Operator`. This constructor method lets
393
+ you control how the :class:`.Operator` is created so it can be adjusted
394
+ for a particular use case.
395
+
396
+ By default this constructor method will permute the qubits based on a
397
+ configured initial layout (i.e. after it was transpiled). It also
398
+ provides an option to manually provide a :class:`.Layout` object
399
+ directly.
400
+
401
+ Args:
402
+ circuit (QuantumCircuit): The :class:`.QuantumCircuit` to create an Operator
403
+ object from.
404
+ ignore_set_layout (bool): When set to ``True`` if the input ``circuit``
405
+ has a layout set it will be ignored
406
+ layout (Layout): If specified this kwarg can be used to specify a
407
+ particular layout to use to permute the qubits in the created
408
+ :class:`.Operator`. If this is specified it will be used instead
409
+ of a layout contained in the ``circuit`` input. If specified
410
+ the virtual bits in the :class:`~.Layout` must be present in the
411
+ ``circuit`` input.
412
+ final_layout (Layout): If specified this kwarg can be used to represent the
413
+ output permutation caused by swap insertions during the routing stage
414
+ of the transpiler.
415
+ Returns:
416
+ Operator: An operator representing the input circuit
417
+ """
418
+
419
+ if layout is None:
420
+ if not ignore_set_layout:
421
+ layout = getattr(circuit, "_layout", None)
422
+ else:
423
+ from qiskit.transpiler.layout import TranspileLayout # pylint: disable=cyclic-import
424
+
425
+ layout = TranspileLayout(
426
+ initial_layout=layout,
427
+ input_qubit_mapping={qubit: index for index, qubit in enumerate(circuit.qubits)},
428
+ )
429
+
430
+ initial_layout = layout.initial_layout if layout is not None else None
431
+
432
+ if final_layout is None:
433
+ if not ignore_set_layout and layout is not None:
434
+ final_layout = getattr(layout, "final_layout", None)
435
+
436
+ from qiskit.synthesis.permutation.permutation_utils import _inverse_pattern
437
+
438
+ op = Operator(circuit)
439
+
440
+ if initial_layout is not None:
441
+ input_qubits = [None] * len(layout.input_qubit_mapping)
442
+ for q, p in layout.input_qubit_mapping.items():
443
+ input_qubits[p] = q
444
+
445
+ initial_permutation = initial_layout.to_permutation(input_qubits)
446
+ initial_permutation_inverse = _inverse_pattern(initial_permutation)
447
+ op = op.apply_permutation(initial_permutation, True)
448
+
449
+ if final_layout is not None:
450
+ final_permutation = final_layout.to_permutation(circuit.qubits)
451
+ final_permutation_inverse = _inverse_pattern(final_permutation)
452
+ op = op.apply_permutation(final_permutation_inverse, False)
453
+ op = op.apply_permutation(initial_permutation_inverse, False)
454
+ elif final_layout is not None:
455
+ final_permutation = final_layout.to_permutation(circuit.qubits)
456
+ final_permutation_inverse = _inverse_pattern(final_permutation)
457
+ op = op.apply_permutation(final_permutation_inverse, False)
458
+
459
+ return op
460
+
461
+ def is_unitary(self, atol=None, rtol=None):
462
+ """Return True if operator is a unitary matrix."""
463
+ if atol is None:
464
+ atol = self.atol
465
+ if rtol is None:
466
+ rtol = self.rtol
467
+ return is_unitary_matrix(self._data, rtol=rtol, atol=atol)
468
+
469
+ def to_operator(self) -> Operator:
470
+ """Convert operator to matrix operator class"""
471
+ return self
472
+
473
+ def to_instruction(self):
474
+ """Convert to a UnitaryGate instruction."""
475
+ # pylint: disable=cyclic-import
476
+ from qiskit.circuit.library.generalized_gates.unitary import UnitaryGate
477
+
478
+ return UnitaryGate(self.data)
479
+
480
+ def conjugate(self):
481
+ # Make a shallow copy and update array
482
+ ret = _copy.copy(self)
483
+ ret._data = np.conj(self._data)
484
+ return ret
485
+
486
+ def transpose(self):
487
+ # Make a shallow copy and update array
488
+ ret = _copy.copy(self)
489
+ ret._data = np.transpose(self._data)
490
+ ret._op_shape = self._op_shape.transpose()
491
+ return ret
492
+
493
+ def compose(self, other: Operator, qargs: list | None = None, front: bool = False) -> Operator:
494
+ if qargs is None:
495
+ qargs = getattr(other, "qargs", None)
496
+ if not isinstance(other, Operator):
497
+ other = Operator(other)
498
+
499
+ # Validate dimensions are compatible and return the composed
500
+ # operator dimensions
501
+ new_shape = self._op_shape.compose(other._op_shape, qargs, front)
502
+ input_dims = new_shape.dims_r()
503
+ output_dims = new_shape.dims_l()
504
+
505
+ # Full composition of operators
506
+ if qargs is None:
507
+ if front:
508
+ # Composition self * other
509
+ data = np.dot(self._data, other.data)
510
+ else:
511
+ # Composition other * self
512
+ data = np.dot(other.data, self._data)
513
+ ret = Operator(data, input_dims, output_dims)
514
+ ret._op_shape = new_shape
515
+ return ret
516
+
517
+ # Compose with other on subsystem
518
+ num_qargs_l, num_qargs_r = self._op_shape.num_qargs
519
+ if front:
520
+ num_indices = num_qargs_r
521
+ shift = num_qargs_l
522
+ right_mul = True
523
+ else:
524
+ num_indices = num_qargs_l
525
+ shift = 0
526
+ right_mul = False
527
+
528
+ # Reshape current matrix
529
+ # Note that we must reverse the subsystem dimension order as
530
+ # qubit 0 corresponds to the right-most position in the tensor
531
+ # product, which is the last tensor wire index.
532
+ tensor = np.reshape(self.data, self._op_shape.tensor_shape)
533
+ mat = np.reshape(other.data, other._op_shape.tensor_shape)
534
+ indices = [num_indices - 1 - qubit for qubit in qargs]
535
+ final_shape = [int(np.prod(output_dims)), int(np.prod(input_dims))]
536
+ data = np.reshape(
537
+ Operator._einsum_matmul(tensor, mat, indices, shift, right_mul), final_shape
538
+ )
539
+ ret = Operator(data, input_dims, output_dims)
540
+ ret._op_shape = new_shape
541
+ return ret
542
+
543
+ def power(self, n: float) -> Operator:
544
+ """Return the matrix power of the operator.
545
+
546
+ Args:
547
+ n (float): the power to raise the matrix to.
548
+
549
+ Returns:
550
+ Operator: the resulting operator ``O ** n``.
551
+
552
+ Raises:
553
+ QiskitError: if the input and output dimensions of the operator
554
+ are not equal.
555
+ """
556
+ if self.input_dims() != self.output_dims():
557
+ raise QiskitError("Can only power with input_dims = output_dims.")
558
+ ret = _copy.copy(self)
559
+ if isinstance(n, int):
560
+ ret._data = np.linalg.matrix_power(self.data, n)
561
+ else:
562
+ import scipy.linalg
563
+
564
+ # Experimentally, for fractional powers this seems to be 3x faster than
565
+ # calling scipy.linalg.fractional_matrix_power(self.data, n)
566
+ decomposition, unitary = scipy.linalg.schur(self.data, output="complex")
567
+ decomposition_diagonal = decomposition.diagonal()
568
+ decomposition_power = [pow(element, n) for element in decomposition_diagonal]
569
+ unitary_power = unitary @ np.diag(decomposition_power) @ unitary.conj().T
570
+ ret._data = unitary_power
571
+ return ret
572
+
573
+ def tensor(self, other: Operator) -> Operator:
574
+ if not isinstance(other, Operator):
575
+ other = Operator(other)
576
+ return self._tensor(self, other)
577
+
578
+ def expand(self, other: Operator) -> Operator:
579
+ if not isinstance(other, Operator):
580
+ other = Operator(other)
581
+ return self._tensor(other, self)
582
+
583
+ @classmethod
584
+ def _tensor(cls, a, b):
585
+ ret = _copy.copy(a)
586
+ ret._op_shape = a._op_shape.tensor(b._op_shape)
587
+ ret._data = np.kron(a.data, b.data)
588
+ return ret
589
+
590
+ def _add(self, other, qargs=None):
591
+ """Return the operator self + other.
592
+
593
+ If ``qargs`` are specified the other operator will be added
594
+ assuming it is identity on all other subsystems.
595
+
596
+ Args:
597
+ other (Operator): an operator object.
598
+ qargs (None or list): optional subsystems to add on
599
+ (Default: None)
600
+
601
+ Returns:
602
+ Operator: the operator self + other.
603
+
604
+ Raises:
605
+ QiskitError: if other is not an operator, or has incompatible
606
+ dimensions.
607
+ """
608
+ # pylint: disable=cyclic-import
609
+ from qiskit.quantum_info.operators.scalar_op import ScalarOp
610
+
611
+ if qargs is None:
612
+ qargs = getattr(other, "qargs", None)
613
+
614
+ if not isinstance(other, Operator):
615
+ other = Operator(other)
616
+
617
+ self._op_shape._validate_add(other._op_shape, qargs)
618
+ other = ScalarOp._pad_with_identity(self, other, qargs)
619
+
620
+ ret = _copy.copy(self)
621
+ ret._data = self.data + other.data
622
+ return ret
623
+
624
+ def _multiply(self, other):
625
+ """Return the operator self * other.
626
+
627
+ Args:
628
+ other (complex): a complex number.
629
+
630
+ Returns:
631
+ Operator: the operator other * self.
632
+
633
+ Raises:
634
+ QiskitError: if other is not a valid complex number.
635
+ """
636
+ if not isinstance(other, Number):
637
+ raise QiskitError("other is not a number")
638
+ ret = _copy.copy(self)
639
+ ret._data = other * self._data
640
+ return ret
641
+
642
+ def equiv(self, other: Operator, rtol: float | None = None, atol: float | None = None) -> bool:
643
+ """Return True if operators are equivalent up to global phase.
644
+
645
+ Args:
646
+ other (Operator): an operator object.
647
+ rtol (float): relative tolerance value for comparison.
648
+ atol (float): absolute tolerance value for comparison.
649
+
650
+ Returns:
651
+ bool: True if operators are equivalent up to global phase.
652
+ """
653
+ if not isinstance(other, Operator):
654
+ try:
655
+ other = Operator(other)
656
+ except QiskitError:
657
+ return False
658
+ if self.dim != other.dim:
659
+ return False
660
+ if atol is None:
661
+ atol = self.atol
662
+ if rtol is None:
663
+ rtol = self.rtol
664
+ return matrix_equal(self.data, other.data, ignore_phase=True, rtol=rtol, atol=atol)
665
+
666
+ def reverse_qargs(self) -> Operator:
667
+ r"""Return an Operator with reversed subsystem ordering.
668
+
669
+ For a tensor product operator this is equivalent to reversing
670
+ the order of tensor product subsystems. For an operator
671
+ :math:`A = A_{n-1} \otimes ... \otimes A_0`
672
+ the returned operator will be
673
+ :math:`A_0 \otimes ... \otimes A_{n-1}`.
674
+
675
+ Returns:
676
+ Operator: the operator with reversed subsystem order.
677
+ """
678
+ ret = _copy.copy(self)
679
+ axes = tuple(range(self._op_shape._num_qargs_l - 1, -1, -1))
680
+ axes = axes + tuple(len(axes) + i for i in axes)
681
+ ret._data = np.reshape(
682
+ np.transpose(np.reshape(self.data, self._op_shape.tensor_shape), axes),
683
+ self._op_shape.shape,
684
+ )
685
+ ret._op_shape = self._op_shape.reverse()
686
+ return ret
687
+
688
+ def to_matrix(self):
689
+ """Convert operator to NumPy matrix."""
690
+ return self.data
691
+
692
+ @classmethod
693
+ def _einsum_matmul(cls, tensor, mat, indices, shift=0, right_mul=False):
694
+ """Perform a contraction using Numpy.einsum
695
+
696
+ Args:
697
+ tensor (np.array): a vector or matrix reshaped to a rank-N tensor.
698
+ mat (np.array): a matrix reshaped to a rank-2M tensor.
699
+ indices (list): tensor indices to contract with mat.
700
+ shift (int): shift for indices of tensor to contract [Default: 0].
701
+ right_mul (bool): if True right multiply tensor by mat
702
+ (else left multiply) [Default: False].
703
+
704
+ Returns:
705
+ Numpy.ndarray: the matrix multiplied rank-N tensor.
706
+
707
+ Raises:
708
+ QiskitError: if mat is not an even rank tensor.
709
+ """
710
+ rank = tensor.ndim
711
+ rank_mat = mat.ndim
712
+ if rank_mat % 2 != 0:
713
+ raise QiskitError("Contracted matrix must have an even number of indices.")
714
+ # Get einsum indices for tensor
715
+ indices_tensor = list(range(rank))
716
+ for j, index in enumerate(indices):
717
+ indices_tensor[index + shift] = rank + j
718
+ # Get einsum indices for mat
719
+ mat_contract = list(reversed(range(rank, rank + len(indices))))
720
+ mat_free = [index + shift for index in reversed(indices)]
721
+ if right_mul:
722
+ indices_mat = mat_contract + mat_free
723
+ else:
724
+ indices_mat = mat_free + mat_contract
725
+ return np.einsum(tensor, indices_tensor, mat, indices_mat)
726
+
727
+ @classmethod
728
+ def _init_instruction(cls, instruction):
729
+ """Convert a QuantumCircuit or Operation to an Operator."""
730
+ # Initialize an identity operator of the correct size of the circuit
731
+ if hasattr(instruction, "__array__"):
732
+ return Operator(np.array(instruction, dtype=complex))
733
+
734
+ dimension = 2**instruction.num_qubits
735
+ op = Operator(np.eye(dimension))
736
+ # Convert circuit to an instruction
737
+ if isinstance(instruction, QuantumCircuit):
738
+ instruction = instruction.to_instruction()
739
+ op._append_instruction(instruction)
740
+ return op
741
+
742
+ @classmethod
743
+ def _instruction_to_matrix(cls, obj):
744
+ """Return Operator for instruction if defined or None otherwise."""
745
+ # Note: to_matrix() is not a required method for Operations, so for now
746
+ # we do not allow constructing matrices for general Operations.
747
+ # However, for backward compatibility we need to support constructing matrices
748
+ # for Cliffords, which happen to have a to_matrix() method.
749
+
750
+ # pylint: disable=cyclic-import
751
+ from qiskit.quantum_info import Clifford
752
+ from qiskit.circuit.annotated_operation import AnnotatedOperation
753
+
754
+ if not isinstance(obj, (Instruction, Clifford, AnnotatedOperation)):
755
+ raise QiskitError("Input is neither Instruction, Clifford or AnnotatedOperation.")
756
+ mat = None
757
+ if hasattr(obj, "to_matrix"):
758
+ # If instruction is a gate first we see if it has a
759
+ # `to_matrix` definition and if so use that.
760
+ try:
761
+ mat = obj.to_matrix()
762
+ except QiskitError:
763
+ pass
764
+ return mat
765
+
766
+ def _append_instruction(self, obj, qargs=None):
767
+ """Update the current Operator by apply an instruction."""
768
+ from qiskit.circuit.barrier import Barrier
769
+ from .scalar_op import ScalarOp
770
+
771
+ mat = self._instruction_to_matrix(obj)
772
+ if mat is not None:
773
+ # Perform the composition and inplace update the current state
774
+ # of the operator
775
+ op = self.compose(mat, qargs=qargs)
776
+ self._data = op.data
777
+ elif isinstance(obj, Barrier):
778
+ return
779
+ else:
780
+ # If the instruction doesn't have a matrix defined we use its
781
+ # circuit decomposition definition if it exists, otherwise we
782
+ # cannot compose this gate and raise an error.
783
+ if obj.definition is None:
784
+ raise QiskitError(f"Cannot apply Operation: {obj.name}")
785
+ if not isinstance(obj.definition, QuantumCircuit):
786
+ raise QiskitError(
787
+ f'Operation "{obj.name}" '
788
+ f"definition is {type(obj.definition)} but expected QuantumCircuit."
789
+ )
790
+ if obj.definition.global_phase:
791
+ dimension = 2**obj.num_qubits
792
+ op = self.compose(
793
+ ScalarOp(dimension, np.exp(1j * float(obj.definition.global_phase))),
794
+ qargs=qargs,
795
+ )
796
+ self._data = op.data
797
+ flat_instr = obj.definition
798
+ bit_indices = {
799
+ bit: index
800
+ for bits in [flat_instr.qubits, flat_instr.clbits]
801
+ for index, bit in enumerate(bits)
802
+ }
803
+
804
+ for instruction in flat_instr:
805
+ if instruction.clbits:
806
+ raise QiskitError(
807
+ "Cannot apply operation with classical bits:"
808
+ f" {instruction.operation.name}"
809
+ )
810
+ # Get the integer position of the flat register
811
+ if qargs is None:
812
+ new_qargs = [bit_indices[tup] for tup in instruction.qubits]
813
+ else:
814
+ new_qargs = [qargs[bit_indices[tup]] for tup in instruction.qubits]
815
+ self._append_instruction(instruction.operation, qargs=new_qargs)
816
+
817
+
818
+ # Update docstrings for API docs
819
+ generate_apidocs(Operator)