qiskit 1.4.1__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0rc1__cp39-abi3-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +2 -5
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +24 -5
- qiskit/circuit/{add_control.py → _add_control.py} +32 -12
- qiskit/circuit/_classical_resource_map.py +5 -3
- qiskit/circuit/barrier.py +3 -7
- qiskit/circuit/classical/expr/__init__.py +31 -3
- qiskit/circuit/classical/expr/constructors.py +248 -28
- qiskit/circuit/classical/expr/expr.py +104 -3
- qiskit/circuit/classical/expr/visitors.py +75 -0
- qiskit/circuit/classical/types/__init__.py +12 -8
- qiskit/circuit/classical/types/ordering.py +14 -7
- qiskit/circuit/classical/types/types.py +36 -0
- qiskit/circuit/commutation_checker.py +34 -7
- qiskit/circuit/controlflow/__init__.py +32 -1
- qiskit/circuit/controlflow/_builder_utils.py +9 -5
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +1 -1
- qiskit/circuit/controlflow/builder.py +139 -39
- qiskit/circuit/controlflow/continue_loop.py +1 -3
- qiskit/circuit/controlflow/control_flow.py +10 -0
- qiskit/circuit/controlflow/for_loop.py +2 -1
- qiskit/circuit/controlflow/if_else.py +3 -16
- qiskit/circuit/controlflow/switch_case.py +2 -8
- qiskit/circuit/controlflow/while_loop.py +2 -7
- qiskit/circuit/controlledgate.py +2 -4
- qiskit/circuit/delay.py +40 -11
- qiskit/circuit/duration.py +0 -15
- qiskit/circuit/gate.py +2 -4
- qiskit/circuit/instruction.py +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 +2 -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
@@ -1,367 +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
|
-
"""Assemble function for converting a list of circuits into a qobj."""
|
15
|
-
import hashlib
|
16
|
-
from collections import defaultdict
|
17
|
-
from typing import Any, Dict, List, Tuple, Union
|
18
|
-
|
19
|
-
from qiskit import qobj, pulse
|
20
|
-
from qiskit.assembler.run_config import RunConfig
|
21
|
-
from qiskit.exceptions import QiskitError
|
22
|
-
from qiskit.pulse import instructions, transforms, library, schedule, channels
|
23
|
-
from qiskit.qobj import utils as qobj_utils, converters
|
24
|
-
from qiskit.qobj.converters.pulse_instruction import ParametricPulseShapes
|
25
|
-
from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
|
26
|
-
|
27
|
-
|
28
|
-
@deprecate_pulse_dependency
|
29
|
-
def assemble_schedules(
|
30
|
-
schedules: List[
|
31
|
-
Union[
|
32
|
-
schedule.ScheduleBlock,
|
33
|
-
schedule.ScheduleComponent,
|
34
|
-
Tuple[int, schedule.ScheduleComponent],
|
35
|
-
]
|
36
|
-
],
|
37
|
-
qobj_id: int,
|
38
|
-
qobj_header: qobj.QobjHeader,
|
39
|
-
run_config: RunConfig,
|
40
|
-
) -> qobj.PulseQobj:
|
41
|
-
"""Assembles a list of schedules into a qobj that can be run on the backend.
|
42
|
-
|
43
|
-
Args:
|
44
|
-
schedules: Schedules to assemble.
|
45
|
-
qobj_id: Identifier for the generated qobj.
|
46
|
-
qobj_header: Header to pass to the results.
|
47
|
-
run_config: Configuration of the runtime environment.
|
48
|
-
|
49
|
-
Returns:
|
50
|
-
The Qobj to be run on the backends.
|
51
|
-
|
52
|
-
Raises:
|
53
|
-
QiskitError: when frequency settings are not supplied.
|
54
|
-
|
55
|
-
Examples:
|
56
|
-
|
57
|
-
.. code-block:: python
|
58
|
-
|
59
|
-
from qiskit import pulse
|
60
|
-
from qiskit.assembler import assemble_schedules
|
61
|
-
from qiskit.assembler.run_config import RunConfig
|
62
|
-
# Construct a Qobj header for the output Qobj
|
63
|
-
header = {"backend_name": "FakeOpenPulse2Q", "backend_version": "0.0.0"}
|
64
|
-
# Build a configuration object for the output Qobj
|
65
|
-
config = RunConfig(shots=1024,
|
66
|
-
memory=False,
|
67
|
-
meas_level=1,
|
68
|
-
meas_return='avg',
|
69
|
-
memory_slot_size=100,
|
70
|
-
parametric_pulses=[],
|
71
|
-
init_qubits=True,
|
72
|
-
qubit_lo_freq=[4900000000.0, 5000000000.0],
|
73
|
-
meas_lo_freq=[6500000000.0, 6600000000.0],
|
74
|
-
schedule_los=[])
|
75
|
-
# Build a Pulse schedule to assemble into a Qobj
|
76
|
-
schedule = pulse.Schedule()
|
77
|
-
schedule += pulse.Play(pulse.Waveform([0.1] * 16, name="test0"),
|
78
|
-
pulse.DriveChannel(0),
|
79
|
-
name="test1")
|
80
|
-
schedule += pulse.Play(pulse.Waveform([0.1] * 16, name="test1"),
|
81
|
-
pulse.DriveChannel(0),
|
82
|
-
name="test2")
|
83
|
-
schedule += pulse.Play(pulse.Waveform([0.5] * 16, name="test0"),
|
84
|
-
pulse.DriveChannel(0),
|
85
|
-
name="test1")
|
86
|
-
# Assemble a Qobj from the schedule.
|
87
|
-
pulseQobj = assemble_schedules(schedules=[schedule],
|
88
|
-
qobj_id="custom-id",
|
89
|
-
qobj_header=header,
|
90
|
-
run_config=config)
|
91
|
-
"""
|
92
|
-
if not hasattr(run_config, "qubit_lo_freq"):
|
93
|
-
raise QiskitError("qubit_lo_freq must be supplied.")
|
94
|
-
if not hasattr(run_config, "meas_lo_freq"):
|
95
|
-
raise QiskitError("meas_lo_freq must be supplied.")
|
96
|
-
|
97
|
-
lo_converter = converters.LoConfigConverter(
|
98
|
-
qobj.PulseQobjExperimentConfig, **run_config.to_dict()
|
99
|
-
)
|
100
|
-
experiments, experiment_config = _assemble_experiments(schedules, lo_converter, run_config)
|
101
|
-
qobj_config = _assemble_config(lo_converter, experiment_config, run_config)
|
102
|
-
|
103
|
-
return qobj.PulseQobj(
|
104
|
-
experiments=experiments, qobj_id=qobj_id, header=qobj_header, config=qobj_config
|
105
|
-
)
|
106
|
-
|
107
|
-
|
108
|
-
def _assemble_experiments(
|
109
|
-
schedules: List[Union[schedule.ScheduleComponent, Tuple[int, schedule.ScheduleComponent]]],
|
110
|
-
lo_converter: converters.LoConfigConverter,
|
111
|
-
run_config: RunConfig,
|
112
|
-
) -> Tuple[List[qobj.PulseQobjExperiment], Dict[str, Any]]:
|
113
|
-
"""Assembles a list of schedules into PulseQobjExperiments, and returns related metadata that
|
114
|
-
will be assembled into the Qobj configuration.
|
115
|
-
|
116
|
-
Args:
|
117
|
-
schedules: Schedules to assemble.
|
118
|
-
lo_converter: The configured frequency converter and validator.
|
119
|
-
run_config: Configuration of the runtime environment.
|
120
|
-
|
121
|
-
Returns:
|
122
|
-
The list of assembled experiments, and the dictionary of related experiment config.
|
123
|
-
|
124
|
-
Raises:
|
125
|
-
QiskitError: when frequency settings are not compatible with the experiments.
|
126
|
-
"""
|
127
|
-
freq_configs = [lo_converter(lo_dict) for lo_dict in getattr(run_config, "schedule_los", [])]
|
128
|
-
|
129
|
-
if len(schedules) > 1 and len(freq_configs) not in [0, 1, len(schedules)]:
|
130
|
-
raise QiskitError(
|
131
|
-
"Invalid 'schedule_los' setting specified. If specified, it should be "
|
132
|
-
"either have a single entry to apply the same LOs for each schedule or "
|
133
|
-
"have length equal to the number of schedules."
|
134
|
-
)
|
135
|
-
|
136
|
-
instruction_converter = getattr(
|
137
|
-
run_config, "instruction_converter", converters.InstructionToQobjConverter
|
138
|
-
)
|
139
|
-
instruction_converter = instruction_converter(qobj.PulseQobjInstruction, **run_config.to_dict())
|
140
|
-
|
141
|
-
formatted_schedules = [transforms.target_qobj_transform(sched) for sched in schedules]
|
142
|
-
compressed_schedules = transforms.compress_pulses(formatted_schedules)
|
143
|
-
|
144
|
-
user_pulselib = {}
|
145
|
-
experiments = []
|
146
|
-
for idx, sched in enumerate(compressed_schedules):
|
147
|
-
qobj_instructions, max_memory_slot = _assemble_instructions(
|
148
|
-
sched, instruction_converter, run_config, user_pulselib
|
149
|
-
)
|
150
|
-
|
151
|
-
metadata = sched.metadata
|
152
|
-
if metadata is None:
|
153
|
-
metadata = {}
|
154
|
-
# TODO: add other experimental header items (see circuit assembler)
|
155
|
-
qobj_experiment_header = qobj.QobjExperimentHeader(
|
156
|
-
memory_slots=max_memory_slot + 1, # Memory slots are 0 indexed
|
157
|
-
name=sched.name or f"Experiment-{idx}",
|
158
|
-
metadata=metadata,
|
159
|
-
)
|
160
|
-
|
161
|
-
experiment = qobj.PulseQobjExperiment(
|
162
|
-
header=qobj_experiment_header, instructions=qobj_instructions
|
163
|
-
)
|
164
|
-
if freq_configs:
|
165
|
-
# This handles the cases where one frequency setting applies to all experiments and
|
166
|
-
# where each experiment has a different frequency
|
167
|
-
freq_idx = idx if len(freq_configs) != 1 else 0
|
168
|
-
experiment.config = freq_configs[freq_idx]
|
169
|
-
|
170
|
-
experiments.append(experiment)
|
171
|
-
|
172
|
-
# Frequency sweep
|
173
|
-
if freq_configs and len(experiments) == 1:
|
174
|
-
experiment = experiments[0]
|
175
|
-
experiments = []
|
176
|
-
for freq_config in freq_configs:
|
177
|
-
experiments.append(
|
178
|
-
qobj.PulseQobjExperiment(
|
179
|
-
header=experiment.header,
|
180
|
-
instructions=experiment.instructions,
|
181
|
-
config=freq_config,
|
182
|
-
)
|
183
|
-
)
|
184
|
-
|
185
|
-
# Top level Qobj configuration
|
186
|
-
experiment_config = {
|
187
|
-
"pulse_library": [
|
188
|
-
qobj.PulseLibraryItem(name=name, samples=samples)
|
189
|
-
for name, samples in user_pulselib.items()
|
190
|
-
],
|
191
|
-
"memory_slots": max(exp.header.memory_slots for exp in experiments),
|
192
|
-
}
|
193
|
-
|
194
|
-
return experiments, experiment_config
|
195
|
-
|
196
|
-
|
197
|
-
def _assemble_instructions(
|
198
|
-
sched: Union[pulse.Schedule, pulse.ScheduleBlock],
|
199
|
-
instruction_converter: converters.InstructionToQobjConverter,
|
200
|
-
run_config: RunConfig,
|
201
|
-
user_pulselib: Dict[str, List[complex]],
|
202
|
-
) -> Tuple[List[qobj.PulseQobjInstruction], int]:
|
203
|
-
"""Assembles the instructions in a schedule into a list of PulseQobjInstructions and returns
|
204
|
-
related metadata that will be assembled into the Qobj configuration. Lookup table for
|
205
|
-
pulses defined in all experiments are registered in ``user_pulselib``. This object should be
|
206
|
-
mutable python dictionary so that items are properly updated after each instruction assemble.
|
207
|
-
The dictionary is not returned to avoid redundancy.
|
208
|
-
|
209
|
-
Args:
|
210
|
-
sched: Schedule to assemble.
|
211
|
-
instruction_converter: A converter instance which can convert PulseInstructions to
|
212
|
-
PulseQobjInstructions.
|
213
|
-
run_config: Configuration of the runtime environment.
|
214
|
-
user_pulselib: User pulse library from previous schedule.
|
215
|
-
|
216
|
-
Returns:
|
217
|
-
A list of converted instructions, the user pulse library dictionary (from pulse name to
|
218
|
-
pulse samples), and the maximum number of readout memory slots used by this Schedule.
|
219
|
-
"""
|
220
|
-
sched = transforms.target_qobj_transform(sched)
|
221
|
-
|
222
|
-
max_memory_slot = 0
|
223
|
-
qobj_instructions = []
|
224
|
-
|
225
|
-
acquire_instruction_map = defaultdict(list)
|
226
|
-
for time, instruction in sched.instructions:
|
227
|
-
|
228
|
-
if isinstance(instruction, instructions.Play):
|
229
|
-
if isinstance(instruction.pulse, library.SymbolicPulse):
|
230
|
-
is_backend_supported = True
|
231
|
-
try:
|
232
|
-
pulse_shape = ParametricPulseShapes.from_instance(instruction.pulse).name
|
233
|
-
if pulse_shape not in run_config.parametric_pulses:
|
234
|
-
is_backend_supported = False
|
235
|
-
except ValueError:
|
236
|
-
# Custom pulse class, or bare SymbolicPulse object.
|
237
|
-
is_backend_supported = False
|
238
|
-
|
239
|
-
if not is_backend_supported:
|
240
|
-
instruction = instructions.Play(
|
241
|
-
instruction.pulse.get_waveform(), instruction.channel, name=instruction.name
|
242
|
-
)
|
243
|
-
|
244
|
-
if isinstance(instruction.pulse, library.Waveform):
|
245
|
-
name = hashlib.sha256(instruction.pulse.samples).hexdigest()
|
246
|
-
instruction = instructions.Play(
|
247
|
-
library.Waveform(name=name, samples=instruction.pulse.samples),
|
248
|
-
channel=instruction.channel,
|
249
|
-
name=name,
|
250
|
-
)
|
251
|
-
user_pulselib[name] = instruction.pulse.samples
|
252
|
-
|
253
|
-
# ignore explicit delay instrs on acq channels as they are invalid on IBMQ backends;
|
254
|
-
# timing of other instrs will still be shifted appropriately
|
255
|
-
if isinstance(instruction, instructions.Delay) and isinstance(
|
256
|
-
instruction.channel, channels.AcquireChannel
|
257
|
-
):
|
258
|
-
continue
|
259
|
-
|
260
|
-
if isinstance(instruction, instructions.Acquire):
|
261
|
-
if instruction.mem_slot:
|
262
|
-
max_memory_slot = max(max_memory_slot, instruction.mem_slot.index)
|
263
|
-
# Acquires have a single AcquireChannel per inst, but we have to bundle them
|
264
|
-
# together into the Qobj as one instruction with many channels
|
265
|
-
acquire_instruction_map[(time, instruction.duration)].append(instruction)
|
266
|
-
continue
|
267
|
-
|
268
|
-
qobj_instructions.append(instruction_converter(time, instruction))
|
269
|
-
|
270
|
-
if acquire_instruction_map:
|
271
|
-
if hasattr(run_config, "meas_map"):
|
272
|
-
_validate_meas_map(acquire_instruction_map, run_config.meas_map)
|
273
|
-
for (time, _), instruction_bundle in acquire_instruction_map.items():
|
274
|
-
qobj_instructions.append(
|
275
|
-
instruction_converter(time, instruction_bundle),
|
276
|
-
)
|
277
|
-
|
278
|
-
return qobj_instructions, max_memory_slot
|
279
|
-
|
280
|
-
|
281
|
-
def _validate_meas_map(
|
282
|
-
instruction_map: Dict[Tuple[int, instructions.Acquire], List[instructions.Acquire]],
|
283
|
-
meas_map: List[List[int]],
|
284
|
-
) -> None:
|
285
|
-
"""Validate all qubits tied in ``meas_map`` are to be acquired.
|
286
|
-
|
287
|
-
Args:
|
288
|
-
instruction_map: A dictionary grouping Acquire instructions according to their start time
|
289
|
-
and duration.
|
290
|
-
meas_map: List of groups of qubits that must be acquired together.
|
291
|
-
|
292
|
-
Raises:
|
293
|
-
QiskitError: If the instructions do not satisfy the measurement map.
|
294
|
-
"""
|
295
|
-
sorted_inst_map = sorted(instruction_map.items(), key=lambda item: item[0])
|
296
|
-
meas_map_sets = [set(m) for m in meas_map]
|
297
|
-
|
298
|
-
# error if there is time overlap between qubits in the same meas_map
|
299
|
-
for idx, inst in enumerate(sorted_inst_map[:-1]):
|
300
|
-
inst_end_time = inst[0][0] + inst[0][1]
|
301
|
-
next_inst = sorted_inst_map[idx + 1]
|
302
|
-
next_inst_time = next_inst[0][0]
|
303
|
-
if next_inst_time < inst_end_time:
|
304
|
-
inst_qubits = {inst.channel.index for inst in inst[1]}
|
305
|
-
next_inst_qubits = {inst.channel.index for inst in next_inst[1]}
|
306
|
-
for meas_set in meas_map_sets:
|
307
|
-
common_instr_qubits = inst_qubits.intersection(meas_set)
|
308
|
-
common_next = next_inst_qubits.intersection(meas_set)
|
309
|
-
if common_instr_qubits and common_next:
|
310
|
-
raise QiskitError(
|
311
|
-
f"Qubits {common_instr_qubits} and {common_next} are in the same measurement "
|
312
|
-
f"grouping: {meas_map}. "
|
313
|
-
"They must either be acquired at the same time, or disjointly"
|
314
|
-
f". Instead, they were acquired at times: {inst[0][0]}-{inst_end_time} and "
|
315
|
-
f"{next_inst_time}-{next_inst_time + next_inst[0][1]}"
|
316
|
-
)
|
317
|
-
|
318
|
-
|
319
|
-
def _assemble_config(
|
320
|
-
lo_converter: converters.LoConfigConverter,
|
321
|
-
experiment_config: Dict[str, Any],
|
322
|
-
run_config: RunConfig,
|
323
|
-
) -> qobj.PulseQobjConfig:
|
324
|
-
"""Assembles the QobjConfiguration from experimental config and runtime config.
|
325
|
-
|
326
|
-
Args:
|
327
|
-
lo_converter: The configured frequency converter and validator.
|
328
|
-
experiment_config: Schedules to assemble.
|
329
|
-
run_config: Configuration of the runtime environment.
|
330
|
-
|
331
|
-
Returns:
|
332
|
-
The assembled PulseQobjConfig.
|
333
|
-
"""
|
334
|
-
qobj_config = run_config.to_dict()
|
335
|
-
qobj_config.update(experiment_config)
|
336
|
-
|
337
|
-
# Run config not needed in qobj config
|
338
|
-
qobj_config.pop("meas_map", None)
|
339
|
-
qobj_config.pop("qubit_lo_range", None)
|
340
|
-
qobj_config.pop("meas_lo_range", None)
|
341
|
-
|
342
|
-
# convert enums to serialized values
|
343
|
-
meas_return = qobj_config.get("meas_return", "avg")
|
344
|
-
if isinstance(meas_return, qobj_utils.MeasReturnType):
|
345
|
-
qobj_config["meas_return"] = meas_return.value
|
346
|
-
|
347
|
-
meas_level = qobj_config.get("meas_level", 2)
|
348
|
-
if isinstance(meas_level, qobj_utils.MeasLevel):
|
349
|
-
qobj_config["meas_level"] = meas_level.value
|
350
|
-
|
351
|
-
# convert LO frequencies to GHz
|
352
|
-
qobj_config["qubit_lo_freq"] = [freq / 1e9 for freq in qobj_config["qubit_lo_freq"]]
|
353
|
-
qobj_config["meas_lo_freq"] = [freq / 1e9 for freq in qobj_config["meas_lo_freq"]]
|
354
|
-
|
355
|
-
# override defaults if single entry for ``schedule_los``
|
356
|
-
schedule_los = qobj_config.pop("schedule_los", [])
|
357
|
-
if len(schedule_los) == 1:
|
358
|
-
lo_dict = schedule_los[0]
|
359
|
-
q_los = lo_converter.get_qubit_los(lo_dict)
|
360
|
-
# Hz -> GHz
|
361
|
-
if q_los:
|
362
|
-
qobj_config["qubit_lo_freq"] = [freq / 1e9 for freq in q_los]
|
363
|
-
m_los = lo_converter.get_meas_los(lo_dict)
|
364
|
-
if m_los:
|
365
|
-
qobj_config["meas_lo_freq"] = [freq / 1e9 for freq in m_los]
|
366
|
-
|
367
|
-
return qobj.PulseQobjConfig(**qobj_config)
|
qiskit/assembler/disassemble.py
DELETED
@@ -1,310 +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
|
-
"""Disassemble function for a qobj into a list of circuits and its config"""
|
14
|
-
from typing import Any, Dict, List, NewType, Tuple, Union
|
15
|
-
import collections
|
16
|
-
import math
|
17
|
-
|
18
|
-
from qiskit import pulse
|
19
|
-
from qiskit.circuit.classicalregister import ClassicalRegister
|
20
|
-
from qiskit.circuit.instruction import Instruction
|
21
|
-
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
22
|
-
from qiskit.circuit.quantumregister import QuantumRegister
|
23
|
-
|
24
|
-
from qiskit.qobj import PulseQobjInstruction
|
25
|
-
from qiskit.qobj.converters import QobjToInstructionConverter
|
26
|
-
from qiskit.utils import deprecate_func
|
27
|
-
|
28
|
-
# A ``CircuitModule`` is a representation of a circuit execution on the backend.
|
29
|
-
# It is currently a list of quantum circuits to execute, a run Qobj dictionary
|
30
|
-
# and a header dictionary.
|
31
|
-
CircuitModule = NewType(
|
32
|
-
"CircuitModule", Tuple[List[QuantumCircuit], Dict[str, Any], Dict[str, Any]]
|
33
|
-
)
|
34
|
-
|
35
|
-
# A ``PulseModule`` is a representation of a pulse execution on the backend.
|
36
|
-
# It is currently a list of pulse schedules to execute, a run Qobj dictionary
|
37
|
-
# and a header dictionary.
|
38
|
-
PulseModule = NewType("PulseModule", Tuple[List[pulse.Schedule], Dict[str, Any], Dict[str, Any]])
|
39
|
-
|
40
|
-
|
41
|
-
@deprecate_func(
|
42
|
-
since="1.2",
|
43
|
-
removal_timeline="in the 2.0 release",
|
44
|
-
additional_msg="The `Qobj` class and related functionality are part of the deprecated "
|
45
|
-
"`BackendV1` workflow, and no longer necessary for `BackendV2`. If a user "
|
46
|
-
"workflow requires `Qobj` it likely relies on deprecated functionality and "
|
47
|
-
"should be updated to use `BackendV2`.",
|
48
|
-
)
|
49
|
-
def disassemble(qobj) -> Union[CircuitModule, PulseModule]:
|
50
|
-
"""Disassemble a qobj and return the circuits or pulse schedules, run_config, and user header.
|
51
|
-
|
52
|
-
.. note::
|
53
|
-
|
54
|
-
``disassemble(assemble(qc))`` is not guaranteed to produce an exactly equal circuit to the
|
55
|
-
input, due to limitations in the :obj:`.QasmQobj` format that need to be maintained for
|
56
|
-
backend system compatibility. This is most likely to be the case when using newer features
|
57
|
-
of :obj:`.QuantumCircuit`. In most cases, the output should be equivalent, if not quite
|
58
|
-
equal.
|
59
|
-
|
60
|
-
Args:
|
61
|
-
qobj (Qobj): The input qobj object to disassemble
|
62
|
-
|
63
|
-
Returns:
|
64
|
-
Union[CircuitModule, PulseModule]: The disassembled program which consists of:
|
65
|
-
|
66
|
-
* programs: A list of quantum circuits or pulse schedules
|
67
|
-
* run_config: The dict of the run config
|
68
|
-
* user_qobj_header: The dict of any user headers in the qobj
|
69
|
-
|
70
|
-
Examples:
|
71
|
-
|
72
|
-
.. code-block:: python
|
73
|
-
|
74
|
-
from qiskit.circuit import QuantumRegister, ClassicalRegister, QuantumCircuit
|
75
|
-
from qiskit.compiler.assembler import assemble
|
76
|
-
from qiskit.assembler.disassemble import disassemble
|
77
|
-
# Create a circuit to assemble into a qobj
|
78
|
-
q = QuantumRegister(2)
|
79
|
-
c = ClassicalRegister(2)
|
80
|
-
qc = QuantumCircuit(q, c)
|
81
|
-
qc.h(q[0])
|
82
|
-
qc.cx(q[0], q[1])
|
83
|
-
qc.measure(q, c)
|
84
|
-
# Assemble the circuit into a Qobj
|
85
|
-
qobj = assemble(qc, shots=2000, memory=True)
|
86
|
-
# Disassemble the qobj back into a circuit
|
87
|
-
circuits, run_config_out, headers = disassemble(qobj)
|
88
|
-
"""
|
89
|
-
if qobj.type == "PULSE":
|
90
|
-
return _disassemble_pulse_schedule(qobj)
|
91
|
-
else:
|
92
|
-
return _disassemble_circuit(qobj)
|
93
|
-
|
94
|
-
|
95
|
-
def _disassemble_circuit(qobj) -> CircuitModule:
|
96
|
-
run_config = qobj.config.to_dict()
|
97
|
-
|
98
|
-
# convert lo freq back to Hz
|
99
|
-
qubit_lo_freq = run_config.get("qubit_lo_freq", [])
|
100
|
-
if qubit_lo_freq:
|
101
|
-
run_config["qubit_lo_freq"] = [freq * 1e9 for freq in qubit_lo_freq]
|
102
|
-
|
103
|
-
meas_lo_freq = run_config.get("meas_lo_freq", [])
|
104
|
-
if meas_lo_freq:
|
105
|
-
run_config["meas_lo_freq"] = [freq * 1e9 for freq in meas_lo_freq]
|
106
|
-
|
107
|
-
user_qobj_header = qobj.header.to_dict()
|
108
|
-
return CircuitModule((_experiments_to_circuits(qobj), run_config, user_qobj_header))
|
109
|
-
|
110
|
-
|
111
|
-
def _qobj_to_circuit_cals(qobj, pulse_lib):
|
112
|
-
"""Return circuit calibrations dictionary from qobj/exp config calibrations."""
|
113
|
-
qobj_cals = qobj.config.calibrations.to_dict()["gates"]
|
114
|
-
converter = QobjToInstructionConverter(pulse_lib)
|
115
|
-
|
116
|
-
qc_cals = {}
|
117
|
-
for gate in qobj_cals:
|
118
|
-
config = (tuple(gate["qubits"]), tuple(gate["params"]))
|
119
|
-
cal = {
|
120
|
-
config: pulse.Schedule(
|
121
|
-
name=f"{gate['name']} {str(gate['params'])} {str(gate['qubits'])}"
|
122
|
-
)
|
123
|
-
}
|
124
|
-
for instruction in gate["instructions"]:
|
125
|
-
qobj_instruction = PulseQobjInstruction.from_dict(instruction)
|
126
|
-
schedule = converter(qobj_instruction)
|
127
|
-
cal[config] = cal[config].insert(schedule.ch_start_time(), schedule)
|
128
|
-
if gate["name"] in qc_cals:
|
129
|
-
qc_cals[gate["name"]].update(cal)
|
130
|
-
else:
|
131
|
-
qc_cals[gate["name"]] = cal
|
132
|
-
|
133
|
-
return qc_cals
|
134
|
-
|
135
|
-
|
136
|
-
def _experiments_to_circuits(qobj):
|
137
|
-
"""Return a list of QuantumCircuit object(s) from a qobj.
|
138
|
-
|
139
|
-
Args:
|
140
|
-
qobj (Qobj): The Qobj object to convert to QuantumCircuits
|
141
|
-
|
142
|
-
Returns:
|
143
|
-
list: A list of QuantumCircuit objects from the qobj
|
144
|
-
"""
|
145
|
-
if not qobj.experiments:
|
146
|
-
return None
|
147
|
-
|
148
|
-
circuits = []
|
149
|
-
for exp in qobj.experiments:
|
150
|
-
quantum_registers = [QuantumRegister(i[1], name=i[0]) for i in exp.header.qreg_sizes]
|
151
|
-
classical_registers = [ClassicalRegister(i[1], name=i[0]) for i in exp.header.creg_sizes]
|
152
|
-
circuit = QuantumCircuit(*quantum_registers, *classical_registers, name=exp.header.name)
|
153
|
-
qreg_dict = collections.OrderedDict()
|
154
|
-
creg_dict = collections.OrderedDict()
|
155
|
-
for reg in quantum_registers:
|
156
|
-
qreg_dict[reg.name] = reg
|
157
|
-
for reg in classical_registers:
|
158
|
-
creg_dict[reg.name] = reg
|
159
|
-
conditional = {}
|
160
|
-
for i in exp.instructions:
|
161
|
-
name = i.name
|
162
|
-
qubits = []
|
163
|
-
params = getattr(i, "params", [])
|
164
|
-
try:
|
165
|
-
for qubit in i.qubits:
|
166
|
-
qubit_label = exp.header.qubit_labels[qubit]
|
167
|
-
qubits.append(qreg_dict[qubit_label[0]][qubit_label[1]])
|
168
|
-
except Exception: # pylint: disable=broad-except
|
169
|
-
pass
|
170
|
-
clbits = []
|
171
|
-
try:
|
172
|
-
for clbit in i.memory:
|
173
|
-
clbit_label = exp.header.clbit_labels[clbit]
|
174
|
-
clbits.append(creg_dict[clbit_label[0]][clbit_label[1]])
|
175
|
-
except Exception: # pylint: disable=broad-except
|
176
|
-
pass
|
177
|
-
if hasattr(circuit, name):
|
178
|
-
instr_method = getattr(circuit, name)
|
179
|
-
if i.name == "initialize":
|
180
|
-
_inst = instr_method(params, qubits)
|
181
|
-
elif i.name in ["mcx", "mcu1", "mcp"]:
|
182
|
-
_inst = instr_method(*params, qubits[:-1], qubits[-1], *clbits)
|
183
|
-
else:
|
184
|
-
_inst = instr_method(*params, *qubits, *clbits)
|
185
|
-
elif name == "bfunc":
|
186
|
-
conditional["value"] = int(i.val, 16)
|
187
|
-
full_bit_size = sum(creg_dict[x].size for x in creg_dict)
|
188
|
-
mask_map = {}
|
189
|
-
raw_map = {}
|
190
|
-
raw = []
|
191
|
-
|
192
|
-
for creg in creg_dict:
|
193
|
-
size = creg_dict[creg].size
|
194
|
-
reg_raw = [1] * size
|
195
|
-
if not raw:
|
196
|
-
raw = reg_raw
|
197
|
-
else:
|
198
|
-
for pos, val in enumerate(raw):
|
199
|
-
if val == 1:
|
200
|
-
raw[pos] = 0
|
201
|
-
raw = reg_raw + raw
|
202
|
-
mask = [0] * (full_bit_size - len(raw)) + raw
|
203
|
-
raw_map[creg] = mask
|
204
|
-
mask_map[int("".join(str(x) for x in mask), 2)] = creg
|
205
|
-
if bin(int(i.mask, 16)).count("1") == 1:
|
206
|
-
# The condition is on a single bit. This might be a single-bit condition, or it
|
207
|
-
# might be a register of length one. The case that it's a single-bit condition
|
208
|
-
# in a register of length one is ambiguous, and we choose to return a condition
|
209
|
-
# on the register. This may not match the input circuit exactly, but is at
|
210
|
-
# least equivalent.
|
211
|
-
cbit = int(math.log2(int(i.mask, 16)))
|
212
|
-
for reg in creg_dict.values():
|
213
|
-
size = reg.size
|
214
|
-
if cbit >= size:
|
215
|
-
cbit -= size
|
216
|
-
else:
|
217
|
-
conditional["register"] = reg if reg.size == 1 else reg[cbit]
|
218
|
-
break
|
219
|
-
mask_str = bin(int(i.mask, 16))[2:].zfill(full_bit_size)
|
220
|
-
mask = [int(item) for item in list(mask_str)]
|
221
|
-
else:
|
222
|
-
creg = mask_map[int(i.mask, 16)]
|
223
|
-
conditional["register"] = creg_dict[creg]
|
224
|
-
mask = raw_map[creg]
|
225
|
-
val = int(i.val, 16)
|
226
|
-
for j in reversed(mask):
|
227
|
-
if j == 0:
|
228
|
-
val = val >> 1
|
229
|
-
else:
|
230
|
-
conditional["value"] = val
|
231
|
-
break
|
232
|
-
else:
|
233
|
-
_inst = temp_opaque_instruction = Instruction(
|
234
|
-
name=name, num_qubits=len(qubits), num_clbits=len(clbits), params=params
|
235
|
-
)
|
236
|
-
circuit.append(temp_opaque_instruction, qubits, clbits)
|
237
|
-
if conditional and name != "bfunc":
|
238
|
-
_inst.c_if(conditional["register"], conditional["value"])
|
239
|
-
conditional = {}
|
240
|
-
pulse_lib = qobj.config.pulse_library if hasattr(qobj.config, "pulse_library") else []
|
241
|
-
# The dict update method did not work here; could investigate in the future
|
242
|
-
if hasattr(qobj.config, "calibrations"):
|
243
|
-
circuit.calibrations = {
|
244
|
-
**circuit.calibrations,
|
245
|
-
**_qobj_to_circuit_cals(qobj, pulse_lib),
|
246
|
-
}
|
247
|
-
if hasattr(exp.config, "calibrations"):
|
248
|
-
circuit.calibrations = {**circuit.calibrations, **_qobj_to_circuit_cals(exp, pulse_lib)}
|
249
|
-
circuits.append(circuit)
|
250
|
-
return circuits
|
251
|
-
|
252
|
-
|
253
|
-
def _disassemble_pulse_schedule(qobj) -> PulseModule:
|
254
|
-
run_config = qobj.config.to_dict()
|
255
|
-
run_config.pop("pulse_library")
|
256
|
-
|
257
|
-
qubit_lo_freq = run_config.get("qubit_lo_freq")
|
258
|
-
if qubit_lo_freq:
|
259
|
-
run_config["qubit_lo_freq"] = [freq * 1e9 for freq in qubit_lo_freq]
|
260
|
-
|
261
|
-
meas_lo_freq = run_config.get("meas_lo_freq")
|
262
|
-
if meas_lo_freq:
|
263
|
-
run_config["meas_lo_freq"] = [freq * 1e9 for freq in meas_lo_freq]
|
264
|
-
|
265
|
-
user_qobj_header = qobj.header.to_dict()
|
266
|
-
|
267
|
-
# extract schedule lo settings
|
268
|
-
schedule_los = []
|
269
|
-
for program in qobj.experiments:
|
270
|
-
program_los = {}
|
271
|
-
if hasattr(program, "config"):
|
272
|
-
if hasattr(program.config, "qubit_lo_freq"):
|
273
|
-
for i, lo in enumerate(program.config.qubit_lo_freq):
|
274
|
-
program_los[pulse.DriveChannel(i)] = lo * 1e9
|
275
|
-
|
276
|
-
if hasattr(program.config, "meas_lo_freq"):
|
277
|
-
for i, lo in enumerate(program.config.meas_lo_freq):
|
278
|
-
program_los[pulse.MeasureChannel(i)] = lo * 1e9
|
279
|
-
|
280
|
-
schedule_los.append(program_los)
|
281
|
-
|
282
|
-
if any(schedule_los):
|
283
|
-
run_config["schedule_los"] = schedule_los
|
284
|
-
|
285
|
-
return PulseModule((_experiments_to_schedules(qobj), run_config, user_qobj_header))
|
286
|
-
|
287
|
-
|
288
|
-
def _experiments_to_schedules(qobj) -> List[pulse.Schedule]:
|
289
|
-
"""Return a list of :class:`qiskit.pulse.Schedule` object(s) from a qobj.
|
290
|
-
|
291
|
-
Args:
|
292
|
-
qobj (Qobj): The Qobj object to convert to pulse schedules.
|
293
|
-
|
294
|
-
Returns:
|
295
|
-
A list of :class:`qiskit.pulse.Schedule` objects from the qobj
|
296
|
-
|
297
|
-
Raises:
|
298
|
-
pulse.PulseError: If a parameterized instruction is supplied.
|
299
|
-
"""
|
300
|
-
converter = QobjToInstructionConverter(qobj.config.pulse_library)
|
301
|
-
|
302
|
-
schedules = []
|
303
|
-
for program in qobj.experiments:
|
304
|
-
insts = []
|
305
|
-
for inst in program.instructions:
|
306
|
-
insts.append(converter(inst))
|
307
|
-
|
308
|
-
schedule = pulse.Schedule(*insts)
|
309
|
-
schedules.append(schedule)
|
310
|
-
return schedules
|