qiskit 1.4.1__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 +11 -0
- qiskit/circuit/quantumcircuit.py +890 -564
- qiskit/circuit/random/utils.py +12 -6
- qiskit/circuit/reset.py +5 -2
- qiskit/circuit/singleton.py +5 -11
- qiskit/circuit/store.py +0 -8
- qiskit/circuit/tools/pi_check.py +3 -0
- qiskit/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +6 -4
- qiskit/converters/circuit_to_dagdependency.py +0 -2
- qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
- qiskit/converters/circuit_to_gate.py +1 -1
- qiskit/converters/circuit_to_instruction.py +16 -29
- qiskit/converters/dag_to_circuit.py +7 -8
- qiskit/converters/dag_to_dagdependency.py +0 -1
- qiskit/converters/dag_to_dagdependency_v2.py +0 -1
- qiskit/converters/dagdependency_to_circuit.py +0 -6
- qiskit/converters/dagdependency_to_dag.py +0 -6
- qiskit/dagcircuit/collect_blocks.py +32 -20
- qiskit/dagcircuit/dagdependency.py +3 -37
- qiskit/dagcircuit/dagdependency_v2.py +5 -82
- qiskit/dagcircuit/dagnode.py +14 -2
- qiskit/passmanager/__init__.py +24 -6
- qiskit/passmanager/passmanager.py +26 -24
- qiskit/primitives/__init__.py +44 -35
- qiskit/primitives/backend_estimator_v2.py +102 -23
- qiskit/primitives/backend_sampler_v2.py +5 -20
- qiskit/primitives/base/__init__.py +4 -4
- qiskit/primitives/base/base_estimator.py +77 -82
- qiskit/primitives/base/base_primitive_job.py +2 -2
- qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
- qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
- qiskit/primitives/base/base_sampler.py +52 -60
- qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
- qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
- qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
- qiskit/primitives/containers/bindings_array.py +3 -1
- qiskit/primitives/containers/bit_array.py +23 -0
- qiskit/primitives/containers/data_bin.py +3 -1
- qiskit/primitives/containers/observables_array.py +19 -2
- qiskit/primitives/statevector_sampler.py +6 -8
- qiskit/primitives/utils.py +14 -189
- qiskit/providers/__init__.py +4 -130
- qiskit/providers/backend.py +11 -314
- qiskit/providers/basic_provider/__init__.py +3 -1
- qiskit/providers/basic_provider/basic_provider.py +29 -9
- qiskit/providers/basic_provider/basic_simulator.py +158 -298
- qiskit/providers/exceptions.py +0 -33
- qiskit/providers/fake_provider/__init__.py +0 -37
- qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
- qiskit/qasm2/__init__.py +21 -6
- qiskit/qasm2/export.py +2 -10
- qiskit/qasm2/parse.py +11 -25
- qiskit/qasm3/__init__.py +5 -1
- qiskit/qasm3/ast.py +44 -0
- qiskit/qasm3/exporter.py +65 -27
- qiskit/qasm3/printer.py +35 -4
- qiskit/qpy/__init__.py +162 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +96 -116
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +61 -388
- qiskit/qpy/binary_io/value.py +159 -33
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +29 -62
- qiskit/qpy/type_keys.py +58 -221
- qiskit/quantum_info/analysis/distance.py +3 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
- qiskit/quantum_info/operators/operator.py +6 -2
- qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
- qiskit/quantum_info/states/densitymatrix.py +16 -6
- qiskit/quantum_info/states/stabilizerstate.py +35 -4
- qiskit/quantum_info/states/statevector.py +16 -6
- qiskit/result/__init__.py +5 -17
- qiskit/result/models.py +18 -11
- qiskit/result/result.py +38 -134
- qiskit/result/sampled_expval.py +1 -2
- qiskit/result/utils.py +3 -4
- qiskit/synthesis/__init__.py +21 -1
- qiskit/synthesis/arithmetic/__init__.py +3 -1
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
- qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
- qiskit/synthesis/evolution/lie_trotter.py +10 -7
- qiskit/synthesis/evolution/product_formula.py +44 -35
- qiskit/synthesis/evolution/qdrift.py +17 -24
- qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
- qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
- qiskit/synthesis/two_qubit/__init__.py +1 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
- qiskit/transpiler/__init__.py +32 -232
- qiskit/transpiler/basepasses.py +20 -51
- qiskit/transpiler/layout.py +1 -1
- qiskit/transpiler/passes/__init__.py +4 -40
- qiskit/transpiler/passes/basis/basis_translator.py +5 -4
- qiskit/transpiler/passes/basis/decompose.py +1 -15
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
- qiskit/transpiler/passes/layout/apply_layout.py +4 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
- qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
- qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
- qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
- qiskit/transpiler/passes/optimization/__init__.py +2 -3
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
- qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
- qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +3 -2
- qiskit/transpiler/passes/routing/__init__.py +0 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
- qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
- qiskit/transpiler/passes/scheduling/__init__.py +1 -7
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
- qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
- qiskit/transpiler/passes/synthesis/plugin.py +4 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
- qiskit/transpiler/passes/utils/control_flow.py +2 -6
- qiskit/transpiler/passes/utils/gate_direction.py +7 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
- qiskit/transpiler/passmanager.py +13 -0
- qiskit/transpiler/passmanager_config.py +5 -81
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
- qiskit/transpiler/preset_passmanagers/common.py +140 -167
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
- qiskit/transpiler/preset_passmanagers/level0.py +2 -11
- qiskit/transpiler/preset_passmanagers/level1.py +2 -14
- qiskit/transpiler/preset_passmanagers/level2.py +2 -12
- qiskit/transpiler/preset_passmanagers/level3.py +2 -11
- qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
- qiskit/transpiler/target.py +78 -524
- qiskit/user_config.py +8 -4
- qiskit/utils/__init__.py +13 -12
- qiskit/utils/deprecation.py +4 -112
- qiskit/utils/optionals.py +11 -4
- qiskit/utils/parallel.py +214 -87
- qiskit/utils/units.py +4 -1
- qiskit/visualization/__init__.py +3 -7
- qiskit/visualization/array.py +4 -1
- qiskit/visualization/bloch.py +1 -1
- qiskit/visualization/circuit/_utils.py +19 -19
- qiskit/visualization/circuit/circuit_visualization.py +11 -4
- qiskit/visualization/circuit/matplotlib.py +13 -23
- qiskit/visualization/circuit/text.py +7 -3
- qiskit/visualization/counts_visualization.py +4 -0
- qiskit/visualization/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/library.py +4 -1
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +19 -2
- qiskit/visualization/timeline/core.py +19 -13
- qiskit/visualization/timeline/interface.py +19 -18
- qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
- qiskit/assembler/__init__.py +0 -42
- qiskit/assembler/assemble_circuits.py +0 -451
- qiskit/assembler/assemble_schedules.py +0 -367
- qiskit/assembler/disassemble.py +0 -310
- qiskit/assembler/run_config.py +0 -77
- qiskit/circuit/bit.py +0 -106
- qiskit/circuit/classicalfunction/__init__.py +0 -152
- qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
- qiskit/circuit/classicalfunction/classical_element.py +0 -54
- qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
- qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
- qiskit/circuit/classicalfunction/exceptions.py +0 -41
- qiskit/circuit/classicalfunction/types.py +0 -18
- qiskit/circuit/classicalfunction/utils.py +0 -91
- qiskit/circuit/classicalregister.py +0 -57
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
- qiskit/circuit/quantumregister.py +0 -75
- qiskit/circuit/register.py +0 -246
- qiskit/compiler/assembler.py +0 -689
- qiskit/compiler/scheduler.py +0 -109
- qiskit/compiler/sequencer.py +0 -71
- qiskit/primitives/backend_estimator.py +0 -486
- qiskit/primitives/backend_sampler.py +0 -222
- qiskit/primitives/estimator.py +0 -172
- qiskit/primitives/sampler.py +0 -162
- qiskit/providers/backend_compat.py +0 -507
- qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
- qiskit/providers/fake_provider/fake_1q.py +0 -91
- qiskit/providers/fake_provider/fake_backend.py +0 -165
- qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
- qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
- qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
- qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
- qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
- qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
- qiskit/providers/models/__init__.py +0 -89
- qiskit/providers/models/backendconfiguration.py +0 -1040
- qiskit/providers/models/backendproperties.py +0 -535
- qiskit/providers/models/backendstatus.py +0 -104
- qiskit/providers/models/jobstatus.py +0 -77
- qiskit/providers/models/pulsedefaults.py +0 -305
- qiskit/providers/provider.py +0 -95
- qiskit/pulse/__init__.py +0 -158
- qiskit/pulse/builder.py +0 -2262
- qiskit/pulse/calibration_entries.py +0 -381
- qiskit/pulse/channels.py +0 -227
- qiskit/pulse/configuration.py +0 -245
- qiskit/pulse/exceptions.py +0 -45
- qiskit/pulse/filters.py +0 -309
- qiskit/pulse/instruction_schedule_map.py +0 -424
- qiskit/pulse/instructions/__init__.py +0 -67
- qiskit/pulse/instructions/acquire.py +0 -150
- qiskit/pulse/instructions/delay.py +0 -71
- qiskit/pulse/instructions/directives.py +0 -154
- qiskit/pulse/instructions/frequency.py +0 -135
- qiskit/pulse/instructions/instruction.py +0 -270
- qiskit/pulse/instructions/phase.py +0 -152
- qiskit/pulse/instructions/play.py +0 -99
- qiskit/pulse/instructions/reference.py +0 -100
- qiskit/pulse/instructions/snapshot.py +0 -82
- qiskit/pulse/library/__init__.py +0 -97
- qiskit/pulse/library/continuous.py +0 -430
- qiskit/pulse/library/pulse.py +0 -148
- qiskit/pulse/library/samplers/__init__.py +0 -15
- qiskit/pulse/library/samplers/decorators.py +0 -295
- qiskit/pulse/library/samplers/strategies.py +0 -71
- qiskit/pulse/library/symbolic_pulses.py +0 -1989
- qiskit/pulse/library/waveform.py +0 -136
- qiskit/pulse/macros.py +0 -262
- qiskit/pulse/parameter_manager.py +0 -445
- qiskit/pulse/parser.py +0 -314
- qiskit/pulse/reference_manager.py +0 -58
- qiskit/pulse/schedule.py +0 -1854
- qiskit/pulse/transforms/__init__.py +0 -106
- qiskit/pulse/transforms/alignments.py +0 -406
- qiskit/pulse/transforms/base_transforms.py +0 -71
- qiskit/pulse/transforms/canonicalization.py +0 -498
- qiskit/pulse/transforms/dag.py +0 -122
- qiskit/pulse/utils.py +0 -149
- qiskit/qobj/__init__.py +0 -75
- qiskit/qobj/common.py +0 -81
- qiskit/qobj/converters/__init__.py +0 -18
- qiskit/qobj/converters/lo_config.py +0 -177
- qiskit/qobj/converters/pulse_instruction.py +0 -897
- qiskit/qobj/pulse_qobj.py +0 -709
- qiskit/qobj/qasm_qobj.py +0 -708
- qiskit/qobj/utils.py +0 -46
- qiskit/result/mitigation/base_readout_mitigator.py +0 -79
- qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
- qiskit/result/mitigation/local_readout_mitigator.py +0 -328
- qiskit/result/mitigation/utils.py +0 -217
- qiskit/scheduler/__init__.py +0 -40
- qiskit/scheduler/config.py +0 -37
- qiskit/scheduler/lowering.py +0 -187
- qiskit/scheduler/methods/__init__.py +0 -15
- qiskit/scheduler/methods/basic.py +0 -140
- qiskit/scheduler/schedule_circuit.py +0 -69
- qiskit/scheduler/sequence.py +0 -104
- qiskit/transpiler/passes/calibration/__init__.py +0 -17
- qiskit/transpiler/passes/calibration/base_builder.py +0 -79
- qiskit/transpiler/passes/calibration/builders.py +0 -20
- qiskit/transpiler/passes/calibration/exceptions.py +0 -22
- qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
- qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
- qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
- qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
- qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
- qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
- qiskit/transpiler/passes/scheduling/alap.py +0 -153
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
- qiskit/transpiler/passes/scheduling/asap.py +0 -175
- qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
- qiskit/utils/deprecate_pulse.py +0 -119
- qiskit/utils/multiprocessing.py +0 -56
- qiskit/visualization/pulse_v2/__init__.py +0 -21
- qiskit/visualization/pulse_v2/core.py +0 -901
- qiskit/visualization/pulse_v2/device_info.py +0 -173
- qiskit/visualization/pulse_v2/drawings.py +0 -253
- qiskit/visualization/pulse_v2/events.py +0 -254
- qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
- qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
- qiskit/visualization/pulse_v2/generators/chart.py +0 -208
- qiskit/visualization/pulse_v2/generators/frame.py +0 -436
- qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
- qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
- qiskit/visualization/pulse_v2/interface.py +0 -459
- qiskit/visualization/pulse_v2/layouts.py +0 -387
- qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
- qiskit/visualization/pulse_v2/stylesheet.py +0 -312
- qiskit/visualization/pulse_v2/types.py +0 -242
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -1,387 +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
|
-
"""
|
16
|
-
A collection of functions that decide the layout of an output image.
|
17
|
-
See :py:mod:`~qiskit.visualization.pulse_v2.types` for more info on the required data.
|
18
|
-
|
19
|
-
There are 3 types of layout functions in this module.
|
20
|
-
|
21
|
-
1. layout.chart_channel_map
|
22
|
-
|
23
|
-
An end-user can write arbitrary functions that output the custom channel ordering
|
24
|
-
associated with group name. Layout function in this module are called with the
|
25
|
-
`formatter` and `device` kwargs. These data provides stylesheet configuration
|
26
|
-
and backend system configuration.
|
27
|
-
|
28
|
-
The layout function is restricted to:
|
29
|
-
|
30
|
-
|
31
|
-
```python
|
32
|
-
def my_channel_layout(channels: List[pulse.channels.Channel],
|
33
|
-
formatter: Dict[str, Any],
|
34
|
-
device: DrawerBackendInfo
|
35
|
-
) -> Iterator[Tuple[str, List[pulse.channels.Channel]]]:
|
36
|
-
ordered_channels = []
|
37
|
-
# arrange order of channels
|
38
|
-
|
39
|
-
for key, channels in my_ordering_dict.items():
|
40
|
-
yield key, channels
|
41
|
-
```
|
42
|
-
|
43
|
-
2. layout.time_axis_map
|
44
|
-
|
45
|
-
An end-user can write arbitrary functions that output the `HorizontalAxis` data set that
|
46
|
-
will be later consumed by the plotter API to update the horizontal axis appearance.
|
47
|
-
Layout function in this module are called with the `time_window`, `axis_breaks`, and `dt` kwargs.
|
48
|
-
These data provides horizontal axis limit, axis break position, and time resolution, respectively.
|
49
|
-
|
50
|
-
See py:mod:`qiskit.visualization.pulse_v2.types` for more info on the required
|
51
|
-
data.
|
52
|
-
|
53
|
-
```python
|
54
|
-
def my_horizontal_axis(time_window: Tuple[int, int],
|
55
|
-
axis_breaks: List[Tuple[int, int]],
|
56
|
-
dt: Optional[float] = None) -> HorizontalAxis:
|
57
|
-
# write horizontal axis configuration
|
58
|
-
|
59
|
-
return horizontal_axis
|
60
|
-
```
|
61
|
-
|
62
|
-
3. layout.figure_title
|
63
|
-
|
64
|
-
An end-user can write arbitrary functions that output the string data that
|
65
|
-
will be later consumed by the plotter API to output the figure title.
|
66
|
-
Layout functions in this module are called with the `program` and `device` kwargs.
|
67
|
-
This data provides input program and backend system configurations.
|
68
|
-
|
69
|
-
```python
|
70
|
-
def my_figure_title(program: Union[pulse.Waveform, pulse.Schedule],
|
71
|
-
device: DrawerBackendInfo) -> str:
|
72
|
-
|
73
|
-
return 'title'
|
74
|
-
```
|
75
|
-
|
76
|
-
An arbitrary layout function satisfying the above format can be accepted.
|
77
|
-
"""
|
78
|
-
|
79
|
-
from collections import defaultdict
|
80
|
-
from typing import List, Dict, Any, Tuple, Iterator, Optional, Union
|
81
|
-
|
82
|
-
import numpy as np
|
83
|
-
from qiskit import pulse
|
84
|
-
from qiskit.visualization.pulse_v2 import types
|
85
|
-
from qiskit.visualization.pulse_v2.device_info import DrawerBackendInfo
|
86
|
-
|
87
|
-
|
88
|
-
def channel_type_grouped_sort(
|
89
|
-
channels: List[pulse.channels.Channel], formatter: Dict[str, Any], device: DrawerBackendInfo
|
90
|
-
) -> Iterator[Tuple[str, List[pulse.channels.Channel]]]:
|
91
|
-
"""Layout function for the channel assignment to the chart instance.
|
92
|
-
|
93
|
-
Assign single channel per chart. Channels are grouped by type and
|
94
|
-
sorted by index in ascending order.
|
95
|
-
|
96
|
-
Stylesheet key:
|
97
|
-
`chart_channel_map`
|
98
|
-
|
99
|
-
For example:
|
100
|
-
[D0, D2, C0, C2, M0, M2, A0, A2] -> [D0, D2, C0, C2, M0, M2, A0, A2]
|
101
|
-
|
102
|
-
Args:
|
103
|
-
channels: Channels to show.
|
104
|
-
formatter: Dictionary of stylesheet settings.
|
105
|
-
device: Backend configuration.
|
106
|
-
|
107
|
-
Yields:
|
108
|
-
Tuple of chart name and associated channels.
|
109
|
-
"""
|
110
|
-
chan_type_dict = defaultdict(list)
|
111
|
-
|
112
|
-
for chan in channels:
|
113
|
-
chan_type_dict[type(chan)].append(chan)
|
114
|
-
|
115
|
-
ordered_channels = []
|
116
|
-
|
117
|
-
# drive channels
|
118
|
-
d_chans = chan_type_dict.get(pulse.DriveChannel, [])
|
119
|
-
ordered_channels.extend(sorted(d_chans, key=lambda x: x.index))
|
120
|
-
|
121
|
-
# control channels
|
122
|
-
c_chans = chan_type_dict.get(pulse.ControlChannel, [])
|
123
|
-
ordered_channels.extend(sorted(c_chans, key=lambda x: x.index))
|
124
|
-
|
125
|
-
# measure channels
|
126
|
-
m_chans = chan_type_dict.get(pulse.MeasureChannel, [])
|
127
|
-
ordered_channels.extend(sorted(m_chans, key=lambda x: x.index))
|
128
|
-
|
129
|
-
# acquire channels
|
130
|
-
if formatter["control.show_acquire_channel"]:
|
131
|
-
a_chans = chan_type_dict.get(pulse.AcquireChannel, [])
|
132
|
-
ordered_channels.extend(sorted(a_chans, key=lambda x: x.index))
|
133
|
-
|
134
|
-
for chan in ordered_channels:
|
135
|
-
yield chan.name.upper(), [chan]
|
136
|
-
|
137
|
-
|
138
|
-
def channel_index_grouped_sort(
|
139
|
-
channels: List[pulse.channels.Channel], formatter: Dict[str, Any], device: DrawerBackendInfo
|
140
|
-
) -> Iterator[Tuple[str, List[pulse.channels.Channel]]]:
|
141
|
-
"""Layout function for the channel assignment to the chart instance.
|
142
|
-
|
143
|
-
Assign single channel per chart. Channels are grouped by the same index and
|
144
|
-
sorted by type.
|
145
|
-
|
146
|
-
Stylesheet key:
|
147
|
-
`chart_channel_map`
|
148
|
-
|
149
|
-
For example:
|
150
|
-
[D0, D2, C0, C2, M0, M2, A0, A2] -> [D0, D2, C0, C2, M0, M2, A0, A2]
|
151
|
-
|
152
|
-
Args:
|
153
|
-
channels: Channels to show.
|
154
|
-
formatter: Dictionary of stylesheet settings.
|
155
|
-
device: Backend configuration.
|
156
|
-
|
157
|
-
Yields:
|
158
|
-
Tuple of chart name and associated channels.
|
159
|
-
"""
|
160
|
-
chan_type_dict = defaultdict(list)
|
161
|
-
inds = set()
|
162
|
-
|
163
|
-
for chan in channels:
|
164
|
-
chan_type_dict[type(chan)].append(chan)
|
165
|
-
inds.add(chan.index)
|
166
|
-
|
167
|
-
d_chans = chan_type_dict.get(pulse.DriveChannel, [])
|
168
|
-
d_chans = sorted(d_chans, key=lambda x: x.index, reverse=True)
|
169
|
-
|
170
|
-
u_chans = chan_type_dict.get(pulse.ControlChannel, [])
|
171
|
-
u_chans = sorted(u_chans, key=lambda x: x.index, reverse=True)
|
172
|
-
|
173
|
-
m_chans = chan_type_dict.get(pulse.MeasureChannel, [])
|
174
|
-
m_chans = sorted(m_chans, key=lambda x: x.index, reverse=True)
|
175
|
-
|
176
|
-
a_chans = chan_type_dict.get(pulse.AcquireChannel, [])
|
177
|
-
a_chans = sorted(a_chans, key=lambda x: x.index, reverse=True)
|
178
|
-
|
179
|
-
ordered_channels = []
|
180
|
-
|
181
|
-
for ind in sorted(inds):
|
182
|
-
# drive channel
|
183
|
-
if len(d_chans) > 0 and d_chans[-1].index == ind:
|
184
|
-
ordered_channels.append(d_chans.pop())
|
185
|
-
# control channel
|
186
|
-
if len(u_chans) > 0 and u_chans[-1].index == ind:
|
187
|
-
ordered_channels.append(u_chans.pop())
|
188
|
-
# measure channel
|
189
|
-
if len(m_chans) > 0 and m_chans[-1].index == ind:
|
190
|
-
ordered_channels.append(m_chans.pop())
|
191
|
-
# acquire channel
|
192
|
-
if formatter["control.show_acquire_channel"]:
|
193
|
-
if len(a_chans) > 0 and a_chans[-1].index == ind:
|
194
|
-
ordered_channels.append(a_chans.pop())
|
195
|
-
|
196
|
-
for chan in ordered_channels:
|
197
|
-
yield chan.name.upper(), [chan]
|
198
|
-
|
199
|
-
|
200
|
-
def channel_index_grouped_sort_u(
|
201
|
-
channels: List[pulse.channels.Channel], formatter: Dict[str, Any], device: DrawerBackendInfo
|
202
|
-
) -> Iterator[Tuple[str, List[pulse.channels.Channel]]]:
|
203
|
-
"""Layout function for the channel assignment to the chart instance.
|
204
|
-
|
205
|
-
Assign single channel per chart. Channels are grouped by the same index and
|
206
|
-
sorted by type except for control channels. Control channels are added to the
|
207
|
-
end of other channels.
|
208
|
-
|
209
|
-
Stylesheet key:
|
210
|
-
`chart_channel_map`
|
211
|
-
|
212
|
-
For example:
|
213
|
-
[D0, D2, C0, C2, M0, M2, A0, A2] -> [D0, D2, C0, C2, M0, M2, A0, A2]
|
214
|
-
|
215
|
-
Args:
|
216
|
-
channels: Channels to show.
|
217
|
-
formatter: Dictionary of stylesheet settings.
|
218
|
-
device: Backend configuration.
|
219
|
-
|
220
|
-
Yields:
|
221
|
-
Tuple of chart name and associated channels.
|
222
|
-
"""
|
223
|
-
chan_type_dict = defaultdict(list)
|
224
|
-
inds = set()
|
225
|
-
|
226
|
-
for chan in channels:
|
227
|
-
chan_type_dict[type(chan)].append(chan)
|
228
|
-
inds.add(chan.index)
|
229
|
-
|
230
|
-
d_chans = chan_type_dict.get(pulse.DriveChannel, [])
|
231
|
-
d_chans = sorted(d_chans, key=lambda x: x.index, reverse=True)
|
232
|
-
|
233
|
-
m_chans = chan_type_dict.get(pulse.MeasureChannel, [])
|
234
|
-
m_chans = sorted(m_chans, key=lambda x: x.index, reverse=True)
|
235
|
-
|
236
|
-
a_chans = chan_type_dict.get(pulse.AcquireChannel, [])
|
237
|
-
a_chans = sorted(a_chans, key=lambda x: x.index, reverse=True)
|
238
|
-
|
239
|
-
u_chans = chan_type_dict.get(pulse.ControlChannel, [])
|
240
|
-
u_chans = sorted(u_chans, key=lambda x: x.index)
|
241
|
-
|
242
|
-
ordered_channels = []
|
243
|
-
|
244
|
-
for ind in sorted(inds):
|
245
|
-
# drive channel
|
246
|
-
if len(d_chans) > 0 and d_chans[-1].index == ind:
|
247
|
-
ordered_channels.append(d_chans.pop())
|
248
|
-
# measure channel
|
249
|
-
if len(m_chans) > 0 and m_chans[-1].index == ind:
|
250
|
-
ordered_channels.append(m_chans.pop())
|
251
|
-
# acquire channel
|
252
|
-
if formatter["control.show_acquire_channel"]:
|
253
|
-
if len(a_chans) > 0 and a_chans[-1].index == ind:
|
254
|
-
ordered_channels.append(a_chans.pop())
|
255
|
-
|
256
|
-
# control channels
|
257
|
-
ordered_channels.extend(u_chans)
|
258
|
-
|
259
|
-
for chan in ordered_channels:
|
260
|
-
yield chan.name.upper(), [chan]
|
261
|
-
|
262
|
-
|
263
|
-
def qubit_index_sort(
|
264
|
-
channels: List[pulse.channels.Channel], formatter: Dict[str, Any], device: DrawerBackendInfo
|
265
|
-
) -> Iterator[Tuple[str, List[pulse.channels.Channel]]]:
|
266
|
-
"""Layout function for the channel assignment to the chart instance.
|
267
|
-
|
268
|
-
Assign multiple channels per chart. Channels associated with the same qubit
|
269
|
-
are grouped in the same chart and sorted by qubit index in ascending order.
|
270
|
-
|
271
|
-
Acquire channels are not shown.
|
272
|
-
|
273
|
-
Stylesheet key:
|
274
|
-
`chart_channel_map`
|
275
|
-
|
276
|
-
For example:
|
277
|
-
[D0, D2, C0, C2, M0, M2, A0, A2] -> [Q0, Q1, Q2]
|
278
|
-
|
279
|
-
Args:
|
280
|
-
channels: Channels to show.
|
281
|
-
formatter: Dictionary of stylesheet settings.
|
282
|
-
device: Backend configuration.
|
283
|
-
|
284
|
-
Yields:
|
285
|
-
Tuple of chart name and associated channels.
|
286
|
-
"""
|
287
|
-
_removed = (
|
288
|
-
pulse.channels.AcquireChannel,
|
289
|
-
pulse.channels.MemorySlot,
|
290
|
-
pulse.channels.RegisterSlot,
|
291
|
-
)
|
292
|
-
|
293
|
-
qubit_channel_map = defaultdict(list)
|
294
|
-
|
295
|
-
for chan in channels:
|
296
|
-
if isinstance(chan, _removed):
|
297
|
-
continue
|
298
|
-
qubit_channel_map[device.get_qubit_index(chan)].append(chan)
|
299
|
-
|
300
|
-
sorted_map = sorted(qubit_channel_map.items(), key=lambda x: x[0])
|
301
|
-
|
302
|
-
for qind, chans in sorted_map:
|
303
|
-
yield f"Q{qind:d}", chans
|
304
|
-
|
305
|
-
|
306
|
-
def time_map_in_ns(
|
307
|
-
time_window: Tuple[int, int], axis_breaks: List[Tuple[int, int]], dt: Optional[float] = None
|
308
|
-
) -> types.HorizontalAxis:
|
309
|
-
"""Layout function for the horizontal axis formatting.
|
310
|
-
|
311
|
-
Calculate axis break and map true time to axis labels. Generate equispaced
|
312
|
-
6 horizontal axis ticks. Convert into seconds if ``dt`` is provided.
|
313
|
-
|
314
|
-
Args:
|
315
|
-
time_window: Left and right edge of this graph.
|
316
|
-
axis_breaks: List of axis break period.
|
317
|
-
dt: Time resolution of system.
|
318
|
-
|
319
|
-
Returns:
|
320
|
-
Axis formatter object.
|
321
|
-
"""
|
322
|
-
# shift time axis
|
323
|
-
t0, t1 = time_window
|
324
|
-
t0_shift = t0
|
325
|
-
t1_shift = t1
|
326
|
-
|
327
|
-
axis_break_pos = []
|
328
|
-
offset_accumulation = 0
|
329
|
-
for t0b, t1b in axis_breaks:
|
330
|
-
if t1b < t0 or t0b > t1:
|
331
|
-
continue
|
332
|
-
if t0 > t1b:
|
333
|
-
t0_shift -= t1b - t0b
|
334
|
-
if t1 > t1b:
|
335
|
-
t1_shift -= t1b - t0b
|
336
|
-
axis_break_pos.append(t0b - offset_accumulation)
|
337
|
-
offset_accumulation += t1b - t0b
|
338
|
-
|
339
|
-
# axis label
|
340
|
-
axis_loc = np.linspace(max(t0_shift, 0), t1_shift, 6)
|
341
|
-
axis_label = axis_loc.copy()
|
342
|
-
|
343
|
-
for t0b, t1b in axis_breaks:
|
344
|
-
offset = t1b - t0b
|
345
|
-
axis_label = np.where(axis_label > t0b, axis_label + offset, axis_label)
|
346
|
-
|
347
|
-
# consider time resolution
|
348
|
-
if dt:
|
349
|
-
label = "Time (ns)"
|
350
|
-
axis_label *= dt * 1e9
|
351
|
-
else:
|
352
|
-
label = "System cycle time (dt)"
|
353
|
-
|
354
|
-
formatted_label = [f"{val:.0f}" for val in axis_label]
|
355
|
-
|
356
|
-
return types.HorizontalAxis(
|
357
|
-
window=(t0_shift, t1_shift),
|
358
|
-
axis_map=dict(zip(axis_loc, formatted_label)),
|
359
|
-
axis_break_pos=axis_break_pos,
|
360
|
-
label=label,
|
361
|
-
)
|
362
|
-
|
363
|
-
|
364
|
-
def detail_title(program: Union[pulse.Waveform, pulse.Schedule], device: DrawerBackendInfo) -> str:
|
365
|
-
"""Layout function for generating figure title.
|
366
|
-
|
367
|
-
This layout writes program name, program duration, and backend name in the title.
|
368
|
-
"""
|
369
|
-
title_str = []
|
370
|
-
|
371
|
-
# add program name
|
372
|
-
title_str.append(f"Name: {program.name}")
|
373
|
-
|
374
|
-
# add program duration
|
375
|
-
dt = device.dt * 1e9 if device.dt else 1.0
|
376
|
-
title_str.append(f"Duration: {program.duration * dt:.1f} {'ns' if device.dt else 'dt'}")
|
377
|
-
|
378
|
-
# add device name
|
379
|
-
if device.backend_name != "no-backend":
|
380
|
-
title_str.append(f"Backend: {device.backend_name}")
|
381
|
-
|
382
|
-
return ", ".join(title_str)
|
383
|
-
|
384
|
-
|
385
|
-
def empty_title(program: Union[pulse.Waveform, pulse.Schedule], device: DrawerBackendInfo) -> str:
|
386
|
-
"""Layout function for generating an empty figure title."""
|
387
|
-
return ""
|
@@ -1,17 +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
|
-
"""
|
14
|
-
Plotter API for pulse drawer.
|
15
|
-
"""
|
16
|
-
|
17
|
-
from qiskit.visualization.pulse_v2.plotters.matplotlib import Mpl2DPlotter
|
@@ -1,53 +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
|
-
"""Base plotter API."""
|
14
|
-
|
15
|
-
from abc import ABC, abstractmethod
|
16
|
-
from typing import Any
|
17
|
-
|
18
|
-
from qiskit.visualization.pulse_v2 import core
|
19
|
-
|
20
|
-
|
21
|
-
class BasePlotter(ABC):
|
22
|
-
"""Base class of Qiskit plotter."""
|
23
|
-
|
24
|
-
def __init__(self, canvas: core.DrawerCanvas):
|
25
|
-
"""Create new plotter.
|
26
|
-
|
27
|
-
Args:
|
28
|
-
canvas: Configured drawer canvas object.
|
29
|
-
"""
|
30
|
-
self.canvas = canvas
|
31
|
-
|
32
|
-
@abstractmethod
|
33
|
-
def initialize_canvas(self):
|
34
|
-
"""Format appearance of the canvas."""
|
35
|
-
raise NotImplementedError
|
36
|
-
|
37
|
-
@abstractmethod
|
38
|
-
def draw(self):
|
39
|
-
"""Output drawing objects stored in canvas object."""
|
40
|
-
raise NotImplementedError
|
41
|
-
|
42
|
-
@abstractmethod
|
43
|
-
def get_image(self, interactive: bool = False) -> Any:
|
44
|
-
"""Get image data to return.
|
45
|
-
|
46
|
-
Args:
|
47
|
-
interactive: When set `True` show the circuit in a new window.
|
48
|
-
This depends on the matplotlib backend being used supporting this.
|
49
|
-
|
50
|
-
Returns:
|
51
|
-
Image data. This depends on the plotter API.
|
52
|
-
"""
|
53
|
-
raise NotImplementedError
|
@@ -1,201 +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
|
-
"""Matplotlib plotter API."""
|
14
|
-
|
15
|
-
from typing import Optional
|
16
|
-
|
17
|
-
import matplotlib
|
18
|
-
import matplotlib.pyplot as plt
|
19
|
-
import numpy as np
|
20
|
-
from matplotlib.patches import Rectangle
|
21
|
-
|
22
|
-
from qiskit.visualization.exceptions import VisualizationError
|
23
|
-
from qiskit.visualization.pulse_v2 import core, drawings, types
|
24
|
-
from qiskit.visualization.pulse_v2.plotters.base_plotter import BasePlotter
|
25
|
-
from qiskit.visualization.utils import matplotlib_close_if_inline
|
26
|
-
|
27
|
-
|
28
|
-
class Mpl2DPlotter(BasePlotter):
|
29
|
-
"""Matplotlib API for pulse drawer.
|
30
|
-
|
31
|
-
This plotter places canvas charts along y axis of 2D canvas with vertical offset.
|
32
|
-
Each chart is map to X-Y axis of the canvas.
|
33
|
-
"""
|
34
|
-
|
35
|
-
def __init__(self, canvas: core.DrawerCanvas, axis: Optional[plt.Axes] = None):
|
36
|
-
"""Create new plotter.
|
37
|
-
|
38
|
-
Args:
|
39
|
-
canvas: Configured drawer canvas object. Canvas object should be updated
|
40
|
-
with `.update` method before set to the plotter API.
|
41
|
-
axis: Matplotlib axis object. When `axis` is provided, the plotter updates
|
42
|
-
given axis instead of creating and returning new matplotlib figure.
|
43
|
-
"""
|
44
|
-
super().__init__(canvas=canvas)
|
45
|
-
|
46
|
-
# calculate height of all charts
|
47
|
-
canvas_height = 0
|
48
|
-
for chart in self.canvas.charts:
|
49
|
-
if not chart.is_active and not self.canvas.formatter["control.show_empty_channel"]:
|
50
|
-
continue
|
51
|
-
canvas_height += chart.vmax - chart.vmin
|
52
|
-
# set min canvas_height size
|
53
|
-
canvas_height = max(canvas_height, 0.1)
|
54
|
-
|
55
|
-
if axis is None:
|
56
|
-
fig_h = canvas_height * self.canvas.formatter["general.fig_chart_height"]
|
57
|
-
fig_w = self.canvas.formatter["general.fig_width"]
|
58
|
-
|
59
|
-
self.figure = plt.figure(figsize=(fig_w, fig_h))
|
60
|
-
self.ax = self.figure.add_subplot(1, 1, 1)
|
61
|
-
else:
|
62
|
-
self.figure = axis.figure
|
63
|
-
self.ax = axis
|
64
|
-
|
65
|
-
self.initialize_canvas()
|
66
|
-
|
67
|
-
def initialize_canvas(self):
|
68
|
-
"""Format appearance of matplotlib canvas."""
|
69
|
-
self.ax.set_facecolor(self.canvas.formatter["color.background"])
|
70
|
-
|
71
|
-
# axis labels
|
72
|
-
self.ax.set_yticklabels([])
|
73
|
-
self.ax.yaxis.set_tick_params(left=False)
|
74
|
-
|
75
|
-
def draw(self):
|
76
|
-
"""Output drawings stored in canvas object."""
|
77
|
-
# axis configuration
|
78
|
-
axis_config = self.canvas.layout["time_axis_map"](
|
79
|
-
time_window=self.canvas.time_range,
|
80
|
-
axis_breaks=self.canvas.time_breaks,
|
81
|
-
dt=self.canvas.device.dt,
|
82
|
-
)
|
83
|
-
|
84
|
-
current_y = 0
|
85
|
-
margin_y = self.canvas.formatter["margin.between_channel"]
|
86
|
-
for chart in self.canvas.charts:
|
87
|
-
if not chart.is_active and not self.canvas.formatter["control.show_empty_channel"]:
|
88
|
-
continue
|
89
|
-
current_y -= chart.vmax
|
90
|
-
for _, data in chart.collections:
|
91
|
-
# calculate scaling factor
|
92
|
-
if not data.ignore_scaling:
|
93
|
-
# product of channel-wise scaling and chart level scaling
|
94
|
-
scale = max(self.canvas.chan_scales.get(chan, 1.0) for chan in data.channels)
|
95
|
-
scale *= chart.scale
|
96
|
-
else:
|
97
|
-
scale = 1.0
|
98
|
-
|
99
|
-
x = data.xvals
|
100
|
-
y = scale * data.yvals + current_y
|
101
|
-
|
102
|
-
if isinstance(data, drawings.LineData):
|
103
|
-
# line object
|
104
|
-
if data.fill:
|
105
|
-
self.ax.fill_between(x, y1=y, y2=current_y * np.ones_like(y), **data.styles)
|
106
|
-
else:
|
107
|
-
self.ax.plot(x, y, **data.styles)
|
108
|
-
elif isinstance(data, drawings.TextData):
|
109
|
-
# text object
|
110
|
-
text = rf"${data.latex}$" if data.latex else data.text
|
111
|
-
# replace dynamic text
|
112
|
-
text = text.replace(types.DynamicString.SCALE, f"{chart.scale:.1f}")
|
113
|
-
self.ax.text(x=x[0], y=y[0], s=text, **data.styles)
|
114
|
-
elif isinstance(data, drawings.BoxData):
|
115
|
-
xy = x[0], y[0]
|
116
|
-
box = Rectangle(
|
117
|
-
xy, width=x[1] - x[0], height=y[1] - y[0], fill=True, **data.styles
|
118
|
-
)
|
119
|
-
self.ax.add_patch(box)
|
120
|
-
else:
|
121
|
-
raise VisualizationError(
|
122
|
-
f"Data {data} is not supported " f"by {self.__class__.__name__}"
|
123
|
-
)
|
124
|
-
# axis break
|
125
|
-
for pos in axis_config.axis_break_pos:
|
126
|
-
self.ax.text(
|
127
|
-
x=pos,
|
128
|
-
y=current_y,
|
129
|
-
s="//",
|
130
|
-
ha="center",
|
131
|
-
va="center",
|
132
|
-
zorder=self.canvas.formatter["layer.axis_label"],
|
133
|
-
fontsize=self.canvas.formatter["text_size.axis_break_symbol"],
|
134
|
-
rotation=180,
|
135
|
-
)
|
136
|
-
|
137
|
-
# shift chart position
|
138
|
-
current_y += chart.vmin - margin_y
|
139
|
-
|
140
|
-
# remove the last margin
|
141
|
-
current_y += margin_y
|
142
|
-
|
143
|
-
y_max = self.canvas.formatter["margin.top"]
|
144
|
-
y_min = current_y - self.canvas.formatter["margin.bottom"]
|
145
|
-
|
146
|
-
# plot axis break line
|
147
|
-
for pos in axis_config.axis_break_pos:
|
148
|
-
self.ax.plot(
|
149
|
-
[pos, pos],
|
150
|
-
[y_min, y_max],
|
151
|
-
zorder=self.canvas.formatter["layer.fill_waveform"] + 1,
|
152
|
-
linewidth=self.canvas.formatter["line_width.axis_break"],
|
153
|
-
color=self.canvas.formatter["color.background"],
|
154
|
-
)
|
155
|
-
|
156
|
-
# label
|
157
|
-
self.ax.set_xticks(list(axis_config.axis_map.keys()))
|
158
|
-
self.ax.set_xticklabels(
|
159
|
-
list(axis_config.axis_map.values()),
|
160
|
-
fontsize=self.canvas.formatter["text_size.axis_label"],
|
161
|
-
)
|
162
|
-
self.ax.set_xlabel(
|
163
|
-
axis_config.label, fontsize=self.canvas.formatter["text_size.axis_label"]
|
164
|
-
)
|
165
|
-
|
166
|
-
# boundary
|
167
|
-
if axis_config.window == (0, 0):
|
168
|
-
self.ax.set_xlim(0, 1)
|
169
|
-
else:
|
170
|
-
self.ax.set_xlim(*axis_config.window)
|
171
|
-
self.ax.set_ylim(y_min, y_max)
|
172
|
-
|
173
|
-
# title
|
174
|
-
if self.canvas.fig_title:
|
175
|
-
self.ax.text(
|
176
|
-
x=axis_config.window[0],
|
177
|
-
y=y_max,
|
178
|
-
s=self.canvas.fig_title,
|
179
|
-
ha="left",
|
180
|
-
va="bottom",
|
181
|
-
zorder=self.canvas.formatter["layer.fig_title"],
|
182
|
-
color=self.canvas.formatter["color.fig_title"],
|
183
|
-
size=self.canvas.formatter["text_size.fig_title"],
|
184
|
-
)
|
185
|
-
|
186
|
-
def get_image(self, interactive: bool = False) -> matplotlib.pyplot.Figure:
|
187
|
-
"""Get image data to return.
|
188
|
-
|
189
|
-
Args:
|
190
|
-
interactive: When set `True` show the circuit in a new window.
|
191
|
-
This depends on the matplotlib backend being used supporting this.
|
192
|
-
|
193
|
-
Returns:
|
194
|
-
Matplotlib figure data.
|
195
|
-
"""
|
196
|
-
matplotlib_close_if_inline(self.figure)
|
197
|
-
|
198
|
-
if self.figure and interactive:
|
199
|
-
self.figure.show()
|
200
|
-
|
201
|
-
return self.figure
|