qiskit 1.3.0__cp39-abi3-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (836) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +146 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/assembler/__init__.py +42 -0
  6. qiskit/assembler/assemble_circuits.py +451 -0
  7. qiskit/assembler/assemble_schedules.py +367 -0
  8. qiskit/assembler/disassemble.py +310 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +1313 -0
  11. qiskit/circuit/_classical_resource_map.py +148 -0
  12. qiskit/circuit/_standard_gates_commutations.py +3849 -0
  13. qiskit/circuit/_utils.py +167 -0
  14. qiskit/circuit/add_control.py +274 -0
  15. qiskit/circuit/annotated_operation.py +279 -0
  16. qiskit/circuit/barrier.py +50 -0
  17. qiskit/circuit/bit.py +94 -0
  18. qiskit/circuit/classical/__init__.py +41 -0
  19. qiskit/circuit/classical/expr/__init__.py +238 -0
  20. qiskit/circuit/classical/expr/constructors.py +556 -0
  21. qiskit/circuit/classical/expr/expr.py +397 -0
  22. qiskit/circuit/classical/expr/visitors.py +300 -0
  23. qiskit/circuit/classical/types/__init__.py +109 -0
  24. qiskit/circuit/classical/types/ordering.py +222 -0
  25. qiskit/circuit/classical/types/types.py +117 -0
  26. qiskit/circuit/classicalfunction/__init__.py +140 -0
  27. qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
  28. qiskit/circuit/classicalfunction/classical_element.py +54 -0
  29. qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
  30. qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
  31. qiskit/circuit/classicalfunction/exceptions.py +35 -0
  32. qiskit/circuit/classicalfunction/types.py +18 -0
  33. qiskit/circuit/classicalfunction/utils.py +91 -0
  34. qiskit/circuit/classicalregister.py +57 -0
  35. qiskit/circuit/commutation_checker.py +106 -0
  36. qiskit/circuit/commutation_library.py +20 -0
  37. qiskit/circuit/controlflow/__init__.py +28 -0
  38. qiskit/circuit/controlflow/_builder_utils.py +207 -0
  39. qiskit/circuit/controlflow/break_loop.py +56 -0
  40. qiskit/circuit/controlflow/builder.py +691 -0
  41. qiskit/circuit/controlflow/continue_loop.py +58 -0
  42. qiskit/circuit/controlflow/control_flow.py +84 -0
  43. qiskit/circuit/controlflow/for_loop.py +217 -0
  44. qiskit/circuit/controlflow/if_else.py +511 -0
  45. qiskit/circuit/controlflow/switch_case.py +417 -0
  46. qiskit/circuit/controlflow/while_loop.py +171 -0
  47. qiskit/circuit/controlledgate.py +274 -0
  48. qiskit/circuit/delay.py +123 -0
  49. qiskit/circuit/duration.py +95 -0
  50. qiskit/circuit/equivalence.py +94 -0
  51. qiskit/circuit/equivalence_library.py +18 -0
  52. qiskit/circuit/exceptions.py +19 -0
  53. qiskit/circuit/gate.py +263 -0
  54. qiskit/circuit/instruction.py +697 -0
  55. qiskit/circuit/instructionset.py +179 -0
  56. qiskit/circuit/library/__init__.py +668 -0
  57. qiskit/circuit/library/arithmetic/__init__.py +34 -0
  58. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  59. qiskit/circuit/library/arithmetic/adders/adder.py +210 -0
  60. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  61. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  62. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  63. qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
  64. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  65. qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
  66. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
  67. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
  68. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  69. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  70. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +192 -0
  71. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  72. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
  73. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
  74. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
  75. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
  76. qiskit/circuit/library/arithmetic/quadratic_form.py +198 -0
  77. qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
  78. qiskit/circuit/library/basis_change/__init__.py +15 -0
  79. qiskit/circuit/library/basis_change/qft.py +313 -0
  80. qiskit/circuit/library/blueprintcircuit.py +280 -0
  81. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  82. qiskit/circuit/library/boolean_logic/inner_product.py +155 -0
  83. qiskit/circuit/library/boolean_logic/quantum_and.py +200 -0
  84. qiskit/circuit/library/boolean_logic/quantum_or.py +202 -0
  85. qiskit/circuit/library/boolean_logic/quantum_xor.py +165 -0
  86. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  87. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  88. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  89. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  90. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  91. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  92. qiskit/circuit/library/fourier_checking.py +158 -0
  93. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  94. qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
  95. qiskit/circuit/library/generalized_gates/gms.py +174 -0
  96. qiskit/circuit/library/generalized_gates/gr.py +215 -0
  97. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  98. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  99. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  100. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  101. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  102. qiskit/circuit/library/generalized_gates/permutation.py +194 -0
  103. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  104. qiskit/circuit/library/generalized_gates/uc.py +213 -0
  105. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  106. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  107. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  108. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  109. qiskit/circuit/library/generalized_gates/unitary.py +215 -0
  110. qiskit/circuit/library/graph_state.py +169 -0
  111. qiskit/circuit/library/grover_operator.py +579 -0
  112. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  113. qiskit/circuit/library/hidden_linear_function.py +161 -0
  114. qiskit/circuit/library/iqp.py +175 -0
  115. qiskit/circuit/library/n_local/__init__.py +45 -0
  116. qiskit/circuit/library/n_local/efficient_su2.py +277 -0
  117. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +515 -0
  118. qiskit/circuit/library/n_local/excitation_preserving.py +297 -0
  119. qiskit/circuit/library/n_local/n_local.py +1472 -0
  120. qiskit/circuit/library/n_local/pauli_two_design.py +243 -0
  121. qiskit/circuit/library/n_local/qaoa_ansatz.py +366 -0
  122. qiskit/circuit/library/n_local/real_amplitudes.py +306 -0
  123. qiskit/circuit/library/n_local/two_local.py +289 -0
  124. qiskit/circuit/library/overlap.py +182 -0
  125. qiskit/circuit/library/pauli_evolution.py +186 -0
  126. qiskit/circuit/library/phase_estimation.py +175 -0
  127. qiskit/circuit/library/phase_oracle.py +153 -0
  128. qiskit/circuit/library/quantum_volume.py +167 -0
  129. qiskit/circuit/library/standard_gates/__init__.py +142 -0
  130. qiskit/circuit/library/standard_gates/dcx.py +78 -0
  131. qiskit/circuit/library/standard_gates/ecr.py +130 -0
  132. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  133. qiskit/circuit/library/standard_gates/global_phase.py +85 -0
  134. qiskit/circuit/library/standard_gates/h.py +258 -0
  135. qiskit/circuit/library/standard_gates/i.py +76 -0
  136. qiskit/circuit/library/standard_gates/iswap.py +134 -0
  137. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +405 -0
  138. qiskit/circuit/library/standard_gates/p.py +441 -0
  139. qiskit/circuit/library/standard_gates/r.py +117 -0
  140. qiskit/circuit/library/standard_gates/rx.py +303 -0
  141. qiskit/circuit/library/standard_gates/rxx.py +183 -0
  142. qiskit/circuit/library/standard_gates/ry.py +298 -0
  143. qiskit/circuit/library/standard_gates/ryy.py +183 -0
  144. qiskit/circuit/library/standard_gates/rz.py +319 -0
  145. qiskit/circuit/library/standard_gates/rzx.py +229 -0
  146. qiskit/circuit/library/standard_gates/rzz.py +196 -0
  147. qiskit/circuit/library/standard_gates/s.py +428 -0
  148. qiskit/circuit/library/standard_gates/swap.py +288 -0
  149. qiskit/circuit/library/standard_gates/sx.py +315 -0
  150. qiskit/circuit/library/standard_gates/t.py +179 -0
  151. qiskit/circuit/library/standard_gates/u.py +403 -0
  152. qiskit/circuit/library/standard_gates/u1.py +501 -0
  153. qiskit/circuit/library/standard_gates/u2.py +149 -0
  154. qiskit/circuit/library/standard_gates/u3.py +436 -0
  155. qiskit/circuit/library/standard_gates/x.py +1529 -0
  156. qiskit/circuit/library/standard_gates/xx_minus_yy.py +235 -0
  157. qiskit/circuit/library/standard_gates/xx_plus_yy.py +239 -0
  158. qiskit/circuit/library/standard_gates/y.py +262 -0
  159. qiskit/circuit/library/standard_gates/z.py +348 -0
  160. qiskit/circuit/library/templates/__init__.py +92 -0
  161. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  162. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  164. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  165. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  166. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  169. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  170. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  171. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  175. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  176. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  178. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  179. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  180. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  182. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  183. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  187. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  188. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  191. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  192. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  198. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  199. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  203. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  204. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  226. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  227. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  228. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  229. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  230. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  231. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  233. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  234. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  235. qiskit/circuit/measure.py +44 -0
  236. qiskit/circuit/operation.py +67 -0
  237. qiskit/circuit/parameter.py +178 -0
  238. qiskit/circuit/parameterexpression.py +692 -0
  239. qiskit/circuit/parametertable.py +119 -0
  240. qiskit/circuit/parametervector.py +120 -0
  241. qiskit/circuit/quantumcircuit.py +6829 -0
  242. qiskit/circuit/quantumcircuitdata.py +136 -0
  243. qiskit/circuit/quantumregister.py +75 -0
  244. qiskit/circuit/random/__init__.py +15 -0
  245. qiskit/circuit/random/utils.py +358 -0
  246. qiskit/circuit/register.py +233 -0
  247. qiskit/circuit/reset.py +34 -0
  248. qiskit/circuit/singleton.py +606 -0
  249. qiskit/circuit/store.py +97 -0
  250. qiskit/circuit/tools/__init__.py +16 -0
  251. qiskit/circuit/tools/pi_check.py +190 -0
  252. qiskit/circuit/twirling.py +145 -0
  253. qiskit/compiler/__init__.py +33 -0
  254. qiskit/compiler/assembler.py +681 -0
  255. qiskit/compiler/scheduler.py +109 -0
  256. qiskit/compiler/sequencer.py +71 -0
  257. qiskit/compiler/transpiler.py +533 -0
  258. qiskit/converters/__init__.py +74 -0
  259. qiskit/converters/circuit_to_dag.py +78 -0
  260. qiskit/converters/circuit_to_dagdependency.py +51 -0
  261. qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
  262. qiskit/converters/circuit_to_gate.py +107 -0
  263. qiskit/converters/circuit_to_instruction.py +155 -0
  264. qiskit/converters/dag_to_circuit.py +79 -0
  265. qiskit/converters/dag_to_dagdependency.py +55 -0
  266. qiskit/converters/dag_to_dagdependency_v2.py +44 -0
  267. qiskit/converters/dagdependency_to_circuit.py +46 -0
  268. qiskit/converters/dagdependency_to_dag.py +54 -0
  269. qiskit/dagcircuit/__init__.py +44 -0
  270. qiskit/dagcircuit/collect_blocks.py +391 -0
  271. qiskit/dagcircuit/dagcircuit.py +24 -0
  272. qiskit/dagcircuit/dagdependency.py +646 -0
  273. qiskit/dagcircuit/dagdependency_v2.py +641 -0
  274. qiskit/dagcircuit/dagdepnode.py +160 -0
  275. qiskit/dagcircuit/dagnode.py +176 -0
  276. qiskit/dagcircuit/exceptions.py +42 -0
  277. qiskit/exceptions.py +153 -0
  278. qiskit/passmanager/__init__.py +240 -0
  279. qiskit/passmanager/base_tasks.py +230 -0
  280. qiskit/passmanager/compilation_status.py +74 -0
  281. qiskit/passmanager/exceptions.py +19 -0
  282. qiskit/passmanager/flow_controllers.py +116 -0
  283. qiskit/passmanager/passmanager.py +333 -0
  284. qiskit/primitives/__init__.py +481 -0
  285. qiskit/primitives/backend_estimator.py +486 -0
  286. qiskit/primitives/backend_estimator_v2.py +434 -0
  287. qiskit/primitives/backend_sampler.py +222 -0
  288. qiskit/primitives/backend_sampler_v2.py +339 -0
  289. qiskit/primitives/base/__init__.py +20 -0
  290. qiskit/primitives/base/base_estimator.py +252 -0
  291. qiskit/primitives/base/base_primitive.py +45 -0
  292. qiskit/primitives/base/base_primitive_job.py +78 -0
  293. qiskit/primitives/base/base_result.py +65 -0
  294. qiskit/primitives/base/base_sampler.py +204 -0
  295. qiskit/primitives/base/estimator_result.py +46 -0
  296. qiskit/primitives/base/sampler_result.py +45 -0
  297. qiskit/primitives/base/validation.py +231 -0
  298. qiskit/primitives/containers/__init__.py +26 -0
  299. qiskit/primitives/containers/bindings_array.py +389 -0
  300. qiskit/primitives/containers/bit_array.py +741 -0
  301. qiskit/primitives/containers/data_bin.py +173 -0
  302. qiskit/primitives/containers/estimator_pub.py +222 -0
  303. qiskit/primitives/containers/object_array.py +94 -0
  304. qiskit/primitives/containers/observables_array.py +279 -0
  305. qiskit/primitives/containers/primitive_result.py +53 -0
  306. qiskit/primitives/containers/pub_result.py +51 -0
  307. qiskit/primitives/containers/sampler_pub.py +193 -0
  308. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  309. qiskit/primitives/containers/shape.py +129 -0
  310. qiskit/primitives/estimator.py +172 -0
  311. qiskit/primitives/primitive_job.py +81 -0
  312. qiskit/primitives/sampler.py +162 -0
  313. qiskit/primitives/statevector_estimator.py +174 -0
  314. qiskit/primitives/statevector_sampler.py +292 -0
  315. qiskit/primitives/utils.py +247 -0
  316. qiskit/providers/__init__.py +803 -0
  317. qiskit/providers/backend.py +667 -0
  318. qiskit/providers/backend_compat.py +472 -0
  319. qiskit/providers/basic_provider/__init__.py +45 -0
  320. qiskit/providers/basic_provider/basic_provider.py +101 -0
  321. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  322. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  323. qiskit/providers/basic_provider/basic_simulator.py +821 -0
  324. qiskit/providers/basic_provider/exceptions.py +30 -0
  325. qiskit/providers/exceptions.py +45 -0
  326. qiskit/providers/fake_provider/__init__.py +105 -0
  327. qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
  351. qiskit/providers/fake_provider/fake_1q.py +91 -0
  352. qiskit/providers/fake_provider/fake_backend.py +165 -0
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +49 -0
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
  357. qiskit/providers/fake_provider/generic_backend_v2.py +1035 -0
  358. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  359. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  360. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  361. qiskit/providers/job.py +147 -0
  362. qiskit/providers/jobstatus.py +30 -0
  363. qiskit/providers/models/__init__.py +89 -0
  364. qiskit/providers/models/backendconfiguration.py +1040 -0
  365. qiskit/providers/models/backendproperties.py +517 -0
  366. qiskit/providers/models/backendstatus.py +94 -0
  367. qiskit/providers/models/jobstatus.py +66 -0
  368. qiskit/providers/models/pulsedefaults.py +305 -0
  369. qiskit/providers/options.py +273 -0
  370. qiskit/providers/provider.py +95 -0
  371. qiskit/providers/providerutils.py +110 -0
  372. qiskit/pulse/__init__.py +158 -0
  373. qiskit/pulse/builder.py +2254 -0
  374. qiskit/pulse/calibration_entries.py +381 -0
  375. qiskit/pulse/channels.py +227 -0
  376. qiskit/pulse/configuration.py +245 -0
  377. qiskit/pulse/exceptions.py +45 -0
  378. qiskit/pulse/filters.py +309 -0
  379. qiskit/pulse/instruction_schedule_map.py +424 -0
  380. qiskit/pulse/instructions/__init__.py +67 -0
  381. qiskit/pulse/instructions/acquire.py +150 -0
  382. qiskit/pulse/instructions/delay.py +71 -0
  383. qiskit/pulse/instructions/directives.py +154 -0
  384. qiskit/pulse/instructions/frequency.py +135 -0
  385. qiskit/pulse/instructions/instruction.py +270 -0
  386. qiskit/pulse/instructions/phase.py +152 -0
  387. qiskit/pulse/instructions/play.py +99 -0
  388. qiskit/pulse/instructions/reference.py +100 -0
  389. qiskit/pulse/instructions/snapshot.py +82 -0
  390. qiskit/pulse/library/__init__.py +97 -0
  391. qiskit/pulse/library/continuous.py +430 -0
  392. qiskit/pulse/library/pulse.py +148 -0
  393. qiskit/pulse/library/samplers/__init__.py +15 -0
  394. qiskit/pulse/library/samplers/decorators.py +295 -0
  395. qiskit/pulse/library/samplers/strategies.py +71 -0
  396. qiskit/pulse/library/symbolic_pulses.py +1988 -0
  397. qiskit/pulse/library/waveform.py +136 -0
  398. qiskit/pulse/macros.py +262 -0
  399. qiskit/pulse/parameter_manager.py +445 -0
  400. qiskit/pulse/parser.py +314 -0
  401. qiskit/pulse/reference_manager.py +58 -0
  402. qiskit/pulse/schedule.py +1854 -0
  403. qiskit/pulse/transforms/__init__.py +106 -0
  404. qiskit/pulse/transforms/alignments.py +406 -0
  405. qiskit/pulse/transforms/base_transforms.py +71 -0
  406. qiskit/pulse/transforms/canonicalization.py +498 -0
  407. qiskit/pulse/transforms/dag.py +122 -0
  408. qiskit/pulse/utils.py +149 -0
  409. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  410. qiskit/qasm/libs/qelib1.inc +266 -0
  411. qiskit/qasm/libs/stdgates.inc +82 -0
  412. qiskit/qasm2/__init__.py +654 -0
  413. qiskit/qasm2/exceptions.py +27 -0
  414. qiskit/qasm2/export.py +372 -0
  415. qiskit/qasm2/parse.py +452 -0
  416. qiskit/qasm3/__init__.py +367 -0
  417. qiskit/qasm3/ast.py +738 -0
  418. qiskit/qasm3/exceptions.py +27 -0
  419. qiskit/qasm3/experimental.py +70 -0
  420. qiskit/qasm3/exporter.py +1299 -0
  421. qiskit/qasm3/printer.py +577 -0
  422. qiskit/qobj/__init__.py +75 -0
  423. qiskit/qobj/common.py +81 -0
  424. qiskit/qobj/converters/__init__.py +18 -0
  425. qiskit/qobj/converters/lo_config.py +177 -0
  426. qiskit/qobj/converters/pulse_instruction.py +897 -0
  427. qiskit/qobj/pulse_qobj.py +709 -0
  428. qiskit/qobj/qasm_qobj.py +708 -0
  429. qiskit/qobj/utils.py +46 -0
  430. qiskit/qpy/__init__.py +1822 -0
  431. qiskit/qpy/binary_io/__init__.py +36 -0
  432. qiskit/qpy/binary_io/circuits.py +1475 -0
  433. qiskit/qpy/binary_io/schedules.py +635 -0
  434. qiskit/qpy/binary_io/value.py +1025 -0
  435. qiskit/qpy/common.py +350 -0
  436. qiskit/qpy/exceptions.py +53 -0
  437. qiskit/qpy/formats.py +401 -0
  438. qiskit/qpy/interface.py +377 -0
  439. qiskit/qpy/type_keys.py +572 -0
  440. qiskit/quantum_info/__init__.py +162 -0
  441. qiskit/quantum_info/analysis/__init__.py +17 -0
  442. qiskit/quantum_info/analysis/average.py +47 -0
  443. qiskit/quantum_info/analysis/distance.py +102 -0
  444. qiskit/quantum_info/analysis/make_observable.py +44 -0
  445. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  446. qiskit/quantum_info/operators/__init__.py +28 -0
  447. qiskit/quantum_info/operators/base_operator.py +145 -0
  448. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  449. qiskit/quantum_info/operators/channel/chi.py +191 -0
  450. qiskit/quantum_info/operators/channel/choi.py +218 -0
  451. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  452. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  453. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  454. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  455. qiskit/quantum_info/operators/channel/superop.py +377 -0
  456. qiskit/quantum_info/operators/channel/transformations.py +475 -0
  457. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  458. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  459. qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
  460. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  461. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  462. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  463. qiskit/quantum_info/operators/linear_op.py +25 -0
  464. qiskit/quantum_info/operators/measures.py +418 -0
  465. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  466. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  467. qiskit/quantum_info/operators/mixins/group.py +171 -0
  468. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  469. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  470. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  471. qiskit/quantum_info/operators/op_shape.py +525 -0
  472. qiskit/quantum_info/operators/operator.py +865 -0
  473. qiskit/quantum_info/operators/operator_utils.py +76 -0
  474. qiskit/quantum_info/operators/predicates.py +183 -0
  475. qiskit/quantum_info/operators/random.py +154 -0
  476. qiskit/quantum_info/operators/scalar_op.py +254 -0
  477. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  478. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  479. qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
  480. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  481. qiskit/quantum_info/operators/symplectic/pauli.py +753 -0
  482. qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
  483. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  484. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  485. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1196 -0
  486. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  487. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  488. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  489. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  490. qiskit/quantum_info/quaternion.py +156 -0
  491. qiskit/quantum_info/random.py +26 -0
  492. qiskit/quantum_info/states/__init__.py +28 -0
  493. qiskit/quantum_info/states/densitymatrix.py +845 -0
  494. qiskit/quantum_info/states/measures.py +288 -0
  495. qiskit/quantum_info/states/quantum_state.py +503 -0
  496. qiskit/quantum_info/states/random.py +157 -0
  497. qiskit/quantum_info/states/stabilizerstate.py +773 -0
  498. qiskit/quantum_info/states/statevector.py +958 -0
  499. qiskit/quantum_info/states/utils.py +247 -0
  500. qiskit/result/__init__.py +73 -0
  501. qiskit/result/counts.py +189 -0
  502. qiskit/result/distributions/__init__.py +17 -0
  503. qiskit/result/distributions/probability.py +100 -0
  504. qiskit/result/distributions/quasi.py +154 -0
  505. qiskit/result/exceptions.py +40 -0
  506. qiskit/result/mitigation/__init__.py +13 -0
  507. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  508. qiskit/result/mitigation/correlated_readout_mitigator.py +277 -0
  509. qiskit/result/mitigation/local_readout_mitigator.py +328 -0
  510. qiskit/result/mitigation/utils.py +217 -0
  511. qiskit/result/models.py +234 -0
  512. qiskit/result/postprocess.py +239 -0
  513. qiskit/result/result.py +392 -0
  514. qiskit/result/sampled_expval.py +75 -0
  515. qiskit/result/utils.py +295 -0
  516. qiskit/scheduler/__init__.py +40 -0
  517. qiskit/scheduler/config.py +37 -0
  518. qiskit/scheduler/lowering.py +187 -0
  519. qiskit/scheduler/methods/__init__.py +15 -0
  520. qiskit/scheduler/methods/basic.py +140 -0
  521. qiskit/scheduler/schedule_circuit.py +69 -0
  522. qiskit/scheduler/sequence.py +104 -0
  523. qiskit/synthesis/__init__.py +220 -0
  524. qiskit/synthesis/arithmetic/__init__.py +16 -0
  525. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  526. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  527. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  528. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  529. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  530. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
  531. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
  532. qiskit/synthesis/clifford/__init__.py +19 -0
  533. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  534. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  535. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  536. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  537. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  538. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  539. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  540. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  541. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  542. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  543. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  544. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  545. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  546. qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
  547. qiskit/synthesis/evolution/__init__.py +21 -0
  548. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  549. qiskit/synthesis/evolution/lie_trotter.py +117 -0
  550. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  551. qiskit/synthesis/evolution/pauli_network.py +80 -0
  552. qiskit/synthesis/evolution/product_formula.py +311 -0
  553. qiskit/synthesis/evolution/qdrift.py +138 -0
  554. qiskit/synthesis/evolution/suzuki_trotter.py +215 -0
  555. qiskit/synthesis/linear/__init__.py +26 -0
  556. qiskit/synthesis/linear/cnot_synth.py +69 -0
  557. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  558. qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
  559. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  560. qiskit/synthesis/linear_phase/__init__.py +17 -0
  561. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  562. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  563. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  564. qiskit/synthesis/multi_controlled/__init__.py +24 -0
  565. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  566. qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
  567. qiskit/synthesis/one_qubit/__init__.py +15 -0
  568. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  569. qiskit/synthesis/permutation/__init__.py +18 -0
  570. qiskit/synthesis/permutation/permutation_full.py +78 -0
  571. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  572. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  573. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  574. qiskit/synthesis/qft/__init__.py +16 -0
  575. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  576. qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
  577. qiskit/synthesis/stabilizer/__init__.py +16 -0
  578. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  579. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  580. qiskit/synthesis/two_qubit/__init__.py +19 -0
  581. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  582. qiskit/synthesis/two_qubit/two_qubit_decompose.py +700 -0
  583. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  584. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  585. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  586. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  587. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  588. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  589. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  590. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  591. qiskit/synthesis/unitary/__init__.py +13 -0
  592. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  593. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  594. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  595. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  596. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  597. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  598. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  599. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  600. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  601. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  602. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  603. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  604. qiskit/synthesis/unitary/qsd.py +288 -0
  605. qiskit/transpiler/__init__.py +1290 -0
  606. qiskit/transpiler/basepasses.py +221 -0
  607. qiskit/transpiler/coupling.py +500 -0
  608. qiskit/transpiler/exceptions.py +59 -0
  609. qiskit/transpiler/instruction_durations.py +281 -0
  610. qiskit/transpiler/layout.py +737 -0
  611. qiskit/transpiler/passes/__init__.py +312 -0
  612. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  613. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  614. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  615. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  616. qiskit/transpiler/passes/analysis/depth.py +33 -0
  617. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  618. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  619. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  620. qiskit/transpiler/passes/analysis/size.py +36 -0
  621. qiskit/transpiler/passes/analysis/width.py +27 -0
  622. qiskit/transpiler/passes/basis/__init__.py +19 -0
  623. qiskit/transpiler/passes/basis/basis_translator.py +137 -0
  624. qiskit/transpiler/passes/basis/decompose.py +131 -0
  625. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  626. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
  627. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
  628. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  629. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  630. qiskit/transpiler/passes/calibration/builders.py +20 -0
  631. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  632. qiskit/transpiler/passes/calibration/pulse_gate.py +100 -0
  633. qiskit/transpiler/passes/calibration/rx_builder.py +164 -0
  634. qiskit/transpiler/passes/calibration/rzx_builder.py +411 -0
  635. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  636. qiskit/transpiler/passes/layout/__init__.py +26 -0
  637. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  638. qiskit/transpiler/passes/layout/apply_layout.py +123 -0
  639. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  640. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  641. qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
  642. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  643. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  644. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  645. qiskit/transpiler/passes/layout/sabre_layout.py +487 -0
  646. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  647. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  648. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  649. qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
  650. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  651. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  652. qiskit/transpiler/passes/optimization/__init__.py +43 -0
  653. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  654. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  655. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  656. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  657. qiskit/transpiler/passes/optimization/collect_cliffords.py +104 -0
  658. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  659. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  660. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  661. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  662. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  663. qiskit/transpiler/passes/optimization/consolidate_blocks.py +149 -0
  664. qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
  665. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +162 -0
  666. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  667. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  668. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  669. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  670. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  671. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +254 -0
  672. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  673. qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
  674. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  675. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  676. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  677. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  678. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
  679. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  680. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  681. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
  682. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  683. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  684. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  685. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  686. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  687. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
  688. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  689. qiskit/transpiler/passes/routing/__init__.py +22 -0
  690. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  691. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  692. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  693. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  694. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  695. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  696. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  697. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
  698. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  699. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  700. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  701. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  702. qiskit/transpiler/passes/routing/sabre_swap.py +447 -0
  703. qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
  704. qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
  705. qiskit/transpiler/passes/routing/utils.py +35 -0
  706. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  707. qiskit/transpiler/passes/scheduling/alap.py +153 -0
  708. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  709. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
  710. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
  711. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +107 -0
  712. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
  713. qiskit/transpiler/passes/scheduling/asap.py +175 -0
  714. qiskit/transpiler/passes/scheduling/base_scheduler.py +310 -0
  715. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +312 -0
  716. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  717. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  718. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +452 -0
  719. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +82 -0
  720. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  721. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  722. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  723. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +94 -0
  724. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  725. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +165 -0
  726. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  727. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  728. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +854 -0
  729. qiskit/transpiler/passes/synthesis/hls_plugins.py +1559 -0
  730. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  731. qiskit/transpiler/passes/synthesis/plugin.py +734 -0
  732. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
  733. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1076 -0
  734. qiskit/transpiler/passes/utils/__init__.py +33 -0
  735. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  736. qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
  737. qiskit/transpiler/passes/utils/check_map.py +78 -0
  738. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  739. qiskit/transpiler/passes/utils/control_flow.py +65 -0
  740. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +93 -0
  741. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  742. qiskit/transpiler/passes/utils/error.py +69 -0
  743. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  744. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  745. qiskit/transpiler/passes/utils/gate_direction.py +86 -0
  746. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  747. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  748. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  749. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  750. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  751. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  752. qiskit/transpiler/passmanager.py +490 -0
  753. qiskit/transpiler/passmanager_config.py +216 -0
  754. qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
  755. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1045 -0
  756. qiskit/transpiler/preset_passmanagers/common.py +649 -0
  757. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +626 -0
  758. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  759. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  760. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  761. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  762. qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
  763. qiskit/transpiler/target.py +1319 -0
  764. qiskit/transpiler/timing_constraints.py +59 -0
  765. qiskit/user_config.py +262 -0
  766. qiskit/utils/__init__.py +89 -0
  767. qiskit/utils/classtools.py +146 -0
  768. qiskit/utils/deprecate_pulse.py +119 -0
  769. qiskit/utils/deprecation.py +490 -0
  770. qiskit/utils/lazy_tester.py +363 -0
  771. qiskit/utils/multiprocessing.py +56 -0
  772. qiskit/utils/optionals.py +347 -0
  773. qiskit/utils/parallel.py +191 -0
  774. qiskit/utils/units.py +143 -0
  775. qiskit/version.py +84 -0
  776. qiskit/visualization/__init__.py +288 -0
  777. qiskit/visualization/array.py +204 -0
  778. qiskit/visualization/bloch.py +778 -0
  779. qiskit/visualization/circuit/__init__.py +15 -0
  780. qiskit/visualization/circuit/_utils.py +675 -0
  781. qiskit/visualization/circuit/circuit_visualization.py +727 -0
  782. qiskit/visualization/circuit/latex.py +661 -0
  783. qiskit/visualization/circuit/matplotlib.py +2029 -0
  784. qiskit/visualization/circuit/qcstyle.py +278 -0
  785. qiskit/visualization/circuit/styles/__init__.py +13 -0
  786. qiskit/visualization/circuit/styles/bw.json +202 -0
  787. qiskit/visualization/circuit/styles/clifford.json +202 -0
  788. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  789. qiskit/visualization/circuit/styles/iqp.json +214 -0
  790. qiskit/visualization/circuit/styles/textbook.json +202 -0
  791. qiskit/visualization/circuit/text.py +1844 -0
  792. qiskit/visualization/circuit_visualization.py +19 -0
  793. qiskit/visualization/counts_visualization.py +481 -0
  794. qiskit/visualization/dag_visualization.py +316 -0
  795. qiskit/visualization/exceptions.py +21 -0
  796. qiskit/visualization/gate_map.py +1485 -0
  797. qiskit/visualization/library.py +37 -0
  798. qiskit/visualization/pass_manager_visualization.py +308 -0
  799. qiskit/visualization/pulse_v2/__init__.py +21 -0
  800. qiskit/visualization/pulse_v2/core.py +901 -0
  801. qiskit/visualization/pulse_v2/device_info.py +173 -0
  802. qiskit/visualization/pulse_v2/drawings.py +253 -0
  803. qiskit/visualization/pulse_v2/events.py +254 -0
  804. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  805. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  806. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  807. qiskit/visualization/pulse_v2/generators/frame.py +436 -0
  808. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  809. qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
  810. qiskit/visualization/pulse_v2/interface.py +458 -0
  811. qiskit/visualization/pulse_v2/layouts.py +387 -0
  812. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  813. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  814. qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
  815. qiskit/visualization/pulse_v2/stylesheet.py +312 -0
  816. qiskit/visualization/pulse_v2/types.py +242 -0
  817. qiskit/visualization/state_visualization.py +1518 -0
  818. qiskit/visualization/timeline/__init__.py +21 -0
  819. qiskit/visualization/timeline/core.py +480 -0
  820. qiskit/visualization/timeline/drawings.py +260 -0
  821. qiskit/visualization/timeline/generators.py +506 -0
  822. qiskit/visualization/timeline/interface.py +436 -0
  823. qiskit/visualization/timeline/layouts.py +115 -0
  824. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  825. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  826. qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
  827. qiskit/visualization/timeline/stylesheet.py +301 -0
  828. qiskit/visualization/timeline/types.py +148 -0
  829. qiskit/visualization/transition_visualization.py +369 -0
  830. qiskit/visualization/utils.py +49 -0
  831. qiskit-1.3.0.dist-info/LICENSE.txt +203 -0
  832. qiskit-1.3.0.dist-info/METADATA +222 -0
  833. qiskit-1.3.0.dist-info/RECORD +836 -0
  834. qiskit-1.3.0.dist-info/WHEEL +5 -0
  835. qiskit-1.3.0.dist-info/entry_points.txt +76 -0
  836. qiskit-1.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,845 @@
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
+ DensityMatrix quantum state class.
15
+ """
16
+
17
+ from __future__ import annotations
18
+ import copy as _copy
19
+ from numbers import Number
20
+ import numpy as np
21
+
22
+ from qiskit import _numpy_compat
23
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
24
+ from qiskit.circuit.instruction import Instruction
25
+ from qiskit.exceptions import QiskitError
26
+ from qiskit.quantum_info.states.quantum_state import QuantumState
27
+ from qiskit.quantum_info.operators.mixins.tolerances import TolerancesMixin
28
+ from qiskit.quantum_info.operators.op_shape import OpShape
29
+ from qiskit.quantum_info.operators.operator import Operator
30
+ from qiskit.quantum_info.operators.symplectic import Pauli, SparsePauliOp
31
+ from qiskit.quantum_info.operators.scalar_op import ScalarOp
32
+ from qiskit.quantum_info.operators.predicates import is_hermitian_matrix
33
+ from qiskit.quantum_info.operators.predicates import is_positive_semidefinite_matrix
34
+ from qiskit.quantum_info.operators.channel.quantum_channel import QuantumChannel
35
+ from qiskit.quantum_info.operators.channel.superop import SuperOp
36
+
37
+ from qiskit._accelerate.pauli_expval import density_expval_pauli_no_x, density_expval_pauli_with_x
38
+ from qiskit.quantum_info.states.statevector import Statevector
39
+
40
+
41
+ class DensityMatrix(QuantumState, TolerancesMixin):
42
+ """DensityMatrix class"""
43
+
44
+ def __init__(
45
+ self,
46
+ data: np.ndarray | list | QuantumCircuit | Instruction | QuantumState,
47
+ dims: int | tuple | list | None = None,
48
+ ):
49
+ """Initialize a density matrix object.
50
+
51
+ Args:
52
+ data (np.ndarray or list or matrix_like or QuantumCircuit or
53
+ qiskit.circuit.Instruction):
54
+ A statevector, quantum instruction or an object with a ``to_operator`` or
55
+ ``to_matrix`` method from which the density matrix can be constructed.
56
+ If a vector the density matrix is constructed as the projector of that vector.
57
+ If a quantum instruction, the density matrix is constructed by assuming all
58
+ qubits are initialized in the zero state.
59
+ dims (int or tuple or list): Optional. The subsystem dimension
60
+ of the state (See additional information).
61
+
62
+ Raises:
63
+ QiskitError: if input data is not valid.
64
+
65
+ Additional Information:
66
+ The ``dims`` kwarg can be None, an integer, or an iterable of
67
+ integers.
68
+
69
+ * ``Iterable`` -- the subsystem dimensions are the values in the list
70
+ with the total number of subsystems given by the length of the list.
71
+
72
+ * ``Int`` or ``None`` -- the leading dimension of the input matrix
73
+ specifies the total dimension of the density matrix. If it is a
74
+ power of two the state will be initialized as an N-qubit state.
75
+ If it is not a power of two the state will have a single
76
+ d-dimensional subsystem.
77
+ """
78
+ if isinstance(data, (list, np.ndarray)):
79
+ # Finally we check if the input is a raw matrix in either a
80
+ # python list or numpy array format.
81
+ self._data = np.asarray(data, dtype=complex)
82
+ elif isinstance(data, (QuantumCircuit, Instruction)):
83
+ # If the data is a circuit or an instruction use the classmethod
84
+ # to construct the DensityMatrix object
85
+ self._data = DensityMatrix.from_instruction(data)._data
86
+ elif hasattr(data, "to_operator"):
87
+ # If the data object has a 'to_operator' attribute this is given
88
+ # higher preference than the 'to_matrix' method for initializing
89
+ # an Operator object.
90
+ op = data.to_operator()
91
+ self._data = op.data
92
+ if dims is None:
93
+ dims = op.output_dims()
94
+ elif hasattr(data, "to_matrix"):
95
+ # If no 'to_operator' attribute exists we next look for a
96
+ # 'to_matrix' attribute to a matrix that will be cast into
97
+ # a complex numpy matrix.
98
+ self._data = np.asarray(data.to_matrix(), dtype=complex)
99
+ else:
100
+ raise QiskitError("Invalid input data format for DensityMatrix")
101
+ # Convert statevector into a density matrix
102
+ ndim = self._data.ndim
103
+ shape = self._data.shape
104
+ if ndim == 2 and shape[0] == shape[1]:
105
+ pass # We good
106
+ elif ndim == 1:
107
+ self._data = np.outer(self._data, np.conj(self._data))
108
+ elif ndim == 2 and shape[1] == 1:
109
+ self._data = np.reshape(self._data, shape[0])
110
+ else:
111
+ raise QiskitError("Invalid DensityMatrix input: not a square matrix.")
112
+ super().__init__(op_shape=OpShape.auto(shape=self._data.shape, dims_l=dims, dims_r=dims))
113
+
114
+ def __array__(self, dtype=None, copy=_numpy_compat.COPY_ONLY_IF_NEEDED):
115
+ dtype = self.data.dtype if dtype is None else dtype
116
+ return np.array(self.data, dtype=dtype, copy=copy)
117
+
118
+ def __eq__(self, other):
119
+ return super().__eq__(other) and np.allclose(
120
+ self._data, other._data, rtol=self.rtol, atol=self.atol
121
+ )
122
+
123
+ def __repr__(self):
124
+ prefix = "DensityMatrix("
125
+ pad = len(prefix) * " "
126
+ return (
127
+ f"{prefix}{np.array2string(self._data, separator=', ', prefix=prefix)},\n"
128
+ f"{pad}dims={self._op_shape.dims_l()})"
129
+ )
130
+
131
+ @property
132
+ def settings(self):
133
+ """Return settings."""
134
+ return {"data": self.data, "dims": self._op_shape.dims_l()}
135
+
136
+ def draw(self, output: str | None = None, **drawer_args):
137
+ """Return a visualization of the Statevector.
138
+
139
+ **repr**: ASCII TextMatrix of the state's ``__repr__``.
140
+
141
+ **text**: ASCII TextMatrix that can be printed in the console.
142
+
143
+ **latex**: An IPython Latex object for displaying in Jupyter Notebooks.
144
+
145
+ **latex_source**: Raw, uncompiled ASCII source to generate array using LaTeX.
146
+
147
+ **qsphere**: Matplotlib figure, rendering of density matrix using `plot_state_qsphere()`.
148
+
149
+ **hinton**: Matplotlib figure, rendering of density matrix using `plot_state_hinton()`.
150
+
151
+ **bloch**: Matplotlib figure, rendering of density matrix using `plot_bloch_multivector()`.
152
+
153
+ Args:
154
+ output (str): Select the output method to use for drawing the
155
+ state. Valid choices are `repr`, `text`, `latex`, `latex_source`,
156
+ `qsphere`, `hinton`, or `bloch`. Default is `repr`. Default can
157
+ be changed by adding the line ``state_drawer = <default>`` to
158
+ ``~/.qiskit/settings.conf`` under ``[default]``.
159
+ drawer_args: Arguments to be passed directly to the relevant drawing
160
+ function or constructor (`TextMatrix()`, `array_to_latex()`,
161
+ `plot_state_qsphere()`, `plot_state_hinton()` or `plot_bloch_multivector()`).
162
+ See the relevant function under `qiskit.visualization` for that function's
163
+ documentation.
164
+
165
+ Returns:
166
+ :class:`matplotlib.Figure` or :class:`str` or
167
+ :class:`TextMatrix` or :class:`IPython.display.Latex`:
168
+ Drawing of the Statevector.
169
+
170
+ Raises:
171
+ ValueError: when an invalid output method is selected.
172
+ """
173
+ # pylint: disable=cyclic-import
174
+ from qiskit.visualization.state_visualization import state_drawer
175
+
176
+ return state_drawer(self, output=output, **drawer_args)
177
+
178
+ def _ipython_display_(self):
179
+ out = self.draw()
180
+ if isinstance(out, str):
181
+ print(out)
182
+ else:
183
+ from IPython.display import display
184
+
185
+ display(out)
186
+
187
+ @property
188
+ def data(self):
189
+ """Return data."""
190
+ return self._data
191
+
192
+ def is_valid(self, atol=None, rtol=None):
193
+ """Return True if trace 1 and positive semidefinite."""
194
+ if atol is None:
195
+ atol = self.atol
196
+ if rtol is None:
197
+ rtol = self.rtol
198
+ # Check trace == 1
199
+ if not np.allclose(self.trace(), 1, rtol=rtol, atol=atol):
200
+ return False
201
+ # Check Hermitian
202
+ if not is_hermitian_matrix(self.data, rtol=rtol, atol=atol):
203
+ return False
204
+ # Check positive semidefinite
205
+ return is_positive_semidefinite_matrix(self.data, rtol=rtol, atol=atol)
206
+
207
+ def to_operator(self) -> Operator:
208
+ """Convert to Operator"""
209
+ dims = self.dims()
210
+ return Operator(self.data, input_dims=dims, output_dims=dims)
211
+
212
+ def conjugate(self):
213
+ """Return the conjugate of the density matrix."""
214
+ return DensityMatrix(np.conj(self.data), dims=self.dims())
215
+
216
+ def trace(self):
217
+ """Return the trace of the density matrix."""
218
+ return np.trace(self.data)
219
+
220
+ def purity(self):
221
+ """Return the purity of the quantum state."""
222
+ # For a valid statevector the purity is always 1, however if we simply
223
+ # have an arbitrary vector (not correctly normalized) then the
224
+ # purity is equivalent to the trace squared:
225
+ # P(|psi>) = Tr[|psi><psi|psi><psi|] = |<psi|psi>|^2
226
+ return np.trace(np.dot(self.data, self.data))
227
+
228
+ def tensor(self, other: DensityMatrix) -> DensityMatrix:
229
+ """Return the tensor product state self ⊗ other.
230
+
231
+ Args:
232
+ other (DensityMatrix): a quantum state object.
233
+
234
+ Returns:
235
+ DensityMatrix: the tensor product operator self ⊗ other.
236
+
237
+ Raises:
238
+ QiskitError: if other is not a quantum state.
239
+ """
240
+ if not isinstance(other, DensityMatrix):
241
+ other = DensityMatrix(other)
242
+ ret = _copy.copy(self)
243
+ ret._data = np.kron(self._data, other._data)
244
+ ret._op_shape = self._op_shape.tensor(other._op_shape)
245
+ return ret
246
+
247
+ def expand(self, other: DensityMatrix) -> DensityMatrix:
248
+ """Return the tensor product state other ⊗ self.
249
+
250
+ Args:
251
+ other (DensityMatrix): a quantum state object.
252
+
253
+ Returns:
254
+ DensityMatrix: the tensor product state other ⊗ self.
255
+
256
+ Raises:
257
+ QiskitError: if other is not a quantum state.
258
+ """
259
+ if not isinstance(other, DensityMatrix):
260
+ other = DensityMatrix(other)
261
+ ret = _copy.copy(self)
262
+ ret._data = np.kron(other._data, self._data)
263
+ ret._op_shape = self._op_shape.expand(other._op_shape)
264
+ return ret
265
+
266
+ def _add(self, other):
267
+ """Return the linear combination self + other.
268
+
269
+ Args:
270
+ other (DensityMatrix): a quantum state object.
271
+
272
+ Returns:
273
+ DensityMatrix: the linear combination self + other.
274
+
275
+ Raises:
276
+ QiskitError: if other is not a quantum state, or has
277
+ incompatible dimensions.
278
+ """
279
+ if not isinstance(other, DensityMatrix):
280
+ other = DensityMatrix(other)
281
+ self._op_shape._validate_add(other._op_shape)
282
+ ret = _copy.copy(self)
283
+ ret._data = self.data + other.data
284
+ return ret
285
+
286
+ def _multiply(self, other):
287
+ """Return the scalar multiplied state other * self.
288
+
289
+ Args:
290
+ other (complex): a complex number.
291
+
292
+ Returns:
293
+ DensityMatrix: the scalar multiplied state other * self.
294
+
295
+ Raises:
296
+ QiskitError: if other is not a valid complex number.
297
+ """
298
+ if not isinstance(other, Number):
299
+ raise QiskitError("other is not a number")
300
+ ret = _copy.copy(self)
301
+ ret._data = other * self.data
302
+ return ret
303
+
304
+ def evolve(
305
+ self,
306
+ other: Operator | QuantumChannel | Instruction | QuantumCircuit,
307
+ qargs: list[int] | None = None,
308
+ ) -> DensityMatrix:
309
+ """Evolve a quantum state by an operator.
310
+
311
+ Args:
312
+ other (Operator or QuantumChannel
313
+ or Instruction or Circuit): The operator to evolve by.
314
+ qargs (list): a list of QuantumState subsystem positions to apply
315
+ the operator on.
316
+
317
+ Returns:
318
+ DensityMatrix: the output density matrix.
319
+
320
+ Raises:
321
+ QiskitError: if the operator dimension does not match the
322
+ specified QuantumState subsystem dimensions.
323
+ """
324
+ if qargs is None:
325
+ qargs = getattr(other, "qargs", None)
326
+
327
+ # Evolution by a circuit or instruction
328
+ if isinstance(other, (QuantumCircuit, Instruction)):
329
+ return self._evolve_instruction(other, qargs=qargs)
330
+
331
+ # Evolution by a QuantumChannel
332
+ # Currently the class that has `to_quantumchannel` is QuantumError of Qiskit Aer, so we can't
333
+ # use QuantumError as a type hint.
334
+ if hasattr(other, "to_quantumchannel"):
335
+ return other.to_quantumchannel()._evolve(self, qargs=qargs)
336
+ if isinstance(other, QuantumChannel):
337
+ return other._evolve(self, qargs=qargs)
338
+
339
+ # Unitary evolution by an Operator
340
+ if not isinstance(other, Operator):
341
+ dims = self.dims(qargs=qargs)
342
+ other = Operator(other, input_dims=dims, output_dims=dims)
343
+ return self._evolve_operator(other, qargs=qargs)
344
+
345
+ def reverse_qargs(self) -> DensityMatrix:
346
+ r"""Return a DensityMatrix with reversed subsystem ordering.
347
+
348
+ For a tensor product state this is equivalent to reversing the order
349
+ of tensor product subsystems. For a density matrix
350
+ :math:`\rho = \rho_{n-1} \otimes ... \otimes \rho_0`
351
+ the returned state will be
352
+ :math:`\rho_0 \otimes ... \otimes \rho_{n-1}`.
353
+
354
+ Returns:
355
+ DensityMatrix: the state with reversed subsystem order.
356
+ """
357
+ ret = _copy.copy(self)
358
+ axes = tuple(range(self._op_shape._num_qargs_l - 1, -1, -1))
359
+ axes = axes + tuple(len(axes) + i for i in axes)
360
+ ret._data = np.reshape(
361
+ np.transpose(np.reshape(self.data, self._op_shape.tensor_shape), axes),
362
+ self._op_shape.shape,
363
+ )
364
+ ret._op_shape = self._op_shape.reverse()
365
+ return ret
366
+
367
+ def _expectation_value_pauli(self, pauli, qargs=None):
368
+ """Compute the expectation value of a Pauli.
369
+
370
+ Args:
371
+ pauli (Pauli): a Pauli operator to evaluate expval of.
372
+ qargs (None or list): subsystems to apply operator on.
373
+
374
+ Returns:
375
+ complex: the expectation value.
376
+ """
377
+ n_pauli = len(pauli)
378
+ if qargs is None:
379
+ qubits = np.arange(n_pauli)
380
+ else:
381
+ qubits = np.array(qargs)
382
+ x_mask = np.dot(1 << qubits, pauli.x)
383
+ z_mask = np.dot(1 << qubits, pauli.z)
384
+ pauli_phase = (-1j) ** pauli.phase if pauli.phase else 1
385
+
386
+ if x_mask + z_mask == 0:
387
+ return pauli_phase * self.trace()
388
+
389
+ data = np.ravel(self.data, order="F")
390
+ if x_mask == 0:
391
+ return pauli_phase * density_expval_pauli_no_x(data, self.num_qubits, z_mask)
392
+
393
+ x_max = qubits[pauli.x][-1]
394
+ y_phase = (-1j) ** pauli._count_y()
395
+ y_phase = y_phase[0]
396
+ return pauli_phase * density_expval_pauli_with_x(
397
+ data, self.num_qubits, z_mask, x_mask, y_phase, x_max
398
+ )
399
+
400
+ def expectation_value(self, oper: Operator, qargs: None | list[int] = None) -> complex:
401
+ """Compute the expectation value of an operator.
402
+
403
+ Args:
404
+ oper (Operator): an operator to evaluate expval.
405
+ qargs (None or list): subsystems to apply the operator on.
406
+
407
+ Returns:
408
+ complex: the expectation value.
409
+ """
410
+ if isinstance(oper, Pauli):
411
+ return self._expectation_value_pauli(oper, qargs)
412
+
413
+ if isinstance(oper, SparsePauliOp):
414
+ return sum(
415
+ coeff * self._expectation_value_pauli(Pauli((z, x)), qargs)
416
+ for z, x, coeff in zip(oper.paulis.z, oper.paulis.x, oper.coeffs)
417
+ )
418
+
419
+ if not isinstance(oper, Operator):
420
+ oper = Operator(oper)
421
+ return np.trace(Operator(self).dot(oper, qargs=qargs).data)
422
+
423
+ def probabilities(
424
+ self, qargs: None | list[int] = None, decimals: None | int = None
425
+ ) -> np.ndarray:
426
+ """Return the subsystem measurement probability vector.
427
+
428
+ Measurement probabilities are with respect to measurement in the
429
+ computation (diagonal) basis.
430
+
431
+ Args:
432
+ qargs (None or list): subsystems to return probabilities for,
433
+ if None return for all subsystems (Default: None).
434
+ decimals (None or int): the number of decimal places to round
435
+ values. If None no rounding is done (Default: None).
436
+
437
+ Returns:
438
+ np.array: The Numpy vector array of probabilities.
439
+
440
+ Examples:
441
+
442
+ Consider a 2-qubit product state :math:`\\rho=\\rho_1\\otimes\\rho_0`
443
+ with :math:`\\rho_1=|+\\rangle\\!\\langle+|`,
444
+ :math:`\\rho_0=|0\\rangle\\!\\langle0|`.
445
+
446
+ .. code-block::
447
+
448
+ from qiskit.quantum_info import DensityMatrix
449
+
450
+ rho = DensityMatrix.from_label('+0')
451
+
452
+ # Probabilities for measuring both qubits
453
+ probs = rho.probabilities()
454
+ print('probs: {}'.format(probs))
455
+
456
+ # Probabilities for measuring only qubit-0
457
+ probs_qubit_0 = rho.probabilities([0])
458
+ print('Qubit-0 probs: {}'.format(probs_qubit_0))
459
+
460
+ # Probabilities for measuring only qubit-1
461
+ probs_qubit_1 = rho.probabilities([1])
462
+ print('Qubit-1 probs: {}'.format(probs_qubit_1))
463
+
464
+ .. code-block:: text
465
+
466
+ probs: [0.5 0. 0.5 0. ]
467
+ Qubit-0 probs: [1. 0.]
468
+ Qubit-1 probs: [0.5 0.5]
469
+
470
+ We can also permute the order of qubits in the ``qargs`` list
471
+ to change the qubit position in the probabilities output
472
+
473
+ .. code-block::
474
+
475
+ from qiskit.quantum_info import DensityMatrix
476
+
477
+ rho = DensityMatrix.from_label('+0')
478
+
479
+ # Probabilities for measuring both qubits
480
+ probs = rho.probabilities([0, 1])
481
+ print('probs: {}'.format(probs))
482
+
483
+ # Probabilities for measuring both qubits
484
+ # but swapping qubits 0 and 1 in output
485
+ probs_swapped = rho.probabilities([1, 0])
486
+ print('Swapped probs: {}'.format(probs_swapped))
487
+
488
+ .. code-block:: text
489
+
490
+ probs: [0.5 0. 0.5 0. ]
491
+ Swapped probs: [0.5 0.5 0. 0. ]
492
+ """
493
+ probs = self._subsystem_probabilities(
494
+ np.abs(self.data.diagonal()), self._op_shape.dims_l(), qargs=qargs
495
+ )
496
+
497
+ # to account for roundoff errors, we clip
498
+ probs = np.clip(probs, a_min=0, a_max=1)
499
+
500
+ if decimals is not None:
501
+ probs = probs.round(decimals=decimals)
502
+
503
+ return probs
504
+
505
+ def reset(self, qargs: list[int] | None = None) -> DensityMatrix:
506
+ """Reset state or subsystems to the 0-state.
507
+
508
+ Args:
509
+ qargs (list or None): subsystems to reset, if None all
510
+ subsystems will be reset to their 0-state
511
+ (Default: None).
512
+
513
+ Returns:
514
+ DensityMatrix: the reset state.
515
+
516
+ Additional Information:
517
+ If all subsystems are reset this will return the ground state
518
+ on all subsystems. If only a some subsystems are reset this
519
+ function will perform evolution by the reset
520
+ :class:`~qiskit.quantum_info.SuperOp` of the reset subsystems.
521
+ """
522
+ if qargs is None:
523
+ # Resetting all qubits does not require sampling or RNG
524
+ ret = _copy.copy(self)
525
+ state = np.zeros(self._op_shape.shape, dtype=complex)
526
+ state[0, 0] = 1
527
+ ret._data = state
528
+ return ret
529
+
530
+ # Reset by evolving by reset SuperOp
531
+ dims = self.dims(qargs)
532
+ reset_superop = SuperOp(ScalarOp(dims, coeff=0))
533
+ reset_superop.data[0] = Operator(ScalarOp(dims)).data.ravel()
534
+ return self.evolve(reset_superop, qargs=qargs)
535
+
536
+ @classmethod
537
+ def from_label(cls, label: str) -> DensityMatrix:
538
+ r"""Return a tensor product of Pauli X,Y,Z eigenstates.
539
+
540
+ .. list-table:: Single-qubit state labels
541
+ :header-rows: 1
542
+
543
+ * - Label
544
+ - Statevector
545
+ * - ``"0"``
546
+ - :math:`\begin{pmatrix} 1 & 0 \\ 0 & 0 \end{pmatrix}`
547
+ * - ``"1"``
548
+ - :math:`\begin{pmatrix} 0 & 0 \\ 0 & 1 \end{pmatrix}`
549
+ * - ``"+"``
550
+ - :math:`\frac{1}{2}\begin{pmatrix} 1 & 1 \\ 1 & 1 \end{pmatrix}`
551
+ * - ``"-"``
552
+ - :math:`\frac{1}{2}\begin{pmatrix} 1 & -1 \\ -1 & 1 \end{pmatrix}`
553
+ * - ``"r"``
554
+ - :math:`\frac{1}{2}\begin{pmatrix} 1 & -i \\ i & 1 \end{pmatrix}`
555
+ * - ``"l"``
556
+ - :math:`\frac{1}{2}\begin{pmatrix} 1 & i \\ -i & 1 \end{pmatrix}`
557
+
558
+ Args:
559
+ label (string): a eigenstate string ket label (see table for
560
+ allowed values).
561
+
562
+ Returns:
563
+ DensityMatrix: The N-qubit basis state density matrix.
564
+
565
+ Raises:
566
+ QiskitError: if the label contains invalid characters, or the length
567
+ of the label is larger than an explicitly specified num_qubits.
568
+ """
569
+
570
+ return DensityMatrix(Statevector.from_label(label))
571
+
572
+ @staticmethod
573
+ def from_int(i: int, dims: int | tuple | list) -> DensityMatrix:
574
+ """Return a computational basis state density matrix.
575
+
576
+ Args:
577
+ i (int): the basis state element.
578
+ dims (int or tuple or list): The subsystem dimensions of the statevector
579
+ (See additional information).
580
+
581
+ Returns:
582
+ DensityMatrix: The computational basis state :math:`|i\\rangle\\!\\langle i|`.
583
+
584
+ Additional Information:
585
+ The ``dims`` kwarg can be an integer or an iterable of integers.
586
+
587
+ * ``Iterable`` -- the subsystem dimensions are the values in the list
588
+ with the total number of subsystems given by the length of the list.
589
+
590
+ * ``Int`` -- the integer specifies the total dimension of the
591
+ state. If it is a power of two the state will be initialized
592
+ as an N-qubit state. If it is not a power of two the state
593
+ will have a single d-dimensional subsystem.
594
+ """
595
+ size = np.prod(dims)
596
+ state = np.zeros((size, size), dtype=complex)
597
+ state[i, i] = 1.0
598
+ return DensityMatrix(state, dims=dims)
599
+
600
+ @classmethod
601
+ def from_instruction(cls, instruction: Instruction | QuantumCircuit) -> DensityMatrix:
602
+ """Return the output density matrix of an instruction.
603
+
604
+ The statevector is initialized in the state :math:`|{0,\\ldots,0}\\rangle` of
605
+ the same number of qubits as the input instruction or circuit, evolved
606
+ by the input instruction, and the output statevector returned.
607
+
608
+ Args:
609
+ instruction (qiskit.circuit.Instruction or QuantumCircuit): instruction or circuit
610
+
611
+ Returns:
612
+ DensityMatrix: the final density matrix.
613
+
614
+ Raises:
615
+ QiskitError: if the instruction contains invalid instructions for
616
+ density matrix simulation.
617
+ """
618
+ # Convert circuit to an instruction
619
+ if isinstance(instruction, QuantumCircuit):
620
+ instruction = instruction.to_instruction()
621
+ # Initialize an the statevector in the all |0> state
622
+ num_qubits = instruction.num_qubits
623
+ init = np.zeros((2**num_qubits, 2**num_qubits), dtype=complex)
624
+ init[0, 0] = 1
625
+ vec = DensityMatrix(init, dims=num_qubits * (2,))
626
+ vec._append_instruction(instruction)
627
+ return vec
628
+
629
+ def to_dict(self, decimals: None | int = None) -> dict:
630
+ r"""Convert the density matrix to dictionary form.
631
+
632
+ This dictionary representation uses a Ket-like notation where the
633
+ dictionary keys are qudit strings for the subsystem basis vectors.
634
+ If any subsystem has a dimension greater than 10 comma delimiters are
635
+ inserted between integers so that subsystems can be distinguished.
636
+
637
+ Args:
638
+ decimals (None or int): the number of decimal places to round
639
+ values. If None no rounding is done
640
+ (Default: None).
641
+
642
+ Returns:
643
+ dict: the dictionary form of the DensityMatrix.
644
+
645
+ Examples:
646
+
647
+ The ket-form of a 2-qubit density matrix
648
+ :math:`rho = |-\rangle\!\langle -|\otimes |0\rangle\!\langle 0|`
649
+
650
+ .. code-block::
651
+
652
+ from qiskit.quantum_info import DensityMatrix
653
+
654
+ rho = DensityMatrix.from_label('-0')
655
+ print(rho.to_dict())
656
+
657
+ .. code-block:: text
658
+
659
+ {
660
+ '00|00': (0.4999999999999999+0j),
661
+ '10|00': (-0.4999999999999999-0j),
662
+ '00|10': (-0.4999999999999999+0j),
663
+ '10|10': (0.4999999999999999+0j)
664
+ }
665
+
666
+ For non-qubit subsystems the integer range can go from 0 to 9. For
667
+ example in a qutrit system
668
+
669
+ .. code-block::
670
+
671
+ import numpy as np
672
+ from qiskit.quantum_info import DensityMatrix
673
+
674
+ mat = np.zeros((9, 9))
675
+ mat[0, 0] = 0.25
676
+ mat[3, 3] = 0.25
677
+ mat[6, 6] = 0.25
678
+ mat[-1, -1] = 0.25
679
+ rho = DensityMatrix(mat, dims=(3, 3))
680
+ print(rho.to_dict())
681
+
682
+ .. code-block:: text
683
+
684
+ {'00|00': (0.25+0j), '10|10': (0.25+0j), '20|20': (0.25+0j), '22|22': (0.25+0j)}
685
+
686
+ For large subsystem dimensions delimiters are required. The
687
+ following example is for a 20-dimensional system consisting of
688
+ a qubit and 10-dimensional qudit.
689
+
690
+ .. code-block::
691
+
692
+ import numpy as np
693
+ from qiskit.quantum_info import DensityMatrix
694
+
695
+ mat = np.zeros((2 * 10, 2 * 10))
696
+ mat[0, 0] = 0.5
697
+ mat[-1, -1] = 0.5
698
+ rho = DensityMatrix(mat, dims=(2, 10))
699
+ print(rho.to_dict())
700
+
701
+ .. code-block:: text
702
+
703
+ {'00|00': (0.5+0j), '91|91': (0.5+0j)}
704
+ """
705
+ return self._matrix_to_dict(
706
+ self.data, self._op_shape.dims_l(), decimals=decimals, string_labels=True
707
+ )
708
+
709
+ def _evolve_operator(self, other, qargs=None):
710
+ """Evolve density matrix by an operator"""
711
+ # Get shape of output density matrix
712
+ new_shape = self._op_shape.compose(other._op_shape, qargs=qargs)
713
+ new_shape._dims_r = new_shape._dims_l
714
+ new_shape._num_qargs_r = new_shape._num_qargs_l
715
+
716
+ ret = _copy.copy(self)
717
+ if qargs is None:
718
+ # Evolution on full matrix
719
+ op_mat = other.data
720
+ ret._data = np.dot(op_mat, self.data).dot(op_mat.T.conj())
721
+ ret._op_shape = new_shape
722
+ return ret
723
+
724
+ # Reshape statevector and operator
725
+ tensor = np.reshape(self.data, self._op_shape.tensor_shape)
726
+ # Construct list of tensor indices of statevector to be contracted
727
+ num_indices = len(self.dims())
728
+ indices = [num_indices - 1 - qubit for qubit in qargs]
729
+ # Left multiple by mat
730
+ mat = np.reshape(other.data, other._op_shape.tensor_shape)
731
+ tensor = Operator._einsum_matmul(tensor, mat, indices)
732
+ # Right multiply by mat ** dagger
733
+ adj = other.adjoint()
734
+ mat_adj = np.reshape(adj.data, adj._op_shape.tensor_shape)
735
+ tensor = Operator._einsum_matmul(tensor, mat_adj, indices, num_indices, True)
736
+ # Replace evolved dimensions
737
+ ret._data = np.reshape(tensor, new_shape.shape)
738
+ ret._op_shape = new_shape
739
+ return ret
740
+
741
+ def _append_instruction(self, other, qargs=None):
742
+ """Update the current Statevector by applying an instruction."""
743
+ from qiskit.circuit.reset import Reset
744
+ from qiskit.circuit.barrier import Barrier
745
+
746
+ # Try evolving by a matrix operator (unitary-like evolution)
747
+ mat = Operator._instruction_to_matrix(other)
748
+ if mat is not None:
749
+ self._data = self._evolve_operator(Operator(mat), qargs=qargs).data
750
+ return
751
+
752
+ # Special instruction types
753
+ if isinstance(other, Reset):
754
+ self._data = self.reset(qargs)._data
755
+ return
756
+ if isinstance(other, Barrier):
757
+ return
758
+
759
+ # Otherwise try evolving by a Superoperator
760
+ chan = SuperOp._instruction_to_superop(other)
761
+ if chan is not None:
762
+ # Evolve current state by the superoperator
763
+ self._data = chan._evolve(self, qargs=qargs).data
764
+ return
765
+ # If the instruction doesn't have a matrix defined we use its
766
+ # circuit decomposition definition if it exists, otherwise we
767
+ # cannot compose this gate and raise an error.
768
+ if other.definition is None:
769
+ raise QiskitError(f"Cannot apply Instruction: {other.name}")
770
+ if not isinstance(other.definition, QuantumCircuit):
771
+ raise QiskitError(
772
+ f"{other.name} instruction definition is {type(other.definition)};"
773
+ f" expected QuantumCircuit"
774
+ )
775
+ qubit_indices = {bit: idx for idx, bit in enumerate(other.definition.qubits)}
776
+ for instruction in other.definition:
777
+ if instruction.clbits:
778
+ raise QiskitError(
779
+ f"Cannot apply instruction with classical bits: {instruction.operation.name}"
780
+ )
781
+ # Get the integer position of the flat register
782
+ if qargs is None:
783
+ new_qargs = [qubit_indices[tup] for tup in instruction.qubits]
784
+ else:
785
+ new_qargs = [qargs[qubit_indices[tup]] for tup in instruction.qubits]
786
+ self._append_instruction(instruction.operation, qargs=new_qargs)
787
+
788
+ def _evolve_instruction(self, obj, qargs=None):
789
+ """Return a new statevector by applying an instruction."""
790
+ if isinstance(obj, QuantumCircuit):
791
+ obj = obj.to_instruction()
792
+ vec = _copy.copy(self)
793
+ vec._append_instruction(obj, qargs=qargs)
794
+ return vec
795
+
796
+ def to_statevector(self, atol: float | None = None, rtol: float | None = None) -> Statevector:
797
+ """Return a statevector from a pure density matrix.
798
+
799
+ Args:
800
+ atol (float): Absolute tolerance for checking operation validity.
801
+ rtol (float): Relative tolerance for checking operation validity.
802
+
803
+ Returns:
804
+ Statevector: The pure density matrix's corresponding statevector.
805
+ Corresponds to the eigenvector of the only non-zero eigenvalue.
806
+
807
+ Raises:
808
+ QiskitError: if the state is not pure.
809
+ """
810
+
811
+ if atol is None:
812
+ atol = self.atol
813
+ if rtol is None:
814
+ rtol = self.rtol
815
+
816
+ if not is_hermitian_matrix(self._data, atol=atol, rtol=rtol):
817
+ raise QiskitError("Not a valid density matrix (non-hermitian).")
818
+
819
+ evals, evecs = np.linalg.eig(self._data)
820
+
821
+ nonzero_evals = evals[abs(evals) > atol]
822
+ if len(nonzero_evals) != 1 or not np.isclose(nonzero_evals[0], 1, atol=atol, rtol=rtol):
823
+ raise QiskitError("Density matrix is not a pure state")
824
+
825
+ psi = evecs[:, np.argmax(evals)] # eigenvectors returned in columns.
826
+ return Statevector(psi)
827
+
828
+ def partial_transpose(self, qargs: list[int]) -> DensityMatrix:
829
+ """Return partially transposed density matrix.
830
+
831
+ Args:
832
+ qargs (list): The subsystems to be transposed.
833
+
834
+ Returns:
835
+ DensityMatrix: The partially transposed density matrix.
836
+ """
837
+ arr = self._data.reshape(self._op_shape.tensor_shape)
838
+ qargs = len(self._op_shape.dims_l()) - 1 - np.array(qargs)
839
+ n = len(self.dims())
840
+ lst = list(range(2 * n))
841
+ for i in qargs:
842
+ lst[i], lst[i + n] = lst[i + n], lst[i]
843
+ rho = np.transpose(arr, lst)
844
+ rho = np.reshape(rho, self._op_shape.shape)
845
+ return DensityMatrix(rho, dims=self.dims())