qiskit 1.4.1__cp39-abi3-win_amd64.whl → 2.0.0rc1__cp39-abi3-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +2 -5
- qiskit/_accelerate.pyd +0 -0
- qiskit/circuit/__init__.py +24 -5
- qiskit/circuit/{add_control.py → _add_control.py} +32 -12
- qiskit/circuit/_classical_resource_map.py +5 -3
- qiskit/circuit/barrier.py +3 -7
- qiskit/circuit/classical/expr/__init__.py +31 -3
- qiskit/circuit/classical/expr/constructors.py +248 -28
- qiskit/circuit/classical/expr/expr.py +104 -3
- qiskit/circuit/classical/expr/visitors.py +75 -0
- qiskit/circuit/classical/types/__init__.py +12 -8
- qiskit/circuit/classical/types/ordering.py +14 -7
- qiskit/circuit/classical/types/types.py +36 -0
- qiskit/circuit/commutation_checker.py +34 -7
- qiskit/circuit/controlflow/__init__.py +32 -1
- qiskit/circuit/controlflow/_builder_utils.py +9 -5
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +1 -1
- qiskit/circuit/controlflow/builder.py +139 -39
- qiskit/circuit/controlflow/continue_loop.py +1 -3
- qiskit/circuit/controlflow/control_flow.py +10 -0
- qiskit/circuit/controlflow/for_loop.py +2 -1
- qiskit/circuit/controlflow/if_else.py +3 -16
- qiskit/circuit/controlflow/switch_case.py +2 -8
- qiskit/circuit/controlflow/while_loop.py +2 -7
- qiskit/circuit/controlledgate.py +2 -4
- qiskit/circuit/delay.py +40 -11
- qiskit/circuit/duration.py +0 -15
- qiskit/circuit/gate.py +2 -4
- qiskit/circuit/instruction.py +2 -141
- qiskit/circuit/instructionset.py +7 -54
- qiskit/circuit/library/__init__.py +34 -5
- qiskit/circuit/library/arithmetic/__init__.py +16 -10
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
- qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
- qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
- qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +52 -16
- qiskit/circuit/library/data_preparation/initializer.py +1 -1
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
- qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
- qiskit/circuit/library/generalized_gates/gms.py +1 -1
- qiskit/circuit/library/generalized_gates/isometry.py +1 -1
- qiskit/circuit/library/generalized_gates/pauli.py +1 -2
- qiskit/circuit/library/generalized_gates/uc.py +97 -7
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
- qiskit/circuit/library/generalized_gates/unitary.py +4 -2
- qiskit/circuit/library/hamiltonian_gate.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
- qiskit/circuit/library/n_local/n_local.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
- qiskit/circuit/library/overlap.py +2 -2
- qiskit/circuit/library/pauli_evolution.py +39 -24
- qiskit/circuit/library/phase_oracle.py +130 -51
- qiskit/circuit/library/standard_gates/__init__.py +0 -1
- qiskit/circuit/library/standard_gates/dcx.py +3 -4
- qiskit/circuit/library/standard_gates/ecr.py +3 -4
- qiskit/circuit/library/standard_gates/global_phase.py +5 -6
- qiskit/circuit/library/standard_gates/h.py +4 -9
- qiskit/circuit/library/standard_gates/i.py +2 -2
- qiskit/circuit/library/standard_gates/iswap.py +3 -4
- qiskit/circuit/library/standard_gates/p.py +15 -34
- qiskit/circuit/library/standard_gates/r.py +2 -6
- qiskit/circuit/library/standard_gates/rx.py +5 -15
- qiskit/circuit/library/standard_gates/rxx.py +3 -6
- qiskit/circuit/library/standard_gates/ry.py +5 -17
- qiskit/circuit/library/standard_gates/ryy.py +3 -6
- qiskit/circuit/library/standard_gates/rz.py +5 -17
- qiskit/circuit/library/standard_gates/rzx.py +3 -6
- qiskit/circuit/library/standard_gates/rzz.py +3 -6
- qiskit/circuit/library/standard_gates/s.py +6 -15
- qiskit/circuit/library/standard_gates/swap.py +4 -11
- qiskit/circuit/library/standard_gates/sx.py +7 -12
- qiskit/circuit/library/standard_gates/t.py +6 -7
- qiskit/circuit/library/standard_gates/u.py +2 -10
- qiskit/circuit/library/standard_gates/u1.py +5 -16
- qiskit/circuit/library/standard_gates/u2.py +2 -6
- qiskit/circuit/library/standard_gates/u3.py +3 -11
- qiskit/circuit/library/standard_gates/x.py +13 -60
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/y.py +4 -9
- qiskit/circuit/library/standard_gates/z.py +5 -15
- qiskit/circuit/measure.py +11 -2
- qiskit/circuit/parameterexpression.py +4 -0
- qiskit/circuit/quantumcircuit.py +881 -555
- qiskit/circuit/random/utils.py +12 -6
- qiskit/circuit/reset.py +5 -2
- qiskit/circuit/singleton.py +5 -11
- qiskit/circuit/store.py +0 -8
- qiskit/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +4 -2
- qiskit/converters/circuit_to_dagdependency.py +0 -2
- qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
- qiskit/converters/circuit_to_gate.py +1 -1
- qiskit/converters/circuit_to_instruction.py +16 -29
- qiskit/converters/dag_to_circuit.py +5 -5
- qiskit/converters/dag_to_dagdependency.py +0 -1
- qiskit/converters/dag_to_dagdependency_v2.py +0 -1
- qiskit/converters/dagdependency_to_circuit.py +0 -6
- qiskit/converters/dagdependency_to_dag.py +0 -6
- qiskit/dagcircuit/collect_blocks.py +32 -20
- qiskit/dagcircuit/dagdependency.py +3 -37
- qiskit/dagcircuit/dagdependency_v2.py +2 -80
- qiskit/dagcircuit/dagnode.py +14 -2
- qiskit/passmanager/__init__.py +24 -6
- qiskit/passmanager/passmanager.py +26 -24
- qiskit/primitives/__init__.py +44 -35
- qiskit/primitives/backend_estimator_v2.py +102 -23
- qiskit/primitives/backend_sampler_v2.py +5 -20
- qiskit/primitives/base/__init__.py +4 -4
- qiskit/primitives/base/base_estimator.py +77 -82
- qiskit/primitives/base/base_primitive_job.py +2 -2
- qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
- qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
- qiskit/primitives/base/base_sampler.py +52 -60
- qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
- qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
- qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
- qiskit/primitives/containers/bindings_array.py +3 -1
- qiskit/primitives/containers/bit_array.py +23 -0
- qiskit/primitives/containers/data_bin.py +3 -1
- qiskit/primitives/containers/observables_array.py +19 -2
- qiskit/primitives/statevector_sampler.py +6 -8
- qiskit/primitives/utils.py +14 -189
- qiskit/providers/__init__.py +4 -130
- qiskit/providers/backend.py +11 -314
- qiskit/providers/basic_provider/__init__.py +3 -1
- qiskit/providers/basic_provider/basic_provider.py +29 -9
- qiskit/providers/basic_provider/basic_simulator.py +158 -298
- qiskit/providers/exceptions.py +0 -33
- qiskit/providers/fake_provider/__init__.py +0 -37
- qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
- qiskit/qasm2/__init__.py +21 -6
- qiskit/qasm2/export.py +2 -10
- qiskit/qasm2/parse.py +11 -25
- qiskit/qasm3/__init__.py +5 -1
- qiskit/qasm3/ast.py +44 -0
- qiskit/qasm3/exporter.py +65 -27
- qiskit/qasm3/printer.py +35 -4
- qiskit/qpy/__init__.py +141 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +91 -116
- qiskit/qpy/binary_io/schedules.py +61 -388
- qiskit/qpy/binary_io/value.py +154 -28
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +29 -62
- qiskit/qpy/type_keys.py +58 -221
- qiskit/quantum_info/analysis/distance.py +3 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
- qiskit/quantum_info/operators/operator.py +6 -2
- qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
- qiskit/quantum_info/states/densitymatrix.py +16 -6
- qiskit/quantum_info/states/stabilizerstate.py +35 -4
- qiskit/quantum_info/states/statevector.py +16 -6
- qiskit/result/__init__.py +5 -17
- qiskit/result/models.py +18 -10
- qiskit/result/result.py +28 -126
- qiskit/result/sampled_expval.py +1 -2
- qiskit/result/utils.py +3 -4
- qiskit/synthesis/__init__.py +21 -1
- qiskit/synthesis/arithmetic/__init__.py +3 -1
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
- qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
- qiskit/synthesis/evolution/lie_trotter.py +10 -7
- qiskit/synthesis/evolution/product_formula.py +44 -35
- qiskit/synthesis/evolution/qdrift.py +17 -24
- qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
- qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
- qiskit/synthesis/two_qubit/__init__.py +1 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
- qiskit/transpiler/__init__.py +32 -232
- qiskit/transpiler/basepasses.py +20 -51
- qiskit/transpiler/layout.py +1 -1
- qiskit/transpiler/passes/__init__.py +2 -40
- qiskit/transpiler/passes/basis/basis_translator.py +4 -3
- qiskit/transpiler/passes/basis/decompose.py +1 -15
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
- qiskit/transpiler/passes/layout/apply_layout.py +4 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +4 -4
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
- qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
- qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
- qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
- qiskit/transpiler/passes/optimization/__init__.py +1 -3
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
- qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
- qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
- qiskit/transpiler/passes/routing/__init__.py +0 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
- qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
- qiskit/transpiler/passes/scheduling/__init__.py +1 -7
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +30 -2
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +127 -59
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
- qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
- qiskit/transpiler/passes/synthesis/plugin.py +4 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
- qiskit/transpiler/passes/utils/control_flow.py +2 -6
- qiskit/transpiler/passes/utils/gate_direction.py +7 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
- qiskit/transpiler/passmanager.py +13 -0
- qiskit/transpiler/passmanager_config.py +5 -81
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
- qiskit/transpiler/preset_passmanagers/common.py +140 -167
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +101 -322
- qiskit/transpiler/preset_passmanagers/level0.py +2 -11
- qiskit/transpiler/preset_passmanagers/level1.py +2 -14
- qiskit/transpiler/preset_passmanagers/level2.py +2 -12
- qiskit/transpiler/preset_passmanagers/level3.py +2 -11
- qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
- qiskit/transpiler/target.py +67 -524
- qiskit/user_config.py +8 -4
- qiskit/utils/__init__.py +13 -12
- qiskit/utils/deprecation.py +4 -112
- qiskit/utils/optionals.py +11 -4
- qiskit/utils/parallel.py +214 -87
- qiskit/utils/units.py +4 -1
- qiskit/visualization/__init__.py +3 -7
- qiskit/visualization/array.py +4 -1
- qiskit/visualization/bloch.py +1 -1
- qiskit/visualization/circuit/_utils.py +19 -19
- qiskit/visualization/circuit/circuit_visualization.py +11 -4
- qiskit/visualization/circuit/matplotlib.py +13 -23
- qiskit/visualization/circuit/text.py +7 -3
- qiskit/visualization/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +6 -0
- qiskit/visualization/timeline/core.py +18 -12
- qiskit/visualization/timeline/interface.py +19 -18
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +1 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/entry_points.txt +8 -2
- qiskit/assembler/__init__.py +0 -42
- qiskit/assembler/assemble_circuits.py +0 -451
- qiskit/assembler/assemble_schedules.py +0 -367
- qiskit/assembler/disassemble.py +0 -310
- qiskit/assembler/run_config.py +0 -77
- qiskit/circuit/bit.py +0 -106
- qiskit/circuit/classicalfunction/__init__.py +0 -152
- qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
- qiskit/circuit/classicalfunction/classical_element.py +0 -54
- qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
- qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
- qiskit/circuit/classicalfunction/exceptions.py +0 -41
- qiskit/circuit/classicalfunction/types.py +0 -18
- qiskit/circuit/classicalfunction/utils.py +0 -91
- qiskit/circuit/classicalregister.py +0 -57
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
- qiskit/circuit/quantumregister.py +0 -75
- qiskit/circuit/register.py +0 -246
- qiskit/compiler/assembler.py +0 -689
- qiskit/compiler/scheduler.py +0 -109
- qiskit/compiler/sequencer.py +0 -71
- qiskit/primitives/backend_estimator.py +0 -486
- qiskit/primitives/backend_sampler.py +0 -222
- qiskit/primitives/estimator.py +0 -172
- qiskit/primitives/sampler.py +0 -162
- qiskit/providers/backend_compat.py +0 -507
- qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
- qiskit/providers/fake_provider/fake_1q.py +0 -91
- qiskit/providers/fake_provider/fake_backend.py +0 -165
- qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
- qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
- qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
- qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
- qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
- qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
- qiskit/providers/models/__init__.py +0 -89
- qiskit/providers/models/backendconfiguration.py +0 -1040
- qiskit/providers/models/backendproperties.py +0 -535
- qiskit/providers/models/backendstatus.py +0 -104
- qiskit/providers/models/jobstatus.py +0 -77
- qiskit/providers/models/pulsedefaults.py +0 -305
- qiskit/providers/provider.py +0 -95
- qiskit/pulse/__init__.py +0 -158
- qiskit/pulse/builder.py +0 -2262
- qiskit/pulse/calibration_entries.py +0 -381
- qiskit/pulse/channels.py +0 -227
- qiskit/pulse/configuration.py +0 -245
- qiskit/pulse/exceptions.py +0 -45
- qiskit/pulse/filters.py +0 -309
- qiskit/pulse/instruction_schedule_map.py +0 -424
- qiskit/pulse/instructions/__init__.py +0 -67
- qiskit/pulse/instructions/acquire.py +0 -150
- qiskit/pulse/instructions/delay.py +0 -71
- qiskit/pulse/instructions/directives.py +0 -154
- qiskit/pulse/instructions/frequency.py +0 -135
- qiskit/pulse/instructions/instruction.py +0 -270
- qiskit/pulse/instructions/phase.py +0 -152
- qiskit/pulse/instructions/play.py +0 -99
- qiskit/pulse/instructions/reference.py +0 -100
- qiskit/pulse/instructions/snapshot.py +0 -82
- qiskit/pulse/library/__init__.py +0 -97
- qiskit/pulse/library/continuous.py +0 -430
- qiskit/pulse/library/pulse.py +0 -148
- qiskit/pulse/library/samplers/__init__.py +0 -15
- qiskit/pulse/library/samplers/decorators.py +0 -295
- qiskit/pulse/library/samplers/strategies.py +0 -71
- qiskit/pulse/library/symbolic_pulses.py +0 -1989
- qiskit/pulse/library/waveform.py +0 -136
- qiskit/pulse/macros.py +0 -262
- qiskit/pulse/parameter_manager.py +0 -445
- qiskit/pulse/parser.py +0 -314
- qiskit/pulse/reference_manager.py +0 -58
- qiskit/pulse/schedule.py +0 -1854
- qiskit/pulse/transforms/__init__.py +0 -106
- qiskit/pulse/transforms/alignments.py +0 -406
- qiskit/pulse/transforms/base_transforms.py +0 -71
- qiskit/pulse/transforms/canonicalization.py +0 -498
- qiskit/pulse/transforms/dag.py +0 -122
- qiskit/pulse/utils.py +0 -149
- qiskit/qobj/__init__.py +0 -75
- qiskit/qobj/common.py +0 -81
- qiskit/qobj/converters/__init__.py +0 -18
- qiskit/qobj/converters/lo_config.py +0 -177
- qiskit/qobj/converters/pulse_instruction.py +0 -897
- qiskit/qobj/pulse_qobj.py +0 -709
- qiskit/qobj/qasm_qobj.py +0 -708
- qiskit/qobj/utils.py +0 -46
- qiskit/result/mitigation/base_readout_mitigator.py +0 -79
- qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
- qiskit/result/mitigation/local_readout_mitigator.py +0 -328
- qiskit/result/mitigation/utils.py +0 -217
- qiskit/scheduler/__init__.py +0 -40
- qiskit/scheduler/config.py +0 -37
- qiskit/scheduler/lowering.py +0 -187
- qiskit/scheduler/methods/__init__.py +0 -15
- qiskit/scheduler/methods/basic.py +0 -140
- qiskit/scheduler/schedule_circuit.py +0 -69
- qiskit/scheduler/sequence.py +0 -104
- qiskit/transpiler/passes/calibration/__init__.py +0 -17
- qiskit/transpiler/passes/calibration/base_builder.py +0 -79
- qiskit/transpiler/passes/calibration/builders.py +0 -20
- qiskit/transpiler/passes/calibration/exceptions.py +0 -22
- qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
- qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
- qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
- qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
- qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
- qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
- qiskit/transpiler/passes/scheduling/alap.py +0 -153
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
- qiskit/transpiler/passes/scheduling/asap.py +0 -175
- qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
- qiskit/utils/deprecate_pulse.py +0 -119
- qiskit/utils/multiprocessing.py +0 -56
- qiskit/visualization/pulse_v2/__init__.py +0 -21
- qiskit/visualization/pulse_v2/core.py +0 -901
- qiskit/visualization/pulse_v2/device_info.py +0 -173
- qiskit/visualization/pulse_v2/drawings.py +0 -253
- qiskit/visualization/pulse_v2/events.py +0 -254
- qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
- qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
- qiskit/visualization/pulse_v2/generators/chart.py +0 -208
- qiskit/visualization/pulse_v2/generators/frame.py +0 -436
- qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
- qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
- qiskit/visualization/pulse_v2/interface.py +0 -459
- qiskit/visualization/pulse_v2/layouts.py +0 -387
- qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
- qiskit/visualization/pulse_v2/stylesheet.py +0 -312
- qiskit/visualization/pulse_v2/types.py +0 -242
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -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,26 +66,25 @@ 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
90
|
def _loads_symbolic_expr(expr_bytes, use_symengine=False):
|
@@ -113,7 +101,7 @@ def _loads_symbolic_expr(expr_bytes, use_symengine=False):
|
|
113
101
|
return sym.sympify(expr)
|
114
102
|
|
115
103
|
|
116
|
-
def _read_symbolic_pulse(file_obj, version):
|
104
|
+
def _read_symbolic_pulse(file_obj, version) -> None:
|
117
105
|
make = formats.SYMBOLIC_PULSE._make
|
118
106
|
pack = formats.SYMBOLIC_PULSE_PACK
|
119
107
|
size = formats.SYMBOLIC_PULSE_SIZE
|
@@ -125,10 +113,13 @@ def _read_symbolic_pulse(file_obj, version):
|
|
125
113
|
)
|
126
114
|
)
|
127
115
|
pulse_type = file_obj.read(header.type_size).decode(common.ENCODE)
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
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(
|
132
123
|
file_obj,
|
133
124
|
deserializer=value.loads_value,
|
134
125
|
version=version,
|
@@ -146,50 +137,16 @@ def _read_symbolic_pulse(file_obj, version):
|
|
146
137
|
class_name = "SymbolicPulse" # Default class name, if not in the library
|
147
138
|
|
148
139
|
if pulse_type in legacy_library_pulses:
|
149
|
-
parameters["angle"] = np.angle(parameters["amp"])
|
150
|
-
parameters["amp"] = np.abs(parameters["amp"])
|
151
|
-
_amp, _angle = sym.symbols("amp, angle")
|
152
|
-
envelope = envelope.subs(_amp, _amp * sym.exp(sym.I * _angle))
|
153
|
-
|
154
|
-
warnings.warn(
|
155
|
-
f"Library pulses with complex amp are no longer supported. "
|
156
|
-
f"{pulse_type} with complex amp was converted to (amp,angle) representation.",
|
157
|
-
UserWarning,
|
158
|
-
)
|
159
140
|
class_name = "ScalableSymbolicPulse"
|
160
141
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
if class_name
|
165
|
-
return library.SymbolicPulse(
|
166
|
-
pulse_type=pulse_type,
|
167
|
-
duration=duration,
|
168
|
-
parameters=parameters,
|
169
|
-
name=name,
|
170
|
-
limit_amplitude=header.amp_limited,
|
171
|
-
envelope=envelope,
|
172
|
-
constraints=constraints,
|
173
|
-
valid_amp_conditions=valid_amp_conditions,
|
174
|
-
)
|
175
|
-
elif class_name == "ScalableSymbolicPulse":
|
176
|
-
return library.ScalableSymbolicPulse(
|
177
|
-
pulse_type=pulse_type,
|
178
|
-
duration=duration,
|
179
|
-
amp=parameters["amp"],
|
180
|
-
angle=parameters["angle"],
|
181
|
-
parameters=parameters,
|
182
|
-
name=name,
|
183
|
-
limit_amplitude=header.amp_limited,
|
184
|
-
envelope=envelope,
|
185
|
-
constraints=constraints,
|
186
|
-
valid_amp_conditions=valid_amp_conditions,
|
187
|
-
)
|
188
|
-
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"}:
|
189
146
|
raise NotImplementedError(f"Unknown class '{class_name}'")
|
190
147
|
|
191
148
|
|
192
|
-
def _read_symbolic_pulse_v6(file_obj, version, use_symengine):
|
149
|
+
def _read_symbolic_pulse_v6(file_obj, version, use_symengine) -> None:
|
193
150
|
make = formats.SYMBOLIC_PULSE_V2._make
|
194
151
|
pack = formats.SYMBOLIC_PULSE_PACK_V2
|
195
152
|
size = formats.SYMBOLIC_PULSE_SIZE_V2
|
@@ -201,79 +158,36 @@ def _read_symbolic_pulse_v6(file_obj, version, use_symengine):
|
|
201
158
|
)
|
202
159
|
)
|
203
160
|
class_name = file_obj.read(header.class_name_size).decode(common.ENCODE)
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
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(
|
208
165
|
file_obj.read(header.valid_amp_conditions_size), use_symengine
|
209
|
-
)
|
210
|
-
|
166
|
+
) # read valid_amp_conditions
|
167
|
+
# read parameters
|
168
|
+
common.read_mapping(
|
211
169
|
file_obj,
|
212
170
|
deserializer=value.loads_value,
|
213
171
|
version=version,
|
214
172
|
vectors={},
|
215
173
|
)
|
216
174
|
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
if class_name == "SymbolicPulse":
|
221
|
-
return library.SymbolicPulse(
|
222
|
-
pulse_type=pulse_type,
|
223
|
-
duration=duration,
|
224
|
-
parameters=parameters,
|
225
|
-
name=name,
|
226
|
-
limit_amplitude=header.amp_limited,
|
227
|
-
envelope=envelope,
|
228
|
-
constraints=constraints,
|
229
|
-
valid_amp_conditions=valid_amp_conditions,
|
230
|
-
)
|
231
|
-
elif class_name == "ScalableSymbolicPulse":
|
232
|
-
# Between Qiskit 0.40 and 0.46, the (amp, angle) representation was present,
|
233
|
-
# but complex amp was still allowed. In Qiskit 1.0 and beyond complex amp
|
234
|
-
# is no longer supported and so the amp needs to be checked and converted.
|
235
|
-
# Once QPY version is bumped, a new reader function can be introduced without
|
236
|
-
# this check.
|
237
|
-
if isinstance(parameters["amp"], complex):
|
238
|
-
parameters["angle"] = np.angle(parameters["amp"])
|
239
|
-
parameters["amp"] = np.abs(parameters["amp"])
|
240
|
-
warnings.warn(
|
241
|
-
f"ScalableSymbolicPulse with complex amp are no longer supported. "
|
242
|
-
f"{pulse_type} with complex amp was converted to (amp,angle) representation.",
|
243
|
-
UserWarning,
|
244
|
-
)
|
175
|
+
value.read_value(file_obj, version, {}) # read duration
|
176
|
+
value.read_value(file_obj, version, {}) # read name
|
245
177
|
|
246
|
-
|
247
|
-
pulse_type=pulse_type,
|
248
|
-
duration=duration,
|
249
|
-
amp=parameters["amp"],
|
250
|
-
angle=parameters["angle"],
|
251
|
-
parameters=parameters,
|
252
|
-
name=name,
|
253
|
-
limit_amplitude=header.amp_limited,
|
254
|
-
envelope=envelope,
|
255
|
-
constraints=constraints,
|
256
|
-
valid_amp_conditions=valid_amp_conditions,
|
257
|
-
)
|
258
|
-
else:
|
178
|
+
if class_name not in {"SymbolicPulse", "ScalableSymbolicPulse"}:
|
259
179
|
raise NotImplementedError(f"Unknown class '{class_name}'")
|
260
180
|
|
261
181
|
|
262
|
-
def _read_alignment_context(file_obj, version):
|
263
|
-
|
182
|
+
def _read_alignment_context(file_obj, version) -> None:
|
183
|
+
common.read_type_key(file_obj)
|
264
184
|
|
265
|
-
|
185
|
+
common.read_sequence(
|
266
186
|
file_obj,
|
267
187
|
deserializer=value.loads_value,
|
268
188
|
version=version,
|
269
189
|
vectors={},
|
270
190
|
)
|
271
|
-
context_cls = type_keys.ScheduleAlignment.retrieve(type_key)
|
272
|
-
|
273
|
-
instance = object.__new__(context_cls)
|
274
|
-
instance._context_params = tuple(context_params)
|
275
|
-
|
276
|
-
return instance
|
277
191
|
|
278
192
|
|
279
193
|
# pylint: disable=too-many-return-statements
|
@@ -307,26 +221,23 @@ def _loads_operand(type_key, data_bytes, version, use_symengine):
|
|
307
221
|
return value.loads_value(type_key, data_bytes, version, {})
|
308
222
|
|
309
223
|
|
310
|
-
def _read_element(file_obj, version, metadata_deserializer, use_symengine):
|
224
|
+
def _read_element(file_obj, version, metadata_deserializer, use_symengine) -> None:
|
311
225
|
type_key = common.read_type_key(file_obj)
|
312
226
|
|
313
227
|
if type_key == type_keys.Program.SCHEDULE_BLOCK:
|
314
228
|
return read_schedule_block(file_obj, version, metadata_deserializer, use_symengine)
|
315
229
|
|
316
|
-
|
230
|
+
# read operands
|
231
|
+
common.read_sequence(
|
317
232
|
file_obj, deserializer=_loads_operand, version=version, use_symengine=use_symengine
|
318
233
|
)
|
319
|
-
|
234
|
+
# read name
|
235
|
+
value.read_value(file_obj, version, {})
|
320
236
|
|
321
|
-
|
322
|
-
instance._operands = tuple(operands)
|
323
|
-
instance._name = name
|
324
|
-
instance._hash = None
|
237
|
+
return None
|
325
238
|
|
326
|
-
return instance
|
327
239
|
|
328
|
-
|
329
|
-
def _loads_reference_item(type_key, data_bytes, metadata_deserializer, version):
|
240
|
+
def _loads_reference_item(type_key, data_bytes, metadata_deserializer, version) -> None:
|
330
241
|
if type_key == type_keys.Value.NULL:
|
331
242
|
return None
|
332
243
|
if type_key == type_keys.Program.SCHEDULE_BLOCK:
|
@@ -344,176 +255,8 @@ def _loads_reference_item(type_key, data_bytes, metadata_deserializer, version):
|
|
344
255
|
)
|
345
256
|
|
346
257
|
|
347
|
-
def _write_channel(file_obj, data, version):
|
348
|
-
type_key = type_keys.ScheduleChannel.assign(data)
|
349
|
-
common.write_type_key(file_obj, type_key)
|
350
|
-
value.write_value(file_obj, data.index, version=version)
|
351
|
-
|
352
|
-
|
353
|
-
def _write_waveform(file_obj, data, version):
|
354
|
-
samples_bytes = common.data_to_binary(data.samples, np.save)
|
355
|
-
|
356
|
-
header = struct.pack(
|
357
|
-
formats.WAVEFORM_PACK,
|
358
|
-
data.epsilon,
|
359
|
-
len(samples_bytes),
|
360
|
-
data._limit_amplitude,
|
361
|
-
)
|
362
|
-
file_obj.write(header)
|
363
|
-
file_obj.write(samples_bytes)
|
364
|
-
value.write_value(file_obj, data.name, version=version)
|
365
|
-
|
366
|
-
|
367
|
-
def _dumps_obj(obj, version):
|
368
|
-
"""Wraps `value.dumps_value` to serialize dictionary and list objects
|
369
|
-
which are not supported by `value.dumps_value`.
|
370
|
-
"""
|
371
|
-
if isinstance(obj, dict):
|
372
|
-
with BytesIO() as container:
|
373
|
-
common.write_mapping(
|
374
|
-
file_obj=container, mapping=obj, serializer=_dumps_obj, version=version
|
375
|
-
)
|
376
|
-
binary_data = container.getvalue()
|
377
|
-
return b"D", binary_data
|
378
|
-
elif isinstance(obj, list):
|
379
|
-
with BytesIO() as container:
|
380
|
-
common.write_sequence(
|
381
|
-
file_obj=container, sequence=obj, serializer=_dumps_obj, version=version
|
382
|
-
)
|
383
|
-
binary_data = container.getvalue()
|
384
|
-
return b"l", binary_data
|
385
|
-
else:
|
386
|
-
return value.dumps_value(obj, version=version)
|
387
|
-
|
388
|
-
|
389
|
-
def _write_kernel(file_obj, data, version):
|
390
|
-
name = data.name
|
391
|
-
params = data.params
|
392
|
-
common.write_mapping(file_obj=file_obj, mapping=params, serializer=_dumps_obj, version=version)
|
393
|
-
value.write_value(file_obj, name, version=version)
|
394
|
-
|
395
|
-
|
396
|
-
def _write_discriminator(file_obj, data, version):
|
397
|
-
name = data.name
|
398
|
-
params = data.params
|
399
|
-
common.write_mapping(file_obj=file_obj, mapping=params, serializer=_dumps_obj, version=version)
|
400
|
-
value.write_value(file_obj, name, version=version)
|
401
|
-
|
402
|
-
|
403
|
-
def _dumps_symbolic_expr(expr, use_symengine):
|
404
|
-
if expr is None:
|
405
|
-
return b""
|
406
|
-
if use_symengine:
|
407
|
-
expr_bytes = expr.__reduce__()[1][0]
|
408
|
-
else:
|
409
|
-
from sympy import srepr, sympify
|
410
|
-
|
411
|
-
expr_bytes = srepr(sympify(expr)).encode(common.ENCODE)
|
412
|
-
return zlib.compress(expr_bytes)
|
413
|
-
|
414
|
-
|
415
|
-
def _write_symbolic_pulse(file_obj, data, use_symengine, version):
|
416
|
-
class_name_bytes = data.__class__.__name__.encode(common.ENCODE)
|
417
|
-
pulse_type_bytes = data.pulse_type.encode(common.ENCODE)
|
418
|
-
envelope_bytes = _dumps_symbolic_expr(data.envelope, use_symengine)
|
419
|
-
constraints_bytes = _dumps_symbolic_expr(data.constraints, use_symengine)
|
420
|
-
valid_amp_conditions_bytes = _dumps_symbolic_expr(data.valid_amp_conditions, use_symengine)
|
421
|
-
|
422
|
-
header_bytes = struct.pack(
|
423
|
-
formats.SYMBOLIC_PULSE_PACK_V2,
|
424
|
-
len(class_name_bytes),
|
425
|
-
len(pulse_type_bytes),
|
426
|
-
len(envelope_bytes),
|
427
|
-
len(constraints_bytes),
|
428
|
-
len(valid_amp_conditions_bytes),
|
429
|
-
data._limit_amplitude,
|
430
|
-
)
|
431
|
-
file_obj.write(header_bytes)
|
432
|
-
file_obj.write(class_name_bytes)
|
433
|
-
file_obj.write(pulse_type_bytes)
|
434
|
-
file_obj.write(envelope_bytes)
|
435
|
-
file_obj.write(constraints_bytes)
|
436
|
-
file_obj.write(valid_amp_conditions_bytes)
|
437
|
-
common.write_mapping(
|
438
|
-
file_obj,
|
439
|
-
mapping=data._params,
|
440
|
-
serializer=value.dumps_value,
|
441
|
-
version=version,
|
442
|
-
)
|
443
|
-
value.write_value(file_obj, data.duration, version=version)
|
444
|
-
value.write_value(file_obj, data.name, version=version)
|
445
|
-
|
446
|
-
|
447
|
-
def _write_alignment_context(file_obj, context, version):
|
448
|
-
type_key = type_keys.ScheduleAlignment.assign(context)
|
449
|
-
common.write_type_key(file_obj, type_key)
|
450
|
-
common.write_sequence(
|
451
|
-
file_obj, sequence=context._context_params, serializer=value.dumps_value, version=version
|
452
|
-
)
|
453
|
-
|
454
|
-
|
455
|
-
def _dumps_operand(operand, use_symengine, version):
|
456
|
-
if isinstance(operand, library.Waveform):
|
457
|
-
type_key = type_keys.ScheduleOperand.WAVEFORM
|
458
|
-
data_bytes = common.data_to_binary(operand, _write_waveform, version=version)
|
459
|
-
elif isinstance(operand, library.SymbolicPulse):
|
460
|
-
type_key = type_keys.ScheduleOperand.SYMBOLIC_PULSE
|
461
|
-
data_bytes = common.data_to_binary(
|
462
|
-
operand, _write_symbolic_pulse, use_symengine=use_symengine, version=version
|
463
|
-
)
|
464
|
-
elif isinstance(operand, channels.Channel):
|
465
|
-
type_key = type_keys.ScheduleOperand.CHANNEL
|
466
|
-
data_bytes = common.data_to_binary(operand, _write_channel, version=version)
|
467
|
-
elif isinstance(operand, str):
|
468
|
-
type_key = type_keys.ScheduleOperand.OPERAND_STR
|
469
|
-
data_bytes = operand.encode(common.ENCODE)
|
470
|
-
elif isinstance(operand, Kernel):
|
471
|
-
type_key = type_keys.ScheduleOperand.KERNEL
|
472
|
-
data_bytes = common.data_to_binary(operand, _write_kernel, version=version)
|
473
|
-
elif isinstance(operand, Discriminator):
|
474
|
-
type_key = type_keys.ScheduleOperand.DISCRIMINATOR
|
475
|
-
data_bytes = common.data_to_binary(operand, _write_discriminator, version=version)
|
476
|
-
else:
|
477
|
-
type_key, data_bytes = value.dumps_value(operand, version=version)
|
478
|
-
|
479
|
-
return type_key, data_bytes
|
480
|
-
|
481
|
-
|
482
|
-
def _write_element(file_obj, element, metadata_serializer, use_symengine, version):
|
483
|
-
if isinstance(element, ScheduleBlock):
|
484
|
-
common.write_type_key(file_obj, type_keys.Program.SCHEDULE_BLOCK)
|
485
|
-
write_schedule_block(file_obj, element, metadata_serializer, use_symengine, version=version)
|
486
|
-
else:
|
487
|
-
type_key = type_keys.ScheduleInstruction.assign(element)
|
488
|
-
common.write_type_key(file_obj, type_key)
|
489
|
-
common.write_sequence(
|
490
|
-
file_obj,
|
491
|
-
sequence=element.operands,
|
492
|
-
serializer=_dumps_operand,
|
493
|
-
use_symengine=use_symengine,
|
494
|
-
version=version,
|
495
|
-
)
|
496
|
-
value.write_value(file_obj, element.name, version=version)
|
497
|
-
|
498
|
-
|
499
|
-
def _dumps_reference_item(schedule, metadata_serializer, version):
|
500
|
-
if schedule is None:
|
501
|
-
type_key = type_keys.Value.NULL
|
502
|
-
data_bytes = b""
|
503
|
-
else:
|
504
|
-
type_key = type_keys.Program.SCHEDULE_BLOCK
|
505
|
-
data_bytes = common.data_to_binary(
|
506
|
-
obj=schedule,
|
507
|
-
serializer=write_schedule_block,
|
508
|
-
metadata_serializer=metadata_serializer,
|
509
|
-
version=version,
|
510
|
-
)
|
511
|
-
return type_key, data_bytes
|
512
|
-
|
513
|
-
|
514
|
-
@ignore_pulse_deprecation_warnings
|
515
258
|
def read_schedule_block(file_obj, version, metadata_deserializer=None, use_symengine=False):
|
516
|
-
"""
|
259
|
+
"""Consume a single ScheduleBlock from the file like object.
|
517
260
|
|
518
261
|
Args:
|
519
262
|
file_obj (File): A file like object that contains the QPY binary data.
|
@@ -530,7 +273,9 @@ def read_schedule_block(file_obj, version, metadata_deserializer=None, use_symen
|
|
530
273
|
platforms. Please check that your target platform is supported by the symengine library
|
531
274
|
before setting this option, as it will be required by qpy to deserialize the payload.
|
532
275
|
Returns:
|
533
|
-
|
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.
|
534
279
|
|
535
280
|
Raises:
|
536
281
|
TypeError: If any of the instructions is invalid data format.
|
@@ -545,91 +290,19 @@ def read_schedule_block(file_obj, version, metadata_deserializer=None, use_symen
|
|
545
290
|
file_obj.read(formats.SCHEDULE_BLOCK_HEADER_SIZE),
|
546
291
|
)
|
547
292
|
)
|
548
|
-
|
293
|
+
file_obj.read(data.name_size).decode(common.ENCODE) # read name
|
549
294
|
metadata_raw = file_obj.read(data.metadata_size)
|
550
|
-
|
551
|
-
|
295
|
+
json.loads(metadata_raw, cls=metadata_deserializer) # read metadata
|
296
|
+
_read_alignment_context(file_obj, version)
|
552
297
|
|
553
|
-
block = ScheduleBlock(
|
554
|
-
name=name,
|
555
|
-
metadata=metadata,
|
556
|
-
alignment_context=context,
|
557
|
-
)
|
558
298
|
for _ in range(data.num_elements):
|
559
|
-
|
560
|
-
block.append(block_elm, inplace=True)
|
299
|
+
_read_element(file_obj, version, metadata_deserializer, use_symengine)
|
561
300
|
|
562
301
|
# Load references
|
563
302
|
if version >= 7:
|
564
|
-
|
303
|
+
common.read_mapping(
|
565
304
|
file_obj=file_obj,
|
566
305
|
deserializer=_loads_reference_item,
|
567
306
|
version=version,
|
568
307
|
metadata_deserializer=metadata_deserializer,
|
569
308
|
)
|
570
|
-
ref_dict = {}
|
571
|
-
for key_str, schedule in flat_key_refdict.items():
|
572
|
-
if schedule is not None:
|
573
|
-
composite_key = tuple(key_str.split(instructions.Reference.key_delimiter))
|
574
|
-
ref_dict[composite_key] = schedule
|
575
|
-
if ref_dict:
|
576
|
-
block.assign_references(ref_dict, inplace=True)
|
577
|
-
|
578
|
-
return block
|
579
|
-
|
580
|
-
|
581
|
-
def write_schedule_block(
|
582
|
-
file_obj, block, metadata_serializer=None, use_symengine=False, version=common.QPY_VERSION
|
583
|
-
):
|
584
|
-
"""Write a single ScheduleBlock object in the file like object.
|
585
|
-
|
586
|
-
Args:
|
587
|
-
file_obj (File): The file like object to write the circuit data in.
|
588
|
-
block (ScheduleBlock): A schedule block data to write.
|
589
|
-
metadata_serializer (JSONEncoder): An optional JSONEncoder class that
|
590
|
-
will be passed the :attr:`.ScheduleBlock.metadata` dictionary for
|
591
|
-
``block`` and will be used as the ``cls`` kwarg
|
592
|
-
on the ``json.dump()`` call to JSON serialize that dictionary.
|
593
|
-
use_symengine (bool): If True, symbolic objects will be serialized using symengine's
|
594
|
-
native mechanism. This is a faster serialization alternative, but not supported in all
|
595
|
-
platforms. Please check that your target platform is supported by the symengine library
|
596
|
-
before setting this option, as it will be required by qpy to deserialize the payload.
|
597
|
-
version (int): The QPY format version to use for serializing this circuit block
|
598
|
-
Raises:
|
599
|
-
TypeError: If any of the instructions is invalid data format.
|
600
|
-
"""
|
601
|
-
metadata = json.dumps(block.metadata, separators=(",", ":"), cls=metadata_serializer).encode(
|
602
|
-
common.ENCODE
|
603
|
-
)
|
604
|
-
block_name = block.name.encode(common.ENCODE)
|
605
|
-
|
606
|
-
# Write schedule block header
|
607
|
-
header_raw = formats.SCHEDULE_BLOCK_HEADER(
|
608
|
-
name_size=len(block_name),
|
609
|
-
metadata_size=len(metadata),
|
610
|
-
num_elements=len(block),
|
611
|
-
)
|
612
|
-
header = struct.pack(formats.SCHEDULE_BLOCK_HEADER_PACK, *header_raw)
|
613
|
-
file_obj.write(header)
|
614
|
-
file_obj.write(block_name)
|
615
|
-
file_obj.write(metadata)
|
616
|
-
|
617
|
-
_write_alignment_context(file_obj, block.alignment_context, version=version)
|
618
|
-
for block_elm in block._blocks:
|
619
|
-
# Do not call block.blocks. This implicitly assigns references to instruction.
|
620
|
-
# This breaks original reference structure.
|
621
|
-
_write_element(file_obj, block_elm, metadata_serializer, use_symengine, version=version)
|
622
|
-
|
623
|
-
# Write references
|
624
|
-
flat_key_refdict = {}
|
625
|
-
for ref_keys, schedule in block._reference_manager.items():
|
626
|
-
# Do not call block.reference. This returns the reference of most outer program by design.
|
627
|
-
key_str = instructions.Reference.key_delimiter.join(ref_keys)
|
628
|
-
flat_key_refdict[key_str] = schedule
|
629
|
-
common.write_mapping(
|
630
|
-
file_obj=file_obj,
|
631
|
-
mapping=flat_key_refdict,
|
632
|
-
serializer=_dumps_reference_item,
|
633
|
-
metadata_serializer=metadata_serializer,
|
634
|
-
version=version,
|
635
|
-
)
|