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,1687 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2021.
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
+ # pylint: disable=invalid-name
14
+
15
+ """Binary IO for circuit objects."""
16
+
17
+ from __future__ import annotations
18
+
19
+ import itertools
20
+ from collections import defaultdict
21
+ import io
22
+ import json
23
+ import struct
24
+ import uuid
25
+ import typing
26
+ import warnings
27
+
28
+ import numpy as np
29
+
30
+ from qiskit import circuit as circuit_mod
31
+ from qiskit.circuit import library, controlflow, CircuitInstruction, ControlFlowOp, IfElseOp
32
+ from qiskit.circuit.annotation import iter_namespaces
33
+ from qiskit.circuit.classical import expr
34
+ from qiskit.circuit import ClassicalRegister, Clbit
35
+ from qiskit.circuit.gate import Gate
36
+ from qiskit.circuit.singleton import SingletonInstruction, SingletonGate
37
+ from qiskit.circuit.controlledgate import ControlledGate
38
+ from qiskit.circuit.annotated_operation import (
39
+ AnnotatedOperation,
40
+ Modifier,
41
+ InverseModifier,
42
+ ControlModifier,
43
+ PowerModifier,
44
+ )
45
+ from qiskit.circuit.instruction import Instruction
46
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
47
+ from qiskit.circuit import QuantumRegister, Qubit
48
+ from qiskit.qpy import common, formats, type_keys
49
+ from qiskit.qpy.exceptions import QpyError, UnsupportedFeatureForVersion
50
+ from qiskit.qpy.binary_io import value, schedules
51
+ from qiskit.quantum_info.operators import SparsePauliOp, Clifford
52
+ from qiskit.synthesis import evolution as evo_synth
53
+ from qiskit.transpiler.layout import Layout, TranspileLayout
54
+
55
+ if typing.TYPE_CHECKING:
56
+ from qiskit.circuit.annotation import QPYSerializer, Annotation
57
+
58
+
59
+ class _AnnotationSerializationState:
60
+ def __init__(self, factories: dict[str, typing.Callable[[], QPYSerializer]]):
61
+ self.factories = factories
62
+ self.serializers = {}
63
+ self.potential_serializers = {}
64
+
65
+ @property
66
+ def num_serializers(self) -> int:
67
+ """The number of constructed serializers."""
68
+ return len(self.serializers)
69
+
70
+ def serialize(self, annotation: Annotation) -> (int, bytes):
71
+ """Serialize an annotation using a known serializer (initializing one, if necessary).
72
+
73
+ Returns the index of the serializer used, and the serialized annotation."""
74
+ for namespace in iter_namespaces(annotation.namespace):
75
+ if (existing := self.serializers.get(namespace, None)) is not None:
76
+ index, serializer = existing
77
+ if (out := serializer.dump_annotation(namespace, annotation)) is not NotImplemented:
78
+ return index, out
79
+ if (serializer := self.potential_serializers.get(namespace, None)) is not None:
80
+ if (out := serializer.dump_annotation(namespace, annotation)) is not NotImplemented:
81
+ del self.potential_serializers[namespace]
82
+ index = len(self.serializers)
83
+ self.serializers[namespace] = (index, serializer)
84
+ return index, out
85
+ if (factory := self.factories.get(namespace, None)) is not None:
86
+ serializer = factory()
87
+ if (out := serializer.dump_annotation(namespace, annotation)) is NotImplemented:
88
+ self.potential_serializers[namespace] = serializer
89
+ else:
90
+ index = len(self.serializers)
91
+ self.serializers[namespace] = (index, serializer)
92
+ return index, out
93
+ raise QpyError(f"No configured annotation serializer could handle {annotation}")
94
+
95
+ def iter_serializers(self) -> typing.Iterator[tuple[str, QPYSerializer]]:
96
+ """Iterate over the namespaces and serializers that have had at least one successful use, in
97
+ order of first use."""
98
+ return (
99
+ # Python dictionaries are insertion ordered, and we assign indices in insertion order.
100
+ (namespace, serializer)
101
+ for (namespace, (_, serializer)) in self.serializers.items()
102
+ )
103
+
104
+
105
+ class _AnnotationDeserializationState:
106
+ def __init__(self, factories: dict[str, typing.Callable[[], QPYSerializer]]):
107
+ self.factories = factories
108
+ self.deserializers = []
109
+
110
+ def initialize(self, namespace: str, payload: bytes):
111
+ """Initialize a suitable deserializer using the given state payload."""
112
+ for parent_namespace in iter_namespaces(namespace):
113
+ if (factory := self.factories.get(parent_namespace, None)) is not None:
114
+ deserializer = factory()
115
+ deserializer.load_state(namespace, payload)
116
+ self.deserializers.append(deserializer)
117
+ return
118
+ raise QpyError(f"No configured annotation deserializer matched namespace '{namespace}'")
119
+
120
+ def load(self, index: int, payload: bytes) -> Annotation:
121
+ """Load a payload using the deserializer of a given index."""
122
+ return self.deserializers[index].load_annotation(payload)
123
+
124
+
125
+ def _read_header_v12(file_obj, version, vectors, metadata_deserializer=None):
126
+ data = formats.CIRCUIT_HEADER_V12._make(
127
+ struct.unpack(
128
+ formats.CIRCUIT_HEADER_V12_PACK, file_obj.read(formats.CIRCUIT_HEADER_V12_SIZE)
129
+ )
130
+ )
131
+ name = file_obj.read(data.name_size).decode(common.ENCODE)
132
+ global_phase = value.loads_value(
133
+ data.global_phase_type,
134
+ file_obj.read(data.global_phase_size),
135
+ version=version,
136
+ vectors=vectors,
137
+ )
138
+ header = {
139
+ "global_phase": global_phase,
140
+ "num_qubits": data.num_qubits,
141
+ "num_clbits": data.num_clbits,
142
+ "num_registers": data.num_registers,
143
+ "num_instructions": data.num_instructions,
144
+ "num_vars": data.num_vars,
145
+ }
146
+ metadata_raw = file_obj.read(data.metadata_size)
147
+ metadata = json.loads(metadata_raw, cls=metadata_deserializer)
148
+ return header, name, metadata
149
+
150
+
151
+ def _read_header_v2(file_obj, version, vectors, metadata_deserializer=None):
152
+ data = formats.CIRCUIT_HEADER_V2._make(
153
+ struct.unpack(
154
+ formats.CIRCUIT_HEADER_V2_PACK,
155
+ file_obj.read(formats.CIRCUIT_HEADER_V2_SIZE),
156
+ )
157
+ )
158
+
159
+ name = file_obj.read(data.name_size).decode(common.ENCODE)
160
+ global_phase = value.loads_value(
161
+ data.global_phase_type,
162
+ file_obj.read(data.global_phase_size),
163
+ version=version,
164
+ vectors=vectors,
165
+ )
166
+ header = {
167
+ "global_phase": global_phase,
168
+ "num_qubits": data.num_qubits,
169
+ "num_clbits": data.num_clbits,
170
+ "num_registers": data.num_registers,
171
+ "num_instructions": data.num_instructions,
172
+ }
173
+
174
+ metadata_raw = file_obj.read(data.metadata_size)
175
+ metadata = json.loads(metadata_raw, cls=metadata_deserializer)
176
+ return header, name, metadata
177
+
178
+
179
+ def _read_header(file_obj, metadata_deserializer=None):
180
+ data = formats.CIRCUIT_HEADER._make(
181
+ struct.unpack(formats.CIRCUIT_HEADER_PACK, file_obj.read(formats.CIRCUIT_HEADER_SIZE))
182
+ )
183
+ name = file_obj.read(data.name_size).decode(common.ENCODE)
184
+ header = {
185
+ "global_phase": data.global_phase,
186
+ "num_qubits": data.num_qubits,
187
+ "num_clbits": data.num_clbits,
188
+ "num_registers": data.num_registers,
189
+ "num_instructions": data.num_instructions,
190
+ }
191
+ metadata_raw = file_obj.read(data.metadata_size)
192
+ metadata = json.loads(metadata_raw, cls=metadata_deserializer)
193
+ return header, name, metadata
194
+
195
+
196
+ def _read_registers_v4(file_obj, num_registers):
197
+ registers = {"q": {}, "c": {}}
198
+ for _reg in range(num_registers):
199
+ data = formats.REGISTER_V4._make(
200
+ struct.unpack(
201
+ formats.REGISTER_V4_PACK,
202
+ file_obj.read(formats.REGISTER_V4_SIZE),
203
+ )
204
+ )
205
+ name = file_obj.read(data.name_size).decode("utf8")
206
+ REGISTER_ARRAY_PACK = f"!{data.size}q"
207
+ bit_indices_raw = file_obj.read(struct.calcsize(REGISTER_ARRAY_PACK))
208
+ bit_indices = list(struct.unpack(REGISTER_ARRAY_PACK, bit_indices_raw))
209
+ if data.type.decode("utf8") == "q":
210
+ registers["q"][name] = (data.standalone, bit_indices, data.in_circuit)
211
+ else:
212
+ registers["c"][name] = (data.standalone, bit_indices, data.in_circuit)
213
+ return registers
214
+
215
+
216
+ def _read_registers(file_obj, num_registers):
217
+ registers = {"q": {}, "c": {}}
218
+ for _reg in range(num_registers):
219
+ data = formats.REGISTER._make(
220
+ struct.unpack(
221
+ formats.REGISTER_PACK,
222
+ file_obj.read(formats.REGISTER_SIZE),
223
+ )
224
+ )
225
+ name = file_obj.read(data.name_size).decode("utf8")
226
+ REGISTER_ARRAY_PACK = f"!{data.size}I"
227
+ bit_indices_raw = file_obj.read(struct.calcsize(REGISTER_ARRAY_PACK))
228
+ bit_indices = list(struct.unpack(REGISTER_ARRAY_PACK, bit_indices_raw))
229
+ if data.type.decode("utf8") == "q":
230
+ registers["q"][name] = (data.standalone, bit_indices, True)
231
+ else:
232
+ registers["c"][name] = (data.standalone, bit_indices, True)
233
+ return registers
234
+
235
+
236
+ def _read_annotation_states(file_obj, annotation_factories) -> _AnnotationDeserializationState:
237
+ state = _AnnotationDeserializationState(annotation_factories)
238
+ static_payload = formats.ANNOTATION_HEADER_STATIC._make(
239
+ struct.unpack(
240
+ formats.ANNOTATION_HEADER_STATIC_PACK,
241
+ file_obj.read(formats.ANNOTATION_HEADER_STATIC_SIZE),
242
+ )
243
+ )
244
+ for _ in range(static_payload.num_namespaces):
245
+ payload = formats.ANNOTATION_STATE_HEADER._make(
246
+ struct.unpack(
247
+ formats.ANNOTATION_STATE_HEADER_PACK,
248
+ file_obj.read(formats.ANNOTATION_STATE_HEADER_SIZE),
249
+ )
250
+ )
251
+ state.initialize(
252
+ file_obj.read(payload.namespace_size).decode("utf-8"), file_obj.read(payload.state_size)
253
+ )
254
+ return state
255
+
256
+
257
+ def _read_instruction_annotation(file_obj, annotation_state):
258
+ header = formats.INSTRUCTION_ANNOTATION._make(
259
+ struct.unpack(
260
+ formats.INSTRUCTION_ANNOTATION_PACK,
261
+ file_obj.read(formats.INSTRUCTION_ANNOTATION_SIZE),
262
+ )
263
+ )
264
+ return annotation_state.load(header.namespace_index, file_obj.read(header.payload_size))
265
+
266
+
267
+ def _read_instruction_annotations(file_obj, annotation_state):
268
+ header = formats.INSTRUCTION_ANNOTATIONS_HEADER._make(
269
+ struct.unpack(
270
+ formats.INSTRUCTION_ANNOTATIONS_HEADER_PACK,
271
+ file_obj.read(formats.INSTRUCTION_ANNOTATIONS_HEADER_SIZE),
272
+ )
273
+ )
274
+ return [
275
+ _read_instruction_annotation(file_obj, annotation_state)
276
+ for _ in range(header.num_annotations)
277
+ ]
278
+
279
+
280
+ def _loads_instruction_parameter(
281
+ type_key,
282
+ data_bytes,
283
+ version,
284
+ vectors,
285
+ registers,
286
+ circuit,
287
+ use_symengine,
288
+ standalone_vars,
289
+ annotation_factories,
290
+ ):
291
+ if type_key == type_keys.Program.CIRCUIT:
292
+ param = common.data_from_binary(
293
+ data_bytes, read_circuit, version=version, annotation_factories=annotation_factories
294
+ )
295
+ elif type_key == type_keys.Value.MODIFIER:
296
+ param = common.data_from_binary(data_bytes, _read_modifier)
297
+ elif type_key == type_keys.Container.RANGE:
298
+ data = formats.RANGE._make(struct.unpack(formats.RANGE_PACK, data_bytes))
299
+ param = range(data.start, data.stop, data.step)
300
+ elif type_key == type_keys.Container.TUPLE:
301
+ param = tuple(
302
+ common.sequence_from_binary(
303
+ data_bytes,
304
+ _loads_instruction_parameter,
305
+ version=version,
306
+ vectors=vectors,
307
+ registers=registers,
308
+ circuit=circuit,
309
+ use_symengine=use_symengine,
310
+ standalone_vars=standalone_vars,
311
+ annotation_factories=annotation_factories,
312
+ )
313
+ )
314
+ elif type_key == type_keys.Value.INTEGER:
315
+ # TODO This uses little endian. Should be fixed in the next QPY version.
316
+ param = struct.unpack("<q", data_bytes)[0]
317
+ elif type_key == type_keys.Value.FLOAT:
318
+ # TODO This uses little endian. Should be fixed in the next QPY version.
319
+ param = struct.unpack("<d", data_bytes)[0]
320
+ elif type_key == type_keys.Value.REGISTER:
321
+ param = _loads_register_param(data_bytes.decode(common.ENCODE), circuit, registers)
322
+ else:
323
+ clbits = circuit.clbits if circuit is not None else ()
324
+ param = value.loads_value(
325
+ type_key,
326
+ data_bytes,
327
+ version,
328
+ vectors,
329
+ clbits=clbits,
330
+ cregs=registers["c"],
331
+ use_symengine=use_symengine,
332
+ standalone_vars=standalone_vars,
333
+ )
334
+
335
+ return param
336
+
337
+
338
+ def _loads_register_param(data_bytes, circuit, registers):
339
+ # If register name prefixed with null character it's a clbit index for single bit condition.
340
+ if data_bytes[0] == "\x00":
341
+ conditional_bit = int(data_bytes[1:])
342
+ return circuit.clbits[conditional_bit]
343
+ return registers["c"][data_bytes]
344
+
345
+
346
+ def _read_instruction(
347
+ file_obj,
348
+ circuit,
349
+ registers,
350
+ custom_operations,
351
+ version,
352
+ vectors,
353
+ use_symengine,
354
+ standalone_vars,
355
+ annotation_state,
356
+ ):
357
+ if version < 5:
358
+ instruction = formats.CIRCUIT_INSTRUCTION._make(
359
+ struct.unpack(
360
+ formats.CIRCUIT_INSTRUCTION_PACK,
361
+ file_obj.read(formats.CIRCUIT_INSTRUCTION_SIZE),
362
+ )
363
+ )
364
+ conditional_key = (
365
+ type_keys.Condition.TWO_TUPLE if instruction.has_condition else type_keys.Condition.NONE
366
+ )
367
+ has_annotations = False
368
+ else:
369
+ instruction = formats.CIRCUIT_INSTRUCTION_V2._make(
370
+ struct.unpack(
371
+ formats.CIRCUIT_INSTRUCTION_V2_PACK,
372
+ file_obj.read(formats.CIRCUIT_INSTRUCTION_V2_SIZE),
373
+ )
374
+ )
375
+ conditional_key = type_keys.Condition(instruction.extras_key & 0b11)
376
+ has_annotations = bool(
377
+ instruction.extras_key & type_keys.InstructionExtraFlags.HAS_ANNOTATIONS
378
+ )
379
+
380
+ gate_name = file_obj.read(instruction.name_size).decode(common.ENCODE)
381
+ label = file_obj.read(instruction.label_size).decode(common.ENCODE)
382
+ condition_register = file_obj.read(instruction.condition_register_size).decode(common.ENCODE)
383
+ qargs = []
384
+ cargs = []
385
+ params = []
386
+ condition = None
387
+ if conditional_key == type_keys.Condition.TWO_TUPLE:
388
+ condition = (
389
+ _loads_register_param(condition_register, circuit, registers),
390
+ instruction.condition_value,
391
+ )
392
+ elif conditional_key == type_keys.Condition.EXPRESSION:
393
+ condition = value.read_value(
394
+ file_obj,
395
+ version,
396
+ vectors,
397
+ clbits=circuit.clbits,
398
+ cregs=registers["c"],
399
+ use_symengine=use_symengine,
400
+ standalone_vars=standalone_vars,
401
+ )
402
+
403
+ # Load Arguments
404
+ if circuit is not None:
405
+ for _qarg in range(instruction.num_qargs):
406
+ qarg = formats.CIRCUIT_INSTRUCTION_ARG._make(
407
+ struct.unpack(
408
+ formats.CIRCUIT_INSTRUCTION_ARG_PACK,
409
+ file_obj.read(formats.CIRCUIT_INSTRUCTION_ARG_SIZE),
410
+ )
411
+ )
412
+ if qarg.type.decode(common.ENCODE) == "c":
413
+ raise TypeError("Invalid input carg prior to all qargs")
414
+ qargs.append(circuit.qubits[qarg.size])
415
+ for _carg in range(instruction.num_cargs):
416
+ carg = formats.CIRCUIT_INSTRUCTION_ARG._make(
417
+ struct.unpack(
418
+ formats.CIRCUIT_INSTRUCTION_ARG_PACK,
419
+ file_obj.read(formats.CIRCUIT_INSTRUCTION_ARG_SIZE),
420
+ )
421
+ )
422
+ if carg.type.decode(common.ENCODE) == "q":
423
+ raise TypeError("Invalid input qarg after all qargs")
424
+ cargs.append(circuit.clbits[carg.size])
425
+
426
+ # Load Parameters
427
+ for _param in range(instruction.num_parameters):
428
+ type_key, data_bytes = common.read_generic_typed_data(file_obj)
429
+ param = _loads_instruction_parameter(
430
+ type_key,
431
+ data_bytes,
432
+ version,
433
+ vectors,
434
+ registers,
435
+ circuit,
436
+ use_symengine,
437
+ standalone_vars,
438
+ annotation_factories=annotation_state.factories,
439
+ )
440
+ params.append(param)
441
+
442
+ # Load annotations.
443
+ annotations = (
444
+ _read_instruction_annotations(file_obj, annotation_state) if has_annotations else None
445
+ )
446
+
447
+ # Load Gate object
448
+ if gate_name in {"Gate", "Instruction", "ControlledGate"}:
449
+ inst_obj = _parse_custom_operation(
450
+ custom_operations,
451
+ gate_name,
452
+ params,
453
+ version,
454
+ vectors,
455
+ registers,
456
+ use_symengine,
457
+ standalone_vars,
458
+ annotation_state=annotation_state,
459
+ )
460
+ if condition is not None:
461
+ warnings.warn(
462
+ f"The .condition attribute on {gate_name} can not be "
463
+ "represented in this version of Qiskit. It will be "
464
+ "represented as an IfElseOp instead.",
465
+ UserWarning,
466
+ stacklevel=3,
467
+ )
468
+
469
+ body = QuantumCircuit(qargs, cargs)
470
+ body.append(inst_obj, qargs, cargs)
471
+ inst_obj = IfElseOp(condition, body)
472
+ if instruction.label_size > 0:
473
+ inst_obj.label = label
474
+ if circuit is None:
475
+ return inst_obj
476
+ circuit._append(inst_obj, qargs, cargs)
477
+ return None
478
+ elif gate_name in custom_operations:
479
+ inst_obj = _parse_custom_operation(
480
+ custom_operations,
481
+ gate_name,
482
+ params,
483
+ version,
484
+ vectors,
485
+ registers,
486
+ use_symengine,
487
+ standalone_vars,
488
+ annotation_state=annotation_state,
489
+ )
490
+ inst_obj.condition = condition
491
+ if instruction.label_size > 0:
492
+ inst_obj.label = label
493
+ if circuit is None:
494
+ return inst_obj
495
+ circuit._append(inst_obj, qargs, cargs)
496
+ return None
497
+ elif hasattr(library, gate_name):
498
+ gate_class = getattr(library, gate_name)
499
+ elif hasattr(circuit_mod, gate_name):
500
+ gate_class = getattr(circuit_mod, gate_name)
501
+ elif hasattr(controlflow, gate_name):
502
+ gate_class = getattr(controlflow, gate_name)
503
+ elif gate_name == "Clifford":
504
+ gate_class = Clifford
505
+ else:
506
+ raise AttributeError(f"Invalid instruction type: {gate_name}")
507
+
508
+ if instruction.label_size <= 0:
509
+ label = None
510
+ if gate_name in ("IfElseOp", "WhileLoopOp"):
511
+ gate = gate_class(condition, *params, label=label)
512
+ elif gate_name == "BoxOp":
513
+ *params, duration, unit = params
514
+ gate = gate_class(
515
+ *params, label=label, duration=duration, unit=unit, annotations=annotations or ()
516
+ )
517
+ elif version >= 5 and issubclass(gate_class, ControlledGate):
518
+ if gate_name in {
519
+ "MCPhaseGate",
520
+ "MCU1Gate",
521
+ "MCXGrayCode",
522
+ "MCXGate",
523
+ "MCXRecursive",
524
+ "MCXVChain",
525
+ }:
526
+ gate = gate_class(*params, instruction.num_ctrl_qubits, label=label)
527
+ else:
528
+ gate = gate_class(*params, label=label)
529
+ if (
530
+ gate.num_ctrl_qubits != instruction.num_ctrl_qubits
531
+ or gate.ctrl_state != instruction.ctrl_state
532
+ ):
533
+ gate = gate.to_mutable()
534
+ gate.num_ctrl_qubits = instruction.num_ctrl_qubits
535
+ gate.ctrl_state = instruction.ctrl_state
536
+ if condition:
537
+ body = QuantumCircuit(qargs, cargs)
538
+ body.append(gate, qargs, cargs)
539
+ gate = IfElseOp(condition, body)
540
+ else:
541
+ if gate_name in {"Initialize", "StatePreparation"}:
542
+ if isinstance(params[0], str):
543
+ # the params are the labels of the initial state
544
+ gate = gate_class("".join(label for label in params))
545
+ elif instruction.num_parameters == 1:
546
+ # the params is the integer indicating which qubits to initialize
547
+ gate = gate_class(int(params[0].real), instruction.num_qargs)
548
+ else:
549
+ # the params represent a list of complex amplitudes
550
+ gate = gate_class(params)
551
+ elif gate_name in {
552
+ "UCRXGate",
553
+ "UCRYGate",
554
+ "UCRZGate",
555
+ "DiagonalGate",
556
+ }:
557
+ gate = gate_class(params)
558
+ elif gate_name == "QFTGate":
559
+ gate = gate_class(len(qargs), *params)
560
+ else:
561
+ if gate_name == "Barrier":
562
+ params = [len(qargs)]
563
+ elif gate_name in {"BreakLoopOp", "ContinueLoopOp"}:
564
+ params = [len(qargs), len(cargs)]
565
+ if label is not None:
566
+ if issubclass(gate_class, (SingletonInstruction, SingletonGate)):
567
+ gate = gate_class(*params, label=label)
568
+ else:
569
+ gate = gate_class(*params)
570
+ gate.label = label
571
+ else:
572
+ gate = gate_class(*params)
573
+ if condition:
574
+ if not isinstance(gate, ControlFlowOp):
575
+ warnings.warn(
576
+ f"The .condition attribute on {gate_name} can not be "
577
+ "represented in this version of Qiskit. It will be "
578
+ "represented as an IfElseOp instead.",
579
+ UserWarning,
580
+ stacklevel=3,
581
+ )
582
+ body = QuantumCircuit(qargs, cargs)
583
+ body.append(gate, qargs, cargs)
584
+ gate = IfElseOp(condition, body)
585
+ else:
586
+ gate.condition = condition
587
+ if circuit is None:
588
+ return gate
589
+ if not isinstance(gate, Instruction):
590
+ circuit.append(gate, qargs, cargs)
591
+ else:
592
+ circuit._append(CircuitInstruction(gate, qargs, cargs))
593
+ return None
594
+
595
+
596
+ def _parse_custom_operation(
597
+ custom_operations,
598
+ gate_name,
599
+ params,
600
+ version,
601
+ vectors,
602
+ registers,
603
+ use_symengine,
604
+ standalone_vars,
605
+ annotation_state,
606
+ ):
607
+ if version >= 5:
608
+ (
609
+ type_str,
610
+ num_qubits,
611
+ num_clbits,
612
+ definition,
613
+ num_ctrl_qubits,
614
+ ctrl_state,
615
+ base_gate_raw,
616
+ ) = custom_operations[gate_name]
617
+ else:
618
+ type_str, num_qubits, num_clbits, definition = custom_operations[gate_name]
619
+ base_gate_raw = ctrl_state = num_ctrl_qubits = None
620
+ # Strip the trailing "_{uuid}" from the gate name if the version >=11
621
+ if version >= 11:
622
+ gate_name = "_".join(gate_name.split("_")[:-1])
623
+ type_key = type_keys.CircuitInstruction(type_str)
624
+
625
+ if type_key == type_keys.CircuitInstruction.INSTRUCTION:
626
+ inst_obj = Instruction(gate_name, num_qubits, num_clbits, params)
627
+ if definition is not None:
628
+ inst_obj.definition = definition
629
+ return inst_obj
630
+
631
+ if type_key == type_keys.CircuitInstruction.GATE:
632
+ inst_obj = Gate(gate_name, num_qubits, params)
633
+ inst_obj.definition = definition
634
+ return inst_obj
635
+
636
+ if version >= 5 and type_key == type_keys.CircuitInstruction.CONTROLLED_GATE:
637
+ with io.BytesIO(base_gate_raw) as base_gate_obj:
638
+ base_gate = _read_instruction(
639
+ base_gate_obj,
640
+ None,
641
+ registers,
642
+ custom_operations,
643
+ version,
644
+ vectors,
645
+ use_symengine,
646
+ standalone_vars,
647
+ annotation_state=annotation_state,
648
+ )
649
+ if ctrl_state < 2**num_ctrl_qubits - 1:
650
+ # If open controls, we need to discard the control suffix when setting the name.
651
+ gate_name = gate_name.rsplit("_", 1)[0]
652
+ inst_obj = ControlledGate(
653
+ gate_name,
654
+ num_qubits,
655
+ params,
656
+ num_ctrl_qubits=num_ctrl_qubits,
657
+ ctrl_state=ctrl_state,
658
+ base_gate=base_gate,
659
+ )
660
+ inst_obj.definition = definition
661
+ return inst_obj
662
+
663
+ if version >= 11 and type_key == type_keys.CircuitInstruction.ANNOTATED_OPERATION:
664
+ with io.BytesIO(base_gate_raw) as base_gate_obj:
665
+ base_gate = _read_instruction(
666
+ base_gate_obj,
667
+ None,
668
+ registers,
669
+ custom_operations,
670
+ version,
671
+ vectors,
672
+ use_symengine,
673
+ standalone_vars,
674
+ annotation_state=annotation_state,
675
+ )
676
+ inst_obj = AnnotatedOperation(base_op=base_gate, modifiers=params)
677
+ return inst_obj
678
+
679
+ if type_key == type_keys.CircuitInstruction.PAULI_EVOL_GATE:
680
+ return definition
681
+
682
+ raise ValueError(f"Invalid custom instruction type '{type_str}'")
683
+
684
+
685
+ def _read_pauli_evolution_gate(file_obj, version, vectors):
686
+ pauli_evolution_def = formats.PAULI_EVOLUTION_DEF._make(
687
+ struct.unpack(
688
+ formats.PAULI_EVOLUTION_DEF_PACK, file_obj.read(formats.PAULI_EVOLUTION_DEF_SIZE)
689
+ )
690
+ )
691
+ if pauli_evolution_def.operator_size != 1 and pauli_evolution_def.standalone_op:
692
+ raise ValueError(
693
+ "Can't have a standalone operator with {pauli_evolution_raw[0]} operators in the payload"
694
+ )
695
+
696
+ operator_list = []
697
+ for _ in range(pauli_evolution_def.operator_size):
698
+ op_elem = formats.SPARSE_PAULI_OP_LIST_ELEM._make(
699
+ struct.unpack(
700
+ formats.SPARSE_PAULI_OP_LIST_ELEM_PACK,
701
+ file_obj.read(formats.SPARSE_PAULI_OP_LIST_ELEM_SIZE),
702
+ )
703
+ )
704
+ op_raw_data = common.data_from_binary(file_obj.read(op_elem.size), np.load)
705
+ operator_list.append(SparsePauliOp.from_list(op_raw_data))
706
+
707
+ if pauli_evolution_def.standalone_op:
708
+ pauli_op = operator_list[0]
709
+ else:
710
+ pauli_op = operator_list
711
+
712
+ time = value.loads_value(
713
+ pauli_evolution_def.time_type,
714
+ file_obj.read(pauli_evolution_def.time_size),
715
+ version=version,
716
+ vectors=vectors,
717
+ )
718
+ synth_data = json.loads(file_obj.read(pauli_evolution_def.synth_method_size))
719
+ synthesis = getattr(evo_synth, synth_data["class"])(**synth_data["settings"])
720
+ return_gate = library.PauliEvolutionGate(pauli_op, time=time, synthesis=synthesis)
721
+ return return_gate
722
+
723
+
724
+ def _read_modifier(file_obj):
725
+ modifier = formats.MODIFIER_DEF._make(
726
+ struct.unpack(
727
+ formats.MODIFIER_DEF_PACK,
728
+ file_obj.read(formats.MODIFIER_DEF_SIZE),
729
+ )
730
+ )
731
+ if modifier.type == b"i":
732
+ return InverseModifier()
733
+ elif modifier.type == b"c":
734
+ return ControlModifier(
735
+ num_ctrl_qubits=modifier.num_ctrl_qubits, ctrl_state=modifier.ctrl_state
736
+ )
737
+ elif modifier.type == b"p":
738
+ return PowerModifier(power=modifier.power)
739
+ else:
740
+ raise TypeError("Unsupported modifier.")
741
+
742
+
743
+ def _read_custom_operations(file_obj, version, vectors, annotation_state):
744
+ custom_operations = {}
745
+ custom_definition_header = formats.CUSTOM_CIRCUIT_DEF_HEADER._make(
746
+ struct.unpack(
747
+ formats.CUSTOM_CIRCUIT_DEF_HEADER_PACK,
748
+ file_obj.read(formats.CUSTOM_CIRCUIT_DEF_HEADER_SIZE),
749
+ )
750
+ )
751
+ if custom_definition_header.size > 0:
752
+ for _ in range(custom_definition_header.size):
753
+ if version < 5:
754
+ data = formats.CUSTOM_CIRCUIT_INST_DEF._make(
755
+ struct.unpack(
756
+ formats.CUSTOM_CIRCUIT_INST_DEF_PACK,
757
+ file_obj.read(formats.CUSTOM_CIRCUIT_INST_DEF_SIZE),
758
+ )
759
+ )
760
+ else:
761
+ data = formats.CUSTOM_CIRCUIT_INST_DEF_V2._make(
762
+ struct.unpack(
763
+ formats.CUSTOM_CIRCUIT_INST_DEF_V2_PACK,
764
+ file_obj.read(formats.CUSTOM_CIRCUIT_INST_DEF_V2_SIZE),
765
+ )
766
+ )
767
+
768
+ name = file_obj.read(data.gate_name_size).decode(common.ENCODE)
769
+ type_str = data.type
770
+ definition_circuit = None
771
+ if data.custom_definition:
772
+ def_binary = file_obj.read(data.size)
773
+ if version < 3 or not name.startswith(r"###PauliEvolutionGate_"):
774
+ definition_circuit = common.data_from_binary(
775
+ def_binary,
776
+ read_circuit,
777
+ version=version,
778
+ annotation_factories=annotation_state.factories,
779
+ )
780
+ elif name.startswith(r"###PauliEvolutionGate_"):
781
+ definition_circuit = common.data_from_binary(
782
+ def_binary, _read_pauli_evolution_gate, version=version, vectors=vectors
783
+ )
784
+ if version < 5:
785
+ data_payload = (type_str, data.num_qubits, data.num_clbits, definition_circuit)
786
+ else:
787
+ base_gate = file_obj.read(data.base_gate_size)
788
+ data_payload = (
789
+ type_str,
790
+ data.num_qubits,
791
+ data.num_clbits,
792
+ definition_circuit,
793
+ data.num_ctrl_qubits,
794
+ data.ctrl_state,
795
+ base_gate,
796
+ )
797
+ custom_operations[name] = data_payload
798
+ return custom_operations
799
+
800
+
801
+ def _read_calibrations(file_obj, version, vectors, metadata_deserializer):
802
+ """Consume calibrations data, make the file handle point to the next section"""
803
+ header = formats.CALIBRATION._make(
804
+ struct.unpack(formats.CALIBRATION_PACK, file_obj.read(formats.CALIBRATION_SIZE))
805
+ )
806
+ for _ in range(header.num_cals):
807
+ defheader = formats.CALIBRATION_DEF._make(
808
+ struct.unpack(formats.CALIBRATION_DEF_PACK, file_obj.read(formats.CALIBRATION_DEF_SIZE))
809
+ )
810
+ name = file_obj.read(defheader.name_size).decode(common.ENCODE)
811
+ if name:
812
+ warnings.warn(
813
+ category=UserWarning,
814
+ message="Support for loading pulse gates has been removed in Qiskit 2.0. "
815
+ f"If `{name}` is in the circuit it will be left as an opaque instruction.",
816
+ )
817
+
818
+ for _ in range(defheader.num_qubits): # read qubits info
819
+ file_obj.read(struct.calcsize("!q"))
820
+
821
+ for _ in range(defheader.num_params): # read params info
822
+ value.read_value(file_obj, version, vectors)
823
+
824
+ schedules.read_schedule_block(file_obj, version, metadata_deserializer)
825
+
826
+
827
+ def _dumps_register(register, index_map):
828
+ if isinstance(register, ClassicalRegister):
829
+ return register.name.encode(common.ENCODE)
830
+ # Clbit.
831
+ return b"\x00" + str(index_map["c"][register]).encode(common.ENCODE)
832
+
833
+
834
+ def _dumps_instruction_parameter(
835
+ param, index_map, use_symengine, *, version, standalone_var_indices, annotation_factories
836
+ ):
837
+ if isinstance(param, QuantumCircuit):
838
+ type_key = type_keys.Program.CIRCUIT
839
+ data_bytes = common.data_to_binary(
840
+ param, write_circuit, version=version, annotation_factories=annotation_factories
841
+ )
842
+ elif isinstance(param, Modifier):
843
+ type_key = type_keys.Value.MODIFIER
844
+ data_bytes = common.data_to_binary(param, _write_modifier)
845
+ elif isinstance(param, range):
846
+ type_key = type_keys.Container.RANGE
847
+ data_bytes = struct.pack(formats.RANGE_PACK, param.start, param.stop, param.step)
848
+ elif isinstance(param, tuple):
849
+ type_key = type_keys.Container.TUPLE
850
+ data_bytes = common.sequence_to_binary(
851
+ param,
852
+ _dumps_instruction_parameter,
853
+ index_map=index_map,
854
+ use_symengine=use_symengine,
855
+ version=version,
856
+ standalone_var_indices=standalone_var_indices,
857
+ annotation_factories=annotation_factories,
858
+ )
859
+ elif isinstance(param, int):
860
+ # TODO This uses little endian. This should be fixed in next QPY version.
861
+ type_key = type_keys.Value.INTEGER
862
+ data_bytes = struct.pack("<q", param)
863
+ elif isinstance(param, float):
864
+ # TODO This uses little endian. This should be fixed in next QPY version.
865
+ type_key = type_keys.Value.FLOAT
866
+ data_bytes = struct.pack("<d", param)
867
+ elif isinstance(param, (Clbit, ClassicalRegister)):
868
+ type_key = type_keys.Value.REGISTER
869
+ data_bytes = _dumps_register(param, index_map)
870
+ else:
871
+ type_key, data_bytes = value.dumps_value(
872
+ param,
873
+ index_map=index_map,
874
+ use_symengine=use_symengine,
875
+ standalone_var_indices=standalone_var_indices,
876
+ version=version,
877
+ )
878
+
879
+ return type_key, data_bytes
880
+
881
+
882
+ # pylint: disable=too-many-boolean-expressions
883
+ def _write_instruction(
884
+ file_obj,
885
+ instruction,
886
+ custom_operations,
887
+ index_map,
888
+ use_symengine,
889
+ version,
890
+ annotation_state,
891
+ standalone_var_indices=None,
892
+ ):
893
+ if isinstance(instruction.operation, Instruction):
894
+ gate_class_name = instruction.operation.base_class.__name__
895
+ else:
896
+ gate_class_name = instruction.operation.__class__.__name__
897
+
898
+ custom_operations_list = []
899
+ if (
900
+ (
901
+ not hasattr(library, gate_class_name)
902
+ and not hasattr(circuit_mod, gate_class_name)
903
+ and not hasattr(controlflow, gate_class_name)
904
+ and gate_class_name != "Clifford"
905
+ )
906
+ or gate_class_name == "Gate"
907
+ or gate_class_name == "Instruction"
908
+ or isinstance(instruction.operation, library.BlueprintCircuit)
909
+ ):
910
+ gate_class_name = instruction.operation.name
911
+ # Assign a uuid to each instance of a custom operation
912
+ if instruction.operation.name not in {"ucrx_dg", "ucry_dg", "ucrz_dg"}:
913
+ gate_class_name = f"{gate_class_name}_{uuid.uuid4().hex}"
914
+ else:
915
+ # ucr*_dg gates can have different numbers of parameters,
916
+ # the uuid is appended to avoid storing a single definition
917
+ # in circuits with multiple ucr*_dg gates. For legacy reasons
918
+ # the uuid is stored in a different format as this was done
919
+ # prior to QPY 11.
920
+ gate_class_name = f"{gate_class_name}_{uuid.uuid4()}"
921
+
922
+ custom_operations[gate_class_name] = instruction.operation
923
+ custom_operations_list.append(gate_class_name)
924
+
925
+ elif gate_class_name in {"ControlledGate", "AnnotatedOperation"}:
926
+ # controlled or annotated gates can have the same name but different parameter
927
+ # values, the uuid is appended to avoid storing a single definition
928
+ # in circuits with multiple controlled gates.
929
+ gate_class_name = instruction.operation.name + "_" + str(uuid.uuid4())
930
+ custom_operations[gate_class_name] = instruction.operation
931
+ custom_operations_list.append(gate_class_name)
932
+
933
+ elif isinstance(instruction.operation, library.PauliEvolutionGate):
934
+ gate_class_name = r"###PauliEvolutionGate_" + str(uuid.uuid4())
935
+ custom_operations[gate_class_name] = instruction.operation
936
+ custom_operations_list.append(gate_class_name)
937
+
938
+ elif isinstance(instruction.operation, library.MCMTGate):
939
+ gate_class_name = instruction.operation.name + "_" + str(uuid.uuid4())
940
+ custom_operations[gate_class_name] = instruction.operation
941
+ custom_operations_list.append(gate_class_name)
942
+
943
+ extra_type = type_keys.Condition.NONE
944
+ condition_register = b""
945
+ condition_value = 0
946
+ if (op_condition := getattr(instruction.operation, "_condition", None)) is not None:
947
+ if isinstance(op_condition, expr.Expr):
948
+ extra_type = type_keys.Condition.EXPRESSION
949
+ else:
950
+ extra_type = type_keys.Condition.TWO_TUPLE
951
+ condition_register = _dumps_register(instruction.operation._condition[0], index_map)
952
+ condition_value = int(instruction.operation._condition[1])
953
+
954
+ gate_class_name = gate_class_name.encode(common.ENCODE)
955
+ label = getattr(instruction.operation, "label", None)
956
+ if label:
957
+ label_raw = label.encode(common.ENCODE)
958
+ else:
959
+ label_raw = b""
960
+
961
+ annotations = []
962
+ # The instruction params we store are about being able to reconstruct the objects; they don't
963
+ # necessarily need to match one-to-one to the `params` field.
964
+ if isinstance(instruction.operation, controlflow.SwitchCaseOp):
965
+ instruction_params = [
966
+ instruction.operation.target,
967
+ tuple(instruction.operation.cases_specifier()),
968
+ ]
969
+ elif isinstance(instruction.operation, controlflow.BoxOp):
970
+ instruction_params = [
971
+ instruction.operation.blocks[0],
972
+ instruction.operation.duration,
973
+ instruction.operation.unit,
974
+ ]
975
+ annotations = [
976
+ annotation_state.serialize(annotation)
977
+ for annotation in instruction.operation.annotations
978
+ ]
979
+ elif isinstance(instruction.operation, Clifford):
980
+ instruction_params = [instruction.operation.tableau]
981
+ elif isinstance(instruction.operation, AnnotatedOperation):
982
+ instruction_params = instruction.operation.modifiers
983
+ else:
984
+ instruction_params = getattr(instruction.operation, "params", [])
985
+
986
+ if annotations:
987
+ extra_type |= type_keys.InstructionExtraFlags.HAS_ANNOTATIONS
988
+
989
+ num_ctrl_qubits = getattr(instruction.operation, "num_ctrl_qubits", 0)
990
+ ctrl_state = getattr(instruction.operation, "ctrl_state", 0)
991
+ instruction_raw = struct.pack(
992
+ formats.CIRCUIT_INSTRUCTION_V2_PACK,
993
+ len(gate_class_name),
994
+ len(label_raw),
995
+ len(instruction_params),
996
+ instruction.operation.num_qubits,
997
+ instruction.operation.num_clbits,
998
+ int(extra_type),
999
+ len(condition_register),
1000
+ condition_value,
1001
+ num_ctrl_qubits,
1002
+ ctrl_state,
1003
+ )
1004
+ file_obj.write(instruction_raw)
1005
+ file_obj.write(gate_class_name)
1006
+ file_obj.write(label_raw)
1007
+ condition_type = type_keys.Condition(extra_type & 0b11)
1008
+ if condition_type is type_keys.Condition.EXPRESSION:
1009
+ value.write_value(
1010
+ file_obj,
1011
+ op_condition,
1012
+ version=version,
1013
+ index_map=index_map,
1014
+ standalone_var_indices=standalone_var_indices,
1015
+ )
1016
+ else:
1017
+ file_obj.write(condition_register)
1018
+
1019
+ # Encode instruction args
1020
+ for qbit in instruction.qubits:
1021
+ instruction_arg_raw = struct.pack(
1022
+ formats.CIRCUIT_INSTRUCTION_ARG_PACK, b"q", index_map["q"][qbit]
1023
+ )
1024
+ file_obj.write(instruction_arg_raw)
1025
+ for clbit in instruction.clbits:
1026
+ instruction_arg_raw = struct.pack(
1027
+ formats.CIRCUIT_INSTRUCTION_ARG_PACK, b"c", index_map["c"][clbit]
1028
+ )
1029
+ file_obj.write(instruction_arg_raw)
1030
+ # Encode instruction params
1031
+ for param in instruction_params:
1032
+ type_key, data_bytes = _dumps_instruction_parameter(
1033
+ param,
1034
+ index_map,
1035
+ use_symengine,
1036
+ version=version,
1037
+ standalone_var_indices=standalone_var_indices,
1038
+ annotation_factories=annotation_state.factories,
1039
+ )
1040
+ common.write_generic_typed_data(file_obj, type_key, data_bytes)
1041
+ if annotations:
1042
+ if version < 15:
1043
+ raise UnsupportedFeatureForVersion("annotations", 15, version)
1044
+ file_obj.write(struct.pack(formats.INSTRUCTION_ANNOTATIONS_HEADER_PACK, len(annotations)))
1045
+ for serializer_index, annotation_payload in annotations:
1046
+ file_obj.write(
1047
+ struct.pack(
1048
+ formats.INSTRUCTION_ANNOTATION_PACK, serializer_index, len(annotation_payload)
1049
+ )
1050
+ )
1051
+ file_obj.write(annotation_payload)
1052
+ return custom_operations_list
1053
+
1054
+
1055
+ def _write_pauli_evolution_gate(file_obj, evolution_gate, version):
1056
+ operator_list = evolution_gate.operator
1057
+ standalone = False
1058
+ if not isinstance(operator_list, list):
1059
+ operator_list = [operator_list]
1060
+ standalone = True
1061
+ num_operators = len(operator_list)
1062
+
1063
+ def _write_elem(buffer, op):
1064
+ elem_data = common.data_to_binary(op.to_list(array=True), np.save)
1065
+ elem_metadata = struct.pack(formats.SPARSE_PAULI_OP_LIST_ELEM_PACK, len(elem_data))
1066
+ buffer.write(elem_metadata)
1067
+ buffer.write(elem_data)
1068
+
1069
+ pauli_data_buf = io.BytesIO()
1070
+ for operator in operator_list:
1071
+ data = common.data_to_binary(operator, _write_elem)
1072
+ pauli_data_buf.write(data)
1073
+
1074
+ time_type, time_data = value.dumps_value(evolution_gate.time, version=version)
1075
+ time_size = len(time_data)
1076
+ synth_class = str(type(evolution_gate.synthesis).__name__)
1077
+ settings_dict = evolution_gate.synthesis.settings
1078
+ synth_data = json.dumps({"class": synth_class, "settings": settings_dict}).encode(common.ENCODE)
1079
+ synth_size = len(synth_data)
1080
+ pauli_evolution_raw = struct.pack(
1081
+ formats.PAULI_EVOLUTION_DEF_PACK,
1082
+ num_operators,
1083
+ standalone,
1084
+ time_type,
1085
+ time_size,
1086
+ synth_size,
1087
+ )
1088
+ file_obj.write(pauli_evolution_raw)
1089
+ file_obj.write(pauli_data_buf.getvalue())
1090
+ pauli_data_buf.close()
1091
+ file_obj.write(time_data)
1092
+ file_obj.write(synth_data)
1093
+
1094
+
1095
+ def _write_modifier(file_obj, modifier):
1096
+ if isinstance(modifier, InverseModifier):
1097
+ type_key = b"i"
1098
+ num_ctrl_qubits = 0
1099
+ ctrl_state = 0
1100
+ power = 0.0
1101
+ elif isinstance(modifier, ControlModifier):
1102
+ type_key = b"c"
1103
+ num_ctrl_qubits = modifier.num_ctrl_qubits
1104
+ ctrl_state = modifier.ctrl_state
1105
+ power = 0.0
1106
+ elif isinstance(modifier, PowerModifier):
1107
+ type_key = b"p"
1108
+ num_ctrl_qubits = 0
1109
+ ctrl_state = 0
1110
+ power = modifier.power
1111
+ else:
1112
+ raise TypeError("Unsupported modifier.")
1113
+
1114
+ modifier_data = struct.pack(
1115
+ formats.MODIFIER_DEF_PACK, type_key, num_ctrl_qubits, ctrl_state, power
1116
+ )
1117
+ file_obj.write(modifier_data)
1118
+
1119
+
1120
+ def _write_custom_operation(
1121
+ file_obj,
1122
+ name,
1123
+ operation,
1124
+ custom_operations,
1125
+ use_symengine,
1126
+ version,
1127
+ *,
1128
+ standalone_var_indices,
1129
+ annotation_state,
1130
+ ):
1131
+ type_key = type_keys.CircuitInstruction.assign(operation)
1132
+ has_definition = False
1133
+ size = 0
1134
+ data = None
1135
+ num_qubits = operation.num_qubits
1136
+ num_clbits = operation.num_clbits
1137
+ ctrl_state = 0
1138
+ num_ctrl_qubits = 0
1139
+ base_gate = None
1140
+ new_custom_instruction = []
1141
+
1142
+ if type_key == type_keys.CircuitInstruction.PAULI_EVOL_GATE:
1143
+ has_definition = True
1144
+ data = common.data_to_binary(operation, _write_pauli_evolution_gate, version=version)
1145
+ size = len(data)
1146
+ elif type_key == type_keys.CircuitInstruction.CONTROLLED_GATE:
1147
+ # For ControlledGate, we have to access and store the private `_definition` rather than the
1148
+ # public one, because the public one is mutated to include additional logic if the control
1149
+ # state is open, and the definition setter (during a subsequent read) uses the "fully
1150
+ # excited" control definition only.
1151
+ has_definition = True
1152
+ # Build internal definition to support overloaded subclasses by
1153
+ # calling definition getter on object
1154
+ operation.definition # pylint: disable=pointless-statement
1155
+ data = common.data_to_binary(
1156
+ operation._definition,
1157
+ write_circuit,
1158
+ version=version,
1159
+ annotation_factories=annotation_state.factories,
1160
+ )
1161
+ size = len(data)
1162
+ num_ctrl_qubits = operation.num_ctrl_qubits
1163
+ ctrl_state = operation.ctrl_state
1164
+ base_gate = operation.base_gate
1165
+ elif type_key == type_keys.CircuitInstruction.ANNOTATED_OPERATION:
1166
+ has_definition = False
1167
+ base_gate = operation.base_op
1168
+ elif operation.definition is not None:
1169
+ has_definition = True
1170
+ data = common.data_to_binary(
1171
+ operation.definition,
1172
+ write_circuit,
1173
+ version=version,
1174
+ annotation_factories=annotation_state.factories,
1175
+ )
1176
+ size = len(data)
1177
+ if base_gate is None:
1178
+ base_gate_raw = b""
1179
+ else:
1180
+ with io.BytesIO() as base_gate_buffer:
1181
+ new_custom_instruction = _write_instruction(
1182
+ base_gate_buffer,
1183
+ CircuitInstruction(base_gate, (), ()),
1184
+ custom_operations,
1185
+ {},
1186
+ use_symengine,
1187
+ version,
1188
+ standalone_var_indices=standalone_var_indices,
1189
+ annotation_state=annotation_state,
1190
+ )
1191
+ base_gate_raw = base_gate_buffer.getvalue()
1192
+ name_raw = name.encode(common.ENCODE)
1193
+ custom_operation_raw = struct.pack(
1194
+ formats.CUSTOM_CIRCUIT_INST_DEF_V2_PACK,
1195
+ len(name_raw),
1196
+ type_key,
1197
+ num_qubits,
1198
+ num_clbits,
1199
+ has_definition,
1200
+ size,
1201
+ num_ctrl_qubits,
1202
+ ctrl_state,
1203
+ len(base_gate_raw),
1204
+ )
1205
+ file_obj.write(custom_operation_raw)
1206
+ file_obj.write(name_raw)
1207
+ if data:
1208
+ file_obj.write(data)
1209
+ file_obj.write(base_gate_raw)
1210
+ return new_custom_instruction
1211
+
1212
+
1213
+ def _write_registers(file_obj, in_circ_regs, full_bits):
1214
+ bitmap = {bit: index for index, bit in enumerate(full_bits)}
1215
+
1216
+ out_circ_regs = set()
1217
+ for bit in full_bits:
1218
+ if bit._register is not None and bit._register not in in_circ_regs:
1219
+ out_circ_regs.add(bit._register)
1220
+
1221
+ for regs, is_in_circuit in [(in_circ_regs, True), (out_circ_regs, False)]:
1222
+ for reg in regs:
1223
+ standalone = all(
1224
+ bit._register == reg and bit._index == index for index, bit in enumerate(reg)
1225
+ )
1226
+ reg_name = reg.name.encode(common.ENCODE)
1227
+ reg_type = reg.prefix.encode(common.ENCODE)
1228
+ file_obj.write(
1229
+ struct.pack(
1230
+ formats.REGISTER_V4_PACK,
1231
+ reg_type,
1232
+ standalone,
1233
+ reg.size,
1234
+ len(reg_name),
1235
+ is_in_circuit,
1236
+ )
1237
+ )
1238
+ file_obj.write(reg_name)
1239
+ REGISTER_ARRAY_PACK = f"!{reg.size}q"
1240
+ bit_indices = []
1241
+ for bit in reg:
1242
+ bit_indices.append(bitmap.get(bit, -1))
1243
+ file_obj.write(struct.pack(REGISTER_ARRAY_PACK, *bit_indices))
1244
+
1245
+ return len(in_circ_regs) + len(out_circ_regs)
1246
+
1247
+
1248
+ def _write_layout(file_obj, circuit):
1249
+ if circuit.layout is None:
1250
+ # Write a null header if there is no layout present
1251
+ file_obj.write(struct.pack(formats.LAYOUT_V2_PACK, False, -1, -1, -1, 0, 0))
1252
+ return
1253
+ initial_size = -1
1254
+ input_qubit_mapping = {}
1255
+ initial_layout_array = []
1256
+ extra_registers = defaultdict(list)
1257
+ if circuit.layout.initial_layout is not None:
1258
+ initial_size = len(circuit.layout.initial_layout)
1259
+ layout_mapping = circuit.layout.initial_layout.get_physical_bits()
1260
+ for i in range(circuit.num_qubits):
1261
+ qubit = layout_mapping[i]
1262
+ input_qubit_mapping[qubit] = i
1263
+ if qubit._register is not None or qubit._index is not None:
1264
+ if qubit._register not in circuit.qregs:
1265
+ extra_registers[qubit._register].append(qubit)
1266
+ initial_layout_array.append((qubit._index, qubit._register))
1267
+ else:
1268
+ initial_layout_array.append((None, None))
1269
+ input_qubit_size = -1
1270
+ input_qubit_mapping_array = []
1271
+ if circuit.layout.input_qubit_mapping is not None:
1272
+ input_qubit_size = len(circuit.layout.input_qubit_mapping)
1273
+ input_qubit_mapping_array = [None] * input_qubit_size
1274
+ layout_mapping = circuit.layout.initial_layout.get_virtual_bits()
1275
+ for qubit, index in circuit.layout.input_qubit_mapping.items():
1276
+ if (
1277
+ getattr(qubit, "_register", None) is not None
1278
+ and getattr(qubit, "_index", None) is not None
1279
+ ):
1280
+ if qubit._register not in circuit.qregs:
1281
+ extra_registers[qubit._register].append(qubit)
1282
+ input_qubit_mapping_array[index] = layout_mapping[qubit]
1283
+ else:
1284
+ input_qubit_mapping_array[index] = layout_mapping[qubit]
1285
+ final_layout_size = -1
1286
+ final_layout_array = []
1287
+ if circuit.layout.final_layout is not None:
1288
+ final_layout_size = len(circuit.layout.final_layout)
1289
+ final_layout_physical = circuit.layout.final_layout.get_physical_bits()
1290
+ for i in range(circuit.num_qubits):
1291
+ virtual_bit = final_layout_physical[i]
1292
+ final_layout_array.append(circuit.find_bit(virtual_bit).index)
1293
+
1294
+ input_qubit_count = circuit._layout._input_qubit_count
1295
+ if input_qubit_count is None:
1296
+ input_qubit_count = -1
1297
+ file_obj.write(
1298
+ struct.pack(
1299
+ formats.LAYOUT_V2_PACK,
1300
+ True,
1301
+ initial_size,
1302
+ input_qubit_size,
1303
+ final_layout_size,
1304
+ len(extra_registers),
1305
+ input_qubit_count,
1306
+ )
1307
+ )
1308
+ _write_registers(
1309
+ file_obj, list(extra_registers), [x for bits in extra_registers.values() for x in bits]
1310
+ )
1311
+ for index, register in initial_layout_array:
1312
+ reg_name_bytes = None if register is None else register.name.encode(common.ENCODE)
1313
+ file_obj.write(
1314
+ struct.pack(
1315
+ formats.INITIAL_LAYOUT_BIT_PACK,
1316
+ -1 if index is None else index,
1317
+ -1 if reg_name_bytes is None else len(reg_name_bytes),
1318
+ )
1319
+ )
1320
+ if reg_name_bytes is not None:
1321
+ file_obj.write(reg_name_bytes)
1322
+ for i in input_qubit_mapping_array:
1323
+ file_obj.write(struct.pack("!I", i))
1324
+ for i in final_layout_array:
1325
+ file_obj.write(struct.pack("!I", i))
1326
+
1327
+
1328
+ def _read_layout(file_obj, circuit):
1329
+ header = formats.LAYOUT._make(
1330
+ struct.unpack(formats.LAYOUT_PACK, file_obj.read(formats.LAYOUT_SIZE))
1331
+ )
1332
+ if not header.exists:
1333
+ return
1334
+ _read_common_layout(file_obj, header, circuit)
1335
+
1336
+
1337
+ def _read_common_layout(file_obj, header, circuit):
1338
+ registers = {
1339
+ name: QuantumRegister(len(v[1]), name)
1340
+ for name, v in _read_registers_v4(file_obj, header.extra_registers)["q"].items()
1341
+ }
1342
+ initial_layout = None
1343
+ initial_layout_virtual_bits = []
1344
+ for _ in range(header.initial_layout_size):
1345
+ virtual_bit = formats.INITIAL_LAYOUT_BIT._make(
1346
+ struct.unpack(
1347
+ formats.INITIAL_LAYOUT_BIT_PACK,
1348
+ file_obj.read(formats.INITIAL_LAYOUT_BIT_SIZE),
1349
+ )
1350
+ )
1351
+ if virtual_bit.index == -1 and virtual_bit.register_size == -1:
1352
+ qubit = Qubit()
1353
+ else:
1354
+ register_name = file_obj.read(virtual_bit.register_size).decode(common.ENCODE)
1355
+ if register_name in registers:
1356
+ qubit = registers[register_name][virtual_bit.index]
1357
+ else:
1358
+ register = next(filter(lambda x, name=register_name: x.name == name, circuit.qregs))
1359
+ qubit = register[virtual_bit.index]
1360
+ initial_layout_virtual_bits.append(qubit)
1361
+ if initial_layout_virtual_bits:
1362
+ initial_layout = Layout.from_qubit_list(initial_layout_virtual_bits)
1363
+ input_qubit_mapping = None
1364
+ input_qubit_mapping_array = []
1365
+ for _ in range(header.input_mapping_size):
1366
+ input_qubit_mapping_array.append(
1367
+ struct.unpack("!I", file_obj.read(struct.calcsize("!I")))[0]
1368
+ )
1369
+ if input_qubit_mapping_array:
1370
+ input_qubit_mapping = {}
1371
+ physical_bits = initial_layout.get_physical_bits()
1372
+ for index, bit in enumerate(input_qubit_mapping_array):
1373
+ input_qubit_mapping[physical_bits[bit]] = index
1374
+ final_layout = None
1375
+ final_layout_array = []
1376
+ for _ in range(header.final_layout_size):
1377
+ final_layout_array.append(struct.unpack("!I", file_obj.read(struct.calcsize("!I")))[0])
1378
+
1379
+ if final_layout_array:
1380
+ layout_dict = {circuit.qubits[bit]: index for index, bit in enumerate(final_layout_array)}
1381
+ final_layout = Layout(layout_dict)
1382
+
1383
+ circuit._layout = TranspileLayout(initial_layout, input_qubit_mapping, final_layout)
1384
+
1385
+
1386
+ def _read_layout_v2(file_obj, circuit):
1387
+ header = formats.LAYOUT_V2._make(
1388
+ struct.unpack(formats.LAYOUT_V2_PACK, file_obj.read(formats.LAYOUT_V2_SIZE))
1389
+ )
1390
+ if not header.exists:
1391
+ return
1392
+ _read_common_layout(file_obj, header, circuit)
1393
+ if header.input_qubit_count >= 0:
1394
+ circuit._layout._input_qubit_count = header.input_qubit_count
1395
+ circuit._layout._output_qubit_list = circuit.qubits
1396
+
1397
+
1398
+ def write_circuit(
1399
+ file_obj,
1400
+ circuit,
1401
+ metadata_serializer=None,
1402
+ use_symengine=False,
1403
+ version=common.QPY_VERSION,
1404
+ annotation_factories=None,
1405
+ ):
1406
+ """Write a single QuantumCircuit object in the file like object.
1407
+
1408
+ Args:
1409
+ file_obj (FILE): The file like object to write the circuit data in.
1410
+ circuit (QuantumCircuit): The circuit data to write.
1411
+ metadata_serializer (JSONEncoder): An optional JSONEncoder class that
1412
+ will be passed the :attr:`.QuantumCircuit.metadata` dictionary for
1413
+ ``circuit`` and will be used as the ``cls`` kwarg
1414
+ on the ``json.dump()`` call to JSON serialize that dictionary.
1415
+ use_symengine (bool): If True, symbolic objects will be serialized using symengine's
1416
+ native mechanism. This is a faster serialization alternative, but not supported in all
1417
+ platforms. Please check that your target platform is supported by the symengine library
1418
+ before setting this option, as it will be required by qpy to deserialize the payload.
1419
+ version (int): The QPY format version to use for serializing this circuit
1420
+ annotation_factories (dict): a mapping of namespaces to zero-argument factory functions that
1421
+ produce instances of :class:`.annotation.QPYSerializer`.
1422
+ """
1423
+ annotation_state = _AnnotationSerializationState(annotation_factories or {})
1424
+ metadata_raw = json.dumps(
1425
+ circuit.metadata, separators=(",", ":"), cls=metadata_serializer
1426
+ ).encode(common.ENCODE)
1427
+ metadata_size = len(metadata_raw)
1428
+ num_instructions = len(circuit)
1429
+ circuit_name = circuit.name.encode(common.ENCODE)
1430
+ global_phase_type, global_phase_data = value.dumps_value(circuit.global_phase, version=version)
1431
+
1432
+ with io.BytesIO() as reg_buf:
1433
+ num_qregs = _write_registers(reg_buf, circuit.qregs, circuit.qubits)
1434
+ num_cregs = _write_registers(reg_buf, circuit.cregs, circuit.clbits)
1435
+ registers_raw = reg_buf.getvalue()
1436
+ num_registers = num_qregs + num_cregs
1437
+
1438
+ # Write circuit header
1439
+ header_raw = formats.CIRCUIT_HEADER_V12(
1440
+ name_size=len(circuit_name),
1441
+ global_phase_type=global_phase_type,
1442
+ global_phase_size=len(global_phase_data),
1443
+ num_qubits=circuit.num_qubits,
1444
+ num_clbits=circuit.num_clbits,
1445
+ metadata_size=metadata_size,
1446
+ num_registers=num_registers,
1447
+ num_instructions=num_instructions,
1448
+ num_vars=circuit.num_identifiers,
1449
+ )
1450
+ header = struct.pack(formats.CIRCUIT_HEADER_V12_PACK, *header_raw)
1451
+ file_obj.write(header)
1452
+ file_obj.write(circuit_name)
1453
+ file_obj.write(global_phase_data)
1454
+ file_obj.write(metadata_raw)
1455
+ # Write header payload
1456
+ file_obj.write(registers_raw)
1457
+ standalone_var_indices = value.write_standalone_vars(file_obj, circuit, version)
1458
+
1459
+ instruction_buffer = io.BytesIO()
1460
+ custom_operations = {}
1461
+ index_map = {}
1462
+ index_map["q"] = {bit: index for index, bit in enumerate(circuit.qubits)}
1463
+ index_map["c"] = {bit: index for index, bit in enumerate(circuit.clbits)}
1464
+ for instruction in circuit.data:
1465
+ _write_instruction(
1466
+ instruction_buffer,
1467
+ instruction,
1468
+ custom_operations,
1469
+ index_map,
1470
+ use_symengine,
1471
+ version,
1472
+ standalone_var_indices=standalone_var_indices,
1473
+ annotation_state=annotation_state,
1474
+ )
1475
+
1476
+ with io.BytesIO() as custom_operations_buffer:
1477
+ new_custom_operations = list(custom_operations.keys())
1478
+ while new_custom_operations:
1479
+ operations_to_serialize = new_custom_operations.copy()
1480
+ new_custom_operations = []
1481
+ for name in operations_to_serialize:
1482
+ operation = custom_operations[name]
1483
+ new_custom_operations.extend(
1484
+ _write_custom_operation(
1485
+ custom_operations_buffer,
1486
+ name,
1487
+ operation,
1488
+ custom_operations,
1489
+ use_symengine,
1490
+ version,
1491
+ standalone_var_indices=standalone_var_indices,
1492
+ annotation_state=annotation_state,
1493
+ )
1494
+ )
1495
+ # We only write this out after we've done the annotations.
1496
+ custom_operations_payload = custom_operations_buffer.getvalue()
1497
+
1498
+ if version >= 15:
1499
+ file_obj.write(
1500
+ struct.pack(formats.ANNOTATION_HEADER_STATIC_PACK, annotation_state.num_serializers)
1501
+ )
1502
+ for namespace, serializer in annotation_state.iter_serializers():
1503
+ namespace_bytes = namespace.encode("utf-8")
1504
+ serializer_state = serializer.dump_state()
1505
+ file_obj.write(
1506
+ struct.pack(
1507
+ formats.ANNOTATION_STATE_HEADER_PACK,
1508
+ len(namespace_bytes),
1509
+ len(serializer_state),
1510
+ )
1511
+ )
1512
+ file_obj.write(namespace_bytes)
1513
+ file_obj.write(serializer_state)
1514
+ elif annotation_state.num_serializers:
1515
+ raise UnsupportedFeatureForVersion(annotations, 15, version)
1516
+
1517
+ file_obj.write(struct.pack(formats.CUSTOM_CIRCUIT_DEF_HEADER_PACK, len(custom_operations)))
1518
+ file_obj.write(custom_operations_payload)
1519
+ file_obj.write(instruction_buffer.getvalue())
1520
+ instruction_buffer.close()
1521
+
1522
+ # Pulse has been removed in Qiskit 2.0. As long as we keep QPY at version 13,
1523
+ # we need to write an empty calibrations header since read_circuit expects it
1524
+ header = struct.pack(formats.CALIBRATION_PACK, 0)
1525
+ file_obj.write(header)
1526
+
1527
+ _write_layout(file_obj, circuit)
1528
+
1529
+
1530
+ def read_circuit(
1531
+ file_obj, version, metadata_deserializer=None, use_symengine=False, annotation_factories=None
1532
+ ):
1533
+ """Read a single QuantumCircuit object from the file like object.
1534
+
1535
+ Args:
1536
+ file_obj (FILE): The file like object to read the circuit data from.
1537
+ version (int): QPY version.
1538
+ metadata_deserializer (JSONDecoder): An optional JSONDecoder class
1539
+ that will be used for the ``cls`` kwarg on the internal
1540
+ ``json.load`` call used to deserialize the JSON payload used for
1541
+ the :attr:`.QuantumCircuit.metadata` attribute for a circuit
1542
+ in the file-like object. If this is not specified the circuit metadata will
1543
+ be parsed as JSON with the stdlib ``json.load()`` function using
1544
+ the default ``JSONDecoder`` class.
1545
+ use_symengine (bool): If True, symbolic objects will be de-serialized using
1546
+ symengine's native mechanism. This is a faster serialization alternative, but not
1547
+ supported in all platforms. Please check that your target platform is supported by
1548
+ the symengine library before setting this option, as it will be required by qpy to
1549
+ deserialize the payload.
1550
+ annotation_factories (dict): mapping of namespaces to factory functions for custom
1551
+ annotation deserializer objects.
1552
+ Returns:
1553
+ QuantumCircuit: The circuit object from the file.
1554
+
1555
+ Raises:
1556
+ QpyError: Invalid register.
1557
+ """
1558
+ vectors = {}
1559
+ if version < 2:
1560
+ header, name, metadata = _read_header(file_obj, metadata_deserializer=metadata_deserializer)
1561
+ elif version < 12:
1562
+ header, name, metadata = _read_header_v2(
1563
+ file_obj, version, vectors, metadata_deserializer=metadata_deserializer
1564
+ )
1565
+ else:
1566
+ header, name, metadata = _read_header_v12(
1567
+ file_obj, version, vectors, metadata_deserializer=metadata_deserializer
1568
+ )
1569
+
1570
+ global_phase = header["global_phase"]
1571
+ num_qubits = header["num_qubits"]
1572
+ num_clbits = header["num_clbits"]
1573
+ num_registers = header["num_registers"]
1574
+ num_instructions = header["num_instructions"]
1575
+ num_identifiers = header.get("num_vars", 0)
1576
+ # `out_registers` is two "name: register" maps segregated by type for the rest of QPY, and
1577
+ # `all_registers` is the complete ordered list used to construct the `QuantumCircuit`.
1578
+ out_registers = {"q": {}, "c": {}}
1579
+ all_registers = []
1580
+ out_bits = {"q": [None] * num_qubits, "c": [None] * num_clbits}
1581
+ if num_registers > 0:
1582
+ if version < 4:
1583
+ registers = _read_registers(file_obj, num_registers)
1584
+ else:
1585
+ registers = _read_registers_v4(file_obj, num_registers)
1586
+ for bit_type_label, bit_type, reg_type in [
1587
+ ("q", Qubit, QuantumRegister),
1588
+ ("c", Clbit, ClassicalRegister),
1589
+ ]:
1590
+ # This does two passes through the registers. In the first, we're actually just
1591
+ # constructing the `Bit` instances: any register that is `standalone` "owns" all its
1592
+ # bits in the old Qiskit data model, so we have to construct those by creating the
1593
+ # register and taking the bits from them. That's the case even if that register isn't
1594
+ # actually in the circuit, which is why we stored them (with `in_circuit=False`) in QPY.
1595
+ #
1596
+ # Since there's no guarantees in QPY about the ordering of registers, we have to pass
1597
+ # through all registers to create the bits first, because we can't reliably know if a
1598
+ # non-standalone register contains bits from a standalone one until we've seen all
1599
+ # standalone registers.
1600
+ typed_bits = out_bits[bit_type_label]
1601
+ typed_registers = registers[bit_type_label]
1602
+ for register_name, (standalone, indices, _incircuit) in typed_registers.items():
1603
+ if not standalone:
1604
+ continue
1605
+ register = reg_type(len(indices), register_name)
1606
+ out_registers[bit_type_label][register_name] = register
1607
+ for owned, index in zip(register, indices):
1608
+ # Negative indices are for bits that aren't in the circuit.
1609
+ if index >= 0:
1610
+ typed_bits[index] = owned
1611
+ # Any remaining unset bits aren't owned, so we can construct them in the standard way.
1612
+ typed_bits = [bit if bit is not None else bit_type() for bit in typed_bits]
1613
+ # Finally _properly_ construct all the registers. Bits can be in more than one
1614
+ # register, including bits that are old-style "owned" by a register.
1615
+ for register_name, (standalone, indices, in_circuit) in typed_registers.items():
1616
+ if standalone:
1617
+ register = out_registers[bit_type_label][register_name]
1618
+ else:
1619
+ register = reg_type(
1620
+ name=register_name,
1621
+ bits=[typed_bits[x] if x >= 0 else bit_type() for x in indices],
1622
+ )
1623
+ out_registers[bit_type_label][register_name] = register
1624
+ if in_circuit:
1625
+ all_registers.append(register)
1626
+ out_bits[bit_type_label] = typed_bits
1627
+ else:
1628
+ out_bits = {
1629
+ "q": [Qubit() for _ in out_bits["q"]],
1630
+ "c": [Clbit() for _ in out_bits["c"]],
1631
+ }
1632
+ var_segments, standalone_var_indices = value.read_standalone_vars(file_obj, num_identifiers)
1633
+ circ = QuantumCircuit(
1634
+ out_bits["q"],
1635
+ out_bits["c"],
1636
+ *all_registers,
1637
+ name=name,
1638
+ global_phase=global_phase,
1639
+ metadata=metadata,
1640
+ inputs=var_segments[type_keys.ExprVarDeclaration.INPUT],
1641
+ captures=itertools.chain(
1642
+ var_segments[type_keys.ExprVarDeclaration.CAPTURE],
1643
+ var_segments[type_keys.ExprVarDeclaration.STRETCH_CAPTURE],
1644
+ ),
1645
+ )
1646
+ for declaration in var_segments[type_keys.ExprVarDeclaration.LOCAL]:
1647
+ circ.add_uninitialized_var(declaration)
1648
+ for stretch in var_segments[type_keys.ExprVarDeclaration.STRETCH_LOCAL]:
1649
+ circ.add_stretch(stretch)
1650
+ if version >= 15:
1651
+ annotation_state = _read_annotation_states(file_obj, annotation_factories or {})
1652
+ else:
1653
+ annotation_state = _AnnotationDeserializationState(annotation_factories or {})
1654
+ custom_operations = _read_custom_operations(file_obj, version, vectors, annotation_state)
1655
+ for _instruction in range(num_instructions):
1656
+ _read_instruction(
1657
+ file_obj,
1658
+ circ,
1659
+ out_registers,
1660
+ custom_operations,
1661
+ version,
1662
+ vectors,
1663
+ use_symengine,
1664
+ standalone_var_indices,
1665
+ annotation_state=annotation_state,
1666
+ )
1667
+
1668
+ # Consume calibrations, but don't use them since pulse gates are not supported as of Qiskit 2.0
1669
+ if version >= 5:
1670
+ _read_calibrations(file_obj, version, vectors, metadata_deserializer)
1671
+
1672
+ for vector, initialized_params in vectors.values():
1673
+ if len(initialized_params) != len(vector):
1674
+ warnings.warn(
1675
+ f"The ParameterVector: '{vector.name}' is not fully identical to its "
1676
+ "pre-serialization state. Elements "
1677
+ f"{', '.join([str(x) for x in set(range(len(vector))) - initialized_params])} "
1678
+ "in the ParameterVector will be not equal to the pre-serialized ParameterVector "
1679
+ f"as they weren't used in the circuit: {circ.name}",
1680
+ UserWarning,
1681
+ )
1682
+ if version >= 8:
1683
+ if version >= 10:
1684
+ _read_layout_v2(file_obj, circ)
1685
+ else:
1686
+ _read_layout(file_obj, circ)
1687
+ return circ