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
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):
|
@@ -357,6 +270,17 @@ class Target(BaseTarget):
|
|
357
270
|
self._instruction_durations = None
|
358
271
|
self._instruction_schedule_map = None
|
359
272
|
|
273
|
+
@property
|
274
|
+
def dt(self):
|
275
|
+
"""Return dt."""
|
276
|
+
return self._dt
|
277
|
+
|
278
|
+
@dt.setter
|
279
|
+
def dt(self, dt):
|
280
|
+
"""Set dt and invalidate instruction duration cache"""
|
281
|
+
self._dt = dt
|
282
|
+
self._instruction_durations = None
|
283
|
+
|
360
284
|
def add_instruction(self, instruction, properties=None, name=None):
|
361
285
|
"""Add a new instruction to the :class:`~qiskit.transpiler.Target`
|
362
286
|
|
@@ -463,125 +387,6 @@ class Target(BaseTarget):
|
|
463
387
|
self._instruction_durations = None
|
464
388
|
self._instruction_schedule_map = None
|
465
389
|
|
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
390
|
def qargs_for_operation_name(self, operation):
|
586
391
|
"""Get the qargs for a given operation name
|
587
392
|
|
@@ -621,127 +426,6 @@ class Target(BaseTarget):
|
|
621
426
|
self.granularity, self.min_length, self.pulse_alignment, self.acquire_alignment
|
622
427
|
)
|
623
428
|
|
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
429
|
@property
|
746
430
|
def operation_names(self):
|
747
431
|
"""Get the operation names in the target."""
|
@@ -964,9 +648,6 @@ class Target(BaseTarget):
|
|
964
648
|
error = getattr(props, "error", None)
|
965
649
|
if error is not None:
|
966
650
|
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
651
|
extra_props = getattr(props, "properties", None)
|
971
652
|
if extra_props is not None:
|
972
653
|
extra_props_pieces = [
|
@@ -993,23 +674,24 @@ class Target(BaseTarget):
|
|
993
674
|
self._instruction_schedule_map = state["instruction_schedule_map"]
|
994
675
|
super().__setstate__(state["base"])
|
995
676
|
|
677
|
+
def seconds_to_dt(self, duration: float) -> int:
|
678
|
+
"""Convert a given duration in seconds to units of dt
|
679
|
+
|
680
|
+
Args:
|
681
|
+
duration: The duration in seconds, such as in an :class:`.InstructionProperties`
|
682
|
+
field for an instruction in the target.
|
683
|
+
|
684
|
+
Returns
|
685
|
+
duration: The duration in units of dt
|
686
|
+
"""
|
687
|
+
return duration_in_dt(duration, self.dt)
|
688
|
+
|
996
689
|
@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
690
|
def from_configuration(
|
1007
691
|
cls,
|
1008
692
|
basis_gates: list[str],
|
1009
693
|
num_qubits: int | None = None,
|
1010
694
|
coupling_map: CouplingMap | None = None,
|
1011
|
-
inst_map: InstructionScheduleMap | None = None,
|
1012
|
-
backend_properties: BackendProperties | None = None,
|
1013
695
|
instruction_durations: InstructionDurations | None = None,
|
1014
696
|
concurrent_measurements: Optional[List[List[int]]] = None,
|
1015
697
|
dt: float | None = None,
|
@@ -1041,22 +723,6 @@ class Target(BaseTarget):
|
|
1041
723
|
coupling_map: The coupling map representing connectivity constraints
|
1042
724
|
on the backend. If specified all gates from ``basis_gates`` will
|
1043
725
|
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
726
|
instruction_durations: Optional instruction durations for instructions. If specified
|
1061
727
|
it will take priority for setting the ``duration`` field in the
|
1062
728
|
:class:`~InstructionProperties` objects for the instructions in the target.
|
@@ -1092,11 +758,6 @@ class Target(BaseTarget):
|
|
1092
758
|
acquire_alignment = timing_constraints.acquire_alignment
|
1093
759
|
|
1094
760
|
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
761
|
|
1101
762
|
target = cls(
|
1102
763
|
num_qubits=num_qubits,
|
@@ -1114,7 +775,7 @@ class Target(BaseTarget):
|
|
1114
775
|
|
1115
776
|
# While BackendProperties can also contain coupling information we
|
1116
777
|
# rely solely on CouplingMap to determine connectivity. This is because
|
1117
|
-
# in legacy transpiler usage
|
778
|
+
# in legacy transpiler usage
|
1118
779
|
# the coupling map is used to define connectivity constraints and
|
1119
780
|
# the properties is only used for error rate and duration population.
|
1120
781
|
# If coupling map is not specified we ignore the backend_properties
|
@@ -1156,28 +817,6 @@ class Target(BaseTarget):
|
|
1156
817
|
for qubit in range(num_qubits):
|
1157
818
|
error = None
|
1158
819
|
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
820
|
# Durations if specified manually should override model objects
|
1182
821
|
if instruction_durations is not None:
|
1183
822
|
try:
|
@@ -1185,19 +824,12 @@ class Target(BaseTarget):
|
|
1185
824
|
except TranspilerError:
|
1186
825
|
duration = None
|
1187
826
|
|
1188
|
-
if error is None and duration is None
|
827
|
+
if error is None and duration is None:
|
1189
828
|
gate_properties[(qubit,)] = None
|
1190
829
|
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
|
-
)
|
830
|
+
gate_properties[(qubit,)] = InstructionProperties(
|
831
|
+
duration=duration, error=error
|
832
|
+
)
|
1201
833
|
target.add_instruction(name_mapping[gate], properties=gate_properties, name=gate)
|
1202
834
|
edges = list(coupling_map.get_edges())
|
1203
835
|
for gate in two_qubit_gates:
|
@@ -1205,28 +837,6 @@ class Target(BaseTarget):
|
|
1205
837
|
for edge in edges:
|
1206
838
|
error = None
|
1207
839
|
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
840
|
# Durations if specified manually should override model objects
|
1231
841
|
if instruction_durations is not None:
|
1232
842
|
try:
|
@@ -1234,19 +844,12 @@ class Target(BaseTarget):
|
|
1234
844
|
except TranspilerError:
|
1235
845
|
duration = None
|
1236
846
|
|
1237
|
-
if error is None and duration is None
|
847
|
+
if error is None and duration is None:
|
1238
848
|
gate_properties[edge] = None
|
1239
849
|
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
|
-
)
|
850
|
+
gate_properties[edge] = InstructionProperties(
|
851
|
+
duration=duration, error=error
|
852
|
+
)
|
1250
853
|
target.add_instruction(name_mapping[gate], properties=gate_properties, name=gate)
|
1251
854
|
for gate in global_ideal_variable_width_gates:
|
1252
855
|
target.add_instruction(name_mapping[gate], name=gate)
|
@@ -1256,96 +859,47 @@ class Target(BaseTarget):
|
|
1256
859
|
Mapping.register(Target)
|
1257
860
|
|
1258
861
|
|
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
|
-
)
|
862
|
+
class _FakeTarget(Target):
|
863
|
+
"""
|
864
|
+
Pseudo-target class for INTERNAL use in the transpilation pipeline.
|
865
|
+
It's essentially an empty :class:`.Target` instance with a `coupling_map`
|
866
|
+
argument that allows to store connectivity constraints without basis gates.
|
867
|
+
This is intended to replace the use of loose constraints in the pipeline.
|
868
|
+
"""
|
869
|
+
|
870
|
+
def __init__(self, coupling_map=None, **kwargs):
|
871
|
+
super().__init__(**kwargs)
|
872
|
+
if coupling_map is None or isinstance(coupling_map, CouplingMap):
|
873
|
+
self._coupling_map = coupling_map
|
1310
874
|
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
|
875
|
+
self._coupling_map = CouplingMap(coupling_map)
|
876
|
+
|
877
|
+
def __len__(self):
|
878
|
+
return len(self._gate_map)
|
879
|
+
|
880
|
+
def build_coupling_map(self, *args, **kwargs): # pylint: disable=unused-argument
|
881
|
+
return copy.deepcopy(self._coupling_map)
|
882
|
+
|
883
|
+
def instruction_supported(self, *args, **kwargs):
|
884
|
+
"""Checks whether an instruction is supported by the
|
885
|
+
Target based on instruction name and qargs. Note that if there are no
|
886
|
+
basis gates in the Target, this method will always return ``True``.
|
887
|
+
"""
|
888
|
+
if len(self.operation_names) == 0:
|
889
|
+
return True
|
890
|
+
else:
|
891
|
+
return super().instruction_supported(*args, **kwargs)
|
892
|
+
|
893
|
+
@classmethod
|
894
|
+
def from_configuration(
|
895
|
+
cls,
|
896
|
+
*args,
|
897
|
+
num_qubits: int | None = None,
|
898
|
+
coupling_map: CouplingMap | list | None = None,
|
899
|
+
**kwargs,
|
900
|
+
) -> _FakeTarget:
|
901
|
+
|
902
|
+
if num_qubits is None and coupling_map is not None:
|
903
|
+
num_qubits = len(coupling_map.graph)
|
904
|
+
|
905
|
+
return cls(num_qubits=num_qubits, coupling_map=coupling_map, *args, **kwargs)
|