qiskit 1.4.1__cp39-abi3-win_amd64.whl → 2.0.0rc1__cp39-abi3-win_amd64.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.pyd +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 +2 -141
- 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 +154 -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 +4 -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 +18 -12
- qiskit/visualization/timeline/interface.py +19 -18
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +1 -1
- {qiskit-1.4.1.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.1.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
qiskit/pulse/configuration.py
DELETED
@@ -1,245 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2017, 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
|
-
Configurations for pulse experiments.
|
15
|
-
"""
|
16
|
-
from __future__ import annotations
|
17
|
-
import numpy as np
|
18
|
-
|
19
|
-
from .channels import DriveChannel, MeasureChannel
|
20
|
-
from .exceptions import PulseError
|
21
|
-
|
22
|
-
|
23
|
-
def _assert_nested_dict_equal(a: dict, b: dict):
|
24
|
-
if len(a) != len(b):
|
25
|
-
return False
|
26
|
-
for key in a:
|
27
|
-
if key in b:
|
28
|
-
if isinstance(a[key], dict):
|
29
|
-
if not _assert_nested_dict_equal(a[key], b[key]):
|
30
|
-
return False
|
31
|
-
elif isinstance(a[key], np.ndarray):
|
32
|
-
if not np.all(a[key] == b[key]):
|
33
|
-
return False
|
34
|
-
else:
|
35
|
-
if a[key] != b[key]:
|
36
|
-
return False
|
37
|
-
else:
|
38
|
-
return False
|
39
|
-
return True
|
40
|
-
|
41
|
-
|
42
|
-
class Kernel:
|
43
|
-
"""Settings for this Kernel, which is responsible for integrating time series (raw) data
|
44
|
-
into IQ points.
|
45
|
-
"""
|
46
|
-
|
47
|
-
def __init__(self, name: str | None = None, **params):
|
48
|
-
"""Create new kernel.
|
49
|
-
|
50
|
-
Args:
|
51
|
-
name: Name of kernel to be used
|
52
|
-
params: Any settings for kerneling.
|
53
|
-
"""
|
54
|
-
self.name = name
|
55
|
-
self.params = params
|
56
|
-
|
57
|
-
def __repr__(self):
|
58
|
-
name_repr = "'" + self.name + "', "
|
59
|
-
params_repr = ", ".join(f"{str(k)}={str(v)}" for k, v in self.params.items())
|
60
|
-
return f"{self.__class__.__name__}({name_repr}{params_repr})"
|
61
|
-
|
62
|
-
def __eq__(self, other):
|
63
|
-
if isinstance(other, Kernel):
|
64
|
-
return _assert_nested_dict_equal(self.__dict__, other.__dict__)
|
65
|
-
return False
|
66
|
-
|
67
|
-
|
68
|
-
class Discriminator:
|
69
|
-
"""Setting for this Discriminator, which is responsible for classifying kerneled IQ points
|
70
|
-
into 0/1 state results.
|
71
|
-
"""
|
72
|
-
|
73
|
-
def __init__(self, name: str | None = None, **params):
|
74
|
-
"""Create new discriminator.
|
75
|
-
|
76
|
-
Args:
|
77
|
-
name: Name of discriminator to be used
|
78
|
-
params: Any settings for discrimination.
|
79
|
-
"""
|
80
|
-
self.name = name
|
81
|
-
self.params = params
|
82
|
-
|
83
|
-
def __repr__(self):
|
84
|
-
name_repr = "'" + self.name + "', " or ""
|
85
|
-
params_repr = ", ".join(f"{str(k)}={str(v)}" for k, v in self.params.items())
|
86
|
-
return f"{self.__class__.__name__}({name_repr}{params_repr})"
|
87
|
-
|
88
|
-
def __eq__(self, other):
|
89
|
-
if isinstance(other, Discriminator):
|
90
|
-
return _assert_nested_dict_equal(self.__dict__, other.__dict__)
|
91
|
-
return False
|
92
|
-
|
93
|
-
|
94
|
-
class LoRange:
|
95
|
-
"""Range of LO frequency."""
|
96
|
-
|
97
|
-
def __init__(self, lower_bound: float, upper_bound: float):
|
98
|
-
self._lb = lower_bound
|
99
|
-
self._ub = upper_bound
|
100
|
-
|
101
|
-
def includes(self, lo_freq: complex) -> bool:
|
102
|
-
"""Whether `lo_freq` is within the `LoRange`.
|
103
|
-
|
104
|
-
Args:
|
105
|
-
lo_freq: LO frequency to be validated
|
106
|
-
|
107
|
-
Returns:
|
108
|
-
bool: True if lo_freq is included in this range, otherwise False
|
109
|
-
"""
|
110
|
-
if self._lb <= abs(lo_freq) <= self._ub:
|
111
|
-
return True
|
112
|
-
return False
|
113
|
-
|
114
|
-
@property
|
115
|
-
def lower_bound(self) -> float:
|
116
|
-
"""Lower bound of the LO range"""
|
117
|
-
return self._lb
|
118
|
-
|
119
|
-
@property
|
120
|
-
def upper_bound(self) -> float:
|
121
|
-
"""Upper bound of the LO range"""
|
122
|
-
return self._ub
|
123
|
-
|
124
|
-
def __repr__(self):
|
125
|
-
return f"{self.__class__.__name__}({self._lb:f}, {self._ub:f})"
|
126
|
-
|
127
|
-
def __eq__(self, other):
|
128
|
-
"""Two LO ranges are the same if they are of the same type, and
|
129
|
-
have the same frequency range
|
130
|
-
|
131
|
-
Args:
|
132
|
-
other (LoRange): other LoRange
|
133
|
-
|
134
|
-
Returns:
|
135
|
-
bool: are self and other equal.
|
136
|
-
"""
|
137
|
-
if type(self) is type(other) and self._ub == other._ub and self._lb == other._lb:
|
138
|
-
return True
|
139
|
-
return False
|
140
|
-
|
141
|
-
|
142
|
-
class LoConfig:
|
143
|
-
"""Pulse channel LO frequency container."""
|
144
|
-
|
145
|
-
def __init__(
|
146
|
-
self,
|
147
|
-
channel_los: dict[DriveChannel | MeasureChannel, float] | None = None,
|
148
|
-
lo_ranges: dict[DriveChannel | MeasureChannel, LoRange | tuple[int, int]] | None = None,
|
149
|
-
):
|
150
|
-
"""Lo channel configuration data structure.
|
151
|
-
|
152
|
-
Args:
|
153
|
-
channel_los: Dictionary of mappings from configurable channel to lo
|
154
|
-
lo_ranges: Dictionary of mappings to be enforced from configurable channel to `LoRange`
|
155
|
-
|
156
|
-
Raises:
|
157
|
-
PulseError: If channel is not configurable or set lo is out of range.
|
158
|
-
|
159
|
-
"""
|
160
|
-
self._q_lo_freq: dict[DriveChannel, float] = {}
|
161
|
-
self._m_lo_freq: dict[MeasureChannel, float] = {}
|
162
|
-
self._lo_ranges: dict[DriveChannel | MeasureChannel, LoRange] = {}
|
163
|
-
|
164
|
-
lo_ranges = lo_ranges if lo_ranges else {}
|
165
|
-
for channel, freq in lo_ranges.items():
|
166
|
-
self.add_lo_range(channel, freq)
|
167
|
-
|
168
|
-
channel_los = channel_los if channel_los else {}
|
169
|
-
for channel, freq in channel_los.items():
|
170
|
-
self.add_lo(channel, freq)
|
171
|
-
|
172
|
-
def add_lo(self, channel: DriveChannel | MeasureChannel, freq: float):
|
173
|
-
"""Add a lo mapping for a channel."""
|
174
|
-
if isinstance(channel, DriveChannel):
|
175
|
-
# add qubit_lo_freq
|
176
|
-
self.check_lo(channel, freq)
|
177
|
-
self._q_lo_freq[channel] = freq
|
178
|
-
elif isinstance(channel, MeasureChannel):
|
179
|
-
# add meas_lo_freq
|
180
|
-
self.check_lo(channel, freq)
|
181
|
-
self._m_lo_freq[channel] = freq
|
182
|
-
else:
|
183
|
-
raise PulseError(f"Specified channel {channel.name} cannot be configured.")
|
184
|
-
|
185
|
-
def add_lo_range(
|
186
|
-
self, channel: DriveChannel | MeasureChannel, lo_range: LoRange | tuple[int, int]
|
187
|
-
):
|
188
|
-
"""Add lo range to configuration.
|
189
|
-
|
190
|
-
Args:
|
191
|
-
channel: Channel to add lo range for
|
192
|
-
lo_range: Lo range to add
|
193
|
-
|
194
|
-
"""
|
195
|
-
if isinstance(lo_range, (list, tuple)):
|
196
|
-
lo_range = LoRange(*lo_range)
|
197
|
-
self._lo_ranges[channel] = lo_range
|
198
|
-
|
199
|
-
def check_lo(self, channel: DriveChannel | MeasureChannel, freq: float) -> bool:
|
200
|
-
"""Check that lo is valid for channel.
|
201
|
-
|
202
|
-
Args:
|
203
|
-
channel: Channel to validate lo for
|
204
|
-
freq: lo frequency
|
205
|
-
Raises:
|
206
|
-
PulseError: If freq is outside of channels range
|
207
|
-
Returns:
|
208
|
-
True if lo is valid for channel
|
209
|
-
"""
|
210
|
-
lo_ranges = self._lo_ranges
|
211
|
-
if channel in lo_ranges:
|
212
|
-
lo_range = lo_ranges[channel]
|
213
|
-
if not lo_range.includes(freq):
|
214
|
-
raise PulseError(f"Specified LO freq {freq:f} is out of range {lo_range}")
|
215
|
-
return True
|
216
|
-
|
217
|
-
def channel_lo(self, channel: DriveChannel | MeasureChannel) -> float:
|
218
|
-
"""Return channel lo.
|
219
|
-
|
220
|
-
Args:
|
221
|
-
channel: Channel to get lo for
|
222
|
-
Raises:
|
223
|
-
PulseError: If channel is not configured
|
224
|
-
Returns:
|
225
|
-
Lo of supplied channel if present
|
226
|
-
"""
|
227
|
-
if isinstance(channel, DriveChannel):
|
228
|
-
if channel in self.qubit_los:
|
229
|
-
return self.qubit_los[channel]
|
230
|
-
|
231
|
-
if isinstance(channel, MeasureChannel):
|
232
|
-
if channel in self.meas_los:
|
233
|
-
return self.meas_los[channel]
|
234
|
-
|
235
|
-
raise PulseError(f"Channel {channel} is not configured")
|
236
|
-
|
237
|
-
@property
|
238
|
-
def qubit_los(self) -> dict[DriveChannel, float]:
|
239
|
-
"""Returns dictionary mapping qubit channels (DriveChannel) to los."""
|
240
|
-
return self._q_lo_freq
|
241
|
-
|
242
|
-
@property
|
243
|
-
def meas_los(self) -> dict[MeasureChannel, float]:
|
244
|
-
"""Returns dictionary mapping measure channels (MeasureChannel) to los."""
|
245
|
-
return self._m_lo_freq
|
qiskit/pulse/exceptions.py
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2017, 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
|
-
"""Exception for errors raised by the pulse module."""
|
14
|
-
from qiskit.exceptions import QiskitError
|
15
|
-
from qiskit.utils.deprecate_pulse import deprecate_pulse_func
|
16
|
-
|
17
|
-
|
18
|
-
class PulseError(QiskitError):
|
19
|
-
"""Errors raised by the pulse module."""
|
20
|
-
|
21
|
-
@deprecate_pulse_func
|
22
|
-
def __init__(self, *message):
|
23
|
-
"""Set the error message."""
|
24
|
-
super().__init__(*message)
|
25
|
-
self.message = " ".join(message)
|
26
|
-
|
27
|
-
def __str__(self):
|
28
|
-
"""Return the message."""
|
29
|
-
return repr(self.message)
|
30
|
-
|
31
|
-
|
32
|
-
class BackendNotSet(PulseError):
|
33
|
-
"""Raised if the builder context does not have a backend."""
|
34
|
-
|
35
|
-
|
36
|
-
class NoActiveBuilder(PulseError):
|
37
|
-
"""Raised if no builder context is active."""
|
38
|
-
|
39
|
-
|
40
|
-
class UnassignedDurationError(PulseError):
|
41
|
-
"""Raised if instruction duration is unassigned."""
|
42
|
-
|
43
|
-
|
44
|
-
class UnassignedReferenceError(PulseError):
|
45
|
-
"""Raised if subroutine is unassigned."""
|
qiskit/pulse/filters.py
DELETED
@@ -1,309 +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
|
-
"""A collection of functions that filter instructions in a pulse program."""
|
14
|
-
from __future__ import annotations
|
15
|
-
import abc
|
16
|
-
from functools import singledispatch
|
17
|
-
from collections.abc import Iterable
|
18
|
-
from typing import Callable, Any, List
|
19
|
-
|
20
|
-
import numpy as np
|
21
|
-
|
22
|
-
from qiskit.pulse import Schedule, ScheduleBlock, Instruction
|
23
|
-
from qiskit.pulse.channels import Channel
|
24
|
-
from qiskit.pulse.schedule import Interval
|
25
|
-
from qiskit.pulse.exceptions import PulseError
|
26
|
-
|
27
|
-
|
28
|
-
@singledispatch
|
29
|
-
def filter_instructions(
|
30
|
-
sched,
|
31
|
-
filters: List[Callable[..., bool]],
|
32
|
-
negate: bool = False,
|
33
|
-
recurse_subroutines: bool = True,
|
34
|
-
):
|
35
|
-
"""A catch-TypeError function which will only get called if none of the other decorated
|
36
|
-
functions, namely handle_schedule() and handle_scheduleblock(), handle the type passed.
|
37
|
-
"""
|
38
|
-
raise TypeError(
|
39
|
-
f"Type '{type(sched)}' is not valid data format as an input to filter_instructions."
|
40
|
-
)
|
41
|
-
|
42
|
-
|
43
|
-
@filter_instructions.register
|
44
|
-
def handle_schedule(
|
45
|
-
sched: Schedule,
|
46
|
-
filters: List[Callable[..., bool]],
|
47
|
-
negate: bool = False,
|
48
|
-
recurse_subroutines: bool = True,
|
49
|
-
) -> Schedule:
|
50
|
-
"""A filtering function that takes a schedule and returns a schedule consisting of
|
51
|
-
filtered instructions.
|
52
|
-
|
53
|
-
Args:
|
54
|
-
sched: A pulse schedule to be filtered.
|
55
|
-
filters: List of callback functions that take an instruction and return boolean.
|
56
|
-
negate: Set `True` to accept an instruction if a filter function returns `False`.
|
57
|
-
Otherwise the instruction is accepted when the filter function returns `False`.
|
58
|
-
recurse_subroutines: Set `True` to individually filter instructions inside of a subroutine
|
59
|
-
defined by the :py:class:`~qiskit.pulse.instructions.Call` instruction.
|
60
|
-
|
61
|
-
Returns:
|
62
|
-
Filtered pulse schedule.
|
63
|
-
"""
|
64
|
-
from qiskit.pulse.transforms import flatten, inline_subroutines
|
65
|
-
|
66
|
-
target_sched = flatten(sched)
|
67
|
-
if recurse_subroutines:
|
68
|
-
target_sched = inline_subroutines(target_sched)
|
69
|
-
|
70
|
-
time_inst_tuples = np.array(target_sched.instructions)
|
71
|
-
|
72
|
-
valid_insts = np.ones(len(time_inst_tuples), dtype=bool)
|
73
|
-
for filt in filters:
|
74
|
-
valid_insts = np.logical_and(valid_insts, np.array(list(map(filt, time_inst_tuples))))
|
75
|
-
|
76
|
-
if negate and len(filters) > 0:
|
77
|
-
valid_insts = ~valid_insts
|
78
|
-
|
79
|
-
filter_schedule = Schedule.initialize_from(sched)
|
80
|
-
for time, inst in time_inst_tuples[valid_insts]:
|
81
|
-
filter_schedule.insert(time, inst, inplace=True)
|
82
|
-
|
83
|
-
return filter_schedule
|
84
|
-
|
85
|
-
|
86
|
-
@filter_instructions.register
|
87
|
-
def handle_scheduleblock(
|
88
|
-
sched_blk: ScheduleBlock,
|
89
|
-
filters: List[Callable[..., bool]],
|
90
|
-
negate: bool = False,
|
91
|
-
recurse_subroutines: bool = True,
|
92
|
-
) -> ScheduleBlock:
|
93
|
-
"""A filtering function that takes a schedule_block and returns a schedule_block consisting of
|
94
|
-
filtered instructions.
|
95
|
-
|
96
|
-
Args:
|
97
|
-
sched_blk: A pulse schedule_block to be filtered.
|
98
|
-
filters: List of callback functions that take an instruction and return boolean.
|
99
|
-
negate: Set `True` to accept an instruction if a filter function returns `False`.
|
100
|
-
Otherwise the instruction is accepted when the filter function returns `False`.
|
101
|
-
recurse_subroutines: Set `True` to individually filter instructions inside of a subroutine
|
102
|
-
defined by the :py:class:`~qiskit.pulse.instructions.Call` instruction.
|
103
|
-
|
104
|
-
Returns:
|
105
|
-
Filtered pulse schedule_block.
|
106
|
-
"""
|
107
|
-
from qiskit.pulse.transforms import inline_subroutines
|
108
|
-
|
109
|
-
target_sched_blk = sched_blk
|
110
|
-
if recurse_subroutines:
|
111
|
-
target_sched_blk = inline_subroutines(target_sched_blk)
|
112
|
-
|
113
|
-
def apply_filters_to_insts_in_scheblk(blk: ScheduleBlock) -> ScheduleBlock:
|
114
|
-
blk_new = ScheduleBlock.initialize_from(blk)
|
115
|
-
for element in blk.blocks:
|
116
|
-
if isinstance(element, ScheduleBlock):
|
117
|
-
inner_blk = apply_filters_to_insts_in_scheblk(element)
|
118
|
-
if len(inner_blk) > 0:
|
119
|
-
blk_new.append(inner_blk)
|
120
|
-
|
121
|
-
elif isinstance(element, Instruction):
|
122
|
-
valid_inst = all(filt(element) for filt in filters)
|
123
|
-
if negate:
|
124
|
-
valid_inst ^= True
|
125
|
-
if valid_inst:
|
126
|
-
blk_new.append(element)
|
127
|
-
|
128
|
-
else:
|
129
|
-
raise PulseError(
|
130
|
-
f"An unexpected element '{element}' is included in ScheduleBlock.blocks."
|
131
|
-
)
|
132
|
-
return blk_new
|
133
|
-
|
134
|
-
filter_sched_blk = apply_filters_to_insts_in_scheblk(target_sched_blk)
|
135
|
-
return filter_sched_blk
|
136
|
-
|
137
|
-
|
138
|
-
def composite_filter(
|
139
|
-
channels: Iterable[Channel] | Channel | None = None,
|
140
|
-
instruction_types: Iterable[abc.ABCMeta] | abc.ABCMeta | None = None,
|
141
|
-
time_ranges: Iterable[tuple[int, int]] | None = None,
|
142
|
-
intervals: Iterable[Interval] | None = None,
|
143
|
-
) -> list[Callable]:
|
144
|
-
"""A helper function to generate a list of filter functions based on
|
145
|
-
typical elements to be filtered.
|
146
|
-
|
147
|
-
Args:
|
148
|
-
channels: For example, ``[DriveChannel(0), AcquireChannel(0)]``.
|
149
|
-
instruction_types (Optional[Iterable[Type[qiskit.pulse.Instruction]]]): For example,
|
150
|
-
``[PulseInstruction, AcquireInstruction]``.
|
151
|
-
time_ranges: For example, ``[(0, 5), (6, 10)]``.
|
152
|
-
intervals: For example, ``[(0, 5), (6, 10)]``.
|
153
|
-
|
154
|
-
Returns:
|
155
|
-
List of filtering functions.
|
156
|
-
"""
|
157
|
-
filters = []
|
158
|
-
|
159
|
-
# An empty list is also valid input for filter generators.
|
160
|
-
# See unittest `test.python.pulse.test_schedule.TestScheduleFilter.test_empty_filters`.
|
161
|
-
if channels is not None:
|
162
|
-
filters.append(with_channels(channels))
|
163
|
-
if instruction_types is not None:
|
164
|
-
filters.append(with_instruction_types(instruction_types))
|
165
|
-
if time_ranges is not None:
|
166
|
-
filters.append(with_intervals(time_ranges))
|
167
|
-
if intervals is not None:
|
168
|
-
filters.append(with_intervals(intervals))
|
169
|
-
|
170
|
-
return filters
|
171
|
-
|
172
|
-
|
173
|
-
def with_channels(channels: Iterable[Channel] | Channel) -> Callable:
|
174
|
-
"""Channel filter generator.
|
175
|
-
|
176
|
-
Args:
|
177
|
-
channels: List of channels to filter.
|
178
|
-
|
179
|
-
Returns:
|
180
|
-
A callback function to filter channels.
|
181
|
-
"""
|
182
|
-
channels = _if_scalar_cast_to_list(channels)
|
183
|
-
|
184
|
-
@singledispatch
|
185
|
-
def channel_filter(time_inst):
|
186
|
-
"""A catch-TypeError function which will only get called if none of the other decorated
|
187
|
-
functions, namely handle_numpyndarray() and handle_instruction(), handle the type passed.
|
188
|
-
"""
|
189
|
-
raise TypeError(
|
190
|
-
f"Type '{type(time_inst)}' is not valid data format as an input to channel_filter."
|
191
|
-
)
|
192
|
-
|
193
|
-
@channel_filter.register
|
194
|
-
def handle_numpyndarray(time_inst: np.ndarray) -> bool:
|
195
|
-
"""Filter channel.
|
196
|
-
|
197
|
-
Args:
|
198
|
-
time_inst (numpy.ndarray([int, Instruction])): Time
|
199
|
-
|
200
|
-
Returns:
|
201
|
-
If instruction matches with condition.
|
202
|
-
"""
|
203
|
-
return any(chan in channels for chan in time_inst[1].channels)
|
204
|
-
|
205
|
-
@channel_filter.register
|
206
|
-
def handle_instruction(inst: Instruction) -> bool:
|
207
|
-
"""Filter channel.
|
208
|
-
|
209
|
-
Args:
|
210
|
-
inst: Instruction
|
211
|
-
|
212
|
-
Returns:
|
213
|
-
If instruction matches with condition.
|
214
|
-
"""
|
215
|
-
return any(chan in channels for chan in inst.channels)
|
216
|
-
|
217
|
-
return channel_filter
|
218
|
-
|
219
|
-
|
220
|
-
def with_instruction_types(types: Iterable[abc.ABCMeta] | abc.ABCMeta) -> Callable:
|
221
|
-
"""Instruction type filter generator.
|
222
|
-
|
223
|
-
Args:
|
224
|
-
types: List of instruction types to filter.
|
225
|
-
|
226
|
-
Returns:
|
227
|
-
A callback function to filter instructions.
|
228
|
-
"""
|
229
|
-
types = _if_scalar_cast_to_list(types)
|
230
|
-
|
231
|
-
@singledispatch
|
232
|
-
def instruction_filter(time_inst) -> bool:
|
233
|
-
"""A catch-TypeError function which will only get called if none of the other decorated
|
234
|
-
functions, namely handle_numpyndarray() and handle_instruction(), handle the type passed.
|
235
|
-
"""
|
236
|
-
raise TypeError(
|
237
|
-
f"Type '{type(time_inst)}' is not valid data format as an input to instruction_filter."
|
238
|
-
)
|
239
|
-
|
240
|
-
@instruction_filter.register
|
241
|
-
def handle_numpyndarray(time_inst: np.ndarray) -> bool:
|
242
|
-
"""Filter instruction.
|
243
|
-
|
244
|
-
Args:
|
245
|
-
time_inst (numpy.ndarray([int, Instruction])): Time
|
246
|
-
|
247
|
-
Returns:
|
248
|
-
If instruction matches with condition.
|
249
|
-
"""
|
250
|
-
return isinstance(time_inst[1], tuple(types))
|
251
|
-
|
252
|
-
@instruction_filter.register
|
253
|
-
def handle_instruction(inst: Instruction) -> bool:
|
254
|
-
"""Filter instruction.
|
255
|
-
|
256
|
-
Args:
|
257
|
-
inst: Instruction
|
258
|
-
|
259
|
-
Returns:
|
260
|
-
If instruction matches with condition.
|
261
|
-
"""
|
262
|
-
return isinstance(inst, tuple(types))
|
263
|
-
|
264
|
-
return instruction_filter
|
265
|
-
|
266
|
-
|
267
|
-
def with_intervals(ranges: Iterable[Interval] | Interval) -> Callable:
|
268
|
-
"""Interval filter generator.
|
269
|
-
|
270
|
-
Args:
|
271
|
-
ranges: List of intervals ``[t0, t1]`` to filter.
|
272
|
-
|
273
|
-
Returns:
|
274
|
-
A callback function to filter intervals.
|
275
|
-
"""
|
276
|
-
ranges = _if_scalar_cast_to_list(ranges)
|
277
|
-
|
278
|
-
def interval_filter(time_inst) -> bool:
|
279
|
-
"""Filter interval.
|
280
|
-
Args:
|
281
|
-
time_inst (Tuple[int, Instruction]): Time
|
282
|
-
|
283
|
-
Returns:
|
284
|
-
If instruction matches with condition.
|
285
|
-
"""
|
286
|
-
for t0, t1 in ranges:
|
287
|
-
inst_start = time_inst[0]
|
288
|
-
inst_stop = inst_start + time_inst[1].duration
|
289
|
-
if t0 <= inst_start and inst_stop <= t1:
|
290
|
-
return True
|
291
|
-
return False
|
292
|
-
|
293
|
-
return interval_filter
|
294
|
-
|
295
|
-
|
296
|
-
def _if_scalar_cast_to_list(to_list: Any) -> list[Any]:
|
297
|
-
"""A helper function to create python list of input arguments.
|
298
|
-
|
299
|
-
Args:
|
300
|
-
to_list: Arbitrary object can be converted into a python list.
|
301
|
-
|
302
|
-
Returns:
|
303
|
-
Python list of input object.
|
304
|
-
"""
|
305
|
-
try:
|
306
|
-
iter(to_list)
|
307
|
-
except TypeError:
|
308
|
-
to_list = [to_list]
|
309
|
-
return to_list
|