qiskit 1.4.2__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0__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 +3 -9
- qiskit/_accelerate.abi3.so +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 +7 -1
- 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/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 +98 -130
- qiskit/qpy/binary_io/schedules.py +69 -439
- qiskit/qpy/binary_io/value.py +154 -31
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +34 -81
- 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/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 +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 +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.2.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/RECORD +300 -447
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
- {qiskit-1.4.2.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.2.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -1,645 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2020.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
# pylint: disable=unused-argument
|
14
|
-
|
15
|
-
"""Waveform generators.
|
16
|
-
|
17
|
-
A collection of functions that generate drawings from formatted input data.
|
18
|
-
See py:mod:`qiskit.visualization.pulse_v2.types` for more info on the required data.
|
19
|
-
|
20
|
-
In this module the input data is `types.PulseInstruction`.
|
21
|
-
|
22
|
-
An end-user can write arbitrary functions that generate custom drawings.
|
23
|
-
Generators in this module are called with the `formatter` and `device` kwargs.
|
24
|
-
These data provides stylesheet configuration and backend system configuration.
|
25
|
-
|
26
|
-
The format of generator is restricted to:
|
27
|
-
|
28
|
-
```python
|
29
|
-
|
30
|
-
def my_object_generator(data: PulseInstruction,
|
31
|
-
formatter: Dict[str, Any],
|
32
|
-
device: DrawerBackendInfo) -> List[ElementaryData]:
|
33
|
-
pass
|
34
|
-
```
|
35
|
-
|
36
|
-
Arbitrary generator function satisfying the above format can be accepted.
|
37
|
-
Returned `ElementaryData` can be arbitrary subclasses that are implemented in
|
38
|
-
the plotter API.
|
39
|
-
"""
|
40
|
-
|
41
|
-
from __future__ import annotations
|
42
|
-
import re
|
43
|
-
from fractions import Fraction
|
44
|
-
from typing import Any
|
45
|
-
|
46
|
-
import numpy as np
|
47
|
-
|
48
|
-
from qiskit import pulse, circuit
|
49
|
-
from qiskit.pulse import instructions, library
|
50
|
-
from qiskit.visualization.exceptions import VisualizationError
|
51
|
-
from qiskit.visualization.pulse_v2 import drawings, types, device_info
|
52
|
-
|
53
|
-
|
54
|
-
def gen_filled_waveform_stepwise(
|
55
|
-
data: types.PulseInstruction, formatter: dict[str, Any], device: device_info.DrawerBackendInfo
|
56
|
-
) -> list[drawings.LineData | drawings.BoxData | drawings.TextData]:
|
57
|
-
"""Generate filled area objects of the real and the imaginary part of waveform envelope.
|
58
|
-
|
59
|
-
The curve of envelope is not interpolated nor smoothed and presented
|
60
|
-
as stepwise function at each data point.
|
61
|
-
|
62
|
-
Stylesheets:
|
63
|
-
- The `fill_waveform` style is applied.
|
64
|
-
|
65
|
-
Args:
|
66
|
-
data: Waveform instruction data to draw.
|
67
|
-
formatter: Dictionary of stylesheet settings.
|
68
|
-
device: Backend configuration.
|
69
|
-
|
70
|
-
Returns:
|
71
|
-
List of `LineData`, `BoxData`, or `TextData` drawings.
|
72
|
-
|
73
|
-
Raises:
|
74
|
-
VisualizationError: When the instruction parser returns invalid data format.
|
75
|
-
"""
|
76
|
-
# generate waveform data
|
77
|
-
waveform_data = _parse_waveform(data)
|
78
|
-
channel = data.inst.channel
|
79
|
-
|
80
|
-
# update metadata
|
81
|
-
meta = waveform_data.meta
|
82
|
-
qind = device.get_qubit_index(channel)
|
83
|
-
meta.update({"qubit": qind if qind is not None else "N/A"})
|
84
|
-
|
85
|
-
if isinstance(waveform_data, types.ParsedInstruction):
|
86
|
-
# Draw waveform with fixed shape
|
87
|
-
|
88
|
-
xdata = waveform_data.xvals
|
89
|
-
ydata = waveform_data.yvals
|
90
|
-
|
91
|
-
# phase modulation
|
92
|
-
if formatter["control.apply_phase_modulation"]:
|
93
|
-
ydata = np.asarray(ydata, dtype=complex) * np.exp(1j * data.frame.phase)
|
94
|
-
else:
|
95
|
-
ydata = np.asarray(ydata, dtype=complex)
|
96
|
-
|
97
|
-
return _draw_shaped_waveform(
|
98
|
-
xdata=xdata, ydata=ydata, meta=meta, channel=channel, formatter=formatter
|
99
|
-
)
|
100
|
-
|
101
|
-
elif isinstance(waveform_data, types.OpaqueShape):
|
102
|
-
# Draw parametric pulse with unbound parameters
|
103
|
-
|
104
|
-
# parameter name
|
105
|
-
unbound_params = []
|
106
|
-
for pname, pval in data.inst.pulse.parameters.items():
|
107
|
-
if isinstance(pval, circuit.ParameterExpression):
|
108
|
-
unbound_params.append(pname)
|
109
|
-
|
110
|
-
pulse_data = data.inst.pulse
|
111
|
-
if isinstance(pulse_data, library.SymbolicPulse):
|
112
|
-
pulse_shape = pulse_data.pulse_type
|
113
|
-
else:
|
114
|
-
pulse_shape = "Waveform"
|
115
|
-
|
116
|
-
return _draw_opaque_waveform(
|
117
|
-
init_time=data.t0,
|
118
|
-
duration=waveform_data.duration,
|
119
|
-
pulse_shape=pulse_shape,
|
120
|
-
pnames=unbound_params,
|
121
|
-
meta=meta,
|
122
|
-
channel=channel,
|
123
|
-
formatter=formatter,
|
124
|
-
)
|
125
|
-
|
126
|
-
else:
|
127
|
-
raise VisualizationError("Invalid data format is provided.")
|
128
|
-
|
129
|
-
|
130
|
-
def gen_ibmq_latex_waveform_name(
|
131
|
-
data: types.PulseInstruction, formatter: dict[str, Any], device: device_info.DrawerBackendInfo
|
132
|
-
) -> list[drawings.TextData]:
|
133
|
-
r"""Generate the formatted instruction name associated with the waveform.
|
134
|
-
|
135
|
-
Channel name and ID string are removed and the rotation angle is expressed in units of pi.
|
136
|
-
The controlled rotation angle associated with the CR pulse name is divided by 2.
|
137
|
-
|
138
|
-
Note that in many scientific articles the controlled rotation angle implies
|
139
|
-
the actual rotation angle, but in IQX backend the rotation angle represents
|
140
|
-
the difference between rotation angles with different control qubit states.
|
141
|
-
|
142
|
-
For example:
|
143
|
-
- 'X90p_d0_abcdefg' is converted into 'X(\frac{\pi}{2})'
|
144
|
-
- 'CR90p_u0_abcdefg` is converted into 'CR(\frac{\pi}{4})'
|
145
|
-
|
146
|
-
Stylesheets:
|
147
|
-
- The `annotate` style is applied.
|
148
|
-
|
149
|
-
Notes:
|
150
|
-
This generator can convert pulse names used in the IQX backends.
|
151
|
-
If pulses are provided by the third party providers or the user defined,
|
152
|
-
the generator output may be the as-is pulse name.
|
153
|
-
|
154
|
-
Args:
|
155
|
-
data: Waveform instruction data to draw.
|
156
|
-
formatter: Dictionary of stylesheet settings.
|
157
|
-
device: Backend configuration.
|
158
|
-
|
159
|
-
Returns:
|
160
|
-
List of `TextData` drawings.
|
161
|
-
"""
|
162
|
-
if data.is_opaque:
|
163
|
-
return []
|
164
|
-
|
165
|
-
style = {
|
166
|
-
"zorder": formatter["layer.annotate"],
|
167
|
-
"color": formatter["color.annotate"],
|
168
|
-
"size": formatter["text_size.annotate"],
|
169
|
-
"va": "center",
|
170
|
-
"ha": "center",
|
171
|
-
}
|
172
|
-
|
173
|
-
if isinstance(data.inst, pulse.instructions.Acquire):
|
174
|
-
systematic_name = "Acquire"
|
175
|
-
latex_name = None
|
176
|
-
elif isinstance(data.inst, instructions.Delay):
|
177
|
-
systematic_name = data.inst.name or "Delay"
|
178
|
-
latex_name = None
|
179
|
-
else:
|
180
|
-
pulse_data = data.inst.pulse
|
181
|
-
if pulse_data.name:
|
182
|
-
systematic_name = pulse_data.name
|
183
|
-
else:
|
184
|
-
if isinstance(pulse_data, library.SymbolicPulse):
|
185
|
-
systematic_name = pulse_data.pulse_type
|
186
|
-
else:
|
187
|
-
systematic_name = "Waveform"
|
188
|
-
|
189
|
-
template = r"(?P<op>[A-Z]+)(?P<angle>[0-9]+)?(?P<sign>[pm])_(?P<ch>[dum])[0-9]+"
|
190
|
-
match_result = re.match(template, systematic_name)
|
191
|
-
if match_result is not None:
|
192
|
-
match_dict = match_result.groupdict()
|
193
|
-
sign = "" if match_dict["sign"] == "p" else "-"
|
194
|
-
if match_dict["op"] == "CR":
|
195
|
-
# cross resonance
|
196
|
-
if match_dict["ch"] == "u":
|
197
|
-
op_name = r"{\rm CR}"
|
198
|
-
else:
|
199
|
-
op_name = r"\overline{\rm CR}"
|
200
|
-
# IQX name def is not standard. Echo CR is annotated with pi/4 rather than pi/2
|
201
|
-
angle_val = match_dict["angle"]
|
202
|
-
frac = Fraction(int(int(angle_val) / 2), 180)
|
203
|
-
if frac.numerator == 1:
|
204
|
-
angle = rf"\pi/{frac.denominator:d}"
|
205
|
-
else:
|
206
|
-
angle = rf"{frac.numerator:d}/{frac.denominator:d} \pi"
|
207
|
-
else:
|
208
|
-
# single qubit pulse
|
209
|
-
# pylint: disable-next=consider-using-f-string
|
210
|
-
op_name = r"{{\rm {}}}".format(match_dict["op"])
|
211
|
-
angle_val = match_dict["angle"]
|
212
|
-
if angle_val is None:
|
213
|
-
angle = r"\pi"
|
214
|
-
else:
|
215
|
-
frac = Fraction(int(angle_val), 180)
|
216
|
-
if frac.numerator == 1:
|
217
|
-
angle = rf"\pi/{frac.denominator:d}"
|
218
|
-
else:
|
219
|
-
angle = rf"{frac.numerator:d}/{frac.denominator:d} \pi"
|
220
|
-
latex_name = rf"{op_name}({sign}{angle})"
|
221
|
-
else:
|
222
|
-
latex_name = None
|
223
|
-
|
224
|
-
text = drawings.TextData(
|
225
|
-
data_type=types.LabelType.PULSE_NAME,
|
226
|
-
channels=data.inst.channel,
|
227
|
-
xvals=[data.t0 + 0.5 * data.inst.duration],
|
228
|
-
yvals=[-formatter["label_offset.pulse_name"]],
|
229
|
-
text=systematic_name,
|
230
|
-
latex=latex_name,
|
231
|
-
ignore_scaling=True,
|
232
|
-
styles=style,
|
233
|
-
)
|
234
|
-
|
235
|
-
return [text]
|
236
|
-
|
237
|
-
|
238
|
-
def gen_waveform_max_value(
|
239
|
-
data: types.PulseInstruction, formatter: dict[str, Any], device: device_info.DrawerBackendInfo
|
240
|
-
) -> list[drawings.TextData]:
|
241
|
-
"""Generate the annotation for the maximum waveform height for
|
242
|
-
the real and the imaginary part of the waveform envelope.
|
243
|
-
|
244
|
-
Maximum values smaller than the vertical resolution limit is ignored.
|
245
|
-
|
246
|
-
Stylesheets:
|
247
|
-
- The `annotate` style is applied.
|
248
|
-
|
249
|
-
Args:
|
250
|
-
data: Waveform instruction data to draw.
|
251
|
-
formatter: Dictionary of stylesheet settings.
|
252
|
-
device: Backend configuration.
|
253
|
-
|
254
|
-
Returns:
|
255
|
-
List of `TextData` drawings.
|
256
|
-
"""
|
257
|
-
if data.is_opaque:
|
258
|
-
return []
|
259
|
-
|
260
|
-
style = {
|
261
|
-
"zorder": formatter["layer.annotate"],
|
262
|
-
"color": formatter["color.annotate"],
|
263
|
-
"size": formatter["text_size.annotate"],
|
264
|
-
"ha": "center",
|
265
|
-
}
|
266
|
-
|
267
|
-
# only pulses.
|
268
|
-
if isinstance(data.inst, instructions.Play):
|
269
|
-
# pulse
|
270
|
-
operand = data.inst.pulse
|
271
|
-
if isinstance(operand, pulse.SymbolicPulse):
|
272
|
-
pulse_data = operand.get_waveform()
|
273
|
-
else:
|
274
|
-
pulse_data = operand
|
275
|
-
xdata = np.arange(pulse_data.duration) + data.t0
|
276
|
-
ydata = pulse_data.samples
|
277
|
-
else:
|
278
|
-
return []
|
279
|
-
|
280
|
-
# phase modulation
|
281
|
-
if formatter["control.apply_phase_modulation"]:
|
282
|
-
ydata = np.asarray(ydata, dtype=complex) * np.exp(1j * data.frame.phase)
|
283
|
-
else:
|
284
|
-
ydata = np.asarray(ydata, dtype=complex)
|
285
|
-
|
286
|
-
texts = []
|
287
|
-
|
288
|
-
# max of real part
|
289
|
-
re_maxind = np.argmax(np.abs(ydata.real))
|
290
|
-
if np.abs(ydata.real[re_maxind]) > 0.01:
|
291
|
-
# generator shows only 2 digits after the decimal point.
|
292
|
-
if ydata.real[re_maxind] > 0:
|
293
|
-
max_val = f"{ydata.real[re_maxind]:.2f}\n\u25BE"
|
294
|
-
re_style = {"va": "bottom"}
|
295
|
-
else:
|
296
|
-
max_val = f"\u25B4\n{ydata.real[re_maxind]:.2f}"
|
297
|
-
re_style = {"va": "top"}
|
298
|
-
re_style.update(style)
|
299
|
-
re_text = drawings.TextData(
|
300
|
-
data_type=types.LabelType.PULSE_INFO,
|
301
|
-
channels=data.inst.channel,
|
302
|
-
xvals=[xdata[re_maxind]],
|
303
|
-
yvals=[ydata.real[re_maxind]],
|
304
|
-
text=max_val,
|
305
|
-
styles=re_style,
|
306
|
-
)
|
307
|
-
texts.append(re_text)
|
308
|
-
|
309
|
-
# max of imag part
|
310
|
-
im_maxind = np.argmax(np.abs(ydata.imag))
|
311
|
-
if np.abs(ydata.imag[im_maxind]) > 0.01:
|
312
|
-
# generator shows only 2 digits after the decimal point.
|
313
|
-
if ydata.imag[im_maxind] > 0:
|
314
|
-
max_val = f"{ydata.imag[im_maxind]:.2f}\n\u25BE"
|
315
|
-
im_style = {"va": "bottom"}
|
316
|
-
else:
|
317
|
-
max_val = f"\u25B4\n{ydata.imag[im_maxind]:.2f}"
|
318
|
-
im_style = {"va": "top"}
|
319
|
-
im_style.update(style)
|
320
|
-
im_text = drawings.TextData(
|
321
|
-
data_type=types.LabelType.PULSE_INFO,
|
322
|
-
channels=data.inst.channel,
|
323
|
-
xvals=[xdata[im_maxind]],
|
324
|
-
yvals=[ydata.imag[im_maxind]],
|
325
|
-
text=max_val,
|
326
|
-
styles=im_style,
|
327
|
-
)
|
328
|
-
texts.append(im_text)
|
329
|
-
|
330
|
-
return texts
|
331
|
-
|
332
|
-
|
333
|
-
def _draw_shaped_waveform(
|
334
|
-
xdata: np.ndarray,
|
335
|
-
ydata: np.ndarray,
|
336
|
-
meta: dict[str, Any],
|
337
|
-
channel: pulse.channels.PulseChannel,
|
338
|
-
formatter: dict[str, Any],
|
339
|
-
) -> list[drawings.LineData | drawings.BoxData | drawings.TextData]:
|
340
|
-
"""A private function that generates drawings of stepwise pulse lines.
|
341
|
-
|
342
|
-
Args:
|
343
|
-
xdata: Array of horizontal coordinate of waveform envelope.
|
344
|
-
ydata: Array of vertical coordinate of waveform envelope.
|
345
|
-
meta: Metadata dictionary of the waveform.
|
346
|
-
channel: Channel associated with the waveform to draw.
|
347
|
-
formatter: Dictionary of stylesheet settings.
|
348
|
-
|
349
|
-
Returns:
|
350
|
-
List of drawings.
|
351
|
-
|
352
|
-
Raises:
|
353
|
-
VisualizationError: When the waveform color for channel is not defined.
|
354
|
-
"""
|
355
|
-
fill_objs: list[drawings.LineData | drawings.BoxData | drawings.TextData] = []
|
356
|
-
|
357
|
-
resolution = formatter["general.vertical_resolution"]
|
358
|
-
|
359
|
-
# stepwise interpolation
|
360
|
-
xdata: np.ndarray = np.concatenate((xdata, [xdata[-1] + 1]))
|
361
|
-
ydata = np.repeat(ydata, 2)
|
362
|
-
re_y = np.real(ydata)
|
363
|
-
im_y = np.imag(ydata)
|
364
|
-
time: np.ndarray = np.concatenate(([xdata[0]], np.repeat(xdata[1:-1], 2), [xdata[-1]]))
|
365
|
-
|
366
|
-
# setup style options
|
367
|
-
style = {
|
368
|
-
"alpha": formatter["alpha.fill_waveform"],
|
369
|
-
"zorder": formatter["layer.fill_waveform"],
|
370
|
-
"linewidth": formatter["line_width.fill_waveform"],
|
371
|
-
"linestyle": formatter["line_style.fill_waveform"],
|
372
|
-
}
|
373
|
-
|
374
|
-
try:
|
375
|
-
color_real, color_imag = formatter["color.waveforms"][channel.prefix.upper()]
|
376
|
-
except KeyError as ex:
|
377
|
-
raise VisualizationError(
|
378
|
-
f"Waveform color for channel type {channel.prefix} is not defined"
|
379
|
-
) from ex
|
380
|
-
|
381
|
-
# create real part
|
382
|
-
if np.any(re_y):
|
383
|
-
# data compression
|
384
|
-
re_valid_inds = _find_consecutive_index(re_y, resolution)
|
385
|
-
# stylesheet
|
386
|
-
re_style = {"color": color_real}
|
387
|
-
re_style.update(style)
|
388
|
-
# metadata
|
389
|
-
re_meta = {"data": "real"}
|
390
|
-
re_meta.update(meta)
|
391
|
-
# active xy data
|
392
|
-
re_xvals = time[re_valid_inds]
|
393
|
-
re_yvals = re_y[re_valid_inds]
|
394
|
-
|
395
|
-
# object
|
396
|
-
real = drawings.LineData(
|
397
|
-
data_type=types.WaveformType.REAL,
|
398
|
-
channels=channel,
|
399
|
-
xvals=re_xvals,
|
400
|
-
yvals=re_yvals,
|
401
|
-
fill=formatter["control.fill_waveform"],
|
402
|
-
meta=re_meta,
|
403
|
-
styles=re_style,
|
404
|
-
)
|
405
|
-
fill_objs.append(real)
|
406
|
-
|
407
|
-
# create imaginary part
|
408
|
-
if np.any(im_y):
|
409
|
-
# data compression
|
410
|
-
im_valid_inds = _find_consecutive_index(im_y, resolution)
|
411
|
-
# stylesheet
|
412
|
-
im_style = {"color": color_imag}
|
413
|
-
im_style.update(style)
|
414
|
-
# metadata
|
415
|
-
im_meta = {"data": "imag"}
|
416
|
-
im_meta.update(meta)
|
417
|
-
# active xy data
|
418
|
-
im_xvals = time[im_valid_inds]
|
419
|
-
im_yvals = im_y[im_valid_inds]
|
420
|
-
|
421
|
-
# object
|
422
|
-
imag = drawings.LineData(
|
423
|
-
data_type=types.WaveformType.IMAG,
|
424
|
-
channels=channel,
|
425
|
-
xvals=im_xvals,
|
426
|
-
yvals=im_yvals,
|
427
|
-
fill=formatter["control.fill_waveform"],
|
428
|
-
meta=im_meta,
|
429
|
-
styles=im_style,
|
430
|
-
)
|
431
|
-
fill_objs.append(imag)
|
432
|
-
|
433
|
-
return fill_objs
|
434
|
-
|
435
|
-
|
436
|
-
def _draw_opaque_waveform(
|
437
|
-
init_time: int,
|
438
|
-
duration: int,
|
439
|
-
pulse_shape: str,
|
440
|
-
pnames: list[str],
|
441
|
-
meta: dict[str, Any],
|
442
|
-
channel: pulse.channels.PulseChannel,
|
443
|
-
formatter: dict[str, Any],
|
444
|
-
) -> list[drawings.LineData | drawings.BoxData | drawings.TextData]:
|
445
|
-
"""A private function that generates drawings of stepwise pulse lines.
|
446
|
-
|
447
|
-
Args:
|
448
|
-
init_time: Time when the opaque waveform starts.
|
449
|
-
duration: Duration of opaque waveform. This can be None or ParameterExpression.
|
450
|
-
pulse_shape: String that represents pulse shape.
|
451
|
-
pnames: List of parameter names.
|
452
|
-
meta: Metadata dictionary of the waveform.
|
453
|
-
channel: Channel associated with the waveform to draw.
|
454
|
-
formatter: Dictionary of stylesheet settings.
|
455
|
-
|
456
|
-
Returns:
|
457
|
-
List of drawings.
|
458
|
-
"""
|
459
|
-
fill_objs: list[drawings.LineData | drawings.BoxData | drawings.TextData] = []
|
460
|
-
|
461
|
-
fc, ec = formatter["color.opaque_shape"]
|
462
|
-
# setup style options
|
463
|
-
box_style = {
|
464
|
-
"zorder": formatter["layer.fill_waveform"],
|
465
|
-
"alpha": formatter["alpha.opaque_shape"],
|
466
|
-
"linewidth": formatter["line_width.opaque_shape"],
|
467
|
-
"linestyle": formatter["line_style.opaque_shape"],
|
468
|
-
"facecolor": fc,
|
469
|
-
"edgecolor": ec,
|
470
|
-
}
|
471
|
-
|
472
|
-
if duration is None or isinstance(duration, circuit.ParameterExpression):
|
473
|
-
duration = formatter["box_width.opaque_shape"]
|
474
|
-
|
475
|
-
box_obj = drawings.BoxData(
|
476
|
-
data_type=types.WaveformType.OPAQUE,
|
477
|
-
channels=channel,
|
478
|
-
xvals=[init_time, init_time + duration],
|
479
|
-
yvals=[
|
480
|
-
-0.5 * formatter["box_height.opaque_shape"],
|
481
|
-
0.5 * formatter["box_height.opaque_shape"],
|
482
|
-
],
|
483
|
-
meta=meta,
|
484
|
-
ignore_scaling=True,
|
485
|
-
styles=box_style,
|
486
|
-
)
|
487
|
-
fill_objs.append(box_obj)
|
488
|
-
|
489
|
-
# parameter name
|
490
|
-
func_repr = f"{pulse_shape}({', '.join(pnames)})"
|
491
|
-
|
492
|
-
text_style = {
|
493
|
-
"zorder": formatter["layer.annotate"],
|
494
|
-
"color": formatter["color.annotate"],
|
495
|
-
"size": formatter["text_size.annotate"],
|
496
|
-
"va": "bottom",
|
497
|
-
"ha": "center",
|
498
|
-
}
|
499
|
-
|
500
|
-
text_obj = drawings.TextData(
|
501
|
-
data_type=types.LabelType.OPAQUE_BOXTEXT,
|
502
|
-
channels=channel,
|
503
|
-
xvals=[init_time + 0.5 * duration],
|
504
|
-
yvals=[0.5 * formatter["box_height.opaque_shape"]],
|
505
|
-
text=func_repr,
|
506
|
-
ignore_scaling=True,
|
507
|
-
styles=text_style,
|
508
|
-
)
|
509
|
-
|
510
|
-
fill_objs.append(text_obj)
|
511
|
-
|
512
|
-
return fill_objs
|
513
|
-
|
514
|
-
|
515
|
-
def _find_consecutive_index(data_array: np.ndarray, resolution: float) -> np.ndarray:
|
516
|
-
"""A helper function to return non-consecutive index from the given list.
|
517
|
-
|
518
|
-
This drastically reduces memory footprint to represent a drawing,
|
519
|
-
especially for samples of very long flat-topped Gaussian pulses.
|
520
|
-
Tiny value fluctuation smaller than `resolution` threshold is removed.
|
521
|
-
|
522
|
-
Args:
|
523
|
-
data_array: The array of numbers.
|
524
|
-
resolution: Minimum resolution of sample values.
|
525
|
-
|
526
|
-
Returns:
|
527
|
-
The compressed data array.
|
528
|
-
"""
|
529
|
-
try:
|
530
|
-
vector = np.asarray(data_array, dtype=float)
|
531
|
-
diff = np.diff(vector)
|
532
|
-
diff[np.where(np.abs(diff) < resolution)] = 0
|
533
|
-
# keep left and right edges
|
534
|
-
consecutive_l = np.insert(diff.astype(bool), 0, True)
|
535
|
-
consecutive_r = np.append(diff.astype(bool), True)
|
536
|
-
return consecutive_l | consecutive_r
|
537
|
-
|
538
|
-
except ValueError:
|
539
|
-
return np.ones_like(data_array).astype(bool)
|
540
|
-
|
541
|
-
|
542
|
-
def _parse_waveform(
|
543
|
-
data: types.PulseInstruction,
|
544
|
-
) -> types.ParsedInstruction | types.OpaqueShape:
|
545
|
-
"""A helper function that generates an array for the waveform with
|
546
|
-
instruction metadata.
|
547
|
-
|
548
|
-
Args:
|
549
|
-
data: Instruction data set
|
550
|
-
|
551
|
-
Raises:
|
552
|
-
VisualizationError: When invalid instruction type is loaded.
|
553
|
-
|
554
|
-
Returns:
|
555
|
-
A data source to generate a drawing.
|
556
|
-
"""
|
557
|
-
inst = data.inst
|
558
|
-
|
559
|
-
meta: dict[str, Any] = {}
|
560
|
-
if isinstance(inst, instructions.Play):
|
561
|
-
# pulse
|
562
|
-
operand = inst.pulse
|
563
|
-
if isinstance(operand, pulse.SymbolicPulse):
|
564
|
-
# parametric pulse
|
565
|
-
params = operand.parameters
|
566
|
-
duration = params.pop("duration", None)
|
567
|
-
if isinstance(duration, circuit.Parameter):
|
568
|
-
duration = None
|
569
|
-
|
570
|
-
if isinstance(operand, library.SymbolicPulse):
|
571
|
-
pulse_shape = operand.pulse_type
|
572
|
-
else:
|
573
|
-
pulse_shape = "Waveform"
|
574
|
-
meta["waveform shape"] = pulse_shape
|
575
|
-
|
576
|
-
meta.update(
|
577
|
-
{
|
578
|
-
key: val.name if isinstance(val, circuit.Parameter) else val
|
579
|
-
for key, val in params.items()
|
580
|
-
}
|
581
|
-
)
|
582
|
-
if data.is_opaque:
|
583
|
-
# parametric pulse with unbound parameter
|
584
|
-
if duration:
|
585
|
-
meta.update(
|
586
|
-
{
|
587
|
-
"duration (cycle time)": inst.duration,
|
588
|
-
"duration (sec)": inst.duration * data.dt if data.dt else "N/A",
|
589
|
-
}
|
590
|
-
)
|
591
|
-
else:
|
592
|
-
meta.update({"duration (cycle time)": "N/A", "duration (sec)": "N/A"})
|
593
|
-
|
594
|
-
meta.update(
|
595
|
-
{
|
596
|
-
"t0 (cycle time)": data.t0,
|
597
|
-
"t0 (sec)": data.t0 * data.dt if data.dt else "N/A",
|
598
|
-
"phase": data.frame.phase,
|
599
|
-
"frequency": data.frame.freq,
|
600
|
-
"name": inst.name,
|
601
|
-
}
|
602
|
-
)
|
603
|
-
|
604
|
-
return types.OpaqueShape(duration=duration, meta=meta)
|
605
|
-
else:
|
606
|
-
# fixed shape parametric pulse
|
607
|
-
pulse_data = operand.get_waveform()
|
608
|
-
else:
|
609
|
-
# waveform
|
610
|
-
pulse_data = operand
|
611
|
-
xdata = np.arange(pulse_data.duration) + data.t0
|
612
|
-
ydata = pulse_data.samples
|
613
|
-
elif isinstance(inst, instructions.Delay):
|
614
|
-
# delay
|
615
|
-
xdata = np.arange(inst.duration) + data.t0
|
616
|
-
ydata = np.zeros(inst.duration)
|
617
|
-
elif isinstance(inst, instructions.Acquire):
|
618
|
-
# acquire
|
619
|
-
xdata = np.arange(inst.duration) + data.t0
|
620
|
-
ydata = np.ones(inst.duration)
|
621
|
-
acq_data = {
|
622
|
-
"memory slot": inst.mem_slot.name,
|
623
|
-
"register slot": inst.reg_slot.name if inst.reg_slot else "N/A",
|
624
|
-
"discriminator": inst.discriminator.name if inst.discriminator else "N/A",
|
625
|
-
"kernel": inst.kernel.name if inst.kernel else "N/A",
|
626
|
-
}
|
627
|
-
meta.update(acq_data)
|
628
|
-
else:
|
629
|
-
raise VisualizationError(
|
630
|
-
f"Unsupported instruction {inst.__class__.__name__} by " "filled envelope."
|
631
|
-
)
|
632
|
-
|
633
|
-
meta.update(
|
634
|
-
{
|
635
|
-
"duration (cycle time)": inst.duration,
|
636
|
-
"duration (sec)": inst.duration * data.dt if data.dt else "N/A",
|
637
|
-
"t0 (cycle time)": data.t0,
|
638
|
-
"t0 (sec)": data.t0 * data.dt if data.dt else "N/A",
|
639
|
-
"phase": data.frame.phase,
|
640
|
-
"frequency": data.frame.freq,
|
641
|
-
"name": inst.name,
|
642
|
-
}
|
643
|
-
)
|
644
|
-
|
645
|
-
return types.ParsedInstruction(xvals=xdata, yvals=ydata, meta=meta)
|