qiskit 1.4.0__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0rc1__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 +2 -5
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +24 -5
- 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 +248 -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 +7 -140
- qiskit/circuit/instructionset.py +7 -54
- qiskit/circuit/library/__init__.py +34 -5
- 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/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 +2 -6
- 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 +13 -60
- 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 +4 -0
- qiskit/circuit/quantumcircuit.py +881 -555
- 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/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +4 -2
- 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 +5 -5
- 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 +2 -80
- 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 +141 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +91 -116
- qiskit/qpy/binary_io/schedules.py +61 -388
- qiskit/qpy/binary_io/value.py +168 -28
- 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 -10
- qiskit/result/result.py +28 -126
- 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 +2 -40
- qiskit/transpiler/passes/basis/basis_translator.py +4 -3
- 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 +5 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +4 -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 +1 -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 +1 -0
- 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 +30 -2
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
- 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 +127 -59
- 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 +101 -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 +67 -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/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +6 -0
- qiskit/visualization/timeline/core.py +27 -12
- qiskit/visualization/timeline/interface.py +23 -18
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +2 -1
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.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.0.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
qiskit/transpiler/target.py
CHANGED
@@ -20,12 +20,11 @@ from a backend
|
|
20
20
|
from __future__ import annotations
|
21
21
|
|
22
22
|
import itertools
|
23
|
-
import warnings
|
24
23
|
|
25
24
|
from typing import Optional, List, Any
|
26
25
|
from collections.abc import Mapping
|
27
|
-
import datetime
|
28
26
|
import io
|
27
|
+
import copy
|
29
28
|
import logging
|
30
29
|
import inspect
|
31
30
|
|
@@ -37,28 +36,16 @@ from qiskit._accelerate.target import (
|
|
37
36
|
BaseInstructionProperties,
|
38
37
|
)
|
39
38
|
|
40
|
-
from qiskit.circuit.parameter import Parameter
|
41
|
-
from qiskit.circuit.parameterexpression import ParameterValueType
|
42
|
-
from qiskit.circuit.gate import Gate
|
43
39
|
from qiskit.circuit.library.standard_gates import get_standard_gate_name_mapping
|
44
|
-
from qiskit.
|
45
|
-
from qiskit.pulse.calibration_entries import CalibrationEntry, ScheduleDef
|
46
|
-
from qiskit.pulse.schedule import Schedule, ScheduleBlock
|
40
|
+
from qiskit.circuit.duration import duration_in_dt
|
47
41
|
from qiskit.transpiler.coupling import CouplingMap
|
48
42
|
from qiskit.transpiler.exceptions import TranspilerError
|
49
43
|
from qiskit.transpiler.instruction_durations import InstructionDurations
|
50
44
|
from qiskit.transpiler.timing_constraints import TimingConstraints
|
51
|
-
from qiskit.providers.exceptions import BackendPropertyError
|
52
|
-
from qiskit.pulse.exceptions import PulseError, UnassignedDurationError
|
53
|
-
from qiskit.exceptions import QiskitError
|
54
45
|
|
55
46
|
# import QubitProperties here to provide convenience alias for building a
|
56
47
|
# full target
|
57
48
|
from qiskit.providers.backend import QubitProperties # pylint: disable=unused-import
|
58
|
-
from qiskit.providers.models.backendproperties import BackendProperties
|
59
|
-
from qiskit.utils import deprecate_func, deprecate_arg
|
60
|
-
from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency, deprecate_pulse_arg
|
61
|
-
|
62
49
|
|
63
50
|
logger = logging.getLogger(__name__)
|
64
51
|
|
@@ -73,10 +60,6 @@ class InstructionProperties(BaseInstructionProperties):
|
|
73
60
|
custom attributes for those custom/additional properties by the backend.
|
74
61
|
"""
|
75
62
|
|
76
|
-
__slots__ = [
|
77
|
-
"_calibration",
|
78
|
-
]
|
79
|
-
|
80
63
|
def __new__( # pylint: disable=keyword-arg-before-vararg
|
81
64
|
cls,
|
82
65
|
duration=None, # pylint: disable=keyword-arg-before-vararg
|
@@ -88,12 +71,10 @@ class InstructionProperties(BaseInstructionProperties):
|
|
88
71
|
cls, duration, error
|
89
72
|
)
|
90
73
|
|
91
|
-
@deprecate_pulse_arg("calibration", predicate=lambda cals: cals is not None)
|
92
74
|
def __init__(
|
93
75
|
self,
|
94
76
|
duration: float | None = None, # pylint: disable=unused-argument
|
95
77
|
error: float | None = None, # pylint: disable=unused-argument
|
96
|
-
calibration: Schedule | ScheduleBlock | CalibrationEntry | None = None,
|
97
78
|
):
|
98
79
|
"""Create a new ``InstructionProperties`` object
|
99
80
|
|
@@ -102,79 +83,11 @@ class InstructionProperties(BaseInstructionProperties):
|
|
102
83
|
specified set of qubits
|
103
84
|
error: The average error rate for the instruction on the specified
|
104
85
|
set of qubits.
|
105
|
-
calibration: DEPRECATED. The pulse representation of the instruction.
|
106
86
|
"""
|
107
87
|
super().__init__()
|
108
|
-
self._calibration: CalibrationEntry | None = None
|
109
|
-
self._calibration_prop = calibration
|
110
|
-
|
111
|
-
@property
|
112
|
-
@deprecate_pulse_dependency(is_property=True)
|
113
|
-
def calibration(self):
|
114
|
-
"""The pulse representation of the instruction.
|
115
|
-
|
116
|
-
.. note::
|
117
|
-
|
118
|
-
This attribute always returns a Qiskit pulse program, but it is internally
|
119
|
-
wrapped by the :class:`.CalibrationEntry` to manage unbound parameters
|
120
|
-
and to uniformly handle different data representation,
|
121
|
-
for example, un-parsed Pulse Qobj JSON that a backend provider may provide.
|
122
|
-
|
123
|
-
This value can be overridden through the property setter in following manner.
|
124
|
-
When you set either :class:`.Schedule` or :class:`.ScheduleBlock` this is
|
125
|
-
always treated as a user-defined (custom) calibration and
|
126
|
-
the transpiler may automatically attach the calibration data to the output circuit.
|
127
|
-
This calibration data may appear in the wire format as an inline calibration,
|
128
|
-
which may further update the backend standard instruction set architecture.
|
129
|
-
|
130
|
-
If you are a backend provider who provides a default calibration data
|
131
|
-
that is not needed to be attached to the transpiled quantum circuit,
|
132
|
-
you can directly set :class:`.CalibrationEntry` instance to this attribute,
|
133
|
-
in which you should set :code:`user_provided=False` when you define
|
134
|
-
calibration data for the entry. End users can still intentionally utilize
|
135
|
-
the calibration data, for example, to run pulse-level simulation of the circuit.
|
136
|
-
However, such entry doesn't appear in the wire format, and backend must
|
137
|
-
use own definition to compile the circuit down to the execution format.
|
138
|
-
|
139
|
-
"""
|
140
|
-
return self._calibration_prop
|
141
|
-
|
142
|
-
@calibration.setter
|
143
|
-
@deprecate_pulse_dependency(is_property=True)
|
144
|
-
def calibration(self, calibration: Schedule | ScheduleBlock | CalibrationEntry):
|
145
|
-
self._calibration_prop = calibration
|
146
|
-
|
147
|
-
@property
|
148
|
-
def _calibration_prop(self):
|
149
|
-
if self._calibration is None:
|
150
|
-
return None
|
151
|
-
with warnings.catch_warnings():
|
152
|
-
warnings.simplefilter(action="ignore", category=DeprecationWarning)
|
153
|
-
# Clean this alternative path from deprecation warning emitted by `get_schedule`
|
154
|
-
return self._calibration.get_schedule()
|
155
|
-
|
156
|
-
@_calibration_prop.setter
|
157
|
-
def _calibration_prop(self, calibration: Schedule | ScheduleBlock | CalibrationEntry):
|
158
|
-
if isinstance(calibration, (Schedule, ScheduleBlock)):
|
159
|
-
new_entry = ScheduleDef()
|
160
|
-
new_entry.define(calibration, user_provided=True)
|
161
|
-
else:
|
162
|
-
new_entry = calibration
|
163
|
-
self._calibration = new_entry
|
164
88
|
|
165
89
|
def __repr__(self):
|
166
|
-
return (
|
167
|
-
f"InstructionProperties(duration={self.duration}, error={self.error}"
|
168
|
-
f", calibration={self._calibration})"
|
169
|
-
)
|
170
|
-
|
171
|
-
def __getstate__(self) -> tuple:
|
172
|
-
return (super().__getstate__(), self._calibration_prop, self._calibration)
|
173
|
-
|
174
|
-
def __setstate__(self, state: tuple):
|
175
|
-
super().__setstate__(state[0])
|
176
|
-
self._calibration_prop = state[1]
|
177
|
-
self._calibration = state[2]
|
90
|
+
return f"InstructionProperties(duration={self.duration}, error={self.error})"
|
178
91
|
|
179
92
|
|
180
93
|
class Target(BaseTarget):
|
@@ -463,125 +376,6 @@ class Target(BaseTarget):
|
|
463
376
|
self._instruction_durations = None
|
464
377
|
self._instruction_schedule_map = None
|
465
378
|
|
466
|
-
@deprecate_pulse_dependency
|
467
|
-
def update_from_instruction_schedule_map(self, inst_map, inst_name_map=None, error_dict=None):
|
468
|
-
"""Update the target from an instruction schedule map.
|
469
|
-
|
470
|
-
If the input instruction schedule map contains new instructions not in
|
471
|
-
the target they will be added. However, if it contains additional qargs
|
472
|
-
for an existing instruction in the target it will error.
|
473
|
-
|
474
|
-
Args:
|
475
|
-
inst_map (InstructionScheduleMap): The instruction
|
476
|
-
inst_name_map (dict): An optional dictionary that maps any
|
477
|
-
instruction name in ``inst_map`` to an instruction object.
|
478
|
-
If not provided, instruction is pulled from the standard Qiskit gates,
|
479
|
-
and finally custom gate instance is created with schedule name.
|
480
|
-
error_dict (dict): A dictionary of errors of the form::
|
481
|
-
|
482
|
-
{gate_name: {qarg: error}}
|
483
|
-
|
484
|
-
for example::
|
485
|
-
|
486
|
-
{'rx': {(0, ): 1.4e-4, (1, ): 1.2e-4}}
|
487
|
-
|
488
|
-
For each entry in the ``inst_map`` if ``error_dict`` is defined
|
489
|
-
a when updating the ``Target`` the error value will be pulled from
|
490
|
-
this dictionary. If one is not found in ``error_dict`` then
|
491
|
-
``None`` will be used.
|
492
|
-
"""
|
493
|
-
get_calibration = getattr(inst_map, "_get_calibration_entry")
|
494
|
-
|
495
|
-
# Expand name mapping with custom gate name provided by user.
|
496
|
-
qiskit_inst_name_map = get_standard_gate_name_mapping()
|
497
|
-
if inst_name_map is not None:
|
498
|
-
qiskit_inst_name_map.update(inst_name_map)
|
499
|
-
|
500
|
-
for inst_name in inst_map.instructions:
|
501
|
-
# Prepare dictionary of instruction properties
|
502
|
-
out_props = {}
|
503
|
-
for qargs in inst_map.qubits_with_instruction(inst_name):
|
504
|
-
try:
|
505
|
-
qargs = tuple(qargs)
|
506
|
-
except TypeError:
|
507
|
-
qargs = (qargs,)
|
508
|
-
try:
|
509
|
-
props = self._gate_map[inst_name][qargs]
|
510
|
-
except (KeyError, TypeError):
|
511
|
-
props = None
|
512
|
-
|
513
|
-
entry = get_calibration(inst_name, qargs)
|
514
|
-
if entry.user_provided and getattr(props, "_calibration", None) != entry:
|
515
|
-
# It only copies user-provided calibration from the inst map.
|
516
|
-
# Backend defined entry must already exist in Target.
|
517
|
-
if self.dt is not None:
|
518
|
-
try:
|
519
|
-
duration = entry.get_schedule().duration * self.dt
|
520
|
-
except UnassignedDurationError:
|
521
|
-
# duration of schedule is parameterized
|
522
|
-
duration = None
|
523
|
-
else:
|
524
|
-
duration = None
|
525
|
-
props = InstructionProperties(
|
526
|
-
duration=duration,
|
527
|
-
calibration=entry,
|
528
|
-
)
|
529
|
-
else:
|
530
|
-
if props is None:
|
531
|
-
# Edge case. Calibration is backend defined, but this is not
|
532
|
-
# registered in the backend target. Ignore this entry.
|
533
|
-
continue
|
534
|
-
try:
|
535
|
-
# Update gate error if provided.
|
536
|
-
props.error = error_dict[inst_name][qargs]
|
537
|
-
except (KeyError, TypeError):
|
538
|
-
pass
|
539
|
-
out_props[qargs] = props
|
540
|
-
if not out_props:
|
541
|
-
continue
|
542
|
-
# Prepare Qiskit Gate object assigned to the entries
|
543
|
-
if inst_name not in self._gate_map:
|
544
|
-
# Entry not found: Add new instruction
|
545
|
-
if inst_name in qiskit_inst_name_map:
|
546
|
-
# Remove qargs with length that doesn't match with instruction qubit number
|
547
|
-
inst_obj = qiskit_inst_name_map[inst_name]
|
548
|
-
normalized_props = {}
|
549
|
-
for qargs, prop in out_props.items():
|
550
|
-
if len(qargs) != inst_obj.num_qubits:
|
551
|
-
continue
|
552
|
-
normalized_props[qargs] = prop
|
553
|
-
self.add_instruction(inst_obj, normalized_props, name=inst_name)
|
554
|
-
else:
|
555
|
-
# Check qubit length parameter name uniformity.
|
556
|
-
qlen = set()
|
557
|
-
param_names = set()
|
558
|
-
for qargs in inst_map.qubits_with_instruction(inst_name):
|
559
|
-
if isinstance(qargs, int):
|
560
|
-
qargs = (qargs,)
|
561
|
-
qlen.add(len(qargs))
|
562
|
-
cal = getattr(out_props[tuple(qargs)], "_calibration")
|
563
|
-
param_names.add(tuple(cal.get_signature().parameters.keys()))
|
564
|
-
if len(qlen) > 1 or len(param_names) > 1:
|
565
|
-
raise QiskitError(
|
566
|
-
f"Schedules for {inst_name} are defined non-uniformly for "
|
567
|
-
f"multiple qubit lengths {qlen}, "
|
568
|
-
f"or different parameter names {param_names}. "
|
569
|
-
"Provide these schedules with inst_name_map or define them with "
|
570
|
-
"different names for different gate parameters."
|
571
|
-
)
|
572
|
-
inst_obj = Gate(
|
573
|
-
name=inst_name,
|
574
|
-
num_qubits=next(iter(qlen)),
|
575
|
-
params=list(map(Parameter, next(iter(param_names)))),
|
576
|
-
)
|
577
|
-
self.add_instruction(inst_obj, out_props, name=inst_name)
|
578
|
-
else:
|
579
|
-
# Entry found: Update "existing" instructions.
|
580
|
-
for qargs, prop in out_props.items():
|
581
|
-
if qargs not in self._gate_map[inst_name]:
|
582
|
-
continue
|
583
|
-
self.update_instruction_properties(inst_name, qargs, prop)
|
584
|
-
|
585
379
|
def qargs_for_operation_name(self, operation):
|
586
380
|
"""Get the qargs for a given operation name
|
587
381
|
|
@@ -621,127 +415,6 @@ class Target(BaseTarget):
|
|
621
415
|
self.granularity, self.min_length, self.pulse_alignment, self.acquire_alignment
|
622
416
|
)
|
623
417
|
|
624
|
-
@deprecate_pulse_dependency
|
625
|
-
def instruction_schedule_map(self):
|
626
|
-
"""Return an :class:`~qiskit.pulse.InstructionScheduleMap` for the
|
627
|
-
instructions in the target with a pulse schedule defined.
|
628
|
-
|
629
|
-
Returns:
|
630
|
-
InstructionScheduleMap: The instruction schedule map for the
|
631
|
-
instructions in this target with a pulse schedule defined.
|
632
|
-
"""
|
633
|
-
return self._get_instruction_schedule_map()
|
634
|
-
|
635
|
-
def _get_instruction_schedule_map(self):
|
636
|
-
if self._instruction_schedule_map is not None:
|
637
|
-
return self._instruction_schedule_map
|
638
|
-
with warnings.catch_warnings():
|
639
|
-
warnings.simplefilter(action="ignore", category=DeprecationWarning)
|
640
|
-
# `InstructionScheduleMap` is deprecated in Qiskit 1.3 but we want this alternative
|
641
|
-
# path to be clean of deprecation warnings
|
642
|
-
out_inst_schedule_map = InstructionScheduleMap()
|
643
|
-
|
644
|
-
for instruction, qargs in self._gate_map.items():
|
645
|
-
for qarg, properties in qargs.items():
|
646
|
-
# Directly getting CalibrationEntry not to invoke .get_schedule().
|
647
|
-
# This keeps PulseQobjDef un-parsed.
|
648
|
-
cal_entry = getattr(properties, "_calibration", None)
|
649
|
-
if cal_entry is not None:
|
650
|
-
# Use fast-path to add entries to the inst map.
|
651
|
-
out_inst_schedule_map._add(instruction, qarg, cal_entry)
|
652
|
-
self._instruction_schedule_map = out_inst_schedule_map
|
653
|
-
return out_inst_schedule_map
|
654
|
-
|
655
|
-
@deprecate_pulse_dependency
|
656
|
-
def has_calibration(
|
657
|
-
self,
|
658
|
-
operation_name: str,
|
659
|
-
qargs: tuple[int, ...],
|
660
|
-
operation_params: list[float] | float | None = None,
|
661
|
-
) -> bool:
|
662
|
-
"""Return whether the instruction (operation + operation_params + qubits) defines
|
663
|
-
a calibration.
|
664
|
-
|
665
|
-
Args:
|
666
|
-
operation_name: The name of the operation for the instruction.
|
667
|
-
qargs: The qubit indices for the instruction.
|
668
|
-
operation_params: The parameters for the Instruction. In case
|
669
|
-
of multi-parameter gates, the order of parameters in the tuple
|
670
|
-
must match the order of the gate parameters.
|
671
|
-
|
672
|
-
Returns:
|
673
|
-
Returns ``True`` if the calibration is supported and ``False`` if it isn't.
|
674
|
-
"""
|
675
|
-
return self._has_calibration(operation_name, qargs, operation_params)
|
676
|
-
|
677
|
-
def _has_calibration(
|
678
|
-
self,
|
679
|
-
operation_name: str,
|
680
|
-
qargs: tuple[int, ...],
|
681
|
-
operation_params: list[float] | float | None = None,
|
682
|
-
) -> bool:
|
683
|
-
if operation_params is not None and not isinstance(operation_params, list):
|
684
|
-
operation_params = [operation_params]
|
685
|
-
|
686
|
-
if operation_name not in self._gate_map:
|
687
|
-
return False
|
688
|
-
|
689
|
-
if qargs not in self._gate_map[operation_name]:
|
690
|
-
return False
|
691
|
-
|
692
|
-
if operation_params is not None and not (
|
693
|
-
operation_params == self._gate_name_map[operation_name].params
|
694
|
-
):
|
695
|
-
return False
|
696
|
-
|
697
|
-
return getattr(self._gate_map[operation_name][qargs], "_calibration", None) is not None
|
698
|
-
|
699
|
-
@deprecate_pulse_dependency
|
700
|
-
def get_calibration(
|
701
|
-
self,
|
702
|
-
operation_name: str,
|
703
|
-
qargs: tuple[int, ...],
|
704
|
-
*args: ParameterValueType,
|
705
|
-
operation_params: list[float] | float | None = None,
|
706
|
-
**kwargs: ParameterValueType,
|
707
|
-
) -> Schedule | ScheduleBlock:
|
708
|
-
"""Get calibrated pulse schedule for the instruction.
|
709
|
-
|
710
|
-
If calibration is templated with parameters, one can also provide those values
|
711
|
-
to build a schedule with assigned parameters.
|
712
|
-
|
713
|
-
Args:
|
714
|
-
operation_name: The name of the operation for the instruction.
|
715
|
-
qargs: The qubit indices for the instruction.
|
716
|
-
args: Parameter values to build schedule if any.
|
717
|
-
operation_params: The parameters for the Instruction. In case
|
718
|
-
of multi-parameter gate, the order of parameters in the tuple
|
719
|
-
must match the order of the gate parameters.
|
720
|
-
kwargs: Parameter values with name to build schedule if any.
|
721
|
-
|
722
|
-
Returns:
|
723
|
-
Calibrated pulse schedule of corresponding instruction.
|
724
|
-
"""
|
725
|
-
return self._get_calibration(
|
726
|
-
operation_name, qargs, *args, operation_params=operation_params, **kwargs
|
727
|
-
)
|
728
|
-
|
729
|
-
def _get_calibration(
|
730
|
-
self,
|
731
|
-
operation_name: str,
|
732
|
-
qargs: tuple[int, ...],
|
733
|
-
*args: ParameterValueType,
|
734
|
-
operation_params: list[float] | float | None = None,
|
735
|
-
**kwargs: ParameterValueType,
|
736
|
-
) -> Schedule | ScheduleBlock:
|
737
|
-
if not self._has_calibration(operation_name, qargs, operation_params):
|
738
|
-
raise KeyError(
|
739
|
-
f"Calibration of instruction: `{operation_name}`, with params: "
|
740
|
-
f"`{operation_params}` for qubit: {qargs} is not defined."
|
741
|
-
)
|
742
|
-
cal_entry = getattr(self._gate_map[operation_name][qargs], "_calibration")
|
743
|
-
return cal_entry.get_schedule(*args, **kwargs)
|
744
|
-
|
745
418
|
@property
|
746
419
|
def operation_names(self):
|
747
420
|
"""Get the operation names in the target."""
|
@@ -964,9 +637,6 @@ class Target(BaseTarget):
|
|
964
637
|
error = getattr(props, "error", None)
|
965
638
|
if error is not None:
|
966
639
|
prop_str_pieces.append(f"\t\t\tError Rate: {error:g}\n")
|
967
|
-
schedule = getattr(props, "_calibration", None)
|
968
|
-
if schedule is not None:
|
969
|
-
prop_str_pieces.append("\t\t\tWith pulse schedule calibration\n")
|
970
640
|
extra_props = getattr(props, "properties", None)
|
971
641
|
if extra_props is not None:
|
972
642
|
extra_props_pieces = [
|
@@ -993,23 +663,24 @@ class Target(BaseTarget):
|
|
993
663
|
self._instruction_schedule_map = state["instruction_schedule_map"]
|
994
664
|
super().__setstate__(state["base"])
|
995
665
|
|
666
|
+
def seconds_to_dt(self, duration: float) -> int:
|
667
|
+
"""Convert a given duration in seconds to units of dt
|
668
|
+
|
669
|
+
Args:
|
670
|
+
duration: The duration in seconds, such as in an :class:`.InstructionProperties`
|
671
|
+
field for an instruction in the target.
|
672
|
+
|
673
|
+
Returns
|
674
|
+
duration: The duration in units of dt
|
675
|
+
"""
|
676
|
+
return duration_in_dt(duration, self.dt)
|
677
|
+
|
996
678
|
@classmethod
|
997
|
-
@deprecate_pulse_arg("inst_map")
|
998
|
-
@deprecate_arg(
|
999
|
-
name="backend_properties",
|
1000
|
-
since="1.4",
|
1001
|
-
package_name="Qiskit",
|
1002
|
-
removal_timeline="in Qiskit 2.0",
|
1003
|
-
additional_msg="To add instructions with specific properties "
|
1004
|
-
"use Target.add_instruction(instruction, properties, name).",
|
1005
|
-
)
|
1006
679
|
def from_configuration(
|
1007
680
|
cls,
|
1008
681
|
basis_gates: list[str],
|
1009
682
|
num_qubits: int | None = None,
|
1010
683
|
coupling_map: CouplingMap | None = None,
|
1011
|
-
inst_map: InstructionScheduleMap | None = None,
|
1012
|
-
backend_properties: BackendProperties | None = None,
|
1013
684
|
instruction_durations: InstructionDurations | None = None,
|
1014
685
|
concurrent_measurements: Optional[List[List[int]]] = None,
|
1015
686
|
dt: float | None = None,
|
@@ -1041,22 +712,6 @@ class Target(BaseTarget):
|
|
1041
712
|
coupling_map: The coupling map representing connectivity constraints
|
1042
713
|
on the backend. If specified all gates from ``basis_gates`` will
|
1043
714
|
be supported on all qubits (or pairs of qubits).
|
1044
|
-
inst_map: DEPRECATED. The instruction schedule map representing the pulse
|
1045
|
-
:class:`~.Schedule` definitions for each instruction. If this
|
1046
|
-
is specified ``coupling_map`` must be specified. The
|
1047
|
-
``coupling_map`` is used as the source of truth for connectivity
|
1048
|
-
and if ``inst_map`` is used the schedule is looked up based
|
1049
|
-
on the instructions from the pair of ``basis_gates`` and
|
1050
|
-
``coupling_map``. If you want to define a custom gate for
|
1051
|
-
a particular qubit or qubit pair, you can manually build :class:`.Target`.
|
1052
|
-
backend_properties: The :class:`~.BackendProperties` object which is
|
1053
|
-
used for instruction properties and qubit properties.
|
1054
|
-
If specified and instruction properties are intended to be used
|
1055
|
-
then the ``coupling_map`` argument must be specified. This is
|
1056
|
-
only used to lookup error rates and durations (unless
|
1057
|
-
``instruction_durations`` is specified which would take
|
1058
|
-
precedence) for instructions specified via ``coupling_map`` and
|
1059
|
-
``basis_gates``.
|
1060
715
|
instruction_durations: Optional instruction durations for instructions. If specified
|
1061
716
|
it will take priority for setting the ``duration`` field in the
|
1062
717
|
:class:`~InstructionProperties` objects for the instructions in the target.
|
@@ -1092,11 +747,6 @@ class Target(BaseTarget):
|
|
1092
747
|
acquire_alignment = timing_constraints.acquire_alignment
|
1093
748
|
|
1094
749
|
qubit_properties = None
|
1095
|
-
if backend_properties is not None:
|
1096
|
-
# pylint: disable=cyclic-import
|
1097
|
-
from qiskit.providers.backend_compat import qubit_props_list_from_props
|
1098
|
-
|
1099
|
-
qubit_properties = qubit_props_list_from_props(properties=backend_properties)
|
1100
750
|
|
1101
751
|
target = cls(
|
1102
752
|
num_qubits=num_qubits,
|
@@ -1114,7 +764,7 @@ class Target(BaseTarget):
|
|
1114
764
|
|
1115
765
|
# While BackendProperties can also contain coupling information we
|
1116
766
|
# rely solely on CouplingMap to determine connectivity. This is because
|
1117
|
-
# in legacy transpiler usage
|
767
|
+
# in legacy transpiler usage
|
1118
768
|
# the coupling map is used to define connectivity constraints and
|
1119
769
|
# the properties is only used for error rate and duration population.
|
1120
770
|
# If coupling map is not specified we ignore the backend_properties
|
@@ -1156,28 +806,6 @@ class Target(BaseTarget):
|
|
1156
806
|
for qubit in range(num_qubits):
|
1157
807
|
error = None
|
1158
808
|
duration = None
|
1159
|
-
calibration = None
|
1160
|
-
if backend_properties is not None:
|
1161
|
-
if duration is None:
|
1162
|
-
try:
|
1163
|
-
duration = backend_properties.gate_length(gate, qubit)
|
1164
|
-
except BackendPropertyError:
|
1165
|
-
duration = None
|
1166
|
-
try:
|
1167
|
-
error = backend_properties.gate_error(gate, qubit)
|
1168
|
-
except BackendPropertyError:
|
1169
|
-
error = None
|
1170
|
-
if inst_map is not None:
|
1171
|
-
try:
|
1172
|
-
calibration = inst_map._get_calibration_entry(gate, qubit)
|
1173
|
-
# If we have dt defined and there is a custom calibration which is user
|
1174
|
-
# generate use that custom pulse schedule for the duration. If it is
|
1175
|
-
# not user generated than we assume it's the same duration as what is
|
1176
|
-
# defined in the backend properties
|
1177
|
-
if dt and calibration.user_provided:
|
1178
|
-
duration = calibration.get_schedule().duration * dt
|
1179
|
-
except PulseError:
|
1180
|
-
calibration = None
|
1181
809
|
# Durations if specified manually should override model objects
|
1182
810
|
if instruction_durations is not None:
|
1183
811
|
try:
|
@@ -1185,19 +813,12 @@ class Target(BaseTarget):
|
|
1185
813
|
except TranspilerError:
|
1186
814
|
duration = None
|
1187
815
|
|
1188
|
-
if error is None and duration is None
|
816
|
+
if error is None and duration is None:
|
1189
817
|
gate_properties[(qubit,)] = None
|
1190
818
|
else:
|
1191
|
-
|
1192
|
-
|
1193
|
-
|
1194
|
-
category=DeprecationWarning,
|
1195
|
-
message=".*``calibration`` is deprecated as of Qiskit 1.3.*",
|
1196
|
-
module="qiskit",
|
1197
|
-
)
|
1198
|
-
gate_properties[(qubit,)] = InstructionProperties(
|
1199
|
-
duration=duration, error=error, calibration=calibration
|
1200
|
-
)
|
819
|
+
gate_properties[(qubit,)] = InstructionProperties(
|
820
|
+
duration=duration, error=error
|
821
|
+
)
|
1201
822
|
target.add_instruction(name_mapping[gate], properties=gate_properties, name=gate)
|
1202
823
|
edges = list(coupling_map.get_edges())
|
1203
824
|
for gate in two_qubit_gates:
|
@@ -1205,28 +826,6 @@ class Target(BaseTarget):
|
|
1205
826
|
for edge in edges:
|
1206
827
|
error = None
|
1207
828
|
duration = None
|
1208
|
-
calibration = None
|
1209
|
-
if backend_properties is not None:
|
1210
|
-
if duration is None:
|
1211
|
-
try:
|
1212
|
-
duration = backend_properties.gate_length(gate, edge)
|
1213
|
-
except BackendPropertyError:
|
1214
|
-
duration = None
|
1215
|
-
try:
|
1216
|
-
error = backend_properties.gate_error(gate, edge)
|
1217
|
-
except BackendPropertyError:
|
1218
|
-
error = None
|
1219
|
-
if inst_map is not None:
|
1220
|
-
try:
|
1221
|
-
calibration = inst_map._get_calibration_entry(gate, edge)
|
1222
|
-
# If we have dt defined and there is a custom calibration which is user
|
1223
|
-
# generate use that custom pulse schedule for the duration. If it is
|
1224
|
-
# not user generated than we assume it's the same duration as what is
|
1225
|
-
# defined in the backend properties
|
1226
|
-
if dt and calibration.user_provided:
|
1227
|
-
duration = calibration.get_schedule().duration * dt
|
1228
|
-
except PulseError:
|
1229
|
-
calibration = None
|
1230
829
|
# Durations if specified manually should override model objects
|
1231
830
|
if instruction_durations is not None:
|
1232
831
|
try:
|
@@ -1234,19 +833,12 @@ class Target(BaseTarget):
|
|
1234
833
|
except TranspilerError:
|
1235
834
|
duration = None
|
1236
835
|
|
1237
|
-
if error is None and duration is None
|
836
|
+
if error is None and duration is None:
|
1238
837
|
gate_properties[edge] = None
|
1239
838
|
else:
|
1240
|
-
|
1241
|
-
|
1242
|
-
|
1243
|
-
category=DeprecationWarning,
|
1244
|
-
message=".*``calibration`` is deprecated as of Qiskit 1.3.*",
|
1245
|
-
module="qiskit",
|
1246
|
-
)
|
1247
|
-
gate_properties[edge] = InstructionProperties(
|
1248
|
-
duration=duration, error=error, calibration=calibration
|
1249
|
-
)
|
839
|
+
gate_properties[edge] = InstructionProperties(
|
840
|
+
duration=duration, error=error
|
841
|
+
)
|
1250
842
|
target.add_instruction(name_mapping[gate], properties=gate_properties, name=gate)
|
1251
843
|
for gate in global_ideal_variable_width_gates:
|
1252
844
|
target.add_instruction(name_mapping[gate], name=gate)
|
@@ -1256,96 +848,47 @@ class Target(BaseTarget):
|
|
1256
848
|
Mapping.register(Target)
|
1257
849
|
|
1258
850
|
|
1259
|
-
|
1260
|
-
|
1261
|
-
|
1262
|
-
|
1263
|
-
|
1264
|
-
|
1265
|
-
"
|
1266
|
-
|
1267
|
-
)
|
1268
|
-
|
1269
|
-
|
1270
|
-
|
1271
|
-
properties_dict: dict[str, Any] = {
|
1272
|
-
"backend_name": "",
|
1273
|
-
"backend_version": "",
|
1274
|
-
"last_update_date": None,
|
1275
|
-
"general": [],
|
1276
|
-
}
|
1277
|
-
gates = []
|
1278
|
-
qubits = []
|
1279
|
-
for gate, qargs_list in target.items():
|
1280
|
-
if gate != "measure":
|
1281
|
-
for qargs, props in qargs_list.items():
|
1282
|
-
property_list = []
|
1283
|
-
if getattr(props, "duration", None) is not None:
|
1284
|
-
property_list.append(
|
1285
|
-
{
|
1286
|
-
"date": datetime.datetime.now(datetime.timezone.utc),
|
1287
|
-
"name": "gate_length",
|
1288
|
-
"unit": "s",
|
1289
|
-
"value": props.duration,
|
1290
|
-
}
|
1291
|
-
)
|
1292
|
-
if getattr(props, "error", None) is not None:
|
1293
|
-
property_list.append(
|
1294
|
-
{
|
1295
|
-
"date": datetime.datetime.now(datetime.timezone.utc),
|
1296
|
-
"name": "gate_error",
|
1297
|
-
"unit": "",
|
1298
|
-
"value": props.error,
|
1299
|
-
}
|
1300
|
-
)
|
1301
|
-
if property_list:
|
1302
|
-
gates.append(
|
1303
|
-
{
|
1304
|
-
"gate": gate,
|
1305
|
-
"qubits": list(qargs),
|
1306
|
-
"parameters": property_list,
|
1307
|
-
"name": gate + "_".join([str(x) for x in qargs]),
|
1308
|
-
}
|
1309
|
-
)
|
851
|
+
class _FakeTarget(Target):
|
852
|
+
"""
|
853
|
+
Pseudo-target class for INTERNAL use in the transpilation pipeline.
|
854
|
+
It's essentially an empty :class:`.Target` instance with a `coupling_map`
|
855
|
+
argument that allows to store connectivity constraints without basis gates.
|
856
|
+
This is intended to replace the use of loose constraints in the pipeline.
|
857
|
+
"""
|
858
|
+
|
859
|
+
def __init__(self, coupling_map=None, **kwargs):
|
860
|
+
super().__init__(**kwargs)
|
861
|
+
if coupling_map is None or isinstance(coupling_map, CouplingMap):
|
862
|
+
self._coupling_map = coupling_map
|
1310
863
|
else:
|
1311
|
-
|
1312
|
-
|
1313
|
-
|
1314
|
-
|
1315
|
-
|
1316
|
-
|
1317
|
-
|
1318
|
-
|
1319
|
-
|
1320
|
-
|
1321
|
-
|
1322
|
-
|
1323
|
-
|
1324
|
-
|
1325
|
-
|
1326
|
-
|
1327
|
-
|
1328
|
-
|
1329
|
-
|
1330
|
-
|
1331
|
-
|
1332
|
-
|
1333
|
-
|
1334
|
-
|
1335
|
-
|
1336
|
-
|
1337
|
-
|
1338
|
-
|
1339
|
-
|
1340
|
-
|
1341
|
-
|
1342
|
-
qubits = [qubit_props[i] for i in range(target.num_qubits)]
|
1343
|
-
if gates or qubits:
|
1344
|
-
properties_dict["gates"] = gates
|
1345
|
-
properties_dict["qubits"] = qubits
|
1346
|
-
with warnings.catch_warnings():
|
1347
|
-
# This raises BackendProperties internally
|
1348
|
-
warnings.filterwarnings("ignore", category=DeprecationWarning)
|
1349
|
-
return BackendProperties.from_dict(properties_dict)
|
1350
|
-
else:
|
1351
|
-
return None
|
864
|
+
self._coupling_map = CouplingMap(coupling_map)
|
865
|
+
|
866
|
+
def __len__(self):
|
867
|
+
return len(self._gate_map)
|
868
|
+
|
869
|
+
def build_coupling_map(self, *args, **kwargs): # pylint: disable=unused-argument
|
870
|
+
return copy.deepcopy(self._coupling_map)
|
871
|
+
|
872
|
+
def instruction_supported(self, *args, **kwargs):
|
873
|
+
"""Checks whether an instruction is supported by the
|
874
|
+
Target based on instruction name and qargs. Note that if there are no
|
875
|
+
basis gates in the Target, this method will always return ``True``.
|
876
|
+
"""
|
877
|
+
if len(self.operation_names) == 0:
|
878
|
+
return True
|
879
|
+
else:
|
880
|
+
return super().instruction_supported(*args, **kwargs)
|
881
|
+
|
882
|
+
@classmethod
|
883
|
+
def from_configuration(
|
884
|
+
cls,
|
885
|
+
*args,
|
886
|
+
num_qubits: int | None = None,
|
887
|
+
coupling_map: CouplingMap | list | None = None,
|
888
|
+
**kwargs,
|
889
|
+
) -> _FakeTarget:
|
890
|
+
|
891
|
+
if num_qubits is None and coupling_map is not None:
|
892
|
+
num_qubits = len(coupling_map.graph)
|
893
|
+
|
894
|
+
return cls(num_qubits=num_qubits, coupling_map=coupling_map, *args, **kwargs)
|