qiskit 1.4.2__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0__cp39-abi3-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +3 -9
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +35 -10
- qiskit/circuit/{add_control.py → _add_control.py} +32 -12
- qiskit/circuit/_classical_resource_map.py +5 -3
- qiskit/circuit/barrier.py +3 -7
- qiskit/circuit/classical/expr/__init__.py +31 -3
- qiskit/circuit/classical/expr/constructors.py +236 -28
- qiskit/circuit/classical/expr/expr.py +104 -3
- qiskit/circuit/classical/expr/visitors.py +75 -0
- qiskit/circuit/classical/types/__init__.py +12 -8
- qiskit/circuit/classical/types/ordering.py +14 -7
- qiskit/circuit/classical/types/types.py +36 -0
- qiskit/circuit/commutation_checker.py +34 -7
- qiskit/circuit/controlflow/__init__.py +32 -1
- qiskit/circuit/controlflow/_builder_utils.py +9 -5
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +1 -1
- qiskit/circuit/controlflow/builder.py +139 -39
- qiskit/circuit/controlflow/continue_loop.py +1 -3
- qiskit/circuit/controlflow/control_flow.py +10 -0
- qiskit/circuit/controlflow/for_loop.py +2 -1
- qiskit/circuit/controlflow/if_else.py +3 -16
- qiskit/circuit/controlflow/switch_case.py +2 -8
- qiskit/circuit/controlflow/while_loop.py +2 -7
- qiskit/circuit/controlledgate.py +2 -4
- qiskit/circuit/delay.py +40 -11
- qiskit/circuit/duration.py +0 -15
- qiskit/circuit/gate.py +2 -4
- qiskit/circuit/instruction.py +2 -141
- qiskit/circuit/instructionset.py +7 -54
- qiskit/circuit/library/__init__.py +469 -154
- qiskit/circuit/library/arithmetic/__init__.py +16 -10
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
- qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
- qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
- qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +52 -16
- qiskit/circuit/library/data_preparation/initializer.py +1 -1
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
- qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
- qiskit/circuit/library/generalized_gates/gms.py +1 -1
- qiskit/circuit/library/generalized_gates/isometry.py +1 -1
- qiskit/circuit/library/generalized_gates/pauli.py +1 -2
- qiskit/circuit/library/generalized_gates/uc.py +97 -7
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
- qiskit/circuit/library/generalized_gates/unitary.py +4 -2
- qiskit/circuit/library/graph_state.py +1 -0
- qiskit/circuit/library/hamiltonian_gate.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
- qiskit/circuit/library/n_local/n_local.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
- qiskit/circuit/library/overlap.py +2 -2
- qiskit/circuit/library/pauli_evolution.py +39 -24
- qiskit/circuit/library/phase_oracle.py +130 -51
- qiskit/circuit/library/standard_gates/__init__.py +0 -1
- qiskit/circuit/library/standard_gates/dcx.py +3 -4
- qiskit/circuit/library/standard_gates/ecr.py +3 -4
- qiskit/circuit/library/standard_gates/global_phase.py +5 -6
- qiskit/circuit/library/standard_gates/h.py +4 -9
- qiskit/circuit/library/standard_gates/i.py +2 -2
- qiskit/circuit/library/standard_gates/iswap.py +3 -4
- qiskit/circuit/library/standard_gates/p.py +15 -34
- qiskit/circuit/library/standard_gates/r.py +7 -10
- qiskit/circuit/library/standard_gates/rx.py +5 -15
- qiskit/circuit/library/standard_gates/rxx.py +3 -6
- qiskit/circuit/library/standard_gates/ry.py +5 -17
- qiskit/circuit/library/standard_gates/ryy.py +3 -6
- qiskit/circuit/library/standard_gates/rz.py +5 -17
- qiskit/circuit/library/standard_gates/rzx.py +3 -6
- qiskit/circuit/library/standard_gates/rzz.py +3 -6
- qiskit/circuit/library/standard_gates/s.py +6 -15
- qiskit/circuit/library/standard_gates/swap.py +4 -11
- qiskit/circuit/library/standard_gates/sx.py +7 -12
- qiskit/circuit/library/standard_gates/t.py +6 -7
- qiskit/circuit/library/standard_gates/u.py +2 -10
- qiskit/circuit/library/standard_gates/u1.py +5 -16
- qiskit/circuit/library/standard_gates/u2.py +2 -6
- qiskit/circuit/library/standard_gates/u3.py +3 -11
- qiskit/circuit/library/standard_gates/x.py +14 -62
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/y.py +4 -9
- qiskit/circuit/library/standard_gates/z.py +5 -15
- qiskit/circuit/measure.py +11 -2
- qiskit/circuit/parameterexpression.py +7 -1
- qiskit/circuit/quantumcircuit.py +890 -564
- qiskit/circuit/random/utils.py +12 -6
- qiskit/circuit/reset.py +5 -2
- qiskit/circuit/singleton.py +5 -11
- qiskit/circuit/store.py +0 -8
- qiskit/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +6 -4
- qiskit/converters/circuit_to_dagdependency.py +0 -2
- qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
- qiskit/converters/circuit_to_gate.py +1 -1
- qiskit/converters/circuit_to_instruction.py +16 -29
- qiskit/converters/dag_to_circuit.py +7 -8
- qiskit/converters/dag_to_dagdependency.py +0 -1
- qiskit/converters/dag_to_dagdependency_v2.py +0 -1
- qiskit/converters/dagdependency_to_circuit.py +0 -6
- qiskit/converters/dagdependency_to_dag.py +0 -6
- qiskit/dagcircuit/collect_blocks.py +32 -20
- qiskit/dagcircuit/dagdependency.py +3 -37
- qiskit/dagcircuit/dagdependency_v2.py +5 -82
- qiskit/dagcircuit/dagnode.py +14 -2
- qiskit/passmanager/__init__.py +24 -6
- qiskit/passmanager/passmanager.py +26 -24
- qiskit/primitives/__init__.py +44 -35
- qiskit/primitives/backend_estimator_v2.py +102 -23
- qiskit/primitives/backend_sampler_v2.py +5 -20
- qiskit/primitives/base/__init__.py +4 -4
- qiskit/primitives/base/base_estimator.py +77 -82
- qiskit/primitives/base/base_primitive_job.py +2 -2
- qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
- qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
- qiskit/primitives/base/base_sampler.py +52 -60
- qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
- qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
- qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
- qiskit/primitives/containers/bindings_array.py +3 -1
- qiskit/primitives/containers/bit_array.py +23 -0
- qiskit/primitives/containers/data_bin.py +3 -1
- qiskit/primitives/containers/observables_array.py +19 -2
- qiskit/primitives/statevector_sampler.py +6 -8
- qiskit/primitives/utils.py +14 -189
- qiskit/providers/__init__.py +4 -130
- qiskit/providers/backend.py +11 -314
- qiskit/providers/basic_provider/__init__.py +3 -1
- qiskit/providers/basic_provider/basic_provider.py +29 -9
- qiskit/providers/basic_provider/basic_simulator.py +158 -298
- qiskit/providers/exceptions.py +0 -33
- qiskit/providers/fake_provider/__init__.py +0 -37
- qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
- qiskit/qasm2/__init__.py +21 -6
- qiskit/qasm2/export.py +2 -10
- qiskit/qasm2/parse.py +11 -25
- qiskit/qasm3/__init__.py +5 -1
- qiskit/qasm3/ast.py +44 -0
- qiskit/qasm3/exporter.py +65 -27
- qiskit/qasm3/printer.py +35 -4
- qiskit/qpy/__init__.py +162 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +98 -130
- qiskit/qpy/binary_io/schedules.py +69 -439
- qiskit/qpy/binary_io/value.py +154 -31
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +34 -81
- qiskit/qpy/type_keys.py +58 -221
- qiskit/quantum_info/analysis/distance.py +3 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
- qiskit/quantum_info/operators/operator.py +6 -2
- qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
- qiskit/quantum_info/states/densitymatrix.py +16 -6
- qiskit/quantum_info/states/stabilizerstate.py +35 -4
- qiskit/quantum_info/states/statevector.py +16 -6
- qiskit/result/__init__.py +5 -17
- qiskit/result/models.py +18 -11
- qiskit/result/result.py +38 -134
- qiskit/result/sampled_expval.py +1 -2
- qiskit/result/utils.py +3 -4
- qiskit/synthesis/__init__.py +21 -1
- qiskit/synthesis/arithmetic/__init__.py +3 -1
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
- qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/evolution/lie_trotter.py +10 -7
- qiskit/synthesis/evolution/product_formula.py +44 -35
- qiskit/synthesis/evolution/qdrift.py +17 -24
- qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
- qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
- qiskit/synthesis/two_qubit/__init__.py +1 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
- qiskit/transpiler/__init__.py +32 -232
- qiskit/transpiler/basepasses.py +20 -51
- qiskit/transpiler/layout.py +1 -1
- qiskit/transpiler/passes/__init__.py +4 -40
- qiskit/transpiler/passes/basis/basis_translator.py +5 -4
- qiskit/transpiler/passes/basis/decompose.py +1 -15
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
- qiskit/transpiler/passes/layout/apply_layout.py +4 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
- qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
- qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
- qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
- qiskit/transpiler/passes/optimization/__init__.py +2 -3
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
- qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
- qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
- qiskit/transpiler/passes/routing/__init__.py +0 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
- qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
- qiskit/transpiler/passes/scheduling/__init__.py +1 -7
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
- qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
- qiskit/transpiler/passes/synthesis/plugin.py +4 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
- qiskit/transpiler/passes/utils/control_flow.py +2 -6
- qiskit/transpiler/passes/utils/gate_direction.py +7 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
- qiskit/transpiler/passmanager.py +13 -0
- qiskit/transpiler/passmanager_config.py +5 -81
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
- qiskit/transpiler/preset_passmanagers/common.py +140 -167
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
- qiskit/transpiler/preset_passmanagers/level0.py +2 -11
- qiskit/transpiler/preset_passmanagers/level1.py +2 -14
- qiskit/transpiler/preset_passmanagers/level2.py +2 -12
- qiskit/transpiler/preset_passmanagers/level3.py +2 -11
- qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
- qiskit/transpiler/target.py +78 -524
- qiskit/user_config.py +8 -4
- qiskit/utils/__init__.py +13 -12
- qiskit/utils/deprecation.py +4 -112
- qiskit/utils/optionals.py +11 -4
- qiskit/utils/parallel.py +214 -87
- qiskit/utils/units.py +4 -1
- qiskit/visualization/__init__.py +3 -7
- qiskit/visualization/array.py +4 -1
- qiskit/visualization/bloch.py +1 -1
- qiskit/visualization/circuit/_utils.py +19 -19
- qiskit/visualization/circuit/circuit_visualization.py +11 -4
- qiskit/visualization/circuit/matplotlib.py +13 -23
- qiskit/visualization/circuit/text.py +7 -3
- qiskit/visualization/counts_visualization.py +4 -0
- qiskit/visualization/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/library.py +4 -1
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +19 -2
- qiskit/visualization/timeline/core.py +19 -13
- qiskit/visualization/timeline/interface.py +19 -18
- qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/RECORD +300 -447
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
- qiskit/assembler/__init__.py +0 -42
- qiskit/assembler/assemble_circuits.py +0 -451
- qiskit/assembler/assemble_schedules.py +0 -367
- qiskit/assembler/disassemble.py +0 -310
- qiskit/assembler/run_config.py +0 -77
- qiskit/circuit/bit.py +0 -106
- qiskit/circuit/classicalfunction/__init__.py +0 -152
- qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
- qiskit/circuit/classicalfunction/classical_element.py +0 -54
- qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
- qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
- qiskit/circuit/classicalfunction/exceptions.py +0 -41
- qiskit/circuit/classicalfunction/types.py +0 -18
- qiskit/circuit/classicalfunction/utils.py +0 -91
- qiskit/circuit/classicalregister.py +0 -57
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
- qiskit/circuit/quantumregister.py +0 -75
- qiskit/circuit/register.py +0 -246
- qiskit/compiler/assembler.py +0 -689
- qiskit/compiler/scheduler.py +0 -109
- qiskit/compiler/sequencer.py +0 -71
- qiskit/primitives/backend_estimator.py +0 -486
- qiskit/primitives/backend_sampler.py +0 -222
- qiskit/primitives/estimator.py +0 -172
- qiskit/primitives/sampler.py +0 -162
- qiskit/providers/backend_compat.py +0 -507
- qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
- qiskit/providers/fake_provider/fake_1q.py +0 -91
- qiskit/providers/fake_provider/fake_backend.py +0 -165
- qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
- qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
- qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
- qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
- qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
- qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
- qiskit/providers/models/__init__.py +0 -89
- qiskit/providers/models/backendconfiguration.py +0 -1040
- qiskit/providers/models/backendproperties.py +0 -535
- qiskit/providers/models/backendstatus.py +0 -104
- qiskit/providers/models/jobstatus.py +0 -77
- qiskit/providers/models/pulsedefaults.py +0 -305
- qiskit/providers/provider.py +0 -95
- qiskit/pulse/__init__.py +0 -158
- qiskit/pulse/builder.py +0 -2262
- qiskit/pulse/calibration_entries.py +0 -381
- qiskit/pulse/channels.py +0 -227
- qiskit/pulse/configuration.py +0 -245
- qiskit/pulse/exceptions.py +0 -45
- qiskit/pulse/filters.py +0 -309
- qiskit/pulse/instruction_schedule_map.py +0 -424
- qiskit/pulse/instructions/__init__.py +0 -67
- qiskit/pulse/instructions/acquire.py +0 -150
- qiskit/pulse/instructions/delay.py +0 -71
- qiskit/pulse/instructions/directives.py +0 -154
- qiskit/pulse/instructions/frequency.py +0 -135
- qiskit/pulse/instructions/instruction.py +0 -270
- qiskit/pulse/instructions/phase.py +0 -152
- qiskit/pulse/instructions/play.py +0 -99
- qiskit/pulse/instructions/reference.py +0 -100
- qiskit/pulse/instructions/snapshot.py +0 -82
- qiskit/pulse/library/__init__.py +0 -97
- qiskit/pulse/library/continuous.py +0 -430
- qiskit/pulse/library/pulse.py +0 -148
- qiskit/pulse/library/samplers/__init__.py +0 -15
- qiskit/pulse/library/samplers/decorators.py +0 -295
- qiskit/pulse/library/samplers/strategies.py +0 -71
- qiskit/pulse/library/symbolic_pulses.py +0 -1989
- qiskit/pulse/library/waveform.py +0 -136
- qiskit/pulse/macros.py +0 -262
- qiskit/pulse/parameter_manager.py +0 -445
- qiskit/pulse/parser.py +0 -314
- qiskit/pulse/reference_manager.py +0 -58
- qiskit/pulse/schedule.py +0 -1854
- qiskit/pulse/transforms/__init__.py +0 -106
- qiskit/pulse/transforms/alignments.py +0 -406
- qiskit/pulse/transforms/base_transforms.py +0 -71
- qiskit/pulse/transforms/canonicalization.py +0 -498
- qiskit/pulse/transforms/dag.py +0 -122
- qiskit/pulse/utils.py +0 -149
- qiskit/qobj/__init__.py +0 -75
- qiskit/qobj/common.py +0 -81
- qiskit/qobj/converters/__init__.py +0 -18
- qiskit/qobj/converters/lo_config.py +0 -177
- qiskit/qobj/converters/pulse_instruction.py +0 -897
- qiskit/qobj/pulse_qobj.py +0 -709
- qiskit/qobj/qasm_qobj.py +0 -708
- qiskit/qobj/utils.py +0 -46
- qiskit/result/mitigation/base_readout_mitigator.py +0 -79
- qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
- qiskit/result/mitigation/local_readout_mitigator.py +0 -328
- qiskit/result/mitigation/utils.py +0 -217
- qiskit/scheduler/__init__.py +0 -40
- qiskit/scheduler/config.py +0 -37
- qiskit/scheduler/lowering.py +0 -187
- qiskit/scheduler/methods/__init__.py +0 -15
- qiskit/scheduler/methods/basic.py +0 -140
- qiskit/scheduler/schedule_circuit.py +0 -69
- qiskit/scheduler/sequence.py +0 -104
- qiskit/transpiler/passes/calibration/__init__.py +0 -17
- qiskit/transpiler/passes/calibration/base_builder.py +0 -79
- qiskit/transpiler/passes/calibration/builders.py +0 -20
- qiskit/transpiler/passes/calibration/exceptions.py +0 -22
- qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
- qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
- qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
- qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
- qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
- qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
- qiskit/transpiler/passes/scheduling/alap.py +0 -153
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
- qiskit/transpiler/passes/scheduling/asap.py +0 -175
- qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
- qiskit/utils/deprecate_pulse.py +0 -119
- qiskit/utils/multiprocessing.py +0 -56
- qiskit/visualization/pulse_v2/__init__.py +0 -21
- qiskit/visualization/pulse_v2/core.py +0 -901
- qiskit/visualization/pulse_v2/device_info.py +0 -173
- qiskit/visualization/pulse_v2/drawings.py +0 -253
- qiskit/visualization/pulse_v2/events.py +0 -254
- qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
- qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
- qiskit/visualization/pulse_v2/generators/chart.py +0 -208
- qiskit/visualization/pulse_v2/generators/frame.py +0 -436
- qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
- qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
- qiskit/visualization/pulse_v2/interface.py +0 -459
- qiskit/visualization/pulse_v2/layouts.py +0 -387
- qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
- qiskit/visualization/pulse_v2/stylesheet.py +0 -312
- qiskit/visualization/pulse_v2/types.py +0 -242
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
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 (
|
@@ -166,20 +166,9 @@ def _write_parameter_expression_v13(file_obj, obj, version):
|
|
166
166
|
|
167
167
|
def _write_parameter_expression(file_obj, obj, use_symengine, *, version):
|
168
168
|
extra_symbols = None
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
else:
|
173
|
-
from sympy import srepr, sympify
|
174
|
-
|
175
|
-
if not isinstance(obj._symbol_expr, symengine.Basic):
|
176
|
-
raise exceptions.QpyError("Invalid ParameterExpression")
|
177
|
-
|
178
|
-
expr_bytes = srepr(sympify(obj._symbol_expr)).encode(common.ENCODE)
|
179
|
-
else:
|
180
|
-
with io.BytesIO() as buf:
|
181
|
-
extra_symbols = _write_parameter_expression_v13(buf, obj, version)
|
182
|
-
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()
|
183
172
|
symbol_table_len = len(obj._parameter_symbols)
|
184
173
|
if extra_symbols:
|
185
174
|
symbol_table_len += 2 * len(extra_symbols)
|
@@ -275,12 +264,15 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
275
264
|
self.standalone_var_indices = standalone_var_indices
|
276
265
|
self.version = version
|
277
266
|
|
267
|
+
def _write_expr_type(self, type_, /):
|
268
|
+
_write_expr_type(self.file_obj, type_, self.version)
|
269
|
+
|
278
270
|
def visit_generic(self, node, /):
|
279
271
|
raise exceptions.QpyError(f"unhandled Expr object '{node}'")
|
280
272
|
|
281
273
|
def visit_var(self, node, /):
|
282
274
|
self.file_obj.write(type_keys.Expression.VAR)
|
283
|
-
_write_expr_type(
|
275
|
+
self._write_expr_type(node.type)
|
284
276
|
if node.standalone:
|
285
277
|
self.file_obj.write(type_keys.ExprVar.UUID)
|
286
278
|
self.file_obj.write(
|
@@ -308,9 +300,19 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
308
300
|
else:
|
309
301
|
raise exceptions.QpyError(f"unhandled Var object '{node.var}'")
|
310
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
|
+
|
311
313
|
def visit_value(self, node, /):
|
312
314
|
self.file_obj.write(type_keys.Expression.VALUE)
|
313
|
-
_write_expr_type(
|
315
|
+
self._write_expr_type(node.type)
|
314
316
|
if node.value is True or node.value is False:
|
315
317
|
self.file_obj.write(type_keys.ExprValue.BOOL)
|
316
318
|
self.file_obj.write(
|
@@ -331,12 +333,20 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
331
333
|
struct.pack(formats.EXPR_VALUE_INT_PACK, *formats.EXPR_VALUE_INT(num_bytes))
|
332
334
|
)
|
333
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)
|
334
344
|
else:
|
335
345
|
raise exceptions.QpyError(f"unhandled Value object '{node.value}'")
|
336
346
|
|
337
347
|
def visit_cast(self, node, /):
|
338
348
|
self.file_obj.write(type_keys.Expression.CAST)
|
339
|
-
_write_expr_type(
|
349
|
+
self._write_expr_type(node.type)
|
340
350
|
self.file_obj.write(
|
341
351
|
struct.pack(formats.EXPRESSION_CAST_PACK, *formats.EXPRESSION_CAST(node.implicit))
|
342
352
|
)
|
@@ -344,7 +354,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
344
354
|
|
345
355
|
def visit_unary(self, node, /):
|
346
356
|
self.file_obj.write(type_keys.Expression.UNARY)
|
347
|
-
_write_expr_type(
|
357
|
+
self._write_expr_type(node.type)
|
348
358
|
self.file_obj.write(
|
349
359
|
struct.pack(formats.EXPRESSION_UNARY_PACK, *formats.EXPRESSION_UNARY(node.op.value))
|
350
360
|
)
|
@@ -352,7 +362,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
352
362
|
|
353
363
|
def visit_binary(self, node, /):
|
354
364
|
self.file_obj.write(type_keys.Expression.BINARY)
|
355
|
-
_write_expr_type(
|
365
|
+
self._write_expr_type(node.type)
|
356
366
|
self.file_obj.write(
|
357
367
|
struct.pack(formats.EXPRESSION_BINARY_PACK, *formats.EXPRESSION_BINARY(node.op.value))
|
358
368
|
)
|
@@ -365,7 +375,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
|
|
365
375
|
"the 'Index' expression", required=12, target=self.version
|
366
376
|
)
|
367
377
|
self.file_obj.write(type_keys.Expression.INDEX)
|
368
|
-
_write_expr_type(
|
378
|
+
self._write_expr_type(node.type)
|
369
379
|
node.target.accept(self)
|
370
380
|
node.index.accept(self)
|
371
381
|
|
@@ -380,7 +390,7 @@ def _write_expr(
|
|
380
390
|
node.accept(_ExprWriter(file_obj, clbit_indices, standalone_var_indices, version))
|
381
391
|
|
382
392
|
|
383
|
-
def _write_expr_type(file_obj, type_: types.Type):
|
393
|
+
def _write_expr_type(file_obj, type_: types.Type, version: int):
|
384
394
|
if type_.kind is types.Bool:
|
385
395
|
file_obj.write(type_keys.ExprType.BOOL)
|
386
396
|
elif type_.kind is types.Uint:
|
@@ -388,10 +398,51 @@ def _write_expr_type(file_obj, type_: types.Type):
|
|
388
398
|
file_obj.write(
|
389
399
|
struct.pack(formats.EXPR_TYPE_UINT_PACK, *formats.EXPR_TYPE_UINT(type_.width))
|
390
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)
|
391
413
|
else:
|
392
414
|
raise exceptions.QpyError(f"unhandled Type object '{type_};")
|
393
415
|
|
394
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
|
+
|
395
446
|
def _read_parameter(file_obj):
|
396
447
|
data = formats.PARAMETER(
|
397
448
|
*struct.unpack(formats.PARAMETER_PACK, file_obj.read(formats.PARAMETER_SIZE))
|
@@ -679,6 +730,13 @@ def _read_expr(
|
|
679
730
|
name = file_obj.read(payload.reg_name_size).decode(common.ENCODE)
|
680
731
|
return expr.Var(cregs[name], type_)
|
681
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]
|
682
740
|
if type_key == type_keys.Expression.VALUE:
|
683
741
|
value_type_key = file_obj.read(formats.EXPR_VALUE_DISCRIMINATOR_SIZE)
|
684
742
|
if value_type_key == type_keys.ExprValue.BOOL:
|
@@ -697,6 +755,16 @@ def _read_expr(
|
|
697
755
|
return expr.Value(
|
698
756
|
int.from_bytes(file_obj.read(payload.num_bytes), "big", signed=True), type_
|
699
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_)
|
700
768
|
raise exceptions.QpyError("Invalid classical-expression Value key '{value_type_key}'")
|
701
769
|
if type_key == type_keys.Expression.CAST:
|
702
770
|
payload = formats.EXPRESSION_CAST._make(
|
@@ -746,9 +814,43 @@ def _read_expr_type(file_obj) -> types.Type:
|
|
746
814
|
struct.unpack(formats.EXPR_TYPE_UINT_PACK, file_obj.read(formats.EXPR_TYPE_UINT_SIZE))
|
747
815
|
)
|
748
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()
|
749
821
|
raise exceptions.QpyError(f"Invalid classical-expression Type key '{type_key}'")
|
750
822
|
|
751
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
|
+
|
752
854
|
def read_standalone_vars(file_obj, num_vars):
|
753
855
|
"""Read the ``num_vars`` standalone variable declarations from the file.
|
754
856
|
|
@@ -765,6 +867,8 @@ def read_standalone_vars(file_obj, num_vars):
|
|
765
867
|
type_keys.ExprVarDeclaration.INPUT: [],
|
766
868
|
type_keys.ExprVarDeclaration.CAPTURE: [],
|
767
869
|
type_keys.ExprVarDeclaration.LOCAL: [],
|
870
|
+
type_keys.ExprVarDeclaration.STRETCH_CAPTURE: [],
|
871
|
+
type_keys.ExprVarDeclaration.STRETCH_LOCAL: [],
|
768
872
|
}
|
769
873
|
var_order = []
|
770
874
|
for _ in range(num_vars):
|
@@ -776,13 +880,19 @@ def read_standalone_vars(file_obj, num_vars):
|
|
776
880
|
)
|
777
881
|
type_ = _read_expr_type(file_obj)
|
778
882
|
name = file_obj.read(data.name_size).decode(common.ENCODE)
|
779
|
-
|
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)
|
780
890
|
read_vars[data.usage].append(var)
|
781
891
|
var_order.append(var)
|
782
892
|
return read_vars, var_order
|
783
893
|
|
784
894
|
|
785
|
-
def _write_standalone_var(file_obj, var, type_key):
|
895
|
+
def _write_standalone_var(file_obj, var, type_key, version):
|
786
896
|
name = var.name.encode(common.ENCODE)
|
787
897
|
file_obj.write(
|
788
898
|
struct.pack(
|
@@ -790,33 +900,46 @@ def _write_standalone_var(file_obj, var, type_key):
|
|
790
900
|
*formats.EXPR_VAR_DECLARATION(var.var.bytes, type_key, len(name)),
|
791
901
|
)
|
792
902
|
)
|
793
|
-
_write_expr_type(file_obj, var.type)
|
903
|
+
_write_expr_type(file_obj, var.type, version)
|
794
904
|
file_obj.write(name)
|
795
905
|
|
796
906
|
|
797
|
-
def write_standalone_vars(file_obj, circuit):
|
907
|
+
def write_standalone_vars(file_obj, circuit, version):
|
798
908
|
"""Write the standalone variables out from a circuit.
|
799
909
|
|
800
910
|
Args:
|
801
911
|
file_obj (File): the file-like object to write to.
|
802
912
|
circuit (QuantumCircuit): the circuit to take the variables from.
|
913
|
+
version (int): the QPY target version.
|
803
914
|
|
804
915
|
Returns:
|
805
|
-
dict[expr.Var, int]: a mapping of the variables written to the
|
806
|
-
|
916
|
+
dict[expr.Var | expr.Stretch, int]: a mapping of the variables written to the
|
917
|
+
index that they were written at.
|
807
918
|
"""
|
808
919
|
index = 0
|
809
920
|
out = {}
|
810
921
|
for var in circuit.iter_input_vars():
|
811
|
-
_write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.INPUT)
|
922
|
+
_write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.INPUT, version)
|
812
923
|
out[var] = index
|
813
924
|
index += 1
|
814
925
|
for var in circuit.iter_captured_vars():
|
815
|
-
_write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.CAPTURE)
|
926
|
+
_write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.CAPTURE, version)
|
816
927
|
out[var] = index
|
817
928
|
index += 1
|
818
929
|
for var in circuit.iter_declared_vars():
|
819
|
-
_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)
|
820
943
|
out[var] = index
|
821
944
|
index += 1
|
822
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,24 +203,15 @@ 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,
|
240
209
|
metadata_deserializer: Optional[Type[JSONDecoder]] = None,
|
241
|
-
trust_payload: bool = False,
|
242
210
|
) -> List[QPY_SUPPORTED_TYPES]:
|
243
211
|
"""Load a QPY binary file
|
244
212
|
|
245
213
|
This function is used to load a serialized QPY Qiskit program file and create
|
246
|
-
:class:`~qiskit.circuit.QuantumCircuit` objects
|
247
|
-
:class:`~qiskit.pulse.schedule.ScheduleBlock` objects from its contents.
|
214
|
+
:class:`~qiskit.circuit.QuantumCircuit` objects from its contents.
|
248
215
|
For example:
|
249
216
|
|
250
217
|
.. code-block:: python
|
@@ -265,12 +232,11 @@ def load(
|
|
265
232
|
circuits = qpy.load(fd)
|
266
233
|
|
267
234
|
which will read the contents of the qpy and return a list of
|
268
|
-
:class:`~qiskit.circuit.QuantumCircuit` objects
|
269
|
-
:class:`~qiskit.pulse.schedule.ScheduleBlock` objects from the file.
|
235
|
+
:class:`~qiskit.circuit.QuantumCircuit` objects from the file.
|
270
236
|
|
271
237
|
Args:
|
272
238
|
file_obj: A file like object that contains the QPY binary
|
273
|
-
data for a circuit
|
239
|
+
data for a circuit.
|
274
240
|
metadata_deserializer: An optional JSONDecoder class
|
275
241
|
that will be used for the ``cls`` kwarg on the internal
|
276
242
|
``json.load`` call used to deserialize the JSON payload used for
|
@@ -278,18 +244,6 @@ def load(
|
|
278
244
|
If this is not specified the circuit metadata will
|
279
245
|
be parsed as JSON with the stdlib ``json.load()`` function using
|
280
246
|
the default ``JSONDecoder`` class.
|
281
|
-
trust_payload: if set to ``False`` (the default),
|
282
|
-
:class:`.ScheduleBlock` objects in the payload that were
|
283
|
-
serialized using ``sympy`` are not allowed and will error. This
|
284
|
-
is because the ``sympy`` parsing uses :func:`eval`, which
|
285
|
-
can allow for arbitrary code execution.
|
286
|
-
The flag should only be set
|
287
|
-
to ``True`` if you trust the QPY payload you are loading.
|
288
|
-
|
289
|
-
.. warning::
|
290
|
-
|
291
|
-
If ``trust_payload`` is set to ``True`` this can enable arbitrary
|
292
|
-
code execution because internally ``sympy`` relies on :func:`eval`.
|
293
247
|
|
294
248
|
Returns:
|
295
249
|
The list of Qiskit programs contained in the QPY data.
|
@@ -298,6 +252,11 @@ def load(
|
|
298
252
|
Raises:
|
299
253
|
QiskitError: if ``file_obj`` is not a valid QPY file
|
300
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.
|
301
260
|
"""
|
302
261
|
|
303
262
|
# identify file header version
|
@@ -357,26 +316,21 @@ def load(
|
|
357
316
|
else:
|
358
317
|
type_key = common.read_type_key(file_obj)
|
359
318
|
|
360
|
-
if data.qpy_version < 10:
|
361
|
-
use_symengine = False
|
362
|
-
else:
|
363
|
-
use_symengine = data.symbolic_encoding == type_keys.SymExprEncoding.SYMENGINE
|
364
|
-
|
365
319
|
if type_key == type_keys.Program.CIRCUIT:
|
366
320
|
loader = binary_io.read_circuit
|
367
321
|
elif type_key == type_keys.Program.SCHEDULE_BLOCK:
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
message="Pulse gates deserialization is deprecated as of Qiskit 1.3 and "
|
372
|
-
"will be removed in Qiskit 2.0. This is part of the deprecation plan for "
|
373
|
-
"the entire Qiskit Pulse package. Once Pulse is removed, `ScheduleBlock` "
|
374
|
-
"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."
|
375
325
|
)
|
376
|
-
|
377
326
|
else:
|
378
327
|
raise TypeError(f"Invalid payload format data kind '{type_key}'.")
|
379
328
|
|
329
|
+
if data.qpy_version < 10:
|
330
|
+
use_symengine = False
|
331
|
+
else:
|
332
|
+
use_symengine = data.symbolic_encoding == type_keys.SymExprEncoding.SYMENGINE
|
333
|
+
|
380
334
|
programs = []
|
381
335
|
for _ in range(data.num_programs):
|
382
336
|
programs.append(
|
@@ -385,7 +339,6 @@ def load(
|
|
385
339
|
data.qpy_version,
|
386
340
|
metadata_deserializer=metadata_deserializer,
|
387
341
|
use_symengine=use_symengine,
|
388
|
-
trust_input=trust_payload,
|
389
342
|
)
|
390
343
|
)
|
391
344
|
return programs
|