qiskit 1.3.0__cp39-abi3-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (836) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +146 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/assembler/__init__.py +42 -0
  6. qiskit/assembler/assemble_circuits.py +451 -0
  7. qiskit/assembler/assemble_schedules.py +367 -0
  8. qiskit/assembler/disassemble.py +310 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +1313 -0
  11. qiskit/circuit/_classical_resource_map.py +148 -0
  12. qiskit/circuit/_standard_gates_commutations.py +3849 -0
  13. qiskit/circuit/_utils.py +167 -0
  14. qiskit/circuit/add_control.py +274 -0
  15. qiskit/circuit/annotated_operation.py +279 -0
  16. qiskit/circuit/barrier.py +50 -0
  17. qiskit/circuit/bit.py +94 -0
  18. qiskit/circuit/classical/__init__.py +41 -0
  19. qiskit/circuit/classical/expr/__init__.py +238 -0
  20. qiskit/circuit/classical/expr/constructors.py +556 -0
  21. qiskit/circuit/classical/expr/expr.py +397 -0
  22. qiskit/circuit/classical/expr/visitors.py +300 -0
  23. qiskit/circuit/classical/types/__init__.py +109 -0
  24. qiskit/circuit/classical/types/ordering.py +222 -0
  25. qiskit/circuit/classical/types/types.py +117 -0
  26. qiskit/circuit/classicalfunction/__init__.py +140 -0
  27. qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
  28. qiskit/circuit/classicalfunction/classical_element.py +54 -0
  29. qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
  30. qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
  31. qiskit/circuit/classicalfunction/exceptions.py +35 -0
  32. qiskit/circuit/classicalfunction/types.py +18 -0
  33. qiskit/circuit/classicalfunction/utils.py +91 -0
  34. qiskit/circuit/classicalregister.py +57 -0
  35. qiskit/circuit/commutation_checker.py +106 -0
  36. qiskit/circuit/commutation_library.py +20 -0
  37. qiskit/circuit/controlflow/__init__.py +28 -0
  38. qiskit/circuit/controlflow/_builder_utils.py +207 -0
  39. qiskit/circuit/controlflow/break_loop.py +56 -0
  40. qiskit/circuit/controlflow/builder.py +691 -0
  41. qiskit/circuit/controlflow/continue_loop.py +58 -0
  42. qiskit/circuit/controlflow/control_flow.py +84 -0
  43. qiskit/circuit/controlflow/for_loop.py +217 -0
  44. qiskit/circuit/controlflow/if_else.py +511 -0
  45. qiskit/circuit/controlflow/switch_case.py +417 -0
  46. qiskit/circuit/controlflow/while_loop.py +171 -0
  47. qiskit/circuit/controlledgate.py +274 -0
  48. qiskit/circuit/delay.py +123 -0
  49. qiskit/circuit/duration.py +95 -0
  50. qiskit/circuit/equivalence.py +94 -0
  51. qiskit/circuit/equivalence_library.py +18 -0
  52. qiskit/circuit/exceptions.py +19 -0
  53. qiskit/circuit/gate.py +263 -0
  54. qiskit/circuit/instruction.py +697 -0
  55. qiskit/circuit/instructionset.py +179 -0
  56. qiskit/circuit/library/__init__.py +668 -0
  57. qiskit/circuit/library/arithmetic/__init__.py +34 -0
  58. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  59. qiskit/circuit/library/arithmetic/adders/adder.py +210 -0
  60. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  61. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  62. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  63. qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
  64. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  65. qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
  66. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
  67. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
  68. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  69. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  70. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +192 -0
  71. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  72. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
  73. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
  74. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
  75. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
  76. qiskit/circuit/library/arithmetic/quadratic_form.py +198 -0
  77. qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
  78. qiskit/circuit/library/basis_change/__init__.py +15 -0
  79. qiskit/circuit/library/basis_change/qft.py +313 -0
  80. qiskit/circuit/library/blueprintcircuit.py +280 -0
  81. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  82. qiskit/circuit/library/boolean_logic/inner_product.py +155 -0
  83. qiskit/circuit/library/boolean_logic/quantum_and.py +200 -0
  84. qiskit/circuit/library/boolean_logic/quantum_or.py +202 -0
  85. qiskit/circuit/library/boolean_logic/quantum_xor.py +165 -0
  86. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  87. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  88. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  89. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  90. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  91. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  92. qiskit/circuit/library/fourier_checking.py +158 -0
  93. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  94. qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
  95. qiskit/circuit/library/generalized_gates/gms.py +174 -0
  96. qiskit/circuit/library/generalized_gates/gr.py +215 -0
  97. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  98. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  99. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  100. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  101. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  102. qiskit/circuit/library/generalized_gates/permutation.py +194 -0
  103. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  104. qiskit/circuit/library/generalized_gates/uc.py +213 -0
  105. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  106. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  107. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  108. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  109. qiskit/circuit/library/generalized_gates/unitary.py +215 -0
  110. qiskit/circuit/library/graph_state.py +169 -0
  111. qiskit/circuit/library/grover_operator.py +579 -0
  112. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  113. qiskit/circuit/library/hidden_linear_function.py +161 -0
  114. qiskit/circuit/library/iqp.py +175 -0
  115. qiskit/circuit/library/n_local/__init__.py +45 -0
  116. qiskit/circuit/library/n_local/efficient_su2.py +277 -0
  117. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +515 -0
  118. qiskit/circuit/library/n_local/excitation_preserving.py +297 -0
  119. qiskit/circuit/library/n_local/n_local.py +1472 -0
  120. qiskit/circuit/library/n_local/pauli_two_design.py +243 -0
  121. qiskit/circuit/library/n_local/qaoa_ansatz.py +366 -0
  122. qiskit/circuit/library/n_local/real_amplitudes.py +306 -0
  123. qiskit/circuit/library/n_local/two_local.py +289 -0
  124. qiskit/circuit/library/overlap.py +182 -0
  125. qiskit/circuit/library/pauli_evolution.py +186 -0
  126. qiskit/circuit/library/phase_estimation.py +175 -0
  127. qiskit/circuit/library/phase_oracle.py +153 -0
  128. qiskit/circuit/library/quantum_volume.py +167 -0
  129. qiskit/circuit/library/standard_gates/__init__.py +142 -0
  130. qiskit/circuit/library/standard_gates/dcx.py +78 -0
  131. qiskit/circuit/library/standard_gates/ecr.py +130 -0
  132. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  133. qiskit/circuit/library/standard_gates/global_phase.py +85 -0
  134. qiskit/circuit/library/standard_gates/h.py +258 -0
  135. qiskit/circuit/library/standard_gates/i.py +76 -0
  136. qiskit/circuit/library/standard_gates/iswap.py +134 -0
  137. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +405 -0
  138. qiskit/circuit/library/standard_gates/p.py +441 -0
  139. qiskit/circuit/library/standard_gates/r.py +117 -0
  140. qiskit/circuit/library/standard_gates/rx.py +303 -0
  141. qiskit/circuit/library/standard_gates/rxx.py +183 -0
  142. qiskit/circuit/library/standard_gates/ry.py +298 -0
  143. qiskit/circuit/library/standard_gates/ryy.py +183 -0
  144. qiskit/circuit/library/standard_gates/rz.py +319 -0
  145. qiskit/circuit/library/standard_gates/rzx.py +229 -0
  146. qiskit/circuit/library/standard_gates/rzz.py +196 -0
  147. qiskit/circuit/library/standard_gates/s.py +428 -0
  148. qiskit/circuit/library/standard_gates/swap.py +288 -0
  149. qiskit/circuit/library/standard_gates/sx.py +315 -0
  150. qiskit/circuit/library/standard_gates/t.py +179 -0
  151. qiskit/circuit/library/standard_gates/u.py +403 -0
  152. qiskit/circuit/library/standard_gates/u1.py +501 -0
  153. qiskit/circuit/library/standard_gates/u2.py +149 -0
  154. qiskit/circuit/library/standard_gates/u3.py +436 -0
  155. qiskit/circuit/library/standard_gates/x.py +1529 -0
  156. qiskit/circuit/library/standard_gates/xx_minus_yy.py +235 -0
  157. qiskit/circuit/library/standard_gates/xx_plus_yy.py +239 -0
  158. qiskit/circuit/library/standard_gates/y.py +262 -0
  159. qiskit/circuit/library/standard_gates/z.py +348 -0
  160. qiskit/circuit/library/templates/__init__.py +92 -0
  161. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  162. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  164. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  165. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  166. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  169. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  170. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  171. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  175. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  176. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  178. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  179. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  180. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  182. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  183. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  187. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  188. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  191. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  192. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  198. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  199. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  203. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  204. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  226. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  227. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  228. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  229. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  230. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  231. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  233. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  234. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  235. qiskit/circuit/measure.py +44 -0
  236. qiskit/circuit/operation.py +67 -0
  237. qiskit/circuit/parameter.py +178 -0
  238. qiskit/circuit/parameterexpression.py +692 -0
  239. qiskit/circuit/parametertable.py +119 -0
  240. qiskit/circuit/parametervector.py +120 -0
  241. qiskit/circuit/quantumcircuit.py +6829 -0
  242. qiskit/circuit/quantumcircuitdata.py +136 -0
  243. qiskit/circuit/quantumregister.py +75 -0
  244. qiskit/circuit/random/__init__.py +15 -0
  245. qiskit/circuit/random/utils.py +358 -0
  246. qiskit/circuit/register.py +233 -0
  247. qiskit/circuit/reset.py +34 -0
  248. qiskit/circuit/singleton.py +606 -0
  249. qiskit/circuit/store.py +97 -0
  250. qiskit/circuit/tools/__init__.py +16 -0
  251. qiskit/circuit/tools/pi_check.py +190 -0
  252. qiskit/circuit/twirling.py +145 -0
  253. qiskit/compiler/__init__.py +33 -0
  254. qiskit/compiler/assembler.py +681 -0
  255. qiskit/compiler/scheduler.py +109 -0
  256. qiskit/compiler/sequencer.py +71 -0
  257. qiskit/compiler/transpiler.py +533 -0
  258. qiskit/converters/__init__.py +74 -0
  259. qiskit/converters/circuit_to_dag.py +78 -0
  260. qiskit/converters/circuit_to_dagdependency.py +51 -0
  261. qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
  262. qiskit/converters/circuit_to_gate.py +107 -0
  263. qiskit/converters/circuit_to_instruction.py +155 -0
  264. qiskit/converters/dag_to_circuit.py +79 -0
  265. qiskit/converters/dag_to_dagdependency.py +55 -0
  266. qiskit/converters/dag_to_dagdependency_v2.py +44 -0
  267. qiskit/converters/dagdependency_to_circuit.py +46 -0
  268. qiskit/converters/dagdependency_to_dag.py +54 -0
  269. qiskit/dagcircuit/__init__.py +44 -0
  270. qiskit/dagcircuit/collect_blocks.py +391 -0
  271. qiskit/dagcircuit/dagcircuit.py +24 -0
  272. qiskit/dagcircuit/dagdependency.py +646 -0
  273. qiskit/dagcircuit/dagdependency_v2.py +641 -0
  274. qiskit/dagcircuit/dagdepnode.py +160 -0
  275. qiskit/dagcircuit/dagnode.py +176 -0
  276. qiskit/dagcircuit/exceptions.py +42 -0
  277. qiskit/exceptions.py +153 -0
  278. qiskit/passmanager/__init__.py +240 -0
  279. qiskit/passmanager/base_tasks.py +230 -0
  280. qiskit/passmanager/compilation_status.py +74 -0
  281. qiskit/passmanager/exceptions.py +19 -0
  282. qiskit/passmanager/flow_controllers.py +116 -0
  283. qiskit/passmanager/passmanager.py +333 -0
  284. qiskit/primitives/__init__.py +481 -0
  285. qiskit/primitives/backend_estimator.py +486 -0
  286. qiskit/primitives/backend_estimator_v2.py +434 -0
  287. qiskit/primitives/backend_sampler.py +222 -0
  288. qiskit/primitives/backend_sampler_v2.py +339 -0
  289. qiskit/primitives/base/__init__.py +20 -0
  290. qiskit/primitives/base/base_estimator.py +252 -0
  291. qiskit/primitives/base/base_primitive.py +45 -0
  292. qiskit/primitives/base/base_primitive_job.py +78 -0
  293. qiskit/primitives/base/base_result.py +65 -0
  294. qiskit/primitives/base/base_sampler.py +204 -0
  295. qiskit/primitives/base/estimator_result.py +46 -0
  296. qiskit/primitives/base/sampler_result.py +45 -0
  297. qiskit/primitives/base/validation.py +231 -0
  298. qiskit/primitives/containers/__init__.py +26 -0
  299. qiskit/primitives/containers/bindings_array.py +389 -0
  300. qiskit/primitives/containers/bit_array.py +741 -0
  301. qiskit/primitives/containers/data_bin.py +173 -0
  302. qiskit/primitives/containers/estimator_pub.py +222 -0
  303. qiskit/primitives/containers/object_array.py +94 -0
  304. qiskit/primitives/containers/observables_array.py +279 -0
  305. qiskit/primitives/containers/primitive_result.py +53 -0
  306. qiskit/primitives/containers/pub_result.py +51 -0
  307. qiskit/primitives/containers/sampler_pub.py +193 -0
  308. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  309. qiskit/primitives/containers/shape.py +129 -0
  310. qiskit/primitives/estimator.py +172 -0
  311. qiskit/primitives/primitive_job.py +81 -0
  312. qiskit/primitives/sampler.py +162 -0
  313. qiskit/primitives/statevector_estimator.py +174 -0
  314. qiskit/primitives/statevector_sampler.py +292 -0
  315. qiskit/primitives/utils.py +247 -0
  316. qiskit/providers/__init__.py +803 -0
  317. qiskit/providers/backend.py +667 -0
  318. qiskit/providers/backend_compat.py +472 -0
  319. qiskit/providers/basic_provider/__init__.py +45 -0
  320. qiskit/providers/basic_provider/basic_provider.py +101 -0
  321. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  322. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  323. qiskit/providers/basic_provider/basic_simulator.py +821 -0
  324. qiskit/providers/basic_provider/exceptions.py +30 -0
  325. qiskit/providers/exceptions.py +45 -0
  326. qiskit/providers/fake_provider/__init__.py +105 -0
  327. qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
  351. qiskit/providers/fake_provider/fake_1q.py +91 -0
  352. qiskit/providers/fake_provider/fake_backend.py +165 -0
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +49 -0
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
  357. qiskit/providers/fake_provider/generic_backend_v2.py +1035 -0
  358. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  359. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  360. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  361. qiskit/providers/job.py +147 -0
  362. qiskit/providers/jobstatus.py +30 -0
  363. qiskit/providers/models/__init__.py +89 -0
  364. qiskit/providers/models/backendconfiguration.py +1040 -0
  365. qiskit/providers/models/backendproperties.py +517 -0
  366. qiskit/providers/models/backendstatus.py +94 -0
  367. qiskit/providers/models/jobstatus.py +66 -0
  368. qiskit/providers/models/pulsedefaults.py +305 -0
  369. qiskit/providers/options.py +273 -0
  370. qiskit/providers/provider.py +95 -0
  371. qiskit/providers/providerutils.py +110 -0
  372. qiskit/pulse/__init__.py +158 -0
  373. qiskit/pulse/builder.py +2254 -0
  374. qiskit/pulse/calibration_entries.py +381 -0
  375. qiskit/pulse/channels.py +227 -0
  376. qiskit/pulse/configuration.py +245 -0
  377. qiskit/pulse/exceptions.py +45 -0
  378. qiskit/pulse/filters.py +309 -0
  379. qiskit/pulse/instruction_schedule_map.py +424 -0
  380. qiskit/pulse/instructions/__init__.py +67 -0
  381. qiskit/pulse/instructions/acquire.py +150 -0
  382. qiskit/pulse/instructions/delay.py +71 -0
  383. qiskit/pulse/instructions/directives.py +154 -0
  384. qiskit/pulse/instructions/frequency.py +135 -0
  385. qiskit/pulse/instructions/instruction.py +270 -0
  386. qiskit/pulse/instructions/phase.py +152 -0
  387. qiskit/pulse/instructions/play.py +99 -0
  388. qiskit/pulse/instructions/reference.py +100 -0
  389. qiskit/pulse/instructions/snapshot.py +82 -0
  390. qiskit/pulse/library/__init__.py +97 -0
  391. qiskit/pulse/library/continuous.py +430 -0
  392. qiskit/pulse/library/pulse.py +148 -0
  393. qiskit/pulse/library/samplers/__init__.py +15 -0
  394. qiskit/pulse/library/samplers/decorators.py +295 -0
  395. qiskit/pulse/library/samplers/strategies.py +71 -0
  396. qiskit/pulse/library/symbolic_pulses.py +1988 -0
  397. qiskit/pulse/library/waveform.py +136 -0
  398. qiskit/pulse/macros.py +262 -0
  399. qiskit/pulse/parameter_manager.py +445 -0
  400. qiskit/pulse/parser.py +314 -0
  401. qiskit/pulse/reference_manager.py +58 -0
  402. qiskit/pulse/schedule.py +1854 -0
  403. qiskit/pulse/transforms/__init__.py +106 -0
  404. qiskit/pulse/transforms/alignments.py +406 -0
  405. qiskit/pulse/transforms/base_transforms.py +71 -0
  406. qiskit/pulse/transforms/canonicalization.py +498 -0
  407. qiskit/pulse/transforms/dag.py +122 -0
  408. qiskit/pulse/utils.py +149 -0
  409. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  410. qiskit/qasm/libs/qelib1.inc +266 -0
  411. qiskit/qasm/libs/stdgates.inc +82 -0
  412. qiskit/qasm2/__init__.py +654 -0
  413. qiskit/qasm2/exceptions.py +27 -0
  414. qiskit/qasm2/export.py +372 -0
  415. qiskit/qasm2/parse.py +452 -0
  416. qiskit/qasm3/__init__.py +367 -0
  417. qiskit/qasm3/ast.py +738 -0
  418. qiskit/qasm3/exceptions.py +27 -0
  419. qiskit/qasm3/experimental.py +70 -0
  420. qiskit/qasm3/exporter.py +1299 -0
  421. qiskit/qasm3/printer.py +577 -0
  422. qiskit/qobj/__init__.py +75 -0
  423. qiskit/qobj/common.py +81 -0
  424. qiskit/qobj/converters/__init__.py +18 -0
  425. qiskit/qobj/converters/lo_config.py +177 -0
  426. qiskit/qobj/converters/pulse_instruction.py +897 -0
  427. qiskit/qobj/pulse_qobj.py +709 -0
  428. qiskit/qobj/qasm_qobj.py +708 -0
  429. qiskit/qobj/utils.py +46 -0
  430. qiskit/qpy/__init__.py +1822 -0
  431. qiskit/qpy/binary_io/__init__.py +36 -0
  432. qiskit/qpy/binary_io/circuits.py +1475 -0
  433. qiskit/qpy/binary_io/schedules.py +635 -0
  434. qiskit/qpy/binary_io/value.py +1025 -0
  435. qiskit/qpy/common.py +350 -0
  436. qiskit/qpy/exceptions.py +53 -0
  437. qiskit/qpy/formats.py +401 -0
  438. qiskit/qpy/interface.py +377 -0
  439. qiskit/qpy/type_keys.py +572 -0
  440. qiskit/quantum_info/__init__.py +162 -0
  441. qiskit/quantum_info/analysis/__init__.py +17 -0
  442. qiskit/quantum_info/analysis/average.py +47 -0
  443. qiskit/quantum_info/analysis/distance.py +102 -0
  444. qiskit/quantum_info/analysis/make_observable.py +44 -0
  445. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  446. qiskit/quantum_info/operators/__init__.py +28 -0
  447. qiskit/quantum_info/operators/base_operator.py +145 -0
  448. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  449. qiskit/quantum_info/operators/channel/chi.py +191 -0
  450. qiskit/quantum_info/operators/channel/choi.py +218 -0
  451. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  452. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  453. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  454. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  455. qiskit/quantum_info/operators/channel/superop.py +377 -0
  456. qiskit/quantum_info/operators/channel/transformations.py +475 -0
  457. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  458. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  459. qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
  460. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  461. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  462. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  463. qiskit/quantum_info/operators/linear_op.py +25 -0
  464. qiskit/quantum_info/operators/measures.py +418 -0
  465. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  466. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  467. qiskit/quantum_info/operators/mixins/group.py +171 -0
  468. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  469. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  470. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  471. qiskit/quantum_info/operators/op_shape.py +525 -0
  472. qiskit/quantum_info/operators/operator.py +865 -0
  473. qiskit/quantum_info/operators/operator_utils.py +76 -0
  474. qiskit/quantum_info/operators/predicates.py +183 -0
  475. qiskit/quantum_info/operators/random.py +154 -0
  476. qiskit/quantum_info/operators/scalar_op.py +254 -0
  477. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  478. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  479. qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
  480. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  481. qiskit/quantum_info/operators/symplectic/pauli.py +753 -0
  482. qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
  483. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  484. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  485. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1196 -0
  486. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  487. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  488. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  489. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  490. qiskit/quantum_info/quaternion.py +156 -0
  491. qiskit/quantum_info/random.py +26 -0
  492. qiskit/quantum_info/states/__init__.py +28 -0
  493. qiskit/quantum_info/states/densitymatrix.py +845 -0
  494. qiskit/quantum_info/states/measures.py +288 -0
  495. qiskit/quantum_info/states/quantum_state.py +503 -0
  496. qiskit/quantum_info/states/random.py +157 -0
  497. qiskit/quantum_info/states/stabilizerstate.py +773 -0
  498. qiskit/quantum_info/states/statevector.py +958 -0
  499. qiskit/quantum_info/states/utils.py +247 -0
  500. qiskit/result/__init__.py +73 -0
  501. qiskit/result/counts.py +189 -0
  502. qiskit/result/distributions/__init__.py +17 -0
  503. qiskit/result/distributions/probability.py +100 -0
  504. qiskit/result/distributions/quasi.py +154 -0
  505. qiskit/result/exceptions.py +40 -0
  506. qiskit/result/mitigation/__init__.py +13 -0
  507. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  508. qiskit/result/mitigation/correlated_readout_mitigator.py +277 -0
  509. qiskit/result/mitigation/local_readout_mitigator.py +328 -0
  510. qiskit/result/mitigation/utils.py +217 -0
  511. qiskit/result/models.py +234 -0
  512. qiskit/result/postprocess.py +239 -0
  513. qiskit/result/result.py +392 -0
  514. qiskit/result/sampled_expval.py +75 -0
  515. qiskit/result/utils.py +295 -0
  516. qiskit/scheduler/__init__.py +40 -0
  517. qiskit/scheduler/config.py +37 -0
  518. qiskit/scheduler/lowering.py +187 -0
  519. qiskit/scheduler/methods/__init__.py +15 -0
  520. qiskit/scheduler/methods/basic.py +140 -0
  521. qiskit/scheduler/schedule_circuit.py +69 -0
  522. qiskit/scheduler/sequence.py +104 -0
  523. qiskit/synthesis/__init__.py +220 -0
  524. qiskit/synthesis/arithmetic/__init__.py +16 -0
  525. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  526. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  527. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  528. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  529. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  530. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
  531. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
  532. qiskit/synthesis/clifford/__init__.py +19 -0
  533. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  534. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  535. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  536. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  537. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  538. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  539. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  540. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  541. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  542. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  543. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  544. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  545. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  546. qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
  547. qiskit/synthesis/evolution/__init__.py +21 -0
  548. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  549. qiskit/synthesis/evolution/lie_trotter.py +117 -0
  550. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  551. qiskit/synthesis/evolution/pauli_network.py +80 -0
  552. qiskit/synthesis/evolution/product_formula.py +311 -0
  553. qiskit/synthesis/evolution/qdrift.py +138 -0
  554. qiskit/synthesis/evolution/suzuki_trotter.py +215 -0
  555. qiskit/synthesis/linear/__init__.py +26 -0
  556. qiskit/synthesis/linear/cnot_synth.py +69 -0
  557. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  558. qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
  559. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  560. qiskit/synthesis/linear_phase/__init__.py +17 -0
  561. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  562. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  563. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  564. qiskit/synthesis/multi_controlled/__init__.py +24 -0
  565. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  566. qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
  567. qiskit/synthesis/one_qubit/__init__.py +15 -0
  568. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  569. qiskit/synthesis/permutation/__init__.py +18 -0
  570. qiskit/synthesis/permutation/permutation_full.py +78 -0
  571. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  572. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  573. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  574. qiskit/synthesis/qft/__init__.py +16 -0
  575. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  576. qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
  577. qiskit/synthesis/stabilizer/__init__.py +16 -0
  578. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  579. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  580. qiskit/synthesis/two_qubit/__init__.py +19 -0
  581. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  582. qiskit/synthesis/two_qubit/two_qubit_decompose.py +700 -0
  583. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  584. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  585. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  586. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  587. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  588. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  589. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  590. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  591. qiskit/synthesis/unitary/__init__.py +13 -0
  592. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  593. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  594. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  595. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  596. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  597. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  598. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  599. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  600. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  601. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  602. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  603. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  604. qiskit/synthesis/unitary/qsd.py +288 -0
  605. qiskit/transpiler/__init__.py +1290 -0
  606. qiskit/transpiler/basepasses.py +221 -0
  607. qiskit/transpiler/coupling.py +500 -0
  608. qiskit/transpiler/exceptions.py +59 -0
  609. qiskit/transpiler/instruction_durations.py +281 -0
  610. qiskit/transpiler/layout.py +737 -0
  611. qiskit/transpiler/passes/__init__.py +312 -0
  612. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  613. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  614. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  615. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  616. qiskit/transpiler/passes/analysis/depth.py +33 -0
  617. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  618. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  619. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  620. qiskit/transpiler/passes/analysis/size.py +36 -0
  621. qiskit/transpiler/passes/analysis/width.py +27 -0
  622. qiskit/transpiler/passes/basis/__init__.py +19 -0
  623. qiskit/transpiler/passes/basis/basis_translator.py +137 -0
  624. qiskit/transpiler/passes/basis/decompose.py +131 -0
  625. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  626. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
  627. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
  628. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  629. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  630. qiskit/transpiler/passes/calibration/builders.py +20 -0
  631. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  632. qiskit/transpiler/passes/calibration/pulse_gate.py +100 -0
  633. qiskit/transpiler/passes/calibration/rx_builder.py +164 -0
  634. qiskit/transpiler/passes/calibration/rzx_builder.py +411 -0
  635. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  636. qiskit/transpiler/passes/layout/__init__.py +26 -0
  637. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  638. qiskit/transpiler/passes/layout/apply_layout.py +123 -0
  639. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  640. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  641. qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
  642. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  643. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  644. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  645. qiskit/transpiler/passes/layout/sabre_layout.py +487 -0
  646. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  647. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  648. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  649. qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
  650. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  651. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  652. qiskit/transpiler/passes/optimization/__init__.py +43 -0
  653. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  654. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  655. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  656. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  657. qiskit/transpiler/passes/optimization/collect_cliffords.py +104 -0
  658. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  659. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  660. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  661. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  662. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  663. qiskit/transpiler/passes/optimization/consolidate_blocks.py +149 -0
  664. qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
  665. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +162 -0
  666. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  667. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  668. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  669. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  670. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  671. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +254 -0
  672. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  673. qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
  674. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  675. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  676. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  677. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  678. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
  679. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  680. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  681. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
  682. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  683. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  684. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  685. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  686. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  687. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
  688. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  689. qiskit/transpiler/passes/routing/__init__.py +22 -0
  690. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  691. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  692. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  693. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  694. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  695. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  696. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  697. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
  698. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  699. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  700. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  701. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  702. qiskit/transpiler/passes/routing/sabre_swap.py +447 -0
  703. qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
  704. qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
  705. qiskit/transpiler/passes/routing/utils.py +35 -0
  706. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  707. qiskit/transpiler/passes/scheduling/alap.py +153 -0
  708. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  709. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
  710. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
  711. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +107 -0
  712. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
  713. qiskit/transpiler/passes/scheduling/asap.py +175 -0
  714. qiskit/transpiler/passes/scheduling/base_scheduler.py +310 -0
  715. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +312 -0
  716. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  717. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  718. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +452 -0
  719. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +82 -0
  720. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  721. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  722. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  723. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +94 -0
  724. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  725. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +165 -0
  726. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  727. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  728. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +854 -0
  729. qiskit/transpiler/passes/synthesis/hls_plugins.py +1559 -0
  730. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  731. qiskit/transpiler/passes/synthesis/plugin.py +734 -0
  732. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
  733. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1076 -0
  734. qiskit/transpiler/passes/utils/__init__.py +33 -0
  735. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  736. qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
  737. qiskit/transpiler/passes/utils/check_map.py +78 -0
  738. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  739. qiskit/transpiler/passes/utils/control_flow.py +65 -0
  740. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +93 -0
  741. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  742. qiskit/transpiler/passes/utils/error.py +69 -0
  743. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  744. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  745. qiskit/transpiler/passes/utils/gate_direction.py +86 -0
  746. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  747. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  748. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  749. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  750. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  751. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  752. qiskit/transpiler/passmanager.py +490 -0
  753. qiskit/transpiler/passmanager_config.py +216 -0
  754. qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
  755. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1045 -0
  756. qiskit/transpiler/preset_passmanagers/common.py +649 -0
  757. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +626 -0
  758. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  759. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  760. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  761. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  762. qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
  763. qiskit/transpiler/target.py +1319 -0
  764. qiskit/transpiler/timing_constraints.py +59 -0
  765. qiskit/user_config.py +262 -0
  766. qiskit/utils/__init__.py +89 -0
  767. qiskit/utils/classtools.py +146 -0
  768. qiskit/utils/deprecate_pulse.py +119 -0
  769. qiskit/utils/deprecation.py +490 -0
  770. qiskit/utils/lazy_tester.py +363 -0
  771. qiskit/utils/multiprocessing.py +56 -0
  772. qiskit/utils/optionals.py +347 -0
  773. qiskit/utils/parallel.py +191 -0
  774. qiskit/utils/units.py +143 -0
  775. qiskit/version.py +84 -0
  776. qiskit/visualization/__init__.py +288 -0
  777. qiskit/visualization/array.py +204 -0
  778. qiskit/visualization/bloch.py +778 -0
  779. qiskit/visualization/circuit/__init__.py +15 -0
  780. qiskit/visualization/circuit/_utils.py +675 -0
  781. qiskit/visualization/circuit/circuit_visualization.py +727 -0
  782. qiskit/visualization/circuit/latex.py +661 -0
  783. qiskit/visualization/circuit/matplotlib.py +2029 -0
  784. qiskit/visualization/circuit/qcstyle.py +278 -0
  785. qiskit/visualization/circuit/styles/__init__.py +13 -0
  786. qiskit/visualization/circuit/styles/bw.json +202 -0
  787. qiskit/visualization/circuit/styles/clifford.json +202 -0
  788. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  789. qiskit/visualization/circuit/styles/iqp.json +214 -0
  790. qiskit/visualization/circuit/styles/textbook.json +202 -0
  791. qiskit/visualization/circuit/text.py +1844 -0
  792. qiskit/visualization/circuit_visualization.py +19 -0
  793. qiskit/visualization/counts_visualization.py +481 -0
  794. qiskit/visualization/dag_visualization.py +316 -0
  795. qiskit/visualization/exceptions.py +21 -0
  796. qiskit/visualization/gate_map.py +1485 -0
  797. qiskit/visualization/library.py +37 -0
  798. qiskit/visualization/pass_manager_visualization.py +308 -0
  799. qiskit/visualization/pulse_v2/__init__.py +21 -0
  800. qiskit/visualization/pulse_v2/core.py +901 -0
  801. qiskit/visualization/pulse_v2/device_info.py +173 -0
  802. qiskit/visualization/pulse_v2/drawings.py +253 -0
  803. qiskit/visualization/pulse_v2/events.py +254 -0
  804. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  805. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  806. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  807. qiskit/visualization/pulse_v2/generators/frame.py +436 -0
  808. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  809. qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
  810. qiskit/visualization/pulse_v2/interface.py +458 -0
  811. qiskit/visualization/pulse_v2/layouts.py +387 -0
  812. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  813. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  814. qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
  815. qiskit/visualization/pulse_v2/stylesheet.py +312 -0
  816. qiskit/visualization/pulse_v2/types.py +242 -0
  817. qiskit/visualization/state_visualization.py +1518 -0
  818. qiskit/visualization/timeline/__init__.py +21 -0
  819. qiskit/visualization/timeline/core.py +480 -0
  820. qiskit/visualization/timeline/drawings.py +260 -0
  821. qiskit/visualization/timeline/generators.py +506 -0
  822. qiskit/visualization/timeline/interface.py +436 -0
  823. qiskit/visualization/timeline/layouts.py +115 -0
  824. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  825. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  826. qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
  827. qiskit/visualization/timeline/stylesheet.py +301 -0
  828. qiskit/visualization/timeline/types.py +148 -0
  829. qiskit/visualization/transition_visualization.py +369 -0
  830. qiskit/visualization/utils.py +49 -0
  831. qiskit-1.3.0.dist-info/LICENSE.txt +203 -0
  832. qiskit-1.3.0.dist-info/METADATA +222 -0
  833. qiskit-1.3.0.dist-info/RECORD +836 -0
  834. qiskit-1.3.0.dist-info/WHEEL +5 -0
  835. qiskit-1.3.0.dist-info/entry_points.txt +76 -0
  836. qiskit-1.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1475 @@
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 collections import defaultdict
18
+ import io
19
+ import json
20
+ import struct
21
+ import uuid
22
+ import warnings
23
+
24
+ import numpy as np
25
+
26
+ from qiskit import circuit as circuit_mod
27
+ from qiskit.circuit import library, controlflow, CircuitInstruction, ControlFlowOp
28
+ from qiskit.circuit.classical import expr
29
+ from qiskit.circuit.classicalregister import ClassicalRegister, Clbit
30
+ from qiskit.circuit.gate import Gate
31
+ from qiskit.circuit.singleton import SingletonInstruction, SingletonGate
32
+ from qiskit.circuit.controlledgate import ControlledGate
33
+ from qiskit.circuit.annotated_operation import (
34
+ AnnotatedOperation,
35
+ Modifier,
36
+ InverseModifier,
37
+ ControlModifier,
38
+ PowerModifier,
39
+ )
40
+ from qiskit.circuit.instruction import Instruction
41
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
42
+ from qiskit.circuit.quantumregister import QuantumRegister, Qubit
43
+ from qiskit.qpy import common, formats, type_keys, exceptions
44
+ from qiskit.qpy.binary_io import value, schedules
45
+ from qiskit.quantum_info.operators import SparsePauliOp, Clifford
46
+ from qiskit.synthesis import evolution as evo_synth
47
+ from qiskit.transpiler.layout import Layout, TranspileLayout
48
+
49
+
50
+ def _read_header_v12(file_obj, version, vectors, metadata_deserializer=None):
51
+ data = formats.CIRCUIT_HEADER_V12._make(
52
+ struct.unpack(
53
+ formats.CIRCUIT_HEADER_V12_PACK, file_obj.read(formats.CIRCUIT_HEADER_V12_SIZE)
54
+ )
55
+ )
56
+ name = file_obj.read(data.name_size).decode(common.ENCODE)
57
+ global_phase = value.loads_value(
58
+ data.global_phase_type,
59
+ file_obj.read(data.global_phase_size),
60
+ version=version,
61
+ vectors=vectors,
62
+ )
63
+ header = {
64
+ "global_phase": global_phase,
65
+ "num_qubits": data.num_qubits,
66
+ "num_clbits": data.num_clbits,
67
+ "num_registers": data.num_registers,
68
+ "num_instructions": data.num_instructions,
69
+ "num_vars": data.num_vars,
70
+ }
71
+ metadata_raw = file_obj.read(data.metadata_size)
72
+ metadata = json.loads(metadata_raw, cls=metadata_deserializer)
73
+ return header, name, metadata
74
+
75
+
76
+ def _read_header_v2(file_obj, version, vectors, metadata_deserializer=None):
77
+ data = formats.CIRCUIT_HEADER_V2._make(
78
+ struct.unpack(
79
+ formats.CIRCUIT_HEADER_V2_PACK,
80
+ file_obj.read(formats.CIRCUIT_HEADER_V2_SIZE),
81
+ )
82
+ )
83
+
84
+ name = file_obj.read(data.name_size).decode(common.ENCODE)
85
+ global_phase = value.loads_value(
86
+ data.global_phase_type,
87
+ file_obj.read(data.global_phase_size),
88
+ version=version,
89
+ vectors=vectors,
90
+ )
91
+ header = {
92
+ "global_phase": global_phase,
93
+ "num_qubits": data.num_qubits,
94
+ "num_clbits": data.num_clbits,
95
+ "num_registers": data.num_registers,
96
+ "num_instructions": data.num_instructions,
97
+ }
98
+
99
+ metadata_raw = file_obj.read(data.metadata_size)
100
+ metadata = json.loads(metadata_raw, cls=metadata_deserializer)
101
+ return header, name, metadata
102
+
103
+
104
+ def _read_header(file_obj, metadata_deserializer=None):
105
+ data = formats.CIRCUIT_HEADER._make(
106
+ struct.unpack(formats.CIRCUIT_HEADER_PACK, file_obj.read(formats.CIRCUIT_HEADER_SIZE))
107
+ )
108
+ name = file_obj.read(data.name_size).decode(common.ENCODE)
109
+ header = {
110
+ "global_phase": data.global_phase,
111
+ "num_qubits": data.num_qubits,
112
+ "num_clbits": data.num_clbits,
113
+ "num_registers": data.num_registers,
114
+ "num_instructions": data.num_instructions,
115
+ }
116
+ metadata_raw = file_obj.read(data.metadata_size)
117
+ metadata = json.loads(metadata_raw, cls=metadata_deserializer)
118
+ return header, name, metadata
119
+
120
+
121
+ def _read_registers_v4(file_obj, num_registers):
122
+ registers = {"q": {}, "c": {}}
123
+ for _reg in range(num_registers):
124
+ data = formats.REGISTER_V4._make(
125
+ struct.unpack(
126
+ formats.REGISTER_V4_PACK,
127
+ file_obj.read(formats.REGISTER_V4_SIZE),
128
+ )
129
+ )
130
+ name = file_obj.read(data.name_size).decode("utf8")
131
+ REGISTER_ARRAY_PACK = f"!{data.size}q"
132
+ bit_indices_raw = file_obj.read(struct.calcsize(REGISTER_ARRAY_PACK))
133
+ bit_indices = list(struct.unpack(REGISTER_ARRAY_PACK, bit_indices_raw))
134
+ if data.type.decode("utf8") == "q":
135
+ registers["q"][name] = (data.standalone, bit_indices, data.in_circuit)
136
+ else:
137
+ registers["c"][name] = (data.standalone, bit_indices, data.in_circuit)
138
+ return registers
139
+
140
+
141
+ def _read_registers(file_obj, num_registers):
142
+ registers = {"q": {}, "c": {}}
143
+ for _reg in range(num_registers):
144
+ data = formats.REGISTER._make(
145
+ struct.unpack(
146
+ formats.REGISTER_PACK,
147
+ file_obj.read(formats.REGISTER_SIZE),
148
+ )
149
+ )
150
+ name = file_obj.read(data.name_size).decode("utf8")
151
+ REGISTER_ARRAY_PACK = f"!{data.size}I"
152
+ bit_indices_raw = file_obj.read(struct.calcsize(REGISTER_ARRAY_PACK))
153
+ bit_indices = list(struct.unpack(REGISTER_ARRAY_PACK, bit_indices_raw))
154
+ if data.type.decode("utf8") == "q":
155
+ registers["q"][name] = (data.standalone, bit_indices, True)
156
+ else:
157
+ registers["c"][name] = (data.standalone, bit_indices, True)
158
+ return registers
159
+
160
+
161
+ def _loads_instruction_parameter(
162
+ type_key,
163
+ data_bytes,
164
+ version,
165
+ vectors,
166
+ registers,
167
+ circuit,
168
+ use_symengine,
169
+ standalone_vars,
170
+ ):
171
+ if type_key == type_keys.Program.CIRCUIT:
172
+ param = common.data_from_binary(data_bytes, read_circuit, version=version)
173
+ elif type_key == type_keys.Value.MODIFIER:
174
+ param = common.data_from_binary(data_bytes, _read_modifier)
175
+ elif type_key == type_keys.Container.RANGE:
176
+ data = formats.RANGE._make(struct.unpack(formats.RANGE_PACK, data_bytes))
177
+ param = range(data.start, data.stop, data.step)
178
+ elif type_key == type_keys.Container.TUPLE:
179
+ param = tuple(
180
+ common.sequence_from_binary(
181
+ data_bytes,
182
+ _loads_instruction_parameter,
183
+ version=version,
184
+ vectors=vectors,
185
+ registers=registers,
186
+ circuit=circuit,
187
+ use_symengine=use_symengine,
188
+ standalone_vars=standalone_vars,
189
+ )
190
+ )
191
+ elif type_key == type_keys.Value.INTEGER:
192
+ # TODO This uses little endian. Should be fixed in the next QPY version.
193
+ param = struct.unpack("<q", data_bytes)[0]
194
+ elif type_key == type_keys.Value.FLOAT:
195
+ # TODO This uses little endian. Should be fixed in the next QPY version.
196
+ param = struct.unpack("<d", data_bytes)[0]
197
+ elif type_key == type_keys.Value.REGISTER:
198
+ param = _loads_register_param(data_bytes.decode(common.ENCODE), circuit, registers)
199
+ else:
200
+ clbits = circuit.clbits if circuit is not None else ()
201
+ param = value.loads_value(
202
+ type_key,
203
+ data_bytes,
204
+ version,
205
+ vectors,
206
+ clbits=clbits,
207
+ cregs=registers["c"],
208
+ use_symengine=use_symengine,
209
+ standalone_vars=standalone_vars,
210
+ )
211
+
212
+ return param
213
+
214
+
215
+ def _loads_register_param(data_bytes, circuit, registers):
216
+ # If register name prefixed with null character it's a clbit index for single bit condition.
217
+ if data_bytes[0] == "\x00":
218
+ conditional_bit = int(data_bytes[1:])
219
+ return circuit.clbits[conditional_bit]
220
+ return registers["c"][data_bytes]
221
+
222
+
223
+ def _read_instruction(
224
+ file_obj,
225
+ circuit,
226
+ registers,
227
+ custom_operations,
228
+ version,
229
+ vectors,
230
+ use_symengine,
231
+ standalone_vars,
232
+ ):
233
+ if version < 5:
234
+ instruction = formats.CIRCUIT_INSTRUCTION._make(
235
+ struct.unpack(
236
+ formats.CIRCUIT_INSTRUCTION_PACK,
237
+ file_obj.read(formats.CIRCUIT_INSTRUCTION_SIZE),
238
+ )
239
+ )
240
+ else:
241
+ instruction = formats.CIRCUIT_INSTRUCTION_V2._make(
242
+ struct.unpack(
243
+ formats.CIRCUIT_INSTRUCTION_V2_PACK,
244
+ file_obj.read(formats.CIRCUIT_INSTRUCTION_V2_SIZE),
245
+ )
246
+ )
247
+ gate_name = file_obj.read(instruction.name_size).decode(common.ENCODE)
248
+ label = file_obj.read(instruction.label_size).decode(common.ENCODE)
249
+ condition_register = file_obj.read(instruction.condition_register_size).decode(common.ENCODE)
250
+ qargs = []
251
+ cargs = []
252
+ params = []
253
+ condition = None
254
+ if (version < 5 and instruction.has_condition) or (
255
+ version >= 5 and instruction.conditional_key == type_keys.Condition.TWO_TUPLE
256
+ ):
257
+ condition = (
258
+ _loads_register_param(condition_register, circuit, registers),
259
+ instruction.condition_value,
260
+ )
261
+ elif version >= 5 and instruction.conditional_key == type_keys.Condition.EXPRESSION:
262
+ condition = value.read_value(
263
+ file_obj,
264
+ version,
265
+ vectors,
266
+ clbits=circuit.clbits,
267
+ cregs=registers["c"],
268
+ use_symengine=use_symengine,
269
+ standalone_vars=standalone_vars,
270
+ )
271
+ # Load Arguments
272
+ if circuit is not None:
273
+ for _qarg in range(instruction.num_qargs):
274
+ qarg = formats.CIRCUIT_INSTRUCTION_ARG._make(
275
+ struct.unpack(
276
+ formats.CIRCUIT_INSTRUCTION_ARG_PACK,
277
+ file_obj.read(formats.CIRCUIT_INSTRUCTION_ARG_SIZE),
278
+ )
279
+ )
280
+ if qarg.type.decode(common.ENCODE) == "c":
281
+ raise TypeError("Invalid input carg prior to all qargs")
282
+ qargs.append(circuit.qubits[qarg.size])
283
+ for _carg in range(instruction.num_cargs):
284
+ carg = formats.CIRCUIT_INSTRUCTION_ARG._make(
285
+ struct.unpack(
286
+ formats.CIRCUIT_INSTRUCTION_ARG_PACK,
287
+ file_obj.read(formats.CIRCUIT_INSTRUCTION_ARG_SIZE),
288
+ )
289
+ )
290
+ if carg.type.decode(common.ENCODE) == "q":
291
+ raise TypeError("Invalid input qarg after all qargs")
292
+ cargs.append(circuit.clbits[carg.size])
293
+
294
+ # Load Parameters
295
+ for _param in range(instruction.num_parameters):
296
+ type_key, data_bytes = common.read_generic_typed_data(file_obj)
297
+ param = _loads_instruction_parameter(
298
+ type_key,
299
+ data_bytes,
300
+ version,
301
+ vectors,
302
+ registers,
303
+ circuit,
304
+ use_symengine,
305
+ standalone_vars,
306
+ )
307
+ params.append(param)
308
+
309
+ # Load Gate object
310
+ if gate_name in {"Gate", "Instruction", "ControlledGate"}:
311
+ inst_obj = _parse_custom_operation(
312
+ custom_operations,
313
+ gate_name,
314
+ params,
315
+ version,
316
+ vectors,
317
+ registers,
318
+ use_symengine,
319
+ standalone_vars,
320
+ )
321
+ if condition is not None:
322
+ warnings.warn(
323
+ f"The .condition attribute on {gate_name} will be loaded as an IfElseOp "
324
+ "starting in Qiskit 2.0",
325
+ FutureWarning,
326
+ stacklevel=3,
327
+ )
328
+ inst_obj.condition = condition
329
+ if instruction.label_size > 0:
330
+ inst_obj.label = label
331
+ if circuit is None:
332
+ return inst_obj
333
+ circuit._append(inst_obj, qargs, cargs)
334
+ return None
335
+ elif gate_name in custom_operations:
336
+ inst_obj = _parse_custom_operation(
337
+ custom_operations,
338
+ gate_name,
339
+ params,
340
+ version,
341
+ vectors,
342
+ registers,
343
+ use_symengine,
344
+ standalone_vars,
345
+ )
346
+ inst_obj.condition = condition
347
+ if instruction.label_size > 0:
348
+ inst_obj.label = label
349
+ if circuit is None:
350
+ return inst_obj
351
+ circuit._append(inst_obj, qargs, cargs)
352
+ return None
353
+ elif hasattr(library, gate_name):
354
+ gate_class = getattr(library, gate_name)
355
+ elif hasattr(circuit_mod, gate_name):
356
+ gate_class = getattr(circuit_mod, gate_name)
357
+ elif hasattr(controlflow, gate_name):
358
+ gate_class = getattr(controlflow, gate_name)
359
+ elif gate_name == "Clifford":
360
+ gate_class = Clifford
361
+ else:
362
+ raise AttributeError(f"Invalid instruction type: {gate_name}")
363
+
364
+ if instruction.label_size <= 0:
365
+ label = None
366
+ if gate_name in {"IfElseOp", "WhileLoopOp"}:
367
+ gate = gate_class(condition, *params, label=label)
368
+ elif version >= 5 and issubclass(gate_class, ControlledGate):
369
+ if gate_name in {
370
+ "MCPhaseGate",
371
+ "MCU1Gate",
372
+ "MCXGrayCode",
373
+ "MCXGate",
374
+ "MCXRecursive",
375
+ "MCXVChain",
376
+ }:
377
+ gate = gate_class(*params, instruction.num_ctrl_qubits, label=label)
378
+ else:
379
+ gate = gate_class(*params, label=label)
380
+ if (
381
+ gate.num_ctrl_qubits != instruction.num_ctrl_qubits
382
+ or gate.ctrl_state != instruction.ctrl_state
383
+ ):
384
+ gate = gate.to_mutable()
385
+ gate.num_ctrl_qubits = instruction.num_ctrl_qubits
386
+ gate.ctrl_state = instruction.ctrl_state
387
+ if condition:
388
+ gate = gate.c_if(*condition)
389
+ else:
390
+ if gate_name in {"Initialize", "StatePreparation"}:
391
+ if isinstance(params[0], str):
392
+ # the params are the labels of the initial state
393
+ gate = gate_class("".join(label for label in params))
394
+ elif instruction.num_parameters == 1:
395
+ # the params is the integer indicating which qubits to initialize
396
+ gate = gate_class(int(params[0].real), instruction.num_qargs)
397
+ else:
398
+ # the params represent a list of complex amplitudes
399
+ gate = gate_class(params)
400
+ elif gate_name in {
401
+ "UCRXGate",
402
+ "UCRYGate",
403
+ "UCRZGate",
404
+ "DiagonalGate",
405
+ }:
406
+ gate = gate_class(params)
407
+ elif gate_name == "QFTGate":
408
+ gate = gate_class(len(qargs), *params)
409
+ else:
410
+ if gate_name == "Barrier":
411
+ params = [len(qargs)]
412
+ elif gate_name in {"BreakLoopOp", "ContinueLoopOp"}:
413
+ params = [len(qargs), len(cargs)]
414
+ if label is not None:
415
+ if issubclass(gate_class, (SingletonInstruction, SingletonGate)):
416
+ gate = gate_class(*params, label=label)
417
+ else:
418
+ gate = gate_class(*params)
419
+ gate.label = label
420
+ else:
421
+ gate = gate_class(*params)
422
+ if condition:
423
+ if not isinstance(gate, ControlFlowOp):
424
+ warnings.warn(
425
+ f"The .condition attribute on {gate} will be loaded as an "
426
+ "IfElseOp starting in Qiskit 2.0",
427
+ FutureWarning,
428
+ stacklevel=3,
429
+ )
430
+ gate = gate.c_if(*condition)
431
+ else:
432
+ gate.condition = condition
433
+ if circuit is None:
434
+ return gate
435
+ if not isinstance(gate, Instruction):
436
+ circuit.append(gate, qargs, cargs)
437
+ else:
438
+ circuit._append(CircuitInstruction(gate, qargs, cargs))
439
+ return None
440
+
441
+
442
+ def _parse_custom_operation(
443
+ custom_operations,
444
+ gate_name,
445
+ params,
446
+ version,
447
+ vectors,
448
+ registers,
449
+ use_symengine,
450
+ standalone_vars,
451
+ ):
452
+ if version >= 5:
453
+ (
454
+ type_str,
455
+ num_qubits,
456
+ num_clbits,
457
+ definition,
458
+ num_ctrl_qubits,
459
+ ctrl_state,
460
+ base_gate_raw,
461
+ ) = custom_operations[gate_name]
462
+ else:
463
+ type_str, num_qubits, num_clbits, definition = custom_operations[gate_name]
464
+ base_gate_raw = ctrl_state = num_ctrl_qubits = None
465
+ # Strip the trailing "_{uuid}" from the gate name if the version >=11
466
+ if version >= 11:
467
+ gate_name = "_".join(gate_name.split("_")[:-1])
468
+ type_key = type_keys.CircuitInstruction(type_str)
469
+
470
+ if type_key == type_keys.CircuitInstruction.INSTRUCTION:
471
+ inst_obj = Instruction(gate_name, num_qubits, num_clbits, params)
472
+ if definition is not None:
473
+ inst_obj.definition = definition
474
+ return inst_obj
475
+
476
+ if type_key == type_keys.CircuitInstruction.GATE:
477
+ inst_obj = Gate(gate_name, num_qubits, params)
478
+ inst_obj.definition = definition
479
+ return inst_obj
480
+
481
+ if version >= 5 and type_key == type_keys.CircuitInstruction.CONTROLLED_GATE:
482
+ with io.BytesIO(base_gate_raw) as base_gate_obj:
483
+ base_gate = _read_instruction(
484
+ base_gate_obj,
485
+ None,
486
+ registers,
487
+ custom_operations,
488
+ version,
489
+ vectors,
490
+ use_symengine,
491
+ standalone_vars,
492
+ )
493
+ if ctrl_state < 2**num_ctrl_qubits - 1:
494
+ # If open controls, we need to discard the control suffix when setting the name.
495
+ gate_name = gate_name.rsplit("_", 1)[0]
496
+ inst_obj = ControlledGate(
497
+ gate_name,
498
+ num_qubits,
499
+ params,
500
+ num_ctrl_qubits=num_ctrl_qubits,
501
+ ctrl_state=ctrl_state,
502
+ base_gate=base_gate,
503
+ )
504
+ inst_obj.definition = definition
505
+ return inst_obj
506
+
507
+ if version >= 11 and type_key == type_keys.CircuitInstruction.ANNOTATED_OPERATION:
508
+ with io.BytesIO(base_gate_raw) as base_gate_obj:
509
+ base_gate = _read_instruction(
510
+ base_gate_obj,
511
+ None,
512
+ registers,
513
+ custom_operations,
514
+ version,
515
+ vectors,
516
+ use_symengine,
517
+ standalone_vars,
518
+ )
519
+ inst_obj = AnnotatedOperation(base_op=base_gate, modifiers=params)
520
+ return inst_obj
521
+
522
+ if type_key == type_keys.CircuitInstruction.PAULI_EVOL_GATE:
523
+ return definition
524
+
525
+ raise ValueError(f"Invalid custom instruction type '{type_str}'")
526
+
527
+
528
+ def _read_pauli_evolution_gate(file_obj, version, vectors):
529
+ pauli_evolution_def = formats.PAULI_EVOLUTION_DEF._make(
530
+ struct.unpack(
531
+ formats.PAULI_EVOLUTION_DEF_PACK, file_obj.read(formats.PAULI_EVOLUTION_DEF_SIZE)
532
+ )
533
+ )
534
+ if pauli_evolution_def.operator_size != 1 and pauli_evolution_def.standalone_op:
535
+ raise ValueError(
536
+ "Can't have a standalone operator with {pauli_evolution_raw[0]} operators in the payload"
537
+ )
538
+
539
+ operator_list = []
540
+ for _ in range(pauli_evolution_def.operator_size):
541
+ op_elem = formats.SPARSE_PAULI_OP_LIST_ELEM._make(
542
+ struct.unpack(
543
+ formats.SPARSE_PAULI_OP_LIST_ELEM_PACK,
544
+ file_obj.read(formats.SPARSE_PAULI_OP_LIST_ELEM_SIZE),
545
+ )
546
+ )
547
+ op_raw_data = common.data_from_binary(file_obj.read(op_elem.size), np.load)
548
+ operator_list.append(SparsePauliOp.from_list(op_raw_data))
549
+
550
+ if pauli_evolution_def.standalone_op:
551
+ pauli_op = operator_list[0]
552
+ else:
553
+ pauli_op = operator_list
554
+
555
+ time = value.loads_value(
556
+ pauli_evolution_def.time_type,
557
+ file_obj.read(pauli_evolution_def.time_size),
558
+ version=version,
559
+ vectors=vectors,
560
+ )
561
+ synth_data = json.loads(file_obj.read(pauli_evolution_def.synth_method_size))
562
+ synthesis = getattr(evo_synth, synth_data["class"])(**synth_data["settings"])
563
+ return_gate = library.PauliEvolutionGate(pauli_op, time=time, synthesis=synthesis)
564
+ return return_gate
565
+
566
+
567
+ def _read_modifier(file_obj):
568
+ modifier = formats.MODIFIER_DEF._make(
569
+ struct.unpack(
570
+ formats.MODIFIER_DEF_PACK,
571
+ file_obj.read(formats.MODIFIER_DEF_SIZE),
572
+ )
573
+ )
574
+ if modifier.type == b"i":
575
+ return InverseModifier()
576
+ elif modifier.type == b"c":
577
+ return ControlModifier(
578
+ num_ctrl_qubits=modifier.num_ctrl_qubits, ctrl_state=modifier.ctrl_state
579
+ )
580
+ elif modifier.type == b"p":
581
+ return PowerModifier(power=modifier.power)
582
+ else:
583
+ raise TypeError("Unsupported modifier.")
584
+
585
+
586
+ def _read_custom_operations(file_obj, version, vectors):
587
+ custom_operations = {}
588
+ custom_definition_header = formats.CUSTOM_CIRCUIT_DEF_HEADER._make(
589
+ struct.unpack(
590
+ formats.CUSTOM_CIRCUIT_DEF_HEADER_PACK,
591
+ file_obj.read(formats.CUSTOM_CIRCUIT_DEF_HEADER_SIZE),
592
+ )
593
+ )
594
+ if custom_definition_header.size > 0:
595
+ for _ in range(custom_definition_header.size):
596
+ if version < 5:
597
+ data = formats.CUSTOM_CIRCUIT_INST_DEF._make(
598
+ struct.unpack(
599
+ formats.CUSTOM_CIRCUIT_INST_DEF_PACK,
600
+ file_obj.read(formats.CUSTOM_CIRCUIT_INST_DEF_SIZE),
601
+ )
602
+ )
603
+ else:
604
+ data = formats.CUSTOM_CIRCUIT_INST_DEF_V2._make(
605
+ struct.unpack(
606
+ formats.CUSTOM_CIRCUIT_INST_DEF_V2_PACK,
607
+ file_obj.read(formats.CUSTOM_CIRCUIT_INST_DEF_V2_SIZE),
608
+ )
609
+ )
610
+
611
+ name = file_obj.read(data.gate_name_size).decode(common.ENCODE)
612
+ type_str = data.type
613
+ definition_circuit = None
614
+ if data.custom_definition:
615
+ def_binary = file_obj.read(data.size)
616
+ if version < 3 or not name.startswith(r"###PauliEvolutionGate_"):
617
+ definition_circuit = common.data_from_binary(
618
+ def_binary, read_circuit, version=version
619
+ )
620
+ elif name.startswith(r"###PauliEvolutionGate_"):
621
+ definition_circuit = common.data_from_binary(
622
+ def_binary, _read_pauli_evolution_gate, version=version, vectors=vectors
623
+ )
624
+ if version < 5:
625
+ data_payload = (type_str, data.num_qubits, data.num_clbits, definition_circuit)
626
+ else:
627
+ base_gate = file_obj.read(data.base_gate_size)
628
+ data_payload = (
629
+ type_str,
630
+ data.num_qubits,
631
+ data.num_clbits,
632
+ definition_circuit,
633
+ data.num_ctrl_qubits,
634
+ data.ctrl_state,
635
+ base_gate,
636
+ )
637
+ custom_operations[name] = data_payload
638
+ return custom_operations
639
+
640
+
641
+ def _read_calibrations(file_obj, version, vectors, metadata_deserializer):
642
+ calibrations = {}
643
+
644
+ header = formats.CALIBRATION._make(
645
+ struct.unpack(formats.CALIBRATION_PACK, file_obj.read(formats.CALIBRATION_SIZE))
646
+ )
647
+ for _ in range(header.num_cals):
648
+ defheader = formats.CALIBRATION_DEF._make(
649
+ struct.unpack(formats.CALIBRATION_DEF_PACK, file_obj.read(formats.CALIBRATION_DEF_SIZE))
650
+ )
651
+ name = file_obj.read(defheader.name_size).decode(common.ENCODE)
652
+ qubits = tuple(
653
+ struct.unpack("!q", file_obj.read(struct.calcsize("!q")))[0]
654
+ for _ in range(defheader.num_qubits)
655
+ )
656
+ params = tuple(
657
+ value.read_value(file_obj, version, vectors) for _ in range(defheader.num_params)
658
+ )
659
+ schedule = schedules.read_schedule_block(file_obj, version, metadata_deserializer)
660
+
661
+ if name not in calibrations:
662
+ calibrations[name] = {(qubits, params): schedule}
663
+ else:
664
+ calibrations[name][(qubits, params)] = schedule
665
+
666
+ return calibrations
667
+
668
+
669
+ def _dumps_register(register, index_map):
670
+ if isinstance(register, ClassicalRegister):
671
+ return register.name.encode(common.ENCODE)
672
+ # Clbit.
673
+ return b"\x00" + str(index_map["c"][register]).encode(common.ENCODE)
674
+
675
+
676
+ def _dumps_instruction_parameter(
677
+ param, index_map, use_symengine, *, version, standalone_var_indices
678
+ ):
679
+ if isinstance(param, QuantumCircuit):
680
+ type_key = type_keys.Program.CIRCUIT
681
+ data_bytes = common.data_to_binary(param, write_circuit, version=version)
682
+ elif isinstance(param, Modifier):
683
+ type_key = type_keys.Value.MODIFIER
684
+ data_bytes = common.data_to_binary(param, _write_modifier)
685
+ elif isinstance(param, range):
686
+ type_key = type_keys.Container.RANGE
687
+ data_bytes = struct.pack(formats.RANGE_PACK, param.start, param.stop, param.step)
688
+ elif isinstance(param, tuple):
689
+ type_key = type_keys.Container.TUPLE
690
+ data_bytes = common.sequence_to_binary(
691
+ param,
692
+ _dumps_instruction_parameter,
693
+ index_map=index_map,
694
+ use_symengine=use_symengine,
695
+ version=version,
696
+ standalone_var_indices=standalone_var_indices,
697
+ )
698
+ elif isinstance(param, int):
699
+ # TODO This uses little endian. This should be fixed in next QPY version.
700
+ type_key = type_keys.Value.INTEGER
701
+ data_bytes = struct.pack("<q", param)
702
+ elif isinstance(param, float):
703
+ # TODO This uses little endian. This should be fixed in next QPY version.
704
+ type_key = type_keys.Value.FLOAT
705
+ data_bytes = struct.pack("<d", param)
706
+ elif isinstance(param, (Clbit, ClassicalRegister)):
707
+ type_key = type_keys.Value.REGISTER
708
+ data_bytes = _dumps_register(param, index_map)
709
+ else:
710
+ type_key, data_bytes = value.dumps_value(
711
+ param,
712
+ index_map=index_map,
713
+ use_symengine=use_symengine,
714
+ standalone_var_indices=standalone_var_indices,
715
+ version=version,
716
+ )
717
+
718
+ return type_key, data_bytes
719
+
720
+
721
+ # pylint: disable=too-many-boolean-expressions
722
+ def _write_instruction(
723
+ file_obj,
724
+ instruction,
725
+ custom_operations,
726
+ index_map,
727
+ use_symengine,
728
+ version,
729
+ standalone_var_indices=None,
730
+ ):
731
+ if isinstance(instruction.operation, Instruction):
732
+ gate_class_name = instruction.operation.base_class.__name__
733
+ else:
734
+ gate_class_name = instruction.operation.__class__.__name__
735
+
736
+ custom_operations_list = []
737
+ if (
738
+ (
739
+ not hasattr(library, gate_class_name)
740
+ and not hasattr(circuit_mod, gate_class_name)
741
+ and not hasattr(controlflow, gate_class_name)
742
+ and gate_class_name != "Clifford"
743
+ )
744
+ or gate_class_name == "Gate"
745
+ or gate_class_name == "Instruction"
746
+ or isinstance(instruction.operation, library.BlueprintCircuit)
747
+ ):
748
+ gate_class_name = instruction.operation.name
749
+ if version >= 11:
750
+ # Assign a uuid to each instance of a custom operation
751
+ gate_class_name = f"{gate_class_name}_{uuid.uuid4().hex}"
752
+ # ucr*_dg gates can have different numbers of parameters,
753
+ # the uuid is appended to avoid storing a single definition
754
+ # in circuits with multiple ucr*_dg gates.
755
+ elif instruction.operation.name in {"ucrx_dg", "ucry_dg", "ucrz_dg"}:
756
+ gate_class_name = f"{gate_class_name}_{uuid.uuid4()}"
757
+
758
+ custom_operations[gate_class_name] = instruction.operation
759
+ custom_operations_list.append(gate_class_name)
760
+
761
+ elif gate_class_name in {"ControlledGate", "AnnotatedOperation"}:
762
+ # controlled or annotated gates can have the same name but different parameter
763
+ # values, the uuid is appended to avoid storing a single definition
764
+ # in circuits with multiple controlled gates.
765
+ gate_class_name = instruction.operation.name + "_" + str(uuid.uuid4())
766
+ custom_operations[gate_class_name] = instruction.operation
767
+ custom_operations_list.append(gate_class_name)
768
+
769
+ elif isinstance(instruction.operation, library.PauliEvolutionGate):
770
+ gate_class_name = r"###PauliEvolutionGate_" + str(uuid.uuid4())
771
+ custom_operations[gate_class_name] = instruction.operation
772
+ custom_operations_list.append(gate_class_name)
773
+
774
+ condition_type = type_keys.Condition.NONE
775
+ condition_register = b""
776
+ condition_value = 0
777
+ if (op_condition := getattr(instruction.operation, "_condition", None)) is not None:
778
+ if isinstance(op_condition, expr.Expr):
779
+ condition_type = type_keys.Condition.EXPRESSION
780
+ else:
781
+ condition_type = type_keys.Condition.TWO_TUPLE
782
+ condition_register = _dumps_register(instruction.operation._condition[0], index_map)
783
+ condition_value = int(instruction.operation._condition[1])
784
+
785
+ gate_class_name = gate_class_name.encode(common.ENCODE)
786
+ label = getattr(instruction.operation, "label", None)
787
+ if label:
788
+ label_raw = label.encode(common.ENCODE)
789
+ else:
790
+ label_raw = b""
791
+
792
+ # The instruction params we store are about being able to reconstruct the objects; they don't
793
+ # necessarily need to match one-to-one to the `params` field.
794
+ if isinstance(instruction.operation, controlflow.SwitchCaseOp):
795
+ instruction_params = [
796
+ instruction.operation.target,
797
+ tuple(instruction.operation.cases_specifier()),
798
+ ]
799
+ elif isinstance(instruction.operation, Clifford):
800
+ instruction_params = [instruction.operation.tableau]
801
+ elif isinstance(instruction.operation, AnnotatedOperation):
802
+ instruction_params = instruction.operation.modifiers
803
+ else:
804
+ instruction_params = getattr(instruction.operation, "params", [])
805
+
806
+ num_ctrl_qubits = getattr(instruction.operation, "num_ctrl_qubits", 0)
807
+ ctrl_state = getattr(instruction.operation, "ctrl_state", 0)
808
+ instruction_raw = struct.pack(
809
+ formats.CIRCUIT_INSTRUCTION_V2_PACK,
810
+ len(gate_class_name),
811
+ len(label_raw),
812
+ len(instruction_params),
813
+ instruction.operation.num_qubits,
814
+ instruction.operation.num_clbits,
815
+ condition_type.value,
816
+ len(condition_register),
817
+ condition_value,
818
+ num_ctrl_qubits,
819
+ ctrl_state,
820
+ )
821
+ file_obj.write(instruction_raw)
822
+ file_obj.write(gate_class_name)
823
+ file_obj.write(label_raw)
824
+ if condition_type is type_keys.Condition.EXPRESSION:
825
+ value.write_value(
826
+ file_obj,
827
+ op_condition,
828
+ version=version,
829
+ index_map=index_map,
830
+ standalone_var_indices=standalone_var_indices,
831
+ )
832
+ else:
833
+ file_obj.write(condition_register)
834
+ # Encode instruction args
835
+ for qbit in instruction.qubits:
836
+ instruction_arg_raw = struct.pack(
837
+ formats.CIRCUIT_INSTRUCTION_ARG_PACK, b"q", index_map["q"][qbit]
838
+ )
839
+ file_obj.write(instruction_arg_raw)
840
+ for clbit in instruction.clbits:
841
+ instruction_arg_raw = struct.pack(
842
+ formats.CIRCUIT_INSTRUCTION_ARG_PACK, b"c", index_map["c"][clbit]
843
+ )
844
+ file_obj.write(instruction_arg_raw)
845
+ # Encode instruction params
846
+ for param in instruction_params:
847
+ type_key, data_bytes = _dumps_instruction_parameter(
848
+ param,
849
+ index_map,
850
+ use_symengine,
851
+ version=version,
852
+ standalone_var_indices=standalone_var_indices,
853
+ )
854
+ common.write_generic_typed_data(file_obj, type_key, data_bytes)
855
+ return custom_operations_list
856
+
857
+
858
+ def _write_pauli_evolution_gate(file_obj, evolution_gate, version):
859
+ operator_list = evolution_gate.operator
860
+ standalone = False
861
+ if not isinstance(operator_list, list):
862
+ operator_list = [operator_list]
863
+ standalone = True
864
+ num_operators = len(operator_list)
865
+
866
+ def _write_elem(buffer, op):
867
+ elem_data = common.data_to_binary(op.to_list(array=True), np.save)
868
+ elem_metadata = struct.pack(formats.SPARSE_PAULI_OP_LIST_ELEM_PACK, len(elem_data))
869
+ buffer.write(elem_metadata)
870
+ buffer.write(elem_data)
871
+
872
+ pauli_data_buf = io.BytesIO()
873
+ for operator in operator_list:
874
+ data = common.data_to_binary(operator, _write_elem)
875
+ pauli_data_buf.write(data)
876
+
877
+ time_type, time_data = value.dumps_value(evolution_gate.time, version=version)
878
+ time_size = len(time_data)
879
+ synth_class = str(type(evolution_gate.synthesis).__name__)
880
+ settings_dict = evolution_gate.synthesis.settings
881
+ synth_data = json.dumps({"class": synth_class, "settings": settings_dict}).encode(common.ENCODE)
882
+ synth_size = len(synth_data)
883
+ pauli_evolution_raw = struct.pack(
884
+ formats.PAULI_EVOLUTION_DEF_PACK,
885
+ num_operators,
886
+ standalone,
887
+ time_type,
888
+ time_size,
889
+ synth_size,
890
+ )
891
+ file_obj.write(pauli_evolution_raw)
892
+ file_obj.write(pauli_data_buf.getvalue())
893
+ pauli_data_buf.close()
894
+ file_obj.write(time_data)
895
+ file_obj.write(synth_data)
896
+
897
+
898
+ def _write_modifier(file_obj, modifier):
899
+ if isinstance(modifier, InverseModifier):
900
+ type_key = b"i"
901
+ num_ctrl_qubits = 0
902
+ ctrl_state = 0
903
+ power = 0.0
904
+ elif isinstance(modifier, ControlModifier):
905
+ type_key = b"c"
906
+ num_ctrl_qubits = modifier.num_ctrl_qubits
907
+ ctrl_state = modifier.ctrl_state
908
+ power = 0.0
909
+ elif isinstance(modifier, PowerModifier):
910
+ type_key = b"p"
911
+ num_ctrl_qubits = 0
912
+ ctrl_state = 0
913
+ power = modifier.power
914
+ else:
915
+ raise TypeError("Unsupported modifier.")
916
+
917
+ modifier_data = struct.pack(
918
+ formats.MODIFIER_DEF_PACK, type_key, num_ctrl_qubits, ctrl_state, power
919
+ )
920
+ file_obj.write(modifier_data)
921
+
922
+
923
+ def _write_custom_operation(
924
+ file_obj, name, operation, custom_operations, use_symengine, version, *, standalone_var_indices
925
+ ):
926
+ type_key = type_keys.CircuitInstruction.assign(operation)
927
+ has_definition = False
928
+ size = 0
929
+ data = None
930
+ num_qubits = operation.num_qubits
931
+ num_clbits = operation.num_clbits
932
+ ctrl_state = 0
933
+ num_ctrl_qubits = 0
934
+ base_gate = None
935
+ new_custom_instruction = []
936
+
937
+ if type_key == type_keys.CircuitInstruction.PAULI_EVOL_GATE:
938
+ has_definition = True
939
+ data = common.data_to_binary(operation, _write_pauli_evolution_gate, version=version)
940
+ size = len(data)
941
+ elif type_key == type_keys.CircuitInstruction.CONTROLLED_GATE:
942
+ # For ControlledGate, we have to access and store the private `_definition` rather than the
943
+ # public one, because the public one is mutated to include additional logic if the control
944
+ # state is open, and the definition setter (during a subsequent read) uses the "fully
945
+ # excited" control definition only.
946
+ has_definition = True
947
+ # Build internal definition to support overloaded subclasses by
948
+ # calling definition getter on object
949
+ operation.definition # pylint: disable=pointless-statement
950
+ data = common.data_to_binary(operation._definition, write_circuit, version=version)
951
+ size = len(data)
952
+ num_ctrl_qubits = operation.num_ctrl_qubits
953
+ ctrl_state = operation.ctrl_state
954
+ base_gate = operation.base_gate
955
+ elif type_key == type_keys.CircuitInstruction.ANNOTATED_OPERATION:
956
+ has_definition = False
957
+ base_gate = operation.base_op
958
+ elif operation.definition is not None:
959
+ has_definition = True
960
+ data = common.data_to_binary(operation.definition, write_circuit, version=version)
961
+ size = len(data)
962
+ if base_gate is None:
963
+ base_gate_raw = b""
964
+ else:
965
+ with io.BytesIO() as base_gate_buffer:
966
+ new_custom_instruction = _write_instruction(
967
+ base_gate_buffer,
968
+ CircuitInstruction(base_gate, (), ()),
969
+ custom_operations,
970
+ {},
971
+ use_symengine,
972
+ version,
973
+ standalone_var_indices=standalone_var_indices,
974
+ )
975
+ base_gate_raw = base_gate_buffer.getvalue()
976
+ name_raw = name.encode(common.ENCODE)
977
+ custom_operation_raw = struct.pack(
978
+ formats.CUSTOM_CIRCUIT_INST_DEF_V2_PACK,
979
+ len(name_raw),
980
+ type_key,
981
+ num_qubits,
982
+ num_clbits,
983
+ has_definition,
984
+ size,
985
+ num_ctrl_qubits,
986
+ ctrl_state,
987
+ len(base_gate_raw),
988
+ )
989
+ file_obj.write(custom_operation_raw)
990
+ file_obj.write(name_raw)
991
+ if data:
992
+ file_obj.write(data)
993
+ file_obj.write(base_gate_raw)
994
+ return new_custom_instruction
995
+
996
+
997
+ def _write_calibrations(file_obj, calibrations, metadata_serializer, version):
998
+ flatten_dict = {}
999
+ for gate, caldef in calibrations.items():
1000
+ for (qubits, params), schedule in caldef.items():
1001
+ key = (gate, qubits, params)
1002
+ flatten_dict[key] = schedule
1003
+ header = struct.pack(formats.CALIBRATION_PACK, len(flatten_dict))
1004
+ file_obj.write(header)
1005
+ for (name, qubits, params), schedule in flatten_dict.items():
1006
+ # In principle ScheduleBlock and Schedule can be supported.
1007
+ # As of version 5 only ScheduleBlock is supported.
1008
+ name_bytes = name.encode(common.ENCODE)
1009
+ defheader = struct.pack(
1010
+ formats.CALIBRATION_DEF_PACK,
1011
+ len(name_bytes),
1012
+ len(qubits),
1013
+ len(params),
1014
+ type_keys.Program.assign(schedule),
1015
+ )
1016
+ file_obj.write(defheader)
1017
+ file_obj.write(name_bytes)
1018
+ for qubit in qubits:
1019
+ file_obj.write(struct.pack("!q", qubit))
1020
+ for param in params:
1021
+ value.write_value(file_obj, param, version=version)
1022
+ schedules.write_schedule_block(file_obj, schedule, metadata_serializer, version=version)
1023
+
1024
+
1025
+ def _write_registers(file_obj, in_circ_regs, full_bits):
1026
+ bitmap = {bit: index for index, bit in enumerate(full_bits)}
1027
+
1028
+ out_circ_regs = set()
1029
+ for bit in full_bits:
1030
+ if bit._register is not None and bit._register not in in_circ_regs:
1031
+ out_circ_regs.add(bit._register)
1032
+
1033
+ for regs, is_in_circuit in [(in_circ_regs, True), (out_circ_regs, False)]:
1034
+ for reg in regs:
1035
+ standalone = all(bit._register is reg for bit in reg)
1036
+ reg_name = reg.name.encode(common.ENCODE)
1037
+ reg_type = reg.prefix.encode(common.ENCODE)
1038
+ file_obj.write(
1039
+ struct.pack(
1040
+ formats.REGISTER_V4_PACK,
1041
+ reg_type,
1042
+ standalone,
1043
+ reg.size,
1044
+ len(reg_name),
1045
+ is_in_circuit,
1046
+ )
1047
+ )
1048
+ file_obj.write(reg_name)
1049
+ REGISTER_ARRAY_PACK = f"!{reg.size}q"
1050
+ bit_indices = []
1051
+ for bit in reg:
1052
+ bit_indices.append(bitmap.get(bit, -1))
1053
+ file_obj.write(struct.pack(REGISTER_ARRAY_PACK, *bit_indices))
1054
+
1055
+ return len(in_circ_regs) + len(out_circ_regs)
1056
+
1057
+
1058
+ def _write_layout(file_obj, circuit):
1059
+ if circuit.layout is None:
1060
+ # Write a null header if there is no layout present
1061
+ file_obj.write(struct.pack(formats.LAYOUT_V2_PACK, False, -1, -1, -1, 0, 0))
1062
+ return
1063
+ initial_size = -1
1064
+ input_qubit_mapping = {}
1065
+ initial_layout_array = []
1066
+ extra_registers = defaultdict(list)
1067
+ if circuit.layout.initial_layout is not None:
1068
+ initial_size = len(circuit.layout.initial_layout)
1069
+ layout_mapping = circuit.layout.initial_layout.get_physical_bits()
1070
+ for i in range(circuit.num_qubits):
1071
+ qubit = layout_mapping[i]
1072
+ input_qubit_mapping[qubit] = i
1073
+ if qubit._register is not None or qubit._index is not None:
1074
+ if qubit._register not in circuit.qregs:
1075
+ extra_registers[qubit._register].append(qubit)
1076
+ initial_layout_array.append((qubit._index, qubit._register))
1077
+ else:
1078
+ initial_layout_array.append((None, None))
1079
+ input_qubit_size = -1
1080
+ input_qubit_mapping_array = []
1081
+ if circuit.layout.input_qubit_mapping is not None:
1082
+ input_qubit_size = len(circuit.layout.input_qubit_mapping)
1083
+ input_qubit_mapping_array = [None] * input_qubit_size
1084
+ layout_mapping = circuit.layout.initial_layout.get_virtual_bits()
1085
+ for qubit, index in circuit.layout.input_qubit_mapping.items():
1086
+ if (
1087
+ getattr(qubit, "_register", None) is not None
1088
+ and getattr(qubit, "_index", None) is not None
1089
+ ):
1090
+ if qubit._register not in circuit.qregs:
1091
+ extra_registers[qubit._register].append(qubit)
1092
+ input_qubit_mapping_array[index] = layout_mapping[qubit]
1093
+ else:
1094
+ input_qubit_mapping_array[index] = layout_mapping[qubit]
1095
+ final_layout_size = -1
1096
+ final_layout_array = []
1097
+ if circuit.layout.final_layout is not None:
1098
+ final_layout_size = len(circuit.layout.final_layout)
1099
+ final_layout_physical = circuit.layout.final_layout.get_physical_bits()
1100
+ for i in range(circuit.num_qubits):
1101
+ virtual_bit = final_layout_physical[i]
1102
+ final_layout_array.append(circuit.find_bit(virtual_bit).index)
1103
+
1104
+ input_qubit_count = circuit._layout._input_qubit_count
1105
+ if input_qubit_count is None:
1106
+ input_qubit_count = -1
1107
+ file_obj.write(
1108
+ struct.pack(
1109
+ formats.LAYOUT_V2_PACK,
1110
+ True,
1111
+ initial_size,
1112
+ input_qubit_size,
1113
+ final_layout_size,
1114
+ len(extra_registers),
1115
+ input_qubit_count,
1116
+ )
1117
+ )
1118
+ _write_registers(
1119
+ file_obj, list(extra_registers), [x for bits in extra_registers.values() for x in bits]
1120
+ )
1121
+ for index, register in initial_layout_array:
1122
+ reg_name_bytes = None if register is None else register.name.encode(common.ENCODE)
1123
+ file_obj.write(
1124
+ struct.pack(
1125
+ formats.INITIAL_LAYOUT_BIT_PACK,
1126
+ -1 if index is None else index,
1127
+ -1 if reg_name_bytes is None else len(reg_name_bytes),
1128
+ )
1129
+ )
1130
+ if reg_name_bytes is not None:
1131
+ file_obj.write(reg_name_bytes)
1132
+ for i in input_qubit_mapping_array:
1133
+ file_obj.write(struct.pack("!I", i))
1134
+ for i in final_layout_array:
1135
+ file_obj.write(struct.pack("!I", i))
1136
+
1137
+
1138
+ def _read_layout(file_obj, circuit):
1139
+ header = formats.LAYOUT._make(
1140
+ struct.unpack(formats.LAYOUT_PACK, file_obj.read(formats.LAYOUT_SIZE))
1141
+ )
1142
+ if not header.exists:
1143
+ return
1144
+ _read_common_layout(file_obj, header, circuit)
1145
+
1146
+
1147
+ def _read_common_layout(file_obj, header, circuit):
1148
+ registers = {
1149
+ name: QuantumRegister(len(v[1]), name)
1150
+ for name, v in _read_registers_v4(file_obj, header.extra_registers)["q"].items()
1151
+ }
1152
+ initial_layout = None
1153
+ initial_layout_virtual_bits = []
1154
+ for _ in range(header.initial_layout_size):
1155
+ virtual_bit = formats.INITIAL_LAYOUT_BIT._make(
1156
+ struct.unpack(
1157
+ formats.INITIAL_LAYOUT_BIT_PACK,
1158
+ file_obj.read(formats.INITIAL_LAYOUT_BIT_SIZE),
1159
+ )
1160
+ )
1161
+ if virtual_bit.index == -1 and virtual_bit.register_size == -1:
1162
+ qubit = Qubit()
1163
+ else:
1164
+ register_name = file_obj.read(virtual_bit.register_size).decode(common.ENCODE)
1165
+ if register_name in registers:
1166
+ qubit = registers[register_name][virtual_bit.index]
1167
+ else:
1168
+ register = next(filter(lambda x, name=register_name: x.name == name, circuit.qregs))
1169
+ qubit = register[virtual_bit.index]
1170
+ initial_layout_virtual_bits.append(qubit)
1171
+ if initial_layout_virtual_bits:
1172
+ initial_layout = Layout.from_qubit_list(initial_layout_virtual_bits)
1173
+ input_qubit_mapping = None
1174
+ input_qubit_mapping_array = []
1175
+ for _ in range(header.input_mapping_size):
1176
+ input_qubit_mapping_array.append(
1177
+ struct.unpack("!I", file_obj.read(struct.calcsize("!I")))[0]
1178
+ )
1179
+ if input_qubit_mapping_array:
1180
+ input_qubit_mapping = {}
1181
+ physical_bits = initial_layout.get_physical_bits()
1182
+ for index, bit in enumerate(input_qubit_mapping_array):
1183
+ input_qubit_mapping[physical_bits[bit]] = index
1184
+ final_layout = None
1185
+ final_layout_array = []
1186
+ for _ in range(header.final_layout_size):
1187
+ final_layout_array.append(struct.unpack("!I", file_obj.read(struct.calcsize("!I")))[0])
1188
+
1189
+ if final_layout_array:
1190
+ layout_dict = {circuit.qubits[bit]: index for index, bit in enumerate(final_layout_array)}
1191
+ final_layout = Layout(layout_dict)
1192
+
1193
+ circuit._layout = TranspileLayout(initial_layout, input_qubit_mapping, final_layout)
1194
+
1195
+
1196
+ def _read_layout_v2(file_obj, circuit):
1197
+ header = formats.LAYOUT_V2._make(
1198
+ struct.unpack(formats.LAYOUT_V2_PACK, file_obj.read(formats.LAYOUT_V2_SIZE))
1199
+ )
1200
+ if not header.exists:
1201
+ return
1202
+ _read_common_layout(file_obj, header, circuit)
1203
+ if header.input_qubit_count >= 0:
1204
+ circuit._layout._input_qubit_count = header.input_qubit_count
1205
+ circuit._layout._output_qubit_list = circuit.qubits
1206
+
1207
+
1208
+ def write_circuit(
1209
+ file_obj, circuit, metadata_serializer=None, use_symengine=False, version=common.QPY_VERSION
1210
+ ):
1211
+ """Write a single QuantumCircuit object in the file like object.
1212
+
1213
+ Args:
1214
+ file_obj (FILE): The file like object to write the circuit data in.
1215
+ circuit (QuantumCircuit): The circuit data to write.
1216
+ metadata_serializer (JSONEncoder): An optional JSONEncoder class that
1217
+ will be passed the :attr:`.QuantumCircuit.metadata` dictionary for
1218
+ ``circuit`` and will be used as the ``cls`` kwarg
1219
+ on the ``json.dump()`` call to JSON serialize that dictionary.
1220
+ use_symengine (bool): If True, symbolic objects will be serialized using symengine's
1221
+ native mechanism. This is a faster serialization alternative, but not supported in all
1222
+ platforms. Please check that your target platform is supported by the symengine library
1223
+ before setting this option, as it will be required by qpy to deserialize the payload.
1224
+ version (int): The QPY format version to use for serializing this circuit
1225
+ """
1226
+ metadata_raw = json.dumps(
1227
+ circuit.metadata, separators=(",", ":"), cls=metadata_serializer
1228
+ ).encode(common.ENCODE)
1229
+ metadata_size = len(metadata_raw)
1230
+ num_instructions = len(circuit)
1231
+ circuit_name = circuit.name.encode(common.ENCODE)
1232
+ global_phase_type, global_phase_data = value.dumps_value(circuit.global_phase, version=version)
1233
+
1234
+ with io.BytesIO() as reg_buf:
1235
+ num_qregs = _write_registers(reg_buf, circuit.qregs, circuit.qubits)
1236
+ num_cregs = _write_registers(reg_buf, circuit.cregs, circuit.clbits)
1237
+ registers_raw = reg_buf.getvalue()
1238
+ num_registers = num_qregs + num_cregs
1239
+
1240
+ # Write circuit header
1241
+ if version >= 12:
1242
+ header_raw = formats.CIRCUIT_HEADER_V12(
1243
+ name_size=len(circuit_name),
1244
+ global_phase_type=global_phase_type,
1245
+ global_phase_size=len(global_phase_data),
1246
+ num_qubits=circuit.num_qubits,
1247
+ num_clbits=circuit.num_clbits,
1248
+ metadata_size=metadata_size,
1249
+ num_registers=num_registers,
1250
+ num_instructions=num_instructions,
1251
+ num_vars=circuit.num_vars,
1252
+ )
1253
+ header = struct.pack(formats.CIRCUIT_HEADER_V12_PACK, *header_raw)
1254
+ file_obj.write(header)
1255
+ file_obj.write(circuit_name)
1256
+ file_obj.write(global_phase_data)
1257
+ file_obj.write(metadata_raw)
1258
+ # Write header payload
1259
+ file_obj.write(registers_raw)
1260
+ standalone_var_indices = value.write_standalone_vars(file_obj, circuit)
1261
+ else:
1262
+ if circuit.num_vars:
1263
+ raise exceptions.UnsupportedFeatureForVersion(
1264
+ "circuits containing realtime variables", required=12, target=version
1265
+ )
1266
+ header_raw = formats.CIRCUIT_HEADER_V2(
1267
+ name_size=len(circuit_name),
1268
+ global_phase_type=global_phase_type,
1269
+ global_phase_size=len(global_phase_data),
1270
+ num_qubits=circuit.num_qubits,
1271
+ num_clbits=circuit.num_clbits,
1272
+ metadata_size=metadata_size,
1273
+ num_registers=num_registers,
1274
+ num_instructions=num_instructions,
1275
+ )
1276
+ header = struct.pack(formats.CIRCUIT_HEADER_V2_PACK, *header_raw)
1277
+ file_obj.write(header)
1278
+ file_obj.write(circuit_name)
1279
+ file_obj.write(global_phase_data)
1280
+ file_obj.write(metadata_raw)
1281
+ file_obj.write(registers_raw)
1282
+ standalone_var_indices = {}
1283
+
1284
+ instruction_buffer = io.BytesIO()
1285
+ custom_operations = {}
1286
+ index_map = {}
1287
+ index_map["q"] = {bit: index for index, bit in enumerate(circuit.qubits)}
1288
+ index_map["c"] = {bit: index for index, bit in enumerate(circuit.clbits)}
1289
+ for instruction in circuit.data:
1290
+ _write_instruction(
1291
+ instruction_buffer,
1292
+ instruction,
1293
+ custom_operations,
1294
+ index_map,
1295
+ use_symengine,
1296
+ version,
1297
+ standalone_var_indices=standalone_var_indices,
1298
+ )
1299
+
1300
+ with io.BytesIO() as custom_operations_buffer:
1301
+ new_custom_operations = list(custom_operations.keys())
1302
+ while new_custom_operations:
1303
+ operations_to_serialize = new_custom_operations.copy()
1304
+ new_custom_operations = []
1305
+ for name in operations_to_serialize:
1306
+ operation = custom_operations[name]
1307
+ new_custom_operations.extend(
1308
+ _write_custom_operation(
1309
+ custom_operations_buffer,
1310
+ name,
1311
+ operation,
1312
+ custom_operations,
1313
+ use_symengine,
1314
+ version,
1315
+ standalone_var_indices=standalone_var_indices,
1316
+ )
1317
+ )
1318
+
1319
+ file_obj.write(struct.pack(formats.CUSTOM_CIRCUIT_DEF_HEADER_PACK, len(custom_operations)))
1320
+ file_obj.write(custom_operations_buffer.getvalue())
1321
+
1322
+ file_obj.write(instruction_buffer.getvalue())
1323
+ instruction_buffer.close()
1324
+
1325
+ # Write calibrations
1326
+ _write_calibrations(file_obj, circuit._calibrations_prop, metadata_serializer, version=version)
1327
+ _write_layout(file_obj, circuit)
1328
+
1329
+
1330
+ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=False):
1331
+ """Read a single QuantumCircuit object from the file like object.
1332
+
1333
+ Args:
1334
+ file_obj (FILE): The file like object to read the circuit data from.
1335
+ version (int): QPY version.
1336
+ metadata_deserializer (JSONDecoder): An optional JSONDecoder class
1337
+ that will be used for the ``cls`` kwarg on the internal
1338
+ ``json.load`` call used to deserialize the JSON payload used for
1339
+ the :attr:`.QuantumCircuit.metadata` attribute for a circuit
1340
+ in the file-like object. If this is not specified the circuit metadata will
1341
+ be parsed as JSON with the stdlib ``json.load()`` function using
1342
+ the default ``JSONDecoder`` class.
1343
+ use_symengine (bool): If True, symbolic objects will be de-serialized using
1344
+ symengine's native mechanism. This is a faster serialization alternative, but not
1345
+ supported in all platforms. Please check that your target platform is supported by
1346
+ the symengine library before setting this option, as it will be required by qpy to
1347
+ deserialize the payload.
1348
+ Returns:
1349
+ QuantumCircuit: The circuit object from the file.
1350
+
1351
+ Raises:
1352
+ QpyError: Invalid register.
1353
+ """
1354
+ vectors = {}
1355
+ if version < 2:
1356
+ header, name, metadata = _read_header(file_obj, metadata_deserializer=metadata_deserializer)
1357
+ elif version < 12:
1358
+ header, name, metadata = _read_header_v2(
1359
+ file_obj, version, vectors, metadata_deserializer=metadata_deserializer
1360
+ )
1361
+ else:
1362
+ header, name, metadata = _read_header_v12(
1363
+ file_obj, version, vectors, metadata_deserializer=metadata_deserializer
1364
+ )
1365
+
1366
+ global_phase = header["global_phase"]
1367
+ num_qubits = header["num_qubits"]
1368
+ num_clbits = header["num_clbits"]
1369
+ num_registers = header["num_registers"]
1370
+ num_instructions = header["num_instructions"]
1371
+ num_vars = header.get("num_vars", 0)
1372
+ # `out_registers` is two "name: register" maps segregated by type for the rest of QPY, and
1373
+ # `all_registers` is the complete ordered list used to construct the `QuantumCircuit`.
1374
+ out_registers = {"q": {}, "c": {}}
1375
+ all_registers = []
1376
+ out_bits = {"q": [None] * num_qubits, "c": [None] * num_clbits}
1377
+ if num_registers > 0:
1378
+ if version < 4:
1379
+ registers = _read_registers(file_obj, num_registers)
1380
+ else:
1381
+ registers = _read_registers_v4(file_obj, num_registers)
1382
+ for bit_type_label, bit_type, reg_type in [
1383
+ ("q", Qubit, QuantumRegister),
1384
+ ("c", Clbit, ClassicalRegister),
1385
+ ]:
1386
+ # This does two passes through the registers. In the first, we're actually just
1387
+ # constructing the `Bit` instances: any register that is `standalone` "owns" all its
1388
+ # bits in the old Qiskit data model, so we have to construct those by creating the
1389
+ # register and taking the bits from them. That's the case even if that register isn't
1390
+ # actually in the circuit, which is why we stored them (with `in_circuit=False`) in QPY.
1391
+ #
1392
+ # Since there's no guarantees in QPY about the ordering of registers, we have to pass
1393
+ # through all registers to create the bits first, because we can't reliably know if a
1394
+ # non-standalone register contains bits from a standalone one until we've seen all
1395
+ # standalone registers.
1396
+ typed_bits = out_bits[bit_type_label]
1397
+ typed_registers = registers[bit_type_label]
1398
+ for register_name, (standalone, indices, _incircuit) in typed_registers.items():
1399
+ if not standalone:
1400
+ continue
1401
+ register = reg_type(len(indices), register_name)
1402
+ out_registers[bit_type_label][register_name] = register
1403
+ for owned, index in zip(register, indices):
1404
+ # Negative indices are for bits that aren't in the circuit.
1405
+ if index >= 0:
1406
+ typed_bits[index] = owned
1407
+ # Any remaining unset bits aren't owned, so we can construct them in the standard way.
1408
+ typed_bits = [bit if bit is not None else bit_type() for bit in typed_bits]
1409
+ # Finally _properly_ construct all the registers. Bits can be in more than one
1410
+ # register, including bits that are old-style "owned" by a register.
1411
+ for register_name, (standalone, indices, in_circuit) in typed_registers.items():
1412
+ if standalone:
1413
+ register = out_registers[bit_type_label][register_name]
1414
+ else:
1415
+ register = reg_type(
1416
+ name=register_name,
1417
+ bits=[typed_bits[x] if x >= 0 else bit_type() for x in indices],
1418
+ )
1419
+ out_registers[bit_type_label][register_name] = register
1420
+ if in_circuit:
1421
+ all_registers.append(register)
1422
+ out_bits[bit_type_label] = typed_bits
1423
+ else:
1424
+ out_bits = {
1425
+ "q": [Qubit() for _ in out_bits["q"]],
1426
+ "c": [Clbit() for _ in out_bits["c"]],
1427
+ }
1428
+ var_segments, standalone_var_indices = value.read_standalone_vars(file_obj, num_vars)
1429
+ circ = QuantumCircuit(
1430
+ out_bits["q"],
1431
+ out_bits["c"],
1432
+ *all_registers,
1433
+ name=name,
1434
+ global_phase=global_phase,
1435
+ metadata=metadata,
1436
+ inputs=var_segments[type_keys.ExprVarDeclaration.INPUT],
1437
+ captures=var_segments[type_keys.ExprVarDeclaration.CAPTURE],
1438
+ )
1439
+ for declaration in var_segments[type_keys.ExprVarDeclaration.LOCAL]:
1440
+ circ.add_uninitialized_var(declaration)
1441
+ custom_operations = _read_custom_operations(file_obj, version, vectors)
1442
+ for _instruction in range(num_instructions):
1443
+ _read_instruction(
1444
+ file_obj,
1445
+ circ,
1446
+ out_registers,
1447
+ custom_operations,
1448
+ version,
1449
+ vectors,
1450
+ use_symengine,
1451
+ standalone_var_indices,
1452
+ )
1453
+
1454
+ # Read calibrations
1455
+ if version >= 5:
1456
+ circ._calibrations_prop = _read_calibrations(
1457
+ file_obj, version, vectors, metadata_deserializer
1458
+ )
1459
+
1460
+ for vec_name, (vector, initialized_params) in vectors.items():
1461
+ if len(initialized_params) != len(vector):
1462
+ warnings.warn(
1463
+ f"The ParameterVector: '{vec_name}' is not fully identical to its "
1464
+ "pre-serialization state. Elements "
1465
+ f"{', '.join([str(x) for x in set(range(len(vector))) - initialized_params])} "
1466
+ "in the ParameterVector will be not equal to the pre-serialized ParameterVector "
1467
+ f"as they weren't used in the circuit: {circ.name}",
1468
+ UserWarning,
1469
+ )
1470
+ if version >= 8:
1471
+ if version >= 10:
1472
+ _read_layout_v2(file_obj, circ)
1473
+ else:
1474
+ _read_layout(file_obj, circ)
1475
+ return circ