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