qiskit 1.4.0__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0rc1__cp39-abi3-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +2 -5
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +24 -5
- qiskit/circuit/{add_control.py → _add_control.py} +32 -12
- qiskit/circuit/_classical_resource_map.py +5 -3
- qiskit/circuit/barrier.py +3 -7
- qiskit/circuit/classical/expr/__init__.py +31 -3
- qiskit/circuit/classical/expr/constructors.py +248 -28
- qiskit/circuit/classical/expr/expr.py +104 -3
- qiskit/circuit/classical/expr/visitors.py +75 -0
- qiskit/circuit/classical/types/__init__.py +12 -8
- qiskit/circuit/classical/types/ordering.py +14 -7
- qiskit/circuit/classical/types/types.py +36 -0
- qiskit/circuit/commutation_checker.py +34 -7
- qiskit/circuit/controlflow/__init__.py +32 -1
- qiskit/circuit/controlflow/_builder_utils.py +9 -5
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +1 -1
- qiskit/circuit/controlflow/builder.py +139 -39
- qiskit/circuit/controlflow/continue_loop.py +1 -3
- qiskit/circuit/controlflow/control_flow.py +10 -0
- qiskit/circuit/controlflow/for_loop.py +2 -1
- qiskit/circuit/controlflow/if_else.py +3 -16
- qiskit/circuit/controlflow/switch_case.py +2 -8
- qiskit/circuit/controlflow/while_loop.py +2 -7
- qiskit/circuit/controlledgate.py +2 -4
- qiskit/circuit/delay.py +40 -11
- qiskit/circuit/duration.py +0 -15
- qiskit/circuit/gate.py +2 -4
- qiskit/circuit/instruction.py +7 -140
- 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 +168 -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 +5 -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 +27 -12
- qiskit/visualization/timeline/interface.py +23 -18
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +2 -1
- {qiskit-1.4.0.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.0.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
qiskit/qpy/binary_io/value.py
CHANGED
@@ -23,7 +23,7 @@ import numpy as np
|
|
23
23
|
import symengine
|
24
24
|
|
25
25
|
|
26
|
-
from qiskit.circuit import CASE_DEFAULT, Clbit, ClassicalRegister
|
26
|
+
from qiskit.circuit import CASE_DEFAULT, Clbit, ClassicalRegister, Duration
|
27
27
|
from qiskit.circuit.classical import expr, types
|
28
28
|
from qiskit.circuit.parameter import Parameter
|
29
29
|
from qiskit.circuit.parameterexpression import (
|
@@ -142,6 +142,8 @@ def _encode_replay_subs(subs, file_obj, version):
|
|
142
142
|
|
143
143
|
|
144
144
|
def _write_parameter_expression_v13(file_obj, obj, version):
|
145
|
+
# A symbol is `Parameter` or `ParameterVectorElement`.
|
146
|
+
# `symbol_map` maps symbols to ParameterExpression (which may be a symbol).
|
145
147
|
symbol_map = {}
|
146
148
|
for inst in obj._qpy_replay:
|
147
149
|
if isinstance(inst, _SUBS):
|
@@ -163,17 +165,9 @@ def _write_parameter_expression_v13(file_obj, obj, version):
|
|
163
165
|
|
164
166
|
def _write_parameter_expression(file_obj, obj, use_symengine, *, version):
|
165
167
|
extra_symbols = None
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
else:
|
170
|
-
from sympy import srepr, sympify
|
171
|
-
|
172
|
-
expr_bytes = srepr(sympify(obj._symbol_expr)).encode(common.ENCODE)
|
173
|
-
else:
|
174
|
-
with io.BytesIO() as buf:
|
175
|
-
extra_symbols = _write_parameter_expression_v13(buf, obj, version)
|
176
|
-
expr_bytes = buf.getvalue()
|
168
|
+
with io.BytesIO() as buf:
|
169
|
+
extra_symbols = _write_parameter_expression_v13(buf, obj, version)
|
170
|
+
expr_bytes = buf.getvalue()
|
177
171
|
symbol_table_len = len(obj._parameter_symbols)
|
178
172
|
if extra_symbols:
|
179
173
|
symbol_table_len += 2 * len(extra_symbols)
|
@@ -234,9 +228,17 @@ def _write_parameter_expression(file_obj, obj, use_symengine, *, version):
|
|
234
228
|
# serialize key
|
235
229
|
if symbol_key == type_keys.Value.PARAMETER_VECTOR:
|
236
230
|
symbol_data = common.data_to_binary(symbol, _write_parameter_vec)
|
231
|
+
elif symbol_key == type_keys.Value.PARAMETER_EXPRESSION:
|
232
|
+
symbol_data = common.data_to_binary(
|
233
|
+
symbol,
|
234
|
+
_write_parameter_expression,
|
235
|
+
use_symengine=use_symengine,
|
236
|
+
version=version,
|
237
|
+
)
|
237
238
|
else:
|
238
239
|
symbol_data = common.data_to_binary(symbol, _write_parameter)
|
239
240
|
# serialize value
|
241
|
+
|
240
242
|
value_key, value_data = dumps_value(
|
241
243
|
symbol, version=version, use_symengine=use_symengine
|
242
244
|
)
|
@@ -261,12 +263,15 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
261
263
|
self.standalone_var_indices = standalone_var_indices
|
262
264
|
self.version = version
|
263
265
|
|
266
|
+
def _write_expr_type(self, type_, /):
|
267
|
+
_write_expr_type(self.file_obj, type_, self.version)
|
268
|
+
|
264
269
|
def visit_generic(self, node, /):
|
265
270
|
raise exceptions.QpyError(f"unhandled Expr object '{node}'")
|
266
271
|
|
267
272
|
def visit_var(self, node, /):
|
268
273
|
self.file_obj.write(type_keys.Expression.VAR)
|
269
|
-
_write_expr_type(
|
274
|
+
self._write_expr_type(node.type)
|
270
275
|
if node.standalone:
|
271
276
|
self.file_obj.write(type_keys.ExprVar.UUID)
|
272
277
|
self.file_obj.write(
|
@@ -294,9 +299,19 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
294
299
|
else:
|
295
300
|
raise exceptions.QpyError(f"unhandled Var object '{node.var}'")
|
296
301
|
|
302
|
+
def visit_stretch(self, node, /):
|
303
|
+
self.file_obj.write(type_keys.Expression.STRETCH)
|
304
|
+
self._write_expr_type(node.type)
|
305
|
+
self.file_obj.write(
|
306
|
+
struct.pack(
|
307
|
+
formats.EXPRESSION_STRETCH_PACK,
|
308
|
+
*formats.EXPRESSION_STRETCH(self.standalone_var_indices[node]),
|
309
|
+
)
|
310
|
+
)
|
311
|
+
|
297
312
|
def visit_value(self, node, /):
|
298
313
|
self.file_obj.write(type_keys.Expression.VALUE)
|
299
|
-
_write_expr_type(
|
314
|
+
self._write_expr_type(node.type)
|
300
315
|
if node.value is True or node.value is False:
|
301
316
|
self.file_obj.write(type_keys.ExprValue.BOOL)
|
302
317
|
self.file_obj.write(
|
@@ -317,12 +332,20 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
317
332
|
struct.pack(formats.EXPR_VALUE_INT_PACK, *formats.EXPR_VALUE_INT(num_bytes))
|
318
333
|
)
|
319
334
|
self.file_obj.write(buffer)
|
335
|
+
elif isinstance(node.value, float):
|
336
|
+
self.file_obj.write(type_keys.ExprValue.FLOAT)
|
337
|
+
self.file_obj.write(
|
338
|
+
struct.pack(formats.EXPR_VALUE_FLOAT_PACK, *formats.EXPR_VALUE_FLOAT(node.value))
|
339
|
+
)
|
340
|
+
elif isinstance(node.value, Duration):
|
341
|
+
self.file_obj.write(type_keys.ExprValue.DURATION)
|
342
|
+
_write_duration(self.file_obj, node.value)
|
320
343
|
else:
|
321
344
|
raise exceptions.QpyError(f"unhandled Value object '{node.value}'")
|
322
345
|
|
323
346
|
def visit_cast(self, node, /):
|
324
347
|
self.file_obj.write(type_keys.Expression.CAST)
|
325
|
-
_write_expr_type(
|
348
|
+
self._write_expr_type(node.type)
|
326
349
|
self.file_obj.write(
|
327
350
|
struct.pack(formats.EXPRESSION_CAST_PACK, *formats.EXPRESSION_CAST(node.implicit))
|
328
351
|
)
|
@@ -330,7 +353,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
330
353
|
|
331
354
|
def visit_unary(self, node, /):
|
332
355
|
self.file_obj.write(type_keys.Expression.UNARY)
|
333
|
-
_write_expr_type(
|
356
|
+
self._write_expr_type(node.type)
|
334
357
|
self.file_obj.write(
|
335
358
|
struct.pack(formats.EXPRESSION_UNARY_PACK, *formats.EXPRESSION_UNARY(node.op.value))
|
336
359
|
)
|
@@ -338,7 +361,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
338
361
|
|
339
362
|
def visit_binary(self, node, /):
|
340
363
|
self.file_obj.write(type_keys.Expression.BINARY)
|
341
|
-
_write_expr_type(
|
364
|
+
self._write_expr_type(node.type)
|
342
365
|
self.file_obj.write(
|
343
366
|
struct.pack(formats.EXPRESSION_BINARY_PACK, *formats.EXPRESSION_BINARY(node.op.value))
|
344
367
|
)
|
@@ -351,7 +374,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
351
374
|
"the 'Index' expression", required=12, target=self.version
|
352
375
|
)
|
353
376
|
self.file_obj.write(type_keys.Expression.INDEX)
|
354
|
-
_write_expr_type(
|
377
|
+
self._write_expr_type(node.type)
|
355
378
|
node.target.accept(self)
|
356
379
|
node.index.accept(self)
|
357
380
|
|
@@ -366,7 +389,7 @@ def _write_expr(
|
|
366
389
|
node.accept(_ExprWriter(file_obj, clbit_indices, standalone_var_indices, version))
|
367
390
|
|
368
391
|
|
369
|
-
def _write_expr_type(file_obj, type_: types.Type):
|
392
|
+
def _write_expr_type(file_obj, type_: types.Type, version: int):
|
370
393
|
if type_.kind is types.Bool:
|
371
394
|
file_obj.write(type_keys.ExprType.BOOL)
|
372
395
|
elif type_.kind is types.Uint:
|
@@ -374,10 +397,51 @@ def _write_expr_type(file_obj, type_: types.Type):
|
|
374
397
|
file_obj.write(
|
375
398
|
struct.pack(formats.EXPR_TYPE_UINT_PACK, *formats.EXPR_TYPE_UINT(type_.width))
|
376
399
|
)
|
400
|
+
elif type_.kind is types.Float:
|
401
|
+
if version < 14:
|
402
|
+
raise exceptions.UnsupportedFeatureForVersion(
|
403
|
+
"float-typed expressions", required=14, target=version
|
404
|
+
)
|
405
|
+
file_obj.write(type_keys.ExprType.FLOAT)
|
406
|
+
elif type_.kind is types.Duration:
|
407
|
+
if version < 14:
|
408
|
+
raise exceptions.UnsupportedFeatureForVersion(
|
409
|
+
"duration-typed expressions", required=14, target=version
|
410
|
+
)
|
411
|
+
file_obj.write(type_keys.ExprType.DURATION)
|
377
412
|
else:
|
378
413
|
raise exceptions.QpyError(f"unhandled Type object '{type_};")
|
379
414
|
|
380
415
|
|
416
|
+
def _write_duration(file_obj, duration: Duration):
|
417
|
+
unit = duration.unit()
|
418
|
+
if unit == "dt":
|
419
|
+
file_obj.write(type_keys.CircuitDuration.DT)
|
420
|
+
file_obj.write(
|
421
|
+
struct.pack(formats.DURATION_DT_PACK, *formats.DURATION_DT(duration.value()))
|
422
|
+
)
|
423
|
+
elif unit == "ns":
|
424
|
+
file_obj.write(type_keys.CircuitDuration.NS)
|
425
|
+
file_obj.write(
|
426
|
+
struct.pack(formats.DURATION_NS_PACK, *formats.DURATION_NS(duration.value()))
|
427
|
+
)
|
428
|
+
elif unit == "us":
|
429
|
+
file_obj.write(type_keys.CircuitDuration.US)
|
430
|
+
file_obj.write(
|
431
|
+
struct.pack(formats.DURATION_US_PACK, *formats.DURATION_US(duration.value()))
|
432
|
+
)
|
433
|
+
elif unit == "ms":
|
434
|
+
file_obj.write(type_keys.CircuitDuration.MS)
|
435
|
+
file_obj.write(
|
436
|
+
struct.pack(formats.DURATION_MS_PACK, *formats.DURATION_MS(duration.value()))
|
437
|
+
)
|
438
|
+
elif unit == "s":
|
439
|
+
file_obj.write(type_keys.CircuitDuration.S)
|
440
|
+
file_obj.write(struct.pack(formats.DURATION_S_PACK, *formats.DURATION_S(duration.value())))
|
441
|
+
else:
|
442
|
+
raise exceptions.QpyError(f"unhandled Duration object '{duration};")
|
443
|
+
|
444
|
+
|
381
445
|
def _read_parameter(file_obj):
|
382
446
|
data = formats.PARAMETER(
|
383
447
|
*struct.unpack(formats.PARAMETER_PACK, file_obj.read(formats.PARAMETER_SIZE))
|
@@ -516,10 +580,13 @@ def _read_parameter_expression_v13(file_obj, vectors, version):
|
|
516
580
|
symbol = _read_parameter(file_obj)
|
517
581
|
elif symbol_key == type_keys.Value.PARAMETER_VECTOR:
|
518
582
|
symbol = _read_parameter_vec(file_obj, vectors)
|
583
|
+
elif symbol_key == type_keys.Value.PARAMETER_EXPRESSION:
|
584
|
+
symbol = _read_parameter_expression_v13(file_obj, vectors, version)
|
519
585
|
else:
|
520
586
|
raise exceptions.QpyError(f"Invalid parameter expression map type: {symbol_key}")
|
521
587
|
|
522
588
|
elem_key = type_keys.Value(elem_data.type)
|
589
|
+
|
523
590
|
binary_data = file_obj.read(elem_data.size)
|
524
591
|
if elem_key == type_keys.Value.INTEGER:
|
525
592
|
value = struct.unpack("!q", binary_data)
|
@@ -534,6 +601,7 @@ def _read_parameter_expression_v13(file_obj, vectors, version):
|
|
534
601
|
binary_data,
|
535
602
|
_read_parameter_expression_v13,
|
536
603
|
vectors=vectors,
|
604
|
+
version=version,
|
537
605
|
)
|
538
606
|
else:
|
539
607
|
raise exceptions.QpyError(f"Invalid parameter expression map type: {elem_key}")
|
@@ -662,6 +730,13 @@ def _read_expr(
|
|
662
730
|
name = file_obj.read(payload.reg_name_size).decode(common.ENCODE)
|
663
731
|
return expr.Var(cregs[name], type_)
|
664
732
|
raise exceptions.QpyError("Invalid classical-expression Var key '{var_type_key}'")
|
733
|
+
if type_key == type_keys.Expression.STRETCH:
|
734
|
+
payload = formats.EXPRESSION_STRETCH._make(
|
735
|
+
struct.unpack(
|
736
|
+
formats.EXPRESSION_STRETCH_PACK, file_obj.read(formats.EXPRESSION_STRETCH_SIZE)
|
737
|
+
)
|
738
|
+
)
|
739
|
+
return standalone_vars[payload.var_index]
|
665
740
|
if type_key == type_keys.Expression.VALUE:
|
666
741
|
value_type_key = file_obj.read(formats.EXPR_VALUE_DISCRIMINATOR_SIZE)
|
667
742
|
if value_type_key == type_keys.ExprValue.BOOL:
|
@@ -680,6 +755,16 @@ def _read_expr(
|
|
680
755
|
return expr.Value(
|
681
756
|
int.from_bytes(file_obj.read(payload.num_bytes), "big", signed=True), type_
|
682
757
|
)
|
758
|
+
if value_type_key == type_keys.ExprValue.FLOAT:
|
759
|
+
payload = formats.EXPR_VALUE_FLOAT._make(
|
760
|
+
struct.unpack(
|
761
|
+
formats.EXPR_VALUE_FLOAT_PACK, file_obj.read(formats.EXPR_VALUE_FLOAT_SIZE)
|
762
|
+
)
|
763
|
+
)
|
764
|
+
return expr.Value(payload.value, type_)
|
765
|
+
if value_type_key == type_keys.ExprValue.DURATION:
|
766
|
+
value = _read_duration(file_obj)
|
767
|
+
return expr.Value(value, type_)
|
683
768
|
raise exceptions.QpyError("Invalid classical-expression Value key '{value_type_key}'")
|
684
769
|
if type_key == type_keys.Expression.CAST:
|
685
770
|
payload = formats.EXPRESSION_CAST._make(
|
@@ -729,9 +814,43 @@ def _read_expr_type(file_obj) -> types.Type:
|
|
729
814
|
struct.unpack(formats.EXPR_TYPE_UINT_PACK, file_obj.read(formats.EXPR_TYPE_UINT_SIZE))
|
730
815
|
)
|
731
816
|
return types.Uint(elem.width)
|
817
|
+
if type_key == type_keys.ExprType.FLOAT:
|
818
|
+
return types.Float()
|
819
|
+
if type_key == type_keys.ExprType.DURATION:
|
820
|
+
return types.Duration()
|
732
821
|
raise exceptions.QpyError(f"Invalid classical-expression Type key '{type_key}'")
|
733
822
|
|
734
823
|
|
824
|
+
def _read_duration(file_obj) -> Duration:
|
825
|
+
type_key = file_obj.read(formats.DURATION_DISCRIMINATOR_SIZE)
|
826
|
+
if type_key == type_keys.CircuitDuration.DT:
|
827
|
+
elem = formats.DURATION_DT._make(
|
828
|
+
struct.unpack(formats.DURATION_DT_PACK, file_obj.read(formats.DURATION_DT_SIZE))
|
829
|
+
)
|
830
|
+
return Duration.dt(elem.value)
|
831
|
+
if type_key == type_keys.CircuitDuration.NS:
|
832
|
+
elem = formats.DURATION_NS._make(
|
833
|
+
struct.unpack(formats.DURATION_NS_PACK, file_obj.read(formats.DURATION_NS_SIZE))
|
834
|
+
)
|
835
|
+
return Duration.ns(elem.value)
|
836
|
+
if type_key == type_keys.CircuitDuration.US:
|
837
|
+
elem = formats.DURATION_US._make(
|
838
|
+
struct.unpack(formats.DURATION_US_PACK, file_obj.read(formats.DURATION_US_SIZE))
|
839
|
+
)
|
840
|
+
return Duration.us(elem.value)
|
841
|
+
if type_key == type_keys.CircuitDuration.MS:
|
842
|
+
elem = formats.DURATION_MS._make(
|
843
|
+
struct.unpack(formats.DURATION_MS_PACK, file_obj.read(formats.DURATION_MS_SIZE))
|
844
|
+
)
|
845
|
+
return Duration.ms(elem.value)
|
846
|
+
if type_key == type_keys.CircuitDuration.S:
|
847
|
+
elem = formats.DURATION_S._make(
|
848
|
+
struct.unpack(formats.DURATION_S_PACK, file_obj.read(formats.DURATION_S_SIZE))
|
849
|
+
)
|
850
|
+
return Duration.s(elem.value)
|
851
|
+
raise exceptions.QpyError(f"Invalid duration Type key '{type_key}'")
|
852
|
+
|
853
|
+
|
735
854
|
def read_standalone_vars(file_obj, num_vars):
|
736
855
|
"""Read the ``num_vars`` standalone variable declarations from the file.
|
737
856
|
|
@@ -748,6 +867,8 @@ def read_standalone_vars(file_obj, num_vars):
|
|
748
867
|
type_keys.ExprVarDeclaration.INPUT: [],
|
749
868
|
type_keys.ExprVarDeclaration.CAPTURE: [],
|
750
869
|
type_keys.ExprVarDeclaration.LOCAL: [],
|
870
|
+
type_keys.ExprVarDeclaration.STRETCH_CAPTURE: [],
|
871
|
+
type_keys.ExprVarDeclaration.STRETCH_LOCAL: [],
|
751
872
|
}
|
752
873
|
var_order = []
|
753
874
|
for _ in range(num_vars):
|
@@ -759,13 +880,19 @@ def read_standalone_vars(file_obj, num_vars):
|
|
759
880
|
)
|
760
881
|
type_ = _read_expr_type(file_obj)
|
761
882
|
name = file_obj.read(data.name_size).decode(common.ENCODE)
|
762
|
-
|
883
|
+
if data.usage in {
|
884
|
+
type_keys.ExprVarDeclaration.STRETCH_CAPTURE,
|
885
|
+
type_keys.ExprVarDeclaration.STRETCH_LOCAL,
|
886
|
+
}:
|
887
|
+
var = expr.Stretch(uuid.UUID(bytes=data.uuid_bytes), name)
|
888
|
+
else:
|
889
|
+
var = expr.Var(uuid.UUID(bytes=data.uuid_bytes), type_, name=name)
|
763
890
|
read_vars[data.usage].append(var)
|
764
891
|
var_order.append(var)
|
765
892
|
return read_vars, var_order
|
766
893
|
|
767
894
|
|
768
|
-
def _write_standalone_var(file_obj, var, type_key):
|
895
|
+
def _write_standalone_var(file_obj, var, type_key, version):
|
769
896
|
name = var.name.encode(common.ENCODE)
|
770
897
|
file_obj.write(
|
771
898
|
struct.pack(
|
@@ -773,33 +900,46 @@ def _write_standalone_var(file_obj, var, type_key):
|
|
773
900
|
*formats.EXPR_VAR_DECLARATION(var.var.bytes, type_key, len(name)),
|
774
901
|
)
|
775
902
|
)
|
776
|
-
_write_expr_type(file_obj, var.type)
|
903
|
+
_write_expr_type(file_obj, var.type, version)
|
777
904
|
file_obj.write(name)
|
778
905
|
|
779
906
|
|
780
|
-
def write_standalone_vars(file_obj, circuit):
|
907
|
+
def write_standalone_vars(file_obj, circuit, version):
|
781
908
|
"""Write the standalone variables out from a circuit.
|
782
909
|
|
783
910
|
Args:
|
784
911
|
file_obj (File): the file-like object to write to.
|
785
912
|
circuit (QuantumCircuit): the circuit to take the variables from.
|
913
|
+
version (int): the QPY target version.
|
786
914
|
|
787
915
|
Returns:
|
788
|
-
dict[expr.Var, int]: a mapping of the variables written to the
|
789
|
-
|
916
|
+
dict[expr.Var | expr.Stretch, int]: a mapping of the variables written to the
|
917
|
+
index that they were written at.
|
790
918
|
"""
|
791
919
|
index = 0
|
792
920
|
out = {}
|
793
921
|
for var in circuit.iter_input_vars():
|
794
|
-
_write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.INPUT)
|
922
|
+
_write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.INPUT, version)
|
795
923
|
out[var] = index
|
796
924
|
index += 1
|
797
925
|
for var in circuit.iter_captured_vars():
|
798
|
-
_write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.CAPTURE)
|
926
|
+
_write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.CAPTURE, version)
|
799
927
|
out[var] = index
|
800
928
|
index += 1
|
801
929
|
for var in circuit.iter_declared_vars():
|
802
|
-
_write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.LOCAL)
|
930
|
+
_write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.LOCAL, version)
|
931
|
+
out[var] = index
|
932
|
+
index += 1
|
933
|
+
if version < 14 and circuit.num_stretches:
|
934
|
+
raise exceptions.UnsupportedFeatureForVersion(
|
935
|
+
"circuits containing stretch variables", required=14, target=version
|
936
|
+
)
|
937
|
+
for var in circuit.iter_captured_stretches():
|
938
|
+
_write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.STRETCH_CAPTURE, version)
|
939
|
+
out[var] = index
|
940
|
+
index += 1
|
941
|
+
for var in circuit.iter_declared_stretches():
|
942
|
+
_write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.STRETCH_LOCAL, version)
|
803
943
|
out[var] = index
|
804
944
|
index += 1
|
805
945
|
return out
|
qiskit/qpy/common.py
CHANGED
@@ -18,15 +18,12 @@ Common functions across several serialization and deserialization modules.
|
|
18
18
|
import io
|
19
19
|
import struct
|
20
20
|
|
21
|
-
import
|
22
|
-
from symengine.lib.symengine_wrapper import ( # pylint: disable = no-name-in-module
|
23
|
-
load_basic,
|
24
|
-
)
|
21
|
+
from qiskit.utils.optionals import HAS_SYMENGINE
|
25
22
|
|
26
23
|
from qiskit.qpy import formats, exceptions
|
27
24
|
|
28
|
-
QPY_VERSION =
|
29
|
-
QPY_COMPATIBILITY_VERSION =
|
25
|
+
QPY_VERSION = 14
|
26
|
+
QPY_COMPATIBILITY_VERSION = 13
|
30
27
|
ENCODE = "utf8"
|
31
28
|
|
32
29
|
|
@@ -311,13 +308,19 @@ def mapping_from_binary(binary_data, deserializer, **kwargs):
|
|
311
308
|
return mapping
|
312
309
|
|
313
310
|
|
314
|
-
|
311
|
+
@HAS_SYMENGINE.require_in_call("QPY versions 10 through 12 with symengine parameter serialization")
|
312
|
+
def load_symengine_payload(payload: bytes):
|
315
313
|
"""Load a symengine expression from it's serialized cereal payload."""
|
316
314
|
# This is a horrible hack to workaround the symengine version checking
|
317
315
|
# it's deserialization does. There were no changes to the serialization
|
318
316
|
# format between 0.11 and 0.13 but the deserializer checks that it can't
|
319
317
|
# load across a major or minor version boundary. This works around it
|
320
318
|
# by just lying about the generating version.
|
319
|
+
import symengine
|
320
|
+
from symengine.lib.symengine_wrapper import ( # pylint: disable = no-name-in-module
|
321
|
+
load_basic,
|
322
|
+
)
|
323
|
+
|
321
324
|
symengine_version = symengine.__version__.split(".")
|
322
325
|
major = payload[2]
|
323
326
|
minor = payload[3]
|
qiskit/qpy/formats.py
CHANGED
@@ -357,11 +357,23 @@ EXPRESSION_BINARY = namedtuple("EXPRESSION_BINARY", ["opcode"])
|
|
357
357
|
EXPRESSION_BINARY_PACK = "!B"
|
358
358
|
EXPRESSION_BINARY_SIZE = struct.calcsize(EXPRESSION_BINARY_PACK)
|
359
359
|
|
360
|
+
EXPRESSION_STRETCH = namedtuple("EXPRESSION_STRETCH", ["var_index"])
|
361
|
+
EXPRESSION_STRETCH_PACK = "!H"
|
362
|
+
EXPRESSION_STRETCH_SIZE = struct.calcsize(EXPRESSION_STRETCH_PACK)
|
363
|
+
|
360
364
|
|
361
365
|
# EXPR_TYPE
|
362
366
|
|
363
367
|
EXPR_TYPE_DISCRIMINATOR_SIZE = 1
|
364
368
|
|
369
|
+
EXPR_TYPE_DURATION = namedtuple("EXPR_TYPE_DURATION", [])
|
370
|
+
EXPR_TYPE_DURATION_PACK = "!"
|
371
|
+
EXPR_TYPE_DURATION_SIZE = struct.calcsize(EXPR_TYPE_DURATION_PACK)
|
372
|
+
|
373
|
+
EXPR_TYPE_FLOAT = namedtuple("EXPR_TYPE_FLOAT", [])
|
374
|
+
EXPR_TYPE_FLOAT_PACK = "!"
|
375
|
+
EXPR_TYPE_FLOAT_SIZE = struct.calcsize(EXPR_TYPE_FLOAT_PACK)
|
376
|
+
|
365
377
|
EXPR_TYPE_BOOL = namedtuple("EXPR_TYPE_BOOL", [])
|
366
378
|
EXPR_TYPE_BOOL_PACK = "!"
|
367
379
|
EXPR_TYPE_BOOL_SIZE = struct.calcsize(EXPR_TYPE_BOOL_PACK)
|
@@ -392,6 +404,10 @@ EXPR_VAR_UUID_SIZE = struct.calcsize(EXPR_VAR_UUID_PACK)
|
|
392
404
|
|
393
405
|
EXPR_VALUE_DISCRIMINATOR_SIZE = 1
|
394
406
|
|
407
|
+
EXPR_VALUE_FLOAT = namedtuple("EXPR_VALUE_FLOAT", ["value"])
|
408
|
+
EXPR_VALUE_FLOAT_PACK = "!d"
|
409
|
+
EXPR_VALUE_FLOAT_SIZE = struct.calcsize(EXPR_VALUE_FLOAT_PACK)
|
410
|
+
|
395
411
|
EXPR_VALUE_BOOL = namedtuple("EXPR_VALUE_BOOL", ["value"])
|
396
412
|
EXPR_VALUE_BOOL_PACK = "!?"
|
397
413
|
EXPR_VALUE_BOOL_SIZE = struct.calcsize(EXPR_VALUE_BOOL_PACK)
|
@@ -399,3 +415,28 @@ EXPR_VALUE_BOOL_SIZE = struct.calcsize(EXPR_VALUE_BOOL_PACK)
|
|
399
415
|
EXPR_VALUE_INT = namedtuple("EXPR_VALUE_INT", ["num_bytes"])
|
400
416
|
EXPR_VALUE_INT_PACK = "!B"
|
401
417
|
EXPR_VALUE_INT_SIZE = struct.calcsize(EXPR_VALUE_INT_PACK)
|
418
|
+
|
419
|
+
|
420
|
+
# DURATION
|
421
|
+
|
422
|
+
DURATION_DISCRIMINATOR_SIZE = 1
|
423
|
+
|
424
|
+
DURATION_DT = namedtuple("DURATION_DT", ["value"])
|
425
|
+
DURATION_DT_PACK = "!Q"
|
426
|
+
DURATION_DT_SIZE = struct.calcsize(DURATION_DT_PACK)
|
427
|
+
|
428
|
+
DURATION_NS = namedtuple("DURATION_NS", ["value"])
|
429
|
+
DURATION_NS_PACK = "!d"
|
430
|
+
DURATION_NS_SIZE = struct.calcsize(DURATION_NS_PACK)
|
431
|
+
|
432
|
+
DURATION_US = namedtuple("DURATION_US", ["value"])
|
433
|
+
DURATION_US_PACK = "!d"
|
434
|
+
DURATION_US_SIZE = struct.calcsize(DURATION_US_PACK)
|
435
|
+
|
436
|
+
DURATION_MS = namedtuple("DURATION_MS", ["value"])
|
437
|
+
DURATION_MS_PACK = "!d"
|
438
|
+
DURATION_MS_SIZE = struct.calcsize(DURATION_MS_PACK)
|
439
|
+
|
440
|
+
DURATION_S = namedtuple("DURATION_S", ["value"])
|
441
|
+
DURATION_S_PACK = "!d"
|
442
|
+
DURATION_S_SIZE = struct.calcsize(DURATION_S_PACK)
|
qiskit/qpy/interface.py
CHANGED
@@ -22,16 +22,14 @@ import warnings
|
|
22
22
|
import re
|
23
23
|
|
24
24
|
from qiskit.circuit import QuantumCircuit
|
25
|
-
from qiskit.pulse import ScheduleBlock
|
26
25
|
from qiskit.exceptions import QiskitError
|
27
26
|
from qiskit.qpy import formats, common, binary_io, type_keys
|
28
|
-
from qiskit.qpy.exceptions import
|
27
|
+
from qiskit.qpy.exceptions import QpyError
|
29
28
|
from qiskit.version import __version__
|
30
|
-
from qiskit.utils.deprecate_pulse import deprecate_pulse_arg
|
31
29
|
|
32
30
|
|
33
31
|
# pylint: disable=invalid-name
|
34
|
-
QPY_SUPPORTED_TYPES =
|
32
|
+
QPY_SUPPORTED_TYPES = QuantumCircuit
|
35
33
|
|
36
34
|
# This version pattern is taken from the pypa packaging project:
|
37
35
|
# https://github.com/pypa/packaging/blob/21.3/packaging/version.py#L223-L254
|
@@ -74,16 +72,11 @@ VERSION_PATTERN = (
|
|
74
72
|
VERSION_PATTERN_REGEX = re.compile(VERSION_PATTERN, re.VERBOSE | re.IGNORECASE)
|
75
73
|
|
76
74
|
|
77
|
-
@deprecate_pulse_arg(
|
78
|
-
"programs",
|
79
|
-
deprecation_description="Passing `ScheduleBlock` to `programs`",
|
80
|
-
predicate=lambda p: isinstance(p, ScheduleBlock),
|
81
|
-
)
|
82
75
|
def dump(
|
83
76
|
programs: Union[List[QPY_SUPPORTED_TYPES], QPY_SUPPORTED_TYPES],
|
84
77
|
file_obj: BinaryIO,
|
85
78
|
metadata_serializer: Optional[Type[JSONEncoder]] = None,
|
86
|
-
use_symengine: bool =
|
79
|
+
use_symengine: bool = False,
|
87
80
|
version: int = common.QPY_VERSION,
|
88
81
|
):
|
89
82
|
"""Write QPY binary data to a file
|
@@ -94,7 +87,10 @@ def dump(
|
|
94
87
|
|
95
88
|
For example:
|
96
89
|
|
97
|
-
..
|
90
|
+
.. plot::
|
91
|
+
:include-source:
|
92
|
+
:nofigs:
|
93
|
+
:context: reset
|
98
94
|
|
99
95
|
from qiskit.circuit import QuantumCircuit
|
100
96
|
from qiskit import qpy
|
@@ -124,18 +120,14 @@ def dump(
|
|
124
120
|
|
125
121
|
Args:
|
126
122
|
programs: QPY supported object(s) to store in the specified file like object.
|
127
|
-
QPY supports :class:`.QuantumCircuit
|
128
|
-
Different data types must be separately serialized.
|
129
|
-
Support for :class:`.ScheduleBlock` is deprecated since Qiskit 1.3.0.
|
123
|
+
QPY supports :class:`.QuantumCircuit`.
|
130
124
|
file_obj: The file like object to write the QPY data too
|
131
125
|
metadata_serializer: An optional JSONEncoder class that
|
132
126
|
will be passed the ``.metadata`` attribute for each program in ``programs`` and will be
|
133
127
|
used as the ``cls`` kwarg on the `json.dump()`` call to JSON serialize that dictionary.
|
134
|
-
use_symengine:
|
135
|
-
|
136
|
-
|
137
|
-
version is 10, 11, or 12. For QPY format version >= 13 (which is the default starting in
|
138
|
-
Qiskit 1.3.0) this flag is no longer used.
|
128
|
+
use_symengine: This flag is no longer used by QPY versions supported by this function and
|
129
|
+
will have no impact on the generated QPY payload except to set a field in a QPY v13 file
|
130
|
+
header which is unused.
|
139
131
|
version: The QPY format version to emit. By default this defaults to
|
140
132
|
the latest supported format of :attr:`~.qpy.QPY_VERSION`, however for
|
141
133
|
compatibility reasons if you need to load the generated QPY payload with an older
|
@@ -153,7 +145,7 @@ def dump(
|
|
153
145
|
|
154
146
|
.. note::
|
155
147
|
|
156
|
-
If serializing a :class:`.QuantumCircuit`
|
148
|
+
If serializing a :class:`.QuantumCircuit` that contains
|
157
149
|
:class:`.ParameterExpression` objects with ``version`` set low with the intent to
|
158
150
|
load the payload using a historical release of Qiskit, it is safest to set the
|
159
151
|
``use_symengine`` flag to ``False``. Versions of Qiskit prior to 1.2.4 cannot load
|
@@ -163,32 +155,19 @@ def dump(
|
|
163
155
|
|
164
156
|
|
165
157
|
Raises:
|
166
|
-
QpyError: When multiple data format is mixed in the output.
|
167
158
|
TypeError: When invalid data type is input.
|
168
|
-
ValueError: When an unsupported version number is passed in for the ``version`` argument
|
159
|
+
ValueError: When an unsupported version number is passed in for the ``version`` argument.
|
169
160
|
"""
|
170
161
|
if not isinstance(programs, Iterable):
|
171
162
|
programs = [programs]
|
172
163
|
|
173
|
-
|
164
|
+
# dump accepts only QuantumCircuit typed objects
|
174
165
|
for program in programs:
|
175
|
-
|
166
|
+
if not issubclass(type(program), QuantumCircuit):
|
167
|
+
raise TypeError(f"'{type(program)}' is not a supported data type.")
|
176
168
|
|
177
|
-
|
178
|
-
|
179
|
-
"Input programs contain multiple data types. "
|
180
|
-
"Different data type must be serialized separately."
|
181
|
-
)
|
182
|
-
program_type = next(iter(program_types))
|
183
|
-
|
184
|
-
if issubclass(program_type, QuantumCircuit):
|
185
|
-
type_key = type_keys.Program.CIRCUIT
|
186
|
-
writer = binary_io.write_circuit
|
187
|
-
elif program_type is ScheduleBlock:
|
188
|
-
type_key = type_keys.Program.SCHEDULE_BLOCK
|
189
|
-
writer = binary_io.write_schedule_block
|
190
|
-
else:
|
191
|
-
raise TypeError(f"'{program_type}' is not supported data type.")
|
169
|
+
type_key = type_keys.Program.CIRCUIT
|
170
|
+
writer = binary_io.write_circuit
|
192
171
|
|
193
172
|
if version is None:
|
194
173
|
version = common.QPY_VERSION
|
@@ -215,10 +194,7 @@ def dump(
|
|
215
194
|
file_obj.write(header)
|
216
195
|
common.write_type_key(file_obj, type_key)
|
217
196
|
|
218
|
-
pulse_gates = False
|
219
197
|
for program in programs:
|
220
|
-
if type_key == type_keys.Program.CIRCUIT and program._calibrations_prop:
|
221
|
-
pulse_gates = True
|
222
198
|
writer(
|
223
199
|
file_obj,
|
224
200
|
program,
|
@@ -227,13 +203,6 @@ def dump(
|
|
227
203
|
version=version,
|
228
204
|
)
|
229
205
|
|
230
|
-
if pulse_gates:
|
231
|
-
warnings.warn(
|
232
|
-
category=DeprecationWarning,
|
233
|
-
message="Pulse gates serialization is deprecated as of Qiskit 1.3. "
|
234
|
-
"It will be removed in Qiskit 2.0.",
|
235
|
-
)
|
236
|
-
|
237
206
|
|
238
207
|
def load(
|
239
208
|
file_obj: BinaryIO,
|
@@ -242,8 +211,7 @@ def load(
|
|
242
211
|
"""Load a QPY binary file
|
243
212
|
|
244
213
|
This function is used to load a serialized QPY Qiskit program file and create
|
245
|
-
:class:`~qiskit.circuit.QuantumCircuit` objects
|
246
|
-
:class:`~qiskit.pulse.schedule.ScheduleBlock` objects from its contents.
|
214
|
+
:class:`~qiskit.circuit.QuantumCircuit` objects from its contents.
|
247
215
|
For example:
|
248
216
|
|
249
217
|
.. code-block:: python
|
@@ -264,12 +232,11 @@ def load(
|
|
264
232
|
circuits = qpy.load(fd)
|
265
233
|
|
266
234
|
which will read the contents of the qpy and return a list of
|
267
|
-
:class:`~qiskit.circuit.QuantumCircuit` objects
|
268
|
-
:class:`~qiskit.pulse.schedule.ScheduleBlock` objects from the file.
|
235
|
+
:class:`~qiskit.circuit.QuantumCircuit` objects from the file.
|
269
236
|
|
270
237
|
Args:
|
271
238
|
file_obj: A file like object that contains the QPY binary
|
272
|
-
data for a circuit
|
239
|
+
data for a circuit.
|
273
240
|
metadata_deserializer: An optional JSONDecoder class
|
274
241
|
that will be used for the ``cls`` kwarg on the internal
|
275
242
|
``json.load`` call used to deserialize the JSON payload used for
|
@@ -285,6 +252,11 @@ def load(
|
|
285
252
|
Raises:
|
286
253
|
QiskitError: if ``file_obj`` is not a valid QPY file
|
287
254
|
TypeError: When invalid data type is loaded.
|
255
|
+
MissingOptionalLibraryError: If the ``symengine`` engine library is
|
256
|
+
not installed when loading a QPY version 10, 11, or 12 payload
|
257
|
+
that is using symengine symbolic encoding and contains
|
258
|
+
:class:`.ParameterExpression` instances.
|
259
|
+
QpyError: if known but unsupported data type is loaded.
|
288
260
|
"""
|
289
261
|
|
290
262
|
# identify file header version
|
@@ -347,15 +319,10 @@ def load(
|
|
347
319
|
if type_key == type_keys.Program.CIRCUIT:
|
348
320
|
loader = binary_io.read_circuit
|
349
321
|
elif type_key == type_keys.Program.SCHEDULE_BLOCK:
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
message="Pulse gates deserialization is deprecated as of Qiskit 1.3 and "
|
354
|
-
"will be removed in Qiskit 2.0. This is part of the deprecation plan for "
|
355
|
-
"the entire Qiskit Pulse package. Once Pulse is removed, `ScheduleBlock` "
|
356
|
-
"sections will be ignored when loading QPY files with pulse data.",
|
322
|
+
raise QpyError(
|
323
|
+
"Payloads of type `ScheduleBlock` cannot be loaded as of Qiskit 2.0. "
|
324
|
+
"Use an earlier version of Qiskit if you want to load `ScheduleBlock` payloads."
|
357
325
|
)
|
358
|
-
|
359
326
|
else:
|
360
327
|
raise TypeError(f"Invalid payload format data kind '{type_key}'.")
|
361
328
|
|