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
@@ -10,11 +10,15 @@
|
|
10
10
|
# copyright notice, and modified files need to carry a notice indicating
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
|
-
"""Read
|
13
|
+
"""Read schedule and schedule instructions.
|
14
|
+
|
15
|
+
This module is kept post pulse-removal to allow reading legacy
|
16
|
+
payloads containing pulse gates without breaking the load flow.
|
17
|
+
The purpose of the `_read` and `_load` methods below is just to advance
|
18
|
+
the file handle while consuming pulse data."""
|
14
19
|
import json
|
15
20
|
import struct
|
16
21
|
import zlib
|
17
|
-
import warnings
|
18
22
|
|
19
23
|
from io import BytesIO
|
20
24
|
|
@@ -22,25 +26,17 @@ import numpy as np
|
|
22
26
|
import symengine as sym
|
23
27
|
|
24
28
|
from qiskit.exceptions import QiskitError
|
25
|
-
from qiskit.pulse import library, channels, instructions
|
26
|
-
from qiskit.pulse.schedule import ScheduleBlock
|
27
29
|
from qiskit.qpy import formats, common, type_keys
|
28
30
|
from qiskit.qpy.binary_io import value
|
29
31
|
from qiskit.qpy.exceptions import QpyError
|
30
|
-
from qiskit.pulse.configuration import Kernel, Discriminator
|
31
|
-
from qiskit.utils.deprecate_pulse import ignore_pulse_deprecation_warnings
|
32
|
-
|
33
|
-
|
34
|
-
def _read_channel(file_obj, version):
|
35
|
-
type_key = common.read_type_key(file_obj)
|
36
|
-
index = value.read_value(file_obj, version, {})
|
37
32
|
|
38
|
-
channel_cls = type_keys.ScheduleChannel.retrieve(type_key)
|
39
33
|
|
40
|
-
|
34
|
+
def _read_channel(file_obj, version) -> None:
|
35
|
+
common.read_type_key(file_obj) # read type_key
|
36
|
+
value.read_value(file_obj, version, {}) # read index
|
41
37
|
|
42
38
|
|
43
|
-
def _read_waveform(file_obj, version):
|
39
|
+
def _read_waveform(file_obj, version) -> None:
|
44
40
|
header = formats.WAVEFORM._make(
|
45
41
|
struct.unpack(
|
46
42
|
formats.WAVEFORM_PACK,
|
@@ -48,15 +44,8 @@ def _read_waveform(file_obj, version):
|
|
48
44
|
)
|
49
45
|
)
|
50
46
|
samples_raw = file_obj.read(header.data_size)
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
return library.Waveform(
|
55
|
-
samples=samples,
|
56
|
-
name=name,
|
57
|
-
epsilon=header.epsilon,
|
58
|
-
limit_amplitude=header.amp_limited,
|
59
|
-
)
|
47
|
+
common.data_from_binary(samples_raw, np.load) # read samples
|
48
|
+
value.read_value(file_obj, version, {}) # read name
|
60
49
|
|
61
50
|
|
62
51
|
def _loads_obj(type_key, binary_data, version, vectors):
|
@@ -77,29 +66,28 @@ def _loads_obj(type_key, binary_data, version, vectors):
|
|
77
66
|
return value.loads_value(type_key, binary_data, version, vectors)
|
78
67
|
|
79
68
|
|
80
|
-
def _read_kernel(file_obj, version):
|
81
|
-
|
69
|
+
def _read_kernel(file_obj, version) -> None:
|
70
|
+
common.read_mapping(
|
82
71
|
file_obj=file_obj,
|
83
72
|
deserializer=_loads_obj,
|
84
73
|
version=version,
|
85
74
|
vectors={},
|
86
75
|
)
|
87
|
-
|
88
|
-
return Kernel(name=name, **params)
|
76
|
+
value.read_value(file_obj, version, {}) # read name
|
89
77
|
|
90
78
|
|
91
|
-
def _read_discriminator(file_obj, version):
|
92
|
-
|
79
|
+
def _read_discriminator(file_obj, version) -> None:
|
80
|
+
# read params
|
81
|
+
common.read_mapping(
|
93
82
|
file_obj=file_obj,
|
94
83
|
deserializer=_loads_obj,
|
95
84
|
version=version,
|
96
85
|
vectors={},
|
97
86
|
)
|
98
|
-
|
99
|
-
return Discriminator(name=name, **params)
|
87
|
+
value.read_value(file_obj, version, {}) # read name
|
100
88
|
|
101
89
|
|
102
|
-
def _loads_symbolic_expr(expr_bytes, use_symengine=False
|
90
|
+
def _loads_symbolic_expr(expr_bytes, use_symengine=False):
|
103
91
|
if expr_bytes == b"":
|
104
92
|
return None
|
105
93
|
expr_bytes = zlib.decompress(expr_bytes)
|
@@ -108,18 +96,12 @@ def _loads_symbolic_expr(expr_bytes, use_symengine=False, trust_input=False):
|
|
108
96
|
else:
|
109
97
|
from sympy import parse_expr
|
110
98
|
|
111
|
-
if not trust_input:
|
112
|
-
raise QpyError(
|
113
|
-
"This payload can not be loaded unless you set ``trust_payload`` to "
|
114
|
-
"True, as it's using sympy for serialization of symbolic expressions which "
|
115
|
-
"is insecure."
|
116
|
-
)
|
117
99
|
expr_txt = expr_bytes.decode(common.ENCODE)
|
118
100
|
expr = parse_expr(expr_txt)
|
119
101
|
return sym.sympify(expr)
|
120
102
|
|
121
103
|
|
122
|
-
def _read_symbolic_pulse(file_obj, version
|
104
|
+
def _read_symbolic_pulse(file_obj, version) -> None:
|
123
105
|
make = formats.SYMBOLIC_PULSE._make
|
124
106
|
pack = formats.SYMBOLIC_PULSE_PACK
|
125
107
|
size = formats.SYMBOLIC_PULSE_SIZE
|
@@ -131,14 +113,13 @@ def _read_symbolic_pulse(file_obj, version, trust_input=False):
|
|
131
113
|
)
|
132
114
|
)
|
133
115
|
pulse_type = file_obj.read(header.type_size).decode(common.ENCODE)
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
parameters = common.read_mapping(
|
116
|
+
_loads_symbolic_expr(file_obj.read(header.envelope_size)) # read envelope
|
117
|
+
_loads_symbolic_expr(file_obj.read(header.constraints_size)) # read constraints
|
118
|
+
_loads_symbolic_expr(
|
119
|
+
file_obj.read(header.valid_amp_conditions_size)
|
120
|
+
) # read valid amp conditions
|
121
|
+
# read parameters
|
122
|
+
common.read_mapping(
|
142
123
|
file_obj,
|
143
124
|
deserializer=value.loads_value,
|
144
125
|
version=version,
|
@@ -156,50 +137,16 @@ def _read_symbolic_pulse(file_obj, version, trust_input=False):
|
|
156
137
|
class_name = "SymbolicPulse" # Default class name, if not in the library
|
157
138
|
|
158
139
|
if pulse_type in legacy_library_pulses:
|
159
|
-
parameters["angle"] = np.angle(parameters["amp"])
|
160
|
-
parameters["amp"] = np.abs(parameters["amp"])
|
161
|
-
_amp, _angle = sym.symbols("amp, angle")
|
162
|
-
envelope = envelope.subs(_amp, _amp * sym.exp(sym.I * _angle))
|
163
|
-
|
164
|
-
warnings.warn(
|
165
|
-
f"Library pulses with complex amp are no longer supported. "
|
166
|
-
f"{pulse_type} with complex amp was converted to (amp,angle) representation.",
|
167
|
-
UserWarning,
|
168
|
-
)
|
169
140
|
class_name = "ScalableSymbolicPulse"
|
170
141
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
if class_name
|
175
|
-
return library.SymbolicPulse(
|
176
|
-
pulse_type=pulse_type,
|
177
|
-
duration=duration,
|
178
|
-
parameters=parameters,
|
179
|
-
name=name,
|
180
|
-
limit_amplitude=header.amp_limited,
|
181
|
-
envelope=envelope,
|
182
|
-
constraints=constraints,
|
183
|
-
valid_amp_conditions=valid_amp_conditions,
|
184
|
-
)
|
185
|
-
elif class_name == "ScalableSymbolicPulse":
|
186
|
-
return library.ScalableSymbolicPulse(
|
187
|
-
pulse_type=pulse_type,
|
188
|
-
duration=duration,
|
189
|
-
amp=parameters["amp"],
|
190
|
-
angle=parameters["angle"],
|
191
|
-
parameters=parameters,
|
192
|
-
name=name,
|
193
|
-
limit_amplitude=header.amp_limited,
|
194
|
-
envelope=envelope,
|
195
|
-
constraints=constraints,
|
196
|
-
valid_amp_conditions=valid_amp_conditions,
|
197
|
-
)
|
198
|
-
else:
|
142
|
+
value.read_value(file_obj, version, {}) # read duration
|
143
|
+
value.read_value(file_obj, version, {}) # read name
|
144
|
+
|
145
|
+
if class_name not in {"SymbolicPulse", "ScalableSymbolicPulse"}:
|
199
146
|
raise NotImplementedError(f"Unknown class '{class_name}'")
|
200
147
|
|
201
148
|
|
202
|
-
def _read_symbolic_pulse_v6(file_obj, version, use_symengine
|
149
|
+
def _read_symbolic_pulse_v6(file_obj, version, use_symengine) -> None:
|
203
150
|
make = formats.SYMBOLIC_PULSE_V2._make
|
204
151
|
pack = formats.SYMBOLIC_PULSE_PACK_V2
|
205
152
|
size = formats.SYMBOLIC_PULSE_SIZE_V2
|
@@ -211,101 +158,48 @@ def _read_symbolic_pulse_v6(file_obj, version, use_symengine, trust_input=False)
|
|
211
158
|
)
|
212
159
|
)
|
213
160
|
class_name = file_obj.read(header.class_name_size).decode(common.ENCODE)
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
file_obj.read(header.valid_amp_conditions_size), use_symengine, trust_input=trust_input
|
223
|
-
)
|
224
|
-
parameters = common.read_mapping(
|
161
|
+
file_obj.read(header.type_size).decode(common.ENCODE) # read pulse type
|
162
|
+
_loads_symbolic_expr(file_obj.read(header.envelope_size), use_symengine) # read envelope
|
163
|
+
_loads_symbolic_expr(file_obj.read(header.constraints_size), use_symengine) # read constraints
|
164
|
+
_loads_symbolic_expr(
|
165
|
+
file_obj.read(header.valid_amp_conditions_size), use_symengine
|
166
|
+
) # read valid_amp_conditions
|
167
|
+
# read parameters
|
168
|
+
common.read_mapping(
|
225
169
|
file_obj,
|
226
170
|
deserializer=value.loads_value,
|
227
171
|
version=version,
|
228
172
|
vectors={},
|
229
173
|
)
|
230
174
|
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
if class_name == "SymbolicPulse":
|
235
|
-
return library.SymbolicPulse(
|
236
|
-
pulse_type=pulse_type,
|
237
|
-
duration=duration,
|
238
|
-
parameters=parameters,
|
239
|
-
name=name,
|
240
|
-
limit_amplitude=header.amp_limited,
|
241
|
-
envelope=envelope,
|
242
|
-
constraints=constraints,
|
243
|
-
valid_amp_conditions=valid_amp_conditions,
|
244
|
-
)
|
245
|
-
elif class_name == "ScalableSymbolicPulse":
|
246
|
-
# Between Qiskit 0.40 and 0.46, the (amp, angle) representation was present,
|
247
|
-
# but complex amp was still allowed. In Qiskit 1.0 and beyond complex amp
|
248
|
-
# is no longer supported and so the amp needs to be checked and converted.
|
249
|
-
# Once QPY version is bumped, a new reader function can be introduced without
|
250
|
-
# this check.
|
251
|
-
if isinstance(parameters["amp"], complex):
|
252
|
-
parameters["angle"] = np.angle(parameters["amp"])
|
253
|
-
parameters["amp"] = np.abs(parameters["amp"])
|
254
|
-
warnings.warn(
|
255
|
-
f"ScalableSymbolicPulse with complex amp are no longer supported. "
|
256
|
-
f"{pulse_type} with complex amp was converted to (amp,angle) representation.",
|
257
|
-
UserWarning,
|
258
|
-
)
|
175
|
+
value.read_value(file_obj, version, {}) # read duration
|
176
|
+
value.read_value(file_obj, version, {}) # read name
|
259
177
|
|
260
|
-
|
261
|
-
pulse_type=pulse_type,
|
262
|
-
duration=duration,
|
263
|
-
amp=parameters["amp"],
|
264
|
-
angle=parameters["angle"],
|
265
|
-
parameters=parameters,
|
266
|
-
name=name,
|
267
|
-
limit_amplitude=header.amp_limited,
|
268
|
-
envelope=envelope,
|
269
|
-
constraints=constraints,
|
270
|
-
valid_amp_conditions=valid_amp_conditions,
|
271
|
-
)
|
272
|
-
else:
|
178
|
+
if class_name not in {"SymbolicPulse", "ScalableSymbolicPulse"}:
|
273
179
|
raise NotImplementedError(f"Unknown class '{class_name}'")
|
274
180
|
|
275
181
|
|
276
|
-
def _read_alignment_context(file_obj, version):
|
277
|
-
|
182
|
+
def _read_alignment_context(file_obj, version) -> None:
|
183
|
+
common.read_type_key(file_obj)
|
278
184
|
|
279
|
-
|
185
|
+
common.read_sequence(
|
280
186
|
file_obj,
|
281
187
|
deserializer=value.loads_value,
|
282
188
|
version=version,
|
283
189
|
vectors={},
|
284
190
|
)
|
285
|
-
context_cls = type_keys.ScheduleAlignment.retrieve(type_key)
|
286
|
-
|
287
|
-
instance = object.__new__(context_cls)
|
288
|
-
instance._context_params = tuple(context_params)
|
289
|
-
|
290
|
-
return instance
|
291
191
|
|
292
192
|
|
293
193
|
# pylint: disable=too-many-return-statements
|
294
|
-
def _loads_operand(type_key, data_bytes, version, use_symengine
|
194
|
+
def _loads_operand(type_key, data_bytes, version, use_symengine):
|
295
195
|
if type_key == type_keys.ScheduleOperand.WAVEFORM:
|
296
196
|
return common.data_from_binary(data_bytes, _read_waveform, version=version)
|
297
197
|
if type_key == type_keys.ScheduleOperand.SYMBOLIC_PULSE:
|
298
198
|
if version < 6:
|
299
|
-
return common.data_from_binary(
|
300
|
-
data_bytes, _read_symbolic_pulse, version=version, trust_input=trust_input
|
301
|
-
)
|
199
|
+
return common.data_from_binary(data_bytes, _read_symbolic_pulse, version=version)
|
302
200
|
else:
|
303
201
|
return common.data_from_binary(
|
304
|
-
data_bytes,
|
305
|
-
_read_symbolic_pulse_v6,
|
306
|
-
version=version,
|
307
|
-
use_symengine=use_symengine,
|
308
|
-
trust_input=trust_input,
|
202
|
+
data_bytes, _read_symbolic_pulse_v6, version=version, use_symengine=use_symengine
|
309
203
|
)
|
310
204
|
if type_key == type_keys.ScheduleOperand.CHANNEL:
|
311
205
|
return common.data_from_binary(data_bytes, _read_channel, version=version)
|
@@ -327,32 +221,23 @@ def _loads_operand(type_key, data_bytes, version, use_symengine, trust_input=Fal
|
|
327
221
|
return value.loads_value(type_key, data_bytes, version, {})
|
328
222
|
|
329
223
|
|
330
|
-
def _read_element(file_obj, version, metadata_deserializer, use_symengine
|
224
|
+
def _read_element(file_obj, version, metadata_deserializer, use_symengine) -> None:
|
331
225
|
type_key = common.read_type_key(file_obj)
|
332
226
|
|
333
227
|
if type_key == type_keys.Program.SCHEDULE_BLOCK:
|
334
|
-
return read_schedule_block(
|
335
|
-
file_obj, version, metadata_deserializer, use_symengine, trust_input=trust_input
|
336
|
-
)
|
228
|
+
return read_schedule_block(file_obj, version, metadata_deserializer, use_symengine)
|
337
229
|
|
338
|
-
|
339
|
-
|
340
|
-
deserializer=_loads_operand,
|
341
|
-
version=version,
|
342
|
-
use_symengine=use_symengine,
|
343
|
-
trust_input=trust_input,
|
230
|
+
# read operands
|
231
|
+
common.read_sequence(
|
232
|
+
file_obj, deserializer=_loads_operand, version=version, use_symengine=use_symengine
|
344
233
|
)
|
345
|
-
|
346
|
-
|
347
|
-
instance = object.__new__(type_keys.ScheduleInstruction.retrieve(type_key))
|
348
|
-
instance._operands = tuple(operands)
|
349
|
-
instance._name = name
|
350
|
-
instance._hash = None
|
234
|
+
# read name
|
235
|
+
value.read_value(file_obj, version, {})
|
351
236
|
|
352
|
-
return
|
237
|
+
return None
|
353
238
|
|
354
239
|
|
355
|
-
def _loads_reference_item(type_key, data_bytes, metadata_deserializer, version
|
240
|
+
def _loads_reference_item(type_key, data_bytes, metadata_deserializer, version) -> None:
|
356
241
|
if type_key == type_keys.Value.NULL:
|
357
242
|
return None
|
358
243
|
if type_key == type_keys.Program.SCHEDULE_BLOCK:
|
@@ -361,7 +246,6 @@ def _loads_reference_item(type_key, data_bytes, metadata_deserializer, version,
|
|
361
246
|
deserializer=read_schedule_block,
|
362
247
|
version=version,
|
363
248
|
metadata_deserializer=metadata_deserializer,
|
364
|
-
trust_input=trust_input,
|
365
249
|
)
|
366
250
|
|
367
251
|
raise QpyError(
|
@@ -371,181 +255,8 @@ def _loads_reference_item(type_key, data_bytes, metadata_deserializer, version,
|
|
371
255
|
)
|
372
256
|
|
373
257
|
|
374
|
-
def
|
375
|
-
|
376
|
-
common.write_type_key(file_obj, type_key)
|
377
|
-
value.write_value(file_obj, data.index, version=version)
|
378
|
-
|
379
|
-
|
380
|
-
def _write_waveform(file_obj, data, version):
|
381
|
-
samples_bytes = common.data_to_binary(data.samples, np.save)
|
382
|
-
|
383
|
-
header = struct.pack(
|
384
|
-
formats.WAVEFORM_PACK,
|
385
|
-
data.epsilon,
|
386
|
-
len(samples_bytes),
|
387
|
-
data._limit_amplitude,
|
388
|
-
)
|
389
|
-
file_obj.write(header)
|
390
|
-
file_obj.write(samples_bytes)
|
391
|
-
value.write_value(file_obj, data.name, version=version)
|
392
|
-
|
393
|
-
|
394
|
-
def _dumps_obj(obj, version):
|
395
|
-
"""Wraps `value.dumps_value` to serialize dictionary and list objects
|
396
|
-
which are not supported by `value.dumps_value`.
|
397
|
-
"""
|
398
|
-
if isinstance(obj, dict):
|
399
|
-
with BytesIO() as container:
|
400
|
-
common.write_mapping(
|
401
|
-
file_obj=container, mapping=obj, serializer=_dumps_obj, version=version
|
402
|
-
)
|
403
|
-
binary_data = container.getvalue()
|
404
|
-
return b"D", binary_data
|
405
|
-
elif isinstance(obj, list):
|
406
|
-
with BytesIO() as container:
|
407
|
-
common.write_sequence(
|
408
|
-
file_obj=container, sequence=obj, serializer=_dumps_obj, version=version
|
409
|
-
)
|
410
|
-
binary_data = container.getvalue()
|
411
|
-
return b"l", binary_data
|
412
|
-
else:
|
413
|
-
return value.dumps_value(obj, version=version)
|
414
|
-
|
415
|
-
|
416
|
-
def _write_kernel(file_obj, data, version):
|
417
|
-
name = data.name
|
418
|
-
params = data.params
|
419
|
-
common.write_mapping(file_obj=file_obj, mapping=params, serializer=_dumps_obj, version=version)
|
420
|
-
value.write_value(file_obj, name, version=version)
|
421
|
-
|
422
|
-
|
423
|
-
def _write_discriminator(file_obj, data, version):
|
424
|
-
name = data.name
|
425
|
-
params = data.params
|
426
|
-
common.write_mapping(file_obj=file_obj, mapping=params, serializer=_dumps_obj, version=version)
|
427
|
-
value.write_value(file_obj, name, version=version)
|
428
|
-
|
429
|
-
|
430
|
-
def _dumps_symbolic_expr(expr, use_symengine):
|
431
|
-
if expr is None:
|
432
|
-
return b""
|
433
|
-
if use_symengine:
|
434
|
-
expr_bytes = expr.__reduce__()[1][0]
|
435
|
-
else:
|
436
|
-
from sympy import srepr, sympify
|
437
|
-
|
438
|
-
if not isinstance(expr, sym.Basic):
|
439
|
-
raise QiskitError("Invalid ParameterExpression")
|
440
|
-
|
441
|
-
expr_bytes = srepr(sympify(expr)).encode(common.ENCODE)
|
442
|
-
return zlib.compress(expr_bytes)
|
443
|
-
|
444
|
-
|
445
|
-
def _write_symbolic_pulse(file_obj, data, use_symengine, version):
|
446
|
-
class_name_bytes = data.__class__.__name__.encode(common.ENCODE)
|
447
|
-
pulse_type_bytes = data.pulse_type.encode(common.ENCODE)
|
448
|
-
envelope_bytes = _dumps_symbolic_expr(data.envelope, use_symengine)
|
449
|
-
constraints_bytes = _dumps_symbolic_expr(data.constraints, use_symengine)
|
450
|
-
valid_amp_conditions_bytes = _dumps_symbolic_expr(data.valid_amp_conditions, use_symengine)
|
451
|
-
|
452
|
-
header_bytes = struct.pack(
|
453
|
-
formats.SYMBOLIC_PULSE_PACK_V2,
|
454
|
-
len(class_name_bytes),
|
455
|
-
len(pulse_type_bytes),
|
456
|
-
len(envelope_bytes),
|
457
|
-
len(constraints_bytes),
|
458
|
-
len(valid_amp_conditions_bytes),
|
459
|
-
data._limit_amplitude,
|
460
|
-
)
|
461
|
-
file_obj.write(header_bytes)
|
462
|
-
file_obj.write(class_name_bytes)
|
463
|
-
file_obj.write(pulse_type_bytes)
|
464
|
-
file_obj.write(envelope_bytes)
|
465
|
-
file_obj.write(constraints_bytes)
|
466
|
-
file_obj.write(valid_amp_conditions_bytes)
|
467
|
-
common.write_mapping(
|
468
|
-
file_obj,
|
469
|
-
mapping=data._params,
|
470
|
-
serializer=value.dumps_value,
|
471
|
-
version=version,
|
472
|
-
)
|
473
|
-
value.write_value(file_obj, data.duration, version=version)
|
474
|
-
value.write_value(file_obj, data.name, version=version)
|
475
|
-
|
476
|
-
|
477
|
-
def _write_alignment_context(file_obj, context, version):
|
478
|
-
type_key = type_keys.ScheduleAlignment.assign(context)
|
479
|
-
common.write_type_key(file_obj, type_key)
|
480
|
-
common.write_sequence(
|
481
|
-
file_obj, sequence=context._context_params, serializer=value.dumps_value, version=version
|
482
|
-
)
|
483
|
-
|
484
|
-
|
485
|
-
def _dumps_operand(operand, use_symengine, version):
|
486
|
-
if isinstance(operand, library.Waveform):
|
487
|
-
type_key = type_keys.ScheduleOperand.WAVEFORM
|
488
|
-
data_bytes = common.data_to_binary(operand, _write_waveform, version=version)
|
489
|
-
elif isinstance(operand, library.SymbolicPulse):
|
490
|
-
type_key = type_keys.ScheduleOperand.SYMBOLIC_PULSE
|
491
|
-
data_bytes = common.data_to_binary(
|
492
|
-
operand, _write_symbolic_pulse, use_symengine=use_symengine, version=version
|
493
|
-
)
|
494
|
-
elif isinstance(operand, channels.Channel):
|
495
|
-
type_key = type_keys.ScheduleOperand.CHANNEL
|
496
|
-
data_bytes = common.data_to_binary(operand, _write_channel, version=version)
|
497
|
-
elif isinstance(operand, str):
|
498
|
-
type_key = type_keys.ScheduleOperand.OPERAND_STR
|
499
|
-
data_bytes = operand.encode(common.ENCODE)
|
500
|
-
elif isinstance(operand, Kernel):
|
501
|
-
type_key = type_keys.ScheduleOperand.KERNEL
|
502
|
-
data_bytes = common.data_to_binary(operand, _write_kernel, version=version)
|
503
|
-
elif isinstance(operand, Discriminator):
|
504
|
-
type_key = type_keys.ScheduleOperand.DISCRIMINATOR
|
505
|
-
data_bytes = common.data_to_binary(operand, _write_discriminator, version=version)
|
506
|
-
else:
|
507
|
-
type_key, data_bytes = value.dumps_value(operand, version=version)
|
508
|
-
|
509
|
-
return type_key, data_bytes
|
510
|
-
|
511
|
-
|
512
|
-
def _write_element(file_obj, element, metadata_serializer, use_symengine, version):
|
513
|
-
if isinstance(element, ScheduleBlock):
|
514
|
-
common.write_type_key(file_obj, type_keys.Program.SCHEDULE_BLOCK)
|
515
|
-
write_schedule_block(file_obj, element, metadata_serializer, use_symengine, version=version)
|
516
|
-
else:
|
517
|
-
type_key = type_keys.ScheduleInstruction.assign(element)
|
518
|
-
common.write_type_key(file_obj, type_key)
|
519
|
-
common.write_sequence(
|
520
|
-
file_obj,
|
521
|
-
sequence=element.operands,
|
522
|
-
serializer=_dumps_operand,
|
523
|
-
use_symengine=use_symengine,
|
524
|
-
version=version,
|
525
|
-
)
|
526
|
-
value.write_value(file_obj, element.name, version=version)
|
527
|
-
|
528
|
-
|
529
|
-
def _dumps_reference_item(schedule, metadata_serializer, version):
|
530
|
-
if schedule is None:
|
531
|
-
type_key = type_keys.Value.NULL
|
532
|
-
data_bytes = b""
|
533
|
-
else:
|
534
|
-
type_key = type_keys.Program.SCHEDULE_BLOCK
|
535
|
-
data_bytes = common.data_to_binary(
|
536
|
-
obj=schedule,
|
537
|
-
serializer=write_schedule_block,
|
538
|
-
metadata_serializer=metadata_serializer,
|
539
|
-
version=version,
|
540
|
-
)
|
541
|
-
return type_key, data_bytes
|
542
|
-
|
543
|
-
|
544
|
-
@ignore_pulse_deprecation_warnings
|
545
|
-
def read_schedule_block(
|
546
|
-
file_obj, version, metadata_deserializer=None, use_symengine=False, trust_input=False
|
547
|
-
):
|
548
|
-
"""Read a single ScheduleBlock from the file like object.
|
258
|
+
def read_schedule_block(file_obj, version, metadata_deserializer=None, use_symengine=False):
|
259
|
+
"""Consume a single ScheduleBlock from the file like object.
|
549
260
|
|
550
261
|
Args:
|
551
262
|
file_obj (File): A file like object that contains the QPY binary data.
|
@@ -561,16 +272,10 @@ def read_schedule_block(
|
|
561
272
|
native mechanism. This is a faster serialization alternative, but not supported in all
|
562
273
|
platforms. Please check that your target platform is supported by the symengine library
|
563
274
|
before setting this option, as it will be required by qpy to deserialize the payload.
|
564
|
-
trust_input (bool): if set to ``False`` (the default),
|
565
|
-
:class:`.ScheduleBlock` objects in the payload that were
|
566
|
-
serialized using ``sympy`` are not allowed and will error. This
|
567
|
-
is because the ``sympy`` parsing uses :func:`eval`, which
|
568
|
-
can allow for arbitrary code execution.
|
569
|
-
The flag should only be set
|
570
|
-
to ``True`` if you trust the QPY payload you are loading.
|
571
|
-
|
572
275
|
Returns:
|
573
|
-
|
276
|
+
QuantumCircuit: Returns a dummy QuantumCircuit object, containing just name and metadata.
|
277
|
+
This function exists just to allow reading legacy payloads containing pulse information
|
278
|
+
without breaking the entire load flow.
|
574
279
|
|
575
280
|
Raises:
|
576
281
|
TypeError: If any of the instructions is invalid data format.
|
@@ -585,94 +290,19 @@ def read_schedule_block(
|
|
585
290
|
file_obj.read(formats.SCHEDULE_BLOCK_HEADER_SIZE),
|
586
291
|
)
|
587
292
|
)
|
588
|
-
|
293
|
+
file_obj.read(data.name_size).decode(common.ENCODE) # read name
|
589
294
|
metadata_raw = file_obj.read(data.metadata_size)
|
590
|
-
|
591
|
-
|
295
|
+
json.loads(metadata_raw, cls=metadata_deserializer) # read metadata
|
296
|
+
_read_alignment_context(file_obj, version)
|
592
297
|
|
593
|
-
block = ScheduleBlock(
|
594
|
-
name=name,
|
595
|
-
metadata=metadata,
|
596
|
-
alignment_context=context,
|
597
|
-
)
|
598
298
|
for _ in range(data.num_elements):
|
599
|
-
|
600
|
-
file_obj, version, metadata_deserializer, use_symengine, trust_input=trust_input
|
601
|
-
)
|
602
|
-
block.append(block_elm, inplace=True)
|
299
|
+
_read_element(file_obj, version, metadata_deserializer, use_symengine)
|
603
300
|
|
604
301
|
# Load references
|
605
302
|
if version >= 7:
|
606
|
-
|
303
|
+
common.read_mapping(
|
607
304
|
file_obj=file_obj,
|
608
305
|
deserializer=_loads_reference_item,
|
609
306
|
version=version,
|
610
307
|
metadata_deserializer=metadata_deserializer,
|
611
|
-
trust_input=trust_input,
|
612
308
|
)
|
613
|
-
ref_dict = {}
|
614
|
-
for key_str, schedule in flat_key_refdict.items():
|
615
|
-
if schedule is not None:
|
616
|
-
composite_key = tuple(key_str.split(instructions.Reference.key_delimiter))
|
617
|
-
ref_dict[composite_key] = schedule
|
618
|
-
if ref_dict:
|
619
|
-
block.assign_references(ref_dict, inplace=True)
|
620
|
-
|
621
|
-
return block
|
622
|
-
|
623
|
-
|
624
|
-
def write_schedule_block(
|
625
|
-
file_obj, block, metadata_serializer=None, use_symengine=False, version=common.QPY_VERSION
|
626
|
-
):
|
627
|
-
"""Write a single ScheduleBlock object in the file like object.
|
628
|
-
|
629
|
-
Args:
|
630
|
-
file_obj (File): The file like object to write the circuit data in.
|
631
|
-
block (ScheduleBlock): A schedule block data to write.
|
632
|
-
metadata_serializer (JSONEncoder): An optional JSONEncoder class that
|
633
|
-
will be passed the :attr:`.ScheduleBlock.metadata` dictionary for
|
634
|
-
``block`` and will be used as the ``cls`` kwarg
|
635
|
-
on the ``json.dump()`` call to JSON serialize that dictionary.
|
636
|
-
use_symengine (bool): If True, symbolic objects will be serialized using symengine's
|
637
|
-
native mechanism. This is a faster serialization alternative, but not supported in all
|
638
|
-
platforms. Please check that your target platform is supported by the symengine library
|
639
|
-
before setting this option, as it will be required by qpy to deserialize the payload.
|
640
|
-
version (int): The QPY format version to use for serializing this circuit block
|
641
|
-
Raises:
|
642
|
-
TypeError: If any of the instructions is invalid data format.
|
643
|
-
"""
|
644
|
-
metadata = json.dumps(block.metadata, separators=(",", ":"), cls=metadata_serializer).encode(
|
645
|
-
common.ENCODE
|
646
|
-
)
|
647
|
-
block_name = block.name.encode(common.ENCODE)
|
648
|
-
|
649
|
-
# Write schedule block header
|
650
|
-
header_raw = formats.SCHEDULE_BLOCK_HEADER(
|
651
|
-
name_size=len(block_name),
|
652
|
-
metadata_size=len(metadata),
|
653
|
-
num_elements=len(block),
|
654
|
-
)
|
655
|
-
header = struct.pack(formats.SCHEDULE_BLOCK_HEADER_PACK, *header_raw)
|
656
|
-
file_obj.write(header)
|
657
|
-
file_obj.write(block_name)
|
658
|
-
file_obj.write(metadata)
|
659
|
-
|
660
|
-
_write_alignment_context(file_obj, block.alignment_context, version=version)
|
661
|
-
for block_elm in block._blocks:
|
662
|
-
# Do not call block.blocks. This implicitly assigns references to instruction.
|
663
|
-
# This breaks original reference structure.
|
664
|
-
_write_element(file_obj, block_elm, metadata_serializer, use_symengine, version=version)
|
665
|
-
|
666
|
-
# Write references
|
667
|
-
flat_key_refdict = {}
|
668
|
-
for ref_keys, schedule in block._reference_manager.items():
|
669
|
-
# Do not call block.reference. This returns the reference of most outer program by design.
|
670
|
-
key_str = instructions.Reference.key_delimiter.join(ref_keys)
|
671
|
-
flat_key_refdict[key_str] = schedule
|
672
|
-
common.write_mapping(
|
673
|
-
file_obj=file_obj,
|
674
|
-
mapping=flat_key_refdict,
|
675
|
-
serializer=_dumps_reference_item,
|
676
|
-
metadata_serializer=metadata_serializer,
|
677
|
-
version=version,
|
678
|
-
)
|