qiskit 1.1.1__cp38-abi3-win32.whl → 1.2.0__cp38-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 (347) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +27 -24
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/_numpy_compat.py +1 -1
  5. qiskit/assembler/assemble_circuits.py +107 -64
  6. qiskit/assembler/assemble_schedules.py +5 -12
  7. qiskit/assembler/disassemble.py +10 -1
  8. qiskit/circuit/__init__.py +6 -3
  9. qiskit/circuit/_classical_resource_map.py +5 -5
  10. qiskit/circuit/_utils.py +0 -13
  11. qiskit/circuit/add_control.py +1 -1
  12. qiskit/circuit/annotated_operation.py +23 -1
  13. qiskit/circuit/classical/expr/expr.py +4 -4
  14. qiskit/circuit/classical/expr/visitors.py +1 -1
  15. qiskit/circuit/classical/types/__init__.py +1 -1
  16. qiskit/circuit/classical/types/types.py +2 -2
  17. qiskit/circuit/classicalfunction/__init__.py +8 -0
  18. qiskit/circuit/classicalfunction/boolean_expression.py +1 -1
  19. qiskit/circuit/classicalfunction/classical_function_visitor.py +5 -5
  20. qiskit/circuit/classicalfunction/utils.py +1 -1
  21. qiskit/circuit/classicalregister.py +1 -1
  22. qiskit/circuit/commutation_checker.py +83 -35
  23. qiskit/circuit/controlflow/_builder_utils.py +1 -1
  24. qiskit/circuit/controlflow/builder.py +10 -6
  25. qiskit/circuit/controlflow/if_else.py +2 -2
  26. qiskit/circuit/controlflow/switch_case.py +1 -1
  27. qiskit/circuit/delay.py +1 -1
  28. qiskit/circuit/duration.py +2 -2
  29. qiskit/circuit/equivalence.py +5 -7
  30. qiskit/circuit/gate.py +11 -8
  31. qiskit/circuit/instruction.py +31 -13
  32. qiskit/circuit/instructionset.py +2 -5
  33. qiskit/circuit/library/__init__.py +2 -1
  34. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +1 -1
  35. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
  36. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +1 -1
  37. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +1 -1
  38. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +3 -3
  39. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +1 -1
  40. qiskit/circuit/library/basis_change/__init__.py +1 -1
  41. qiskit/circuit/library/basis_change/qft.py +40 -6
  42. qiskit/circuit/library/blueprintcircuit.py +3 -5
  43. qiskit/circuit/library/data_preparation/__init__.py +9 -2
  44. qiskit/circuit/library/data_preparation/initializer.py +8 -0
  45. qiskit/circuit/library/data_preparation/state_preparation.py +98 -178
  46. qiskit/circuit/library/generalized_gates/isometry.py +8 -8
  47. qiskit/circuit/library/generalized_gates/linear_function.py +3 -2
  48. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +4 -4
  49. qiskit/circuit/library/generalized_gates/permutation.py +8 -9
  50. qiskit/circuit/library/generalized_gates/uc.py +3 -3
  51. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +2 -2
  52. qiskit/circuit/library/generalized_gates/unitary.py +13 -11
  53. qiskit/circuit/library/graph_state.py +1 -1
  54. qiskit/circuit/library/hamiltonian_gate.py +1 -2
  55. qiskit/circuit/library/hidden_linear_function.py +1 -1
  56. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +3 -2
  57. qiskit/circuit/library/n_local/n_local.py +4 -5
  58. qiskit/circuit/library/n_local/pauli_two_design.py +1 -1
  59. qiskit/circuit/library/n_local/qaoa_ansatz.py +6 -8
  60. qiskit/circuit/library/n_local/two_local.py +1 -1
  61. qiskit/circuit/library/overlap.py +11 -5
  62. qiskit/circuit/library/pauli_evolution.py +7 -3
  63. qiskit/circuit/library/standard_gates/dcx.py +3 -0
  64. qiskit/circuit/library/standard_gates/ecr.py +3 -0
  65. qiskit/circuit/library/standard_gates/global_phase.py +3 -0
  66. qiskit/circuit/library/standard_gates/h.py +13 -5
  67. qiskit/circuit/library/standard_gates/i.py +3 -0
  68. qiskit/circuit/library/standard_gates/iswap.py +3 -0
  69. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +19 -10
  70. qiskit/circuit/library/standard_gates/p.py +14 -9
  71. qiskit/circuit/library/standard_gates/r.py +3 -0
  72. qiskit/circuit/library/standard_gates/rx.py +21 -6
  73. qiskit/circuit/library/standard_gates/rxx.py +40 -1
  74. qiskit/circuit/library/standard_gates/ry.py +21 -6
  75. qiskit/circuit/library/standard_gates/ryy.py +40 -1
  76. qiskit/circuit/library/standard_gates/rz.py +22 -6
  77. qiskit/circuit/library/standard_gates/rzx.py +40 -1
  78. qiskit/circuit/library/standard_gates/rzz.py +41 -2
  79. qiskit/circuit/library/standard_gates/s.py +77 -0
  80. qiskit/circuit/library/standard_gates/swap.py +12 -5
  81. qiskit/circuit/library/standard_gates/sx.py +14 -5
  82. qiskit/circuit/library/standard_gates/t.py +5 -0
  83. qiskit/circuit/library/standard_gates/u.py +22 -7
  84. qiskit/circuit/library/standard_gates/u1.py +8 -3
  85. qiskit/circuit/library/standard_gates/u2.py +3 -0
  86. qiskit/circuit/library/standard_gates/u3.py +22 -7
  87. qiskit/circuit/library/standard_gates/x.py +158 -92
  88. qiskit/circuit/library/standard_gates/xx_minus_yy.py +40 -1
  89. qiskit/circuit/library/standard_gates/xx_plus_yy.py +52 -11
  90. qiskit/circuit/library/standard_gates/y.py +6 -1
  91. qiskit/circuit/library/standard_gates/z.py +8 -1
  92. qiskit/circuit/operation.py +1 -1
  93. qiskit/circuit/parameter.py +9 -10
  94. qiskit/circuit/parameterexpression.py +16 -13
  95. qiskit/circuit/parametertable.py +1 -190
  96. qiskit/circuit/parametervector.py +1 -1
  97. qiskit/circuit/quantumcircuit.py +395 -385
  98. qiskit/circuit/quantumcircuitdata.py +3 -5
  99. qiskit/circuit/quantumregister.py +1 -1
  100. qiskit/circuit/random/__init__.py +1 -1
  101. qiskit/circuit/random/utils.py +175 -26
  102. qiskit/circuit/register.py +5 -7
  103. qiskit/circuit/singleton.py +3 -3
  104. qiskit/circuit/tools/pi_check.py +4 -4
  105. qiskit/compiler/assembler.py +95 -24
  106. qiskit/compiler/scheduler.py +2 -2
  107. qiskit/compiler/transpiler.py +42 -128
  108. qiskit/converters/circuit_to_dag.py +4 -6
  109. qiskit/converters/circuit_to_gate.py +4 -8
  110. qiskit/converters/circuit_to_instruction.py +5 -17
  111. qiskit/converters/dag_to_circuit.py +2 -6
  112. qiskit/dagcircuit/collect_blocks.py +2 -2
  113. qiskit/dagcircuit/dagcircuit.py +197 -187
  114. qiskit/dagcircuit/dagdependency.py +4 -4
  115. qiskit/dagcircuit/dagdependency_v2.py +4 -4
  116. qiskit/dagcircuit/dagdepnode.py +1 -1
  117. qiskit/dagcircuit/dagnode.py +66 -157
  118. qiskit/passmanager/flow_controllers.py +1 -1
  119. qiskit/passmanager/passmanager.py +3 -3
  120. qiskit/primitives/__init__.py +1 -5
  121. qiskit/primitives/backend_estimator.py +25 -15
  122. qiskit/primitives/backend_estimator_v2.py +31 -7
  123. qiskit/primitives/backend_sampler.py +21 -12
  124. qiskit/primitives/backend_sampler_v2.py +12 -3
  125. qiskit/primitives/base/base_estimator.py +31 -4
  126. qiskit/primitives/base/base_primitive.py +2 -2
  127. qiskit/primitives/base/base_result.py +2 -2
  128. qiskit/primitives/base/base_sampler.py +26 -2
  129. qiskit/primitives/base/estimator_result.py +2 -2
  130. qiskit/primitives/base/sampler_result.py +2 -2
  131. qiskit/primitives/containers/__init__.py +0 -1
  132. qiskit/primitives/containers/bindings_array.py +2 -2
  133. qiskit/primitives/containers/bit_array.py +113 -12
  134. qiskit/primitives/containers/shape.py +3 -3
  135. qiskit/primitives/estimator.py +9 -2
  136. qiskit/primitives/primitive_job.py +1 -1
  137. qiskit/primitives/sampler.py +10 -3
  138. qiskit/primitives/statevector_estimator.py +5 -3
  139. qiskit/primitives/statevector_sampler.py +11 -5
  140. qiskit/primitives/utils.py +16 -0
  141. qiskit/providers/backend.py +15 -6
  142. qiskit/providers/backend_compat.py +7 -4
  143. qiskit/providers/basic_provider/basic_provider_tools.py +1 -1
  144. qiskit/providers/basic_provider/basic_simulator.py +33 -25
  145. qiskit/providers/fake_provider/fake_backend.py +10 -3
  146. qiskit/providers/fake_provider/fake_openpulse_2q.py +157 -149
  147. qiskit/providers/fake_provider/fake_openpulse_3q.py +228 -220
  148. qiskit/providers/fake_provider/fake_pulse_backend.py +2 -1
  149. qiskit/providers/fake_provider/fake_qasm_backend.py +7 -2
  150. qiskit/providers/fake_provider/generic_backend_v2.py +519 -68
  151. qiskit/providers/models/__init__.py +48 -11
  152. qiskit/providers/models/backendconfiguration.py +50 -4
  153. qiskit/providers/models/backendproperties.py +13 -2
  154. qiskit/providers/models/pulsedefaults.py +10 -11
  155. qiskit/providers/options.py +13 -13
  156. qiskit/providers/providerutils.py +3 -1
  157. qiskit/pulse/configuration.py +8 -12
  158. qiskit/pulse/instruction_schedule_map.py +3 -5
  159. qiskit/pulse/instructions/acquire.py +7 -8
  160. qiskit/pulse/instructions/instruction.py +2 -3
  161. qiskit/pulse/library/samplers/decorators.py +5 -9
  162. qiskit/pulse/library/symbolic_pulses.py +4 -7
  163. qiskit/pulse/library/waveform.py +2 -5
  164. qiskit/pulse/macros.py +11 -6
  165. qiskit/pulse/parser.py +8 -10
  166. qiskit/pulse/schedule.py +12 -20
  167. qiskit/pulse/transforms/alignments.py +1 -3
  168. qiskit/pulse/utils.py +1 -2
  169. qiskit/qasm/libs/stdgates.inc +35 -28
  170. qiskit/qasm2/__init__.py +7 -7
  171. qiskit/qasm2/export.py +5 -9
  172. qiskit/qasm2/parse.py +1 -1
  173. qiskit/qasm3/ast.py +9 -25
  174. qiskit/qasm3/exporter.py +582 -479
  175. qiskit/qasm3/printer.py +7 -16
  176. qiskit/qobj/common.py +10 -0
  177. qiskit/qobj/converters/lo_config.py +9 -0
  178. qiskit/qobj/converters/pulse_instruction.py +13 -6
  179. qiskit/qobj/pulse_qobj.py +69 -15
  180. qiskit/qobj/qasm_qobj.py +72 -20
  181. qiskit/qobj/utils.py +9 -0
  182. qiskit/qpy/__init__.py +1 -1
  183. qiskit/qpy/binary_io/circuits.py +8 -5
  184. qiskit/qpy/binary_io/schedules.py +1 -1
  185. qiskit/qpy/binary_io/value.py +3 -3
  186. qiskit/qpy/interface.py +3 -2
  187. qiskit/qpy/type_keys.py +2 -2
  188. qiskit/quantum_info/operators/channel/quantum_channel.py +3 -6
  189. qiskit/quantum_info/operators/channel/superop.py +2 -2
  190. qiskit/quantum_info/operators/channel/transformations.py +1 -1
  191. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -4
  192. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +1 -3
  193. qiskit/quantum_info/operators/dihedral/random.py +6 -3
  194. qiskit/quantum_info/operators/measures.py +2 -2
  195. qiskit/quantum_info/operators/op_shape.py +12 -20
  196. qiskit/quantum_info/operators/operator.py +14 -21
  197. qiskit/quantum_info/operators/predicates.py +1 -0
  198. qiskit/quantum_info/operators/symplectic/base_pauli.py +7 -11
  199. qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
  200. qiskit/quantum_info/operators/symplectic/pauli.py +14 -12
  201. qiskit/quantum_info/operators/symplectic/pauli_list.py +9 -10
  202. qiskit/quantum_info/operators/symplectic/random.py +1 -1
  203. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +15 -17
  204. qiskit/quantum_info/quaternion.py +1 -1
  205. qiskit/quantum_info/states/densitymatrix.py +5 -8
  206. qiskit/quantum_info/states/stabilizerstate.py +128 -37
  207. qiskit/quantum_info/states/statevector.py +4 -8
  208. qiskit/result/counts.py +2 -2
  209. qiskit/result/mitigation/correlated_readout_mitigator.py +2 -2
  210. qiskit/result/mitigation/local_readout_mitigator.py +2 -2
  211. qiskit/result/mitigation/utils.py +1 -3
  212. qiskit/result/models.py +17 -16
  213. qiskit/result/result.py +15 -20
  214. qiskit/scheduler/lowering.py +2 -2
  215. qiskit/synthesis/__init__.py +2 -1
  216. qiskit/synthesis/clifford/__init__.py +1 -1
  217. qiskit/synthesis/clifford/clifford_decompose_ag.py +2 -2
  218. qiskit/synthesis/clifford/clifford_decompose_bm.py +10 -240
  219. qiskit/synthesis/clifford/clifford_decompose_greedy.py +9 -303
  220. qiskit/synthesis/clifford/clifford_decompose_layers.py +25 -23
  221. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +1 -1
  222. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +1 -1
  223. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -2
  224. qiskit/synthesis/discrete_basis/solovay_kitaev.py +24 -14
  225. qiskit/synthesis/evolution/evolution_synthesis.py +4 -2
  226. qiskit/synthesis/evolution/lie_trotter.py +46 -19
  227. qiskit/synthesis/evolution/product_formula.py +111 -55
  228. qiskit/synthesis/evolution/qdrift.py +40 -10
  229. qiskit/synthesis/evolution/suzuki_trotter.py +43 -33
  230. qiskit/synthesis/linear/__init__.py +1 -0
  231. qiskit/synthesis/linear/cnot_synth.py +22 -96
  232. qiskit/synthesis/linear/linear_depth_lnn.py +8 -8
  233. qiskit/synthesis/linear/linear_matrix_utils.py +13 -161
  234. qiskit/synthesis/linear_phase/cnot_phase_synth.py +1 -1
  235. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +3 -3
  236. qiskit/synthesis/linear_phase/cz_depth_lnn.py +1 -1
  237. qiskit/synthesis/one_qubit/one_qubit_decompose.py +29 -29
  238. qiskit/synthesis/permutation/permutation_full.py +5 -29
  239. qiskit/synthesis/permutation/permutation_lnn.py +2 -24
  240. qiskit/synthesis/permutation/permutation_utils.py +2 -59
  241. qiskit/synthesis/qft/__init__.py +1 -0
  242. qiskit/synthesis/qft/qft_decompose_full.py +79 -0
  243. qiskit/synthesis/qft/qft_decompose_lnn.py +17 -9
  244. qiskit/synthesis/stabilizer/stabilizer_circuit.py +6 -6
  245. qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -2
  246. qiskit/synthesis/two_qubit/local_invariance.py +8 -38
  247. qiskit/synthesis/two_qubit/two_qubit_decompose.py +48 -129
  248. qiskit/synthesis/unitary/aqc/cnot_structures.py +1 -1
  249. qiskit/synthesis/unitary/qsd.py +5 -3
  250. qiskit/transpiler/__init__.py +6 -5
  251. qiskit/transpiler/basepasses.py +1 -1
  252. qiskit/transpiler/coupling.py +3 -3
  253. qiskit/transpiler/instruction_durations.py +1 -2
  254. qiskit/transpiler/layout.py +6 -6
  255. qiskit/transpiler/passes/__init__.py +2 -0
  256. qiskit/transpiler/passes/basis/basis_translator.py +84 -64
  257. qiskit/transpiler/passes/basis/translate_parameterized.py +3 -5
  258. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  259. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +10 -10
  260. qiskit/transpiler/passes/calibration/rx_builder.py +3 -3
  261. qiskit/transpiler/passes/calibration/rzx_builder.py +3 -3
  262. qiskit/transpiler/passes/layout/apply_layout.py +13 -3
  263. qiskit/transpiler/passes/layout/sabre_layout.py +10 -8
  264. qiskit/transpiler/passes/layout/sabre_pre_layout.py +4 -1
  265. qiskit/transpiler/passes/layout/set_layout.py +2 -2
  266. qiskit/transpiler/passes/layout/vf2_layout.py +1 -1
  267. qiskit/transpiler/passes/layout/vf2_utils.py +3 -3
  268. qiskit/transpiler/passes/optimization/__init__.py +1 -0
  269. qiskit/transpiler/passes/optimization/collect_cliffords.py +6 -15
  270. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
  271. qiskit/transpiler/passes/optimization/commutation_analysis.py +7 -10
  272. qiskit/transpiler/passes/optimization/commutative_cancellation.py +35 -19
  273. qiskit/transpiler/passes/optimization/consolidate_blocks.py +17 -8
  274. qiskit/transpiler/passes/optimization/inverse_cancellation.py +6 -6
  275. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +64 -41
  276. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
  277. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +83 -0
  278. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +1 -1
  279. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +2 -2
  280. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -1
  281. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -2
  282. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +5 -1
  283. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
  284. qiskit/transpiler/passes/routing/layout_transformation.py +2 -1
  285. qiskit/transpiler/passes/routing/sabre_swap.py +35 -26
  286. qiskit/transpiler/passes/routing/star_prerouting.py +80 -105
  287. qiskit/transpiler/passes/routing/stochastic_swap.py +1 -3
  288. qiskit/transpiler/passes/scheduling/alap.py +1 -2
  289. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -2
  290. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
  291. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -2
  292. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +1 -1
  293. qiskit/transpiler/passes/scheduling/asap.py +1 -2
  294. qiskit/transpiler/passes/scheduling/base_scheduler.py +5 -5
  295. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +3 -3
  296. qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
  297. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -14
  298. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +7 -6
  299. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -3
  300. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +211 -36
  301. qiskit/transpiler/passes/synthesis/plugin.py +2 -2
  302. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +83 -40
  303. qiskit/transpiler/passes/utils/__init__.py +0 -1
  304. qiskit/transpiler/passes/utils/check_gate_direction.py +4 -4
  305. qiskit/transpiler/passes/utils/check_map.py +3 -6
  306. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +3 -4
  307. qiskit/transpiler/passes/utils/error.py +2 -2
  308. qiskit/transpiler/passes/utils/fixed_point.py +3 -3
  309. qiskit/transpiler/passes/utils/gate_direction.py +1 -1
  310. qiskit/transpiler/passes/utils/gates_basis.py +1 -2
  311. qiskit/transpiler/passmanager.py +7 -6
  312. qiskit/transpiler/preset_passmanagers/__init__.py +4 -228
  313. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +73 -18
  314. qiskit/transpiler/preset_passmanagers/common.py +3 -6
  315. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +518 -0
  316. qiskit/transpiler/preset_passmanagers/level0.py +1 -1
  317. qiskit/transpiler/target.py +27 -8
  318. qiskit/user_config.py +29 -6
  319. qiskit/utils/classtools.py +3 -3
  320. qiskit/utils/deprecation.py +3 -2
  321. qiskit/utils/lazy_tester.py +2 -2
  322. qiskit/utils/optionals.py +8 -8
  323. qiskit/visualization/bloch.py +62 -24
  324. qiskit/visualization/circuit/_utils.py +34 -10
  325. qiskit/visualization/circuit/circuit_visualization.py +23 -16
  326. qiskit/visualization/circuit/latex.py +29 -27
  327. qiskit/visualization/circuit/matplotlib.py +4 -2
  328. qiskit/visualization/circuit/qcstyle.py +2 -2
  329. qiskit/visualization/circuit/text.py +9 -15
  330. qiskit/visualization/dag_visualization.py +12 -5
  331. qiskit/visualization/pass_manager_visualization.py +9 -9
  332. qiskit/visualization/pulse_v2/core.py +1 -1
  333. qiskit/visualization/pulse_v2/events.py +1 -1
  334. qiskit/visualization/pulse_v2/generators/frame.py +3 -4
  335. qiskit/visualization/pulse_v2/generators/waveform.py +5 -9
  336. qiskit/visualization/pulse_v2/layouts.py +1 -5
  337. qiskit/visualization/pulse_v2/plotters/matplotlib.py +1 -2
  338. qiskit/visualization/state_visualization.py +5 -6
  339. qiskit/visualization/timeline/plotters/matplotlib.py +1 -2
  340. qiskit/visualization/transition_visualization.py +7 -2
  341. {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/METADATA +28 -28
  342. {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/RECORD +346 -344
  343. {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/WHEEL +1 -1
  344. {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/entry_points.txt +3 -0
  345. qiskit/transpiler/passes/utils/block_to_matrix.py +0 -47
  346. {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/LICENSE.txt +0 -0
  347. {qiskit-1.1.1.dist-info → qiskit-1.2.0.dist-info}/top_level.txt +0 -0
qiskit/VERSION.txt CHANGED
@@ -1 +1 @@
1
- 1.1.1
1
+ 1.2.0
qiskit/__init__.py CHANGED
@@ -10,7 +10,7 @@
10
10
  # copyright notice, and modified files need to carry a notice indicating
11
11
  # that they have been altered from the originals.
12
12
 
13
- # pylint: disable=wrong-import-position
13
+ # pylint: disable=wrong-import-position,wrong-import-order
14
14
 
15
15
  """Main Qiskit public functionality."""
16
16
 
@@ -52,36 +52,38 @@ if sys.version_info < (3, 9):
52
52
  )
53
53
 
54
54
 
55
- import qiskit._accelerate
55
+ from . import _accelerate
56
56
  import qiskit._numpy_compat
57
57
 
58
58
  # Globally define compiled submodules. The normal import mechanism will not find compiled submodules
59
59
  # in _accelerate because it relies on file paths, but PyO3 generates only one shared library file.
60
60
  # We manually define them on import so people can directly import qiskit._accelerate.* submodules
61
61
  # and not have to rely on attribute access. No action needed for top-level extension packages.
62
- sys.modules["qiskit._accelerate.circuit"] = qiskit._accelerate.circuit
63
- sys.modules["qiskit._accelerate.convert_2q_block_matrix"] = (
64
- qiskit._accelerate.convert_2q_block_matrix
65
- )
66
- sys.modules["qiskit._accelerate.dense_layout"] = qiskit._accelerate.dense_layout
67
- sys.modules["qiskit._accelerate.error_map"] = qiskit._accelerate.error_map
68
- sys.modules["qiskit._accelerate.isometry"] = qiskit._accelerate.isometry
69
- sys.modules["qiskit._accelerate.uc_gate"] = qiskit._accelerate.uc_gate
62
+ sys.modules["qiskit._accelerate.circuit"] = _accelerate.circuit
63
+ sys.modules["qiskit._accelerate.convert_2q_block_matrix"] = _accelerate.convert_2q_block_matrix
64
+ sys.modules["qiskit._accelerate.dense_layout"] = _accelerate.dense_layout
65
+ sys.modules["qiskit._accelerate.error_map"] = _accelerate.error_map
66
+ sys.modules["qiskit._accelerate.isometry"] = _accelerate.isometry
67
+ sys.modules["qiskit._accelerate.uc_gate"] = _accelerate.uc_gate
70
68
  sys.modules["qiskit._accelerate.euler_one_qubit_decomposer"] = (
71
- qiskit._accelerate.euler_one_qubit_decomposer
69
+ _accelerate.euler_one_qubit_decomposer
72
70
  )
73
- sys.modules["qiskit._accelerate.nlayout"] = qiskit._accelerate.nlayout
74
- sys.modules["qiskit._accelerate.optimize_1q_gates"] = qiskit._accelerate.optimize_1q_gates
75
- sys.modules["qiskit._accelerate.pauli_expval"] = qiskit._accelerate.pauli_expval
76
- sys.modules["qiskit._accelerate.qasm2"] = qiskit._accelerate.qasm2
77
- sys.modules["qiskit._accelerate.qasm3"] = qiskit._accelerate.qasm3
78
- sys.modules["qiskit._accelerate.results"] = qiskit._accelerate.results
79
- sys.modules["qiskit._accelerate.sabre"] = qiskit._accelerate.sabre
80
- sys.modules["qiskit._accelerate.sampled_exp_val"] = qiskit._accelerate.sampled_exp_val
81
- sys.modules["qiskit._accelerate.sparse_pauli_op"] = qiskit._accelerate.sparse_pauli_op
82
- sys.modules["qiskit._accelerate.stochastic_swap"] = qiskit._accelerate.stochastic_swap
83
- sys.modules["qiskit._accelerate.two_qubit_decompose"] = qiskit._accelerate.two_qubit_decompose
84
- sys.modules["qiskit._accelerate.vf2_layout"] = qiskit._accelerate.vf2_layout
71
+ sys.modules["qiskit._accelerate.nlayout"] = _accelerate.nlayout
72
+ sys.modules["qiskit._accelerate.optimize_1q_gates"] = _accelerate.optimize_1q_gates
73
+ sys.modules["qiskit._accelerate.pauli_expval"] = _accelerate.pauli_expval
74
+ sys.modules["qiskit._accelerate.qasm2"] = _accelerate.qasm2
75
+ sys.modules["qiskit._accelerate.qasm3"] = _accelerate.qasm3
76
+ sys.modules["qiskit._accelerate.results"] = _accelerate.results
77
+ sys.modules["qiskit._accelerate.sabre"] = _accelerate.sabre
78
+ sys.modules["qiskit._accelerate.sampled_exp_val"] = _accelerate.sampled_exp_val
79
+ sys.modules["qiskit._accelerate.sparse_pauli_op"] = _accelerate.sparse_pauli_op
80
+ sys.modules["qiskit._accelerate.star_prerouting"] = _accelerate.star_prerouting
81
+ sys.modules["qiskit._accelerate.stochastic_swap"] = _accelerate.stochastic_swap
82
+ sys.modules["qiskit._accelerate.two_qubit_decompose"] = _accelerate.two_qubit_decompose
83
+ sys.modules["qiskit._accelerate.vf2_layout"] = _accelerate.vf2_layout
84
+ sys.modules["qiskit._accelerate.synthesis.permutation"] = _accelerate.synthesis.permutation
85
+ sys.modules["qiskit._accelerate.synthesis.linear"] = _accelerate.synthesis.linear
86
+ sys.modules["qiskit._accelerate.synthesis.clifford"] = _accelerate.synthesis.clifford
85
87
 
86
88
  from qiskit.exceptions import QiskitError, MissingOptionalLibraryError
87
89
 
@@ -100,7 +102,7 @@ import qiskit.circuit.reset
100
102
  _config = _user_config.get_config()
101
103
 
102
104
  from qiskit.compiler import transpile, assemble, schedule, sequence
103
-
105
+ from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
104
106
  from .version import __version__
105
107
 
106
108
  __all__ = [
@@ -114,4 +116,5 @@ __all__ = [
114
116
  "schedule",
115
117
  "sequence",
116
118
  "transpile",
119
+ "generate_preset_pass_manager",
117
120
  ]
qiskit/_accelerate.pyd CHANGED
Binary file
qiskit/_numpy_compat.py CHANGED
@@ -10,7 +10,7 @@
10
10
  # copyright notice, and modified files need to carry a notice indicating
11
11
  # that they have been altered from the originals.
12
12
 
13
- """Compatiblity helpers for the Numpy 1.x to 2.0 transition."""
13
+ """Compatibility helpers for the Numpy 1.x to 2.0 transition."""
14
14
 
15
15
  import re
16
16
  import typing
@@ -12,6 +12,7 @@
12
12
 
13
13
  """Assemble function for converting a list of circuits into a qobj."""
14
14
  import copy
15
+ import warnings
15
16
  from collections import defaultdict
16
17
  from typing import Dict, List, Optional, Tuple
17
18
 
@@ -35,6 +36,7 @@ from qiskit.qobj import (
35
36
  QobjHeader,
36
37
  )
37
38
  from qiskit.utils.parallel import parallel_map
39
+ from qiskit.utils import deprecate_func
38
40
 
39
41
 
40
42
  PulseLibrary = Dict[str, List[complex]]
@@ -87,20 +89,26 @@ def _assemble_circuit(
87
89
  metadata = circuit.metadata
88
90
  if metadata is None:
89
91
  metadata = {}
90
- header = QobjExperimentHeader(
91
- qubit_labels=qubit_labels,
92
- n_qubits=num_qubits,
93
- qreg_sizes=qreg_sizes,
94
- clbit_labels=clbit_labels,
95
- memory_slots=memory_slots,
96
- creg_sizes=creg_sizes,
97
- name=circuit.name,
98
- global_phase=float(circuit.global_phase),
99
- metadata=metadata,
100
- )
92
+ with warnings.catch_warnings():
93
+ # The class QobjExperimentHeader is deprecated
94
+ warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
95
+ header = QobjExperimentHeader(
96
+ qubit_labels=qubit_labels,
97
+ n_qubits=num_qubits,
98
+ qreg_sizes=qreg_sizes,
99
+ clbit_labels=clbit_labels,
100
+ memory_slots=memory_slots,
101
+ creg_sizes=creg_sizes,
102
+ name=circuit.name,
103
+ global_phase=float(circuit.global_phase),
104
+ metadata=metadata,
105
+ )
101
106
 
102
107
  # TODO: why do we need n_qubits and memory_slots in both the header and the config
103
- config = QasmQobjExperimentConfig(n_qubits=num_qubits, memory_slots=memory_slots)
108
+ with warnings.catch_warnings():
109
+ # The class QasmQobjExperimentConfig is deprecated
110
+ warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
111
+ config = QasmQobjExperimentConfig(n_qubits=num_qubits, memory_slots=memory_slots)
104
112
  calibrations, pulse_library = _assemble_pulse_gates(circuit, run_config)
105
113
  if calibrations:
106
114
  config.calibrations = calibrations
@@ -118,7 +126,7 @@ def _assemble_circuit(
118
126
 
119
127
  instructions = []
120
128
  for op_context in circuit.data:
121
- instruction = op_context.operation.assemble()
129
+ instruction = op_context.operation._assemble()
122
130
 
123
131
  # Add register attributes to the instruction
124
132
  qargs = op_context.qubits
@@ -151,13 +159,16 @@ def _assemble_circuit(
151
159
  ]
152
160
 
153
161
  conditional_reg_idx = memory_slots + max_conditional_idx
154
- conversion_bfunc = QasmQobjInstruction(
155
- name="bfunc",
156
- mask="0x%X" % mask,
157
- relation="==",
158
- val="0x%X" % val,
159
- register=conditional_reg_idx,
160
- )
162
+ with warnings.catch_warnings():
163
+ # The class QasmQobjInstruction is deprecated
164
+ warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
165
+ conversion_bfunc = QasmQobjInstruction(
166
+ name="bfunc",
167
+ mask="0x%X" % mask, # pylint: disable=consider-using-f-string
168
+ relation="==",
169
+ val="0x%X" % val, # pylint: disable=consider-using-f-string
170
+ register=conditional_reg_idx,
171
+ )
161
172
  instructions.append(conversion_bfunc)
162
173
  instruction.conditional = conditional_reg_idx
163
174
  max_conditional_idx += 1
@@ -166,10 +177,13 @@ def _assemble_circuit(
166
177
  del instruction._condition
167
178
 
168
179
  instructions.append(instruction)
169
- return (
170
- QasmQobjExperiment(instructions=instructions, header=header, config=config),
171
- pulse_library,
172
- )
180
+ with warnings.catch_warnings():
181
+ # The class QasmQobjExperiment is deprecated
182
+ warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
183
+ return (
184
+ QasmQobjExperiment(instructions=instructions, header=header, config=config),
185
+ pulse_library,
186
+ )
173
187
 
174
188
 
175
189
  def _assemble_pulse_gates(
@@ -299,42 +313,14 @@ def _configure_experiment_los(
299
313
  return experiments
300
314
 
301
315
 
302
- def assemble_circuits(
316
+ def _assemble_circuits(
303
317
  circuits: List[QuantumCircuit], run_config: RunConfig, qobj_id: int, qobj_header: QobjHeader
304
318
  ) -> QasmQobj:
305
- """Assembles a list of circuits into a qobj that can be run on the backend.
306
-
307
- Args:
308
- circuits: circuit(s) to assemble
309
- run_config: configuration of the runtime environment
310
- qobj_id: identifier for the generated qobj
311
- qobj_header: header to pass to the results
312
-
313
- Returns:
314
- The qobj to be run on the backends
315
-
316
- Examples:
317
-
318
- .. code-block:: python
319
-
320
- from qiskit.circuit import QuantumRegister, ClassicalRegister, QuantumCircuit
321
- from qiskit.assembler import assemble_circuits
322
- from qiskit.assembler.run_config import RunConfig
323
- # Build a circuit to convert into a Qobj
324
- q = QuantumRegister(2)
325
- c = ClassicalRegister(2)
326
- qc = QuantumCircuit(q, c)
327
- qc.h(q[0])
328
- qc.cx(q[0], q[1])
329
- qc.measure(q, c)
330
- # Assemble a Qobj from the input circuit
331
- qobj = assemble_circuits(circuits=[qc],
332
- qobj_id="custom-id",
333
- qobj_header=[],
334
- run_config=RunConfig(shots=2000, memory=True, init_qubits=True))
335
- """
336
- # assemble the circuit experiments
337
- experiments_and_pulse_libs = parallel_map(_assemble_circuit, circuits, [run_config])
319
+ with warnings.catch_warnings():
320
+ # Still constructs Qobj, that is deprecated. The message is hard to trace to a module,
321
+ # because concurrency is hard.
322
+ warnings.filterwarnings("ignore", category=DeprecationWarning)
323
+ experiments_and_pulse_libs = parallel_map(_assemble_circuit, circuits, [run_config])
338
324
  experiments = []
339
325
  pulse_library = {}
340
326
  for exp, lib in experiments_and_pulse_libs:
@@ -346,10 +332,16 @@ def assemble_circuits(
346
332
  experiments, calibrations = _extract_common_calibrations(experiments)
347
333
 
348
334
  # configure LO freqs per circuit
349
- lo_converter = converters.LoConfigConverter(QasmQobjExperimentConfig, **run_config.to_dict())
335
+ with warnings.catch_warnings():
336
+ warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
337
+ lo_converter = converters.LoConfigConverter(
338
+ QasmQobjExperimentConfig, **run_config.to_dict()
339
+ )
350
340
  experiments = _configure_experiment_los(experiments, lo_converter, run_config)
351
341
 
352
- qobj_config = QasmQobjConfig()
342
+ with warnings.catch_warnings():
343
+ warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
344
+ qobj_config = QasmQobjConfig()
353
345
  if run_config:
354
346
  qobj_config_dict = run_config.to_dict()
355
347
 
@@ -379,7 +371,10 @@ def assemble_circuits(
379
371
  if m_los:
380
372
  qobj_config_dict["meas_lo_freq"] = [freq / 1e9 for freq in m_los]
381
373
 
382
- qobj_config = QasmQobjConfig(**qobj_config_dict)
374
+ with warnings.catch_warnings():
375
+ # The class QasmQobjConfig is deprecated
376
+ warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
377
+ qobj_config = QasmQobjConfig(**qobj_config_dict)
383
378
 
384
379
  qubit_sizes = []
385
380
  memory_slot_sizes = []
@@ -402,7 +397,55 @@ def assemble_circuits(
402
397
 
403
398
  if calibrations and calibrations.gates:
404
399
  qobj_config.calibrations = calibrations
400
+ with warnings.catch_warnings():
401
+ # The class QasmQobj is deprecated
402
+ warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
403
+ return QasmQobj(
404
+ qobj_id=qobj_id, config=qobj_config, experiments=experiments, header=qobj_header
405
+ )
405
406
 
406
- return QasmQobj(
407
- qobj_id=qobj_id, config=qobj_config, experiments=experiments, header=qobj_header
408
- )
407
+
408
+ @deprecate_func(
409
+ since="1.2",
410
+ removal_timeline="in the 2.0 release",
411
+ additional_msg="The `Qobj` class and related functionality are part of the deprecated `BackendV1` "
412
+ "workflow, and no longer necessary for `BackendV2`. If a user workflow requires "
413
+ "`Qobj` it likely relies on deprecated functionality and should be updated to "
414
+ "use `BackendV2`.",
415
+ )
416
+ def assemble_circuits(
417
+ circuits: List[QuantumCircuit], run_config: RunConfig, qobj_id: int, qobj_header: QobjHeader
418
+ ) -> QasmQobj:
419
+ """Assembles a list of circuits into a qobj that can be run on the backend.
420
+
421
+ Args:
422
+ circuits: circuit(s) to assemble
423
+ run_config: configuration of the runtime environment
424
+ qobj_id: identifier for the generated qobj
425
+ qobj_header: header to pass to the results
426
+
427
+ Returns:
428
+ The qobj to be run on the backends
429
+
430
+ Examples:
431
+
432
+ .. code-block:: python
433
+
434
+ from qiskit.circuit import QuantumRegister, ClassicalRegister, QuantumCircuit
435
+ from qiskit.assembler import assemble_circuits
436
+ from qiskit.assembler.run_config import RunConfig
437
+ # Build a circuit to convert into a Qobj
438
+ q = QuantumRegister(2)
439
+ c = ClassicalRegister(2)
440
+ qc = QuantumCircuit(q, c)
441
+ qc.h(q[0])
442
+ qc.cx(q[0], q[1])
443
+ qc.measure(q, c)
444
+ # Assemble a Qobj from the input circuit
445
+ qobj = assemble_circuits(circuits=[qc],
446
+ qobj_id="custom-id",
447
+ qobj_header=[],
448
+ run_config=RunConfig(shots=2000, memory=True, init_qubits=True))
449
+ """
450
+ # assemble the circuit experiments
451
+ return _assemble_circuits(circuits, run_config, qobj_id, qobj_header)
@@ -152,7 +152,7 @@ def _assemble_experiments(
152
152
  # TODO: add other experimental header items (see circuit assembler)
153
153
  qobj_experiment_header = qobj.QobjExperimentHeader(
154
154
  memory_slots=max_memory_slot + 1, # Memory slots are 0 indexed
155
- name=sched.name or "Experiment-%d" % idx,
155
+ name=sched.name or f"Experiment-{idx}",
156
156
  metadata=metadata,
157
157
  )
158
158
 
@@ -306,18 +306,11 @@ def _validate_meas_map(
306
306
  common_next = next_inst_qubits.intersection(meas_set)
307
307
  if common_instr_qubits and common_next:
308
308
  raise QiskitError(
309
- "Qubits {} and {} are in the same measurement grouping: {}. "
309
+ f"Qubits {common_instr_qubits} and {common_next} are in the same measurement "
310
+ f"grouping: {meas_map}. "
310
311
  "They must either be acquired at the same time, or disjointly"
311
- ". Instead, they were acquired at times: {}-{} and "
312
- "{}-{}".format(
313
- common_instr_qubits,
314
- common_next,
315
- meas_map,
316
- inst[0][0],
317
- inst_end_time,
318
- next_inst_time,
319
- next_inst_time + next_inst[0][1],
320
- )
312
+ f". Instead, they were acquired at times: {inst[0][0]}-{inst_end_time} and "
313
+ f"{next_inst_time}-{next_inst_time + next_inst[0][1]}"
321
314
  )
322
315
 
323
316
 
@@ -23,6 +23,7 @@ from qiskit.circuit.quantumregister import QuantumRegister
23
23
 
24
24
  from qiskit.qobj import PulseQobjInstruction
25
25
  from qiskit.qobj.converters import QobjToInstructionConverter
26
+ from qiskit.utils import deprecate_func
26
27
 
27
28
  # A ``CircuitModule`` is a representation of a circuit execution on the backend.
28
29
  # It is currently a list of quantum circuits to execute, a run Qobj dictionary
@@ -37,6 +38,14 @@ CircuitModule = NewType(
37
38
  PulseModule = NewType("PulseModule", Tuple[List[pulse.Schedule], Dict[str, Any], Dict[str, Any]])
38
39
 
39
40
 
41
+ @deprecate_func(
42
+ since="1.2",
43
+ removal_timeline="in the 2.0 release",
44
+ additional_msg="The `Qobj` class and related functionality are part of the deprecated "
45
+ "`BackendV1` workflow, and no longer necessary for `BackendV2`. If a user "
46
+ "workflow requires `Qobj` it likely relies on deprecated functionality and "
47
+ "should be updated to use `BackendV2`.",
48
+ )
40
49
  def disassemble(qobj) -> Union[CircuitModule, PulseModule]:
41
50
  """Disassemble a qobj and return the circuits or pulse schedules, run_config, and user header.
42
51
 
@@ -109,7 +118,7 @@ def _qobj_to_circuit_cals(qobj, pulse_lib):
109
118
  config = (tuple(gate["qubits"]), tuple(gate["params"]))
110
119
  cal = {
111
120
  config: pulse.Schedule(
112
- name="{} {} {}".format(gate["name"], str(gate["params"]), str(gate["qubits"]))
121
+ name=f"{gate['name']} {str(gate['params'])} {str(gate['qubits'])}"
113
122
  )
114
123
  }
115
124
  for instruction in gate["instructions"]:
@@ -270,7 +270,7 @@ circuit. The top-level ones are:
270
270
  * :class:`ContinueLoopOp`, to move immediately to the next iteration of the containing loop
271
271
  * :class:`ForLoopOp`, to loop over a fixed range of values
272
272
  * :class:`IfElseOp`, to conditionally enter one of two subcircuits
273
- * :class:`SwitchCaseOp`, to conditionally enter one of many subcicuits
273
+ * :class:`SwitchCaseOp`, to conditionally enter one of many subcircuits
274
274
  * :class:`WhileLoopOp`, to repeat a subcircuit until a condition is falsified.
275
275
 
276
276
  :ref:`Circuits can include classical expressions that are evaluated in real time
@@ -301,9 +301,10 @@ assist compilation workflows. These include:
301
301
  * :data:`SessionEquivalenceLibrary`, a mutable instance of :class:`EquivalenceLibrary` which is used
302
302
  by default by the compiler's :class:`.BasisTranslator`.
303
303
 
304
- There is also a utility for generating random circuits:
304
+ There are also utilities for generating random circuits:
305
305
 
306
- * :func:`random.random_circuit`
306
+ * :func:`.random_circuit`
307
+ * :func:`.random_clifford_circuit`
307
308
 
308
309
  Finally, the circuit module has its own exception class, to indicate when things went wrong in
309
310
  circuit-specific manners:
@@ -1004,6 +1005,7 @@ Generating random circuits
1004
1005
 
1005
1006
  .. currentmodule:: qiskit.circuit.random
1006
1007
  .. autofunction:: random_circuit
1008
+ .. autofunction:: random_clifford_circuit
1007
1009
  .. currentmodule:: qiskit.circuit
1008
1010
 
1009
1011
 
@@ -1250,3 +1252,4 @@ from .controlflow import (
1250
1252
  )
1251
1253
 
1252
1254
  from .annotated_operation import AnnotatedOperation, InverseModifier, ControlModifier, PowerModifier
1255
+ from .random import random_circuit, random_clifford_circuit
@@ -31,7 +31,7 @@ class VariableMapper(expr.ExprVisitor[expr.Expr]):
31
31
  call its :meth:`map_condition`, :meth:`map_target` or :meth:`map_expr` methods as appropriate,
32
32
  which will return the new object that should be used.
33
33
 
34
- If an ``add_register`` callable is given to the initialiser, the mapper will use it to attempt
34
+ If an ``add_register`` callable is given to the initializer, the mapper will use it to attempt
35
35
  to add new aliasing registers to the outer circuit object, if there is not already a suitable
36
36
  register for the mapping available in the circuit. If this parameter is not given, a
37
37
  ``ValueError`` will be raised instead. The given ``add_register`` callable may choose to raise
@@ -73,12 +73,12 @@ class VariableMapper(expr.ExprVisitor[expr.Expr]):
73
73
 
74
74
  def map_condition(self, condition, /, *, allow_reorder=False):
75
75
  """Map the given ``condition`` so that it only references variables in the destination
76
- circuit (as given to this class on initialisation).
76
+ circuit (as given to this class on initialization).
77
77
 
78
78
  If ``allow_reorder`` is ``True``, then when a legacy condition (the two-tuple form) is made
79
79
  on a register that has a counterpart in the destination with all the same (mapped) bits but
80
80
  in a different order, then that register will be used and the value suitably modified to
81
- make the equality condition work. This is maintaining legacy (tested) behaviour of
81
+ make the equality condition work. This is maintaining legacy (tested) behavior of
82
82
  :meth:`.DAGCircuit.compose`; nowhere else does this, and in general this would require *far*
83
83
  more complex classical rewriting than Terra needs to worry about in the full expression era.
84
84
  """
@@ -91,7 +91,7 @@ class VariableMapper(expr.ExprVisitor[expr.Expr]):
91
91
  return (self.bit_map[target], value)
92
92
  if not allow_reorder:
93
93
  return (self._map_register(target), value)
94
- # This is maintaining the legacy behaviour of `DAGCircuit.compose`. We don't attempt to
94
+ # This is maintaining the legacy behavior of `DAGCircuit.compose`. We don't attempt to
95
95
  # speed-up this lookup with a cache, since that would just make the more standard cases more
96
96
  # annoying to deal with.
97
97
  mapped_bits_order = [self.bit_map[bit] for bit in target]
@@ -114,7 +114,7 @@ class VariableMapper(expr.ExprVisitor[expr.Expr]):
114
114
 
115
115
  def map_target(self, target, /):
116
116
  """Map the real-time variables in a ``target`` of a :class:`.SwitchCaseOp` to the new
117
- circuit, as defined in the ``circuit`` argument of the initialiser of this class."""
117
+ circuit, as defined in the ``circuit`` argument of the initializer of this class."""
118
118
  if isinstance(target, Clbit):
119
119
  return self.bit_map[target]
120
120
  if isinstance(target, ClassicalRegister):
qiskit/circuit/_utils.py CHANGED
@@ -19,19 +19,6 @@ import numpy
19
19
  from qiskit import _numpy_compat
20
20
  from qiskit.exceptions import QiskitError
21
21
  from qiskit.circuit.exceptions import CircuitError
22
- from .parametervector import ParameterVectorElement
23
-
24
-
25
- def sort_parameters(parameters):
26
- """Sort an iterable of :class:`.Parameter` instances into a canonical order, respecting the
27
- ordering relationships between elements of :class:`.ParameterVector`\\ s."""
28
-
29
- def key(parameter):
30
- if isinstance(parameter, ParameterVectorElement):
31
- return (parameter.vector.name, parameter.index)
32
- return (parameter.name,)
33
-
34
- return sorted(parameters, key=key)
35
22
 
36
23
 
37
24
  def _compute_control_matrix(base_mat, num_ctrl_qubits, ctrl_state=None):
@@ -73,7 +73,7 @@ def control(
73
73
  ) -> ControlledGate:
74
74
  """Return controlled version of gate using controlled rotations. This function
75
75
  first checks the name of the operation to see if it knows of a method from which
76
- to generate a controlled version. Currently these are `x`, `rx`, `ry`, and `rz`.
76
+ to generate a controlled version. Currently, these are ``x``, ``rx``, ``ry``, and ``rz``.
77
77
  If a method is not directly known, it calls the unroller to convert to `u1`, `u3`,
78
78
  and `cx` gates.
79
79
 
@@ -18,6 +18,7 @@ import dataclasses
18
18
  from typing import Union, List
19
19
 
20
20
  from qiskit.circuit.operation import Operation
21
+ from qiskit.circuit.parameterexpression import ParameterValueType
21
22
  from qiskit.circuit._utils import _compute_control_matrix, _ctrl_state_to_int
22
23
  from qiskit.circuit.exceptions import CircuitError
23
24
 
@@ -132,7 +133,7 @@ class AnnotatedOperation(Operation):
132
133
 
133
134
  def copy(self) -> "AnnotatedOperation":
134
135
  """Return a copy of the :class:`~.AnnotatedOperation`."""
135
- return AnnotatedOperation(base_op=self.base_op, modifiers=self.modifiers.copy())
136
+ return AnnotatedOperation(base_op=self.base_op.copy(), modifiers=self.modifiers.copy())
136
137
 
137
138
  def to_matrix(self):
138
139
  """Return a matrix representation (allowing to construct Operator)."""
@@ -219,6 +220,27 @@ class AnnotatedOperation(Operation):
219
220
  extended_modifiers.append(PowerModifier(exponent))
220
221
  return AnnotatedOperation(self.base_op, extended_modifiers)
221
222
 
223
+ @property
224
+ def params(self) -> list[ParameterValueType]:
225
+ """The params of the underlying base operation."""
226
+ return getattr(self.base_op, "params", [])
227
+
228
+ @params.setter
229
+ def params(self, value: list[ParameterValueType]):
230
+ if hasattr(self.base_op, "params"):
231
+ self.base_op.params = value
232
+ else:
233
+ raise AttributeError(
234
+ f"Cannot set attribute ``params`` on the base operation {self.base_op}."
235
+ )
236
+
237
+ def validate_parameter(self, parameter: ParameterValueType) -> ParameterValueType:
238
+ """Validate a parameter for the underlying base operation."""
239
+ if hasattr(self.base_op, "validate_parameter"):
240
+ return self.base_op.validate_parameter(parameter)
241
+
242
+ raise AttributeError(f"Cannot validate parameters on the base operation {self.base_op}.")
243
+
222
244
 
223
245
  def _canonicalize_modifiers(modifiers):
224
246
  """
@@ -53,7 +53,7 @@ class Expr(abc.ABC):
53
53
  expressions, and it does not make sense to add more outside of Qiskit library code.
54
54
 
55
55
  All subclasses are responsible for setting their ``type`` attribute in their ``__init__``, and
56
- should not call the parent initialiser."""
56
+ should not call the parent initializer."""
57
57
 
58
58
  __slots__ = ("type",)
59
59
 
@@ -193,7 +193,7 @@ class Var(Expr):
193
193
  return self
194
194
 
195
195
  def __deepcopy__(self, memo):
196
- # ... as are all my consituent parts.
196
+ # ... as are all my constituent parts.
197
197
  return self
198
198
 
199
199
 
@@ -241,7 +241,7 @@ class Unary(Expr):
241
241
 
242
242
  # If adding opcodes, remember to add helper constructor functions in `constructors.py`.
243
243
  # The opcode integers should be considered a public interface; they are used by
244
- # serialisation formats that may transfer data between different versions of Qiskit.
244
+ # serialization formats that may transfer data between different versions of Qiskit.
245
245
  BIT_NOT = 1
246
246
  """Bitwise negation. ``~operand``."""
247
247
  LOGIC_NOT = 2
@@ -309,7 +309,7 @@ class Binary(Expr):
309
309
 
310
310
  # If adding opcodes, remember to add helper constructor functions in `constructors.py`
311
311
  # The opcode integers should be considered a public interface; they are used by
312
- # serialisation formats that may transfer data between different versions of Qiskit.
312
+ # serialization formats that may transfer data between different versions of Qiskit.
313
313
  BIT_AND = 1
314
314
  """Bitwise "and". ``lhs & rhs``."""
315
315
  BIT_OR = 2
@@ -29,7 +29,7 @@ _T_co = typing.TypeVar("_T_co", covariant=True)
29
29
 
30
30
  class ExprVisitor(typing.Generic[_T_co]):
31
31
  """Base class for visitors to the :class:`Expr` tree. Subclasses should override whichever of
32
- the ``visit_*`` methods that they are able to handle, and should be organised such that
32
+ the ``visit_*`` methods that they are able to handle, and should be organized such that
33
33
  non-existent methods will never be called."""
34
34
 
35
35
  # The method names are self-explanatory and docstrings would just be noise.
@@ -40,7 +40,7 @@ literals ``True`` and ``False``), and unsigned integers (corresponding to
40
40
  .. autoclass:: Bool
41
41
  .. autoclass:: Uint
42
42
 
43
- Note that :class:`Uint` defines a family of types parametrised by their width; it is not one single
43
+ Note that :class:`Uint` defines a family of types parametrized by their width; it is not one single
44
44
  type, which may be slightly different to the 'classical' programming languages you are used to.
45
45
 
46
46
 
@@ -29,7 +29,7 @@ import typing
29
29
 
30
30
 
31
31
  class _Singleton(type):
32
- """Metaclass to make the child, which should take zero initialisation arguments, a singleton
32
+ """Metaclass to make the child, which should take zero initialization arguments, a singleton
33
33
  object."""
34
34
 
35
35
  def _get_singleton_instance(cls):
@@ -76,7 +76,7 @@ class Type:
76
76
  def __setstate__(self, state):
77
77
  _dict, slots = state
78
78
  for slot, value in slots.items():
79
- # We need to overcome the type's enforcement of immutability post initialisation.
79
+ # We need to overcome the type's enforcement of immutability post initialization.
80
80
  super().__setattr__(slot, value)
81
81
 
82
82
 
@@ -51,6 +51,14 @@ QuantumCircuit:
51
51
  Following Qiskit's little-endian bit ordering convention, the left-most bit (``a``) is the most
52
52
  significant bit and the right-most bit (``d``) is the least significant bit.
53
53
 
54
+ .. warning::
55
+
56
+ The functionality of `qiskit.circuit.classicalfunction` requires `tweedledum`,
57
+ which isn't available on all platforms (up to Python version 3.11).
58
+ See `tweedledum installation guide
59
+ <https://github.com/boschmitt/tweedledum/tree/master?tab=readme-ov-file#installation>`_
60
+ for more details.
61
+
54
62
  Supplementary Information
55
63
  =========================
56
64