qiskit 1.3.0b1__cp39-abi3-win32.whl → 1.3.0rc2__cp39-abi3-win32.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 (360) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +20 -1
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/assembler/assemble_schedules.py +2 -0
  5. qiskit/circuit/__init__.py +44 -1
  6. qiskit/circuit/_standard_gates_commutations.py +585 -0
  7. qiskit/circuit/barrier.py +2 -0
  8. qiskit/circuit/controlflow/builder.py +3 -3
  9. qiskit/circuit/controlflow/if_else.py +13 -5
  10. qiskit/circuit/controlflow/while_loop.py +10 -2
  11. qiskit/circuit/delay.py +20 -3
  12. qiskit/circuit/equivalence.py +13 -214
  13. qiskit/circuit/gate.py +3 -1
  14. qiskit/circuit/instruction.py +32 -11
  15. qiskit/circuit/instructionset.py +2 -0
  16. qiskit/circuit/library/__init__.py +110 -14
  17. qiskit/circuit/library/arithmetic/__init__.py +9 -2
  18. qiskit/circuit/library/arithmetic/adders/__init__.py +1 -0
  19. qiskit/circuit/library/arithmetic/adders/adder.py +154 -2
  20. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +20 -56
  21. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +14 -1
  22. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +21 -91
  23. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
  24. qiskit/circuit/library/arithmetic/multipliers/__init__.py +1 -0
  25. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +8 -1
  26. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +94 -3
  27. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +8 -1
  28. qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
  29. qiskit/circuit/library/basis_change/qft.py +20 -38
  30. qiskit/circuit/library/blueprintcircuit.py +64 -0
  31. qiskit/circuit/library/boolean_logic/__init__.py +4 -4
  32. qiskit/circuit/library/boolean_logic/inner_product.py +81 -4
  33. qiskit/circuit/library/boolean_logic/quantum_and.py +107 -4
  34. qiskit/circuit/library/boolean_logic/quantum_or.py +107 -3
  35. qiskit/circuit/library/boolean_logic/quantum_xor.py +97 -3
  36. qiskit/circuit/library/data_preparation/__init__.py +6 -3
  37. qiskit/circuit/library/data_preparation/{z_feature_map.py → _z_feature_map.py} +45 -34
  38. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  39. qiskit/circuit/library/data_preparation/pauli_feature_map.py +342 -29
  40. qiskit/circuit/library/fourier_checking.py +72 -11
  41. qiskit/circuit/library/generalized_gates/__init__.py +1 -1
  42. qiskit/circuit/library/generalized_gates/diagonal.py +45 -51
  43. qiskit/circuit/library/generalized_gates/gms.py +67 -14
  44. qiskit/circuit/library/generalized_gates/gr.py +4 -4
  45. qiskit/circuit/library/generalized_gates/isometry.py +2 -2
  46. qiskit/circuit/library/generalized_gates/linear_function.py +12 -6
  47. qiskit/circuit/library/generalized_gates/mcmt.py +167 -107
  48. qiskit/circuit/library/generalized_gates/permutation.py +8 -6
  49. qiskit/circuit/library/generalized_gates/rv.py +8 -9
  50. qiskit/circuit/library/graph_state.py +93 -10
  51. qiskit/circuit/library/grover_operator.py +270 -2
  52. qiskit/circuit/library/hidden_linear_function.py +83 -20
  53. qiskit/circuit/library/iqp.py +99 -20
  54. qiskit/circuit/library/n_local/__init__.py +19 -7
  55. qiskit/circuit/library/n_local/efficient_su2.py +118 -5
  56. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +259 -0
  57. qiskit/circuit/library/n_local/excitation_preserving.py +130 -6
  58. qiskit/circuit/library/n_local/n_local.py +406 -5
  59. qiskit/circuit/library/n_local/pauli_two_design.py +106 -4
  60. qiskit/circuit/library/n_local/qaoa_ansatz.py +80 -1
  61. qiskit/circuit/library/n_local/real_amplitudes.py +127 -7
  62. qiskit/circuit/library/n_local/two_local.py +14 -7
  63. qiskit/circuit/library/overlap.py +91 -26
  64. qiskit/circuit/library/pauli_evolution.py +17 -15
  65. qiskit/circuit/library/phase_estimation.py +80 -4
  66. qiskit/circuit/library/quantum_volume.py +72 -20
  67. qiskit/circuit/library/standard_gates/__init__.py +20 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +2 -1
  69. qiskit/circuit/library/standard_gates/ecr.py +2 -2
  70. qiskit/circuit/library/standard_gates/h.py +4 -3
  71. qiskit/circuit/library/standard_gates/i.py +2 -1
  72. qiskit/circuit/library/standard_gates/iswap.py +2 -2
  73. qiskit/circuit/library/standard_gates/p.py +20 -12
  74. qiskit/circuit/library/standard_gates/r.py +1 -1
  75. qiskit/circuit/library/standard_gates/rx.py +4 -3
  76. qiskit/circuit/library/standard_gates/rxx.py +2 -2
  77. qiskit/circuit/library/standard_gates/ry.py +4 -3
  78. qiskit/circuit/library/standard_gates/ryy.py +2 -2
  79. qiskit/circuit/library/standard_gates/rz.py +13 -12
  80. qiskit/circuit/library/standard_gates/rzx.py +6 -6
  81. qiskit/circuit/library/standard_gates/rzz.py +1 -1
  82. qiskit/circuit/library/standard_gates/s.py +4 -4
  83. qiskit/circuit/library/standard_gates/swap.py +3 -3
  84. qiskit/circuit/library/standard_gates/sx.py +4 -3
  85. qiskit/circuit/library/standard_gates/t.py +2 -2
  86. qiskit/circuit/library/standard_gates/u.py +11 -3
  87. qiskit/circuit/library/standard_gates/u1.py +65 -15
  88. qiskit/circuit/library/standard_gates/u2.py +4 -1
  89. qiskit/circuit/library/standard_gates/u3.py +31 -3
  90. qiskit/circuit/library/standard_gates/x.py +7 -5
  91. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -2
  92. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -2
  93. qiskit/circuit/library/standard_gates/y.py +4 -3
  94. qiskit/circuit/library/standard_gates/z.py +3 -3
  95. qiskit/circuit/library/templates/clifford/clifford_2_1.py +9 -8
  96. qiskit/circuit/library/templates/clifford/clifford_2_2.py +10 -9
  97. qiskit/circuit/library/templates/clifford/clifford_2_3.py +9 -7
  98. qiskit/circuit/library/templates/clifford/clifford_2_4.py +9 -8
  99. qiskit/circuit/library/templates/clifford/clifford_3_1.py +9 -8
  100. qiskit/circuit/library/templates/clifford/clifford_4_1.py +10 -9
  101. qiskit/circuit/library/templates/clifford/clifford_4_2.py +10 -9
  102. qiskit/circuit/library/templates/clifford/clifford_4_3.py +10 -9
  103. qiskit/circuit/library/templates/clifford/clifford_4_4.py +10 -9
  104. qiskit/circuit/library/templates/clifford/clifford_5_1.py +10 -9
  105. qiskit/circuit/library/templates/clifford/clifford_6_1.py +10 -9
  106. qiskit/circuit/library/templates/clifford/clifford_6_2.py +10 -9
  107. qiskit/circuit/library/templates/clifford/clifford_6_3.py +10 -9
  108. qiskit/circuit/library/templates/clifford/clifford_6_4.py +9 -8
  109. qiskit/circuit/library/templates/clifford/clifford_6_5.py +10 -9
  110. qiskit/circuit/library/templates/clifford/clifford_8_1.py +10 -9
  111. qiskit/circuit/library/templates/clifford/clifford_8_2.py +10 -9
  112. qiskit/circuit/library/templates/clifford/clifford_8_3.py +10 -9
  113. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +9 -7
  114. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +10 -8
  115. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +12 -10
  116. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +16 -14
  117. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +14 -12
  118. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +12 -10
  119. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +14 -12
  120. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +12 -10
  121. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +12 -10
  122. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +12 -10
  123. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +12 -10
  124. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +11 -9
  125. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +11 -9
  126. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +12 -10
  127. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +12 -10
  128. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +12 -10
  129. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +12 -10
  130. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +12 -10
  131. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +12 -10
  132. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +13 -11
  133. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +13 -11
  134. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +13 -11
  135. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +13 -11
  136. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +13 -11
  137. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +13 -11
  138. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +11 -9
  139. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +12 -10
  140. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +12 -10
  141. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +12 -10
  142. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +12 -10
  143. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +12 -10
  144. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +12 -10
  145. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +12 -10
  146. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +12 -10
  147. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +12 -10
  148. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +12 -10
  149. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +12 -10
  150. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +11 -9
  151. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +12 -10
  152. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +12 -10
  153. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +12 -10
  154. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +12 -10
  155. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +12 -10
  156. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +12 -10
  157. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +12 -10
  158. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +12 -10
  159. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +12 -10
  160. qiskit/circuit/library/templates/rzx/rzx_cy.py +11 -10
  161. qiskit/circuit/library/templates/rzx/rzx_xz.py +16 -15
  162. qiskit/circuit/library/templates/rzx/rzx_yz.py +12 -10
  163. qiskit/circuit/library/templates/rzx/rzx_zz1.py +22 -20
  164. qiskit/circuit/library/templates/rzx/rzx_zz2.py +16 -15
  165. qiskit/circuit/library/templates/rzx/rzx_zz3.py +17 -15
  166. qiskit/circuit/parameter.py +4 -0
  167. qiskit/circuit/parameterexpression.py +167 -34
  168. qiskit/circuit/quantumcircuit.py +162 -126
  169. qiskit/circuit/singleton.py +2 -0
  170. qiskit/circuit/store.py +2 -0
  171. qiskit/circuit/twirling.py +145 -0
  172. qiskit/compiler/assembler.py +17 -4
  173. qiskit/compiler/scheduler.py +2 -0
  174. qiskit/compiler/sequencer.py +2 -0
  175. qiskit/compiler/transpiler.py +81 -26
  176. qiskit/converters/circuit_to_dag.py +2 -2
  177. qiskit/converters/circuit_to_dagdependency.py +1 -1
  178. qiskit/converters/circuit_to_dagdependency_v2.py +1 -1
  179. qiskit/converters/circuit_to_instruction.py +1 -1
  180. qiskit/converters/dag_to_circuit.py +7 -5
  181. qiskit/converters/dag_to_dagdependency.py +1 -1
  182. qiskit/converters/dag_to_dagdependency_v2.py +1 -1
  183. qiskit/converters/dagdependency_to_circuit.py +5 -1
  184. qiskit/converters/dagdependency_to_dag.py +6 -1
  185. qiskit/dagcircuit/collect_blocks.py +3 -3
  186. qiskit/dagcircuit/dagdependency.py +18 -5
  187. qiskit/dagcircuit/dagdependency_v2.py +1 -1
  188. qiskit/dagcircuit/dagnode.py +2 -2
  189. qiskit/passmanager/__init__.py +2 -2
  190. qiskit/primitives/backend_estimator.py +5 -2
  191. qiskit/primitives/backend_sampler_v2.py +61 -18
  192. qiskit/primitives/base/base_estimator.py +2 -2
  193. qiskit/primitives/containers/data_bin.py +9 -1
  194. qiskit/primitives/statevector_sampler.py +1 -1
  195. qiskit/primitives/utils.py +1 -1
  196. qiskit/providers/__init__.py +3 -3
  197. qiskit/providers/backend.py +12 -1
  198. qiskit/providers/backend_compat.py +23 -3
  199. qiskit/providers/basic_provider/basic_simulator.py +12 -2
  200. qiskit/providers/fake_provider/fake_pulse_backend.py +6 -1
  201. qiskit/providers/fake_provider/generic_backend_v2.py +46 -30
  202. qiskit/providers/models/pulsedefaults.py +2 -0
  203. qiskit/pulse/builder.py +59 -18
  204. qiskit/pulse/calibration_entries.py +4 -1
  205. qiskit/pulse/channels.py +2 -0
  206. qiskit/pulse/exceptions.py +2 -0
  207. qiskit/pulse/instruction_schedule_map.py +21 -6
  208. qiskit/pulse/instructions/acquire.py +2 -0
  209. qiskit/pulse/instructions/delay.py +2 -0
  210. qiskit/pulse/instructions/directives.py +8 -0
  211. qiskit/pulse/instructions/frequency.py +3 -0
  212. qiskit/pulse/instructions/instruction.py +2 -0
  213. qiskit/pulse/instructions/phase.py +3 -0
  214. qiskit/pulse/instructions/play.py +2 -0
  215. qiskit/pulse/instructions/reference.py +2 -0
  216. qiskit/pulse/instructions/snapshot.py +2 -0
  217. qiskit/pulse/library/pulse.py +2 -0
  218. qiskit/pulse/library/symbolic_pulses.py +28 -0
  219. qiskit/pulse/library/waveform.py +2 -0
  220. qiskit/pulse/macros.py +1 -1
  221. qiskit/pulse/schedule.py +12 -13
  222. qiskit/pulse/transforms/alignments.py +5 -3
  223. qiskit/pulse/transforms/dag.py +7 -0
  224. qiskit/qasm2/export.py +5 -3
  225. qiskit/qasm2/parse.py +46 -2
  226. qiskit/qasm3/__init__.py +1 -0
  227. qiskit/qasm3/ast.py +123 -15
  228. qiskit/qasm3/exporter.py +103 -77
  229. qiskit/qobj/converters/pulse_instruction.py +6 -4
  230. qiskit/qpy/__init__.py +181 -0
  231. qiskit/qpy/binary_io/circuits.py +20 -5
  232. qiskit/qpy/binary_io/schedules.py +3 -4
  233. qiskit/qpy/binary_io/value.py +310 -13
  234. qiskit/qpy/common.py +46 -2
  235. qiskit/qpy/formats.py +7 -0
  236. qiskit/qpy/interface.py +40 -4
  237. qiskit/quantum_info/__init__.py +4 -0
  238. qiskit/quantum_info/operators/channel/transformations.py +28 -21
  239. qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
  240. qiskit/quantum_info/operators/operator.py +54 -8
  241. qiskit/quantum_info/operators/symplectic/base_pauli.py +11 -19
  242. qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
  243. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +1 -1
  244. qiskit/quantum_info/operators/symplectic/pauli.py +2 -0
  245. qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
  246. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +23 -2
  247. qiskit/quantum_info/states/densitymatrix.py +5 -5
  248. qiskit/quantum_info/states/stabilizerstate.py +1 -1
  249. qiskit/quantum_info/states/statevector.py +6 -6
  250. qiskit/result/mitigation/base_readout_mitigator.py +1 -1
  251. qiskit/result/mitigation/correlated_readout_mitigator.py +9 -1
  252. qiskit/result/mitigation/local_readout_mitigator.py +9 -1
  253. qiskit/result/mitigation/utils.py +57 -0
  254. qiskit/scheduler/config.py +2 -0
  255. qiskit/scheduler/methods/basic.py +3 -0
  256. qiskit/scheduler/schedule_circuit.py +2 -0
  257. qiskit/scheduler/sequence.py +2 -0
  258. qiskit/synthesis/__init__.py +25 -0
  259. qiskit/synthesis/arithmetic/__init__.py +16 -0
  260. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  261. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  262. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  263. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  264. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  265. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
  266. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
  267. qiskit/synthesis/clifford/clifford_decompose_bm.py +1 -2
  268. qiskit/synthesis/clifford/clifford_decompose_greedy.py +3 -2
  269. qiskit/synthesis/clifford/clifford_decompose_layers.py +2 -1
  270. qiskit/synthesis/evolution/__init__.py +1 -0
  271. qiskit/synthesis/evolution/lie_trotter.py +16 -42
  272. qiskit/synthesis/evolution/pauli_network.py +80 -0
  273. qiskit/synthesis/evolution/product_formula.py +165 -238
  274. qiskit/synthesis/evolution/qdrift.py +36 -29
  275. qiskit/synthesis/evolution/suzuki_trotter.py +87 -27
  276. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  277. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  278. qiskit/synthesis/qft/qft_decompose_full.py +19 -1
  279. qiskit/synthesis/qft/qft_decompose_lnn.py +2 -1
  280. qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -1
  281. qiskit/synthesis/two_qubit/two_qubit_decompose.py +4 -63
  282. qiskit/synthesis/unitary/qsd.py +5 -5
  283. qiskit/transpiler/__init__.py +21 -14
  284. qiskit/transpiler/basepasses.py +1 -1
  285. qiskit/transpiler/passes/__init__.py +2 -0
  286. qiskit/transpiler/passes/basis/basis_translator.py +9 -565
  287. qiskit/transpiler/passes/basis/decompose.py +45 -12
  288. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  289. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
  290. qiskit/transpiler/passes/calibration/pulse_gate.py +4 -2
  291. qiskit/transpiler/passes/calibration/rx_builder.py +11 -7
  292. qiskit/transpiler/passes/calibration/rzx_builder.py +46 -30
  293. qiskit/transpiler/passes/layout/disjoint_utils.py +15 -13
  294. qiskit/transpiler/passes/layout/sabre_layout.py +7 -2
  295. qiskit/transpiler/passes/layout/sabre_pre_layout.py +5 -0
  296. qiskit/transpiler/passes/optimization/__init__.py +1 -0
  297. qiskit/transpiler/passes/optimization/collect_cliffords.py +19 -3
  298. qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
  299. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
  300. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
  301. qiskit/transpiler/passes/optimization/consolidate_blocks.py +48 -131
  302. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +4 -2
  303. qiskit/transpiler/passes/optimization/elide_permutations.py +9 -32
  304. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +5 -11
  305. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
  306. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
  307. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
  308. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
  309. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
  310. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
  311. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
  312. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
  313. qiskit/transpiler/passes/routing/sabre_swap.py +7 -3
  314. qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
  315. qiskit/transpiler/passes/scheduling/alap.py +1 -1
  316. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
  317. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
  318. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -0
  319. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
  320. qiskit/transpiler/passes/scheduling/asap.py +1 -1
  321. qiskit/transpiler/passes/scheduling/base_scheduler.py +14 -12
  322. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +9 -4
  323. qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
  324. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +16 -5
  325. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +4 -1
  326. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +6 -2
  327. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +9 -4
  328. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +262 -99
  329. qiskit/transpiler/passes/synthesis/hls_plugins.py +637 -7
  330. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
  331. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +55 -34
  332. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +2 -56
  333. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +5 -0
  334. qiskit/transpiler/passes/utils/gate_direction.py +12 -275
  335. qiskit/transpiler/passes/utils/gates_basis.py +7 -30
  336. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +2 -1
  337. qiskit/transpiler/passmanager_config.py +22 -4
  338. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +40 -14
  339. qiskit/transpiler/preset_passmanagers/common.py +5 -3
  340. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +125 -42
  341. qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
  342. qiskit/transpiler/target.py +74 -16
  343. qiskit/utils/deprecate_pulse.py +119 -0
  344. qiskit/visualization/circuit/_utils.py +2 -2
  345. qiskit/visualization/circuit/circuit_visualization.py +3 -2
  346. qiskit/visualization/circuit/matplotlib.py +1 -1
  347. qiskit/visualization/dag_visualization.py +1 -1
  348. qiskit/visualization/pass_manager_visualization.py +3 -14
  349. qiskit/visualization/pulse_v2/interface.py +3 -1
  350. qiskit/visualization/timeline/core.py +25 -2
  351. qiskit/visualization/timeline/interface.py +12 -0
  352. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/METADATA +9 -8
  353. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/RECORD +357 -346
  354. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/WHEEL +1 -1
  355. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/entry_points.txt +19 -0
  356. qiskit/circuit/library/data_preparation/zz_feature_map.py +0 -118
  357. qiskit/synthesis/two_qubit/weyl.py +0 -97
  358. qiskit/transpiler/passes/synthesis/qubit_tracker.py +0 -132
  359. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/LICENSE.txt +0 -0
  360. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/top_level.txt +0 -0
@@ -47,6 +47,7 @@ from qiskit.circuit.gate import Gate
47
47
  from qiskit.circuit.parameter import Parameter
48
48
  from qiskit.circuit.exceptions import CircuitError
49
49
  from qiskit.utils import deprecate_func
50
+ from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
50
51
  from . import _classical_resource_map
51
52
  from .controlflow import ControlFlowOp, _builder_utils
52
53
  from .controlflow.builder import CircuitScopeInterface, ControlFlowBuilderBlock
@@ -70,6 +71,7 @@ from .quantumcircuitdata import QuantumCircuitData, CircuitInstruction
70
71
  from .delay import Delay
71
72
  from .store import Store
72
73
 
74
+
73
75
  if typing.TYPE_CHECKING:
74
76
  import qiskit # pylint: disable=cyclic-import
75
77
  from qiskit.transpiler.layout import TranspileLayout # pylint: disable=cyclic-import
@@ -876,7 +878,7 @@ class QuantumCircuit:
876
878
 
877
879
  qc.count_ops()
878
880
 
879
- .. parsed-literal::
881
+ .. code-block:: text
880
882
 
881
883
  OrderedDict([('cx', 8), ('h', 5), ('x', 3), ('swap', 3)])
882
884
 
@@ -1145,21 +1147,41 @@ class QuantumCircuit:
1145
1147
  for var, initial in declarations:
1146
1148
  self.add_var(var, initial)
1147
1149
 
1148
- self.duration: int | float | None = None
1149
- """The total duration of the circuit, set by a scheduling transpiler pass. Its unit is
1150
- specified by :attr:`unit`."""
1151
- self.unit = "dt"
1152
- """The unit that :attr:`duration` is specified in."""
1150
+ self._duration = None
1151
+ self._unit = "dt"
1153
1152
  self.metadata = {} if metadata is None else metadata
1154
1153
  """Arbitrary user-defined metadata for the circuit.
1155
-
1154
+
1156
1155
  Qiskit will not examine the content of this mapping, but it will pass it through the
1157
1156
  transpiler and reattach it to the output, so you can track your own metadata."""
1158
1157
 
1158
+ @property
1159
+ @deprecate_func(since="1.3.0", removal_timeline="in Qiskit 2.0.0", is_property=True)
1160
+ def duration(self):
1161
+ """The total duration of the circuit, set by a scheduling transpiler pass. Its unit is
1162
+ specified by :attr:`unit`."""
1163
+ return self._duration
1164
+
1165
+ @duration.setter
1166
+ def duration(self, value: int | float | None):
1167
+ self._duration = value
1168
+
1169
+ @property
1170
+ @deprecate_func(since="1.3.0", removal_timeline="in Qiskit 2.0.0", is_property=True)
1171
+ def unit(self):
1172
+ """The unit that :attr:`duration` is specified in."""
1173
+ return self._unit
1174
+
1175
+ @unit.setter
1176
+ def unit(self, value):
1177
+ self._unit = value
1178
+
1159
1179
  @classmethod
1160
- def _from_circuit_data(cls, data: CircuitData, add_regs: bool = False) -> typing.Self:
1180
+ def _from_circuit_data(
1181
+ cls, data: CircuitData, add_regs: bool = False, name: str | None = None
1182
+ ) -> typing.Self:
1161
1183
  """A private constructor from rust space circuit data."""
1162
- out = QuantumCircuit()
1184
+ out = QuantumCircuit(name=name)
1163
1185
 
1164
1186
  if data.num_qubits > 0:
1165
1187
  if add_regs:
@@ -1321,15 +1343,17 @@ class QuantumCircuit:
1321
1343
  return self._op_start_times
1322
1344
 
1323
1345
  @property
1346
+ @deprecate_pulse_dependency(is_property=True)
1324
1347
  def calibrations(self) -> dict:
1325
1348
  """Return calibration dictionary.
1326
1349
 
1327
1350
  The custom pulse definition of a given gate is of the form
1328
1351
  ``{'gate_name': {(qubits, params): schedule}}``
1329
1352
  """
1330
- return dict(self._calibrations)
1353
+ return self._calibrations_prop
1331
1354
 
1332
1355
  @calibrations.setter
1356
+ @deprecate_pulse_dependency(is_property=True)
1333
1357
  def calibrations(self, calibrations: dict):
1334
1358
  """Set the circuit calibration data from a dictionary of calibration definition.
1335
1359
 
@@ -1337,18 +1361,37 @@ class QuantumCircuit:
1337
1361
  calibrations (dict): A dictionary of input in the format
1338
1362
  ``{'gate_name': {(qubits, gate_params): schedule}}``
1339
1363
  """
1364
+ self._calibrations_prop = calibrations
1365
+
1366
+ @property
1367
+ def _calibrations_prop(self) -> dict:
1368
+ """An alternative private path to the `calibrations` property for
1369
+ avoiding deprecation warnings."""
1370
+ return dict(self._calibrations)
1371
+
1372
+ @_calibrations_prop.setter
1373
+ def _calibrations_prop(self, calibrations: dict):
1374
+ """An alternative private path to the `calibrations` property for
1375
+ avoiding deprecation warnings."""
1340
1376
  self._calibrations = defaultdict(dict, calibrations)
1341
1377
 
1378
+ @deprecate_pulse_dependency
1342
1379
  def has_calibration_for(self, instruction: CircuitInstruction | tuple):
1343
1380
  """Return True if the circuit has a calibration defined for the instruction context. In this
1344
1381
  case, the operation does not need to be translated to the device basis.
1345
1382
  """
1383
+
1384
+ return self._has_calibration_for(instruction)
1385
+
1386
+ def _has_calibration_for(self, instruction: CircuitInstruction | tuple):
1387
+ """An alternative private path to the `has_calibration_for` method for
1388
+ avoiding deprecation warnings."""
1346
1389
  if isinstance(instruction, CircuitInstruction):
1347
1390
  operation = instruction.operation
1348
1391
  qubits = instruction.qubits
1349
1392
  else:
1350
1393
  operation, qubits, _ = instruction
1351
- if not self.calibrations or operation.name not in self.calibrations:
1394
+ if not self._calibrations_prop or operation.name not in self._calibrations_prop:
1352
1395
  return False
1353
1396
  qubits = tuple(self.qubits.index(qubit) for qubit in qubits)
1354
1397
  params = []
@@ -1358,7 +1401,7 @@ class QuantumCircuit:
1358
1401
  else:
1359
1402
  params.append(p)
1360
1403
  params = tuple(params)
1361
- return (qubits, params) in self.calibrations[operation.name]
1404
+ return (qubits, params) in self._calibrations_prop[operation.name]
1362
1405
 
1363
1406
  @property
1364
1407
  def metadata(self) -> dict:
@@ -1494,7 +1537,7 @@ class QuantumCircuit:
1494
1537
 
1495
1538
  input:
1496
1539
 
1497
- .. parsed-literal::
1540
+ .. code-block:: text
1498
1541
 
1499
1542
  ┌───┐
1500
1543
  q_0: ┤ H ├─────■──────
@@ -1504,7 +1547,7 @@ class QuantumCircuit:
1504
1547
 
1505
1548
  output:
1506
1549
 
1507
- .. parsed-literal::
1550
+ .. code-block:: text
1508
1551
 
1509
1552
  ┌───┐
1510
1553
  q_0: ─────■──────┤ H ├
@@ -1538,7 +1581,7 @@ class QuantumCircuit:
1538
1581
 
1539
1582
  input:
1540
1583
 
1541
- .. parsed-literal::
1584
+ .. code-block:: text
1542
1585
 
1543
1586
  ┌───┐
1544
1587
  a_0: ┤ H ├──■─────────────────
@@ -1554,7 +1597,7 @@ class QuantumCircuit:
1554
1597
 
1555
1598
  output:
1556
1599
 
1557
- .. parsed-literal::
1600
+ .. code-block:: text
1558
1601
 
1559
1602
  ┌───┐
1560
1603
  b_0: ────────────────────┤ X ├
@@ -1608,7 +1651,7 @@ class QuantumCircuit:
1608
1651
 
1609
1652
  input:
1610
1653
 
1611
- .. parsed-literal::
1654
+ .. code-block:: text
1612
1655
 
1613
1656
  ┌───┐
1614
1657
  q_0: ┤ H ├─────■──────
@@ -1618,7 +1661,7 @@ class QuantumCircuit:
1618
1661
 
1619
1662
  output:
1620
1663
 
1621
- .. parsed-literal::
1664
+ .. code-block:: text
1622
1665
 
1623
1666
  ┌───┐
1624
1667
  q_0: ──────■──────┤ H ├
@@ -1860,7 +1903,7 @@ class QuantumCircuit:
1860
1903
 
1861
1904
  >>> lhs.compose(rhs, qubits=[3, 2], inplace=True)
1862
1905
 
1863
- .. parsed-literal::
1906
+ .. code-block:: text
1864
1907
 
1865
1908
  ┌───┐ ┌─────┐ ┌───┐
1866
1909
  lqr_1_0: ───┤ H ├─── rqr_0: ──■──┤ Tdg ├ lqr_1_0: ───┤ H ├───────────────
@@ -1999,7 +2042,7 @@ class QuantumCircuit:
1999
2042
  )
2000
2043
  edge_map.update(zip(other.clbits, dest._cbit_argument_conversion(clbits)))
2001
2044
 
2002
- for gate, cals in other.calibrations.items():
2045
+ for gate, cals in other._calibrations_prop.items():
2003
2046
  dest._calibrations[gate].update(cals)
2004
2047
 
2005
2048
  dest.duration = None
@@ -2061,14 +2104,14 @@ class QuantumCircuit:
2061
2104
  is_control_flow = isinstance(n_op, ControlFlowOp)
2062
2105
  if (
2063
2106
  not is_control_flow
2064
- and (condition := getattr(n_op, "condition", None)) is not None
2107
+ and (condition := getattr(n_op, "_condition", None)) is not None
2065
2108
  ):
2066
2109
  n_op = n_op.copy() if n_op is op and copy else n_op
2067
2110
  n_op.condition = variable_mapper.map_condition(condition)
2068
2111
  elif is_control_flow:
2069
2112
  n_op = n_op.replace_blocks(recurse_block(block) for block in n_op.blocks)
2070
2113
  if isinstance(n_op, (IfElseOp, WhileLoopOp)):
2071
- n_op.condition = variable_mapper.map_condition(n_op.condition)
2114
+ n_op.condition = variable_mapper.map_condition(n_op._condition)
2072
2115
  elif isinstance(n_op, SwitchCaseOp):
2073
2116
  n_op.target = variable_mapper.map_target(n_op.target)
2074
2117
  elif isinstance(n_op, Store):
@@ -2108,10 +2151,10 @@ class QuantumCircuit:
2108
2151
 
2109
2152
  Remember that in the little-endian convention the leftmost operation will be at the bottom
2110
2153
  of the circuit. See also
2111
- `the docs <https://docs.quantum.ibm.com/build/circuit-construction>`__
2154
+ `the docs <https://docs.quantum.ibm.com/guides/construct-circuits>`__
2112
2155
  for more information.
2113
2156
 
2114
- .. parsed-literal::
2157
+ .. code-block:: text
2115
2158
 
2116
2159
  ┌────────┐ ┌─────┐ ┌─────┐
2117
2160
  q_0: ┤ bottom ├ ⊗ q_0: ┤ top ├ = q_0: ─┤ top ├──
@@ -2692,7 +2735,10 @@ class QuantumCircuit:
2692
2735
  """
2693
2736
  if isinstance(name_or_param, str):
2694
2737
  return self.get_parameter(name_or_param, None) is not None
2695
- return self.get_parameter(name_or_param.name) == name_or_param
2738
+ return (
2739
+ isinstance(name_or_param, Parameter)
2740
+ and self.get_parameter(name_or_param.name, None) == name_or_param
2741
+ )
2696
2742
 
2697
2743
  @typing.overload
2698
2744
  def get_var(self, name: str, default: T) -> Union[expr.Var, T]: ...
@@ -3211,40 +3257,33 @@ class QuantumCircuit:
3211
3257
 
3212
3258
  def decompose(
3213
3259
  self,
3214
- gates_to_decompose: Type[Gate] | Sequence[Type[Gate]] | Sequence[str] | str | None = None,
3260
+ gates_to_decompose: (
3261
+ str | Type[Instruction] | Sequence[str | Type[Instruction]] | None
3262
+ ) = None,
3215
3263
  reps: int = 1,
3216
- ) -> "QuantumCircuit":
3217
- """Call a decomposition pass on this circuit,
3218
- to decompose one level (shallow decompose).
3264
+ ) -> typing.Self:
3265
+ """Call a decomposition pass on this circuit, to decompose one level (shallow decompose).
3219
3266
 
3220
3267
  Args:
3221
- gates_to_decompose (type or str or list(type, str)): Optional subset of gates
3222
- to decompose. Can be a gate type, such as ``HGate``, or a gate name, such
3223
- as 'h', or a gate label, such as 'My H Gate', or a list of any combination
3224
- of these. If a gate name is entered, it will decompose all gates with that
3225
- name, whether the gates have labels or not. Defaults to all gates in circuit.
3226
- reps (int): Optional number of times the circuit should be decomposed.
3268
+ gates_to_decompose: Optional subset of gates to decompose. Can be a gate type, such as
3269
+ ``HGate``, or a gate name, such as "h", or a gate label, such as "My H Gate", or a
3270
+ list of any combination of these. If a gate name is entered, it will decompose all
3271
+ gates with that name, whether the gates have labels or not. Defaults to all gates in
3272
+ the circuit.
3273
+ reps: Optional number of times the circuit should be decomposed.
3227
3274
  For instance, ``reps=2`` equals calling ``circuit.decompose().decompose()``.
3228
- can decompose specific gates specific time
3229
3275
 
3230
3276
  Returns:
3231
3277
  QuantumCircuit: a circuit one level decomposed
3232
3278
  """
3233
3279
  # pylint: disable=cyclic-import
3234
3280
  from qiskit.transpiler.passes.basis.decompose import Decompose
3235
- from qiskit.transpiler.passes.synthesis import HighLevelSynthesis
3236
3281
  from qiskit.converters.circuit_to_dag import circuit_to_dag
3237
3282
  from qiskit.converters.dag_to_circuit import dag_to_circuit
3238
3283
 
3239
3284
  dag = circuit_to_dag(self, copy_operations=True)
3240
3285
 
3241
- if gates_to_decompose is None:
3242
- # We should not rewrite the circuit using HLS when we have gates_to_decompose,
3243
- # or else HLS will rewrite all objects with available plugins (e.g., Cliffords,
3244
- # PermutationGates, and now also MCXGates)
3245
- dag = HighLevelSynthesis().run(dag)
3246
-
3247
- pass_ = Decompose(gates_to_decompose)
3286
+ pass_ = Decompose(gates_to_decompose, apply_synthesis=True)
3248
3287
  for _ in range(reps):
3249
3288
  dag = pass_.run(dag)
3250
3289
 
@@ -3486,7 +3525,7 @@ class QuantumCircuit:
3486
3525
 
3487
3526
  for instruction in self._data:
3488
3527
  objects = set(itertools.chain(instruction.qubits, instruction.clbits))
3489
- if (condition := getattr(instruction.operation, "condition", None)) is not None:
3528
+ if (condition := getattr(instruction.operation, "_condition", None)) is not None:
3490
3529
  objects.update(_builder_utils.condition_resources(condition).clbits)
3491
3530
  if isinstance(condition, expr.Expr):
3492
3531
  update_from_expr(objects, condition)
@@ -3589,7 +3628,7 @@ class QuantumCircuit:
3589
3628
  else:
3590
3629
  args = instruction.qubits + instruction.clbits
3591
3630
  num_qargs = len(args) + (
3592
- 1 if getattr(instruction.operation, "condition", None) else 0
3631
+ 1 if getattr(instruction.operation, "_condition", None) else 0
3593
3632
  )
3594
3633
 
3595
3634
  if num_qargs >= 2 and not getattr(instruction.operation, "_directive", False):
@@ -3715,39 +3754,13 @@ class QuantumCircuit:
3715
3754
  f"invalid name for a circuit: '{name}'. The name must be a string or 'None'."
3716
3755
  )
3717
3756
  cpy = _copy.copy(self)
3718
- # copy registers correctly, in copy.copy they are only copied via reference
3719
- cpy.qregs = self.qregs.copy()
3720
- cpy.cregs = self.cregs.copy()
3721
- cpy._builder_api = _OuterCircuitScopeInterface(cpy)
3722
- cpy._ancillas = self._ancillas.copy()
3723
- cpy._qubit_indices = self._qubit_indices.copy()
3724
- cpy._clbit_indices = self._clbit_indices.copy()
3725
-
3726
- if vars_mode == "alike":
3727
- # Note that this causes the local variables to be uninitialised, because the stores are
3728
- # not copied. This can leave the circuit in a potentially dangerous state for users if
3729
- # they don't re-add initializer stores.
3730
- cpy._vars_local = self._vars_local.copy()
3731
- cpy._vars_input = self._vars_input.copy()
3732
- cpy._vars_capture = self._vars_capture.copy()
3733
- elif vars_mode == "captures":
3734
- cpy._vars_local = {}
3735
- cpy._vars_input = {}
3736
- cpy._vars_capture = {var.name: var for var in self.iter_vars()}
3737
- elif vars_mode == "drop":
3738
- cpy._vars_local = {}
3739
- cpy._vars_input = {}
3740
- cpy._vars_capture = {}
3741
- else: # pragma: no cover
3742
- raise ValueError(f"unknown vars_mode: '{vars_mode}'")
3757
+
3758
+ _copy_metadata(self, cpy, vars_mode)
3743
3759
 
3744
3760
  cpy._data = CircuitData(
3745
3761
  self._data.qubits, self._data.clbits, global_phase=self._data.global_phase
3746
3762
  )
3747
3763
 
3748
- cpy._calibrations = _copy.deepcopy(self._calibrations)
3749
- cpy._metadata = _copy.deepcopy(self._metadata)
3750
-
3751
3764
  if name:
3752
3765
  cpy.name = name
3753
3766
  return cpy
@@ -3863,7 +3876,7 @@ class QuantumCircuit:
3863
3876
  circuit.draw()
3864
3877
 
3865
3878
 
3866
- .. parsed-literal::
3879
+ .. code-block:: text
3867
3880
 
3868
3881
  ┌───┐┌─┐
3869
3882
  q: ┤ H ├┤M├
@@ -4337,30 +4350,57 @@ class QuantumCircuit:
4337
4350
 
4338
4351
  if isinstance(parameters, collections.abc.Mapping):
4339
4352
  raw_mapping = parameters if flat_input else self._unroll_param_dict(parameters)
4340
- our_parameters = self._data.unsorted_parameters()
4341
- if strict and (extras := raw_mapping.keys() - our_parameters):
4353
+ if strict and (
4354
+ extras := [
4355
+ parameter for parameter in raw_mapping if not self.has_parameter(parameter)
4356
+ ]
4357
+ ):
4342
4358
  raise CircuitError(
4343
4359
  f"Cannot bind parameters ({', '.join(str(x) for x in extras)}) not present in"
4344
4360
  " the circuit."
4345
4361
  )
4346
- parameter_binds = _ParameterBindsDict(raw_mapping, our_parameters)
4347
- target._data.assign_parameters_mapping(parameter_binds)
4362
+
4363
+ def create_mapping_view():
4364
+ return raw_mapping
4365
+
4366
+ target._data.assign_parameters_mapping(raw_mapping)
4348
4367
  else:
4349
- parameter_binds = _ParameterBindsSequence(target._data.parameters, parameters)
4368
+ # This should be a cache retrieval, since we warmed the cache. We need to keep hold of
4369
+ # what the parameters were before anything is assigned, because we assign parameters in
4370
+ # the calibrations (which aren't tracked in the internal parameter table) after, which
4371
+ # would change what we create. We don't make the full Python-space mapping object of
4372
+ # parameters to values eagerly because 99.9% of the time we don't need it, and it's
4373
+ # relatively expensive to do for large numbers of parameters.
4374
+ initial_parameters = target._data.parameters
4375
+
4376
+ def create_mapping_view():
4377
+ return dict(zip(initial_parameters, parameters))
4378
+
4350
4379
  target._data.assign_parameters_iterable(parameters)
4351
4380
 
4352
4381
  # Finally, assign the parameters inside any of the calibrations. We don't track these in
4353
- # the `ParameterTable`, so we manually reconstruct things.
4382
+ # the `ParameterTable`, so we manually reconstruct things. We lazily construct the mapping
4383
+ # `{parameter: bound_value}` the first time we encounter a binding (we have to scan for
4384
+ # this, because calibrations don't use a parameter-table lookup), rather than always paying
4385
+ # the cost - most circuits don't have parametric calibrations, and it's expensive.
4386
+ mapping_view = None
4387
+
4354
4388
  def map_calibration(qubits, parameters, schedule):
4389
+ # All calls to this function should share the same `{Parameter: bound_value}` mapping,
4390
+ # which we only want to lazily construct a single time.
4391
+ nonlocal mapping_view
4392
+ if mapping_view is None:
4393
+ mapping_view = create_mapping_view()
4394
+
4355
4395
  modified = False
4356
4396
  new_parameters = list(parameters)
4357
4397
  for i, parameter in enumerate(new_parameters):
4358
4398
  if not isinstance(parameter, ParameterExpression):
4359
4399
  continue
4360
- if not (contained := parameter.parameters & parameter_binds.mapping.keys()):
4400
+ if not (contained := parameter.parameters & mapping_view.keys()):
4361
4401
  continue
4362
4402
  for to_bind in contained:
4363
- parameter = parameter.assign(to_bind, parameter_binds.mapping[to_bind])
4403
+ parameter = parameter.assign(to_bind, mapping_view[to_bind])
4364
4404
  if not parameter.parameters:
4365
4405
  parameter = parameter.numeric()
4366
4406
  if isinstance(parameter, complex):
@@ -4368,7 +4408,7 @@ class QuantumCircuit:
4368
4408
  new_parameters[i] = parameter
4369
4409
  modified = True
4370
4410
  if modified:
4371
- schedule.assign_parameters(parameter_binds.mapping)
4411
+ schedule.assign_parameters(mapping_view)
4372
4412
  return (qubits, tuple(new_parameters)), schedule
4373
4413
 
4374
4414
  target._calibrations = defaultdict(
@@ -5691,7 +5731,7 @@ class QuantumCircuit:
5691
5731
 
5692
5732
  output:
5693
5733
 
5694
- .. parsed-literal::
5734
+ .. code-block:: text
5695
5735
 
5696
5736
  ┌─────────────────────────────────────┐
5697
5737
  q_0: ┤ State Preparation(0.70711,-0.70711) ├
@@ -5714,7 +5754,7 @@ class QuantumCircuit:
5714
5754
 
5715
5755
  output:
5716
5756
 
5717
- .. parsed-literal::
5757
+ .. code-block:: text
5718
5758
 
5719
5759
  ┌─────────────────────────┐
5720
5760
  q_0: ┤0 ├
@@ -5735,7 +5775,7 @@ class QuantumCircuit:
5735
5775
 
5736
5776
  output:
5737
5777
 
5738
- .. parsed-literal::
5778
+ .. code-block:: text
5739
5779
 
5740
5780
  ┌───────────────────────────────────────────┐
5741
5781
  q_0: ┤0 ├
@@ -5806,7 +5846,7 @@ class QuantumCircuit:
5806
5846
 
5807
5847
  output:
5808
5848
 
5809
- .. parsed-literal::
5849
+ .. code-block:: text
5810
5850
 
5811
5851
  ┌──────────────────────────────┐
5812
5852
  q_0: ┤ Initialize(0.70711,-0.70711) ├
@@ -5829,7 +5869,7 @@ class QuantumCircuit:
5829
5869
 
5830
5870
  output:
5831
5871
 
5832
- .. parsed-literal::
5872
+ .. code-block:: text
5833
5873
 
5834
5874
  ┌──────────────────┐
5835
5875
  q_0: ┤0 ├
@@ -5850,7 +5890,7 @@ class QuantumCircuit:
5850
5890
 
5851
5891
  output:
5852
5892
 
5853
- .. parsed-literal::
5893
+ .. code-block:: text
5854
5894
 
5855
5895
  ┌────────────────────────────────────┐
5856
5896
  q_0: ┤0 ├
@@ -6466,6 +6506,7 @@ class QuantumCircuit:
6466
6506
  ContinueLoopOp(self.num_qubits, self.num_clbits), self.qubits, self.clbits, copy=False
6467
6507
  )
6468
6508
 
6509
+ @deprecate_pulse_dependency
6469
6510
  def add_calibration(
6470
6511
  self,
6471
6512
  gate: Union[Gate, str],
@@ -6691,42 +6732,6 @@ def _validate_expr(circuit_scope: CircuitScopeInterface, node: expr.Expr) -> exp
6691
6732
  return node
6692
6733
 
6693
6734
 
6694
- class _ParameterBindsDict:
6695
- __slots__ = ("mapping", "allowed_keys")
6696
-
6697
- def __init__(self, mapping, allowed_keys):
6698
- self.mapping = mapping
6699
- self.allowed_keys = allowed_keys
6700
-
6701
- def items(self):
6702
- """Iterator through all the keys in the mapping that we care about. Wrapping the main
6703
- mapping allows us to avoid reconstructing a new 'dict', but just use the given 'mapping'
6704
- without any copy / reconstruction."""
6705
- for parameter, value in self.mapping.items():
6706
- if parameter in self.allowed_keys:
6707
- yield parameter, value
6708
-
6709
-
6710
- class _ParameterBindsSequence:
6711
- __slots__ = ("parameters", "values", "mapping_cache")
6712
-
6713
- def __init__(self, parameters, values):
6714
- self.parameters = parameters
6715
- self.values = values
6716
- self.mapping_cache = None
6717
-
6718
- def items(self):
6719
- """Iterator through all the keys in the mapping that we care about."""
6720
- return zip(self.parameters, self.values)
6721
-
6722
- @property
6723
- def mapping(self):
6724
- """Cached version of a mapping. This is only generated on demand."""
6725
- if self.mapping_cache is None:
6726
- self.mapping_cache = dict(zip(self.parameters, self.values))
6727
- return self.mapping_cache
6728
-
6729
-
6730
6735
  def _bit_argument_conversion(specifier, bit_sequence, bit_set, type_) -> list[Bit]:
6731
6736
  """Get the list of bits referred to by the specifier ``specifier``.
6732
6737
 
@@ -6791,3 +6796,34 @@ def _bit_argument_conversion_scalar(specifier, bit_sequence, bit_set, type_):
6791
6796
  else f"Invalid bit index: '{specifier}' of type '{type(specifier)}'"
6792
6797
  )
6793
6798
  raise CircuitError(message)
6799
+
6800
+
6801
+ def _copy_metadata(original, cpy, vars_mode):
6802
+ # copy registers correctly, in copy.copy they are only copied via reference
6803
+ cpy.qregs = original.qregs.copy()
6804
+ cpy.cregs = original.cregs.copy()
6805
+ cpy._builder_api = _OuterCircuitScopeInterface(cpy)
6806
+ cpy._ancillas = original._ancillas.copy()
6807
+ cpy._qubit_indices = original._qubit_indices.copy()
6808
+ cpy._clbit_indices = original._clbit_indices.copy()
6809
+
6810
+ if vars_mode == "alike":
6811
+ # Note that this causes the local variables to be uninitialised, because the stores are
6812
+ # not copied. This can leave the circuit in a potentially dangerous state for users if
6813
+ # they don't re-add initializer stores.
6814
+ cpy._vars_local = original._vars_local.copy()
6815
+ cpy._vars_input = original._vars_input.copy()
6816
+ cpy._vars_capture = original._vars_capture.copy()
6817
+ elif vars_mode == "captures":
6818
+ cpy._vars_local = {}
6819
+ cpy._vars_input = {}
6820
+ cpy._vars_capture = {var.name: var for var in original.iter_vars()}
6821
+ elif vars_mode == "drop":
6822
+ cpy._vars_local = {}
6823
+ cpy._vars_input = {}
6824
+ cpy._vars_capture = {}
6825
+ else: # pragma: no cover
6826
+ raise ValueError(f"unknown vars_mode: '{vars_mode}'")
6827
+
6828
+ cpy._calibrations = _copy.deepcopy(original._calibrations)
6829
+ cpy._metadata = _copy.deepcopy(original._metadata)
@@ -251,6 +251,7 @@ from __future__ import annotations
251
251
 
252
252
  import functools
253
253
 
254
+ from qiskit.utils import deprecate_func
254
255
  from .instruction import Instruction
255
256
  from .gate import Gate
256
257
  from .controlledgate import ControlledGate, _ctrl_state_to_int
@@ -489,6 +490,7 @@ class _SingletonInstructionOverrides(Instruction):
489
490
  instruction._params = _frozenlist(instruction._params)
490
491
  return instruction
491
492
 
493
+ @deprecate_func(since="1.3.0", removal_timeline="in 2.0.0")
492
494
  def c_if(self, classical, val):
493
495
  return self.to_mutable().c_if(classical, val)
494
496
 
qiskit/circuit/store.py CHANGED
@@ -16,6 +16,7 @@ from __future__ import annotations
16
16
 
17
17
  import typing
18
18
 
19
+ from qiskit.utils import deprecate_func
19
20
  from .exceptions import CircuitError
20
21
  from .classical import expr, types
21
22
  from .instruction import Instruction
@@ -88,6 +89,7 @@ class Store(Instruction):
88
89
  """Get the r-value :class:`~.expr.Expr` node that is being written into the l-value."""
89
90
  return self.params[1]
90
91
 
92
+ @deprecate_func(since="1.3.0", removal_timeline="in 2.0.0")
91
93
  def c_if(self, classical, val):
92
94
  """:meta hidden:"""
93
95
  raise NotImplementedError(