qiskit 1.1.2__cp38-abi3-macosx_10_9_universal2.whl → 1.2.0__cp38-abi3-macosx_10_9_universal2.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 (343) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +27 -24
  3. qiskit/_accelerate.abi3.so +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/boolean_expression.py +1 -1
  18. qiskit/circuit/classicalfunction/classical_function_visitor.py +5 -5
  19. qiskit/circuit/classicalfunction/utils.py +1 -1
  20. qiskit/circuit/classicalregister.py +1 -1
  21. qiskit/circuit/commutation_checker.py +83 -35
  22. qiskit/circuit/controlflow/_builder_utils.py +1 -1
  23. qiskit/circuit/controlflow/builder.py +10 -6
  24. qiskit/circuit/controlflow/if_else.py +2 -2
  25. qiskit/circuit/controlflow/switch_case.py +1 -1
  26. qiskit/circuit/delay.py +1 -1
  27. qiskit/circuit/duration.py +2 -2
  28. qiskit/circuit/equivalence.py +5 -7
  29. qiskit/circuit/gate.py +11 -8
  30. qiskit/circuit/instruction.py +31 -13
  31. qiskit/circuit/instructionset.py +2 -5
  32. qiskit/circuit/library/__init__.py +2 -1
  33. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +1 -1
  34. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
  35. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +1 -1
  36. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +1 -1
  37. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +3 -3
  38. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +1 -1
  39. qiskit/circuit/library/basis_change/__init__.py +1 -1
  40. qiskit/circuit/library/basis_change/qft.py +40 -6
  41. qiskit/circuit/library/blueprintcircuit.py +3 -5
  42. qiskit/circuit/library/data_preparation/__init__.py +9 -2
  43. qiskit/circuit/library/data_preparation/initializer.py +8 -0
  44. qiskit/circuit/library/data_preparation/state_preparation.py +98 -178
  45. qiskit/circuit/library/generalized_gates/isometry.py +8 -8
  46. qiskit/circuit/library/generalized_gates/linear_function.py +3 -2
  47. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +4 -4
  48. qiskit/circuit/library/generalized_gates/permutation.py +8 -9
  49. qiskit/circuit/library/generalized_gates/uc.py +3 -3
  50. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +2 -2
  51. qiskit/circuit/library/generalized_gates/unitary.py +13 -11
  52. qiskit/circuit/library/graph_state.py +1 -1
  53. qiskit/circuit/library/hamiltonian_gate.py +1 -2
  54. qiskit/circuit/library/hidden_linear_function.py +1 -1
  55. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +3 -2
  56. qiskit/circuit/library/n_local/n_local.py +4 -5
  57. qiskit/circuit/library/n_local/pauli_two_design.py +1 -1
  58. qiskit/circuit/library/n_local/qaoa_ansatz.py +6 -8
  59. qiskit/circuit/library/n_local/two_local.py +1 -1
  60. qiskit/circuit/library/overlap.py +11 -5
  61. qiskit/circuit/library/pauli_evolution.py +7 -3
  62. qiskit/circuit/library/standard_gates/dcx.py +3 -0
  63. qiskit/circuit/library/standard_gates/ecr.py +3 -0
  64. qiskit/circuit/library/standard_gates/global_phase.py +3 -0
  65. qiskit/circuit/library/standard_gates/h.py +13 -5
  66. qiskit/circuit/library/standard_gates/i.py +3 -0
  67. qiskit/circuit/library/standard_gates/iswap.py +3 -0
  68. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +19 -10
  69. qiskit/circuit/library/standard_gates/p.py +14 -9
  70. qiskit/circuit/library/standard_gates/r.py +3 -0
  71. qiskit/circuit/library/standard_gates/rx.py +21 -6
  72. qiskit/circuit/library/standard_gates/rxx.py +40 -1
  73. qiskit/circuit/library/standard_gates/ry.py +21 -6
  74. qiskit/circuit/library/standard_gates/ryy.py +40 -1
  75. qiskit/circuit/library/standard_gates/rz.py +22 -6
  76. qiskit/circuit/library/standard_gates/rzx.py +40 -1
  77. qiskit/circuit/library/standard_gates/rzz.py +41 -2
  78. qiskit/circuit/library/standard_gates/s.py +77 -0
  79. qiskit/circuit/library/standard_gates/swap.py +12 -5
  80. qiskit/circuit/library/standard_gates/sx.py +14 -5
  81. qiskit/circuit/library/standard_gates/t.py +5 -0
  82. qiskit/circuit/library/standard_gates/u.py +22 -7
  83. qiskit/circuit/library/standard_gates/u1.py +8 -3
  84. qiskit/circuit/library/standard_gates/u2.py +3 -0
  85. qiskit/circuit/library/standard_gates/u3.py +22 -7
  86. qiskit/circuit/library/standard_gates/x.py +156 -92
  87. qiskit/circuit/library/standard_gates/xx_minus_yy.py +40 -1
  88. qiskit/circuit/library/standard_gates/xx_plus_yy.py +52 -11
  89. qiskit/circuit/library/standard_gates/y.py +6 -1
  90. qiskit/circuit/library/standard_gates/z.py +8 -1
  91. qiskit/circuit/operation.py +1 -1
  92. qiskit/circuit/parameter.py +9 -10
  93. qiskit/circuit/parameterexpression.py +16 -13
  94. qiskit/circuit/parametertable.py +1 -190
  95. qiskit/circuit/parametervector.py +1 -1
  96. qiskit/circuit/quantumcircuit.py +395 -387
  97. qiskit/circuit/quantumcircuitdata.py +3 -5
  98. qiskit/circuit/quantumregister.py +1 -1
  99. qiskit/circuit/random/__init__.py +1 -1
  100. qiskit/circuit/random/utils.py +175 -26
  101. qiskit/circuit/register.py +5 -7
  102. qiskit/circuit/singleton.py +3 -3
  103. qiskit/circuit/tools/pi_check.py +4 -4
  104. qiskit/compiler/assembler.py +95 -24
  105. qiskit/compiler/scheduler.py +2 -2
  106. qiskit/compiler/transpiler.py +42 -128
  107. qiskit/converters/circuit_to_dag.py +4 -6
  108. qiskit/converters/circuit_to_gate.py +4 -8
  109. qiskit/converters/circuit_to_instruction.py +5 -17
  110. qiskit/converters/dag_to_circuit.py +2 -6
  111. qiskit/dagcircuit/collect_blocks.py +2 -2
  112. qiskit/dagcircuit/dagcircuit.py +190 -187
  113. qiskit/dagcircuit/dagdependency.py +4 -4
  114. qiskit/dagcircuit/dagdependency_v2.py +4 -4
  115. qiskit/dagcircuit/dagdepnode.py +1 -1
  116. qiskit/dagcircuit/dagnode.py +66 -157
  117. qiskit/passmanager/flow_controllers.py +1 -1
  118. qiskit/passmanager/passmanager.py +3 -3
  119. qiskit/primitives/__init__.py +1 -5
  120. qiskit/primitives/backend_estimator.py +25 -15
  121. qiskit/primitives/backend_estimator_v2.py +31 -7
  122. qiskit/primitives/backend_sampler.py +21 -12
  123. qiskit/primitives/backend_sampler_v2.py +12 -3
  124. qiskit/primitives/base/base_estimator.py +31 -4
  125. qiskit/primitives/base/base_primitive.py +2 -2
  126. qiskit/primitives/base/base_result.py +2 -2
  127. qiskit/primitives/base/base_sampler.py +26 -2
  128. qiskit/primitives/base/estimator_result.py +2 -2
  129. qiskit/primitives/base/sampler_result.py +2 -2
  130. qiskit/primitives/containers/__init__.py +0 -1
  131. qiskit/primitives/containers/bindings_array.py +2 -2
  132. qiskit/primitives/containers/bit_array.py +108 -10
  133. qiskit/primitives/containers/shape.py +3 -3
  134. qiskit/primitives/estimator.py +9 -2
  135. qiskit/primitives/primitive_job.py +1 -1
  136. qiskit/primitives/sampler.py +10 -3
  137. qiskit/primitives/statevector_estimator.py +5 -3
  138. qiskit/primitives/statevector_sampler.py +11 -5
  139. qiskit/primitives/utils.py +16 -0
  140. qiskit/providers/backend.py +15 -6
  141. qiskit/providers/backend_compat.py +7 -4
  142. qiskit/providers/basic_provider/basic_provider_tools.py +1 -1
  143. qiskit/providers/basic_provider/basic_simulator.py +33 -25
  144. qiskit/providers/fake_provider/fake_backend.py +10 -3
  145. qiskit/providers/fake_provider/fake_openpulse_2q.py +157 -149
  146. qiskit/providers/fake_provider/fake_openpulse_3q.py +228 -220
  147. qiskit/providers/fake_provider/fake_pulse_backend.py +2 -1
  148. qiskit/providers/fake_provider/fake_qasm_backend.py +7 -2
  149. qiskit/providers/fake_provider/generic_backend_v2.py +514 -68
  150. qiskit/providers/models/__init__.py +48 -11
  151. qiskit/providers/models/backendconfiguration.py +50 -4
  152. qiskit/providers/models/backendproperties.py +13 -2
  153. qiskit/providers/models/pulsedefaults.py +10 -11
  154. qiskit/providers/options.py +13 -13
  155. qiskit/providers/providerutils.py +3 -1
  156. qiskit/pulse/configuration.py +8 -12
  157. qiskit/pulse/instruction_schedule_map.py +3 -5
  158. qiskit/pulse/instructions/acquire.py +7 -8
  159. qiskit/pulse/instructions/instruction.py +2 -3
  160. qiskit/pulse/library/samplers/decorators.py +5 -9
  161. qiskit/pulse/library/symbolic_pulses.py +4 -7
  162. qiskit/pulse/library/waveform.py +2 -5
  163. qiskit/pulse/macros.py +11 -6
  164. qiskit/pulse/parser.py +8 -10
  165. qiskit/pulse/schedule.py +9 -17
  166. qiskit/pulse/transforms/alignments.py +1 -3
  167. qiskit/pulse/utils.py +1 -2
  168. qiskit/qasm/libs/stdgates.inc +35 -28
  169. qiskit/qasm2/__init__.py +7 -7
  170. qiskit/qasm2/export.py +5 -9
  171. qiskit/qasm2/parse.py +1 -1
  172. qiskit/qasm3/ast.py +9 -25
  173. qiskit/qasm3/exporter.py +582 -479
  174. qiskit/qasm3/printer.py +7 -16
  175. qiskit/qobj/common.py +10 -0
  176. qiskit/qobj/converters/lo_config.py +9 -0
  177. qiskit/qobj/converters/pulse_instruction.py +13 -6
  178. qiskit/qobj/pulse_qobj.py +69 -15
  179. qiskit/qobj/qasm_qobj.py +72 -20
  180. qiskit/qobj/utils.py +9 -0
  181. qiskit/qpy/__init__.py +1 -1
  182. qiskit/qpy/binary_io/circuits.py +8 -5
  183. qiskit/qpy/binary_io/schedules.py +1 -1
  184. qiskit/qpy/binary_io/value.py +3 -3
  185. qiskit/qpy/interface.py +3 -2
  186. qiskit/qpy/type_keys.py +2 -2
  187. qiskit/quantum_info/operators/channel/quantum_channel.py +3 -6
  188. qiskit/quantum_info/operators/channel/superop.py +2 -2
  189. qiskit/quantum_info/operators/channel/transformations.py +1 -1
  190. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -4
  191. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +1 -3
  192. qiskit/quantum_info/operators/dihedral/random.py +6 -3
  193. qiskit/quantum_info/operators/measures.py +2 -2
  194. qiskit/quantum_info/operators/op_shape.py +12 -20
  195. qiskit/quantum_info/operators/operator.py +14 -21
  196. qiskit/quantum_info/operators/predicates.py +1 -0
  197. qiskit/quantum_info/operators/symplectic/base_pauli.py +7 -11
  198. qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
  199. qiskit/quantum_info/operators/symplectic/pauli.py +3 -3
  200. qiskit/quantum_info/operators/symplectic/pauli_list.py +9 -10
  201. qiskit/quantum_info/operators/symplectic/random.py +1 -1
  202. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +15 -17
  203. qiskit/quantum_info/quaternion.py +1 -1
  204. qiskit/quantum_info/states/densitymatrix.py +5 -8
  205. qiskit/quantum_info/states/stabilizerstate.py +128 -37
  206. qiskit/quantum_info/states/statevector.py +4 -8
  207. qiskit/result/counts.py +2 -2
  208. qiskit/result/mitigation/correlated_readout_mitigator.py +2 -2
  209. qiskit/result/mitigation/local_readout_mitigator.py +2 -2
  210. qiskit/result/mitigation/utils.py +1 -3
  211. qiskit/result/models.py +17 -16
  212. qiskit/result/result.py +15 -20
  213. qiskit/scheduler/lowering.py +2 -2
  214. qiskit/synthesis/__init__.py +2 -1
  215. qiskit/synthesis/clifford/__init__.py +1 -1
  216. qiskit/synthesis/clifford/clifford_decompose_ag.py +2 -2
  217. qiskit/synthesis/clifford/clifford_decompose_bm.py +10 -240
  218. qiskit/synthesis/clifford/clifford_decompose_greedy.py +9 -303
  219. qiskit/synthesis/clifford/clifford_decompose_layers.py +25 -23
  220. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +1 -1
  221. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +1 -1
  222. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +1 -1
  223. qiskit/synthesis/discrete_basis/solovay_kitaev.py +2 -2
  224. qiskit/synthesis/evolution/evolution_synthesis.py +4 -2
  225. qiskit/synthesis/evolution/lie_trotter.py +46 -19
  226. qiskit/synthesis/evolution/product_formula.py +111 -55
  227. qiskit/synthesis/evolution/qdrift.py +40 -10
  228. qiskit/synthesis/evolution/suzuki_trotter.py +43 -33
  229. qiskit/synthesis/linear/__init__.py +1 -0
  230. qiskit/synthesis/linear/cnot_synth.py +22 -96
  231. qiskit/synthesis/linear/linear_depth_lnn.py +8 -8
  232. qiskit/synthesis/linear/linear_matrix_utils.py +13 -161
  233. qiskit/synthesis/linear_phase/cnot_phase_synth.py +1 -1
  234. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +3 -3
  235. qiskit/synthesis/linear_phase/cz_depth_lnn.py +1 -1
  236. qiskit/synthesis/one_qubit/one_qubit_decompose.py +29 -29
  237. qiskit/synthesis/permutation/permutation_full.py +5 -29
  238. qiskit/synthesis/permutation/permutation_lnn.py +2 -24
  239. qiskit/synthesis/permutation/permutation_utils.py +2 -59
  240. qiskit/synthesis/qft/__init__.py +1 -0
  241. qiskit/synthesis/qft/qft_decompose_full.py +79 -0
  242. qiskit/synthesis/qft/qft_decompose_lnn.py +17 -9
  243. qiskit/synthesis/stabilizer/stabilizer_circuit.py +6 -6
  244. qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -2
  245. qiskit/synthesis/two_qubit/local_invariance.py +8 -38
  246. qiskit/synthesis/two_qubit/two_qubit_decompose.py +48 -129
  247. qiskit/synthesis/unitary/aqc/cnot_structures.py +1 -1
  248. qiskit/synthesis/unitary/qsd.py +5 -3
  249. qiskit/transpiler/__init__.py +1 -0
  250. qiskit/transpiler/basepasses.py +1 -1
  251. qiskit/transpiler/coupling.py +3 -3
  252. qiskit/transpiler/instruction_durations.py +1 -2
  253. qiskit/transpiler/layout.py +3 -3
  254. qiskit/transpiler/passes/__init__.py +2 -0
  255. qiskit/transpiler/passes/basis/basis_translator.py +84 -64
  256. qiskit/transpiler/passes/basis/translate_parameterized.py +3 -5
  257. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  258. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +10 -10
  259. qiskit/transpiler/passes/calibration/rx_builder.py +3 -3
  260. qiskit/transpiler/passes/calibration/rzx_builder.py +3 -3
  261. qiskit/transpiler/passes/layout/apply_layout.py +13 -3
  262. qiskit/transpiler/passes/layout/sabre_layout.py +10 -8
  263. qiskit/transpiler/passes/layout/sabre_pre_layout.py +4 -1
  264. qiskit/transpiler/passes/layout/set_layout.py +2 -2
  265. qiskit/transpiler/passes/layout/vf2_layout.py +1 -1
  266. qiskit/transpiler/passes/layout/vf2_utils.py +3 -3
  267. qiskit/transpiler/passes/optimization/__init__.py +1 -0
  268. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
  269. qiskit/transpiler/passes/optimization/commutation_analysis.py +7 -10
  270. qiskit/transpiler/passes/optimization/commutative_cancellation.py +35 -19
  271. qiskit/transpiler/passes/optimization/consolidate_blocks.py +17 -8
  272. qiskit/transpiler/passes/optimization/inverse_cancellation.py +6 -6
  273. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +64 -41
  274. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
  275. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +83 -0
  276. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +1 -1
  277. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +2 -2
  278. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -1
  279. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -2
  280. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
  281. qiskit/transpiler/passes/routing/layout_transformation.py +2 -1
  282. qiskit/transpiler/passes/routing/sabre_swap.py +35 -26
  283. qiskit/transpiler/passes/routing/star_prerouting.py +80 -105
  284. qiskit/transpiler/passes/routing/stochastic_swap.py +1 -3
  285. qiskit/transpiler/passes/scheduling/alap.py +1 -2
  286. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -2
  287. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
  288. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -2
  289. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +1 -1
  290. qiskit/transpiler/passes/scheduling/asap.py +1 -2
  291. qiskit/transpiler/passes/scheduling/base_scheduler.py +5 -5
  292. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +3 -3
  293. qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
  294. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -14
  295. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +7 -6
  296. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -3
  297. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +211 -36
  298. qiskit/transpiler/passes/synthesis/plugin.py +2 -2
  299. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +80 -40
  300. qiskit/transpiler/passes/utils/__init__.py +0 -1
  301. qiskit/transpiler/passes/utils/check_gate_direction.py +4 -4
  302. qiskit/transpiler/passes/utils/check_map.py +3 -6
  303. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +3 -4
  304. qiskit/transpiler/passes/utils/error.py +2 -2
  305. qiskit/transpiler/passes/utils/fixed_point.py +3 -3
  306. qiskit/transpiler/passes/utils/gate_direction.py +1 -1
  307. qiskit/transpiler/passes/utils/gates_basis.py +1 -2
  308. qiskit/transpiler/passmanager.py +7 -6
  309. qiskit/transpiler/preset_passmanagers/__init__.py +4 -228
  310. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +73 -18
  311. qiskit/transpiler/preset_passmanagers/common.py +3 -6
  312. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +518 -0
  313. qiskit/transpiler/preset_passmanagers/level0.py +1 -1
  314. qiskit/transpiler/target.py +27 -8
  315. qiskit/user_config.py +29 -6
  316. qiskit/utils/classtools.py +3 -3
  317. qiskit/utils/deprecation.py +3 -2
  318. qiskit/utils/lazy_tester.py +2 -2
  319. qiskit/utils/optionals.py +8 -8
  320. qiskit/visualization/bloch.py +18 -23
  321. qiskit/visualization/circuit/_utils.py +34 -10
  322. qiskit/visualization/circuit/circuit_visualization.py +23 -16
  323. qiskit/visualization/circuit/latex.py +29 -27
  324. qiskit/visualization/circuit/matplotlib.py +4 -2
  325. qiskit/visualization/circuit/qcstyle.py +2 -2
  326. qiskit/visualization/circuit/text.py +9 -15
  327. qiskit/visualization/dag_visualization.py +2 -2
  328. qiskit/visualization/pulse_v2/core.py +1 -1
  329. qiskit/visualization/pulse_v2/events.py +1 -1
  330. qiskit/visualization/pulse_v2/generators/frame.py +3 -4
  331. qiskit/visualization/pulse_v2/generators/waveform.py +5 -9
  332. qiskit/visualization/pulse_v2/layouts.py +1 -5
  333. qiskit/visualization/pulse_v2/plotters/matplotlib.py +1 -2
  334. qiskit/visualization/state_visualization.py +5 -6
  335. qiskit/visualization/timeline/plotters/matplotlib.py +1 -2
  336. qiskit/visualization/transition_visualization.py +7 -2
  337. {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/METADATA +12 -12
  338. {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/RECORD +342 -340
  339. {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/entry_points.txt +3 -0
  340. qiskit/transpiler/passes/utils/block_to_matrix.py +0 -47
  341. {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/LICENSE.txt +0 -0
  342. {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/WHEEL +0 -0
  343. {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/top_level.txt +0 -0
@@ -16,6 +16,7 @@ from __future__ import annotations
16
16
  import warnings
17
17
 
18
18
  from collections.abc import Iterable
19
+ from typing import List, Dict, Any, Union
19
20
  import numpy as np
20
21
 
21
22
  from qiskit import pulse
@@ -35,12 +36,12 @@ from qiskit.transpiler import CouplingMap, Target, InstructionProperties, QubitP
35
36
  from qiskit.providers import Options
36
37
  from qiskit.providers.basic_provider import BasicSimulator
37
38
  from qiskit.providers.backend import BackendV2
38
- from qiskit.providers.models import (
39
- PulseDefaults,
40
- Command,
41
- )
42
- from qiskit.qobj import PulseQobjInstruction, PulseLibraryItem
43
39
  from qiskit.utils import optionals as _optionals
40
+ from qiskit.providers.models.pulsedefaults import Command
41
+ from qiskit.qobj.converters.pulse_instruction import QobjToInstructionConverter
42
+ from qiskit.pulse.calibration_entries import PulseQobjDef
43
+ from qiskit.providers.models.pulsedefaults import MeasurementKernel, Discriminator
44
+ from qiskit.qobj.pulse_qobj import QobjMeasurementOption
44
45
 
45
46
  # Noise default values/ranges for duration and error of supported
46
47
  # instructions. There are two possible formats:
@@ -74,17 +75,432 @@ _QUBIT_PROPERTIES = {
74
75
  "frequency": (5e9, 5.5e9),
75
76
  }
76
77
 
77
- # The number of samples determines the pulse durations of the corresponding
78
- # instructions. This default defines pulses with durations in multiples of
79
- # 16 dt for consistency with the pulse granularity of real IBM devices, but
80
- # keeps the number smaller than what would be realistic for
81
- # manageability. If needed, more realistic durations could be added in the
82
- # future (order of 160dt for 1q gates, 1760dt for 2q gates and measure).
83
- _PULSE_LIBRARY = [
84
- PulseLibraryItem(name="pulse_1", samples=np.linspace(0, 1.0, 16, dtype=np.complex128)), # 16dt
85
- PulseLibraryItem(name="pulse_2", samples=np.linspace(0, 1.0, 32, dtype=np.complex128)), # 32dt
86
- PulseLibraryItem(name="pulse_3", samples=np.linspace(0, 1.0, 64, dtype=np.complex128)), # 64dt
87
- ]
78
+
79
+ class PulseDefaults:
80
+ """Internal - Description of default settings for Pulse systems. These are instructions
81
+ or settings that
82
+ may be good starting points for the Pulse user. The user may modify these defaults for custom
83
+ scheduling.
84
+ """
85
+
86
+ # Copy from the deprecated from qiskit.providers.models.pulsedefaults.PulseDefaults
87
+
88
+ _data = {}
89
+
90
+ def __init__(
91
+ self,
92
+ qubit_freq_est: List[float],
93
+ meas_freq_est: List[float],
94
+ buffer: int,
95
+ pulse_library: List[PulseLibraryItem],
96
+ cmd_def: List[Command],
97
+ meas_kernel: MeasurementKernel = None,
98
+ discriminator: Discriminator = None,
99
+ **kwargs: Dict[str, Any],
100
+ ):
101
+ """
102
+ Validate and reformat transport layer inputs to initialize.
103
+ Args:
104
+ qubit_freq_est: Estimated qubit frequencies in GHz.
105
+ meas_freq_est: Estimated measurement cavity frequencies in GHz.
106
+ buffer: Default buffer time (in units of dt) between pulses.
107
+ pulse_library: Pulse name and sample definitions.
108
+ cmd_def: Operation name and definition in terms of Commands.
109
+ meas_kernel: The measurement kernels
110
+ discriminator: The discriminators
111
+ **kwargs: Other attributes for the super class.
112
+ """
113
+ self._data = {}
114
+ self.buffer = buffer
115
+ self.qubit_freq_est = [freq * 1e9 for freq in qubit_freq_est]
116
+ """Qubit frequencies in Hertz."""
117
+ self.meas_freq_est = [freq * 1e9 for freq in meas_freq_est]
118
+ """Measurement frequencies in Hertz."""
119
+ self.pulse_library = pulse_library
120
+ self.cmd_def = cmd_def
121
+ self.instruction_schedule_map = InstructionScheduleMap()
122
+ self.converter = QobjToInstructionConverter(pulse_library)
123
+
124
+ for inst in cmd_def:
125
+ entry = PulseQobjDef(converter=self.converter, name=inst.name)
126
+ entry.define(inst.sequence, user_provided=False)
127
+ self.instruction_schedule_map._add(
128
+ instruction_name=inst.name,
129
+ qubits=tuple(inst.qubits),
130
+ entry=entry,
131
+ )
132
+
133
+ if meas_kernel is not None:
134
+ self.meas_kernel = meas_kernel
135
+ if discriminator is not None:
136
+ self.discriminator = discriminator
137
+
138
+ self._data.update(kwargs)
139
+
140
+ def __getattr__(self, name):
141
+ try:
142
+ return self._data[name]
143
+ except KeyError as ex:
144
+ raise AttributeError(f"Attribute {name} is not defined") from ex
145
+
146
+ def to_dict(self):
147
+ """Return a dictionary format representation of the PulseDefaults.
148
+ Returns:
149
+ dict: The dictionary form of the PulseDefaults.
150
+ """
151
+ out_dict = {
152
+ "qubit_freq_est": self.qubit_freq_est,
153
+ "meas_freq_est": self.qubit_freq_est,
154
+ "buffer": self.buffer,
155
+ "pulse_library": [x.to_dict() for x in self.pulse_library],
156
+ "cmd_def": [x.to_dict() for x in self.cmd_def],
157
+ }
158
+ if hasattr(self, "meas_kernel"):
159
+ out_dict["meas_kernel"] = self.meas_kernel.to_dict()
160
+ if hasattr(self, "discriminator"):
161
+ out_dict["discriminator"] = self.discriminator.to_dict()
162
+ for key, value in self.__dict__.items():
163
+ if key not in [
164
+ "qubit_freq_est",
165
+ "meas_freq_est",
166
+ "buffer",
167
+ "pulse_library",
168
+ "cmd_def",
169
+ "meas_kernel",
170
+ "discriminator",
171
+ "converter",
172
+ "instruction_schedule_map",
173
+ ]:
174
+ out_dict[key] = value
175
+ out_dict.update(self._data)
176
+
177
+ out_dict["qubit_freq_est"] = [freq * 1e-9 for freq in self.qubit_freq_est]
178
+ out_dict["meas_freq_est"] = [freq * 1e-9 for freq in self.meas_freq_est]
179
+ return out_dict
180
+
181
+ @classmethod
182
+ def from_dict(cls, data):
183
+ """Create a new PulseDefaults object from a dictionary.
184
+
185
+ Args:
186
+ data (dict): A dictionary representing the PulseDefaults
187
+ to create. It will be in the same format as output by
188
+ :meth:`to_dict`.
189
+ Returns:
190
+ PulseDefaults: The PulseDefaults from the input dictionary.
191
+ """
192
+ schema = {
193
+ "pulse_library": PulseLibraryItem, # The class PulseLibraryItem is deprecated
194
+ "cmd_def": Command,
195
+ "meas_kernel": MeasurementKernel,
196
+ "discriminator": Discriminator,
197
+ }
198
+
199
+ # Pulse defaults data is nested dictionary.
200
+ # To avoid deepcopy and avoid mutating the source object, create new dict here.
201
+ in_data = {}
202
+ for key, value in data.items():
203
+ if key in schema:
204
+ with warnings.catch_warnings():
205
+ # The class PulseLibraryItem is deprecated
206
+ warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
207
+ if isinstance(value, list):
208
+ in_data[key] = list(map(schema[key].from_dict, value))
209
+ else:
210
+ in_data[key] = schema[key].from_dict(value)
211
+ else:
212
+ in_data[key] = value
213
+
214
+ return cls(**in_data)
215
+
216
+ def __str__(self):
217
+ qubit_freqs = [freq / 1e9 for freq in self.qubit_freq_est]
218
+ meas_freqs = [freq / 1e9 for freq in self.meas_freq_est]
219
+ qfreq = f"Qubit Frequencies [GHz]\n{qubit_freqs}"
220
+ mfreq = f"Measurement Frequencies [GHz]\n{meas_freqs} "
221
+ return f"<{self.__class__.__name__}({str(self.instruction_schedule_map)}{qfreq}\n{mfreq})>"
222
+
223
+
224
+ def _to_complex(value: Union[List[float], complex]) -> complex:
225
+ """Convert the input value to type ``complex``.
226
+ Args:
227
+ value: Value to be converted.
228
+ Returns:
229
+ Input value in ``complex``.
230
+ Raises:
231
+ TypeError: If the input value is not in the expected format.
232
+ """
233
+ if isinstance(value, list) and len(value) == 2:
234
+ return complex(value[0], value[1])
235
+ elif isinstance(value, complex):
236
+ return value
237
+
238
+ raise TypeError(f"{value} is not in a valid complex number format.")
239
+
240
+
241
+ class PulseLibraryItem:
242
+ """INTERNAL - An item in a pulse library."""
243
+
244
+ # Copy from the deprecated from qiskit.qobj.PulseLibraryItem
245
+ def __init__(self, name, samples):
246
+ """Instantiate a pulse library item.
247
+
248
+ Args:
249
+ name (str): A name for the pulse.
250
+ samples (list[complex]): A list of complex values defining pulse
251
+ shape.
252
+ """
253
+ self.name = name
254
+ if isinstance(samples[0], list):
255
+ self.samples = np.array([complex(sample[0], sample[1]) for sample in samples])
256
+ else:
257
+ self.samples = samples
258
+
259
+ def to_dict(self):
260
+ """Return a dictionary format representation of the pulse library item.
261
+
262
+ Returns:
263
+ dict: The dictionary form of the PulseLibraryItem.
264
+ """
265
+ return {"name": self.name, "samples": self.samples}
266
+
267
+ @classmethod
268
+ def from_dict(cls, data):
269
+ """Create a new PulseLibraryItem object from a dictionary.
270
+
271
+ Args:
272
+ data (dict): A dictionary for the experiment config
273
+
274
+ Returns:
275
+ PulseLibraryItem: The object from the input dictionary.
276
+ """
277
+ return cls(**data)
278
+
279
+ def __repr__(self):
280
+ return f"PulseLibraryItem({self.name}, {repr(self.samples)})"
281
+
282
+ def __str__(self):
283
+ return f"Pulse Library Item:\n\tname: {self.name}\n\tsamples: {self.samples}"
284
+
285
+ def __eq__(self, other):
286
+ if isinstance(other, PulseLibraryItem):
287
+ if self.to_dict() == other.to_dict():
288
+ return True
289
+ return False
290
+
291
+
292
+ class PulseQobjInstruction:
293
+ """Internal - A class representing a single instruction in a PulseQobj Experiment."""
294
+
295
+ # Copy from the deprecated from qiskit.qobj.PulseQobjInstruction
296
+
297
+ _COMMON_ATTRS = [
298
+ "ch",
299
+ "conditional",
300
+ "val",
301
+ "phase",
302
+ "frequency",
303
+ "duration",
304
+ "qubits",
305
+ "memory_slot",
306
+ "register_slot",
307
+ "label",
308
+ "type",
309
+ "pulse_shape",
310
+ "parameters",
311
+ ]
312
+
313
+ def __init__(
314
+ self,
315
+ name,
316
+ t0,
317
+ ch=None,
318
+ conditional=None,
319
+ val=None,
320
+ phase=None,
321
+ duration=None,
322
+ qubits=None,
323
+ memory_slot=None,
324
+ register_slot=None,
325
+ kernels=None,
326
+ discriminators=None,
327
+ label=None,
328
+ type=None, # pylint: disable=invalid-name,redefined-builtin
329
+ pulse_shape=None,
330
+ parameters=None,
331
+ frequency=None,
332
+ ):
333
+ """Instantiate a new PulseQobjInstruction object.
334
+
335
+ Args:
336
+ name (str): The name of the instruction
337
+ t0 (int): Pulse start time in integer **dt** units.
338
+ ch (str): The channel to apply the pulse instruction.
339
+ conditional (int): The register to use for a conditional for this
340
+ instruction
341
+ val (complex): Complex value to apply, bounded by an absolute value
342
+ of 1.
343
+ phase (float): if a ``fc`` instruction, the frame change phase in
344
+ radians.
345
+ frequency (float): if a ``sf`` instruction, the frequency in Hz.
346
+ duration (int): The duration of the pulse in **dt** units.
347
+ qubits (list): A list of ``int`` representing the qubits the
348
+ instruction operates on
349
+ memory_slot (list): If a ``measure`` instruction this is a list
350
+ of ``int`` containing the list of memory slots to store the
351
+ measurement results in (must be the same length as qubits).
352
+ If a ``bfunc`` instruction this is a single ``int`` of the
353
+ memory slot to store the boolean function result in.
354
+ register_slot (list): If a ``measure`` instruction this is a list
355
+ of ``int`` containing the list of register slots in which to
356
+ store the measurement results (must be the same length as
357
+ qubits). If a ``bfunc`` instruction this is a single ``int``
358
+ of the register slot in which to store the result.
359
+ kernels (list): List of :class:`QobjMeasurementOption` objects
360
+ defining the measurement kernels and set of parameters if the
361
+ measurement level is 1 or 2. Only used for ``acquire``
362
+ instructions.
363
+ discriminators (list): A list of :class:`QobjMeasurementOption`
364
+ used to set the discriminators to be used if the measurement
365
+ level is 2. Only used for ``acquire`` instructions.
366
+ label (str): Label of instruction
367
+ type (str): Type of instruction
368
+ pulse_shape (str): The shape of the parametric pulse
369
+ parameters (dict): The parameters for a parametric pulse
370
+ """
371
+ self.name = name
372
+ self.t0 = t0
373
+ if ch is not None:
374
+ self.ch = ch
375
+ if conditional is not None:
376
+ self.conditional = conditional
377
+ if val is not None:
378
+ self.val = val
379
+ if phase is not None:
380
+ self.phase = phase
381
+ if frequency is not None:
382
+ self.frequency = frequency
383
+ if duration is not None:
384
+ self.duration = duration
385
+ if qubits is not None:
386
+ self.qubits = qubits
387
+ if memory_slot is not None:
388
+ self.memory_slot = memory_slot
389
+ if register_slot is not None:
390
+ self.register_slot = register_slot
391
+ if kernels is not None:
392
+ self.kernels = kernels
393
+ if discriminators is not None:
394
+ self.discriminators = discriminators
395
+ if label is not None:
396
+ self.label = label
397
+ if type is not None:
398
+ self.type = type
399
+ if pulse_shape is not None:
400
+ self.pulse_shape = pulse_shape
401
+ if parameters is not None:
402
+ self.parameters = parameters
403
+
404
+ def to_dict(self):
405
+ """Return a dictionary format representation of the Instruction.
406
+
407
+ Returns:
408
+ dict: The dictionary form of the PulseQobjInstruction.
409
+ """
410
+ out_dict = {"name": self.name, "t0": self.t0}
411
+ for attr in self._COMMON_ATTRS:
412
+ if hasattr(self, attr):
413
+ out_dict[attr] = getattr(self, attr)
414
+ if hasattr(self, "kernels"):
415
+ out_dict["kernels"] = [x.to_dict() for x in self.kernels]
416
+ if hasattr(self, "discriminators"):
417
+ out_dict["discriminators"] = [x.to_dict() for x in self.discriminators]
418
+ return out_dict
419
+
420
+ def __repr__(self):
421
+ out = f'PulseQobjInstruction(name="{self.name}", t0={self.t0}'
422
+ for attr in self._COMMON_ATTRS:
423
+ attr_val = getattr(self, attr, None)
424
+ if attr_val is not None:
425
+ if isinstance(attr_val, str):
426
+ out += f', {attr}="{attr_val}"'
427
+ else:
428
+ out += f", {attr}={attr_val}"
429
+ out += ")"
430
+ return out
431
+
432
+ def __str__(self):
433
+ out = f"Instruction: {self.name}\n"
434
+ out += f"\t\tt0: {self.t0}\n"
435
+ for attr in self._COMMON_ATTRS:
436
+ if hasattr(self, attr):
437
+ out += f"\t\t{attr}: {getattr(self, attr)}\n"
438
+ return out
439
+
440
+ @classmethod
441
+ def from_dict(cls, data):
442
+ """Create a new PulseQobjExperimentConfig object from a dictionary.
443
+
444
+ Args:
445
+ data (dict): A dictionary for the experiment config
446
+
447
+ Returns:
448
+ PulseQobjInstruction: The object from the input dictionary.
449
+ """
450
+ schema = {
451
+ "discriminators": QobjMeasurementOption,
452
+ "kernels": QobjMeasurementOption,
453
+ }
454
+ skip = ["t0", "name"]
455
+
456
+ # Pulse instruction data is nested dictionary.
457
+ # To avoid deepcopy and avoid mutating the source object, create new dict here.
458
+ in_data = {}
459
+ for key, value in data.items():
460
+ if key in skip:
461
+ continue
462
+ if key == "parameters":
463
+ # This is flat dictionary of parametric pulse parameters
464
+ formatted_value = value.copy()
465
+ if "amp" in formatted_value:
466
+ formatted_value["amp"] = _to_complex(formatted_value["amp"])
467
+ in_data[key] = formatted_value
468
+ continue
469
+ if key in schema:
470
+ if isinstance(value, list):
471
+ in_data[key] = list(map(schema[key].from_dict, value))
472
+ else:
473
+ in_data[key] = schema[key].from_dict(value)
474
+ else:
475
+ in_data[key] = value
476
+
477
+ return cls(data["name"], data["t0"], **in_data)
478
+
479
+ def __eq__(self, other):
480
+ if isinstance(other, PulseQobjInstruction):
481
+ if self.to_dict() == other.to_dict():
482
+ return True
483
+ return False
484
+
485
+
486
+ def _pulse_library():
487
+ # The number of samples determines the pulse durations of the corresponding
488
+ # instructions. This default defines pulses with durations in multiples of
489
+ # 16 dt for consistency with the pulse granularity of real IBM devices, but
490
+ # keeps the number smaller than what would be realistic for
491
+ # manageability. If needed, more realistic durations could be added in the
492
+ # future (order of 160dt for 1q gates, 1760dt for 2q gates and measure).
493
+ return [
494
+ PulseLibraryItem(
495
+ name="pulse_1", samples=np.linspace(0, 1.0, 16, dtype=np.complex128)
496
+ ), # 16dt
497
+ PulseLibraryItem(
498
+ name="pulse_2", samples=np.linspace(0, 1.0, 32, dtype=np.complex128)
499
+ ), # 32dt
500
+ PulseLibraryItem(
501
+ name="pulse_3", samples=np.linspace(0, 1.0, 64, dtype=np.complex128)
502
+ ), # 64dt
503
+ ]
88
504
 
89
505
 
90
506
  class GenericBackendV2(BackendV2):
@@ -112,6 +528,8 @@ class GenericBackendV2(BackendV2):
112
528
  calibrate_instructions: bool | InstructionScheduleMap | None = None,
113
529
  dtm: float | None = None,
114
530
  seed: int | None = None,
531
+ pulse_channels: bool = True,
532
+ noise_info: bool = True,
115
533
  ):
116
534
  """
117
535
  Args:
@@ -159,6 +577,10 @@ class GenericBackendV2(BackendV2):
159
577
  None by default.
160
578
 
161
579
  seed: Optional seed for generation of default values.
580
+
581
+ pulse_channels: If true, sets default pulse channel information on the backend.
582
+
583
+ noise_info: If true, associates gates and qubits with default noise information.
162
584
  """
163
585
 
164
586
  super().__init__(
@@ -175,6 +597,10 @@ class GenericBackendV2(BackendV2):
175
597
  self._control_flow = control_flow
176
598
  self._calibrate_instructions = calibrate_instructions
177
599
  self._supported_gates = get_standard_gate_name_mapping()
600
+ self._noise_info = noise_info
601
+
602
+ if calibrate_instructions and not noise_info:
603
+ raise QiskitError("Must set parameter noise_info when calibrating instructions.")
178
604
 
179
605
  if coupling_map is None:
180
606
  self._coupling_map = CouplingMap().from_full(num_qubits)
@@ -198,7 +624,10 @@ class GenericBackendV2(BackendV2):
198
624
  self._basis_gates.append(name)
199
625
 
200
626
  self._build_generic_target()
201
- self._build_default_channels()
627
+ if pulse_channels:
628
+ self._build_default_channels()
629
+ else:
630
+ self.channels_map = {}
202
631
 
203
632
  @property
204
633
  def target(self):
@@ -249,31 +678,40 @@ class GenericBackendV2(BackendV2):
249
678
  acting on qargs.
250
679
  """
251
680
 
252
- pulse_library = _PULSE_LIBRARY
681
+ pulse_library = _pulse_library()
253
682
  # Note that the calibration pulses are different for
254
683
  # 1q gates vs 2q gates vs measurement instructions.
255
684
  if inst == "measure":
256
- sequence = [
257
- PulseQobjInstruction(
258
- name="acquire",
259
- duration=1792,
260
- t0=0,
261
- qubits=qargs,
262
- memory_slot=qargs,
263
- )
264
- ] + [PulseQobjInstruction(name=pulse_library[1].name, ch=f"m{i}", t0=0) for i in qargs]
685
+ with warnings.catch_warnings():
686
+ # The class PulseQobjInstruction is deprecated
687
+ warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
688
+ sequence = [
689
+ PulseQobjInstruction(
690
+ name="acquire",
691
+ duration=1792,
692
+ t0=0,
693
+ qubits=qargs,
694
+ memory_slot=qargs,
695
+ )
696
+ ] + [
697
+ PulseQobjInstruction(name=pulse_library[1].name, ch=f"m{i}", t0=0)
698
+ for i in qargs
699
+ ]
265
700
  return sequence
266
- if num_qubits == 1:
701
+ with warnings.catch_warnings():
702
+ # The class PulseQobjInstruction is deprecated
703
+ warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
704
+ if num_qubits == 1:
705
+ return [
706
+ PulseQobjInstruction(name="fc", ch=f"u{qargs[0]}", t0=0, phase="-P0"),
707
+ PulseQobjInstruction(name=pulse_library[0].name, ch=f"d{qargs[0]}", t0=0),
708
+ ]
267
709
  return [
268
- PulseQobjInstruction(name="fc", ch=f"u{qargs[0]}", t0=0, phase="-P0"),
269
- PulseQobjInstruction(name=pulse_library[0].name, ch=f"d{qargs[0]}", t0=0),
710
+ PulseQobjInstruction(name=pulse_library[1].name, ch=f"d{qargs[0]}", t0=0),
711
+ PulseQobjInstruction(name=pulse_library[2].name, ch=f"u{qargs[0]}", t0=0),
712
+ PulseQobjInstruction(name=pulse_library[1].name, ch=f"d{qargs[1]}", t0=0),
713
+ PulseQobjInstruction(name="fc", ch=f"d{qargs[1]}", t0=0, phase=2.1),
270
714
  ]
271
- return [
272
- PulseQobjInstruction(name=pulse_library[1].name, ch=f"d{qargs[0]}", t0=0),
273
- PulseQobjInstruction(name=pulse_library[2].name, ch=f"u{qargs[0]}", t0=0),
274
- PulseQobjInstruction(name=pulse_library[1].name, ch=f"d{qargs[1]}", t0=0),
275
- PulseQobjInstruction(name="fc", ch=f"d{qargs[1]}", t0=0, phase=2.1),
276
- ]
277
715
 
278
716
  def _generate_calibration_defaults(self) -> PulseDefaults:
279
717
  """Generate pulse calibration defaults as specified with `self._calibrate_instructions`.
@@ -330,7 +768,7 @@ class GenericBackendV2(BackendV2):
330
768
  qubit_freq_est=qubit_freq_est,
331
769
  meas_freq_est=meas_freq_est,
332
770
  buffer=0,
333
- pulse_library=_PULSE_LIBRARY,
771
+ pulse_library=_pulse_library(),
334
772
  cmd_def=cmd_def,
335
773
  )
336
774
 
@@ -340,22 +778,31 @@ class GenericBackendV2(BackendV2):
340
778
  """
341
779
  # the qubit properties are sampled from default ranges
342
780
  properties = _QUBIT_PROPERTIES
343
- self._target = Target(
344
- description=f"Generic Target with {self._num_qubits} qubits",
345
- num_qubits=self._num_qubits,
346
- dt=properties["dt"],
347
- qubit_properties=[
348
- QubitProperties(
349
- t1=self._rng.uniform(properties["t1"][0], properties["t1"][1]),
350
- t2=self._rng.uniform(properties["t2"][0], properties["t2"][1]),
351
- frequency=self._rng.uniform(
352
- properties["frequency"][0], properties["frequency"][1]
353
- ),
354
- )
355
- for _ in range(self._num_qubits)
356
- ],
357
- concurrent_measurements=[list(range(self._num_qubits))],
358
- )
781
+ if not self._noise_info:
782
+ self._target = Target(
783
+ description=f"Generic Target with {self._num_qubits} qubits",
784
+ num_qubits=self._num_qubits,
785
+ dt=properties["dt"],
786
+ qubit_properties=None,
787
+ concurrent_measurements=[list(range(self._num_qubits))],
788
+ )
789
+ else:
790
+ self._target = Target(
791
+ description=f"Generic Target with {self._num_qubits} qubits",
792
+ num_qubits=self._num_qubits,
793
+ dt=properties["dt"],
794
+ qubit_properties=[
795
+ QubitProperties(
796
+ t1=self._rng.uniform(properties["t1"][0], properties["t1"][1]),
797
+ t2=self._rng.uniform(properties["t2"][0], properties["t2"][1]),
798
+ frequency=self._rng.uniform(
799
+ properties["frequency"][0], properties["frequency"][1]
800
+ ),
801
+ )
802
+ for _ in range(self._num_qubits)
803
+ ],
804
+ concurrent_measurements=[list(range(self._num_qubits))],
805
+ )
359
806
 
360
807
  # Generate instruction schedule map with calibrations to add to target.
361
808
  calibration_inst_map = None
@@ -380,8 +827,13 @@ class GenericBackendV2(BackendV2):
380
827
  f"Provided basis gate {name} needs more qubits than {self.num_qubits}, "
381
828
  f"which is the size of the backend."
382
829
  )
383
- noise_params = self._get_noise_defaults(name, gate.num_qubits)
384
- self._add_noisy_instruction_to_target(gate, noise_params, calibration_inst_map)
830
+ if self._noise_info:
831
+ noise_params = self._get_noise_defaults(name, gate.num_qubits)
832
+ self._add_noisy_instruction_to_target(gate, noise_params, calibration_inst_map)
833
+ else:
834
+ qarg_set = self._coupling_map if gate.num_qubits > 1 else range(self.num_qubits)
835
+ props = {(qarg,) if isinstance(qarg, int) else qarg: None for qarg in qarg_set}
836
+ self._target.add_instruction(gate, properties=props, name=name)
385
837
 
386
838
  if self._control_flow:
387
839
  self._target.add_instruction(IfElseOp, name="if_else")
@@ -501,8 +953,8 @@ class GenericBackendV2(BackendV2):
501
953
  pulse_job = False
502
954
  if pulse_job is None: # submitted job is invalid
503
955
  raise QiskitError(
504
- "Invalid input object %s, must be either a "
505
- "QuantumCircuit, Schedule, or a list of either" % circuits
956
+ f"Invalid input object {circuits}, must be either a "
957
+ "QuantumCircuit, Schedule, or a list of either"
506
958
  )
507
959
  if pulse_job: # pulse job
508
960
  raise QiskitError("Pulse simulation is currently not supported for V2 backends.")
@@ -531,18 +983,12 @@ class GenericBackendV2(BackendV2):
531
983
 
532
984
  @classmethod
533
985
  def _default_options(cls) -> Options:
534
- with warnings.catch_warnings(): # TODO remove catch once aer release without Provider ABC
535
- warnings.filterwarnings(
536
- "ignore",
537
- category=DeprecationWarning,
538
- message=".+abstract Provider and ProviderV1.+",
539
- )
540
- if _optionals.HAS_AER:
541
- from qiskit_aer import AerSimulator
986
+ if _optionals.HAS_AER:
987
+ from qiskit_aer import AerSimulator
542
988
 
543
- return AerSimulator._default_options()
544
- else:
545
- return BasicSimulator._default_options()
989
+ return AerSimulator._default_options()
990
+ else:
991
+ return BasicSimulator._default_options()
546
992
 
547
993
  def drive_channel(self, qubit: int):
548
994
  drive_channels_map = getattr(self, "channels_map", {}).get("drive", {})