qiskit 1.4.1__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0__cp39-abi3-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +3 -9
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +35 -10
- qiskit/circuit/{add_control.py → _add_control.py} +32 -12
- qiskit/circuit/_classical_resource_map.py +5 -3
- qiskit/circuit/barrier.py +3 -7
- qiskit/circuit/classical/expr/__init__.py +31 -3
- qiskit/circuit/classical/expr/constructors.py +236 -28
- qiskit/circuit/classical/expr/expr.py +104 -3
- qiskit/circuit/classical/expr/visitors.py +75 -0
- qiskit/circuit/classical/types/__init__.py +12 -8
- qiskit/circuit/classical/types/ordering.py +14 -7
- qiskit/circuit/classical/types/types.py +36 -0
- qiskit/circuit/commutation_checker.py +34 -7
- qiskit/circuit/controlflow/__init__.py +32 -1
- qiskit/circuit/controlflow/_builder_utils.py +9 -5
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +1 -1
- qiskit/circuit/controlflow/builder.py +139 -39
- qiskit/circuit/controlflow/continue_loop.py +1 -3
- qiskit/circuit/controlflow/control_flow.py +10 -0
- qiskit/circuit/controlflow/for_loop.py +2 -1
- qiskit/circuit/controlflow/if_else.py +3 -16
- qiskit/circuit/controlflow/switch_case.py +2 -8
- qiskit/circuit/controlflow/while_loop.py +2 -7
- qiskit/circuit/controlledgate.py +2 -4
- qiskit/circuit/delay.py +40 -11
- qiskit/circuit/duration.py +0 -15
- qiskit/circuit/gate.py +2 -4
- qiskit/circuit/instruction.py +2 -141
- qiskit/circuit/instructionset.py +7 -54
- qiskit/circuit/library/__init__.py +469 -154
- qiskit/circuit/library/arithmetic/__init__.py +16 -10
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
- qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
- qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
- qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +52 -16
- qiskit/circuit/library/data_preparation/initializer.py +1 -1
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
- qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
- qiskit/circuit/library/generalized_gates/gms.py +1 -1
- qiskit/circuit/library/generalized_gates/isometry.py +1 -1
- qiskit/circuit/library/generalized_gates/pauli.py +1 -2
- qiskit/circuit/library/generalized_gates/uc.py +97 -7
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
- qiskit/circuit/library/generalized_gates/unitary.py +4 -2
- qiskit/circuit/library/graph_state.py +1 -0
- qiskit/circuit/library/hamiltonian_gate.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
- qiskit/circuit/library/n_local/n_local.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
- qiskit/circuit/library/overlap.py +2 -2
- qiskit/circuit/library/pauli_evolution.py +39 -24
- qiskit/circuit/library/phase_oracle.py +130 -51
- qiskit/circuit/library/standard_gates/__init__.py +0 -1
- qiskit/circuit/library/standard_gates/dcx.py +3 -4
- qiskit/circuit/library/standard_gates/ecr.py +3 -4
- qiskit/circuit/library/standard_gates/global_phase.py +5 -6
- qiskit/circuit/library/standard_gates/h.py +4 -9
- qiskit/circuit/library/standard_gates/i.py +2 -2
- qiskit/circuit/library/standard_gates/iswap.py +3 -4
- qiskit/circuit/library/standard_gates/p.py +15 -34
- qiskit/circuit/library/standard_gates/r.py +7 -10
- qiskit/circuit/library/standard_gates/rx.py +5 -15
- qiskit/circuit/library/standard_gates/rxx.py +3 -6
- qiskit/circuit/library/standard_gates/ry.py +5 -17
- qiskit/circuit/library/standard_gates/ryy.py +3 -6
- qiskit/circuit/library/standard_gates/rz.py +5 -17
- qiskit/circuit/library/standard_gates/rzx.py +3 -6
- qiskit/circuit/library/standard_gates/rzz.py +3 -6
- qiskit/circuit/library/standard_gates/s.py +6 -15
- qiskit/circuit/library/standard_gates/swap.py +4 -11
- qiskit/circuit/library/standard_gates/sx.py +7 -12
- qiskit/circuit/library/standard_gates/t.py +6 -7
- qiskit/circuit/library/standard_gates/u.py +2 -10
- qiskit/circuit/library/standard_gates/u1.py +5 -16
- qiskit/circuit/library/standard_gates/u2.py +2 -6
- qiskit/circuit/library/standard_gates/u3.py +3 -11
- qiskit/circuit/library/standard_gates/x.py +14 -62
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/y.py +4 -9
- qiskit/circuit/library/standard_gates/z.py +5 -15
- qiskit/circuit/measure.py +11 -2
- qiskit/circuit/parameterexpression.py +11 -0
- qiskit/circuit/quantumcircuit.py +890 -564
- qiskit/circuit/random/utils.py +12 -6
- qiskit/circuit/reset.py +5 -2
- qiskit/circuit/singleton.py +5 -11
- qiskit/circuit/store.py +0 -8
- qiskit/circuit/tools/pi_check.py +3 -0
- qiskit/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +6 -4
- qiskit/converters/circuit_to_dagdependency.py +0 -2
- qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
- qiskit/converters/circuit_to_gate.py +1 -1
- qiskit/converters/circuit_to_instruction.py +16 -29
- qiskit/converters/dag_to_circuit.py +7 -8
- qiskit/converters/dag_to_dagdependency.py +0 -1
- qiskit/converters/dag_to_dagdependency_v2.py +0 -1
- qiskit/converters/dagdependency_to_circuit.py +0 -6
- qiskit/converters/dagdependency_to_dag.py +0 -6
- qiskit/dagcircuit/collect_blocks.py +32 -20
- qiskit/dagcircuit/dagdependency.py +3 -37
- qiskit/dagcircuit/dagdependency_v2.py +5 -82
- qiskit/dagcircuit/dagnode.py +14 -2
- qiskit/passmanager/__init__.py +24 -6
- qiskit/passmanager/passmanager.py +26 -24
- qiskit/primitives/__init__.py +44 -35
- qiskit/primitives/backend_estimator_v2.py +102 -23
- qiskit/primitives/backend_sampler_v2.py +5 -20
- qiskit/primitives/base/__init__.py +4 -4
- qiskit/primitives/base/base_estimator.py +77 -82
- qiskit/primitives/base/base_primitive_job.py +2 -2
- qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
- qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
- qiskit/primitives/base/base_sampler.py +52 -60
- qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
- qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
- qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
- qiskit/primitives/containers/bindings_array.py +3 -1
- qiskit/primitives/containers/bit_array.py +23 -0
- qiskit/primitives/containers/data_bin.py +3 -1
- qiskit/primitives/containers/observables_array.py +19 -2
- qiskit/primitives/statevector_sampler.py +6 -8
- qiskit/primitives/utils.py +14 -189
- qiskit/providers/__init__.py +4 -130
- qiskit/providers/backend.py +11 -314
- qiskit/providers/basic_provider/__init__.py +3 -1
- qiskit/providers/basic_provider/basic_provider.py +29 -9
- qiskit/providers/basic_provider/basic_simulator.py +158 -298
- qiskit/providers/exceptions.py +0 -33
- qiskit/providers/fake_provider/__init__.py +0 -37
- qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
- qiskit/qasm2/__init__.py +21 -6
- qiskit/qasm2/export.py +2 -10
- qiskit/qasm2/parse.py +11 -25
- qiskit/qasm3/__init__.py +5 -1
- qiskit/qasm3/ast.py +44 -0
- qiskit/qasm3/exporter.py +65 -27
- qiskit/qasm3/printer.py +35 -4
- qiskit/qpy/__init__.py +162 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +96 -116
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +61 -388
- qiskit/qpy/binary_io/value.py +159 -33
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +29 -62
- qiskit/qpy/type_keys.py +58 -221
- qiskit/quantum_info/analysis/distance.py +3 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
- qiskit/quantum_info/operators/operator.py +6 -2
- qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
- qiskit/quantum_info/states/densitymatrix.py +16 -6
- qiskit/quantum_info/states/stabilizerstate.py +35 -4
- qiskit/quantum_info/states/statevector.py +16 -6
- qiskit/result/__init__.py +5 -17
- qiskit/result/models.py +18 -11
- qiskit/result/result.py +38 -134
- qiskit/result/sampled_expval.py +1 -2
- qiskit/result/utils.py +3 -4
- qiskit/synthesis/__init__.py +21 -1
- qiskit/synthesis/arithmetic/__init__.py +3 -1
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
- qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
- qiskit/synthesis/evolution/lie_trotter.py +10 -7
- qiskit/synthesis/evolution/product_formula.py +44 -35
- qiskit/synthesis/evolution/qdrift.py +17 -24
- qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
- qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
- qiskit/synthesis/two_qubit/__init__.py +1 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
- qiskit/transpiler/__init__.py +32 -232
- qiskit/transpiler/basepasses.py +20 -51
- qiskit/transpiler/layout.py +1 -1
- qiskit/transpiler/passes/__init__.py +4 -40
- qiskit/transpiler/passes/basis/basis_translator.py +5 -4
- qiskit/transpiler/passes/basis/decompose.py +1 -15
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
- qiskit/transpiler/passes/layout/apply_layout.py +4 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
- qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
- qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
- qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
- qiskit/transpiler/passes/optimization/__init__.py +2 -3
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
- qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
- qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +3 -2
- qiskit/transpiler/passes/routing/__init__.py +0 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
- qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
- qiskit/transpiler/passes/scheduling/__init__.py +1 -7
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
- qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
- qiskit/transpiler/passes/synthesis/plugin.py +4 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
- qiskit/transpiler/passes/utils/control_flow.py +2 -6
- qiskit/transpiler/passes/utils/gate_direction.py +7 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
- qiskit/transpiler/passmanager.py +13 -0
- qiskit/transpiler/passmanager_config.py +5 -81
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
- qiskit/transpiler/preset_passmanagers/common.py +140 -167
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
- qiskit/transpiler/preset_passmanagers/level0.py +2 -11
- qiskit/transpiler/preset_passmanagers/level1.py +2 -14
- qiskit/transpiler/preset_passmanagers/level2.py +2 -12
- qiskit/transpiler/preset_passmanagers/level3.py +2 -11
- qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
- qiskit/transpiler/target.py +78 -524
- qiskit/user_config.py +8 -4
- qiskit/utils/__init__.py +13 -12
- qiskit/utils/deprecation.py +4 -112
- qiskit/utils/optionals.py +11 -4
- qiskit/utils/parallel.py +214 -87
- qiskit/utils/units.py +4 -1
- qiskit/visualization/__init__.py +3 -7
- qiskit/visualization/array.py +4 -1
- qiskit/visualization/bloch.py +1 -1
- qiskit/visualization/circuit/_utils.py +19 -19
- qiskit/visualization/circuit/circuit_visualization.py +11 -4
- qiskit/visualization/circuit/matplotlib.py +13 -23
- qiskit/visualization/circuit/text.py +7 -3
- qiskit/visualization/counts_visualization.py +4 -0
- qiskit/visualization/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/library.py +4 -1
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +19 -2
- qiskit/visualization/timeline/core.py +19 -13
- qiskit/visualization/timeline/interface.py +19 -18
- qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
- qiskit/assembler/__init__.py +0 -42
- qiskit/assembler/assemble_circuits.py +0 -451
- qiskit/assembler/assemble_schedules.py +0 -367
- qiskit/assembler/disassemble.py +0 -310
- qiskit/assembler/run_config.py +0 -77
- qiskit/circuit/bit.py +0 -106
- qiskit/circuit/classicalfunction/__init__.py +0 -152
- qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
- qiskit/circuit/classicalfunction/classical_element.py +0 -54
- qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
- qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
- qiskit/circuit/classicalfunction/exceptions.py +0 -41
- qiskit/circuit/classicalfunction/types.py +0 -18
- qiskit/circuit/classicalfunction/utils.py +0 -91
- qiskit/circuit/classicalregister.py +0 -57
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
- qiskit/circuit/quantumregister.py +0 -75
- qiskit/circuit/register.py +0 -246
- qiskit/compiler/assembler.py +0 -689
- qiskit/compiler/scheduler.py +0 -109
- qiskit/compiler/sequencer.py +0 -71
- qiskit/primitives/backend_estimator.py +0 -486
- qiskit/primitives/backend_sampler.py +0 -222
- qiskit/primitives/estimator.py +0 -172
- qiskit/primitives/sampler.py +0 -162
- qiskit/providers/backend_compat.py +0 -507
- qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
- qiskit/providers/fake_provider/fake_1q.py +0 -91
- qiskit/providers/fake_provider/fake_backend.py +0 -165
- qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
- qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
- qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
- qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
- qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
- qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
- qiskit/providers/models/__init__.py +0 -89
- qiskit/providers/models/backendconfiguration.py +0 -1040
- qiskit/providers/models/backendproperties.py +0 -535
- qiskit/providers/models/backendstatus.py +0 -104
- qiskit/providers/models/jobstatus.py +0 -77
- qiskit/providers/models/pulsedefaults.py +0 -305
- qiskit/providers/provider.py +0 -95
- qiskit/pulse/__init__.py +0 -158
- qiskit/pulse/builder.py +0 -2262
- qiskit/pulse/calibration_entries.py +0 -381
- qiskit/pulse/channels.py +0 -227
- qiskit/pulse/configuration.py +0 -245
- qiskit/pulse/exceptions.py +0 -45
- qiskit/pulse/filters.py +0 -309
- qiskit/pulse/instruction_schedule_map.py +0 -424
- qiskit/pulse/instructions/__init__.py +0 -67
- qiskit/pulse/instructions/acquire.py +0 -150
- qiskit/pulse/instructions/delay.py +0 -71
- qiskit/pulse/instructions/directives.py +0 -154
- qiskit/pulse/instructions/frequency.py +0 -135
- qiskit/pulse/instructions/instruction.py +0 -270
- qiskit/pulse/instructions/phase.py +0 -152
- qiskit/pulse/instructions/play.py +0 -99
- qiskit/pulse/instructions/reference.py +0 -100
- qiskit/pulse/instructions/snapshot.py +0 -82
- qiskit/pulse/library/__init__.py +0 -97
- qiskit/pulse/library/continuous.py +0 -430
- qiskit/pulse/library/pulse.py +0 -148
- qiskit/pulse/library/samplers/__init__.py +0 -15
- qiskit/pulse/library/samplers/decorators.py +0 -295
- qiskit/pulse/library/samplers/strategies.py +0 -71
- qiskit/pulse/library/symbolic_pulses.py +0 -1989
- qiskit/pulse/library/waveform.py +0 -136
- qiskit/pulse/macros.py +0 -262
- qiskit/pulse/parameter_manager.py +0 -445
- qiskit/pulse/parser.py +0 -314
- qiskit/pulse/reference_manager.py +0 -58
- qiskit/pulse/schedule.py +0 -1854
- qiskit/pulse/transforms/__init__.py +0 -106
- qiskit/pulse/transforms/alignments.py +0 -406
- qiskit/pulse/transforms/base_transforms.py +0 -71
- qiskit/pulse/transforms/canonicalization.py +0 -498
- qiskit/pulse/transforms/dag.py +0 -122
- qiskit/pulse/utils.py +0 -149
- qiskit/qobj/__init__.py +0 -75
- qiskit/qobj/common.py +0 -81
- qiskit/qobj/converters/__init__.py +0 -18
- qiskit/qobj/converters/lo_config.py +0 -177
- qiskit/qobj/converters/pulse_instruction.py +0 -897
- qiskit/qobj/pulse_qobj.py +0 -709
- qiskit/qobj/qasm_qobj.py +0 -708
- qiskit/qobj/utils.py +0 -46
- qiskit/result/mitigation/base_readout_mitigator.py +0 -79
- qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
- qiskit/result/mitigation/local_readout_mitigator.py +0 -328
- qiskit/result/mitigation/utils.py +0 -217
- qiskit/scheduler/__init__.py +0 -40
- qiskit/scheduler/config.py +0 -37
- qiskit/scheduler/lowering.py +0 -187
- qiskit/scheduler/methods/__init__.py +0 -15
- qiskit/scheduler/methods/basic.py +0 -140
- qiskit/scheduler/schedule_circuit.py +0 -69
- qiskit/scheduler/sequence.py +0 -104
- qiskit/transpiler/passes/calibration/__init__.py +0 -17
- qiskit/transpiler/passes/calibration/base_builder.py +0 -79
- qiskit/transpiler/passes/calibration/builders.py +0 -20
- qiskit/transpiler/passes/calibration/exceptions.py +0 -22
- qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
- qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
- qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
- qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
- qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
- qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
- qiskit/transpiler/passes/scheduling/alap.py +0 -153
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
- qiskit/transpiler/passes/scheduling/asap.py +0 -175
- qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
- qiskit/utils/deprecate_pulse.py +0 -119
- qiskit/utils/multiprocessing.py +0 -56
- qiskit/visualization/pulse_v2/__init__.py +0 -21
- qiskit/visualization/pulse_v2/core.py +0 -901
- qiskit/visualization/pulse_v2/device_info.py +0 -173
- qiskit/visualization/pulse_v2/drawings.py +0 -253
- qiskit/visualization/pulse_v2/events.py +0 -254
- qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
- qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
- qiskit/visualization/pulse_v2/generators/chart.py +0 -208
- qiskit/visualization/pulse_v2/generators/frame.py +0 -436
- qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
- qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
- qiskit/visualization/pulse_v2/interface.py +0 -459
- qiskit/visualization/pulse_v2/layouts.py +0 -387
- qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
- qiskit/visualization/pulse_v2/stylesheet.py +0 -312
- qiskit/visualization/pulse_v2/types.py +0 -242
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -15,12 +15,8 @@
|
|
15
15
|
from __future__ import annotations
|
16
16
|
import warnings
|
17
17
|
|
18
|
-
from collections.abc import Iterable
|
19
|
-
from typing import List, Dict, Any, Union
|
20
18
|
import numpy as np
|
21
19
|
|
22
|
-
from qiskit import pulse
|
23
|
-
from qiskit.pulse.instruction_schedule_map import InstructionScheduleMap
|
24
20
|
from qiskit.circuit import QuantumCircuit, Instruction
|
25
21
|
from qiskit.circuit.controlflow import (
|
26
22
|
IfElseOp,
|
@@ -37,12 +33,6 @@ from qiskit.providers import Options
|
|
37
33
|
from qiskit.providers.basic_provider import BasicSimulator
|
38
34
|
from qiskit.providers.backend import BackendV2
|
39
35
|
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
|
45
|
-
from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency, deprecate_pulse_arg
|
46
36
|
|
47
37
|
# Noise default values/ranges for duration and error of supported
|
48
38
|
# instructions. There are two possible formats:
|
@@ -77,440 +67,13 @@ _QUBIT_PROPERTIES = {
|
|
77
67
|
}
|
78
68
|
|
79
69
|
|
80
|
-
class PulseDefaults:
|
81
|
-
"""Internal - Description of default settings for Pulse systems. These are instructions
|
82
|
-
or settings that
|
83
|
-
may be good starting points for the Pulse user. The user may modify these defaults for custom
|
84
|
-
scheduling.
|
85
|
-
"""
|
86
|
-
|
87
|
-
# Copy from the deprecated from qiskit.providers.models.pulsedefaults.PulseDefaults
|
88
|
-
|
89
|
-
_data = {}
|
90
|
-
|
91
|
-
def __init__(
|
92
|
-
self,
|
93
|
-
qubit_freq_est: List[float],
|
94
|
-
meas_freq_est: List[float],
|
95
|
-
buffer: int,
|
96
|
-
pulse_library: List[PulseLibraryItem],
|
97
|
-
cmd_def: List[Command],
|
98
|
-
meas_kernel: MeasurementKernel = None,
|
99
|
-
discriminator: Discriminator = None,
|
100
|
-
**kwargs: Dict[str, Any],
|
101
|
-
):
|
102
|
-
"""
|
103
|
-
Validate and reformat transport layer inputs to initialize.
|
104
|
-
Args:
|
105
|
-
qubit_freq_est: Estimated qubit frequencies in GHz.
|
106
|
-
meas_freq_est: Estimated measurement cavity frequencies in GHz.
|
107
|
-
buffer: Default buffer time (in units of dt) between pulses.
|
108
|
-
pulse_library: Pulse name and sample definitions.
|
109
|
-
cmd_def: Operation name and definition in terms of Commands.
|
110
|
-
meas_kernel: The measurement kernels
|
111
|
-
discriminator: The discriminators
|
112
|
-
**kwargs: Other attributes for the super class.
|
113
|
-
"""
|
114
|
-
self._data = {}
|
115
|
-
self.buffer = buffer
|
116
|
-
self.qubit_freq_est = [freq * 1e9 for freq in qubit_freq_est]
|
117
|
-
"""Qubit frequencies in Hertz."""
|
118
|
-
self.meas_freq_est = [freq * 1e9 for freq in meas_freq_est]
|
119
|
-
"""Measurement frequencies in Hertz."""
|
120
|
-
self.pulse_library = pulse_library
|
121
|
-
self.cmd_def = cmd_def
|
122
|
-
self.instruction_schedule_map = InstructionScheduleMap()
|
123
|
-
self.converter = QobjToInstructionConverter(pulse_library)
|
124
|
-
|
125
|
-
for inst in cmd_def:
|
126
|
-
entry = PulseQobjDef(converter=self.converter, name=inst.name)
|
127
|
-
entry.define(inst.sequence, user_provided=False)
|
128
|
-
self.instruction_schedule_map._add(
|
129
|
-
instruction_name=inst.name,
|
130
|
-
qubits=tuple(inst.qubits),
|
131
|
-
entry=entry,
|
132
|
-
)
|
133
|
-
|
134
|
-
if meas_kernel is not None:
|
135
|
-
self.meas_kernel = meas_kernel
|
136
|
-
if discriminator is not None:
|
137
|
-
self.discriminator = discriminator
|
138
|
-
|
139
|
-
self._data.update(kwargs)
|
140
|
-
|
141
|
-
def __getattr__(self, name):
|
142
|
-
try:
|
143
|
-
return self._data[name]
|
144
|
-
except KeyError as ex:
|
145
|
-
raise AttributeError(f"Attribute {name} is not defined") from ex
|
146
|
-
|
147
|
-
def to_dict(self):
|
148
|
-
"""Return a dictionary format representation of the PulseDefaults.
|
149
|
-
Returns:
|
150
|
-
dict: The dictionary form of the PulseDefaults.
|
151
|
-
"""
|
152
|
-
out_dict = {
|
153
|
-
"qubit_freq_est": self.qubit_freq_est,
|
154
|
-
"meas_freq_est": self.qubit_freq_est,
|
155
|
-
"buffer": self.buffer,
|
156
|
-
"pulse_library": [x.to_dict() for x in self.pulse_library],
|
157
|
-
"cmd_def": [x.to_dict() for x in self.cmd_def],
|
158
|
-
}
|
159
|
-
if hasattr(self, "meas_kernel"):
|
160
|
-
out_dict["meas_kernel"] = self.meas_kernel.to_dict()
|
161
|
-
if hasattr(self, "discriminator"):
|
162
|
-
out_dict["discriminator"] = self.discriminator.to_dict()
|
163
|
-
for key, value in self.__dict__.items():
|
164
|
-
if key not in [
|
165
|
-
"qubit_freq_est",
|
166
|
-
"meas_freq_est",
|
167
|
-
"buffer",
|
168
|
-
"pulse_library",
|
169
|
-
"cmd_def",
|
170
|
-
"meas_kernel",
|
171
|
-
"discriminator",
|
172
|
-
"converter",
|
173
|
-
"instruction_schedule_map",
|
174
|
-
]:
|
175
|
-
out_dict[key] = value
|
176
|
-
out_dict.update(self._data)
|
177
|
-
|
178
|
-
out_dict["qubit_freq_est"] = [freq * 1e-9 for freq in self.qubit_freq_est]
|
179
|
-
out_dict["meas_freq_est"] = [freq * 1e-9 for freq in self.meas_freq_est]
|
180
|
-
return out_dict
|
181
|
-
|
182
|
-
@classmethod
|
183
|
-
def from_dict(cls, data):
|
184
|
-
"""Create a new PulseDefaults object from a dictionary.
|
185
|
-
|
186
|
-
Args:
|
187
|
-
data (dict): A dictionary representing the PulseDefaults
|
188
|
-
to create. It will be in the same format as output by
|
189
|
-
:meth:`to_dict`.
|
190
|
-
Returns:
|
191
|
-
PulseDefaults: The PulseDefaults from the input dictionary.
|
192
|
-
"""
|
193
|
-
schema = {
|
194
|
-
"pulse_library": PulseLibraryItem, # The class PulseLibraryItem is deprecated
|
195
|
-
"cmd_def": Command,
|
196
|
-
"meas_kernel": MeasurementKernel,
|
197
|
-
"discriminator": Discriminator,
|
198
|
-
}
|
199
|
-
|
200
|
-
# Pulse defaults data is nested dictionary.
|
201
|
-
# To avoid deepcopy and avoid mutating the source object, create new dict here.
|
202
|
-
in_data = {}
|
203
|
-
for key, value in data.items():
|
204
|
-
if key in schema:
|
205
|
-
with warnings.catch_warnings():
|
206
|
-
# The class PulseLibraryItem is deprecated
|
207
|
-
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
208
|
-
if isinstance(value, list):
|
209
|
-
in_data[key] = list(map(schema[key].from_dict, value))
|
210
|
-
else:
|
211
|
-
in_data[key] = schema[key].from_dict(value)
|
212
|
-
else:
|
213
|
-
in_data[key] = value
|
214
|
-
|
215
|
-
return cls(**in_data)
|
216
|
-
|
217
|
-
def __str__(self):
|
218
|
-
qubit_freqs = [freq / 1e9 for freq in self.qubit_freq_est]
|
219
|
-
meas_freqs = [freq / 1e9 for freq in self.meas_freq_est]
|
220
|
-
qfreq = f"Qubit Frequencies [GHz]\n{qubit_freqs}"
|
221
|
-
mfreq = f"Measurement Frequencies [GHz]\n{meas_freqs} "
|
222
|
-
return f"<{self.__class__.__name__}({str(self.instruction_schedule_map)}{qfreq}\n{mfreq})>"
|
223
|
-
|
224
|
-
|
225
|
-
def _to_complex(value: Union[List[float], complex]) -> complex:
|
226
|
-
"""Convert the input value to type ``complex``.
|
227
|
-
Args:
|
228
|
-
value: Value to be converted.
|
229
|
-
Returns:
|
230
|
-
Input value in ``complex``.
|
231
|
-
Raises:
|
232
|
-
TypeError: If the input value is not in the expected format.
|
233
|
-
"""
|
234
|
-
if isinstance(value, list) and len(value) == 2:
|
235
|
-
return complex(value[0], value[1])
|
236
|
-
elif isinstance(value, complex):
|
237
|
-
return value
|
238
|
-
|
239
|
-
raise TypeError(f"{value} is not in a valid complex number format.")
|
240
|
-
|
241
|
-
|
242
|
-
class PulseLibraryItem:
|
243
|
-
"""INTERNAL - An item in a pulse library."""
|
244
|
-
|
245
|
-
# Copy from the deprecated from qiskit.qobj.PulseLibraryItem
|
246
|
-
def __init__(self, name, samples):
|
247
|
-
"""Instantiate a pulse library item.
|
248
|
-
|
249
|
-
Args:
|
250
|
-
name (str): A name for the pulse.
|
251
|
-
samples (list[complex]): A list of complex values defining pulse
|
252
|
-
shape.
|
253
|
-
"""
|
254
|
-
self.name = name
|
255
|
-
if isinstance(samples[0], list):
|
256
|
-
self.samples = np.array([complex(sample[0], sample[1]) for sample in samples])
|
257
|
-
else:
|
258
|
-
self.samples = samples
|
259
|
-
|
260
|
-
def to_dict(self):
|
261
|
-
"""Return a dictionary format representation of the pulse library item.
|
262
|
-
|
263
|
-
Returns:
|
264
|
-
dict: The dictionary form of the PulseLibraryItem.
|
265
|
-
"""
|
266
|
-
return {"name": self.name, "samples": self.samples}
|
267
|
-
|
268
|
-
@classmethod
|
269
|
-
def from_dict(cls, data):
|
270
|
-
"""Create a new PulseLibraryItem object from a dictionary.
|
271
|
-
|
272
|
-
Args:
|
273
|
-
data (dict): A dictionary for the experiment config
|
274
|
-
|
275
|
-
Returns:
|
276
|
-
PulseLibraryItem: The object from the input dictionary.
|
277
|
-
"""
|
278
|
-
return cls(**data)
|
279
|
-
|
280
|
-
def __repr__(self):
|
281
|
-
return f"PulseLibraryItem({self.name}, {repr(self.samples)})"
|
282
|
-
|
283
|
-
def __str__(self):
|
284
|
-
return f"Pulse Library Item:\n\tname: {self.name}\n\tsamples: {self.samples}"
|
285
|
-
|
286
|
-
def __eq__(self, other):
|
287
|
-
if isinstance(other, PulseLibraryItem):
|
288
|
-
if self.to_dict() == other.to_dict():
|
289
|
-
return True
|
290
|
-
return False
|
291
|
-
|
292
|
-
|
293
|
-
class PulseQobjInstruction:
|
294
|
-
"""Internal - A class representing a single instruction in a PulseQobj Experiment."""
|
295
|
-
|
296
|
-
# Copy from the deprecated from qiskit.qobj.PulseQobjInstruction
|
297
|
-
|
298
|
-
_COMMON_ATTRS = [
|
299
|
-
"ch",
|
300
|
-
"conditional",
|
301
|
-
"val",
|
302
|
-
"phase",
|
303
|
-
"frequency",
|
304
|
-
"duration",
|
305
|
-
"qubits",
|
306
|
-
"memory_slot",
|
307
|
-
"register_slot",
|
308
|
-
"label",
|
309
|
-
"type",
|
310
|
-
"pulse_shape",
|
311
|
-
"parameters",
|
312
|
-
]
|
313
|
-
|
314
|
-
def __init__(
|
315
|
-
self,
|
316
|
-
name,
|
317
|
-
t0,
|
318
|
-
ch=None,
|
319
|
-
conditional=None,
|
320
|
-
val=None,
|
321
|
-
phase=None,
|
322
|
-
duration=None,
|
323
|
-
qubits=None,
|
324
|
-
memory_slot=None,
|
325
|
-
register_slot=None,
|
326
|
-
kernels=None,
|
327
|
-
discriminators=None,
|
328
|
-
label=None,
|
329
|
-
type=None, # pylint: disable=invalid-name,redefined-builtin
|
330
|
-
pulse_shape=None,
|
331
|
-
parameters=None,
|
332
|
-
frequency=None,
|
333
|
-
):
|
334
|
-
"""Instantiate a new PulseQobjInstruction object.
|
335
|
-
|
336
|
-
Args:
|
337
|
-
name (str): The name of the instruction
|
338
|
-
t0 (int): Pulse start time in integer **dt** units.
|
339
|
-
ch (str): The channel to apply the pulse instruction.
|
340
|
-
conditional (int): The register to use for a conditional for this
|
341
|
-
instruction
|
342
|
-
val (complex): Complex value to apply, bounded by an absolute value
|
343
|
-
of 1.
|
344
|
-
phase (float): if a ``fc`` instruction, the frame change phase in
|
345
|
-
radians.
|
346
|
-
frequency (float): if a ``sf`` instruction, the frequency in Hz.
|
347
|
-
duration (int): The duration of the pulse in **dt** units.
|
348
|
-
qubits (list): A list of ``int`` representing the qubits the
|
349
|
-
instruction operates on
|
350
|
-
memory_slot (list): If a ``measure`` instruction this is a list
|
351
|
-
of ``int`` containing the list of memory slots to store the
|
352
|
-
measurement results in (must be the same length as qubits).
|
353
|
-
If a ``bfunc`` instruction this is a single ``int`` of the
|
354
|
-
memory slot to store the boolean function result in.
|
355
|
-
register_slot (list): If a ``measure`` instruction this is a list
|
356
|
-
of ``int`` containing the list of register slots in which to
|
357
|
-
store the measurement results (must be the same length as
|
358
|
-
qubits). If a ``bfunc`` instruction this is a single ``int``
|
359
|
-
of the register slot in which to store the result.
|
360
|
-
kernels (list): List of :class:`QobjMeasurementOption` objects
|
361
|
-
defining the measurement kernels and set of parameters if the
|
362
|
-
measurement level is 1 or 2. Only used for ``acquire``
|
363
|
-
instructions.
|
364
|
-
discriminators (list): A list of :class:`QobjMeasurementOption`
|
365
|
-
used to set the discriminators to be used if the measurement
|
366
|
-
level is 2. Only used for ``acquire`` instructions.
|
367
|
-
label (str): Label of instruction
|
368
|
-
type (str): Type of instruction
|
369
|
-
pulse_shape (str): The shape of the parametric pulse
|
370
|
-
parameters (dict): The parameters for a parametric pulse
|
371
|
-
"""
|
372
|
-
self.name = name
|
373
|
-
self.t0 = t0
|
374
|
-
if ch is not None:
|
375
|
-
self.ch = ch
|
376
|
-
if conditional is not None:
|
377
|
-
self.conditional = conditional
|
378
|
-
if val is not None:
|
379
|
-
self.val = val
|
380
|
-
if phase is not None:
|
381
|
-
self.phase = phase
|
382
|
-
if frequency is not None:
|
383
|
-
self.frequency = frequency
|
384
|
-
if duration is not None:
|
385
|
-
self.duration = duration
|
386
|
-
if qubits is not None:
|
387
|
-
self.qubits = qubits
|
388
|
-
if memory_slot is not None:
|
389
|
-
self.memory_slot = memory_slot
|
390
|
-
if register_slot is not None:
|
391
|
-
self.register_slot = register_slot
|
392
|
-
if kernels is not None:
|
393
|
-
self.kernels = kernels
|
394
|
-
if discriminators is not None:
|
395
|
-
self.discriminators = discriminators
|
396
|
-
if label is not None:
|
397
|
-
self.label = label
|
398
|
-
if type is not None:
|
399
|
-
self.type = type
|
400
|
-
if pulse_shape is not None:
|
401
|
-
self.pulse_shape = pulse_shape
|
402
|
-
if parameters is not None:
|
403
|
-
self.parameters = parameters
|
404
|
-
|
405
|
-
def to_dict(self):
|
406
|
-
"""Return a dictionary format representation of the Instruction.
|
407
|
-
|
408
|
-
Returns:
|
409
|
-
dict: The dictionary form of the PulseQobjInstruction.
|
410
|
-
"""
|
411
|
-
out_dict = {"name": self.name, "t0": self.t0}
|
412
|
-
for attr in self._COMMON_ATTRS:
|
413
|
-
if hasattr(self, attr):
|
414
|
-
out_dict[attr] = getattr(self, attr)
|
415
|
-
if hasattr(self, "kernels"):
|
416
|
-
out_dict["kernels"] = [x.to_dict() for x in self.kernels]
|
417
|
-
if hasattr(self, "discriminators"):
|
418
|
-
out_dict["discriminators"] = [x.to_dict() for x in self.discriminators]
|
419
|
-
return out_dict
|
420
|
-
|
421
|
-
def __repr__(self):
|
422
|
-
out = f'PulseQobjInstruction(name="{self.name}", t0={self.t0}'
|
423
|
-
for attr in self._COMMON_ATTRS:
|
424
|
-
attr_val = getattr(self, attr, None)
|
425
|
-
if attr_val is not None:
|
426
|
-
if isinstance(attr_val, str):
|
427
|
-
out += f', {attr}="{attr_val}"'
|
428
|
-
else:
|
429
|
-
out += f", {attr}={attr_val}"
|
430
|
-
out += ")"
|
431
|
-
return out
|
432
|
-
|
433
|
-
def __str__(self):
|
434
|
-
out = f"Instruction: {self.name}\n"
|
435
|
-
out += f"\t\tt0: {self.t0}\n"
|
436
|
-
for attr in self._COMMON_ATTRS:
|
437
|
-
if hasattr(self, attr):
|
438
|
-
out += f"\t\t{attr}: {getattr(self, attr)}\n"
|
439
|
-
return out
|
440
|
-
|
441
|
-
@classmethod
|
442
|
-
def from_dict(cls, data):
|
443
|
-
"""Create a new PulseQobjExperimentConfig object from a dictionary.
|
444
|
-
|
445
|
-
Args:
|
446
|
-
data (dict): A dictionary for the experiment config
|
447
|
-
|
448
|
-
Returns:
|
449
|
-
PulseQobjInstruction: The object from the input dictionary.
|
450
|
-
"""
|
451
|
-
schema = {
|
452
|
-
"discriminators": QobjMeasurementOption,
|
453
|
-
"kernels": QobjMeasurementOption,
|
454
|
-
}
|
455
|
-
skip = ["t0", "name"]
|
456
|
-
|
457
|
-
# Pulse instruction data is nested dictionary.
|
458
|
-
# To avoid deepcopy and avoid mutating the source object, create new dict here.
|
459
|
-
in_data = {}
|
460
|
-
for key, value in data.items():
|
461
|
-
if key in skip:
|
462
|
-
continue
|
463
|
-
if key == "parameters":
|
464
|
-
# This is flat dictionary of parametric pulse parameters
|
465
|
-
formatted_value = value.copy()
|
466
|
-
if "amp" in formatted_value:
|
467
|
-
formatted_value["amp"] = _to_complex(formatted_value["amp"])
|
468
|
-
in_data[key] = formatted_value
|
469
|
-
continue
|
470
|
-
if key in schema:
|
471
|
-
if isinstance(value, list):
|
472
|
-
in_data[key] = list(map(schema[key].from_dict, value))
|
473
|
-
else:
|
474
|
-
in_data[key] = schema[key].from_dict(value)
|
475
|
-
else:
|
476
|
-
in_data[key] = value
|
477
|
-
|
478
|
-
return cls(data["name"], data["t0"], **in_data)
|
479
|
-
|
480
|
-
def __eq__(self, other):
|
481
|
-
if isinstance(other, PulseQobjInstruction):
|
482
|
-
if self.to_dict() == other.to_dict():
|
483
|
-
return True
|
484
|
-
return False
|
485
|
-
|
486
|
-
|
487
|
-
def _pulse_library():
|
488
|
-
# The number of samples determines the pulse durations of the corresponding
|
489
|
-
# instructions. This default defines pulses with durations in multiples of
|
490
|
-
# 16 dt for consistency with the pulse granularity of real IBM devices, but
|
491
|
-
# keeps the number smaller than what would be realistic for
|
492
|
-
# manageability. If needed, more realistic durations could be added in the
|
493
|
-
# future (order of 160dt for 1q gates, 1760dt for 2q gates and measure).
|
494
|
-
return [
|
495
|
-
PulseLibraryItem(
|
496
|
-
name="pulse_1", samples=np.linspace(0, 1.0, 16, dtype=np.complex128)
|
497
|
-
), # 16dt
|
498
|
-
PulseLibraryItem(
|
499
|
-
name="pulse_2", samples=np.linspace(0, 1.0, 32, dtype=np.complex128)
|
500
|
-
), # 32dt
|
501
|
-
PulseLibraryItem(
|
502
|
-
name="pulse_3", samples=np.linspace(0, 1.0, 64, dtype=np.complex128)
|
503
|
-
), # 64dt
|
504
|
-
]
|
505
|
-
|
506
|
-
|
507
70
|
class GenericBackendV2(BackendV2):
|
508
71
|
"""Generic :class:`~.BackendV2` implementation with a configurable constructor. This class will
|
509
72
|
return a :class:`~.BackendV2` instance that runs on a local simulator (in the spirit of fake
|
510
73
|
backends) and contains all the necessary information to test backend-interfacing components, such
|
511
74
|
as the transpiler. A :class:`.GenericBackendV2` instance can be constructed from as little as a
|
512
75
|
specified ``num_qubits``, but users can additionally configure the basis gates, coupling map,
|
513
|
-
ability to run dynamic circuits (control flow instructions)
|
76
|
+
ability to run dynamic circuits (control flow instructions) and dtm.
|
514
77
|
The remainder of the backend properties are generated by randomly sampling
|
515
78
|
from default ranges extracted from historical IBM backend data. The seed for this random
|
516
79
|
generation can be fixed to ensure the reproducibility of the backend output.
|
@@ -519,8 +82,6 @@ class GenericBackendV2(BackendV2):
|
|
519
82
|
transpilation.
|
520
83
|
"""
|
521
84
|
|
522
|
-
@deprecate_pulse_arg("pulse_channels")
|
523
|
-
@deprecate_pulse_arg("calibrate_instructions")
|
524
85
|
def __init__(
|
525
86
|
self,
|
526
87
|
num_qubits: int,
|
@@ -528,10 +89,9 @@ class GenericBackendV2(BackendV2):
|
|
528
89
|
*,
|
529
90
|
coupling_map: list[list[int]] | CouplingMap | None = None,
|
530
91
|
control_flow: bool = False,
|
531
|
-
calibrate_instructions: bool | InstructionScheduleMap | None = None,
|
532
92
|
dtm: float | None = None,
|
93
|
+
dt: float | None = None,
|
533
94
|
seed: int | None = None,
|
534
|
-
pulse_channels: bool = True,
|
535
95
|
noise_info: bool = True,
|
536
96
|
):
|
537
97
|
"""
|
@@ -563,25 +123,13 @@ class GenericBackendV2(BackendV2):
|
|
563
123
|
control_flow: Flag to enable control flow directives on the target
|
564
124
|
(defaults to False).
|
565
125
|
|
566
|
-
calibrate_instructions: DEPRECATED. Instruction calibration settings, this argument
|
567
|
-
supports both boolean and :class:`.InstructionScheduleMap` as
|
568
|
-
input types, and is ``None`` by default:
|
569
|
-
|
570
|
-
#. If ``calibrate_instructions==None``, no calibrations will be added to the target.
|
571
|
-
#. If ``calibrate_instructions==True``, all gates will be calibrated for all
|
572
|
-
qubits using the default pulse schedules generated internally.
|
573
|
-
#. If ``calibrate_instructions==False``, all gates will be "calibrated" for
|
574
|
-
all qubits with an empty pulse schedule.
|
575
|
-
#. If an :class:`.InstructionScheduleMap` instance is given, the calibrations
|
576
|
-
in this instruction schedule map will be appended to the target
|
577
|
-
instead of the default pulse schedules (this allows for custom calibrations).
|
578
|
-
|
579
126
|
dtm: System time resolution of output signals in nanoseconds.
|
580
127
|
None by default.
|
581
128
|
|
582
|
-
|
129
|
+
dt: System time resolution of input signals in nanoseconds.
|
130
|
+
None by default.
|
583
131
|
|
584
|
-
|
132
|
+
seed: Optional seed for generation of default values.
|
585
133
|
|
586
134
|
noise_info: If true, associates gates and qubits with default noise information.
|
587
135
|
"""
|
@@ -596,15 +144,12 @@ class GenericBackendV2(BackendV2):
|
|
596
144
|
self._sim = None
|
597
145
|
self._rng = np.random.default_rng(seed=seed)
|
598
146
|
self._dtm = dtm
|
147
|
+
self._dt = dt
|
599
148
|
self._num_qubits = num_qubits
|
600
149
|
self._control_flow = control_flow
|
601
|
-
self._calibrate_instructions = calibrate_instructions
|
602
150
|
self._supported_gates = get_standard_gate_name_mapping()
|
603
151
|
self._noise_info = noise_info
|
604
152
|
|
605
|
-
if calibrate_instructions and not noise_info:
|
606
|
-
raise QiskitError("Must set parameter noise_info when calibrating instructions.")
|
607
|
-
|
608
153
|
if coupling_map is None:
|
609
154
|
self._coupling_map = CouplingMap().from_full(num_qubits)
|
610
155
|
else:
|
@@ -627,10 +172,6 @@ class GenericBackendV2(BackendV2):
|
|
627
172
|
self._basis_gates.append(name)
|
628
173
|
|
629
174
|
self._build_generic_target()
|
630
|
-
if pulse_channels:
|
631
|
-
self._build_default_channels()
|
632
|
-
else:
|
633
|
-
self.channels_map = {}
|
634
175
|
|
635
176
|
@property
|
636
177
|
def target(self):
|
@@ -650,20 +191,6 @@ class GenericBackendV2(BackendV2):
|
|
650
191
|
def meas_map(self) -> list[list[int]]:
|
651
192
|
return self._target.concurrent_measurements
|
652
193
|
|
653
|
-
def _build_default_channels(self) -> None:
|
654
|
-
with warnings.catch_warnings():
|
655
|
-
warnings.simplefilter(action="ignore", category=DeprecationWarning)
|
656
|
-
# Prevent pulse deprecation warnings from being emitted
|
657
|
-
channels_map = {
|
658
|
-
"acquire": {(i,): [pulse.AcquireChannel(i)] for i in range(self.num_qubits)},
|
659
|
-
"drive": {(i,): [pulse.DriveChannel(i)] for i in range(self.num_qubits)},
|
660
|
-
"measure": {(i,): [pulse.MeasureChannel(i)] for i in range(self.num_qubits)},
|
661
|
-
"control": {
|
662
|
-
(edge): [pulse.ControlChannel(i)] for i, edge in enumerate(self._coupling_map)
|
663
|
-
},
|
664
|
-
}
|
665
|
-
setattr(self, "channels_map", channels_map)
|
666
|
-
|
667
194
|
def _get_noise_defaults(self, name: str, num_qubits: int) -> tuple:
|
668
195
|
"""Return noise default values/ranges for duration and error of supported
|
669
196
|
instructions. There are two possible formats:
|
@@ -677,110 +204,9 @@ class GenericBackendV2(BackendV2):
|
|
677
204
|
return _NOISE_DEFAULTS_FALLBACK["1-q"]
|
678
205
|
return _NOISE_DEFAULTS_FALLBACK["multi-q"]
|
679
206
|
|
680
|
-
def _get_calibration_sequence(
|
681
|
-
self, inst: str, num_qubits: int, qargs: tuple[int]
|
682
|
-
) -> list[PulseQobjInstruction]:
|
683
|
-
"""Return calibration pulse sequence for given instruction (defined by name and num_qubits)
|
684
|
-
acting on qargs.
|
685
|
-
"""
|
686
|
-
|
687
|
-
pulse_library = _pulse_library()
|
688
|
-
# Note that the calibration pulses are different for
|
689
|
-
# 1q gates vs 2q gates vs measurement instructions.
|
690
|
-
if inst == "measure":
|
691
|
-
with warnings.catch_warnings():
|
692
|
-
# The class PulseQobjInstruction is deprecated
|
693
|
-
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
694
|
-
sequence = [
|
695
|
-
PulseQobjInstruction(
|
696
|
-
name="acquire",
|
697
|
-
duration=1792,
|
698
|
-
t0=0,
|
699
|
-
qubits=qargs,
|
700
|
-
memory_slot=qargs,
|
701
|
-
)
|
702
|
-
] + [
|
703
|
-
PulseQobjInstruction(name=pulse_library[1].name, ch=f"m{i}", t0=0)
|
704
|
-
for i in qargs
|
705
|
-
]
|
706
|
-
return sequence
|
707
|
-
with warnings.catch_warnings():
|
708
|
-
# The class PulseQobjInstruction is deprecated
|
709
|
-
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
710
|
-
if num_qubits == 1:
|
711
|
-
return [
|
712
|
-
PulseQobjInstruction(name="fc", ch=f"u{qargs[0]}", t0=0, phase="-P0"),
|
713
|
-
PulseQobjInstruction(name=pulse_library[0].name, ch=f"d{qargs[0]}", t0=0),
|
714
|
-
]
|
715
|
-
return [
|
716
|
-
PulseQobjInstruction(name=pulse_library[1].name, ch=f"d{qargs[0]}", t0=0),
|
717
|
-
PulseQobjInstruction(name=pulse_library[2].name, ch=f"u{qargs[0]}", t0=0),
|
718
|
-
PulseQobjInstruction(name=pulse_library[1].name, ch=f"d{qargs[1]}", t0=0),
|
719
|
-
PulseQobjInstruction(name="fc", ch=f"d{qargs[1]}", t0=0, phase=2.1),
|
720
|
-
]
|
721
|
-
|
722
|
-
def _generate_calibration_defaults(self) -> PulseDefaults:
|
723
|
-
"""Generate pulse calibration defaults as specified with `self._calibrate_instructions`.
|
724
|
-
If `self._calibrate_instructions` is True, the pulse schedules will be generated from
|
725
|
-
a series of default calibration sequences. If `self._calibrate_instructions` is False,
|
726
|
-
the pulse schedules will contain empty calibration sequences, but still be generated and
|
727
|
-
added to the target.
|
728
|
-
"""
|
729
|
-
|
730
|
-
# If self._calibrate_instructions==True, this method
|
731
|
-
# will generate default pulse schedules for all gates in self._basis_gates,
|
732
|
-
# except for `delay` and `reset`.
|
733
|
-
calibration_buffer = self._basis_gates.copy()
|
734
|
-
for inst in ["delay", "reset"]:
|
735
|
-
calibration_buffer.remove(inst)
|
736
|
-
|
737
|
-
# List of calibration commands (generated from sequences of PulseQobjInstructions)
|
738
|
-
# corresponding to each calibrated instruction. Note that the calibration pulses
|
739
|
-
# are different for 1q gates vs 2q gates vs measurement instructions.
|
740
|
-
cmd_def = []
|
741
|
-
for inst in calibration_buffer:
|
742
|
-
num_qubits = self._supported_gates[inst].num_qubits
|
743
|
-
qarg_set = self._coupling_map if num_qubits > 1 else list(range(self.num_qubits))
|
744
|
-
if inst == "measure":
|
745
|
-
cmd_def.append(
|
746
|
-
Command(
|
747
|
-
name=inst,
|
748
|
-
qubits=qarg_set,
|
749
|
-
sequence=(
|
750
|
-
self._get_calibration_sequence(inst, num_qubits, qarg_set)
|
751
|
-
if self._calibrate_instructions
|
752
|
-
else []
|
753
|
-
),
|
754
|
-
)
|
755
|
-
)
|
756
|
-
else:
|
757
|
-
for qarg in qarg_set:
|
758
|
-
qubits = [qarg] if num_qubits == 1 else qarg
|
759
|
-
cmd_def.append(
|
760
|
-
Command(
|
761
|
-
name=inst,
|
762
|
-
qubits=qubits,
|
763
|
-
sequence=(
|
764
|
-
self._get_calibration_sequence(inst, num_qubits, qubits)
|
765
|
-
if self._calibrate_instructions
|
766
|
-
else []
|
767
|
-
),
|
768
|
-
)
|
769
|
-
)
|
770
|
-
|
771
|
-
qubit_freq_est = np.random.normal(4.8, scale=0.01, size=self.num_qubits).tolist()
|
772
|
-
meas_freq_est = np.linspace(6.4, 6.6, self.num_qubits).tolist()
|
773
|
-
return PulseDefaults(
|
774
|
-
qubit_freq_est=qubit_freq_est,
|
775
|
-
meas_freq_est=meas_freq_est,
|
776
|
-
buffer=0,
|
777
|
-
pulse_library=_pulse_library(),
|
778
|
-
cmd_def=cmd_def,
|
779
|
-
)
|
780
|
-
|
781
207
|
def _build_generic_target(self):
|
782
208
|
"""This method generates a :class:`~.Target` instance with
|
783
|
-
default qubit
|
209
|
+
default qubit and instruction properties.
|
784
210
|
"""
|
785
211
|
# the qubit properties are sampled from default ranges
|
786
212
|
properties = _QUBIT_PROPERTIES
|
@@ -788,7 +214,7 @@ class GenericBackendV2(BackendV2):
|
|
788
214
|
self._target = Target(
|
789
215
|
description=f"Generic Target with {self._num_qubits} qubits",
|
790
216
|
num_qubits=self._num_qubits,
|
791
|
-
dt=properties["dt"],
|
217
|
+
dt=properties["dt"] if self._dt is None else self._dt,
|
792
218
|
qubit_properties=None,
|
793
219
|
concurrent_measurements=[list(range(self._num_qubits))],
|
794
220
|
)
|
@@ -796,7 +222,7 @@ class GenericBackendV2(BackendV2):
|
|
796
222
|
self._target = Target(
|
797
223
|
description=f"Generic Target with {self._num_qubits} qubits",
|
798
224
|
num_qubits=self._num_qubits,
|
799
|
-
dt=properties["dt"],
|
225
|
+
dt=properties["dt"] if self._dt is None else self._dt,
|
800
226
|
qubit_properties=[
|
801
227
|
QubitProperties(
|
802
228
|
t1=self._rng.uniform(properties["t1"][0], properties["t1"][1]),
|
@@ -810,17 +236,8 @@ class GenericBackendV2(BackendV2):
|
|
810
236
|
concurrent_measurements=[list(range(self._num_qubits))],
|
811
237
|
)
|
812
238
|
|
813
|
-
# Generate instruction schedule map with calibrations to add to target.
|
814
|
-
calibration_inst_map = None
|
815
|
-
if self._calibrate_instructions is not None:
|
816
|
-
if isinstance(self._calibrate_instructions, InstructionScheduleMap):
|
817
|
-
calibration_inst_map = self._calibrate_instructions
|
818
|
-
else:
|
819
|
-
defaults = self._generate_calibration_defaults()
|
820
|
-
calibration_inst_map = defaults.instruction_schedule_map
|
821
|
-
|
822
239
|
# Iterate over gates, generate noise params from defaults,
|
823
|
-
# and add instructions
|
240
|
+
# and add instructions and noise information to the target.
|
824
241
|
for name in self._basis_gates:
|
825
242
|
if name not in self._supported_gates:
|
826
243
|
raise QiskitError(
|
@@ -835,7 +252,7 @@ class GenericBackendV2(BackendV2):
|
|
835
252
|
)
|
836
253
|
if self._noise_info:
|
837
254
|
noise_params = self._get_noise_defaults(name, gate.num_qubits)
|
838
|
-
self._add_noisy_instruction_to_target(gate, noise_params
|
255
|
+
self._add_noisy_instruction_to_target(gate, noise_params)
|
839
256
|
else:
|
840
257
|
qarg_set = self._coupling_map if gate.num_qubits > 1 else range(self.num_qubits)
|
841
258
|
props = {(qarg,) if isinstance(qarg, int) else qarg: None for qarg in qarg_set}
|
@@ -853,7 +270,6 @@ class GenericBackendV2(BackendV2):
|
|
853
270
|
self,
|
854
271
|
instruction: Instruction,
|
855
272
|
noise_params: tuple[float, ...] | None,
|
856
|
-
calibration_inst_map: InstructionScheduleMap | None,
|
857
273
|
) -> None:
|
858
274
|
"""Add instruction properties to target for specified instruction.
|
859
275
|
|
@@ -861,7 +277,6 @@ class GenericBackendV2(BackendV2):
|
|
861
277
|
instruction: Instance of instruction to be added to the target
|
862
278
|
noise_params: Error and duration noise values/ranges to
|
863
279
|
include in instruction properties.
|
864
|
-
calibration_inst_map: Instruction schedule map with calibration defaults
|
865
280
|
"""
|
866
281
|
qarg_set = self._coupling_map if instruction.num_qubits > 1 else range(self.num_qubits)
|
867
282
|
props = {}
|
@@ -878,67 +293,32 @@ class GenericBackendV2(BackendV2):
|
|
878
293
|
self._rng.uniform(*noise_params[2:]),
|
879
294
|
)
|
880
295
|
)
|
881
|
-
with warnings.catch_warnings():
|
882
|
-
warnings.simplefilter(action="ignore", category=DeprecationWarning)
|
883
|
-
# Prevent pulse deprecations from being emitted
|
884
|
-
if (
|
885
|
-
calibration_inst_map is not None
|
886
|
-
and instruction.name not in ["reset", "delay"]
|
887
|
-
and qarg in calibration_inst_map.qubits_with_instruction(instruction.name)
|
888
|
-
):
|
889
|
-
# Do NOT call .get method. This parses Qobj immediately.
|
890
|
-
# This operation is computationally expensive and should be bypassed.
|
891
|
-
calibration_entry = calibration_inst_map._get_calibration_entry(
|
892
|
-
instruction.name, qargs
|
893
|
-
)
|
894
|
-
else:
|
895
|
-
calibration_entry = None
|
896
|
-
if duration is not None and len(noise_params) > 2:
|
897
|
-
# Ensure exact conversion of duration from seconds to dt
|
898
|
-
dt = _QUBIT_PROPERTIES["dt"]
|
899
|
-
rounded_duration = round(duration / dt) * dt
|
900
|
-
# Clamp rounded duration to be between min and max values
|
901
|
-
duration = max(noise_params[0], min(rounded_duration, noise_params[1]))
|
902
|
-
props.update({qargs: InstructionProperties(duration, error, calibration_entry)})
|
903
|
-
self._target.add_instruction(instruction, props)
|
904
296
|
|
905
|
-
|
906
|
-
|
907
|
-
|
908
|
-
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
|
913
|
-
|
914
|
-
# This operation is computationally expensive and should be bypassed.
|
915
|
-
calibration_entry = calibration_inst_map._get_calibration_entry(
|
916
|
-
instruction.name, qargs
|
917
|
-
)
|
918
|
-
for qubit in qargs:
|
919
|
-
if qubit < self.num_qubits:
|
920
|
-
self._target[instruction.name][(qubit,)].calibration = calibration_entry
|
297
|
+
if duration is not None and len(noise_params) > 2:
|
298
|
+
# Ensure exact conversion of duration from seconds to dt
|
299
|
+
dt = _QUBIT_PROPERTIES["dt"]
|
300
|
+
rounded_duration = round(duration / dt) * dt
|
301
|
+
# Clamp rounded duration to be between min and max values
|
302
|
+
duration = max(noise_params[0], min(rounded_duration, noise_params[1]))
|
303
|
+
props.update({qargs: InstructionProperties(duration, error)})
|
304
|
+
|
305
|
+
self._target.add_instruction(instruction, props)
|
921
306
|
|
922
307
|
def run(self, run_input, **options):
|
923
308
|
"""Run on the backend using a simulator.
|
924
309
|
|
925
310
|
This method runs circuit jobs (an individual or a list of :class:`~.QuantumCircuit`
|
926
|
-
)
|
927
|
-
:class:`~.ScheduleBlock`) using :class:`~.BasicSimulator` or Aer simulator and returns a
|
311
|
+
) using :class:`~.BasicSimulator` or Aer simulator and returns a
|
928
312
|
:class:`~qiskit.providers.Job` object.
|
929
313
|
|
930
314
|
If qiskit-aer is installed, jobs will be run using the ``AerSimulator`` with
|
931
315
|
noise model of the backend. Otherwise, jobs will be run using the
|
932
316
|
``BasicSimulator`` simulator without noise.
|
933
317
|
|
934
|
-
Noisy simulations of pulse jobs are not yet supported in :class:`~.GenericBackendV2`.
|
935
|
-
|
936
318
|
Args:
|
937
|
-
run_input (QuantumCircuit or
|
938
|
-
individual or a list of
|
939
|
-
|
940
|
-
:class:`~qiskit.pulse.ScheduleBlock`, or
|
941
|
-
:class:`~qiskit.pulse.Schedule` objects to run on the backend.
|
319
|
+
run_input (QuantumCircuit or list): An
|
320
|
+
individual or a list of :class:`~qiskit.circuit.QuantumCircuit`
|
321
|
+
objects to run on the backend.
|
942
322
|
options: Any kwarg options to pass to the backend for running the
|
943
323
|
config. If a key is also present in the options
|
944
324
|
attribute/object, then the expectation is that the value
|
@@ -949,28 +329,19 @@ class GenericBackendV2(BackendV2):
|
|
949
329
|
Job: The job object for the run
|
950
330
|
|
951
331
|
Raises:
|
952
|
-
QiskitError: If
|
332
|
+
QiskitError: If input is not :class:`~qiskit.circuit.QuantumCircuit` or a list of
|
333
|
+
:class:`~qiskit.circuit.QuantumCircuit` objects.
|
953
334
|
"""
|
954
335
|
circuits = run_input
|
955
|
-
|
956
|
-
|
957
|
-
|
958
|
-
|
959
|
-
pulse_job = False
|
960
|
-
elif isinstance(circuits, list):
|
961
|
-
if circuits:
|
962
|
-
if all(isinstance(x, (pulse.Schedule, pulse.ScheduleBlock)) for x in circuits):
|
963
|
-
pulse_job = True
|
964
|
-
elif all(isinstance(x, QuantumCircuit) for x in circuits):
|
965
|
-
pulse_job = False
|
966
|
-
if pulse_job is None: # submitted job is invalid
|
336
|
+
if not isinstance(circuits, QuantumCircuit) and (
|
337
|
+
not isinstance(circuits, list)
|
338
|
+
or not all(isinstance(x, QuantumCircuit) for x in circuits)
|
339
|
+
):
|
967
340
|
raise QiskitError(
|
968
341
|
f"Invalid input object {circuits}, must be either a "
|
969
|
-
"QuantumCircuit
|
342
|
+
"QuantumCircuit or a list of QuantumCircuit objects"
|
970
343
|
)
|
971
|
-
|
972
|
-
raise QiskitError("Pulse simulation is currently not supported for V2 backends.")
|
973
|
-
# circuit job
|
344
|
+
|
974
345
|
if not _optionals.HAS_AER:
|
975
346
|
warnings.warn("Aer not found using BasicSimulator and no noise", RuntimeWarning)
|
976
347
|
if self._sim is None:
|
@@ -1001,35 +372,3 @@ class GenericBackendV2(BackendV2):
|
|
1001
372
|
return AerSimulator._default_options()
|
1002
373
|
else:
|
1003
374
|
return BasicSimulator._default_options()
|
1004
|
-
|
1005
|
-
@deprecate_pulse_dependency
|
1006
|
-
def drive_channel(self, qubit: int):
|
1007
|
-
drive_channels_map = getattr(self, "channels_map", {}).get("drive", {})
|
1008
|
-
qubits = (qubit,)
|
1009
|
-
if qubits in drive_channels_map:
|
1010
|
-
return drive_channels_map[qubits][0]
|
1011
|
-
return None
|
1012
|
-
|
1013
|
-
@deprecate_pulse_dependency
|
1014
|
-
def measure_channel(self, qubit: int):
|
1015
|
-
measure_channels_map = getattr(self, "channels_map", {}).get("measure", {})
|
1016
|
-
qubits = (qubit,)
|
1017
|
-
if qubits in measure_channels_map:
|
1018
|
-
return measure_channels_map[qubits][0]
|
1019
|
-
return None
|
1020
|
-
|
1021
|
-
@deprecate_pulse_dependency
|
1022
|
-
def acquire_channel(self, qubit: int):
|
1023
|
-
acquire_channels_map = getattr(self, "channels_map", {}).get("acquire", {})
|
1024
|
-
qubits = (qubit,)
|
1025
|
-
if qubits in acquire_channels_map:
|
1026
|
-
return acquire_channels_map[qubits][0]
|
1027
|
-
return None
|
1028
|
-
|
1029
|
-
@deprecate_pulse_dependency
|
1030
|
-
def control_channel(self, qubits: Iterable[int]):
|
1031
|
-
control_channels_map = getattr(self, "channels_map", {}).get("control", {})
|
1032
|
-
qubits = tuple(qubits)
|
1033
|
-
if qubits in control_channels_map:
|
1034
|
-
return control_channels_map[qubits]
|
1035
|
-
return []
|