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/library/waveform.py
DELETED
@@ -1,136 +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
|
-
"""A pulse that is described by complex-valued sample points."""
|
14
|
-
from __future__ import annotations
|
15
|
-
from typing import Any
|
16
|
-
|
17
|
-
import numpy as np
|
18
|
-
|
19
|
-
from qiskit.pulse.exceptions import PulseError
|
20
|
-
from qiskit.pulse.library.pulse import Pulse
|
21
|
-
from qiskit.utils.deprecate_pulse import deprecate_pulse_func
|
22
|
-
|
23
|
-
|
24
|
-
class Waveform(Pulse):
|
25
|
-
"""A pulse specified completely by complex-valued samples; each sample is played for the
|
26
|
-
duration of the backend cycle-time, dt.
|
27
|
-
"""
|
28
|
-
|
29
|
-
@deprecate_pulse_func
|
30
|
-
def __init__(
|
31
|
-
self,
|
32
|
-
samples: np.ndarray | list[complex],
|
33
|
-
name: str | None = None,
|
34
|
-
epsilon: float = 1e-7,
|
35
|
-
limit_amplitude: bool | None = None,
|
36
|
-
):
|
37
|
-
"""Create new sample pulse command.
|
38
|
-
|
39
|
-
Args:
|
40
|
-
samples: Complex array of the samples in the pulse envelope.
|
41
|
-
name: Unique name to identify the pulse.
|
42
|
-
epsilon: Pulse sample norm tolerance for clipping.
|
43
|
-
If any sample's norm exceeds unity by less than or equal to epsilon
|
44
|
-
it will be clipped to unit norm. If the sample
|
45
|
-
norm is greater than 1+epsilon an error will be raised.
|
46
|
-
limit_amplitude: Passed to parent Pulse
|
47
|
-
"""
|
48
|
-
|
49
|
-
super().__init__(duration=len(samples), name=name, limit_amplitude=limit_amplitude)
|
50
|
-
samples = np.asarray(samples, dtype=np.complex128)
|
51
|
-
self.epsilon = epsilon
|
52
|
-
self._samples = self._clip(samples, epsilon=epsilon)
|
53
|
-
|
54
|
-
@property
|
55
|
-
def samples(self) -> np.ndarray:
|
56
|
-
"""Return sample values."""
|
57
|
-
return self._samples
|
58
|
-
|
59
|
-
def _clip(self, samples: np.ndarray, epsilon: float = 1e-7) -> np.ndarray:
|
60
|
-
"""If samples are within epsilon of unit norm, clip sample by reducing norm by (1-epsilon).
|
61
|
-
|
62
|
-
If difference is greater than epsilon error is raised.
|
63
|
-
|
64
|
-
Args:
|
65
|
-
samples: Complex array of the samples in the pulse envelope.
|
66
|
-
epsilon: Pulse sample norm tolerance for clipping.
|
67
|
-
If any sample's norm exceeds unity by less than or equal to epsilon
|
68
|
-
it will be clipped to unit norm. If the sample
|
69
|
-
norm is greater than 1+epsilon an error will be raised.
|
70
|
-
|
71
|
-
Returns:
|
72
|
-
Clipped pulse samples.
|
73
|
-
|
74
|
-
Raises:
|
75
|
-
PulseError: If there exists a pulse sample with a norm greater than 1+epsilon.
|
76
|
-
"""
|
77
|
-
samples_norm = np.abs(samples)
|
78
|
-
to_clip = (samples_norm > 1.0) & (samples_norm <= 1.0 + epsilon)
|
79
|
-
|
80
|
-
if np.any(to_clip):
|
81
|
-
# first try normalizing by the abs value
|
82
|
-
clip_where = np.argwhere(to_clip)
|
83
|
-
clip_angle = np.angle(samples[clip_where])
|
84
|
-
clipped_samples = np.exp(1j * clip_angle, dtype=np.complex128)
|
85
|
-
|
86
|
-
# if norm still exceed one subtract epsilon
|
87
|
-
# required for some platforms
|
88
|
-
clipped_sample_norms = np.abs(clipped_samples)
|
89
|
-
to_clip_epsilon = clipped_sample_norms > 1.0
|
90
|
-
if np.any(to_clip_epsilon):
|
91
|
-
clip_where_epsilon = np.argwhere(to_clip_epsilon)
|
92
|
-
clipped_samples_epsilon = (1 - epsilon) * np.exp(
|
93
|
-
1j * clip_angle[clip_where_epsilon], dtype=np.complex128
|
94
|
-
)
|
95
|
-
clipped_samples[clip_where_epsilon] = clipped_samples_epsilon
|
96
|
-
|
97
|
-
# update samples with clipped values
|
98
|
-
samples[clip_where] = clipped_samples
|
99
|
-
samples_norm[clip_where] = np.abs(clipped_samples)
|
100
|
-
|
101
|
-
if np.any(samples_norm > 1.0) and self._limit_amplitude:
|
102
|
-
amp = np.max(samples_norm)
|
103
|
-
raise PulseError(
|
104
|
-
f"Pulse contains sample with norm {amp} greater than 1+epsilon."
|
105
|
-
" This can be overruled by setting Pulse.limit_amplitude."
|
106
|
-
)
|
107
|
-
|
108
|
-
return samples
|
109
|
-
|
110
|
-
def is_parameterized(self) -> bool:
|
111
|
-
"""Return True iff the instruction is parameterized."""
|
112
|
-
return False
|
113
|
-
|
114
|
-
@property
|
115
|
-
def parameters(self) -> dict[str, Any]:
|
116
|
-
"""Return a dictionary containing the pulse's parameters."""
|
117
|
-
return {}
|
118
|
-
|
119
|
-
def __eq__(self, other: object) -> bool:
|
120
|
-
if not isinstance(other, Waveform):
|
121
|
-
return NotImplemented
|
122
|
-
return (
|
123
|
-
super().__eq__(other)
|
124
|
-
and self.samples.shape == other.samples.shape
|
125
|
-
and np.allclose(self.samples, other.samples, rtol=0, atol=self.epsilon)
|
126
|
-
)
|
127
|
-
|
128
|
-
def __hash__(self) -> int:
|
129
|
-
return hash(self.samples.tobytes())
|
130
|
-
|
131
|
-
def __repr__(self) -> str:
|
132
|
-
opt = np.get_printoptions()
|
133
|
-
np.set_printoptions(threshold=50)
|
134
|
-
np.set_printoptions(**opt)
|
135
|
-
name_repr = f", name='{self.name}'" if self.name is not None else ""
|
136
|
-
return f"{self.__class__.__name__}({repr(self.samples)}{name_repr})"
|
qiskit/pulse/macros.py
DELETED
@@ -1,262 +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
|
-
"""Module for common pulse programming macros."""
|
14
|
-
from __future__ import annotations
|
15
|
-
|
16
|
-
from collections.abc import Sequence
|
17
|
-
from typing import TYPE_CHECKING
|
18
|
-
|
19
|
-
from qiskit.pulse import channels, exceptions, instructions, utils
|
20
|
-
from qiskit.pulse.instruction_schedule_map import InstructionScheduleMap
|
21
|
-
from qiskit.pulse.schedule import Schedule
|
22
|
-
from qiskit.providers.backend import BackendV2
|
23
|
-
|
24
|
-
|
25
|
-
if TYPE_CHECKING:
|
26
|
-
from qiskit.transpiler import Target
|
27
|
-
|
28
|
-
|
29
|
-
def measure(
|
30
|
-
qubits: Sequence[int],
|
31
|
-
backend=None,
|
32
|
-
inst_map: InstructionScheduleMap | None = None,
|
33
|
-
meas_map: list[list[int]] | dict[int, list[int]] | None = None,
|
34
|
-
qubit_mem_slots: dict[int, int] | None = None,
|
35
|
-
measure_name: str = "measure",
|
36
|
-
) -> Schedule:
|
37
|
-
"""Return a schedule which measures the requested qubits according to the given
|
38
|
-
instruction mapping and measure map, or by using the defaults provided by the backend.
|
39
|
-
|
40
|
-
.. note::
|
41
|
-
This function internally dispatches schedule generation logic depending on input backend model.
|
42
|
-
For the :class:`.BackendV1`, it considers conventional :class:`.InstructionScheduleMap`
|
43
|
-
and utilizes the backend calibration defined for a group of qubits in the `meas_map`.
|
44
|
-
For the :class:`.BackendV2`, it assembles calibrations of single qubit measurement
|
45
|
-
defined in the backend target to build a composite measurement schedule for `qubits`.
|
46
|
-
|
47
|
-
By default, the measurement results for each qubit are trivially mapped to the qubit
|
48
|
-
index. This behavior is overridden by qubit_mem_slots. For instance, to measure
|
49
|
-
qubit 0 into MemorySlot(1), qubit_mem_slots can be provided as {0: 1}.
|
50
|
-
|
51
|
-
Args:
|
52
|
-
qubits: List of qubits to be measured.
|
53
|
-
backend (Union[Backend, BaseBackend]): A backend instance, which contains
|
54
|
-
hardware-specific data required for scheduling.
|
55
|
-
inst_map: Mapping of circuit operations to pulse schedules. If None, defaults to the
|
56
|
-
``instruction_schedule_map`` of ``backend``.
|
57
|
-
meas_map: List of sets of qubits that must be measured together. If None, defaults to
|
58
|
-
the ``meas_map`` of ``backend``.
|
59
|
-
qubit_mem_slots: Mapping of measured qubit index to classical bit index.
|
60
|
-
measure_name: Name of the measurement schedule.
|
61
|
-
|
62
|
-
Returns:
|
63
|
-
A measurement schedule corresponding to the inputs provided.
|
64
|
-
"""
|
65
|
-
|
66
|
-
# backend is V2.
|
67
|
-
if isinstance(backend, BackendV2):
|
68
|
-
|
69
|
-
return _measure_v2(
|
70
|
-
qubits=qubits,
|
71
|
-
target=backend.target,
|
72
|
-
meas_map=meas_map or backend.meas_map,
|
73
|
-
qubit_mem_slots=qubit_mem_slots or dict(zip(qubits, range(len(qubits)))),
|
74
|
-
measure_name=measure_name,
|
75
|
-
)
|
76
|
-
# backend is V1 or backend is None.
|
77
|
-
else:
|
78
|
-
try:
|
79
|
-
return _measure_v1(
|
80
|
-
qubits=qubits,
|
81
|
-
inst_map=inst_map or backend.defaults().instruction_schedule_map,
|
82
|
-
meas_map=meas_map or backend.configuration().meas_map,
|
83
|
-
qubit_mem_slots=qubit_mem_slots,
|
84
|
-
measure_name=measure_name,
|
85
|
-
)
|
86
|
-
except AttributeError as ex:
|
87
|
-
raise exceptions.PulseError(
|
88
|
-
"inst_map or meas_map, and backend cannot be None simultaneously"
|
89
|
-
) from ex
|
90
|
-
|
91
|
-
|
92
|
-
def _measure_v1(
|
93
|
-
qubits: Sequence[int],
|
94
|
-
inst_map: InstructionScheduleMap,
|
95
|
-
meas_map: list[list[int]] | dict[int, list[int]],
|
96
|
-
qubit_mem_slots: dict[int, int] | None = None,
|
97
|
-
measure_name: str = "measure",
|
98
|
-
) -> Schedule:
|
99
|
-
"""Return a schedule which measures the requested qubits according to the given
|
100
|
-
instruction mapping and measure map, or by using the defaults provided by the backendV1.
|
101
|
-
|
102
|
-
Args:
|
103
|
-
qubits: List of qubits to be measured.
|
104
|
-
backend (Union[Backend, BaseBackend]): A backend instance, which contains
|
105
|
-
hardware-specific data required for scheduling.
|
106
|
-
inst_map: Mapping of circuit operations to pulse schedules. If None, defaults to the
|
107
|
-
``instruction_schedule_map`` of ``backend``.
|
108
|
-
meas_map: List of sets of qubits that must be measured together. If None, defaults to
|
109
|
-
the ``meas_map`` of ``backend``.
|
110
|
-
qubit_mem_slots: Mapping of measured qubit index to classical bit index.
|
111
|
-
measure_name: Name of the measurement schedule.
|
112
|
-
Returns:
|
113
|
-
A measurement schedule corresponding to the inputs provided.
|
114
|
-
Raises:
|
115
|
-
PulseError: If both ``inst_map`` or ``meas_map``, and ``backend`` is None.
|
116
|
-
"""
|
117
|
-
|
118
|
-
schedule = Schedule(name=f"Default measurement schedule for qubits {qubits}")
|
119
|
-
|
120
|
-
if isinstance(meas_map, list):
|
121
|
-
meas_map = utils.format_meas_map(meas_map)
|
122
|
-
|
123
|
-
measure_groups = set()
|
124
|
-
for qubit in qubits:
|
125
|
-
measure_groups.add(tuple(meas_map[qubit]))
|
126
|
-
for measure_group_qubits in measure_groups:
|
127
|
-
|
128
|
-
unused_mem_slots = (
|
129
|
-
set()
|
130
|
-
if qubit_mem_slots is None
|
131
|
-
else set(measure_group_qubits) - set(qubit_mem_slots.values())
|
132
|
-
)
|
133
|
-
|
134
|
-
try:
|
135
|
-
default_sched = inst_map.get(measure_name, measure_group_qubits)
|
136
|
-
except exceptions.PulseError as ex:
|
137
|
-
raise exceptions.PulseError(
|
138
|
-
f"We could not find a default measurement schedule called '{measure_name}'. "
|
139
|
-
"Please provide another name using the 'measure_name' keyword "
|
140
|
-
"argument. For assistance, the instructions which are defined are: "
|
141
|
-
f"{inst_map.instructions}"
|
142
|
-
) from ex
|
143
|
-
for time, inst in default_sched.instructions:
|
144
|
-
if inst.channel.index not in qubits:
|
145
|
-
continue
|
146
|
-
if qubit_mem_slots and isinstance(inst, instructions.Acquire):
|
147
|
-
if inst.channel.index in qubit_mem_slots:
|
148
|
-
mem_slot = channels.MemorySlot(qubit_mem_slots[inst.channel.index])
|
149
|
-
else:
|
150
|
-
mem_slot = channels.MemorySlot(unused_mem_slots.pop())
|
151
|
-
inst = instructions.Acquire(inst.duration, inst.channel, mem_slot=mem_slot)
|
152
|
-
# Measurement pulses should only be added if its qubit was measured by the user
|
153
|
-
schedule = schedule.insert(time, inst)
|
154
|
-
|
155
|
-
return schedule
|
156
|
-
|
157
|
-
|
158
|
-
def _measure_v2(
|
159
|
-
qubits: Sequence[int],
|
160
|
-
target: Target,
|
161
|
-
meas_map: list[list[int]] | dict[int, list[int]],
|
162
|
-
qubit_mem_slots: dict[int, int],
|
163
|
-
measure_name: str = "measure",
|
164
|
-
) -> Schedule:
|
165
|
-
"""Return a schedule which measures the requested qubits according to the given
|
166
|
-
target and measure map, or by using the defaults provided by the backendV2.
|
167
|
-
|
168
|
-
Args:
|
169
|
-
qubits: List of qubits to be measured.
|
170
|
-
target: The :class:`~.Target` representing the target backend.
|
171
|
-
meas_map: List of sets of qubits that must be measured together.
|
172
|
-
qubit_mem_slots: Mapping of measured qubit index to classical bit index.
|
173
|
-
measure_name: Name of the measurement schedule.
|
174
|
-
|
175
|
-
Returns:
|
176
|
-
A measurement schedule corresponding to the inputs provided.
|
177
|
-
"""
|
178
|
-
schedule = Schedule(name=f"Default measurement schedule for qubits {qubits}")
|
179
|
-
|
180
|
-
if isinstance(meas_map, list):
|
181
|
-
meas_map = utils.format_meas_map(meas_map)
|
182
|
-
meas_group = set()
|
183
|
-
for qubit in qubits:
|
184
|
-
meas_group |= set(meas_map[qubit])
|
185
|
-
meas_group = sorted(meas_group)
|
186
|
-
|
187
|
-
meas_group_set = set(range(max(meas_group) + 1))
|
188
|
-
unassigned_qubit_indices = sorted(set(meas_group) - qubit_mem_slots.keys())
|
189
|
-
unassigned_reg_indices = sorted(meas_group_set - set(qubit_mem_slots.values()), reverse=True)
|
190
|
-
if set(qubit_mem_slots.values()).issubset(meas_group_set):
|
191
|
-
for qubit in unassigned_qubit_indices:
|
192
|
-
qubit_mem_slots[qubit] = unassigned_reg_indices.pop()
|
193
|
-
|
194
|
-
for measure_qubit in meas_group:
|
195
|
-
try:
|
196
|
-
if measure_qubit in qubits:
|
197
|
-
default_sched = target._get_calibration(measure_name, (measure_qubit,)).filter(
|
198
|
-
channels=[
|
199
|
-
channels.MeasureChannel(measure_qubit),
|
200
|
-
channels.AcquireChannel(measure_qubit),
|
201
|
-
]
|
202
|
-
)
|
203
|
-
schedule += _schedule_remapping_memory_slot(default_sched, qubit_mem_slots)
|
204
|
-
except KeyError as ex:
|
205
|
-
raise exceptions.PulseError(
|
206
|
-
f"We could not find a default measurement schedule called '{measure_name}'. "
|
207
|
-
"Please provide another name using the 'measure_name' keyword "
|
208
|
-
"argument. For assistance, the instructions which are defined are: "
|
209
|
-
f"{target.instructions}"
|
210
|
-
) from ex
|
211
|
-
return schedule
|
212
|
-
|
213
|
-
|
214
|
-
def measure_all(backend) -> Schedule:
|
215
|
-
"""
|
216
|
-
Return a Schedule which measures all qubits of the given backend.
|
217
|
-
|
218
|
-
Args:
|
219
|
-
backend (Union[Backend, BaseBackend]): A backend instance, which contains
|
220
|
-
hardware-specific data required for scheduling.
|
221
|
-
|
222
|
-
Returns:
|
223
|
-
A schedule corresponding to the inputs provided.
|
224
|
-
"""
|
225
|
-
# backend is V2.
|
226
|
-
if isinstance(backend, BackendV2):
|
227
|
-
qubits = list(range(backend.num_qubits))
|
228
|
-
else:
|
229
|
-
qubits = list(range(backend.configuration().n_qubits))
|
230
|
-
return measure(qubits=qubits, backend=backend)
|
231
|
-
|
232
|
-
|
233
|
-
def _schedule_remapping_memory_slot(
|
234
|
-
schedule: Schedule, qubit_mem_slots: dict[int, int]
|
235
|
-
) -> Schedule:
|
236
|
-
"""
|
237
|
-
A helper function to overwrite MemorySlot index of :class:`.Acquire` instruction.
|
238
|
-
|
239
|
-
Args:
|
240
|
-
schedule: A measurement schedule.
|
241
|
-
qubit_mem_slots: Mapping of measured qubit index to classical bit index.
|
242
|
-
|
243
|
-
Returns:
|
244
|
-
A measurement schedule with new memory slot index.
|
245
|
-
"""
|
246
|
-
new_schedule = Schedule()
|
247
|
-
for t0, inst in schedule.instructions:
|
248
|
-
if isinstance(inst, instructions.Acquire):
|
249
|
-
qubit_index = inst.channel.index
|
250
|
-
reg_index = qubit_mem_slots.get(qubit_index, qubit_index)
|
251
|
-
new_schedule.insert(
|
252
|
-
t0,
|
253
|
-
instructions.Acquire(
|
254
|
-
inst.duration,
|
255
|
-
channels.AcquireChannel(qubit_index),
|
256
|
-
mem_slot=channels.MemorySlot(reg_index),
|
257
|
-
),
|
258
|
-
inplace=True,
|
259
|
-
)
|
260
|
-
else:
|
261
|
-
new_schedule.insert(t0, inst, inplace=True)
|
262
|
-
return new_schedule
|