qiskit 1.4.0__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0rc1__cp39-abi3-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +2 -5
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +24 -5
- qiskit/circuit/{add_control.py → _add_control.py} +32 -12
- qiskit/circuit/_classical_resource_map.py +5 -3
- qiskit/circuit/barrier.py +3 -7
- qiskit/circuit/classical/expr/__init__.py +31 -3
- qiskit/circuit/classical/expr/constructors.py +248 -28
- qiskit/circuit/classical/expr/expr.py +104 -3
- qiskit/circuit/classical/expr/visitors.py +75 -0
- qiskit/circuit/classical/types/__init__.py +12 -8
- qiskit/circuit/classical/types/ordering.py +14 -7
- qiskit/circuit/classical/types/types.py +36 -0
- qiskit/circuit/commutation_checker.py +34 -7
- qiskit/circuit/controlflow/__init__.py +32 -1
- qiskit/circuit/controlflow/_builder_utils.py +9 -5
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +1 -1
- qiskit/circuit/controlflow/builder.py +139 -39
- qiskit/circuit/controlflow/continue_loop.py +1 -3
- qiskit/circuit/controlflow/control_flow.py +10 -0
- qiskit/circuit/controlflow/for_loop.py +2 -1
- qiskit/circuit/controlflow/if_else.py +3 -16
- qiskit/circuit/controlflow/switch_case.py +2 -8
- qiskit/circuit/controlflow/while_loop.py +2 -7
- qiskit/circuit/controlledgate.py +2 -4
- qiskit/circuit/delay.py +40 -11
- qiskit/circuit/duration.py +0 -15
- qiskit/circuit/gate.py +2 -4
- qiskit/circuit/instruction.py +7 -140
- qiskit/circuit/instructionset.py +7 -54
- qiskit/circuit/library/__init__.py +34 -5
- qiskit/circuit/library/arithmetic/__init__.py +16 -10
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
- qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
- qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
- qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +52 -16
- qiskit/circuit/library/data_preparation/initializer.py +1 -1
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
- qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
- qiskit/circuit/library/generalized_gates/gms.py +1 -1
- qiskit/circuit/library/generalized_gates/isometry.py +1 -1
- qiskit/circuit/library/generalized_gates/pauli.py +1 -2
- qiskit/circuit/library/generalized_gates/uc.py +97 -7
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
- qiskit/circuit/library/generalized_gates/unitary.py +4 -2
- qiskit/circuit/library/hamiltonian_gate.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
- qiskit/circuit/library/n_local/n_local.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
- qiskit/circuit/library/overlap.py +2 -2
- qiskit/circuit/library/pauli_evolution.py +39 -24
- qiskit/circuit/library/phase_oracle.py +130 -51
- qiskit/circuit/library/standard_gates/__init__.py +0 -1
- qiskit/circuit/library/standard_gates/dcx.py +3 -4
- qiskit/circuit/library/standard_gates/ecr.py +3 -4
- qiskit/circuit/library/standard_gates/global_phase.py +5 -6
- qiskit/circuit/library/standard_gates/h.py +4 -9
- qiskit/circuit/library/standard_gates/i.py +2 -2
- qiskit/circuit/library/standard_gates/iswap.py +3 -4
- qiskit/circuit/library/standard_gates/p.py +15 -34
- qiskit/circuit/library/standard_gates/r.py +2 -6
- qiskit/circuit/library/standard_gates/rx.py +5 -15
- qiskit/circuit/library/standard_gates/rxx.py +3 -6
- qiskit/circuit/library/standard_gates/ry.py +5 -17
- qiskit/circuit/library/standard_gates/ryy.py +3 -6
- qiskit/circuit/library/standard_gates/rz.py +5 -17
- qiskit/circuit/library/standard_gates/rzx.py +3 -6
- qiskit/circuit/library/standard_gates/rzz.py +3 -6
- qiskit/circuit/library/standard_gates/s.py +6 -15
- qiskit/circuit/library/standard_gates/swap.py +4 -11
- qiskit/circuit/library/standard_gates/sx.py +7 -12
- qiskit/circuit/library/standard_gates/t.py +6 -7
- qiskit/circuit/library/standard_gates/u.py +2 -10
- qiskit/circuit/library/standard_gates/u1.py +5 -16
- qiskit/circuit/library/standard_gates/u2.py +2 -6
- qiskit/circuit/library/standard_gates/u3.py +3 -11
- qiskit/circuit/library/standard_gates/x.py +13 -60
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/y.py +4 -9
- qiskit/circuit/library/standard_gates/z.py +5 -15
- qiskit/circuit/measure.py +11 -2
- qiskit/circuit/parameterexpression.py +4 -0
- qiskit/circuit/quantumcircuit.py +881 -555
- qiskit/circuit/random/utils.py +12 -6
- qiskit/circuit/reset.py +5 -2
- qiskit/circuit/singleton.py +5 -11
- qiskit/circuit/store.py +0 -8
- qiskit/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +4 -2
- qiskit/converters/circuit_to_dagdependency.py +0 -2
- qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
- qiskit/converters/circuit_to_gate.py +1 -1
- qiskit/converters/circuit_to_instruction.py +16 -29
- qiskit/converters/dag_to_circuit.py +5 -5
- qiskit/converters/dag_to_dagdependency.py +0 -1
- qiskit/converters/dag_to_dagdependency_v2.py +0 -1
- qiskit/converters/dagdependency_to_circuit.py +0 -6
- qiskit/converters/dagdependency_to_dag.py +0 -6
- qiskit/dagcircuit/collect_blocks.py +32 -20
- qiskit/dagcircuit/dagdependency.py +3 -37
- qiskit/dagcircuit/dagdependency_v2.py +2 -80
- qiskit/dagcircuit/dagnode.py +14 -2
- qiskit/passmanager/__init__.py +24 -6
- qiskit/passmanager/passmanager.py +26 -24
- qiskit/primitives/__init__.py +44 -35
- qiskit/primitives/backend_estimator_v2.py +102 -23
- qiskit/primitives/backend_sampler_v2.py +5 -20
- qiskit/primitives/base/__init__.py +4 -4
- qiskit/primitives/base/base_estimator.py +77 -82
- qiskit/primitives/base/base_primitive_job.py +2 -2
- qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
- qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
- qiskit/primitives/base/base_sampler.py +52 -60
- qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
- qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
- qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
- qiskit/primitives/containers/bindings_array.py +3 -1
- qiskit/primitives/containers/bit_array.py +23 -0
- qiskit/primitives/containers/data_bin.py +3 -1
- qiskit/primitives/containers/observables_array.py +19 -2
- qiskit/primitives/statevector_sampler.py +6 -8
- qiskit/primitives/utils.py +14 -189
- qiskit/providers/__init__.py +4 -130
- qiskit/providers/backend.py +11 -314
- qiskit/providers/basic_provider/__init__.py +3 -1
- qiskit/providers/basic_provider/basic_provider.py +29 -9
- qiskit/providers/basic_provider/basic_simulator.py +158 -298
- qiskit/providers/exceptions.py +0 -33
- qiskit/providers/fake_provider/__init__.py +0 -37
- qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
- qiskit/qasm2/__init__.py +21 -6
- qiskit/qasm2/export.py +2 -10
- qiskit/qasm2/parse.py +11 -25
- qiskit/qasm3/__init__.py +5 -1
- qiskit/qasm3/ast.py +44 -0
- qiskit/qasm3/exporter.py +65 -27
- qiskit/qasm3/printer.py +35 -4
- qiskit/qpy/__init__.py +141 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +91 -116
- qiskit/qpy/binary_io/schedules.py +61 -388
- qiskit/qpy/binary_io/value.py +168 -28
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +29 -62
- qiskit/qpy/type_keys.py +58 -221
- qiskit/quantum_info/analysis/distance.py +3 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
- qiskit/quantum_info/operators/operator.py +6 -2
- qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
- qiskit/quantum_info/states/densitymatrix.py +16 -6
- qiskit/quantum_info/states/stabilizerstate.py +35 -4
- qiskit/quantum_info/states/statevector.py +16 -6
- qiskit/result/__init__.py +5 -17
- qiskit/result/models.py +18 -10
- qiskit/result/result.py +28 -126
- qiskit/result/sampled_expval.py +1 -2
- qiskit/result/utils.py +3 -4
- qiskit/synthesis/__init__.py +21 -1
- qiskit/synthesis/arithmetic/__init__.py +3 -1
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
- qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
- qiskit/synthesis/evolution/lie_trotter.py +10 -7
- qiskit/synthesis/evolution/product_formula.py +44 -35
- qiskit/synthesis/evolution/qdrift.py +17 -24
- qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
- qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
- qiskit/synthesis/two_qubit/__init__.py +1 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
- qiskit/transpiler/__init__.py +32 -232
- qiskit/transpiler/basepasses.py +20 -51
- qiskit/transpiler/layout.py +1 -1
- qiskit/transpiler/passes/__init__.py +2 -40
- qiskit/transpiler/passes/basis/basis_translator.py +4 -3
- qiskit/transpiler/passes/basis/decompose.py +1 -15
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
- qiskit/transpiler/passes/layout/apply_layout.py +5 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +4 -4
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
- qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
- qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
- qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
- qiskit/transpiler/passes/optimization/__init__.py +1 -3
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
- qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
- qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
- qiskit/transpiler/passes/routing/__init__.py +0 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
- qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
- qiskit/transpiler/passes/scheduling/__init__.py +1 -7
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +30 -2
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +127 -59
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
- qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
- qiskit/transpiler/passes/synthesis/plugin.py +4 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
- qiskit/transpiler/passes/utils/control_flow.py +2 -6
- qiskit/transpiler/passes/utils/gate_direction.py +7 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
- qiskit/transpiler/passmanager.py +13 -0
- qiskit/transpiler/passmanager_config.py +5 -81
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
- qiskit/transpiler/preset_passmanagers/common.py +140 -167
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +101 -322
- qiskit/transpiler/preset_passmanagers/level0.py +2 -11
- qiskit/transpiler/preset_passmanagers/level1.py +2 -14
- qiskit/transpiler/preset_passmanagers/level2.py +2 -12
- qiskit/transpiler/preset_passmanagers/level3.py +2 -11
- qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
- qiskit/transpiler/target.py +67 -524
- qiskit/user_config.py +8 -4
- qiskit/utils/__init__.py +13 -12
- qiskit/utils/deprecation.py +4 -112
- qiskit/utils/optionals.py +11 -4
- qiskit/utils/parallel.py +214 -87
- qiskit/utils/units.py +4 -1
- qiskit/visualization/__init__.py +3 -7
- qiskit/visualization/array.py +4 -1
- qiskit/visualization/bloch.py +1 -1
- qiskit/visualization/circuit/_utils.py +19 -19
- qiskit/visualization/circuit/circuit_visualization.py +11 -4
- qiskit/visualization/circuit/matplotlib.py +13 -23
- qiskit/visualization/circuit/text.py +7 -3
- qiskit/visualization/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +6 -0
- qiskit/visualization/timeline/core.py +27 -12
- qiskit/visualization/timeline/interface.py +23 -18
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +2 -1
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/entry_points.txt +8 -2
- qiskit/assembler/__init__.py +0 -42
- qiskit/assembler/assemble_circuits.py +0 -451
- qiskit/assembler/assemble_schedules.py +0 -367
- qiskit/assembler/disassemble.py +0 -310
- qiskit/assembler/run_config.py +0 -77
- qiskit/circuit/bit.py +0 -106
- qiskit/circuit/classicalfunction/__init__.py +0 -152
- qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
- qiskit/circuit/classicalfunction/classical_element.py +0 -54
- qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
- qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
- qiskit/circuit/classicalfunction/exceptions.py +0 -41
- qiskit/circuit/classicalfunction/types.py +0 -18
- qiskit/circuit/classicalfunction/utils.py +0 -91
- qiskit/circuit/classicalregister.py +0 -57
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
- qiskit/circuit/quantumregister.py +0 -75
- qiskit/circuit/register.py +0 -246
- qiskit/compiler/assembler.py +0 -689
- qiskit/compiler/scheduler.py +0 -109
- qiskit/compiler/sequencer.py +0 -71
- qiskit/primitives/backend_estimator.py +0 -486
- qiskit/primitives/backend_sampler.py +0 -222
- qiskit/primitives/estimator.py +0 -172
- qiskit/primitives/sampler.py +0 -162
- qiskit/providers/backend_compat.py +0 -507
- qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
- qiskit/providers/fake_provider/fake_1q.py +0 -91
- qiskit/providers/fake_provider/fake_backend.py +0 -165
- qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
- qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
- qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
- qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
- qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
- qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
- qiskit/providers/models/__init__.py +0 -89
- qiskit/providers/models/backendconfiguration.py +0 -1040
- qiskit/providers/models/backendproperties.py +0 -535
- qiskit/providers/models/backendstatus.py +0 -104
- qiskit/providers/models/jobstatus.py +0 -77
- qiskit/providers/models/pulsedefaults.py +0 -305
- qiskit/providers/provider.py +0 -95
- qiskit/pulse/__init__.py +0 -158
- qiskit/pulse/builder.py +0 -2262
- qiskit/pulse/calibration_entries.py +0 -381
- qiskit/pulse/channels.py +0 -227
- qiskit/pulse/configuration.py +0 -245
- qiskit/pulse/exceptions.py +0 -45
- qiskit/pulse/filters.py +0 -309
- qiskit/pulse/instruction_schedule_map.py +0 -424
- qiskit/pulse/instructions/__init__.py +0 -67
- qiskit/pulse/instructions/acquire.py +0 -150
- qiskit/pulse/instructions/delay.py +0 -71
- qiskit/pulse/instructions/directives.py +0 -154
- qiskit/pulse/instructions/frequency.py +0 -135
- qiskit/pulse/instructions/instruction.py +0 -270
- qiskit/pulse/instructions/phase.py +0 -152
- qiskit/pulse/instructions/play.py +0 -99
- qiskit/pulse/instructions/reference.py +0 -100
- qiskit/pulse/instructions/snapshot.py +0 -82
- qiskit/pulse/library/__init__.py +0 -97
- qiskit/pulse/library/continuous.py +0 -430
- qiskit/pulse/library/pulse.py +0 -148
- qiskit/pulse/library/samplers/__init__.py +0 -15
- qiskit/pulse/library/samplers/decorators.py +0 -295
- qiskit/pulse/library/samplers/strategies.py +0 -71
- qiskit/pulse/library/symbolic_pulses.py +0 -1989
- qiskit/pulse/library/waveform.py +0 -136
- qiskit/pulse/macros.py +0 -262
- qiskit/pulse/parameter_manager.py +0 -445
- qiskit/pulse/parser.py +0 -314
- qiskit/pulse/reference_manager.py +0 -58
- qiskit/pulse/schedule.py +0 -1854
- qiskit/pulse/transforms/__init__.py +0 -106
- qiskit/pulse/transforms/alignments.py +0 -406
- qiskit/pulse/transforms/base_transforms.py +0 -71
- qiskit/pulse/transforms/canonicalization.py +0 -498
- qiskit/pulse/transforms/dag.py +0 -122
- qiskit/pulse/utils.py +0 -149
- qiskit/qobj/__init__.py +0 -75
- qiskit/qobj/common.py +0 -81
- qiskit/qobj/converters/__init__.py +0 -18
- qiskit/qobj/converters/lo_config.py +0 -177
- qiskit/qobj/converters/pulse_instruction.py +0 -897
- qiskit/qobj/pulse_qobj.py +0 -709
- qiskit/qobj/qasm_qobj.py +0 -708
- qiskit/qobj/utils.py +0 -46
- qiskit/result/mitigation/base_readout_mitigator.py +0 -79
- qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
- qiskit/result/mitigation/local_readout_mitigator.py +0 -328
- qiskit/result/mitigation/utils.py +0 -217
- qiskit/scheduler/__init__.py +0 -40
- qiskit/scheduler/config.py +0 -37
- qiskit/scheduler/lowering.py +0 -187
- qiskit/scheduler/methods/__init__.py +0 -15
- qiskit/scheduler/methods/basic.py +0 -140
- qiskit/scheduler/schedule_circuit.py +0 -69
- qiskit/scheduler/sequence.py +0 -104
- qiskit/transpiler/passes/calibration/__init__.py +0 -17
- qiskit/transpiler/passes/calibration/base_builder.py +0 -79
- qiskit/transpiler/passes/calibration/builders.py +0 -20
- qiskit/transpiler/passes/calibration/exceptions.py +0 -22
- qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
- qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
- qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
- qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
- qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
- qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
- qiskit/transpiler/passes/scheduling/alap.py +0 -153
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
- qiskit/transpiler/passes/scheduling/asap.py +0 -175
- qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
- qiskit/utils/deprecate_pulse.py +0 -119
- qiskit/utils/multiprocessing.py +0 -56
- qiskit/visualization/pulse_v2/__init__.py +0 -21
- qiskit/visualization/pulse_v2/core.py +0 -901
- qiskit/visualization/pulse_v2/device_info.py +0 -173
- qiskit/visualization/pulse_v2/drawings.py +0 -253
- qiskit/visualization/pulse_v2/events.py +0 -254
- qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
- qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
- qiskit/visualization/pulse_v2/generators/chart.py +0 -208
- qiskit/visualization/pulse_v2/generators/frame.py +0 -436
- qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
- qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
- qiskit/visualization/pulse_v2/interface.py +0 -459
- qiskit/visualization/pulse_v2/layouts.py +0 -387
- qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
- qiskit/visualization/pulse_v2/stylesheet.py +0 -312
- qiskit/visualization/pulse_v2/types.py +0 -242
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
qiskit/qpy/__init__.py
CHANGED
@@ -17,13 +17,12 @@ QPY serialization (:mod:`qiskit.qpy`)
|
|
17
17
|
|
18
18
|
.. currentmodule:: qiskit.qpy
|
19
19
|
|
20
|
-
QPY is a binary serialization format for :class:`~.QuantumCircuit`
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
Qiskit
|
26
|
-
Qiskit code). This differs from other serialization formats like
|
20
|
+
QPY is a binary serialization format for :class:`~.QuantumCircuit`
|
21
|
+
objects that is designed to be cross-platform, Python version agnostic,
|
22
|
+
and backwards compatible moving forward. QPY should be used if you need
|
23
|
+
a mechanism to save or copy between systems a :class:`~.QuantumCircuit`
|
24
|
+
that preserves the full Qiskit object structure (except for custom attributes
|
25
|
+
defined outside of Qiskit code). This differs from other serialization formats like
|
27
26
|
`OpenQASM <https://github.com/openqasm/openqasm>`__ (2.0 or 3.0) which has a
|
28
27
|
different abstraction model and can result in a loss of information contained
|
29
28
|
in the original circuit (or is unable to represent some aspects of the
|
@@ -40,7 +39,24 @@ serializers in Python's standard library, ``pickle`` and ``json``. There are
|
|
40
39
|
2 user facing functions: :func:`qiskit.qpy.dump` and
|
41
40
|
:func:`qiskit.qpy.load` which are used to dump QPY data
|
42
41
|
to a file object and load circuits from QPY data in a file object respectively.
|
43
|
-
For example
|
42
|
+
For example:
|
43
|
+
|
44
|
+
.. plot::
|
45
|
+
:nofigs:
|
46
|
+
:context: reset
|
47
|
+
|
48
|
+
# This code is hidden from users
|
49
|
+
# It's a hack to avoid writing to file when testing the code examples
|
50
|
+
import io
|
51
|
+
bytestream = io.BytesIO()
|
52
|
+
bytestream.close = lambda: bytestream.seek(0)
|
53
|
+
def open(*args):
|
54
|
+
return bytestream
|
55
|
+
|
56
|
+
.. plot::
|
57
|
+
:include-source:
|
58
|
+
:nofigs:
|
59
|
+
:context:
|
44
60
|
|
45
61
|
from qiskit.circuit import QuantumCircuit
|
46
62
|
from qiskit import qpy
|
@@ -57,16 +73,27 @@ For example::
|
|
57
73
|
new_qc = qpy.load(fd)[0]
|
58
74
|
|
59
75
|
The :func:`qiskit.qpy.dump` function also lets you
|
60
|
-
include multiple circuits in a single QPY file
|
76
|
+
include multiple circuits in a single QPY file:
|
77
|
+
|
78
|
+
.. plot::
|
79
|
+
:include-source:
|
80
|
+
:nofigs:
|
81
|
+
:context:
|
61
82
|
|
62
83
|
with open('twenty_bells.qpy', 'wb') as fd:
|
63
84
|
qpy.dump([qc] * 20, fd)
|
64
85
|
|
65
86
|
and then loading that file will return a list with all the circuits
|
66
87
|
|
88
|
+
.. plot::
|
89
|
+
:include-source:
|
90
|
+
:nofigs:
|
91
|
+
:context:
|
92
|
+
|
67
93
|
with open('twenty_bells.qpy', 'rb') as fd:
|
68
94
|
twenty_new_bells = qpy.load(fd)
|
69
95
|
|
96
|
+
|
70
97
|
API documentation
|
71
98
|
=================
|
72
99
|
|
@@ -142,6 +169,14 @@ and how the feature will be internally handled.
|
|
142
169
|
it to QPY setting ``use_symengine=False``. The resulting file can then be loaded by any later
|
143
170
|
version of Qiskit.
|
144
171
|
|
172
|
+
.. note::
|
173
|
+
|
174
|
+
Starting with Qiskit version 2.0.0, which removed the Pulse module from the library, QPY provides
|
175
|
+
limited support for loading payloads that include pulse data. Loading a ``ScheduleBlock`` payload,
|
176
|
+
a :class:`.QpyError` exception will be raised. Loading a payload for a circuit that contained pulse
|
177
|
+
gates, the output circuit will contain custom instructions **without** calibration data attached
|
178
|
+
for each pulse gate, leaving them undefined.
|
179
|
+
|
145
180
|
QPY format version history
|
146
181
|
--------------------------
|
147
182
|
|
@@ -342,6 +377,93 @@ There is a circuit payload for each circuit (where the total number is dictated
|
|
342
377
|
by ``num_circuits`` in the file header). There is no padding between the
|
343
378
|
circuits in the data.
|
344
379
|
|
380
|
+
.. _qpy_version_14:
|
381
|
+
|
382
|
+
Version 14
|
383
|
+
----------
|
384
|
+
|
385
|
+
Version 14 adds a new core DURATION type, support for additional :class:`~.types.Type`
|
386
|
+
classes :class:`~.types.Float` and :class:`~.types.Duration`, and a new expression
|
387
|
+
node type :class:`~.expr.Stretch`.
|
388
|
+
|
389
|
+
DURATION
|
390
|
+
~~~~~~~~
|
391
|
+
|
392
|
+
A :class:`~.circuit.Duration` is encoded by a single-byte ASCII ``char`` that encodes the kind of
|
393
|
+
type, followed by a payload that varies depending on the type. The defined codes are:
|
394
|
+
|
395
|
+
============================== ========= =========================================================
|
396
|
+
Qiskit class Type code Payload
|
397
|
+
============================== ========= =========================================================
|
398
|
+
:class:`~.circuit.Duration.dt` ``t`` One ``unsigned long long value``.
|
399
|
+
|
400
|
+
:class:`~.circuit.Duration.ns` ``n`` One ``double value``.
|
401
|
+
|
402
|
+
:class:`~.circuit.Duration.us` ``u`` One ``double value``.
|
403
|
+
|
404
|
+
:class:`~.circuit.Duration.ms` ``m`` One ``double value``.
|
405
|
+
|
406
|
+
:class:`~.circuit.Duration.s` ``s`` One ``double value``.
|
407
|
+
|
408
|
+
============================== ========= =========================================================
|
409
|
+
|
410
|
+
Changes to EXPR_VAR_DECLARATION
|
411
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
412
|
+
|
413
|
+
The ``EXPR_VAR_DECLARATION`` type is now used to represent both :class:`~.expr.Var` standalone
|
414
|
+
variables and :class:`~.expr.Stretch` identifiers. To support this change, the usage type code has
|
415
|
+
two new possible entries, in addition to the existing ones:
|
416
|
+
|
417
|
+
========= =========================================================================================
|
418
|
+
Type code Meaning
|
419
|
+
========= =========================================================================================
|
420
|
+
``A`` A ``capture`` stretch to the circuit.
|
421
|
+
|
422
|
+
``O`` A locally declared stretch to the circuit.
|
423
|
+
|
424
|
+
========= =========================================================================================
|
425
|
+
|
426
|
+
Changes to EXPRESSION
|
427
|
+
---------------------
|
428
|
+
|
429
|
+
The EXPRESSION type code has a new possible entry, ``s``, corresponding to :class:`.expr.Stretch`
|
430
|
+
nodes.
|
431
|
+
|
432
|
+
======================= ========= ====================================================== ========
|
433
|
+
Qiskit class Type code Payload Children
|
434
|
+
======================= ========= ====================================================== ========
|
435
|
+
:class:`~.expr.Stretch` ``s`` One ``unsigned short var_index`` 0
|
436
|
+
======================= ========= ====================================================== ========
|
437
|
+
|
438
|
+
Changes to EXPR_TYPE
|
439
|
+
~~~~~~~~~~~~~~~~~~~~
|
440
|
+
|
441
|
+
The following table shows the new type classes added in the version:
|
442
|
+
|
443
|
+
========================= ========= ==============================================================
|
444
|
+
Qiskit class Type code Payload
|
445
|
+
========================= ========= ==============================================================
|
446
|
+
:class:`~.types.Float` ``f`` None.
|
447
|
+
|
448
|
+
:class:`~.types.Duration` ``d`` None.
|
449
|
+
|
450
|
+
========================= ========= ==============================================================
|
451
|
+
|
452
|
+
Changes to EXPR_VALUE
|
453
|
+
~~~~~~~~~~~~~~~~~~~~~
|
454
|
+
|
455
|
+
The classical expression's type system now supports new encoding types for value literals, in
|
456
|
+
addition to the existing encodings for int and bool. The new value type encodings are below:
|
457
|
+
|
458
|
+
=========================== ========= ============================================================
|
459
|
+
Python type Type code Payload
|
460
|
+
=========================== ========= ============================================================
|
461
|
+
``float`` ``f`` One ``double value``.
|
462
|
+
|
463
|
+
:class:`~.circuit.Duration` ``t`` One ``DURATION``.
|
464
|
+
|
465
|
+
=========================== ========= ============================================================
|
466
|
+
|
345
467
|
.. _qpy_version_13:
|
346
468
|
|
347
469
|
Version 13
|
@@ -874,7 +996,7 @@ Version 7
|
|
874
996
|
---------
|
875
997
|
|
876
998
|
Version 7 adds support for :class:`.~Reference` instruction and serialization of
|
877
|
-
a
|
999
|
+
a ``ScheduleBlock`` program while keeping its reference to subroutines::
|
878
1000
|
|
879
1001
|
from qiskit import pulse
|
880
1002
|
from qiskit import qpy
|
@@ -946,12 +1068,12 @@ identical to :ref:`qpy_version_5`.
|
|
946
1068
|
Version 5
|
947
1069
|
---------
|
948
1070
|
|
949
|
-
Version 5 changes from :ref:`qpy_version_4` by adding support for
|
1071
|
+
Version 5 changes from :ref:`qpy_version_4` by adding support for ``ScheduleBlock``
|
950
1072
|
and changing two payloads the INSTRUCTION metadata payload and the CUSTOM_INSTRUCTION block.
|
951
1073
|
These now have new fields to better account for :class:`~.ControlledGate` objects in a circuit.
|
952
1074
|
In addition, new payload MAP_ITEM is defined to implement the :ref:`qpy_mapping` block.
|
953
1075
|
|
954
|
-
With the support of
|
1076
|
+
With the support of ``ScheduleBlock``, now :class:`~.QuantumCircuit` can be
|
955
1077
|
serialized together with :attr:`~.QuantumCircuit.calibrations`, or
|
956
1078
|
`Pulse Gates <https://docs.quantum.ibm.com/guides/pulse>`_.
|
957
1079
|
In QPY version 5 and above, :ref:`qpy_circuit_calibrations` payload is
|
@@ -968,7 +1090,7 @@ In QPY version 5 and above,
|
|
968
1090
|
immediately follows the file header block to represent the program type stored in the file.
|
969
1091
|
|
970
1092
|
- When ``type==c``, :class:`~.QuantumCircuit` payload follows
|
971
|
-
- When ``type==s``,
|
1093
|
+
- When ``type==s``, ``ScheduleBlock`` payload follows
|
972
1094
|
|
973
1095
|
.. note::
|
974
1096
|
|
@@ -981,7 +1103,7 @@ immediately follows the file header block to represent the program type stored i
|
|
981
1103
|
SCHEDULE_BLOCK
|
982
1104
|
~~~~~~~~~~~~~~
|
983
1105
|
|
984
|
-
|
1106
|
+
``ScheduleBlock`` is first supported in QPY Version 5. This allows
|
985
1107
|
users to save pulse programs in the QPY binary format as follows:
|
986
1108
|
|
987
1109
|
.. code-block:: python
|
@@ -992,10 +1114,10 @@ users to save pulse programs in the QPY binary format as follows:
|
|
992
1114
|
pulse.play(pulse.Gaussian(160, 0.1, 40), pulse.DriveChannel(0))
|
993
1115
|
|
994
1116
|
with open('schedule.qpy', 'wb') as fd:
|
995
|
-
qpy.dump(
|
1117
|
+
qpy.dump(schedule, fd)
|
996
1118
|
|
997
1119
|
with open('schedule.qpy', 'rb') as fd:
|
998
|
-
|
1120
|
+
new_schedule = qpy.load(fd)[0]
|
999
1121
|
|
1000
1122
|
Note that circuit and schedule block are serialized and deserialized through
|
1001
1123
|
the same QPY interface. Input data type is implicitly analyzed and
|
@@ -1006,7 +1128,7 @@ no extra option is required to save the schedule block.
|
|
1006
1128
|
SCHEDULE_BLOCK_HEADER
|
1007
1129
|
~~~~~~~~~~~~~~~~~~~~~
|
1008
1130
|
|
1009
|
-
|
1131
|
+
``ScheduleBlock`` block starts with the following header:
|
1010
1132
|
|
1011
1133
|
.. code-block:: c
|
1012
1134
|
|
@@ -1206,8 +1328,8 @@ the gate name, ``num_qubits`` length of integers representing a sequence of qubi
|
|
1206
1328
|
and ``num_params`` length of INSTRUCTION_PARAM payload for parameters
|
1207
1329
|
associated to the custom instruction.
|
1208
1330
|
The ``type`` indicates the class of pulse program which is either, in principle,
|
1209
|
-
|
1210
|
-
only
|
1331
|
+
``ScheduleBlock`` or :class:`~.Schedule`. As of QPY Version 5,
|
1332
|
+
only ``ScheduleBlock`` payload is supported.
|
1211
1333
|
Finally, :ref:`qpy_schedule_block` payload is packed for each CALIBRATION_DEF entry.
|
1212
1334
|
|
1213
1335
|
.. _qpy_instruction_v5:
|
qiskit/qpy/binary_io/__init__.py
CHANGED
qiskit/qpy/binary_io/circuits.py
CHANGED
@@ -13,7 +13,7 @@
|
|
13
13
|
# pylint: disable=invalid-name
|
14
14
|
|
15
15
|
"""Binary IO for circuit objects."""
|
16
|
-
|
16
|
+
import itertools
|
17
17
|
from collections import defaultdict
|
18
18
|
import io
|
19
19
|
import json
|
@@ -24,9 +24,9 @@ import warnings
|
|
24
24
|
import numpy as np
|
25
25
|
|
26
26
|
from qiskit import circuit as circuit_mod
|
27
|
-
from qiskit.circuit import library, controlflow, CircuitInstruction, ControlFlowOp
|
27
|
+
from qiskit.circuit import library, controlflow, CircuitInstruction, ControlFlowOp, IfElseOp
|
28
28
|
from qiskit.circuit.classical import expr
|
29
|
-
from qiskit.circuit
|
29
|
+
from qiskit.circuit import ClassicalRegister, Clbit
|
30
30
|
from qiskit.circuit.gate import Gate
|
31
31
|
from qiskit.circuit.singleton import SingletonInstruction, SingletonGate
|
32
32
|
from qiskit.circuit.controlledgate import ControlledGate
|
@@ -39,8 +39,8 @@ from qiskit.circuit.annotated_operation import (
|
|
39
39
|
)
|
40
40
|
from qiskit.circuit.instruction import Instruction
|
41
41
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
42
|
-
from qiskit.circuit
|
43
|
-
from qiskit.qpy import common, formats, type_keys
|
42
|
+
from qiskit.circuit import QuantumRegister, Qubit
|
43
|
+
from qiskit.qpy import common, formats, type_keys
|
44
44
|
from qiskit.qpy.binary_io import value, schedules
|
45
45
|
from qiskit.quantum_info.operators import SparsePauliOp, Clifford
|
46
46
|
from qiskit.synthesis import evolution as evo_synth
|
@@ -320,12 +320,16 @@ def _read_instruction(
|
|
320
320
|
)
|
321
321
|
if condition is not None:
|
322
322
|
warnings.warn(
|
323
|
-
f"The .condition attribute on {gate_name}
|
324
|
-
"
|
325
|
-
|
323
|
+
f"The .condition attribute on {gate_name} can not be "
|
324
|
+
"represented in this version of Qiskit. It will be "
|
325
|
+
"represented as an IfElseOp instead.",
|
326
|
+
UserWarning,
|
326
327
|
stacklevel=3,
|
327
328
|
)
|
328
|
-
|
329
|
+
|
330
|
+
body = QuantumCircuit(qargs, cargs)
|
331
|
+
body.append(inst_obj, qargs, cargs)
|
332
|
+
inst_obj = IfElseOp(condition, body)
|
329
333
|
if instruction.label_size > 0:
|
330
334
|
inst_obj.label = label
|
331
335
|
if circuit is None:
|
@@ -363,8 +367,11 @@ def _read_instruction(
|
|
363
367
|
|
364
368
|
if instruction.label_size <= 0:
|
365
369
|
label = None
|
366
|
-
if gate_name in
|
370
|
+
if gate_name in ("IfElseOp", "WhileLoopOp"):
|
367
371
|
gate = gate_class(condition, *params, label=label)
|
372
|
+
elif gate_name == "BoxOp":
|
373
|
+
*params, duration, unit = params
|
374
|
+
gate = gate_class(*params, label=label, duration=duration, unit=unit)
|
368
375
|
elif version >= 5 and issubclass(gate_class, ControlledGate):
|
369
376
|
if gate_name in {
|
370
377
|
"MCPhaseGate",
|
@@ -385,7 +392,9 @@ def _read_instruction(
|
|
385
392
|
gate.num_ctrl_qubits = instruction.num_ctrl_qubits
|
386
393
|
gate.ctrl_state = instruction.ctrl_state
|
387
394
|
if condition:
|
388
|
-
|
395
|
+
body = QuantumCircuit(qargs, cargs)
|
396
|
+
body.append(gate, qargs, cargs)
|
397
|
+
gate = IfElseOp(condition, body)
|
389
398
|
else:
|
390
399
|
if gate_name in {"Initialize", "StatePreparation"}:
|
391
400
|
if isinstance(params[0], str):
|
@@ -422,12 +431,15 @@ def _read_instruction(
|
|
422
431
|
if condition:
|
423
432
|
if not isinstance(gate, ControlFlowOp):
|
424
433
|
warnings.warn(
|
425
|
-
f"The .condition attribute on {
|
426
|
-
"
|
427
|
-
|
434
|
+
f"The .condition attribute on {gate_name} can not be "
|
435
|
+
"represented in this version of Qiskit. It will be "
|
436
|
+
"represented as an IfElseOp instead.",
|
437
|
+
UserWarning,
|
428
438
|
stacklevel=3,
|
429
439
|
)
|
430
|
-
|
440
|
+
body = QuantumCircuit(qargs, cargs)
|
441
|
+
body.append(gate, qargs, cargs)
|
442
|
+
gate = IfElseOp(condition, body)
|
431
443
|
else:
|
432
444
|
gate.condition = condition
|
433
445
|
if circuit is None:
|
@@ -639,8 +651,7 @@ def _read_custom_operations(file_obj, version, vectors):
|
|
639
651
|
|
640
652
|
|
641
653
|
def _read_calibrations(file_obj, version, vectors, metadata_deserializer):
|
642
|
-
calibrations
|
643
|
-
|
654
|
+
"""Consume calibrations data, make the file handle point to the next section"""
|
644
655
|
header = formats.CALIBRATION._make(
|
645
656
|
struct.unpack(formats.CALIBRATION_PACK, file_obj.read(formats.CALIBRATION_SIZE))
|
646
657
|
)
|
@@ -649,21 +660,20 @@ def _read_calibrations(file_obj, version, vectors, metadata_deserializer):
|
|
649
660
|
struct.unpack(formats.CALIBRATION_DEF_PACK, file_obj.read(formats.CALIBRATION_DEF_SIZE))
|
650
661
|
)
|
651
662
|
name = file_obj.read(defheader.name_size).decode(common.ENCODE)
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
)
|
659
|
-
schedule = schedules.read_schedule_block(file_obj, version, metadata_deserializer)
|
663
|
+
if name:
|
664
|
+
warnings.warn(
|
665
|
+
category=UserWarning,
|
666
|
+
message="Support for loading pulse gates has been removed in Qiskit 2.0. "
|
667
|
+
f"If `{name}` is in the circuit it will be left as an opaque instruction.",
|
668
|
+
)
|
660
669
|
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
670
|
+
for _ in range(defheader.num_qubits): # read qubits info
|
671
|
+
file_obj.read(struct.calcsize("!q"))
|
672
|
+
|
673
|
+
for _ in range(defheader.num_params): # read params info
|
674
|
+
value.read_value(file_obj, version, vectors)
|
665
675
|
|
666
|
-
|
676
|
+
schedules.read_schedule_block(file_obj, version, metadata_deserializer)
|
667
677
|
|
668
678
|
|
669
679
|
def _dumps_register(register, index_map):
|
@@ -746,13 +756,15 @@ def _write_instruction(
|
|
746
756
|
or isinstance(instruction.operation, library.BlueprintCircuit)
|
747
757
|
):
|
748
758
|
gate_class_name = instruction.operation.name
|
749
|
-
|
750
|
-
|
759
|
+
# Assign a uuid to each instance of a custom operation
|
760
|
+
if instruction.operation.name not in {"ucrx_dg", "ucry_dg", "ucrz_dg"}:
|
751
761
|
gate_class_name = f"{gate_class_name}_{uuid.uuid4().hex}"
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
762
|
+
else:
|
763
|
+
# ucr*_dg gates can have different numbers of parameters,
|
764
|
+
# the uuid is appended to avoid storing a single definition
|
765
|
+
# in circuits with multiple ucr*_dg gates. For legacy reasons
|
766
|
+
# the uuid is stored in a different format as this was done
|
767
|
+
# prior to QPY 11.
|
756
768
|
gate_class_name = f"{gate_class_name}_{uuid.uuid4()}"
|
757
769
|
|
758
770
|
custom_operations[gate_class_name] = instruction.operation
|
@@ -796,6 +808,12 @@ def _write_instruction(
|
|
796
808
|
instruction.operation.target,
|
797
809
|
tuple(instruction.operation.cases_specifier()),
|
798
810
|
]
|
811
|
+
elif isinstance(instruction.operation, controlflow.BoxOp):
|
812
|
+
instruction_params = [
|
813
|
+
instruction.operation.blocks[0],
|
814
|
+
instruction.operation.duration,
|
815
|
+
instruction.operation.unit,
|
816
|
+
]
|
799
817
|
elif isinstance(instruction.operation, Clifford):
|
800
818
|
instruction_params = [instruction.operation.tableau]
|
801
819
|
elif isinstance(instruction.operation, AnnotatedOperation):
|
@@ -994,34 +1012,6 @@ def _write_custom_operation(
|
|
994
1012
|
return new_custom_instruction
|
995
1013
|
|
996
1014
|
|
997
|
-
def _write_calibrations(file_obj, calibrations, metadata_serializer, version):
|
998
|
-
flatten_dict = {}
|
999
|
-
for gate, caldef in calibrations.items():
|
1000
|
-
for (qubits, params), schedule in caldef.items():
|
1001
|
-
key = (gate, qubits, params)
|
1002
|
-
flatten_dict[key] = schedule
|
1003
|
-
header = struct.pack(formats.CALIBRATION_PACK, len(flatten_dict))
|
1004
|
-
file_obj.write(header)
|
1005
|
-
for (name, qubits, params), schedule in flatten_dict.items():
|
1006
|
-
# In principle ScheduleBlock and Schedule can be supported.
|
1007
|
-
# As of version 5 only ScheduleBlock is supported.
|
1008
|
-
name_bytes = name.encode(common.ENCODE)
|
1009
|
-
defheader = struct.pack(
|
1010
|
-
formats.CALIBRATION_DEF_PACK,
|
1011
|
-
len(name_bytes),
|
1012
|
-
len(qubits),
|
1013
|
-
len(params),
|
1014
|
-
type_keys.Program.assign(schedule),
|
1015
|
-
)
|
1016
|
-
file_obj.write(defheader)
|
1017
|
-
file_obj.write(name_bytes)
|
1018
|
-
for qubit in qubits:
|
1019
|
-
file_obj.write(struct.pack("!q", qubit))
|
1020
|
-
for param in params:
|
1021
|
-
value.write_value(file_obj, param, version=version)
|
1022
|
-
schedules.write_schedule_block(file_obj, schedule, metadata_serializer, version=version)
|
1023
|
-
|
1024
|
-
|
1025
1015
|
def _write_registers(file_obj, in_circ_regs, full_bits):
|
1026
1016
|
bitmap = {bit: index for index, bit in enumerate(full_bits)}
|
1027
1017
|
|
@@ -1032,7 +1022,9 @@ def _write_registers(file_obj, in_circ_regs, full_bits):
|
|
1032
1022
|
|
1033
1023
|
for regs, is_in_circuit in [(in_circ_regs, True), (out_circ_regs, False)]:
|
1034
1024
|
for reg in regs:
|
1035
|
-
standalone = all(
|
1025
|
+
standalone = all(
|
1026
|
+
bit._register == reg and bit._index == index for index, bit in enumerate(reg)
|
1027
|
+
)
|
1036
1028
|
reg_name = reg.name.encode(common.ENCODE)
|
1037
1029
|
reg_type = reg.prefix.encode(common.ENCODE)
|
1038
1030
|
file_obj.write(
|
@@ -1238,48 +1230,25 @@ def write_circuit(
|
|
1238
1230
|
num_registers = num_qregs + num_cregs
|
1239
1231
|
|
1240
1232
|
# Write circuit header
|
1241
|
-
|
1242
|
-
|
1243
|
-
|
1244
|
-
|
1245
|
-
|
1246
|
-
|
1247
|
-
|
1248
|
-
|
1249
|
-
|
1250
|
-
|
1251
|
-
|
1252
|
-
|
1253
|
-
|
1254
|
-
|
1255
|
-
|
1256
|
-
|
1257
|
-
|
1258
|
-
|
1259
|
-
|
1260
|
-
standalone_var_indices = value.write_standalone_vars(file_obj, circuit)
|
1261
|
-
else:
|
1262
|
-
if circuit.num_vars:
|
1263
|
-
raise exceptions.UnsupportedFeatureForVersion(
|
1264
|
-
"circuits containing realtime variables", required=12, target=version
|
1265
|
-
)
|
1266
|
-
header_raw = formats.CIRCUIT_HEADER_V2(
|
1267
|
-
name_size=len(circuit_name),
|
1268
|
-
global_phase_type=global_phase_type,
|
1269
|
-
global_phase_size=len(global_phase_data),
|
1270
|
-
num_qubits=circuit.num_qubits,
|
1271
|
-
num_clbits=circuit.num_clbits,
|
1272
|
-
metadata_size=metadata_size,
|
1273
|
-
num_registers=num_registers,
|
1274
|
-
num_instructions=num_instructions,
|
1275
|
-
)
|
1276
|
-
header = struct.pack(formats.CIRCUIT_HEADER_V2_PACK, *header_raw)
|
1277
|
-
file_obj.write(header)
|
1278
|
-
file_obj.write(circuit_name)
|
1279
|
-
file_obj.write(global_phase_data)
|
1280
|
-
file_obj.write(metadata_raw)
|
1281
|
-
file_obj.write(registers_raw)
|
1282
|
-
standalone_var_indices = {}
|
1233
|
+
header_raw = formats.CIRCUIT_HEADER_V12(
|
1234
|
+
name_size=len(circuit_name),
|
1235
|
+
global_phase_type=global_phase_type,
|
1236
|
+
global_phase_size=len(global_phase_data),
|
1237
|
+
num_qubits=circuit.num_qubits,
|
1238
|
+
num_clbits=circuit.num_clbits,
|
1239
|
+
metadata_size=metadata_size,
|
1240
|
+
num_registers=num_registers,
|
1241
|
+
num_instructions=num_instructions,
|
1242
|
+
num_vars=circuit.num_identifiers,
|
1243
|
+
)
|
1244
|
+
header = struct.pack(formats.CIRCUIT_HEADER_V12_PACK, *header_raw)
|
1245
|
+
file_obj.write(header)
|
1246
|
+
file_obj.write(circuit_name)
|
1247
|
+
file_obj.write(global_phase_data)
|
1248
|
+
file_obj.write(metadata_raw)
|
1249
|
+
# Write header payload
|
1250
|
+
file_obj.write(registers_raw)
|
1251
|
+
standalone_var_indices = value.write_standalone_vars(file_obj, circuit, version)
|
1283
1252
|
|
1284
1253
|
instruction_buffer = io.BytesIO()
|
1285
1254
|
custom_operations = {}
|
@@ -1322,8 +1291,11 @@ def write_circuit(
|
|
1322
1291
|
file_obj.write(instruction_buffer.getvalue())
|
1323
1292
|
instruction_buffer.close()
|
1324
1293
|
|
1325
|
-
#
|
1326
|
-
|
1294
|
+
# Pulse has been removed in Qiskit 2.0. As long as we keep QPY at version 13,
|
1295
|
+
# we need to write an empty calibrations header since read_circuit expects it
|
1296
|
+
header = struct.pack(formats.CALIBRATION_PACK, 0)
|
1297
|
+
file_obj.write(header)
|
1298
|
+
|
1327
1299
|
_write_layout(file_obj, circuit)
|
1328
1300
|
|
1329
1301
|
|
@@ -1368,7 +1340,7 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
|
|
1368
1340
|
num_clbits = header["num_clbits"]
|
1369
1341
|
num_registers = header["num_registers"]
|
1370
1342
|
num_instructions = header["num_instructions"]
|
1371
|
-
|
1343
|
+
num_identifiers = header.get("num_vars", 0)
|
1372
1344
|
# `out_registers` is two "name: register" maps segregated by type for the rest of QPY, and
|
1373
1345
|
# `all_registers` is the complete ordered list used to construct the `QuantumCircuit`.
|
1374
1346
|
out_registers = {"q": {}, "c": {}}
|
@@ -1425,7 +1397,7 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
|
|
1425
1397
|
"q": [Qubit() for _ in out_bits["q"]],
|
1426
1398
|
"c": [Clbit() for _ in out_bits["c"]],
|
1427
1399
|
}
|
1428
|
-
var_segments, standalone_var_indices = value.read_standalone_vars(file_obj,
|
1400
|
+
var_segments, standalone_var_indices = value.read_standalone_vars(file_obj, num_identifiers)
|
1429
1401
|
circ = QuantumCircuit(
|
1430
1402
|
out_bits["q"],
|
1431
1403
|
out_bits["c"],
|
@@ -1434,10 +1406,15 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
|
|
1434
1406
|
global_phase=global_phase,
|
1435
1407
|
metadata=metadata,
|
1436
1408
|
inputs=var_segments[type_keys.ExprVarDeclaration.INPUT],
|
1437
|
-
captures=
|
1409
|
+
captures=itertools.chain(
|
1410
|
+
var_segments[type_keys.ExprVarDeclaration.CAPTURE],
|
1411
|
+
var_segments[type_keys.ExprVarDeclaration.STRETCH_CAPTURE],
|
1412
|
+
),
|
1438
1413
|
)
|
1439
1414
|
for declaration in var_segments[type_keys.ExprVarDeclaration.LOCAL]:
|
1440
1415
|
circ.add_uninitialized_var(declaration)
|
1416
|
+
for stretch in var_segments[type_keys.ExprVarDeclaration.STRETCH_LOCAL]:
|
1417
|
+
circ.add_stretch(stretch)
|
1441
1418
|
custom_operations = _read_custom_operations(file_obj, version, vectors)
|
1442
1419
|
for _instruction in range(num_instructions):
|
1443
1420
|
_read_instruction(
|
@@ -1451,11 +1428,9 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
|
|
1451
1428
|
standalone_var_indices,
|
1452
1429
|
)
|
1453
1430
|
|
1454
|
-
#
|
1431
|
+
# Consume calibrations, but don't use them since pulse gates are not supported as of Qiskit 2.0
|
1455
1432
|
if version >= 5:
|
1456
|
-
|
1457
|
-
file_obj, version, vectors, metadata_deserializer
|
1458
|
-
)
|
1433
|
+
_read_calibrations(file_obj, version, vectors, metadata_deserializer)
|
1459
1434
|
|
1460
1435
|
for vec_name, (vector, initialized_params) in vectors.items():
|
1461
1436
|
if len(initialized_params) != len(vector):
|