qiskit 1.4.1__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0__cp39-abi3-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +3 -9
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +35 -10
- qiskit/circuit/{add_control.py → _add_control.py} +32 -12
- qiskit/circuit/_classical_resource_map.py +5 -3
- qiskit/circuit/barrier.py +3 -7
- qiskit/circuit/classical/expr/__init__.py +31 -3
- qiskit/circuit/classical/expr/constructors.py +236 -28
- qiskit/circuit/classical/expr/expr.py +104 -3
- qiskit/circuit/classical/expr/visitors.py +75 -0
- qiskit/circuit/classical/types/__init__.py +12 -8
- qiskit/circuit/classical/types/ordering.py +14 -7
- qiskit/circuit/classical/types/types.py +36 -0
- qiskit/circuit/commutation_checker.py +34 -7
- qiskit/circuit/controlflow/__init__.py +32 -1
- qiskit/circuit/controlflow/_builder_utils.py +9 -5
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +1 -1
- qiskit/circuit/controlflow/builder.py +139 -39
- qiskit/circuit/controlflow/continue_loop.py +1 -3
- qiskit/circuit/controlflow/control_flow.py +10 -0
- qiskit/circuit/controlflow/for_loop.py +2 -1
- qiskit/circuit/controlflow/if_else.py +3 -16
- qiskit/circuit/controlflow/switch_case.py +2 -8
- qiskit/circuit/controlflow/while_loop.py +2 -7
- qiskit/circuit/controlledgate.py +2 -4
- qiskit/circuit/delay.py +40 -11
- qiskit/circuit/duration.py +0 -15
- qiskit/circuit/gate.py +2 -4
- qiskit/circuit/instruction.py +2 -141
- qiskit/circuit/instructionset.py +7 -54
- qiskit/circuit/library/__init__.py +469 -154
- qiskit/circuit/library/arithmetic/__init__.py +16 -10
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
- qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
- qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
- qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +52 -16
- qiskit/circuit/library/data_preparation/initializer.py +1 -1
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
- qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
- qiskit/circuit/library/generalized_gates/gms.py +1 -1
- qiskit/circuit/library/generalized_gates/isometry.py +1 -1
- qiskit/circuit/library/generalized_gates/pauli.py +1 -2
- qiskit/circuit/library/generalized_gates/uc.py +97 -7
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
- qiskit/circuit/library/generalized_gates/unitary.py +4 -2
- qiskit/circuit/library/graph_state.py +1 -0
- qiskit/circuit/library/hamiltonian_gate.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
- qiskit/circuit/library/n_local/n_local.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
- qiskit/circuit/library/overlap.py +2 -2
- qiskit/circuit/library/pauli_evolution.py +39 -24
- qiskit/circuit/library/phase_oracle.py +130 -51
- qiskit/circuit/library/standard_gates/__init__.py +0 -1
- qiskit/circuit/library/standard_gates/dcx.py +3 -4
- qiskit/circuit/library/standard_gates/ecr.py +3 -4
- qiskit/circuit/library/standard_gates/global_phase.py +5 -6
- qiskit/circuit/library/standard_gates/h.py +4 -9
- qiskit/circuit/library/standard_gates/i.py +2 -2
- qiskit/circuit/library/standard_gates/iswap.py +3 -4
- qiskit/circuit/library/standard_gates/p.py +15 -34
- qiskit/circuit/library/standard_gates/r.py +7 -10
- qiskit/circuit/library/standard_gates/rx.py +5 -15
- qiskit/circuit/library/standard_gates/rxx.py +3 -6
- qiskit/circuit/library/standard_gates/ry.py +5 -17
- qiskit/circuit/library/standard_gates/ryy.py +3 -6
- qiskit/circuit/library/standard_gates/rz.py +5 -17
- qiskit/circuit/library/standard_gates/rzx.py +3 -6
- qiskit/circuit/library/standard_gates/rzz.py +3 -6
- qiskit/circuit/library/standard_gates/s.py +6 -15
- qiskit/circuit/library/standard_gates/swap.py +4 -11
- qiskit/circuit/library/standard_gates/sx.py +7 -12
- qiskit/circuit/library/standard_gates/t.py +6 -7
- qiskit/circuit/library/standard_gates/u.py +2 -10
- qiskit/circuit/library/standard_gates/u1.py +5 -16
- qiskit/circuit/library/standard_gates/u2.py +2 -6
- qiskit/circuit/library/standard_gates/u3.py +3 -11
- qiskit/circuit/library/standard_gates/x.py +14 -62
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/y.py +4 -9
- qiskit/circuit/library/standard_gates/z.py +5 -15
- qiskit/circuit/measure.py +11 -2
- qiskit/circuit/parameterexpression.py +11 -0
- qiskit/circuit/quantumcircuit.py +890 -564
- qiskit/circuit/random/utils.py +12 -6
- qiskit/circuit/reset.py +5 -2
- qiskit/circuit/singleton.py +5 -11
- qiskit/circuit/store.py +0 -8
- qiskit/circuit/tools/pi_check.py +3 -0
- qiskit/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +6 -4
- qiskit/converters/circuit_to_dagdependency.py +0 -2
- qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
- qiskit/converters/circuit_to_gate.py +1 -1
- qiskit/converters/circuit_to_instruction.py +16 -29
- qiskit/converters/dag_to_circuit.py +7 -8
- qiskit/converters/dag_to_dagdependency.py +0 -1
- qiskit/converters/dag_to_dagdependency_v2.py +0 -1
- qiskit/converters/dagdependency_to_circuit.py +0 -6
- qiskit/converters/dagdependency_to_dag.py +0 -6
- qiskit/dagcircuit/collect_blocks.py +32 -20
- qiskit/dagcircuit/dagdependency.py +3 -37
- qiskit/dagcircuit/dagdependency_v2.py +5 -82
- qiskit/dagcircuit/dagnode.py +14 -2
- qiskit/passmanager/__init__.py +24 -6
- qiskit/passmanager/passmanager.py +26 -24
- qiskit/primitives/__init__.py +44 -35
- qiskit/primitives/backend_estimator_v2.py +102 -23
- qiskit/primitives/backend_sampler_v2.py +5 -20
- qiskit/primitives/base/__init__.py +4 -4
- qiskit/primitives/base/base_estimator.py +77 -82
- qiskit/primitives/base/base_primitive_job.py +2 -2
- qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
- qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
- qiskit/primitives/base/base_sampler.py +52 -60
- qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
- qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
- qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
- qiskit/primitives/containers/bindings_array.py +3 -1
- qiskit/primitives/containers/bit_array.py +23 -0
- qiskit/primitives/containers/data_bin.py +3 -1
- qiskit/primitives/containers/observables_array.py +19 -2
- qiskit/primitives/statevector_sampler.py +6 -8
- qiskit/primitives/utils.py +14 -189
- qiskit/providers/__init__.py +4 -130
- qiskit/providers/backend.py +11 -314
- qiskit/providers/basic_provider/__init__.py +3 -1
- qiskit/providers/basic_provider/basic_provider.py +29 -9
- qiskit/providers/basic_provider/basic_simulator.py +158 -298
- qiskit/providers/exceptions.py +0 -33
- qiskit/providers/fake_provider/__init__.py +0 -37
- qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
- qiskit/qasm2/__init__.py +21 -6
- qiskit/qasm2/export.py +2 -10
- qiskit/qasm2/parse.py +11 -25
- qiskit/qasm3/__init__.py +5 -1
- qiskit/qasm3/ast.py +44 -0
- qiskit/qasm3/exporter.py +65 -27
- qiskit/qasm3/printer.py +35 -4
- qiskit/qpy/__init__.py +162 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +96 -116
- qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
- qiskit/qpy/binary_io/schedules.py +61 -388
- qiskit/qpy/binary_io/value.py +159 -33
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +29 -62
- qiskit/qpy/type_keys.py +58 -221
- qiskit/quantum_info/analysis/distance.py +3 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
- qiskit/quantum_info/operators/operator.py +6 -2
- qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
- qiskit/quantum_info/states/densitymatrix.py +16 -6
- qiskit/quantum_info/states/stabilizerstate.py +35 -4
- qiskit/quantum_info/states/statevector.py +16 -6
- qiskit/result/__init__.py +5 -17
- qiskit/result/models.py +18 -11
- qiskit/result/result.py +38 -134
- qiskit/result/sampled_expval.py +1 -2
- qiskit/result/utils.py +3 -4
- qiskit/synthesis/__init__.py +21 -1
- qiskit/synthesis/arithmetic/__init__.py +3 -1
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
- qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
- qiskit/synthesis/evolution/lie_trotter.py +10 -7
- qiskit/synthesis/evolution/product_formula.py +44 -35
- qiskit/synthesis/evolution/qdrift.py +17 -24
- qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
- qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
- qiskit/synthesis/two_qubit/__init__.py +1 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
- qiskit/transpiler/__init__.py +32 -232
- qiskit/transpiler/basepasses.py +20 -51
- qiskit/transpiler/layout.py +1 -1
- qiskit/transpiler/passes/__init__.py +4 -40
- qiskit/transpiler/passes/basis/basis_translator.py +5 -4
- qiskit/transpiler/passes/basis/decompose.py +1 -15
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
- qiskit/transpiler/passes/layout/apply_layout.py +4 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
- qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
- qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
- qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
- qiskit/transpiler/passes/optimization/__init__.py +2 -3
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
- qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
- qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +3 -2
- qiskit/transpiler/passes/routing/__init__.py +0 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
- qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
- qiskit/transpiler/passes/scheduling/__init__.py +1 -7
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
- qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
- qiskit/transpiler/passes/synthesis/plugin.py +4 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
- qiskit/transpiler/passes/utils/control_flow.py +2 -6
- qiskit/transpiler/passes/utils/gate_direction.py +7 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
- qiskit/transpiler/passmanager.py +13 -0
- qiskit/transpiler/passmanager_config.py +5 -81
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
- qiskit/transpiler/preset_passmanagers/common.py +140 -167
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
- qiskit/transpiler/preset_passmanagers/level0.py +2 -11
- qiskit/transpiler/preset_passmanagers/level1.py +2 -14
- qiskit/transpiler/preset_passmanagers/level2.py +2 -12
- qiskit/transpiler/preset_passmanagers/level3.py +2 -11
- qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
- qiskit/transpiler/target.py +78 -524
- qiskit/user_config.py +8 -4
- qiskit/utils/__init__.py +13 -12
- qiskit/utils/deprecation.py +4 -112
- qiskit/utils/optionals.py +11 -4
- qiskit/utils/parallel.py +214 -87
- qiskit/utils/units.py +4 -1
- qiskit/visualization/__init__.py +3 -7
- qiskit/visualization/array.py +4 -1
- qiskit/visualization/bloch.py +1 -1
- qiskit/visualization/circuit/_utils.py +19 -19
- qiskit/visualization/circuit/circuit_visualization.py +11 -4
- qiskit/visualization/circuit/matplotlib.py +13 -23
- qiskit/visualization/circuit/text.py +7 -3
- qiskit/visualization/counts_visualization.py +4 -0
- qiskit/visualization/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/library.py +4 -1
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +19 -2
- qiskit/visualization/timeline/core.py +19 -13
- qiskit/visualization/timeline/interface.py +19 -18
- qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
- qiskit/assembler/__init__.py +0 -42
- qiskit/assembler/assemble_circuits.py +0 -451
- qiskit/assembler/assemble_schedules.py +0 -367
- qiskit/assembler/disassemble.py +0 -310
- qiskit/assembler/run_config.py +0 -77
- qiskit/circuit/bit.py +0 -106
- qiskit/circuit/classicalfunction/__init__.py +0 -152
- qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
- qiskit/circuit/classicalfunction/classical_element.py +0 -54
- qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
- qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
- qiskit/circuit/classicalfunction/exceptions.py +0 -41
- qiskit/circuit/classicalfunction/types.py +0 -18
- qiskit/circuit/classicalfunction/utils.py +0 -91
- qiskit/circuit/classicalregister.py +0 -57
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
- qiskit/circuit/quantumregister.py +0 -75
- qiskit/circuit/register.py +0 -246
- qiskit/compiler/assembler.py +0 -689
- qiskit/compiler/scheduler.py +0 -109
- qiskit/compiler/sequencer.py +0 -71
- qiskit/primitives/backend_estimator.py +0 -486
- qiskit/primitives/backend_sampler.py +0 -222
- qiskit/primitives/estimator.py +0 -172
- qiskit/primitives/sampler.py +0 -162
- qiskit/providers/backend_compat.py +0 -507
- qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
- qiskit/providers/fake_provider/fake_1q.py +0 -91
- qiskit/providers/fake_provider/fake_backend.py +0 -165
- qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
- qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
- qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
- qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
- qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
- qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
- qiskit/providers/models/__init__.py +0 -89
- qiskit/providers/models/backendconfiguration.py +0 -1040
- qiskit/providers/models/backendproperties.py +0 -535
- qiskit/providers/models/backendstatus.py +0 -104
- qiskit/providers/models/jobstatus.py +0 -77
- qiskit/providers/models/pulsedefaults.py +0 -305
- qiskit/providers/provider.py +0 -95
- qiskit/pulse/__init__.py +0 -158
- qiskit/pulse/builder.py +0 -2262
- qiskit/pulse/calibration_entries.py +0 -381
- qiskit/pulse/channels.py +0 -227
- qiskit/pulse/configuration.py +0 -245
- qiskit/pulse/exceptions.py +0 -45
- qiskit/pulse/filters.py +0 -309
- qiskit/pulse/instruction_schedule_map.py +0 -424
- qiskit/pulse/instructions/__init__.py +0 -67
- qiskit/pulse/instructions/acquire.py +0 -150
- qiskit/pulse/instructions/delay.py +0 -71
- qiskit/pulse/instructions/directives.py +0 -154
- qiskit/pulse/instructions/frequency.py +0 -135
- qiskit/pulse/instructions/instruction.py +0 -270
- qiskit/pulse/instructions/phase.py +0 -152
- qiskit/pulse/instructions/play.py +0 -99
- qiskit/pulse/instructions/reference.py +0 -100
- qiskit/pulse/instructions/snapshot.py +0 -82
- qiskit/pulse/library/__init__.py +0 -97
- qiskit/pulse/library/continuous.py +0 -430
- qiskit/pulse/library/pulse.py +0 -148
- qiskit/pulse/library/samplers/__init__.py +0 -15
- qiskit/pulse/library/samplers/decorators.py +0 -295
- qiskit/pulse/library/samplers/strategies.py +0 -71
- qiskit/pulse/library/symbolic_pulses.py +0 -1989
- qiskit/pulse/library/waveform.py +0 -136
- qiskit/pulse/macros.py +0 -262
- qiskit/pulse/parameter_manager.py +0 -445
- qiskit/pulse/parser.py +0 -314
- qiskit/pulse/reference_manager.py +0 -58
- qiskit/pulse/schedule.py +0 -1854
- qiskit/pulse/transforms/__init__.py +0 -106
- qiskit/pulse/transforms/alignments.py +0 -406
- qiskit/pulse/transforms/base_transforms.py +0 -71
- qiskit/pulse/transforms/canonicalization.py +0 -498
- qiskit/pulse/transforms/dag.py +0 -122
- qiskit/pulse/utils.py +0 -149
- qiskit/qobj/__init__.py +0 -75
- qiskit/qobj/common.py +0 -81
- qiskit/qobj/converters/__init__.py +0 -18
- qiskit/qobj/converters/lo_config.py +0 -177
- qiskit/qobj/converters/pulse_instruction.py +0 -897
- qiskit/qobj/pulse_qobj.py +0 -709
- qiskit/qobj/qasm_qobj.py +0 -708
- qiskit/qobj/utils.py +0 -46
- qiskit/result/mitigation/base_readout_mitigator.py +0 -79
- qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
- qiskit/result/mitigation/local_readout_mitigator.py +0 -328
- qiskit/result/mitigation/utils.py +0 -217
- qiskit/scheduler/__init__.py +0 -40
- qiskit/scheduler/config.py +0 -37
- qiskit/scheduler/lowering.py +0 -187
- qiskit/scheduler/methods/__init__.py +0 -15
- qiskit/scheduler/methods/basic.py +0 -140
- qiskit/scheduler/schedule_circuit.py +0 -69
- qiskit/scheduler/sequence.py +0 -104
- qiskit/transpiler/passes/calibration/__init__.py +0 -17
- qiskit/transpiler/passes/calibration/base_builder.py +0 -79
- qiskit/transpiler/passes/calibration/builders.py +0 -20
- qiskit/transpiler/passes/calibration/exceptions.py +0 -22
- qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
- qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
- qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
- qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
- qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
- qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
- qiskit/transpiler/passes/scheduling/alap.py +0 -153
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
- qiskit/transpiler/passes/scheduling/asap.py +0 -175
- qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
- qiskit/utils/deprecate_pulse.py +0 -119
- qiskit/utils/multiprocessing.py +0 -56
- qiskit/visualization/pulse_v2/__init__.py +0 -21
- qiskit/visualization/pulse_v2/core.py +0 -901
- qiskit/visualization/pulse_v2/device_info.py +0 -173
- qiskit/visualization/pulse_v2/drawings.py +0 -253
- qiskit/visualization/pulse_v2/events.py +0 -254
- qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
- qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
- qiskit/visualization/pulse_v2/generators/chart.py +0 -208
- qiskit/visualization/pulse_v2/generators/frame.py +0 -436
- qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
- qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
- qiskit/visualization/pulse_v2/interface.py +0 -459
- qiskit/visualization/pulse_v2/layouts.py +0 -387
- qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
- qiskit/visualization/pulse_v2/stylesheet.py +0 -312
- qiskit/visualization/pulse_v2/types.py +0 -242
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
- {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
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 (
|
@@ -34,6 +34,7 @@ from qiskit.circuit.parameterexpression import (
|
|
34
34
|
)
|
35
35
|
from qiskit.circuit.parametervector import ParameterVector, ParameterVectorElement
|
36
36
|
from qiskit.qpy import common, formats, exceptions, type_keys
|
37
|
+
from qiskit.qpy.binary_io.parse_sympy_repr import parse_sympy_repr
|
37
38
|
|
38
39
|
|
39
40
|
def _write_parameter(file_obj, obj):
|
@@ -165,17 +166,9 @@ def _write_parameter_expression_v13(file_obj, obj, version):
|
|
165
166
|
|
166
167
|
def _write_parameter_expression(file_obj, obj, use_symengine, *, version):
|
167
168
|
extra_symbols = None
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
else:
|
172
|
-
from sympy import srepr, sympify
|
173
|
-
|
174
|
-
expr_bytes = srepr(sympify(obj._symbol_expr)).encode(common.ENCODE)
|
175
|
-
else:
|
176
|
-
with io.BytesIO() as buf:
|
177
|
-
extra_symbols = _write_parameter_expression_v13(buf, obj, version)
|
178
|
-
expr_bytes = buf.getvalue()
|
169
|
+
with io.BytesIO() as buf:
|
170
|
+
extra_symbols = _write_parameter_expression_v13(buf, obj, version)
|
171
|
+
expr_bytes = buf.getvalue()
|
179
172
|
symbol_table_len = len(obj._parameter_symbols)
|
180
173
|
if extra_symbols:
|
181
174
|
symbol_table_len += 2 * len(extra_symbols)
|
@@ -271,12 +264,15 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
271
264
|
self.standalone_var_indices = standalone_var_indices
|
272
265
|
self.version = version
|
273
266
|
|
267
|
+
def _write_expr_type(self, type_, /):
|
268
|
+
_write_expr_type(self.file_obj, type_, self.version)
|
269
|
+
|
274
270
|
def visit_generic(self, node, /):
|
275
271
|
raise exceptions.QpyError(f"unhandled Expr object '{node}'")
|
276
272
|
|
277
273
|
def visit_var(self, node, /):
|
278
274
|
self.file_obj.write(type_keys.Expression.VAR)
|
279
|
-
_write_expr_type(
|
275
|
+
self._write_expr_type(node.type)
|
280
276
|
if node.standalone:
|
281
277
|
self.file_obj.write(type_keys.ExprVar.UUID)
|
282
278
|
self.file_obj.write(
|
@@ -304,9 +300,19 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
304
300
|
else:
|
305
301
|
raise exceptions.QpyError(f"unhandled Var object '{node.var}'")
|
306
302
|
|
303
|
+
def visit_stretch(self, node, /):
|
304
|
+
self.file_obj.write(type_keys.Expression.STRETCH)
|
305
|
+
self._write_expr_type(node.type)
|
306
|
+
self.file_obj.write(
|
307
|
+
struct.pack(
|
308
|
+
formats.EXPRESSION_STRETCH_PACK,
|
309
|
+
*formats.EXPRESSION_STRETCH(self.standalone_var_indices[node]),
|
310
|
+
)
|
311
|
+
)
|
312
|
+
|
307
313
|
def visit_value(self, node, /):
|
308
314
|
self.file_obj.write(type_keys.Expression.VALUE)
|
309
|
-
_write_expr_type(
|
315
|
+
self._write_expr_type(node.type)
|
310
316
|
if node.value is True or node.value is False:
|
311
317
|
self.file_obj.write(type_keys.ExprValue.BOOL)
|
312
318
|
self.file_obj.write(
|
@@ -327,12 +333,20 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
327
333
|
struct.pack(formats.EXPR_VALUE_INT_PACK, *formats.EXPR_VALUE_INT(num_bytes))
|
328
334
|
)
|
329
335
|
self.file_obj.write(buffer)
|
336
|
+
elif isinstance(node.value, float):
|
337
|
+
self.file_obj.write(type_keys.ExprValue.FLOAT)
|
338
|
+
self.file_obj.write(
|
339
|
+
struct.pack(formats.EXPR_VALUE_FLOAT_PACK, *formats.EXPR_VALUE_FLOAT(node.value))
|
340
|
+
)
|
341
|
+
elif isinstance(node.value, Duration):
|
342
|
+
self.file_obj.write(type_keys.ExprValue.DURATION)
|
343
|
+
_write_duration(self.file_obj, node.value)
|
330
344
|
else:
|
331
345
|
raise exceptions.QpyError(f"unhandled Value object '{node.value}'")
|
332
346
|
|
333
347
|
def visit_cast(self, node, /):
|
334
348
|
self.file_obj.write(type_keys.Expression.CAST)
|
335
|
-
_write_expr_type(
|
349
|
+
self._write_expr_type(node.type)
|
336
350
|
self.file_obj.write(
|
337
351
|
struct.pack(formats.EXPRESSION_CAST_PACK, *formats.EXPRESSION_CAST(node.implicit))
|
338
352
|
)
|
@@ -340,7 +354,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
340
354
|
|
341
355
|
def visit_unary(self, node, /):
|
342
356
|
self.file_obj.write(type_keys.Expression.UNARY)
|
343
|
-
_write_expr_type(
|
357
|
+
self._write_expr_type(node.type)
|
344
358
|
self.file_obj.write(
|
345
359
|
struct.pack(formats.EXPRESSION_UNARY_PACK, *formats.EXPRESSION_UNARY(node.op.value))
|
346
360
|
)
|
@@ -348,7 +362,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
348
362
|
|
349
363
|
def visit_binary(self, node, /):
|
350
364
|
self.file_obj.write(type_keys.Expression.BINARY)
|
351
|
-
_write_expr_type(
|
365
|
+
self._write_expr_type(node.type)
|
352
366
|
self.file_obj.write(
|
353
367
|
struct.pack(formats.EXPRESSION_BINARY_PACK, *formats.EXPRESSION_BINARY(node.op.value))
|
354
368
|
)
|
@@ -361,7 +375,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
361
375
|
"the 'Index' expression", required=12, target=self.version
|
362
376
|
)
|
363
377
|
self.file_obj.write(type_keys.Expression.INDEX)
|
364
|
-
_write_expr_type(
|
378
|
+
self._write_expr_type(node.type)
|
365
379
|
node.target.accept(self)
|
366
380
|
node.index.accept(self)
|
367
381
|
|
@@ -376,7 +390,7 @@ def _write_expr(
|
|
376
390
|
node.accept(_ExprWriter(file_obj, clbit_indices, standalone_var_indices, version))
|
377
391
|
|
378
392
|
|
379
|
-
def _write_expr_type(file_obj, type_: types.Type):
|
393
|
+
def _write_expr_type(file_obj, type_: types.Type, version: int):
|
380
394
|
if type_.kind is types.Bool:
|
381
395
|
file_obj.write(type_keys.ExprType.BOOL)
|
382
396
|
elif type_.kind is types.Uint:
|
@@ -384,10 +398,51 @@ def _write_expr_type(file_obj, type_: types.Type):
|
|
384
398
|
file_obj.write(
|
385
399
|
struct.pack(formats.EXPR_TYPE_UINT_PACK, *formats.EXPR_TYPE_UINT(type_.width))
|
386
400
|
)
|
401
|
+
elif type_.kind is types.Float:
|
402
|
+
if version < 14:
|
403
|
+
raise exceptions.UnsupportedFeatureForVersion(
|
404
|
+
"float-typed expressions", required=14, target=version
|
405
|
+
)
|
406
|
+
file_obj.write(type_keys.ExprType.FLOAT)
|
407
|
+
elif type_.kind is types.Duration:
|
408
|
+
if version < 14:
|
409
|
+
raise exceptions.UnsupportedFeatureForVersion(
|
410
|
+
"duration-typed expressions", required=14, target=version
|
411
|
+
)
|
412
|
+
file_obj.write(type_keys.ExprType.DURATION)
|
387
413
|
else:
|
388
414
|
raise exceptions.QpyError(f"unhandled Type object '{type_};")
|
389
415
|
|
390
416
|
|
417
|
+
def _write_duration(file_obj, duration: Duration):
|
418
|
+
unit = duration.unit()
|
419
|
+
if unit == "dt":
|
420
|
+
file_obj.write(type_keys.CircuitDuration.DT)
|
421
|
+
file_obj.write(
|
422
|
+
struct.pack(formats.DURATION_DT_PACK, *formats.DURATION_DT(duration.value()))
|
423
|
+
)
|
424
|
+
elif unit == "ns":
|
425
|
+
file_obj.write(type_keys.CircuitDuration.NS)
|
426
|
+
file_obj.write(
|
427
|
+
struct.pack(formats.DURATION_NS_PACK, *formats.DURATION_NS(duration.value()))
|
428
|
+
)
|
429
|
+
elif unit == "us":
|
430
|
+
file_obj.write(type_keys.CircuitDuration.US)
|
431
|
+
file_obj.write(
|
432
|
+
struct.pack(formats.DURATION_US_PACK, *formats.DURATION_US(duration.value()))
|
433
|
+
)
|
434
|
+
elif unit == "ms":
|
435
|
+
file_obj.write(type_keys.CircuitDuration.MS)
|
436
|
+
file_obj.write(
|
437
|
+
struct.pack(formats.DURATION_MS_PACK, *formats.DURATION_MS(duration.value()))
|
438
|
+
)
|
439
|
+
elif unit == "s":
|
440
|
+
file_obj.write(type_keys.CircuitDuration.S)
|
441
|
+
file_obj.write(struct.pack(formats.DURATION_S_PACK, *formats.DURATION_S(duration.value())))
|
442
|
+
else:
|
443
|
+
raise exceptions.QpyError(f"unhandled Duration object '{duration};")
|
444
|
+
|
445
|
+
|
391
446
|
def _read_parameter(file_obj):
|
392
447
|
data = formats.PARAMETER(
|
393
448
|
*struct.unpack(formats.PARAMETER_PACK, file_obj.read(formats.PARAMETER_SIZE))
|
@@ -419,9 +474,9 @@ def _read_parameter_expression(file_obj):
|
|
419
474
|
data = formats.PARAMETER_EXPR(
|
420
475
|
*struct.unpack(formats.PARAMETER_EXPR_PACK, file_obj.read(formats.PARAMETER_EXPR_SIZE))
|
421
476
|
)
|
422
|
-
from sympy.parsing.sympy_parser import parse_expr
|
423
477
|
|
424
|
-
|
478
|
+
sympy_str = file_obj.read(data.expr_size).decode(common.ENCODE)
|
479
|
+
expr_ = symengine.sympify(parse_sympy_repr(sympy_str))
|
425
480
|
symbol_map = {}
|
426
481
|
for _ in range(data.map_elements):
|
427
482
|
elem_data = formats.PARAM_EXPR_MAP_ELEM(
|
@@ -460,9 +515,8 @@ def _read_parameter_expression_v3(file_obj, vectors, use_symengine):
|
|
460
515
|
if use_symengine:
|
461
516
|
expr_ = common.load_symengine_payload(payload)
|
462
517
|
else:
|
463
|
-
|
464
|
-
|
465
|
-
expr_ = symengine.sympify(parse_expr(payload.decode(common.ENCODE)))
|
518
|
+
sympy_str = payload.decode(common.ENCODE)
|
519
|
+
expr_ = symengine.sympify(parse_sympy_repr(sympy_str))
|
466
520
|
|
467
521
|
symbol_map = {}
|
468
522
|
for _ in range(data.map_elements):
|
@@ -676,6 +730,13 @@ def _read_expr(
|
|
676
730
|
name = file_obj.read(payload.reg_name_size).decode(common.ENCODE)
|
677
731
|
return expr.Var(cregs[name], type_)
|
678
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]
|
679
740
|
if type_key == type_keys.Expression.VALUE:
|
680
741
|
value_type_key = file_obj.read(formats.EXPR_VALUE_DISCRIMINATOR_SIZE)
|
681
742
|
if value_type_key == type_keys.ExprValue.BOOL:
|
@@ -694,6 +755,16 @@ def _read_expr(
|
|
694
755
|
return expr.Value(
|
695
756
|
int.from_bytes(file_obj.read(payload.num_bytes), "big", signed=True), type_
|
696
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_)
|
697
768
|
raise exceptions.QpyError("Invalid classical-expression Value key '{value_type_key}'")
|
698
769
|
if type_key == type_keys.Expression.CAST:
|
699
770
|
payload = formats.EXPRESSION_CAST._make(
|
@@ -743,9 +814,43 @@ def _read_expr_type(file_obj) -> types.Type:
|
|
743
814
|
struct.unpack(formats.EXPR_TYPE_UINT_PACK, file_obj.read(formats.EXPR_TYPE_UINT_SIZE))
|
744
815
|
)
|
745
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()
|
746
821
|
raise exceptions.QpyError(f"Invalid classical-expression Type key '{type_key}'")
|
747
822
|
|
748
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
|
+
|
749
854
|
def read_standalone_vars(file_obj, num_vars):
|
750
855
|
"""Read the ``num_vars`` standalone variable declarations from the file.
|
751
856
|
|
@@ -762,6 +867,8 @@ def read_standalone_vars(file_obj, num_vars):
|
|
762
867
|
type_keys.ExprVarDeclaration.INPUT: [],
|
763
868
|
type_keys.ExprVarDeclaration.CAPTURE: [],
|
764
869
|
type_keys.ExprVarDeclaration.LOCAL: [],
|
870
|
+
type_keys.ExprVarDeclaration.STRETCH_CAPTURE: [],
|
871
|
+
type_keys.ExprVarDeclaration.STRETCH_LOCAL: [],
|
765
872
|
}
|
766
873
|
var_order = []
|
767
874
|
for _ in range(num_vars):
|
@@ -773,13 +880,19 @@ def read_standalone_vars(file_obj, num_vars):
|
|
773
880
|
)
|
774
881
|
type_ = _read_expr_type(file_obj)
|
775
882
|
name = file_obj.read(data.name_size).decode(common.ENCODE)
|
776
|
-
|
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)
|
777
890
|
read_vars[data.usage].append(var)
|
778
891
|
var_order.append(var)
|
779
892
|
return read_vars, var_order
|
780
893
|
|
781
894
|
|
782
|
-
def _write_standalone_var(file_obj, var, type_key):
|
895
|
+
def _write_standalone_var(file_obj, var, type_key, version):
|
783
896
|
name = var.name.encode(common.ENCODE)
|
784
897
|
file_obj.write(
|
785
898
|
struct.pack(
|
@@ -787,33 +900,46 @@ def _write_standalone_var(file_obj, var, type_key):
|
|
787
900
|
*formats.EXPR_VAR_DECLARATION(var.var.bytes, type_key, len(name)),
|
788
901
|
)
|
789
902
|
)
|
790
|
-
_write_expr_type(file_obj, var.type)
|
903
|
+
_write_expr_type(file_obj, var.type, version)
|
791
904
|
file_obj.write(name)
|
792
905
|
|
793
906
|
|
794
|
-
def write_standalone_vars(file_obj, circuit):
|
907
|
+
def write_standalone_vars(file_obj, circuit, version):
|
795
908
|
"""Write the standalone variables out from a circuit.
|
796
909
|
|
797
910
|
Args:
|
798
911
|
file_obj (File): the file-like object to write to.
|
799
912
|
circuit (QuantumCircuit): the circuit to take the variables from.
|
913
|
+
version (int): the QPY target version.
|
800
914
|
|
801
915
|
Returns:
|
802
|
-
dict[expr.Var, int]: a mapping of the variables written to the
|
803
|
-
|
916
|
+
dict[expr.Var | expr.Stretch, int]: a mapping of the variables written to the
|
917
|
+
index that they were written at.
|
804
918
|
"""
|
805
919
|
index = 0
|
806
920
|
out = {}
|
807
921
|
for var in circuit.iter_input_vars():
|
808
|
-
_write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.INPUT)
|
922
|
+
_write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.INPUT, version)
|
809
923
|
out[var] = index
|
810
924
|
index += 1
|
811
925
|
for var in circuit.iter_captured_vars():
|
812
|
-
_write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.CAPTURE)
|
926
|
+
_write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.CAPTURE, version)
|
813
927
|
out[var] = index
|
814
928
|
index += 1
|
815
929
|
for var in circuit.iter_declared_vars():
|
816
|
-
_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)
|
817
943
|
out[var] = index
|
818
944
|
index += 1
|
819
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
|
|