qiskit 1.4.1__cp39-abi3-win_amd64.whl → 2.0.0__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 +3 -9
- qiskit/_accelerate.pyd +0 -0
- qiskit/circuit/__init__.py +35 -10
- qiskit/circuit/{add_control.py → _add_control.py} +32 -12
- qiskit/circuit/_classical_resource_map.py +5 -3
- qiskit/circuit/barrier.py +3 -7
- qiskit/circuit/classical/expr/__init__.py +31 -3
- qiskit/circuit/classical/expr/constructors.py +236 -28
- qiskit/circuit/classical/expr/expr.py +104 -3
- qiskit/circuit/classical/expr/visitors.py +75 -0
- qiskit/circuit/classical/types/__init__.py +12 -8
- qiskit/circuit/classical/types/ordering.py +14 -7
- qiskit/circuit/classical/types/types.py +36 -0
- qiskit/circuit/commutation_checker.py +34 -7
- qiskit/circuit/controlflow/__init__.py +32 -1
- qiskit/circuit/controlflow/_builder_utils.py +9 -5
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +1 -1
- qiskit/circuit/controlflow/builder.py +139 -39
- qiskit/circuit/controlflow/continue_loop.py +1 -3
- qiskit/circuit/controlflow/control_flow.py +10 -0
- qiskit/circuit/controlflow/for_loop.py +2 -1
- qiskit/circuit/controlflow/if_else.py +3 -16
- qiskit/circuit/controlflow/switch_case.py +2 -8
- qiskit/circuit/controlflow/while_loop.py +2 -7
- qiskit/circuit/controlledgate.py +2 -4
- qiskit/circuit/delay.py +40 -11
- qiskit/circuit/duration.py +0 -15
- qiskit/circuit/gate.py +2 -4
- qiskit/circuit/instruction.py +2 -141
- qiskit/circuit/instructionset.py +7 -54
- qiskit/circuit/library/__init__.py +469 -154
- qiskit/circuit/library/arithmetic/__init__.py +16 -10
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
- qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
- qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
- qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +52 -16
- qiskit/circuit/library/data_preparation/initializer.py +1 -1
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
- qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
- qiskit/circuit/library/generalized_gates/gms.py +1 -1
- qiskit/circuit/library/generalized_gates/isometry.py +1 -1
- qiskit/circuit/library/generalized_gates/pauli.py +1 -2
- qiskit/circuit/library/generalized_gates/uc.py +97 -7
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
- qiskit/circuit/library/generalized_gates/unitary.py +4 -2
- qiskit/circuit/library/graph_state.py +1 -0
- qiskit/circuit/library/hamiltonian_gate.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
- qiskit/circuit/library/n_local/n_local.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
- qiskit/circuit/library/overlap.py +2 -2
- qiskit/circuit/library/pauli_evolution.py +39 -24
- qiskit/circuit/library/phase_oracle.py +130 -51
- qiskit/circuit/library/standard_gates/__init__.py +0 -1
- qiskit/circuit/library/standard_gates/dcx.py +3 -4
- qiskit/circuit/library/standard_gates/ecr.py +3 -4
- qiskit/circuit/library/standard_gates/global_phase.py +5 -6
- qiskit/circuit/library/standard_gates/h.py +4 -9
- qiskit/circuit/library/standard_gates/i.py +2 -2
- qiskit/circuit/library/standard_gates/iswap.py +3 -4
- qiskit/circuit/library/standard_gates/p.py +15 -34
- qiskit/circuit/library/standard_gates/r.py +7 -10
- qiskit/circuit/library/standard_gates/rx.py +5 -15
- qiskit/circuit/library/standard_gates/rxx.py +3 -6
- qiskit/circuit/library/standard_gates/ry.py +5 -17
- qiskit/circuit/library/standard_gates/ryy.py +3 -6
- qiskit/circuit/library/standard_gates/rz.py +5 -17
- qiskit/circuit/library/standard_gates/rzx.py +3 -6
- qiskit/circuit/library/standard_gates/rzz.py +3 -6
- qiskit/circuit/library/standard_gates/s.py +6 -15
- qiskit/circuit/library/standard_gates/swap.py +4 -11
- qiskit/circuit/library/standard_gates/sx.py +7 -12
- qiskit/circuit/library/standard_gates/t.py +6 -7
- qiskit/circuit/library/standard_gates/u.py +2 -10
- qiskit/circuit/library/standard_gates/u1.py +5 -16
- qiskit/circuit/library/standard_gates/u2.py +2 -6
- qiskit/circuit/library/standard_gates/u3.py +3 -11
- qiskit/circuit/library/standard_gates/x.py +14 -62
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/y.py +4 -9
- qiskit/circuit/library/standard_gates/z.py +5 -15
- qiskit/circuit/measure.py +11 -2
- qiskit/circuit/parameterexpression.py +11 -0
- qiskit/circuit/quantumcircuit.py +890 -564
- qiskit/circuit/random/utils.py +12 -6
- qiskit/circuit/reset.py +5 -2
- qiskit/circuit/singleton.py +5 -11
- qiskit/circuit/store.py +0 -8
- qiskit/circuit/tools/pi_check.py +3 -0
- qiskit/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +6 -4
- qiskit/converters/circuit_to_dagdependency.py +0 -2
- qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
- qiskit/converters/circuit_to_gate.py +1 -1
- qiskit/converters/circuit_to_instruction.py +16 -29
- qiskit/converters/dag_to_circuit.py +7 -8
- qiskit/converters/dag_to_dagdependency.py +0 -1
- qiskit/converters/dag_to_dagdependency_v2.py +0 -1
- qiskit/converters/dagdependency_to_circuit.py +0 -6
- qiskit/converters/dagdependency_to_dag.py +0 -6
- qiskit/dagcircuit/collect_blocks.py +32 -20
- qiskit/dagcircuit/dagdependency.py +3 -37
- qiskit/dagcircuit/dagdependency_v2.py +5 -82
- qiskit/dagcircuit/dagnode.py +14 -2
- qiskit/passmanager/__init__.py +24 -6
- qiskit/passmanager/passmanager.py +26 -24
- qiskit/primitives/__init__.py +44 -35
- qiskit/primitives/backend_estimator_v2.py +102 -23
- qiskit/primitives/backend_sampler_v2.py +5 -20
- qiskit/primitives/base/__init__.py +4 -4
- qiskit/primitives/base/base_estimator.py +77 -82
- qiskit/primitives/base/base_primitive_job.py +2 -2
- qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
- qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
- qiskit/primitives/base/base_sampler.py +52 -60
- qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
- qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
- qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
- qiskit/primitives/containers/bindings_array.py +3 -1
- qiskit/primitives/containers/bit_array.py +23 -0
- qiskit/primitives/containers/data_bin.py +3 -1
- qiskit/primitives/containers/observables_array.py +19 -2
- qiskit/primitives/statevector_sampler.py +6 -8
- qiskit/primitives/utils.py +14 -189
- qiskit/providers/__init__.py +4 -130
- qiskit/providers/backend.py +11 -314
- qiskit/providers/basic_provider/__init__.py +3 -1
- qiskit/providers/basic_provider/basic_provider.py +29 -9
- qiskit/providers/basic_provider/basic_simulator.py +158 -298
- qiskit/providers/exceptions.py +0 -33
- qiskit/providers/fake_provider/__init__.py +0 -37
- qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
- qiskit/qasm2/__init__.py +21 -6
- qiskit/qasm2/export.py +2 -10
- qiskit/qasm2/parse.py +11 -25
- qiskit/qasm3/__init__.py +5 -1
- qiskit/qasm3/ast.py +44 -0
- qiskit/qasm3/exporter.py +65 -27
- qiskit/qasm3/printer.py +35 -4
- qiskit/qpy/__init__.py +162 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +96 -116
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +61 -388
- qiskit/qpy/binary_io/value.py +159 -33
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +29 -62
- qiskit/qpy/type_keys.py +58 -221
- qiskit/quantum_info/analysis/distance.py +3 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
- qiskit/quantum_info/operators/operator.py +6 -2
- qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
- qiskit/quantum_info/states/densitymatrix.py +16 -6
- qiskit/quantum_info/states/stabilizerstate.py +35 -4
- qiskit/quantum_info/states/statevector.py +16 -6
- qiskit/result/__init__.py +5 -17
- qiskit/result/models.py +18 -11
- qiskit/result/result.py +38 -134
- qiskit/result/sampled_expval.py +1 -2
- qiskit/result/utils.py +3 -4
- qiskit/synthesis/__init__.py +21 -1
- qiskit/synthesis/arithmetic/__init__.py +3 -1
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
- qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
- qiskit/synthesis/evolution/lie_trotter.py +10 -7
- qiskit/synthesis/evolution/product_formula.py +44 -35
- qiskit/synthesis/evolution/qdrift.py +17 -24
- qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
- qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
- qiskit/synthesis/two_qubit/__init__.py +1 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
- qiskit/transpiler/__init__.py +32 -232
- qiskit/transpiler/basepasses.py +20 -51
- qiskit/transpiler/layout.py +1 -1
- qiskit/transpiler/passes/__init__.py +4 -40
- qiskit/transpiler/passes/basis/basis_translator.py +5 -4
- qiskit/transpiler/passes/basis/decompose.py +1 -15
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
- qiskit/transpiler/passes/layout/apply_layout.py +4 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
- qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
- qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
- qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
- qiskit/transpiler/passes/optimization/__init__.py +2 -3
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
- qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
- qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +3 -2
- qiskit/transpiler/passes/routing/__init__.py +0 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
- qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
- qiskit/transpiler/passes/scheduling/__init__.py +1 -7
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
- qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
- qiskit/transpiler/passes/synthesis/plugin.py +4 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
- qiskit/transpiler/passes/utils/control_flow.py +2 -6
- qiskit/transpiler/passes/utils/gate_direction.py +7 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
- qiskit/transpiler/passmanager.py +13 -0
- qiskit/transpiler/passmanager_config.py +5 -81
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
- qiskit/transpiler/preset_passmanagers/common.py +140 -167
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
- qiskit/transpiler/preset_passmanagers/level0.py +2 -11
- qiskit/transpiler/preset_passmanagers/level1.py +2 -14
- qiskit/transpiler/preset_passmanagers/level2.py +2 -12
- qiskit/transpiler/preset_passmanagers/level3.py +2 -11
- qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
- qiskit/transpiler/target.py +78 -524
- qiskit/user_config.py +8 -4
- qiskit/utils/__init__.py +13 -12
- qiskit/utils/deprecation.py +4 -112
- qiskit/utils/optionals.py +11 -4
- qiskit/utils/parallel.py +214 -87
- qiskit/utils/units.py +4 -1
- qiskit/visualization/__init__.py +3 -7
- qiskit/visualization/array.py +4 -1
- qiskit/visualization/bloch.py +1 -1
- qiskit/visualization/circuit/_utils.py +19 -19
- qiskit/visualization/circuit/circuit_visualization.py +11 -4
- qiskit/visualization/circuit/matplotlib.py +13 -23
- qiskit/visualization/circuit/text.py +7 -3
- qiskit/visualization/counts_visualization.py +4 -0
- qiskit/visualization/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/library.py +4 -1
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +19 -2
- qiskit/visualization/timeline/core.py +19 -13
- qiskit/visualization/timeline/interface.py +19 -18
- qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +1 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
- qiskit/assembler/__init__.py +0 -42
- qiskit/assembler/assemble_circuits.py +0 -451
- qiskit/assembler/assemble_schedules.py +0 -367
- qiskit/assembler/disassemble.py +0 -310
- qiskit/assembler/run_config.py +0 -77
- qiskit/circuit/bit.py +0 -106
- qiskit/circuit/classicalfunction/__init__.py +0 -152
- qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
- qiskit/circuit/classicalfunction/classical_element.py +0 -54
- qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
- qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
- qiskit/circuit/classicalfunction/exceptions.py +0 -41
- qiskit/circuit/classicalfunction/types.py +0 -18
- qiskit/circuit/classicalfunction/utils.py +0 -91
- qiskit/circuit/classicalregister.py +0 -57
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
- qiskit/circuit/quantumregister.py +0 -75
- qiskit/circuit/register.py +0 -246
- qiskit/compiler/assembler.py +0 -689
- qiskit/compiler/scheduler.py +0 -109
- qiskit/compiler/sequencer.py +0 -71
- qiskit/primitives/backend_estimator.py +0 -486
- qiskit/primitives/backend_sampler.py +0 -222
- qiskit/primitives/estimator.py +0 -172
- qiskit/primitives/sampler.py +0 -162
- qiskit/providers/backend_compat.py +0 -507
- qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
- qiskit/providers/fake_provider/fake_1q.py +0 -91
- qiskit/providers/fake_provider/fake_backend.py +0 -165
- qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
- qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
- qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
- qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
- qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
- qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
- qiskit/providers/models/__init__.py +0 -89
- qiskit/providers/models/backendconfiguration.py +0 -1040
- qiskit/providers/models/backendproperties.py +0 -535
- qiskit/providers/models/backendstatus.py +0 -104
- qiskit/providers/models/jobstatus.py +0 -77
- qiskit/providers/models/pulsedefaults.py +0 -305
- qiskit/providers/provider.py +0 -95
- qiskit/pulse/__init__.py +0 -158
- qiskit/pulse/builder.py +0 -2262
- qiskit/pulse/calibration_entries.py +0 -381
- qiskit/pulse/channels.py +0 -227
- qiskit/pulse/configuration.py +0 -245
- qiskit/pulse/exceptions.py +0 -45
- qiskit/pulse/filters.py +0 -309
- qiskit/pulse/instruction_schedule_map.py +0 -424
- qiskit/pulse/instructions/__init__.py +0 -67
- qiskit/pulse/instructions/acquire.py +0 -150
- qiskit/pulse/instructions/delay.py +0 -71
- qiskit/pulse/instructions/directives.py +0 -154
- qiskit/pulse/instructions/frequency.py +0 -135
- qiskit/pulse/instructions/instruction.py +0 -270
- qiskit/pulse/instructions/phase.py +0 -152
- qiskit/pulse/instructions/play.py +0 -99
- qiskit/pulse/instructions/reference.py +0 -100
- qiskit/pulse/instructions/snapshot.py +0 -82
- qiskit/pulse/library/__init__.py +0 -97
- qiskit/pulse/library/continuous.py +0 -430
- qiskit/pulse/library/pulse.py +0 -148
- qiskit/pulse/library/samplers/__init__.py +0 -15
- qiskit/pulse/library/samplers/decorators.py +0 -295
- qiskit/pulse/library/samplers/strategies.py +0 -71
- qiskit/pulse/library/symbolic_pulses.py +0 -1989
- qiskit/pulse/library/waveform.py +0 -136
- qiskit/pulse/macros.py +0 -262
- qiskit/pulse/parameter_manager.py +0 -445
- qiskit/pulse/parser.py +0 -314
- qiskit/pulse/reference_manager.py +0 -58
- qiskit/pulse/schedule.py +0 -1854
- qiskit/pulse/transforms/__init__.py +0 -106
- qiskit/pulse/transforms/alignments.py +0 -406
- qiskit/pulse/transforms/base_transforms.py +0 -71
- qiskit/pulse/transforms/canonicalization.py +0 -498
- qiskit/pulse/transforms/dag.py +0 -122
- qiskit/pulse/utils.py +0 -149
- qiskit/qobj/__init__.py +0 -75
- qiskit/qobj/common.py +0 -81
- qiskit/qobj/converters/__init__.py +0 -18
- qiskit/qobj/converters/lo_config.py +0 -177
- qiskit/qobj/converters/pulse_instruction.py +0 -897
- qiskit/qobj/pulse_qobj.py +0 -709
- qiskit/qobj/qasm_qobj.py +0 -708
- qiskit/qobj/utils.py +0 -46
- qiskit/result/mitigation/base_readout_mitigator.py +0 -79
- qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
- qiskit/result/mitigation/local_readout_mitigator.py +0 -328
- qiskit/result/mitigation/utils.py +0 -217
- qiskit/scheduler/__init__.py +0 -40
- qiskit/scheduler/config.py +0 -37
- qiskit/scheduler/lowering.py +0 -187
- qiskit/scheduler/methods/__init__.py +0 -15
- qiskit/scheduler/methods/basic.py +0 -140
- qiskit/scheduler/schedule_circuit.py +0 -69
- qiskit/scheduler/sequence.py +0 -104
- qiskit/transpiler/passes/calibration/__init__.py +0 -17
- qiskit/transpiler/passes/calibration/base_builder.py +0 -79
- qiskit/transpiler/passes/calibration/builders.py +0 -20
- qiskit/transpiler/passes/calibration/exceptions.py +0 -22
- qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
- qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
- qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
- qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
- qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
- qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
- qiskit/transpiler/passes/scheduling/alap.py +0 -153
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
- qiskit/transpiler/passes/scheduling/asap.py +0 -175
- qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
- qiskit/utils/deprecate_pulse.py +0 -119
- qiskit/utils/multiprocessing.py +0 -56
- qiskit/visualization/pulse_v2/__init__.py +0 -21
- qiskit/visualization/pulse_v2/core.py +0 -901
- qiskit/visualization/pulse_v2/device_info.py +0 -173
- qiskit/visualization/pulse_v2/drawings.py +0 -253
- qiskit/visualization/pulse_v2/events.py +0 -254
- qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
- qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
- qiskit/visualization/pulse_v2/generators/chart.py +0 -208
- qiskit/visualization/pulse_v2/generators/frame.py +0 -436
- qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
- qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
- qiskit/visualization/pulse_v2/interface.py +0 -459
- qiskit/visualization/pulse_v2/layouts.py +0 -387
- qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
- qiskit/visualization/pulse_v2/stylesheet.py +0 -312
- qiskit/visualization/pulse_v2/types.py +0 -242
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -1,106 +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
|
-
r"""
|
13
|
-
=================================================
|
14
|
-
Pulse Transforms (:mod:`qiskit.pulse.transforms`)
|
15
|
-
=================================================
|
16
|
-
|
17
|
-
The pulse transforms provide transformation routines to reallocate and optimize
|
18
|
-
pulse programs for backends.
|
19
|
-
|
20
|
-
.. _pulse_alignments:
|
21
|
-
|
22
|
-
Alignments
|
23
|
-
==========
|
24
|
-
|
25
|
-
The alignment transforms define alignment policies of instructions in :obj:`.ScheduleBlock`.
|
26
|
-
These transformations are called to create :obj:`.Schedule`\ s from :obj:`.ScheduleBlock`\ s.
|
27
|
-
|
28
|
-
.. autosummary::
|
29
|
-
:toctree: ../stubs/
|
30
|
-
|
31
|
-
AlignEquispaced
|
32
|
-
AlignFunc
|
33
|
-
AlignLeft
|
34
|
-
AlignRight
|
35
|
-
AlignSequential
|
36
|
-
|
37
|
-
These are all subtypes of the abstract base class :class:`AlignmentKind`.
|
38
|
-
|
39
|
-
.. autoclass:: AlignmentKind
|
40
|
-
|
41
|
-
|
42
|
-
.. _pulse_canonical_transform:
|
43
|
-
|
44
|
-
Canonicalization
|
45
|
-
================
|
46
|
-
|
47
|
-
The canonicalization transforms convert schedules to a form amenable for execution on
|
48
|
-
OpenPulse backends.
|
49
|
-
|
50
|
-
.. autofunction:: add_implicit_acquires
|
51
|
-
.. autofunction:: align_measures
|
52
|
-
.. autofunction:: block_to_schedule
|
53
|
-
.. autofunction:: compress_pulses
|
54
|
-
.. autofunction:: flatten
|
55
|
-
.. autofunction:: inline_subroutines
|
56
|
-
.. autofunction:: pad
|
57
|
-
.. autofunction:: remove_directives
|
58
|
-
.. autofunction:: remove_trivial_barriers
|
59
|
-
|
60
|
-
|
61
|
-
.. _pulse_dag:
|
62
|
-
|
63
|
-
DAG
|
64
|
-
===
|
65
|
-
|
66
|
-
The DAG transforms create DAG representation of input program. This can be used for
|
67
|
-
optimization of instructions and equality checks.
|
68
|
-
|
69
|
-
.. autofunction:: block_to_dag
|
70
|
-
|
71
|
-
|
72
|
-
.. _pulse_transform_chain:
|
73
|
-
|
74
|
-
Composite transform
|
75
|
-
===================
|
76
|
-
|
77
|
-
A sequence of transformations to generate a target code.
|
78
|
-
|
79
|
-
.. autofunction:: target_qobj_transform
|
80
|
-
|
81
|
-
"""
|
82
|
-
|
83
|
-
from .alignments import (
|
84
|
-
AlignEquispaced,
|
85
|
-
AlignFunc,
|
86
|
-
AlignLeft,
|
87
|
-
AlignRight,
|
88
|
-
AlignSequential,
|
89
|
-
AlignmentKind,
|
90
|
-
)
|
91
|
-
|
92
|
-
from .base_transforms import target_qobj_transform
|
93
|
-
|
94
|
-
from .canonicalization import (
|
95
|
-
add_implicit_acquires,
|
96
|
-
align_measures,
|
97
|
-
block_to_schedule,
|
98
|
-
compress_pulses,
|
99
|
-
flatten,
|
100
|
-
inline_subroutines,
|
101
|
-
pad,
|
102
|
-
remove_directives,
|
103
|
-
remove_trivial_barriers,
|
104
|
-
)
|
105
|
-
|
106
|
-
from .dag import block_to_dag
|
@@ -1,406 +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
|
-
"""A collection of passes to reallocate the timeslots of instructions according to context."""
|
13
|
-
from __future__ import annotations
|
14
|
-
import abc
|
15
|
-
from typing import Callable, Tuple
|
16
|
-
|
17
|
-
import numpy as np
|
18
|
-
|
19
|
-
from qiskit.circuit.parameterexpression import ParameterExpression, ParameterValueType
|
20
|
-
from qiskit.pulse.exceptions import PulseError
|
21
|
-
from qiskit.pulse.schedule import Schedule, ScheduleComponent
|
22
|
-
from qiskit.pulse.utils import instruction_duration_validation
|
23
|
-
|
24
|
-
|
25
|
-
class AlignmentKind(abc.ABC):
|
26
|
-
"""An abstract class for schedule alignment."""
|
27
|
-
|
28
|
-
def __init__(self, context_params: Tuple[ParameterValueType, ...]):
|
29
|
-
"""Create new context."""
|
30
|
-
self._context_params = tuple(context_params)
|
31
|
-
|
32
|
-
@abc.abstractmethod
|
33
|
-
def align(self, schedule: Schedule) -> Schedule:
|
34
|
-
"""Reallocate instructions according to the policy.
|
35
|
-
|
36
|
-
Only top-level sub-schedules are aligned. If sub-schedules are nested,
|
37
|
-
nested schedules are not recursively aligned.
|
38
|
-
|
39
|
-
Args:
|
40
|
-
schedule: Schedule to align.
|
41
|
-
|
42
|
-
Returns:
|
43
|
-
Schedule with reallocated instructions.
|
44
|
-
"""
|
45
|
-
pass
|
46
|
-
|
47
|
-
@property
|
48
|
-
@abc.abstractmethod
|
49
|
-
def is_sequential(self) -> bool:
|
50
|
-
"""Return ``True`` if this is sequential alignment context.
|
51
|
-
|
52
|
-
This information is used to evaluate DAG equivalency of two :class:`.ScheduleBlock`s.
|
53
|
-
When the context has two pulses in different channels,
|
54
|
-
a sequential context subtype intends to return following scheduling outcome.
|
55
|
-
|
56
|
-
.. code-block:: text
|
57
|
-
|
58
|
-
┌────────┐
|
59
|
-
D0: ┤ pulse1 ├────────────
|
60
|
-
└────────┘ ┌────────┐
|
61
|
-
D1: ────────────┤ pulse2 ├
|
62
|
-
└────────┘
|
63
|
-
|
64
|
-
On the other hand, parallel context with ``is_sequential=False`` returns
|
65
|
-
|
66
|
-
.. code-block:: text
|
67
|
-
|
68
|
-
┌────────┐
|
69
|
-
D0: ┤ pulse1 ├
|
70
|
-
├────────┤
|
71
|
-
D1: ┤ pulse2 ├
|
72
|
-
└────────┘
|
73
|
-
|
74
|
-
All subclasses must implement this method according to scheduling strategy.
|
75
|
-
"""
|
76
|
-
pass
|
77
|
-
|
78
|
-
def __eq__(self, other: object) -> bool:
|
79
|
-
"""Check equality of two transforms."""
|
80
|
-
if type(self) is not type(other):
|
81
|
-
return False
|
82
|
-
if self._context_params != other._context_params:
|
83
|
-
return False
|
84
|
-
return True
|
85
|
-
|
86
|
-
def __repr__(self):
|
87
|
-
return f"{self.__class__.__name__}({', '.join(self._context_params)})"
|
88
|
-
|
89
|
-
|
90
|
-
class AlignLeft(AlignmentKind):
|
91
|
-
"""Align instructions in as-soon-as-possible manner.
|
92
|
-
|
93
|
-
Instructions are placed at earliest available timeslots.
|
94
|
-
"""
|
95
|
-
|
96
|
-
def __init__(self):
|
97
|
-
"""Create new left-justified context."""
|
98
|
-
super().__init__(context_params=())
|
99
|
-
|
100
|
-
@property
|
101
|
-
def is_sequential(self) -> bool:
|
102
|
-
return False
|
103
|
-
|
104
|
-
def align(self, schedule: Schedule) -> Schedule:
|
105
|
-
"""Reallocate instructions according to the policy.
|
106
|
-
|
107
|
-
Only top-level sub-schedules are aligned. If sub-schedules are nested,
|
108
|
-
nested schedules are not recursively aligned.
|
109
|
-
|
110
|
-
Args:
|
111
|
-
schedule: Schedule to align.
|
112
|
-
|
113
|
-
Returns:
|
114
|
-
Schedule with reallocated instructions.
|
115
|
-
"""
|
116
|
-
aligned = Schedule.initialize_from(schedule)
|
117
|
-
for _, child in schedule.children:
|
118
|
-
self._push_left_append(aligned, child)
|
119
|
-
|
120
|
-
return aligned
|
121
|
-
|
122
|
-
@staticmethod
|
123
|
-
def _push_left_append(this: Schedule, other: ScheduleComponent) -> Schedule:
|
124
|
-
"""Return ``this`` with ``other`` inserted at the maximum time over
|
125
|
-
all channels shared between ```this`` and ``other``.
|
126
|
-
|
127
|
-
Args:
|
128
|
-
this: Input schedule to which ``other`` will be inserted.
|
129
|
-
other: Other schedule to insert.
|
130
|
-
|
131
|
-
Returns:
|
132
|
-
Push left appended schedule.
|
133
|
-
"""
|
134
|
-
this_channels = set(this.channels)
|
135
|
-
other_channels = set(other.channels)
|
136
|
-
shared_channels = list(this_channels & other_channels)
|
137
|
-
ch_slacks = [
|
138
|
-
this.stop_time - this.ch_stop_time(channel) + other.ch_start_time(channel)
|
139
|
-
for channel in shared_channels
|
140
|
-
]
|
141
|
-
|
142
|
-
if ch_slacks:
|
143
|
-
slack_chan = shared_channels[np.argmin(ch_slacks)]
|
144
|
-
shared_insert_time = this.ch_stop_time(slack_chan) - other.ch_start_time(slack_chan)
|
145
|
-
else:
|
146
|
-
shared_insert_time = 0
|
147
|
-
|
148
|
-
# Handle case where channels not common to both might actually start
|
149
|
-
# after ``this`` has finished.
|
150
|
-
other_only_insert_time = other.ch_start_time(*(other_channels - this_channels))
|
151
|
-
# Choose whichever is greatest.
|
152
|
-
insert_time = max(shared_insert_time, other_only_insert_time)
|
153
|
-
|
154
|
-
return this.insert(insert_time, other, inplace=True)
|
155
|
-
|
156
|
-
|
157
|
-
class AlignRight(AlignmentKind):
|
158
|
-
"""Align instructions in as-late-as-possible manner.
|
159
|
-
|
160
|
-
Instructions are placed at latest available timeslots.
|
161
|
-
"""
|
162
|
-
|
163
|
-
def __init__(self):
|
164
|
-
"""Create new right-justified context."""
|
165
|
-
super().__init__(context_params=())
|
166
|
-
|
167
|
-
@property
|
168
|
-
def is_sequential(self) -> bool:
|
169
|
-
return False
|
170
|
-
|
171
|
-
def align(self, schedule: Schedule) -> Schedule:
|
172
|
-
"""Reallocate instructions according to the policy.
|
173
|
-
|
174
|
-
Only top-level sub-schedules are aligned. If sub-schedules are nested,
|
175
|
-
nested schedules are not recursively aligned.
|
176
|
-
|
177
|
-
Args:
|
178
|
-
schedule: Schedule to align.
|
179
|
-
|
180
|
-
Returns:
|
181
|
-
Schedule with reallocated instructions.
|
182
|
-
"""
|
183
|
-
aligned = Schedule.initialize_from(schedule)
|
184
|
-
for _, child in reversed(schedule.children):
|
185
|
-
aligned = self._push_right_prepend(aligned, child)
|
186
|
-
|
187
|
-
return aligned
|
188
|
-
|
189
|
-
@staticmethod
|
190
|
-
def _push_right_prepend(this: Schedule, other: ScheduleComponent) -> Schedule:
|
191
|
-
"""Return ``this`` with ``other`` inserted at the latest possible time
|
192
|
-
such that ``other`` ends before it overlaps with any of ``this``.
|
193
|
-
|
194
|
-
If required ``this`` is shifted to start late enough so that there is room
|
195
|
-
to insert ``other``.
|
196
|
-
|
197
|
-
Args:
|
198
|
-
this: Input schedule to which ``other`` will be inserted.
|
199
|
-
other: Other schedule to insert.
|
200
|
-
|
201
|
-
Returns:
|
202
|
-
Push right prepended schedule.
|
203
|
-
"""
|
204
|
-
this_channels = set(this.channels)
|
205
|
-
other_channels = set(other.channels)
|
206
|
-
shared_channels = list(this_channels & other_channels)
|
207
|
-
ch_slacks = [
|
208
|
-
this.ch_start_time(channel) - other.ch_stop_time(channel) for channel in shared_channels
|
209
|
-
]
|
210
|
-
|
211
|
-
if ch_slacks:
|
212
|
-
insert_time = min(ch_slacks) + other.start_time
|
213
|
-
else:
|
214
|
-
insert_time = this.stop_time - other.stop_time + other.start_time
|
215
|
-
|
216
|
-
if insert_time < 0:
|
217
|
-
this.shift(-insert_time, inplace=True)
|
218
|
-
this.insert(0, other, inplace=True)
|
219
|
-
else:
|
220
|
-
this.insert(insert_time, other, inplace=True)
|
221
|
-
|
222
|
-
return this
|
223
|
-
|
224
|
-
|
225
|
-
class AlignSequential(AlignmentKind):
|
226
|
-
"""Align instructions sequentially.
|
227
|
-
|
228
|
-
Instructions played on different channels are also arranged in a sequence.
|
229
|
-
No buffer time is inserted in between instructions.
|
230
|
-
"""
|
231
|
-
|
232
|
-
def __init__(self):
|
233
|
-
"""Create new sequential context."""
|
234
|
-
super().__init__(context_params=())
|
235
|
-
|
236
|
-
@property
|
237
|
-
def is_sequential(self) -> bool:
|
238
|
-
return True
|
239
|
-
|
240
|
-
def align(self, schedule: Schedule) -> Schedule:
|
241
|
-
"""Reallocate instructions according to the policy.
|
242
|
-
|
243
|
-
Only top-level sub-schedules are aligned. If sub-schedules are nested,
|
244
|
-
nested schedules are not recursively aligned.
|
245
|
-
|
246
|
-
Args:
|
247
|
-
schedule: Schedule to align.
|
248
|
-
|
249
|
-
Returns:
|
250
|
-
Schedule with reallocated instructions.
|
251
|
-
"""
|
252
|
-
aligned = Schedule.initialize_from(schedule)
|
253
|
-
for _, child in schedule.children:
|
254
|
-
aligned.insert(aligned.duration, child, inplace=True)
|
255
|
-
|
256
|
-
return aligned
|
257
|
-
|
258
|
-
|
259
|
-
class AlignEquispaced(AlignmentKind):
|
260
|
-
"""Align instructions with equispaced interval within a specified duration.
|
261
|
-
|
262
|
-
Instructions played on different channels are also arranged in a sequence.
|
263
|
-
This alignment is convenient to create dynamical decoupling sequences such as PDD.
|
264
|
-
"""
|
265
|
-
|
266
|
-
def __init__(self, duration: int | ParameterExpression):
|
267
|
-
"""Create new equispaced context.
|
268
|
-
|
269
|
-
Args:
|
270
|
-
duration: Duration of this context. This should be larger than the schedule duration.
|
271
|
-
If the specified duration is shorter than the schedule duration,
|
272
|
-
no alignment is performed and the input schedule is just returned.
|
273
|
-
This duration can be parametrized.
|
274
|
-
"""
|
275
|
-
super().__init__(context_params=(duration,))
|
276
|
-
|
277
|
-
@property
|
278
|
-
def is_sequential(self) -> bool:
|
279
|
-
return True
|
280
|
-
|
281
|
-
@property
|
282
|
-
def duration(self):
|
283
|
-
"""Return context duration."""
|
284
|
-
return self._context_params[0]
|
285
|
-
|
286
|
-
def align(self, schedule: Schedule) -> Schedule:
|
287
|
-
"""Reallocate instructions according to the policy.
|
288
|
-
|
289
|
-
Only top-level sub-schedules are aligned. If sub-schedules are nested,
|
290
|
-
nested schedules are not recursively aligned.
|
291
|
-
|
292
|
-
Args:
|
293
|
-
schedule: Schedule to align.
|
294
|
-
|
295
|
-
Returns:
|
296
|
-
Schedule with reallocated instructions.
|
297
|
-
"""
|
298
|
-
instruction_duration_validation(self.duration)
|
299
|
-
|
300
|
-
total_duration = sum(child.duration for _, child in schedule.children)
|
301
|
-
if self.duration < total_duration:
|
302
|
-
return schedule
|
303
|
-
|
304
|
-
total_delay = self.duration - total_duration
|
305
|
-
|
306
|
-
if len(schedule.children) > 1:
|
307
|
-
# Calculate the interval in between sub-schedules.
|
308
|
-
# If the duration cannot be divided by the number of sub-schedules,
|
309
|
-
# the modulo is appended and prepended to the input schedule.
|
310
|
-
interval, mod = np.divmod(total_delay, len(schedule.children) - 1)
|
311
|
-
else:
|
312
|
-
interval = 0
|
313
|
-
mod = total_delay
|
314
|
-
|
315
|
-
# Calculate pre schedule delay
|
316
|
-
delay, mod = np.divmod(mod, 2)
|
317
|
-
|
318
|
-
aligned = Schedule.initialize_from(schedule)
|
319
|
-
# Insert sub-schedules with interval
|
320
|
-
_t0 = int(aligned.stop_time + delay + mod)
|
321
|
-
for _, child in schedule.children:
|
322
|
-
aligned.insert(_t0, child, inplace=True)
|
323
|
-
_t0 = int(aligned.stop_time + interval)
|
324
|
-
|
325
|
-
return aligned
|
326
|
-
|
327
|
-
|
328
|
-
class AlignFunc(AlignmentKind):
|
329
|
-
"""Allocate instructions at position specified by callback function.
|
330
|
-
|
331
|
-
The position is specified for each instruction of index ``j`` as a
|
332
|
-
fractional coordinate in [0, 1] within the specified duration.
|
333
|
-
|
334
|
-
Instructions played on different channels are also arranged in a sequence.
|
335
|
-
This alignment is convenient to create dynamical decoupling sequences such as UDD.
|
336
|
-
|
337
|
-
For example, UDD sequence with 10 pulses can be specified with following function.
|
338
|
-
|
339
|
-
.. code-block:: python
|
340
|
-
|
341
|
-
import numpy as np
|
342
|
-
|
343
|
-
def udd10_pos(j):
|
344
|
-
return np.sin(np.pi*j/(2*10 + 2))**2
|
345
|
-
|
346
|
-
.. note::
|
347
|
-
|
348
|
-
This context cannot be QPY serialized because of the callable. If you use this context,
|
349
|
-
your program cannot be saved in QPY format.
|
350
|
-
|
351
|
-
"""
|
352
|
-
|
353
|
-
def __init__(self, duration: int | ParameterExpression, func: Callable):
|
354
|
-
"""Create new equispaced context.
|
355
|
-
|
356
|
-
Args:
|
357
|
-
duration: Duration of this context. This should be larger than the schedule duration.
|
358
|
-
If the specified duration is shorter than the schedule duration,
|
359
|
-
no alignment is performed and the input schedule is just returned.
|
360
|
-
This duration can be parametrized.
|
361
|
-
func: A function that takes an index of sub-schedule and returns the
|
362
|
-
fractional coordinate of of that sub-schedule. The returned value should be
|
363
|
-
defined within [0, 1]. The pulse index starts from 1.
|
364
|
-
"""
|
365
|
-
super().__init__(context_params=(duration, func))
|
366
|
-
|
367
|
-
@property
|
368
|
-
def is_sequential(self) -> bool:
|
369
|
-
return True
|
370
|
-
|
371
|
-
@property
|
372
|
-
def duration(self):
|
373
|
-
"""Return context duration."""
|
374
|
-
return self._context_params[0]
|
375
|
-
|
376
|
-
@property
|
377
|
-
def func(self):
|
378
|
-
"""Return context alignment function."""
|
379
|
-
return self._context_params[1]
|
380
|
-
|
381
|
-
def align(self, schedule: Schedule) -> Schedule:
|
382
|
-
"""Reallocate instructions according to the policy.
|
383
|
-
|
384
|
-
Only top-level sub-schedules are aligned. If sub-schedules are nested,
|
385
|
-
nested schedules are not recursively aligned.
|
386
|
-
|
387
|
-
Args:
|
388
|
-
schedule: Schedule to align.
|
389
|
-
|
390
|
-
Returns:
|
391
|
-
Schedule with reallocated instructions.
|
392
|
-
"""
|
393
|
-
instruction_duration_validation(self.duration)
|
394
|
-
|
395
|
-
if self.duration < schedule.duration:
|
396
|
-
return schedule
|
397
|
-
|
398
|
-
aligned = Schedule.initialize_from(schedule)
|
399
|
-
for ind, (_, child) in enumerate(schedule.children):
|
400
|
-
_t_center = self.duration * self.func(ind + 1)
|
401
|
-
_t0 = int(_t_center - 0.5 * child.duration)
|
402
|
-
if _t0 < 0 or _t0 > self.duration:
|
403
|
-
raise PulseError(f"Invalid schedule position t={_t0} is specified at index={ind}")
|
404
|
-
aligned.insert(_t0, child, inplace=True)
|
405
|
-
|
406
|
-
return aligned
|
@@ -1,71 +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
|
-
"""A collection of set of transforms."""
|
13
|
-
|
14
|
-
# TODO: replace this with proper pulse transformation passes. Qiskit-terra/#6121
|
15
|
-
|
16
|
-
from typing import Union, Iterable, Tuple
|
17
|
-
|
18
|
-
from qiskit.pulse.instructions import Instruction
|
19
|
-
from qiskit.pulse.schedule import ScheduleBlock, Schedule
|
20
|
-
from qiskit.pulse.transforms import canonicalization
|
21
|
-
|
22
|
-
InstructionSched = Union[Tuple[int, Instruction], Instruction]
|
23
|
-
|
24
|
-
|
25
|
-
def target_qobj_transform(
|
26
|
-
sched: Union[ScheduleBlock, Schedule, InstructionSched, Iterable[InstructionSched]],
|
27
|
-
remove_directives: bool = True,
|
28
|
-
) -> Schedule:
|
29
|
-
"""A basic pulse program transformation for OpenPulse API execution.
|
30
|
-
|
31
|
-
Args:
|
32
|
-
sched: Input program to transform.
|
33
|
-
remove_directives: Set `True` to remove compiler directives.
|
34
|
-
|
35
|
-
Returns:
|
36
|
-
Transformed program for execution.
|
37
|
-
"""
|
38
|
-
if not isinstance(sched, Schedule):
|
39
|
-
# convert into schedule representation
|
40
|
-
if isinstance(sched, ScheduleBlock):
|
41
|
-
sched = canonicalization.block_to_schedule(sched)
|
42
|
-
else:
|
43
|
-
sched = Schedule(*_format_schedule_component(sched))
|
44
|
-
|
45
|
-
# remove subroutines, i.e. Call instructions
|
46
|
-
sched = canonicalization.inline_subroutines(sched)
|
47
|
-
|
48
|
-
# inline nested schedules
|
49
|
-
sched = canonicalization.flatten(sched)
|
50
|
-
|
51
|
-
# remove directives, e.g. barriers
|
52
|
-
if remove_directives:
|
53
|
-
sched = canonicalization.remove_directives(sched)
|
54
|
-
|
55
|
-
return sched
|
56
|
-
|
57
|
-
|
58
|
-
def _format_schedule_component(sched: Union[InstructionSched, Iterable[InstructionSched]]):
|
59
|
-
"""A helper function to convert instructions into list of instructions."""
|
60
|
-
# TODO remove schedule initialization with *args, Qiskit-terra/#5093
|
61
|
-
|
62
|
-
try:
|
63
|
-
sched = list(sched)
|
64
|
-
# (t0, inst), or list of it
|
65
|
-
if isinstance(sched[0], int):
|
66
|
-
# (t0, inst) tuple
|
67
|
-
return [tuple(sched)]
|
68
|
-
else:
|
69
|
-
return sched
|
70
|
-
except TypeError:
|
71
|
-
return [sched]
|