qiskit 2.0.3__cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.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 (690) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +141 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/circuit/__init__.py +1343 -0
  6. qiskit/circuit/_add_control.py +312 -0
  7. qiskit/circuit/_classical_resource_map.py +150 -0
  8. qiskit/circuit/_standard_gates_commutations.py +3849 -0
  9. qiskit/circuit/_utils.py +167 -0
  10. qiskit/circuit/annotated_operation.py +279 -0
  11. qiskit/circuit/barrier.py +46 -0
  12. qiskit/circuit/classical/__init__.py +41 -0
  13. qiskit/circuit/classical/expr/__init__.py +266 -0
  14. qiskit/circuit/classical/expr/constructors.py +764 -0
  15. qiskit/circuit/classical/expr/expr.py +498 -0
  16. qiskit/circuit/classical/expr/visitors.py +375 -0
  17. qiskit/circuit/classical/types/__init__.py +113 -0
  18. qiskit/circuit/classical/types/ordering.py +229 -0
  19. qiskit/circuit/classical/types/types.py +153 -0
  20. qiskit/circuit/commutation_checker.py +133 -0
  21. qiskit/circuit/commutation_library.py +20 -0
  22. qiskit/circuit/controlflow/__init__.py +59 -0
  23. qiskit/circuit/controlflow/_builder_utils.py +211 -0
  24. qiskit/circuit/controlflow/box.py +163 -0
  25. qiskit/circuit/controlflow/break_loop.py +56 -0
  26. qiskit/circuit/controlflow/builder.py +791 -0
  27. qiskit/circuit/controlflow/continue_loop.py +56 -0
  28. qiskit/circuit/controlflow/control_flow.py +94 -0
  29. qiskit/circuit/controlflow/for_loop.py +218 -0
  30. qiskit/circuit/controlflow/if_else.py +498 -0
  31. qiskit/circuit/controlflow/switch_case.py +411 -0
  32. qiskit/circuit/controlflow/while_loop.py +166 -0
  33. qiskit/circuit/controlledgate.py +274 -0
  34. qiskit/circuit/delay.py +157 -0
  35. qiskit/circuit/duration.py +80 -0
  36. qiskit/circuit/equivalence.py +94 -0
  37. qiskit/circuit/equivalence_library.py +18 -0
  38. qiskit/circuit/exceptions.py +19 -0
  39. qiskit/circuit/gate.py +261 -0
  40. qiskit/circuit/instruction.py +564 -0
  41. qiskit/circuit/instructionset.py +132 -0
  42. qiskit/circuit/library/__init__.py +984 -0
  43. qiskit/circuit/library/arithmetic/__init__.py +40 -0
  44. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  45. qiskit/circuit/library/arithmetic/adders/adder.py +235 -0
  46. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  47. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  48. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  49. qiskit/circuit/library/arithmetic/exact_reciprocal.py +131 -0
  50. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  51. qiskit/circuit/library/arithmetic/integer_comparator.py +200 -0
  52. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +363 -0
  53. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +243 -0
  54. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  55. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  56. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +201 -0
  57. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  58. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +502 -0
  59. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +387 -0
  60. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +493 -0
  61. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +389 -0
  62. qiskit/circuit/library/arithmetic/quadratic_form.py +364 -0
  63. qiskit/circuit/library/arithmetic/weighted_adder.py +409 -0
  64. qiskit/circuit/library/basis_change/__init__.py +15 -0
  65. qiskit/circuit/library/basis_change/qft.py +316 -0
  66. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  67. qiskit/circuit/library/blueprintcircuit.py +316 -0
  68. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  69. qiskit/circuit/library/boolean_logic/inner_product.py +157 -0
  70. qiskit/circuit/library/boolean_logic/quantum_and.py +204 -0
  71. qiskit/circuit/library/boolean_logic/quantum_or.py +206 -0
  72. qiskit/circuit/library/boolean_logic/quantum_xor.py +167 -0
  73. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  74. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  75. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  76. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  77. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  78. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  79. qiskit/circuit/library/fourier_checking.py +160 -0
  80. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  81. qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
  82. qiskit/circuit/library/generalized_gates/gms.py +175 -0
  83. qiskit/circuit/library/generalized_gates/gr.py +219 -0
  84. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  85. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  86. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  87. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  88. qiskit/circuit/library/generalized_gates/pauli.py +84 -0
  89. qiskit/circuit/library/generalized_gates/permutation.py +198 -0
  90. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  91. qiskit/circuit/library/generalized_gates/uc.py +303 -0
  92. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  93. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  94. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  95. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  96. qiskit/circuit/library/generalized_gates/unitary.py +217 -0
  97. qiskit/circuit/library/graph_state.py +172 -0
  98. qiskit/circuit/library/grover_operator.py +583 -0
  99. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  100. qiskit/circuit/library/hidden_linear_function.py +163 -0
  101. qiskit/circuit/library/iqp.py +180 -0
  102. qiskit/circuit/library/n_local/__init__.py +45 -0
  103. qiskit/circuit/library/n_local/efficient_su2.py +282 -0
  104. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +520 -0
  105. qiskit/circuit/library/n_local/excitation_preserving.py +303 -0
  106. qiskit/circuit/library/n_local/n_local.py +1477 -0
  107. qiskit/circuit/library/n_local/pauli_two_design.py +246 -0
  108. qiskit/circuit/library/n_local/qaoa_ansatz.py +367 -0
  109. qiskit/circuit/library/n_local/real_amplitudes.py +312 -0
  110. qiskit/circuit/library/n_local/two_local.py +289 -0
  111. qiskit/circuit/library/overlap.py +183 -0
  112. qiskit/circuit/library/pauli_evolution.py +201 -0
  113. qiskit/circuit/library/phase_estimation.py +177 -0
  114. qiskit/circuit/library/phase_oracle.py +239 -0
  115. qiskit/circuit/library/quantum_volume.py +180 -0
  116. qiskit/circuit/library/standard_gates/__init__.py +141 -0
  117. qiskit/circuit/library/standard_gates/dcx.py +77 -0
  118. qiskit/circuit/library/standard_gates/ecr.py +129 -0
  119. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  120. qiskit/circuit/library/standard_gates/global_phase.py +84 -0
  121. qiskit/circuit/library/standard_gates/h.py +253 -0
  122. qiskit/circuit/library/standard_gates/i.py +76 -0
  123. qiskit/circuit/library/standard_gates/iswap.py +133 -0
  124. qiskit/circuit/library/standard_gates/p.py +422 -0
  125. qiskit/circuit/library/standard_gates/r.py +114 -0
  126. qiskit/circuit/library/standard_gates/rx.py +293 -0
  127. qiskit/circuit/library/standard_gates/rxx.py +180 -0
  128. qiskit/circuit/library/standard_gates/ry.py +286 -0
  129. qiskit/circuit/library/standard_gates/ryy.py +180 -0
  130. qiskit/circuit/library/standard_gates/rz.py +307 -0
  131. qiskit/circuit/library/standard_gates/rzx.py +226 -0
  132. qiskit/circuit/library/standard_gates/rzz.py +193 -0
  133. qiskit/circuit/library/standard_gates/s.py +419 -0
  134. qiskit/circuit/library/standard_gates/swap.py +281 -0
  135. qiskit/circuit/library/standard_gates/sx.py +310 -0
  136. qiskit/circuit/library/standard_gates/t.py +178 -0
  137. qiskit/circuit/library/standard_gates/u.py +395 -0
  138. qiskit/circuit/library/standard_gates/u1.py +490 -0
  139. qiskit/circuit/library/standard_gates/u2.py +145 -0
  140. qiskit/circuit/library/standard_gates/u3.py +428 -0
  141. qiskit/circuit/library/standard_gates/x.py +1481 -0
  142. qiskit/circuit/library/standard_gates/xx_minus_yy.py +202 -0
  143. qiskit/circuit/library/standard_gates/xx_plus_yy.py +236 -0
  144. qiskit/circuit/library/standard_gates/y.py +257 -0
  145. qiskit/circuit/library/standard_gates/z.py +338 -0
  146. qiskit/circuit/library/templates/__init__.py +92 -0
  147. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  148. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  149. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  150. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  151. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  152. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  153. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  154. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  155. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  156. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  157. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  158. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  159. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  160. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  161. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  162. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  163. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  164. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  165. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  166. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  167. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  168. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  169. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  170. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  171. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  172. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  173. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  174. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  175. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  176. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  177. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  178. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  179. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  180. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  181. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  182. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  184. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  187. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  188. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  189. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  190. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  191. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  192. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  193. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  194. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  195. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  196. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  197. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  198. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  199. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  200. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  201. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  202. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  214. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  215. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  216. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  217. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  218. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  219. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  220. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  221. qiskit/circuit/measure.py +53 -0
  222. qiskit/circuit/operation.py +68 -0
  223. qiskit/circuit/parameter.py +179 -0
  224. qiskit/circuit/parameterexpression.py +703 -0
  225. qiskit/circuit/parametertable.py +119 -0
  226. qiskit/circuit/parametervector.py +140 -0
  227. qiskit/circuit/quantumcircuit.py +7540 -0
  228. qiskit/circuit/quantumcircuitdata.py +136 -0
  229. qiskit/circuit/random/__init__.py +15 -0
  230. qiskit/circuit/random/utils.py +366 -0
  231. qiskit/circuit/reset.py +37 -0
  232. qiskit/circuit/singleton.py +600 -0
  233. qiskit/circuit/store.py +89 -0
  234. qiskit/circuit/tools/__init__.py +16 -0
  235. qiskit/circuit/tools/pi_check.py +193 -0
  236. qiskit/circuit/twirling.py +145 -0
  237. qiskit/compiler/__init__.py +27 -0
  238. qiskit/compiler/transpiler.py +375 -0
  239. qiskit/converters/__init__.py +74 -0
  240. qiskit/converters/circuit_to_dag.py +80 -0
  241. qiskit/converters/circuit_to_dagdependency.py +49 -0
  242. qiskit/converters/circuit_to_dagdependency_v2.py +46 -0
  243. qiskit/converters/circuit_to_gate.py +107 -0
  244. qiskit/converters/circuit_to_instruction.py +142 -0
  245. qiskit/converters/dag_to_circuit.py +79 -0
  246. qiskit/converters/dag_to_dagdependency.py +54 -0
  247. qiskit/converters/dag_to_dagdependency_v2.py +43 -0
  248. qiskit/converters/dagdependency_to_circuit.py +40 -0
  249. qiskit/converters/dagdependency_to_dag.py +48 -0
  250. qiskit/dagcircuit/__init__.py +55 -0
  251. qiskit/dagcircuit/collect_blocks.py +407 -0
  252. qiskit/dagcircuit/dagcircuit.py +24 -0
  253. qiskit/dagcircuit/dagdependency.py +612 -0
  254. qiskit/dagcircuit/dagdependency_v2.py +566 -0
  255. qiskit/dagcircuit/dagdepnode.py +160 -0
  256. qiskit/dagcircuit/dagnode.py +188 -0
  257. qiskit/dagcircuit/exceptions.py +42 -0
  258. qiskit/exceptions.py +153 -0
  259. qiskit/passmanager/__init__.py +258 -0
  260. qiskit/passmanager/base_tasks.py +230 -0
  261. qiskit/passmanager/compilation_status.py +74 -0
  262. qiskit/passmanager/exceptions.py +19 -0
  263. qiskit/passmanager/flow_controllers.py +116 -0
  264. qiskit/passmanager/passmanager.py +353 -0
  265. qiskit/primitives/__init__.py +490 -0
  266. qiskit/primitives/backend_estimator_v2.py +530 -0
  267. qiskit/primitives/backend_sampler_v2.py +339 -0
  268. qiskit/primitives/base/__init__.py +20 -0
  269. qiskit/primitives/base/base_estimator.py +247 -0
  270. qiskit/primitives/base/base_primitive_job.py +78 -0
  271. qiskit/primitives/base/base_primitive_v1.py +45 -0
  272. qiskit/primitives/base/base_result_v1.py +65 -0
  273. qiskit/primitives/base/base_sampler.py +196 -0
  274. qiskit/primitives/base/estimator_result_v1.py +46 -0
  275. qiskit/primitives/base/sampler_result_v1.py +45 -0
  276. qiskit/primitives/base/validation_v1.py +250 -0
  277. qiskit/primitives/containers/__init__.py +26 -0
  278. qiskit/primitives/containers/bindings_array.py +391 -0
  279. qiskit/primitives/containers/bit_array.py +764 -0
  280. qiskit/primitives/containers/data_bin.py +175 -0
  281. qiskit/primitives/containers/estimator_pub.py +222 -0
  282. qiskit/primitives/containers/object_array.py +94 -0
  283. qiskit/primitives/containers/observables_array.py +296 -0
  284. qiskit/primitives/containers/primitive_result.py +53 -0
  285. qiskit/primitives/containers/pub_result.py +51 -0
  286. qiskit/primitives/containers/sampler_pub.py +193 -0
  287. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  288. qiskit/primitives/containers/shape.py +129 -0
  289. qiskit/primitives/primitive_job.py +81 -0
  290. qiskit/primitives/statevector_estimator.py +175 -0
  291. qiskit/primitives/statevector_sampler.py +290 -0
  292. qiskit/primitives/utils.py +72 -0
  293. qiskit/providers/__init__.py +677 -0
  294. qiskit/providers/backend.py +364 -0
  295. qiskit/providers/basic_provider/__init__.py +47 -0
  296. qiskit/providers/basic_provider/basic_provider.py +121 -0
  297. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  298. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  299. qiskit/providers/basic_provider/basic_simulator.py +693 -0
  300. qiskit/providers/basic_provider/exceptions.py +30 -0
  301. qiskit/providers/exceptions.py +33 -0
  302. qiskit/providers/fake_provider/__init__.py +69 -0
  303. qiskit/providers/fake_provider/generic_backend_v2.py +374 -0
  304. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  305. qiskit/providers/job.py +147 -0
  306. qiskit/providers/jobstatus.py +30 -0
  307. qiskit/providers/options.py +273 -0
  308. qiskit/providers/providerutils.py +110 -0
  309. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  310. qiskit/qasm/libs/qelib1.inc +266 -0
  311. qiskit/qasm/libs/stdgates.inc +82 -0
  312. qiskit/qasm2/__init__.py +669 -0
  313. qiskit/qasm2/exceptions.py +27 -0
  314. qiskit/qasm2/export.py +364 -0
  315. qiskit/qasm2/parse.py +438 -0
  316. qiskit/qasm3/__init__.py +372 -0
  317. qiskit/qasm3/ast.py +782 -0
  318. qiskit/qasm3/exceptions.py +27 -0
  319. qiskit/qasm3/experimental.py +70 -0
  320. qiskit/qasm3/exporter.py +1340 -0
  321. qiskit/qasm3/printer.py +608 -0
  322. qiskit/qpy/__init__.py +1965 -0
  323. qiskit/qpy/binary_io/__init__.py +35 -0
  324. qiskit/qpy/binary_io/circuits.py +1455 -0
  325. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  326. qiskit/qpy/binary_io/schedules.py +308 -0
  327. qiskit/qpy/binary_io/value.py +1165 -0
  328. qiskit/qpy/common.py +353 -0
  329. qiskit/qpy/exceptions.py +53 -0
  330. qiskit/qpy/formats.py +442 -0
  331. qiskit/qpy/interface.py +344 -0
  332. qiskit/qpy/type_keys.py +409 -0
  333. qiskit/quantum_info/__init__.py +162 -0
  334. qiskit/quantum_info/analysis/__init__.py +17 -0
  335. qiskit/quantum_info/analysis/average.py +47 -0
  336. qiskit/quantum_info/analysis/distance.py +104 -0
  337. qiskit/quantum_info/analysis/make_observable.py +44 -0
  338. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  339. qiskit/quantum_info/operators/__init__.py +28 -0
  340. qiskit/quantum_info/operators/base_operator.py +145 -0
  341. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  342. qiskit/quantum_info/operators/channel/chi.py +191 -0
  343. qiskit/quantum_info/operators/channel/choi.py +218 -0
  344. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  345. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  346. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  347. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  348. qiskit/quantum_info/operators/channel/superop.py +373 -0
  349. qiskit/quantum_info/operators/channel/transformations.py +490 -0
  350. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  351. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  352. qiskit/quantum_info/operators/dihedral/dihedral.py +511 -0
  353. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  354. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  355. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  356. qiskit/quantum_info/operators/linear_op.py +25 -0
  357. qiskit/quantum_info/operators/measures.py +418 -0
  358. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  359. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  360. qiskit/quantum_info/operators/mixins/group.py +171 -0
  361. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  362. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  363. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  364. qiskit/quantum_info/operators/op_shape.py +525 -0
  365. qiskit/quantum_info/operators/operator.py +869 -0
  366. qiskit/quantum_info/operators/operator_utils.py +76 -0
  367. qiskit/quantum_info/operators/predicates.py +183 -0
  368. qiskit/quantum_info/operators/random.py +154 -0
  369. qiskit/quantum_info/operators/scalar_op.py +254 -0
  370. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  371. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  372. qiskit/quantum_info/operators/symplectic/clifford.py +1032 -0
  373. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  374. qiskit/quantum_info/operators/symplectic/pauli.py +755 -0
  375. qiskit/quantum_info/operators/symplectic/pauli_list.py +1242 -0
  376. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  377. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  378. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1239 -0
  379. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  380. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  381. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  382. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  383. qiskit/quantum_info/quaternion.py +156 -0
  384. qiskit/quantum_info/random.py +26 -0
  385. qiskit/quantum_info/states/__init__.py +28 -0
  386. qiskit/quantum_info/states/densitymatrix.py +857 -0
  387. qiskit/quantum_info/states/measures.py +288 -0
  388. qiskit/quantum_info/states/quantum_state.py +503 -0
  389. qiskit/quantum_info/states/random.py +157 -0
  390. qiskit/quantum_info/states/stabilizerstate.py +805 -0
  391. qiskit/quantum_info/states/statevector.py +977 -0
  392. qiskit/quantum_info/states/utils.py +247 -0
  393. qiskit/result/__init__.py +61 -0
  394. qiskit/result/counts.py +189 -0
  395. qiskit/result/distributions/__init__.py +17 -0
  396. qiskit/result/distributions/probability.py +100 -0
  397. qiskit/result/distributions/quasi.py +154 -0
  398. qiskit/result/exceptions.py +40 -0
  399. qiskit/result/models.py +241 -0
  400. qiskit/result/postprocess.py +239 -0
  401. qiskit/result/result.py +385 -0
  402. qiskit/result/sampled_expval.py +74 -0
  403. qiskit/result/utils.py +294 -0
  404. qiskit/synthesis/__init__.py +240 -0
  405. qiskit/synthesis/arithmetic/__init__.py +18 -0
  406. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  407. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  408. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  409. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  410. qiskit/synthesis/arithmetic/comparators/__init__.py +16 -0
  411. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  412. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  413. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  414. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +103 -0
  415. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +100 -0
  416. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  417. qiskit/synthesis/boolean/__init__.py +13 -0
  418. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  419. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  420. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  421. qiskit/synthesis/clifford/__init__.py +19 -0
  422. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  423. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  424. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  425. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  426. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  427. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  428. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  429. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  430. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  431. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  432. qiskit/synthesis/discrete_basis/commutator_decompose.py +265 -0
  433. qiskit/synthesis/discrete_basis/gate_sequence.py +421 -0
  434. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +165 -0
  435. qiskit/synthesis/discrete_basis/solovay_kitaev.py +240 -0
  436. qiskit/synthesis/evolution/__init__.py +21 -0
  437. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  438. qiskit/synthesis/evolution/lie_trotter.py +120 -0
  439. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  440. qiskit/synthesis/evolution/pauli_network.py +80 -0
  441. qiskit/synthesis/evolution/product_formula.py +313 -0
  442. qiskit/synthesis/evolution/qdrift.py +130 -0
  443. qiskit/synthesis/evolution/suzuki_trotter.py +224 -0
  444. qiskit/synthesis/linear/__init__.py +26 -0
  445. qiskit/synthesis/linear/cnot_synth.py +69 -0
  446. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  447. qiskit/synthesis/linear/linear_depth_lnn.py +61 -0
  448. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  449. qiskit/synthesis/linear_phase/__init__.py +17 -0
  450. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  451. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +61 -0
  452. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  453. qiskit/synthesis/multi_controlled/__init__.py +25 -0
  454. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  455. qiskit/synthesis/multi_controlled/mcx_synthesis.py +359 -0
  456. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  457. qiskit/synthesis/one_qubit/__init__.py +15 -0
  458. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  459. qiskit/synthesis/permutation/__init__.py +18 -0
  460. qiskit/synthesis/permutation/permutation_full.py +78 -0
  461. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  462. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  463. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  464. qiskit/synthesis/qft/__init__.py +16 -0
  465. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  466. qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
  467. qiskit/synthesis/stabilizer/__init__.py +16 -0
  468. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  469. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  470. qiskit/synthesis/two_qubit/__init__.py +20 -0
  471. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  472. qiskit/synthesis/two_qubit/two_qubit_decompose.py +583 -0
  473. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  474. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  475. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  476. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  477. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  478. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  479. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  480. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  481. qiskit/synthesis/unitary/__init__.py +13 -0
  482. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  483. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  484. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  485. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  486. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  487. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  488. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  489. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  490. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  491. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  492. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  493. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  494. qiskit/synthesis/unitary/qsd.py +288 -0
  495. qiskit/transpiler/__init__.py +1345 -0
  496. qiskit/transpiler/basepasses.py +190 -0
  497. qiskit/transpiler/coupling.py +500 -0
  498. qiskit/transpiler/exceptions.py +59 -0
  499. qiskit/transpiler/instruction_durations.py +281 -0
  500. qiskit/transpiler/layout.py +740 -0
  501. qiskit/transpiler/passes/__init__.py +276 -0
  502. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  503. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  504. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  505. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  506. qiskit/transpiler/passes/analysis/depth.py +33 -0
  507. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  508. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  509. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  510. qiskit/transpiler/passes/analysis/size.py +36 -0
  511. qiskit/transpiler/passes/analysis/width.py +27 -0
  512. qiskit/transpiler/passes/basis/__init__.py +19 -0
  513. qiskit/transpiler/passes/basis/basis_translator.py +138 -0
  514. qiskit/transpiler/passes/basis/decompose.py +137 -0
  515. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  516. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +84 -0
  517. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +110 -0
  518. qiskit/transpiler/passes/layout/__init__.py +26 -0
  519. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  520. qiskit/transpiler/passes/layout/apply_layout.py +128 -0
  521. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  522. qiskit/transpiler/passes/layout/dense_layout.py +177 -0
  523. qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
  524. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  525. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +116 -0
  526. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  527. qiskit/transpiler/passes/layout/sabre_layout.py +506 -0
  528. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  529. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  530. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  531. qiskit/transpiler/passes/layout/vf2_layout.py +256 -0
  532. qiskit/transpiler/passes/layout/vf2_post_layout.py +376 -0
  533. qiskit/transpiler/passes/layout/vf2_utils.py +235 -0
  534. qiskit/transpiler/passes/optimization/__init__.py +42 -0
  535. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  536. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  537. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  538. qiskit/transpiler/passes/optimization/collect_and_collapse.py +117 -0
  539. qiskit/transpiler/passes/optimization/collect_cliffords.py +109 -0
  540. qiskit/transpiler/passes/optimization/collect_linear_functions.py +85 -0
  541. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +242 -0
  542. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  543. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  544. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  545. qiskit/transpiler/passes/optimization/consolidate_blocks.py +176 -0
  546. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  547. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  548. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  549. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  550. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  551. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +267 -0
  552. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +250 -0
  553. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  554. qiskit/transpiler/passes/optimization/optimize_annotated.py +449 -0
  555. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  556. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  557. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  558. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  559. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +70 -0
  560. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  561. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +50 -0
  562. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +63 -0
  563. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  564. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  565. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  566. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  567. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  568. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +639 -0
  569. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  570. qiskit/transpiler/passes/routing/__init__.py +21 -0
  571. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  572. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  573. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  574. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  575. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  576. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  577. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  578. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +397 -0
  579. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  580. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  581. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  582. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  583. qiskit/transpiler/passes/routing/sabre_swap.py +463 -0
  584. qiskit/transpiler/passes/routing/star_prerouting.py +408 -0
  585. qiskit/transpiler/passes/routing/utils.py +35 -0
  586. qiskit/transpiler/passes/scheduling/__init__.py +21 -0
  587. qiskit/transpiler/passes/scheduling/alignments/__init__.py +79 -0
  588. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +70 -0
  589. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +251 -0
  590. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  591. qiskit/transpiler/passes/scheduling/padding/base_padding.py +284 -0
  592. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +415 -0
  593. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +90 -0
  594. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  595. qiskit/transpiler/passes/scheduling/scheduling/alap.py +93 -0
  596. qiskit/transpiler/passes/scheduling/scheduling/asap.py +100 -0
  597. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +88 -0
  598. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  599. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +237 -0
  600. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  601. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  602. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  603. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +429 -0
  604. qiskit/transpiler/passes/synthesis/hls_plugins.py +1963 -0
  605. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  606. qiskit/transpiler/passes/synthesis/plugin.py +738 -0
  607. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +313 -0
  608. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +425 -0
  609. qiskit/transpiler/passes/utils/__init__.py +32 -0
  610. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  611. qiskit/transpiler/passes/utils/check_gate_direction.py +60 -0
  612. qiskit/transpiler/passes/utils/check_map.py +78 -0
  613. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  614. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  615. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  616. qiskit/transpiler/passes/utils/error.py +69 -0
  617. qiskit/transpiler/passes/utils/filter_op_nodes.py +66 -0
  618. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  619. qiskit/transpiler/passes/utils/gate_direction.py +93 -0
  620. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  621. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  622. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  623. qiskit/transpiler/passes/utils/remove_barriers.py +50 -0
  624. qiskit/transpiler/passes/utils/remove_final_measurements.py +121 -0
  625. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  626. qiskit/transpiler/passmanager.py +503 -0
  627. qiskit/transpiler/passmanager_config.py +151 -0
  628. qiskit/transpiler/preset_passmanagers/__init__.py +93 -0
  629. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +993 -0
  630. qiskit/transpiler/preset_passmanagers/common.py +672 -0
  631. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +437 -0
  632. qiskit/transpiler/preset_passmanagers/level0.py +104 -0
  633. qiskit/transpiler/preset_passmanagers/level1.py +108 -0
  634. qiskit/transpiler/preset_passmanagers/level2.py +109 -0
  635. qiskit/transpiler/preset_passmanagers/level3.py +110 -0
  636. qiskit/transpiler/preset_passmanagers/plugin.py +346 -0
  637. qiskit/transpiler/target.py +905 -0
  638. qiskit/transpiler/timing_constraints.py +59 -0
  639. qiskit/user_config.py +266 -0
  640. qiskit/utils/__init__.py +90 -0
  641. qiskit/utils/classtools.py +146 -0
  642. qiskit/utils/deprecation.py +382 -0
  643. qiskit/utils/lazy_tester.py +363 -0
  644. qiskit/utils/optionals.py +354 -0
  645. qiskit/utils/parallel.py +318 -0
  646. qiskit/utils/units.py +146 -0
  647. qiskit/version.py +84 -0
  648. qiskit/visualization/__init__.py +290 -0
  649. qiskit/visualization/array.py +207 -0
  650. qiskit/visualization/bloch.py +778 -0
  651. qiskit/visualization/circuit/__init__.py +15 -0
  652. qiskit/visualization/circuit/_utils.py +675 -0
  653. qiskit/visualization/circuit/circuit_visualization.py +735 -0
  654. qiskit/visualization/circuit/latex.py +661 -0
  655. qiskit/visualization/circuit/matplotlib.py +2019 -0
  656. qiskit/visualization/circuit/qcstyle.py +278 -0
  657. qiskit/visualization/circuit/styles/__init__.py +13 -0
  658. qiskit/visualization/circuit/styles/bw.json +202 -0
  659. qiskit/visualization/circuit/styles/clifford.json +202 -0
  660. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  661. qiskit/visualization/circuit/styles/iqp.json +214 -0
  662. qiskit/visualization/circuit/styles/textbook.json +202 -0
  663. qiskit/visualization/circuit/text.py +1849 -0
  664. qiskit/visualization/circuit_visualization.py +19 -0
  665. qiskit/visualization/counts_visualization.py +487 -0
  666. qiskit/visualization/dag_visualization.py +318 -0
  667. qiskit/visualization/exceptions.py +21 -0
  668. qiskit/visualization/gate_map.py +1424 -0
  669. qiskit/visualization/library.py +40 -0
  670. qiskit/visualization/pass_manager_visualization.py +312 -0
  671. qiskit/visualization/state_visualization.py +1546 -0
  672. qiskit/visualization/timeline/__init__.py +21 -0
  673. qiskit/visualization/timeline/core.py +495 -0
  674. qiskit/visualization/timeline/drawings.py +260 -0
  675. qiskit/visualization/timeline/generators.py +506 -0
  676. qiskit/visualization/timeline/interface.py +444 -0
  677. qiskit/visualization/timeline/layouts.py +115 -0
  678. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  679. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  680. qiskit/visualization/timeline/plotters/matplotlib.py +195 -0
  681. qiskit/visualization/timeline/stylesheet.py +301 -0
  682. qiskit/visualization/timeline/types.py +148 -0
  683. qiskit/visualization/transition_visualization.py +369 -0
  684. qiskit/visualization/utils.py +49 -0
  685. qiskit-2.0.3.dist-info/METADATA +220 -0
  686. qiskit-2.0.3.dist-info/RECORD +690 -0
  687. qiskit-2.0.3.dist-info/WHEEL +6 -0
  688. qiskit-2.0.3.dist-info/entry_points.txt +82 -0
  689. qiskit-2.0.3.dist-info/licenses/LICENSE.txt +203 -0
  690. qiskit-2.0.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1165 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2021, 2022.
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
+ """Binary IO for any value objects, such as numbers, string, parameters."""
14
+
15
+ from __future__ import annotations
16
+
17
+ import collections.abc
18
+ import io
19
+ import struct
20
+ import uuid
21
+
22
+ import numpy as np
23
+ import symengine
24
+
25
+
26
+ from qiskit.circuit import CASE_DEFAULT, Clbit, ClassicalRegister, Duration
27
+ from qiskit.circuit.classical import expr, types
28
+ from qiskit.circuit.parameter import Parameter
29
+ from qiskit.circuit.parameterexpression import (
30
+ ParameterExpression,
31
+ op_code_to_method,
32
+ _OPCode,
33
+ _SUBS,
34
+ )
35
+ from qiskit.circuit.parametervector import ParameterVector, ParameterVectorElement
36
+ from qiskit.qpy import common, formats, exceptions, type_keys
37
+ from qiskit.qpy.binary_io.parse_sympy_repr import parse_sympy_repr
38
+
39
+
40
+ def _write_parameter(file_obj, obj):
41
+ name_bytes = obj.name.encode(common.ENCODE)
42
+ file_obj.write(struct.pack(formats.PARAMETER_PACK, len(name_bytes), obj.uuid.bytes))
43
+ file_obj.write(name_bytes)
44
+
45
+
46
+ def _write_parameter_vec(file_obj, obj):
47
+ name_bytes = obj._vector._name.encode(common.ENCODE)
48
+ file_obj.write(
49
+ struct.pack(
50
+ formats.PARAMETER_VECTOR_ELEMENT_PACK,
51
+ len(name_bytes),
52
+ len(obj._vector),
53
+ obj.uuid.bytes,
54
+ obj._index,
55
+ )
56
+ )
57
+ file_obj.write(name_bytes)
58
+
59
+
60
+ def _encode_replay_entry(inst, file_obj, version, r_side=False):
61
+ inst_type = None
62
+ inst_data = None
63
+ if inst is None:
64
+ inst_type = "n"
65
+ inst_data = b"\x00"
66
+ elif isinstance(inst, Parameter):
67
+ inst_type = "p"
68
+ inst_data = inst.uuid.bytes
69
+ elif isinstance(inst, complex):
70
+ inst_type = "c"
71
+ inst_data = struct.pack("!dd", inst.real, inst.imag)
72
+ elif isinstance(inst, float):
73
+ inst_type = "f"
74
+ inst_data = struct.pack("!Qd", 0, inst)
75
+ elif isinstance(inst, int):
76
+ inst_type = "i"
77
+ inst_data = struct.pack("!Qq", 0, inst)
78
+ elif isinstance(inst, ParameterExpression):
79
+ if not r_side:
80
+ entry = struct.pack(
81
+ formats.PARAM_EXPR_ELEM_V13_PACK,
82
+ 255,
83
+ "s".encode("utf8"),
84
+ b"\x00",
85
+ "n".encode("utf8"),
86
+ b"\x00",
87
+ )
88
+ else:
89
+ entry = struct.pack(
90
+ formats.PARAM_EXPR_ELEM_V13_PACK,
91
+ 255,
92
+ "n".encode("utf8"),
93
+ b"\x00",
94
+ "s".encode("utf8"),
95
+ b"\x00",
96
+ )
97
+ file_obj.write(entry)
98
+ _write_parameter_expression_v13(file_obj, inst, version)
99
+ if not r_side:
100
+ entry = struct.pack(
101
+ formats.PARAM_EXPR_ELEM_V13_PACK,
102
+ 255,
103
+ "e".encode("utf8"),
104
+ b"\x00",
105
+ "n".encode("utf8"),
106
+ b"\x00",
107
+ )
108
+ else:
109
+ entry = struct.pack(
110
+ formats.PARAM_EXPR_ELEM_V13_PACK,
111
+ 255,
112
+ "n".encode("utf8"),
113
+ b"\x00",
114
+ "e".encode("utf8"),
115
+ b"\x00",
116
+ )
117
+ file_obj.write(entry)
118
+ inst_type = "n"
119
+ inst_data = b"\x00"
120
+ else:
121
+ raise exceptions.QpyError("Invalid parameter expression type")
122
+ return inst_type, inst_data
123
+
124
+
125
+ def _encode_replay_subs(subs, file_obj, version):
126
+ with io.BytesIO() as mapping_buf:
127
+ subs_dict = {k.name: v for k, v in subs.binds.items()}
128
+ common.write_mapping(
129
+ mapping_buf, mapping=subs_dict, serializer=dumps_value, version=version
130
+ )
131
+ data = mapping_buf.getvalue()
132
+ entry = struct.pack(
133
+ formats.PARAM_EXPR_ELEM_V13_PACK,
134
+ subs.op,
135
+ "u".encode("utf8"),
136
+ struct.pack("!QQ", len(data), 0),
137
+ "n".encode("utf8"),
138
+ b"\x00",
139
+ )
140
+ file_obj.write(entry)
141
+ file_obj.write(data)
142
+ return subs.binds
143
+
144
+
145
+ def _write_parameter_expression_v13(file_obj, obj, version):
146
+ # A symbol is `Parameter` or `ParameterVectorElement`.
147
+ # `symbol_map` maps symbols to ParameterExpression (which may be a symbol).
148
+ symbol_map = {}
149
+ for inst in obj._qpy_replay:
150
+ if isinstance(inst, _SUBS):
151
+ symbol_map.update(_encode_replay_subs(inst, file_obj, version))
152
+ continue
153
+ lhs_type, lhs = _encode_replay_entry(inst.lhs, file_obj, version)
154
+ rhs_type, rhs = _encode_replay_entry(inst.rhs, file_obj, version, True)
155
+ entry = struct.pack(
156
+ formats.PARAM_EXPR_ELEM_V13_PACK,
157
+ inst.op,
158
+ lhs_type.encode("utf8"),
159
+ lhs,
160
+ rhs_type.encode("utf8"),
161
+ rhs,
162
+ )
163
+ file_obj.write(entry)
164
+ return symbol_map
165
+
166
+
167
+ def _write_parameter_expression(file_obj, obj, use_symengine, *, version):
168
+ extra_symbols = None
169
+ with io.BytesIO() as buf:
170
+ extra_symbols = _write_parameter_expression_v13(buf, obj, version)
171
+ expr_bytes = buf.getvalue()
172
+ symbol_table_len = len(obj._parameter_symbols)
173
+ if extra_symbols:
174
+ symbol_table_len += 2 * len(extra_symbols)
175
+ param_expr_header_raw = struct.pack(
176
+ formats.PARAMETER_EXPR_PACK, symbol_table_len, len(expr_bytes)
177
+ )
178
+ file_obj.write(param_expr_header_raw)
179
+ file_obj.write(expr_bytes)
180
+ for symbol, value in obj._parameter_symbols.items():
181
+ symbol_key = type_keys.Value.assign(symbol)
182
+
183
+ # serialize key
184
+ if symbol_key == type_keys.Value.PARAMETER_VECTOR:
185
+ symbol_data = common.data_to_binary(symbol, _write_parameter_vec)
186
+ else:
187
+ symbol_data = common.data_to_binary(symbol, _write_parameter)
188
+
189
+ # serialize value
190
+ if value == symbol._symbol_expr:
191
+ value_key = symbol_key
192
+ value_data = bytes()
193
+ else:
194
+ value_key, value_data = dumps_value(value, version=version, use_symengine=use_symengine)
195
+
196
+ elem_header = struct.pack(
197
+ formats.PARAM_EXPR_MAP_ELEM_V3_PACK,
198
+ symbol_key,
199
+ value_key,
200
+ len(value_data),
201
+ )
202
+ file_obj.write(elem_header)
203
+ file_obj.write(symbol_data)
204
+ file_obj.write(value_data)
205
+ if extra_symbols:
206
+ for symbol in extra_symbols:
207
+ symbol_key = type_keys.Value.assign(symbol)
208
+ # serialize key
209
+ if symbol_key == type_keys.Value.PARAMETER_VECTOR:
210
+ symbol_data = common.data_to_binary(symbol, _write_parameter_vec)
211
+ else:
212
+ symbol_data = common.data_to_binary(symbol, _write_parameter)
213
+ # serialize value
214
+ value_key, value_data = dumps_value(
215
+ symbol, version=version, use_symengine=use_symengine
216
+ )
217
+
218
+ elem_header = struct.pack(
219
+ formats.PARAM_EXPR_MAP_ELEM_V3_PACK,
220
+ symbol_key,
221
+ value_key,
222
+ len(value_data),
223
+ )
224
+ file_obj.write(elem_header)
225
+ file_obj.write(symbol_data)
226
+ file_obj.write(value_data)
227
+ for symbol in extra_symbols.values():
228
+ symbol_key = type_keys.Value.assign(symbol)
229
+ # serialize key
230
+ if symbol_key == type_keys.Value.PARAMETER_VECTOR:
231
+ symbol_data = common.data_to_binary(symbol, _write_parameter_vec)
232
+ elif symbol_key == type_keys.Value.PARAMETER_EXPRESSION:
233
+ symbol_data = common.data_to_binary(
234
+ symbol,
235
+ _write_parameter_expression,
236
+ use_symengine=use_symengine,
237
+ version=version,
238
+ )
239
+ else:
240
+ symbol_data = common.data_to_binary(symbol, _write_parameter)
241
+ # serialize value
242
+
243
+ value_key, value_data = dumps_value(
244
+ symbol, version=version, use_symengine=use_symengine
245
+ )
246
+
247
+ elem_header = struct.pack(
248
+ formats.PARAM_EXPR_MAP_ELEM_V3_PACK,
249
+ symbol_key,
250
+ value_key,
251
+ len(value_data),
252
+ )
253
+ file_obj.write(elem_header)
254
+ file_obj.write(symbol_data)
255
+ file_obj.write(value_data)
256
+
257
+
258
+ class _ExprWriter(expr.ExprVisitor[None]):
259
+ __slots__ = ("file_obj", "clbit_indices", "standalone_var_indices", "version")
260
+
261
+ def __init__(self, file_obj, clbit_indices, standalone_var_indices, version):
262
+ self.file_obj = file_obj
263
+ self.clbit_indices = clbit_indices
264
+ self.standalone_var_indices = standalone_var_indices
265
+ self.version = version
266
+
267
+ def _write_expr_type(self, type_, /):
268
+ _write_expr_type(self.file_obj, type_, self.version)
269
+
270
+ def visit_generic(self, node, /):
271
+ raise exceptions.QpyError(f"unhandled Expr object '{node}'")
272
+
273
+ def visit_var(self, node, /):
274
+ self.file_obj.write(type_keys.Expression.VAR)
275
+ self._write_expr_type(node.type)
276
+ if node.standalone:
277
+ self.file_obj.write(type_keys.ExprVar.UUID)
278
+ self.file_obj.write(
279
+ struct.pack(
280
+ formats.EXPR_VAR_UUID_PACK,
281
+ *formats.EXPR_VAR_UUID(self.standalone_var_indices[node]),
282
+ )
283
+ )
284
+ elif isinstance(node.var, Clbit):
285
+ self.file_obj.write(type_keys.ExprVar.CLBIT)
286
+ self.file_obj.write(
287
+ struct.pack(
288
+ formats.EXPR_VAR_CLBIT_PACK,
289
+ *formats.EXPR_VAR_CLBIT(self.clbit_indices[node.var]),
290
+ )
291
+ )
292
+ elif isinstance(node.var, ClassicalRegister):
293
+ self.file_obj.write(type_keys.ExprVar.REGISTER)
294
+ self.file_obj.write(
295
+ struct.pack(
296
+ formats.EXPR_VAR_REGISTER_PACK, *formats.EXPR_VAR_REGISTER(len(node.var.name))
297
+ )
298
+ )
299
+ self.file_obj.write(node.var.name.encode(common.ENCODE))
300
+ else:
301
+ raise exceptions.QpyError(f"unhandled Var object '{node.var}'")
302
+
303
+ def visit_stretch(self, node, /):
304
+ self.file_obj.write(type_keys.Expression.STRETCH)
305
+ self._write_expr_type(node.type)
306
+ self.file_obj.write(
307
+ struct.pack(
308
+ formats.EXPRESSION_STRETCH_PACK,
309
+ *formats.EXPRESSION_STRETCH(self.standalone_var_indices[node]),
310
+ )
311
+ )
312
+
313
+ def visit_value(self, node, /):
314
+ self.file_obj.write(type_keys.Expression.VALUE)
315
+ self._write_expr_type(node.type)
316
+ if node.value is True or node.value is False:
317
+ self.file_obj.write(type_keys.ExprValue.BOOL)
318
+ self.file_obj.write(
319
+ struct.pack(formats.EXPR_VALUE_BOOL_PACK, *formats.EXPR_VALUE_BOOL(node.value))
320
+ )
321
+ elif isinstance(node.value, int):
322
+ self.file_obj.write(type_keys.ExprValue.INT)
323
+ if node.value == 0:
324
+ num_bytes = 0
325
+ buffer = b""
326
+ else:
327
+ # This wastes a byte for `-(2 ** (8*n - 1))` for natural `n`, but they'll still
328
+ # decode fine so it's not worth another special case. They'll encode to
329
+ # b"\xff\x80\x00\x00...", but we could encode them to b"\x80\x00\x00...".
330
+ num_bytes = (node.value.bit_length() // 8) + 1
331
+ buffer = node.value.to_bytes(num_bytes, "big", signed=True)
332
+ self.file_obj.write(
333
+ struct.pack(formats.EXPR_VALUE_INT_PACK, *formats.EXPR_VALUE_INT(num_bytes))
334
+ )
335
+ self.file_obj.write(buffer)
336
+ elif isinstance(node.value, float):
337
+ self.file_obj.write(type_keys.ExprValue.FLOAT)
338
+ self.file_obj.write(
339
+ struct.pack(formats.EXPR_VALUE_FLOAT_PACK, *formats.EXPR_VALUE_FLOAT(node.value))
340
+ )
341
+ elif isinstance(node.value, Duration):
342
+ self.file_obj.write(type_keys.ExprValue.DURATION)
343
+ _write_duration(self.file_obj, node.value)
344
+ else:
345
+ raise exceptions.QpyError(f"unhandled Value object '{node.value}'")
346
+
347
+ def visit_cast(self, node, /):
348
+ self.file_obj.write(type_keys.Expression.CAST)
349
+ self._write_expr_type(node.type)
350
+ self.file_obj.write(
351
+ struct.pack(formats.EXPRESSION_CAST_PACK, *formats.EXPRESSION_CAST(node.implicit))
352
+ )
353
+ node.operand.accept(self)
354
+
355
+ def visit_unary(self, node, /):
356
+ self.file_obj.write(type_keys.Expression.UNARY)
357
+ self._write_expr_type(node.type)
358
+ self.file_obj.write(
359
+ struct.pack(formats.EXPRESSION_UNARY_PACK, *formats.EXPRESSION_UNARY(node.op.value))
360
+ )
361
+ node.operand.accept(self)
362
+
363
+ def visit_binary(self, node, /):
364
+ self.file_obj.write(type_keys.Expression.BINARY)
365
+ self._write_expr_type(node.type)
366
+ self.file_obj.write(
367
+ struct.pack(formats.EXPRESSION_BINARY_PACK, *formats.EXPRESSION_BINARY(node.op.value))
368
+ )
369
+ node.left.accept(self)
370
+ node.right.accept(self)
371
+
372
+ def visit_index(self, node, /):
373
+ if self.version < 12:
374
+ raise exceptions.UnsupportedFeatureForVersion(
375
+ "the 'Index' expression", required=12, target=self.version
376
+ )
377
+ self.file_obj.write(type_keys.Expression.INDEX)
378
+ self._write_expr_type(node.type)
379
+ node.target.accept(self)
380
+ node.index.accept(self)
381
+
382
+
383
+ def _write_expr(
384
+ file_obj,
385
+ node: expr.Expr,
386
+ clbit_indices: collections.abc.Mapping[Clbit, int],
387
+ standalone_var_indices: collections.abc.Mapping[expr.Var, int],
388
+ version: int,
389
+ ):
390
+ node.accept(_ExprWriter(file_obj, clbit_indices, standalone_var_indices, version))
391
+
392
+
393
+ def _write_expr_type(file_obj, type_: types.Type, version: int):
394
+ if type_.kind is types.Bool:
395
+ file_obj.write(type_keys.ExprType.BOOL)
396
+ elif type_.kind is types.Uint:
397
+ file_obj.write(type_keys.ExprType.UINT)
398
+ file_obj.write(
399
+ struct.pack(formats.EXPR_TYPE_UINT_PACK, *formats.EXPR_TYPE_UINT(type_.width))
400
+ )
401
+ elif type_.kind is types.Float:
402
+ if version < 14:
403
+ raise exceptions.UnsupportedFeatureForVersion(
404
+ "float-typed expressions", required=14, target=version
405
+ )
406
+ file_obj.write(type_keys.ExprType.FLOAT)
407
+ elif type_.kind is types.Duration:
408
+ if version < 14:
409
+ raise exceptions.UnsupportedFeatureForVersion(
410
+ "duration-typed expressions", required=14, target=version
411
+ )
412
+ file_obj.write(type_keys.ExprType.DURATION)
413
+ else:
414
+ raise exceptions.QpyError(f"unhandled Type object '{type_};")
415
+
416
+
417
+ def _write_duration(file_obj, duration: Duration):
418
+ unit = duration.unit()
419
+ if unit == "dt":
420
+ file_obj.write(type_keys.CircuitDuration.DT)
421
+ file_obj.write(
422
+ struct.pack(formats.DURATION_DT_PACK, *formats.DURATION_DT(duration.value()))
423
+ )
424
+ elif unit == "ns":
425
+ file_obj.write(type_keys.CircuitDuration.NS)
426
+ file_obj.write(
427
+ struct.pack(formats.DURATION_NS_PACK, *formats.DURATION_NS(duration.value()))
428
+ )
429
+ elif unit == "us":
430
+ file_obj.write(type_keys.CircuitDuration.US)
431
+ file_obj.write(
432
+ struct.pack(formats.DURATION_US_PACK, *formats.DURATION_US(duration.value()))
433
+ )
434
+ elif unit == "ms":
435
+ file_obj.write(type_keys.CircuitDuration.MS)
436
+ file_obj.write(
437
+ struct.pack(formats.DURATION_MS_PACK, *formats.DURATION_MS(duration.value()))
438
+ )
439
+ elif unit == "s":
440
+ file_obj.write(type_keys.CircuitDuration.S)
441
+ file_obj.write(struct.pack(formats.DURATION_S_PACK, *formats.DURATION_S(duration.value())))
442
+ else:
443
+ raise exceptions.QpyError(f"unhandled Duration object '{duration};")
444
+
445
+
446
+ def _read_parameter(file_obj):
447
+ data = formats.PARAMETER(
448
+ *struct.unpack(formats.PARAMETER_PACK, file_obj.read(formats.PARAMETER_SIZE))
449
+ )
450
+ param_uuid = uuid.UUID(bytes=data.uuid)
451
+ name = file_obj.read(data.name_size).decode(common.ENCODE)
452
+ return Parameter(name, uuid=param_uuid)
453
+
454
+
455
+ def _read_parameter_vec(file_obj, vectors):
456
+ data = formats.PARAMETER_VECTOR_ELEMENT(
457
+ *struct.unpack(
458
+ formats.PARAMETER_VECTOR_ELEMENT_PACK,
459
+ file_obj.read(formats.PARAMETER_VECTOR_ELEMENT_SIZE),
460
+ ),
461
+ )
462
+ param_uuid = uuid.UUID(bytes=data.uuid)
463
+ name = file_obj.read(data.vector_name_size).decode(common.ENCODE)
464
+ if name not in vectors:
465
+ vectors[name] = (ParameterVector(name, data.vector_size), set())
466
+ vector = vectors[name][0]
467
+ if vector[data.index].uuid != param_uuid:
468
+ vectors[name][1].add(data.index)
469
+ vector._params[data.index] = ParameterVectorElement(vector, data.index, uuid=param_uuid)
470
+ return vector[data.index]
471
+
472
+
473
+ def _read_parameter_expression(file_obj):
474
+ data = formats.PARAMETER_EXPR(
475
+ *struct.unpack(formats.PARAMETER_EXPR_PACK, file_obj.read(formats.PARAMETER_EXPR_SIZE))
476
+ )
477
+
478
+ sympy_str = file_obj.read(data.expr_size).decode(common.ENCODE)
479
+ expr_ = symengine.sympify(parse_sympy_repr(sympy_str))
480
+ symbol_map = {}
481
+ for _ in range(data.map_elements):
482
+ elem_data = formats.PARAM_EXPR_MAP_ELEM(
483
+ *struct.unpack(
484
+ formats.PARAM_EXPR_MAP_ELEM_PACK,
485
+ file_obj.read(formats.PARAM_EXPR_MAP_ELEM_SIZE),
486
+ )
487
+ )
488
+ symbol = _read_parameter(file_obj)
489
+
490
+ elem_key = type_keys.Value(elem_data.type)
491
+ binary_data = file_obj.read(elem_data.size)
492
+ if elem_key == type_keys.Value.INTEGER:
493
+ value = struct.unpack("!q", binary_data)
494
+ elif elem_key == type_keys.Value.FLOAT:
495
+ value = struct.unpack("!d", binary_data)
496
+ elif elem_key == type_keys.Value.COMPLEX:
497
+ value = complex(*struct.unpack(formats.COMPLEX_PACK, binary_data))
498
+ elif elem_key == type_keys.Value.PARAMETER:
499
+ value = symbol._symbol_expr
500
+ elif elem_key == type_keys.Value.PARAMETER_EXPRESSION:
501
+ value = common.data_from_binary(binary_data, _read_parameter_expression)
502
+ else:
503
+ raise exceptions.QpyError(f"Invalid parameter expression map type: {elem_key}")
504
+ symbol_map[symbol] = value
505
+
506
+ return ParameterExpression(symbol_map, expr_)
507
+
508
+
509
+ def _read_parameter_expression_v3(file_obj, vectors, use_symengine):
510
+ data = formats.PARAMETER_EXPR(
511
+ *struct.unpack(formats.PARAMETER_EXPR_PACK, file_obj.read(formats.PARAMETER_EXPR_SIZE))
512
+ )
513
+
514
+ payload = file_obj.read(data.expr_size)
515
+ if use_symengine:
516
+ expr_ = common.load_symengine_payload(payload)
517
+ else:
518
+ sympy_str = payload.decode(common.ENCODE)
519
+ expr_ = symengine.sympify(parse_sympy_repr(sympy_str))
520
+
521
+ symbol_map = {}
522
+ for _ in range(data.map_elements):
523
+ elem_data = formats.PARAM_EXPR_MAP_ELEM_V3(
524
+ *struct.unpack(
525
+ formats.PARAM_EXPR_MAP_ELEM_V3_PACK,
526
+ file_obj.read(formats.PARAM_EXPR_MAP_ELEM_V3_SIZE),
527
+ )
528
+ )
529
+ symbol_key = type_keys.Value(elem_data.symbol_type)
530
+
531
+ if symbol_key == type_keys.Value.PARAMETER:
532
+ symbol = _read_parameter(file_obj)
533
+ elif symbol_key == type_keys.Value.PARAMETER_VECTOR:
534
+ symbol = _read_parameter_vec(file_obj, vectors)
535
+ else:
536
+ raise exceptions.QpyError(f"Invalid parameter expression map type: {symbol_key}")
537
+
538
+ elem_key = type_keys.Value(elem_data.type)
539
+ binary_data = file_obj.read(elem_data.size)
540
+ if elem_key == type_keys.Value.INTEGER:
541
+ value = struct.unpack("!q", binary_data)
542
+ elif elem_key == type_keys.Value.FLOAT:
543
+ value = struct.unpack("!d", binary_data)
544
+ elif elem_key == type_keys.Value.COMPLEX:
545
+ value = complex(*struct.unpack(formats.COMPLEX_PACK, binary_data))
546
+ elif elem_key in (type_keys.Value.PARAMETER, type_keys.Value.PARAMETER_VECTOR):
547
+ value = symbol._symbol_expr
548
+ elif elem_key == type_keys.Value.PARAMETER_EXPRESSION:
549
+ value = common.data_from_binary(
550
+ binary_data,
551
+ _read_parameter_expression_v3,
552
+ vectors=vectors,
553
+ use_symengine=use_symengine,
554
+ )
555
+ else:
556
+ raise exceptions.QpyError(f"Invalid parameter expression map type: {elem_key}")
557
+ symbol_map[symbol] = value
558
+
559
+ return ParameterExpression(symbol_map, expr_)
560
+
561
+
562
+ def _read_parameter_expression_v13(file_obj, vectors, version):
563
+ data = formats.PARAMETER_EXPR(
564
+ *struct.unpack(formats.PARAMETER_EXPR_PACK, file_obj.read(formats.PARAMETER_EXPR_SIZE))
565
+ )
566
+
567
+ payload = file_obj.read(data.expr_size)
568
+
569
+ symbol_map = {}
570
+ for _ in range(data.map_elements):
571
+ elem_data = formats.PARAM_EXPR_MAP_ELEM_V3(
572
+ *struct.unpack(
573
+ formats.PARAM_EXPR_MAP_ELEM_V3_PACK,
574
+ file_obj.read(formats.PARAM_EXPR_MAP_ELEM_V3_SIZE),
575
+ )
576
+ )
577
+ symbol_key = type_keys.Value(elem_data.symbol_type)
578
+
579
+ if symbol_key == type_keys.Value.PARAMETER:
580
+ symbol = _read_parameter(file_obj)
581
+ elif symbol_key == type_keys.Value.PARAMETER_VECTOR:
582
+ symbol = _read_parameter_vec(file_obj, vectors)
583
+ elif symbol_key == type_keys.Value.PARAMETER_EXPRESSION:
584
+ symbol = _read_parameter_expression_v13(file_obj, vectors, version)
585
+ else:
586
+ raise exceptions.QpyError(f"Invalid parameter expression map type: {symbol_key}")
587
+
588
+ elem_key = type_keys.Value(elem_data.type)
589
+
590
+ binary_data = file_obj.read(elem_data.size)
591
+ if elem_key == type_keys.Value.INTEGER:
592
+ value = struct.unpack("!q", binary_data)
593
+ elif elem_key == type_keys.Value.FLOAT:
594
+ value = struct.unpack("!d", binary_data)
595
+ elif elem_key == type_keys.Value.COMPLEX:
596
+ value = complex(*struct.unpack(formats.COMPLEX_PACK, binary_data))
597
+ elif elem_key in (type_keys.Value.PARAMETER, type_keys.Value.PARAMETER_VECTOR):
598
+ value = symbol._symbol_expr
599
+ elif elem_key == type_keys.Value.PARAMETER_EXPRESSION:
600
+ value = common.data_from_binary(
601
+ binary_data,
602
+ _read_parameter_expression_v13,
603
+ vectors=vectors,
604
+ version=version,
605
+ )
606
+ else:
607
+ raise exceptions.QpyError(f"Invalid parameter expression map type: {elem_key}")
608
+ symbol_map[symbol] = value
609
+ with io.BytesIO(payload) as buf:
610
+ return _read_parameter_expr_v13(buf, symbol_map, version, vectors)
611
+
612
+
613
+ def _read_parameter_expr_v13(buf, symbol_map, version, vectors):
614
+ param_uuid_map = {symbol.uuid: symbol for symbol in symbol_map if isinstance(symbol, Parameter)}
615
+ name_map = {str(v): k for k, v in symbol_map.items()}
616
+ data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
617
+ stack = []
618
+ while data:
619
+ expression_data = formats.PARAM_EXPR_ELEM_V13._make(
620
+ struct.unpack(formats.PARAM_EXPR_ELEM_V13_PACK, data)
621
+ )
622
+ # LHS
623
+ if expression_data.LHS_TYPE == b"p":
624
+ stack.append(param_uuid_map[uuid.UUID(bytes=expression_data.LHS)])
625
+ elif expression_data.LHS_TYPE == b"f":
626
+ stack.append(struct.unpack("!Qd", expression_data.LHS)[1])
627
+ elif expression_data.LHS_TYPE == b"n":
628
+ pass
629
+ elif expression_data.LHS_TYPE == b"c":
630
+ stack.append(complex(*struct.unpack("!dd", expression_data.LHS)))
631
+ elif expression_data.LHS_TYPE == b"i":
632
+ stack.append(struct.unpack("!Qq", expression_data.LHS)[1])
633
+ elif expression_data.LHS_TYPE == b"s":
634
+ data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
635
+ continue
636
+ elif expression_data.LHS_TYPE == b"e":
637
+ data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
638
+ continue
639
+ elif expression_data.LHS_TYPE == b"u":
640
+ size = struct.unpack_from("!QQ", expression_data.LHS)[0]
641
+ subs_map_data = buf.read(size)
642
+ with io.BytesIO(subs_map_data) as mapping_buf:
643
+ mapping = common.read_mapping(
644
+ mapping_buf, deserializer=loads_value, version=version, vectors=vectors
645
+ )
646
+ stack.append({name_map[k]: v for k, v in mapping.items()})
647
+ else:
648
+ raise exceptions.QpyError(
649
+ "Unknown ParameterExpression operation type {expression_data.LHS_TYPE}"
650
+ )
651
+ # RHS
652
+ if expression_data.RHS_TYPE == b"p":
653
+ stack.append(param_uuid_map[uuid.UUID(bytes=expression_data.RHS)])
654
+ elif expression_data.RHS_TYPE == b"f":
655
+ stack.append(struct.unpack("!Qd", expression_data.RHS)[1])
656
+ elif expression_data.RHS_TYPE == b"n":
657
+ pass
658
+ elif expression_data.RHS_TYPE == b"c":
659
+ stack.append(complex(*struct.unpack("!dd", expression_data.RHS)))
660
+ elif expression_data.RHS_TYPE == b"i":
661
+ stack.append(struct.unpack("!Qq", expression_data.RHS)[1])
662
+ elif expression_data.RHS_TYPE == b"s":
663
+ data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
664
+ continue
665
+ elif expression_data.RHS_TYPE == b"e":
666
+ data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
667
+ continue
668
+ else:
669
+ raise exceptions.QpyError(
670
+ f"Unknown ParameterExpression operation type {expression_data.RHS_TYPE}"
671
+ )
672
+ if expression_data.OP_CODE == 255:
673
+ continue
674
+ method_str = op_code_to_method(_OPCode(expression_data.OP_CODE))
675
+ if expression_data.OP_CODE in {0, 1, 2, 3, 4, 13, 15, 18, 19, 20}:
676
+ rhs = stack.pop()
677
+ lhs = stack.pop()
678
+ # Reverse ops for commutative ops, which are add, mul (0 and 2 respectively)
679
+ # op codes 13 and 15 can never be reversed and 18, 19, 20
680
+ # are the reversed versions of non-commuative operations
681
+ # so 1, 3, 4 and 18, 19, 20 handle this explicitly.
682
+ if (
683
+ not isinstance(lhs, ParameterExpression)
684
+ and isinstance(rhs, ParameterExpression)
685
+ and expression_data.OP_CODE in {0, 2}
686
+ ):
687
+ if expression_data.OP_CODE == 0:
688
+ method_str = "__radd__"
689
+ elif expression_data.OP_CODE == 2:
690
+ method_str = "__rmul__"
691
+ stack.append(getattr(rhs, method_str)(lhs))
692
+ else:
693
+ stack.append(getattr(lhs, method_str)(rhs))
694
+ else:
695
+ lhs = stack.pop()
696
+ stack.append(getattr(lhs, method_str)())
697
+ data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
698
+ return stack.pop()
699
+
700
+
701
+ def _read_expr(
702
+ file_obj,
703
+ clbits: collections.abc.Sequence[Clbit],
704
+ cregs: collections.abc.Mapping[str, ClassicalRegister],
705
+ standalone_vars: collections.abc.Sequence[expr.Var],
706
+ ) -> expr.Expr:
707
+ # pylint: disable=too-many-return-statements
708
+ type_key = file_obj.read(formats.EXPRESSION_DISCRIMINATOR_SIZE)
709
+ type_ = _read_expr_type(file_obj)
710
+ if type_key == type_keys.Expression.VAR:
711
+ var_type_key = file_obj.read(formats.EXPR_VAR_DISCRIMINATOR_SIZE)
712
+ if var_type_key == type_keys.ExprVar.UUID:
713
+ payload = formats.EXPR_VAR_UUID._make(
714
+ struct.unpack(formats.EXPR_VAR_UUID_PACK, file_obj.read(formats.EXPR_VAR_UUID_SIZE))
715
+ )
716
+ return standalone_vars[payload.var_index]
717
+ if var_type_key == type_keys.ExprVar.CLBIT:
718
+ payload = formats.EXPR_VAR_CLBIT._make(
719
+ struct.unpack(
720
+ formats.EXPR_VAR_CLBIT_PACK, file_obj.read(formats.EXPR_VAR_CLBIT_SIZE)
721
+ )
722
+ )
723
+ return expr.Var(clbits[payload.index], type_)
724
+ if var_type_key == type_keys.ExprVar.REGISTER:
725
+ payload = formats.EXPR_VAR_REGISTER._make(
726
+ struct.unpack(
727
+ formats.EXPR_VAR_REGISTER_PACK, file_obj.read(formats.EXPR_VAR_REGISTER_SIZE)
728
+ )
729
+ )
730
+ name = file_obj.read(payload.reg_name_size).decode(common.ENCODE)
731
+ return expr.Var(cregs[name], type_)
732
+ raise exceptions.QpyError("Invalid classical-expression Var key '{var_type_key}'")
733
+ if type_key == type_keys.Expression.STRETCH:
734
+ payload = formats.EXPRESSION_STRETCH._make(
735
+ struct.unpack(
736
+ formats.EXPRESSION_STRETCH_PACK, file_obj.read(formats.EXPRESSION_STRETCH_SIZE)
737
+ )
738
+ )
739
+ return standalone_vars[payload.var_index]
740
+ if type_key == type_keys.Expression.VALUE:
741
+ value_type_key = file_obj.read(formats.EXPR_VALUE_DISCRIMINATOR_SIZE)
742
+ if value_type_key == type_keys.ExprValue.BOOL:
743
+ payload = formats.EXPR_VALUE_BOOL._make(
744
+ struct.unpack(
745
+ formats.EXPR_VALUE_BOOL_PACK, file_obj.read(formats.EXPR_VALUE_BOOL_SIZE)
746
+ )
747
+ )
748
+ return expr.Value(payload.value, type_)
749
+ if value_type_key == type_keys.ExprValue.INT:
750
+ payload = formats.EXPR_VALUE_INT._make(
751
+ struct.unpack(
752
+ formats.EXPR_VALUE_INT_PACK, file_obj.read(formats.EXPR_VALUE_INT_SIZE)
753
+ )
754
+ )
755
+ return expr.Value(
756
+ int.from_bytes(file_obj.read(payload.num_bytes), "big", signed=True), type_
757
+ )
758
+ if value_type_key == type_keys.ExprValue.FLOAT:
759
+ payload = formats.EXPR_VALUE_FLOAT._make(
760
+ struct.unpack(
761
+ formats.EXPR_VALUE_FLOAT_PACK, file_obj.read(formats.EXPR_VALUE_FLOAT_SIZE)
762
+ )
763
+ )
764
+ return expr.Value(payload.value, type_)
765
+ if value_type_key == type_keys.ExprValue.DURATION:
766
+ value = _read_duration(file_obj)
767
+ return expr.Value(value, type_)
768
+ raise exceptions.QpyError("Invalid classical-expression Value key '{value_type_key}'")
769
+ if type_key == type_keys.Expression.CAST:
770
+ payload = formats.EXPRESSION_CAST._make(
771
+ struct.unpack(formats.EXPRESSION_CAST_PACK, file_obj.read(formats.EXPRESSION_CAST_SIZE))
772
+ )
773
+ return expr.Cast(
774
+ _read_expr(file_obj, clbits, cregs, standalone_vars), type_, implicit=payload.implicit
775
+ )
776
+ if type_key == type_keys.Expression.UNARY:
777
+ payload = formats.EXPRESSION_UNARY._make(
778
+ struct.unpack(
779
+ formats.EXPRESSION_UNARY_PACK, file_obj.read(formats.EXPRESSION_UNARY_SIZE)
780
+ )
781
+ )
782
+ return expr.Unary(
783
+ expr.Unary.Op(payload.opcode),
784
+ _read_expr(file_obj, clbits, cregs, standalone_vars),
785
+ type_,
786
+ )
787
+ if type_key == type_keys.Expression.BINARY:
788
+ payload = formats.EXPRESSION_BINARY._make(
789
+ struct.unpack(
790
+ formats.EXPRESSION_BINARY_PACK, file_obj.read(formats.EXPRESSION_BINARY_SIZE)
791
+ )
792
+ )
793
+ return expr.Binary(
794
+ expr.Binary.Op(payload.opcode),
795
+ _read_expr(file_obj, clbits, cregs, standalone_vars),
796
+ _read_expr(file_obj, clbits, cregs, standalone_vars),
797
+ type_,
798
+ )
799
+ if type_key == type_keys.Expression.INDEX:
800
+ return expr.Index(
801
+ _read_expr(file_obj, clbits, cregs, standalone_vars),
802
+ _read_expr(file_obj, clbits, cregs, standalone_vars),
803
+ type_,
804
+ )
805
+ raise exceptions.QpyError(f"Invalid classical-expression Expr key '{type_key}'")
806
+
807
+
808
+ def _read_expr_type(file_obj) -> types.Type:
809
+ type_key = file_obj.read(formats.EXPR_TYPE_DISCRIMINATOR_SIZE)
810
+ if type_key == type_keys.ExprType.BOOL:
811
+ return types.Bool()
812
+ if type_key == type_keys.ExprType.UINT:
813
+ elem = formats.EXPR_TYPE_UINT._make(
814
+ struct.unpack(formats.EXPR_TYPE_UINT_PACK, file_obj.read(formats.EXPR_TYPE_UINT_SIZE))
815
+ )
816
+ return types.Uint(elem.width)
817
+ if type_key == type_keys.ExprType.FLOAT:
818
+ return types.Float()
819
+ if type_key == type_keys.ExprType.DURATION:
820
+ return types.Duration()
821
+ raise exceptions.QpyError(f"Invalid classical-expression Type key '{type_key}'")
822
+
823
+
824
+ def _read_duration(file_obj) -> Duration:
825
+ type_key = file_obj.read(formats.DURATION_DISCRIMINATOR_SIZE)
826
+ if type_key == type_keys.CircuitDuration.DT:
827
+ elem = formats.DURATION_DT._make(
828
+ struct.unpack(formats.DURATION_DT_PACK, file_obj.read(formats.DURATION_DT_SIZE))
829
+ )
830
+ return Duration.dt(elem.value)
831
+ if type_key == type_keys.CircuitDuration.NS:
832
+ elem = formats.DURATION_NS._make(
833
+ struct.unpack(formats.DURATION_NS_PACK, file_obj.read(formats.DURATION_NS_SIZE))
834
+ )
835
+ return Duration.ns(elem.value)
836
+ if type_key == type_keys.CircuitDuration.US:
837
+ elem = formats.DURATION_US._make(
838
+ struct.unpack(formats.DURATION_US_PACK, file_obj.read(formats.DURATION_US_SIZE))
839
+ )
840
+ return Duration.us(elem.value)
841
+ if type_key == type_keys.CircuitDuration.MS:
842
+ elem = formats.DURATION_MS._make(
843
+ struct.unpack(formats.DURATION_MS_PACK, file_obj.read(formats.DURATION_MS_SIZE))
844
+ )
845
+ return Duration.ms(elem.value)
846
+ if type_key == type_keys.CircuitDuration.S:
847
+ elem = formats.DURATION_S._make(
848
+ struct.unpack(formats.DURATION_S_PACK, file_obj.read(formats.DURATION_S_SIZE))
849
+ )
850
+ return Duration.s(elem.value)
851
+ raise exceptions.QpyError(f"Invalid duration Type key '{type_key}'")
852
+
853
+
854
+ def read_standalone_vars(file_obj, num_vars):
855
+ """Read the ``num_vars`` standalone variable declarations from the file.
856
+
857
+ Args:
858
+ file_obj (File): a file-like object to read from.
859
+ num_vars (int): the number of variables to read.
860
+
861
+ Returns:
862
+ tuple[dict, list]: the first item is a mapping of the ``ExprVarDeclaration`` type keys to
863
+ the variables defined by that type key, and the second is the total order of variable
864
+ declarations.
865
+ """
866
+ read_vars = {
867
+ type_keys.ExprVarDeclaration.INPUT: [],
868
+ type_keys.ExprVarDeclaration.CAPTURE: [],
869
+ type_keys.ExprVarDeclaration.LOCAL: [],
870
+ type_keys.ExprVarDeclaration.STRETCH_CAPTURE: [],
871
+ type_keys.ExprVarDeclaration.STRETCH_LOCAL: [],
872
+ }
873
+ var_order = []
874
+ for _ in range(num_vars):
875
+ data = formats.EXPR_VAR_DECLARATION._make(
876
+ struct.unpack(
877
+ formats.EXPR_VAR_DECLARATION_PACK,
878
+ file_obj.read(formats.EXPR_VAR_DECLARATION_SIZE),
879
+ )
880
+ )
881
+ type_ = _read_expr_type(file_obj)
882
+ name = file_obj.read(data.name_size).decode(common.ENCODE)
883
+ if data.usage in {
884
+ type_keys.ExprVarDeclaration.STRETCH_CAPTURE,
885
+ type_keys.ExprVarDeclaration.STRETCH_LOCAL,
886
+ }:
887
+ var = expr.Stretch(uuid.UUID(bytes=data.uuid_bytes), name)
888
+ else:
889
+ var = expr.Var(uuid.UUID(bytes=data.uuid_bytes), type_, name=name)
890
+ read_vars[data.usage].append(var)
891
+ var_order.append(var)
892
+ return read_vars, var_order
893
+
894
+
895
+ def _write_standalone_var(file_obj, var, type_key, version):
896
+ name = var.name.encode(common.ENCODE)
897
+ file_obj.write(
898
+ struct.pack(
899
+ formats.EXPR_VAR_DECLARATION_PACK,
900
+ *formats.EXPR_VAR_DECLARATION(var.var.bytes, type_key, len(name)),
901
+ )
902
+ )
903
+ _write_expr_type(file_obj, var.type, version)
904
+ file_obj.write(name)
905
+
906
+
907
+ def write_standalone_vars(file_obj, circuit, version):
908
+ """Write the standalone variables out from a circuit.
909
+
910
+ Args:
911
+ file_obj (File): the file-like object to write to.
912
+ circuit (QuantumCircuit): the circuit to take the variables from.
913
+ version (int): the QPY target version.
914
+
915
+ Returns:
916
+ dict[expr.Var | expr.Stretch, int]: a mapping of the variables written to the
917
+ index that they were written at.
918
+ """
919
+ index = 0
920
+ out = {}
921
+ for var in circuit.iter_input_vars():
922
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.INPUT, version)
923
+ out[var] = index
924
+ index += 1
925
+ for var in circuit.iter_captured_vars():
926
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.CAPTURE, version)
927
+ out[var] = index
928
+ index += 1
929
+ for var in circuit.iter_declared_vars():
930
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.LOCAL, version)
931
+ out[var] = index
932
+ index += 1
933
+ if version < 14 and circuit.num_stretches:
934
+ raise exceptions.UnsupportedFeatureForVersion(
935
+ "circuits containing stretch variables", required=14, target=version
936
+ )
937
+ for var in circuit.iter_captured_stretches():
938
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.STRETCH_CAPTURE, version)
939
+ out[var] = index
940
+ index += 1
941
+ for var in circuit.iter_declared_stretches():
942
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.STRETCH_LOCAL, version)
943
+ out[var] = index
944
+ index += 1
945
+ return out
946
+
947
+
948
+ def dumps_value(
949
+ obj,
950
+ *,
951
+ version,
952
+ index_map=None,
953
+ use_symengine=False,
954
+ standalone_var_indices=None,
955
+ ):
956
+ """Serialize input value object.
957
+
958
+ Args:
959
+ obj (any): Arbitrary value object to serialize.
960
+ version (int): the target QPY version for the dump.
961
+ index_map (dict): Dictionary with two keys, "q" and "c". Each key has a value that is a
962
+ dictionary mapping :class:`.Qubit` or :class:`.Clbit` instances (respectively) to their
963
+ integer indices.
964
+ use_symengine (bool): If True, symbolic objects will be serialized using symengine's
965
+ native mechanism. This is a faster serialization alternative, but not supported in all
966
+ platforms. Please check that your target platform is supported by the symengine library
967
+ before setting this option, as it will be required by qpy to deserialize the payload.
968
+ standalone_var_indices (dict): Dictionary that maps standalone :class:`.expr.Var` entries to
969
+ the index that should be used to refer to them.
970
+
971
+ Returns:
972
+ tuple: TypeKey and binary data.
973
+
974
+ Raises:
975
+ QpyError: Serializer for given format is not ready.
976
+ """
977
+ type_key = type_keys.Value.assign(obj)
978
+
979
+ if type_key == type_keys.Value.INTEGER:
980
+ binary_data = struct.pack("!q", obj)
981
+ elif type_key == type_keys.Value.FLOAT:
982
+ binary_data = struct.pack("!d", obj)
983
+ elif type_key == type_keys.Value.COMPLEX:
984
+ binary_data = struct.pack(formats.COMPLEX_PACK, obj.real, obj.imag)
985
+ elif type_key == type_keys.Value.NUMPY_OBJ:
986
+ binary_data = common.data_to_binary(obj, np.save)
987
+ elif type_key == type_keys.Value.STRING:
988
+ binary_data = obj.encode(common.ENCODE)
989
+ elif type_key in (type_keys.Value.NULL, type_keys.Value.CASE_DEFAULT):
990
+ binary_data = b""
991
+ elif type_key == type_keys.Value.PARAMETER_VECTOR:
992
+ binary_data = common.data_to_binary(obj, _write_parameter_vec)
993
+ elif type_key == type_keys.Value.PARAMETER:
994
+ binary_data = common.data_to_binary(obj, _write_parameter)
995
+ elif type_key == type_keys.Value.PARAMETER_EXPRESSION:
996
+ binary_data = common.data_to_binary(
997
+ obj, _write_parameter_expression, use_symengine=use_symengine, version=version
998
+ )
999
+ elif type_key == type_keys.Value.EXPRESSION:
1000
+ clbit_indices = {} if index_map is None else index_map["c"]
1001
+ standalone_var_indices = {} if standalone_var_indices is None else standalone_var_indices
1002
+ binary_data = common.data_to_binary(
1003
+ obj,
1004
+ _write_expr,
1005
+ clbit_indices=clbit_indices,
1006
+ standalone_var_indices=standalone_var_indices,
1007
+ version=version,
1008
+ )
1009
+ else:
1010
+ raise exceptions.QpyError(f"Serialization for {type_key} is not implemented in value I/O.")
1011
+
1012
+ return type_key, binary_data
1013
+
1014
+
1015
+ def write_value(
1016
+ file_obj, obj, *, version, index_map=None, use_symengine=False, standalone_var_indices=None
1017
+ ):
1018
+ """Write a value to the file like object.
1019
+
1020
+ Args:
1021
+ file_obj (File): A file like object to write data.
1022
+ obj (any): Value to write.
1023
+ version (int): the target QPY version for the dump.
1024
+ index_map (dict): Dictionary with two keys, "q" and "c". Each key has a value that is a
1025
+ dictionary mapping :class:`.Qubit` or :class:`.Clbit` instances (respectively) to their
1026
+ integer indices.
1027
+ use_symengine (bool): If True, symbolic objects will be serialized using symengine's
1028
+ native mechanism. This is a faster serialization alternative, but not supported in all
1029
+ platforms. Please check that your target platform is supported by the symengine library
1030
+ before setting this option, as it will be required by qpy to deserialize the payload.
1031
+ standalone_var_indices (dict): Dictionary that maps standalone :class:`.expr.Var` entries to
1032
+ the index that should be used to refer to them.
1033
+ """
1034
+ type_key, data = dumps_value(
1035
+ obj,
1036
+ version=version,
1037
+ index_map=index_map,
1038
+ use_symengine=use_symengine,
1039
+ standalone_var_indices=standalone_var_indices,
1040
+ )
1041
+ common.write_generic_typed_data(file_obj, type_key, data)
1042
+
1043
+
1044
+ def loads_value(
1045
+ type_key,
1046
+ binary_data,
1047
+ version,
1048
+ vectors,
1049
+ *,
1050
+ clbits=(),
1051
+ cregs=None,
1052
+ use_symengine=False,
1053
+ standalone_vars=(),
1054
+ ):
1055
+ """Deserialize input binary data to value object.
1056
+
1057
+ Args:
1058
+ type_key (ValueTypeKey): Type enum information.
1059
+ binary_data (bytes): Data to deserialize.
1060
+ version (int): QPY version.
1061
+ vectors (dict): ParameterVector in current scope.
1062
+ clbits (Sequence[Clbit]): Clbits in the current scope.
1063
+ cregs (Mapping[str, ClassicalRegister]): Classical registers in the current scope.
1064
+ use_symengine (bool): If True, symbolic objects will be de-serialized using symengine's
1065
+ native mechanism. This is a faster serialization alternative, but not supported in all
1066
+ platforms. Please check that your target platform is supported by the symengine library
1067
+ before setting this option, as it will be required by qpy to deserialize the payload.
1068
+ standalone_vars (Sequence[Var]): standalone :class:`.expr.Var` nodes in the order that they
1069
+ were declared by the circuit header.
1070
+
1071
+ Returns:
1072
+ any: Deserialized value object.
1073
+
1074
+ Raises:
1075
+ QpyError: Serializer for given format is not ready.
1076
+ """
1077
+ # pylint: disable=too-many-return-statements
1078
+
1079
+ if isinstance(type_key, bytes):
1080
+ type_key = type_keys.Value(type_key)
1081
+
1082
+ if type_key == type_keys.Value.INTEGER:
1083
+ return struct.unpack("!q", binary_data)[0]
1084
+ if type_key == type_keys.Value.FLOAT:
1085
+ return struct.unpack("!d", binary_data)[0]
1086
+ if type_key == type_keys.Value.COMPLEX:
1087
+ return complex(*struct.unpack(formats.COMPLEX_PACK, binary_data))
1088
+ if type_key == type_keys.Value.NUMPY_OBJ:
1089
+ return common.data_from_binary(binary_data, np.load)
1090
+ if type_key == type_keys.Value.STRING:
1091
+ return binary_data.decode(common.ENCODE)
1092
+ if type_key == type_keys.Value.NULL:
1093
+ return None
1094
+ if type_key == type_keys.Value.CASE_DEFAULT:
1095
+ return CASE_DEFAULT
1096
+ if type_key == type_keys.Value.PARAMETER_VECTOR:
1097
+ return common.data_from_binary(binary_data, _read_parameter_vec, vectors=vectors)
1098
+ if type_key == type_keys.Value.PARAMETER:
1099
+ return common.data_from_binary(binary_data, _read_parameter)
1100
+ if type_key == type_keys.Value.PARAMETER_EXPRESSION:
1101
+ if version < 3:
1102
+ return common.data_from_binary(binary_data, _read_parameter_expression)
1103
+ elif version < 13:
1104
+ return common.data_from_binary(
1105
+ binary_data,
1106
+ _read_parameter_expression_v3,
1107
+ vectors=vectors,
1108
+ use_symengine=use_symengine,
1109
+ )
1110
+ else:
1111
+ return common.data_from_binary(
1112
+ binary_data, _read_parameter_expression_v13, vectors=vectors, version=version
1113
+ )
1114
+ if type_key == type_keys.Value.EXPRESSION:
1115
+ return common.data_from_binary(
1116
+ binary_data,
1117
+ _read_expr,
1118
+ clbits=clbits,
1119
+ cregs=cregs or {},
1120
+ standalone_vars=standalone_vars,
1121
+ )
1122
+
1123
+ raise exceptions.QpyError(f"Serialization for {type_key} is not implemented in value I/O.")
1124
+
1125
+
1126
+ def read_value(
1127
+ file_obj,
1128
+ version,
1129
+ vectors,
1130
+ *,
1131
+ clbits=(),
1132
+ cregs=None,
1133
+ use_symengine=False,
1134
+ standalone_vars=(),
1135
+ ):
1136
+ """Read a value from the file like object.
1137
+
1138
+ Args:
1139
+ file_obj (File): A file like object to write data.
1140
+ version (int): QPY version.
1141
+ vectors (dict): ParameterVector in current scope.
1142
+ clbits (Sequence[Clbit]): Clbits in the current scope.
1143
+ cregs (Mapping[str, ClassicalRegister]): Classical registers in the current scope.
1144
+ use_symengine (bool): If True, symbolic objects will be de-serialized using symengine's
1145
+ native mechanism. This is a faster serialization alternative, but not supported in all
1146
+ platforms. Please check that your target platform is supported by the symengine library
1147
+ before setting this option, as it will be required by qpy to deserialize the payload.
1148
+ standalone_vars (Sequence[expr.Var]): standalone variables in the order they were defined in
1149
+ the QPY payload.
1150
+
1151
+ Returns:
1152
+ any: Deserialized value object.
1153
+ """
1154
+ type_key, data = common.read_generic_typed_data(file_obj)
1155
+
1156
+ return loads_value(
1157
+ type_key,
1158
+ data,
1159
+ version,
1160
+ vectors,
1161
+ clbits=clbits,
1162
+ cregs=cregs,
1163
+ use_symengine=use_symengine,
1164
+ standalone_vars=standalone_vars,
1165
+ )