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