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/scheduler/lowering.py
DELETED
@@ -1,187 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2017, 2020.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""Lower gates to schedules. The relative timing within gates is respected. This
|
14
|
-
module handles the translation, but does not handle timing.
|
15
|
-
"""
|
16
|
-
from collections import namedtuple
|
17
|
-
from typing import Dict, List, Optional, Union
|
18
|
-
|
19
|
-
from qiskit.circuit.barrier import Barrier
|
20
|
-
from qiskit.circuit.delay import Delay
|
21
|
-
from qiskit.circuit.duration import convert_durations_to_dt
|
22
|
-
from qiskit.circuit.measure import Measure
|
23
|
-
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
24
|
-
from qiskit.exceptions import QiskitError
|
25
|
-
from qiskit.pulse import Schedule
|
26
|
-
from qiskit.pulse import instructions as pulse_inst
|
27
|
-
from qiskit.pulse.channels import AcquireChannel, MemorySlot, DriveChannel
|
28
|
-
from qiskit.pulse.exceptions import PulseError
|
29
|
-
from qiskit.pulse.macros import measure
|
30
|
-
from qiskit.scheduler.config import ScheduleConfig
|
31
|
-
from qiskit.providers import BackendV1, BackendV2
|
32
|
-
|
33
|
-
CircuitPulseDef = namedtuple(
|
34
|
-
"CircuitPulseDef",
|
35
|
-
["schedule", "qubits"], # The schedule which implements the quantum circuit command
|
36
|
-
) # The labels of the qubits involved in the command according to the circuit
|
37
|
-
|
38
|
-
|
39
|
-
def lower_gates(
|
40
|
-
circuit: QuantumCircuit,
|
41
|
-
schedule_config: ScheduleConfig,
|
42
|
-
backend: Optional[Union[BackendV1, BackendV2]] = None,
|
43
|
-
) -> List[CircuitPulseDef]:
|
44
|
-
"""
|
45
|
-
Return a list of Schedules and the qubits they operate on, for each element encountered in the
|
46
|
-
input circuit.
|
47
|
-
|
48
|
-
Without concern for the final schedule, extract and return a list of Schedules and the qubits
|
49
|
-
they operate on, for each element encountered in the input circuit. Measures are grouped when
|
50
|
-
possible, so ``qc.measure(q0, c0)`` or ``qc.measure(q1, c1)`` will generate a synchronous
|
51
|
-
measurement pulse.
|
52
|
-
|
53
|
-
Args:
|
54
|
-
circuit: The quantum circuit to translate.
|
55
|
-
schedule_config: Backend specific parameters used for building the Schedule.
|
56
|
-
backend: Pass in the backend used to build the Schedule, the backend could be BackendV1
|
57
|
-
or BackendV2
|
58
|
-
|
59
|
-
Returns:
|
60
|
-
A list of CircuitPulseDefs: the pulse definition for each circuit element.
|
61
|
-
|
62
|
-
Raises:
|
63
|
-
QiskitError: If circuit uses a command that isn't defined in config.inst_map.
|
64
|
-
"""
|
65
|
-
from qiskit.pulse.transforms.base_transforms import target_qobj_transform
|
66
|
-
|
67
|
-
circ_pulse_defs = []
|
68
|
-
|
69
|
-
inst_map = schedule_config.inst_map
|
70
|
-
qubit_mem_slots = {} # Map measured qubit index to classical bit index
|
71
|
-
|
72
|
-
# convert the unit of durations from SI to dt before lowering
|
73
|
-
circuit = convert_durations_to_dt(circuit, dt_in_sec=schedule_config.dt, inplace=False)
|
74
|
-
|
75
|
-
def get_measure_schedule(qubit_mem_slots: Dict[int, int]) -> CircuitPulseDef:
|
76
|
-
"""Create a schedule to measure the qubits queued for measuring."""
|
77
|
-
sched = Schedule()
|
78
|
-
# Exclude acquisition on these qubits, since they are handled by the user calibrations
|
79
|
-
acquire_excludes = {}
|
80
|
-
if Measure().name in circuit.calibrations.keys():
|
81
|
-
qubits = tuple(sorted(qubit_mem_slots.keys()))
|
82
|
-
params = ()
|
83
|
-
for qubit in qubits:
|
84
|
-
try:
|
85
|
-
meas_q = circuit.calibrations[Measure().name][((qubit,), params)]
|
86
|
-
meas_q = target_qobj_transform(meas_q)
|
87
|
-
acquire_q = meas_q.filter(channels=[AcquireChannel(qubit)])
|
88
|
-
mem_slot_index = [
|
89
|
-
chan.index for chan in acquire_q.channels if isinstance(chan, MemorySlot)
|
90
|
-
][0]
|
91
|
-
if mem_slot_index != qubit_mem_slots[qubit]:
|
92
|
-
raise KeyError(
|
93
|
-
"The measurement calibration is not defined on "
|
94
|
-
"the requested classical bits"
|
95
|
-
)
|
96
|
-
sched |= meas_q
|
97
|
-
del qubit_mem_slots[qubit]
|
98
|
-
acquire_excludes[qubit] = mem_slot_index
|
99
|
-
except KeyError:
|
100
|
-
pass
|
101
|
-
|
102
|
-
if qubit_mem_slots:
|
103
|
-
qubits = list(qubit_mem_slots.keys())
|
104
|
-
qubit_mem_slots.update(acquire_excludes)
|
105
|
-
meas_sched = measure(
|
106
|
-
qubits=qubits,
|
107
|
-
backend=backend,
|
108
|
-
inst_map=inst_map,
|
109
|
-
meas_map=schedule_config.meas_map,
|
110
|
-
qubit_mem_slots=qubit_mem_slots,
|
111
|
-
)
|
112
|
-
meas_sched = target_qobj_transform(meas_sched)
|
113
|
-
meas_sched = meas_sched.exclude(
|
114
|
-
channels=[AcquireChannel(qubit) for qubit in acquire_excludes]
|
115
|
-
)
|
116
|
-
sched |= meas_sched
|
117
|
-
qubit_mem_slots.clear()
|
118
|
-
return CircuitPulseDef(
|
119
|
-
schedule=sched,
|
120
|
-
qubits=[chan.index for chan in sched.channels if isinstance(chan, AcquireChannel)],
|
121
|
-
)
|
122
|
-
|
123
|
-
qubit_indices = {bit: idx for idx, bit in enumerate(circuit.qubits)}
|
124
|
-
clbit_indices = {bit: idx for idx, bit in enumerate(circuit.clbits)}
|
125
|
-
|
126
|
-
for instruction in circuit.data:
|
127
|
-
inst_qubits = [qubit_indices[qubit] for qubit in instruction.qubits]
|
128
|
-
|
129
|
-
if any(q in qubit_mem_slots for q in inst_qubits):
|
130
|
-
# If we are operating on a qubit that was scheduled to be measured, process that first
|
131
|
-
circ_pulse_defs.append(get_measure_schedule(qubit_mem_slots))
|
132
|
-
|
133
|
-
if isinstance(instruction.operation, Barrier):
|
134
|
-
circ_pulse_defs.append(
|
135
|
-
CircuitPulseDef(schedule=instruction.operation, qubits=inst_qubits)
|
136
|
-
)
|
137
|
-
elif isinstance(instruction.operation, Delay):
|
138
|
-
sched = Schedule(name=instruction.operation.name)
|
139
|
-
for qubit in inst_qubits:
|
140
|
-
for channel in [DriveChannel]:
|
141
|
-
sched += pulse_inst.Delay(
|
142
|
-
duration=instruction.operation.duration, channel=channel(qubit)
|
143
|
-
)
|
144
|
-
circ_pulse_defs.append(CircuitPulseDef(schedule=sched, qubits=inst_qubits))
|
145
|
-
elif isinstance(instruction.operation, Measure):
|
146
|
-
if len(inst_qubits) != 1 and len(instruction.clbits) != 1:
|
147
|
-
raise QiskitError(
|
148
|
-
f"Qubit '{inst_qubits}' or classical bit '{instruction.clbits}' errored because the "
|
149
|
-
"circuit Measure instruction only takes one of "
|
150
|
-
"each."
|
151
|
-
)
|
152
|
-
qubit_mem_slots[inst_qubits[0]] = clbit_indices[instruction.clbits[0]]
|
153
|
-
else:
|
154
|
-
try:
|
155
|
-
gate_cals = circuit.calibrations[instruction.operation.name]
|
156
|
-
schedule = gate_cals[
|
157
|
-
(
|
158
|
-
tuple(inst_qubits),
|
159
|
-
tuple(
|
160
|
-
p if getattr(p, "parameters", None) else float(p)
|
161
|
-
for p in instruction.operation.params
|
162
|
-
),
|
163
|
-
)
|
164
|
-
]
|
165
|
-
schedule = target_qobj_transform(schedule)
|
166
|
-
circ_pulse_defs.append(CircuitPulseDef(schedule=schedule, qubits=inst_qubits))
|
167
|
-
continue
|
168
|
-
except KeyError:
|
169
|
-
pass # Calibration not defined for this operation
|
170
|
-
|
171
|
-
try:
|
172
|
-
schedule = inst_map.get(
|
173
|
-
instruction.operation, inst_qubits, *instruction.operation.params
|
174
|
-
)
|
175
|
-
schedule = target_qobj_transform(schedule)
|
176
|
-
circ_pulse_defs.append(CircuitPulseDef(schedule=schedule, qubits=inst_qubits))
|
177
|
-
except PulseError as ex:
|
178
|
-
raise QiskitError(
|
179
|
-
f"Operation '{instruction.operation.name}' on qubit(s) {inst_qubits} "
|
180
|
-
"not supported by the backend command definition. Did you remember to "
|
181
|
-
"transpile your input circuit for the same backend?"
|
182
|
-
) from ex
|
183
|
-
|
184
|
-
if qubit_mem_slots:
|
185
|
-
circ_pulse_defs.append(get_measure_schedule(qubit_mem_slots))
|
186
|
-
|
187
|
-
return circ_pulse_defs
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2019.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""Scheduling methods."""
|
14
|
-
|
15
|
-
from qiskit.scheduler.methods.basic import as_soon_as_possible, as_late_as_possible
|
@@ -1,140 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2019.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""
|
14
|
-
The most straightforward scheduling methods: scheduling **as early** or **as late** as possible.
|
15
|
-
"""
|
16
|
-
from collections import defaultdict
|
17
|
-
from typing import List, Optional, Union
|
18
|
-
|
19
|
-
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
20
|
-
from qiskit.circuit.barrier import Barrier
|
21
|
-
from qiskit.pulse.schedule import Schedule
|
22
|
-
|
23
|
-
from qiskit.scheduler.config import ScheduleConfig
|
24
|
-
from qiskit.scheduler.lowering import lower_gates
|
25
|
-
from qiskit.providers import BackendV1, BackendV2
|
26
|
-
from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
|
27
|
-
|
28
|
-
|
29
|
-
@deprecate_pulse_dependency(moving_to_dynamics=True)
|
30
|
-
def as_soon_as_possible(
|
31
|
-
circuit: QuantumCircuit,
|
32
|
-
schedule_config: ScheduleConfig,
|
33
|
-
backend: Optional[Union[BackendV1, BackendV2]] = None,
|
34
|
-
) -> Schedule:
|
35
|
-
"""
|
36
|
-
Return the pulse Schedule which implements the input circuit using an "as soon as possible"
|
37
|
-
(asap) scheduling policy.
|
38
|
-
|
39
|
-
Circuit instructions are first each mapped to equivalent pulse
|
40
|
-
Schedules according to the command definition given by the schedule_config. Then, this circuit
|
41
|
-
instruction-equivalent Schedule is appended at the earliest time at which all qubits involved
|
42
|
-
in the instruction are available.
|
43
|
-
|
44
|
-
Args:
|
45
|
-
circuit: The quantum circuit to translate.
|
46
|
-
schedule_config: Backend specific parameters used for building the Schedule.
|
47
|
-
backend: A backend used to build the Schedule, the backend could be BackendV1
|
48
|
-
or BackendV2.
|
49
|
-
|
50
|
-
Returns:
|
51
|
-
A schedule corresponding to the input ``circuit`` with pulses occurring as early as
|
52
|
-
possible.
|
53
|
-
"""
|
54
|
-
qubit_time_available = defaultdict(int)
|
55
|
-
|
56
|
-
def update_times(inst_qubits: List[int], time: int = 0) -> None:
|
57
|
-
"""Update the time tracker for all inst_qubits to the given time."""
|
58
|
-
for q in inst_qubits:
|
59
|
-
qubit_time_available[q] = time
|
60
|
-
|
61
|
-
start_times = []
|
62
|
-
circ_pulse_defs = lower_gates(circuit, schedule_config, backend)
|
63
|
-
for circ_pulse_def in circ_pulse_defs:
|
64
|
-
start_time = max(qubit_time_available[q] for q in circ_pulse_def.qubits)
|
65
|
-
stop_time = start_time
|
66
|
-
if not isinstance(circ_pulse_def.schedule, Barrier):
|
67
|
-
stop_time += circ_pulse_def.schedule.duration
|
68
|
-
|
69
|
-
start_times.append(start_time)
|
70
|
-
update_times(circ_pulse_def.qubits, stop_time)
|
71
|
-
|
72
|
-
timed_schedules = [
|
73
|
-
(time, cpd.schedule)
|
74
|
-
for time, cpd in zip(start_times, circ_pulse_defs)
|
75
|
-
if not isinstance(cpd.schedule, Barrier)
|
76
|
-
]
|
77
|
-
schedule = Schedule.initialize_from(circuit)
|
78
|
-
for time, inst in timed_schedules:
|
79
|
-
schedule.insert(time, inst, inplace=True)
|
80
|
-
return schedule
|
81
|
-
|
82
|
-
|
83
|
-
@deprecate_pulse_dependency(moving_to_dynamics=True)
|
84
|
-
def as_late_as_possible(
|
85
|
-
circuit: QuantumCircuit,
|
86
|
-
schedule_config: ScheduleConfig,
|
87
|
-
backend: Optional[Union[BackendV1, BackendV2]] = None,
|
88
|
-
) -> Schedule:
|
89
|
-
"""
|
90
|
-
Return the pulse Schedule which implements the input circuit using an "as late as possible"
|
91
|
-
(alap) scheduling policy.
|
92
|
-
|
93
|
-
Circuit instructions are first each mapped to equivalent pulse
|
94
|
-
Schedules according to the command definition given by the schedule_config. Then, this circuit
|
95
|
-
instruction-equivalent Schedule is appended at the latest time that it can be without allowing
|
96
|
-
unnecessary time between instructions or allowing instructions with common qubits to overlap.
|
97
|
-
|
98
|
-
This method should improves the outcome fidelity over ASAP scheduling, because we may
|
99
|
-
maximize the time that the qubit remains in the ground state.
|
100
|
-
|
101
|
-
Args:
|
102
|
-
circuit: The quantum circuit to translate.
|
103
|
-
schedule_config: Backend specific parameters used for building the Schedule.
|
104
|
-
backend: A backend used to build the Schedule, the backend could be BackendV1
|
105
|
-
or BackendV2.
|
106
|
-
|
107
|
-
Returns:
|
108
|
-
A schedule corresponding to the input ``circuit`` with pulses occurring as late as
|
109
|
-
possible.
|
110
|
-
"""
|
111
|
-
qubit_time_available = defaultdict(int)
|
112
|
-
|
113
|
-
def update_times(inst_qubits: List[int], time: int = 0) -> None:
|
114
|
-
"""Update the time tracker for all inst_qubits to the given time."""
|
115
|
-
for q in inst_qubits:
|
116
|
-
qubit_time_available[q] = time
|
117
|
-
|
118
|
-
rev_stop_times = []
|
119
|
-
circ_pulse_defs = lower_gates(circuit, schedule_config, backend)
|
120
|
-
for circ_pulse_def in reversed(circ_pulse_defs):
|
121
|
-
start_time = max(qubit_time_available[q] for q in circ_pulse_def.qubits)
|
122
|
-
stop_time = start_time
|
123
|
-
if not isinstance(circ_pulse_def.schedule, Barrier):
|
124
|
-
stop_time += circ_pulse_def.schedule.duration
|
125
|
-
|
126
|
-
rev_stop_times.append(stop_time)
|
127
|
-
update_times(circ_pulse_def.qubits, stop_time)
|
128
|
-
|
129
|
-
last_stop = max(t for t in qubit_time_available.values()) if qubit_time_available else 0
|
130
|
-
start_times = [last_stop - t for t in reversed(rev_stop_times)]
|
131
|
-
|
132
|
-
timed_schedules = [
|
133
|
-
(time, cpd.schedule)
|
134
|
-
for time, cpd in zip(start_times, circ_pulse_defs)
|
135
|
-
if not isinstance(cpd.schedule, Barrier)
|
136
|
-
]
|
137
|
-
schedule = Schedule.initialize_from(circuit)
|
138
|
-
for time, inst in timed_schedules:
|
139
|
-
schedule.insert(time, inst, inplace=True)
|
140
|
-
return schedule
|
@@ -1,69 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2019.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""QuantumCircuit to Pulse scheduler."""
|
14
|
-
from typing import Optional, Union
|
15
|
-
|
16
|
-
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
17
|
-
from qiskit.exceptions import QiskitError
|
18
|
-
|
19
|
-
from qiskit.pulse.schedule import Schedule
|
20
|
-
from qiskit.scheduler.config import ScheduleConfig
|
21
|
-
from qiskit.scheduler.methods import as_soon_as_possible, as_late_as_possible
|
22
|
-
from qiskit.providers import BackendV1, BackendV2
|
23
|
-
from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
|
24
|
-
|
25
|
-
|
26
|
-
@deprecate_pulse_dependency(moving_to_dynamics=True)
|
27
|
-
def schedule_circuit(
|
28
|
-
circuit: QuantumCircuit,
|
29
|
-
schedule_config: ScheduleConfig,
|
30
|
-
method: Optional[str] = None,
|
31
|
-
backend: Optional[Union[BackendV1, BackendV2]] = None,
|
32
|
-
) -> Schedule:
|
33
|
-
"""
|
34
|
-
Basic scheduling pass from a circuit to a pulse Schedule, using the backend. If no method is
|
35
|
-
specified, then a basic, as late as possible scheduling pass is performed, i.e. pulses are
|
36
|
-
scheduled to occur as late as possible.
|
37
|
-
|
38
|
-
Supported methods:
|
39
|
-
|
40
|
-
* ``'as_soon_as_possible'``: Schedule pulses greedily, as early as possible on a
|
41
|
-
qubit resource. (alias: ``'asap'``)
|
42
|
-
* ``'as_late_as_possible'``: Schedule pulses late-- keep qubits in the ground state when
|
43
|
-
possible. (alias: ``'alap'``)
|
44
|
-
|
45
|
-
Args:
|
46
|
-
circuit: The quantum circuit to translate.
|
47
|
-
schedule_config: Backend specific parameters used for building the Schedule.
|
48
|
-
method: The scheduling pass method to use.
|
49
|
-
backend: A backend used to build the Schedule, the backend could be BackendV1
|
50
|
-
or BackendV2.
|
51
|
-
|
52
|
-
Returns:
|
53
|
-
Schedule corresponding to the input circuit.
|
54
|
-
|
55
|
-
Raises:
|
56
|
-
QiskitError: If method isn't recognized.
|
57
|
-
"""
|
58
|
-
methods = {
|
59
|
-
"as_soon_as_possible": as_soon_as_possible,
|
60
|
-
"asap": as_soon_as_possible,
|
61
|
-
"as_late_as_possible": as_late_as_possible,
|
62
|
-
"alap": as_late_as_possible,
|
63
|
-
}
|
64
|
-
if method is None:
|
65
|
-
method = "as_late_as_possible"
|
66
|
-
try:
|
67
|
-
return methods[method](circuit, schedule_config, backend)
|
68
|
-
except KeyError as ex:
|
69
|
-
raise QiskitError(f"Scheduling method {method} isn't recognized.") from ex
|
qiskit/scheduler/sequence.py
DELETED
@@ -1,104 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2020.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""
|
14
|
-
Mapping a scheduled QuantumCircuit to a pulse Schedule.
|
15
|
-
"""
|
16
|
-
from collections import defaultdict
|
17
|
-
|
18
|
-
from typing import Optional, Union
|
19
|
-
from qiskit.circuit.barrier import Barrier
|
20
|
-
from qiskit.circuit.measure import Measure
|
21
|
-
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
22
|
-
from qiskit.exceptions import QiskitError
|
23
|
-
from qiskit.pulse.schedule import Schedule
|
24
|
-
from qiskit.pulse.transforms import pad
|
25
|
-
from qiskit.scheduler.config import ScheduleConfig
|
26
|
-
from qiskit.scheduler.lowering import lower_gates
|
27
|
-
from qiskit.providers import BackendV1, BackendV2
|
28
|
-
from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
|
29
|
-
|
30
|
-
|
31
|
-
@deprecate_pulse_dependency(moving_to_dynamics=True)
|
32
|
-
def sequence(
|
33
|
-
scheduled_circuit: QuantumCircuit,
|
34
|
-
schedule_config: ScheduleConfig,
|
35
|
-
backend: Optional[Union[BackendV1, BackendV2]] = None,
|
36
|
-
) -> Schedule:
|
37
|
-
"""
|
38
|
-
Return the pulse Schedule which implements the input scheduled circuit.
|
39
|
-
|
40
|
-
Assume all measurements are done at once at the last of the circuit.
|
41
|
-
Schedules according to the command definition given by the schedule_config.
|
42
|
-
|
43
|
-
Args:
|
44
|
-
scheduled_circuit: The scheduled quantum circuit to translate.
|
45
|
-
schedule_config: Backend specific parameters used for building the Schedule.
|
46
|
-
backend: A backend used to build the Schedule, the backend could be BackendV1
|
47
|
-
or BackendV2
|
48
|
-
|
49
|
-
Returns:
|
50
|
-
A schedule corresponding to the input ``circuit``.
|
51
|
-
|
52
|
-
Raises:
|
53
|
-
QiskitError: If invalid scheduled circuit is supplied.
|
54
|
-
"""
|
55
|
-
circ_pulse_defs = lower_gates(scheduled_circuit, schedule_config, backend)
|
56
|
-
|
57
|
-
# find the measurement start time (assume measurement once)
|
58
|
-
def _meas_start_time():
|
59
|
-
_qubit_time_available = defaultdict(int)
|
60
|
-
for instruction in scheduled_circuit.data:
|
61
|
-
if isinstance(instruction.operation, Measure):
|
62
|
-
return _qubit_time_available[instruction.qubits[0]]
|
63
|
-
for q in instruction.qubits:
|
64
|
-
_qubit_time_available[q] += instruction.operation.duration
|
65
|
-
return None
|
66
|
-
|
67
|
-
meas_time = _meas_start_time()
|
68
|
-
|
69
|
-
# restore start times
|
70
|
-
qubit_time_available = {}
|
71
|
-
start_times = []
|
72
|
-
out_circ_pulse_defs = []
|
73
|
-
for circ_pulse_def in circ_pulse_defs:
|
74
|
-
active_qubits = [q for q in circ_pulse_def.qubits if q in qubit_time_available]
|
75
|
-
|
76
|
-
start_time = max((qubit_time_available[q] for q in active_qubits), default=0)
|
77
|
-
|
78
|
-
for q in active_qubits:
|
79
|
-
if qubit_time_available[q] != start_time:
|
80
|
-
# print(q, ":", qubit_time_available[q], "!=", start_time)
|
81
|
-
raise QiskitError("Invalid scheduled circuit.")
|
82
|
-
|
83
|
-
stop_time = start_time
|
84
|
-
if not isinstance(circ_pulse_def.schedule, Barrier):
|
85
|
-
stop_time += circ_pulse_def.schedule.duration
|
86
|
-
|
87
|
-
delay_overlaps_meas = False
|
88
|
-
for q in circ_pulse_def.qubits:
|
89
|
-
qubit_time_available[q] = stop_time
|
90
|
-
if (
|
91
|
-
meas_time is not None
|
92
|
-
and circ_pulse_def.schedule.name == "delay"
|
93
|
-
and stop_time > meas_time
|
94
|
-
):
|
95
|
-
qubit_time_available[q] = meas_time
|
96
|
-
delay_overlaps_meas = True
|
97
|
-
# skip to delays overlapping measures and barriers
|
98
|
-
if not delay_overlaps_meas and not isinstance(circ_pulse_def.schedule, Barrier):
|
99
|
-
start_times.append(start_time)
|
100
|
-
out_circ_pulse_defs.append(circ_pulse_def)
|
101
|
-
|
102
|
-
timed_schedules = [(time, cpd.schedule) for time, cpd in zip(start_times, out_circ_pulse_defs)]
|
103
|
-
sched = Schedule(*timed_schedules, name=scheduled_circuit.name)
|
104
|
-
return pad(sched)
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2021
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""Module containing transpiler calibration passes."""
|
14
|
-
|
15
|
-
from .pulse_gate import PulseGates
|
16
|
-
from .rzx_builder import RZXCalibrationBuilder, RZXCalibrationBuilderNoEcho
|
17
|
-
from .rx_builder import RXCalibrationBuilder
|
@@ -1,79 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2022.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""Calibration builder base class."""
|
14
|
-
|
15
|
-
from abc import abstractmethod
|
16
|
-
from typing import List, Union
|
17
|
-
|
18
|
-
from qiskit.circuit import Instruction as CircuitInst
|
19
|
-
from qiskit.dagcircuit import DAGCircuit
|
20
|
-
from qiskit.pulse import Schedule, ScheduleBlock
|
21
|
-
from qiskit.pulse.calibration_entries import CalibrationPublisher
|
22
|
-
from qiskit.transpiler.basepasses import TransformationPass
|
23
|
-
|
24
|
-
from .exceptions import CalibrationNotAvailable
|
25
|
-
|
26
|
-
|
27
|
-
class CalibrationBuilder(TransformationPass):
|
28
|
-
"""Abstract base class to inject calibrations into circuits."""
|
29
|
-
|
30
|
-
@abstractmethod
|
31
|
-
def supported(self, node_op: CircuitInst, qubits: List) -> bool:
|
32
|
-
"""Determine if a given node supports the calibration.
|
33
|
-
|
34
|
-
Args:
|
35
|
-
node_op: Target instruction object.
|
36
|
-
qubits: Integer qubit indices to check.
|
37
|
-
|
38
|
-
Returns:
|
39
|
-
Return ``True`` is calibration can be provided.
|
40
|
-
"""
|
41
|
-
|
42
|
-
@abstractmethod
|
43
|
-
def get_calibration(self, node_op: CircuitInst, qubits: List) -> Union[Schedule, ScheduleBlock]:
|
44
|
-
"""Gets the calibrated schedule for the given instruction and qubits.
|
45
|
-
|
46
|
-
Args:
|
47
|
-
node_op: Target instruction object.
|
48
|
-
qubits: Integer qubit indices to check.
|
49
|
-
|
50
|
-
Returns:
|
51
|
-
Return Schedule of target gate instruction.
|
52
|
-
"""
|
53
|
-
|
54
|
-
def run(self, dag: DAGCircuit) -> DAGCircuit:
|
55
|
-
"""Run the calibration adder pass on `dag`.
|
56
|
-
|
57
|
-
Args:
|
58
|
-
dag: DAG to schedule.
|
59
|
-
|
60
|
-
Returns:
|
61
|
-
A DAG with calibrations added to it.
|
62
|
-
"""
|
63
|
-
for node in dag.gate_nodes():
|
64
|
-
qubits = [dag.find_bit(q).index for q in node.qargs]
|
65
|
-
|
66
|
-
if self.supported(node.op, qubits) and not dag.has_calibration_for(node):
|
67
|
-
# calibration can be provided and no user-defined calibration is already provided
|
68
|
-
try:
|
69
|
-
schedule = self.get_calibration(node.op, qubits)
|
70
|
-
except CalibrationNotAvailable:
|
71
|
-
# Fail in schedule generation. Just ignore.
|
72
|
-
continue
|
73
|
-
publisher = schedule.metadata.get("publisher", CalibrationPublisher.QISKIT)
|
74
|
-
|
75
|
-
# add calibration if it is not backend default
|
76
|
-
if publisher != CalibrationPublisher.BACKEND_PROVIDER:
|
77
|
-
dag.add_calibration(gate=node.op, qubits=qubits, schedule=schedule)
|
78
|
-
|
79
|
-
return dag
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2021.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""Calibration creators."""
|
14
|
-
|
15
|
-
# TODO This import path will be deprecated.
|
16
|
-
|
17
|
-
# pylint: disable=unused-import
|
18
|
-
from .pulse_gate import PulseGates
|
19
|
-
from .rzx_builder import RZXCalibrationBuilder, RZXCalibrationBuilderNoEcho
|
20
|
-
from .rx_builder import RXCalibrationBuilder
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2022.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""Exception for errors raised by the calibration pass module."""
|
14
|
-
from qiskit.exceptions import QiskitError
|
15
|
-
|
16
|
-
|
17
|
-
class CalibrationNotAvailable(QiskitError):
|
18
|
-
"""Raised when calibration generation fails.
|
19
|
-
|
20
|
-
.. note::
|
21
|
-
This error is meant to caught by CalibrationBuilder and ignored.
|
22
|
-
"""
|